Tag Archives: soluciones

Mi experiencia durante el I/O Hack 2015

Hola lectores, tengo varios post acumulados que me gustaría publicar antes de que termine el año, varios son nuevos tutoriales de desarrollo, avances en mi investigación sobre la seguridad en SmartTvs y eventos de tecnología a los que he asistido estos últimos meses.

El 13 y 14 de noviembre se llevó acabo el I/O Hack 2015 en el Tecnológico de Monterrey campus Santa fe y tuve la fortuna de ser uno de los 40 seleccionados para asistir al hackaton. Era la primera vez que asistía a un evento de este tipo, ya sabía de la existencia de los hackatones y sabia más o menos bien de que se trataba pero nunca había tenido la oportunidad de participar en uno.

Pues llegue el viernes 13 (nunca he creído en la mala suerte hehe) al evento sin conocer a nadie, los organizadores y todo el staff eran bastante amable y procuraban que uno se sintiera cómodo en todo momento, ya una vez dentro de las instalaciones se respiraba un aire muy parecido al de un evento en campus party, pequeños grupos hablando sobre tecnología, personas presentándose y hablando un poco acerca de lo que hacen, un par de impresoras 3D en el centro haciendo modelos, etc. rápidamente me integre a uno de los grupos, me presente y comenzamos a platicar acerca de que les parecía el evento, en que programaban, que frameworks manejaban, hardware y demás cosas en lo que empezaba oficialmente el evento.

El hackaton tenía como temática el Internet de las cosas y había 3 categorías principales en las que se podía participar, estas eran:

  • Agricultura
  • Logistica
  • Retail (soluciones para pymes)

Por cada una de ellas se nos dio una plática y se nos hablo acerca de problemáticas muy puntuales a las que se enfrentan hoy en día, en lo personal me gusto bastante la charla sobre agricultura ya que representa una industria millonaria en México, y uno pensaría que agricultura y tecnología no tienen nada en común pero la verdad es que muchos de sus problemas si se pueden resolver usando tecnología.

Para no extenderme demasiado solo diré que al inicio del evento conocí dos personas bastante interesantes, quienes ademas de tener solidas habilidades en programación eran bastante buenos en las cuestiones de algoritmos, complejidad computacional y específicamente tratamiento de imágenes, Fernando Hernandez y Marco Antonio Cruz, al final participamos en la categoría de agricultura desarrollando una solución de reconocimiento de imágenes tomadas mediante fotografía aérea con drones, la idea era detectar cuando una plantación de caña de azúcar comenzara a secarse (analizábamos los niveles de amarillo en las puntas de la planta desde arriba) y con eso alimentábamos una red neuronal para determinar si se estaba echando a perder el producto, desarrollamos nuestro prototipo, hicimos las pruebas y lo presentamos a los jueces obteniendo el tercer lugar del Hackaton 🙂

Bueno hasta aquí mi resumen sobre el evento, lo que más me gusto y con lo que me quede fueron las experiencias que viví, toda la gente que conocí, las tecnologías que aprendí y sobre todo los buenos amigos que hice, ahora, mi intención con este post además de contarles un poco lo que viví es invitarlos a participar en un evento de este tipo siempre que puedan, así que les dejo los pros y contras de un Hackaton.

Pros de asistir a un Hackaton

  • Conoces gente muy interesante (TI, Makers, hackers, etc)
  • Te expones a nuevas tecnologías
  • Aprendes lo que sabes y te enseñan nuevas cosas
  • Haces amigos
  • Resuelves retos y problemas interesantes

Contras de asistir a un Hackaton

  • Si el evento no ofrece viáticos a sus participantes pues es un gasto
  • Si no te gusta desvelarte frente a una computadora eso es un problema
  • Si eres celoso al compartir tus ideas eso es un problema

Les dejo algunas fotos del evento:

CTxZiYVUEAEj3x0

CTytigUUAAAoUmn

CTvbH3WUwAEVMuy

CTu0T0rUYAA0sXc

12243283_10206406595418557_2330651871028124945_n

Tutorial Material Design en Android #4

Crear un Navigation Drawer para Android

Después de una pequeña pausa retomamos la serie de tutoriales de Material Design en Android, en el tutorial anterior aprendimos como agregar iconos (actions) a nuestra Toolbar, así que lo que sigue ahora es aprender cómo implementar el Navigation Drawer.

El Navigation Drawer en Android es un panel que podemos utilizar en nuestra app y que por lo general contiene un menú para movernos o “navegar” por las distintas secciones en la aplicación, la principal ventaja es que puede permanecer oculta la mayor parte del tiempo y desplegarse solo cuando el usuario lo necesite, de esa manera “economizamos” el espacio en la pantalla del teléfono, como en los tutoriales anteriores, si quieren aprender un poco más sobre la teoría siempre pueden consultar la documentación oficial de google Navigation Drawer

patterns_navdrawer_settings1

También vale la pena mencionar que hay básicamente 3 estilos de Navigation Drawer:

  • Navigation Drawer por debajo de la Toolbar oscurenciendola
  • Navigation Drawer por debajo de la Toolbar sin oscurecerla
  • Navigation Drawer por encima de la Toolbar

El estilo que queramos lograr dependerá de cómo escribamos el xml en nuestras views, y un poco de Java también

playstore_styledrawer_bellowdrawer_over_toolbar

Pues manos a la obra, o mejor dicho al código, vamos a nuestro archivo activity_main.xml y deberíamos de tener algo así.

activity_main

Vamos a modificar un poco nuestro código xml y agregaremos un par de elementos llamados DrawerLayout, FrameLayout y NavigationDrawer, viendo la siguiente imagen quedara más claro lo que vamos a hacer en nuestra activity.

drawer_layout_demon

Vamos a crear un elemento android.support.v4.widget.DrawerLayout y vamos a meter todo nuestro código existente dentro de esa etiqueta.

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.alevsk.materialdesignapp.MainActivity">

        <include
            android:id="@+id/app_bar"
            layout="@layout/app_bar" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/app_bar"
            android:text="@string/hello_world" />

    </RelativeLayout>
</android.support.v4.widget.DrawerLayout>

Lo siguiente es crear un Fragment y lo que hago normalmente para tener mi código más organizado es crear un nuevo Package en el proyecto llamado fragments y ahí empiezo a crearlos, para eso en su com.alevsk.materialdesignapp > botón secundario > new > Package y le ponen el nombre que deseen, yo le puse fragments para que sea descriptivo, después de eso procedemos a crear la nueva clase como se muestra en la siguiente imagen.

fragments

Nos aparecerá el siguiente cuadro de dialogo donde tendremos que elegir el nombre del nuevo menú NavigationDrawer (fragmento), le ponemos NavigationDrawerFragment o como ustedes quieran pero que sea descriptivo hacia el hecho de que será el menú de nuestra aplicación, asegúrense de marcar la opción de crear el layout xml y podemos desmarcar las dos opciones de abajo, el código que nos genere Android studio será más limpio y nosotros implementaremos los métodos que necesitamos desde 0, para terminar damos clic en el botón de Finish.

navigationdrawerfragment

Android Studio nos habrá generado dos archivos, NavigationDrawerFragment.java y fragment_navigation_drawer.xml

1

2

En nuestro fragment_navigation_drawer.xml vamos a modificar el elemento principal de Fragment a RelativeLayout quedando el código de la siguiente manera

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.alevsk.materialdesignapp.fragments.NavigationDrawerFragment">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/hello_blank_fragment" />

</RelativeLayout>

Hicimos este cambio ya que más adelante necesitaremos agregar elementos extras como un RecyclerView, a continuación vamos al archivo activity_main.xml y vamos a agregar nuestro NavigationDrawer usando un elemento fragment de la siguiente forma.

    <fragment
        android:id="@+id/fragment_navigation_drawer"
        android:name="com.alevsk.materialdesignapp.fragments.NavigationDrawerFragment"
        android:layout_width="280dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:layout="@layout/fragment_navigation_drawer"
        tools:layout="@layout/fragment_navigation_drawer" />

