07 noviembre 2010

Enlaces de la SECmana - 44


Leer más...

06 noviembre 2010

III Jornadas sobre ciberamenazas y ciberdefensa

El 3 y 4 de noviembre se ha celebrado en la Universidad Europea de Madrid la III Jornada sobre ciberamenazas y ciberfensa. Este año he sido invitado e hice una presentación sobre el conocido malware Stuxnet. 

Sobre Stuxnet se ha escrito mucho, tanto, que el propósito de la charla era resumir los hallazgos de los principales investigadores y sus conclusiones. Desgraciadamente la presentación no es muy autoexplicativa, pero para todos los que asistieron o puedan tener interés, la adjunto a esta entrada.




Leer más...

05 noviembre 2010

Resolviendo los concursos de la NcN 2010 - I


Para los que no han resuelto el CTF de la NoConName, vamos a explicaros como hemos resuelto ambos retos y os animamos a resolverlos tanto si esto os sirve de guía a modo de “howto” como si os puede servir o podéis aportar algún tipo de mejora al resultado obtenido. Cualquier tipo de técnica/herramienta/idea será bienvenida y así todos podremos aprender de este fascinante juego desarrollado por la gente de Isecauditors y presentado en el congreso.

Comenzamos con los datos y las evidencias que nos ofrecen en el siguiente PDF: http://noconname.org/concursos/NcN_2010_Reto_Forense.pdf

PISTAS:
•    Existen, al menos, 4 hallazgos interesantes.
•   ¿Cual es el título de la película?

Nos adjuntan la imagen de disco de la siguiente url: http://noconname.org/concursos/okin.dd.bz2
Por lo que vamos a bajarla y comenzamos el reto.

rsk::vtta { ~/NcN }-> md5sum okin.dd && cat okin.md5 
9c9a5e0d25dd57db10c99e84d9b03d48  okin.dd
9c9a5e0d25dd57db10c99e84d9b03d48  okin.dd

Comenzamos montando la imagen con sus correspondientes permisos para evitar meter la pata en el sistema de ficheros, importante solo lectura y noexec.

rsk::vtta { ~/NcN }-> mkdir okin_fs
rsk::vtta { ~/NcN }-> sudo mount -o loop,ro,noexec,nodev okin.dd okin_fs/

Una vez que la tenemos, para evitar estar entrando directorio a directorio nos hacemos un pequeño esquema de lo que hay, y de paso nos hacemos un pequeño time-line de los ficheros que existen así como el tipo de fichero del que se trata, creando una visión más global de lo que tenemos para trabajar.

rsk::vtta { ~/NcN }-> find okin_fs/ . -exec ls -l --full-time {} \; -exec file {} \;
total 13
drwxr-xr-x 2 root    root 12288 2010-09-27 19:03:26.000000000 +0200 lost+found
drwxr-xr-x 4 rsk 1000  1024 2010-10-01 12:27:39.000000000 +0200 okin
okin_fs/: directory
total 0
okin_fs/lost+found: directory
total 1135
drwxr-xr-x 4 rsk 1000    1024 2010-10-04 18:22:13.000000000 +0200 Docus
-rwxr-xr-x 1 rsk 1000 1151221 2010-10-01 11:08:39.000000000 +0200 film.zip
drwxr-xr-x 3 rsk 1000    1024 2010-09-29 16:44:16.000000000 +0200 profile
-rw-r--r-- 1 rsk 1000    1381 2010-09-29 15:53:14.000000000 +0200 publica.key
okin_fs/okin: directory
-rw-r--r-- 1 rsk 1000 675 2010-09-27 19:16:18.000000000 +0200 okin_fs/okin/.profile
okin_fs/okin/.profile: ASCII English text
-rw-r--r-- 1 rsk 1000 3137 2010-09-28 14:26:47.000000000 +0200 okin_fs/okin/.bashrc
okin_fs/okin/.bashrc: ASCII English text
-rw-r--r-- 1 rsk 1000 220 2010-09-27 19:16:18.000000000 +0200 okin_fs/okin/.bash_logout
okin_fs/okin/.bash_logout: ASCII English text
-rwxr-xr-x 1 rsk 1000 1151221 2010-10-01 11:08:39.000000000 +0200 okin_fs/okin/film.zip
okin_fs/okin/film.zip: Zip archive data
-rw-r--r-- 1 rsk 1000 412 2010-10-01 12:27:39.000000000 +0200 okin_fs/okin/.bash_history
okin_fs/okin/.bash_history: ASCII text
-rw-r--r-- 1 rsk 1000 1381 2010-09-29 15:53:14.000000000 +0200 okin_fs/okin/publica.key
okin_fs/okin/publica.key: PGP public key block
total 4
drwxr-xr-x 2 rsk 1000 1024 2010-10-01 11:01:52.000000000 +0200 barcos
drwxr-xr-x 2 rsk 1000 1024 2010-10-01 11:01:30.000000000 +0200 Coches
-rw-r--r-- 1 rsk 1000  116 2010-10-01 10:58:06.000000000 +0200 lista.txt
-rw-r--r-- 1 rsk 1000  116 2010-10-04 18:22:13.000000000 +0200 todo.txt
okin_fs/okin/Docus: directory
total 480
-rwxr-xr-x 1 rsk 1000 117383 2010-10-01 10:55:52.000000000 +0200 OL00024801_9999999670.pdf
-rwxr-xr-x 1 rsk 1000 369214 2010-10-01 10:55:52.000000000 +0200 vela_ligera.pdf
okin_fs/okin/Docus/barcos: directory
-rwxr-xr-x 1 rsk 1000 117383 2010-10-01 10:55:52.000000000 +0200 okin_fs/okin/Docus/barcos/OL00024801_9999999670.pdf
okin_fs/okin/Docus/barcos/OL00024801_9999999670.pdf: PDF document, version 1.4
-rwxr-xr-x 1 rsk 1000 369214 2010-10-01 10:55:52.000000000 +0200 okin_fs/okin/Docus/barcos/vela_ligera.pdf
okin_fs/okin/Docus/barcos/vela_ligera.pdf: PDF document, version 1.2
total 281
-rwxr-xr-x 1 rsk 1000 29384 2010-10-01 10:55:52.000000000 +0200 9071005.008.Mini4L.jpg
-rwxr-xr-x 1 rsk 1000 41161 2010-10-01 10:55:52.000000000 +0200 9071005.008.Mini5L.jpg
-rwxr-xr-x 1 rsk 1000 33902 2010-10-01 10:55:53.000000000 +0200 coleccion-bruce-willis-1008-3-480x319.jpg
-rwxr-xr-x 1 rsk 1000 31112 2010-10-01 10:55:53.000000000 +0200 fastwomen.jpg
-rwxr-xr-x 1 rsk 1000 87503 2010-10-01 10:55:53.000000000 +0200 ferrari_motorcycle_2-1222425723.jpg
-rwxr-xr-x 1 rsk 1000 54467 2010-10-01 10:55:53.000000000 +0200 sauerland_b_low.jpg
okin_fs/okin/Docus/Coches: directory
-rwxr-xr-x 1 rsk 1000 29384 2010-10-01 10:55:52.000000000 +0200 okin_fs/okin/Docus/Coches/9071005.008.Mini4L.jpg
okin_fs/okin/Docus/Coches/9071005.008.Mini4L.jpg: JPEG image data, JFIF standard 1.01
-rwxr-xr-x 1 rsk 1000 41161 2010-10-01 10:55:52.000000000 +0200 okin_fs/okin/Docus/Coches/9071005.008.Mini5L.jpg
okin_fs/okin/Docus/Coches/9071005.008.Mini5L.jpg: JPEG image data, JFIF standard 1.01
-rwxr-xr-x 1 rsk 1000 33902 2010-10-01 10:55:53.000000000 +0200 okin_fs/okin/Docus/Coches/coleccion-bruce-willis-1008-3-480x319.jpg
okin_fs/okin/Docus/Coches/coleccion-bruce-willis-1008-3-480x319.jpg: JPEG image data, JFIF standard 1.01, comment: "CREATOR: gd-jpeg v1.0 (using IJ"
-rwxr-xr-x 1 rsk 1000 31112 2010-10-01 10:55:53.000000000 +0200 okin_fs/okin/Docus/Coches/fastwomen.jpg
okin_fs/okin/Docus/Coches/fastwomen.jpg: JPEG image data, JFIF standard 1.01
-rwxr-xr-x 1 rsk 1000 87503 2010-10-01 10:55:53.000000000 +0200 okin_fs/okin/Docus/Coches/ferrari_motorcycle_2-1222425723.jpg
okin_fs/okin/Docus/Coches/ferrari_motorcycle_2-1222425723.jpg: JPEG image data, JFIF standard 1.02
-rwxr-xr-x 1 rsk 1000 54467 2010-10-01 10:55:53.000000000 +0200 okin_fs/okin/Docus/Coches/sauerland_b_low.jpg
okin_fs/okin/Docus/Coches/sauerland_b_low.jpg: JPEG image data, JFIF standard 1.01
-rw-r--r-- 1 rsk 1000 116 2010-10-04 18:22:13.000000000 +0200 okin_fs/okin/Docus/todo.txt
okin_fs/okin/Docus/todo.txt: ASCII text
-rw-r--r-- 1 rsk 1000 116 2010-10-01 10:58:06.000000000 +0200 okin_fs/okin/Docus/lista.txt
okin_fs/okin/Docus/lista.txt: ASCII text
total 1
drwxr-xr-x 3 rsk 1000 1024 2010-09-29 16:44:28.000000000 +0200 mail
okin_fs/okin/profile: directory
total 1
drwxr-xr-x 2 rsk 1000 1024 2010-09-29 16:44:54.000000000 +0200 local
okin_fs/okin/profile/mail: directory
total 21
-rwxr-xr-x 1 rsk 1000 13376 2010-09-29 16:43:28.000000000 +0200 Privado
-rwxr-xr-x 1 rsk 1000  6110 2010-09-29 16:43:36.000000000 +0200 Privado.msf
okin_fs/okin/profile/mail/local: directory
-rwxr-xr-x 1 rsk 1000 13376 2010-09-29 16:43:28.000000000 +0200 okin_fs/okin/profile/mail/local/Privado
okin_fs/okin/profile/mail/local/Privado: HTML document text
-rwxr-xr-x 1 rsk 1000 6110 2010-09-29 16:43:36.000000000 +0200 okin_fs/okin/profile/mail/local/Privado.msf
okin_fs/okin/profile/mail/local/Privado.msf: exported SGML document text
total 120493
-rw-r--r-- 1 rsk users 123379200 2010-10-06 10:57:32.000000000 +0200 okin.dd
drwxr-xr-x 4 root    root       1024 2010-09-27 19:16:18.000000000 +0200 okin_fs
-rw-r--r-- 1 rsk users        42 2010-10-19 09:31:42.636666670 +0200 okin.md5
.: directory
-rw-r--r-- 1 rsk users 42 2010-10-19 09:31:42.636666670 +0200 ./okin.md5
./okin.md5: ASCII text
total 13
drwxr-xr-x 2 root    root 12288 2010-09-27 19:03:26.000000000 +0200 lost+found
drwxr-xr-x 4 rsk 1000  1024 2010-10-01 12:27:39.000000000 +0200 okin
./okin_fs: directory
total 0
./okin_fs/lost+found: directory
total 1135
drwxr-xr-x 4 rsk 1000    1024 2010-10-04 18:22:13.000000000 +0200 Docus
-rwxr-xr-x 1 rsk 1000 1151221 2010-10-01 11:08:39.000000000 +0200 film.zip
drwxr-xr-x 3 rsk 1000    1024 2010-09-29 16:44:16.000000000 +0200 profile
-rw-r--r-- 1 rsk 1000    1381 2010-09-29 15:53:14.000000000 +0200 publica.key
./okin_fs/okin: directory
-rw-r--r-- 1 rsk 1000 675 2010-09-27 19:16:18.000000000 +0200 ./okin_fs/okin/.profile
./okin_fs/okin/.profile: ASCII English text
-rw-r--r-- 1 rsk 1000 3137 2010-09-28 14:26:47.000000000 +0200 ./okin_fs/okin/.bashrc
./okin_fs/okin/.bashrc: ASCII English text
-rw-r--r-- 1 rsk 1000 220 2010-09-27 19:16:18.000000000 +0200 ./okin_fs/okin/.bash_logout
./okin_fs/okin/.bash_logout: ASCII English text
-rwxr-xr-x 1 rsk 1000 1151221 2010-10-01 11:08:39.000000000 +0200 ./okin_fs/okin/film.zip
./okin_fs/okin/film.zip: Zip archive data
-rw-r--r-- 1 rsk 1000 412 2010-10-01 12:27:39.000000000 +0200 ./okin_fs/okin/.bash_history
./okin_fs/okin/.bash_history: ASCII text
-rw-r--r-- 1 rsk 1000 1381 2010-09-29 15:53:14.000000000 +0200 ./okin_fs/okin/publica.key
./okin_fs/okin/publica.key: PGP public key block
total 4
drwxr-xr-x 2 rsk 1000 1024 2010-10-01 11:01:52.000000000 +0200 barcos
drwxr-xr-x 2 rsk 1000 1024 2010-10-01 11:01:30.000000000 +0200 Coches
-rw-r--r-- 1 rsk 1000  116 2010-10-01 10:58:06.000000000 +0200 lista.txt
-rw-r--r-- 1 rsk 1000  116 2010-10-04 18:22:13.000000000 +0200 todo.txt
./okin_fs/okin/Docus: directory
total 480
-rwxr-xr-x 1 rsk 1000 117383 2010-10-01 10:55:52.000000000 +0200 OL00024801_9999999670.pdf
-rwxr-xr-x 1 rsk 1000 369214 2010-10-01 10:55:52.000000000 +0200 vela_ligera.pdf
./okin_fs/okin/Docus/barcos: directory
-rwxr-xr-x 1 rsk 1000 117383 2010-10-01 10:55:52.000000000 +0200 ./okin_fs/okin/Docus/barcos/OL00024801_9999999670.pdf
./okin_fs/okin/Docus/barcos/OL00024801_9999999670.pdf: PDF document, version 1.4
-rwxr-xr-x 1 rsk 1000 369214 2010-10-01 10:55:52.000000000 +0200 ./okin_fs/okin/Docus/barcos/vela_ligera.pdf
./okin_fs/okin/Docus/barcos/vela_ligera.pdf: PDF document, version 1.2
total 281
-rwxr-xr-x 1 rsk 1000 29384 2010-10-01 10:55:52.000000000 +0200 9071005.008.Mini4L.jpg
-rwxr-xr-x 1 rsk 1000 41161 2010-10-01 10:55:52.000000000 +0200 9071005.008.Mini5L.jpg
-rwxr-xr-x 1 rsk 1000 33902 2010-10-01 10:55:53.000000000 +0200 coleccion-bruce-willis-1008-3-480x319.jpg
-rwxr-xr-x 1 rsk 1000 31112 2010-10-01 10:55:53.000000000 +0200 fastwomen.jpg
-rwxr-xr-x 1 rsk 1000 87503 2010-10-01 10:55:53.000000000 +0200 ferrari_motorcycle_2-1222425723.jpg
-rwxr-xr-x 1 rsk 1000 54467 2010-10-01 10:55:53.000000000 +0200 sauerland_b_low.jpg
./okin_fs/okin/Docus/Coches: directory
-rwxr-xr-x 1 rsk 1000 29384 2010-10-01 10:55:52.000000000 +0200 ./okin_fs/okin/Docus/Coches/9071005.008.Mini4L.jpg
./okin_fs/okin/Docus/Coches/9071005.008.Mini4L.jpg: JPEG image data, JFIF standard 1.01
-rwxr-xr-x 1 rsk 1000 41161 2010-10-01 10:55:52.000000000 +0200 ./okin_fs/okin/Docus/Coches/9071005.008.Mini5L.jpg
./okin_fs/okin/Docus/Coches/9071005.008.Mini5L.jpg: JPEG image data, JFIF standard 1.01
-rwxr-xr-x 1 rsk 1000 33902 2010-10-01 10:55:53.000000000 +0200 ./okin_fs/okin/Docus/Coches/coleccion-bruce-willis-1008-3-480x319.jpg
./okin_fs/okin/Docus/Coches/coleccion-bruce-willis-1008-3-480x319.jpg: JPEG image data, JFIF standard 1.01, comment: "CREATOR: gd-jpeg v1.0 (using IJ"
-rwxr-xr-x 1 rsk 1000 31112 2010-10-01 10:55:53.000000000 +0200 ./okin_fs/okin/Docus/Coches/fastwomen.jpg
./okin_fs/okin/Docus/Coches/fastwomen.jpg: JPEG image data, JFIF standard 1.01
-rwxr-xr-x 1 rsk 1000 87503 2010-10-01 10:55:53.000000000 +0200 ./okin_fs/okin/Docus/Coches/ferrari_motorcycle_2-1222425723.jpg
./okin_fs/okin/Docus/Coches/ferrari_motorcycle_2-1222425723.jpg: JPEG image data, JFIF standard 1.02
-rwxr-xr-x 1 rsk 1000 54467 2010-10-01 10:55:53.000000000 +0200 ./okin_fs/okin/Docus/Coches/sauerland_b_low.jpg
./okin_fs/okin/Docus/Coches/sauerland_b_low.jpg: JPEG image data, JFIF standard 1.01
-rw-r--r-- 1 rsk 1000 116 2010-10-04 18:22:13.000000000 +0200 ./okin_fs/okin/Docus/todo.txt
./okin_fs/okin/Docus/todo.txt: ASCII text
-rw-r--r-- 1 rsk 1000 116 2010-10-01 10:58:06.000000000 +0200 ./okin_fs/okin/Docus/lista.txt
./okin_fs/okin/Docus/lista.txt: ASCII text
total 1
drwxr-xr-x 3 rsk 1000 1024 2010-09-29 16:44:28.000000000 +0200 mail
./okin_fs/okin/profile: directory
total 1
drwxr-xr-x 2 rsk 1000 1024 2010-09-29 16:44:54.000000000 +0200 local
./okin_fs/okin/profile/mail: directory
total 21
-rwxr-xr-x 1 rsk 1000 13376 2010-09-29 16:43:28.000000000 +0200 Privado
-rwxr-xr-x 1 rsk 1000  6110 2010-09-29 16:43:36.000000000 +0200 Privado.msf
./okin_fs/okin/profile/mail/local: directory
-rwxr-xr-x 1 rsk 1000 13376 2010-09-29 16:43:28.000000000 +0200 ./okin_fs/okin/profile/mail/local/Privado
./okin_fs/okin/profile/mail/local/Privado: HTML document text
-rwxr-xr-x 1 rsk 1000 6110 2010-09-29 16:43:36.000000000 +0200 ./okin_fs/okin/profile/mail/local/Privado.msf
./okin_fs/okin/profile/mail/local/Privado.msf: exported SGML document text
-rw-r--r-- 1 rsk users 123379200 2010-10-06 10:57:32.000000000 +0200 ./okin.dd


