惡意程序-分析SYNful Knock 思科植入

virustracker · 2015/09/21 15:02html

0x00 綜述


這個植入木馬由一個通過篡改的思科IOS鏡像組成,能容許攻擊者保持匿名性,同時從網絡上加載不一樣的功能模塊。這個植入木馬還使用了一個祕密的後門密碼,能給攻擊者提供非限制權限。每一個模塊都能經過HTTP協議(不是HTTPS)來啓用,只需向路由器的接口發送一個特別製做的TCP數據包。這些數據包都使用了非標準的序列號和相應的認可號。而這些模塊能夠把本身顯示成路由器IOS中獨立的可執行代碼或hook,提供的功能與後門密碼相似。後門密碼經過控制檯,遠程登錄協議和權限提高,使用enable命令,能提供對路由器的訪問。python

圖1:模塊更新 圖2:後門權限web

已知受影響的路由器:思科1841路由器,思科2811路由器,思科3825路由器算法

注意:咱們在識別之初發現,其餘型號的一些路由器可能也受到了影響,由於這些路由器的核心功能、IOS代碼都很相似。緩存

0x01 維護


這個植入木馬寄存於一個被篡改過的思科IOS鏡像,而且在加載後,植入就能維護本身,系統重啓也沒法清除。可是,攻擊者以後載入的模塊就只能儲存在路由器的內存中,系統重啓後就沒有了。從分析的角度看,若是模塊是加載到內存中,分析人員就能夠經過獲取路由器鏡像的核心轉儲來對這些模塊進行分析。服務器

0x02 檢測方法


對於能發出命令並接收響應的組織來講,主機標識很是實用。可是隻有一小部分的路由器是放置在比較容易接觸的網絡區域中,在這種狀況下,這種方法就是可行的。網絡

對於更分散的組織和不能執行本地命令並接收響應的組織來講,網絡標識能起到幫助做用。tcp

最終來看,結合主機標識和網絡標識的方法基本上能用於判斷底層網絡的健康狀況。模塊化

  • 主機標識函數

    表1-主機標識命令和預期輸出

    除了表1中的命令,思科的IOS防篡改文檔中還提供了其餘的一些檢測技術: http://www.cisco.com/web/about/security/ intelligence/integrity-assurance.html

    從文件大小上來看,包含有植入木馬的IOS二進制與合法鏡像是同樣的。因此,從文件大小上沒法區別這個鏡像有沒有遭到篡改。最好的辦法之一就是獲取思科鏡像的哈希,經過比較哈希來檢測二進制是否是被篡改過。可是,只有當鏡像是在磁盤上,而不是加載到內存上時,這種方法才能發揮做用。

  • 網絡標識

    曼迪昂特公司提供有主動和被動兩種網絡檢測方法。關於這兩種方法的詳細介紹請參見下文中的 「網絡檢測」部分。

