导语:pspy是一个命令行工具,它可以在没有Root权限的情况下,监控Linux进程。黑客可以利用它来查看其他用户的计划任务工作(cron job)等,该工具也非常适合技术人员在CTF(Capture The Flag)中枚举Linux系统。
pspy是一个命令行工具,它可以在没有Root权限的情况下,监控Linux进程。黑客可以利用它来查看其他用户的计划任务工作(cron job)等,该工具也非常适合技术人员在CTF(Capture The Flag)中枚举Linux系统,同样该工具也会很好地向我们展示为什么在命令行上将密码作为参数传递是一个不好的选择。
该工具会收集来自procfs扫描的信息,放置在文件系统选定部分的Inotify观察器会触发这些扫描功能以捕获Linux进程信息。
· procfs :procfs是进程文件系统(file system) 的缩写,包含一个伪文件系统(启动时动态生成的文件系统),用于通过内核访问进程信息。
· notify :notify是一个Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify反应灵敏,用法非常简单,并且比cron任务的繁忙轮询高效得多。
基本介绍
将该工具放到要监控的Linux设备上,首先得到二进制文件。你可以通过运行make build-build-image来构建它们,从而构建make build中用于构建四个二进制文件的docker镜像:
· 32位大端模式,静态版本:pspy32;
· 64位大端模式,静态版本:pspy64
· 32位小型版本:pspy32s;
· 64位小型版本:pspy64s;
静态编译的文件应该适用于任何版本的Linux系统,但是非常大,大约有4MB左右。如果觉得太大,可以尝试使用libc和UPX压缩的较小版本,大约有1MB左右。
你可以运行“pspy –help”命令来了解各种标志及其含义,我在此简要地介绍一下:
· -p:启用打印命令stdout(默认启用);
· -f:启用将文件系统事件打印到stdout的命令(默认情况下禁用);
· -r:使用Inotify监控的目录列表,pspy将递归地监控所有子目录(默认情况下,为 watches /usr, /tmp, /etc, /home, /var, and /opt);
· -d:使用Inotify监控的目录列表,pspy只会查看这些目录,而不是子目录(默认为空)。
· -i:procfs扫描之间的间隔以毫秒为单位,无论Inotify事件如何,pspy会定期扫描新进程,以防万一没有收到任何事件。
· -c:以不同颜色打印事件,红色表示新进程,绿色表示新的Inotify事件。
对于大多数应用程序,默认设置应该都可以进行监控,由于许多工具将访问其中的库,所以在/usr中监控文件是最重要的。
监控计划任务工作(cron job)
要查看该工具的运行情况,只需复制repo并运行make example(需要Docker)。众所周知,将密码作为命令行参数传递是不安全的,这一点可以在本节的演示中清楚看到,该命令会启动一个Debian容器,在该容器中,一个由root运行的秘密cron job会每分钟更改一次用户密码。此时,pspy作为用户myuser在前台运行,并扫描进程。如下所示,就是输出的内容:
首先,pspy会打印所有当前正在运行的进程,每个进程都有PID,UID和命令行。当pspy检测到新进程时,它会在此日志中添加一行。在这个示例中,你可以找到一个具有PID 23的进程,它似乎对myuser的密码进行过修改。这是Python脚本被用于linux下以root角色调度crontab任务(/var/spool/cron/crontabs/root)的结果,该脚本执行这个shell命令(检查crontab和脚本)。请注意,myuser既不能看到crontab,也不能看到Python脚本,不过使用pspy仍然可以看到命令。
来自Hack The Box的CTF示例
Hack The Box是一个超棒的CTF平台,下面是来自Hack The Box的Shrek设备的一个例子。在此CTF挑战中,任务是利用隐藏的cron job来改变文件夹中所有文件的所有权,挑战就在于用Linux修改权限命令chmod用法,这需要大量猜测。不过有了pspy, cron job就很容易被找到和分析。
Pspy会列出在Linux系统上执行的所有进程,包括已完成的进程。例如,有forkstat( 通过fork创建的进程),它会接收内核关于进程相关事件(如fork和exec)的通知。
监控Linux进程的合适方法
一般情况下,要列出在Linux系统上执行的所有进程,其前提是要获得该设备的root权限。但这并不意味着,没有root权限就没有办法监控在Linux系统上运行的进程。因为只要进程正在运行,procfs中就会显示很多信息,唯一的问题是你要如何在它们运行的瞬间捕获进程信息。可以在无限循环中扫描/ proc目录中的新PID来达到这样的效果,但会占用大量CPU。
更隐蔽的方法是使用以下技巧,在诸如/usr中的库,/tmp中的临时文件,/var中的日志文件等文件中捕获进程信息。使用inotify API,无论用户何时创建、修改、删除、访问这些文件,你都可以获得进程信息。Linux不需要为这个API使用特权用户,因为许多无害的应用程序(比如显示最新文件浏览器的文本编辑器)都需要这个特权用户。因此,虽然非root用户无法直接监控进程,但是他们可以监控进程对文件系统的影响。
我们可以使用文件系统事件作为扫描/proc的触发器,进而能够以足够快的速度捕获进程,这就是pspy的过人之处。在我的测试中,pspy似乎能捕获每一次进程的信息。一般来说,流程运行的时间越长,捕获它们的机会就越大。