El codigo final del activity_main.xml es el siguiente:
3

Lo que sigue es crear un objeto NavigationDrawer en nuestro MainActivity.java

NavigationDrawerFragment drawerFragment = (NavigationDrawerFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer);

Si por alguna razón les da un error de compatibilidad asegúrense que en NavigationDrawerFragment.java en la sección de import (hasta arriba) el Fragment que esté utilizando sea android.support.v4.app.Fragment

Ya que estamos en este archivo vamos a crear de una vez un método llamado setUp que va a servir para inicializar los componentes de nuestro NavigationDrawer, también vamos a utilizar un nuevo objeto llamado ActionBarDrawerToogle cuya finalidad es la de manejar nuestro DrawerLayout y Toolbar de una manera más eficiente, así como encargarse de manejar el evento de abrir y cerrar el panel de navegación.

    public void setUp(DrawerLayout drawerLayout, Toolbar toolbar) {
        mDrawerLayout = drawerLayout;
        mToolbar = toolbar;
        mDrawerToggle = new ActionBarDrawerToggle(getActivity(),drawerLayout,toolbar, R.string.open, R.string.close) {
            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);
            }

            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);
    }

Tip: R.string.open y R.string.close son necesarios para el constructor del ActionBarDrawerToggle ya que son los textos que aparecen al abrir y cerrar el panel, pueden definir esas cadenas en su archivo strings.xml que se encuentra en res/values

<string name="open">Abierto</string>
<string name="close">cerrado</string>

De nuevo, aquí mucho cuidado, asegúrense de que el Toolbar que estén importando sea android.support.v7.widget.Toolbar para efectos de compatibilidad, ya que si utilizan la clase por defecto les va a dar errores en los demás archivos.

Lo que acabamos de hacer en nuestro código es definir un nuevo ActionBarDrawerToggle, vinculamos el DrawerLayout y Toolbar que estamos recibiendo desde nuestro MainActivity y preparamos el listener (manejador de eventos) para cuando el usuario abra y cierre el panel de navegación.

En el MainActivity.java después de instanciar nuestro NavigationDrawer mandamos llamar el método

public class MainActivity extends ActionBarActivity {

    private Toolbar toolbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        toolbar = (Toolbar) findViewById(R.id.app_bar);
        setSupportActionBar(toolbar);

        NavigationDrawerFragment drawerFragment = (NavigationDrawerFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer);
        drawerFragment.setUp((DrawerLayout)findViewById(R.id.drawer_layout),toolbar);
    }

La clase NavigationDrawerFragment quedo de la siguiente manera
NavigationDrawerFragment

En este punto, si corremos nuestra aplicación y deslizamos haciendo tap desde la izquierda podemos observar como la pantalla comienza a oscurecerse, si ponemos un poco más de atención podemos ver el texto de nuestro fragment encima de la app”Hello Blank Fragment“, ha funcionado! ahora solo nos queda poner un poco de estilo para hacer a aplicación más agradable a la vista.

navigation_drawer_feo

En nuestro archivo colors.xml (se encuentra en app/res/values/colors.xml) podemos definir nuevos colores, por ejemplo yo he definido uno nuevo llamado graypanel

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="primaryColor">#E91E63</color>
    <color name="primaryColorDark">#C2185B</color>
    <color name="textColorPrimary">#FFFFFF</color>
    <color name="grayPanel">#EEEEEE</color>
    <color name="lightGray">#d6d6d6</color>
    <color name="colorAccent">#8BC34A</color>
</resources>

Y despues en nuestro fragment_navigation_drawer.xml definimos el color de fondo a nuestro RelativeLayout con android:background=”@color/grayPanel”

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/grayPanel"
    tools:context="com.alevsk.materialdesignapp.fragments.NavigationDrawerFragment">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/hello_blank_fragment" />

</RelativeLayout>

navigation_drawer_color

