Cuando obtenemos el .zip nos lo pasamos al entorno en el que vamos a empezar a hackear la maquina y haremos lo siguiente.
unzipdebugme.zip
Nos lo descomprimira y despues montamos la maquina de la siguiente forma.
bashauto_deploy.shdebugme.tar
Info:
## .
## ## ## ==
## ## ## ## ===
/""""""""""""""""\___/ ===
~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
\______ o __/
\ \ __/
\____\______/
___ ____ ____ _ _ ____ ____ _ ____ ___ ____
| \ | | | |_/ |___ |__/ | |__| |__] [__
|__/ |__| |___ | \_ |___ | \ |___ | | |__] ___]
Estamos desplegando la máquina vulnerable, espere un momento.
Máquina desplegada, su dirección IP es --> 172.17.0.2
Presiona Ctrl+C cuando termines con la máquina para eliminarla
Por lo que cuando terminemos de hackearla, le damos a Ctrl+C y nos eliminara la maquina para que no se queden archivos basura.
Escaneo de puertos
Info:
Si nos metemos en la pagina tanto en el 80 como en el 443 vamos a ver la misma pagina, por lo que nos meteremos en el normal (80):
Veremos un apartado en el que podremos subir una imagen con un tamaño personalizado, por lo que descargaremos una imagen y la subiremos, viendo algo asi:
Aparentemente no vemos nada, por lo que intentaremos fuzzear un poco por la web.
Gobuster
Info:
Por lo que vemos, podremos ver el info.php, si nos metemos dentro podremos ver varias extensiones instaladas, entre ellas una que llama mucho la atencion llamada imagick:
Buscamos si hubiera alguna vulnerabilidad respecto a esta herramienta, ya que esta herramienta es la que gestiona el tema de las imagenes en la pagina web.
Local File Inclusion Imagick
Vemos que hay un repositorio de github aprovechando un LFI de esta herramienta en versiones anteriores a la 7.1.0 y la version de esta herramienta es 3.4.3 por lo que podremos aprovechar esta vulnerabilidad.
Por lo que nos clonaremos el repositorio a nuestro kali de la siguiente forma:
Instalaremos lo necesario:
Probaremos primero a ver el archivo passwd, lo haremos de la siguiente forma:
Info:
Ahora lo que haremos con esta imagen generada como passwd.png sera subirlo a la pagina, una vez subido veremos algo asi:
Ahora nos descargaremos la imagen de la pagina y veremos el contenido de la imagen con la siguiente herramienta:
Info:
Y lo que nos interesa de toda esta informacion es el resultado del passwd que estara en hexadecimal:
Por lo que lo decodificaremos con el siguiente mini script que he creado:
decoderHexa.py
Ahora ese codigo entero hezadecimal lo guardaremos en un archivo .txt y se lo pasaremos como parametro al la herramienta:
Info:
Por lo que vemos ha funcionado todo correctamente, y podemos observar 2 usuarios con bash, por lo que intentaremos sacarle las credenciales alguno de los 2 usuarios con un ataque de fuerza bruta:
Escalate user lenam
Hydra
Antes del ataque de fuerza bruta crearemos un archivo con los 2 usuarios:
users.txt
Y ahora si, realizaremos el ataque:
Info:
Vemos que sacamos las credenciales del usuario lenam, por lo que nos conectaremos por ssh con dichas credenciales:
Metemos como contraseña loverboy y veremos que estamos dentro.
Escalate Privileges
Si hacemos sudo -l veremos lo siguiente:
Vemos que podemos ejecutar como root el binario kill, por lo que haremos lo siguiente.
Si enumeramos los puertos que hay activos en el momento, veremos lo siguiente:
Info:
Vemos que hay 2 puertos corriendo en local bastante interesantes:
Si hacemos un curl al puerto 8000 para ver que contiene, veremos lo siguiente:
Info:
Y si probamos en el otro puerto da un error, por lo que vemos esta corriendo una aplicacion node.js en el puerto 8000.
Lo que podemos hacer es matar el proceso con kill en el puerto 8000 para que asi se reinicie y nos muestre el puerto de depuracion del propio node.js cuando se reinicie, que ha esto se le llama hacer una señal SIGUSR1, por lo que cuando intentemos detener el proceso, tendra como consecuencia el reinicio del mismo exponiendo el puerto de depuracion que viene por defecto en el puerto 9229 el cual podremos aprovechar para injectar codigo malicioso ya que este depurador interactua con el node.js en tiempo real a nivel de ejecuccion.
Primero identificaremos el proceso padre de node de la siguiente forma:
Info:
Vemos que tiene como PID el numero 54 en mi caso, por lo que haremos lo siguiente:
Una vez realizado este paso, si volvemos a enumerar los puertos, veremos lo siguiente:
Info:
Vemos que el puerto 9229 esta abierto ahora, por lo que ahora podremos hacer lo siguiente.
Info:
Esto nos metera en una consola interactiva en el puerto de depuracion de node.
Por lo que nos crearemos una reverse shell como root de la siguiente forma, dentro del entorno de node, pondremos lo siguiente:
Antes de enviarlo nos pondremos a la escucha de la siguiente forma:
Una vez enviado, si nos vamos a donde teniamos la escucha veremos que hemos obtenido la shell como root:
Por lo que ya seremos root y habremos terminado la maquina.
import sys
import re
def validate_hex_data(hex_data):
"""
Valida y limpia la cadena hexadecimal.
:param hex_data: Cadena en formato hexadecimal.
:return: Cadena hexadecimal limpia o un error si no es válida.
"""
# Eliminar espacios y saltos de línea.
hex_data = re.sub(r'\s+', '', hex_data)
if not re.fullmatch(r'[0-9a-fA-F]*', hex_data):
raise ValueError("El archivo contiene caracteres no válidos para hexadecimal.")
return hex_data
def hex_to_text(hex_data):
"""
Convierte una cadena hexadecimal a texto plano.
:param hex_data: Cadena en formato hexadecimal.
:return: Cadena en texto plano.
"""
try:
# Decodifica el texto hexadecimal a bytes.
byte_data = bytes.fromhex(hex_data)
# Trata de convertir el contenido a texto usando 'utf-8' o 'latin-1'
try:
text = byte_data.decode('utf-8')
except UnicodeDecodeError:
# Si no puede decodificar en utf-8, intenta con latin-1 (que permite caracteres no válidos en utf-8)
text = byte_data.decode('latin-1', errors='ignore')
return text
except Exception as e:
raise ValueError(f"Error al convertir la cadena hexadecimal: {e}")
def main():
"""
Función principal que lee el archivo y traduce el contenido hexadecimal.
"""
if len(sys.argv) < 2:
print("Uso: python3 decoderHexa.py <archivo_hexadecimal>")
sys.exit(1)
file_path = sys.argv[1]
try:
with open(file_path, 'r') as file:
# Lee todo el contenido del archivo.
hex_data = file.read()
# Limpia y valida la cadena hexadecimal.
clean_data = validate_hex_data(hex_data)
# Convierte la cadena limpia a texto.
translated_text = hex_to_text(clean_data)
# Muestra el texto traducido.
print("Texto traducido:\n")
print(translated_text)
except FileNotFoundError:
print(f"Error: No se pudo encontrar el archivo '{file_path}'.")
except ValueError as ve:
print(f"Error de validación: {ve}")
except Exception as e:
print(f"Error inesperado: {e}")
if __name__ == "__main__":
main()
Hydra v9.5 (c) 2023 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2024-12-19 10:57:53
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[DATA] max 64 tasks per 1 server, overall 64 tasks, 28688798 login tries (l:2/p:14344399), ~448263 tries per task
[DATA] attacking ssh://172.17.0.2:22/
[STATUS] 459.00 tries/min, 459 tries in 00:01h, 28688369 to do in 1041:42h, 34 active
[22][ssh] host: 172.17.0.2 login: lenam password: loverboy
[STATUS] 4781531.00 tries/min, 14344593 tries in 00:03h, 14344249 to do in 00:03h, 20 active
^CThe session file ./hydra.restore was written. Type "hydra -R" to resume session.
ssh lenam@<IP>
Matching Defaults entries for lenam on 6f51fd7a405b:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User lenam may run the following commands on 6f51fd7a405b:
(ALL) /bin/kill
netstat -tuln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:8000 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
listening on [any] 7777 ...
connect to [192.168.5.186] from (UNKNOWN) [172.17.0.2] 48278
bash: cannot set terminal process group (59): Inappropriate ioctl for device
bash: no job control in this shell
root@7d21a33a23a9:/#