ssh -p 2223 leviathan1@leviathan.labs.overthewire.org
pw: rioGegei8m
현재 디렉터리에서 정보를 확인한다.
leviathan1@leviathan:~$ ls -al
total 28
drwxr-xr-x 2 root root 4096 Aug 26 2019 .
drwxr-xr-x 10 root root 4096 Aug 26 2019 ..
-rw-r--r-- 1 root root 220 May 15 2017 .bash_logout
-rw-r--r-- 1 root root 3526 May 15 2017 .bashrc
-r-sr-x--- 1 leviathan2 leviathan1 7452 Aug 26 2019 check
-rw-r--r-- 1 root root 675 May 15 2017 .profile
leviathan1@leviathan:~$ file check
check: setuid ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=c735f6f3a3a94adcad8407cc0fda40496fd765dd, not stripped
현재 디렉터리를 확인해보니까 check이라는 바이너리 파일이 있다. 해당 파일에 setuid가 걸려있는 것으로 보아 해당 파일을 이용하여 level2의 password를 얻어야되는 것 같다.
해당 파일을 실행시켜보자
leviathan1@leviathan:~$ ./check
password: test
Wrong password, Good Bye ...
해당 파일을 실행시켜보니 password 입력 창이 나오고 테스트 문자열을 입력하니까 password가 틀려다는 문자열과 함께 프로그램이 종료된다.
조건문을 이용하여 password를 검증하는 것 같은데 password의 원문이 소스코드에 남아있는지 확인하기 위해 ltrace 툴을 사용하여 프로그램을 실행시켜보자
leviathan1@leviathan:~$ ltrace -i ./check
[0x8048461] __libc_start_main(0x804853b, 1, 0xffffd784, 0x8048610 <unfinished ...>
[0x8048584] printf("password: ") = 10
[0x804858c] getchar(1, 0, 0x65766f6c, 0x646f6700password: test
) = 116
[0x8048594] getchar(1, 0, 0x65766f6c, 0x646f6700) = 101
[0x804859c] getchar(1, 0, 0x65766f6c, 0x646f6700) = 115
[0x80485b3] strcmp("tes", "sex") = 1
[0x80485f2] puts("Wrong password, Good Bye ..."Wrong password, Good Bye ...
) = 29
[0xffffffffffffffff] +++ exited (status 0) +++
leviathan1@leviathan:~$
프로그램에서 strcmp 함수를 사용하여 사용자 입력값과 sex 문자열을 비교하고 있다.
이제 다시 프로그램을 실행시켜서 sex를 입력해보자
leviathan1@leviathan:~$ ./check
password: sex
$ id
uid=12002(leviathan2) gid=12001(leviathan1) groups=12001(leviathan1)
$ cat /etc/leviathan_pass/leviathan2
ougahZi8Ta
$
password를 획득했다.
id: leviathan2
pw: ougahZi8Ta