¿Un poco mejor cierto? pero todavía le falta bastante, por ejemplo no resulta obvio para el usuario saber que la aplicación tiene un menú lateral, lo que vamos a hacer es agregar el clásico icono de menú de lado izquierdo, para eso utilizaremos un método llamado syncState de nuestro objeto DrawerToggle.

Nos vamos a nuestro archivo NavigationDrawerFragment.java y agregamos el siguiente código después de haber hecho el mDrawerLayout.setDrawerListener(mDrawerToggle);

        mDrawerLayout.post(new Runnable() {
            @Override
            public void run() {
                mDrawerToggle.syncState();
            }
        });

Corremos la app de nuevo y automáticamente nos aparecerá un icono de menú.

menu_icon

Una vez abierto el menú de navegación rara notaran que si hacemos tap donde se supone que esta el botón de menú el panel se cierra, es bastante raro pues la aplicación no está respetando las “capas”, podemos corregir ese comportamiento bajando un poco el NavigationDrawer.

Modificamos un poco nuestro archivo main_activity.xml, si se fijan bien ahora nuestro DrawerLayout esta debajo de nuestra app_bar, ambos elementos estan al mismo nivel y rodeados por un LinearLayout con orientación vertical.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:background="@color/lightGray"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <include
        android:id="@+id/app_bar"
        layout="@layout/app_bar" />

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <TextView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:text="@string/hello_blank_fragment" />
        </RelativeLayout>

        <fragment
            android:id="@+id/fragment_navigation_drawer"
            android:name="com.alevsk.materialdesignapp.fragments.NavigationDrawerFragment"
            android:layout_width="280dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            app:layout="@layout/fragment_navigation_drawer"
            tools:layout="@layout/fragment_navigation_drawer" />
    </android.support.v4.widget.DrawerLayout>
</LinearLayout>

drawer_navigation

Y eso es todo por ahora, así es como se programa un NavigationDrawer desde 0 :), en el siguiente tutorial implementaremos las opciones en nuestro menú de navegación, para eso aprenderemos a utilizar los RecyclerViews.

He montado un repositorio en Github con el código de la aplicación que vamos desarrollando durante los tutoriales, si tienen alguna duda pueden consultarlo directamente de ahí o preguntarme en los comentarios https://github.com/Alevsk/Material-design-en-Android

salu2

Mi experiencia durante el DragonJar Security Conference

Como muchos saben la semana pasada estuve en Colombia, en la hermosa ciudad cafetalera de Manizales, tuve el honor de ser invitado para impartir un taller de desarrollo seguro de aplicaciones para Android, también tuve la oportunidad de tomar los talleres de otros ponentes y asistir a sus conferencias, fue un Ganar-Ganar XD.

El objetivo de esta publicación es compartir con ustedes un poco de cómo fue mi experiencia durante el congreso, todo lo que me traje y lo que aprendí, la gente que conocí, con la que conviví y con la que nos hicimos amigos :).

DragonJar Security Conference fue un gran evento, uno de los mejores de Latinoamérica si me preguntan, reuniendo a ponentes y asistentes de mas de 7 países y en donde los temas de hacktivismo, seguridad informática, programación y tecnología en general era algo del día a día, literalmente hablábamos de ello en la mañana, en la tarde y en la noche, un paraíso hacker / geek.

Sobre el evento

El evento estuvo dividido en 2 partes: 14, 15 y 16 de septiembre se impartieron los talleres, que fue cuando me toco dar mi taller de programación segura en Android, todos los talleres fueron excelentes y de gran nivel, pero el que mas me gusto fue el de Hacking con Raspberry Pi de mi colega argentino @camicelli, un especialista de la seguridad informática y experto en electrónica y micro computadoras.

El taller de 8 horas consistió en una introducción a Raspberry PI y poco a poco fuimos explorando sus componentes para al final del día construir un sistema de seguridad basado en un lector NFC que se comunicaba con bases de datos SQLite, la Raspberry PI activaban una alarma o abría una cerradura dependiendo de si la tarjeta leída era valida o no (nos toco hacer el cableado con los protoboards y todo eso XD).

