我有一个关于 Linux 主机的非常基本的问题:
该users
命令是否保证指示主机上的所有用户,或者用户是否有办法隐藏他们当时在主机上处于活动状态的事实?
如果是后者,有谁知道用户可以使用哪些技术来隐藏用户命令输出结果中的用户?
其他人可以就这个问题提供的任何想法都会非常有帮助。
答案1
在系统上“能够执行系统命令并有权访问系统文件”而不出现在读取的/var/run/utmp
文件中是微不足道的users(1)
。
$ ssh testhost sh
例如,users
在 Centos 7 上没有任何迹象testhost
表明有人正在运行,sh
而它非常有能力执行系统命令和访问系统文件:
# users
root
# pstree | grep -3 'sh$'
|-sshd-+-sshd---sshd
| |-sshd---bash-+-grep
| | `-pstree
| `-sshd---sshd---sh
|-sssd-+-sssd_be
| `-sssd_nss
|-systemd-journal
另一种方法:在某个高端口上运行 shellsocat
或其他东西。另一种方法:运行一个接受命令、运行命令并返回结果的网络服务器。另一种方法:提前安排命令,at(1)
然后注销。
答案2
该users
实用程序是用 C 编写的非常小的程序 - 仅大约 150 行代码。既然它是一部分GNU 核心实用程序, 你可以下载users.c
实用程序并从文件中读取代码。
事实上,默认情况下,该users
实用程序只是utmp
和 的包装器wtmp
。有两种明显的基本方法可以隐藏用户已登录的事实。
第一种方法是更改users
实用程序的代码并替换二进制文件/usr/bin/users
。
第二种方法是擦除*nix 系统上可能存在的utmp
、wtmp
、lastlog
、utmpx
等日志文件中的痕迹。wtmpx
有一些日志擦除工具可用于这种方法,例如、cloak
等。zap
clear
仔细阅读3.4部分摘自《黑客入侵 UNIX》中的《闯入之后》。
当然,还有许多其他方法可以避免写入特定应用程序和用户的文件utmp
,wtmp
阅读这个例子为了ssh
。
login
可以在文件中配置一些附加的基本和常见日志记录选项:
/etc/login.defs
要从管理员和用户的角度更深入地了解users
实用程序解析其信息的位置,只需浏览以下文件:
utmpdump /var/run/utmp
utmpdump /var/log/wtmp
sudo utmpdump /var/log/btmp
与其他各种系统(可以通过删除文件来禁用 utmp 日志记录)不同,utmp 必须始终存在于 Linux 上。如果您想禁用 who(1),则不要使 utmp 世界可读。
文件格式与机器相关,因此建议仅在创建它的机器架构上进行处理。
因此,问题的答案是:“是否可以向users
实用程序隐藏用户已登录的事实?” - 是的,这是可能的。确定的方法取决于确定的情况 - 它取决于对 *nix 系统等的访问级别。