Writeup — Nexus Robotics
Todos los errores y salidas son reales, obtenidos ejecutando los scripts tal como los trae el ZIP, y después ya corregidos, contra el contenedor desplegado (servicio en localhost:9000).
Script 1 — diag1_objetivo.py — objetivo equivocado
Fallo original★
$ python3 exploits/diag1_objetivo.py
(se queda colgado; RHOST/RPORT no corresponden a este laboratorio)El script trae la IP y el puerto de ejemplo del autor original. Se cambian por los del laboratorio:
$ RHOST = "127.0.0.1"
RPORT = 9000
b'NEXUSDIAG 4.1 ready\r\n'
OK GO{el_objetivo_no_era_el_correcto}Flag: GO{el_objetivo_no_era_el_correcto}
Script 2 — diag2_terminador.py — terminador de línea
Fallo original★
$ python3 exploits/diag2_terminador.py
b'NEXUSDIAG 4.1 ready\r\n'
(sin respuesta; el programa se queda esperando)El protocolo exige que cada línea termine en \r\n, no solo en \n. Se corrige el terminador:
$ s.sendall(b"DIAG2\r\n")
b'NEXUSDIAG 4.1 ready\r\n'
OK GO{crlf_no_es_solo_un_salto_de_linea}Flag: GO{crlf_no_es_solo_un_salto_de_linea}
Script 3 — diag3_comando.py — el comando cambió de nombre
Fallo original★★
$ python3 exploits/diag3_comando.py
b'NEXUSDIAG 4.1 ready\r\n'
ERR comando renombrado en esta versionEl propio servicio lo dice: el comando STATUS de la documentación antigua ahora se llama HEALTH:
$ s.sendall(b"HEALTH\r\n")
b'NEXUSDIAG 4.1 ready\r\n'
OK GO{el_comando_cambio_de_nombre}Flag: GO{el_comando_cambio_de_nombre}
Script 4 — diag4_banner.py — falta un paso previo
Fallo original★★
$ python3 exploits/diag4_banner.py
ERR primero completa el saludo (HELLO)El servicio exige un pequeño saludo (HELLO) antes de aceptar el comando de diagnóstico. El exploit original iba directo al grano:
$ s.sendall(b"HELLO\r\n"); print(s.recv(1024))
s.sendall(b"DIAG4\r\n")
OK hola
OK GO{hay_que_leer_el_banner_primero}Flag: GO{hay_que_leer_el_banner_primero}
Script 5 — diag5_bytes.py — mezcla de bytes y texto
Fallo original★★
$ python3 exploits/diag5_bytes.py
TypeError: can't concat str to bytesversion_cliente es una cadena de texto; hay que convertirla a bytes antes de concatenar:
$ version_cliente = b"toolkit-1.0"
b'NEXUSDIAG 4.1 ready\r\n'
OK GO{bytes_y_texto_no_se_mezclan}Flag: GO{bytes_y_texto_no_se_mezclan}
Script 6 — diag6_python2.py — sintaxis de Python 2
Fallo original★
$ python3 exploits/diag6_python2.py
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?El script está escrito para Python 2. Se porta a Python 3: print(...) con paréntesis y range() en vez de xrange():
$ print("Banner recibido:", banner)
for intento in range(1):
Banner recibido: b'NEXUSDIAG 4.1 ready\r\n'
OK GO{print_ya_no_es_una_sentencia}Flag: GO{print_ya_no_es_una_sentencia}
Script 7 — diag7_connect.py — argumentos de connect()
Fallo original★
$ python3 exploits/diag7_connect.py
TypeError: socket.connect() takes exactly one argument (2 given)connect() espera una sola tupla (host, puerto), no dos argumentos sueltos:
$ s.connect((RHOST, RPORT))
b'NEXUSDIAG 4.1 ready\r\n'
OK GO{connect_espera_una_tupla}Flag: GO{connect_espera_una_tupla}
Script 8 — diag8_relleno.py — relleno con la longitud exacta
Fallo original★★
$ python3 exploits/diag8_relleno.py
b'NEXUSDIAG 4.1 ready\r\n'
ERR relleno de 63 bytes, se esperaban 64El propio servicio indica la longitud exacta que espera. El exploit traía 63 bytes de relleno (el valor usado en una demo con una versión distinta); se ajusta a 64:
$ relleno = b"A" * 64
b'NEXUSDIAG 4.1 ready\r\n'
OK GO{el_relleno_tenia_la_medida_justa}Flag: GO{el_relleno_tenia_la_medida_justa}
Resumen
| # | Fallo | Corrección |
|---|---|---|
| 1 | Objetivo de ejemplo sin cambiar | Actualizar RHOST/RPORT |
| 2 | Terminador de línea incompleto | Usar \r\n |
| 3 | Nombre de comando obsoleto | Usar el nombre actual (HEALTH) |
| 4 | Falta un paso de protocolo previo | Completar el saludo antes del comando |
| 5 | Mezcla de bytes y str | Convertir a bytes antes de concatenar |
| 6 | Sintaxis de Python 2 | Portar a Python 3 |
| 7 | Argumentos de connect() | Pasar una tupla, no dos valores sueltos |
| 8 | Longitud de relleno incorrecta | Ajustar al valor exacto que exige el servicio |