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

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


  Mostrar Temas
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12
21  Sistemas Operativos / GNU/Linux / vsftpd permite conexion FTPS y FTP a la vez? en: 25 Octubre 2020, 13:12 pm
Buenas, tengo instalado el libreoffice 6.1.5.2 en un Debian 10. Me gustaria poder guardar mis archivos a mi servidor FTP. Pero el problema esta en que mi servidor FTP va por SSL, el protocolo es FTPS,  y libreoffice no te permite el FTP/SSL

El servicio que corro es el vsftpd, hay alguna forma de que ftps no sea obligatorio. Es decir yo tengo configurado con SSL. Y cuando esta con SSL no puedo acceder a http://ftp://midominio.com:3500, pero cuando no esta activado el SSL no puedo acceder a http://ftps://midominio.com:3500 pero si a http://ftp://midominio.com:3500.

Puede haber alguna manera, de que accediendo o http://ftps://midominio.com:3500  o http://ftp://midominio.com:3500?
Código:
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=YES

Gracias

P.D: Al publicar el tema me añade un http:// delante de ftp:// o ftps:// automaticamente.
22  Informática / Software / conexion FTPS en Libreoffice? en: 24 Octubre 2020, 13:49 pm
Buenas, tengo instalado el libreoffice 6.1.5.2 en un Debian 10. Me gustaria poder guardar mis archivos a mi servidor FTP, para ello libreoffice te lo permite, voy a File > Save remote.... Pero el problema esta en que mi servidor FTP va por SSL, el protocolo es FTPS, en Libreoffice como puedo activar el FTPS....?

El servicio que corro es el vsftpd, hay alguna forma de que ftps no sea obligatorio. Es decir yo tengo configurado con SSL. Y cuando esta con SSL no puedo acceder a http://ftp://midominio.com:3500, pero cuando no esta activado el SSL no puedo acceder a http://ftps://midominio.com:3500 pero si a http://ftp://midominio.com:3500.

Puede haber alguna manera, de que accediendo o http://ftps://midominio.com:3500  o http://ftp://midominio.com:3500?

Gracias

P.D: Al publicar el tema me añade un http:// delante de ftp:// o ftps:// automaticamente.
23  Informática / Hardware / Que es una llamada trap en el nucleo? en: 16 Octubre 2020, 22:54 pm
Buenas.
El sistema operativo tiene tres mecanimos para acceder al nucleo: interrupciones, excepciones y traps.

http://www.tugurium.com/gti/termino.php?Tr=trap
Según el Glosario de Terminología Informática (GTI) un trap es:
Citar
Operación de bifurcación realizada automáticamente ante la detección de una condición de error.[...] automaticamente asumen el control para analizar e intentar corregir la situación de error.

En la frase:
Citar
Operación de bifurcación realizada automáticamente ante la detección de una condición de error.

Que quiere decir que, cuando detecta un error en alguna instruccion, intenta repararlo? Es decir, menos "avisar" al S.O para que este avise al usuario. Lo que hace es repararlo si puede, y hace como si no hubiese ese error?

Gracias
24  Sistemas Operativos / GNU/Linux / Mi servidor le envia un IP privada cuando me conecto desde la WAN | VSFTPD en: 4 Octubre 2020, 18:00 pm
Buenas, estoy configurando mi servidor FTP y me he dado cuenta que al conectarme desde la WAN con el cliente Filezilla, me da el siguiente error:
Citar
Server sent pasive reply with unroutable address. Using server address instead.

El problema esta que cuando me conecto port FTPS le pide al server la dirección, y este le dá un IP interna. Me conecto, pero no me lista los archivos.

Yo tebgo configurado en mi vsftpd.conf ssl:
Código:
listen=NO
listen_port=3500
listen_ipv6=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
idle_session_timeout=300
data_connection_timeout=120
ftpd_banner=FTP server
chroot_local_user=YES
chroot_list_enable=YES
allow_writeable_chroot=YES
chroot_list_file=/etc/users_vsftpd.deny
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=YES
#utf8_filesystem=YES
###########################
#       PASSIVE MODE                #
###########################
pasv_enable=YES
pasv_addr_resolve=YES
pasv_address=xxxxxxxxxx.xxx