Resumiendo, podemos ver lo que parece un directorio /home de un usuario que ha sido volcado y contiene documentos PDF, algunos ficheros de texto plano, imágenes, un directorio de correo, histórico de comandos, etc.

Una vez tenemos una vision global de todo lo que existe, es hora de analizar un poco más el fichero de imagen desde lo más sencillo a lo más complicado. Empezamos por el comando strings:

rsk::vtta { ~/NcN }-> strings -a -t d okin.dd >strings.ascii.txt

Entre otras cosas vemos :
  • 2 correos enviados desde la cuenta pakwalls@gmail.com con destinatario okin@nocooname.org , Subject: Datos. Correo cifrado GnuPG. Corresponde con el fichero : okin_fs/okin/profile/mail/local/Privado. No existe el destinatario, gmail los devuelve.
Sacamos la parte del correo que está cifrada con GPG para analizarlo más tarde:

    -----BEGIN PGP MESSAGE-----
Charset: ISO-8859-1
Version: GnuPG v1.4.10 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

hQEOA78AQh2Ts7oPEAP+OtZIwwX2Uo92a7sCwko4DwbzmGQ64yIp6cqkTVoa+sF/
6addCvMmIMey7UyNFzU2+qL3GD+4EO0c+v+/KYDRGr6sfUYVvsDfWwOUtKeKxZ4k
rYlKmWmn5yGPVbgD5KZLUD85Bvoo375fzK2IpWNUhNUhMfj/oZk1ssuzKPpbFFwD
/iR6Wrwf/dtwii+49Cca7Pi1flVXBAtm14941nNKT+DVvw0Jci1eUc5tBseai0Yp
56AlWE3J7CjpL7Jngc8YGrvPbPMxYS8gz73fvnffPURMRLEt3Joqb2G3OOZcwC0N
82iXk10nMDJbCVahG/P8agbQupZ0hfnvPplA/dJmm6Xw0sBsAVUsw03nV1qcV8l6
2ORFd8qPIxrR/LULWxMVzXMtIjR+SjZzeGhSF2LEVurGO4JECjr6T6OFpOpFOzT3
Bll2bytuTE7ALH+KEL9bpUkCebVoezvSqQn+Jvm7CiQQfv/7KfShJSFol4QSqffz
6/UK4WjA1RtN/iaN2Y2w6u+uCnrt0ACPLwnLSMHjpIxrDOIedXk6XBG6PM+xYkHd
iXx9dR5tZ+pZ2A6GttCopsSaLEFNmBDfjMICaoP8z9UNLGvg+t9lRtlzn5ylvFzy
7gsyyDGm/waEmddZjJKwMVQuFkGA82syibBGELB7YZJXYMXhghxEJQxnEDfSwKyi
p1h2J0xMtW0wouZIRNMTGAD64rO0SYDXyMliVz7vUn8iK5z5uaFH3Isq89HAeGzu
=3D5zru
-----END PGP MESSAGE-----

