Mostrando entradas con la etiqueta Firesheep Linux. Mostrar todas las entradas
Mostrando entradas con la etiqueta Firesheep Linux. Mostrar todas las entradas

15 de mayo de 2011

FireSheep vs FireSheperd

FireSheperd es un programa que se supone que "mata" los FireSheeps que se encuentren capturando credenciales en nuestro segmento de red.

De su autor, "FireShepherd, a small console program that floods the nearby wireless network with packets designed to turn off FireSheep, effectively shutting down nearby FireSheep programs every 0.5 sec or so, making you and the people around you secure from most people using FireSheep."

La herramienta puede ser descargada desde http://notendur.hi.is/~gas15/FireShepherd/FireShepherd.cpp.

Cabe decir que esta aplicación está pensada para funcionar bajo windows :-S.

Si echamos un ojo al código de FireSheperd.cpp, en la funcion "int requester()", a partir de la linea 97 se puede observar lo siguiente:


97 request+="GET /packetSniffingKillsKittens HTTP/1.1\r\n";
98 request+="Host: www.facebook.com\r\n";
99 request+="User-Agent: Mozilla\r\n";
100 request+="Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
101 request+="Accept-Language: is,en;q=0.7,en-us;q=0.3\r\n";
102 request+="Accept-Encoding: gzip,deflate\r\n";
103 request+="Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
104 request+="Keep-Alive: 115\r\n";
105 request+="Connection: keep-alive\r\n";
106 request+="Referer: http://www.facebook.com/\r\n";
107 request+="Cookie: lsd=spsse; c_user=666660000; sct=01010101; sid=0; xs=3randomhashyes666666666; asdf=??????????????!!!!!!!!!!!!!!!!!!!!%<95>e<9d>ë^QÒ<88>Y¼¥­Á<8f>øþh¡ F4£A<80> º¦^WSÍÂÝåt¹Òv5þhè<9f>Ë&%^V%¥Ô^R^K$FsnÄ<8b>x^QÏÏvVfi6<83>^PÊìÈ^W_7νçÜ^[Q^?lXË^[Fÿë~~½¹ùÉ^KÛ,÷7¬ù^Oü^?yóÇ^[^^>hº^__o<9a><9f>¿ÄGÜ5¼yy{ÃZÆ|øË,þÊ<9d>j^Uo¬´­W¢y¹¹y5ù|Êmk¤ P<93>Ãt¦[%´Ô<93>û)7­°f²<9b>ÎDk¹0vò<80>_yk^YW<93>ÛÝ=þ<8b>ËV^[©&«þ×åtf^Xç­ðÔS{/Z9Yà^Cé½n­<9d>lãï¬ÅÇÛåô^O/^?u#8<93>´Ã<97>¯±<9a>ÿìÇúyøëO^<88>n73®¥<93><8d>Ð<8a>·LÄÏ^?1MKºGGÖ: Íìd3 MÇiñ_õ{[Ïs§<87>0^EgÂë´ <9e>»°n~)ºù<85>áF7ÂKÙzG_O~9}ùöÆ1XÓ<99>4ÀwSA»Ó<Ø®ûu<85>ß<93><99>×SÕ2ã^Y<9f>,¦®åÒ11ÙçN<87>Ý|<97>×ÿI·^DÍâ^R<9c>a<98><8a>Ã^FÞg^Ct^]çÓ´Áeþm?å¢^U0Éb:K<93>^ ^RÛv:KÓ¯º£øìåÍïoð¡nþtÃ-Ó<80>@c^Ló­tͦo±^Z^V^PÍúæó³^PL+><85> 5-^N ÃÒX&bð³l<88>[ $¯DZ^BJ\r\n\r\n";
108 request+="\r\n";

Podemos ver el código de la petición que Firesheep se quede colgado justo en la línea 107. El payload esta justo en al parámetro asdf=????????!!!!!!!!!... de dicha petición.

Ya que el entorno de desarrollo que yo uso suele ser Linux, lo primero que voy a hacer es portar esta aplicación a Linux.

Podéis descargar el código de Firesheperd-Linux desde aquí: http://pastebin.com/YXtmV4ny

Para realizar la prueba, pasamos a ejecutar el backend de Firesheep con los parametros y 'tcp port 80' al mismo tiempo que ejecutamos el binario de FireSheperd.

Aquí podemos ver cómo funcionan a la vez:



Para saber que es lo que esta pasando, usaremos nuestro querido Wireshark.



Si exportamos los bytes del payload con Wireshark, veremos cual es la petición que realiza. Aquí podemos ver el payload con hexer:



