jueves, 13 de diciembre de 2012

LimaHack 2012 en la UNI

Este 21 de Diciembre del 2012 va ocurrir algo que va ha marcar nuestras vidas para siempre!!, no crean que es el fin del mundo, lo que va haber es la primera replica de LimaHack 2012, y esta vez será en la Universidad Nacional de Ingeniería - UNI.


Es un evento netamente técnico de Hacking con demostraciones en vivo, los que no pudieron asistir a la USJB, pues esta es su oportunidad, y a los que quieren repeticua también pueden asistir. El ingreso es totalmente libre y la inscripción será e mismo día, se recomienda asistir temprano.

Nuevamente tengo el honor de participar una vez mas en este gran evento de In-Seguridad, el tema que me toca presentar es "Chuponenado Plataformas de Telefonía IP"



Nos vemos el 21 de diciembre, y esperemos que todos puedan divertirse con este evento, antes que se acabe el mundo!!!!!!!


miércoles, 14 de noviembre de 2012

CDR en Asterisk con CDR_ADAPTIVE _ODBC

Hola nuevamente, aprovechando que estoy en casa por temas de salud y a pedido del publico voy a hacer un pequeño post de como utilizar el modulo cdr_adaptive_odbc.so para almacenar los registros de las llamadas(CDR) directamente en una base de datos , esto reemplaza al cdr_mysql.so(deprecated).

En este esquema muestra la conexión que hay entre uno y otro  fichero:




Empezaré explicando algo de CDR de asterisk:

Por cada llamada entrante, saliente, entre anexos, etc, Asterisk genera registro detallado de llamadas conocidos como CDR (Call Detail Records). Los registros son almacenados en un archivo de texto separado por comas, también conocido como CSV (comma separated value), en el directorio: /var/log/asterisk/cdr-csv/

El fichero donde se guardan los registros tiene como nombre: Master.csv

Pero Asterisk tambien puede almacenar registros  de CDR en una base de datos MySQL. De ello se encarga el module CDR_ADAPTIVE_ODBC.SO.


Lo que se guarda en el CDR en texto plano(Master.csv) tiene la siguiente estructura:


Tener el claro que el registro no se guarda en tiempo real, se guarda una vez que haya finalizado la llamada.

Procedemos a monitorear el log del CDR es decir el fichero Master.csv:


#tail -f /var/log/asterisk/cdr-csv/Master.csv


