揭開思科ASA防火牆網絡軍火的面紗(下)

作者:360 MeshFire Team

稿費:700RMB(不服你也來投稿啊!)

投稿方式:發送郵件至linwei#360.cn,或登陸網頁版在線投稿

今年8月Shadow Brokers 曝出的EPICBANANA、JETPLOW、SCREAMPLOW等工具中包含了思科ASA系列防火牆漏洞利用和後門攻擊代碼,360 MeshFire團隊針對ASA設備後門技術原理和植入方法進行了完整分析,並重點對研究了其內存型和持久化型後門,展示了網絡基礎設施的後門攻擊原理與方法。

0x01 背景


今年8月, Shadow Brokers組織在其Twitter微博上公開了入侵NSA後獲取的大量黑客工具,並將部分放在網上進行拍賣。根據Shadow Brokers描述,這些工具原屬於著名的黑客團隊方程式組織(Equation Group),思科的官方博客也在第一時間對該後門進行了簡要分析,以下是思科官方博客給出漏洞和後門模塊研究分析,360 MeshFire團隊也第一時間對泄漏文件、0DAY漏洞和植入後門進行了深入研究和完整分析。

在該系列上一篇文章中我們主要針對EXTRABACON模塊中Cisco ASA防火牆SNMP遠程代碼執行的0DAY漏洞(CVE-2016-6366),對產生原因和利用原理進行了詳細分析。詳見鏈接:http://bobao.360.cn/learning/detail/3053.html

該漏洞實現了思科網絡基礎設施的破門並獲取網絡設備管理員權限,如何植入後門並實施更加隱蔽的後門攻擊等攻擊手段則是在EPICBANANA和JETPLOW的模塊中實現,後門模塊提供了更加複雜和隱蔽的攻擊方法,我們將在該篇文章中詳細分析ASA設備的後門原理和植入方法,並對後門連接作簡單演示。

0x02 Cisco ASA後門簡介


泄漏的文件中專門針對於Cisco ASA防火牆的後門可分為內存型和持久化型。從我們的分析看,內存型後門被命名為BANALRIDE和BANANAGLEE(簡稱BG),其中BANALRIDE只提供基本的控制功能和一些原始設備操作的API,而BG相對於BANALRIDE的功能更加強大和複雜;持久化後門又分為JETPLOW和SCREAMPLOW,其中JETPLOW作為早期的持久化後門主要針對於PIX防火牆和部分ASA設備,而新版本的被稱為SCREAMPLOW是JETPLOW的升級版。

在整個後門植入過程中,首先需要利用命令解析漏洞(CVE-2016-6367),漏洞利用的前提是攻擊者能夠成功登錄設備,可用已知用戶名和密碼登錄,也可以利用漏洞修改登錄流程實現任意賬戶名密碼直接登錄(見第一篇文章)。

然後執行epicbanana__2.1.0.1.py 腳本通過ssh或telnet登錄到ASA系統,並發送payload至console終端,該腳本將構造15個攻擊載荷到console終端下觸發命令行解析漏洞,通過內存溢出的方式將BANALRIDE後門寫入到ASA內存中。

最後使用目錄下的bride-1120連接工具連接到BANALRIDE後門,BANALRIDE後門連接後的截圖如下:

可執行的操作包括獲取系統版本,內存操作申請、釋放、讀取和查看內存等,此外還可以植入控制接口更全面的BG後門(選項30)。

持久化後門JETPLOW和SCREAMPLOW也需要藉助BG進行上傳植入。但遺憾的是在這次泄露的文件中並沒有包含BG後門的真實載荷,莫非在Shadow Broker拍賣轉眾籌文件里?即便沒有BG載荷,我們通過加載錯誤的BG文件,還是可以顯示後門主要功能,包括讀配置信息、接口信息和ARP表信息,更全面的讀寫內存操作,更重要的是實現了模塊化的加載持久後攻擊後門。