0x03 攻擊者主要篡改了IOS二進制的下面四個函數:

  • 修改轉換後援緩衝器(TLB)讀寫屬性
  • 修改一個會被調用的合法IOS函數,並初始化木馬
  • 使用惡意代碼替換合法的協議處理函數
  • 使用木馬的字符串替換合法函數引用的字符串
  1. TLB讀寫屬性

    木馬會強制把TLB的全部與讀和寫相關的屬性都篡改爲Read-Write(RW)。咱們認爲這種篡改是爲了讓載入模塊hook到IOS的函數。若是沒有把TLB權限設置成RW,那麼緩存頁篡改可能就沒法影響到內存中的原始頁。

    遭到篡改的函數多是IOS中疑似負責配置TLB的函數,攻擊者修改了函數中的兩個單字節,從而實現了對TLB屬性的篡改。在沒有篡改時,函數會把寄存器中的前兩位設置成1;篡改後,函數會把寄存器的前三位設置成1。曼迪昂特公司認爲控制着TLB項寫入權限的就是第三位。圖3中是遭到篡改的指令。

    圖3-篡改TLB權限(上爲未篡改,下爲篡改後)

    這就聯繫到了咱們上面討論過的主機標識方法。使用enable模式命令 「show platform」就能檢查TLB屬性。若是IOS映像沒有遭到篡改,TLB就會輸出圖4中的內容。

    圖4-合法IOS鏡像的TLB項

    若是路由器中植入了篡改過的IOS鏡像,其RW屬性就會以下:

    圖5-篡改後IOS鏡像的TLB項

    視路由器硬件而定,內存地址的有些特定範圍通常是隻讀的可執行代碼部分。檢測路由器是否遭篡改的最簡單方法就是使用命令「show platform | include RO, Valid」。若是沒有結果顯示,那麼,IOS鏡像極可能就遭到了篡改,其目的是爲了篡改可行代碼。

  2. 初始化木馬

    曼迪昂特公司認爲,要想在IOS鏡像載入時執行木馬,確定要修改一個與進程調度相關的函數。這是由於,在IOS啓動順序中,遭到篡改的函數會被更早地調用,而且只要IOS啓動正確,這個函數就必定會被調用。函數調用的目標地址通過篡改,指向了木馬的hook處理函數。咱們的研究證實,hook處理函數先會檢查被篡改IOS中的調用函數是不是有效的,以後木馬就會初始化。如今,木馬就上線並運行了,而且會執行原來的IOS函數,這樣誰也不會懷疑。

    曼迪昂特公司認爲,遭到篡改的函數與進程調度任務有關聯,當這個函數被調用時,函數就會進入一個無限循環。另外,它的幾個子函數也會引用與進程調度相關的字符串,好比 「Threshold: %s CPU Utilization(Total/Intr):…」。

  3. 替換成木馬的可執行代碼

    爲了防止鏡像的文件大小發生變化,木馬會使用本身的可執行代碼覆蓋幾個合法的IOS函數。攻擊者還會檢查當前路由器的功能,而後判斷能夠覆蓋哪些函數而不致使路由器發生問題。因此,在不一樣的部署中,可能會覆蓋不一樣的函數。

  4. 木馬的字符串和配置

    承接上文,由於鏡像的文件大小沒有變化,這個木馬還用本身的配置覆蓋了一些reporting字符串。這個入侵標識也能夠用來檢測篡改。圖6中是被覆蓋的合法字符串。

    圖6-木馬覆蓋了這些與一個有效函數相關的字符串

    木馬就是用下面圖7中的內容覆蓋了圖6中的內容。這很明顯就是木馬的字符串(包括CC中使用的HTTP標頭),以及默認的密碼-咱們故意抹去了。這樣,潛在的受害者就有時間來查看本身的網絡有沒有遭到入侵,從而修復這一問題。若是你懷疑你的系統被入侵了,請聯繫咱們的郵箱synfulknock [at] fireeye.com,咱們會提供給你密碼。

    圖7-木馬字符串

    這個主機標識,也能夠用於識別植入木馬。可是,首先須要找到配置字符串的位置,而在不一樣的部署中,其位置可能也不一樣。當運行一個常規的IOS命令時,篡改過的IOS鏡像會輸出一個很是可疑的結果,以下:

    視植入木馬而定,在運行了一個合法的IOS命令後,可能會顯示後門標頭。

0x04 後門密碼


攻擊者能夠在三種不一樣的認證方案中,利用後門密碼。植入木馬首先會檢查用戶輸入的是否是後門密碼。若是是,則授予權限。不然,植入代碼就會傳遞憑據,以便驗證憑據的有效性。這就有些可疑了。在使用後門木馬時,下面的三個實例在通過驗證後就能啓用權限:

可是,這次研究代表,SSH或HTTPS會話並不能給後門密碼提供權限。這多是一個配置問題,在不一樣的入侵中,狀況也可能發生變化。

圖8-合法密碼驗證與後門密碼驗證之間的細微差異(上爲合法密碼,下位後門密碼)

0x05 網絡命令和控制


植入木馬的CC部分是模塊化的,而且能在IOS中加載額外的功能。其CC功能是祕密進行的,由於CC功能須要一系列的TCP觸發數據包,木馬會監視這些數據包,尋找特定的TCP標頭值和內容。即便路由器啓用了過濾,木馬仍是能處理TCP觸發數據包。木馬會響應從3個地址上發出的觸發數據包,分別是:路由器接口,廣播IP和網絡位置(子網中的第一個IP)。

  1. 要想初始化進程,必須向植入路由器的端口80發送一個特製的TCP SYN數據包。值得注意的是,序列號和認可號之間的差值必須設置成0xC123D。另外,ACK號不必定必須是0。

    圖9-TCP SYN序列號和認可號之間的差值是0xC123D

  2. 雖然,木馬一般有3種握手方式,會響應一個TCP SYN-ACK信息,認可第一個SYN信息。可是,要避免下面的狀況:

    • 認可號和序列號如今的差值如今是 0xC123E
    • 設置下面的這些硬編碼選項: 02 04 05 b4 01 01 04 02 01 03 03 05
    • 緊急指針設置到了0x0001,可是沒有設置緊急旗幟
    • 木馬從SYN數據包中複製認可號做爲序列號。正常的服務器會生成一個隨機序列號,因此說這不是標準的TCP握手

    圖10-TCP SYN序列號和認可號之間的差值是0xC123E

  3. 當最終的 ACK 完成了3種方式的握手後,控制器接下來會發送下面的 TCP 信息:

    • PUSH和 ACK 旗幟已設置
    • 從TCP標頭開始,在偏移0x62上,寫入了字符串「text」
    • 下面的命令位於TCP標頭的偏移0x67上

    命令的格式以下:

    [4字節命令長度][CMD數據][4字節校驗和]

    [CMD 數據]使用了一個靜態密鑰,進行了異或。校驗和的算法是對解碼後的[CMD數據]進行4字節異或。

    圖11-控制器命令數據包

  4. 木馬響應就包含在下面的靜態HTTP/HTML服務器響應中。

    圖12-受害者響應

