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

wyzsk發表於2020-08-19
作者: virustracker · 2015/09/21 15:02

0x00 綜述


這個植入木馬由一個經過篡改的思科IOS映象組成,能允許攻擊者保持匿名性,同時從網路上載入不同的功能模組。這個植入木馬還使用了一個秘密的後門密碼,能給攻擊者提供非限制許可權。每個模組都能透過HTTP協議(不是HTTPS)來啟用,只需向路由器的介面傳送一個特別製作的TCP資料包。這些資料包都使用了非標準的序列號和相應的承認號。而這些模組可以把自己顯示成路由器IOS中獨立的可執行程式碼或hook,提供的功能與後門密碼類似。後門密碼透過控制檯,遠端登陸協議和許可權提升,使用enable命令,能提供對路由器的訪問。

圖1:模組更新 圖2:後門許可權

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

注意:我們在識別之初發現,其他型號的一些路由器可能也受到了影響,因為這些路由器的核心功能、IOS程式碼都很類似。

0x01 維護


這個植入木馬寄存於一個被篡改過的思科IOS映象,並且在載入後,植入就能維護自己,系統重啟也無法清除。但是,攻擊者之後載入的模組就只能儲存在路由器的記憶體中,系統重啟後就沒有了。從分析的角度看,如果模組是載入到記憶體中,分析人員就可以透過獲取路由器映象的核心轉儲來對這些模組進行分析。

0x02 檢測方法


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

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

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

  • 主機標識

    表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 應對方法


在確認遭到入侵後,最有效的應對辦法是下載一個乾淨的映象,再刷到路由器上。保證新映象的雜湊值,然後加強裝置防禦攻擊的能力。在綜述中提到過,初始入侵是由預設憑據或發現的憑據造成的,在修復了路由器後,重點就落在了網路上的其他部分上。如果路由器沒有預設的憑據,感染就一定是透過其他方式導致的。接下來就是對入侵進行評估。

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章