• 【Python脚本进阶】2.2、构建一个SSH僵尸网络(上):SSH交互脚本


    目录

    一、简介

    概述:

    漏洞利用方式

    二、用Pexpect与SSH交互

    简介:

    环境:

    函数:

    三、实现

    第一步:

    第二步:

    整合:


    一、简介

    概述:

    第一步:创建一个用来搜寻目标的端口扫描程序

    现在来到第二步了

    第二步:开始利用这些服务中的漏洞

    漏洞利用方式

    Morris蠕虫有三种攻击方式, 其中之一就是用常见的用户名和密码尝试登录RSH服务(remote shell)。RSH是1988年问世, 它为系统管理员提供远程连接一台机器, 并能在主机上运行一系列终端命令对它进行管理的方法


    后来在RSH中增加一个公钥加密算法, 以保护其经过网络传递的数据, 这就是SSHC Secure Shell) 协议, 最终SSH 取代了RSH。不过, 对千防范用常见用户名和密码尝试暴力登录的攻击方法, 这并不能起到多大的作用。SSH 蠕虫已经被证明是非常成功的和常见的攻击方式


    远程IP 地址正试图暴力生成可能的密码后, IDS 阻断该IP 继续尝试登录SSH 的企图



    二、用Pexpect与SSH交互

    简介:

    实现我们自己的能暴力破解特定目标用户名/密码的SSH 蠕虫。因为SSH客户端需要用户与之进行交互, 我们的脚本必须在发送进一步的输入命令之前等待并“ 理解" 屏幕输出的意义


    考虑以下情形:连接架在IP 地址127.0.0.1上SSH 的机器,应用程序首先会要求我们确认RSA 密钥指纹。必须回答“ 是" , 然后才能继续。在给我们一个命令提示符之前, 应用程序要求我们输入密码。最后,还要执行uname-v 命令来确定目标机器上系统内核的版本


     如果是拒绝连接的话,可能是ssh没启动

    输入

    sudo /etc/init.d/ssh start

    环境:

    为了能自动完成上述控制台交互过程, 需要使用一个第三方Python 模块一PexpectPexpect version 4.8 — Pexpect 4.8 documentationicon-default.png?t=M666https://pexpect.readthedocs.io/en/latest/Pexpect 能够实现与程序交互、等待预期的屏幕输出, 并据此做出不同的响应。这使得它成为自动暴力破解SSH 用户口令程序的首选工具。

    函数:

    prompt 是提示的意思. 在 Python 语言中,是一个用户自定义的字符串变量名,目的和作用就是把变量 prompt 的内容作为提示信息

    pexpect. spawn收集交互期间生成的返回值



    三、实现

    第一步:

    检测connect()函数。该函数接收的参数包括一个用户名、主机名和密码, 返回的是以此进行的SSH 连接的结果。


    利用pexpect 库, 程序等待一个“可以预计到的“ 输出。可能会出现三种可能的输出: 超时、表示主机已使用一个新的公钥的消息和要求输入密码的提示。如果出现超时, 那么session.expect()返回0。用if 语句会识别出这一情况,打印一个错误消息后返回。如果child.expect()方法捕获了ssh_newkey 消息, 它会返回一个1, 这会使函数发送一个“ yes" 消息, 以接收新的密钥。之后, 函数等待密码提示,然后发送SSH 密码

    1. import pexpect
    2. PROMPT = ['#', '>>>', '>', '\$']
    3. def send_command(child, cmd):
    4. child.sendline(cmd)
    5. child.expect(PROMPT)
    6. print(child.before)
    7. def connect(user, host, password):
    8. ssh_newkey = 'Are you sure you want to continue connecting'
    9. connStr = 'ssh ' + user + '@' + host
    10. child = pexpect.spawn(connStr)
    11. ret = child.expect([pexpect.TIMEOUT, ssh_newkey,'[P|p]assword:'])
    12. if ret == 0:
    13. print('[-] Error Connecting')
    14. return
    15. if ret == 1:
    16. child.sendline('yes')
    17. ret = child.expect([pexpect.TIMEOUT, '[P|p] assword:'])
    18. if ret == 0:
    19. print('[-] Error Connecting')
    20. return
    21. child.sendline( password )
    22. child.expect( PROMPT )
    23. return child

    第二步:

    通过验证,就可以使用一个单独的command()函数在SSH 会话中发送命令。command()函数需要接收的参数是一个SSH 会话和命令字符串。然后,它向会话发送命令字符串, 并等待命令提示符再次出现。在获得命令提示符后,该函数把从SSH 会话那里得到的结果打印出来

    1. import pexpect
    2. PROMPT = ['#', '>>>', '>', '\$']
    3. def send_command(child, cmd):
    4. child.sendline(cmd)
    5. child.expect(PROMPT)
    6. print(child.before)

    整合:

    完整的模拟人交互行为的连接和控制SSH 会话的脚本

    1. import pexpect
    2. PROMPT = ['#', '>>>', '>', '\$']
    3. def send_command(child, cmd):
    4. child.sendline(cmd)
    5. child.expect(PROMPT)
    6. print(child.before)
    7. def connect(user, host, password):
    8. ssh_newkey = 'Are you sure you want to continue connecting'
    9. connStr = 'ssh ' + user + '@' + host
    10. child = pexpect.spawn(connStr)
    11. ret = child.expect([pexpect.TIMEOUT, ssh_newkey,'[P|p]assword:'])
    12. if ret == 0:
    13. print('[-] Error Connecting')
    14. return
    15. if ret == 1:
    16. child.sendline('yes')
    17. ret = child.expect([pexpect.TIMEOUT, '[P|p] assword:'])
    18. if ret == 0:
    19. print('[-] Error Connecting')
    20. return
    21. child.sendline( password )
    22. child.expect( PROMPT )
    23. return child
    24. def main():
    25. host ='localhost'
    26. user ='root'
    27. password ='toor'
    28. child = connect(user, host, password)
    29. send_command(child, 'cat /etc/shadow | grep root')
    30. if __name__ == '__main__':
    31. main()

  • 相关阅读:
    一文说清如何使用keepalive实现页面缓存-(已上线)
    Python——运算符与流程控制
    阿里强推:Java程序设计基于JDK11零基础学Java笔记
    Spring Security(5)
    鸿蒙HarmonyOS实战-Stage模型(进程模型)
    Python-3.12.0文档解读-内置函数sum()详细说明+记忆策略+常用场景+巧妙用法+综合技巧
    每日面试题- 前言+java基础篇(1)面向对象
    C# 随机给一个全部信息都未知的类类型,如何获取该类的类名、属性个数、属性名、属性的数据类型、属性值?
    【PAT甲级】1099 Build A Binary Search Tree
    操作系统的概念、四个特征以及os的发展和分类
  • 原文地址:https://blog.csdn.net/qq_53079406/article/details/126033234