WarGames-leviathan(0-7)

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的漏洞和软连接我确实根本没头绪也不知从何查起啊(:з」∠)练习和学到知识才是重点嘛

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值