这些前些天在论坛上看到一个朋友上传的pdf文档,关于思科网络系统的rootkit,感觉挺新鲜的,就翻译成汉文,与大家分享之,文章只是讲述了一个大概,再加上愚人英语不咋地,错误之处望大家批评指正


核心安全技术
解密思科控网络系统rootkits:DIK(Da Ios rootKit)
Translated by: 沧桑不尽  
Email:cangsangbujin@126.com                                                                                      

【摘要】

Rootkits 在Windows、Linux、Unix上很常见的,但是在嵌入式系统上并不常见。这是由于这些系统源码

是不公开的,所以我们并不清楚其中的一些机制。
在现实生活中,一旦一个黑客获得了一个系统的控制权,一般就会在其上面安装rootkit。rootkit通过隐

藏其文件,隐藏其进程、网络连接等手段来控制整个系统,可以让一个未授权用户作为一个管理员角色控

制系统。等等...

本文将证明为一个嵌入式系统创建和开发rootkit也是很容易的一件事,并且不再管理员的发觉下运行在

系统之上,即使不能这样,也可以引起专家对这一安全领域的重视。

为了证明这个些,要用不同的方法去感染目标网络操作系统,例如运行修补和二进制镜像修补。为了讨论

二进制修补技术,DIK是python[1]脚本的一个集合,它提供了一个工具。

【介绍】

思科 IOS是一个比较特别的操作系统,因为其被非常广泛的地应用在因特网上的路由器上。
网络设备是数据交换的设备,攻击者会尽可能多的收集目标的信息。
系统管理员应该防备好这种威胁,因为一些重要信息的泄漏可能在他们没有发现之前就发生了。
安全组通常通过检测思科设备上的不正常的操作去发现rootkit,但是对与一些高级的rootkit并不起作用


仅仅很少一部分系统管理员定期的检查组织网络的安全结构去发现系统所受的危害。这些检查可能是(也

可能仅限于这些):查看router日志,检查外部日志(用户登录或者下载镜像等人为操作留下的日志)。

系统管理员的检查也就仅限于系统内部通过的函数和日志文件,但是如果设备受到了危害,登录日志和系

统日志,系统函数将会因攻击者的修改变得完全没有用处。

【了解对手】

常年,为了满足客户需求,思科开发了通过不同的软件集合(像VoIp)的多种硬件。这就要求这种IOS要

为其中的硬件单独的创建一个进程来运行。

另一个重点是IOS不支持添加的模块和插件。

综上可知,如果不利用工具开发一个rootkit将会是很难的一件事。
下面将来证明创建一个通用的方法并不是一件难事,这种方法依靠rootkit的核心代码。

【IOS 内部】
思科IOS有一个独一无二结构运行在镜像上,而其他的进程访问其他的内存。在进程之间没有内存保护意

味着一个进程可以控制破坏进程和破坏系统的操作,这将导致一个失败。

思科网络系统的另一个特点是调度程序并不想计数器的优先级高。“运行到结束”的调度程序意味着一个

程序被调度了,在它的优先级改变和操作系统运行其他技能成之前是不会结束的。
思考网路系统的镜像通常是被作为32为的ELF文件运行在硬件之上的。说明一点的是:一些别有用心的思

科工程师修改了标准的ELF文件头,因此任何去获取其文件信息的工具将会得到大量的崔武无用的信息。

【IOS 内存的初始化】

这些镜像包含一个SFX头,在运行的时候,它可以解压将被重新在内存中定位IOS代码。
还原和重定位包含几个步骤,这些应该要了解的,因为压缩的IOS镜像将会被解压,把后门插入到重新压

缩的镜像文件中,就可以达到目的。
一个IOS压缩镜像文件有以下的结构:
 ______________________________
|                              |
|         ELF header           | 
|                              |
|------------------------------|
|          SFX code            |
|------------------------------|
|       Mageic(0xFEEDFACE)     |
|------------------------------|
|     Compressed image length  |
|------------------------------|
|   Compressed image checksum  |
|------------------------------|
|  Uncompressed image checksum |
|------------------------------|
|    Uncompressed image length |
|------------------------------|
|                              |
|          Compressed          |
|            image             |
|______________________________|

一旦设备通上电,ROM管理器就会通过几个步骤载入IOS镜像
这些步骤是:


●ROM 管理器将在内存中的链接地址处载入和定位子压缩镜像,作为ELF头。


●主线程检查是否有足够的内存可供解压缩使用。


●压缩文件通过检验和法检验,其结果也保存在文件中的数据比较,以确保没有错误发生。之后它将被移 
  高端内存,然后BBS(bulletin board system)区域将被初始化为0。

●解压缩进程创建。一旦它完成了,解压缩后的文件尺寸将于文件头中存的数据比较以保证完全的成功。 

 解压缩也用和检验法确保没有错误发生。

●在解压缩文件指针被调用之后,一个函数将会重新在内存中定位镜像。

【结束的开始】rootkit一般是监听特殊重要的函数。这些函数主要拦截一些攻击者感兴趣的数据。根据

不同功能分类如下:
●系统登录
●认证和授权
●文件系统访问
●网络操作
●信息显示
●系统日志

对于这中并提供源码的系统,首先我们要做的是分析上面提到的函数的代码。为了达到目的,我们要下载

镜像,然后运行在我们想要攻击的设备上这样可以配置一台服务器作为目标机。有了目标网络系统的镜像

我们就可以按照计划进行分析了

【乘胜追击】

