|
21
|
Seguridad Informática / Criptografía / Como determina la función AES256CBCDecrypt una correcta desencriptación
|
en: 28 Octubre 2020, 15:00 pm
|
Muy buena dia, estoy con una pequeña duda ya que estoy tratando de automatizar un proceso de crackeo por fuerza bruta de una key de 256 bits (Se que es improbable, sin embargo la clave esta ahi del 0 al 2^256) La función original recibe 2 parametros un un KeyCifrada, y el candidato a Key como segundo parametro: Decrypt(KeyCifrada,KeyCandidato);
Dicha función realiza un llamado internamente a AES256CBCDecrypt AES256CBCDecrypt dec(Key.data(), IV.data(), true); nLen = dec.Decrypt(KeyCifrada.data(), KeyCifrada.size(), KeyCandidato); if(nLen == 0) return false;
y si nLen es igual a 0 entonces retorna false indicando que Key Candidato no es un Key valido. Mi duda es la siguiente como determina internamente AES256CBCDecrypt que la KeyCandidato es valida.Saludos EditPlaticando con Kub0x me corrigio el KeyCandidato no es parámetro de entrada si no de salidaSi vemos el link https://fabcoin.pro/aes_8cpp_source.html#l00176 en la linea 112 hay se muestra que las comprobaciones las hace directamente sobre el texto descifrado y si alguna de ellas no pasa simplemente regresa 0.Me comenta kub0x que existen varios valores Key y IV de entrada que podrian dar una salida valida, siendo esto un falso positivo, sin embargo me gustaría investigar cuantas veces pasa eso en realidad. Saludos
Edit 2 Tal como menciono Kub0x, el proceso arroja muchos falsos positivos. Programe un programa multihilo para crackear un key albertobsd $ g++ -o crack_wallet_mt crack_wallet_mt.c -Wint-to-pointer-cast -pthread albertobsd $ ./crack_wallet_mt OK Thread 3, count: 142 key_material: 6120fbf417fcf689ce5ef35f8094d2e4ff584f2652fff824c94c23dae07633e7 iv_material: 226fe385941a98f5fa0274f2917793c7 decipher_key: 01f970cde83114aef95f5bda80866249053b3067a25cd551fa87d57e9a1406be72496a13439c363ee317b478966891 OK Thread 2, count: 296 key_material: 4c167299eabda7932ce63d2ca44045a45f00316a45ca72a4acfca3bdd73fd2a5 iv_material: fc238b78db6d6d3c3ebc4cdb4075ccef OK Thread 1, count: 443 decipher_key: 0053614707620edd364dfd688249bcf316ba2973df40fa6fa70df7bb532bbc483de465c8e9336c2ef66dc51a7633d4 key_material: 609615afd2c0714b603d077cae58b8561e1fae8445a87cf0c1e8847be0c9acca iv_material: 36b905f01e1b898b3cd3efa298db88da decipher_key: a7333cf2484dbc21158b25600a131d707bbb38d4f6dd2fff92e6c2dae3d8c053499ffa19532a99b3c48a59d2574ecc OK Thread 0, count: 773 key_material: 93cb1954410e9676fbbf3cd6b17ccfaae4d8e874b6f577e32b9bbbd1c37ea0c3 iv_material: 5fd321427cd14a9ae2c9a2f95f14d629 decipher_key: fdfebebeb779e4df9aa76746f02cd000d93c6e69d7b4fad30214369a2dab84295716a30dc585efcd6a22a16235 Con solo 4 Hilos y solo probando 1554 hashes random me dio 4 resultados que la función AES256CBCDecrypt considera válidos, pense que serian mucho menos el ratio de falsos positivos, pero asi no me da tiempo de probarlos manualmente, tendrás que optimizar ese proceso también.
|
|
|
22
|
Programación / Programación C/C++ / Por que motivos se cierra un programa con sockets hecho en C?
|
en: 31 Julio 2020, 01:30 am
|
Muy buenos días compañeros. Por algun momento pense en colar el titulo de "ayuda mi programa se cierra sin motivo", pero no es demasiado genérico y solo un novato lo haría Quiero explorar los diversos motivos por los que un programa en C se cierra. De momento vienen a mi mente los siguientes motivos: - llamaa explicita a exit o variantes
- bufferoverflow y variantes de segment fault
- NULL pointer... (parecido al anterior)
- No poder asignar mas memoria
- No poder crear mas threads
Algunos son salidas explícitamente programadas y otras son por bugs. Tengo un proyecto en C, es un servidor WEB multihilo: https://github.com/albertobsd/chttpservDe momento funciona bien cuando hago peticiones mediante curl incluso soporta un ciclo sin fin de peticiones: while true; do curl -i http://localhost:3002/ ; done
Sin embargo cuando le hago las peticiones desde cualquier otro navegador que procese todos los archivos y CIERRO el navegador a media carga el programa simplemente se sale sin mensaje de error. OJO que solo es cuando cierro a media carga, si espero a que termine de cargar la pagina por completo esto no sucede. Consideraciones: - Estoy totalmente seguro de que la mayoría de las funciones que pueden dar error están correctamente procesadas y muestran el error correspondiente:
s = pthread_create(&tid,&attr,thread_process,(void *)tothread); if(s != 0) { }
- Todas las funciones de lectura y escritura en el socket se valida si leyeron o escribieron los datos y no devolvio error:
while(sended >= 0 && readed >= 0 && !feof(fd ) ) { readed = fread(buffer ,1,128,fd ); if(readed > 0) sended = send(hsc->client_fd,buffer,readed,0); } if(sended == -1) { } if(readed == -1) { }
- También estoy seguro que no es un problema de memoria ya que tengo una libreria propia con la que me he asegurado tras varias pruebas de que todos los apuntadores asignados con malloc/calloc son liberados y no se vuelven a utilizar, ademas de indicarme la cantidad de memoria dinamica actualmente utilizada.
- De igual manera todos los sockets son cerrados mediante:
shutdown(hsc->client_fd,SHUT_RDWR); close(hsc->client_fd);
Se que el problema tiene que ver con Sockets ya que solo cuando cierro el navegador a media carga el programa termina. Me he quedado un poco estancado, ya que siento que no avanzo si no soluciono ese error. No les pido que depuren mi codigo, ya que no esta 100% documentado. Pregunto: ¿Alguien a tenido el mismo problema?, ¿Que otros motivos hacen que el programa se cierre y no caiga error en ninguna función? Saludos
|
|
|
24
|
Programación / Desarrollo Web / [Resuelto] ¿Cual es la mejor forma de depurar un JS semiofuscado?
|
en: 17 Enero 2020, 02:42 am
|
Seguramente muchos de ustedes han visto esos códigos javascript Semiofucados ejemplo: !function(a){function k(k){for(var n,a,f=k[0],d=k[1],u=k[2],l=0,b=[];l<f.length;l++)o[a=f[l]]&&b.push(o[a][0]) ....
Y asi le sigue por unos cuantos Kilobytes de codigo minificado. Entonces esa es la pregunta, cual es la mejor forma de depurar que es lo que esta haciendo, pregunto por que javascript es bastante permisivo con la sintaxis. Obvio primer paso: -- Utilizar alguna de esas paginas para que el código se vea indentado y tabulado Saludos!
|
|
|
25
|
Programación / Desarrollo Web / No guardar el email en texto plano en la base de datos y/o variables SESSION
|
en: 9 Enero 2020, 06:04 am
|
Modo Paranoico ONPost Original: https://albertobsd.dev/blog/es/2020/01/no-guardar-email-en-texto-plano/Déjame repetirte el titulo No guardar el email en texto plano en la base de datos, No se necesita, no se requiere, es mas seguro. Según esta publicación (Lectura recomendada) https://medium.com/@alex.birsan/the-bug-that-exposed-your-paypal-password-539fc2896da9Bug bounty de 15mil $ USD Si nos ponemos paranoicos, no deberías de conocer el email del usuario, No se necesita, no se requiere. ¿Que dato valido entonces? Un hash del mismo email protegido con alguna key, Importante: Que no sea reversible es decir que teniendo el hash no exista forma de volver al email y/o password originales. Los siguientes códigos requieren de un archivo key_db.dat el cual se puede generar con dd leyendo de /dev/random o con el método que mas les guste. /* metodo con hash_pbkdf2 */ $halgo = "sha256"; $iterations = 2000000; $email = "user@example.com"; $password = "P4ssw0rd"; $salida_email = hash_pbkdf2($halgo,$email,$salt,$iterations,0); $salida_password = hash_pbkdf2($halgo,$password,$salt,$iterations,0); echo "hash email: $salida_email\n"; echo "hash password: $salida_password\n"; /* metodo Iterativo con hash_hmac () */ $i = 0; $data_email = substr($email,0); $data_password = substr($password,0); do { $data_email = hash_hmac($halgo,$data_email,$salt,true); $data_password = hash_hmac($halgo,$data_password,$salt,true); }while($i++ < ($iterations - 1)); $data_email = hash_hmac($halgo,$data_email,$salt,false); $data_password = hash_hmac($halgo,$data_password,$salt,false); echo "hash email: $data_email\n"; echo "hash password: $data_password\n"; /* metodo Iterativo solo con hash (data y key concatenadas) */ $i = 0; $data_email = substr($email,0); $data_password = substr($password,0); do { $data_email = hash($halgo,$data_email.$salt,true); $data_password = hash($halgo,$data_password.$salt,true); }while($i++ < ($iterations - 1)); $data_email = hash($halgo,$data_email.$salt,false); $data_password = hash($halgo,$data_password.$salt,false); echo "hash email: $data_email\n"; echo "hash password: $data_password\n";
Nota que coloque Iteraciones igual a 2 Millones ya que no sabemos en un futuro que tan feasible sea realizar algun forcebrute a los hashes. NO SE NECESITA GUARDAR EL EMAIL EN PLANO - El usuario no se acuerda de su clave? Pides el email y aplicas el mismo algoritmo, se busca en la base de datos y si coincide con alguno de los hash envias el email, basándose en el email que te enviaron obviamente validando que sea email valido filter_var($email, FILTER_VALIDATE_EMAIL) NO SE NECESITA, ok quieres enviarles noticias o mensajes cada X tiempo - Se puede utilizar criptografía simétrica para guardar el email pero si te hackean la base de datos y el código fuente, lo van a poder obtener ellos mismosdéjame Repetírtelo una vez mas NO SE NECESITA GUARDAR EL EMAIL EN TEXTO PLANO Incluso solo se necesita recibir el email en texto plano en 2 ocasiones, solo cuando se registra (Para validar que sea valido) y cuando quiere recuperar su password. Para el login diario podrías recibir solo un hash del mismo var email = CryptoJS.SHA512($("#email").val()).toString().substring(1, 127); Se le quitan 2 nibbles de los extremos al hash antes de ser enviado, por si se llega a interceptar en transito por algun exploit, no se pueda determinar al 100% cual es el email inicial Se podría aplicar lo mismo al password (Muy recomendable asi tu nunca vez el password original del usuario) Saludos!
|
|
|
26
|
Seguridad Informática / Hacking / Es posible detectar que un usuario entra y/o se conecta mediante Proxy Sock 5?
|
en: 8 Enero 2020, 23:51 pm
|
Tengo configurado un proxy Socks5 implementado mediante ssh tunneling a un servidor dedicado, estoy 100 % seguro que soy el único que lo utiliza como proxy por que yo administro el servidor mencionado.
El punto aquí, es como puede detectar una pagina que visito si estoy usando un proxy Socks5?
He hecho pruebas y el navegador con y sin proxy manda exactamente mismas headers ademas también se que los scripts no puede acceder a la IP Publica Real si estoy con el proxy habilitado.
Pregunto estoy por que servicios como Netflix y otras paginas me detectan que estoy utilizando este tipo de técnicas.
Saludos!
|
|
|
27
|
Foros Generales / Dudas Generales / Algun libro y/o tutorial de Regex
|
en: 8 Enero 2020, 02:08 am
|
Alguna buena recomendación de un Libro y/o tutorial de Expresiones Regulares a fondo.
A ver, puedo entrar a google, buscar y empezar con lo primero que encuentre, eso lo se, sin embargo busco alguna recomendación personal que alguno de ustedes ya curso y/o a leído sobre el tema.
Ya sea en Ingles o en español no tengo problema con el lenguaje.
Tengo tiempo tiempo programando y he usado una que otra Regex anteriormente (Solo he usado las entiendo) y muchas veces las pruebo manualmente contra posibles inputs indeseados. Sin embargo nunca me he dado el tiempo suficiente para profundizarlas.
Saludos!
|
|
|
28
|
Foros Generales / Dudas Generales / XOR entre enteros llega al mismo resultado que entre bytes? (Solucionado)
|
en: 5 Enero 2020, 05:26 am
|
He estado algo estancado con la siguiente duda. El operador ^ es un XOR, un código de javascript lo aplica asi. for (var i = 0; i < ckey.sigBytes/4; i += 1) { ckey.words[i] = ckey.words[i] ^ csig.words[i] }
Donde words son números enteros signed de 32 bits, sigBytes son vale 32, La api de javascript lo maneja de esa forma, en PHP yo tengo el binstring de 32 bytes (raw de un hash sha256) ¿si yo realizo el XOR a los bytes individuales uno a uno llego al mismo resultado?Ejemplo. while($i < 32) { $ckey[$i] = $ckey[$i] ^ $csig[$i]; $i++; }
Creo que la pregunta es algo boba, pero a esta altura del dia ya no tengo cabeza para responderme yo mismo. Saludos! Solucionado
Si es lo mismo, todo depende que las variables evaluadas sean del mismo tamaño. Como comenta MinusFour.
Saludos!
|
|
|
29
|
Programación / Desarrollo Web / Depuración (In)Segura
|
en: 3 Enero 2020, 06:56 am
|
Los que ya tengan algo de tiempo programando en PHP, sabrán que la mayoría de los servidores tipo hosting están configurados para que el Server no tire los mensajes de error hacia el navegador. Esto complica un poco el tema a la hora de realizar un poco de depuración en un sitio en producción. Lo ideal seria tener un equipo para depurar el código fuera del entorno de producción, depurar y volver a subir el codigo ya corregido, esto es el deber ser cuando trabajas sobre el sitio de alguien mas. Sin embargo en mi caso y para mi pagina personal, me da mucha flojera estar haciendo las cosas como debería de ser, lo cual he implementado un forma de depuración un tanto protegida. NOTA sigue siendo inseguro, pero dado que lo password basados en el tiempo de UNIX que duran 30 segundos son algo difíciles de adivinar y poco probable que alcances a forcebrutear las 999999 posibilidades en los 30 segundos que dura el password, confio el que el metodo es mas o menos seguro para lo que necesito. La idea es básicamente la siguiente, incluir un archivo en el index que busque si existe la variable debug y si existe válida si el valor es igual generado mediante la función TOTP (Función que publique en este mismo subforo ) Si estas condiciones se cumplen habilita que se muestren los errores que arroje el PHP <?php if(isset($_GET["debug"]) { $valor = $_GET["debug"]; if(strncmp($valor,totp ($key),6) == 0) { ini_set('display_startup_errors', 1); } else { header("debug: invalid totp"); } } ?>
Consideraciones - No, no tengo un directorio "s3cr3ct_dir/"
- El archivo key.dat se genero mas o menos asi dd if=/dev/urandom of=key.dat bs=1K count=1
- Se tiene que configurar alguna aplicación authenticator (Obvio)
- Se puede intentar forcebrutear el valor actual del Totp (999999) posibilidades en 30 segundos
- Se puede intentar forcebrutear el valor actual del KEY 2^8192 posibilidades en Toda una eternidad
- Actualmente están los headers activos así que pueden intentarlo, tengo un /dummy que no hace nada, pero los headers se mostrarían
- Si se desactivan los headers no hay manera de saber si X sitio implementa una técnica similar
- Se puede cambiar el nombre de la variable
- Tiene que existir un error en la pagina para que sirva de algo
🏴 Saludos!
|
|
|
30
|
Programación / PHP / Generar Imagen dinámica con GD para utilizar de placeholder (Solucionado)
|
en: 27 Diciembre 2019, 12:47 pm
|
Se me hace interesante esas paginas que ofrecen solo un servicio como el de imagen placeholder Para las plantillas de diseño HTML esta muy bien: Ejemplo: https://placehold.it/70x70 Yo mismo implemente una imagen así pixeles random: https://albertobsd.dev/random?format=img&w=70&h=70 Ahora estoy implementando el mismo código en otro sitio y me estoy dando de topes por que no esta funcionando <?php $h = 100; $w = 100; } } header("Cache-Control: no-cache, no-store, must-revalidate"); header("Content-type: image/png"); ?>
El codigo anterior asi como el siguiente no me arroja imagen alguna, en teoría me debería de arrojar la imagen con fondo gris, peor no hace nada, ya intenten depurando con headers: <?php $h = 100; $w = 100; } } } header("Cache-Control: no-cache, no-store, must-revalidate"); header("Content-type: image/png"); } } ?>
Y sigue sin hacer absolutamente nada, los headers de depuración están todos y el archivo se crea, intente omitiendo el unlink y haciendo file al archivo temporal desde el shell de linux y todo esta bien: $ file /tmp/FOOxOdebm /tmp/FOOxOdebm: PNG image data, 750 x 300, 1-bit colormap, non-interlaced
Headers desde el navegador: Al final el error va a terminar siendo una tontería pero se me hace interesante que no arroje nada. Saludos!
|
|
|
|
|
|
|