从命令行获取敏感信息的工具

信息安全 密码 工具 取证
2021-08-24 10:23:37

在命令行上输入的信息(命令名和参数)必须被视为公开的(每个人都可以使用 ps 等命令访问它)。

是否有已知的工具可以自动收集此类信息?该工具会定期查看进程列表,解析命令行并收集用户名和密码等信息。

我愿意在我公司的系统上运行这种工具来识别不良做法,但我似乎找不到。

4个回答

在 Linux 系统上,所有这些信息都可以通过 proc 接口获得,因此很容易编写脚本。作为一个工作示例(来自 RHEL6 系统),让我们看一下 rsyslog 进程。

[user@node1 ~]$ ps aux | grep rsyslog
root      1105  0.0  0.0 248680  1460 ?        Sl   May29   0:42 /sbin/rsyslogd -i /var/run/syslogd.pid -c 4
user     26440  0.0  0.0 103236   824 pts/4    S+   11:38   0:00 grep rsyslog

对,所以 pid 是 1105,很简单。由于 proc 系统以/proc/<pid>让我们看看正在呈现什么数据的格式存储进程。

[user@node1 ~]$ ls -l /proc/1105
ls: cannot read symbolic link /proc/1105/cwd: Permission denied
ls: cannot read symbolic link /proc/1105/root: Permission denied
ls: cannot read symbolic link /proc/1105/exe: Permission denied
total 0
dr-xr-xr-x. 2 root root 0 Jun 15 11:39 attr
-rw-r--r--. 1 root root 0 Jun 15 11:39 autogroup
-r--------. 1 root root 0 Jun 15 11:39 auxv
-r--r--r--. 1 root root 0 Jun 15 11:39 cgroup
--w-------. 1 root root 0 Jun 15 11:39 clear_refs
-r--r--r--. 1 root root 0 Jun 15 11:35 cmdline
-rw-r--r--. 1 root root 0 Jun 15 11:39 coredump_filter
-r--r--r--. 1 root root 0 Jun 15 11:39 cpuset
lrwxrwxrwx. 1 root root 0 Jun 15 11:39 cwd
-r--------. 1 root root 0 Jun 15 11:39 environ
lrwxrwxrwx. 1 root root 0 Jun 15 11:39 exe
dr-x------. 2 root root 0 Jun 15 11:39 fd
dr-x------. 2 root root 0 Jun 15 11:39 fdinfo
-r--------. 1 root root 0 Jun 15 11:39 io
-rw-------. 1 root root 0 Jun 15 11:39 limits
-rw-r--r--. 1 root root 0 Jun 15 11:39 loginuid
-r--r--r--. 1 root root 0 Jun 15 11:39 maps
-rw-------. 1 root root 0 Jun 15 11:39 mem
-r--r--r--. 1 root root 0 Jun 15 11:39 mountinfo
-r--r--r--. 1 root root 0 Jun 15 11:39 mounts
-r--------. 1 root root 0 Jun 15 11:39 mountstats
dr-xr-xr-x. 6 root root 0 Jun 15 11:39 net
-r--r--r--. 1 root root 0 Jun 15 11:39 numa_maps
-rw-r--r--. 1 root root 0 Jun 15 11:39 oom_adj
-r--r--r--. 1 root root 0 Jun 15 11:39 oom_score
-rw-r--r--. 1 root root 0 Jun 15 11:39 oom_score_adj
-r--r--r--. 1 root root 0 Jun 15 11:39 pagemap
-r--r--r--. 1 root root 0 Jun 15 11:39 personality
lrwxrwxrwx. 1 root root 0 Jun 15 11:39 root
-rw-r--r--. 1 root root 0 Jun 15 11:39 sched
-r--r--r--. 1 root root 0 Jun 15 11:39 schedstat
-r--r--r--. 1 root root 0 Jun 15 11:39 sessionid
-r--r--r--. 1 root root 0 Jun 15 11:39 smaps
-r--r--r--. 1 root root 0 Jun 15 11:39 stack
-r--r--r--. 1 root root 0 Jun 15 11:35 stat
-r--r--r--. 1 root root 0 Jun 15 11:39 statm
-r--r--r--. 1 root root 0 Jun 15 11:35 status
-r--r--r--. 1 root root 0 Jun 15 11:39 syscall
dr-xr-xr-x. 6 root root 0 Jun 15 11:39 task
-r--r--r--. 1 root root 0 Jun 15 11:39 wchan

我以普通用户的身份运行它,因此某些信息不可用。没什么大不了的,因为我们真正想要的是有一个名为cmdline.

[user@node1 ~]$ cat /proc/1105/cmdline
/sbin/rsyslogd-i/var/run/syslogd.pid-c4[user@node1 ~]$

这些论点看起来像是一起运行的。实际上,它们是由空字符分隔的。通过将空字符转换为换行符,您将获得更友好的显示(但请注意,这将消除参数之间的分隔符和参数中的实际换行符之间的区别):

[user@node1 ~]$ tr '\0' '\n' </proc/1105/cmdline; echo
/sbin/rsyslogd
-i
/var/run/syslogd.pid
-c
4
[user@node1 ~]$

当然,除了从 ps 输出中得到的东西之外,这并没有真正给我们任何东西。但是,根据您的需要,它可能更容易编写脚本。例如,如果我们想只在 bash 中工作,您可以使用这个结构来迭代所有进程:

for p in /proc/[0-9]*/cmdline; do
  …
done

然后将其用作文件列表进行处理。

如果您转而使用 Perl,则存在一个名为Proc::ProcessTable的模块,它查询 proc 系统并公开与对象相同的信息。

话虽如此,如果您想在命令行上查找密码,您有时可能会感到失望。一些应用程序会以某种方式掩盖它,例如 MySQL:

[user@node2 ~]$ ps aux | grep mysql
user     7974  0.0  0.1 157116  2732 pts/0    S+   11:47   0:00 mysql -u root -px xxxxxxxxxx database
[user@node2 ~]$ cat /proc/7974/cmdline
mysql-uroot-pxxxxxxxxxxxdashboard[user@node2 ~]$

这是人类比机器做得更好的任务。我的意思是模式识别。您可以尝试编写一个不断调用 ps 的脚本(删除命令,然后使用 sort -u 整理出重复项),然后稍后查看输出。但是请注意,现在这会保留您已经确定为可能敏感的数据。确保其权限正常或以加密形式存储。定期审查,直到您对用户感到满意,然后放弃脚本以降低维护成本。

回到您假设的工具,除非密码已经知道,否则它将产生的误报数量将是惊人的。在这种情况下,由于您现在正在跨用户共享敏感信息,因此您增加了风险而不是降低了风险。

减少这些误报的一种方法是使脚本尽可能简单。例如,仅限制具有一致参数且需要在命令行中输入密码的常用命令。即使这样,shell 脚本也会变得如此复杂,你会得到一堆假阴性和阳性。你能做的最好的就是正则表达式,这将是一场噩梦。这意味着这种工具的价值会降低,尤其是考虑到维护成本时。我认为管理员可以利用他们的时间做一些更好的事情。

此外,这是一种反动的安全方法,而不是预防方法。也许您的系统上有一种方法可以防止用户看到其他用户的进程信息?这可能是极不可能的,但它可能是一个更好的问题。

另请注意,此信息也最终会进入用户的历史文件,本质上是持久化披​​露。检查这些文件的权限/所有权可能是一项有用的任务。可能包含密码或其他敏感信息的日志也是如此。此外,一些应用程序(如 mysql)可能会记录命令的历史记录。

一旦你知道你想要完成什么,自动化这样的过程真的是一项微不足道的任务。

假设您的系统是 linux 机器,可以轻松编写 bash/python/perl 脚本来执行命令并解析结果。此类脚本还可以比较日常输出之间的差异。这些脚本可以设置为通过使用 cron 作业定期执行。

结果的有用性取决于监控/解释结果的人。

对于使用批处理脚本(不太确定)的 Windows 框,大概也可以这样做。

哼,你知道我在想这个问题。我不太确定这将是多么微不足道的任务。您需要有关每个图像的信息,大概您还需要有关短期实例的信息。

因此,如果您想要所有这些信息,您可以谈论使用 Windows 过滤平台和类似 epoll for Posix 的东西,这样您就可以获得所有事件 I/O 通知。

然后,您需要一种方法来保存这些数据并将其传输到中央存储库,在那里它可以聚合这些数据以供使用。这将是大量数据,需要大量动力来进行实时分析。您可能必须依赖诸如 ETL 或 Map/Reduce 之类的流程/解决方案,然后才能理解它。您当然可以将其发送到系统日志服务器并手动查看,我相信这会很快让您不知所措。

假设您可以在机器上本地进行处理和过滤,并且只导出到系统日志/聚合服务器正匹配。

我不知道有什么工具可以专门执行此操作,也许如果您安装了 AV/HIPS 产品,可以让您编写自定义规则,您可能会接近。对于单个开发人员来说,从头开始定制的应用程序将是一个健康的项目,可能是一个有趣的项目。