Python黑帽子之网络编程
相信小伙伴都听说python语言在渗透领域的应用极为广泛,今天就来说说《python黑帽子》中的网络编程中TCP UDP服务器及客户端,使用原始套接字等所必须的代码,有兴趣的小伙伴可以点下面的连接去阅读这本书。
本书的下载地址
链接:https://pan.baidu.com/s/1q1uQOvsB382hsoAPE6H39w
提取码:xkn1
TCP客户端
import socket
target_host = "www.google.com"
target_port = 80
#建立一个socket对象
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#连接客户端
client.connect((target_host,target_port))
#发送一些数据
client.send("GET /HTTP/1.1\r\nHost: google.com\r\n\r\n")
#接收一些数据
response =client.recv(4096)
print response
首先我们先建立一个包含AF_INET和SOCK_STREAM参数的socket对象,AF_INET参数说明我们将使用标准的IPv4地址或者主机名,SOCK_STREAM说明这将是一个TCP客户端。然后,我们将客户端连接到服务器,并发送一些简数据。最后一步是接受返回的数据并相应数据打印出来(简单来说就是先建立一个socket的对象,对象里面有两个参数,第一个参数代表使用Ipv4,第二个参数代表此对象是一个TCP客户端对象,之后进行连接,发送数据,接受响应数据,打印响应数据)
UDP客户端
import socket
target_host = "127.0.0.1"
target_port = 80
#建立一个socket对象
client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#发送一些数据
client.sendto("AAABBBCCC",(target_host,target_port))
#接收一些数据
data,addr = client.recvfrom(4096)
print data
正如你所看到的,我们将socket.SOCK_STREAM改为socket.SOCK_DGRAM,之后调用了sendto()函数将数据发送到想发送的服务器上,因为UDP是一个无连接状态的传输协议,所以不需要在此之前调用连接函数 connect() 最后一步是调用 revcfrom()函数 接受返回的UDP数据包,这样就能够接受到回传的数据及远程主机的信息和端口号
send函数需要建立连接所以用在TCP中而sendto函数可以指定服务器的地址及端口,由于TCP需要三次握手连接建立一个持续可靠的连接,而UDP则并不需要建立连接只负责发送并不理睬服务器是否收到,所以在使用函数上有所不同
TCP服务器
import socket
import threading
bind_ip ="0.0.0.0"
bind_port =9999
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind((bind_ip,bind_port))
server.listen(5)
print"[*] lstening on %s:%d" %(bind_ip,bind_port)
#客户端处理线程
def handle_client(client_socket):
#打印出客户端发送得到内容
request = client_socket.recv(1024)
print "[*] Received: %s" % request
#返还一个数据包
client_socket.send("ACK!")
client_socket.close()
while True:
client,addr = server.accept()
print "[*] Accepted connection from: %s:%d" %(addr[0],addr[1])
#挂起客户端线程,处理传入的数据
client_handler = threading.Thread(target=handle_client,args=(client,))
client_handler.start()
首先先确定服务器需要监听的IP地址和端口,然后,我们启动监听,并将最大连接数设为5.下一步让服务端进入主循环中,并在这里等待。当一个客户端连接成功时,将接受到的客户端套接字对象保存到client变量中,将远程连接的细节保存到addr变量中,接着以handle_client函数为回调函数创建了一个新的线程对象,将客户套接字对象作为一个句柄传递给它之后启动线程开始处理客户端连接 执行recv()函数之后将一段信息发送给客户端。
这便是我对第二章TCP和UDP网络编程的学习,如有错误还请指出,定及时改正。