⬆️Explotación de subida
Última actualización
Última actualización
El paso final para explotar esta aplicación web es cargar el script malicioso en el mismo lenguaje que la aplicación web, como un webshell o una reverse shell. Una vez que cargamos nuestro script malicioso y visitamos su enlace, deberíamos poder interactuar con él para tomar el control del servidor back-end.
Podemos encontrar muchos shells web excelentes en internet que brindan funciones útiles, como navegación de directorios o transferencia de archivos. Una buena opción para PHP
es phpbash , que proporciona un shell web semiinteractivo similar a una terminal. Además, SecLists proporciona una gran cantidad de webshells para diferentes marcos e idiomas, que se pueden encontrar en el /usr/share/seclists/Web-Shells
directorio.
Podemos descargar cualquiera de estos webshells para el lenguaje de nuestra aplicación web ( PHP
en nuestro caso), luego cargarlo a través de la función de carga vulnerable y visitar el archivo cargado para interactuar con el web shell. Por ejemplo, intentemos cargar phpbash.php
desde phpbash a nuestra aplicación web y luego naveguemos hasta su enlace haciendo clic en el botón Download:
Como podemos ver, este shell web ofrece una experiencia similar a la de una terminal, lo que hace que sea muy fácil enumerar el servidor back-end para su posterior explotación. Pruebe algunos otros shells web de SecLists y vea cuáles satisfacen mejor sus necesidades.
Si bien el uso de web shells de recursos en línea puede brindar una gran experiencia, también deberíamos saber cómo escribir un web shell simple de forma manual. Esto se debe a que es posible que no tengamos acceso a herramientas en línea durante algunas pruebas de penetración, por lo que debemos poder crear una cuando sea necesario.
Por ejemplo, con PHP
aplicaciones web, podemos usar la system()
función que ejecuta comandos del sistema e imprime su salida, y pasarle el cmd
parámetro con $_REQUEST['cmd']
, de la siguiente manera:
Código: php
Si escribimos el script anterior shell.php
y lo cargamos en nuestra aplicación web, podemos ejecutar comandos del sistema con el ?cmd=
parámetro GET (por ejemplo ?cmd=id
, ), de la siguiente manera:
Puede que no sea tan fácil de usar como otros shells web que podemos encontrar en línea, pero aun así proporciona un método interactivo para enviar comandos y recuperar su resultado. Podría ser la única opción disponible durante algunas pruebas de penetración web.
Consejo: si estamos usando este shell web personalizado en un navegador, puede ser mejor usar source-view haciendo clic en [CTRL+U]
, ya que source-view muestra la salida del comando tal como se mostraría en la terminal, sin ninguna representación HTML que pueda afectar el formato de la salida.
Los shells web no son exclusivos de PHP
, y lo mismo se aplica a otros frameworks web, con la única diferencia de las funciones que se utilizan para ejecutar comandos del sistema. Para .NET
las aplicaciones web, podemos pasar el cmd
parámetro con request('cmd')
a la eval()
función, y también debería ejecutar el comando especificado en ?cmd=
e imprimir su salida, de la siguiente manera:
Podemos encontrar otros shells web en línea, muchos de los cuales se pueden memorizar fácilmente para realizar pruebas de penetración web. Cabe señalar que in certain cases, web shells may not work
. Esto puede deberse a que el servidor web impide el uso de algunas funciones utilizadas por el shell web (por ejemplo system()
), o debido a un firewall de aplicaciones web, entre otras razones. En estos casos, es posible que necesitemos utilizar técnicas avanzadas para eludir estas mitigaciones de seguridad, pero esto está fuera del alcance de este módulo.
Por último, veamos cómo podemos recibir shells inversos a través de la funcionalidad de carga vulnerable. Para ello, debemos comenzar descargando un script de shell inverso en el lenguaje de la aplicación web. Un shell inverso confiable PHP
es el shell inverso PHP de pentestmonkey . Además, las mismas SecLists que mencionamos anteriormente también contienen scripts de shell inverso para varios lenguajes y marcos web, y podemos utilizar cualquiera de ellos para recibir un shell inverso también.
Descarguemos uno de los scripts de shell inverso anteriores, como pentestmonkey , y luego abrámoslo en un editor de texto para ingresar nuestro IP
y listening PORT
, al que se conectará el script. Para el pentestmonkey
script, podemos modificar las líneas 49
y 50
e ingresar la IP/PUERTO de nuestra máquina:
A continuación, podemos iniciar un netcat
oyente en nuestra máquina (con el puerto anterior), cargar nuestro script a la aplicación web y luego visitar su enlace para ejecutar el script y obtener una conexión de shell inversa:
Como podemos ver, hemos recibido una conexión exitosa desde el servidor back-end que aloja la aplicación web vulnerable, lo que nos permite interactuar con ella para explotarla más. El mismo concepto se puede utilizar para otros lenguajes y frameworks web, con la única diferencia que es el script de shell inverso que utilizamos.
Al igual que los web shells, también podemos crear nuestros propios scripts de shell inverso. Si bien es posible utilizar la misma system
función anterior y pasarle un comando de shell inverso, esto puede no ser siempre muy confiable, ya que el comando puede fallar por muchas razones, al igual que cualquier otro comando de shell inverso.
Por eso siempre es mejor utilizar las funciones básicas del framework web para conectarnos a nuestra máquina. Sin embargo, esto puede no ser tan fácil de memorizar como un script de shell web. Afortunadamente, herramientas como msfvenom
pueden generar un script de shell inverso en muchos lenguajes e incluso pueden intentar eludir ciertas restricciones vigentes. Podemos hacerlo de la siguiente manera PHP
:
Una vez generado nuestro reverse.php
script, podemos volver a iniciar un netcat
receptor en el puerto que especificamos anteriormente, cargar el reverse.php
script y visitar su enlace, y también deberíamos recibir un shell inverso:
De manera similar, podemos generar scripts de shell inverso para varios idiomas. Podemos usar muchas cargas útiles de shell inverso con el -p
indicador y especificar el idioma de salida con el -f
indicador.
Si bien los shells inversos siempre son preferibles a los shells web, ya que brindan el método más interactivo para controlar el servidor comprometido, es posible que no siempre funcionen y que tengamos que recurrir a los shells web. Esto puede deberse a varias razones, como tener un firewall en la red back-end que impide las conexiones salientes o si el servidor web deshabilita las funciones necesarias para iniciar una conexión con nosotros.
Intente aprovechar la función de carga para cargar un shell web y obtener el contenido de /flag.txt
Vamos a cargar la webshell phpbash:
Se sube correctamente, y si accedemos al directorio /uploads/phpbash.php
podemos ejecutar comandos, y obtenemos la flag en el directorio raiz /
: