Hackea a Elhacker.net ! [Finalizado - Ganador: yasión]

Iniciado por WHK, 23 Noviembre 2009, 09:06 AM

0 Miembros y 8 Visitantes están viendo este tema.

yasión

Buah! Estuve todo el día ocupado integrando... He tenido que parar porque me salia una idefinida por la oreja...xD Pues pego lo que envie a whk y si quedan dudas ya diréis:

Cita de: yasión en 28 Noviembre 2009, 03:01 AM
Explicación:

Pues después de pruebas por aquí y por allá, de intentar entender el código de smf, de probar más por aquí y por allá... Me he acordado de la prueba de sdc para poder formar parte del proyecto SimpleAudit, y he cogido el string "raro" y lo he ido reduciendo (por comodidad) hasta la forma más pequeña en que funciona www.a((((((((((((((.
No me he mirado bastante el código como para entender porqué sucede lo que sudece, pero resulta que al meterlo dentro de algunos tags, el parser de bcc se vuelve loco y en lugar de poner carácteres se carga 3. Lo que significa que si hacemos:
[u]www.a((((((((((((((([/u]

En lugar de devolver:
<span style="text-decoration: underline;">Cadena</span>

Pasa esto:
<span style="text-decoration: underline</span>

Y al no cerrarse las comillas dobles se descujeringa todo el foro. Y con esto he estado haciendo pruebas en mi perfil esta tarde...xD (me lo he pasado bomba). Después de la diversión me he puesto a tratar de sacar un XSS de allí, así que he andado probando con algunos vectores de navegadores antiguos... Algo así:
[u]www.a((((((((((((((([/u] ;xss:epresionje(alert(5))[u][/u]

Y aunque no me filtrará el epresionje (que lo hacía), no podía ver si resultaba porque con FF no tira. Así que he buscado un rato otros vectores desde style, y nada. Así que me he puesto a intentar meterle un evento a esas comillas dobles ya abiertas, pero primero tenía que cerrarlas... Y básicamente he andado probando y mezclando (que me ha costado lo suyo...:S), hasta que he encontrado las combinaciones buenas:
[quote]www.a((((((((((((((([/quote][url==a onEvent=alert() tr=][/url]
(es indiferente usar ftp, http...)

Y me ha salido un bonito XSS... Ahora falta pensar como hacerlo para ejecutarlo de la manera más fácil posible, y ver si es compatibile con otros navegadores. Que no tengo ni idea...

No sé si esa es la explicación que esperabáis...xD Pero no sé que más contar...

Saludos!


NOSCRIPT!!!


WHK

#221
Bueno veo que ya te citaste y no te vo por eso repetí lo mismo jajaja.

Ahora, de que se trata ese ))))))) ? no se los voy a explicar porque forma parte del reclutamiento de simpleaudit xDDDDDD pero a penas se haga la publicación de los bugs voy a hacer un esfuerzo mental para tratar de explicarlo xD

PD: si alguien quiere insertar textos con bbcode sin que se interpreten basta con tan solo encerrarlo con [nobbc][/nobbc]

Por ejemplo:
[quote]test[/quote]

El post que dices es este:
http://foro.elhacker.net/nivel_web/proyecto_de_auditoria_a_smf_20_laboratorio_de_bugsnivel_web-t271095.0.html;msg1341433#msg1341433

YST

#222
Cita de: Martin-Ph03n1X en 28 Noviembre 2009, 23:30 PM
yo sabia que YST la iva a cagar ya que el agarro mi msn y lo agrego al suyo no se conq ue fin pero desde hay me di cuenta del bug...

ehmmmm Ok .. :xD


Yo le enseñe a Kayser a usar objetos en ASM

seclogman

#223

Citarwww.a(((((((((((((((
[/center]








No funciona en todos los smf....





Martin-Ph03n1X

ese pinche perro a me castro con su ladrido hahaha
  No eres tu trabajo, no eres cuanto tienes en el banco, no eres el auto que conduces, ni el contenido en tu billetera, no eres tus malditos cakis, eres el bailarin cantante del mundo...!!!"

sirdarckcat

Les explicare porque este bug funciona... de una manera MUY SUPERFICIAL y tecnica.. parece que nadie termino entendiendo que paso y porque funciona xD asi que ahi va una brief explaination.

Pondre mas info en la wiki (y avisare cuando lo haga), pero mientras tanto..

Este NO ES EL UNICO bug de este tipo y estos problemas seguiran apareciendo no solo en SMF sino en todos lados que usen expresiones regulares en PHP con PREG con cosas tan sensibles como lo es parsear codigo que pasara a HTML.

Es una vulnerabilidad bastante complicada de entender... y cabe mencionar que por donde la veas es un dolor de cabeza.

Se llama ReDoS, (Regular Expression Denial of Service), fue presentada en Septiembre en OWASP 2009 - Israel.
http://www.checkmarx.com/NewsDetails.aspx?id=23

Basicamente la idea es abusar de la feature de backtracking de las expresiones regulares:
http://en.wikipedia.org/wiki/Backtracking

Voy a poner un ejemplo, la siguiente expresion regular:

([abc]+[def]|[cde]+[fgh])*i

lo que hace es buscar una cadena del tipo:
aaaadegafei
adadccfcfi
adi
cfi


Es muy facil generar ejemplos que funcionen con esta expresion regular, pueden probarlo en su navegador:
Citarjavascript:alert(/([abc]+[def]|[cde]+[fgh])*i/("adi"));

Ahora, el problema viene cuando una cadena NO coincide con dicha expresion regular como lo es:
adcd

el algoritmo en esos casos, cuando se da cuenta que la expresion regular no coincide, debe regresar a la ultima posicion que matcheo correctamente (recursivamente) y probar con la otra opcion (si es que hay).

es decir:
/([abc]+[def]|[cde]+[fgh])*i/("adcd") hace:
1.- a (coincide con primer caracter de primer grupo)
2.- d (coincide con segundo caracter de primer grupo)
-- entrando en repeticion -- *
3.- c (coincide con primer caracter de primer grupo)
4.- d (coincide con segundo caracter de primer grupo)
5.- [fin] (no coindide!! necesitamos una i, regresa a 4)
4.- (no hay mas opciones! regresa a 3)
3.- c (coincide con primer caracter de segundo grupo)
4.- d (no coincide!! regresa a 3)
3.- (no hay mas opciones! regresa a 2)
2.- (no hay mas opciones! regresa a 1)
1.- (no hay mas opciones! regresa a 0)
no hay 0, no hay match.

ahora, asi es como funciona un engine de expresiones regulares.. y si vemos esta expresion regular en especifico, podemos ver que hay un problema.
([abc]+[def]|[cde]+[fgh])

los strings:
cf
ccccccccccf
cfcf
cccf

etc..

coinciden con ambos grupos ([abc]+[def] y [cde]+[fgh]), ahora porque esto es relevante?

porque el siguiente string:
cfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfQ

no va a matchear, pero el parser tiene que probar todas las opciones posibles para estar seguro.

1.- c (coincide con primer caracter de primer grupo)
2.- f (coincide con segundo caracter de primer grupo)
-- entrando en repeticion -- *
3.- c (coincide con primer caracter de primer grupo)
4.- f (coincide con segundo caracter de primer grupo)
-- repeticion --
5.- c (coincide con primer caracter de primer grupo)
6.- f (coincide con segundo caracter de primer grupo)
-- repeticion --
etc..
--repeticion--
50.- c (coincide con primer caracter de primer grupo)
51.- f (coincide con segundo caracter de primer grupo)
52.- Q (no coincide, regresa a 51)
51.- (no hay mas opciones, regresa a 50)
50.- c (coincide con primer caracter se segundo grupo)
51.- f (coincide con segundo caracter de segundo grupo)
52.- Q (no coincide, regresa a 51)
51.- (no hay mas opciones, regresa a 50)
50.- (no hay mas opciones, regresa a 49)
49.- (no hay mas opciones, regresa a 48)
48.- c (coincide con primer caracter de segundo grupo)
49.- f (coincide con segundo caracter de segundo grupo)
50.- c (coincide con primer caracter de primer grupo)
51.- f (coincide con segundo caracter de primer grupo)
52.- Q (no coincide, regresa a 51)
51.- (no hay mas opciones, regresa a 50)
50.- c (coincide con primer caracter se segundo grupo)
51.- f (coincide con segundo caracter de segundo grupo)
52.- Q (no coincide, regresa a 51)
51.- (no hay mas opciones, regresa a 50)
50.- (no hay mas opciones, regresa a 49)
49.- (no hay mas opciones, regresa a 48)
48.- (no hay mas opciones, regresa a 47)
...
etc..

como ven, el hecho de que cf coincidiera en 2 grupos, hizo que el engine repitiera la comparacion en 50 y 51, y luego, en 48 y 49.. lo que hizo que 50 y 51 se repitieran de nuevo.

Ahora, esto hace que 50 y 51 se re-prueben 2 VECES cada que 48 matchee, y 48 va a re-probarse 2 VECES cada que 46 matchee (aqui van 2*2 = 4 veces paraa 50/51), y 46 se re-probara 2 VECES cada que 44 matchee, lo que hace 50 (2*2*2), etc..

eso se repite 25 veces:
2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2=16,777,216

ahora, esto es nadamas la cantidad de veces que matcheara 50/51, ahora hay que sumar la cantidad de veces que matcheara 48/49
2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2*2=8,388,608

etc.... esto es a lo que en algoritmia se le llama un problema de complejidad exponencial, y hace que sea bastante tardado de resolver.

ahora, aqui estamos explotando un bug en una expresion regular que trata de detectar URLs... www.a((((((((((((((((((((((((((((((((((((((((((((.

donde "(" toma el papel de "cf" en nuestro ejemplo anterior.

en PHP, PREG va a suspender la ejecucion despues de N iteraciones y alterara la memoria donde esta almacenada la variable de tal forma, que se borraran los ultimos 3 bytes dentro de esta.

Esto tiene repercusiones bastante malas a largo plazo, como lo podemos ver, y se debe tener mucho cuidado...

Recomendaciones.. lean el PDF, y aprendan a detectar ReDoS y evitenlas en su codigo!

Saludos!!

Skeletron

#226
Y como supiste que era ESA la cadena "rara".. porque, las probabilidades de que CUALQUEIR OTRA sea la cadena rara, son: INFINITAS..
Como has descubierto que era esa la cadena que jsuto daba ese error extraño?

Esto lo coloque antes de que Sirdarckcat coloque todo eso..


MonzterKuki.

Es Mejor Ser querido que temido.

seclogman

Repito


lo he probado en algunos smf de la misma version, y en algunos no ha funcionado. ¿ a que puede ser debido ?


PD: maravillosa explicacion sdc

saludos!!