Si nos damos cuenta anteriormente en el listado de ficheros vemos un fichero llamado publica.asc:

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.9 (GNU/Linux)

mQGiBEyh3TIRBAD9CbvavizDHBVAIi19GOEO5yFF/GGgHr4+FfnoMa5GgA8TL1T9
7dpYmcq/uITR2nuU9h0u8eeSRz426GNIqCZj7vGevqGpsDoPYEzh8PwupYpoZBo5
NxiykbfKn3Wcry4Md2zELgCQyr/UwEevhF/NlDs2gwT9VlTZrH+Ez/94SwCgu2Ou
hnCCyQmt65R+jVCwJWV7uo0EALb1YEcZ8RPv/xc+QKD33sfyN/v8nnzxho1VOOrb
hfElsBMXt8ssf1s1l9XRKyWBfrs0UHSu11QuJj0fHKuC+jCz8Rs2mw6nE6TrwZKS
fyPbN9BitHuWtj3Rcw7xxRHBXhpgPLxGmYqxseWw/aJ6UQWKDpNN0PfT7DwgSHxw
OLJpBACM5CjKCewoaNtp8ZTCm4KIgoQW4nKWSZ6wE7+7YY8eJMPYBorzFil6LIM3
wujvPcoa0rqDAw3mbHbvQC31zvHrX8O43UqYOrtPrh/O3lowzMuHBygciHbyEB+I
e3mK8Ut7EfefRK6+kgII0FcFx+9ShArwn9m7alIAEe3Yaz96RbQ2TWlrZSBPa2lu
IExvcGV6IChDdWVudGEgcGVyc29uYWwpIDxva2luQG5vY29ubmFtZS5vcmc+iGYE
ExECACYFAkyh3TICGwMFCQHhM4AGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRCi
B22M8xbKcfSpAJ0cEDS8Gv+RmuwiJLsQYQhIcK48agCeJLKr2ORD17rC4S3fdisq
5UJj+Ha5AQ0ETKHdMhAEAOc7LjnNezQsH2Q9H51ohZHJy3gcToFR91bRYlJBmZjw
5CXG2QzgKTjwHTawpvRpdsegv5xNiXPOr2RzJbb675VXExJBZeKQVYiMY6u0KVbx
RI8w502s1VGsgzKuL+2AF/ywjLi8mF0liJsqDsd51qTwnswTvJlB94za5h0wsAfn
AAMFBADAxMJ33tSuS+FF5rKui+WDxvJDjaHV/dYC6EyRRKsxJCArLFtRuzx2YWGd
zv2ZdnfmI+3h4xd/vEVIuFwoe1JjFQdC8zSsZN2I8wGhjTIOpKZXKex1NR6sXL7M
5k3hMZ+RlTG663MUeKoxzU7HZCLMW0TPuIxZesPWCHsXC77m8YhPBBgRAgAPBQJM
od0yAhsMBQkB4TOAAAoJEKIHbYzzFspx+EQAn3xtKmPKuKzkIQpm5nmzEC02f/vU
AKCLVU5bFwM1R1Hn7dNnScGXUeOTMw==
=vCqL
-----END PGP PUBLIC KEY BLOCK-----

Además en el fichero de strings vimos: mailx -s "llaveo" jpilo@isecauditors.com < publica.key

Parece que está bastante claro, vamos a tener que descifrar el correo de alguna forma. Como no sabemos aún como, vamos a echar un ojo a los ficheros que tenemos a ver si nos dan alguna pista:

rsk::vtta { ~/NcN/okin_fs/okin/Docus }-> cat todo.txt 
- Limpiar el coche.
- Revisar las acciones del banco.
- Hacer el reto forense.
- DESCUBRIR EL TITULO DE LA PELICULA 
 
La primera puede tener que ver con las imágenes que hemos visto en el directorio Docus/Coches. Pero si los analizamos a primera vista no vemos nada fuera de lo común. Lo normal es usar alguna herramienta como openstego/stegdetect. Revisar las acciones del banco no nos llama la atención sobre nada de lo anterior visto. Hacer el reto forense y como se suele hacer en un reto forense, se analizan los ficheros eliminados y tal vez con esto continuemos con el siguiente punto. Descubrir el título de la película, que puede tener que ver con el fichero film.zip que tiene clave y que podríamos intentar descomprimir usando fuerza bruta. En principio lo descartamos pero si no podemos usar alguna herramienta tipo fcrackzip. O simplemente crear un diccionario y pasándoselo como argumento al comando unzip -P”xxx” film.zip dentro de un bucle similar a :

for i in `cat dict’; do unzip -P”$i”; echo $i; done 

Bueno, como siempre digo hay que seguir primero el camino más obvio y luego intentar ir descartando. Lo que más pista nos ha dado por ahora ha sido el uso de cifrado GPG, así que como no tenemos el anillo para poder descifrar el correo, habrá que buscarlo. Optamos por ver que ficheros han sido eliminados. Tal vez algo nos dé una pista sobre donde está.

¿Qué podemos usar?
  •     The Sleuth Kit / Autopsy
  •     foremost
  •     debugfs
  •     scalpel
  •     dd /grep/sed..

En nuestro caso usaremos el primero, pero  tal vez sería bueno combinar alguno con otro para comparar resultados. Lo ejecutamos directamente sobre la imagen de disco descargada como evidencia:

rsk::vtta { ~/NcN }->  ils -r okin.dd
class|host|device|start_time
ils|vtta||1287477888
st_ino|st_alloc|st_uid|st_gid|st_mtime|st_atime|st_ctime|st_crtime|st_mode|st_nlink|st_size
32134|f|0|0|1286209331|1286209315|1286209333|0|644|0|12288
32136|f|1000|1000|1286209331|1286209331|1286209333|0|644|0|116
32139|f|1000|1000|1285676481|1285676481|1285923754|0|600|0|942
32140|f|1000|1000|1285676481|1285768394|1285923754|0|600|0|1080
32142|f|1000|1000|1285676481|1285768394|1285923754|0|600|0|942
32147|f|0|0|1285923213|1285923212|1285923734|0|755|0|1151221
32150|f|0|0|1285923352|1285923352|1285923712|0|755|0|118803
32159|f|0|0|1285923353|1285923353|1285923690|0|755|0|20821
32161|f|0|0|1285923612|1285923677|1285923677|0|755|0|0
32162|f|0|0|1285923353|1285923353|1285923612|0|755|0|73110
32163|f|0|0|1285923353|1285923353|1285923612|0|755|0|640387
32164|f|0|0|1285923353|1285923353|1285923612|0|755|0|659134
32166|f|1000|1000|1285923529|1286209315|1286209331|0|644|0|79

Ciertamente existen ficheros eliminados, en este caso nos muestra 13 ficheros eliminados. Así que vamos a recuperarlos, pasándole el inodo donde se encuentra a la utilidad icat del kit anteriormente mencionado:

rsk::vtta { ~/NcN }-> for i in `cat inodes`; do icat -r okin.dd $i >$i; echo $i; done
rsk::vendeta { ~/NcN }-> file *

32134:                Vim swap file, version 7.2
32136:                ASCII text
32139:                GPG key public ring
32140:                PGP key security ring
32142:                GPG key public ring
32147:                Zip archive data
32150:                data
32159:                Vim swap file, version 7.2
32161:                empty
32162:                data
32163:                data
32164:                PDF document, version 1.3
32166:                ASCII text

Tenemos varios ficheros recuperados, pero destacamos el que ya estábamos buscando “PGP key security ring”. Tenemos que importarlo y comprobar si podemos usarlo para descifrar el correo.

rsk::vtta { ~/NcN }-> gpg --import 32140
gpg: /home/rsk/.gnupg: directorio creado
gpg: creado un nuevo archivo de configuración `/home/rsk/.gnupg/gpg.conf'
gpg: AVISO: las opciones en `/home/rsk/.gnupg/gpg.conf' no están aún activas en esta ejecución
gpg: anillo «/home/rsk/.gnupg/secring.gpg» creado
gpg: anillo «/home/rsk/.gnupg/pubring.gpg» creado
gpg: clave F316CA71: clave secreta importada
gpg: /home/rsk/.gnupg/trustdb.gpg: se ha creado base de datos de confianza
gpg: clave F316CA71: clave pública "Mike Okin Lopez (Cuenta personal) " importada
gpg: Cantidad total procesada: 1
gpg:               importadas: 1
gpg:       claves secretas leídas: 1
gpg:   claves secretas importadas: 1

Una vez importada tratamos de descifrar el correo que teníamos anteriormente cifrado de mail/Privado.

rsk::vtta { ~/NcN }-> gpg2 --decrypt email.txt

Necesita una frase contraseña para desbloquear la clave secreta l usuario: "Mike Okin Lopez (Cuenta personal) " clave ELG-E de 1024 bits, ID 93B3BA0F, creada el 2010-09-28 (ID de clave primaria F316CA71)

¿Tenemos esa clave?¡Si! estaba en el histórico (.bash_history) : Am*S8dA9Z!yw*VAE
Ya podemos leer el contenido del correo:

“Hola Okin! Como va todo? Mucho curro? :)

    Por aquí andamos bastante cargados y eso que acabamos de volver! A ver si
llegan las fiestas navideñas y descansamos otro poco...

    Bueno, a lo que iba... Te envío la contraseña que me pediste para que
puedas acceder a los datos. La contraseña es "Hhj23Hol249"

    Saludos a todos.”


Tenemos una clave nueva, ya probamos anteriormente todas las que vimos en el .bash_history en el fichero film.zip, pero esta es nueva y vamos a proceder a probarla.


rsk::vtta { ~/NcN }-> unzip -P”Hhj23Hol249” film.zip 

Aunque devuelve errores por el CRC, se ha descomprimido correctamente. Y encontramos un fichero llamado film del tipo PCAP. Por lo que vamos a abrirlo con Wireshark a ver que hay en esta captura de tráfico.


Echando un vistazo rápido, vemos mucho tráfico SIP, por lo que parece que tenemos que seguir las tramas y ver la comunicación. En Wireshark existe un plugin que nos facilita un poco el trabajo para trabajar con VoIP. Telephony/VoIP. Así mismo vemos el flujo de la llamada e intentamos decodificarla a ver que podemos escuchar de la conversación.

Una vez descodificado, pulsamos el player y finalmente escuchamos el audio que es bastante esclarecedor:


Y del que podemos deducir el título de la película:

“El cuerpo humano genera más bioelectricidad que una pila de ciento veinte voltios y más de veinticinco mil Julios de calor corporal Combinado con una forma de fusión, las máquinas habían encontrado toda la energía que podían necesitar Existen campos, Neo interminables campos donde los seres humanos ya no nacemos Se nos cultiva “



¡Efectivamente hemos conseguido conocer el título de la película! Se trataba de Matrix. Por lo que ya hemos finalizado con éxito nuestro reto y no hemos perdido el tiempo analizando otras evidencias menos obvias. No obstante podíamos encontrar ciertos ficheros eliminados que podían hacernos perder el rumbo del análisis y que tal vez contengan información quien sabe :-)
  • Manual de Snort 2.8.6 para Fedora
  • Fichero jpg ralph-lauren-cars-5.jpg
  • Fichero PDF Laguna, Carlos.pdf

-revskills
Leer más...

04 noviembre 2010

Protecciones de arranque en portátiles (PC/MAC)

Siempre que se recomienda proteger la seguridad de un sistema, físicamente hablando, la primera frase que se pronuncia es la de "establece una contraseña en la BIOS". La BIOS, por explicarlo a grandes rasgos y para todos, es el primer programa que se ejecuta una vez iniciado el dispositivo, antes que el sistema operativo.

De ahí que una de las recomendaciones para protegerse de ataques típicos realizados con una livecd o el método Kon-Boot (además de cualquier otro bootkit) sea la de evitar modificar la secuencia de arranque del ordenador para que permita iniciar en primer lugar desde un CD, DVD o USB.

Además de proteger la BIOS para evitar su modificación de parámetros, también se recomienda establecer una contraseña de arranque del sistema. Por lo tanto nos encontramos con dos tipos diferentes de protecciones en BIOS:
  1. Establecer contraseña de modificación de parámetros de BIOS (protege la propia BIOS, y no todas las placas base soportan esta funcionalidad)
  2. Establecer contraseña de arranque del sistema (evita la carga del sistema operativo si no se conoce la contraseña)
Para saltarse/eliminar las protecciones BIOS, siempre se ha recomendado el típico método de: abre el ordenador, localiza la pila y sácala, o localiza el jumper correspondiente y provoca un reset de la información. Con esto tendremos una BIOS con la configuración por defecto y valores de fábrica. Fuerza bruta donde las haya, y en según que escenarios, una solución demasiado aparatosa salvo que vayas con gorra azul y en tu chaqueta ponga Mantenimiento.

Pero cuando nos encontramos con un portátil, aún sabiendo que los anteriores métodos también funcionan a la perfección, la cosa cambia. Sí, también funcionan, pero en esta ocasión no estamos hablando de quitar únicamente 4 o 5 tornillos.

Dejando los métodos físicos a un lado para las BIOS de PCs convencionales, centrémonos en las soluciones denominadas lógicas, aprovechando puertas traseras, contraseñas por defecto según fabricante, etc.

[PC] El arranque nos solicita una contraseña

De repente encendemos ¿?¿nuestro?¿? ordenador, y nos solicita la contraseña de arranque.
Existen una serie de contraseñas de emergencia provistas por el fabricante que podrían desbloquear bastantes modelos de BIOS. Podréis consultar un ejemplo de una amplia lista de contraseñas backdoor por fabricante (AWARD, AMI, PHOENIX, etc), en este enlace.

Algunos ejemplos de contraseñas de emergencia
No es un método recomendable (salvo para algunos fabricantes del que se conocen pocas combinaciones) ya que en muchas ocasiones nos encontramos con demasiadas posibilidades que poder comprobar, y es muy probable que acabemos bloqueando la propia BIOS, ganándonos un mensaje parecido al de la siguiente imagen (System Disabled) que se puede encontrar en multitud de foros de ayuda y auxilio:


¿Y ahora que hacemos?

[PC] BIOS bloqueada tras varios intentos fallidos de contraseña

Tenemos el sistema bloqueado tras varios intentos, y en la gran mayoría de los casos, además del asustadizo (no hay que llevarse las manos a la cabeza) mensaje "System Disabled", se nos proporcionará una serie de números. Podréis encontrar más ejemplos de sistemas deshabilitados con una simple búsqueda en Google Images. Otras veces, con la propia petición de contraseña, se nos mostrará la etiqueta de servicio / service tag, como en el caso de los modelos de portátil marca Dell:

BIOS de portátil Dell pidiendo contraseña de acceso.
Para estos casos, podremos consultar la tabla de BIOS realizada por dogbert, en la que recopila, según fabricante, un conjunto de scripts a modo de keygens que nos generarán, en base a un número (ya sea el hash ofrecido en el mensaje de sistema deshabilitado como mediante cualquier otro identificador), una contraseña de rescate que será aceptada satisfactoriamente por el sistema, y nos dará acceso. 

Keygens para BIOS de fabricantes como Dell, Fujitsu, HP....
No es necesario ejecutarse en el mismo sistema protegido, ya que no modifica ningún valor de la memoría como las antiguas soluciones software que se dedicaban a resetear la CMOS (CmosPwd, !Bios...). Puede ejecutarse en cualquier sistema, en ocasiones se tratan de scripts en python y en otras, simples binarios cuyo código fuente también tenemos disponible. Para el caso de la BIOS del portátil DELL que mostramos anteriormente, es tan simple como introducir dicho Service Tag en la herramienta:


Y se nos generará una contraseña válida que también será aceptada por la BIOS para continuar con el inicio del sistema.

Os recomiendo leer algunos de los posts del blog de dogbert etiquetados bajo "bios" ya que poco a poco explica, según BIOS a las que va teniendo acceso, el proceso de su ingeniería inversa y obtención del algoritmo utilizado por los fabricantes, para luego generar herramientas que generen códigos válidos. Tendréis información más detallada sobre el proceso de ingeniería inversa llevado a cabo para portátiles Fujitsu-Siemens, mini-netbooks de HP-Compaq...y como no, más información en la recopilación que hemos enlazado anteriormente.

[MAC] Protección de Open Firmware y EFI

Si tenemos más de un minuto para poder resetear la contraseña de inicio de un portátil Mac, siempre podremos realizar un método de tipo físico similar al de quitar la pila en BIOS de PCs convencionales. Destornillador en mano, principalmente, debemos realizar un reset de la PVRAM realizando los siguientes pasos:

1) Cambiar la configuración de memoria RAM - Esto se consigue eliminando alguna de las pastillas de RAM. Acceder a dicho componente y extraerlo es bien sencillo.

2) Iniciar el reset de PVRAM - Tras encender el portátil, mantener pulsadas las teclas Command+Option+P+R hasta que se oigan 3 sonidos tipicos de arranque de los Mac (el que se emite cuando sale el splash de la manzana, previo al arranque del sistema operativo).




Tras emitirse por segunda vez el sonido ya podremos dejar de pulsar las teclas.

3) Mediante este método restableceremos la PRAM a sus valores por defecto.

Actualmente es el método por excelencia, incluso se puede encontrar en la página de soporte oficial de Apple. Sin contar con la contraseña de administrador del sistema operativo, es lo único a lo que podremos recurrir.

Pero, ¿y si queremos recuperar/eliminar la contraseña, teniendo acceso como administrador en el sistema? Quién sabe, es otro escenario posible...
  • PowerPC - Open Firmware
Encontraremos un enlace al foro de soporte oficial de Apple en el que se nos insta a utilizar una herramienta, denominada Open Firmware Password, que establecerá una contraseña para el firmware del dispositivo. En las nuevas versiones de Mac OS X, se puede encontrar dicha aplicación en el disco de instalación del sistema, dentro del directorio Applications/Utilities. Para versiones de Mac OS X de la 10.1 a la 10.3.9 se puede descargar mediante este enlace.

Estando dentro del sistema, podremos obtener la contraseña que se haya establecido mediante Open Firmware Password utilizando la aplicación FWSucker, de mSec (que ya tiene unos cuantos años, ni responde la página web del grupo). En SecureMac encontraremos un mirror con el .sit de FWSucker alojado por ellos para poder acceder a la herramienta.
  • Equipos basados en Intel - EFI
Existe un script denominado EFIpw que se encuentra disponible aquí. La única pega es que necesita permisos de root en el sistema como hemos comentado anteriormente, así que únicamente podremos utilizarla para recuperar la contraseña del EFI tras un despiste...


Leer más...

03 noviembre 2010

Capturas de paquetes, un interés común.

Las capturas de paquetes juegan un papel importantísimo en seguridad. Su utilidad pasa desde analizar protocolos y comunicaciones de aplicaciones, hasta detectar problemas en una red, pasando por hacer un análisis forense de un ataque, y muchas cosas más.

Son una fuente de información muy amplia para realizar estudios, detectar fallos, depurar, etc ...

Debido a sus características y lo útil que podría ser compartirlas, han empezando a surgir comunidades y utilidades basadas en Internet para intercambiar información "empaquetada" de esta forma. Además, se añaden las funciones típicas de la "web 2.0", por lo que todo el mundo puede subir capturas nuevas, votar las de otras personas, comentarlas, utilizar tags para clasificar la información, etc...

- openpacket.org Una comunidad que, según comentan ellos mismos, tiene el objetivo de proporcionar un repositorio centralizado de trazas de tráfico para investigadores, analistas y otros miembros de la comunidad de la seguridad.
Tiene una web bastante bien organizada, con un prudente número de capturas de red. Principalmente se encuentran capturas de protocolos, ataques y virus. En su buscador podemos seleccionar las Most interesting, e incluso podemos buscar según si las trazas provienen de tráfico normal, sospechoso o malicioso.
Mantienen un blog donde publican cambios y novedades. Una de las personas detrás del proyecto es Richard Bejtlich.

- pcapr.net Otra comunidad muy parecida, pero que posee un número de usuarios y capturas muchísimo más alto que la anterior, además tiene un toque social algo más marcado. Cuentan con algunas herramientas interesantes, entre ellas una aplicación que permite analizar las trazas desde la propia web, sin necesidad de descargarlas.
El proyecto es mantenido por Mu Dynamics.

Aunque no esté directamente relacionado con estos dos sitios web, es necesario hacer una mención a CloudShark. Se trata de una página web a la que podemos subir capturas y analizarlas a través del navegador. Tiene una interfaz muy parecida a la de Wireshark (la web utiliza tshark), y tiene un abanico de opciones más amplio de lo que en un principio se espera para ser una web (frente al propio Wireshark).

Las situaciones en las que nos puede ser útil son muchas, desde que no tenemos un analizador de paquetes a mano, hasta que queremos compartir la captura con un amigo.

Las clásica crítica a estos servicios es que son una potencial vía de fugas de datos sensibles, y es cierto, si se utilizan sin precaución.
Leer más...

02 noviembre 2010

GPU y cracking, que tarjeta me compro

Después de un merecido descanso en el paraíso zamorano, al volver a casa me esperaba la línea de comandos tras haber terminado de ejecutar durante varios días fuerza bruta contra unos malditos hashes de Wordpress.

¡¡Ay, qué bien me habría venido tenido tener la nueva gaimboi china para ahorrarme unos días!!

No ha pasado mucho tiempo desde que en verano adquiriese una tarjeta Nvidia GTX460 para este tipo de trabajo. ¿Por qué esta tarjeta? tras un análisis en profundidad de las opciones del mercado y las características, al final me encontré en que la decisión que hay que tomar es si decantarse por la GPU de Nvidia o la de ATI.

Para las primeras, gracias a CUDA es más sencillo desarrollar aplicaciones y por ello existen muchas herramientas que hacen uso de su tecnología. Por desgracia y como no podía ser de otra manera, las Radeon de ATI son más rápidas y económicas.

En la wikipedia hay dos entradas comparando los modelos de cada tipo de GPU: Nvidia y ATI (ahora AMD).

Ivan Golubev publicó en su blog unas magníficas tablas comparativas de velocidad y precio que reproduzco a continuación y de las que se puede resumir que para el caso de hashes MD5 y relación calidad precio, la mejor opción es Ati Radeon HD5770.


Como la mayoría de vosotros, para MD5 usaría otras técnicas, así que antes de acercarme a la tienda, hice un pequeño repaso de que aplicaciones podría usar y saque mi propia tabla comparativa de sus características:


Entre mis requisitos estaba el tener el mayor número de algoritmos soportados,  así que acabé comprando Nvidia, pero no descarto pasarme a ATI si  oclhashcat añade nuevos formatos.

En cuanto al modelo concreto de Nvidia, fue puramente económico, ya que los últimos se iban de presupuesto.

Con la tarjeta instalada, tal y como se puede ver en la tabla de arriba, tome unas mediciones con MD5 para conocer cuál era la aplicación más optimizada, de lo que salió el siguiente resultado:


He dejado fuera de esta entrada todas las utilidades que rompen cifrados en archivos ofimáticos, de compresión y otros tipos de contenedores para comentarlo en la siguiente.

Referencias:
Leer más...

01 noviembre 2010

Tuenti y las redes locales inseguras - 2/2

Antes de empezar voy a hacer un pequeño resumen de la entrega anterior para que nos ubiquemos en ésta con mayor facilidad.

Como vimos en la primera entrega, podemos aprovechar que el TuentiChat no está cifrado para monitorizar las conversaciones de cualquier usuario que se encuentre en nuestra red local y al que le hayamos realizado previamente el ataque MITM.

A pesar de lo interesante que pueda ser la monitorización de las conversaciones (y las acciones que podamos realizar sobre ellas) creo que es más importante destacar que indirectamente obtenemos el sessionID (de ahora en adelante SID) de la víctima, por lo que nos hacemos con el control total de su cuenta (en realidad casi total, porque algunas acciones requieren la introducción de la contraseña, la cual no obtenemos en ningún momento, por ahora...).

Como se comentó, para poder realizar peticiones en nombre de la víctima necesitaremos, además del SID, el CSFR y en ocasiones el ID (que habremos obtenido durante la monitorización del TuentiChat). Un breve esquema sobre su utilización en las peticiones:
  • Petición GET: SID, ID (a veces)
  • Petición POST: SID, CSFR, ID (a veces)

Bueno, como ya se dijo, en esta segunda entrega se va a hablar de algún ejemplo de peticiones sobre la cuenta de la víctima y sobre robo de sesiones (obligar a la víctima a generar un SID válido) y robo de credenciales (aprovechándonos de que la página de login no está cifrada).

¡Comencemos!

1. Tuenti, yo soy la víctima

Una vez obtenido el SID ya tendríamos control total sobre la cuenta, pues bastaría con abrir nuestro navegador y modificar la cookie SID añadiendo el contenido del de la víctima (abriéndose Tuenti con su sesión). Aun así, si queremos que sea un programa nuestro el que realice las peticiones, voy a dar alguna información sobre como el modificar la información personal de la víctima.

Cuando realicemos la petición no es necesario que enviemos todos los parámetros pero sí todos los relacionados entre sí (por ejemplo los que tienen que ver con el número de teléfono) y, lo más importante, si alguno falla la petición no se procesará, independientemente de que otros datos fueran correctos.

Con respecto a la ciudad, lo importante es el código de la misma (location_hidden) y no su nombre (que no se valida), al contrario que con el barrio (neighborhood_autofill) el cual tiene que tener el nombre exacto o no validará.

Para obtener el código de la ciudad o el nombre del barrio basta con realizar las siguientes peticiones:

http://www.tuenti.com/?m=Dmz&func=get_cities_for_data_source
search=CIUDAD
http://www.tuenti.com/?m=Dmz&func=get_neighborhoods_for_data_source
search=BARRIO&city_id=IDCIUDAD

Obteniendo como respuesta:

{"search_string":"","results":[{"id":ID,"string":"CIUDAD","info":{"location":"CIUDAD"}}]}
{"search_string":"","results":[{"id":ID,"string":"BARRIO","info":null}]}

Como apunte final, simplemente decir que en todas las peticiones que modifican información (todos los ‘POST’) ha de enviarse el CSFR.

¿Qué medida va a tomar Tuenti al respecto?

Pues Tuenti pretende introducir un sistema de firmado de peticiones a través de un token secreto intercambiado por SSL en el inicio de sesión y que no saldría del navegador (incrustado en la página o en una cookie que solo se enviaría en conexiones cifradas).

De ésta forma, junto con un timestamp que se enviaría para darle caducidad a las peticiones y evitar su duplicado, se evitaría que se pudiesen hacer peticiones al servidor sin dicho token.

¿Cómo podríamos obtener ese token secreto?

En principio, bastaría con modificar el HTML que le llega al usuario y hacer que en cualquiera de los formularios del mismo se envíe el mismo token que se utiliza para firmar. Aun así, habría que ver la implantación del mismo.

En la aplicación que se adjunta al artículo podéis ver otras acciones como cerrar la sesión, cambiar el estado, modificar la página web y números de teléfono (los demás campos de la información personal), etc.

2. Robando una sesión

Todo lo que se ha contado es aplicable siempre y cuando el usuario no decida cerrar la sesión, pues entonces el SID quedaría invalidado y no podríamos realizar ninguna acción sobre su cuenta, pero... ¿qué ocurriría si pudiésemos obtener una sesión, de forma transparente al usuario, y que éste no pueda cerrarla? Pues en ese caso tendríamos acceso completo a la cuenta y el usuario no podría hacer nada.

Es cierto que Tuenti establece un límite máximo de cinco SIDs válidos por cuenta/servicio (es decir, la versión normal y la móvil son independientes) y si la víctima abriese cinco cuentas al mismo tiempo nuestro SID quedaría invalidado pero es poco probable pues no es un dato que se conozca además de que el ataque se habría realizado de forma (casi) transparente.

¿Cuál sería el procedimiento?

Este ataque es muy fácil de llevar a cabo. Bastaría con bloquear el envío del SID de la víctima al servidor, de ésta forma éste creería que el usuario no está autenticado y le enviaría la página de login. La víctima se reautenticaría (sería extraño que se diera cuenta de que está siendo atacada pues tampoco es una situación anómala) y generaría un nuevo SID en el servidor. Si tras la reautenticación levantamos el bloqueo y le dejamos seguir operando con el SID antiguo, es decir, modificamos en la cabecera (en Set-Cookie) del paquete de respuesta el contenido de la cookie SID introduciendo el antiguo y nosotros nos quedamos con el nuevo, tendremos acceso a la cuenta de la víctima (tenemos un SID válido) sin que ésta pueda actuar al respecto.

Para realizar el bloqueo, podemos utilizar los filtros de Ettercap. Bastaría con modificar el contenido de la cookie SID. El filtro podría ser así.

if (ip.proto == TCP && tcp.dst == 80) {
    if (search(DATA.data, "sid=")) { replace("sid=", "sid=0"); }
}

A pesar de que podríamos utilizar el Ettercap, yo recomendaría realizar una aplicación propia para el MITM para poder tener mayor control del tráfico antes de que éste se envíe a la víctima. De ésta forma podríamos crear un filtro más personalizado y no estar atados a las opciones que nos da el Ettercap. En el código adjunto al artículo se puede consultar la clase MITM para realizar el ataque desde Java.

¿Qué medida va a tomar Tuenti al respecto?

La medida que va a tomar Tuenti al respecto es el implantar un sistema de control de sesiones (similar al que tenemos, por ejemplo, en Gmail). Es verdad que si el atacante tiene acceso a la cuenta puede monitorizar este servicio y cerrar cada sesión generada por el usuario (bloqueándole el acceso a su cuenta), por lo que la idea es solicitar la contraseña cada vez que se vaya a cerrar una sesión (en todo el ataque no hemos obtenido los credenciales de usuario pues la idea es que el proceso sea lo más transparente posible y, a pesar de que la mayoría aceptaría un certificado falso sin fijarse, es demasiado “cantoso”).

3. Obteniendo los credenciales

Por desgracia es extremadamente sencillo. Bastaría con aprovechar que el “login page” no se cifra, para modificar el formulario de autenticación para que realice la petición sin SSL, obteniendo los credenciales en texto plano.

¿Cómo podríamos modificar el “login page”?

Como estamos realizando un ataque MITM y el tráfico no está cifrado, no sólo podemos monitorizarlo sino también alterarlo, por lo que podríamos utilizar un filtro de Ettercap que se encargue de realizar el proceso, bastando con reemplazar ‘https’ por ‘http’ en el action del formulario. El filtro podría ser así:

if (ip.proto == TCP && tcp.src == 80) {
    replace("action=\"https", "action=\"http");
}

Otra opción podría ser la utilización de la aplicación SSLStrip.

¿Qué medida va a tomar Tuenti al respecto?

Para evitar el robo de credenciales Tuenti tiene previsto cifrar por completo (no solo el envió de los credenciales) el ‘login page’ para evitar su manipulación.

Aun así, es necesario concienciar al usuario de que el login ha de hacerse siempre por medio de una conexión segura, es decir, fijarse si estamos a través de SSL y que además el certificado es de Tuenti. Esto es importante porque sino el atacante, por ejemplo, puede obtener el ‘login page’ por SSL y brindárselo a la víctima sin cifrar, obteniendo los credenciales en texto plano.

Como apunte final, decir que actualmente la contraseña se envía tal cual, y como medida complementaria Tuenti pretende utilizar un token para la autenticación que se enviaría junto con el correo electrónico y cuya estructura sería:

token auth = token secreto + hash(contraseña)

¡Hasta aquí todo! Ya para terminar...

Simplemente decir que el artículo (comunicado hace meses) ha servido para que Tuenti implante (en principio se dijo a medio plazo, pero ahora me entra la duda de que vayan a tomar verdaderamente medidas al respecto) una serie de medidas de seguridad que nos benefician a todos los usuarios.

La mejor medida sería que toda la red social se ofreciera por SSL, opcionalmente al menos (independientemente de la complejidad que conllevara, hay que tener en cuenta los datos tan privados contenidos en la red social). Aun así al parecer (no lo digo yo ni significa que lo comparta) la infraestructura actual de Tuenti no lo soportaría (debido al sistema de balanceo que tienen implementado) además de que la experiencia de usuario se vería afectada en gran medida (ralentización).

Y con respecto a la aplicación...

Se han modificado muchas de las ideas que lancé al publicarlo. Por ejemplo, ahora ya podemos empezar a realizar acciones sobre la cuenta de la víctima esté ésta en el TuentiChat o no (como comentaba, lo importante es el SID). Además, se ha modificado el sistema de peticiones pues dejó de funcionar.

Además, se han realizado muchos cambios internos, por lo que os animo a echarle un vistazo al código (no solo compilarlo y ponerse a probar todo lo que se ha dicho en este artículo).

Muchas personas me han pedido que se publique, además del código, una versión ya compilada y lista para usarse. No lo voy a hacer pues es inmediato (puedes incluso abrir el proyecto desde un IDE y compilarlo con un click) y si uno no es capaz de hacer esa tarea tan sencilla es mejor no darle todo hecho...

Nombre: aplicacion_src.7z

Artículo cortesía de: Luis Delgado J.
Leer más...