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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


  Mostrar Temas
Páginas: [1] 2 3
1  Programación / Programación C/C++ / Llamada al sistema Select en S.O Linux en: 9 Marzo 2020, 09:12 am
Hola a todos, resulta que tenía la duda de si era necesario ajustar el socket para que fuera no bloqueante antes de suscribirlo a una llamada select. Buscandome me encontre con esto:
https://stackoverflow.com/questions/16628743/should-socket-be-set-non-blocking-before-it-is-polled-by-select

Me queda claro la razón por la cual debe ser no bloqueante pero realmente vale la pena seguir ese consejo, al menos en el caso de conexiones TCP. Es decir:

Yo tengo un select a la espera de que varias conexiones TCP esten listas para ser leidas, me surte el problema de que se me notifica de que el socket esta listo para lectura, entonces prosigo a intentar hacer la lectura con el respectivo método, sin tener conocimiento de que fue un fallo y el contenido fue descartado por algo como que fallo el checksum(situación que menciona la respuesta del link), esto me va ocasionar distintos comportamientos dependiendo si el socket es bloqueante...
1. Si es bloqueante, entonces mi hilo estara bloqueada esperando que realmente la conexión tenga información entrante, pero este tiempo bloqueado creo que es aceptable debido a que es TCP, entonces tengo la certeza de que habrá una retransmisión en un rango de tiempo relativamente corto. Sin embargo se podría presentar el mismo problema de que el siguiente envio tuviera el mismo problema, ¿acaso se tiene la seguridad de que el kernel va ser capaz de quitar la información entrante erronea(que no cumplio con el checksum) antes de que la función recv recolecte los datos?, agregando a esta solución si quisiera asegurar que el tiempo de bloquea no sea mayor a N porción de segundo, podria agregar:
Código
  1. setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof timeout);
Al final podría decidir que si pasa el timeout, entonces vuelva a bloquearme en el select.
Nota. Aquí surge una duda de como es que select se da cuenta que un socket esta listo. Puede ser que lo determine conforme solo a si tiene alguna actividad relacionada con el, sin que esto realmente tenga como consecuencia que algo se este poniendo en la cola de entrada, esto respondería la pregunta de por que se notifica como que el socket esta listo cuando realmente no se ha terminado de confirmar la información entrante.

2. Si no es bloqueantes, entonces es cierto que una llamada recv no me bloquearía pero ¿no tendría que hacer todo un mecanismo para asegurarme de recolectar todo el contendio de esa petición?  a través de algo como recibe hasta que no encuentres el final de la respuesta, mientras no encuentres el final de la respuesta repite:
Código
  1. recv(....);
  2. sleep(algunos_milisegundos);
  3.  
sin embargo me da la sensación de que se degradaría mas el desempeño de la aplicación por ese sleep, debido a que ese hilo no tendría ninguna otra tarea que hacer, seria algo parecido a una espera ocupada deficiente.

Vi una implementación en python que lo hace es suscribir los sockets como NO_BLOQEUANTES al select, posterior a eso cuando se le notifica que alguno esta listo, lo cambia para que sea BLOQUEANTE pero finalmente creo que se llega al mismo problema, realmente es una condición de carrera que en algunos casos puede resultar en lo mismo que si siempre fuera BLOQUEANTE. ¿Alguna alternativa u opinión de cual seria la solución ideal?
2  Comunicaciones / Redes / Proxies en: 6 Febrero 2020, 04:30 am
He estado siguiendo dos libros basicos de hacking (Black Hat Python y Attacking Networks Protocols) y en ambos llevo rato trabajando en todo lo relacionado principalmente con proxies. He practicado un poco con los ejercicios que contempla principalmente el libro de Python para poder construir mis limitados proxies que simplemente consisten principalmente en un socket que reenvía contenido a su destino únicamente por un puerto. Ademas he estado leyendo un poco sobre la variedad de proxies que existen, como son:

1. Proxies basados en Socks4, 4a y 5
2. Proxies HTTP
3. Forwarding Port( Es el primero que vi y con el que he podrido interactuar más con Python)

Me queda clara la idea de un proxy a grandes rasgos y entiendo un poco las diferencias entre cada uno de manera no muy detallada:

1. Sockes4, 4a, 5. El 5 es muy bueno en el sentido de que ofrece autenticacion por varios mecanismos, se puede adaptar a las aplicaciones sin tanto esfuerzo, etc.
2. Proxies HTTP. Especifico para transmision de datos mediante el protocolo HTTP
3. Forwarding Port. Una instancia de este programa se encarga simplemente de abrir un puerto y reenviar los datos entrantes hacia una dirección destino.

Mi principal problema es cuando intento verlo desde el punto de vista de programación. Es decir:

1. Forwarding Port. A nivel de programación lo puedo ver como un socket TCP o UDP que simplemente se encarga de atender a un único cliente y reenviar lo que le llega a la dirección que se le fue especificada como dirección final. Creo que la principal dificultad es que las aplicaciones que lo utilizan deben tener la opción para especificar la dirección y puerto de destino , ademas que se complica si las peticiones que lanza la aplicación aveces varian de objetivo., haciendo practicamente imposible hacer un proxie casero de esta manera que sea generico y que de paso a transmitir la información sin tener que modificar el programa cliente o el programa que esta utilizando el proxie.

2. Proxie HTTP. Entiendo que es una especie de proxie destinado para tráfico del protocolo HTTP pero no me termina de quedar claro como trabaja. Es decir, yo puedo configurar mi Navegador para que use un Proxie HTTP y el proxy se va encargar de retransmitir toda la comunicación existente pero ¿Como lo hace?. Acaso hay algunas estandar para la construcción de Proxie HTTP entre otros que me diga algo al estilo:
PASOS PARA SINCRONIZAR INICIO ENTRE UN NAVEGADOR Y UN PROXIE HTTP.
1. El navegador se va encargar de crear una conexión al proxie HTTP.
2. Hacen un procedimiento de Handhsake
3. El navegador envia mensajes con un formato HTTP , en donde exista una Cabecera DESTINO_FINAL que tendra la IP hacia donde debe ser enviado ese paquete

NOTA. He visto y como era de esperarse, que el navegador usa varios puertos para despachar las peticiones de paginas que hacen cada pestaña e intuyo que de alguna manera una vez sincronizado el navegador con el proxy deben crear un mecanismo para permitir tener varios SUB_CLIENTES (Pestañas virtuales) para cada navegador,  para que sea posible que si hay 3 pestañas haciendo peticiones desde una misma computadora, entonces el proxy puede generar 3 sockets o conexiones auxiliares para darle seguimiento a cada petición, esto debido a que incialmente el navegador esta enviando peticiones HTTP al servidor como si el fuera el servidor web pero como le dice cual es el verdadero destino para cada petición.

3. Finalmente tengo los proxies SOCK..., he visto que estos los que mas facilmente pueden adaptarse a las aplicaciones de manera génerica y he visto que tienen un estandar al estilo como el inventado de HTTP de unos parrafos arriba. Pero entonces esto me esta implicando que cada aplicación que quiera usar este tipo de proxie debe tener un mecanismo dentro de ella que permita la comunicación con un proxie de este estilo, o es posible que realmente la aplicación siga haciendo las mismas cosas que hace comunmente y jamas sepa que realmente primero se esta comunicando con un proxie SOCK.

Por último solo quiero recalcar que mi principal duda esta en que tan genericos se supone que deben ser los proxies en especifico el SOCK, es decir, en todos los casos la aplicación debe tener una opción para habilitar la comunicación con este tipo de proxies o como se logra que aplicaciones que no soportan estas opciones se puedan adaptar. ¿Se supone que puedo utilizar un proxie Socks para redirigir todo el tráfico que sale de mi interfaz de red, como si a gran nivel tuviera un cliente del proxie que prácticamente dijera SOY EL REPRESENTANTE LOCAL DEL PROXIE Y DE ALGUNA FORMA ESCUCHO TODO LO QUE SALE POR LA INTERFAZ DE RED Y ME ENCARGO DE PASARSELO AL PROXIE Y RETORNAR LAS RESPUESTAS? o ¿ debo ir aplicación por aplicación activando la configuración de proxie para que la aplicación se encargue de individualmente conectar su puerto de salida a la dirección del servido?
3  Seguridad Informática / Hacking Wireless / ARP Spoofing en: 4 Febrero 2020, 07:17 am
Buenas, he estado el funcionamiento del protocolo ARP y me he encontrado con unas de sus vulnerabilidades que es el 'ARP Spoofing'. Mi duda parte de que he visto que la vulnerabilidad se presenta a partir de que el protocolo ARP acepta paquetes REPLY de una resolucion de una dirección aún cuando el no hizo la respectiva REQUEST. ¿ Por qué se da esto ?, ¿ Por que no es posible que solo se acepte resoluciones de direcciones a las cuales se hizo anteriormente un REQUEST?.

A demas he visto que este tipo de ataque se plantea en un entorno en el cual estas conectado a la misma red que el objetivo, intuyo que la primera razón para tener que cumplir con este requisito es que realmente no te puedes poner enmedio del ROUTER y del OBJETIVO por que simplemente no estas autenticado con el ROUTER pero que problemas hay con el OBJETIVO, es decir, yo estoy en un rango físico cercano al ROUTER y al objetivo, hago un ataque de 'ARP Spoofing' con el objetivo y el me reconoce como su router, entonces a partir de este momento el Router enviara correctamente los datos al OBJETIVO pero el objetivo me enviara los datos de su salida a mi y finalmente yo podría enviarlos al destino final por una red auxiliar. ¿Esto es posible o que incovenientes hay?. Finalmente estaria redirigiendo todo el trafico a la red auxiliar pero me gustaria saber en que punto llegaria a un conflicto
4  Sistemas Operativos / GNU/Linux / Fallo en Manejo de Ventanas en: 27 Enero 2020, 03:26 am
Hola a todos, resulta que tengo un buen rato intentando instalar Packet Tracer para Debian 10, con la novedad de que en todas las versiones encuentro fallos en dependencias obsoletas, en fin.. Finalmente he probado con la versión 7.2.2 , la cual he podido solucionar una dependencia y me he llevado la sorpresa que al iniciar el programa abre inicialmente dos ventanas:

1. Ventana de Login. Esta se sobrepone a la segunda
2. Ventana del entorno del trabajo.

Hasta aquí todo bien. El problema surge cuando doy el botón para iniciar sesión, dando como resultado una exepción de tipo Floating point exception y provocando el cierre de ambas ventanas. Actualmente no he dado solución con este problema en concreto pero ha manera de curiosidad he intentado matar la ventana de Login que se sobrepone a la ventana de entorno de trabajo sin conseguir ningun resultado al menos con los pocos conocimiento que tengo sobre el x-window-system y el manejo del comando wmctrl, debido a que al matar a la ventana de login, la ventana de trabajo tambien es cerrada.

Sin embargo, he ocasionado en dos situaciones muy aisladas lograr cerrar la ventana de login y permanacer con la ventana del entorno de trabajo abierta. Esto a sucedido cuando por repetidas ocasiones di clic sobre la ventana de trabajo lo que ocasiono que inesperadamente la ventana de login se cerrara y permitiera trabajar en la ventana de trabajo sin ningun problema(Incluso he guardado un archivo). ¿Qué pudo haber ocasionado esto?. No he conseguido determinar que secuencia de acciones me podrían dar como resultado esta reacción pero estoy seguro de que es posible debido a que ya ha sucedido 2 veces.
5  Programación / Scripting / HTTP en Python en: 12 Noviembre 2019, 23:09 pm
Buenas a todos. Estoy haciendo una aplicación de comunicación remota con sockets y desearia usar el protocolo HTTP para el formato de mis mensajes, el problema es que me gustaria crear un objecto REQUEST y RESPONSE que me ayuden con el agrupamiento de los datos y finalmente que permitan convertir todos los atributos de dicho objeto en su representación cruda, es decir, en una representacion de texto plano.

He visto los objetos RESPONSE y REQUEST del modulo requests de python y al menos he observado que el objeto REQUEST lo podría utilizar para este proposito pero con la única desventaja de que no he encontrado un metodo que me haga la conversion del objeto a su representación de str con formato de petición HTTP.

