0x00 序言
在剖析非PE的样版中我们可以发觉,有三个系统漏洞是office样版熟客,分别是2017-1182、0802、0798
这好多个系统漏洞十分普遍,现阶段也是office样版漏洞检测的大部分。包含许多 APT如今都仍在应用,例如Gorgon、Gamaredon就尝一尝应用0798开展模版引入。
自然 还有一个普遍的系统漏洞是2017-0261 EPS系统漏洞。
在文中中,大家将详解2017-11882这一系统漏洞。并深入分析应用该系统漏洞的一个实战演练样版。 别的的好多个系统漏洞在后面的文章内容中先后详解。
0x01 POC重现
这一系统漏洞的poc有很多,这儿应用的是https://github.com/Ridter/CVE-2017-11882/
根据python Command_CVE-2017-11882.py -c “cmd.exe /c calc.exe” -o test.doc指令转化成test.doc
随后在安裝了office2013上的设备开启,弹出来了计算方式。
调节样版
最先立即开启word程序流程:
在插进选择项下,选择点,随后插进Microsoft公式计算3.0
如今起动x32dbg,选择文件->额外:
由于大家这儿了解文本文档运作以后会打开计算器,因此 额外上EQNEDT32.exe以后根据各自给CreateProcessA和CreateProcessW设定中断点
F9跑起来,随后应用word开启poc转化成的test.doc文档,开启以后取得成功断出来:
在回到详细地址处设定中断点,回到回来发觉计算方式早已弹出来了,这儿能够根据ebp查询一下CreateProcess的启用
回到回家发觉是WinExec调用函数的
因此 大家再次依照上边的方式 ,对WinExec涵数下断:
这时的00430C12是客户态详细地址,按大道理而言,ebp应当储放了当今涵数的回到详细地址,可是这儿是41414141,很显著ebp早已被毁坏了。
因此 大家往上看一下,ebp是在哪里被毁坏的。
因为ebp被吞没,大家这儿往上面看,找找别的的回到详细地址:
这儿近期的一个回到详细地址是在00411837,回到回来,往上面翻,寻找00411837所属涵数的起止详细地址,设定一个中断点,再次运作,让程序流程断在这个涵数里边。
往下沉两步在00411658的地区发觉那样一条命令:
rep movsd dword ptr es:[edi], dword ptr [esi]
该命令实行完以后,ebp就被41414141遮盖
而该命令的作用是将esi的值传输到edi所说的部位。
大家各自查询一下esi和edi的值:
ESI:
EDI
特别注意的是,这时ebp的值是0018F1D0
很显著该详细地址在EDI所说的详细地址后边
rep movsd dword ptr es:[edi], dword ptr [esi]实行完以后,EDI被取得成功取值,能够见到,这时ebp所属的值早已从0018F214变成了41414141
ebp后边的回到详细地址早已从004115d8变更为了更好地00430c12
查询一下00430C12详细地址:
OK原来是这个样子跳过来的,回来实行WinExec涵数以后,又在里面启用了CreateProcess涵数,涵数的主要参数为:
因此 取得成功弹出来计算方式。
系统漏洞的造成 缘故是strcpy涵数在应用的情况下,未对主要参数的长短开展分辨和限定,进而造成 栈溢出。
而对于步骤到底是如何回来的,及其文本格式的别的剖析以后再独立写一个文章内容详细介绍。
0x02 实战演练样版剖析
样版来自https://app.any.run/
样版MD5:8c166d55a69dda96f56596a783100842
样版下载地址:https://app.any.run/tasks/36dbd94f-f87c-4226-bb6f-cbe9a0e2f73b/
依据VT我们可以了解,该样版归属于CVE-2017-11882的运用样版。
将样版免费下载当地并缓解压力。
第一,我们可以在断开连接的vm虚拟机中立即试着运作该样版,看一下%appdata% %application% %temp%这好多个文件目录下是不是释放出来了相匹配的文档。
最先根据火绒剑各自监控WINWORD.exe和EQNEDT32.exe的个人行为。
这儿EQNEDT32.exe刚开始的地区应当便是系统漏洞刚开始的个人行为。
以前讲过,11882的系统漏洞开启一般有二种状况。 一种是在当地Drop并载入一个文档,也有一种是去特定的详细地址下载文件到当地实行。
在火绒剑中往下看,非常容易就能见到那样的个人行为。
这儿很显著是程序流程conect 194.180.224.87:80
随后后边http 要求了 abass.ir/kellyx/kellyx.exe
后边这一应该是个下载地址。免费下载的文档默认设置状况下得话会储存为kellyx.exe < /p>
立即浏览这一详细地址,也是能够下载文件回家的:
由于我用的是家中的互联网,我也立即浏览了。如果是用企业的互联网,切勿立即那样浏览故意详细地址。
大家最先查寻一下这儿conect 的194.180.224.87
依据奇安信的TI,基本确定这儿是个故意详细地址。
随后大家查寻下后边要求的哪个网站域名:
后边这一网站域名早已挨打到了相匹配的标识,且看上去,这一网站域名并不好像归属于某一大家族,更好像一个恶意程序公共性应用的一个详细地址,就类似开发设计应用的github?
因此返回火绒剑中,再向下翻一翻实际上就可以发觉,样版早已取得成功免费下载回家了。而且储存的途径确实便是大家以前猜想的%appdata%,储存的名字为:kellye358348.exe
大家再向下看一下,看是不是也有别的的个人行为。
EQNEDT32.exe的个人行为到这儿就剖析完成了,依据火绒剑的监管看来,这一11882的漏洞检测文本文档,实行完以后实际上便是会试着从总体目标详细地址去免费下载相匹配的文档到当地并载入实行。
转到%appdata%文件目录下,能够见到文档确实早已被取得成功免费下载回家了。
按到一切正常的剖析步骤,大家这儿能够立即剖析这一exe了,可是为了更好地调节cve-2017-11882系统漏洞,因此 大家還是调节下这一样版,看一下shellcode是怎样实行的。
0x03 系统漏洞调节
历经上边的剖析,大家早已了解,2017-11882系统漏洞的开启点应当在0041160F涵数中的00411658这一行。
因此我们可以還是像上边的方法额外QENDT32.exe到程序调试随后在0041160F涵数通道点设定中断点。
取得成功命中断点:
大家运作到00411658这一行编码处
各自查询一下ESI 、EDI、及其EBP的值
EDI的值以下:
EBP的值以下:
EBP的值这儿能够见到0018F214
大家注意到,这一详细地址实际上就在EDI后边
随后大家再次F8再次往下沉,这时还记得留意EDI的转变
这儿运作出来以后,ESI的值取得成功取值给了EDI,且我们可以见到,恰好ebp的值就被遮盖了,这儿被遮盖为了更好地2F E0 FF BF
随后大家立即在该涵数最结尾的地F4,实行完这一涵数,随后回到回家。
往下沉两步能够见到以下的句子:
这儿jmp eax 便是自动跳转到shellcode实行,这儿便是重要call
多调节几回 成功找到免费下载的实际操作
F7进到涵数,异常见到实际实行的编码以下:
这儿call eax 因为电脑上早已断网了,这儿不可以一切正常要求,会抛出异常。
我修复快照更新,随后再再次设置网络,调节一下试一下。
样版取得成功免费下载以后,进去,能够见到这儿立即就试着CreateProcess 的方法载入实行这一EXE。
0x04 免费下载样版剖析
样版基本资料
根据CFF 查询样版能够发觉,该样版是.NET服务平台的样版
随后我忽然发觉,这儿File Size 和PE Size不一样,我忽然意识到以前大家见到的哪个文档是沒有免费下载完的。因此 修复快照更新,自动跳转回来,继续下载,此次免费下载进行以后,显示信息1111kb,应当一切正常了。
重新加载该文件,能够见到此次一切正常了。
大家顺带查询一下資源:
这里有9个資源,待会很有可能会载入在其中的資源。
找寻样版真实通道点
应用dnspy载入这一样版,以下:
通道点函数编码以下:
dnpy左侧,程序流程相匹配了好多个那样的namespace:
程序流程各自有三个namespace 分别是
beerparlourbillingsystem
beerparlourbillingsystem.My
beerparlourbillingsystem.My.Resources
这一beerparlourbillingsystem
拆卸便是
beer parlour billing system
意译回来便是:葡萄酒厅收费系统
觉得好像一个一切正常的程序流程
先google一波beerparlourbillingsystem:
这玩意竟然还简直一切正常的一个管理流程。
但是源代码好像是应用VB写的。
我们下载个源代码回家看一下。
在vs中开启源代码,随后比照一下dnspy中的构造,发觉有两个类是本来的程序流程中沒有的
分别是HighScoreSave和TetrisDrop
在其中HighScoreSave以下:
TetrisDrop以下:
在其中HighScoreSave中的tr涵数有点儿好像一个自定的破译涵数:
FindForm中仿佛有实际操作資源的编码。
阅读文章HighScoreSave的编码,我们可以发觉,这儿应当是以資源获取数据,而且启用下边的tr涵数开展破译。
如今第一个解决问题了,我们可以立即在tr涵数中设定中断点,应当就可以立即F5冲过来了。
可是我还是好奇心,程序流程到底是如何回来的。
因此我还是鼠标右键转到通道点,继续看通道点的编码。
程序流程的通道点在beerparlourbillingsystem.My类中
这时我注意到,在当今类的最下边有那样一个方式 :
这儿base.MainForm = MyProject.Forms.Splashscreen;
将当今的MainForm更换为了更好地MyProject类下边的Splashscreen
因此 在上面的MyProject.Application.Run(Args); 起动的事实上并不是当今的Form
只是起动的Splashscreen
因此点回来看一下Splashscreen:
这儿根据this.m_Splashscreen的方法反射面载入。
大家再次跟踪,看一下this.m_Splashscreen
这儿的Splashcreen看上去很一切正常。
可是这儿的Splashcreen是beerparlourbillingsystem类的,大家当今类(通道点所属的类)是beerparlourbillingsystem.My
我点一下Splashcreen,进到到beerparlourbillingsystem的Splashcreen:
这儿最先是Splashcreen的实例化方式 Splashcreen():
Splashcreen()中各自启用了Splashscreen_Load:
和InitializeComponent:
这儿Splashscreen_Load方式 看上去十分一切正常,便是设定对话框,并沒有别的实际操作。
可是这儿的InitializeComponent,第一行便是:
HighScoreSave highScoreSave = new HighScoreSave();
这儿一开始便是实例化了HighScoreSave类。
HighScoreSave便是大家此前见到的,很有可能不太好的哪个类。
随后大家点一下回来,能够见到在HighScoreSave类的实例方法中,启用了下边的FindForm方式 。
这时大家立即在this.FindForm这一行设定中断点,随后F5冲过来就可以了。
取得成功击中:
随后F11进到到FindForm涵数,随后F10单步往下沉,就无需进到下边的tr破译涵数。
单步实行进行以后,下边的局部变量对话框可能出現tr涵数的返回值。
大家进行查询一下这一返回值:
果真是4D5A:
在这里行自变量上鼠标右键随后储存,储存下这一破译出去的PE并取名为dump_file1
然后往下看,程序流程从資源破译出PE以后,试着对TetrisDrop.Ng取值。
第一个赋值语句是:
TetrisDrop.Ng[1] = TetrisDrop.He;
这儿He点进来以下:
随后取值Ng[2]
TetrisDrop.Ng[2] = “beerparlourbillingsystem”;
最终将TetrisDrop.Ng做为主要参数和type一起传送到Activator.CreateInstance函数中。进行dll的启用载入。
这儿的Ng取值为了更好地rxcwON和grI
总结
在这个样版的剖析中,能够见到网络攻击是将小量的恶意程序插进来到一切正常的程序流程中。而且从载入的資源我们可以发觉,資源名应当也是网络攻击用心结构的。这类方法能够令人一眼看起来,觉得这一程序流程并没有什么问题。并且程序流程根据了反射面实例化和不一样namespace下的同名的类名的状况开展载入。算作一个较为隐敝的载入方法。
0x05 dump_file1
dump出去的这一文档是一个含有轻度搞混的C#dll文档,这儿的搞混基本上能够忽略,因此 立即剖析就可以。
回来最先是GodofBeauty类的实例方法:
GODofBeauty.Roman(ugz1, ugz3, projname);
这儿进去最先启用了Roman涵数,Roman涵数的实际完成在下面43行的部位。
赶到Roman的实际完成:
程序流程最先是转化成一个46000到59000的随机数字用以sleep,也就是程序流程会休眠状态46秒到59秒。这一步应该是为了更好地反沙盒。由于沙盒一般都是有时间限定,slepp是一个非常简单可是合理的反沙箱机制。
休眠状态以后,程序流程启用了当今类GODofBeauty的Capitoline方式
Capitoline方式 看上去仿佛也是一个实际操作資源的涵数:
資源载入取得成功以后,会取值给ughHbnBnaWtlYkx
Bitmap ughHbnBnaWtlYkx = GODofBeauty.Capitoline(ugz1, projname);
随后ughHbnBnaWtlYkx会做为参数传递到Vulcan中:
而Vulcan实行进行的返回值,会做为参数传递到下边的Greek涵数中。
Greek涵数也是一个破译涵数:
因此 这儿便是载入一个資源,随后破译2次。取值给array
随后array会做为Assembly实例化的主要参数:
随后assembly历经变换,根据methdInfo.Invoke的方式 开展启用。
随后这一程序流程看上去就实行结束了。大家立即来调节一下这一dll。
最先我们在
Activator.CreateInstance(type, TetrisDrop.Ng);
这行编码处 F11进到系统软件室内空间
再次F11
随后F10往下沉,当某一行实行完以后,程序流程跑飞走了,就在这里一行设定中断点,随后再次冲过来。随后F11进来
进去以后再次刚刚的方式 ,寻找.Invoke或是CreateInstance函数,F11
进去以后再次反复刚刚的实际操作,寻找InvokeMethod方式
随后F11就可以进到到dll室内空间:
随后便是一切正常的调节步骤。
以前早已静态数据剖析过,Capitoline涵数用以载入資源,Greek和Vulcan函数用以破译。
这儿载入的資源值便是”beerparlourbillingsystem.Resources”
立即F10忽略正中间破译資源的实际操作,这儿能够见到資源早已取得成功破译
破译的資源也是一个PE,大家储存为dump_file2
dump出去的这一文档等下会根据Invoke载入,大家先静态数据剖析一下dumpfile2
0x06 dump_file2分析
dump_file2的程序流程名叫Jupiter.dll
这一样版的搞混就情况严重了。
可是大约看一下,能够发觉这就是一般的搞混,立即用de4dot应当就可以去搞混。
去搞混以后大约构造以下:
先来剖析一下这一都是啥。
历经剖析,这一dll很显著是一个商业服务马,有很了解的盗取客户信息的实际操作及其后边的沙盒检验实际操作。
关键作用应当在这个去搞混以后名叫Class3的类中。
这儿Class3后边有一个Token是 0x02000005,它是C#的一种构造,我们都是能够点一下注解信息内容中的TOKEN的:
点一下回来能够查询到dnspy分析出去的一些构造信息内容
依据这一构造,我们可以成功的寻找去搞混以前的Class3类,这一类的token应当也是0x02000005
随后大家继续看解搞混以后的编码。发觉在Class2中又有载入資源和破译的实际操作
编码和dump_file1中的实际操作方法很像,可是不一样的是,这儿载入的是当今文档的資源,而dump_file1中载入的是源代码的資源。
Jupiter.dll的資源目录以下
这代表着,这儿实际上也有很有可能并不是真实的关键马,还仅仅一个loader。
各自剖析一下这好多个涵数,找找启用部位。
自动跳转回来发觉,程序流程還是最先根据smethod载入資源,随后各自根据smethod2和smethod1开展破译。
破译以后会将数据信息传送给byte_0。
查询一下byte_0的启用以下:
byte_0又会传送回来给Assembly,随后根据Invoke,和上一层的loader基本上一模一样。
因此 大家如今知道,我能立即在这儿设定中断点取得byte_0的数据信息,还可以在smethod1涵数return的地区设定中断点,取得最终的这一文档。
因此 大家如今必须做的是:去搞混的文档中寻找smethod_11方式 或是寻找smethod1的return,随后在大家已经调节的样版中寻找相匹配的部位设定中断点。
大家注意到,smethod11是在class3中的,而class3是一个大类,有很多的涵数。因此 我们要想从搞混的编码中寻找smethod11是十分艰难的。
smethod0 在Class2中,此类仅有三个方式 ,相对而言会非常容易许多
因此 能够试着去Class2中找一下相匹配的中断点部位。
Class2的Token是02000004,我们去寻找这一token的类
类中最上边的这一部位,应当相匹配的便是smethod0了
随后下边也有2个涵数,大家就各自试着在这里好多个return都去设定中断点。
因此 如今,大家必须返回调节对话框中,从dump_file1自动跳转到dump_file2执行。
還是跟大家从初始样版进到到dump_file1的方式 一样,先F11进Invoke涵数
随后一步一步进去 最终滞留在了dump_file2的Class3中
随后大家各自去寻找相匹配的地区,设定好中断点:
随后F5跑起来。这个时候会发觉,程序流程并沒有击中大家的中断点,只是立即运作告一段落。
因此 猜测是否程序流程进去的情况下,有地区实例化了这一类,启用了实例方法。简易而言便是这好多个涵数早已在大家调节回来以前实行完后。
因此 这个时候 立即调节原样版,立即F5 不必终断,应当会冲过来的。
(正中间有一个sleep,假如以前没patch得话,估算要等一分钟上下
取得成功击中第一个中断点:
F10回到回家,这时这一資源還是数据加密情况:
随后再次运作,击中第二个中断点:
这儿能够见到,第一次破译早已进行。
随后再次运作,击中第三个中断点,这时PE早已破译出去。
dump这一PE储存为dump_file3
这一dump_file3是一个exe,我们可以立即调节了。尽管这一也是有轻度的搞混,可是这儿的搞混还能接纳,能够再次剖析。
0x07 最后木马病毒简述
最后的这一木马病毒便是一个作用详细的商业服务泄密马了。这儿也不深入分析其作用,概述剖析一下。
程 序最先会启用nq涵数,这一涵数实际上并沒有多少实际意义
随后程序流程根据2个永真循环系统,随后以switch case的方法去实行一些特殊的作用:
后边会设定一个名叫uge的记时器。
…
随后随意跑一下个人行为,抓个包。
这儿能够见到程序流程在跟us2.smtp.mailhostbox.com三次握手创建联接,总体目标IP为:208.91.199.223
总体目标端口号是587
随后取得成功取得总体目标网络服务器的账户密码:
随后试着登陆邮箱:
这儿账户密码全是历经BASE64编号的,大家立即编解码随后试着登录就可以了。
取得成功登录,获得到电子邮件信息内容
根据查询电子邮件信息内容,我们可以确定该马是个泄密马,且没有屏幕截屏作用。
该马的关键目地是盗取客户服务器上储存的登陆密码信息内容。
编码构造不好像AgentTesla,可是设计风格却很类似。
依据状况看来,这一马并不是AgentTesla便是HawkEye。巨大巨大的几率是AgentTesla