miércoles, 3 de abril de 2013

Función getpass()

   Esta función para Gnu con linux la podemos usar para pedir al usuario que introduzca una contraseña, y que quede un poco más profesional que con un scanf a secas. Cual es la diferencia, pues (aparte de otras) que esta función desactivará el "echo" en la terminal. Para los que no sepan lo que hace el "echo", nos muestra los caracteres que vamos escribiendo, si queréis podéis probar a ejecutar `stty -echo' en vuestra terminal, exacto a que ahora no veis nada de lo que ponéis :p (pon `stty echo' para volver a activarlo).

   Ahora que recuerdo, la primera vez que oí hablar sobre el "echo" fue haciendo una practica de las revistas de hackxrack, donde te pedían habilitarlo en el telnet, buenos recuerdos :).

   Ok, resumiendo, el usuario no verá lo que escribe, como pasa cuando intentamos introducir una contraseña en cualquier otro sitio. La sintaxis es esta:

#include <unistd.h>

char *getpass( const char *prompt);

   Vemos que la función nos retornará un puntero apuntando a la dirección de memoria donde se alojará la string que introduzca el usuario. Como parámetro le podemos meter una cadena de texto, que será lo que imprima antes de pedir la contraseña. Vamos con el ejemplo:

char *pass;     // Declaramos el puntero.
pass = getpass("Contraseña: ");     // Asignamos al puntero declarado la salida de la función.
                                    // Metemos como parámetro una string.
fprintf(stdout,"Tu contraseña es: %s\n",pass);     // Imprimimos la contraseña que ha 
                                                   //   introducido el usuario.

   Otra forma:

char *pass;
char *text = "Contraseña: ";     // Declaramos además otro puntero con la string.
pass = getpass(text);     // En este caso especificamos como parámetro el puntero.
fprintf(stdout,"Tu contraseña es: %s\n",pass);

   A partir de este post y en los sucesivos, voy a añadir una captura de como es la salida real del programa, para que sea un poco más visual.

   Ver `man getpass' para mas info.

imagen de ejecucion

Función getuid() y geteuid()

   Estas funciones como su propio nombre indica, obtienen el UID del usuario, en sistemas Gnu con linux. Más tarde explicare para que se suele usar.

   Echando mano del `man' vemos las estructura de la función:

#include <unistd.h>
#include <sys/types.h>

