這個植入木馬由一個經過篡改的思科IOS鏡像組成,能允許攻擊者保持匿名性,同時從網絡上加載不同的功能模塊。這個植入木馬還使用了一個秘密的后門密碼,能給攻擊者提供非限制權限。每個模塊都能通過HTTP協議(不是HTTPS)來啟用,只需向路由器的接口發送一個特別制作的TCP數據包。這些數據包都使用了非標準的序列號和相應的承認號。而這些模塊可以把自己顯示成路由器IOS中獨立的可執行代碼或hook,提供的功能與后門密碼類似。后門密碼通過控制臺,遠程登陸協議和權限提升,使用enable命令,能提供對路由器的訪問。
圖1:模塊更新 圖2:后門權限
已知受影響的路由器:思科1841路由器,思科2811路由器,思科3825路由器
注意:我們在識別之初發現,其他型號的一些路由器可能也受到了影響,因為這些路由器的核心功能、IOS代碼都很類似。
這個植入木馬寄存于一個被篡改過的思科IOS鏡像,并且在加載后,植入就能維護自己,系統重啟也無法清除。但是,攻擊者之后載入的模塊就只能儲存在路由器的內存中,系統重啟后就沒有了。從分析的角度看,如果模塊是加載到內存中,分析人員就可以通過獲取路由器鏡像的核心轉儲來對這些模塊進行分析。
對于能發出命令并接收響應的組織來說,主機標識非常實用。但是只有一小部分的路由器是放置在比較容易接觸的網絡區域中,在這種情況下,這種方法就是可行的。
對于更分散的組織和不能執行本地命令并接收響應的組織來說,網絡標識能起到幫助作用。
最終來看,結合主機標識和網絡標識的方法基本上能用于判斷底層網絡的健康情況。
主機標識
表1-主機標識命令和預期輸出
除了表1中的命令,思科的IOS防篡改文檔中還提供了其他的一些檢測技術: http://www.cisco.com/web/about/security/ intelligence/integrity-assurance.html
從文件大小上來看,包含有植入木馬的IOS二進制與合法鏡像是一樣的。所以,從文件大小上無法區別這個鏡像有沒有遭到篡改。最好的辦法之一就是獲取思科鏡像的哈希,通過比較哈希來檢測二進制是不是被篡改過。但是,只有當鏡像是在磁盤上,而不是加載到內存上時,這種方法才能發揮作用。
網絡標識
曼迪昂特公司提供有主動和被動兩種網絡檢測方法。關于這兩種方法的詳細介紹請參見下文中的 “網絡檢測”部分。
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鏡像很可能就遭到了篡改,其目的是為了篡改可行代碼。
初始化木馬
曼迪昂特公司認為,要想在IOS鏡像載入時執行木馬,肯定要修改一個與進程調度相關的函數。這是因為,在IOS啟動順序中,遭到篡改的函數會被更早地調用,并且只要IOS啟動正確,這個函數就一定會被調用。函數調用的目標地址經過篡改,指向了木馬的hook處理函數。我們的研究證明,hook處理函數先會檢查被篡改IOS中的調用函數是否是有效的,之后木馬就會初始化。現在,木馬就上線并運行了,并且會執行原來的IOS函數,這樣誰也不會懷疑。
曼迪昂特公司認為,遭到篡改的函數與進程調度任務有關聯,當這個函數被調用時,函數就會進入一個無限循環。另外,它的幾個子函數也會引用與進程調度相關的字符串,比如 “Threshold: %s CPU Utilization(Total/Intr):…
”。
替換成木馬的可執行代碼
為了防止鏡像的文件大小發生變化,木馬會使用自己的可執行代碼覆蓋幾個合法的IOS函數。攻擊者還會檢查當前路由器的功能,然后判斷可以覆蓋哪些函數而不導致路由器發生問題。所以,在不同的部署中,可能會覆蓋不同的函數。
木馬的字符串和配置
承接上文,因為鏡像的文件大小沒有變化,這個木馬還用自己的配置覆蓋了一些reporting字符串。這個入侵標識也可以用來檢測篡改。圖6中是被覆蓋的合法字符串。
圖6-木馬覆蓋了這些與一個有效函數相關的字符串
木馬就是用下面圖7中的內容覆蓋了圖6中的內容。這很明顯就是木馬的字符串(包括CC中使用的HTTP標頭),以及默認的密碼-我們故意抹去了。這樣,潛在的受害者就有時間來查看自己的網絡有沒有遭到入侵,從而修復這一問題。如果你懷疑你的系統被入侵了,請聯系我們的郵箱synfulknock [at] fireeye.com
,我們會提供給你密碼。
圖7-木馬字符串
這個主機標識,也可以用于識別植入木馬。但是,首先需要找到配置字符串的位置,而在不同的部署中,其位置可能也不同。當運行一個常規的IOS命令時,篡改過的IOS鏡像會輸出一個非常可疑的結果,如下:
視植入木馬而定,在運行了一個合法的IOS命令后,可能會顯示后門標頭。
攻擊者可以在三種不同的認證方案中,利用后門密碼。植入木馬首先會檢查用戶輸入的是不是后門密碼。如果是,則授予權限。否則,植入代碼就會傳遞憑據,以便驗證憑據的有效性。這就有些可疑了。在使用后門木馬時,下面的三個實例在經過驗證后就能啟用權限:
但是,此次研究表明,SSH或HTTPS會話并不能給后門密碼提供權限。這可能是一個配置問題,在不同的入侵中,情況也可能發生變化。
圖8-合法密碼驗證與后門密碼驗證之間的細微差別(上為合法密碼,下位后門密碼)
植入木馬的CC部分是模塊化的,并且能在IOS中加載額外的功能。其CC功能是秘密進行的,因為CC功能需要一系列的TCP觸發數據包,木馬會監視這些數據包,尋找特定的TCP標頭值和內容。即使路由器啟用了過濾,木馬還是能處理TCP觸發數據包。木馬會響應從3個地址上發出的觸發數據包,分別是:路由器接口,廣播IP和網絡位置(子網中的第一個IP)。
要想初始化進程,必須向植入路由器的端口80發送一個特制的TCP SYN數據包。值得注意的是,序列號和承認號之間的差值必須設置成0xC123D。另外,ACK號不一定必須是0。
圖9-TCP SYN序列號和承認號之間的差值是0xC123D
雖然,木馬通常有3種握手方式,會響應一個TCP SYN-ACK信息,承認第一個SYN信息。但是,要避免下面的情況:
02 04 05 b4 01 01 04 02 01 03 03 05
圖10-TCP SYN序列號和承認號之間的差值是0xC123E
當最終的 ACK 完成了3種方式的握手后,控制器接下來會發送下面的 TCP 信息:
命令的格式如下:
[4字節命令長度][CMD數據][4字節校驗和]
[CMD 數據]使用了一個靜態密鑰,進行了異或。校驗和的算法是對解碼后的[CMD數據]進行4字節異或。
圖11-控制器命令數據包
木馬響應就包含在下面的靜態HTTP/HTML服務器響應中。
圖12-受害者響應
我們之前提到過,這個植入木馬是分模塊的。下表中的前五個命令是用來在受害者的路由器上加載額外的模塊和功能。總共可以加載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腳本來主動掃描這個思科植入木馬。
要求:
修改過 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倍;但是,非常適合小規模的掃描和快速掃描驗證。
**要求 **
速度
**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)等工具來檢測這個思科植入木馬變體。
**要求 **
速度
**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
”。
在確認遭到入侵后,最有效的應對辦法是下載一個干凈的鏡像,再刷到路由器上。保證新鏡像的哈希值,然后加強設備防御攻擊的能力。在綜述中提到過,初始入侵是由默認憑據或發現的憑據造成的,在修復了路由器后,重點就落在了網路上的其他部分上。如果路由器沒有默認的憑據,感染就一定是通過其他方式導致的。接下來就是對入侵進行評估。