-[ 0x08 ]------------------------------------------------------------------- -[ Camino al mercado ]------------------------------------------------------- -[ by Paseante ]-----------------------------------------------------SET-25-- The future of digital systems is complexity, and complexity is the worst enemy of security. Bruce Schneier -'_'- En garde -'_'- ------------------ Fue a finales del siglo XX cuando la humanidad se embarco en una velocisima carrera para 'situarse' en el ciberespacio, las exigencias de las empresas, las promesas de los departamentos de marketing, la enormidad de los mercados a ganar y el hecho de que todo estaba por hacer y todo parecia posible nos condujo inexorablemente a la situacion del "mas dificil todavia". Donde habia un servidor web, novisima tecnologia apenas un lustro antes, aparecio un servidor de aplicaciones y un gestor de contenidos y un software para medir el rendimiento de ambos en tiempo real y otro para comprobar la correcion del sacrosanto proceso de compra en los sitios web y la fiabilidad de la plataforma de comercio electronico y mas software para que todos ellos se comunicasen y asi hasta el infinito. Comenzamos a escuchar nombres como RelyENT, Tonic, Vignette, OpenMarket, Fernway... Se podia esperar que productos basados en estandares incompletos, a veces incluso en drafts, con continuas presiones para adelantar su lanzamiento al mercado, con relativamente pocos clientes y con todo el equipo de desarrollo intentando que el producto SIMPLEMENTE FUNCIONASE (al menos en un par o tres de "configuraciones testeadas") fuesen seguros?. No. Para gran parte, sino toda, de la comunidad de seguridad ha sido un axioma que la "seguridad a traves de la oscuridad (security through obscurity)" no funciona. No obstante durante un tiempo nadie busco vulnerabilidades en estos productos por la unica razon de que 'your_average_hacker' no tenia acceso a ellos. Ese tiempo se acabo. -'_'- El largo y tortuoso camino -'_'- ------------------------------------ En la epoca anterior a que el comercio electronico empezase a controlar la red, el esquema de navegacion era generalmente muy sencillo. ________ _____________ | | | | _________ Peticion | | | NES | | | ==============> |WEB? OK |===> | Apache | | | | | | IIS | |_______| <-------------- |Resto? |<--- |____________| /________/ Respuesta | | |________| Cliente Firewall Web Server/Farm Pero un dia llego en que no reconociamos las URL, los .htm y .html habian desaparecido y no porque el sitio web usase otras conocidas extensiones [.shtml, .php, .asp, .nsf...], se trataba de un autentico cambio en la manera de gestionar y entregar la informacion al cliente. Nuestro dibujo (perdon por llamar a "esto" dibujo) habia cambiado: Web Cluster/Farm App. Server ________ _____________ | | | | _________ Peticion | | | | |--------| | | ==============> |WEB? OK |===> | Iplanet WS |===>| IAS | | | | | | Apache |<---| Tomcat | |_______| <-------------- |Resto? |<--- |____________| | WLogic | /________/ Respuesta | | |--------| |________| / \ || Cliente Firewall | || | || | \/ .......... ( ) ( Oracle ) ( ) ( Sybase ) ( DB2 ) (..........) RDBMS Server Cuando la URL inicial de una pagina web tiene mas de 50 o 60 caracteres ya puedes comenzar a sospechar que estan utilizando alguno de esos cripticos productos que incluyen recurrentemente en su literatura promocional a topicos como "escalable, J2EE compatible, logica de negocio, mision critica" Como afecta a la seguridad este nuevo escenario?. Supongamos que seguimos teniendo permitido solo el trafico web, que casos se han dado de poder acceder directamente a la base de datos Oracle, podria parecer que no cambia gran cosa puesto que el resto de conexiones son "internas". Sin embargo si antes contabamos con fallos de seguridad que afectasen al servidor web (IIS abstenerse) ahora ademas podemos contar con fallos especificos del servidor de aplicaciones, con fallos en el driver que usan para comunicarse con la base de datos, con fallos en el propio acceso y recogida de los datos.... Y con fallos en la(s) aplicacion(es) que se han desarrollado sobre ese servidor de aplicaciones. En una palabra, pavoroso. Y eso siendo generosos y admitiendo un cortafuegos bien configurado. -'_'- Objetivo a la vista -'_'- ---------------------------- Hace algun tiempo yo me encontre en esa situacion, de sorpresa o curiosidad por saber que ***** podia haber en un servidor web para generar URL tan extra~as, con la ayuda de Google u otros buscadores suele ser factible determinar el nombre del producto en cuestion y tras ello buscar informacion en la web del fabricante. El producto en cuestion habia llamado a pasarse OpenMarket (anteriormente IPS) y como viene siendo habitual para acceder a la documentacion habia que ser usuario registrado. Bueno, ya veremos. Unos cuantos garbeos por su web mas tarde y con una pila de MB de .pdf en mi disco duro solo sabia que el tal OpenMarket (OPMK) era un "gestor de contenidos". No tenia muy claro que hacia pero parecia que con ese producto se gestionaba completamente el contenido de la web, se definia quien podia cambiar que cosas (al detalle de una simple imagen), a quien habia que avisar si alguien enviaba material nuevo y un monton de virguerias mas, todo eso con maravillosa administracion web basado en Java2EE y XML. La panacea. Entre sus usuarios ninguna PYME solo grandes grupos multimedia, bancos, telecos, etc. La documentacion era larga y compleja y mis luces escasas, solo me quedo una cosa clara. Habia paginas para hacer login Con eso y mi innata e inmerecida habilidad para saltarme un sorprendente numero de paginas que piden usuario y password (algo que ha traido a este ezine mas de un par de articulos) parecia que podiamos hacer algo. Segun la guia de instalacion el servidor web tenia mapeado dos directorios /futuretense_cs --> Correspondiente a Content Server /Xcelerate --> Correspondiente a Content Centre Tenemos al menos dos paginas de login /futuretense_cs/AdminForms.html /futuretense_cs/Xcelerate/LoginPage.html Si cargamos esas paginas veremos en el fuente, si somos 'rapidos', como no son mas que una manera "amigable" de acceder a la administracion. Esta es la linea con "fundamento" de LoginPage.html. Como veis esta URL es enorme y a eso me referia cuando hablaba de la proliferacion de sitios web en los que nada mas entrar te encontrabas con URLs a primera vista incomprensibles. Troceemos la URL y acomodemosla al diagrama anterior. www.algo.com --> Hasta aqui llega el servidor web /servlet/ --> Le indica que esto vaya al servidor de aplicaciones ContentServer --> La aplicacion Content Server se hace cargo del resto ?pagename.... --> Parametros para la aplicacion anterior Y como sabemos que OpenMarket guarda todos su contenido en una base de datos nos podemos imaginar que desde ahi se genera lo que los gurus de SQL llaman "una consulta". ;-) Como en otras muchas ocasiones una buena configuracion ayuda a mantener los intrusos fuera, descubri que era posible "capar" los accesos a las paginas administrativas mediante ACL (listas de control de acceso), algunos sitios las tenian y otros no. Una vez presente en la pagina de administracion tenias por defecto acceso de lectura a la mayor parte del site. Tecnicamente hablando a falta de validacion OpenMarket te convertia en "DefaultReader" con la ACL de "Browser" lo cual te mostraba mas de lo necesario pero te impedia hacer cambios. Pero volvamos a lo nuestro, tenemos una pagina de login y necesitamos un usuario y una password. Uso mi tecnica ultra-secreta y pruebo las que sugiere la guia de instalacion. User: ContentServer Pass: FutureTense En un sorprendente numero de casos funciona y me evita tener que buscar ningun fallo de seguridad en el producto. Para muchos valdria pero como en SET somos pesados decidi continuar, mi idea era comprobar el nivel de seguridad del sistema de autenticacion en la creencia de que esta gente no podian haber dise~ado algo lo suficientemente seguro porque dudo que tengan experiencia en el area. Probe las mas habituales y manidas tecnicas de "SQL injection" ya que a fin de cuentas al final lo unico que tenemos es una consulta a una base de datos para validar el usuario. La tecnica de la comilla simple (') y del comentario (--) no da resultado, el programa dobla cualquier comilla simple. Necesitamos una innovacion. Y como soy asi de generoso y tuve exito os lo voy a poner facil mostrando mi proceso deductivo (aporreo de teclas) y tomandome por vosotros la molestia de recuperar el log de la maquina y emparejar cada peticion que hice con la consulta SQL que se genero, todo ello para vuestra mayor comodidad. De nada. Si intentamos dejar la password en blanco salta un popup informando que la password no puede estar vacia (comprobacion mediante Javascript). Probamos con un usuario ContentServer del que no sabemos la clave: FutureTense ContentServer An error occurred during processing. Check the info log. Unknown username/password. ContentServer Y en log del servidor de aplicaciones se refleja asi la peticion. CatalogManager Build 171 Date: Dec 20 2000 at 02:54:30 SELECT username,password,id,acl FROM SystemUsers WHERE username = 'ContentServer' AND password = 'xxxxxxxxxxx' SELECT username,password,id,acl FROM SystemUsers WHERE username = 'ContentServer' AND password = 'efeebd6b33987b0a70089b80e6' Hay una conversion de la password (de non-printable a printable) y resulto que ahi estaba mi nudo gordiano, sucedio cuando probe una password en blanco pero no vacia, una password consistente en un solo caracter. Un espacio. User: ContentServer Pass: (1 espacio) FutureTense ContentServer Welcome ContentServer Username/password validated. Cuando no mucho mas tarde pude observar el log localice mi entrada con regocijo, como vemos el "truco del espacio" convierte la peticion desde un "SELECT talytalytal de Usuarios cuando Usuario=xx AND pass=xx" a un "SELECT talytalytal de Usuarios cuando Usuario=xx" haciendo caer la clausula AND y por tanto eliminando la necesidad de entregar una contrase~a correcta. Un perrito piloto para el caballero y el "spacehack" XDD. CatalogManager Build 171 Date: Dec 20 2000 at 02:54:30 SELECT username,password,id,acl FROM SystemUsers WHERE username = 'ContentServer' AND password = 'b' SELECT username,password,id,acl FROM SystemUsers WHERE username = 'ContentServer' SELECT aclname,cataccess,description FROM SystemACL WHERE aclname IN ('SiteGod','Browser','ContentEditor','ElementEditor', 'PageEditor') Es suficiente?. Para muchos lo seria pero si en SET llevamos pegando la paliza tanto tiempo es por algo, supongamos que no se cual es el usuario. No todos los usuarios tienen porque haber puesto el sugerido "ContentServer" como no todos pusieron la sugerida clave "FutureTense". Entonces tenemos una situacion en la que no necesito clave pero no puedo entrar porque no tengo nombre de usuario con el que saltarme la validacion!! Y un nombre de usuario de OpenMarket no se saca de cualquier lado, mas bien solo de uno, de la base de datos donde esta la tabla SystemUsers. Interesante y frustrante a la vez, ahora la "clave" es el nombre de usuario. Es lo unico que protege a la interfaz de administracion de OPMK de mi reconocida ignorancia. Veamos que puedo hacer al respecto. Partiendo del desconocimiento absoluto de SQL cruza por mi mente la construcion "LIKE ...." como en "SELECT talytalytal FROM nosedonde WHERE algo LIKE 'otroalgo'". Y LIKE tiene comodines, de hecho solo me interesa uno de los comodines, el que equivale al socorrido * en el mundo del listado de ficheros, hablo del venerable % que hace match a cualquier cosa viviente. Aqui como pude comprobar la generosidad de los programadores de OPMK llego a su cumbre. User: % Pass: (1 espacio) Resultado? FutureTense ContentServer Welcome % Username/password validated. Esto comienza a ser impresionante, ahora resulta que no solo puedo saltarme la password sino que tambien puedo saltarme el nombre de usuario. Las dos cosas a la vez... asi que luego van en Retevision y se llevan un susto :-) Lo que ha pasado tambien queda reflejado en el log y no deja de ser curioso CatalogManager Build 171 Date: Dec 20 2000 at 02:54:30 SELECT username,password,id,acl FROM SystemUsers WHERE username LIKE '%' AND password = 'b' SELECT username,password,id,acl FROM SystemUsers WHERE username LIKE '%' SELECT aclname,cataccess,description FROM SystemACL WHERE aclname IN ('SiteGod','Browser','ContentEditor','ElementEditor', 'PageEditor') Como podeis ver, mi trabajo me costo, en el log al usar el comodin se ha a~adido el LIKE que no aparecia en la consulta anterior. Esto es una 'feature' que aplaudo como se merece y que deberia ser imitada universalmente. (Para cuando un AND password LIKE '%'??) -'_'- Tora, tora, tora -'_'- -------------------------- Una vez que estamos dentro, no vendria mal intentar describir en texto las opciones que nos ofrece la interfaz html. Esta dividida en dos frames, el izquierdo con las diferentes areas y el principal donde se nos muestran los formularios donde introducir datos, elegir opciones, pulsar botones, etc junto con el resultado de las acciones que elegimos. Todo bajo el sugerente titulo de: Content Server Management Tools En el frame izquierdo tenemos los siguientes destinos: Login/Logout No necesita mayor explicacion Site Un mismo OPMK puede gestionar varios sites Element Control de los elementos que forman la web Content Catalog Control del catalogo (Modify, Add, Mirror, Delete) Content Gestion de contenidos en diversos catalogos User Manejo de usuarios (Modify, Add, Delete) ACLs Manejo de ACLs (Modify, Add, Delete) Revision Tracking Para llevar la cuenta de versiones anteriores En cada uno de esos destinos y dependiendo del mismo tenemos una entrada de texto y varias acciones aplicables a la entrada que elijamos. Entre ellas: En Site [Modify Page, Add page, Modify Status, Modify ACLs, View Page Modify Page Cache, Delete Pages, Export Pages, Clear Page Cache] En Content | |- Enter Catalog Name: |- Enter Catalog Key: |- Enter Value for Key: Select Operation: Query for Content Add new Content Update Content Replace Content Delete Content En Element Management [Modify, Add, Upload File, Edit File, Delete] Como vemos se pueden subir ficheros, que no sabemos la ruta fisica?. Nada que no podamos solucionar recurriendo al SQL y la tecnica de la comilla simple. Que dije antes que no funcionaba?. Es verdad, pero es que eso es lo que necesitamos. Una tecnica que no funcione. ;-) Introducimos un query como : '; SELECT * FROM AssetMgt y el frame principal queda en blanco, ningun resultado. Ninguno?. Veamos el source de la pagina. Containing tag: TABLE-->
Otro problema resuelto. En Revision Tracking |- Enter Catalog Name: |- Enter value for key: Select Operation: Lock Commit Release Rollback History Track Catalogs Untrack Catalogs Set Catalog Revisions Delete Revisions Unlock Rows Las posibilidades como se puede ver son enormes, de hecho son las mismas posibilidades que tendrias si fueses el administrador. Oh!, ahora que caigo, lo eres. ;-D Una pagina web para comprobar la existencia de OPMK, se puede mejorar ;-) <++>opmk/test.html Content Server Quick Test

Bienvenido a un mini-hack de ContentServer
Page Name
Content Table
args 1
args 2

Page Name
<--> Y recordad, hagais lo que hagais. Tened cuidado ahi fuera. Paseante -'_'- Recursos -'_'- ------------------ OpenMarket: "Da place". Si andas vivo puedes coger cosas de interes. http://www.openmarket.com WebLogic: Un servidor de aplicaciones como cualquier otro. http://www.weblogic.com Iplanet: El servidor web preferido por la gente con dinero que malgastar. http://www.iplanet.com CounterPane: Secrets and Lies: Digital Security in a Networked World http://www.counterpane.com/sndl.htm SUN y JAVA: La combinacion que mas dinero hace ganar a los "consultores" http://java.sun.com Oracle: Si te vas a pelear con una base de datos, aprende con esta. http://www.oracle.com