uid_t getuid(void);
uid_t geteuid(void);

   Tenemos que incluir dichas cabeceras, y como vemos la función retorna un tipo de dato desconocido (por ahora :p), y no hace falta pasarle parámetros. A menudo se suelen poner nombres que nos son desconocidos, para identificar el tipo de dato de una función concreta, por ejemplo el tipo de dato "uid_t" no es más que un entero, pero al tener ese nombre ya nos confunde :p. De ahí que hayamos puesto la cabecera "types.h".

   Ok, ¿ para que podríamos usar esto ?, primero hay que saber que es el uid (si has trabajado alguna vez en sistemas linux lo deberías saber :p). Es el identificador de usuario, un número entero que nos identifica (ejecutar `id -u ' para saber tu id). Donde esta la gracia de esto, pues que el usuario root (superusuario) siempre tendrá como UID el valor 0. Con lo cual si para ejecutar unas tareas en nuestro código necesitamos que el usuario que lo haya lanzado tenga los permisos de root, podemos saber perfectamente si los tiene o no, y en caso contrario mandarle un mensaje indicándoselo.

uid_t uid;         // Declaramos el tipo de dato que contendrá el UID (es un int).
uid = getuid();    // La función retorna el ID del usuario que llamó al proceso.
if(uid != 0){      // Si no es 0 no es root.
  fprintf(stderr,"ERROR: Debes lanzar el programa como \"root\".\n");
  return -1;
}

   La función geteuid() es parecida a la anterior solo que muestra el id del usuario "efectivo". Con la función anterior tenemos de sobra, esta se usa más para detectar escaladas de privilegios (creo recordar).

   Ver `man getuid' para más info.

imagen de ejecucion

Función __fpurge()

   Antes de explicar nada quiero contar lo que quiero hacer. He estado pensando en hacer como un pequeño wiki de las funciones que he ido viendo y que iré aprendiendo, para que si alguna vez alguien necesita información acerca de alguna, tenga un explicación más o menos aclaradora de como funciona.

   Las funciones que ponga no van a ser las "estándar" como printf() o similares por que ya hay abundante documentación. Intentaré poner algunas más escondidas y inevitablemente serán orientadas a sistemas Gnu/linux por que programo en ese entorno.

   Como último punto aclarar que intentaré centrarme solo en explicar el uso de la función, la sintaxis y alguna recomendación. Lo que quiero es hacerlo todo los más concreto y sencillo posible.

   Ok, sobre la función __fpurge(), se encarga de limpiar el stream de datos (buffer) que le indiquemos en sistemas Gnu/linux. Los síntomas son, cuando teniendo el código bien, el programa devuelve valores inesperados, o se salta alguna entrada desde teclado.

   Esta función debemos declararla de esta manera:

#include <stdio.h>

void  __fpurge(FILE *stream);

   No devolverá nada y como parámetro de entrada le indicaremos el stream de datos a limpiar. Y la llamada a la función la haremos antes de donde tengamos la función de entrada de datos. Ej:

__fpurge(stdin);     // Limpiamos el buffer de entrada estándar.
scanf("%d",&num);

   Yo recomiendo usarlo siempre para asegurar la correcta ejecución del programa.

   Ver `man __fpurge' para más info.

lunes, 1 de abril de 2013

En Semana Santa .... Venganza

Tras este tremendistico título se esconde en la primera puerta un cuento "medieval":

"Erase una vez, en un reino muy lejano y extraño, en el cual el granizo eran doblones de oro; se erigía una fortaleza inexpugnable que ni siquiera los mejores caballeros pudieron entrar en dicha fortaleza.
En esta fortaleza eran aceptados "casi" todo tipo de personas, campesinos, renegados, proscritos, pero no violadores.

Una vez en un reino cercano a el, un vasallo de un señor feudal afrento contra el señor de la fortaleza anteriormente descrita; debido a esta afrenta el señor de la primera fortaleza declaro la guerra a estos, para lo cual envío millones y millones de guerreros (por no decir billones), con los que consiguió masacrar a estos, a los de alrededor y al mundo entero y parte de el extranjero.

Con dragones y princesas y castillos encantados, el que se halla enterado que levante la mano."

Tras este mini cuento se escondía todo lo sucedido estos últimos días en Internet sobre el "mayor ataque Ddos de la historia" y el "apocalipsis de Internet" que como creo que todos sabemos implica a las compañias CyberBunker, Spamhaus, Cloudflare.

Vamos a ver a quienes nos estamos refiriendo:

Cyberbunker es un operador de hosting alemán en que se puede a alojar casi cualquier tipo de contenido (pedofilia y terrorismo no se puede alojar allí).

Spamhaus es un servicio muy reconocido en la lucha contra el spam.

Cloudflare protege y acelera cualquier sitio web en línea.

El cuento en verdad no era el anterior; si no la noticia en si, ya que parece ser que no fue tanto como se comento en las noticias dadas por los grandes de la información, así lo recogió el redactor de Segu-info de Gizmodo USA a pesar de ser una cifra muy grande (300 gbps) para que la pudiese manejar un solo proveedor, no es nada para las capacidades globales de Internet en cuanto a transferencia se refiere.

Por lo que pude constatar en esos días fue que la página web de Cloudflare funcionaba con regularidad, pero tanto las páginas web alojadas por este como la página de Cyberbunker se encontraban caídas.

El tipo de ataque que realizaron la gente de Cyberbunker es conocido como Smurf o de amplificación DNS en el cual con un pequeño trafico generado por el atacante se genera una gran tráfico en la victima.

Este tipo de ataques (Smurf) utilizando los servidores DNS se esta popularizando por lo dañinos que pueden legar a ser por culpa de la amplificación que puede llegar a un 67%.

Así que no os creáis todo gente, saludos y hasta la próxima.

Fuente: Segu-info y Security By Default

miércoles, 6 de marzo de 2013

Modificar el prompt de la terminal




  Cuando se trabaja mucho desde consola a veces se hace pesado el prompt por defecto que nos ofrece los S.O. Gnu/linux. Por eso la mayoría de personas que llevan ya un tiempo con linux la personalizan para que además de ser mas agradable a la vista, nos de información útil.

  El prompt simplemente es una string, con unos valores determinados que se guarda en una variable. La variable que contiene como debe ser el prompt se llama '$PS1'. El formato de la variable esta en el archivo de configuración de la shell "~/.bashrc" (en debian). Para ver el contenido actual de esa variable por ejemplo en mi debian:

kike@localhost:~$ printf "%s\n" "$PS1"
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$

  Nos interesa quedarnos con la última parte '\u@\h:\w\$', cada carácter significa una cosa:

  • \u   Representa al usuario actual logeado (user). Salida de `whoami'.
  • \h   Representa el nombre de la maquina sin el dominio (hostname). Salida de `hostname'.
  • \w   Representa el directorio de trabajo (Working Dir). Salida de `pwd'.
  • \$   Es el ID, mostrará '#' para root y '$' para usuarios normales.

  Esta string con ese formato es interpretada para mostrar el prompt como lo vemos. Pero podemos añadir muchas más cosas, primero os pongo la lista de formatos que podemos meter (he intentado traducir casi todo):

\a  Alerta       Alerta.
\d  Date         Fecha en formato "Día Mes Fecha" (Ej: Sat Jan 15).
\D{format}       The format is passed to strftime(3) and the result is inserted into the 
                   prompt string an empty format results in a locale-specific time
                   representation. The braces are required.
\e  Escape       Carácter Esc.
\h  Hostname     Nombre de la máquina sin el dominio (Ej: host)
\H  Hostname     Nombre completo de la máquina (Ej: host.empresa).
\j  Jobs         Número de trabajos en background activos.
\l  Tty          Nombre del terminal corriente (Ej: tty1).
\n  Newline      Nueva línea.
\r  Return       Retorno de carro.
\s  Shell        Nombre del shell (basename $0).
\t  Time         Horario en formato 24 horas HH:MM:SS
\T  Time         Horario en formato 12 horas HH:MM:SS
\@  At           Horario en formato 12 horas HH:MM am/pm
\A  At           Horario en formato 24 horas HH:MM
\u  Usuario      Nombre de login del usuario corriente.
\v  Versión      Versión de Bash (Ej: 4.01)
\V  Versión      Versión+subversión de Bash (Ej: 4.01.5)
\w  Working Dir  Directorio corriente, ruta completa ($PWD).
\W  Working Dir  Directorio corriente, solo el último (basename $PWD).
\!  Histórico    Número del comando en el historial.
\#  Número       Número del comando corriente.
\$  ID           Muestra "#" para root, "$" para usuarios normales.
\nnn    Octal    Carácter cuyo octal es nnn .
\\  Backslash    Barra invertida \ literal.
\[  Escape       Inicia una secuencia de escape (Ej: código de colores).
\]  Escape       Termina una secuencia de escape.


  Ahora que ya sabemos eso solo tenemos que modificar la variable a nuestro gusto, añadiendo o quitando lo que queramos. Para editar la variable podemos hacerlo con:

export PS1='${debian_chroot:+($debian_chroot)}'

  Lo que primero se suele hacer es ponerle color, más que por estética, para ver donde acaba un comando y empieza otro. Lo que suelen hacer muchos usuarios es dejar un espacio entre comando y comando, pulsando 2 o tres veces el para que se vea donde esta la separación, pero con lo del color estaría solucionado :). La lista de colores es la siguiente con los caracteres de escape (\[...\]) ya añadidos:

\[\e[0;30m\]   # Negro
\[\e[0;31m\]   # Rojo
\[\e[0;32m\]   # Verde
\[\e[0;33m\]   # Amarillo
\[\e[0;34m\]   # Azul
\[\e[0;35m\]   # Violeta
\[\e[0;36m\]   # Cían
\[\e[0;37m\]   # Blanco

# Sustituyendo el 0 por 1 será tipo bold:
\[\e[1;30m\]   # Negro - bold
\[\e[1;31m\]   # Rojo - bold
...

# Sustituyendo 0 por 4 será tipo subrayado.
\[\e[4;30m\]   # Negro - subrayado
\[\e[4;31m\]   # Rojo - subrayado
...

# Sustituyendo 0;3 por 4 será color de fondo:
\[\e[40m\]   # Negro - fondo
\[\e[41m\]   # Rojo - fondo
...

# Donde queremos que el color termine pondremos:
\[\e[0m\] # Resetear color.

  Unos ejemplos serían:

kike@localhost:~$ export PS1='${debian_chroot:+($debian_chroot)}\[\e[0;31m\]\u@\h:\w\$\[\e[0m\] '
kike@localhost:~$ export PS1='${debian_chroot:+($debian_chroot)}\[\e[1;32m\]\u:\w\$\[\e[0m\] '
kike:~$ export PS1='${debian_chroot:+($debian_chroot)}\[\e[0;32m\]\u\[\e[0m\]@\[\e[0;31m\]\h\[\e[0m\]:\w\$ '
kike@localhost:~$ export PS1='${debian_chroot:+($debian_chroot)}\[\e[1;31m\]\u\[\e[0m\]> '
kike>

Ejemplo1

  También podemos introducir saltos de líneas para tener un prompt con varias líneas, y meter otros formatos:

kike@localhost:~$ export PS1='${debian_chroot:+($debian_chroot)}\[\e[0;31m\]Terminal: \l :: \t\n\u@\h:\w\$\[\e[0m\] '
Terminal: 7 :: 01:04:48
kike@localhost:~$

Ejemplo2

  Para que estos cambios sea permanentes, basta con añadir el comando (export PS1='...') al final del archivo "~/.bashrc". Ahora dejo el resto a la imaginación de cada uno, el poder pasar de un prompt insulso a un un prompt útil.

Ejemplo3

miércoles, 23 de enero de 2013

Windows Azure | Pequeña Reseña | Desarrollo Web Part.1

Windows Azure (anteriormente Azure Services Platform) es una plataforma ofrecida como servicio y alojada en los Data Centers de Microsoft. Anunciada en el Professional Developers Conference de Microsoft (PDC) del 2008 en su versión beta, pasó a ser un producto comercial el 1 de enero del 2010. Windows Azure es una plataforma general que tiene diferentes servicios para aplicaciones, desde servicios que alojan aplicaciones en alguno de los centros de procesamiento de datos de Microsoft para que se ejecute sobre su infraestructura (Cloud Computing) hasta servicios de comunicación segura y federación entre aplicaciones.

En cuanto a la privacidad de dicho servicio : Microsoft permite que el gobierno de los Estados Unidos tenga acceso a los datos almacenados incluso si el cliente no fuera estadounidense y los datos residen fuera de Estados Unidos, de acuerdo a la Ley USA PATRIOT.  

Fuente Wikipedia.

Tengo un tiempo usando este servicio y por lo general es exelente, existen 2 formas de usar esta plataforma, de forma gratuita ( 3 meses) o de pago, esta ultima podemos hacer una cotizacion de los servicios que queremos usar y como resultado el costo del mismo. Entre los servicios tenemos :

1.Sitios Web.
2.Maquinas Virtuales
3.Servicios en la Nube
4.Servicios Moviles.

Para gestionar nuestros servicios nos dirigimos a :

https://manage.windowsazure.com/ .
Me dirigo a Nuevo y tenemos esto :
En procesos ---> Sitio Web :
Tenemos 3 Opciones : Creacion Rapida , Creacion Personalizada y De La Galeria. Esta ultima nos trae diferentes aplicaciones
Como podemos observar, el servicio de Sitio Web es bastante amplio y muy comodo para los desarrolladores Web. En mi caso voy a elegir Creacion Rapida para un ejemplo.
Ahora un vista previa de sputnik :
A la derecha , nos descargamos el perfil de publicacion, mas adelante hablare sobre esto. Por ahora veamos que tal se ve la Web
Usando Networks Tools , tenemos la siguiente informacion, podemos comprobar la region que hemos elegido:
Para trabajar con vuestra web, necesitamos WebMatrix que no es mas que con conjunto de herramientas para facilitar el desarrollo web al programador , lo podemos descargar desde la pagina oficial de Microsoft : http://www.microsoft.com/web/webmatrix/ Captura de Inicio de WebMatrix 2:
Elegimos Abrir Sitio -->Sitio Remoto ---> Importar Perfil de Publicacion. Os Acordais del Publish que descargamos? Pues ya esta, eso deberiamos importar.Nos aparecera la configuracion del  Sitio , le damos a siguiente y listo.
Bien, procedemos a borrar el archivo hostingstart.html y creamos un nuevo archivo : Archivo --> Nuevo ---> Archivo En mi caso sera un Script PHP:
Y aqui esta el codigo :
Y Aca el resultado :
Esta es la ventaja de tener el Publish asociado con WebMatrix de Microsoft, guardando el Script y subiendolo automaticamente al Sitio :) Por ahora esta fue la breve reseña de Windows Azure.


Hasta la Proxima. Saludos.

miércoles, 3 de octubre de 2012

Ya hay un SHA-3

Ayer finalizó la última ronda de la competición por el puesto de 3er Algoritmo Estándar de Hash (SHA-3 por sus siglas en inglés), resultando en la victoria del KECCAK, a continuación, una traducción del anuncio: