El pasado jueves 31 de Marzo, el Framework de ingeniería Social SET (Social Engineer Toolkit) lanzó su versión 1.3 “Artillery Edition” proporcionando características de gran interés.

Entre las más destacables se encuentra el vector de ataque Wireless Attack Vector que hace uso de airbase-ng para crear un Fake AP y redirigir tráfico, o el payload RATTE (Remote Administration Tool Tommy Edition) desarrollado por Thomas Werth y que permite tunelizar instrucciones mediante HTTP aprovechándose de las configuraciones locales del navegador y saltándose de esta forma Firewalls y Proxys.

Además, una de las funcionalidades más interesantes ha sido la incorporación de una nueva shell interactiva (Custom Written Interactive Shell) desarrollada en python por David Kennedy (ReL1K) y que trabaja como una reverse shell usando AES 256. El payload ha sido añadido a SET e incorpora numerosas características como: command shell, uploading/downloading files, listing/killing processes, ssh tunneling, etc.

En este post hablaremos de esta última característica, Reverse Port SSH Tunneling, mediante un ejemplo práctico que refleja un escenario típico en el que necesitamos escalar privilegios y para ello necesitamos explotar un servicio al cual no tenemos acceso directo desde el exterior.

Empezaremos configurando SET, empleando un clone-site attack mediante un Applet firmado de Java y utilizando como payload la nueva shell interactiva.. Posteriormente enviaremos dicha URL a la víctima y una vez que acepte el Applet y consigamos una shell, escalaremos privilegios lanzando un exploit a un servicio Web vulnerable mediante un túnel SSH. Por último, accederemos por Terminal Server mediante otro túnel con las credenciales del usuario previamente creado.

Comenzaremos configurando SET de la siguiente manera:

Website Attack Vectors: opción 2
The Java Applet Attack Method: opción 1
Site cloner: opción 2
Especificamos el sitio a clonar: https://gmail.com, http://twitter.com/, o el que más nos guste.
Por último, seleccionamos Set Custom Written Interactive Shell (opción 11) y especificamos el puerto local de escucha para la nueva shell (443 en nuestro caso).



SET creará un socket esperando nuevas conexiones para proporcionar el sitio web previamente creado. Si nos fijamos en la imagen también nos avisará que la librería Crypto.Cipher está instalada (paquete pyCrypto) y que será necesaria para establecer la shell interactiva de forma cifrada.

Una vez el usuario acepte el Applet, SET nos indicará la sesión de la víctima y podremos interactuar con ella a través de la shell interactiva. Podemos utilizar ? para ver la lista de comandos soportados. Lo primero que haremos será comprobar el tipo de usuario que ha aceptado el certificado.



Como podemos ver el usuario no pertenece al grupo administradores así que necesitamos buscar otro método para obtener privilegios en la máquina. Es importante decir que en la versión actual de SET si intentamos añadir un usuario mediante la instrucción localadmin (instrucción con la que intentará añadir un user al grupo administradores), éste nos informará de que el usuario se añadió correctamente, aunque en realidad no lo haya hecho, como es nuestro caso, debido a la falta de privilegios (es por este motivo por el que se nos indica que lo comprobemos).



Si seguimos indagando desde nuestra shell y observamos la lista de procesos en ejecución vemos que existen varios puertos interesantes, entre ellos un 8080 (correspondiente al servidor web Kolibri.exe) y el 3389 de Terminal Server.



Sin embargo, si intentamos acceder a los mismos desde la maquina atacante (fuera de nuestra shell) veremos que no podemos alcanzarlos. Seguramente dichos servicios tengan un uso únicamente local o dentro de la LAN en la que se encuentra el usuario y es por esto por lo que algún firewall impide conexiones externas a los mismos.



Aquí es donde podemos sacar partido del reverse shell tunneling, ya que podemos crear un túnel SSH para conectar a dichos servicios desde nuestra máquina.



Lo que hemos hecho es realizar una conexión SSH a nuestro equipo (habilitando previamente SSH) para crear varios túneles a través de los cuales conectar del puerto local 8080 al equipo víctima 8080 y del puerto local 3389 al equipo víctima 3389. En el enlace proporcionado se muestran varios ejemplos detallados para entender el Reverse SSH Port Forwarding.

Si ahora intentamos conectar desde nuestro equipo contra localhost:8080 vemos que ya tenemos acceso a dicho servicio y además obtendremos la versión exacta del mismo (kolibri-2.0).

Dicha versión parece ser vulnerable a un desbordamiento de buffer permitiendo sobrescribir el manejador de excepciones SEH al utilizar una cadena de cierta longitud en el método HEAD.



El exploit presenta diversas opciones a la hora de ejecutarlo en función de la versión y SP del sistema operativo, por lo que el siguiente paso será conocer dichos valores en nuestra máquina para ver si necesitamos ajustar ciertas direcciones de memoria (jmp esp y pop ret en nuestro caso). Tenemos varias opciones aquí: podemos hacer uso del cliente WMI (WMIC) o bien preguntar directamente al registro.



Como vemos tenemos una máquina XP SP3 en español, así que lo único que necesitamos es ver si el jmp esp en kernel32.dll coincide con la dirección de memoria que actualmente aparece en el exploit, al igual que el pop pop ret en kolibrí.exe, y en caso de no ser así buscar otras direcciones válidas que cumplan con los requisitos (respetando bad characters) dentro de las dll cargadas por la aplicación.

En nuestro caso únicamente modificaremos el valor jmp en kernel32.dll por 0×7C86467B.



En el siguiente paso crearemos un payload windows/exec con el que añadiremos al usuario bmerino dentro del grupo de administradores y con el que posteriormente conectaremos por Terminal Server.



Por último lanzaremos el exploit apuntando a localhost:8080



Y comprobamos si realmente se ha añadido bmerino al grupo administradores.


F
inalmente conectaremos vía Terminal Server mediante el túnel previamente creado e ingresaremos con las nuevas credenciales.



Existen multitud de alternativas para llevar a cabo un ataque similar donde necesitamos escalar privilegios. Por ejemplo, podría haberse utilizando como payload meterpreter y emplear “getsystem” para intentar conseguir System o bien utilizar el “portfwd” del mismo para tunelizar conexiones como hemos hecho en este caso y intentar explotar un servicio local. Sin embargo, existen escenarios en donde no podemos utilizar meterpreter o una shell de este tipo (bien por tamaño del buffer, bad characters u otro tipo de restricciones), en cuyo caso podemos hacer uso de herramientas externas, como plink.exe, para llevar a cabo el túnel.

Utilizando el ejemplo anterior, supongamos que conseguimos una reverse shell y necesitamos hacer port forwarding. En este caso no contamos con la opción de ssh_tunnel, así que tenemos que optar por otra vía. Para ello utilizaremos el cliente tftp de Windows con el que descargaremos la herramienta plink.exe y generaremos el túnel ssh. Previamente tendremos que habilitar el servidor tftp en nuestro equipo y copiar plink.exe al directorio configurado por el daemon tftp.



Ahora desde nuestra shell podemos descargar plink.exe, realizar el túnel y continuar con el ataque de la misma forma que en el caso anterior.



Para más información sobre port forwarding con plink.exe, se puede consultar el blog de Hamid Kashfi.

Como hemos podido ver, SET con su nueva shell interactiva nos ahorra todos estos pasos integrando una serie de funcionalidades que hacen mucho más sencillo el proceso de explotación gracias a ssh_tunnel. Puede verse un video con las características incorporadas en Set v1.3 en este enlace: http://www.vimeo.com/21735875.

Sobre el autor:
Comenzamos la semana con una entrada de un nuevo y esperamos que habitual colaborador, con una presentación breve pero precisa: Borja Merino, ingeniero informático y empleado de Isdefe. Esperamos que su entrada de inauguración les guste tanto como a nosotros.
http://www.securityartwork.es/2011/04/04/reverse-port-ssh-tunneling-en-set-v1-3