0x01 简介
各类的elfloader一般都是内存解析或读取elf文件而后执行。其中有简单的例如之前讲到的Linux无文件攻击姿势,但是缺点也很明显例如proc特征、无法保护load的文件。今天分析一个另一种类型的eldloader,简要分析一下是如何实现的。项目为trustedsec出品(https://github.com/trustedsec/ELFLoader)。
0x02 Loader技术细节
查看项目结构。
主要功能实现逻辑都在ELFLoader.c中,为了能跨平台运行可以看到做了一些适配性工作,将大部分类如输出打印、字符处理等函数都放入了beacon_compatibility.c文件中。
值得一提的是或许为了opsec考虑,它将传参通过编码后传给elfloader。编码方式位于beacon_generate.py脚本中,操作为对字符串先进行二进制格式打包后进行hex编码。
参数传入elfloader后,main函数中读取elf文件,并由unhexlify()函数decode传入参数,完成后将elf文件及参数传入ELFRunner()进行解析elf文件。
进入函数后首先定义了一个结构体如上,也是这个函数将要完成的主要功能,即解析elf后将对应节区存入对应结构体。
而后判断传入的文件格式是否为elf格式,是否为可重定位文件及系统位数。之后即为两个for函数遍历节头表完成elf文件解析。
如上,在遍历过程中通过识别节区是否是存放符号表的节区,而后进入循环寻找指定函数入口点,寻找方法是对比符号名,找到后将地址赋给指针函数PTR。
最后,通过指针直接调用。
0x03 bof插件细节
如上格式,其他的bof文件也相同,均以go函数作为入口,为了方便调试可以看到下面还有条件编译预留的main入口。这里也可以不使用go作为入口,修改下源码也可以指定其他函数进行指针调用。
0x04 集成方式
朋友提交了issue,工具很快就支持共享库(.so)了,可方便的集成到自己的工具或马中。
0x05 最后
从功能角度看,该工具完成了bof思路在linux下的简单实现,可有效绕过hids的execve监控,实现常见命令bof化。
但该方式在linux平台来说还不是很优雅,从使用角度看如果将这个loader改为远程加载,流量方面又没有了优势,因为bof化本身大家都不想让文件落地而是在内存中执行,那么每次执行命令都不落地远程加载的话流量会太明显。
如果从execve监控绕过方面看,有其他方式更为简便如busybox shell或其他类型的elfloader来实现。
最后,实现一个好用的linux马越来越重要,入口点的shell如果因为hids不小心掉了,还是很伤心的,博取各种思路所长或改造或重写是更加好的选择。