Tras un rato flodeando la red con el payload que envía FireSheperd, podemos comprobar como efectivamente causa un error en FireBird.




Tras comprobar como FireSheperd puede hacer que un proceso FireBird pare de capturar credenciales, es necesario que saquemos algunas conclusiones.

En primer lugar, basta con reiniciar el proceso de FireSheep para continuar esnifando; esto se puede automatizar, lo que daría lugar a un juego del gato y el raton entre FireSheep y FireSheperd.

En segundo lugar, no es una buena idea floodear la red con peticiones HTTP falsas, ya que puedes sobrecargar el router, el servidor web destino, o incluso hacer saltar algún IDS que haya por el camino. El punto de inflexión que proporciona FireSheperd se basa en para FireSheep, ya que si esto no sucede (o mientras esta teniendo lugar, ya que el ataque tarda unos segundos), Firesheep sera capaz de detectar todas las peticiones de FireSheper y las LEGITIMAS TAMBIÉN.

Existen otras alternativas para proteger de Firesheep, como usar VPN, HTTPS-everywhere, la extension force-tls, Blacksheep o reglas para el IDS Bro


Como ultimo punto, dejo una pregunta en el aire: cual es realmente la causa por la cual el payload cause el "JSON error" de FireSheep? Que error de FireSheep permite que FireSheperd funcione? Quizá responderemos a todo en el siguiente post.

24 de abril de 2011

Firesheep bajo Linux

Mucho se ha hablado de Firesheep, esa pequeña extension de Firefox que nos permite capturar las sesiones HTTP que estén presentes en nuestro mismo dominio de colisión.
Cierto es que este tipo de ataques se conocen desde hace bastante tiempo, como se puede ver en http://www.defcon.org/images/defcon-16/dc16-presentations/defcon-16-perry.pdf

En este artículo no se va a tratar de aspectos técnicos de la implementación de Firesheep, ni de session sidejacking, eso lo haremos en artículos posteriores.
Por ahora, nos vamos a concentrar en la compilación y ejecución de Firesheep sobre Linux.

El código de Firesheep está disponible en https://github.com/codebutler/firesheep
La extensión está programada en C++ y JavaScript usando como backend de captura las libpcap (winpcap en el caso de Windows).

En principio, esta extensión estaba disponible sólo para Windows y MAC, pero el 5 de Noviembre de 2010 se realizó el commit con el código de Linux como se puede ver aquí https://github.com/codebutler/firesheep/commit/f6ced0af100df60d472f760bc9b47fa05f4ebfb1

Si nos fijamos en los comentarios de los commits, podemos leer:

* Added linux support using Michajlo Matijkiw's work with various fixes
* Needs policykit installed (no need to manualy set permissions on backend)

Para bajar y compilar Firesheep, usamos git & autotools:


git clone git://github.com/mickflemm/firesheep.git
cd firesheep
git submodule update --init
./autogen.sh --with-xulrunner-sdk=/usr/lib/xulrunner-devel-1.9.2.13
make
firefox build/firesheep.xpi
cd ~/.mozilla/firefox/iquftp6a.default/extensions/firesheep@codebutler.com/platform/Linux_x86_64-gcc3sudo
./firesheep-backend --fix-permissions
airmon-ng wlan0 start


Como se puede intuir, Firesheep usa un binario de backend, el cual le hace de interfaz con las libpcap y los dispositivos de captura de la máquina. Este binario se suele encontrar en ~/.mozilla/firefox/xxxXXXxXX.default/extensions/firesheep@codebutler.com/platform/Linux_x86_64-gcc3/firesheep-backend en las máquinas de 64bits una vez instalada la extensión en el navegador Firefox.


usuario@studio:~/.mozilla/firefox/asddas.default/extensions/firesheep@codebutler.com/platform/Linux_x86_64-gcc3$ ./firesheep-backend --help
Syntax: ./firesheep-backend <iface> <capture filter>


Si miramos el código que procesa los *argv[] del backend en backend/src/main.cpp, allí podemos ver los parámetros que le podemos pasar al binario, justo a partir de la línea 52:


53 if (argc > 1) {
54 if (argv[1] == string("--fix-permissions")) {
55 if (platform.is_root()) {
56 if (platform.check_permissions()) {
57 /* Nothing to do */
58 return EXIT_SUCCESS;
59 } else {
60 platform.fix_permissions();
61 return EXIT_SUCCESS;
62 }
63 } else {
64 bool success = platform.run_privileged();
65 return (success) ? EXIT_SUCCESS : EXIT_FAILURE;
66 }
67 } else if (argv[1] == string("--list-interfaces")) {
68 list_interfaces(&platform);
69 return EXIT_SUCCESS;
70 }
71 }
72
73 if (!platform.is_root()) {
74 cerr << "Run --fix-permissions first." << endl;
75 return EXIT_FAILURE;
76 }
77
78 if (argc < 3) {
79 cerr << "Syntax: " << argv[0] << " <iface> <capture filter>" << endl;
80 return EXIT_FAILURE;
81 }


Tras ver el código, comprobamos que las opciones que podemos usar son: --fix-permissions --list-interfacesy los parámetros son los necesarios para que el backend haga su tarea.Si observamos las líneas 73 a 76 del archivo main.cpp, podemos ver cómo es necesario ejecutar --fix-permissions:


73 if (!platform.is_root()) {
74 cerr << "Run --fix-permissions first." << endl;
75 return EXIT_FAILURE;
76 }


Vamos a probar si Firesheep detecta bien las interfaces de nuestra máquina. Para esto, usamos la opción --list-interfaces del backend:


firesheep-backend --list-interfacesterminate called after throwing an instance of 'std::runtime_error'
what(): libhal_device_get_property_string failed: org.freedesktop.Hal.NoSuchProperty
No property info.vendor on device with id /org/freedesktop/Hal/devices/net_0a_00_27_00_00_00
Abortado


Uf, parece que ha petado bien! Si nos fijamos en el error que nos da, dice que lo que ha fallado ha sido justamente libhal_device_get_property_string. Vamos a buscar ese método get en el código del backend del Firesheep:


usuario@studio:~/firesheep/backend/src$ grep -n libhal_device_get_property_string *
linux_platform.cpp:44: char *buf = libhal_device_get_property_string(context, device.c_str(), key.c_str(), error);
linux_platform.cpp:46: runtime_error ex(str(format("libhal_device_get_property_string failed: %s %s") % error->name % error->message));
usuario@studio:~/firesheep/backend/src$


Vemos que en el archivo linux_platform.cpp hay coincidencias, así que le echamos un vistazo:


41
42 string device_get_property_string(LibHalContext *context, string device, string key, DBusError *error)
43 {
44 char *buf = libhal_device_get_property_string(context, device.c_str(), key.c_str(), error);
45 if (dbus_error_is_set(error)) {
46 runtime_error ex(str(format("libhal_device_get_property_string failed: %s %s") % error->name % error->message));
47 dbus_error_free(error);
48 throw ex;
49 }
50 return string(buf);
51 }


Éste es el código que lanza el error, justo en la línea 46.Como esto no nos aclara mucho, vamos a buscar el string device_get_property_string en el código del backend, a ver si encontramos algo más interesante:


usuario@studio:~/firesheep/backend/src$ grep device_get_property_string *
linux_platform.cpp:string device_get_property_string(LibHalContext *context, string device, string key, DBusError *error)
linux_platform.cpp: char *buf = libhal_device_get_property_string(context, device.c_str(), key.c_str(), error);
linux_platform.cpp: runtime_error ex(str(format("libhal_device_get_property_string failed: %s %s") % error->name % error->message));
linux_platform.cpp: string iface = device_get_property_string(context, devices[i], "net.interface", &error);
linux_platform.cpp: string category = device_get_property_string(context, devices[i], "info.category", &error);
linux_platform.cpp: string parent = device_get_property_string(context, device, "net.originating_device", &error);
linux_platform.cpp: string parent_subsystem = device_get_property_string(context, parent, "info.subsystem", &error);
linux_platform.cpp: parent = device_get_property_string(context, parent, "info.parent", &error);
linux_platform.cpp: string vendor = device_get_property_string(context, parent, "info.vendor", &error);
linux_platform.cpp: string product = device_get_property_string(context, parent, "info.product", &error);
usuario@studio:~/firesheep/backend/src$


Bingo! Editamos el archivo linux_platform.cpp a partir de la línea 123. Ahí comentamos las dos llamadas a device_get_property_string que son las que fallan, y ponemos las string vendor y product que nosotros queramos:


121 /* Get device properties */
122
123 //string vendor = device_get_property_string(context, parent, "info.vendor", &error);
124 //string product = device_get_property_string(context, parent, "info.product", &error);
125 string vendor = "Surmano Fumano";
126 string product = "FireDev";
127 string description(str(format("%s %s") % vendor % product));


Por último, recompilamos e instalamos de nuevo la extensión.Perfecto! Podemos ver en las opciones de interface de Firesheep, cómo las interfaces aparecen con el vendor y product que hemos harcodeado en el archivo linux_platform.cppYa no falla Firesheep al ejecutarse y podemos usarlo justo para lo que fue creado: hacer sidejacking