一旦我们有了文件,我们必须按照一些步骤去发现上面提到的函数:
1.叫做Ciscoutils的,用来解压镜像,是DIK的一部分。镜像解压后,我们就利用和检验保证没有错误发

生。解压进程和其他的解压文件一样,因为我们可以用任何免费的解压工具进行解压,然后用相同的脚步

修改检验和。

2.一定要用IDA Pro[3]去分析解压的镜像去分析关键的信息。这可能要花费几分钟甚至几个小时,因为解

压后的IOS镜像将会很大。

3.我们要知道IDA完成了分析并不意味着我们成功了,因为一些函数和字符串参考将会丢失。为了解决这

个问题,我们将会用另外一种包含DIK的脚本,它叫做enhanced_analysis[4],是用IDAPython[5]实现的。

这种脚本可以独自的创建代码段和数据段,它可以识别镜像中的每一个函数和每一个字符串参考。

一旦脚本分析镜像完成,攻击者就会通过测试获取思科网络系统的内部技术。
镜像文件的成功分析是非常重要的,因为它包含了大量的提供系统管理员的程序调试信息和系统的状态信

息,这些将可能作为关键字去发现系统重要的函数。

【反抗是无用的】

一些有趣的函数可能不能被定为到,由于它们可能不可能返回字符串供参考,或者根本没有用到任何脚本


就如我们前面所说的,网络系统包括大量的字符串,大部分是调试信息,还有一些是现实在终端用户上的

信息。这些信息可能定位离我们想要找的函数的附近,因为我们知道这些字符串是不会被编译器修改的。
我们尽量去找这些“邻居”函数,然后分析那些我们感兴趣的可以注入的函数。

定位邻近的函数并不需立即去寻找它,那里可能会有另外一个没有任何字符串参考的函数把它们隔开,但

是这种方法会成功的。

【家 甜蜜之家】

rootkit点位一定要在镜像pathing发生之前定位,因为patches将会调度rootkit代码,它们一定知道内存

定位。

利用IOS内存管理保护,我们可以把rootkit代码写到data段。
有好多种插入rootkit代码的方法,写Linux病毒的人将会非常明白,它只要是感染标准的ELF文件的程序

。没有相关这种技术的详细介绍,我们经常做的就是覆盖一个存在的字符串资源。

这种方法是最简单的了,对于有很多很少用的长字符串,那就不必要修改ELF头,因为每个节区和段保持

原样。
在一些情况下,数据段允许被读、写、执行。

攻击者希望创建一个新的节区,用PyElf[8]可以轻松的做到这一点。
镜像利用一定要小心,因为在解压之后它将会被重新定位,一些内存参考可能会引发异常,这将导致系统
崩溃。
为了以后操作方便,我们一定要保存rootkit代码在内存中结束的地址。

【代码 窥探者】
一旦发现了重要的函数,我们就会讨论通过二进制插入rootkit。函数根据不同的参数将会有不同的动作


我们已密码检查函数为例。在这种情况下rootkit一定要控制函数的开始去检查rootkit密码已经输入了。

这就意味着一些结构将被覆盖。
为了RISC结构的原样,我们一定要保存返回地址,然后分配一块代码叫做“trampoline”,这将会转向

stub

它被叫做trampoline是它保存返回地址,并立即跳转到攻击者的用来调用rootkit函数的特殊代码的位置

,这个函数是用来验证密码和根据结果转向下来要执行的代码的。
trampoline跳转的位置叫做stub,它负责保存调用程序的返回地址(这里是指trampoline地址)和调用

rootkit函数。

这个结果被用来决定下来是回到trampoline还是继续执行下来被trampoline覆盖的代码或者直接返回

trampoline的调用函数,因为没有密码验证的需要了,这就意味着攻击者已经登录进来了。
这些充满痛苦的步骤可能是不必须的,如果rootkit是用完全用汇编写的,但是一些情况下在是用纯C的
这些很少航的特殊汇编结构叫做trampoline和stub。

【没有函数的功能】
一个检查密码的函数可能会把用户的密码保存到一个地方(可能是个隐藏文件),这将会引起攻击者的很

大兴趣。

这些函数除了上面提到过的,还有像文件的读写函数,socket句柄像send、recv和IOS喊叔叔可以通过命

令修改系统管理员未授权的访问。

【准备 平稳地走下去】
通过放置好的rootkit代码,我们现在准备修改正IOS镜像,重新打包源文件头,然后上传到目标系统。
全部的patching技术和IOS dump都是同过一种叫iamge_pather的IDAPython脚本做到的。
修改后的IOS镜像也要进行求和检验。

【暴力的其他形式】
二进制镜像在运行时的内存中隐藏的很深,分析技术也可能用GDB[10]stub。
GDB stub是为思科开发者提供结构的东西,它允许调试IOS进程。它也允许远程镜像的诊断。因为它可以

通过一个远程登录会话取得控制。
这种GDB stub以三种不同方式进行工作:

●进程测试:允许内存检查和进程注册器检查,不是不允许

●进程调试:

●内核调试:

通过远程连接,一个远程GDB例程会创建。一个攻击者可能想自动连接远端的进程,它可能通过不同的方

法完成。

一个可能的方法是创建一个TCL脚本去执行启动,启动一个远程会话,这种情况下这个脚本必须包含

rootkit代码在内存中的位置。

【总结】

一个可靠通用的注入思科IOS镜像的方法,已经出现在眼前了。

总结只是总结而已,没什么好翻译的了