构建SSH僵尸网络

复制代码
import argparse
import paramiko

# 定义一个名为Client的类,用于表示SSH客户端相关操作
class Client:
    # 类的初始化方法,接收主机地址、用户名和密码作为参数
    def __init__(self, host, user, password):
        self.host = host
        self.user = user
        self.password = password
        # 创建一个paramiko的SSHClient实例,用于后续的SSH连接操作
        self.client = paramiko.SSHClient()
        # 设置自动添加主机密钥策略,避免出现未知主机密钥时连接失败
        self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        # 调用连接方法,尝试建立SSH连接
        self.connect()

    # 定义连接方法,用于建立到指定主机的SSH连接
    def connect(self):
        try:
            # 使用提供的主机、用户名和密码进行SSH连接
            self.client.connect(self.host, username=self.user, password=self.password)
            print(f"[+] Connected to {self.host}")
        except Exception as e:
            print(f"[-] Error connecting to {self.host}: {e}")

    # 用于在已连接的SSH会话上执行命令,并返回命令的输出结果
    def send_command(self, cmd):
        # 在SSH会话上执行命令,获取标准输入、标准输出和标准错误输出流
        stdin, stdout, stderr = self.client.exec_command(cmd)
        # 读取标准输出内容,并使用utf-8编码将字节数据转换为字符串
        output = stdout.read().decode('utf-8')
        # 读取标准错误输出内容,并进行同样的编码转换
        error = stderr.read().decode('utf-8')
        if error:
            print(f"[-] Error executing command on {self.host}: {error}")
        return output

    # 类方法,用于向所有已添加到botNet列表中的客户端发送相同命令,并收集结果
    @classmethod
    def botnet_command(cls, command):
        results = []
        # 遍历botNet列表中的每个客户端实例
        for client in cls.botNet:
            # 在每个客户端上执行命令,并获取输出结果
            output = client.send_command(command)
            # 将客户端的主机地址和对应的命令输出结果作为元组添加到results列表中
            results.append((client.host, output))
        return results

    # 类方法,用于向botNet列表中添加一个新的客户端实例
    @classmethod
    def add_client(cls, host, user, password):
        client = cls(host, user, password)
        cls.botNet.append(client)

    # 类方法,用于关闭所有已添加到botNet列表中的客户端的SSH连接
    @classmethod
    def close_all_connections(cls):
        for client in cls.botNet:
            client.client.close()
            print(f"[+] Connection to {client.host} closed")

# 初始化一个空的botNet列表,用于存储所有的客户端实例
Client.botNet = []

def main():
    # 创建一个命令行参数解析器对象,用于解析用户输入的命令行参数
    parser = argparse.ArgumentParser(description='SSH Botnet Client')
    # 添加一个名为--host的命令行参数,可接收多个值,用于指定要连接的主机地址
    parser.add_argument('--host', nargs='+', help='Host(s) to connect to')
    # 添加一个名为--user的命令行参数,可接收多个值,用于指定SSH连接的用户名
    parser.add_argument('--user', nargs='+', help='Username(s) for SSH connection')
    # 添加一个名为--password的命令行参数,可接收多个值,用于指定SSH连接的密码
    parser.add_argument('--password', nargs='+', help='Password(s) for SSH connection')
    args = parser.parse_args()

    # 检查是否缺少必要的命令行参数,如果缺少则报错
    if not args.host or not args.user or not args.password:
        parser.error('Missing required arguments')
    # 检查主机地址、用户名和密码的数量是否一致,如果不一致则报错
    if len(args.host)!= len(args.user) or len(args.host)!= len(args.password):
        parser.error('The number of hosts, users, and passwords must be the same')

    # 通过循环,为每个主机地址、用户名和密码的组合创建一个Client实例,并添加到botNet列表中
    for host, user, password in zip(args.host, args.user, args.password):
        Client.add_client(host, user, password)

    print("Connected to all hosts. Enter 'exit' to quit.")
    while True:
        command = input("Enter command: ")
        if command.lower() == 'exit':
            break
        results = Client.botnet_command(command)
        for host, output in results:
            print(f"Output from {host}:")
            print(output)

    # 关闭所有已添加的客户端的SSH连接
    Client.close_all_connections()

if __name__ == '__main__':
    main()
复制代码
运行方法:
第一种:终端控制:python your_script.py --host IP1 IP2 --user user1 user2 --password password1 password2

输出结果:

相关推荐
信誓旦旦的程序猿6 分钟前
【Python量化实战宝典 #21】北向资金跟随手册:聪明钱择时信号(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
严谨的麻辣烫21 分钟前
静态 ISP 代理请求超时怎么排查?Python 与 curl 实战
python·http·requests·1024程序员节·网络排障
运维行者_2 小时前
网络监控工具怎么选?从设备监控到智能运维的能力清单
运维·服务器·开发语言·网络·人工智能·支持向量机·php
2401_868534782 小时前
陈冲2026年上海纽约大学全英文毕业演讲
服务器·网络
KeepRobots2 小时前
11-01 温哥华不回拨:用 60 行 Python 查你的工单系统会不会差一小时(KeepRobots 工程笔记)
python
xiao77mwq2 小时前
你以为 OCR 慢?实测 81.3 s 里全是故障代价:如何把「定格态」消掉,让耗时从 6.5 s 到 13 倍差距显出原形
python
深圳市益普科技有限公司2 小时前
半导体良率管理YMS:良率与设备参数的相关性,先拉哪几组数据
人工智能·python·算法
“AI国潮设计-小江”2 小时前
【AIGC实战】Python+SDXL打造“潮汕英歌舞IP”万能立牌插件,批量生成“发财元宝蛋糕”视觉营销方案(附源码)
开发语言·人工智能·python·prompt·aigc
砚底藏山河3 小时前
python量化实操:冷热分层存储
java·开发语言·python·金融
十五年专注C++开发3 小时前
pybind11:一个跨C++和Python平台的编程库
开发语言·c++·python·pybind11