Le añadí lo siguiente para que de un IP externa, pero sigue sin listar los directorios.

Se puede hacer de alguna manera con iptables? O como se puede solucionar? Gracias
25  Programación / Scripting / Saber si el script se ejecuto como administrador [Windows] | Python3 en: 21 Septiembre 2020, 20:34 pm
Buenas, estoy haciendo un script de instalación con python y quiero obligar al usuario a que lo ejecute como administrador. Eso en entorno GNU/Linux, se hace con la funcion os.geteuid().
Código
  1. import os, sys
  2. if os.geteuid() != 0:
  3.   print("Needs root privileges")
  4.   sys.exit()
  5. #code
  6.  
pero como se puede hacer con Windows?

Hay alguna manera de obtener los datos del usuario actual? por que se puede obtener el nombre del usuario con el que estoy corriendo el script.

Gracias de antemano
26  Programación / Scripting / llamar modulo dentro de una clase | Python3 en: 12 Septiembre 2020, 19:49 pm
Buenas. Tengo un problema....

Tengo una clase, donde cuya clase estoy llamando a la funcion OS_system(), importado del paquete ' init'
Código
  1. from init import *
  2. class notification:
  3.       # [CODE]
  4. def popup(self, title, type_title, content_text, type_image, Image=Image):
  5. try:
  6. main = Tk()
  7. ico = Image.open(OS_system().path_tkinter("SockServices.png"))
  8.                        # [...]
  9.  

init modulo:
Código
  1. class OS_system:
  2. def __init__(self):
  3. self.system = platform.system()
  4.        # [...]
  5. def path_tkinter(self,image):
  6. if self.system == "Linux":
  7. return "/etc/SockServices/mods/popup/images/"+str(image)
  8. elif self.system == "Windows":
  9. return "C:\Program Files\SockServices\mods\popup\images\\"+str(image)
  10.  
El problema es que me da el error
Citar
NameError: name 'OS_system' is not defined

El problema es que la clase OS_system del modulo init no es importada dentro de la clase notification. Como lo hago?[/code]
27  Programación / Scripting / Como muestro los servicios que estan corriendo en el sistema (Win/Lin)? | Python en: 18 Agosto 2020, 20:40 pm
Buenas, estoy haciendo un script python que será un servicio ejecutandose en segundo plano y necesito mostrar los servicios del sistema. Si hay una funcion o dependencia en python que permita mostrar los servicios mejor, ya que el servicio se ejecutaria, tanto en sistemas Linux como Windows.

Eso se puede hacer con Python?
28  Programación / Scripting / [RESUELTO] ejecutar recv() temporalmente | Python3 sockets en: 11 Agosto 2020, 13:16 pm
RESUELTO

El resultado fue crear en el cliente un nuevo subproceso donde este en escucha a la respuesta del mensaje OK o TooManyClients, y con cuya respuesta guardarla en un booleano en la clase Globals y con ello hacer el condicional.

Y en el servidor cuando se conecta un cliente almacena en la lista  list_clients, creada en la clase Globals, una sublista con el nombre del cliente "SockServicesX", la conexion, y el booleano (por defecto False).
Más tarde creo la clase Select_user que es para seleccionar la sublista correspondiente al cliente conectado y con ello usar esa información para eliminar el usuario (sublista) con user.remove_client() o check la conexión user.check(conn)


Dejo el código en el proximo post

En conclusión no puede haber dos funciones recv() en una misma conexion socket

Buenas, estoy haciendo una conexion socket con varios clientes... con un máximo de 3 clientes. La idea es
 la siguiente:

socket server completo
Código
  1. #!/usr/bin/python3
  2. # Server
  3. import socket, threading, os, sys, time
  4.  
  5. # globals variables
  6. class globals:
  7. PORT, NUMBER_CONNECTIONS = 2048, 3 #constants
  8. number_client = 0 # count clients number
  9.  
  10. ### CONNECTIONS CLIENTS PARALLEL ###
  11.  
  12. def client(connection, address, idle):
  13.  
  14. ADDRESS_CLIENT, PORT_CLIENT = address[0], address[1]
  15.  
  16. print("client "+str(idle)+" ["+str(ADDRESS_CLIENT)+"] connected by "+str(PORT_CLIENT))
  17. while True:
  18. data = connection.recv(1024)
  19.  
  20. if data.decode() == "exit" or data.decode() == "close":
  21. connection.sendall(b"GoodBye")
  22. print("Client "+str(idle)+" ["+str(ADDRESS_CLIENT)+":"+str(PORT_CLIENT)+"] left")
  23. globals.number_client-=1 # subtract client at count
  24. break
  25. elif data.decode() == "KeyboardInterrupt":
  26. print("[\033[0;31m*\033[0m] Connection interrupted with Client "+str(idle))
  27. globals.number_client-=1 # subtract client at count
  28. break
  29. else:
  30. connection.sendall(data)
  31.  
  32. #close the connection with client
  33. connection.close()
  34.  
  35. ### MAIN ###
  36. try:
  37. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  38. sock.bind(("",globals.PORT))
  39. sock.listen(globals.NUMBER_CONNECTIONS)
  40. print("[\033[0;34m*\033[0m] Listening port "+str(globals.PORT)+"....")
  41. while True:
  42. conn, addr = sock.accept()
  43. # if he is fourth client o more, not connect it
  44. if not globals.number_client+1 > globals.NUMBER_CONNECTIONS:
  45. globals.number_client+=1 # add client at count
  46. idle="SockServices"+str(globals.number_client)
  47. socket_client = threading.Thread(target=client,name=idle,args=(conn, addr, idle))
  48. ;
  49. socket_client.start()
  50. else:
  51. conn.sendall(b"TooManyClients")
  52.  
  53. except KeyboardInterrupt:
  54. # close the server
  55. print("\n[\033[1;34m*\033[0m] Closing server....")
  56. sock.close()
  57. os.system("fuser -k -n tcp %s 2>&1" % globals.PORT)
  58.  

explicación

variables globales
Código
  1. # globals variables
  2. class globals:
  3. PORT, NUMBER_CONNECTIONS = 2048, 3 #constants
  4. number_client = 0 # count clients number
  5.  

Creo una conexion socket nomal. [globals es una clase con las variables que se van a utilizan en todo el script (también en dentro de funciones)]

Código
  1.  
  2. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  3. sock.bind(("",globals.PORT))
  4. sock.listen(globals.NUMBER_CONNECTIONS)
  5. print("[\033[0;34m*\033[0m] Listening port "+str(globals.PORT)+"....")
  6. while True:
  7. conn, addr = sock.accept()
  8. # if he is fourth client o more, not connect it
  9. if not globals.number_client+1 > globals.NUMBER_CONNECTIONS:
  10. globals.number_client+=1 # add client at count
  11. idle="SockServices"+str(globals.number_client)
  12. socket_client = threading.Thread(target=client,name=idle,args=(conn, addr, idle));
  13. socket_client.start()
  14. else:
  15. conn.sendall(b"TooManyClients")
  16.  

Cuando corre el bucle si es 1º,2º o 3º cliente la variable globals.number_client con valor por defecto 0 es incrementado, y creo una idle que es el nombre SockServices mas el numero de cliente, después creo un hilo con nombre SockServices donde va a ejecutar la funcion client

Código:
		if not globals.number_client+1 > globals.NUMBER_CONNECTIONS:
globals.number_client+=1 # add client at count
idle="SockServices"+str(globals.number_client)
socket_client = threading.Thread(target=client,name=idle,args=(conn, addr, idle));
socket_client.start()

Si la condición no se cumple, significa que ya hay tres clientes y me envias al cliente con conexion denegada la palabra "TooManyClients"

Código
  1. else:
  2. conn.sendall(b"TooManyClients")
  3.  

socket client completo

