elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Píldoras formativas en seguridad de la información


  Mostrar Temas
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1  Programación / Programación C/C++ / Por que motivos se cierra un programa con sockets hecho en C? en: 31 Julio 2020, 01:30
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/chttpserv

De momento funciona bien cuando hago peticiones mediante  curl incluso soporta un ciclo sin fin de peticiones:

Código
  1. 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:
Código
  1. s = pthread_create(&tid,&attr,thread_process,(void *)tothread);
  2. if(s != 0) {
  3. perror("pthread_create");
  4. }
  5.  

  • Todas las funciones de lectura y escritura en el socket se valida si leyeron o escribieron los datos y no devolvio error:
Código
  1. while(sended >= 0  && readed >= 0 && !feof(fd)  ) {
  2. readed = fread(buffer,1,128,fd);
  3. if(readed > 0)
  4. sended = send(hsc->client_fd,buffer,readed,0);
  5. }
  6. if(sended ==  -1) {
  7. perror("send");
  8. }
  9. if(readed == -1) {
  10. perror("fread");
  11. }
  12.  

  • 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:
Código
  1. shutdown(hsc->client_fd,SHUT_RDWR);
  2. 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
2  Seguridad Informática / Bugs y Exploits / Video: Infiltrating Corporate Intranet Like NSA: Pre-Auth RCE On Leading SSL VPN en: 21 Enero 2020, 05:02
3  Programación / Desarrollo Web / [Resuelto] ¿Cual es la mejor forma de depurar un JS semiofuscado? en: 17 Enero 2020, 02:42
Seguramente muchos de ustedes han visto esos códigos javascript Semiofucados ejemplo:

Código
  1. !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])
  2. ....

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!
4  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
Modo Paranoico ON

Post 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-539fc2896da9

Bug 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.

Código
  1. /*
  2. metodo con hash_pbkdf2
  3. */
  4. $halgo = "sha256";
  5. $iterations = 2000000;
  6. $email = "user@example.com";
  7. $password = "P4ssw0rd";
  8. $salt = hash_file($halgo,"key_db.dat",true);
  9. $salida_email = hash_pbkdf2($halgo,$email,$salt,$iterations,0);
  10. $salida_password = hash_pbkdf2($halgo,$password,$salt,$iterations,0);
  11. echo "hash email: $salida_email\n";
  12. echo "hash password: $salida_password\n";
  13.  
  14.  
  15. /*
  16. metodo Iterativo con hash_hmac ()
  17. */
  18. $i = 0;
  19. $data_email = substr($email,0);
  20. $data_password = substr($password,0);
  21. do {
  22. $data_email = hash_hmac($halgo,$data_email,$salt,true);
  23. $data_password = hash_hmac($halgo,$data_password,$salt,true);
  24. }while($i++ < ($iterations - 1));
  25. $data_email = hash_hmac($halgo,$data_email,$salt,false);
  26. $data_password = hash_hmac($halgo,$data_password,$salt,false);
  27. echo "hash email: $data_email\n";
  28. echo "hash password: $data_password\n";
  29.  
  30. /*
  31. metodo Iterativo solo con hash  (data y key concatenadas)
  32. */
  33. $i = 0;
  34. $data_email = substr($email,0);
  35. $data_password = substr($password,0);
  36. do {
  37. $data_email = hash($halgo,$data_email.$salt,true);
  38. $data_password = hash($halgo,$data_password.$salt,true);
  39. }while($i++ < ($iterations - 1));
  40. $data_email = hash($halgo,$data_email.$salt,false);
  41. $data_password = hash($halgo,$data_password.$salt,false);
  42. echo "hash email: $data_email\n";
  43. echo "hash password: $data_password\n";
  44.  
  45.  

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 mismos

dé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!




5  Seguridad Informática / Hacking Ético / Es posible detectar que un usuario entra y/o se conecta mediante Proxy Sock 5? en: 8 Enero 2020, 23:51
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!
6  Foros Generales / Dudas Generales / Algun libro y/o tutorial de Regex en: 8 Enero 2020, 02:08
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!
7  Foros Generales / Dudas Generales / XOR entre enteros llega al mismo resultado que entre bytes? (Solucionado) en: 5 Enero 2020, 05:26
He estado algo estancado con la siguiente duda.

El operador ^ es un XOR, un código de javascript lo aplica asi.

Código
  1. for (var i = 0; i < ckey.sigBytes/4; i += 1) {
  2. ckey.words[i] = ckey.words[i] ^ csig.words[i]
  3. }

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.
Código
  1. while($i < 32) {
  2. $ckey[$i] = $ckey[$i] ^ $csig[$i];
  3. $i++;
  4. }

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!
8  Programación / Desarrollo Web / Depuración (In)Segura en: 3 Enero 2020, 06:56
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

Código
  1. <?php
  2. if(isset($_GET["debug"]) {
  3. $valor = $_GET["debug"];
  4. $key = file_get_contents("s3cr3ct_dir/"."key.dat");
  5. if(strncmp($valor,totp($key),6) == 0) {
  6. ini_set('display_errors', 1);
  7. ini_set('display_startup_errors', 1);
  8. header("debug: enabled");
  9. }
  10. else {
  11. header("debug: invalid totp");
  12. }
  13. }
  14. ?>

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!
9  Programación / PHP / Generar Imagen dinámica con GD para utilizar de placeholder (Solucionado) en: 27 Diciembre 2019, 12:47
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:

Código:
https://placehold.it/70x70



Yo mismo implemente una imagen así pixeles random:

Código:
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 :xD :xD :xD

Código
  1. <?php
  2. $h = 100;
  3. $w = 100;
  4. if(isset($_GET["w"]) && intval($_GET["w"]) > 0) {
  5. $w = intval($_GET["w"]);
  6. }
  7. if(isset($_GET["h"]) && intval($_GET["h"]) > 0) {
  8. $h = intval($_GET["h"]);
  9. }
  10. $im = imagecreate($w, $h);
  11. $gray = imagecolorallocate ($im , 50 , 50 , 50 );
  12. imagefill( $im ,$w , $h , $gray );
  13. header("Cache-Control: no-cache, no-store, must-revalidate");
  14. header("Pragma: no-cache");
  15. header("Expires: 0");
  16. header("Content-type: image/png");
  17. imagepng($im);
  18. ?>

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:

Código
  1. <?php
  2. $h = 100;
  3. $w = 100;
  4. if(isset($_GET["w"]) && intval($_GET["w"]) > 0) {
  5. $w = intval($_GET["w"]);
  6. }
  7. if(isset($_GET["h"]) && intval($_GET["h"]) > 0) {
  8. $h = intval($_GET["h"]);
  9. }
  10. $im = imagecreate($w, $h);
  11. $gray = imagecolorallocate ($im , 50 , 50 , 50 );
  12. $white = imagecolorallocate ($im , 255 , 255 , 255 );
  13. if(imagefill( $im ,$w , $h , $gray )) {
  14. header("Imagefill: OK");
  15. }
  16. header("Cache-Control: no-cache, no-store, must-revalidate");
  17. header("Pragma: no-cache");
  18. header("Expires: 0");
  19. header("Content-type: image/png");
  20. $tfile = tempnam("/tmp","FOO");
  21. if(imagepng($im,$tfile,0)) {
  22. header("Imagepng: OK");
  23. }
  24. if(imagedestroy($im)) {
  25. header("Imagedestroy: OK");
  26. }
  27. header("N: $tfile");
  28. header('Content-Length: ' . filesize($tfile));
  29. readfile($tfile);
  30. unlink($tfile);
  31. ?>

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:

Código:
$ 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!
10  Programación / Desarrollo Web / Recomendaciones para baneos_bloqueos automaticos. en: 23 Diciembre 2019, 05:04
Tengo implementado un sistema de bloqueos por URL (ya saben tipo /wp/login.php etc...), Usert Agent (Claramente modificados), Session (Previamente detectadas).

Si alguno de la lista se encuentra en el blacklist la IP se bloquea por algunas horas y ando un codigo de error 500.

La pregunta por recomendación aquí: ¿Es el mejor camino a seguir?, es decir ¿Bloquear el acceso y mandar error 500 o 404 es la mejor forma de proceder?

Saludos
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines