譯者:dengxun@360A-Team
來源:360安全監測與響應中心

0x00 前言

作者George Nosenko

Digital Security安全研究員
漏洞挖掘者
利用程序開發人員

議程

第一部分: Cisco IOS逆向工程

  1. 主要難點
  2. 子系統
  3. 注冊表
  4. 進程
  5. 粘合代碼/簡單代碼/死代碼
  6. 命令解析器
  7. Libc在哪里?
  8. 其他
  9. 如何調試Cisco IOS
  10. 如何調試Cisco IOS XE

第二部分: Cisco IOS shellcode編寫

1.動機
2.主要難題
3.Image-independet (譯者注:非鏡像相關性) shellcode
a. 反匯編shellcode
b. Interrupt-Hijack(中斷劫持) shellcode
4.TCL shellcode
a. 如何工作?
b. 特性
c. 限制
d. 如何編寫?

前人栽樹

Cisco多樣化概述

操作系統
CiscoIOS XE(基于Linux)
CiscoNX-OS(基于Linux)
CiscoIOS XR(基于QNX)
ASAOS(基于linux)
CatOS

CPU構架
PowerPC(Book-E)
MIPS
Intelx86_x64

0x01 Cisco IOS RE

主要難題
  1. 系統被設計成一個靜態鏈接的大的ELF二進制文件
  2. 所有方面都高度集成,沒有模塊化的內容
  3. 沒有APT

上下文中的逆向

固件解包

1.鏡像可能使用自解壓
2.鏡像可能包含如下內容:
a. 加載器(loader)
b. Flash驅動
c. 附加硬件的固件
d. 安全證書
3.Binwalk 可以工作,但它產生了巨量的輸出
4.要進行自動分析,你需要編寫一個解包工具(unpacker)

跟蹤字符串

子系統

注冊服務
  1. Linker-independent (連接器獨立性) 機制
  2. 服務是一個子系統接口
  3. 注冊表是服務的集合
  4. 服務模擬C語言結構(loop, switch等等)
  5. 具有8-12個不同的類型

進程(IOS中的進程相當于傳統意義上的線程)

如何快速找到process_create()

  1. 進程是一個內部結構(類似于PEB)
  2. 進程被分配cfork()分配在地址0x05B9AFDC上
  3. 而cfork()被process_create()所調用

粘合代碼/簡單代碼/死代碼

命令解析器樹
  1. 分配在子系統(subsystem header)頭后面
  2. 節點根據其類型包含不同的信息
  3. 根節點類型為0x56

Libc在哪里?

  1. 在本例中,libc位于.text段最后
  2. Libc提供系統層服務(printf, fopen, socket,malloc…)
  3. Libc是基礎函數集合(memcpy, strcpy,strncat…)
  4. 基礎函數是一個簡單代碼,具有很小的圈復雜度(has alittle cyclomatic complexity)

MagicPeople, voodoo people!

CiscoIOS下的調試

Cisco IOS包含一個GDB服務器,但。。。

它不能工作于常規GDB客戶端,因為IOS的RSP協議有一些不同。

你能夠:

  1. 使用ROMMON
  2. 給老版本GDB打補丁
  3. 使用IODIDE
  4. 為IDA Pro編寫適配器

Cisco IOS XE(3.3.5SE)的調試

此版本不包含GDB服務器,但你可以針對目標平臺靜態編譯一個gdbserver然后復制到設備上。復制完之后打開linux shell來操作。

在Linux shell下使用gdbserver附加到進程iosd上(flash:/map at /mnt/sd3/user)。

0x02 CISCOshellcoding

動機

我們的測試任意經常需要仔細處理Cisco設備的二進制漏洞,測試人員又從公共途徑獲取所需的shellcode,因此我們需要穩定強大的工具來完成這件事情。

難點及早期shellcode

1.沒有公開API和系統調用給第三方開發者。系統調用時ROMMON中的接口。
a. 寫入字符到控制臺
b. 重啟
c. 改寫confreg等

2.Cisco IOS 二進制文件多種多樣

Cisco IOS 是個高度集成的靜態大ELF文件,沒有任何的模塊(類似 *.so這樣的)

Image-independent(鏡像無關性) shellcode

Signature-based shellcode byAndy Davis
Version-independent IOS shellcode, 2008
不變的代碼結構

2.Disassembling shellcode byFelix ‘FX’ Lindner
Cisco IOS Router Explotation 2009
不變的唯一字符串

3.Interrupt-Hijack shellcode byColumbia University NY
Killing the Myth of Cisco IOS Diversity, 2011
不變的中斷處理程序

Disassembling shellcode

基本技術

  1. 找到一個獨特的字符串并獲取它的地址
  2. 搜尋引用這個字符串的代碼
  3. 對這個函數進行補丁

