Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - AlbertoBSD

#1701
Criptografía / Libgcrypt paso a paso
29 Marzo 2016, 17:44 PM
Muy buen dia, este sera un pequeño taller para entender un poco mas sobre criptografía paso a paso usando lenguaje C y la libreria Libgcrypt.

Nota para el moderador Lo pongo en Cryptografia  y no en C/C++ por ver el detalle de los conceptos criptograficos.

Asi podremos observar paso paso el contenido de la memoria  :silbar: y como esta cambia.

Antes de programar con libgcrypt yo solo sabia los conceptos básicos de Criptografia pero en general desconocía a grandes rasgos la forma interna de trabajar de programas como GnuPG entre otros.

Los códigos que pondré aqui estan a su disposición para practicar con la librería y los conceptos criptográficos y estan disponibles en github

https://github.com/albertobsd/libgcrypt-examples

Creacion de par de Claves RSA

Bien el primer tema sera crear una clave RSA de cierta cantidad de bits y ver como esta esta clave en la memoria.

El primer ejemplo esta bajo el nombre RSA_2048.c aunque en realidad el ejmplo crea un par claves de 4096 bits
https://github.com/albertobsd/libgcrypt-examples/blob/master/RSA_2048.c

El programa genera un nuevo par de claves RSA de 4096 bits y los guarda en formato S-Expresion en un archivo llamado clave.txt por si tienen ese archivo ya existente con datos seria sobreescrito.

El codigo y luego explicare las partes interesantes por serparado.

/*
Twitter @albertobsd
cc -o RSA_2048 RSA_2048.c `libgcrypt-config --cflags --libs`
Prueba de generacion de claves RSA 2048 y 4096 bits.
*/

#include<stdio.h>
#include<gcrypt.h>

int main() {
FILE *f = NULL;
gcry_sexp_t rsa_parms = NULL;
gcry_sexp_t rsa_keypair = NULL;
gcry_error_t err = 0;
char *buffer;
size_t length = 4;
size_t offset = 0;
err = gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN);
err |= gcry_control (GCRYCTL_INIT_SECMEM, 16384, 0);
err |= gcry_control (GCRYCTL_RESUME_SECMEM_WARN);
err |= gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
if(err) {
fprintf(stderr,"gcrypt: failed initialization");
exit(0);
}
err = gcry_sexp_build(&rsa_parms, NULL, "(genkey (rsa (nbits 4:4096)(rsa-use-e 1:1)))");
if (err) {
fprintf(stderr,"gcrypt: failed initialization");
exit(0);
}
length = gcry_sexp_sprint(rsa_parms,GCRYSEXP_FMT_CANON,NULL,0);
buffer = calloc(length,sizeof( char));
offset = gcry_sexp_sprint(rsa_parms,GCRYSEXP_FMT_CANON,buffer,length);
printf("Buffer size %i\n",length);
printf("Buffer offset %i\n",offset);
printf("%s\n",buffer);
memset(buffer,0,length);
err = gcry_pk_genkey(&rsa_keypair, rsa_parms);
if (err) {
fprintf(stderr,"gcrypt: failed initialization");
exit(0);
}
length = gcry_sexp_sprint(rsa_keypair,GCRYSEXP_FMT_CANON,NULL,0);
buffer = realloc(buffer,length*sizeof(char));
offset = gcry_sexp_sprint(rsa_keypair,GCRYSEXP_FMT_CANON,buffer,length);

printf("Buffer size %i\n",length);
printf("Buffer offset %i\n",offset);
printf("%s\n",buffer);
f = fopen("clave.txt","w");
if(f) {
fwrite(buffer,sizeof(char),offset,f);
fclose(f);
}
memset(buffer,0,length);
free(buffer);
gcry_sexp_release(rsa_keypair);
gcry_sexp_release(rsa_parms);
}


Si bien no entrare en algunos de los detalles de libgcrypt eso queda a tarea del lector.

gcry_sexp_build(&rsa_parms, NULL, "(genkey (rsa (nbits 4:4096)(rsa-use-e 1:1)))");

La funcion anterior solo genera una cadena en formato S-expresion con instrucciones para posteriormente generar un par de claves:

"(genkey (rsa (nbits 4:4096)(rsa-use-e 1:1)))"

Si queremos crear un par de clave de 1024 bits solo cambiaremos el 4096 por 1024 y asi susesivamente.

Si ejecutamos el programa veremos un salida similar a la siguiente:


Buffer size 49
Buffer offset 48
(6:genkey(3:rsa(5:nbits4:4096)(9:rsa-use-e1:1)))
Buffer size 2441
Buffer offset 2440
(8:key-data(10:public-key(3:rsa(1:n513:


Veamos informamos de cuanta memoria se uso para el buffer y acontinuacion vemos una cadena similar a la que le pasamos al programa:

Citar
(6:genkey(3:rsa(5:nbits4:4096)(9:rsa-use-e1:1)))

por ejemplo:
6:genkey <-6 bytes
3:rsa <- 3bytes
5:nbits <- 5 bytes
4:4096 <- 4 bytes
etc...

Generamos la clave:

gcry_pk_genkey(&rsa_keypair, rsa_parms);

La guardamos en un buffer con memoria previamente reservada:

offset = gcry_sexp_sprint(rsa_keypair,GCRYSEXP_FMT_CANON,buffer,length);


La imprimimos en pantalla

printf("%s\n",buffer);

pero bien la salida al parecer esta trunca:

Citar
Buffer size 2441
Buffer offset 2440
(8:key-data(10:public-key(3:rsa(1:n513:

Para esto guardamos el buffer completo en un archivo:

fwrite(buffer,sizeof(char),offset,f);

Y si revisan el contenido del archivo veran  :o :o :o el formato completo de las claves en el formato descrito en la documentacion de libgcrypt

Citar

(private-key
  (rsa
    (n n-mpi)
    (e e-mpi)
    (d d-mpi)
    (p p-mpi)
    (q q-mpi)
    (u u-mpi)))

(public-key
  (rsa
    (n n-mpi)
    (e e-mpi)))

+ Otros  datos

https://gnupg.org/documentation/manuals/gcrypt/RSA-key-parameters.html#RSA-key-parameters
#1702
Criptografía / Proteger par de claves RSA
29 Marzo 2016, 15:06 PM
Buen dia foro. Estoy viendo las alternativas para proteger el par de claves RSA.

Tengo este programa en el que estoy trabajando, un projecto personal.

El programa genera el par de claves RSA de 1024 o 2048 con la API de libgcrypt, ya puedo cifrar y firmar los archivos con dicha clave.

El programa es mas o menos autonomo, he visto que normalmente se trabaja con un password para cifrar las claves con AES o algun otro algoritmo de cifrado simetrico, y asi solo la persona que conoce el password tiene acceso al par de claves.

Pero como mi programa es autonomo estoy buscando una alternativa mis idias son las siguientes.


  • Buscar un tipo de UUID en la maquina y usar su sha256 de password
  • Generar un archivo random y usar su sha256 de password
  • hardcodear el password en la aplicacion (mala idea) pero es una opcion

¿Alguna otra?

¿Que suguieren ustedes?

Saludos.
#1703
Muy buen dia.

Depues de 7 dias de estar jugando con la API de telegram he escrito una interaz para usarla en lenguaje C.

Libtelegrambot

Si alguien quiere usarla y practicar con ella para los fines que quiera esta disponible. Pueden reportar fallas en la pagina de github

Ya con la interfaz lista voy a comenzar una sección genérica de comunicación en mi programa
Asi si un dia decido de cambiar de canal, solo tendre que cambiar las llamadas de mi sección a una nueva API o plataforma.

ejemplo:

Ahora
Citar
progama_getUpdates() {
  telegram_getUpdates();
}

En caso de cambiar de plataforma
Citar
progama_getUpdates() {
  another_getUpdates();
}

#1704
Estaba pensando en los pros y contras antes de irme a dormir y amaneci con esas mismas ideas.

Estoy viendo otras opciones como
:https://core.telegram.org/

Aun asi, al igual que los otros metodos tambien esta el riesgo que terminen quitando el canal de comunicación.


Saludos!.

#1705
No es tan facil.

Aun asi si es un blanco especifico podrias hacer un poco de estudio previo saber que sistema tiene y en base a eso planear un buen vector de ataque.

Ejemplo:
Enviar un link que apunte a un servidor propio con contenido "legal" por ejemplo una pagina de noticias para no levantar sospechas.

Con esto obtienes el user-agent y asi por ende el sistema opertivo y version del navegador.

Proximo paso mandar un enlace similar ahora un vetor de ataque.

Hacking basico

Saludos
#1706
Cita de: engel lex en 19 Marzo 2016, 06:05 AM
Puedes usar email y crear una especie de cliente de correo

Buena idea, voy a pensarlo a ver que tal va.

Jaja ya estaba pensando en un protocolo de comunicación usando IRC y algun servidor al estilo FreeNode.

Voy a ver los pro y contra de las opciones. A ver si se me ocurre alguna otra.
#1707
Cita de: PalitroqueZ en 19 Marzo 2016, 04:04 AM
y los datos los manejas con PGP.

Uso libgcrypt para manejar la criptografia, como lo comento la criptografia no es problema

Cita de: engel lex en 19 Marzo 2016, 04:30 AM
La red tor no te sería tan útil

Algun argumento en contra para la red de tor?

Cita de: engel lex en 19 Marzo 2016, 04:30 AM
podrías usar mensajes esteanograficos

Lo considerare, aun asi creo que al ser criptografia asimetrica end to end no tengo mucho problema.

Cita de: engel lex en 19 Marzo 2016, 04:30 AM
Te importa verte comprometido si reversan tu programa?

El programa del cliente no hay mucho problema si lo reversean. Realmente el cliente solo procesa la información recibida y la muestra prácticamente en texto plano.

Otras funciones del cliente son actualizarse a si mismo cuando aplique y actualizar el contenido a mostrar.
Validar que la actualización venga firmada por el programa servidor.
Y enviar datos estadísticos de uso al servidor.

Cita de: engel lex en 19 Marzo 2016, 04:30 AM
Que parte se comprometeria, la conexion o el servidor?


La conexion no hay problema que se comprometa igualmente va cifrado, bueno si la conexion es orientada a valga la redundancia "conexion" me refiero a una conexion directa (TCP, control de flujo etc etc etc), si seria problema por que entonces todos sobrian quien es el servidor.

Lo mas viable que veo es usar una red publica ya existente o alguna forma de broadcast para el servidor sea pasivo al momento de leer los mensajes de los clientes. Y ningun cliente conozca quien es el servidor.


#1708
Buen dia a todos.

Estoy implementando un programa cliente - servidor, (Muchos clientes un solo servidor) el cual se comunica con criptografía asimétrica esto es un par de llaves publicas y privadas para cada cliente.

Los clientes tendrían actualizaciones periódicas tanto de contenido como del programa en si y solo aceptaran la actualización si esta esta firmada por el servidor.

No tengo problema con la criptográfica ni con la programación. Solo estoy buscando opciones para la implementación del canal de comunicación.
El cual me gustaría que la comunicación del cliente para el servidor utilizara un canal anónimo de forma que fuera muy difícil saber quien es el servidor.

Opciones en las que he pensado.

  • Usar la red de Tor para que los clientes envien datos al servidor y/o servidores
  • Implementar una red parecida a la red que usa el sistema de Bitcoin para distribuir la información.
  • Usar algun sistema de mensajes publicos tipo Twitter/paste bin etc..

Punto por punto:

La red de TOR

He escuchado poco de los dominios Onion, sin embargo no estoy tan seguro que tan factible es que localicen tal o cual servidor.

Implementar una red parecida a la red que usa el sistema de Bitcoin para distribuir la información.

Segun el PDF que lei, utiliza un sistema de broadcast para enviar la informacion de las transacciones entre todos los nodos de la red. Sin embargo con mis conocimientos de redes no conozco la forma de hacer esto.

Usar una red Publica
He pensado de todo desde Twitter, Pastebin incluso la red IRC pero en la mayoría de los casos siempre deja algún rastro y/o bloquean las cuentas.

¿Alguna otra sugerencia?

El programa que estoy implementando es instalado manualmente por los usuarios y ellos pueden dejar de usarlo en cualquier momento.
No es ningun ransomware ni malware que se le paresca.
El detalle de tanto hermetismo con el servidor es por que el contenido que es enviado a los clientes puede entrar en conflicto con grandes corporaciones multimedia y no quiero tener represalias por ello.

Saludos!
#1709
Llevo 2 horas agarrado de la silla esperando no caerme, de la risa claro jajajaja.
#1710
Hola zhyzura un gusto verte nuevamente.
Si esos habitos que tenemos y nunca se nos quitaran.

Solucion complementaria al tema es agregar screen en nuestro servidor para nunca mas perder la sesion en uso. Asi podremos ejecutar scripts de larga duracion, recuperarlos en caso de desconexion ademas de que se seguiran ejecutando en el servidor.