0x06 受支持的命令


咱們以前提到過,這個植入木馬是分模塊的。下表中的前五個命令是用來在受害者的路由器上加載額外的模塊和功能。總共能夠加載100個額外模塊,可是,這些模塊都是儲存在內存中,在重啓或重載後就沒有了。

命令信息會把第一個WORD(4字節大端/大端字節序)設置成0。第二個WORD會識別命令類型(從0-4的值)。全部的信息類型都會如下面的8個字節開頭:

00 00 00 00 00 00 00 [00 - 04] [可選參數]

表3-受支持的命令

若是信息的第一個WORD不是0,與第一個WORD模塊ID相關的代碼就會執行。這樣沒有hook到IOS函數的代碼就能夠執行了。

網絡檢測

主動和被動網絡檢測均可以部署用來檢測並防止SYNful Knock的入侵。被動檢測能夠整合到網絡防護傳感器上,同時也使用主動技術來獵捕後門。

  • 被動網絡檢測

    被動網絡檢測的方法有不少。咱們的網絡檢測簽名主要集中在CC會話中的四個部分:SYN,SYN-ACK,木馬響應信息和控制器命令。IDS必需要可以監控路由器的外部接口,纔能有效地檢測到網絡中的後門。

    **1. SYN: **

    第一個簽名(附錄A)是利用TCP序列號和認可號之間的差值來檢測SYN數據包。爲了下降誤報率,簽名會假設認可字段不是0。這個簽名能檢測木馬探測,並不必定能說明目的位置被入侵了。

    2.SYN/ACK:

    第二個簽名(附錄B)會驗證TCP序列號和認可號之間的差值和TCP選項來檢測木馬發出的SYN ACK響應。這個簽名假設SYN數據包中的認可字段是0。

    3.木馬響應信息:

    當一個命令發出時,下面的簽名會檢測HTTP服務器響應。下面簽名的優點在於,這個簽名是一個標準的snort簽名;可是,這個簽名不能驗證TCP序列號和認可號之間的差值。

    4.控制器命令

    下面的簽名會檢測從控制器中發出的命令。它會在木馬預期的位置上,使用 「text」字符串,其信息的大小會少於256字節。這個簽名還會假設不會呈現TCP標頭選項。若是包括了TCP標頭選項,簽名可能須要轉換成通過編譯的簽名或建立多個變體來處理每一個長度。

  • 主動網絡檢測

    • **Nmap 腳本引擎(NSE) **

      曼迪昂特公司用LUA語言寫了一個NSE腳原本主動掃描這個思科植入木馬。

      • 要求:

        • Nmap v6.47 或更高版本(也測試了v6.49)
        • 修改過的nselib
      • 修改過 NSE 庫

        NSE數據包庫不容許用戶修改ack值;因此,曼迪昂特公司修改了這個庫來容許這個功能。區別以下:

      • **估計最壞狀況下的速度()(THIS FACTORS IN HIGH UNUSED IP SPACE) **

        曼迪昂特公司首先用Nmap的默認掃描速度-T3來運行這個掃描:

        nmap -sS -PN -n -T3 -p 80 --script=」SYNfulKnock」 10.1.1.1/24

        **Class C **- 256 IP 地址 (4 hosts up) - 掃描用時2.29秒

        而後曼迪昂特公司用Nmap的默認掃描速度-T4來運行這個掃描:

        nmap -sS -PN -n -T4 -p 80 --script=」SYNfulKnock」 10.1.1.1/24

        **Class C **- 256 IP地址 (4 hosts up) - 掃描用時2.28秒

        snmap -sS -PN -n -T4 -p 80 --script=」SYNfulKnock」 10.1.1.1/16

        **Class B **- 65536 IP 地址(4 hosts up) - 掃描用時2557.50秒 (42 分鐘)

        nmap -sS -PN -n -T4 -p 80 --script=」SYNfulKnock」 10.1.1.1/8

        **Class A **- 16,777,216 IP地址 - 預計掃描時間 = 10,752 分鐘(179 小時) = 7 天

      • 旗幟說明:

        -sS = SYN 掃描
        -PN = 不執行主機發現 -n =不執行名稱解析 -T4 = 加速到速度4
        -p = 端口號
        --script = 執行腳本
        optional: --scriptargs=」reportclean=1」 也顯示潔淨設備的seq 和 ack
        複製代碼
    • Python 檢測腳本

      曼迪昂特公司還寫了一個Python腳原本主動掃描這個思科植入木馬。這個腳本會發送一個定製的TCP SYN數據包,並分析SYN/ACK響應,查看有沒有木馬標識。這個腳本須要依賴Scapy數據包操做庫 (http:// www.secdev.org/projects/scapy/) 來處理,發送和接收數據包。掃描進程會使用幾個掃描線程,和一個獨立線程來收集響應。這個腳本比nmap腳本慢20倍;可是,很是適合小規模的掃描和快速掃描驗證。

      • **要求 **

        • Python
      • 速度

        **Class C **- 256 IP 地址 (4 hosts up) - 59.26秒 **Class B **- 腳本提前終止

      • 命令行

        python ./SYNfulKnock_scanner.py -D 10.1.1.1/10.1.1.2

      • 旗幟說明:

        -d = 掃描目標 (IP, IP/CIDR, 第一個 IP/最後一個 IP)

      • 輸出

        python ./SYNfulKnock_scanner.py -D 10.1.1.1/10.1.1.2
        2015-07-14 12:59:02,760 190 INFO 嗅探器後臺程序啓動
        2015-07-14 12:59:02,761 218 INFO 用10個線程發送2個數據包
        2015-07-14 12:59:03,188 110 INFO 10.1.1.1:80 - 發現植入的seq: 667f6e09 ack: 66735bcd
        2015-07-14 12:59:03,190 225 INFO 等待完成發送
        2015-07-14 12:59:03,190 227 INFO 全部發送的數據包
        複製代碼
    • **旗幟Nping **

      曼迪昂特公司發現,還可使用nping(或hping)等工具來檢測這個思科植入木馬變體。

      • **要求 **

        • nping (用nmap安裝)
      • 速度

        **Class C **- 256 IP 地址(4 hosts up) - 257.27秒

      • 命令行

        nping -c1 -v3 --tcp -p 80 --seq 791104 --ack 3 10.1.1.1

      • 旗幟說明:

        -c = 計數
         -v = 信息級別
         --tcp = TCP探測模式
         -p = 端口
         --seq = 序列號
         --ack = 認可號
         -H = (可選) 隱藏發送,能夠加速掃描      
        複製代碼
      • 輸出

        nping -c1 -v3 --tcp -p 80 --seq 791104 --ack 3 10.1.1.1
        Starting Nping 0.6.47 ( http://nmap.org/nping ) at 2015-07-14 16:08 EDT
        SENT (0.0048s) TCP [10.1.1.3:37895 > 10.1.1.1:80 S seq=791104 ack=3 off=5 res=0 win=1480 csum=0xED6E urp=0] IP [ver=4 ihl=5 tos=0x00 iplen=40 id=8373 foff=0 ttl=64 proto=6 csum=0x4416]
        0000 4500002820b50000
        0010 0a01010194070050
        0020 500205c8ed6e0000
        RCVD (0.0092s) TCP [10.1.1.1:80 > 10.1.1.3:37895 SA seq=3 ack=791105 off=8 res=0 win=8192 csum=0x9256 urp=0 <mss 1460,nop,nop,sackOK,nop,wscale 5>] IP [ver=4 ihl=5 tos=0x00 iplen=52 id=18496 foff=0 ttl=255 proto=6 csum=0x5d7e]
        400644160a010103 000c124000000003
        E..(....@.D..... .......P...@.... P....n..
        0000 45000034 0010 0a010103 0020 80122000 0030 01030305
        48400000 ff065d7e0a010101 00509407 00000003000c1241 92560000 020405b401010402
        E..4H@....]~.... .....P.........A .....V.......... ....           
        複製代碼

        高亮區域是序列號和認可號。其差值必須是791102,上述的TCP旗幟選項必須是「20 04 05 b4 01 01 04 02 01 03 03 05」。

0x07 應對方法


在確認遭到入侵後,最有效的應對辦法是下載一個乾淨的鏡像,再刷到路由器上。保證新鏡像的哈希值,而後增強設備防護攻擊的能力。在綜述中提到過,初始入侵是由默認憑據或發現的憑據形成的,在修復了路由器後,重點就落在了網路上的其餘部分上。若是路由器沒有默認的憑據,感染就必定是經過其餘方式致使的。接下來就是對入侵進行評估。

相關文章
相關標籤/搜索