0x03 BANALRIDE後門分析


因缺少BANANAGLEE後門載荷,也就無法成功植入持久化SCREAMPLOW後門,我們將重點對可實現完整連接的BANALRIDE後門載荷的運行原理進行動態分析,對持久化後門SCREAMPLOW只作靜態分析。本文的調試環境基於Cisco ASA 5505型號ASA設備,系統鏡像版本為asa804-k8.bin。

1. 後門初始化

當BANALRIDE初次植入,全部代碼被分為14個片段離散分佈在ASA網絡處理主進程lina進程空間中。通過shellcode控制EIP跳轉到第一處片段來執行初始化操作,此段代碼塊主要執行了兩部分操作:

(1)解密自身代碼

由於BANALRIDE代碼經過加密後植入到lina進程中,所以在初始化代碼起始處存在解密後續代碼的過程:

12345678910111213 0xddfeb316: mov $0xaaaaaa82,%eax 0xddfeb31b: xor $0xaaaaaaaa,%eax 0xddfeb320: mov $0xddfeb314,%edi 0xddfeb325: add %eax,%edi 0xddfeb327: mov $0xaaaaaa74,%ecx 0xddfeb32c: xor $0xaaaaaaaa,%ecx 0xddfeb332: mov (%edi),%bl 0xddfeb334: xor $0x9c,%bl 0xddfeb337: mov %bl,(%edi) 0xddfeb339: inc %edi 0xddfeb33a: loop 0xddfeb332 0xddfeb33c: and $0x41622d98,%eax 0xddfeb341: pop %ds

在地址0xddfeb332~0xddfeb33a的代碼通過異或方式循環解密了從0xddfeb33c起始的代碼,在第一處解密後的代碼中還存在解密其它地址段的代碼片段。

(2)申請內存

將其它分散在lina進程中的後門代碼全部copy拼接到新申請的內存中。由於lina進程通過思科自實現的內存池方式來管理內存,而ASA系統中大部分內存的動態申請也是依賴於內存池機制。此後門並沒有直接調用glibc中的內存申請函數,而是也復用了lina進程中內存池操作函數sub_89BCE60來申請內存,代碼如下:

12340xddfeb595: push $0x15500xddfeb59a: mov $0x89bce60,%eax0xddfeb59f: call *%eax0xddfeb5a1: mov %eax,%edi

在初始化代碼中記錄了所有分散的代碼片段地址,如下所示:

1234567891011MEMORY:DDFEB5AE mov dword ptr [ebp-3Ch], 0DDFEB734hMEMORY:DDFEB5B9 mov dword ptr [ebp-38h], 0DDFEB944hMEMORY:DDFEB5C0 mov dword ptr [ebp-34h], 0DDFEBB54hMEMORY:DDFEB5C7 mov dword ptr [ebp-30h], 0DDFEBD64hMEMORY:DDFEB5CE mov dword ptr [ebp-2Ch], 0DDFEBF74hMEMORY:DDFEB5D5 mov dword ptr [ebp-28h], 0DDFEC184hMEMORY:DDFEB5DC mov dword ptr [ebp-24h], 0DDFEC394hMEMORY:DDFEB5E3 mov dword ptr [ebp-20h], 0DDFEC5A4hMEMORY:DDFEB5EA mov dword ptr [ebp-1Ch], 0DDFEC7B4hMEMORY:DDFEB5F1 mov dword ptr [ebp-18h], 0DDFEC9C4hMEMORY:DDFEB5F8 mov dword ptr [ebp-14h], 0DDFECBD4h

2. 網絡通訊

ASA對所有網絡報文的處理都是通過lina程序來驅動實現的,由於ASA底層Linux系統並不能識別ASA的硬件接口設備,因此無法在Linux系統層面完成網絡數據層面的通信,也無法藉助系統socket進行通信,只能復用lina進程空間中的網絡通信函數。

(1)網絡接收函數劫持

後門程序完成初始化操作後會跳轉到ASA系統正常程序流程,但後續為了能夠接收攻擊者連接指令,則還需開啟網絡接收功能,後門連接並未指定專用網絡端口,因此必須監聽所有端口上的數據流量,並從中篩選出連接指令。

在ASA系統主進程lina中,網絡模塊在處理數據報文時使用回調函數sub_8660C30來處理從物理網口接收到的每一個數據包。BANALRIDE可以通過劫持此函數,使正常的報文處理流程跳轉到自身代碼中,並從棧中取出報文地址,以達到劫持經過ASA網口所有流量的目的。實現HOOK網絡接收程序代碼如下:

1234567891011121314150xddfeb645: mov $0x916bbb0,%ebx……0xddfeb678: push $0xa0xddfeb67a: push %eax0xddfeb67b: push $0x807bef10xddfeb680: call *%ebx0xddfeb682: push $0xe0xddfeb684: lea -0x4c(%ebp),%eax0xddfeb687: push %eax0xddfeb688: push $0x80612c10xddfeb68d: call *%ebx0xddfeb68f: movb $0xe9,0x8660c930xddfeb696: mov $0x1,%eax0xddfeb69b: movl $0xffa00629,0x8660c94

其中0x916bbb0是ASA系統內存copy函數,將第二個參數指向地址copy到第一個參數指向內存中,長度由第三個參數控制。lina進程空間中代碼段改動前後對比如下圖所示:

BANALRIDE後門植入到內存中時修改sub_8660C30函數中0x08660C93地址處代碼,使程序流程跳出當前函數。在地址0x80612c1處寫入了進入後門代碼區的跳轉指令,其中0xC5514B68就是存放後門代碼的地址,這個地址是變化的,由初始化階段動態申請。最後在0x807bef1處寫入了當BANALRIDE代碼執行結束後返回sub_8660C30函數正常流程的跳轉指令,整個跳轉流程如下圖:

在這個流程圖中可以看到,其實BANALRIDE後門在內存中每次運行的生命周期為從接收到一個網絡報文起,到處理這個報文結束為止。

(2)網絡發送函數:

從代碼中可看到BANALRIDE向控制端發送網絡報文時復用lina函數的過程,首先調用sub_89BD690函數創建一個描述數據報文的結構變量,大小為0x60E(1550)位元組,代碼如下:

12345MEMORY:C551524E push 60EhMEMORY:C5515253 mov [ebp+var_10], eaxMEMORY:C5515256 mov eax, 89BD690hMEMORY:C551525B movzx edi, [ebp+arg_14]MEMORY:C551525F call eax

對sub_89BD690返回數據的結構進行分析結果如下:

123456789101112131415struct struc_send_pkt{ char unknow_str1[30]; char mac_src[6]; char mac_dst[6]; _WORD type; char vlan_tag[4]; char *p_ip_packet; char *p_Buff; char unknow_str2[4]; struc_send_udp_info *p_send_udp_info; char unknow_str3[728]; char ip_header[20]; char udp_header[8];};

可以看到此結構體中包含了發送數據包二層及三層報文頭部各字段的詳細信息,雖然sub_89BD690函數申請了1550位元組長度的內存空間,但這個結構體只規定了此段內存前820位元組長度的數據格式,之後剩餘部分填充為程序自定義的載荷數據,因此對sub_89BD690函數傳參不能小於820位元組。

ASA系統中對於發送報文的函數封裝並不如在Linux系統中的系統調用簡單明了,考慮到在struc_send_pkt結構中還需要填充二層網絡目的地址,因此需要在ASA路由表中查找出報文的下一跳地址:

1234MEMORY:C55151BA push esi ;bufferMEMORY:C55151BB mov eax, 8778AF0h ;route_table_lookupMEMORY:C55151C0 push [ebp+arg_8] ;dst ipMEMORY:C55151C3 call eax

sub_8778AF0函數查找出第一個參數指向的目的IP地址的下一跳IP,並將結果存放在第二個參數指向的地址中,返回結果是一個結構體,從起始偏移16位元組為下一跳的IP,隨後使用sub_84C0200函數在ARP表中查找出下一跳IP相應的MAC地址,再調用sub_84BE670函數將查詢出的地址填充到struct_send_pkt中:

1234MEMORY:C55151CB push ediMEMORY:C55151CC mov eax, 84C0200hMEMORY:C55151D1 push dword ptr [esi+10h]MEMORY:C55151D4 call eax

最後將構造好的struc_send_pkt結構變量傳遞給sub_863FE50函數來構造完整的網絡報文並添加到發送隊列中:

1234MEMORY:C55151F6 mov eax, [edx+4]MEMORY:C55151F9 push [ebp+arg_0] ;struc_send_pktMEMORY:C55151FC push eaxMEMORY:C55151FD call dword ptr [eax+0Ch] ; 0x863FE50

(3)傳輸通信加密

BANALRIDE與控制端網絡通訊時,在建立session階段先使用Diffie-Hellman算法協商密鑰,在此後的通訊中,所有數據都使用此密鑰進行AES算法加密。當接收到控制指令時,會先判斷有無session,代碼如下:

123456MEMORY:C551570E mov edi, offset 0xC55CFC34MEMORY:C5515714 lea eax, [esi+14h] ; UDP報文指針MEMORY:C5515717 mov [ebp+var_10], eaxMEMORY:C551571A mov eax, [edi]MEMORY:C551571C cmp byte ptr [eax], 0 ; 判斷sessionMEMORY:C551571F jz short loc_C551576F

若已存在session則會再判斷與之前建立的session的連接四元組信息,若session尚未建立先判斷接收payload第一個字符也就是控制指令是否為A8,表明是否建立新的session,代碼如下:

12345678910MEMORY:C551576F mov edx, [ebp+var_10]MEMORY:C5515772 lea edi, [esi+1Ch]MEMORY:C5515775 movzx eax, word ptr [edx+4]MEMORY:C5515779 movzx ecx, alMEMORY:C551577C shl ecx, 8MEMORY:C551577F shr eax, 8MEMORY:C5515782 or ecx, eaxMEMORY:C5515784 lea eax, [ecx-8]MEMORY:C5515787 mov [ebp+var_14], eax ; payload長度MEMORY:C551578A cmp byte ptr [esi+1Ch], 0A8h ; 判斷控制指令是否是0xA8

BANALRIDE會對接收到的payload進行完整性校驗,具體方式通過計算比對payload最後兩位元組的校驗和,驗證通過後再計算加密密鑰返回給控制端:

123456789MEMORY:C55157A4 call sub_C55156C0 ; a1:payload地址 a2:payload長度MEMORY:C55157A9 pop ecxMEMORY:C55157AA pop edxMEMORY:C55157AB xor edx, edxMEMORY:C55157AD test al, alMEMORY:C55157AF jz short loc_C55157CBMEMORY:C55157B1 push esiMEMORY:C55157B2 push ediMEMORY:C55157B3 call sub_C551581D ;

計算校驗和處理流程見下圖:

0x04 SCREAMPLOW持久化後門分析


第二節中我們介紹到SCREAMPLOW 作為持久化後門實際上是JETPLOW 升級版,後門程序在BANANAGLEE\BG3121\Install\LP目錄下,先通過BPICKER-3100工具連接BG內存後門UDP500端口後,加載相關載荷模塊植入到目標設備中,BPICKER-3100是writeScreamingPlow和writeJetPlow新版本,SCREAMPLOW種植持成功後也可使用lp工具對目標進行後續的連接和管理。

當BPICKER-3100與目標建立連接成功後,會收到目標返回的ASA系統和後門版本信息,然後在當前目錄下搜索名稱基於<platform_name>-moduledata-<bg_version>.tgz格式的文件,但目前泄露出的文件中只包含了唯一的版本:asa-moduledata-3101.tgz。此文件中包含了種植SCREAMPLOW所需的載荷以及配置文件等。

對BPICKER-3100進行靜態代碼分析發現,在植入過程中,會對asa-moduledata-3101.tgz文件中asa目錄下的pif文件進行解密,其解密密鑰通過硬編碼方式寫入在BPICKER-3100程序中,存儲過程僅簡單做了一次異或加密,獲取密鑰的相關代碼如下:

12345678910111213141516171819 v2 = malloc(0x1Du); v3 = v2; v4 = v2 == 0; v5 = "Couldn't malloc for key_data_copy."; if ( v4 ) goto LABEL_6; *v3 = 0xC28AD3C7; v3[1] = 0xD8CFDCC5; v3[2] = 0xCCCBD8C9; v3[3] = 0xD9C38ADE; v3[4] = 0xC6DFCC8A; v3[5] = 0xCCC58AC6; v3[6] = 0xC6CFCF8A; *((_BYTE *)v3 + 28) = -39; v6 = 0; do *((_BYTE *)v3 + v6++) ^= 0xAAu; while ( v6 <= 28 );

解密後的明文密鑰為:my hovercraft is full of eels。隨後對於所有pif文件進行解密,命令如下:

1find . -iname "*.pif" -type f -print -exec sh -c 'openssl base64 -d -in {} | openssl aes-128-cbc -d -nosalt -md md5 -k "my hovercraft is full of eels" > {}.xml' \;

解密後的pif文件部分內容如下:

1234567891011121314151617181920212223242526272829303132<?xml version="1.0" encoding="iso-8859-1"?><platform xsi:noNamespaceSchemaLocation="versionFile.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" lib="libasa.so"> <name>asa5505</name> <version> <name>1.0(12)6 (no persistence detected)</name> <originalBios>bin/asa5505/asa5505_10126_bios_sectors1-E_clean.bin</originalBios> <patchList><!-- Install SCP --> <patch> <data src="inline" type="userarea">0</data> <!-- Assigned later --> <address>fff70000</address> <!-- SECOND_USER_AREA_ADDRESS --> </patch> <patch> <data src="file">bin/asa5505/SCP28/asa5505_patch60000.bin</data> <address>fff60000</address> <!-- FIRST_CODE_AREA_ADDRESS --> </patch> <patch> <data src="inline" type="pbd">0</data> <!-- Assigned later --> <address>fff6df00</address> <!-- FIRST_USER_AREA_ADDRESS --> </patch> <patch> <data src="file">bin/asa5505/SCP28/asa5505_patchEC480.bin</data> <address>fffec480</address> <!-- SECOND_CODE_AREA_ADDRESS --> </patch> <patch> <data src="file">bin/asa5505/SCP28/asa5505_patchE18BF.bin</data> <address>fffe18bf</address> <!-- HOOK_ADDRESS --> </patch> </patchList> </version></platform>

此XML文件描述了SCREAMPLOW後門感染目標ROMMON版本為1.0(12)6的Cisco ASA 5505型號設備,而感染前的原始BIOS鏡像文件存放在bin/asa5505/asa5505_10126_bios_sectors1-E_clean.bin,通過此XML文件可大致了解後門植入ASA 的BIOS內存中的代碼區域,如下圖所示:

SCREAMPLOW後門通過感染BIOS進程空間實現持久化,由於Cisco ASA設備在執行reload命令後內存中的BIOS代碼並沒有重新從文件中載入,因此通過reload重啟的方式並無法徹底清除此後門。

0x05 通過BANALRIDE實現監聽流量後門


對於網絡設備後門攻擊來說,實現流量監聽和重定向是十分重要的環節,其中BANANAGLEE作為最核心的後門模塊提供相關功能接口,但由於BANANAGLEE載荷缺失,並不能對其進行實際研究測試,但我們發現當前泄漏出來的BANALRIDE後門已經具備了BG的大部分網絡後門功能,可以理解其是一個內存小馬,BG是一個內存大馬,若適當修改BANALRIDE中的部分代碼實現完整的流量監聽和重定向功能,便實現後門攻擊的核心功能,以下示例中我們重現了通過BANALRIDE實現對HTTP報文的流量監聽並將其重定向輸出到設備文件中。

由於BANALRIDE後門劫持了ASA設備底層網絡的所有流量,因此完全可以設置過濾規則並從中篩選出感興趣數據,例如可以監聽流經ASA物理網口上所有HTTP報文,並通過文件輸出函數sub_8074498將報文輸出到文本中,結果如下圖所示:

可以充分發揮想像力,配合上一節所提到的lina中數據包發送功能函數將己截獲的數據流量鏡像發送到攻擊者指定的IP上去,即實現流量重定向功能。

0x06結論


針對此次對Cisco ASA防火牆後門的深入分析,可以看出針對網絡基礎設施的攻擊程序已經達到了相對較高的工程化實現,並實現了全平台多版本的適配,從研發和植入成本看需要具備相對較高的技術門檻。

1.ASA系統底層是Linux系統,但是無法通過傳統Linux系統方式進行滲透。ASA設備網絡通信使用的數據通信接口都是由lina進程驅動的,對所有網絡報文的處理也通過lina程序來實現,底層Linux系統並不能識別ASA數據平面的網絡接口,因此在整個後門代碼中無法使用任何Linux系統調用包括socket程序來實現後門的核心網絡功能,後門所有行為,包括加解密、內存管理、網絡通訊等,都是復用了ASA主進程lina中函數指針。BANALRIDE通過劫持監聽ASA系統中所有流量並從中過濾出控制命令。

2.通過對代碼中調用函數進行分析,可以推測出後門研發組織對於ASA系統以及內部函數調用功能非常熟悉。我們發現在IDA中逆向的ASA系統中總包含近有四萬個函數,且每個版本系統的函數地址都存在差異性,若僅通過逆向的方式來從中獲取攻擊過程中所需函數其工作量是巨大的,不排除後門研發組織對於ASA系統有更為充分的技術資料支持其研發。

3.ASA設備植入的後門具備非常高的隱蔽性。首先,該後門植入並沒有在網絡設備上開放任何TCP或UDP的網絡監聽端口,完全依靠ASA底層的網絡接收函數來監聽所有物理端口上的通信流量,並過濾出連接指令,無法通過網絡探測的方式進行後門發現。此外,後門連接採用自定義網絡協議,採用D-H算法協商密鑰驗證後才允許連接,通訊的過程也採用協商的密鑰進行了加密,難以通過傳統IDS或IPS檢測攻擊。因此,如果想準確的檢測後門,必須按照後門通信協議構造網絡數據包並獲取真實後門的反饋才能夠實現後門的探測。

4.ASA設備植入的後門的具備工程化和專業化。從泄露的文件目錄看,後門研發組織對於網絡基礎設備擁有全平台的適配能力和模塊化後門加載能力,整個後門攻擊程序可以作為網絡基礎設施攻擊框架,只需要挖掘到新的0DAY漏洞就可以方便的擴展沿用現有的攻擊載荷,文件中包含多個針對網絡設備的後門程序,這些程序擁有Rootkit能力,且具備加密和抗分析能力。尤其當攻擊目標定向為不便重啟和升級的基礎網絡設施時,其持久化後門即使升級後仍可能無法徹底清除,這對於安全防禦和檢測方是很大的挑戰,針對網絡設備固件完整性校驗、網絡設備內存完整性校驗、以及固件的供應鏈安全將顯得越發重要。