Por otra parte, los días 17 y 18 se destinaron a impartir las conferencias, fueron platicas con un gran nivel técnico por expertos de la seguridad informática, representando a grandes empresas como Elevenpaths, Securizame, DragonJar, Websec, etc. y en donde hablaron sobre sus investigaciones realizadas. Hubo tres charlas en especial que me gustaron mucho.

La primera fue de @MateoMartinez1 donde nos hablaba sobre distintos servicios gratuitos que existen en internet para realizar pruebas de denegación de servicios a sistemas y como en conjunto, y con una buena sincronización, podrían ser utilizados para realizar ataques devastadores de gran potencia.

CPIO-WLWwAAILOO

La segunda fue impartida por @UnaPibaGeek en donde indagamos en temas mas esotéricos, me refiero al funcionamiento de los antivirus, direcciones de memoria, ensamblador, y demás temas que a los que analizamos malware nos apasionan >:)

Sheila_A_Berta_djc1

La tercera charla fue sobre explotación practica de desbordamiento de buffer en dispositivos embebidos por @luisco100, donde demostró como con una simple vulnerabilidad era capas de saltar la autenticación de ciertos modelos de routers y con ello ganar control total del mismo, realizar ataques de denegación de servicios, etc.

Experiencia Personal

Por otra parte, creo que lo mas importante que me llevo del evento fue conocer a grandes personalidades de la seguridad informática de Latinoamérica y España, convivir de cerca con ellos, ir a cenar juntos, recibir sus consejos, aprender de su experiencia, gente que lleva mas de 10 años en la industria y que muestran una gran humildad hacia los que apenas vamos empezando, es un sentimiento muy padre.

Haber tenido estas experiencias me hacen creer que las decisiones que he tomado hasta el momento en mi vida profesional y que me han llevado hasta donde estoy ahora han sido las correctas o por lo menos no la he %#$% tanto :p.

De regreso a México, en el aeropuerto de Manizales, platicando con un amigo español Hesaúl Sánchez, del equipo de ciberseguridad de Telefónica, me dio uno de los mejores consejos que he recibido jamás y que quiero compartir con ustedes, lo que entendí fue mas o menos esto:

Hay que aprender a venderse, demostrar de lo que somos capaces y lo que podemos aportar a la comunidad, las oportunidades están ahí, solo tenemos que ir y tomarlas. Hay gente con muchísimo potencial ahí afuera pero no sabe como venderse y al final terminan siendo administradores de sistemas o desarrolladores en alguna empresa pequeña que nadie conoce.

Por eso mi apuesta es a la investigación, platicaba con un amigo @ctoxtli, si bien la investigación no es algo que tenga mucha prioridad para la gran mayoría de las empresas en México, si te puede hacer ganar viajes todo pagado a países remotos, por eso yo los animo a participar en todos los call for papers, sea cual sea su área de especialización, puede que de 100 eventos los acepten en 1 y entonces comenzaran a forjarse una reputación en su comunidad :). Al final del dia lo que pienso es:

Cualquiera puede viajar como turista a un país extranjero, pero no cualquiera puede viajar como invitado a compartir sus conocimientos y experiencias para la comunidad.

Los dejo con algunas fotos y videos sobre el evento!

CPOo941WcAAm_YN

Si me preguntan por que no alcance a llegar a la foto es por que estaba muy ocupado preparando el Security Room con @hkm XD

photo_2015-09-22_15-00-49

En la foto: @calderpwn @MateoMartinez1 @SamuraiBlanco y yo (@Alevsk)

CPKTRCsWcAAretx

@Websec team: @calderpwn @hkm y @Alevsk

photo_2015-09-22_15-03-04

En la foto con @UnaPibaGeek y @lawwait

KXcPfYRL (1)

Una foto un poco mas borrosa donde tambien aparece @calderpwn y @jjtibaquira

Security Room: Dragonjar security conference 2015

Esto fue un poco del Security Room! #HackParty

