19.1 Linux系统安全误区
- 高性能的安全操作系统可以预防恶意代码?
- 具有各种保护机制的高级操作系统能够预防大多数低 级恶意代码,但不能预防所有恶意代码
- Linux程序大多由源代码编译而来,而不是直接使 用二进制程序,因此Linux可以防止恶意代码感染?
- 极少数人能够从源代码中发现恶意代码
- Linux具有很多不同的平台,不同版本的Linux系统有很大区别,因此Linux系统是安全的?
- Linux恶意代码大多数使用标准C语言进行跨平台编译
19.2 Linux系统恶意代码分类
- Shell恶意脚本
- 蠕虫(Worm)
- 僵尸网络(Botnet)
- Rootkit
- 与平台兼容的恶意代码
19.3 Linux文件感染方式
- ELF文件感染
- ELF :“Executable and Linking Format. “
- ELF起源于Unix,经改进应用于FreeBSD和 Linux等现有类Unix操作系统。
- ELF文件分三种类型:
- 目标文件(通常是.o文件);
- 可执行文件(我们的运行文件)
- 动态库(.so文件)
- ELF文件格式
- 感染类型
- 覆盖式感染
- 将病毒体直接拷贝到宿主文件中,完全覆盖宿 主文件,从而宿主文件被感染成单纯的病毒体
- 一般情况下宿主文件会遭到破坏,若要使得在 病毒执行后仍然交还控制权给宿主文件,则需要给宿主文件备份
- 常见思路:将原宿主文件复制到一个隐藏文件, 然后在病毒体执行完之后执行宿主文件,使得进程映像中添加的是原宿主文件的内容。
- 追加式感染
- 同覆盖式感染方式不同的是,将病毒体直接追 加到宿主文件中,或者将宿主追加到病毒体之
后,并不存在覆盖宿主文件的行为 - 宿主文件被感染成单纯的病毒体和原宿主文件 的合体,在病毒文件执行后交还控制权给宿主
- 同覆盖式感染方式不同的是,将病毒体直接追 加到宿主文件中,或者将宿主追加到病毒体之
- 覆盖式感染
- 感染过程:
- 找到可执行文件test后,修改病毒体,使病毒执行结束后能够提取宿主文件到一个新文件,然后执行这个新文件
- 合并病毒体到test,不覆盖宿主文件,但放在宿主文件内容之前文件。
- 执行过程:
- 病毒体先执行
- 病毒体执行完后,找到病毒体尾部,提取宿主文件到新文件
- 执行新文件
- 要求
- 与ELF格式相关的感染方法,需要根据ELF格式来改变ELF文件内容,从而使病毒代码和宿主代码共存并且病毒代码执行结束后能顺利交接控制权给宿主。
- 向ELF文件中插入寄生病毒代码要求宿主文件和病毒体都是完整的,因此插入的病毒 代码会造成段的使用大小增加。
- 根据进程结构
- 一个进程映像至少包含一个文本段和一个数据段,代码段具有可读可执行权限,不可写;数据段具有可读写权限,默认可执行
- 内存映像中的段并没有完全使用到所有内存,段的结尾很少刚好是一个页面的边界,因此段的结尾往往会有空隙
- 两个段之间也存在空隙,数据段经常紧接着文本段,代码段的开始通常处于一个页面的开始处,而数据段的起始地 址不一定在页面开始处
- 数据段:数据段存储经过初始化的全局和静态变量;BSS段存储未初始化或初始化为0的全局变量、 静态变量
- 代码段:存储可执行文件的指令;也有可能包含一些只读的常数变量,例如字 符串常量等
- 感染ELF文件可以利用segment间的填充区
- 代码段之后填充
- 数据段之后填充
- 代码段之前填充
- 使用函数对齐填充区
- 将分割后的病毒放入宿主文件多个函数填充区内,并在每一块后设置跳转指令,使其各部分相连接。修订入口点,使其指向病毒体入口点。
- 使用NOTE段
- NOTE段的p_type修改为PT_LOAD时,可达到加载到内存中并执行的效果
- LKM(可加载内核模块)感染
- LKM是Linux内核为了扩展其功能所使用的可加载内核模块(Loadable Kernel Module)
- LKM具有相对灵活的使用方式和强大的功能,可以被动态地加载,而不需要重新编译内核。基于此特性,LKM常被用作特殊设备的驱动程序(或文件系 统),如声卡的驱动程序等等。
- 恶意代码通过感染LKM可以实现隐藏文件和进程等。
- 修改LKM目标文件中.strtab和.symtab节中存储的 init函数地址为其他函数,就可以实现LKM感染
- 隐藏自身
- 为了让我们的模块在lsmod命令中的输出里消失掉,我们需要在/proc/modules链表内删除我们的模块:list_del_in it(&__this_module.list);
- /sys/mod ule是sysfs的一个目录层次, 包含当前加载模块的信息(kob jects). 通过kobject_del()函数删除我们当前模块的kobject 就可以起到在/sys/module中隐藏自身的作用。
- PLT(程序链接表)/GOT(全局偏移表)劫持感染
- 在ELF文件中,全局偏移表(Global Offset Table,GOT)能够把位置无关的地址定位到绝对地址,程序连接表 (Program Linker Table, PLT)也有类似的作用,它能够把位置无关的函数调用定向到绝对地址
- 对PLT实现重定向的方法具体可以描述如下:
- 将文本段修改为可写权限;
- 保存PLT入口点;
- 使用新的库调用地址替代原入口;
- 对新的库调用代码进行修改,实现新的库调用的功能, 保存原来的PLT入口,调用原来库调用
- 其他感染方式
- 编译替换可执行程序
- 通过暴力破解、漏洞攻击(如webshell,远程代码执行等漏洞)获得一定的系统权限。然后收集系统内核信息,编译对应版本的病毒,通过替换已有 进程或者使用伪装进程名等方式在系统中运行。
- 编译替换So文件
- 通过替换so源码中的一些常用函数,在里面添加恶意的功能,然后替换掉原来的so文件,使得恶意函数被执行。
- 编译替换可执行程序
19.4 Linux恶意代码实例
- 常见特征
- 体积小,功能相对单一
- 大部分样本都只干一件事,如发起DOS攻击、收集用户信息、某些软件漏洞的POC等,并不会像Windows下的病毒那样功能丰富、工具化,有很多执行选项
- 大多数恶意代码都会开放一个命令执行的接口,可能是生成一个shell,也可能是简单的执行system,popen等函数
- 一些Linux恶意代码会内置漏洞利用代码
- 主机信息收集
- DDOS攻击。恶意代码中具有DDOS功能的比例很高,因为linux用作服务的场景较多,网络性能,处理器性能,内存性能都比较好,并且有 些网络管理员并不经常查看系统,所以很适合作为僵尸机,发起DOS 攻击。
- 挖矿:linux用作服务的场景较多,处理器性能高,并且有些网络管理员并不经常查看系统,所以很适合作为挖矿资源。
- 在多个位置添加计划任务
- 替换系统文件实现自启动
- 体积小,功能相对单一
- Linux/Mirai
- 特点
- 包含UDP、TCP、DNS、SYN、GRE等多种DDOS攻击方式
- 通过端口号关闭使用telnet、SSH、HTTP服务的其他进程,并防止其重新启动
- 扫描局域网中具有弱口令以及开放23端口的其他设备
- 采用高级SYN扫,扫速度升30倍以上,提高了感染速度。
- 强制清除其他僵尸程序,干掉竞争对手,独占资源。比如清除QBOT、 Zollard、Remaiten Bot、anime Bot以及其他僵尸。
- 进程名随机化
- 内置有60余个用户名和密码
- 攻击对象
- 存在弱口令或者含有漏洞的Linux设备
- TR-064漏洞会导致攻击者不需要任何安全认证,而直接对CPE设备状态进行重新配置,并进行更多的恶意操作
- 感染过程
(1)首先通过Telnet登陆目标设备。
(2)登陆成功后,尝试运行命令/bin/busybox ps来确认是否可以执行busybox命令。
(3)远程执行/bin/busybox cat /proc/mounts;用于发现可读写的目录。
(4)如果发现可用于读写的文件目录,进入该目录并将/bin/echo拷贝到 该目录,文件更名为dvrHelpler,并开启所有用户的读写执行权限。
(5)接下来通过执行命令”/bin/busybox cat /bin/echo\r\n”来获取当前 设备架构信息。
(6)如果获取架构信息成功,样本试图通过echo、wget、tftp三种方式 对设备进行感染
(7)接下来通过Telnet远程执行下放的程序。 (8)最后远程删除bot程序。
- 特点