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

从SQL注入到内网穿透:Skytower靶机实战中的渗透测试全链路解析

1. 项目概述:一次经典的内部网络渗透路径复现

最近在Vulnhub上重温了“Skytower”这台靶机,它可以说是一台非常经典的、用于训练Web渗透到内网横向移动的综合性靶场。很多朋友可能对Vulnhub上的“DC”系列靶机更熟悉,但Skytower同样设计精巧,它完整地模拟了一个从外部Web应用漏洞发现,到权限提升,再到利用内部服务进行横向移动的渗透测试流程。整个过程涉及了Web安全中老生常谈但永不过时的SQL注入、基础的密码破解、Linux权限维持技巧,以及一个非常实用的内网穿透技术——SSH本地端口转发(即常说的SSH代理或隧道)。对于想系统性地理解一次完整渗透链路的初学者,或者想巩固这些基础技能的老手,Skytower都是一个绝佳的练习对象。

这台靶机的核心价值在于,它没有使用任何“炫技”的零日漏洞,而是完全基于现实环境中依然广泛存在的安全问题来构建场景。你将会遇到一个存在SQL注入漏洞的登录页面,通过它获取初步的立足点;然后需要利用系统配置或弱凭证进行权限提升;最后,靶机内部运行着一个仅限本地访问的关键服务,你需要想办法将这个服务的端口“代理”出来,才能最终完成目标。这个过程几乎就是一次标准内部渗透测试的微缩模型。接下来,我将详细拆解整个实战过程,并重点分享在每个环节中容易踩坑的细节和可以优化的技巧。

2. 环境准备与信息收集

2.1 靶机环境搭建与网络配置

首先,你需要从Vulnhub官网下载Skytower的虚拟机镜像文件(通常是.ova或.vmdk格式)。使用VMware Workstation或VirtualBox导入即可。这里有一个关键点:为了模拟最真实的攻击环境,建议将靶机的网络适配器设置为“NAT模式”或“仅主机模式”,而将你的攻击机(通常是Kali Linux)设置为同一网段。我个人的习惯是使用“仅主机模式”,并在VirtualBox或VMware中创建一个专用的“Host-Only”网络,这样能确保攻击机和靶机处于一个封闭的、纯净的虚拟网络中,避免外部干扰。

启动靶机后,第一件事就是确定它的IP地址。由于靶机通常不会直接显示IP,我们需要进行网络扫描。在Kali上,最快速的方法是使用netdiscover进行主动ARP扫描:

sudo netdiscover -r 192.168.56.0/24

这里的网段192.168.56.0/24需要替换为你虚拟网络的实际网段。如果使用NAT模式,可能是192.168.xx.0/24。找到疑似靶机的IP后,用nmap进行更全面的端口扫描是必不可少的第二步。

注意:有些Vulnhub靶机在启动后需要等待一两分钟服务才完全就绪。如果扫描不到任何端口,别急着下结论,等一会儿再扫。另外,确保你的攻击机防火墙没有阻止扫描流量。

2.2 系统性端口与服务探测

信息收集是渗透测试的基石,做得越细,后续越顺利。针对发现的靶机IP(假设为192.168.56.105),我们执行一次全面的nmap扫描:

nmap -sS -sV -sC -O -p- 192.168.56.105 -oA skytower_full
  • -sS: SYN半开放扫描,速度快且相对隐蔽。
  • -sV: 探测服务版本。
  • -sC: 使用默认的Nmap脚本进行更深入的探测。
  • -O: 尝试识别操作系统。
  • -p-: 扫描所有65535个端口。
  • -oA: 将结果以所有格式(normal, grepable, XML)输出,方便后续查阅。

扫描结果通常会显示类似以下内容:

PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.9p1 (protocol 2.0) 80/tcp open http Apache httpd 2.4.41 ((Ubuntu)) 3306/tcp open mysql MySQL 5.5.5-10.3.22-MariaDB

我们看到开放了三个端口:22(SSH)、80(HTTP)、3306(MySQL)。这是一个非常典型的LAMP(Linux, Apache, MySQL, PHP)堆栈配置。HTTP(Web)服务往往是我们首要的突破口。

2.3 Web应用初步侦察与目录扫描

访问http://192.168.56.105,我们会看到一个简单的登录页面。在开始测试功能之前,先查看网页源代码,有时开发者会在注释里留下线索,比如测试账号、目录路径等。虽然Skytower这里没有,但这是一个必须养成的习惯。

接下来,使用工具对Web目录进行爆破,寻找隐藏的页面、后台或配置文件。我常用的是gobuster,它速度快,字典丰富:

gobuster dir -u http://192.168.56.105 -w /usr/share/wordlists/dirb/common.txt -x php,txt,html,bak
  • dir: 指定目录爆破模式。
  • -u: 目标URL。
  • -w: 指定字典文件。common.txt是一个不错的起点。
  • -x: 尝试这些后缀名。

扫描结果可能会发现/index.php(主页面)、/login.php(登录页,我们已经看到)、/logout.php(退出页)等。在Skytower中,核心的交互点就是登录功能,这通常也是SQL注入漏洞的高发区。

3. 漏洞利用:SQL注入攻破登录防线

3.1 手动注入测试与原理分析

面对登录框,我们首先尝试常见的万能密码,如admin' or '1'='1。在用户名或密码框输入这个字符串并提交,观察应用的反应。如果页面出现了不同的错误信息、跳转到了其他页面,或者直接登录成功,都强烈暗示存在SQL注入漏洞。

为了理解背后发生了什么,我们需要猜测后端代码。一个典型的、不安全的登录查询语句可能是这样的:

$sql = "SELECT * FROM users WHERE username = '" . $_POST['username'] . "' AND password = '" . md5($_POST['password']) . "'";

当我们输入admin' or '1'='1作为用户名时,拼接后的SQL语句变成了:

SELECT * FROM users WHERE username = 'admin' or '1'='1' AND password = '...'

由于'1'='1'这个条件永远为真(True),整个WHERE子句的结果也就为真,这可能导致查询返回了数据库中的第一条用户记录,从而绕过了身份验证。这就是经典的“永真条件”绕过。

在Skytower的实战中,你可能需要尝试在用户名或密码字段进行注入,有时还需要处理密码的MD5哈希。例如,输入用户名admin,密码' or 1=1;#。如果密码被MD5处理,我们的注入payload需要在哈希之后依然能破坏SQL结构,这比较难,所以优先在用户名字段尝试。

3.2 使用Sqlmap进行自动化验证与信息提取

手动测试确认存在注入点后,可以使用sqlmap这个强大的自动化工具来进一步利用,节省时间并降低出错率。假设登录表单的POST请求数据是username=test&password=test&submit=Login,我们可以这样使用sqlmap:

sqlmap -u "http://192.168.56.105/login.php" --data="username=test&password=test&submit=Login" --level=3 --risk=2 --batch
  • -u: 指定目标URL。
  • --data: 指定POST数据。
  • --level/--risk: 提高测试的强度和风险等级,以发现更隐蔽的注入点。
  • --batch: 以非交互模式运行,自动选择默认选项。

如果sqlmap确认存在注入,我们就可以开始提取数据了:

  1. 获取数据库名sqlmap ... --dbs
  2. 获取当前数据库的表sqlmap ... -D <数据库名> --tables
  3. 获取表结构(字段)sqlmap ... -D <数据库名> -T <表名> --columns
  4. 最终拖取数据sqlmap ... -D <数据库名> -T <表名> -C "username,password" --dump

在Skytower中,你很可能会找到一个包含usernamepassword字段的用户表。拖取出来的密码可能是明文,也可能是某种哈希(如MD5)。如果是MD5,可以尝试在线网站(如crackstation.net)或本地工具(如johnhashcat)进行破解。

实操心得sqlmap虽然强大,但噪音也大。在生产环境测试中务必谨慎,最好在授权范围内进行。在CTF或靶场中,可以结合--proxy=http://127.0.0.1:8080参数,将流量导向Burp Suite,方便观察其发送的payload,这对于学习SQL注入原理非常有帮助。

