Session Fixation with PHP

Hace unos días asistí a un evento de OWASP,  donde se daban cuatro charlas de seguridad web. Una de ellas, realizada por Raúl Siles de Taddong, trataba el concepto de `Session Fixation´. Como hacía unos días que un amigo me había animado a revisar el código de EyeOS, intenté jugar con lo aprendido en la charla.

La vulnerabilidad localizada no es crítica ya que requiere de otra vulnerabilidad para fijar la cookie, y ya ha sido corregida en la última versión. La seguridad en un sistema no es más que el número de capas eficientes en cada proceso interno del software, y en este caso, había más protecciones en el proceso afectado. Lamentablemente, no sólo EyeOS fue/es vulnerable. Raúl Siles encontró vulnerabilidades en SAP, Joomla y otros sistemas, alertando que todavía más páginas están afectadas aún siendo una vulnerabilidad del año 2002.

El objetivo de esta entrada es analizar Session Fixation y cómo hay que tratarlo en PHP correctamente.

How to find a session fixation

Para localizar esta vulnerabilidad basta con observar que la cookie de session (por defecto PHPSESSID) no cambia aunque se loguee, se desloguee, se vuelva a loguear, etc. Lo que cambia son los valores internos, pero no el identificador.

El código fuente normalmente usa la función session_destroy(); pensando que es suficiente para regenerar la cookie, pero esa no es su función.

How to exploit a session fixation

Normalmente será necesario tener un `Cross-Site Scripting´ (XSS) o otra vulnerabilidad (\r\n) para inyectar el código malicioso. El proceso es asignar una session que se conozca y cambiar la fecha/dominio de la cookie para que nunca expire, es decir, que sea permanente (a diferencia de las cookies que expiran al cerrar el navegador). Esto se puede conseguir de diferentes maneras. Una de muy elegante es introducir por XSS el siguiente código:

<meta http-equiv=”Set-Cookie” content=”value=n;expires=date; path=url”>

Hay que jugar con la fecha de expiración y la ruta entre subdominios para obtener el impacto deseado, pero en cada web será diferente.

How to sanitize a session fixation

La función session_destroy(); hace lo mismo que poner a 0 el contenido del fichero que genera en la ruta de sessiones ( “/tmp” por defecto en entornos GNU/Linux). Por lo tanto, la función que hay que utilizar es session_regenerate_id(true); que no borra la session, pero que cambia el identificador, borrando el fichero de la antigua session, ayudando a controlar los ficheros residuales.

PHP facilita el trabajo de las sessiones, comprobando que el nombre de estas no contiene caracteres especiales (valid characters are a-z, A-Z, 0-9 and ‘-,’) y su longitud (cread una carpeta con nombre muy largo e insertaros una cookie de 128 caracteres (el máximo). Saldrá un error y no dejará continuar), pero hay que saberlas configurar.

How to steal sessions

Uno de los errores que ha crecido más en la lista OWASP es el `A6: Security Misconfiguration´. Los administradores de sistema están pensando que los software precocionados están preparados para instalarse y olvidarse. Pues no, empezando por PHP, MySQL, Apache, y cualquier otro que sirva de base para aplicaciones como Joomla, Drupal, etc.

Como se comentó, las sessiones suelen almacenarse en “/tmp” por defecto. Si se esta en un servidor compartido (vhost) lo más normal es que todos tengan acceso a esa partición, pudiendo leer las sessiones de los usuarios ya logueados. Creo que no hace falta comentarlo, pero robar la session es tan preocupante como que se roben los usuarios y las contraseñas. Al final la session es la manera de saber que tiempo atrás hubo una autentificación satisfactoria.

How to maximize the security

Hay dos consejos que considero adecuados aplicarlos:

1) Usar session_regenerate_id(true); en cada petición del usuario al servidor. Esto evitaría ataques `Cross-site request forgery´ (CSRF) tal como comentaba Raúl Siles. EyeOS no era vulnerable porque utilizaban un token interno por ellos que iba cambiando dependiendo del proceso y más variables, pero la session seguía en un nivel inferior.

2) Utilizar la función session_save_path(‘/path’); y session_cache_expire(); para asegurarse del directorio donde las cookies se guardan (OJO: es importante asignar los permisos correctos a esta ruta o sino el problema será el mismo) y reasignar el tiempo de expiración de la cache (defecto es 180) dependiendo de la aplicación.

Conclusions

He tratado el tema bastante por encima. En Taddong hay información muy buena del proceso completo para su detección y explotación. Aunque me haya centrado en PHP, la lógica se aplica a cualquier otro sistema: Si no se regenera la id, el sistema puede verse vulnerado. ¡session_Id con cuidado!

Session Fixation with PHP

How to do a presentation with Teensy

Note: I do not care if you want to share or translate the document, but please, quote me ;) . Thanks!

Brief

I am going to tell you how to do a presentation with Teensy, a USB development board that let automatize keystrokes and mouse movements. There are a lot of tools for doing presentations, like Beamer (LaTeX), MS PowerPoint, LibreOffice Presentation, Prezi, … but I wanted to expose a bit more creative.

What do you need?

This is the toolkit we need:

As you can see, the most important thing is the Teensy board, that you will have to buy it in the official webpage. The other things are just to do it better. But we need some software tools too. I will be using the Teensy Loader Application and the Teensyduino IDE. (I am sorry but I cannot explain here all that you need to configure it. You can find all the instructions in the links. It is easy.)

How to do it

Well, Teensy does it a bit hard when you do not have a U.S. keyboard, so you will be have to write less code if you have this keyboard. I will send any special key with a ALT+XX combination (lol, yeah).

I will paste a code to print some lines and you will understand what is the idea:

#include <usb_private.h>

void setup() { }

void loop() {

// Hold until the keyboard is initiallized
while(Keyboard.isInit()){
Keyboard.set_key1(KEY_NUM_LOCK);
Keyboard.send_now();
delay(500);
}

// We open the notepad ( Gui + R -> notepad -> enter )
Keyboard.set_modifier(MODIFIERKEY_GUI);
Keyboard.set_key1(KEY_R);
Keyboard.send_now();
sendNull();
delay(1000);

Keyboard.print("notepad");
enter();

// maximize window ( Alt + Space -> x )
Keyboard.set_modifier(MODIFIERKEY_ALT);
Keyboard.set_key1(KEY_SPACE);
Keyboard.send_now();
sendNull();
delay(200);

Keyboard.set_key1(KEY_X);
Keyboard.send_now();
sendNull();
delay(200);

// we change the font-size ( Alt + o -> f -> Alt + m -> "50" -> Enter )
Keyboard.set_modifier(MODIFIERKEY_ALT);
Keyboard.set_key1(KEY_O);
Keyboard.send_now();
sendNull();
delay(200);

Keyboard.set_key1(KEY_F);
Keyboard.send_now();
sendNull();
delay(200);

Keyboard.set_modifier(MODIFIERKEY_ALT);
Keyboard.set_key1(KEY_M);
Keyboard.send_now();
sendNull();
delay(200);

Keyboard.print("50");
enter();

// here starts the presentation

Keyboard.print("I am Martes13");
enter();

numCapsOn();
while (isNumCapsOn());

Keyboard.print("and this presentation is quite simple");
enter();

numCapsOn();
while (isNumCapsOn());

Keyboard.print("isnt it");

// We need to send the character "?" . It is ALT+63

Keyboard.set_modifier(MODIFIERKEY_ALT);
Keyboard.set_key1(KEYPAD_6);
Keyboard.send_now();
Keyboard.set_key1(KEYPAD_3);
Keyboard.send_now();
sendNull();

enter();

while(true);
}

// Release the key
void sendNull() {
Keyboard.set_modifier(0);
Keyboard.set_key1(0);
Keyboard.send_now();
}

// Sends the Enter key
void enter() {
delay(200);
Keyboard.set_key1(KEY_ENTER);
Keyboard.send_now();
sendNull();
delay(200);
}

// Checks if the NUM is on
bool isNumLockOn() {
return bitRead(int(keyboard_leds), 0);
}

// Checks if the CAPS is on
bool isCapsLockOn() {
return bitRead(int(keyboard_leds), 1);
}

// Sends the CAPS LOCK key
void putCapsLockOn() {
Keyboard.set_key1(KEY_CAPS_LOCK);
Keyboard.send_now();
delay(1000);
}

Ok, there are some important things to tell:

– This is a simple example. You can do WHATEVER you could do with a KEYBOARD and a MOUSE. It is really useful if you want to do a live presentation through some different applications. From now, you cannot have an excuse to say “I tested in home and it worked”. Noo.

How to stop the presentation is the most important detail. I am using the CAPS LOCK KEY. When I want to code it, I have to activate the key and wait ( while (isNumCapsOn()); ) until the user deactivates it. It is the WHY of the Bluetooth keyboard ;).

– You can forget the last line (how to stop it) and do it ALL with a delay(-(int)time-); function, but if you have any problem and it goes too fast I hope you will have an alternative presentation.

It is only an introduction to this kind of live-awesome presentations, but you will have spend quite time coding it. It should be nice to have a good library… but it does not exist yet.

Greets!

and if you have any question, contact me, of course!!

Note: If you see any spell mistakes, you can say me it. I would appreciate it ;) . Thanks!

How to do a presentation with Teensy

DoS en Gmail Motion BETA

Note: I do not care if you want to share or translate the document, but please, quote me ;) . Thanks!

Resumen

Gmail ha sacado su nuevo servicio llamado Gmail Motion, todavía en estado Beta. Se basa en, a través de la cámara web, leer gestos y hacer acciones que representan. Este servicio puede verse alterado, e incluso provocar una denegación de servicio (DoS) tanto en el servidor como en el cliente si alguien aparece por detrás haciendo nuevos gestos.

Angulo de visión de la webcam

El enfoque de la webcam son 50º en vertical y 34º en horizontal, permitiendo el cuerpo de más de una persona a la vez. Dado que el sistema todavía esta en Beta, se guia por los colores de la pies, las siluetas y la profundidad por los tonos negros, sin contemplar el número de extremidades que aparecen.

Esto implica una fácil suplantación del individuo añadiendo otra persona dentro del marco procesado.

Denegación de servicio

Se ha comprobado que si el programa esta en marcha y se incorpora una nueva persona realizando otro gesto supuestamente reconocido, el programa bloquea ipso-facto el ordenador con el que se trabaja. Se rumorea que el servicio de Gmail Motion empieza a ir más y más lento de manera general, pero gracias a su sistema SMTML (si-me-tiras-me-levanto) de momento no ha causado grandes estragos. Se recuerda que el sistema sigue en Beta, aunque no será fácil reparar este error.

Gmail Motion DoS
Example of the Gmail Motion DoS

Esto implica que hay que cerrar bien la puerta de la habitación antes de comenzar a utilizar el servicio. Desde Google desaconsejan activarlo si se tienen hermanos pequeños.

Otros problemas

Se dice que si se pone una hoja en negro que ocupe todo el enfoque de la webcam el sistema te autobloquea la cuenta de Gmail automáticamente. Yo paso de probarlo, que no tengo tanta tinta para imprimirmela, pero os dejo una de muestra por si queréis testearlo.

april_fools


DoS en Gmail Motion BETA