update readme.md

This commit is contained in:
Set3r.Pan 2022-11-05 15:28:38 +08:00
parent cbb1899a26
commit 3c2ae88976
10 changed files with 104 additions and 0 deletions

BIN
assets/13_image/1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
assets/13_image/2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
assets/13_image/3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

BIN
assets/13_image/4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

BIN
assets/13_image/5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

BIN
assets/13_image/6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 965 KiB

BIN
assets/13_image/7.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

BIN
assets/13_image/8.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 KiB

BIN
assets/13_image/9.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

View File

@ -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。如果想隐藏这个用户所产生的进程我们只需监控进程的GIDeloma称其为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比较复杂所以需要时间去研究。