XUT_ / COURSES / PENETRATION TESTER

Remote Code Execution

RCE nos permitiría ejecutar código de manera arbitraria en el servidor. Aunque esto es más probable que pase con un usuario con bajos privilegios como www-data, sigue siendo una vulnerabilidad muy seria. Tiende a ser explotado subiendo un programa en el mismo lenguaje que el backend. Este solía ser PHP, sin embargo, en tiempos más modernos, otros lenguajes backend se han impuesto (como Python Django y JavaScript en forma de Node.js).

IMPORTANT

En routed applications (aquellas donde las rutas de archivos son generadas dinámicamente) es más difícil para los atacantes explotar este tipo de vulnerabilidades ya que no pueden predecir el path de los archivos.

Hay dos manera principales de conseguir una RCE en un servidor web: webshells y reverse/bind shells. Idealmente, bind/reverse shells es el escenario perfecto para un atacante. Sin embargo, puede que tu única opción sea una webshell. Primero subimos el archivo y luego lo intentamos ejecutar, ya sea navegando directamente hacia él si el servidor lo permite o forzando a al app a que lo cargue.


WebShells

Asumamos que hemos encontrado una página con un formulario de subida:

Remote Code Execution

¿Qué hacemos ahora? Bien empezaremos con un escaneo de gobuster:

Remote Code Execution

Parece que tenemos dos directorios: uploads y assets. Parece que cualquier archivo que subamos se subirá al directorio /uploads. Intentaremos subir la imagen del perrito de la tarea anterior.

Remote Code Execution

Remote Code Execution

Ahora, si vamos a http://demo.uploadvulns.thm/uploads, deberíamos ver que la imagen se ha subido.

Remote Code Execution

Remote Code Execution

Vale, podemos subir imágenes. Intentémoslo con una webshell ahora.

Sabemos que este servidor web corre con un backend PHP, por lo que podemos empezar con la creación de la shell, en un entorno real puede que tengamos que realizar más enumeración.

Una webshell simple funciona tomando un parámetro y ejecutándolo como comando de sistema. En PHP, la sintaxis sería:

php
<?php
echo system($_GET["cmd"]);
?>

Este código toma el parámetro GET cmd y lo ejecuta como comando. Luego muestra el output por pantalla. Probemos a subirla y a ejecutar algún comando.

Remote Code Execution

Ha funcionado, por lo que ahora podríamos usar esta webshell para leer archivos en el sistema o para mejorarla a una reverse shell.

NOTE

Cuando tenemos una webshell, muchas veces es más legible mirar el código fuente de la página.


Reverse Shells

El proceso de subir una reverse shell es casi idéntico al de subir una webshell. Usaremos la reverse shell de Pentest Monkey que viene por defecto en Kali, aunque también la puedes descargar aquí.

Necesitas editar la línea 49, que ahora mismo dice $ip = '127.0.0.1'; //CHANGE THIS. Lo siguiente que debemos hacer es arrancar un listener en el puerto que elijamos.

Remote Code Execution

Ahora subimos la shell y la activamos navegando a ella: http://demo.uploadvulns.thm/uploads/shell.php. El nombre de la shell será el que nosotros le pongamos (php-reverse-shell.php por defecto).

Remote Code Execution


Ahora navega a shell.uploadvulns.thm y completa esta tarea.

  1. Vamos a la página. Remote Code Execution
  2. Hacemos un escaneo con gobuster. Remote Code Execution Podemos intuir que lo que subimos se está guardando en /resources.
  3. Hacemos una webshell en php. Remote Code Execution
  4. La subimos. Remote Code Execution Remote Code Execution Se ha subido exitosamente.
  5. Navegamos hasta la shell y le metemos un comando (whoami) para comprobar que funciona. Remote Code Execution
  6. Vamos a leer el contenido de /var/www con ls /var/www. Remote Code Execution
  7. Leemos el contenido de la flag con cat /var/www/flag.txt. Remote Code Execution