对错误,裂痕和exploits的说明

作者:Mark Vogels 
翻译:黯魂[S.S.T] 

在这篇文档中,我将会试着为你提供一个对付错误,和由于那些错误而发生的裂痕以及它们的exploits的根基认识。那决不料味着能让你完全领略exploits和裂痕,可是能辅佐你学会认识大概的裂痕以及奈何处理惩罚它们。 

一般而言有3种差异范例的错误会大概危及计较机系统和网络的安详。 
#编程错误 
#设置错误 
#设计错误 

错误可以被当作是失误,尽量它们并非都是由变乱导致的。软件/设备的最初建设者大概就存在错误,用最好的想法却建设了错误,而且没有意识到它大概就是一个潜在的威胁。这听上去大概有点糊涂,可是稍后在文章中都将会被澄清。为了深入探讨关于错误的细节,我们需要建设一个对差异范例的错误的界说以至于我们能更容易认识它们。 

差异错误范例的界说 

编程错误: 

编程错误凡是是由措施编写者造成的。最常见的可操作编程错误是缓冲区溢出。把缓冲区溢出想象成一个空的杯子:措施的利用者将要倒咖啡到杯子里,可是措施编写者事先并不知道利用者将会倒几多咖啡在内里。所以措施编写者必需在利用者把咖啡倒进杯子之前查抄和测试,以阻止咖啡从杯子里溢出。有时候查抄输入巨细并不容易,可能由于时间紧要,措施员没有时间写足够遍及的错误检测函数。那么功效就是:大概的缓冲区溢出和其他的编程错误被建设。 

另一个编程错误的例子是:当用户做一些预料之外的事,好比加载一个错误范例的文件到措施中时,措施会瓦解。虽然不是所有的编程错误都需要用户输入才气做一些预料之外的事,像使措施瓦解。一个措施也会取决于老是在一个明晰位置的非凡文件。假如谁人文件被移动,而且措施员没有预推测,他就不行能在措施实验打开它之前检测文件是否照旧在谁人位置。如果措施在打开谁人文件后实验用它运行,这就会导致不行预见的行为。 

这些范例的错误产生得相当频繁,而且大多时候厂商城市分发补丁包来办来由消费者可能他们本身发明的被陈诉的错误。 

设置错误: 

这样想象一个设置错误:假如你是一个网络打点员而且你需要运行一个防火墙来掩护你的网络。习惯上,你会答允任何收支的流量,除专门拒绝的流量种类之外。 

一个简朴的例子是防火墙仅仅阻塞了80端口,然而它将答允来自因特网的任何人毗连到防火墙的设置页面从头设置它。其余的端口都是开着的。这明明就是一个设置错误,任何人都能通过利用另一个端标语来绕过防火墙。 

幸运的是大大都厂商都知道这个错误,因此他们都正确的做了相反的处理惩罚:任何流量都被阻塞除非专门答允的。所以自从端口被封锁今后,网络打点员都不再需要担忧发明的新问题,通过一个不利用的端口能会见他的网络。(这里我只利用端口来举例子,不外这在沟通的端口上也能应用差异范例的流量。) 

另一个设置错误的例子是,在一个网络中的不受打点的hub取代可打点的互换机的用法。差异之处是,hub发送所有进入的数据包到所有的端口,因为它并不知道在它后头的吸收者被定位到哪个端口,而互换机知道。所以,在一个利用hub取代互换机的网络中运行一个sniffer,答允一个进攻者查察包括大概的用户名及暗码的更大都据包,办理步伐就是在网络中利用互换机。纵然此刻这是一个设置错误,但在已往却不是,因为当时互换机还不存在。 
  
设计错误: 

设计错误可以被当作是在软件设计阶段产生的错误。纵然措施员花足够的时间在软件宣布之前编写检测流程来检讨所有用户的输入,纵然软件被最终用户正确地设置,这些错误仍然会造成对付一个网络的安详的极大危险。 

让我们看看这种环境:一个公司抉择开拓一个软件,这个软件答允长途会见到一个网络。那么他们也不得不支持这个软件,从而他们抉择放一些后门在内里以至于能利用公司名字作为暗码长途登录。假如公司以外的人发明白那些后门呢,会产生什么?他利用谁人软件的长途会见可以或许登录进任何一个网络。功效将会是损失惨重的! 

尽量这些后门在已往被建设的相当频繁,此刻一个公司销售雷同的软件却不会再带来风险了,因为他要对进攻者的滥用后门认真。 

另一个设计错误的例子是利用在安详无线网络中的WEP加密。我不规划深入说明这为什么是一个设计错误,究竟那超出了这篇文章的范畴,可是它的根基流程是这样的: 
一个3字节的初始化矢量增加到公钥中来加密每个独一的数据包。假设公钥是abcde。第一个数据包的初始化矢量是123,因此这个数据包的全部密钥就是123abcde。下一个数据包的初始化矢量是234,那么它的密钥就是234abcde。 

设计错误在这里其实也就是,只有3字节的差异初始化矢量,导致了255^3可能说1650万差异的keys以及部门加密算法被利用。通过逆向阐明部门算法,可以或许相当容易地得到公钥中的几个字符。由于这个设计错误,你只需要用独一的初始化矢量反复发送10万个包(64-bit),发送80万个包(128-bit),就能破解出WEP-key,便可以进入完整的无线网络中。在一个忙碌的无线网络中这能在几小时内做到。 

那么你看到了,设计错误有点更难办理。你不能只是期望厂商宣布快速更新来办理这个问题,你也不行能通过查阅产物说明书本身办理。针对WEP加密这种环境,一个小组建设了一个新的尺度,叫做WPA。这意味着利用WEP加密的产物应该被代替,可能通过硬件更新以答允它们用这个新加密尺度事情。对付已发明的WEP上的设计错误的细节描写,可以去看看airscanner。com上面的精汉文章。 


这些错误如何成为裂痕的? 

一个裂痕就是对方针的掩护方面的一个弱点。方针可以是连到一个完整网络的一台计较机的任何部门。我不会说明这儿大概的裂痕的所有差异,因为那险些不行能,可是我将设法指出什么是裂痕,以及裂痕如何发生的。 

凭据早期的划定,最普遍的会成为裂痕的编程错误是缓冲区溢出。假设一个基于栈的缓冲区溢出,缓冲区被安排在栈中。栈可以被当作是你的处理惩罚器存储数据在内里并能与其配合事情的一个姑且事情区。此刻,当你溢出一个安排在栈里的缓冲区时,你可以或许写数据到已分派空间的缓冲区之外,因此可以写其它数据到栈中。而其它数据可以是挪用函数的返回地点。假设挪用函数的返回地点是12345678,而且返回地点直接存储在缓冲区后头的栈中,那么栈看上去大概会像这样: 
XXXXXXXXXX12345678 

XXXXXXXXXX是将包括我们的输入的缓冲区。假如我们放一些比缓冲区巨细要少的数据在内里,没有任何奇怪的事会产生,可是当我们放12个'A'在这只能承载10个字符的缓冲区中时,多余的2个A就会包围掉返回地点部门。从而使返回地点酿成一个无效地点,然后函数无法返回,措施就瓦解了。 

假如这个措施是一个处事端应用措施,有人能放12个A使措施瓦解,而且导致其他所有用户都无法会见。这就成为了一个拒绝处事进攻的例子。既然这样,这个错误就有了拒绝处事裂痕。 

假如我们用与上面同样的例子,但换一个更大的缓冲区,那么溢出缓冲区也就意味着更多的数据在一个实际溢出产生之前必需被放进去,但是当那产生时,我们可以写一些计较机代码(汇编指令),将其作为数据的一部门而放在缓冲区中利用。我们通过包围它来改变返回地点,以指向我们溢出的缓冲区后头,措施将会试图执行我们的缓冲区。这时,缓冲区包括了我们放进去的代码,措施并不会瓦解,而是转去执行我们的代码。由于那些代码可以是开启一个shell(呼吁表明措施)的一小段代码,而且会在那台计较机上监听一个非凡端口,因此这种范例的代码常常被称作shellcode。 

跟着这些代码的运行,有人便可以或许毗连到谁人非凡的端口上,并能执行长途呼吁,同时得到与在长途计较机开启这个存在裂痕的应用措施的用户所拥有的沟通会见权的节制权。 

对付设置错误,假如我们看看防火墙的例子,裂痕就越发明明。如果谁人防火墙能经过telnet长途设置,那么仅仅不答允会见防火墙的80端口会给网络打点员一个安详上的错误认识,进攻者仍旧可以或许通过毗连到防火墙的23端口举办会见而设置它。 

然而,自从消费者开始要求他们所购置的产物应具有差异设置选项今后,厂商就开始着手研发高级此外可设置的软件和设备。这大概让一个设备的设置变得专业化而导致错误很容易产生。雷同的设备的设置是如此的巨大,而裂痕能被网络打点员看到,因此答允一个潜在的进攻者会见到网络或系统中他本不该该会见到的部门,所以一个简朴的设置错误会导致网络和系统中存在一个潜在的裂痕。 

我已经给出了一个由设计错误导致裂痕的例子:WEP密钥,但它很容易引出另一个设计错误的例子:设想一个软件公司编写了一个软件用于欣赏和建设文本文档。他们想要出售他们的产物,然而由于竞争者的软件公司也开拓了一款沟通成果的软件,他们不得不设计一个外貌上有更强大的成果的措施。因此他们抉择增加一个特性以答允用户能对本身建设的文档有更多的节制,那样用户可以编写小型函数(宏),并能被植入文档中,同时可以或许辅佐文档欣赏者在他的计较机上做各类百般的工作。假如所有这些成果被一个恶意进攻者利用,建设一个已植入宏的文档,能复制自身到呆板上被找到的其他所有文档中去,而且不颠末欣赏者的同意做各类百般的其他工作呢?那么在这个被设计而建设的措施中,我们又有了一个大概的裂痕。 

你可以看到,一个错误会导致发生一个裂痕。在宏被利用在文档中的环境下,辅佐软件用户建设更多动态文档的想法很伟大,除设计时没有思量安详因素以外。 


那么什么是一个exploit? 

exploit就是一种操作一个已发明的裂痕来改变措施可能系统初始成果的要领。这种要领对付一个进攻者而言更有用处。在计较机安详中,术语"exploit"常常被用于描写一个非凡的措施,它的独一目标就是自动操作一个裂痕来取得对有裂痕的方针措施的节制权,可能终止方针措施的正常成果。 

可是在一个系统可能网络中利用一个错误的设置对要操作它的进攻者来说,也能被叫做一个exploit,尽量它不必然非要是一个实际上能完成事情的非凡措施。 

我将通过一些C代码的例子来试着说明一个exploit的浸染,个中之一是一个存在缓冲区溢出裂痕的简朴的措施,另一个则是exploit。 

留意:这里给出的例子大概在差异的编译器和系统上表示差异。你大概需要改变缓冲区中字符的数目才气真正改写返回地点,可能exploitfunction的地点会差异,可是他们仍能事情。 

vulnerable_program.c: 


Copy code
#include "stdio。h" 
/*操作函数*/ 
exploitfunction() 

/*假如缓冲区溢出被乐成操作,就会输出此行内容*/ 
printf("This line will be printed after successfully exploiting the buffer overflow. "); 
system("pause"); 
ExitProcess(0); 


normalfunction(char *myargument) 

char buffer[10]; 
strcpy(buffer,myargument); 


main(int argc, char *argv[]) 

if(argc>1) 

normalfunction(argv[1]); 
printf(" These lines get printed during normal execution with at least 1 commandline argument.The address of exploitfunction 
is 0x%。8X ",&exploitfunction); 

else 
printf("Please provide the program with at least 1 commandline argument. "); 
ExitProcess(0); 


我已经建设了3个函数,一个是主函数,其他2个体离是:在正常环境下执行的normalfunction,以及操作函数exploitfunction。措施的目标是溢出缓冲区以至于返回地点将指向替换了normalfunction后头下一条指令的exploitfunction函数。 

此刻我们需要指出文本字符串要多大才气完全包围栈中的返回地点。有这个作为方针,就好办了!我们每次增加一个字符直到措施瓦解。 

当我在Windows系统上利用Dev-cpp编译完措施今后,我知道了在措施瓦解之前最多需要27个A。 
exploitfunction函数的地点以16进制形式暗示,而且字节值常常表示出:地点是不行打印的字符。我写了一个小措施,它将给这个易受进攻的措施提供须要的字符串以操作它。 

在我的情况中,exploitfunction函数的地点(从易受进攻的措施内部我利便地打印获得)是0x00401290。因为栈在Intel x86系统上是以逆序存储所有数据的(这篇文档中那不会被说明),我们需要筹备一个沟通的字符串。因此大概的值雷同于
0x41414141414141414141414141414141414141414141414141414141901240. 

你可以看到,这里的字符'A'(0x41)我利用的是16进制的表示形式,那是存储在栈中的真实值。功效就是,exploit很是简朴: 

Exploit.c: 


Copy code
#include "stdio.h" 
main() 

char workbuffer[200]; 
char tempbuf[4]; 
strcpy(workbuffer,"vulnerable_program AAAAAAAAAAAAAAAAAAAAAAAAAAAA"); 
tempbuf[0]=0x90; 
tempbuf[1]=0x12; 
tempbuf[2]=0x40; 
tempbuf[3]=0; 
strcat (workbuffer,tempbuf); 
system(workbuffer); 
return 0; 


这段措施所做的就是复制字符串"vulnerable_program AAAAAAAAAAAAAAAAAAAAAAAAAAAA"到一个缓冲区中,并用新的返回地点建设另一个缓冲区,附加在事情缓冲区之上。 
在那之后,措施挪用system()来执行字符串中的呼吁。输出功效是: 
C:>exploit.exe 
This line will be printed after successfully exploiting the buffer overflow. 
Press any key to continue…… 

太棒了,它执行了! 

莫非那不伟大吗? 

固然我们实际上并没有乐成让措施运行我们本身的代码,但颠末一些小小的改变就能完成。 
关于缓冲区溢出的更多相关信息请参考Aleph One写的著名文章"Smashing the stack for fun and profit"

颠末这篇文章的探讨,你凡是不得不本身动作来阻止你的系统可能网络被一个已知裂痕所操作。对付设置错误我发起你请一位专家来帮你做须要的设置,因此在利用它之前你不消完全领略产物是如何运作的。对付编程和设计错误,凡是有许多人举办产物测试,而其他人则颁发他们发明的裂痕到Internet上的一些安详列表上。所以假如你保持一连存眷这些安详列表,并确认你一直都在更新你的系统到最新版本,你就已经靠近一个安详情况了。 

―――――――――――――――――――――――――――――――――――――――――― 
最近的安详编程文档: 

《Exploiting Software How to Break Code》 
描写如何编写exploit代码的 

《Learning XML, 2nd Edition》 

《Writing Secure Code》 
微软公司焦点推荐,教你奈何编写安详的代码 

《OReilly Web Site Cookbook》 
成立和打点你的网站的利用手册,包罗大量实例及办理方案

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/9068.html