En BountyHunter explotamos una vulnerabilidad XXE la cual permitio obtener credenciales para acceder a la maquina. Obtuvimos acceso root mediante el analisis y explotacion de un script en Python especificamente de la funcion eval().
Escaneo de puertos con nmap nos muestra multiples puertos abiertos: http (80, 5000), https (443), smb (139, 445), mysql (3306), winrm (5985).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Nmap 7.91 scan initiated Sat Jul 24 18:18:08 2021 as: nmap -Pn -sV -sC -p22,80 -oN scans 10.10.11.100Nmap scan report for 10.10.11.100 (10.10.11.100)Host is up (0.20s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)| ssh-hostkey:
|3072 d4:4c:f5:79:9a:79:a3:b0:f1:66:25:52:c9:53:1f:e1 (RSA)|256 a2:1e:67:61:8d:2f:7a:37:a7:ba:3b:51:08:e8:89:a6 (ECDSA)|_ 256 a5:75:16:d9:69:58:50:4a:14:11:7a:42:c1:b6:23:44 (ED25519)80/tcp open http Apache httpd 2.4.41 ((Ubuntu))|_http-server-header: Apache/2.4.41 (Ubuntu)|_http-title: Bounty Hunters
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Sat Jul 24 18:18:21 2021 -- 1 IP address (1 host up) scanned in 12.80 seconds
Web Site
Encontramos una pagina estatica donde se muestran distintas direcciones, aunque no muestra informacion relevante.
Development - User
La direccion del Portal nos muestra una nueva direccion donde se muestra un nuevo formulario.
1
2
3
4
5
6
7
π ~/htb/bountyhunter ❯ curl -s http://10.10.11.100/portal.php
<html>
<center>
Portal under development. Go <a href="log_submit.php">here</a> to test the bounty tracker.
</center>
</html>
π ~/htb/bountyhunter ❯
Al llenar el formulario se muestra el contenido enviado en la pagina.
Capturamos el trafico con Burpsuite y vemos que se envia los datos codificados en base64.
Codificamos en base64 y utilizando CyberChef codificamos en url nuestro payload.
Tras enviar la solicitud logramos obtener el codigo fuente, realizamos lo mismo con direcciones que ya conociamos pero no obtuvimos nada interesante, solo un nombre de usuario: development.
Obtuvimos el codigo fuente de este archivo y encontramos credenciales para una base de datos. nmap no mostró ningun puerto relacionado a una base de datos.
1
2
3
4
5
6
7
8
9
// db.php
<?php// TODO -> Implement login system with the database.
$dbserver="localhost";$dbname="bounty";$dbusername="admin";$dbpassword="m19RoAU0hP41A1sTsq6K";$testuser="test";?>
Shell
Utilizamos la contraseña y usuario encontrado, por SSH donde logramos obtener una shell.
π ~/htb/bountyhunter ❯ ssh development@10.10.11.100 # m19RoAU0hP41A1sTsq6KThe authenticity of host '10.10.11.100 (10.10.11.100)' can't be established.
ECDSA key fingerprint is SHA256:3IaCMSdNq0Q9iu+vTawqvIf84OO0+RYNnsDxDBZI04Y.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.11.100' (ECDSA) to the list of known hosts.
development@10.10.11.100's password:
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-80-generic x86_64) * Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Sat 24 Jul 2021 11:32:02 PM UTC
System load: 0.07
Usage of /: 25.5% of 6.83GB
Memory usage: 24%
Swap usage: 0%
Processes: 319 Users logged in: 0 IPv4 address for eth0: 10.10.11.100
IPv6 address for eth0: dead:beef::250:56ff:feb9:38d7
0 updates can be applied immediately.
Last login: Wed Jul 21 12:04:13 2021 from 10.10.14.8
development@bountyhunter:~$ ls
contract.txt user.txt
development@bountyhunter:~$ cat user.txt
cb9b6766f10dd2aed725167b2e051200
development@bountyhunter:~$
Privesc
Tras ejecutar sudo -l -l vemos que tenemos permisos sudo (root) para ejecutar un script de python, el archivo solo tiene permisos de lectura para el usuario actual.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
development@bountyhunter:~$ sudo -l -l
Matching Defaults entries for development on bountyhunter:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User development may run the following commands on bountyhunter:
Sudoers entry:
RunAsUsers: root
Options: !authenticate
Commands:
/usr/bin/python3.8 /opt/skytrain_inc/ticketValidator.py
development@bountyhunter:~$ ls -lah /opt/skytrain_inc/ticketValidator.py
-r-xr--r-- 1 root root 1.5K Jul 22 11:08 /opt/skytrain_inc/ticketValidator.py
development@bountyhunter:~$
El script realiza la lectura de archivos .md donde verifica que ciertos “strings” existan. Vemos tambien que realiza una evaluacion de una expresion lo que supondria una vulnerabilidad.
#Skytrain Inc Ticket Validation System 0.1#Do not distribute this file.defload_file(loc):ifloc.endswith(".md"):returnopen(loc,'r')else:print("Wrong file type.")exit()defevaluate(ticketFile):#Evaluates a ticket to check for ireggularities.code_line=Nonefori,xinenumerate(ticketFile.readlines()):ifi==0:ifnotx.startswith("# Skytrain Inc"):returnFalsecontinueifi==1:ifnotx.startswith("## Ticket to "):returnFalseprint(f"Destination: {' '.join(x.strip().split(' ')[3:])}")continueifx.startswith("__Ticket Code:__"):code_line=i+1continueifcode_lineandi==code_line:ifnotx.startswith("**"):returnFalseticketCode=x.replace("**","").split("+")[0]ifint(ticketCode)%7==4:validationNumber=eval(x.replace("**",""))ifvalidationNumber>100:returnTrueelse:returnFalsereturnFalsedefmain():fileName=input("Please enter the path to the ticket file.\n")ticket=load_file(fileName)#DEBUG print(ticket)result=evaluate(ticket)if(result):print("Valid ticket.")else:print("Invalid ticket.")ticket.closemain()
Antes de evaluar la expresion divide la linea por el signo + y toma el primer elemento de la lista, finalmente verifica si el valor restante del elemento es igual a 4 para luego evaluar la linea eliminando el valor ** seguramente para no afectar la evaluacion.
Creamos el archivo .md donde colocamos una pequeña expresion para verificar que este valor sea sumando, modificando el script localmente para verificar los valores.
1
2
3
4
# Skytrain Inc## Ticket to sckull.blog__Ticket Code:__
** 11+1
La modificacion solo es un print para algunas variables.