Categoría: Desarrollo Seguro

  • SonarQube: El Guardián de la Calidad del Código

    SonarQube: El Guardián de la Calidad del Código

    SonarQube es una plataforma de análisis estático de código diseñada para inspeccionar la calidad y seguridad del software de forma automática. Dicho sin humo ni marketing: SonarQube lee tu código como un detective obsesivo y te señala errores, malas prácticas, vulnerabilidades y “deuda técnica” (ese conjunto de decisiones rápidas que luego pasan factura).

    A través de reglas basadas en estándares de la industria, SonarQube evalúa aspectos como bugs potenciales, código duplicado, complejidad, cobertura de pruebas, vulnerabilidades de seguridad y mantenibilidad. El resultado no es solo una lista de fallos, sino una radiografía del estado real del proyecto, permitiendo mejorar el código de forma continua.

    En entornos profesionales se integra dentro del ciclo de desarrollo (CI/CD), analizando automáticamente cada cambio en el código para evitar que los problemas crezcan en silencio. La filosofía es simple pero poderosa: la calidad no se inspecciona al final, se construye desde el principio.

    En esta práctica utilizarás SonarQube para analizar un proyecto real, interpretar sus métricas y aplicar mejoras, entendiendo cómo la calidad del código impacta directamente en la seguridad, el rendimiento y la mantenibilidad del software. Porque el código funciona… hasta que deja de hacerlo, y ahí es donde empieza la ingeniería de verdad.

    Arquitectura del proyecto

    En la máquina Ubuntu tendrás:

    • SonarQube (contenedor): servidor web + motor de análisis.
    • PostgreSQL (contenedor): base de datos de SonarQube.
    • Contenedores de desarrollo: php-apache, tomcat, etc.
    • Código fuente en el HOST (carpeta del alumno/grupo) y montado en los contenedores de desarrollo.
    • Sonar Scanner (mejor en un contenedor aparte, o instalado en el host) que:
      • lee el código (desde el host o volumen compartido)
      • manda el análisis a SonarQube por HTTP.

    Patrón recomendado:

    • El código vive en /home/alumno/proyectos/proyectoX
    • Ese directorio se monta en:
      • el contenedor de desarrollo (para ejecutar)
      • el contenedor “scanner” (para analizar)

    FASE 1 — Montar SonarQube en Docker (Ubuntu)

    Dejar SonarQube funcionando en la misma máquina Ubuntu, dentro de contenedores Docker, con base de datos PostgreSQL y persistencia, accesible desde el navegador.

    Al terminar, podrás entrar a:

    • http://localhost:9000 (si estás en la misma máquina)
    • o http://IP_DE_LA_MAQUINA:9000 (si accedes desde otra)

    1) Comprobar requisitos previos

    1.1 Verifica que Docker funciona

    En la terminal:

    docker --version
    docker ps
    

    Si docker ps no da error, Docker está operativo.

    1.2 Verifica que tienes Docker Compose

    En Ubuntu moderno suele ser el plugin docker compose (con espacio):

    docker compose version
    

    Si te funciona, perfecto. Si no, lo instalaremos más adelante (pero normalmente ya viene si Docker está bien instalado).


    2) Preparar carpeta del proyecto

    Vamos a trabajar de forma ordenada en una carpeta específica para SonarQube.

    mkdir -p ~/proyectos/sonarqube-docker
    cd ~/proyectos/sonarqube-docker
    

    Dentro crearemos el docker-compose.yml.


    3) Ajuste del sistema: vm.max_map_count (IMPORTANTE)

    SonarQube usa Elasticsearch internamente y en Linux necesita este parámetro del kernel.

    3.1 Ver el valor actual

    sysctl vm.max_map_count
    

    Si te devuelve algo como 65530 o mas bajo, hay que subirlo.

    3.2 Subirlo temporalmente (hasta reinicio)

    sudo sysctl -w vm.max_map_count=262144
    

    3.3 Hacerlo permanente

    echo "vm.max_map_count=262144" | sudo tee /etc/sysctl.d/99-sonarqube.conf
    sudo sysctl --system
    

    ✅ Comprobación final:

    sysctl vm.max_map_count
    

    Debe quedar en 262144.


    4) Crear el archivo docker-compose.yml

    En la carpeta ~/proyectos/sonarqube-docker crea el archivo:

    nano docker-compose.yml
    

    Pega esto:

    services:
      db:
        image: postgres:15
        container_name: sonar-db
        environment:
          POSTGRES_USER: sonar
          POSTGRES_PASSWORD: sonar
          POSTGRES_DB: sonarqube
        volumes:
          - sonar_db_data:/var/lib/postgresql/data
        networks:
          - sonar-net
        restart: unless-stopped
    
      sonarqube:
        image: sonarqube:community
        container_name: sonarqube
        depends_on:
          - db
        ports:
          - "9000:9000"
        environment:
          SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonarqube
          SONAR_JDBC_USERNAME: sonar
          SONAR_JDBC_PASSWORD: sonar
        volumes:
          - sonar_data:/opt/sonarqube/data
          - sonar_extensions:/opt/sonarqube/extensions
          - sonar_logs:/opt/sonarqube/logs
        networks:
          - sonar-net
        restart: unless-stopped
    
    volumes:
      sonar_db_data:
      sonar_data:
      sonar_extensions:
      sonar_logs:
    
    networks:
      sonar-net:
        driver: bridge
    

    Guarda y sal:

    • CTRL + O, Enter
    • CTRL + X

    5) Arrancar SonarQube

    En la misma carpeta:

    docker compose up -d
    

    Comprueba que están levantados:

    docker ps
    

    Deberías ver:

    • sonar-db
    • sonarqube

    6) Ver logs y esperar a que esté listo

    SonarQube tarda un poco en arrancar (no es instantáneo).

    Para ver el estado:

    docker logs -f sonarqube
    

    Cuando veas un mensaje tipo “SonarQube is up” o que el sistema ya ha iniciado, ya puedes abrir el navegador.

    (Para salir de logs: CTRL + C)


    7) Acceso web y primer login

    Abre en el navegador:

    • http://localhost:9000

    Credenciales por defecto:

    • Usuario: admin
    • Contraseña: admin

    Al entrar, SonarQube te obligará a cambiar la contraseña. Pon una segura (y anótala).



    8) Problemas típicos (y solución rápida)

    “SonarQube no arranca / se reinicia”

    Mira logs:

    docker logs --tail 200 sonarqube
    

    Casi siempre es vm.max_map_count o falta de RAM.

    “No puedo entrar a localhost:9000”

    Verifica:

    • ¿está el contenedor levantado? docker ps
    • ¿otro servicio usa el puerto 9000? (raro, pero posible)

    FASE 2 — Proyectos de ejemplo + preparación para análisis


    1) Estructura de carpetas (base del universo)

    Cada grupo trabajará con esta estructura:

    mkdir -p ~/proyectos/grupo01/proyecto-php/src
    mkdir -p ~/proyectos/grupo01/proyecto-java/src
    cd ~/proyectos/grupo01
    

    La regla cósmica:

    El código vive en el HOST, y se monta en los contenedores.

    Esto permite:

    • Ejecutar código en contenedor
    • Analizar el mismo código con Sonar

    2) Proyecto PHP con Apache en contenedor

    Entramos:

    cd ~/proyectos/grupo01/proyecto-php
    

    2.1 Crear archivo PHP con “malos olores”

    nano src/index.php
    

    Pega esto:

    <?php
    
    function suma($a, $b){
        return $a + $b;
    }
    
    function suma2($a, $b){ // duplicación
        return $a + $b;
    }
    
    $x = 5;
    $y = 10;
    
    if($x == $y){
        echo "Son iguales";
    } else {
        echo "No son iguales";
    }
    
    echo "<br>Resultado: " . suma($x, $y);
    
    // Código muerto
    $z = 100;
    
    ?>
    

    Guarda y sal.

    Este archivo tiene:

    • Duplicación
    • Código muerto
    • Comparación débil
    • Poca mantenibilidad

    Perfecto para SonarQube.


    2.2 Crear docker-compose del proyecto PHP

    nano docker-compose.yml
    
    services:
      php-apache:
        image: php:8.2-apache
        container_name: php-grupo01
        ports:
          - "8081:80"
        volumes:
          - ./src:/var/www/html
        restart: unless-stopped
    

    Arrancar:

    docker compose up -d
    

    Abrir navegador:

    • http://localhost:8081

    Debe mostrar:

    No son iguales
    Resultado: 15

    Si funciona, el contenedor ejecuta el código que vive en el host. Exactamente lo que queremos.


    3) Crear configuración básica de Sonar para PHP

    En la raíz del proyecto PHP:

    nano sonar-project.properties
    
    sonar.projectKey=lab1-php
    sonar.projectName=Proyecto PHP Lab1
    sonar.projectVersion=1.0
    sonar.sources=src
    sonar.sourceEncoding=UTF-8
    

    Este archivo le dice al scanner:

    • qué proyecto es
    • dónde está el código
    • qué analizar

    (No ejecutamos aún.)


    4) (Opcional pero recomendado) Proyecto Java simple

    Entramos:

    cd ~/proyectos/grupo01/proyecto-java
    
    nano src/Main.java
    
    public class Main {
    
        public static int suma(int a, int b){
            return a + b;
        }
    
        public static int suma2(int a, int b){ // duplicación
            return a + b;
        }
    
        public static void main(String[] args){
            int x = 5;
            int y = 5;
    
            if(x == y){
                System.out.println("Iguales");
            }
    
            int z = 100; // código muerto
            System.out.println(suma(x, y));
        }
    }
    

    sonar-project.properties para Java

    nano sonar-project.properties
    
    sonar.projectKey=lab1-java
    sonar.projectName=Proyecto JAVA Lab1
    sonar.projectVersion=1.0
    sonar.sources=.
    sonar.sourceEncoding=UTF-8
    
    

    (No hace falta contenedor para analizar Java simple.)


    5) Concepto crítico que deben entender

    SonarQube no analiza contenedores.

    Analiza carpetas con código.

    Por eso:

    • El código está en el host
    • El contenedor solo ejecuta
    • El scanner leerá la carpeta del host

    Esto es exactamente cómo funciona en empresas reales.



    FASE 3 — Primer análisis real con Sonar Scanner


    1) Crear Token en SonarQube

    El scanner necesita autenticarse. No se usan usuario/contraseña, se usa token.

    Paso 1 — Entrar en SonarQube

    Abrir:

    http://localhost:9000 o http://ipservidor:9000

    Login con tu usuario.


    Paso 2 — Crear token

    Ir a:

    User → My Account → Security → Generate Token

    Nombre sugerido:

    scanner-grupo01

    Copiar el token (solo se muestra una vez).

    Guárdalo. Es la llave del reino.


    2) Ejecutar Sonar Scanner desde contenedor

    No instalamos nada en el host. Usamos un contenedor efímero. Limpio. Reproducible. Profesional.

    Nos situamos en el proyecto PHP:

    cd ~/proyectos/grupo01/proyecto-php
    

    Ahora ejecutamos:

    sudo docker run --rm --network host \
      -e SONAR_HOST_URL="http://127.0.0.1:9000" \
      -e SONAR_TOKEN="sqa_3a808da1a78a8cbefd19cc39638a829ccb69e4ed" \
      -v "$(pwd):/usr/src" \
      -w /usr/src \
      sonarsource/sonar-scanner-cli \
      -Dsonar.ws.timeout=120 \
      -Dsonar.scanner.ws.timeout=120
    

    3) Qué está pasando realmente El contenedor scanner:

    • Entra
    • Lee /usr/src (tu proyecto montado)
    • Lee sonar-project.properties
    • Analiza el código
    • Envía resultados a SonarQube
    • Muere (porque usamos --rm)

    Herramienta efímera. Análisis persistente.


    4) Ver el resultado del análisis

    Ir a:

    http://ip_del_server:9000

    Entrar en:

    Projects

    Debería aparecer:

    Proyecto PHP Grupo01

    Entrar y observar:

    • Bugs
    • Vulnerabilities
    • Code Smells
    • Maintainability Rating
    • Duplications

    Tu código imperfecto ahora tiene diagnóstico.


    5) Analizar también el proyecto Java

    Entramos:

    cd ~/proyectos/grupo01/proyecto-java
    

    Lanzamos scanner igual:

    sudo docker run --rm --network host \
      -e SONAR_HOST_URL="http://127.0.0.1:9000" \
      -e SONAR_TOKEN="sqa_3a808da1a78a8cbefd19cc39638a829ccb69e4ed" \
      -v "$(pwd):/usr/src" \
      -w /usr/src \
      sonarsource/sonar-scanner-cli \
      -Dsonar.ws.timeout=120 \
      -Dsonar.scanner.ws.timeout=120
    
    

    Ir a SonarQube → Projects → ver Proyecto Java Grupo01.


    6) Problemas típicos y cómo sobrevivir


    “Not authorized”

    Token mal puesto o copiado con espacios.

    Regenera token y prueba otra vez.


    “Project not found”

    Falta sonar-project.properties o está mal.

    Verifica que esté en la raíz del proyecto.


    “SonarQube is not ready”

    El servidor aún no terminó de arrancar.

    Espera 30–60s y repite.


    Importante

    • Sonar no ejecuta código → lo analiza estáticamente
    • Detecta:
      • Duplicación
      • Código muerto
      • Riesgos de seguridad
      • Mala mantenibilidad
    • El análisis queda guardado aunque el scanner desaparezca
    • Esto es exactamente lo que hacen empresas reales en CI/CD

    Magnífica jugada pedagógica. Aquí el alumno deja de jugar con ejemplos de juguete y entra en territorio real: código con historia, decisiones, cicatrices y pecado técnico acumulado. Eso es donde SonarQube brilla de verdad. Vamos a plantearlo como RETO FINAL — Análisis real de un proyecto propio listo para entregar a alumnos.


    🧪 RETO FINAL — Auditoría real con SonarQube

    Misión

    Vas a analizar con SonarQube un proyecto real desarrollado por ti, no un ejemplo:

    Puedes elegir UNO o Todos:

    • Tu CRUD Java/PHP del proyecto anterior
    • Un WordPress (tema propio, plugin o código modificado)
    • Cualquier proyecto mediano (mínimo ~20–30 archivos)

    Objetivo: tratar el proyecto como si fueras el equipo de calidad de una empresa real.


    Qué debes conseguir

    1. Analizar el proyecto completo con SonarQube
    2. Evaluar el estado real del código
    3. Detectar problemas técnicos reales
    4. Aplicar refactorización
    5. Mejorar el Quality Gate

    Fase 1 — Preparar el proyecto

    Regla clave

    SonarQube analiza código fuente, no contenedores ni binarios.

    Tu proyecto debe tener:

    • Carpeta raíz clara
    • Código fuente accesible
    • Sin vendor/, node_modules/, target/, etc. (opcional pero recomendado ignorarlos)

    Crear sonar-project.properties

    En la raíz del proyecto:

    Para PHP / WordPress

    sonar.projectKey=proyecto-real-php
    sonar.projectName=Proyecto Real PHP
    sonar.sources=.
    sonar.sourceEncoding=UTF-8
    

    Para Java

    sonar.projectKey=proyecto-real-java
    sonar.projectName=Proyecto Real Java
    sonar.sources=src
    sonar.sourceEncoding=UTF-8
    

    Fase 2 — Ejecutar análisis

    Desde la raíz del proyecto:

    sudo docker run --rm --network host \
      -e SONAR_HOST_URL="http://127.0.0.1:9000" \
      -e SONAR_TOKEN="TU_TOKEN" \
      -v "$(pwd):/usr/src" \
      -w /usr/src \
      sonarsource/sonar-scanner-cli \
      -Dsonar.ws.timeout=120
    

    Ir a SonarQube → Projects → entrar al proyecto.


    Fase 3 — Diagnóstico técnico

    Debes analizar:

    1. Bugs

    Errores potenciales de ejecución.

    2. Vulnerabilities

    Riesgos de seguridad (inyección, validación, etc.)

    3. Code Smells

    Problemas de diseño/mantenibilidad.

    4. Duplicación

    Código repetido.

    5. Complejidad

    Métodos demasiado complejos.


    Fase 4 — Informe técnico (parte importante del reto)

    Debes escribir un informe con:

    Estado inicial

    • Quality Gate: PASS / FAIL
    • Nº Bugs
    • Nº Vulnerabilities
    • Nº Code Smells
    • Maintainability Rating

    Análisis crítico

    Selecciona mínimo 5 problemas reales y explica:

    • Qué problema detectó SonarQube
    • Por qué es un problema técnico real
    • Qué riesgo tiene (mantenibilidad, seguridad, errores)
    • Cómo lo solucionaste

    Refactorización aplicada

    Ejemplos:

    • Eliminación de duplicación
    • Validación de entrada
    • Mejora de legibilidad
    • División de funciones largas
    • Tipado fuerte
    • Eliminación de código muerto

    Estado final

    • Nuevo Quality Gate
    • Cambios en métricas
    • Mejora del rating

    Bonus

    • Integrar análisis en GitHub Actions / GitLab CI
    • Hacer que el merge falle si el gate está en rojo
    • Añadir tests → mejorar coverage
    • Analizar plugin o tema WordPress completo
    • Comparar análisis antes/después


    Cambiar SonarQube a español

    Método 1 — Cambiar idioma del usuario (lo primero que debes probar)

    1. Entra en SonarQube → http://localhost:9000
    2. Arriba a la derecha → My Account
    3. Preferences
    4. Language → Spanish (Español)
    5. Guardar

    Si tu versión tiene traducción cargada, la interfaz cambia inmediatamente (menús, labels, etc.).


    Si NO aparece Español en la lista

    Entonces tu SonarQube no tiene el paquete de idioma instalado (pasa en algunas builds).

    Método 2 — Instalar plugin de idioma (si disponible)

    1. Administration → Marketplace
    2. Buscar: Spanish o Localization
    3. Si aparece plugin de idioma → Install
    4. Reiniciar SonarQube

    ⚠️ En versiones recientes de SonarQube Community, el marketplace ya no siempre incluye todos los idiomas, y parte de la interfaz puede quedarse en inglés aunque cambies idioma. No es fallo, es así por diseño.


    Realidad técnica

    • El análisis, reglas, métricas → no dependen del idioma
    • Muchos equipos trabajan SonarQube en inglés (terminología estándar industria)
    • Aunque pongas español, algunas secciones seguirán en inglés
    • Los nombres clave no se traducen:
      • Quality Gate
      • Code Smell
      • Vulnerability
      • Maintainability

    Esto es normal.


  • Caso Práctico DS1: Análisis de Tráfico Web y Login con Wireshark (2)

    Caso Práctico DS1: Análisis de Tráfico Web y Login con Wireshark (2)

    Aprender a capturar y analizar tráfico de red con Wireshark, identificar credenciales transmitidas en claro, interpretar paquetes HTTP y localizar patrones que un pentester o analista usaría para detectar:

    • Credenciales expuestas
    • Cookies de sesión
    • Estructura de peticiones al servidor
    • Intentos de ataque (básico)
    • Fingerprinting indirecto del hosting

    1. Preparación del entorno

    1.1. Material necesario

    • Wireshark instalado
    • Navegador web
    • La URL de vuestra aplicación PHP en el hosting

    1.2. Configuración previa

    1. Abrir Wireshark
    2. Elegir la interfaz correcta:
      • En WiFi: suele ser wlan0 o similar
      • En cable: eth0
    3. Aplicad un filtro pre-captura opcional para no saturar: tcp port 80 or tcp port 443

    2. Captura del tráfico (la parte divertida)

    2.1. Comenzar la captura

    1. En Wireshark → seleccionad interfaz → botón azul Start capture.
    2. Dejad Wireshark escuchando en segundo plano.

    2.2. Generar tráfico real

    En vuestra aplicación PHP:

    1. Entrad en la página del login.
    2. Haced:
      • 1 intento fallido
      • 1 intento correcto
    3. Navegad un poco por el CRUD (listar, ver, editar).

    Esto genera tráfico muy fácil de reconocer.


    3. Filtrado y análisis del tráfico HTTP

    3.1. Filtrar solo HTTP

    En la barra de filtros de Wireshark:

    http
    

    Observad cómo aparecen las peticiones:

    • GET /login.php HTTP/1.1
    • POST /login.php HTTP/1.1
    • Peticiones a JS, CSS, etc.

    Entrega:

    • Captura del primer filtro HTTP mostrando al menos 8–10 paquetes.

    4. Análisis de un login (¡a por credenciales!)

    Vamos a buscar el POST del login.

    4.1. Filtro preciso del POST

    http.request.method == "POST"
    

    Seleccionad el paquete que corresponda a vuestro login.

    4.2. Abrir el contenido del POST

    En el panel inferior → Hypertext Transfer ProtocolForm-urlencoded.

    Deberíais ver algo como:

    username=juan
    password=1234
    

    (¡si la web no usa HTTPS y el hosting no lo fuerza!)

    4.3. Preguntas para entregar

    1. ¿El login viaja en claro o cifrado?
    2. Si viaja cifrado, ¿qué aparece en su lugar?
    3. Si viaja en claro, copiáis:
      • usuario
      • contraseña
      • parámetros adicionales

    💡 Esta parte impacta mucho: “Así de fácil es robar credenciales sin HTTPS.”


    5. Análisis de cookies y sesión

    5.1. Buscar cookies de sesión

    Filtro:

    http.set_cookie
    

    o:

    http.cookie
    

    Localizad:

    • PHPSESSID=xxxxxxx u otro identificador.

    5.2. Preguntas para entregar

    1. ¿La cookie tiene flags Secure, HttpOnly, SameSite?
    2. ¿Se envía en la misma petición del login?
    3. ¿Se reutiliza durante toda la sesión?
    4. ¿Podríais robarla si el tráfico no fuese HTTPS?

    6. Identificación de servidor y tecnologías mediante tráfico

    Aunque no usemos WhatWeb, Wireshark también revela cosas interesantes.

    6.1. Buscad cabeceras del servidor

    Filtro:

    http.server
    

    y:

    http.response
    

    Podéis encontrar:

    • Server: Apache/2.4.54
    • X-Powered-By: PHP/8.1.12

    7. Detectar patrones de ataque (mini-reto)

    Ahora vamos a “jugar” con el tráfico que vosotros mismos habéis generado.

    Hacer desde otra máquina:

    • un par de intentos de fuerza bruta
    • navegación rara
    • errores 404
    • probad rutas prohibidas

    7.1. Filtrar errores del servidor

    http.response.code >= 400
    

    7.2. Preguntas

    1. ¿Qué tipo de errores aparecen más?
    2. ¿Alguna IP destaca como “sospechosa”?
    3. ¿Puedes reconstruir qué intentaba hacer ese cliente?
      (por ejemplo: intentar acceder a /admin/ o /backup/)

    8. Bonus: reconstrucción de sesión (Follow TCP Stream)

    Seleccionad cualquier paquete HTTP → botón derecho:

    Follow → TCP Stream

    Miraréis la conversación completa entre cliente y servidor como si fuese un chat textual.

    Entrega:

    1. Captura del stream
    2. Comentad:
      • ¿Qué información sensible se ve?
      • ¿Podríais reproducir manualmente alguna petición?

    9. Conclusiones finales (informe corto)

    Cada alumno debe redactar:

    9.1. Hallazgos importantes

    • ¿Se ven credenciales?
    • ¿Se identifican cookies inseguras?
    • ¿Qué tecnologías se filtran?
    • ¿Alguna ruta interesante/extraña?

    9.2. Riesgos detectados

    3 riesgos mínimos (exposición de tecnología, falta de HTTPS, cookies inseguras…)

    9.3. Recomendaciones

    3 medidas de mejora:

    • Forzar HTTPS
    • Ocultar versión del servidor
    • Flag HttpOnly en cookies
    • Deshabilitar rutas innecesarias
  • Caso Práctico DS1: Fingerprinting y superficie de ataque (3)

    Caso Práctico DS1: Fingerprinting y superficie de ataque (3)

    enéis desplegada una pequeña aplicación PHP (CRUD + login) en un hosting compartido.

    En esta práctica vais a poneros en la piel de un analista de ciberseguridad que tiene permiso para auditar solo ese sitio web. El objetivo es:

    • Identificar tecnologías y versiones que usa la web (fingerprinting).
    • Descubrir rutas y ficheros interesantes (superficie de ataque).
    • Detectar posibles debilidades de configuración.

    ⚠️ Regla de oro: Solo podéis escanear el dominio/URL que os ha dado el profesor. Nada de escanear webs ajenas “por probar”.


    1. Preparación del entorno

    1.1. Datos que debes tener

    Anota en tu cuaderno o documento:

    • URL de la aplicación:
      Ejemplo: https://grupoX.miapp.ejemplo.com
    • (Opcional) IP del servidor si el profe la da:
      Ejemplo: 123.45.67.89

    1.2. Herramientas a usar

    En un Linux (real o máquina virtual) instalad, si no están:

    sudo apt update
    
    # WhatWeb (fingerprinting web)
    sudo apt install whatweb -y
    
    # Nikto (escáner de vulnerabilidades web)
    sudo apt install nikto -y
    
    # Gobuster (fuerza bruta de directorios)
    sudo apt install gobuster -y
    
    # Wordlist básica (si no la tenéis)
    sudo apt install wordlists -y
    

    Comprobad que funcionan:

    whatweb --version
    nikto -Version
    gobuster -h
    

    2. Fingerprinting básico del servidor web (WhatWeb + cabeceras)

    2.1. Resolver el dominio

    1. Desde la terminal, comprobad a qué IP resuelve vuestro dominio:
    ping -c 3 TU_DOMINIO
    

    Sustituye TU_DOMINIO por tu URL (sin https://).
    Ejemplo:

    ping -c 3 grupoX.miapp.ejemplo.com
    
    1. Anota:
      • IP a la que resuelve
      • Tiempo de respuesta aproximado

    Entrega: captura de pantalla o copia del comando y el resultado.


    2.2. Cabeceras HTTP con curl

    Queremos ver qué nos cuenta el servidor solo con las cabeceras.

    1. Ejecuta:
    curl -I https://TU_DOMINIO
    
    1. Fíjate en:
    • Server: (Apache, Nginx, etc., ¿con versión?)
    • X-Powered-By: (¿PHP con versión?)
    • Si hay algo como Set-Cookie:, etc.

    Entrega:

    • copia de las cabeceras
    • responde brevemente:
      • ¿Se está filtrando la versión exacta del servidor o PHP?

    2.3. Fingerprinting con WhatWeb

    Ahora usamos WhatWeb para identificar tecnologías:

    whatweb https://TU_DOMINIO
    

    Si quieres más detalle:

    whatweb -v https://TU_DOMINIO
    

    Analiza:

    • ¿Detecta CMS (WordPress, etc.)?
    • ¿Versiones de Apache/PHP?
    • ¿Librerías JS, frameworks?

    Entrega:

    • salida de WhatWeb (resumen)
    • lista de tecnologías detectadas
    • marca con un asterisco las que muestren versión concreta, ejemplo:
      • PHP 8.1.12 *
      • Apache 2.4.54 *

    3. Análisis de configuración con Nikto

    Nikto es un escáner de vulnerabilidades web orientado a configuración y ficheros por defecto.

    3.1. Lanzar un escaneo básico

    Ejecuta:

    nikto -h https://TU_DOMINIO
    

    Según el hosting puede tardar un poco.

    Mientras tanto, ve leyendo las líneas: muchas veces indican ficheros interesantes, redirecciones, opciones inseguras, etc.

    3.2. Interpretar resultados

    Cuando termine, revisa:

    • ¿Detecta archivos o directorios por defecto (ej: /phpinfo.php, /server-status, /test/)?
    • ¿Algún mensaje tipo “OSVDB”, “might be vulnerable to…”?
    • ¿Alguna recomendación de deshabilitar cosas?

    Entrega:

    1. Lista de 3–5 hallazgos relevantes de Nikto. Para cada uno:
      • Qué ha encontrado (ruta / mensaje).
      • Por qué podría ser un problema.
    2. Indica si crees que hay algo que debería deshabilitarse/eliminarse en el servidor.

    (Si el hosting está muy capado y Nikto no ve casi nada, eso también es un hallazgo: coméntalo.)


    4. Fuerza bruta de rutas y directorios con Gobuster

    Aquí empezamos a descubrir “piezas” ocultas de la aplicación: paneles, copias de seguridad, etc.

    4.1. Elección de wordlist

    Usaremos una wordlist relativamente pequeña para no machacar el hosting.

    Por ejemplo:

    ls /usr/share/wordlists/dirb/
    

    Una habitual:

    • /usr/share/wordlists/dirb/common.txt

    4.2. Lanzar Gobuster (modo dir)

    Comando base:

    gobuster dir \
      -u https://TU_DOMINIO \
      -w /usr/share/wordlists/dirb/common.txt \
      -t 30 \
      -x php,txt,html
    

    Explicación:

    • -u: URL objetivo
    • -w: wordlist
    • -t: hilos (no os flipéis, que es un hosting compartido)
    • -x: extensiones a probar (.php, .txt, .html)

    4.3. Analizar resultados

    Fíjate en entradas con códigos de estado interesantes:

    • 200 → existe y responde bien
    • 301/302 → redirecciones
    • 403 → existe pero está prohibido (¡ojo, puede haber algo interesante detrás!)

    Entrega:

    • Lista de rutas interesantes encontradas. Ejemplo:
      • /admin/ (200)
      • /backup/ (403)
      • /old/ (200)
    • Para cada una, explica:
      • ¿Crees que deberían ser accesibles?
      • ¿Podrían contener datos sensibles?

    5. Mini-conclusiones de seguridad

    Al final de la práctica, responde a estas preguntas en un pequeño informe (1–2 páginas):

    1. Fingerprinting
      • ¿Qué servidor web y versión usa vuestro hosting?
      • ¿Qué versión de PHP se expone (si es visible)?
      • ¿Se muestran cabeceras innecesarias (X-Powered-By, etc.)?
    2. Superficie de ataque
      • ¿Qué directorios ocultos/localizaciones interesantes habéis encontrado?
      • ¿Habéis visto algún archivo de configuración, backup, antiguo…?
    3. Riesgos
      • Señala al menos 3 riesgos potenciales que habéis identificado.
      • Para cada uno, describe:
        • Cómo lo habéis descubierto (herramienta + comando).
        • Qué podría hacer un atacante con ello.
    4. Recomendaciones
      • Escribe 3 medidas que propondrías al responsable del hosting:
        • Ejemplos: ocultar versión de servidor, borrar backups públicos, restringir /admin, etc.