Código
  1. #!/usr/bin/python3
  2. #client
  3. import socket, time, os, sys
  4.  
  5. # CONSTANTS
  6. ADDRESS, PORT = "127.0.0.1", 2048
  7.  
  8. sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  9. sock.connect((ADDRESS, PORT))
  10. sock.settimeout(3)
  11.  
  12. while True:
  13. try:
  14. try:
  15. #receive server's data
  16. check = sock.recv(1024)
  17. except socket.timeout:
  18. pass
  19.  
  20. if check.decode() == "TooManyClients":
  21. print("[\033[0;31m*\033[0m] Too many clients connected")
  22. sock.close()
  23. sys.exit()
  24. else:
  25. print("[\033[0;32m*\033[0m] Connection established")
  26. pass
  27.  
  28. sock.setblocking(s)
  29. while True:
  30. #prompt terminal
  31. prompt = input("> ")
  32.  
  33. #receive server's data
  34. data = sock.recv(1024)
  35.  
  36. print(data.decode())
  37.  
  38. #Send prompt's data to server
  39. sock.sendall(prompt.encode())
  40.  
  41. if data.decode() == "GoodBye":
  42. print("[\033[0;34m*\033[0m] Closing connection....")
  43. break
  44. except KeyboardInterrupt:
  45. sock.sendall(b"KeyboardInterrupt")
  46. print("\n[\033[0;31m*\033[0m] Connection interrupted, closing connection....")
  47. break
  48. sock.close()
  49.  

explicación

Creo una conexion socket normal y me conecto al servidor

Código
  1. # CONSTANTS
  2. ADDRESS, PORT = "127.0.0.1", 2048
  3.  
  4. sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  5. sock.connect((ADDRESS, PORT))
  6.  

Una vez hecha la conexion ejecuto el primer bucle while True, que lo ejecuto para saber si el cliente se puede conectar o no.
Primero recibo los datos del servidor

Código
  1. while True:
  2. try:
  3. #receive server's data
  4. data = sock.recv(1024)
  5.  

Sí lo que recibo es TooManyClients, le digo al cliente que no se puede conectar porque el foro de clientes está completo y cierro la conexion

Código
  1. if data.decode() == "TooManyClients":
  2. print("[\033[0;31m*\033[0m] Too many clients connected")
  3. sock.close()
  4. sys.exit()
  5.  

Si no recibo nada imprime que esto conectado al servidor y ejecuta el siguiente bucle.

Código
  1. else:
  2. print("[\033[0;32m*\033[0m] Connection established")
  3. pass
  4. while True:
  5. #prompt terminal
  6. prompt = input("> ")
  7.  
  8. print(data.decode())
  9.  
  10. #Send prompt's data to server
  11. sock.sendall(prompt.encode())
  12.  
  13. if data.decode() == "GoodBye":
  14. print("[\033[0;34m*\033[0m] Closing connection....")
  15. break
  16.  

Que el siguiente bucle ya podré enviar datos al servidor

problema

Como podeis ver en la imagen cuando me conecto, no me imprime el mensaje Connection establlished, sino que se queda como en escucha, en el cuarto intento de conexión (cuadro izquierdo abajo), me imprime el mensaje Too many clients connected

Creo que el problema esta en el lado cliente, en el primer while True, que esta recibiendo los datos

Código
  1. sock.connect((ADDRESS, PORT))
  2. while True:
  3. try:
  4. #receive server's data
  5. data = sock.recv(1024)
  6.  

El problema es que el recv() se queda en escucha y como no recibe nada... ya que el condicional if que valida el usuario en socket server no envia nada al cliente.

Código
  1. if not globals.number_client+1 > globals.NUMBER_CONNECTIONS:
  2. globals.number_client+=1 # add client at count
  3. idle="SockServices"+str(globals.number_client)
  4. socket_client = threading.Thread(target=client,name=idle,args=(conn, addr, idle));
  5. socket_client.start()
  6. else:
  7. conn.sendall(b"TooManyClients")
  8.  


Sí en la condicional if le envio un OK, y con esto, se me inicia pero si envio algo del cliente al servidor siempre me recibe el mensaje OK, y no GoodBye

Código
  1. if not globals.number_client+1 > globals.NUMBER_CONNECTIONS:
  2.                        conn.sendall(b"OK")
  3. globals.number_client+=1 # add client at count
  4. idle="SockServices"+str(globals.number_client)
  5. socket_client = threading.Thread(target=client,name=idle,args=(conn, addr, idle));
  6. socket_client.start()
  7. else:
  8. conn.sendall(b"TooManyClients")
  9.  


