Folders and files
| Name | Name | Last commit date | ||
|---|---|---|---|---|
Repository files navigation
使用hook技术(kprobe、ftrace、 livepatch)实现进程、内核模块的隐藏。 测试环境是ubuntu 20.04 kernel v5.4。
本研究项目,仅用于研究和演示目的,禁止用于非法目的。 使用前,请认真阅读相关法律,如《中华人民共和国网络安全法》等相关法律,由使用不当引起的后果与本作者无关。
要求:
1. 隐藏多个进程
2. 根据程序的全路经或者进程的comm隐藏
3. bypass 通用检测工具
4. bypass 通用取证
隐藏的内容:
进程的隐藏:
1. /proc 目录下不显示隐藏进程pid目录及子目录 (已实现)
2. 进程的fork/execv等信息不通过 cn_proc 发送 (已实现)
3. 进程的fork/execv等信息不通过 audit 发送 (已实现)
4. 不能使用trace相关工具查看到该进程的相关信息(实现, puzzle kprobe, disable (e)bpf for detect rootkit)
5. kernel 版本大于5.0.1, 不能使用fanotify查看到相关信息
6. Check syscalls about other proccess.
内核模块的隐藏:
1. /proc/module 文件中不显示该内核模块 (已实现)
2. /proc/kallsyms 中不显示该内核模块中的符号 (已实现)
3. /sys/module 目录下不显示该内核模块 (已实现)
4. /sys/kernel/livepatch/ 目录下不显示该内核模块 (已实现)
5. 不能通过 /sys/kernel/tracing/enabled_functions 查看到相关信息 (已实现)
6. /proc/sys/kernel/tainted 文件不能显示该内核模块相关信息 (已实现)
7. 内核的日志信息中 不显示该内核模块信息 (已实现)
使用SM4算法增加加密壳,增加只执行一次的功能, 增加反分析功能:
1. 实现一个load壳,直接调用init_module系统调用加载ko模块, 不使用命令insmod或者modprobe。
2. 使用SM4对ko模块进行加密处理。
3. load的main函数执行前进行简单的反动态分析。
(1)禁止产生core文件。
(2)判断自己是否是被跟踪状态,如果是,则杀掉父进程,直接(安全)删除
(3) 判断父进程是否是bash/sudo/pid==1,否则杀掉父进程,直接(安全)删除。
(4)然后使用ptrace PTRACE_TRACEME, 反运行中调式。
4. 程序执行完成, 删除自己。
对抗使用内核模块检测该模块(可选):
禁止加载ko: 可设置modules_disabled为1, 通过参数force_modules_disabled=1设置
禁止关机/重启/kdump: 通过参数force_reboot_disabled=1设置
icmp隐通道使用例子:
icmp echo: ping命令携带不同的参数可以触发不同的行为。
1. ping -p 0001 触发机器重启
2. ping -p 0002 触发机器关机
3. ping -p 0004 创建文件 /tmp/xxx
4. ping -p 0005 删除文件 /tmp/xxx
5. ping 命令简单改造,指定要取得的文件名,即可实现传输文件。例如/etc/shadow
使用示例:
sudo ./load key ['hidden_base_exe=0 hidden_proc_name="hide_main,hide_send,hidden_comm,hidden_comm1" hidden_module_name="hidden_ko,hidden_ko2" force_modules_disabled=1']
TODO:
1. 应用/内核功能分离。内核模块仅仅起到辅助支撑作用,其目的是隐藏应用层程序的痕迹 、帮助应用层实现不易实现的功能。
2. 内核模块框架化,具体的功能可以根据需要加载。
3. puzzle 功能。就是迷惑检测工具,例如,让检测工具检测到特定的程序如nginx被入侵了,其实nginx并没有。
4. stolen time 功能。 经验丰富的取证人员,能根据消耗时间的轻微异常,发现入侵痕迹。偷其他正常程序的时间片,完成自己的功能。
5. 隐藏/proc/net/tcp(6) /proc/net/udp(6)中 和 NETLINK_SOCK_DIAG协议中网络连接的信息。
6. 从acct系统中隐藏进程相关信息。(已实现)
7. puzzle 使用火线的功能。
8. 根据内核模块名隐藏指定的(多个)模块。 (已实现)
9. 丰富内核/应用层隐通道的功能。
10. 双层加壳,增加静态分析难度。