首页
社区
课程
招聘
[翻译]【Part1】新型Linux/AES.DdoS IoT恶意软件
发表于: 2017-12-5 21:30 3956

[翻译]【Part1】新型Linux/AES.DdoS IoT恶意软件

2017-12-5 21:30
3956

       正如标题所言,该恶意软件是通过暴力破解SSH服务以及利用一系列IoT设备漏洞来散布流传的。该僵尸网络早在数年之前就流传于X86_64设备之间,现在它的目标有所转变。通过其输出符号表及其使用的C++ 结构分析,我们很容易知道Linux/AES.DdoS 是用C++ 编写的

       将要用到的工具:

·     gdb-peda: 818K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6D9L8$3&6Y4L8r3c8Q4x3V1k6H3k6h3c8S2

·     BinaryNinja: fa6K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1K9h3&6S2M7Y4W2Q4x3X3g2F1K9h3&6B7j5g2)9J5c8R3`.`.

·     ltrace: eb1K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6D9K9h3&6#2P5q4)9J5k6h3c8A6k6g2)9J5k6h3&6W2N6q4)9J5c8X3#2S2L8W2)9J5c8U0q4Q4x3V1k6D9N6s2u0S2j5$3f1`.

·     radare2: 4edK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4u0S2k6r3q4Q4x3X3g2J5k6g2)9J5c8Y4u0Q4x3V1j5`.

      

ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 2.6.14, not stripped.

       好嘞,上面的两行表明:这是一个基于ARM 架构的32位的ELF文件,并且是经过静态链接生成的可执行文件。静态链接在IoT僵尸网络程序中十分常见,这样可以避免目标设备上缺少相关的库函数导致无法运行。

关于not stripped,首先了解一下stripped。Stripped是将程序中的符号表的信息剔除掉,这样子编译出来的可执行文件体积比较小;not stripped则反之,但是就是因为其保留了这些信息,所以便于调试。

MD5: 125679536fd4dd82106482ea1b4c1726

SHA1: 6caf6a6cf1bc03a038e878431db54c2127bfc2c1

       ARM是32位的体系架构,所以其寄存器也是32位宽的。在ARM架构的处理器中,在函数调用中通常是把函数参数读入r0 – r3。由于只用4个寄存器,如果函数参数超过4个,超出的参数将放置于堆栈中。ARM一共有15 个寄存器,但是都有特定的用途:

       太好了,现在,你就是ARM 专家了,那么可以继续下面的内容了......

      该恶意软件main()函数的初始入口地址为0x13DEC,我们用rabin2 找其入口:rabin2 –s kfts | grep “type=FUNC name=main” ,得到如下输出:

vaddr=0x00013dec paddr=0x0000bdec ord=5366 fwd=NONE sz=688 bind=GLOBAL type=FUNC name=main

       好样的!可执行文件并未加壳。主函数执行后调用分支get_executable_name——通过readlink()函数读取/proc/self/exe 的文件符号链接。当在进程内部读取文件符号链接时,将返回可执行文件的运行位置地址。反汇编可以看到,我们创建std::string 类并将包含当前执行路径的char 数组复制到其中。这将稍后用于传递给持久化函数。


图01

       接下来,我们检查程序是否在运行中或将其添加到启动列表。在check_running 进程,调用ps –e ,等待2s;然后从命令行获得输出,进而检查当前可执行程序是否在其中。如果是,执行exit 这支程序,返回0 (通常存于r0)迅速结束进程。如果未包含在其中,就执行接下来的持久化这一步。因此,如果已经运行过了,那么,很明显,就已经退出了进程。


图02

       持久化是通过添加/etc/rc.local 和 /etc/init.d/boot.local 文件;当然,在写入这些文件之前,首先会检查这些文件是否已经存在。/etc/rc.local 将会在系统服务启动后执行指定的命令,只是其实现方法看起来有点像是外行生手所为:创建一系列shell 命令,调用system 函数执行这些命令。

       接下来,一条字符串被格式化并调用 sed 程序写入文件。之后,作为参数传递给system 函数,正如上面所述。在这些字符串格式化操作中,使用的 buffer 是大小为300字节的虚拟地址0x9F48 段。从技术上来说,由于输入未被过滤,我们可以操控恶意代码的地址段并利用字符串格式化漏洞。这样,我们就可以操控堆栈,覆盖地址等等。这是该僵尸网络唯一使用的持续化手段。


图03

      该程序的进程先fork自身,并调用setsid() 从父进程中脱离出来。所有从父进程中继承的文件描述符都将被关闭。下一步,创建一个线程——调用SendInfo 函数收集信息,例如系统CPU数目,网络连接速度,CPU 负载,本地网络适配器地址等等。

       这个例程接下来调用子例程 get_occupy 。我们可以看到,它是通过遍历所有的CPU 来计算负载。从中,我们可以看到 r3 被用作循环计数器,当第一个操作数小于第二个操作数时,执行blt 指令这个分支。在X86架构下,这等效于 jle 指令。


图04

       该恶意软件获取有关网络适配器信息是方法是读取/proc/net/dev 文件。它会从文件的开头处开始搜寻,并且对其进行语义分析,从而获得本地网络适配器的IP地址。

       令我们感到十分奇怪的是,该恶意程序竟然会产生一些毫无实际意义的数据。比如,它会生成一个随机值,并将其作为网速。在子fake_net_speed 例程中,srandom 从 time 函数取种。我们把‘0’传递给 time 函数 (通常,是一个time_t 的的指针作为参数传递给该函数 )来验证其流程。之后,把 time 函数的值 存入 r3 ,又将r3 的值重新存入 r0 作为 srandom 的参数,这看起来像是编译器有些莫名其妙的问题。


图05

       该调用产生的值作为 sprintf 声明而创建一个以 MB/s 为单位的当前网络连接速度的描述字符串。这显得相当奇怪,该恶意软件竟然产生一个虚假的网速信息……

       这些数值随后由该子例程发送给C2 ……

        在经过前面这些操作之后,我们最终来到最主要的核心部分——连接到C2 网络及接收控制命令的部分。ConnectServer(位置为0xCA1C)进程在函数的主体部分被调用,执行该函数后,来到返回套接字给C2服务器的ServerConnectCli(位置0xB5BC)分支,该套接字随后被赋值给全局变量 MainSocket 。既然这样,就来研究研究 ServerConnectCli ……

      ServerConnectCli 首先创建一个TCP协议的套接字,如果该操作不成功,则该汇编分支转到另一个位于0xB654的子程序,调用perror()函数来显示一个用户友好的错误信息。


图06

      用C语言描述,就是这样:

       其将要连接的端口被编写者部分混淆了,初始值被加载到r3 寄存器。紧跟其后的,是对该值左移 16(0x10)位(下面反汇编代码的 lsl 指令),接着向右移16 位。这可能是编译器添加的,通过下面的反汇编代码,可以清楚地看到该过程:


      

       该恶意软件将调用 setsocket ,第一次是传送 IP_DROP_SOURCE_MEMBERSHIP 标志;上述步骤完成后,其再次调用 connect 进行与C2 服务器连接的初始化。进而,混合调用select 和 getsockopt 套接字来确保非阻塞套接字已经成功连接。如若连接不成功,则关闭套接字并退出。

       一旦正常运行的套接字从 ServerConnectCli 返回,全局变量的值马上便被赋予该返回值。僵尸程序就会从感染的设备获取更多的数据。首先,它会从执行环境中抓取用户名,保存在 r11 中。假如调用 ‘uname’失败,那么就用‘Unknow’代替uname 字段。成功读取的话,就进入 0xCA8C 。


图07

       通过 GetCpuInfo 函数,感染主机的更多信息可以搜集到。我随后慢慢道来:虚拟文件/proc/cpuinfo 是开放读取权限的,所以可以大块大块地读取直到EOF(End of File),然后,调用fclose () 释放文件。CPU的数目以及时钟频率也同样可以这样获得。

       该程序还调用 sysinfo() 并且读取位于 r3 处的结构体。检查发现结构体变量的成员有交换分区的大小、RAM大小等些元素,这些都将格式化输出到字符串中。

       在控制流中,可以看到,如果通过 ‘MainSocket’发送消息失败,那么,将会进入另一分支并且关闭套接字。


图08

       对于那些不懂ARM 架构的, beq 指令是指当比较的结果为0,即相等时,则跳转到0xCBD4 。该支程序仅是简单地关闭套接字。接下来是 select ,如果调用成功,则读取来自C2 的数据;不过,在此之前,会先清空 buffer ,并获得最大 0x1380 的空间用来存放数据。同样的,如果该步骤失败,则进入另一分支,关闭套接字同时清空数据。

       到目前为止,我们可以看到,该恶意程序的创作者在网络编程方面经验丰富。作者熟悉Pascal 语言风格(例如: LikeThis)以及命名如GetCpuInfo ———可以推测作者过去或许从事Windows开发。

     这是本小节的结尾,我们将会在后面更加深入地分析其攻击手段和研究该bot 可执行的其他控制命令。

                                                                                                                                                                                    

原文:8a9K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4q4T1N6X3W2W2N6#2)9J5k6i4g2J5L8q4)9J5k6h3y4F1i4K6u0r3k6$3g2@1f1X3g2K6L8%4g2J5j5$3g2u0L8X3k6G2i4K6y4r3j5i4m8H3K9h3c8Q4x3@1b7$3x3W2)9J5y4X3q4E0M7q4)9K6b7Y4g2J5L8q4)9K6c8r3S2@1N6s2m8K6i4K6t1#2x3@1q4Q4x3U0f1J5c8W2)9J5y4e0u0r3L8r3I4G2P5h3c8D9j5h3u0K6i4K6u0W2k6$3W2@1K9s2g2T1i4K6u0W2K9h3!0Q4x3U0f1J5c8Y4m8G2M7%4c8Q4x3U0f1J5c8X3q4W2M7#2)9J5k6r3c8V1L8%4y4Q4x3X3c8S2L8X3q4D9P5i4y4A6M7#2)9J5k6s2m8S2M7Y4c8Q4x3X3b7I4i4K6t1#2x3V1k6Q4x3U0f1K6c8X3&6K6N6h3E0W2P5g2)9J5y4e0y4p5h3s2N6E0f1f1&6K9M7U0y4h3N6h3!0^5f1g2g2K9j5$3&6%4c8$3E0^5K9U0c8j5d9o6j5K6e0Y4u0u0g2K6N6^5g2r3j5$3N6Y4N6Y4k6p5g2s2h3i4y4b7c8V1S2X3c8r3q4r3y4Y4t1%4z5r3S2F1g2i4S2t1i4K6t1#2x3U0f1J5b7U0y4U0N6p5&6U0y4g2f1J5N6s2S2z5N6g2g2D9z5o6u0X3h3r3I4K9L8g2)9J5y4e0t1#2x3V1k6x3k6@1g2J5M7i4m8x3c8%4k6r3d9q4)9J5y4e0t1#2x3V1u0z5N6V1c8d9x3#2N6K6c8#2f1J5i4K6t1#2x3U0f1J5b7X3y4B7i4K6t1#2x3U0f1J5b7U0S2K6M7K6k6q4M7r3!0S2b7g2A6t1c8@1u0G2N6X3c8F1j5@1A6z5g2q4W2n7d9q4u0$3f1$3q4#2e0#2c8@1L8$3g2*7c8o6y4z5d9V1y4U0f1h3g2b7b7$3N6K9k6K6m8E0x3p5N6q4N6r3y4J5k6g2u0%4g2h3A6#2L8X3p5#2P5V1y4q4P5p5W2Y4P5g2q4h3c8Y4l9J5N6h3H3#2N6X3E0^5k6h3k6h3N6#2)9J5y4e0t1#2x3V1k6H3h3o6g2x3e0U0k6C8x3g2R3@1c8h3A6e0f1@1c8Y4f1g2)9J5y4e0t1#2x3@1c8Q4x3U0f1J5y4e0y4p5i4K6t1$3j5h3#2H3i4K6y4n7L8%4m8W2L8X3W2V1i4K6y4p5L8$3!0S2i4K6u0V1g2Y4g2x3b7W2c8J5M7$3S2S2z5e0W2g2f1q4y4s2N6g2N6I4N6V1^5@1j5$3c8c8i4K6t1$3j5h3#2H3i4K6y4n7N6X3g2J5M7$3W2G2L8W2)9K6c8o6p5H3x3o6l9H3i4K6t1$3j5h3#2H3i4K6y4n7k6r3!0$3K9h3g2%4i4K6y4p5x3b7`.`.

关于C2的一篇很不错的文章:6d0K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3k6J5k6h3g2T1N6h3k6Q4x3X3g2U0L8$3#2Q4x3V1k6S2M7Y4c8A6j5$3I4W2M7#2)9J5c8X3&6W2N6s2N6G2M7X3E0Q4x3V1j5I4x3e0b7I4x3U0u0Q4x3X3g2Z5N6r3#2D9

                                                                                                                                                                        译/    看雪翻译小组 StrokMitream


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回