|
191
|
Programación / Programación Visual Basic / Re: extraer adjuntos de correos EML
|
en: 11 Noviembre 2020, 15:07 pm
|
hola, muchas gracias por todo, pero no consigo que me extraiga el adjunto..
Que tal ya veo algo no esta bien pero no puedo saber que es si no veo el eml que le pasas, si gustas puedes mandarme el EML a mi correo, mi informacion esta por ahi publica
|
|
|
192
|
Programación / Programación Visual Basic / Re: extraer adjuntos de correos EML
|
en: 10 Noviembre 2020, 18:20 pm
|
Lo hice pero actualmente solo para un solo archivo eml, ya que me da flojera hacerlo para todo un directorio y que busque los archivos eml etc etc etc... Lo hice en C. se que este es el subforo de VB, pero la verdad VB no me gusta mucho para este tipo de operaciones, de hechos me gusta el VBA para automatizar trabajos en Excel Imagen de prueba que funciona:  Y el archivo se crea en el directorio pasado como segundo parametro.  Por cierto si el siguiente código fuente si se compila en algunos compiladores de Windows puede dar muchos warning, pero con gcc de MinGW no me tira ningun warning ni error como esta en la imagen. /* gcc -o dump_eml.exe dump_eml_attachments.c */ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<stdint.h> static char encoding_table[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'}; static char *decoding_table = NULL; static int mod_table[] = {0, 2, 1}; unsigned char *base64_decode(const char *data, size_t input_length, size_t *output_length); void build_decoding_table(); void base64_cleanup(); int open_and_extract_from_eml(char *filename,char *path_destino); int isEmptyLine(char *line); char *content_disposition = "Content-Disposition: attachment;"; int main(int argc, char **argv ) { if(argc != 3) { printf("Uso: %s <Carpeta_con_EMLs> <Carpeta_destino_adjuntos>\n",argv [0]); } open_and_extract_from_eml(argv[1],argv[2]); return 0; } int open_and_extract_from_eml(char *filename,char *path_destino) { FILE *eml_file, *temp_file; char *dest_file,*temp0,*temp1; char *line,*buffer_base64 = NULL,*buffer_decoded; char *full_writen_file; int len_dest_file_name,offset,len_content_disposition,len_base64_line,len_base64_buffer, len_output,len_path_destino,entrar; len_content_disposition = strlen(content_disposition ); len_path_destino = strlen(path_destino ); eml_file = fopen(filename ,"rb"); offset = 0; while(!feof(eml_file ) && fgets(line ,1024,eml_file ) != NULL ) { if(memcmp(line ,content_disposition ,len_content_disposition ) == 0) { printf("Encontrado: %s",line ); temp0 = strstr(line ,"filename="); if(temp0 ==NULL ) { //tal vez la proxima linea? fgets(line ,1024,eml_file ); } temp0 = strstr(line ,"filename="); if(temp0 !=NULL ) { temp1 = strstr(temp0 +10,"\""); if(temp1 == NULL) { //No hay " finales } len_dest_file_name = temp1 - (line + (temp0 - line) + 10 ); //printf("len_dest_file_name %i\n",len_dest_file_name); dest_file = malloc(len_dest_file_name +1); strncpy(dest_file ,(line + (temp0 - line ) + 10),len_dest_file_name ); dest_file[len_dest_file_name] = '\0'; fgets(line ,1024,eml_file ); //printf("Nueva linea leida \"%s\"",line); if(!isEmptyLine(line)) { //Deberia de ser una linea vacia; } buffer_base64 = NULL; offset = 0; entrar = 1; while(entrar && fgets(line ,1024,eml_file ) != NULL && !isEmptyLine (line ) ) { //leemos hasta la proxima linea vacia o hasta encontrar un '=' al final de la linea len_base64_line = strlen(line ); buffer_base64 = realloc(buffer_base64 ,offset +len_base64_line +1); if(line[len_base64_line-1] == '\n' || line[len_base64_line-1] == '\r'){ line[len_base64_line-1] ='\0'; len_base64_line--; } if(line[len_base64_line-1] == '\n' || line[len_base64_line-1] == '\r'){ line[len_base64_line-1] ='\0'; len_base64_line--; } memcpy(buffer_base64 +offset ,line ,len_base64_line ); offset+=len_base64_line; if(line[len_base64_line-1] == '=') { entrar = 0; } } buffer_base64[offset] = '\0'; //printf("Encoded buffer: %s\n",buffer_base64); len_base64_buffer = strlen(buffer_base64 ); buffer_decoded = base64_decode(buffer_base64,len_base64_buffer,&len_output); buffer_decoded[len_output] = '\0'; /* printf("OK\n"); printf("Decoded buffer: %s\n",buffer_decoded); printf("Path destino: %s\n",path_destino); printf("len_dest_file_name: %i\n",len_dest_file_name); printf("len_path_destino: %i\n",len_path_destino); */ full_writen_file = malloc(len_dest_file_name + len_path_destino +10); sprintf(full_writen_file ,"%s/%s",path_destino ,dest_file ); printf("Destino: %s\n",full_writen_file ); temp_file = fopen(full_writen_file ,"wb"); fwrite(buffer_decoded ,1,len_output ,temp_file ); } else { printf("Se encontro %s, pero no se encontro Filename omitiendo!\n",content_disposition ); } } } } int isEmptyLine(char *line) { if(line[0] == '\0' || line[0] == '\n' || line[0] == '\r') return 1; return 0; } unsigned char *base64_decode(const char *data, size_t input_length, size_t *output_length) { if (decoding_table == NULL) build_decoding_table(); if (input_length % 4 != 0) return NULL; *output_length = input_length / 4 * 3; if (data[input_length - 1] == '=') (*output_length)--; if (data[input_length - 2] == '=') (*output_length)--; unsigned char *decoded_data = malloc(*output_length ); if (decoded_data == NULL) return NULL; for (int i = 0, j = 0; i < input_length;) { uint32_t sextet_a = data[i] == '=' ? 0 & i++ : decoding_table[data[i++]]; uint32_t sextet_b = data[i] == '=' ? 0 & i++ : decoding_table[data[i++]]; uint32_t sextet_c = data[i] == '=' ? 0 & i++ : decoding_table[data[i++]]; uint32_t sextet_d = data[i] == '=' ? 0 & i++ : decoding_table[data[i++]]; uint32_t triple = (sextet_a << 3 * 6) + (sextet_b << 2 * 6) + (sextet_c << 1 * 6) + (sextet_d << 0 * 6); if (j < *output_length) decoded_data[j++] = (triple >> 2 * 8) & 0xFF; if (j < *output_length) decoded_data[j++] = (triple >> 1 * 8) & 0xFF; if (j < *output_length) decoded_data[j++] = (triple >> 0 * 8) & 0xFF; } return decoded_data; } void build_decoding_table() { for (int i = 0; i < 64; i++) decoding_table[(unsigned char) encoding_table[i]] = i; } void base64_cleanup() { }
El programa lo puedes utilizar para todo un directorio pero con ayuda de batch creo recordar que existe una instrucción for que te ayuda a procesar todos los archivos de un subdirectorio y pasarlos a un programa. Saludos!
|
|
|
193
|
Programación / Programación Visual Basic / Re: extraer adjuntos de correos EML
|
en: 10 Noviembre 2020, 15:59 pm
|
Te puedo ayudar , pero no tengo compilador de VB ni de tecnologías Microsoft en este momento, pasame un archivo EML y con gusto le hecho un ojo para extraer todas los adjuntos, por cierto que ya debería de existir un programa que haga eso no?
Edito ya vi la estructura del archivo y no esta tan complicada. Pregunta: Quieres todos los adjuntos incluidos los que aparecen en el body del mensaje como imagenes y demas o solo considerados realmente "attachment" ? Las imágenes del body y demás tienen un "inline" en el código ejemplo Content-Disposition: inline; filename="background.gif" O solo los "attachment" Content-Disposition: attachment; filename="attachment.txt" Saludos!
|
|
|
195
|
Seguridad Informática / Criptografía / Re: Como crackear una cartera bitcoin. Teoria y practica
|
en: 8 Noviembre 2020, 19:40 pm
|
Interesante si ya vi varias noticias confirmando lo mismo, no sabía que esa cartera estaba relacionada con el silk road. En fin, yo como lo mencione en el primer post me interese en el tema por lo "famoso" de esa cartera, lamentablemente me interese muy tarde en ese tema, ya que solo una semana después de de empezar a entender lo que hacia el bitcoin core para cifrar las llaves privadas, la cartera mencionada fue vaciada. Prueba de concepto. Veremos a continuación una prueba de concepto de cómo funcionaria el crackeo por fuerza bruta de forma secuencial o aleatorio, el ejemplo esta " Arreglado" solo se utiliza para mostrar que el método funciona cuando el valor correcto llegue. El código está publicó en github: https://github.com/albertobsd/crackBTCwallet Recalco, es muy pero muy IMPROBABLE que se encuentre por medio de algún ataque tipo Aleatorio. No es imposible, pero a no ser que cuente con un exceso de poder de computo, no se alcanzara a obtener el key utilizado en una vida completa..
|
|
|
196
|
Foros Generales / Foro Libre / Re: Cansado de encontrar vídeos latinos en youtube
|
en: 6 Noviembre 2020, 01:14 am
|
A mi me pasa con las peliculas que ponen, en Español  Cuando me la descargo, aparece el acento tan caracteristico de Mexico, y los personajes que interpretan las voces, al estar acostumbrado a la voz del Personaje, a veces te da un poco de risa. Pero supongo que a los Mexicanos tambien les dará risa la voz Española. Exacto me pasa un poco eso cuando veo series españolas. Tambien me pasa y no se por que cuando busco un trailer de alguna película No se en español. tengo que especificar que sea Latino por que si no, por lo general me aparecen películas en español de españa. Bravo por la respuesta de Machacado y tincopasan, son las mas adecuadas explicando la proporción de hispanoablantes latino americanos contra hispanohablantes españoles. Saludos!
|
|
|
199
|
Comunicaciones / Redes / Re: Mi Red Wifi se conecta pero no me deja navegar (Necesito Vuestra Ayuda)
|
en: 5 Noviembre 2020, 01:19 am
|
Por recomendación de seguridad no te recomendaria descargar nada de lo cual no estes enterado como funciona. El diagnostico lo puedes hacer directamente desde tu computadora. Funciona? Que error exacto devuelve? Busca tu puerta de enlace y realiza ping a esa dirección Funciona? que error devuelve Funciona que error devuelve? Hay muchas pruebas mas que se pueden hacer pero si no empiezas a entender estas pruebas básicas, no podras seguir con otras
|
|
|
200
|
Seguridad Informática / Criptografía / Como crackear una cartera bitcoin. Teoria y practica
|
en: 4 Noviembre 2020, 19:42 pm
|
Como crackear una cartera bitcoin. (Teoria y practica).Bueno esta investigación comenzó a manera de broma y solo por hobby. En las platicas que tenemos en la comunidad de elhacker.net en Telegram ( https://t.me/elhackerdotnet ) Se menciono hace tiempo la existencia de una cartera de bitcoin con 69 Mil BTC, al tipo de cambio actual hoy 4 de Noviembre de 2020 serian unos 995 millones de dólares, entre bromas se menciono que teníamos que crackearla con algún computador cuántico. En fin, el proceso "normal" para abrir una cartera cifrada utilizando las aplicaciones oficiales de Bitcoin-Core es el siguiente. Primero cargamos la cartera bitcoin-cli loalwallet "wallet.dat" "wallet.dat" es un archivo que debe de existir en el directorio ~/.bitcoin/wallets/ Se puede llamar de otro modo, el punto es que debe de exisitir en ese path Segundo desbloqueamos la cartera con nuestra passphrase o mas comúnmente contraseña bitcoin-cli walletpassphrase "passphrase o password" 60 Entre comillas tenemos nuestro password y el 60 a continuación indica que desbloqueamos la cartera por 60segundos Si el password es correcto no marcara error, de lo contrario lo indicará. error code: -14 error message: Error: The wallet passphrase entered was incorrect. Ahora la forma lenta e ineficiente de intentar crackearla por fuerza fruta probando directamente distintos passphrase desde la misma terminal. Sigue siendo lento incluso aunque se utilice algún script bash por que pasar del bash al programa y de regreso es ineficiente. Necesitamos saber que hace internamente la aplicación, para tratar de reproducirlo en un programa en C y ejecutarlo por aparte posiblemente con multihilo para mejorar la eficiencia ¿Que hace el bitcoin core con nuestro passphrase?Nuestro passphrase es combinado con un salt que se encuentra almacenado en el archivo, mediante un algoritmo estilo PBKDF y con mas de 25000 iteraciones generan un hash sha512. De estos 64 bytes generados mediante PBKDF, se utilizan los primeros 32 bytes como KEY para inicializar el contexto de AES y los siguientes 16 bytes como IV para el algoritmo CBC A este algoritmo AES256CBC se le pasa como parámetro para descifrar el mKey (master KEY) cifrado y se obtiene un mKey Descifrado El master key ya descifrado se le hacen varias pruebas, se utiliza este valor como KEY para otros descifrados y en este caso como IV en todas las pruebas se utilizan 16 bytes del public Key de la cartera bitcoin obtenidos por una función interna llamada GetHash que desconozco que valores devuelva exactamente, solamente me limite a llamarla. Y si el master key ya descifrado pasa todas las pruebas se almacena en memoria para sea utilizado en el futuro. Fin de la triste Historia. Resumen en pseudo codigoEl siguiente codigo en Pseudo C esta solo para representare que hace la aplicación internamente. prekey = PBKDF(passphrase,IV, N Iteraciones,"sha512"); aesctx = AES256_init(KEY); if( AES256CBC_decrypt(aesctx,IV,ENC_mKey,DEC_mKEY) > 0) { foreach(OthersENC as oENC) { oCtx = AES256_init(DEC_mKEY); if(!AES256CBC_decrypt(oCtx,IV_fromPublickey,oENC,dummy) > 0) { return false; } } return true; }
Entonces si nuestro plan es un ataque por fuerza bruta podemos saltarnos el PBKDF que se ejecuta N Iteraciones (Mínimo 25000) y saltar directamente al Decrypt de AES. Tenemos 2 opciones: 1.- Generar un par (KEY,IV) 48 bytes random o secuencial y empezar con el primer AES256CBC_decrypt y utilizar el valor generado para continuar con los AES256CBC_decrypt dentro del for. 2.- O generar solamente un KEY de 32 bytes random o secuencial y pasar directamente a los AES256CBC_decrypt dentro del For. Asi con 32 bytes solo tenemos 1 de 115792089237316195423570985008687907853269984665640564039457584007913129639936 posibilidades de dar con la KEY correcto. xD xD xD Resultados vistos en la práctica. Con la opción 1 solamente el 0.4% de los valores aleatorios generados pasaban el primer AES256CBC_decrypt posteriormente solo el 0.4% de esos valores pasaban el primer AES256CBC_decrypt dentro del FOR Para la cartera que cree con el propósito de realizar las pruebas los challenge dentro del FOR eran sobre 500. Sin embargo para la cartera lackeada con 69K BTC solo está disponible un solo challenge dentro del FOR, al ser solo dos AES256CBC_decrypt me dio bastantes KEY "Falsos positivos" aproximadamente uno de cada millón de valores random generados (KEY,IV) pasaban ambas pruebas En conclusiónLa aproximación por Fuerza Bruta a AES256CBC es improbable que funcione ojo, improbable no imposible, Tal vez en el futuro con mejor poder de computo disponible, o tal vez con Múltiples equipos trabajando de forma sincronizada con alguna RED tipo BOINC o algún tipo de BOTNET Tengo el código utilizado para realizar este proceso, un poco de manera hardcodeada Ya que los Valores cifrados los saque directamente mediante Hexedit, si alguien esta interesado en la estructura del archivo no dude en comentarlo. Saludos PosdataLa cartera de 69K BTC fue vaciada por alguien el dia de ayer. 3 de Noviembre a las 3PM https://twitter.com/albertobsd/status/1323752623510446080https://decrypt.co/es/47133/wallet-de-bitcoin-con-955-millones-famosa-entre-hackers-se-acaba-de-vaciar?amp=1
|
|
|
|
|
|
|