![进程如何在 ps 输出中显示为不同的名称?](https://linux22.com/image/59357/%E8%BF%9B%E7%A8%8B%E5%A6%82%E4%BD%95%E5%9C%A8%20ps%20%E8%BE%93%E5%87%BA%E4%B8%AD%E6%98%BE%E7%A4%BA%E4%B8%BA%E4%B8%8D%E5%90%8C%E7%9A%84%E5%90%8D%E7%A7%B0%EF%BC%9F.png)
最近我不得不清理一个被黑的服务器。恶意进程会在“ps aux”输出中显示为“who”或“ifconfig eth0”或类似的内容,即使可执行文件只是一堆字母,显示在 /proc/[pid]/status 中。
我很好奇这个过程是如何成功地掩盖自己的。
答案1
答案2
有两种 Linux 标准方法可以做到这一点,其中一种来自 glibc,并且可以移植到其他非 Linux 系统:
- glibc
pthread_setname_np()
可能是更好的方法 - Linux
prctl()
也有效
更改过去可能argv[0]
有效,但至少在我当前的 Linux 系统上,它对ps
.
有关更多详细信息和代码示例,请参阅此答案:https://stackoverflow.com/a/55584492/737303
答案3
操作进程列表中的名称是一种常见的做法。例如,我在我的过程中列出了以下内容:
root 9847 0.0 0.0 42216 1560 ? Ss Aug13 8:27 /usr/sbin/dovecot -c /etc/dovecot/d
root 20186 0.0 0.0 78880 2672 ? S Aug13 2:44 \_ dovecot-auth
dovecot 13371 0.0 0.0 39440 2208 ? S Oct09 0:00 \_ pop3-login
dovecot 9698 0.0 0.0 39452 2640 ? S Nov07 0:00 \_ imap-login
ericb 9026 0.0 0.0 48196 7496 ? S Nov11 0:00 \_ imap [ericb 192.168.170.186]
Dovecot 使用这种机制可以轻松显示每个进程正在做什么。
它基本上就像argv[0]
在 C 中操作参数一样简单argv
。参数是指向启动进程的参数的指针数组。所以一个命令ls -l /some/directory
将有:
argv[0] -> "ls"
argv[1] -> "-l"
argv[2] -> "/some/directory"
argv[3] -> null
通过分配一些内存,在该内存中放入一些文本,然后将该内存的地址放入argv[0]
显示的进程名称中,将被修改为新文本。
答案4
黑客/rootkit/漏洞利用程序通常会立即用修改输出以隐藏其被黑客攻击的脚本的黑客版本替换各种系统工具,例如 /bin/bash、/bin/ps、/bin/ls 等。可执行文件,但其他行为相同。
因此,我建议在任何物理服务器中使用物理 CD,您可以参考已知良好的基本实用程序的副本。这样,如果您怀疑遭到破坏,您可以参考这些工具的只读版本并且已知是安全的。