1、布景
Tor(The Oninon Router)供给一个匿名交换收集平台,它使得用户在浏览网页或拜候其它收集办事时不会被跟踪。作为该收集的一部门即所谓的“暗网”(darknet),是指只能经由过程Tor收集拜候的办事器群组,这些办事器供给包含社区论坛、电子邮件等多种办事。当然供给这些办事都是无歹意的,初志是用来存眷加害人权标题问题,可是因为匿名的启事吸引了良多有犯法意图的人,好比传播儿童色情。过后法律部门也不克不及追踪到犯法者的源IP地址。
2013年,在“暗网”办事器上发现了一款歹意软件,它操纵特定Web浏览器上的安然缝隙在用户电脑上履行一段代码。该代码汇集一些用户信息,发往弗吉尼亚州的办事器,以后自毁。就歹意软件的特点来讲,它没有较着的歹意意图。初步揣度是FBI植进,他们在弗吉尼亚州有处事处,曾也派专人开辟过歹意法度,多是他们成立了它—此刻看来是真的。
2、对Shellcode的逆向阐发
1、缝隙操纵
缝隙操纵代码用javascript编写,操纵一个出名的firefox浏览器的特定版本(Tor收集预装的firefox)的缝隙。该缝隙操纵代码颠末端恍惚措置,但经由过程快速扫描可以看到一长串十六进制字符,这些字符是shellcode的前几个标记性字节,即call把持码(shellcode常常以一个jump或call开端,是以知道了这些把持码使得辨认shellcode变得等闲起来)。
我不会在这里阐发这个缝隙,可是要看一下这个shellcode。
起首,让我们用一些根基的shellcode原则设定一个场景。
2、位置无关代码
Shellcode的成功履行颠末端独一无二的挑战,因为它是直接注进到一个过程而不是由Windows加载器加载。是以,我们不知道shellcode位于内存中的甚么处所,更关头的是,不知道尺度的windowsAPI函数位于甚么处所(而凡是环境下,Windows加载器会奉告一个法度这些信息)。
是以,我们必需利用一系列技能往获得这个信息。FBI歹意法度用了一个常常利用的技能往找出它的内存地址:
call start
start:
pop ebp
call函数将履行法度移动到start标签处,同时将法度当前履行的位置压进仓库中(如许我们稍后可以从call函数返回)。
在此,我们将要用这个值,从栈里盗取位置,仓库弹出的值保留到ebp存放器。我们此刻知道了下一条指令的地址,那么便可以用它来拜候跟我们的shellcode相干的数据。
3、定位Windows API
因为正常环境下Windows加载器会加载Windows API的位置到我们的法度,所以我们不奢看运行一个shellcode时可以或许知道法度的位置信息。找出API函数惯用的编制是查看FS段存放器所指的线程信息块(thread information block)。我们可以或许经由过程这个布局体往定位被我们shellcode宿主法度加载的DLLs,然后操纵这些DLL的输出直到找到方针函数为止。当然这个过程是很乏味的,所以,FBI这个shellcode利用了一个库,包含在MetasploitFramwork内,这是由Stephen Fewer写的一个函数解析器。它的工作道理以下:
push arguments
. . .
push FUNCTIONHASH
call
这个函数的哈希值是由一个简单的hash算法生成,以我们调用函数的名称定名。如许做的目标不是为了混合代码(虽然它达到这个目标),但只承诺我们用一个32位的DWORD来调用此函数,而不是一个长型字符串(shellcode空间常常是有限的)。
值得光荣的是,我们本身可以计较出hash值,或用他人生成的查找表。
4、开端
假定我们对shellcode的开端进行反汇编,以下图:
我们一旦计较出指向API解析器的ebp存放器值,我们便可以在windows的API进行哈希调用前获得其十六进制数。如斯,假定在查找表里查找到阿谁值,在阿谁值周围查找调用的函数,并且添加一些注释,以下图:
这段代码履行完全性查抄,经由过程用GET 开端的HTTP要求头部信息以确保shellcode安然运行。然后调用Windows API函数LoadLibrary()载进两个动态链接库:ws2_32.dll(用于互联网通信的Windows套接字库)和iphlpapi.dll(WindowsIP辅助库)。
5、连接到HTTP办事器
在需要的库文件都加载完以后,shellcode将履行下图中的把持:
再一次,用不异的步调,用哈希值查找一个Windows API函数:connect()函数。我们可以看见,在[ebp +0x2e1]位置的数据作为一个参数传递给connect()函数—从手册我们知道,阿谁参数是一个sockaddr布局体(sockaddr structure)。我们知道ebp存放器指向我们在内存中的地址,利用阿谁地址,再加上偏移量,我们就可以定位出那些数据在内存0x2E8处(ebp=0×7)。
是以,我们在阐发sockaddr之前,先给这些代码添加一些注释,定名一些内存偏移地址,以下图:
这个eax存放器保留着调用connect()函数的返回值,假定这个值为0(来自微软用户手册)暗示connect()调用成功。可是我们成功连接到哪儿?假定我们此刻添加一些注释到我们之前的反汇编文件,基于我们在微软用户手册中能查到的关于sockaddr布局体的信息,我们可以如许添加注释,以下图:
经由过程对IP地址进行whois快速查询,只获得很少信息。以下图:
6、汇集用户信息
接下来,这个歹意软件测验测验获得windows主机名—凡是环境下这是windows机械的名字。这可能有助于确认嫌疑犯和确认他们没有拘系错人。
其次,它列举了活跃主机的hostname和IP地址。
利用SendARP()函数来发现收集中所有电脑的MAC地址。有一些“得当”的编制做到如许,可是shellocode只能获得有限的空间往完成这些事。MAC地址将用户与一张特定的网卡绑定,因而可以经由过程这些网卡的供给链来追踪用户。
最后,它要构建HTTP头部信息,将MAC地址放进Cookie字段,用户的主机名放进Host字段,并且要以GET要求编制发送到http://65.222.202.54/05cea4de-951d-4037-bf8f-f69055b279bb。这些十六进制数字的意义不清晰,它们多是肆意选择或链接一个用户到特定的接进办事器。
7、最后阶段
这个shellcode最后阶段的独一目标就是在该shellcode结束时运行更多的shell代码—它如许做的编制略微有点迂回,我也不知道为甚么如许,或许是一次粗略的测验测验。
那么,最后一歩要如何做。起首,它操纵一些字符串长度把持找出一些被嵌进在其他所稀有据区的代码。那些代码计较出我们的HTTP要求字符串结束的位置,跳过在shellcode结尾处的所有的无效的空把持指令,然后跳到那边。那边是哪里?谁知道!我被奉告有更多的shellcode(这不首要),可是我已没有时候来调试这个缝隙并获得它。
构建头部,然后跳转到头部结尾处。
查找http头部结尾处的无效指令并且跳过它们。
8、运行代码
到今朝为止,我以完全静态的编制阐发了这些代码—主如果为了完全性。经由过程运行这些代码可以或许更快速的阐发它们,同时可以验证我们的阐发是不是准确。既然这段歹意代码没有任何粉碎系统的行动,是以我们可以安然的在真机上运行它。因而运行它并不雅察它发送给FBI的切当数据。因为shellcode不是一个exe可履行文件,我需要一个shellcode加载器往运行它—-它们快速的分派需要的内存,加载shellcode并跳转到该处。这是加载shellcode需要做的—-在调用真实的shellcode之前会主动断开。
然后我们启动调试器跨步履行到调用cnnect()函数。我们不克不及不把这个shellcode的方针指向另外一台我们本身的机械,便于不雅察运行成果。是以,我将让他指向ip地址为192.168.0.254的77端口,然后在这个机械上运行netcat法度抓取数据。鄙人图代码暂停的箭头所指处,就是初期经由过程patch编制来点窜sockaddr布局体。
然后我们继续跨步履行到调用send()函数,履行它,以后我们能看见在netcat终端的输出,它将输出它收到的所稀有据—显示的那些数据本来是发给FBI。你可以看到,cookie里面的ID包含了我的MAC地址,Host 头部包含了我的desktop名。
最后,我们跨步履行到最后阶段—最后的空把持多是用来注进更多的已提取的shellcode。在阿谁十六进制查看器窗口可以看见,我们机关的阿谁HTTP要求已发出。
9、结论
这个歹意软件从用户浏览器发送确认信息给报复打击机,然后利用户firefox浏览器解体。就复杂性而言,它没有很较着的出格的地方,也没有益用一些大年夜家不知道的新手艺。
假定这个歹意软件作者是FBI,那么他们需要往答复一些很峻厉的标题问题。这些歹意法度被植进到非美国的办事器上,并报复打击操纵全球用户的浏览器(他们傍边良多人是无辜的)他们如许做乃至可能会获得法令授权?我不这么觉得。当有人告密时FBI是不是需要出示他们曾获得过法令授权的证据?未必。我希看他们会根据用户的电脑内发现的证据和在收到告状时获得的证据—-虽然最初的搜刮授权可能很不靠谱。不管如何说,我事实不是一个律师。