Posted by Jose Pino on Sunday, September 20, 2015

Un video del Security Room (fiesta h4x0r) tomado por @jofpin

ninjas

Pelea de ninjas XD @lawwait VS @javierantunez

CPP9n9GWoAAsOGV

Sabes que el Security Room estuvo bueno cuando el proyector se derritió XD

N9IUcKr8

Los mexicanos y @DragonJAR organizador del congreso

Mas fotos del Security Room

12019912_501735546663027_2704244810881193144_n

photo_2015-09-22_15-02-09

photo_2015-09-22_15-02-32

photo_2015-09-22_15-03-40

Saludos especiales para:

@hkm @calderpwn @MateoMartinez1 @luisco100 @Hesaulsr @javierantunez @jjtibaquira @camicelli @NoxOner @UnaPibaGeek @lawwait @SamuraiBlanco @DragonJAR @jofpin @Mazt0r @acorazada @Dylan_irzi11 @ElZ00Rro @BatmanEsFriki

Una disculpa si falta alguno, pero es que son tantos nicks que no los recuerdo todos XD

Si quieren revisar la lista completa de talleres y conferencias impartidas durante el evento lo pueden hacer en el sitio oficial DragonJar Security Conference

Dragonjar Security Conference 2015

Durante la semana del 14 al 18 de Septiembre de este año se celebrara en Manizales Colombia uno de los congresos de seguridad informática más importantes en Latinoamérica, en el que tendré el honor y placer de participar impartiendo un taller de desarrollo seguro de aplicaciones para Android :). Dragonjar Security Conference es organizado para la comunidad Dragonjar, una de las comunidades mas antiguas y respetadas de habla hispana.

CNd5g04UEAA9PPJ

Capture

@DragonJarCon es un evento que reúne ponentes y talleristas de 7 países y en donde aprenderás las últimas técnicas obre programación segura, pentesting, informática forense y muchísimos temas más, les dejo la lista completa:

  • Vulnerabilidades 0-day
  • Pentesting.
  • Seguridad en Redes.
  • Ingeniería Social.
  • Criptografía.
  • Seguridad Física.
  • Seguridad Móviles
  • Computo Forense
  • Seguridad en Entornos Industriales
  • Seguridad en la Nube
  • Seguridad en Tecnologías Emergentes
  • Desarrollo y programación segura

Si estas interesado en saber mas acerca de las conferencias y talleres impartidas durante el evento puedes revisar directamente en la pagina principal Dragonjar Security Conference 2015

Gana una entrada para la Dragonjar security conference 2015 en Manizales Colombia

Si eres un entusiasta de la seguridad informática y el hacking ético, definitivamente es un evento que no te puedes perder, así que estaremos rifando una entrada para asistir a las conferencias del evento, participar es bastante sencillo.

Las bases son las siguientes:

  • Es requisito indispensable que los participantes en el concurso sean de Colombia o que tengan disposición de viajar al evento (Universidad de Manizales).
  • Para entrar en el sorteo deberás dar RT a esta publicación en el siguiente enlace https://twitter.com/Alevsk/status/642155277417103361
  • Por ultimo escribir un comentario en este post acerca de cuál es tu libro o película de Hacking favorito, no te olvides de escribir tu usuario de twitter.

Y eso es todo, tienen desde hoy hasta el miércoles 16 de septiembre a las 12:00 del medio día para inscribirse, una vez cerradas las inscripciones los organizadores de DragonjarCON seleccionaran al ganador mediante un sorteo en random.org.

Buena suerte a todos!

Si tienes una Smart Tv de LG tu vecino puede espiar lo que estas viendo

A mediados del año pasado compre una smart tv de 55 pulgadas de la marca LG, la idea era bastante simple, videojuegos xd, también ver series y películas en alta definición con la familia. La verdad es que no tengo tanto tiempo libre como para ver tv, sin embargo estos últimos días he tenido ganas de usar mi televisión, pero no de la forma convencional 🙂

TV-LG-LM7600

