ssh -p 2223 leviathan3@leviathan.labs.overthewire.org
pw: Ahdiemoo1j
현재 디렉터리에서 정보를 확인한다.
leviathan3@leviathan:~$ ls -al
total 32
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 leviathan4 leviathan3 10288 Aug 26 2019 level3
-rw-r--r-- 1 root root 675 May 15 2017 .profile
leviathan3@leviathan:~$ file level3
level3: 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]=ed9f6a6d1c89cf1f3f2eff370de4fb1669774fd5, not stripped
leviathan3@leviathan:~$
현재 디렉터리를 확인해보니 setuid가 걸려있는 level3 바이너리 파일이 있다.
해당 파일을 실행시켜보자
leviathan3@leviathan:~$ ./level3
Enter the password> test
bzzzzzzzzap. WRONG
leviathan3@leviathan:~$
프로그램을 실행시키니까 password를 입력하라고 나오고, 아무 문자열이나 입력하니까 틀렸다는 문구가 나왔다.
아마 조건문을 통해 특정 key와 입력값이 동일한지 확인하는 것 같은데 혹시 key 값이 소스코드상에 드러나는지 확인하기 위해 ltrace 명령어로 프로그램을 실행시켜보자
leviathan3@leviathan:~$ ltrace -i ./level3
[0x8048481] __libc_start_main(0x8048618, 1, 0xffffd784, 0x80486d0 <unfinished ...>
[0x8048694] strcmp("h0no33", "kakaka") = -1
[0x80486af] printf("Enter the password> ") = 20
[0x80485a3] fgets(Enter the password> test
"test\n", 256, 0xf7fc55a0) = 0xffffd590
[0x80485bc] strcmp("test\n", "snlprintf\n") = 1
[0x804860b] puts("bzzzzzzzzap. WRONG"bzzzzzzzzap. WRONG
) = 19
[0xffffffffffffffff] +++ exited (status 0) +++
ltrace를 통해 프로그램을 실행시켰을 때 맨처음 h0no33과 kakak문자열을 비교하고 있고, 그 후에 사용자 입력값과 snlprintf 문자열을 비교하고 있다.
다시 프로그램을 실행한 후에 입력값으로 snlprintf를 입력해보자
leviathan3@leviathan:~$ .level3
Enter the password> snlprintf
[You've got shell]!
$ id
uid=12004(leviathan4) gid=12003(leviathan3) groups=12003(leviathan3)
$
쉘을 홱득했다. password를 확인해보자
$ cat /etc/leviathan_pass/leviathan4
vuH0coox6m
$
password를 획득했다.
id: leviathan4
pw: vuH0coox6m