"1234","208","999555999","usuarios","""Ludovico Peluche"" <208>","SIP/0000FFFF0001-00002a8c","SIP/GSM2-00002a8d","Dial","SIP/GSM2/999555999","2012-11-14 21:49:21","2012-11-14 21:49:40","2012-11-14 21:50:13",52,33,"ANSWERED","DOCUMENTATION","1352229761.55511","Celular"



De esta llamada realizado a un celular desde el extensión 208 podemos observar los siguientes valores que se almacenan en el fichero Master.csv:

Accountcode: 1234
Src: 208
Dst: 999555999
Dcontext: usuarios
Clid: Ludovico Peluche <208>
Dchannel: SIP/0000FFFF0001-00002a8c
Dstchannel : SIP/GSM2-00002a8d
Lastapp: Dial
Lastdata: SIP/GSM2/999555999
Start: 2012-11-14 21:49:21
Answer: 2012-11-14 21:49:40
End : 2012-11-14 21:50:13
Duration: 52
Billsec: 33
Dispotition: ANSWERED
Amaflag:DOCUMENTATION
uniqueid: 1352229761.55511
Userfield:Celular

Bueno hasta este punto espero que todo este claro, si no preguntar a SAN GOOGLE mas detalles.

Ahora Procedemos a almacenar dichos registros en la Base de datos MySQL.


Procedemos a crear nuestra Base de Dados y Tabla, donde queremos que se almacene los registros del CDR.

Creamos un fichero cdr.sql, donde tendremos el script que nos crea la tabla:
#vim /opt/cdr.sql

USE asteriskcdr;
CREATE TABLE cdr (
id bigint(20) NOT NULL auto_increment,
calldate datetime NOT NULL default '0000-00-00 00:00:00',
clid varchar(80) NOT NULL default '',
src varchar(80) NOT NULL default '',
dst varchar(80) NOT NULL default '',
dcontext varchar(80) NOT NULL default '',
channel varchar(80) NOT NULL default '',
dstchannel varchar(80) NOT NULL default '',
lastapp varchar(80) NOT NULL default '',
lastdata varchar(80) NOT NULL default '',
duration int(11) NOT NULL default '0',
billsec int(11) NOT NULL default '0',
disposition varchar(45) NOT NULL default '',
amaflags int(11) NOT NULL default '0',
accountcode varchar(20) NOT NULL default '',
peeraccount varchar(20) NOT NULL default '',
uniqueid varchar(32) NOT NULL default '',
linkedid varchar(80) NOT NULL default '',
userfield varchar(255) NOT NULL default '',
PRIMARY KEY (`id`),
KEY callerid (clid)
);

Guardamos los cambios.

Ahora creamos la base de datos asteriskcdr:
#mysql -ps3kr3t
mysql>create dabatase asteriskcdr;
mysql>quit;

#mysql -ps3kr3t  < /opt/cdr.sql

Para validar si efectivamente se ha creado la tabla cdr:
#mysql  -ps3kr3t

mysql> use asteriskcdr;
mysql>show tables;
mysql>describe cdr;


Hasta este punto ya tenemos la tabla donde se guardaran los registros de las llamadas:

Ahora empieza lo que muchos estaban pidiendo: cdr_adaptive_odbc

El CDR_ADAPTIVE_ODBC, permite  crear diferentes tablas donde nosotros podemos guardar los CDR.

Primero tenemos que validar que tengamos el módulo instalado:


*CLI> module show like cdr_adaptive_odbc.so





empecemos revisando el fichero /etc/odbc.ini 

#vim /etc/odbc.ini
[asteriskcdr]

Description = MySQL ODBC CDR
Driver = MySQL
Database = asteriskcdr
Server = localhost
User = root
Password = s3kr3t
Port = 3306
Option = 3



Guardamos los cambios y probamos la conexión entre ODBC y  la base de datos:
#isql asteriskcdr root asteriskcdr










Para salir de SQL, digitamos quit

Nota:

asteriskcdr – etiqueta que da inicio al bloque configurado en odbc.ini
root – nombre del usuario que tiene acceso a la base de datos creada; deberían crear otro usuario con privilegios para lo que se requiere.
s3kr3t – la contraseña de MySQL para el usuario root

Ahora nos toca revisar el fichero res_odbc.conf
#vim /etc/asterisk/res_odbc.conf
[asteriskcdr]

enabled => yes
dsn => asteriskcdr
username => root
password => s3kr3t
pre-connect => yes


Guardamos y cargamos los cambios:
#asterisk -rvvvvvvvv
*CLI>module reload res_odbc.so



Finalmente veamos el fichero cdr_adaptive_odbc.conf
#vim /etc/asterisk/cdr_adaptive_odbc.conf

[asteriskcdr]
connection=asteriskcdr
table=cdr
alias start => calldate

Guardamos y cargamos los cambios
#asterisk -rvvvv
*CLI>module reload cdr_adaptive_odbc.so

Nota:
Cada vez que realicemos llamadas a cualquier destino, podremos ver el el CLI de asterisk la data que se inserta en la base de datos, siempre y cuando tengamos configurado una verbosidad mayor a 20

*CLI>core set verbose 25

Podemos ver algo como esto:



  > [INSERT INTO cdr (calldate,clid,src,dst,dcontext,channel,dstchannel,lastapp,lastdata,duration,billsec,disposition,amaflags,uniqueid,linkedid,userfield) VALUES ({ ts '2012-11-14 17:26:01' },'"Junior Peluche" <216>','216','4320483','usuario','SIP/0000FFFF0002-00002a5e','SIP/troncalSIP-00002a6f','Dial','SIP/troncalSIP/4320483',98,75,'ANSWERED',3,'13523431962.11721','13523431962.11721','Fijo')]


Finalmente, es hora te tomar mi pastilla
Procedemos a revisar la tabla cdr y validar si se guardaron los registros:

#mysql  -ps3kr3t
mysql> use asteriskcdr;
mysql>select * from cdr;


Bueno señores espero que esto les sirva de ayuda, y hasta la próxima... vez que me vuelva a enfermar :-P



Fuentes de ayuda:
http://ofps.oreilly.com/titles/9780596517342/asterisk-DB.html
http://www.voztovoice.org
Recomiendo bajarse el  llibro de Asterisk™: The Definitive Guide y comprar el libro de VoiceTovoice, es muy buena.



Human Hacked

Hola a todos, hace tiempo que no posteo nada, el trabajo y los cursos que dicto me tienen esclavizado.

Bueno aprovechando que hoy no fui a trabajar y tampoco voy a dictar clases por temas de salud, decidí escribir algo, por que estoy re-contra aburrido acá en la cama.



El día de ayer fui hackeado, no mi Computadora si no Yo :-(.

Ayer estaba de los mas tranquilo trabajando en la oficina intercambiando ideas con los colegas del trabajo, yo creo que alguno de ellos tenia un gusano en sus sistema y este gusano ingreso en mi, de seguro que encontró alguna vulnerabilidad en mi y termino de infectarme al punto de tumbarme en la cama.


El virus estaba consumiendo muchos recursos al punto de que el procesador(cabeza) se recalentaba mucho, y los programas(brazos y piernas) se colgaban, no respondían, tuve que ejecutar algunos antivirus (Paracetamol y Naproxeno) para eliminar el virus, pero nada, este virus estaba fuerte, así que decidí ir a mi casa a descansar. En vista que el procesador recalentaba mucho decidí poner un disipador (una toalla húmeda en la frente) para evitar que matara mas neuronas, y ejecute otros antivirus(azitromicina) cada 12 horas.

Voy a tener que parchar mi sistema (alimentarme mejor) y configurar mejor mi Iptables(comer en mis horarios y no a cualquier hora) para evitar futuros ataques. Llego un momento que pensé que Christian me había instalo un troyano el día de su charla (Human Hacker) en LimaHack, mentira eso es broma, pero fuera de broma ese día me psicoseo un poco :-P


Bueno, de qui en adelante voy a tener que hacerme un Human Ethical Hacking, para ver si  tengo vulnerabilidades, y poder hacer los parches correspondientes


martes, 9 de octubre de 2012

LimaHack 2012


Antes que se acabe el Mundo!

Este año se realiza la 4ta edición de LIMAHACK, la primera conferencia de In-Seguridad Informática en el Perú.


A inicios del año pude asistir como espectador a la replica que se realizo en la UTP y pude apreciar buenas charlas como: Ardruino 101, Hacking VoIP, Hackeando Cajeros automáticos, SQL Injection para todos.

Esta vez también además de ir como espectador, también estaré como ponente. Así es, tengo el honor de poder participar en LimaHack con una charla denominada: "Chuponenado Plataformas de Telefonía IP", y como voluntarios para esta demo tendremos a Asterisk y a Cisco :-P.

Link del enlace de la Agenda
Link del enlace para registrarse al evento


viernes, 6 de julio de 2012

AST-2012-011 FALLA REMOTA EN LA APLICACIÓN DE BUZÓN DE VOZ


AST-2012-011 Remote crash vulnerability in voice mail application


Descripción:

Si una cuenta de correo de voz es manipulada por 2 entidades de manera simultanea, se puede generar una situación en que la memoria es liberada 2 veces causando una falla que genera una negación de servicio.

Nivel de Riesgo:

Alto

Resolución: Se ha realizado un parchado de la administración de la memoria con el fin de evitar doble liberación de memoria o accesos a los limites de memoria no causen ninguna falla.

Contramedidas:


Actualizar a Asterisk Open Source 11.8.13.1 y 10.5.2, Certified Asterisk 1.8.11-cert4, Asterisk DigiumPhones 10.5.2-digiumphones, respectivamente, o aplicar los siguientes parches:
Asterisk 1.8 y Certified Asterisk http://downloads.asterisk.org/pub/security/AST-2012-011-1.8.diff
Asterisk 10 y Asterisk Digiumphones http://downloads.asterisk.org/pub/security/AST-2012-011-10.diff

Referencias:


http://busy-tone.org/2012/07/ast-2012-011-falla-remota-en-la-aplicacion-de-buzon-de-voz/
https://issues.asterisk.org/jira/browse/ASTERISK-20052

lunes, 12 de marzo de 2012

ODBC Connector para MySQL en Asterisk

¿Como configurar ODBC para MySQL en Asterisk?
En las versiones de Asterisk 1.2 y 1.4 teníamos los módulos:

app_mysql.so: implementaba la aplicación MySQL en Asterisk y que permitía poder conectarnos directamente desde el dialplan de Asterisk a una base de Datos MySQL.

cdr_mysql.so: implementa el módulo que se encarga de pasar todo lo que esta en el CDR(/var/log/asterisk/cdr-csv/Master.csv) a una Base de Dados MySQL.

res_config_mysql.so: implementado para poder trabajarlo con Asterisk Real Time.

Pero en las versiones de Asterisk 1.8 y 10, estos módulos estan obsoletos(deprecated) a excepcion de res_config_mysql.son que es útil
Entonces si queremos conectarnos directamente desde el dialplan hacia una base de datos(sin usar AGI :-P) o si queremos pasar el log del CDR a una base de datos o si queremos trabajar con Real Time, quien podrá ayudarnos???

Yooooo!! el ODBC Connector, no contaban con mi astucia :-P

Vamos a explicar como configurar y como trabaja ODBC Connector con MySQL en Asterisk.

El conector ODBC es una capa de abstracción de base de datos que hace posible que Asterisk pueda comunicarse con una amplia gama de bases de datos sin necesidad de hacer desarrollos para crear un conector de base de datos independiente para cada base de datos. Esto ahorra una gran cantidad de esfuerzo de desarrollo y mantenimiento del código. Cabe indicar que hay un costo ligeramente en el rendimiento, porque se esta añadiendo otra capa de aplicación entre el asterisk y la base de datos, pero esto puede ser mitigado con un diseño adecuado y bien vale la pena cuando se necesita una capacidad de gran alcance y base de datos flexible compatibles con Asterisk.

Podrias configurar: ODBC para MySQL, ODBC para PostgreSQL y ODBC para Microsoft SQL

En esta ocación voy a focalizarme en ODBC para MySQL:

Ingredientes de la abuela Laberiana:

1.-Instalamos el motor de Base de Daots MySQL en Centos:
#yum install mysql mysql-server mysql-devel

2.-Instalar los drivers ODBC en Linux y los paquetes UnixODBC antes de compilar Asterisk porque el modulo ODBC en asterisk lo requiere como dependencia para construir sus modulos de ODBC.
#yum install unixODBC unixODBC-devel libtool-ltdl libtool-ltdl-devel

3.-Instalamos los drivers ODBC para MySQL
#yum install mysql-connector-odbc

4.-Creamos una base de datos de nombre asterisk y dentro creamos la tabla usuarios:
donde como registro tendremos los nombres de los usuarios, la clave y la categoría de permiso que tendran para hacer llamadas.


5.- Crear una contraseña de root para MySQL
#mysqladmin -u root password s3kr3t

6.- Creamos el usuario asterisk para que administre la base con la que vamos a trabajar:
#mysql -u root -ps3kr3t
mysql>CREATE USER 'asterisk'@'%' IDENTIFIED BY 'mys3kr3t'
Query OK, 0 rows affected (0.00 sec)

7.-Creamos la base de datos de nombre asterisk:
mysql>create database asterisk;

8.- Una vez creado la base de datos necesitamos asignar permisos para el usuario asterisk para que acceda que acceda a la base de datos con la que vamos a trabajar.
mysql>GRANT ALL PRIVILEGES ON asterisk.* TO 'asterisk'@'%';
Query OK, 0 rows affected (0.00 sec)

9.-Creamos la tabla de nombre usuarios:
mysql>USE asterisk;
mysql>CREATE TABLE `usuarios` (
`id` int(11) NOT NULL auto_increment,
`nombre` varchar(20) NOT NULL,
`clave` int(1) NOT NULL,
`loc` int(1) NOT NULL,
`cel` int(1) NOT NULL,
`ldn` int(1) NOT NULL,
`ldi` int(1) NOT NULL,
PRIMARY KEY (`nombre`),
KEY `id` (`id`)
) TYPE=MyISAM;
INSERT INTO usuarios (nombre,clave,loc,cel,ldn,ldi) VALUES (
'ohumala','2781','1','1','1','1'),
('agarcia','9847','1','0','1','0'),
('atoledo','1789','1','0','0','0');


10.- Procedemos a compilar o recompilar asterisk según sea el caso, para que se implemente el conector ODBC.

#cd /usr/src/asterisk-1.8.10.0/
#make clean
#./configure
#make
#make menuselect
; validar si los módulos relacionados a ODBC están habilitados




#make
#make install
#make samples
#make config


11.- Iniciamos asterisk e ingresamos al CLI> y validamos si los modulos ODBC estan implementados
#asterisk
#rasterisk -vvvvvvvvvv
*CLI> module show like odbc




Hasta este punto ya tenemos los módulos ODBC implementados en Asterisk y tenemos creado la base de datos asterisk con la tabla usuarios.

12.- Ahora mos a ver los archivos de configuración involucrados:

#/etc/odbcinst.ini
#/etc/odbc.ini
#/etc/asterisk/res_odbc.conf
#/etc/asterisk/func_odbc.conf
#/etc/asterisk/extensions.conf

13.-Procedemos a configurar el driver ODBC para MySQL esto es en el fichero /etc/odbcinst.ini
Para sistemas de 32 bits
#vim /etc/odbcinst.ini
--------------------------------------------------------


[MySQL]
Description = ODBC para MySQL
Driver = /usr/lib/libmyodbc3.so
Setup = /usr/lib/libodbcmyS.so
FileUsage = 1

---------------------------------------------------------

Para sistemas de 64 bits
#vim /etc/odbcinst.ini
---------------------------------------------------------

[MySQL]
Description = ODBC para MySQL
Driver64 = /usr/lib64/libmyodbc5.so
Setup64 = /usr/lib64/libodbcmyS.so
FileUsage = 1

---------------------------------------------------------

Para validar el sistema es capaz de reconocer el driver, ejecutamos el siguiente comando:
#odbcinst -q -d
[MySQL]
debería devolvernos el nombre de la etiqueta [MySQL]

14.- Ahora procedemos configurar el fichero /etc/odbc.ini este fichero es configurado para crear el identificador que asterisk utilizará para hacer referencia a esta configuración, para controlar como conectarse a la base de datos.

#vim /etc/odbc.ini
----------------------------------------------------------

[asterisk-conect]
Description = MySQL Asterisk
Driver = MySQL
Database = asterisk
Server = localhost
User = asterisk
Password = mys3kr3t
Port = 3306
Option = 3

------------------------------------------------------------

Validar si el conector ODBC se puede conectar a la base de datos, para utilizamos la aplicación isql:
#echo "select 1" | isql -v asterisk-conect
no debe mostrar un resutado come este:


15.- Procedemos a configurar el fichero res_odbc para permitir a Asterisk conectarse a través de ODBC.
#vim /etc/asterisk/res_odbc.conf
--------------------------------------
[ENV]
[asterisk]
enabled => yes
dsn => asterisk-conect
username => asterisk
password => mys3kr3t
pre-connect => yes
sanitysql => select 1
idlecheck => 3600
connect_timeout => 10

---------------------------------------

Guardamos los cambios y reiniciamos el servicio

#asterisk -r>core stop now
#asterisk
#rasterisk -vvvvvvvvvvvv


ver si ODBC esta activo:


16.-Funcion ODBC “func_odbc”
La función func_odbc permite hacer consultas a la base de datos directamente desde el
dialplan. Al mismo tiempo es posible actualizar o modificar campos específicos de la base
de datos. El archivo que se utiliza para este tipo de configuración es el func_odbc.conf.
En este caso vamos a configurar para consultar si se tiene permiso para hacer llamadas

Ingresamos al fichero:
#vim /etc/asterisk/func_odbc.conf
-----------------------------------------------------------------------------------------------
[usuariosLoc]
dsn=asterisk
readsql=SELECT loc FROM usuarios WHERE clave='${SQL_ESC(${ARG1})}'

[usuariosCel]
dsn=asterisk
readsql=SELECT cel FROM usuarios WHERE clave='${SQL_ESC(${ARG1})}'

[usuariosLdn]
dsn=asterisk
readsql=SELECT ldn FROM usuarios WHERE clave='${SQL_ESC(${ARG1})}'

[usuariosLdi]
dsn=asterisk
readsql=SELECT ldi FROM usuarios WHERE clave='${SQL_ESC(${ARG1})}'
-------------------------------------------------------------------------------------------------

Guardamos los cambios:
#rasterisk -vvvvvvvvv
*CLI>module reload func_odbc.so


Para validar si se crearon nuestra funciones:
*CLI>core show function ODBC_usuariosLoc


17.- Procedemos a configurar nuestro dialplan donde haremos uso de las funciones creadas para consultar a la base de datos antes de rutear la llamada hacia la PSTN:

#vim /etc/asterisk/extensions.conf

---------------------------------------------------------------------------------
[Fijo-SIP]
exten=>_[2-7]XXXXXX,1,NoOp(Fijo Local)
same=>n,Read(pass,agent-pass,4)
same=>n,Set(PERMISO=${ODBC_usuariosLoc(${pass})})
same=>n,GotoIf($[${PERMISO}=1]?ok:off)
same=>n(ok),Dial(SIP/TroncalSIP/${EXTEN})
same=>n,Hangup()
same=>n(off),NoOp(NO TIENE PERMISO PARA LLAMAR)
same=>n,Hangup()

[Celular-SIP]
exten=>_9XXXXXXXX,1,NoOp(Celular)
same=>n,Read(pass,agent-pass,4)
same=>n,Set(PERMISO=${ODBC_usuariosCel(${pass})})
same=>n,GotoIf($[${PERMISO}=1]?ok:off)
same=>n(ok),Dial(SIP/TroncalSIP/${EXTEN})
same=>n,Hangup()
same=>n(off),NoOp(NO TIENE PERMISO PARA LLAMAR)
same=>n,Hangup()

[LDN-SIP]
exten=> _0NX[2-7]XXXXX,1,NoOp(Larga Distancia Local)
same=>n,Read(pass,agent-pass,4)
same=>n,Set(PERMISO=${ODBC_usuariosLdn(${pass})})
same=>n,GotoIf($[${PERMISO}=1]?ok:off)
same=>n(ok),Dial(SIP/TroncalSIP/${EXTEN})
same=>n,Hangup()
same=>n(off),NoOp(NO TIENE PERMISO PARA LLAMAR)
same=>n,Hangup()

[LDI-SIP]
exten=>_00XXX.,1,NoOp(Larga Distancia Internacional)
same=>n,Read(pass,agent-pass,4)
same=>n,Set(PERMISO=${ODBC_usuariosLdi(${pass})})
same=>n,GotoIf($[${PERMISO}=1]?ok:off)
same=>n(ok),Dial(SIP/TroncalSIP/${EXTEN})
same=>n,Hangup()
same=>n(off),NoOp(NO TIENE PERMISO PARA LLAMAR)
same=>n,Hangup()


-------------------------------------------------------------------------------------------
18.-Interactúan con la tabla usuarios de la base de datos asterisk:



19.- Este seria el esquema de la relación que hay entre extensions.conf, func_odbc.conf,res_odbc.conf,odbc.ini y la Base de Datos:



El próximo post veremos como pasar el CDR(desde el Log) a una base de datos MySQL utilizando el módulo cdr_adaptive_odbc.so

Fuentes de ayuda:
http://ofps.oreilly.com/titles/9780596517342/asterisk-DB.html
http://www.voztovoice.org/?q=node/187

sábado, 4 de febrero de 2012

IP PHONE DE DIGIUM

PHONES FOR ASTERISK




Digium sorprendio esta semana anuanciando sus nuevos productos, los telefonos IP de Digium.

De momento son 03 modelos las que se comercializaran:

D40: Entry-level HD IP phone(2 lineas)
D50: Mid- level HD IP Phone(4 lineas)
D70: Executive-level HD IP Phone(6 lineas

Mas información de las caracteristicas de estos telefonos lo puedes encontrar en este link: Productos IP Phone Digium