Como la idea de enviar el mensaje OK no funciona... me preguntaria si se podría en el cliente dejar de escuchar los datos a recibir recv(), hacer la condicional y después volver a escuchar los datos.. Se puede hacer esto con sock.setblocking()?
Código
  1. while True:
  2. try:
  3. #receive server's data
  4. data = sock.recv(1024)
  5. if data.decode() == "TooManyClients":
  6. print("[\033[0;31m*\033[0m] Too many clients connected")
  7. sock.close()
  8. sys.exit()
  9. else:
  10. print("[\033[0;32m*\033[0m] Connection established")
  11. pass
  12.  

Leí un post en stackoverflow, donde preguntaba como podía recibir datos con recv() un tiempo con select
https://stackoverflow.com/questions/2719017/how-to-set-timeout-on-pythons-socket-recv-method#answer-2721734

Yo lo que hice es lo siguiente:

importe el modulo select
Código
  1. import select

dentro del bucle cree una variable ready que le permite escuchar el rec() solo 2 segundos y cuando acabe estos segundos. Mientras pasa estos dos segundos, recibo los datos en la variable data y si data contiene TooManyClients la varibale booleana es False (por defecto es True).

Si la variable es True ejecutaré el pass y pasará al siguiente while y si es False me imprimira que hay demasiados clientes.

Código
  1. sock.setblocking(0)
  2. check = True
  3. while True:
  4. try:
  5. ready = select.select([sock], [],  [], 2)
  6. if ready[0]:
  7. #receive server's data
  8. data = sock.recv(1024)
  9. if data.decode() == "TooManyClients":
  10. check=False
  11. if check==False:
  12. print("[\033[0;31m*\033[0m] Too many clients connected")
  13. sock.close()
  14. sys.exit()
  15. else:
  16. print("[\033[0;32m*\033[0m] Connection established")
  17. pass
  18.  

Pero tengo dos problemas con esta solucion
  • Este script se ejecutará en sistemas Windows y Linux y en Windows el modulo select no funcionara
  • Cuando estoy ya conectado al servidor y envio un dato, este no me leé la variable data

Se puede en:

Código
  1. else:
  2. print("[\033[0;32m*\033[0m] Connection established")
  3. pass
  4.  
o en:
Código
  1. while True:
  2. #prompt terminal
  3. prompt = input("> ")
  4.  
  5. print(data.decode())
  6.  
  7. #Send prompt's data to server
  8. sock.sendall(prompt.encode())
  9.  
  10.  

Volver a activar el recv()? Y si se puede como?



actualizado

Buenas como mi idea es que recv() se ejecute temporalmente en el primer while True del cliente inserte lo siguiente:

Código
  1. sock.connect(...)
  2. sock.settimeout(3)
  3.  
  4. while True:
  5. try:
  6. try:
  7. #receive server's data
  8. check = sock.recv(1024)
  9. except socket.timeout:
  10. pass
  11.  

Durante 3 segundos me ejecuta el sock.recv() y cuando pasa el tiempo me salta la excepcion por la cual pasa al siguiente bucle, el problema esta en que lo que obtuve de recv() lo quisiera almacenar en una variable, teoricamente en check, pero cuando hago las condicionales check.decode() no me detecta cuya variable

Citar
Services
Traceback (most recent call last):
  File "./SockServices", line 16, in <module>
    check = sock.recv(1024)
socket.timeout: timed out

During handling of the above exception, another exception occurred:                                    

Traceback (most recent call last):
  File "./SockServices", line 18, in <module>
    print(check.decode())
29  Sistemas Operativos / GNU/Linux / Porque en los archivos .service los comandos se encriben con la ruta absoluta? en: 31 Julio 2020, 13:12 pm
Buenas, esto es más por curiosidad y conocimento que por algun problema o error...

Cuando voy a /lib/systemd/system/ donde estan todos los archivos .service que son controlados por systemd. Por que los archivos donde estan ExecStart, ExecStop,.. con el comando a ejecutar se ejecuta de esta manera:
Código:
ExecStart=/usr/sbin/vsftpd /etc/vsftpd.conf
y no de esta:
Código:
ExecStart=vsftpd /etc/vsftpd.conf

Si al final es lo mismo y se ejecuta....

Que es por estetica o por algo en concreto?

Código:
[Unit]
Description=vsftpd FTP server
After=network.target

[Service]
Type=simple
ExecStart=/usr/sbin/vsftpd /etc/vsftpd.conf
ExecReload=/bin/kill -HUP $MAINPID
ExecStartPre=-/bin/mkdir -p /var/run/vsftpd/empty

[Install]
WantedBy=multi-user.target

Gracias
30  Programación / Scripting / Como envia datos a un sitio web HTTPS via socket? | Servidor Proxy python3 en: 20 Julio 2020, 19:21 pm
Buenas, estoy haciendo un servidor proxy con Python3. La idea es la siguiente:

1 . Primero, capturo el puerto especificado en el primer argumento:

Código:
if len(sys.argv) == 2:
        pass
else:
        sys.exit()


# CONSTANTS GLOBALS
global PORT_LISTEN, BUFFER_RECV, CONNECTIONS
PORT_LISTEN = int(sys.argv[1])
BUFFER_RECV = 8192
CONNECTIONS = 5

2. Después con el puerto especificado, creo una conexion socket servidor bind(), y obtengo los datos recibidos, con ello, ejecuto un hilo, donde paso los datos de la conexion y datos a la funcion get_data.
Código:
print("[*] Listening Port "+str(PORT_LISTEN)+"....")
lister = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
lister.bind(("",PORT_LISTEN))
lister.listen(CONNECTIONS)
while True:
        try:
                conn, addr = lister.accept()
                data = conn.recv(BUFFER_RECV)
                thread_data = threading.Thread(target=get_data, name="get_data", args=(conn, addr, data))
                thread_data.start()
        except KeyboardInterrupt:
                conn.close()
                lister.close()
                print("\n[\033[1;31m!\033[0m] Exiting Proxy Server....")
                sys.exit()

3. En la funcion get_data, obtengo la url, donde cogeré dominio donde estoy visitando
Código:
        #get url
        url = str(data).split('\\n')[0]
        url = str(url).split(' ')[1]

        #get FQDN
        website = url.replace("http://","")
        website = website.split("/")[0]

4. Una vez sé en que dominio estoy haciendo la petición, si el dominio contiene ":" cogeré el puerto especificado. Por defecto el puerto es 80, si no se detecto ":" en el dominio.
Código:
        port = 80
        if website.count(":") == 1:
                list = website.split(":")
                website = list[0]
                port = list[1]
                port = int(port)
        print("\n\033[1;32mwebsite\033[0m: "+str(website)+" \033[1;32mport\033[0m: "+str(port))

5. Finalmente ejecuto la funcion send_data con sus argumentos, para que me haga una conexion socket cliente al servidor y envie los datos, con un bucle.
Código:
send_data(website, int(port), conn, data, addr, True)

def send_data(site, port, conn, data, addr):
    sender = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    sender.connect((site,port))
    sender.send(data)
    while True:
            reply = sender.recv(8192)
            if len(reply) > 0:
                conn.send(reply)
            else:
                break
    sender.close()
    conn.close()

Esto funciona correctamente en sitios web HTTP, pero como cabe esperar, el HTTPS no, por los certificados ssl.

Así que modifiqué el apartado 5. Y con una condicional, si el puerto es 443, ejecutará lo siguiente:
Código:
        if port == 443:
                send_data(website, int(port), conn, data, addr, True)
        else:
                send_data(website, int(port), conn, data, addr, False)

def send_data(site, port, conn, data, addr, SSL):
        sender = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        sender.connect((site,port))
        sender.send(data)
        while True:
                reply = sender.recv(BUFFER_RECV)
                if len(reply) > 0:
                        conn.send(reply)
                else:
                        break
        sender.close()
        conn.close()


En send_data añadí un argumento booleano llamada SSL, que antes de hacer nada, si este es True, sería https, lo que no sé muy bien, es que hacer aquí.


Me he mirado el funcionamiento de los sitios HTTPS en youtube.


En el minuto 2:16, explica con más profundidad como trabaja este protocolo. He pensado, si hay alguna forma de obtener el certificado que me da el servidor para obtener la llave publica.... pero no se muy bien.

Miré este enlace: https://soursop-dev.blogspot.com/2020/05/creacion-de-un-servidor-web-proxy-en.html

Donde te explica como hacer una conexion ssl con el modulo ssl.

Así que modifique la funcion send_data:
Código:
def send_data(site, port, conn, data, addr, SSL):
        if SSL == True:
                server_cert = "./ssl/sechome.csr"
                client_cert = "./ssl/sechome.crt"
                client_key = "./ssl/sechome.key"
                context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH, cafile=server_cert)
                context.load_cert_chain(certfile=client_cert, keyfile=client_key)
                s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
                sender = context.wrap_socket(s, server_side=False, server_hostname=site)
        else:
                sender = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        sender.connect((site,port))
        sender.send(data)
        while True:
                reply = sender.recv(BUFFER_RECV)
                if len(reply) > 0:
                        conn.send(reply)
                else:
                        break
        sender.close()
        conn.close()
:

Creé los certificados autofirmados:
Código:
$ cd ssl
ssl/$ openssl req -newkey rsa:2048 -nodes -keyout sechome.key -out sechome.csr -sha256
ssl/$ openssl x509 -signkey sechome.key -in sechome.csr -req -days 365 -out sechome.crt

Como bien me imaginaba esto no funciona, ya que tendría que coger el certificado que me da el dominio al hacer la peticion. No acabo de entender muy bien en las variables de crt y key, que llaves tengo que poner...

Código:
                server_cert = "./ssl/sechome.csr"
                client_cert = "./ssl/sechome.crt"
                client_key = "./ssl/sechome.key"


CODE COMPLETE:
Código:
#!/usr/bin/python3
import socket, threading, re, sys, os

if len(sys.argv) == 2:
pass
else:
sys.exit()


# CONSTANTS GLOBALS
global PORT_LISTEN, BUFFER_RECV, CONNECTIONS
PORT_LISTEN = int(sys.argv[1])
BUFFER_RECV = 8192
CONNECTIONS = 5

def send_data(site, port, conn, data, addr, SSL):
if SSL == True:
server_cert = "./ssl/sechome.csr"
client_cert = "./ssl/sechome.crt"
client_key = "./ssl/sechome.key"
context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH, cafile=server_cert)
context.load_cert_chain(certfile=client_cert, keyfile=client_key)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sender = context.wrap_socket(s, server_side=False, server_hostname=site)
else:
sender = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sender.connect((site,port))
sender.send(data)
while True:
reply = sender.recv(BUFFER_RECV)
if len(reply) > 0:
conn.send(reply)
else:
break
sender.close()
conn.close()


def get_data(conn, addr, data):
#get url
url = str(data).split('\\n')[0]
url = str(url).split(' ')[1]

#get FQDN
website = url.replace("http://","")
website = website.split("/")[0]
port = 80
if website.count(":") == 1:
list = website.split(":")
website = list[0]
port = list[1]
port = int(port)
print("\n\033[1;32mwebsite\033[0m: "+str(website)+" \033[1;32mport\033[0m: "+str(port))
if port == 443:
send_data(website, int(port), conn, data, addr, True)
else:
send_data(website, int(port), conn, data, addr, False)


print("[*] Listening Port "+str(PORT_LISTEN)+"....")
lister = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
lister.bind(("",PORT_LISTEN))
lister.listen(CONNECTIONS)
while True:
try:
conn, addr = lister.accept()
data = conn.recv(BUFFER_RECV)
thread_data = threading.Thread(target=get_data, name="get_data", args=(conn, addr, data))
thread_data.start()
except KeyboardInterrupt:
conn.close()
lister.close()
print("\n[\033[1;31m!\033[0m] Exiting Proxy Server....")
sys.exit()
Páginas: 1 2 [3] 4 5 6 7 8 9 10 11 12
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines