进程如何在 ps 输出中显示为不同的名称?

进程如何在 ps 输出中显示为不同的名称?

最近我不得不清理一个被黑的服务器。恶意进程会在“ps aux”输出中显示为“who”或“ifconfig eth0”或类似的内容,即使可执行文件只是一堆字母,显示在 /proc/[pid]/status 中。

我很好奇这个过程是如何成功地掩盖自己的。

答案1

更改 argv[] 是不可移植的。在 Linux 上,您也不能简单地更改 argv[0] 以指向更长的字符串。您必须覆盖现有参数,并注意不要覆盖地址空间中后面的环境变量。

libbsd提供了一个实现设置进程标题(3)对于 Linux,这使得这变得更加容易。

答案2

有两种 Linux 标准方法可以做到这一点,其中一种来自 glibc,并且可以移植到其他非 Linux 系统:

更改过去可能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,您可以参考已知良好的基本实用程序的副本。这样,如果您怀疑遭到破坏,您可以参考这些工具的只读版本并且已知是安全的。

相关内容