Me puse a leer acerca de cómo funcionan las Smart Tvs, mas que nada para tener un background del tema, y vi que específicamente para este proveedor (LG) existe toda una comunidad detrás, foros, blogs, artículos y muchísimo material enfocado en el desarrollo para su plataforma webOS, pueden descargar y leer sobre la sdk en el siguiente enlace http://developer.lge.com/webOSTV/

Como muchos saben las televisiones Smart se conectan a Internet (en general los productos smart), esto significa que tienen asignada una dirección IP en nuestra red así que procedemos a realizar un escaneo de puertos utilizando nmap.

nmap -sV -p- -oA scan/scan -d 192.168.0.11

port

Viendo los logs del escaneo y leyendo el manual técnico sabemos que hay un par de servicios web corriendo en la televisión.

De acuerdo con la documentación esta pagina es una especie de api en XML para enviar comandos directamente a la televisión :). Haciendo una búsqueda rápida en Google encontramos esta fabulosa librería en PHP de Steve Winfield que nos permite comunicarnos con las televisiones https://github.com/SteveWinfield/PHP-LG-SmartTV

Lo único que necesitamos es un PIN de 6 dígitos que no conocemos, pero que podemos encontrar utilizando un ataque de fuerza bruta, que es lo que yo he hecho :). Con ayuda de este pequeño código es posible encontrar el PIN correcto de cualquier Smart Tv de LG

<?php 
include 'PHP-LG-SmartTV/smartTV.php';
$tv = new SmartTV('192.168.0.11',8080);
$code = 100000;
while(true) {
	$response = testCode($tv,$code);
	if($response) {
		print "The pairing key is: " . $code . "\n";
		break;
	}
	print "Wrong key: " . $code . "\n"; 
	$code++;
}
function testCode($tv,$code) {
	$tv->setPairingKey($code);
	try {
		$tv->authenticate();
		return true;
	} catch (Exception $e) {
		return false;
	}
}
?>

Después de unos minutos tenemos el PIN (pairing key)

bruteforce

En esta etapa del experimento descubrí cosas interesantes

  • Durante el ataque de fuerza bruta, al inicio de cada negociación de autenticación en la pantalla de la televisión aparece el PIN de 6 dígitos (dura menos de 1 segundo y después desaparece por que estamos intentando cientos de veces cada segundo), esto es así por que se supone que tenemos acceso físico a la pantalla, ósea estamos en la misma habitación, y debemos de copiarlo para usarlo con la librería.
  • Si realizamos suficientes peticiones en un segundo esto ocasionara un ataque de denegación de servicios a la televisión! El control remoto deja de funcionar y básicamente no podemos hacer nada, la única forma de apagar la tv es desconectarla directamente de la toma de corriente.

bruteforce

Así que ya saben, si notan un comportamiento de este tipo significa que alguien en su red esta tratando de hackear su televisión :p

Tener el PIN de autenticación de la televisión significa que básicamente podemos controlarla como si tuviéramos en control en nuestras manos, podemos apagarla, cambiar de canal, subir volumen, bajar volumen, programar despertador, por mencionar algunos ejemplos.

Sin embargo creo que el comando mas interesante de todos es TV_INFO_SCREEN, y por el que la mayoría de ustedes esta aquí, TV_INFO_SCREEN nos permite tomar una captura de pantalla de lo que sea que se esta reproduciendo en la televisión, con ayuda de JavaScript y un poco de Ajax se puede hacer una pequeña interfaz web para visualizar las imagenes de una forma mas “cómoda”.

test

Resumiendo

  • Los servicios web que corren las televisiones se ejecutan en puertos bien conocidos y no hay forma de cambiarlos (al menos no he encontrado como todavía)
  • Un atacante remoto puede realizar ataques de fuerza bruta para obtener el PIN de 6 dígitos
  • Un atacante remoto puede ocasionar un ataque de denegación de servicios a la televisión
  • Un atacante remoto puede obtener capturas de pantalla de lo que estamos viendo

Continuare haciendo mas investigación en esta area a ver que encuentro 🙂
Happy hacking