¿ Alguien sabe donde se encuentra dicho método ? o conoce algun modulo que me presente una abstracción de dichos objetos con lo que requiero.

Divagando un poquito mas sobre el tema...  ¿ El modulo Request debe estar obligado a tener algun sinonimo de dicha función ?. Yo intuyo que dicha funcion debe estar en alguna parte del modulo requests debido a que no habria otra forma de comunicar un REQUEST o un RESPONSE debido a ese modulo no exige a que del otro lado de la comunicación exista un programa usando el mismo modulo en python(caso en el que se podria hacer una serializacion del objeto). ¿ Estoy equivocado o hay algo que estoy ignorado ?

Nota. En ultimo caso sé que podría crear una nueva clase que herede de REQUEST y agregar lo que requiero.
6  Comunicaciones / Redes / Limitación de carpetas públicas en un Servidor. en: 1 Noviembre 2019, 05:38 am
Buenas a todos, estoy haciendo una práctica que simplemente es un servidor que despacha solicitudes de archivos , al estilo de un servidor Apache. Mi problema es que me gustaría que no fuera posible navegar fuera de esa carpeta al estilo de peticiones de archivos "../Otra_carpeta/Archivo_privado" .Si alguién sabe de manera mas detallada como soluciona dicho problema algunos servidores como Apache le agradecería que lo compartiera.

Algunas soluciones que se me ocurrieron fue:
  • 1. Posiblemente la mas sencilla. Crear un nuevo usuario con permisos de lectura solo dentro de la carpeta publica . Aunque en este punto estoy considerando que puedo crear un demonio y dicho demonio va tener los respectivos permisos que su usuario oriden (Corriganme si esto no es así)
  • 2. Usar Incron para generar eventos con referencia a la carpeta publica de manera que el servicio pueda ser notificado de cualquier eliminacion/agregación de un nuevo archivo en la carpeta  para que el servicio pueda tener un conjunto de los archivos disponibles, es decir, aquellos que se encuentran en la carpeta pública. Finalmente con cada petición de un archivo primeramente se verificaria si el recursos esta dentro de este conjunto de archivos disponibles(posiblemente con ayuda de su hash para una busqueda rapida)  
7  Informática / Hardware / Fallo de teclas al encedido de laptop. en: 29 Octubre 2019, 21:26 pm
Buenas a todos, desde hace unos dias mi laptop ha presentado el problema de que al encender o volver de una suspension , algunas de las teclas no funcionan del todo bien. En la mayoría de los casos lo que ocurre es que algunas teclas aisladas como 'r' y 'i' funcionan bien solo que siempre se agrega un desplazamiento a la izquierda, es decir, como si se pulsara la tecla de '<-' y despues 'i' o 'r'. La laptop no ha tenido ningún accidente al estilo de que haya tenido contacto con el agua o algun otro liquido sin embargo el problema se empezo a presentar desde que empezo a bajar un poco la tempetura en mi ciudad, alrededor de los 12 grados Celsius.

Finalmente el problema se resuelve despues de unos minutos de uso pero el fallo siempre se repite con las mismas teclas 'i'-'r', ademas de que siempre produce el mismo error. ¿ Alguien conoce alguna solución o que lo puede estar causando ?
8  Comunicaciones / Redes / Campo Protocolo de cabecera IP. en: 26 Octubre 2019, 23:34 pm
Buenas a todos, estaba checando las diferencias entre TCP y UDP en la capa de transporte y vi que dichos protocolos estan vinculados a un entero que es colocado en la cabecera del paquete formado en la capa de RED(IP). Observe que existe unos valores destinados para el protocolo IP y IPv6 pero ¿ Cómo esta eso?.

Creo entender que todos los paquetes indepedientemente si son UDP,TCP,etc... Van a caer al protocolo IP en la capa de red y cada uno va asignar un valor entero en el campo de PROTOCOLO en dicha cabecera pero que sentido tiene que dentro de la cabecera IP se de la posibilidad de poner como protocolo IP o IPv6 (El mismo).  ¿ Cuáles son los casos en donde  este campo es asginado como IP O IPv6?
9  Comunicaciones / Redes / RPC's y Sockets en: 22 Octubre 2019, 23:03 pm
Buenas a todos, llevo un lapso de tiempo viendo aplicaciones que hacen uso de sockets y tengo una noción relativamente superficial de los sockets y como es su manejo a nivel de programacion. Mi pregunta va en cuestión de las diferencias con RPC.

He visto y manejado un poco sobre el ONC RPC y su funcionamiento. Vi como principal diferencia la abstracción del llamar una función remota (como su mismo nombre dice) a diferencia de los sockets en donde no se presenta ese tipo de facilidades y todo se hace en un nivel aparentemente mas 'primitivo' .

Mis principales preguntas es...
  • 1. He visto muy poca información de los RPC a comparación de la de los sockets. ¿Los Sockets predominan en uso para comunicación entre procesos remotos?
  • 2. A lo que he visto la abstracción de los RPC permite realizar aplicaciones tal vez mas complejas con un menor esfuerzo a comparacion de los sockets. ¿Esta es su mayor ventaja frente a los sockets?
  • 3 Finalmente en que tipo de aplicaciones se prefiere los RPC frente a los sockets y viceversa
10  Programación / Programación C/C++ / Comunicacion entre hilos. Consumidor-Productor en: 2 Octubre 2019, 21:05 pm
Buenas a todos, encontre un ejemplo del problema de comunicacion en el libro de Tanenbaum que es el siguiente:

Código
  1. #include <stdio.h>
  2. #include <pthread.h>
  3. #define MAX 100
  4. pthread_mutex_t el_mutex;
  5. pthread_cond_t condc,condp;
  6. int buffer = 0;
  7.  
  8. void *productor(void *ptr){
  9.    int i;
  10.    for(i = 1; i <= MAX;i++){
  11.        pthread_mutex_lock(&el_mutex);
  12.        while(buffer != 0 ) pthread_cond_wait(&condp,&el_mutex);
  13.        printf("Productor....\n");
  14.        buffer = i;
  15.        pthread_cond_signal(&condc);
  16.        pthread_mutex_unlock(&el_mutex);
  17.    }
  18.    pthread_exit(0);
  19. }
  20.  
  21.  
  22. void *consumidor(void *ptr){
  23.    int i;
  24.    for(i = 1; i <= MAX;i++){
  25.        pthread_mutex_lock(&el_mutex);
  26.        while(buffer == 0 ) pthread_cond_wait(&condc,&el_mutex);
  27.        printf("Consumidor....\n");
  28.        buffer = 0;
  29.        pthread_cond_signal(&condp);
  30.        pthread_mutex_unlock(&el_mutex);
  31.    }
  32.    pthread_exit(0);
  33.  
  34. }
  35.  
  36.  
  37. int main(){
  38.    pthread_t pro,con;
  39.    pthread_mutex_init(&el_mutex,0);
  40.    pthread_cond_init(&condc,0);
  41.    pthread_cond_init(&condp,0);
  42.    pthread_create(&con,0,consumidor,0);
  43.    pthread_create(&pro,0,productor,0);
  44.    pthread_join(pro,0);
  45.    pthread_join(con,0);
  46.    pthread_cond_destroy(&condc);
  47.    pthread_cond_destroy(&condp);
  48.    pthread_mutex_destroy(&el_mutex);
  49.    return 0;
  50.  
  51. }
  52.  

Todo va bien hasta aqui.Mi pregunta es si tiene sentido esta dos lineas:
Código
  1.        while(buffer != 0 ) pthread_cond_wait(&condp,&el_mutex);
  2.  

Código
  1.        while(buffer == 0 ) pthread_cond_wait(&condc,&el_mutex);
  2.  

 ¿Es necesario poner la condicion en un while ?. Hasta donde yo entiendo el problema podria ser resuelto sustituyendo el while por un if y lo he verificado en algunas pruebas pero no se si algun detalle se me esta escapando. Creo que el while seria util cuando se tuviera mas de un consumidor o productor pero en este caso en concreto en el cual solo es 1-1 , ¿Tiene sentido?
Páginas: [1] 2 3
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines