update readme.md
After Width: | Height: | Size: 28 KiB |
After Width: | Height: | Size: 49 KiB |
After Width: | Height: | Size: 109 KiB |
After Width: | Height: | Size: 166 KiB |
After Width: | Height: | Size: 78 KiB |
After Width: | Height: | Size: 965 KiB |
After Width: | Height: | Size: 116 KiB |
After Width: | Height: | Size: 347 KiB |
After Width: | Height: | Size: 185 KiB |
|
@ -0,0 +1,104 @@
|
|||
# eloma_rootkit学习之路
|
||||
```
|
||||
来源:内部技术沙龙
|
||||
作者:a-alpha
|
||||
收录时间:2022年11月5日
|
||||
注:仅供openKyin社区兴趣研究、学习交流,切勿用于非法用途。
|
||||
```
|
||||
------
|
||||
#### 介绍
|
||||
近几年由于恶意程序的特性,来隐藏所有文件、进程,因此在受感染的机器上执行实时取证可能不会发现任何问题。**“未知攻,焉知防”** 为此,编写一个名为eloma样本程序,以了解恶意程序攻击的具体原理。
|
||||
**功能特点**
|
||||
```
|
||||
· LD_PRELOAD rootkit
|
||||
· 动态配置编译(后门端口,用户名,等)
|
||||
· 基本ldd,maps隐藏
|
||||
· 使用和隐藏/etc/ld.so.preload
|
||||
· 使用magic GID 实现进程隐藏
|
||||
· 挂钩utmp 等函数,隐藏后门用户
|
||||
· PAM后门,使用ssh连接隐藏端口
|
||||
· 挂钩libcap的函数,逃避网络分析
|
||||
· 日志隐藏
|
||||
· 文件窃取
|
||||
```
|
||||
#### 实现思路
|
||||
eloma使用LD_PRELOAD特性来确保它在任何共享库之前加载,使得它可以覆盖应用中一些重要函数功能,进而具备高效的隐身能力,并提供各种恶意工具和后门。
|
||||
- LD_PRELOAD是动态链接器使用的环境变量,它指向共享库列表。一旦LD_PRELOAD不为空,动态链接器尝试加载环境变量中的库。加载的库将作用与用户进程,并且优先级很高,进程调用符号功能时将优先使用LD_PRELOAD制定库的符号。
|
||||
- 因为libc中封装了linux内核的大多数系统调用,如果能够劫持libc的功能,那系统将很容易受到恶意攻击。
|
||||
- LD_PRELOAD是适用于当前运行环境(比如当前终端环境),如果把库路径写到/etc/ld.so.preload中,那将影响范围将拓展到整个系统。
|
||||
- LD_PRELOAD主要用于程序调试。任何库符号都能被钩住,如libc中的符号。
|
||||
- eloma的库名字是一串随机的字符串,并复制到随机的目录,然后把库的全路径写如/etc/ld.so.preload中,完成安装。劫持libc中open类函数,达到隐藏自己的目的。
|
||||
|
||||
LD_PRELOAD劫持open函数的例子,如下图:
|
||||
- LD_PRELOAD替换前
|
||||
![](../assets/13_image/1.png)
|
||||
- LD_PRELOAD替换后
|
||||
![](../assets/13_image/2.png)
|
||||
#### 特性原理
|
||||
1. 用户隐藏
|
||||
eloma通过劫持utmp类符号功能来隐藏后门用户。再劫持PAM类符号功能完成用户验证。
|
||||
|
||||
2. 进程隐藏
|
||||
进程可以是由当前shell创建的,我们可以用一个随机的GID进行隐藏。比如一个用户的GID为1234,那么他的shell进程的GID也为1234。如果想隐藏这个用户所产生的进程,我们只需监控进程的GID(eloma称其为magic GID),然后将文件属性与magic GID相等的/proc/<pid>目录隐藏起来。
|
||||
magic GID的进程隐藏方法相比用特殊环境变量的方法更优,因为后者不适合一些特别的用户。
|
||||
|
||||
3. PAM后门
|
||||
后门允许ssh通过网络进行连接。劫持libc函数:getpwnam(), getpwnam_r(), getpwuid(), getspnam()和libpam函数:pam_open_session(), pam_authenticate(), pam_acct_mgmt(), pam_prompt(), pam_vprompt()。
|
||||
通过劫持libc函数,我们可以欺骗系统,使其认为系统中有一个用户(即后门用户),而不需要修改/etc/passwd、/etc/shadow等文件,这样也不会留下痕迹。当用ssh连接后门时,如果是后门用户登录,则eloma控制PAM直接放行。
|
||||
eloma劫持pam_vprompt()来记录其他用户登录的信息。
|
||||
|
||||
4. 隐藏ldd输出
|
||||
通过劫持execve()函数,检查LD_TRACE_LOADED_OBJECTS环境变量,如果设置了这个环境变量,说名该程序属于ldd类程序,这是eloma将输出的恶意库字符串跳过输出下一行,如此就能把自己隐藏起来。
|
||||
|
||||
5. 隐藏/proc/self/maps输出
|
||||
eloma可以/proc/self/maps、/proc/self/smaps、/proc/self/numa_maps相关于自己的映射信息,通过劫持open类函数,如果打开的是前面提到的路径,那么eloma将会对自身库的信息进行隐藏跳过。
|
||||
|
||||
6. 字符串隐藏
|
||||
通过将需要用到的字符串,写在config.py中,并进行加密,等到eloma需要用到字符串时解密即可。该隐藏功能主要应对反编译程序的分析。
|
||||
|
||||
7. 函数符号隐藏
|
||||
把除钩子函数外的eloma函数名写在config.py中,并让其使用随机字符串替换原函数名,再生成宏(如#define hidden_pid abcdefg :将hidden_pid函数名该为abcdefg),如此反编译的时候看到的符号都是这些随机字符。
|
||||
|
||||
8. 网络隐藏
|
||||
用于隐藏ICMP后门的流量信息,通过挂钩libpcap来掩藏预设置的端口范围,此功能还在开发测试中。
|
||||
#### 演示
|
||||
**1. 安装**
|
||||
eloma的安装需要在root权限进行,先用LD_PRELOAD提前加载eloma恶意库,再用shell执行./elomainstall(通过劫持execv()使其看起来像这有这个elomainstall程序一样)能完成安装。操作如下图:
|
||||
|
||||
![](../assets/13_image/3.png)
|
||||
|
||||
**2. 重启目标机器ssh服务,登录后门**
|
||||
为了让eloma后门安装到sshd后台程序,需要使sshd重新启动,并链接上eloma恶意库。sshd服务启动成功,就可以用后门用户登录了。如图:
|
||||
|
||||
![](../assets/13_image/4.png)
|
||||
|
||||
**3. ldd输出隐藏**
|
||||
如下图,后门用户可以看到eloma的链接库信息,但系统其他用户就会隐藏起来。
|
||||
|
||||
![](../assets/13_image/5.png)
|
||||
|
||||
**4. /proc/<pid>/maps等隐藏**
|
||||
eloma已经安装到系统,理论上每个在安装之后的进程都应该有eloma恶意库的信息,但下图展示的是信息已经隐藏了。
|
||||
|
||||
![](../assets/13_image/6.png)
|
||||
|
||||
**5. 函数符号隐藏**
|
||||
如下图可以看到IDA的左侧栏,函数名字都随机的字符。
|
||||
|
||||
![](../assets/13_image/7.png)
|
||||
|
||||
**6. 字符串隐藏**
|
||||
在IDA中显示的都是乱码,在代码头文件就能比较明了地看到加密的字符串,如下图:
|
||||
|
||||
![](../assets/13_image/8.png)
|
||||
|
||||
**7. eloma卸载**
|
||||
登录后门,运行./eloma uninstall 即可卸载eloma,如下图:
|
||||
|
||||
![](../assets/13_image/9.png)
|
||||
#### 未来规划
|
||||
1. 增强平台迁移能力和稳定性
|
||||
目前eloma只在ubuntu和kali系统进行测试,因为它涉及很多系统底层功能,所以系统的特性要考虑到,才能做到比较好地迁移,而且稳定性要很强才能保证宿主系统的正常运转。
|
||||
2. 使用eBPF逃避网络分析
|
||||
eBPF流量隐藏是目前rootkit比较先进的技术。eBPF能控制内核的网络过滤器实现流量监控、控制等功能,劫持它就能完成细粒度的网络隐藏目标。
|
||||
因为eBPF比较复杂,所以需要时间去研究。
|