Академический Документы
Профессиональный Документы
Культура Документы
No me detendré a explicar a fondo los segmentos SYN, y ACK, pero los "tantearé"
El cliente envía una solicitud al servidor (esto es SYN, enviar un número de secuencia
con el que se espera trabajar. Se inicia con un 1, significando que se está esperando
respuesta del otro extremo) pidiendole permiso para establecer una conexión
El servidor leerá la solicitud, y dependiendo de su funcionamiento y de la solicitud,
aceptará o la rechazará. Envía la desición al cliente.
El cliente interpretará la respuesta del servidor, y si obtuvo el permiso, envía una
confirmación (esto es ACK, confirmar la llegada del mensaje), y comienza el flujo de
datos hacia el servidor (ahora SYN vale 0, ya que se completó el proceso)
En Python, contamos con una librería que contiene las clases y funciones para manejar un socket.
La librería se llama socket:
Comenzamos importandola:
Código: Python
1. import socket
2.
Bien, dentro de la librería, hay una clase llamada socket. En ella, nosotros seleccionaremos los
parametros para crear un socket bajo el protocolo TCP/IP.
"socket.AF_INET, socket.SOCK_STREAM" son los parametros que nos crearán un objeto socket
TCP/IP.
Es importante saber que es recomendable usar un puerto bastante alejado de los puertos 21, 22,
80 ... etc, ya que estos son puertos especiales que nuestro Sistema Operativo usa para comunicarse
por Internet y por red local. Así que trata de seleccionar un puerto más alla de... 5000?
Digo orejas porque, cada oreja estará escuchando a través del puerto que seleccionamos,
esperando a que una conexión de un cliente llegue.
Al nosotros colocar un 5 entre los paréntesis, le estamos diciendo a nuestro socket que estamos
esperando 5 posibles clientes.
sc: El objeto socket cliente. Este es nuetro cliente, representado con una variable llamada sc
(puedes ponerle otro nombre, pero recomiendo dejarselo así)
addr: Su IP
El método accept() espera una conexión. Cuando llega, este acepta la conexión, y procedemos a
la parte que todos queremos.
Necesitamos recibir los datos que nuestro cliente nos está enviando.
Para esto, socket cuenta con un método llamado recv():
Código: Python
1. recibido = sc.recv(1024)
2.
Bien, lo que está entre paréntesis es el limite de bytes que se esperan como respuesta. Si se
excede el límite, no se recibe ni se acepta el resto del mensaje, dejandolo "mocho" (o cortado).
Ahora, ya tenemos lo que el cliente nos está diciendo, pero, ¿cómo le respondo?
Entonces, el método send() llega para salvarnos:
Código: Python
1. nuestra_respuesta = "Hola cliente, yo soy el servidor. Unete
a underc0de!"
2. sc.send(nuestra_respuesta.encode('utf-8'))
3.
Entonces, cuando terminemos nuestro trabajo, necesitaremos cerrar nuestro objeto socket cliente, y
también cerrar nuestro socket servidor;
Código: Python
1. sc.close()
2. mi_socket.close()
3.
Código completo:
Código: Python
1. import socket
2. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
3. s.bind(("127.0.0.1", 9999))
4. s.listen(5)
5.
6. print ("Servidor de Chat\n")
7.
8. while True:
9. print ("Esperando conexión...")
10. sc, addr = s.accept()
11. print ("Cliente conectado desde: ", addr)
12.
13. while True:
14. recibido = sc.recv(1024)
15. if recibido == "quit":
16. break
17. print ("Recibido: ", recibido)
18.
19. nuestra_respuesta = "Hola cliente, yo soy el
servidor. Unete a underc0de!"
20. sc.send(nuestra_respuesta.encode('utf-8'))
21.
22. print ("Adios")
23. sc.close()
24. s.close()
25.
OJO: Usamos "while True" para mantener el socket abierto, incluso si ya enviamos una
respuesta. Esto evitará que se cierre, y no podamos seguir enviando/recibiendo información.
Y LISTO. Creamos un socket bajo el protocolo TCP/IP (el más usado en la Internet de este planeta
y en Andromeda).
Crear un socket cliente es un poco más fácil, ya que nos ahorramos unas cuantas lineas de código.
El método connect() toma la tupla con los datos: IP a conectarse, y el puerto donde está escuchando
el servidor.
Ahora, ya establecimos una conexión con el servidor, entonces ya podemos enviar mensajes.
Volvemos a usar el método send()
Código: Python
1. while True:
2. mensaje = "Hola, soy el cliente, y ya me uní a
underc0de!"
3.
4. socket_cliente.send(mensaje.encode("utf-8"))
5.
Entonces, nosotros querremos recibir las respuestas del servidor. Para esto, volvemos a recv()
Código: Python
1. recibido = socket_cliente.recv(1024)
2. print("Recibido: ", recibido)
3.
Código completo:
Código: Python
1. import socket
2.
3. socket_cliente = socket.socket(socket.AF_INET,
socket.SOCK_STREAM)
4. socket_cliente.connect(("localhost", 5000))
5.
6. while True:
7. mensaje = str(input(">> "))
8. socket_cliente.send(mensaje.encode('utf-8'))
9.
10. recibido = socket_cliente.recv(1024)
11. print("Recibido: ", recibido)
12.
13. print ("Adios")
14. socket_cliente.close()
15.
Un Port Scanner (o escaner de puertos) se conectará a una ip, y a un rango determinado de puertos,
con la finalidad de descubrir puertos abiertos por donde un tercero puede atacar un sistema.
Código: Python
1. # Coded by Barlan. 2015
2. import socket
3. import sys
4.
5. if len(sys.argv) != 4:
6. print("[!] Use: scan.py [IP_to_scan] [Initial_Port]
[Final_Port]")
7. sys.exit(1)
8.
9. def connect(IP, port):
10. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
11. socket.setdefaulttimeout(0.6)
12. try:
13. s.connect((IP, port))
14. return(1)
15. except:
16. return(2)
17.
18. IP = str(sys.argv[1])
19. ip = int(sys.argv[2])
20. fp = int(sys.argv[3])
21. print("[*] Connecting to %s, scanning from %s to %s ..." %
(IP, ip, fp))
22.
23. for port in range(ip, fp+1):
24. e = connect(IP, port)
25. if e == 2:
26. print("[-] %s closed." % port)
27. else:
28. print("[+] %s open." % port)
29.
30. print("Finished!")
31.