Seguridad web · 8 min read · Jan 04, 2026
Presentando Remo - Una forma fácil de asegurar una aplicación en línea insegura con ModSecurity
Presentando Remo - Una forma fácil de asegurar una aplicación en línea insegura con ModSecurity
Supongamos que tienes una aplicación desagradable en tu servidor web Apache que ha sido instalada por algunos idiotas del departamento de marketing y no puedes ni parchearla ni eliminarla. Tal vez sea un problema de recursos, falta de conocimientos, falta de código fuente, o posiblemente incluso por razones políticas. En consecuencia, necesitas protegerla sin tocarla. Existe ModSecurity, pero dicen que esto es solo para expertos. Una alternativa sencilla es Remo, un editor gráfico de reglas para ModSecurity que viene con un enfoque de lista blanca. Tiene todo lo que necesitas para asegurar la aplicación.
Para el propósito de este tutorial, utilizaremos una aplicación de prueba realmente simple. Una que es tan fea, que ni siquiera tu departamento de marketing querría tenerla alrededor. Pero bueno, es solo un tutorial.
';
echo $_POST['command'];
echo '
';
system($_POST['command'], $retval); # necesario para comandos 'ls'
echo '';
echo 'Valor de retorno: ' . $retval; echo '
'; echo ''; ?>
ls.php: Un pequeño script que es mejor que elimines de tu sitio mientras puedas.La ejecución directa de cualquier comando de shell enviado en forma del parámetro command hace que ls.php sea un invitado no deseado en casi cualquier servidor web, o un caso de prueba perfecto para probar Remo con el fin de protegerte de los peligros de este script. Entonces, ¿qué es Remo? En remo.netnea.com aprenderás que está destinado a ser una forma simple de configurar ModSecurity sin tener que convertirte primero en un experto en seguridad. La segunda trampa es que Remo escribe reglas de lista blanca, mientras que la mayoría de las personas utilizan ModSecurity con un enfoque de lista negra. La lista negra significa que le dices a ModSecurity todo sobre todos los ataques conocidos. La lista blanca lo hace al revés: se asegura de que tu aplicación solo reciba la entrada que realmente deseas que reciba. De modo que ls.php solo recibirá comandos ls como su parámetro de comando y, además, te asegurarás de que no se puedan hacer trucos sucios utilizando comillas invertidas y punto y coma dentro del parámetro. Para resumir: Remo ayuda a realizar la validación de entrada en el servidor sin tocar la aplicación.
Instalación
Puedes probar Remo en la demostración en línea en la página de inicio. Esa funciona bien cuando deseas probar Remo sin instalarlo primero. La instalación tampoco es muy difícil, incluso sin paquetes de distribución listos para la fecha. Asegúrate de tener ruby, irb y las vinculaciones de ruby-sqlite3 instaladas antes de descargar.
He hecho lo siguiente en mi caja de prueba Ubuntu; debería funcionar para Debian también:
aptitude install ruby irb libsqlite3-ruby1.8En cuanto a Remo, puedes descargar una versión o tomar una instantánea del último árbol de subversión. La página de descarga de Remo te dice qué árboles han pasado todas las pruebas unitarias. Supongamos que descargamos e instalamos una versión. Ve a la página de descarga y agarra la versión beta 0.2.0. Descomprime el tarball y enciende el servidor WEBrick rails. Desde la línea de comandos, esto se reduce a:
wget http://remo.netnea.com/files/remo-0.2.0.tar.gz
tar xvzf remo-0.2.0.tar.gz
cd remo-0.2.0
ruby script/server
direct browser to http://localhost:3000/main/indexDeberías obtener algo como esto:

Remo tal como se ve después de la instalación.Estamos un poco apurados aquí, ya que este tutorial está destinado a ser breve. Así que solo te mostraré las cosas necesarias para asegurar la aplicación de prueba. Una especie de guía práctica. Hay mucho tiempo para que explores Remo por tu cuenta.
Asegurando la Aplicación
Elimina todas las solicitudes predeterminadas en la ventana y crea una nueva.

Agregando una nueva solicitud a Remo.Haz clic en el texto de clic para editar e ingresa la ruta de tu aplicación: /ls.php, luego cambia el método http a POST. Abre los detalles de la solicitud y agrega un nuevo parámetro de publicación usando el botón p* junto a los parámetros de publicación. Haz clic en el nombre (clic para editar) y cámbialo a command. Este es el parámetro enviado por nuestra aplicación de ejemplo ls.php.
A la derecha del nombre está el dominio de valor del parámetro. Esta es la parte central de Remo. Aquí defines qué valores son aceptables para el parámetro. Recuerda, esto es una lista blanca: estamos definiendo exactamente lo que es aceptable. Hay un par de valores predefinidos, pero en este caso tendremos que ir con Personalizado. Si abres los detalles del parámetro command, hay un campo llamado Expresión regular personalizada. Aquí es donde Remo busca la expresión regular cuando el dominio de valor es Personalizado. Usaré ls[0-9a-zA-Z-\x20_.]{0,64}. Este es el comando ls seguido de un grupo opcional de caracteres que consisten en números, letras, guiones, el carácter de espacio, guion bajo y punto. Sin punto y coma, sin barras, sin comillas invertidas, sin umlauts alemanes, sin especialidades unicode: Este es tu servidor y no quieres que haya tonterías aquí.

La protección para ls.php está en camino con la definición del parámetro POST command.Una solicitud que no cumpla con esta condición fallará. El comportamiento predeterminado de Apache para una solicitud fallida será devolver un código de estado http 501: Método no implementado. Pero seamos amables: como código de estado (coincidencia de dominio fallida) ingresas 302 para redirección http y debajo en Ubicación (coincidencia de dominio fallida) ingresas la URL de tu empresa como http://www.netnea.com. Así que alguien que no proporcione el parámetro correcto será redirigido al sitio web de tu empresa. En realidad, puedes hacer que el parámetro sea obligatorio haciendo clic en opcional y abajo puedes establecer un comportamiento especial para la condición obligatoria fallida también. Pero en nuestro caso, el parámetro no necesita ser de carácter obligatorio.
Si te preguntas cómo se convertirá este parámetro de expresión regular en una regla de ModSecurity, entonces echa un vistazo a la siguiente gráfica:

Así es como una configuración de parámetro de Remo se traduce en una regla de ModSecurity.Describe cómo tu parámetro de Remo se traduce en una regla de ModSecurity y qué sucederá durante la evaluación. Se reduce a esto: Cada parámetro de solicitud http se compara con el dominio de valor definido en Remo y si no se ajusta, entonces toda la solicitud se deniega el acceso.
Poniéndolo en Práctica
Dicho esto, generemos el conjunto de reglas de ModSecurity. Haz clic en el botón generar en la barra de herramientas y guarda el archivo que obtendrás. Este es el archivo de reglas en el lenguaje de reglas de ModSecurity. Toma este archivo y guárdalo en un lugar donde Apache pueda encontrarlo. Vale la pena echar un vistazo, por cierto, para entender cómo Remo utiliza ModSecurity. Luego debes asegurarte de que ModSecurity esté habilitado en tu servidor web. Remo genera conjuntos de reglas de ModSecurity 2, ya que ha habido una actualización y extensión importante al lenguaje de configuración entre 1.9 y 2.0 y Remo necesita estas nuevas características. En caso de que tu distribución no proporcione paquetes de ModSecurity, puedes obtener la mayoría de ellos de http://www.modsecurity.org. De lo contrario, siempre puedes compilarlo tú mismo. No es demasiado complicado.
Es mejor incluir tu archivo de reglas en tu configuración de apache de la siguiente manera:
Include /etc/apache2/rulefile.conf
Luego recarga tu apache y pruébalo (estoy usando la herramienta de línea de comandos curl en la demostración, pero tu navegador estará bien):
curl --data "command=ls -l" http://localhost/ls.php-rw-r--r-- 1 sam staff 353 Feb 7 13:05 index.html
-rw-r--r-- 1 sam staff 248 Apr 23 05:35 ls.php
...Así que esto todavía funciona. ¿Qué tal un abuso de ls.php?
curl --data "command=ls -l; cat /etc/passwd" http://localhost/ls.php
302 Encontrado
Encontrado
El documento se ha movido aquí.
Apache/2.2.3 (Debian) PHP/5.2.0-8 Servidor en railsmachine Puerto 80
¡Atrapé al atacante! Hay un registro de auditoría definido en el archivo de configuración. Por defecto, esto está en /var/log/apache2/modsec_audit.log. Se leerá como lo siguiente en nuestro caso:
...
--2957a220-H--
Mensaje: Acceso denegado con redirección a http://www.netnea.com usando estado 302 (fase 2).
Coincidencia de "rx ^(ls\x20[0-9a-zA-Z-_.]{0,64})$" contra "ARGS:command" requerido. [id "1"]
[msg "El parámetro de publicación command falló la verificación de validez. Dominio de valor: Personalizado."] [severity "ERROR"]
Acción: Interceptado (fase 2)
...Antes de pasar a modo de producción, asegúrate de que este registro no crezca demasiado. De hecho, es posible que desees desactivar el registro excesivo cuando hayas terminado con la configuración. El archivo de registro está configurado por Remo para hacer un registro completo de solicitudes con fines de depuración por defecto. Esto incluye todo, incluso contraseñas. Cuando termines con las pruebas, deberías establecer el parámetro SecAuditLogParts en el archivo de reglas a un valor más sensato. ABHZ es una opción. De esa manera, solo registra encabezados http y el resumen de auditoría de ModSecurity.
Así que esto ha sido una rápida visión general de Remo. Hay más que encontrar en el sitio web de Remo. ModSecurity.org tiene una gran documentación que te dice todo sobre el lenguaje de configuración. Además, hay un conjunto de reglas central que te ayudará en situaciones donde no tienes tiempo para modelar tu aplicación en Remo. El conjunto de reglas central siempre es un buen comienzo, ya que atrapará el 90% de los ataques con muy poco esfuerzo.
Remo está lejos de ser maduro, pero está listo para usar y, dado un base de usuarios útil, podría desarrollarse en una herramienta interesante para asegurar aplicaciones web. Tu aplicación no tiene que ser tan simple como la que se usó en este tutorial. Aplicaciones más grandes con docenas de URL y muchos parámetros también funcionan bien.
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.