Como crear una VM Vulnerable
Idea
Lo primero que debemos tener claro es saber que queremos enseñar con nuestra maquina. Puede ser desde un programa que hagamos vulnerable con SQL Injection para que practiquen, hasta un exploit que hemos visto por Internet y queremos que la gente lo use.
Deberiamos tener claro lo siguiente:
- Que vulnerabilidad dara el acceso inicial a la maquina.(SQLi, RCE, LFI...)
- Cuantos usuarios tendra la maquina.
- Como se escalara horizontalmente entre usuarios (si hay mas de uno y es necesario).
- Como se escala a root.
Una vez tenemos todo eso claro, debemos ponerlo en practica, instalando el SO, configurando lo necesario para que el path pueda realizarse, y finalmente borrando
nuestro .bash_history o archivos del SO que hayamos podido modificar y deban ser eliminados.
Crear VM (Ejemplo)
Idea
Para este ejemplo haremos una maquina sencilla, el path es el siguiente:
Crearemos una app web en Golang que será vulnerable a LFI.
El atacante a traves del LFI podra ver el fichero /etc/passwd y encontrar usuarios del sistema.
Hara bruteforce a ssh al usuario que ha encontrado para obtener su password y una vez obtenida se logueara en el sistema y podra escalar a root usando sudo (watch).
- El acceso inicial lo obtendra al hacer bruteforce por ssh al usuario que ha podido ver a traves de LFI.
- Solo tendra 1 usuario (noob).
- Se escala a root con sudo.
Nota
En un CTF recomendamos que el bruteforce no tarde mas de 5 minutos.
Instalar SO
Para crear nuestra maquina de ejemplo usaremos Virtualbox y Debian13. Creamos nuestra nueva maquina en Virtualbox, seleccionamos que usaremos la .iso de Debian13 e iniciamos.
Es una instalacion tipica.
A la hora de instalar seleccionaremos "Install" en lugar de la instalacion grafica.

Seguiremos los pasos que nos indica como poner la password de root, crear un usuario (noob) etc...
Para crear el usuario noob hemos usado una password debil que aparece al inicio de rockyou.txt ya que queremos que la obtengan al hacer
bruteforce.
En un punto de la instalacion nos dejara elegir los paquetes, en este caso NO usaremos entorno grafico y seleccionaremos ssh.

nota se recomienda no usar entorno grafico.
Instalar dependencias
Una vez finalizada la instalacion del SO actualizamos el sistema.
root@hmvdocz:/home/noob# apt update && apt upgrade
Obj:1 http://deb.debian.org/debian trixie InRelease
Obj:2 http://deb.debian.org/debian trixie-updates InRelease
Obj:3 http://security.debian.org/debian-security trixie-security InRelease
Todos los paquetes están actualizados.
Summary:
Upgrading: 0, Installing: 0, Removing: 0, Not Upgrading: 0
Una vez actualizado, instalamos las dependencias que vayamos a necesitar para crear nuestras vulnerabilidades.
En este ejemplo necesitaremos sudo y golang.
Crear usuarios
Si teneis un solo usuario podeis crearlo durante la instalacion del SO. Si necesitais mas de uno, ahora es el momento de crearlos.
Preparar vulnerabilidades
En este ejemplo, para crear la vulnerabilidad LFI usaremos golang. Puede ser python, puede ser cualquier lenguaje pero es unicamente para preparar la vulnerabilidad, lo importante es que en este paso debes preparar todas las vulnerabilidades que tendra tu maquina.
LFI
Como usuario "noob" haremos los siguientes pasos:
1) Creamos el fichero /home/noob/lfi.go
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
func home(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "LFI\n\n en /read?file=.....")
}
func readFile(w http.ResponseWriter, r *http.Request) {
file := r.URL.Query().Get("file")
data, err := ioutil.ReadFile(file)
if err != nil {
fmt.Fprintf(w, "Error.")
return
}
fmt.Fprintf(w, "<pre>%s</pre>", data)
}
func main() {
http.HandleFunc("/", home)
http.HandleFunc("/read", readFile)
fmt.Println("Listening http://localhost:9090")
http.ListenAndServe(":9090", nil)
}
2) Lo compilamos
3) Configuramos crontab para que lo ejecute cada vez que se inicia la maquina
Con esto ya tendriamos la primera vulnerabilidad que nos permitiria a traves de LFI ver el fichero
/etc/passwd y ver que existe el usuario noob.
SUDO
Para la escalada a root, usaremos sudo, que permitira al usuario noob ejecutar el comando watch como root, con el cual podra escalar.
Para ello como root ejecutamos visudo y añadimos la linea:
Crear flags
Necesitaremos crear las flags user.txt y root.txt.
user.txt suele estar en algun directorio de usuario y se suele conseguir una vez se obtiene el acceso inicial al sistema.
root.txt suele estar en /root y se suele conseguir una vez se obtiene acceso total al sistema.
Para crear las flags como root ejecutamos los siguientes comandos:
# Crear flag de root.
echo "HMV{rootflag}" > /root/root.txt
chmod 700
# Crear flag de user.
echo "HMV{userflag}" > /home/noob/user.txt
chown noob:noob /home/noob/user.txt
chmod 770 /home/noob/user.txt
Customizar motd/IP
Para que al arrancar la maquina, la gente pueda ver un logo acompañado de la IP de la maquina
podemos modificar como root el fichero cat /etc/issue.
En el fichero añadimos nuestro logo y la parte de IP Address: \4 para que muestre la ip.
,,,,,,,,
,|||````||||
,,,,||||| ||,
,|||` |||,
||` ...., `|||
|| :::::::: |||,
|| :::::::' || ``|||,
||, :::::' `|||
`||, |||
`|||, || || ,||
`|| |||`
IP address: \4
Proteger Grub (Opcional)
Para proteger GRUB y que no puedan acceder a la maquina modificandolo, pondremos un password. Para ello ejecutamos como root:
Nos pedira un password, lo ponemos y nos dara un hash.
PBKDF2 hash of your password is grub.pbkdf2.sha512.10000....
Una vez tenemos el hash editamos el archivo /etc/grub.d/40_custom y al final añadimos:
Reemplazando grub.pbkdf2.sha512.10000.ABCDEF por el hash que hemos obtenido.
Una vez modificado actualizamos grub:
Limpieza
Se recomienda limpiar todos los "historicos" para que no puedan usarlos para obtener pistas (a no ser que sea parte del path que quieres).
Para eliminar el .bash_history de root y los usuarios ejecutamos como root:
Exportar
Una vez hemos realizado todos los pasos, exportamos la maquina a .OVA. Hacemos clic derecho sobre la maquina -> Exportar a OCI.

Seleccionamos donde guardarla y Siguiente. Una vez exportada tendriamos el fichero .OVA que seria nuestra maquina exportada.
Compartir
Una vez tengamos la maquina exportada, deberiamos probarla y hacer nuestro propio writeup para verificar que funciona segun lo planeado. Si esta todo bien, ya podriamos enviarla a la plataforma que mas nos guste :)