優缺點

  1. 可靠, 能在很大范圍的Cisco設備上奏效
  2. 充分互動,但隱蔽性不強
  3. 必然限制于IOS shell
  4. 可能觸發watchdog計時器異常檢測,它會結束并記錄運行時間過長的進程

Interrupt-Hijack shellcode

Two-stage攻擊

Stage1:

  1. 解析出第二段shellcode
  2. 放入ERET指令(譯者注:中斷返回指令)
  3. 攔截所有的中斷處理

Stage 2:

  1. 從特定格式的網絡數據包中接收命令
  2. 運行命令

優缺點

  1. 快速,健壯,權限高
  2. 通過ICMP建立隱蔽通道
  3. 結構復雜,異步操作
  4. 它預備一個包含鏡像有關性的stage 3 payload數據庫
  5. Rootkit-oriented (rootkit方向性)

Cisco 事件回應:SYNful Knock 惡意代碼

(譯者注:此處圖片內容為思科和火眼發現SYNful Knock惡意代碼以及該代碼介紹等,以下僅翻譯部分惡意代碼的介紹)

SYNfulKnock 是一個持續型惡意代碼,它能讓攻擊者獲得設備控制權并使用修改過的軟件鏡像破壞了完整性。惡意代碼可通過HTTP協議激活多個模塊并通過向設備發送構造好的TCP包進行控制。

看起來,SYNful Knock工作原理和Interrupt-Hijack shellcode具有相似性。

我們對Shellcode的要求
  1. 不依賴于特定鏡像和CPU構架
  2. 能在較多Cisco設備上工作
  3. Pentest-oriented
  4. 最大穩定性和功能
  5. 足夠快避免觸發watchdog

0x03 Demo

Tool Command Language

1.由John K. Ousterhout, Berkely創造于1980年http://www.tcl.tk
2.解釋性語言,可運行于多種平臺(支持套接字、文件系統、正則表達,列表等)
3.TCL于2003年開始被Cisco IOS(Release 12.3(2)T)作為通用腳本語言
4.在IOS里面,Cisco為TCL擴展了幾個特殊的命令
a. exec – 執行一個IOS Shell命令
b. ios_config – 修改IOS配置
c. typeahead – 模擬用戶輸入
d. 更多。。。
5.Embedded Event Manager(EEM)的TCL規則

TCL與滲透測試
  1. 幾乎是唯一進行Cisco IOS功能擴展的通道
  2. TCP腳本可以在不同平臺運行

TCL shellcode如何工作?

Stage 1:

  1. 獲取內存分布
  2. 在.data區域查找TCL子系統
  3. 在子系統中查找TCL C API表
  4. 獲取所有TCL IOS 命令擴展處理程序的地址
  5. 創建新的TCL命令
  6. 使用TCL C API創建新的TCL解析器
  7. 運行內存中的TCL腳本

Stage 2:

  1. 腳本連接惡意服務器
  2. 執行從服務器接收到的TCL表達式
獲取內存分布

目標

  1. 縮短搜索時間
  2. 不引起訪問違例
  3. 必須使用System PurposeRegisters(SPR)
  4. 此方法依賴于處理器構架
  5. 我們能忽略這個步驟
  6. 因為我們使用C開發shellcode,這不是什么大問題

搜索TCL子系統

目標

  1. 縮短搜索時間
  2. 所有TCL子系統相關的數據均位于頭段后面
  3. 所有TCL子系統相關函數都在tcl_subsys_init中
  4. 通過標記C15C0515 C15C0515查找
  5. 通過名稱”tcl”查找
查找TCL C API表

1.TCL C API
a. 用于嵌入式
b. 用于功能擴展
c. TCL API
2.使用函數指針表tclStubs 進行平臺抽象
3.我們可以通過查找0xfca3bacf查找tclStubs的地址

查找擴展處理函數地址

目標

  1. 我們想使用TCL IOS擴展
  2. 我們已經從ctlStubs獲取到了Tcl_CreateCommand地址
  3. 所以,我們能找到所以調用它的地方
  4. 我們能從匯編代碼中獲取擴展處理函數的地址和名稱

創建屬于你的TCL命令

執行內存中的TCL腳本

特點/屬性/局限

特點

  1. 擁有最高權限的Shell
  2. 能夠使用文件系統和套接字
  3. 可以讀寫內存 a. 改變Cisco IOS行為 b. 分析IOMEM

高級特性

  1. 宏命令 (比如創建GRE通道)
  2. 自動化攻擊
  3. 復用其他TCL工具
  4. ROMMON木馬

屬性

  1. 鏡像無關性
  2. 很容易移植到其他CPU構架
  3. 能應用于Cisco IOS XE
  4. 不用擔心watchdog
  5. 劫持進程

限制

  1. TCL并非無處不在
  2. 有約2kb – 2.5kb的大小限制
  3. 無法創建TCL服務器
  4. 使用TCP連接,隱蔽性不夠強

Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/569/