3.3 获取初始Shell与权限

通过SQL注入,我们获得了有效的用户名和密码(可能是john/hereisjohn这样的组合)。现在,我们可以尝试用这些凭证登录Web应用。登录成功后,页面可能会显示一些用户信息,但通常不会直接给我们命令行权限。

接下来,尝试用同样的凭证登录SSH服务:

ssh john@192.168.56.105

输入密码后,如果成功,我们就获得了一个低权限的交互式Shell(可能是www-data或一个普通用户)。这是我们的第一个立足点。执行idwhoami命令确认当前用户权限,执行pwdls -la查看当前目录和文件。

4. 权限提升:从普通用户到Root

4.1 系统信息枚举与敏感文件查找

在获取了低权限Shell后,下一步就是寻找提权路径。首先,系统性地收集信息:

# 查看系统内核和发行版信息 uname -a cat /etc/os-release # 查看当前用户权限(sudo) sudo -l # 这是一个关键命令!查看当前用户能以root身份无需密码运行哪些命令。 # 查看计划任务 crontab -l ls -la /etc/cron* # 查看具有SUID权限的可执行文件(重点) find / -perm -u=s -type f 2>/dev/null # 查看可写的敏感目录或文件 find / -writable -type d 2>/dev/null | grep -v proc | grep -v sys

在Skytower中,sudo -l的结果可能是突破口。它可能显示当前用户可以以root身份运行某个特定的命令,比如某个文本编辑器(vim,nano)或脚本。

4.2 利用配置不当实现提权

假设sudo -l显示如下:

User john may run the following commands on skytower: (root) NOPASSWD: /usr/bin/find

这意味着用户john可以以root身份,无需密码,运行find命令。这立刻打开了提权的大门。我们可以利用find命令的-exec参数来执行任意命令。一个经典的提权方法是:

sudo find /etc/passwd -exec /bin/sh \;

或者更交互式地:

sudo find . -exec /bin/bash \;

执行后,你会发现自己获得了一个root权限的bash shell。可以通过whoami再次确认。

为什么这样能成功?因为sudo配置允许john用户以root身份运行find程序。当find执行时,它继承的是root权限。-exec参数告诉find,对于找到的每个文件,执行后面指定的命令。因此,/bin/sh/bin/bash是以root身份启动的。

注意事项:这种利用方式高度依赖于具体的sudo配置。在实际环境中,需要仔细阅读sudo -l的输出,并思考哪些命令的参数可以用于执行代码。常见的危险命令还有vim(通过:!bash逃逸)、nano(通过^R^X执行命令)、more/less(通过!bash逃逸)、awkperlpython等。

5. 内网横向:SSH本地端口转发的艺术

5.1 发现内部服务与访问限制

提权到root后,我们几乎可以查看系统上的任何信息。此时,需要寻找靶机的“最终目标”。通常,Vulnhub靶机会在本地运行一个服务,监听在127.0.0.1localhost上,外部无法直接访问。使用netstatss命令查看:

netstat -tulpn # 或 ss -tulpn

输出中可能会看到类似这样的行:

tcp LISTEN 0 128 127.0.0.1:3306 0.0.0.0:*

这表明MySQL服务(端口3306)只绑定在本地回环地址(127.0.0.1)上。从攻击机直接连接192.168.56.105:3306是无法成功的,因为该服务拒绝了外部网络的连接。这就是所谓的“仅本地访问”服务。我们的目标很可能就是访问这个MySQL服务,并从中获取最终flag或关键信息。

5.2 SSH本地端口转发原理与实战

既然我们有了SSH登录凭证(john用户),并且该用户可能存在于靶机上,我们就可以利用SSH的端口转发功能,将靶机内部的端口“映射”到我们攻击机的本地端口上。这个过程称为“本地端口转发”。

命令格式如下:

ssh -L <本地端口>:<目标主机>:<目标端口> <跳板机用户>@<跳板机IP>

在Skytower场景中:

  • <本地端口>: 我们攻击机上任意一个未被占用的端口,例如8888
  • <目标主机>:<目标端口>: 从跳板机(靶机)的角度看,需要访问的服务地址和端口。因为服务在靶机本身上,所以是127.0.0.1:3306
  • <跳板机用户>@<跳板机IP>: 我们已攻陷的靶机SSH凭证,即john@192.168.56.105

因此,完整的命令是:

ssh -L 8888:127.0.0.1:3306 john@192.168.56.105

输入john用户的密码后,这条SSH连接会保持打开状态。它的神奇之处在于:所有发往你攻击机127.0.0.1:8888的流量,都会被通过这条加密的SSH隧道,转发到靶机192.168.56.105上,并由靶机上的SSH客户端代为发送到靶机本地的127.0.0.1:3306

5.3 连接转发端口与获取最终目标

现在,在你的攻击机(Kali)上打开另一个终端。你可以像访问本地服务一样,使用MySQL客户端连接这个被转发出来的端口:

mysql -h 127.0.0.1 -P 8888 -u root -p

这里-h指定主机为127.0.0.1-P指定端口为我们刚才映射的8888。执行后,你可能会被要求输入MySQL的root密码。在CTF靶场中,这个密码可能是空、root,或者可以通过之前提权后的root shell在靶机本地查到(例如查看/etc/mysql/my.cnf~/.my.cnf,或者尝试无密码登录)。

成功连接MySQL后,就可以查看数据库、表,寻找最终的flag了。常用命令:

SHOW DATABASES; USE <数据库名>; SHOW TABLES; SELECT * FROM <表名>;

通常flag会存放在某个表的某个字段中。

核心技巧:SSH本地端口转发(-L)是内网渗透中极其重要的技术。它不仅可以用于转发数据库端口,还可以转发Web服务(80/443)、远程桌面(3389)、文件共享(445)等任何TCP服务。前提是你需要有一台内网机器的SSH访问权限,并且该机器能访问到目标内部服务。

6. 问题排查与技巧实录

6.1 常见问题与解决方案

在整个渗透过程中,你可能会遇到以下问题:

  1. Nmap扫描不到靶机IP

    • 检查网络设置:确保攻击机和靶机在同一虚拟网络(如VMnet1 Host-Only)中。
    • 检查靶机状态:在虚拟机软件中确认靶机已正常启动。有些靶机启动较慢。
    • 使用ARP扫描sudo arp-scan -lnetdiscover有时更直接。
    • 查看DHCP租约:在VirtualBox的“管理”->“主机网络管理器”中,或VMware的虚拟网络编辑器中,查看分配的IP。
  2. Sqlmap测试不出注入点

    • 检查请求格式:确保--data参数中的POST数据格式正确,最好先用Burp Suite抓包确认。
    • 尝试不同参数:可能注入点不在username而在password,或者存在Token等防CSRF机制。使用-p参数指定测试字段。
    • 提高检测等级:尝试--level=5 --risk=3,但注意可能产生大量请求。
    • 手动验证:回归基础,用'\"')等测试单引号、双引号、括号闭合,观察错误回显。
  3. SSH登录被拒绝(Permission denied)

    • 凭证错误:确认用户名和密码完全正确,注意大小写。
    • SSH服务配置:靶机可能禁用了密码登录,只允许密钥认证。但Vulnhub靶机通常不会。可以检查/etc/ssh/sshd_config(需root权限)。
    • 尝试其他用户:用SQL注入获取的多个凭证逐一尝试。
  4. SSH端口转发命令执行后连接失败

    • 本地端口占用:换一个本地端口,如9999
    • 目标服务未运行:在靶机上用netstat -an | grep LISTEN | grep 3306确认MySQL服务是否真的在监听127.0.0.1:3306
    • 转发命令错误:仔细检查命令格式,特别是-L后面的部分,确保是本地端口:目标IP:目标端口。目标IP是从跳板机(靶机)可访问的地址。
    • 保持SSH会话:执行转发命令的终端窗口不能关闭,关闭则隧道断开。

6.2 高级技巧与拓展思路

  1. 使用SSH密钥免密登录:如果在提权后(root权限)可以查看/home/john/.ssh/authorized_keys,甚至可以自己添加一个公钥,实现免密码SSH登录,让后续的端口转发更稳定。
  2. 动态端口转发(SOCKS代理):如果内网有多个服务需要访问,可以建立SSH动态转发(-D参数),然后在浏览器或工具中配置SOCKS代理,更方便地浏览内网。
    ssh -D 1080 john@192.168.56.105
  3. 反向Shell与持久化:在获得初始立足点后,可以考虑上传一个反向Shell脚本,并利用crontab或systemd服务实现持久化访问,避免依赖不稳定的Web漏洞或SSH密码。
  4. 信息收集自动化:可以编写简单的脚本,在获取Shell后自动运行一系列信息收集命令(如LinEnum、linuxprivchecker.py),并将结果回传,提高效率。

Skytower靶机之旅到此就基本完成了。它像一条清晰的脉络,串联起了外部突破、权限提升和内网横向这几个关键阶段。每个技术点单独看都不复杂,但组合起来就是一个完整的攻击链。真正掌握这些基础,比追逐最新的漏洞更有价值,因为安全的核心原理和架构弱点,往往就藏在这些“古老”的技术之中。下次遇到类似的场景,你会更加游刃有余。

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

相关文章:

  • 瑞萨RH850/U2C评估板电源、时钟与调试接口配置实战指南
  • RA8T2电气特性实战:中断滤波、总线与SDRAM时序设计避坑指南
  • DaoCloud镜像加速:解决国内容器镜像下载难题的终极方案
  • 基于Playwright+Robot Framework+Jenkins的UI自动化测试流水线搭建实践
  • 终极指南:如何用IwrQk免费打造专属二次元视频体验
  • 如何快速掌握res-downloader:面向新手的视频资源下载解密完整指南
  • 终极指南:如何用Nucleus Co-Op免费解锁PC游戏分屏多人模式
  • CVE-2019-9670漏洞检测工具开发实战:从原理到工程实践
  • SSH暴力破解应急响应实战:从告警到加固的完整流程
  • 深度剖析Mesen:如何从零构建一个周期精确的NES模拟器
  • 从理论到实践:一份面向新时代技术人的“中特”核心考点深度解析
  • 从原理到实战:构建工业级端到端加密通信系统
  • 告别视频无法保存的烦恼:N_m3u8DL-RE如何让流媒体下载变得轻而易举
  • 瑞萨RA8D2低功耗模式实战:寄存器配置、唤醒机制与避坑指南
  • AntiDupl终极指南:3步快速清理电脑重复图片,轻松释放GB级空间
  • OAuth 2.0强制配置文件链接漏洞:原理、利用与安全加固实战
  • AI 智能组件生成:从设计令牌到可交互代码的自动化管线
  • 终极解决方案:3分钟搞定OFD转PDF,免费开源神器彻底解决格式难题
  • dupeGuru:跨平台重复文件检测工具的技术架构与应用实践
  • OpenSSL AES加密实战:从ECB到CFB128的模式选择与代码实现
  • WAF规则集旁通漏洞CVE-2026-21876深度剖析与防护指南
  • 从漏洞分析到深度防御:构建实战化网络安全工作流
  • 如何在浏览器中零成本创作专业电子书?EPubBuilder在线编辑器完全解析
  • RA8D2嵌入式开发实战:SPI/OSPI/I3C时序参数解析与系统级设计指南
  • 从RSA到ECC:高并发场景下加密算法性能优化实战
  • 从CTF实战到原理剖析:RSA共模攻击的数学之美与脚本实现
  • 告别调试困境:Delve版本与Go 1.20+兼容性实战指南
  • 跨平台获取macOS安装文件:gibMacOS终极指南与完整教程
  • 【2025最新算法应用】投影迭代优化(Projection-Iterative-Methods-based Optimizer)的多个无人机协同路径规划(可以自定义无人机数量及起始点)MATLAB代码
  • 终极指南:30分钟搞定Jellyfin豆瓣插件,打造完美中文影视库