译者: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 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/569/