8.12.13

Movistar almacena de forma insegura las contraseñas de sus usuarios

Adquiri una linea de Movistar para probar el servicio de 3G y, ya que estaba, queria ver que gestiones podia realizar desde su sitio web.

Para empezar, en el formulario de registracion, el link a los Terminos y Condiciones no funcionaba:





Una vez completado el formulario de registro, se envia un e-mail a nuestra casilla de correo y me parecio muy sospechoso que el password de mi cuenta estaba incluido en el e-mail.


Fui a la pagina de "Actualizar perfil" y me encuentro con los campos de contraseña completos:


Al inspeccionar esos elementos del formulario, confirmo mis sospechas: mi contraseña esta siendo almacenada en texto plano.

<input type="password" maxlength="32" size="43" value="a123456" onblur="checkPasswordStrength(formObject['password'].value);" name="password" id="password">

Almacenar las contraseñas en texto plano es una pesima practica de seguridad, casi una mala palabra en el ambiente. Como alternativa a esta mala practica, se suelen cifrar o usar hashes para almacenarlas: haciendo esto se evitaria, en caso de que la base de datos de Movistar sea comprometida, que las contraseñas de los usuarios puedan obtenerse de forma trivial.

El blog de Mozilla tiene un articulo interesante sobre el tema: Let’s talk about password storage

19.11.12

Ver infomacion de un paquete en Ubuntu/Debian (apt)

Para mostrar informacion sobre un paquete del sistema "apt" que utilizan distribuciones como Ubuntu o Debian podemos ejecutar el comando 'apt-cache show [paquete]' de la siguiente manera:
$ sudo apt-cache show python-django
En el ejemplo anterior el paquete del cual queriamos informacion era python-django y nos devolvio algo asi:
Package: python-django
Priority: optional
Section: python
Installed-Size: 35800
Maintainer: Ubuntu Developers 
Original-Maintainer: Chris Lamb 
Architecture: all
Version: 1.3.1-4ubuntu1.3
Depends: python2.7, python (>= 2.7.1-0ubuntu2), python (<< 2.8)
Recommends: libjs-jquery
Suggests: python-psycopg2, python-psycopg, python-mysqldb, python-flup, python-sqlite, python-yaml, geoip-database-contrib
Filename: pool/main/p/python-django/python-django_1.3.1-4ubuntu1.3_all.deb
Size: 4270360
MD5sum: b33afef564434b353b10ce6ebf9feb46
SHA1: 9a04253cffe0d1c86fe9b99aedd3957d71daad42
SHA256: 971463c4edc8785794ca3eb937a0c9029d83e039beea0127b493178f0d21c329
Description-en: High-level Python web development framework
 Django is a high-level web application framework that loosely follows the
 model-view-controller design pattern.
 .
 Python's equivalent to Ruby on Rails, Django lets you build complex
 data-driven websites quickly and easily - Django focuses on automating as much
 as possible and adhering to the "Don't Repeat Yourself" (DRY) principle.
 .
 Django additionally emphasizes reusability and "pluggability" of components;
 many generic third-party "applications" are available to enhance projects or
 to simply to reduce development time even further.
 .
 Notable features include:
  * An object-relational mapper (ORM)
  * Automatic admin interface
  * Elegant URL dispatcher
  * Form serialization and validation system
  * Templating system
  * Lightweight, standalone web server for development and testing
  * Internationalization support
  * Testing framework and client
Homepage: http://www.djangoproject.com/
Description-md5: efe2f6ec2ae89851c710c280956fa785
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Origin: Ubuntu
Supported: 5y

18.11.12

GIT con colores desde la terminal

Para tener unos lindos colores en GIT en nuestra consola, tenemos que ejecutar el siguiente comando:

$ git config --global --add color.ui true

Ahora, cuando hagamos un diff, status y demas, vamos a tener coloreado en verde/rojo el output de GIT!

Por ejemplo, un diff:

$ git diff
diff --git a/index.php b/index.php
index 211eb49..f0a6b1b 100644
--- a/index.php
+++ b/index.php
@@ -18,7 +18,7 @@
  * NOTE: If you change these, also change the error_reporting() code below
  *
  */
-       define('ENVIRONMENT', 'development');
+       define('ENVIRONMENT', 'production');
 /*
  *---------------------------------------------------------------

O un status:

$ git status
# On branch master
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#       modified:   application/config/database.php
#

10.4.12

Código de invitación Keupi

Codigos de invitacion para el sitio Keupi, los encontre hardcodeados en el JavaScript. Ademas, el sitio tiene multiples inyecciones de SQL y el disenio es horrible. Besis!


  • CHIC22K

  • CHIC21F

  • POP27Q

  • FASHION24M

  • COOL25Z

  • DIVER23J

  • MOD25W

  • MOD19L

  • POP24B

  • GRL23S

  • CHIC27F

25.7.11

Corregir "warning" del timezone en PHP 5.3

Si actualizaron PHP en su servidor y ven millones de errores del timezone como este:

PHP Warning: mktime(): It is not safe to rely on the system's timezone settings. You 
are *required* to use the date.timezone setting or the date_default_timezone_set() function.
In case you used any of those methods and you are still getting this warning, you most likely
misspelled the timezone identifier. We selected 'America/Buenos_Aires' for 'EDT/-3.0/DST'
instead in page.php on line 1

Van a tener que configurar el parametro date.timezone en el archivo php.ini que este usando su servidor web (en mi caso esta en /etc/php.ini) y agregarle la zona correspondiente.

;;;;;;;;;;;;;;;;;;;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;

[Date]
; Defines the default timezone used by the date functions
; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
date.timezone = America/Buenos_Aires

Si no saben en donde esta el archivo php.ini que tienen que modificar, pueden crear un archivo PHP con este codigo:

<?php phpinfo(); ?>

Y acceder a dicho archivo desde el navegador. Ahi van a encontrar la ruta al archivo php.ini del cual necesitan modificar el timezone.

19.7.11

Enumerando usuarios de WordPress

Cuando empeze desarrollar y probar wpbf me di cuenta que necesitaba nombres de usuario válidos para realizar los ataques de fuerza bruta. En un principio buscaba en el contenido del blog links que hacian referencia a las páginas de autor hasta que di con el advisory de Veronica Valeros (TALSOFT-2011-0526) que permite automatizar la enumeración de usuarios a traves de una redicción (segun el advisory, esta presente en versiones de WordPress 2.6, 3.1, 3.1.1, 3.1.3 y 3.2-beta2).

Los usuarios enumerados pueden ser verificados/validados (para filtrar falsos positivos) desde el formulario de ingreso de usuarios (wp-login.php) cuyo mensaje de error diferencia entre usuarios válidos e inválidos.

Redirección

Esta técnica funciona en muchas instalaciones de WordPress (actualizadas o no). Para saber si un blog es vulnerable basta con ingresar a la siguiente página en el blog:

http://www.miblog.com.ar/?author=2

En caso de que exista un usuario cuyo ID sea "2", la redirección nos revela el nombre de usuario "pepito":

http://www.miblog.com.ar/author/pepito/

La idea general es ir incrementando el IDs de usuario hasta obtener todos los usuarios. Algo importante es no detenerse cuando no encontremos un usuario, ya que es común que algunos usuarios hayan sido eliminados y exista un "vacio" en la secuencia de IDs de usuarios.

Pagina del autor

Pero, ¿qué pasa cuando no se hace la redirección? Como bien dice el advisory, versiones recientes de WordPress solucionan el problema de la redirección pero el nombre de usuario sigue presente en las paginas de autor de cada usuario. En esta pagina se deberían listar todos los posts de un autor en particular, y si bien el template puede estar modificado para no incluir un link al autor (href="/author/pepito/") la etiqueta "title" suele comenzar con el nombre de usuario.

<title>pepito | Titulo de mi blog</title>

En muy pocos casos cambia la posición del nombre de usuario pero, en caso de que cambie, se podria comparar el contenido del titulo de varias paginas de autor y encontrar cuales son las palabras que se repiten en la mayoría de los casos. Las palabras que cambian representarian los nombres de los autores.

Otros métodos

Nos queda buscar en el contenido del blog referencias a la pagina de autor en las firmas de los posts. Acá dependemos del tema/template elegido por el administrador del blog y hay una gran posibilidad que no encontremos todos los usuarios (como, por ejemplo, un usuario que no escribió un post en ese blog). Un link a una página de autor seria algo así:

<a title="View all posts by admin" href="http://www.miblog.com.ar/?author=1" class="url fn n">admin</a>

¿En que versiones funciona esto?

Se suponía que la versión 3.1.3 solucionaba el problema del redirect, pero en mis pruebas tengo resultados dispares. En algunos blogs cuya versión es la misma, para uno funciona el redirect y para el otro no (en ambos casos, la enumeración es exitosa).

Estas son las versiones que pude probar:

WordPress 2.6.1 : redirect
WordPress 2.7 : author-title
WordPress 2.7.1 : author-title
WordPress 2.8.4 : author-title
WordPress 2.9.2 : author-title
WordPress 3.0.2 : author-title
WordPress 3.0.3 : author-title
WordPress 3.0.4 : redirect
WordPress 3.1.2 : author-title
WordPress 3.1.3 : redirect
WordPress 3.2 : redirect
WordPress 3.2.1 : redirect / author-title

Si quieren hacer pruebas enumerando usuarios de su blog automaticamente, pueden utilizar wpbf o el plugin wordpress_enumerate_users.py del framework de explotacion web w3af.

1.7.11

BruteForce en WordPress con wpbf

Una de las aplicaciones web que mas se esta usando para armar sitios es WordPress. Como muchas otras aplicaciones web, su instalacion por defecto, es vulnerable a ataques de fuerza bruta.


Auditando contraseñas debiles

Utilizando un password "fuerte" (largo, que incluya numeros, letras y no se predecible), sumado a la latencia de la red (no pudiendo probar tantos passwords por segundo) hacemos que un ataque de fuerza bruta sea impractico. Pero la experiencia nos demuestra que muchos usuarios no suelen preocuparse mucho por la complejidad de sus contraseñas, mas bien piensan "quien va a intentar "hackear" a mi blog?". Lo cierto es que este tipo de ataques pueden automatizarse y quiza a nadie le interese "hackear" tu blog especificamente, pero si puede interesarle a alguien tener un espacio en un hosting en donde alojar scripts (malware, botnets, etc) o contenido (imagenes, musica, peliculas, etc) sin tu permiso.

Habiendo dejado en claro que para un ataque practico sea practico debemos buscar passwords cortas y predecibles, podemos utilizar la herramienta wpbf (WordPress BruteForce) con un diccionario chiquito y su opcion por defecto de utilizar keywords del blog como contraseñas.


La herramienta

El wpbf esta desarrollado en Python bajo licencia GPL y su codigo es accesible a traves del repositorio en GitHub de wpbf. Entre sus caracteristicas principales podemos destacar:

  • Soporte para threads (hilos) que hacen mas rapida las pruebas con diccionarios grandes

  • Utilizacion de palabras clave del sitio en la lista contraseñas

  • Enumeracion y deteccion de usuarios

  • Soporte para proxy HTTP

  • Utilizacion de la libreria logging de Python permitiendo registro avanzado y configurable

Una vez descargada, la descomprimimos en un directorio y ya podemos comenzar a utilizarla: no tiene dependencias mas que la libreria estandar de Python e incluye un pequeño diccionario de pruebas.

Vamos un ejemplo sobre un blog de prueba ejecutando el script sin ninguna opcion:


$ ./wpbf.py http://localhost/wordpress/
2011-07-01 18:33:03,757 - wpbf - INFO - Target URL: http://localhost/wordpress/wp-login.php
2011-07-01 18:33:03,759 - wpbf - INFO - Checking URL & username...
2011-07-01 18:33:08,139 - wpbf - INFO - Load into queue additional words using keywords from blog...
2011-07-01 18:33:08,802 - wpbf - INFO - Bruteforcing...
3 words left
2011-07-01 18:33:21,012 - wpbf - INFO - Password 'qawsed' found for username 'admin' on http://localhost/wordpress/wp-login.php

Despues de verificar la existencia del formulario de login (default: wp-login.php) y la validez del nombre de usuario (default: admin, puede cambiarse utilizando la opcion -u) se buscan palabras clave para agregar al diccionario y el script lanza threads para iniciar las pruebas. Un detalle de actividad del script puede verse en el archivo "wpbf.log" y en caso de encontrar una contraseña valida se guardara en el log y se mostrara en pantalla.


Solo la mitad del trabajo

Para este ataque necesitamos dos datos: usuario y contraseña. Debido a ciertos aspectos de WordPress podemos enumerar usuarios y comprobar que esos usuarios sean validos. La enumeracion de usuarios se puede hacer mediante la deteccion de redirecciones de la query "?author=" incrementando un entero que corresponderia al ID de usuario (ver TALSOFT-2011-0526) o mediante el analisis de la "Author's archive page" del blog. La herramienta wpbf incorpora estas dos tecnicas para buscar automaticamente un usuario valido antes de comenzar el ataque.


$ ./wpbf.py -eu http://localhost/wordpress/
2011-07-01 19:16:02,092 - wpbf - INFO - Target URL: http://localhost/wordpress/wp-login.php
2011-07-01 19:16:02,093 - wpbf - INFO - Enumerating users...
2011-07-01 19:16:03,615 - wpbf - INFO - Usernames: admin, caco, test


Un video demostrativo

En este video se muestra un ataque como el mencionado anteriormente y enumeracion de usuarios en varios blogs elegidos al azar. Hay que verlo en pantalla completa y la calidad del video deja mucho que desear... pero bueno, aqui esta:




Mitigando el ataque

Para el bruteforce existen dos plugins llamados: User Locker y Login LockDown, no probe ninguno de los dos pero si hacen bien lo que dicen hacer deberia alcanzar para evitar el ataque por fuerza bruta.

Respecto a validar que un usuario sea correcto o no, habria que modificar los mensajes de error del formulario de ingreso al administrador de WordPress unificando los mensajes de contraseña invalida con los de usuario invalido (ver post de EthicalHack3r con una propuesta de patch).

Evitar la enumeracion de usuarios por redireccion ya funciona en las ultimas versiones de WordPress, pero queda pendiente de solucion la extraccion de datos del usuario desde la pagina de archivo del usuario. Nuevamente, habria que modificar el codigo de WordPress y eliminar esta funcionalidad o evitar exponer el nombre de usuario en este tipo paginas.