TOP

Ataques DDoS a Moodle

Muchos de los que estáis leyendo esta entrada probablemente conozcáis la plataforma de aprendizaje Moodle.

Pues bien, leyendo blogs de seguridad informática (enelpc.com ) me encontré varias entradas en las que se comentan y analizan fallas que tiene moodle, vulnerables a ataques DDoS.
Una de ellas se centra en un archivo php accesible a todo el mundo, que se encarga de realizar tareas de mantenimiento que consumen más ram que cualquier petición que suele hacer un usuario normal. Este mantenimiento se hace cada 24 h. (En algunos no se ha ejecutado en la vida, me imagino que se configurará desde el moodle).

¿Pero y si hacemos que se ejecute cron.php cada x segundos? Pues que podemos llegar a tumbar el servidor. 
Este archivo se encuentra en "/moodle/admin/cron.php" , esta vulnerabilidad la descubrió el autor del blog enelpc.com  en el 2010, pero mi sorpresa es que no hay que ir muy lejos para encontrar un moodle que te permita acceder a "cron".
Aquí tenéis un programa escrito en C y en Python con su código de fuente hechos por usuarios de seginformatica.net por si los queréis probar o editar :
- Moodle Sleep (En C) Windows
- Moodle Sleep (En Python)

EDITO: No entrar en seginformatica.net, la página ya no existe y redirige paginas que podrían ser peligrosas. 

Otra falla  que permite hacer ataques DDoS y además automatizados sin necesidad de un programa externo es la siguiente:
El fallo se encuentra en el algoritmo de actualización de las ventanas del chat de moodle. La dirección de refresco es la siguiente:
http://dominio.com/moodle/message/refresh.php?id=1&name=pepe&wait=1
El refresco lo hace de la siguiente manera: espera los segundos que hay después de wait=, multiplica el numero por 1.2 y si el resultado sale con decimales lo redondea al alta, y espera esos segundos.
• Ejemplo:

&wait=1,          
 1*1.2=1.2-->2
&wait=2           
2*1.2=2.4-->3 
&wait=3           
3*1.2=3.6-->4 
...                      
&wait=6           
6*1.2=7.2-->8 

 &wait=3, &wait=4, &wait=5, &wait=6, &wait=8, &wait=10, &wait=12, &wait=15, &wait=18......

Vemos que cada vez hay que esperar más segundos.

• Pero ¿Que pasaría si nosotros en wait pusiésemos un 0?
0*1.2=0---> 0
0*1.2=0---> 0
...................... 
Luego entraríamos en un bucle infinito al entrar en : /moodle/message/refresh.php?id=1&name=pepe&wait=0
Y lo peor, generaríamos tal cantidad de peticiones en milésimas de segundo que acabaríamos colapsando el servidor.
Nota: Para poder ejecutar el refresco habría que tener una sesión iniciada en moodle.

Todas las fallas que he comentado se podrían solucionar: la primera falla bloqueando el acceso a este archivo cron.php (creo que el mismo moodle te da la opción de restringir el acceso) y la segunda falla editando el refresh.php con una simple sentencia condicional se evitaria que wait fuera 0.

¡Un Saludo!