减少在处理爆破结果过程中内存的使用

This commit is contained in:
Jing Ling
2020-04-23 17:54:05 +08:00
parent 84a7530268
commit e4a23fc28c
+51 -52
View File
@@ -232,8 +232,8 @@ def collect_wildcard_record(domain, authoritative_ns):
ips = ips.union(ip) ips = ips.union(ip)
# 统计每个泛解析IP出现次数 # 统计每个泛解析IP出现次数
for addr in ip: for addr in ip:
ips_stat.setdefault(addr, 0) count = ips_stat.setdefault(addr, 0)
ips_stat[addr] += 1 ips_stat[addr] = count + 1
# 筛选出出现次数2次以上的IP地址 # 筛选出出现次数2次以上的IP地址
addrs = list() addrs = list()
for addr, times in ips_stat.items(): for addr, times in ips_stat.items():
@@ -327,57 +327,57 @@ def read_result(result_path):
return result return result
def deal_result(result_list): def deal_result(result_path):
logger.log('INFOR', f'正在处理解析结果') logger.log('INFOR', f'正在处理解析结果')
records = dict() # 用来记录域名解析数据 records = dict() # 用来记录域名解析数据
times = dict() # 用来统计IP出现次数 times = dict() # 用来统计IP出现次数
for items in result_list: with open(result_path) as fd:
record = dict() for line in fd:
qname = items.get('name')[:-1] # 去出最右边的`.`点号 line = line.strip()
record['resolver'] = items.get('resolver') try:
status = items.get('status') items = json.loads(line)
record['reason'] = status except Exception as e:
records[qname] = record logger.log('ERROR', e.args)
if status != 'NOERROR': logger.log('ERROR', f'解析行{line}出错跳过解析该行')
record['reason'] = status continue
record['resolve'] = 0 qname = items.get('name')[:-1] # 去出最右边的`.`点号
record['alive'] = 0 status = items.get('status')
records[qname] = record if status != 'NOERROR':
continue logger.log('TRACE', f'处理{line}时发现{qname}查询结果状态{status}')
data = items.get('data') continue
if 'answers' not in data: data = items.get('data')
record['reason'] = 'NOANSWER' if 'answers' not in data:
record['resolve'] = 0 logger.log('TRACE', f'处理{line}时发现{qname}返回的结果无应答')
record['alive'] = 0 continue
records[qname] = record answers = data.get('answers')
continue flag = False
answers = data.get('answers') record = dict()
flag = False cname = list()
cname = list() ips = list()
ips = list() public = list()
public = list() ttl = list()
ttl = list() resolver = items.get('resolver')
for answer in answers: for answer in answers:
if answer.get('type') == 'A': logger.log('TRACE', f'处理{line}时发现{qname}返回的应答{answer}无问题')
flag = True if answer.get('type') == 'A':
ttl.append(answer.get('ttl')) flag = True
cname.append(answer.get('name')[:-1]) # 去出最右边的`.`点号 ttl.append(answer.get('ttl'))
ip = answer.get('data') cname.append(answer.get('name')[:-1]) # 去出最右边的`.`点号
ips.append(ip) ip = answer.get('data')
public.append(utils.ip_is_public(ip)) ips.append(ip)
record['ttl'] = ttl public.append(utils.ip_is_public(ip))
record['cname'] = cname record['reason'] = status
record['content'] = ips record['ttl'] = ttl
record['public'] = public record['cname'] = cname
records[qname] = record record['content'] = ips
# 取值 如果是首次出现的IP集合 出现次数先赋值0 record['public'] = public
value = times.setdefault(ip, 0) record['resolver'] = resolver
times[ip] = value + 1 records[qname] = record
if not flag: # 取值 如果是首次出现的IP集合 出现次数先赋值0
record['reason'] = 'NOA' value = times.setdefault(ip, 0)
record['resolve'] = 0 times[ip] = value + 1
record['alive'] = 0 if not flag:
records[qname] = record logger.log('TRACE', f'处理{line}时发现{qname}返回的应答中没有A记录')
return records, times return records, times
@@ -629,9 +629,8 @@ class Brute(Module):
concurrent_num=self.concurrent_num) concurrent_num=self.concurrent_num)
logger.log('INFOR', f'结束执行massdns') logger.log('INFOR', f'结束执行massdns')
result_data = read_result(output_path) resolved_records, ip_times = deal_result(output_path)
delete_file(dict_path, output_path) delete_file(dict_path, output_path)
resolved_records, ip_times = deal_result(result_data)
added_records = add_times(resolved_records, ip_times) added_records = add_times(resolved_records, ip_times)
checked_records, valid_subdomains = check_validity(added_records, checked_records, valid_subdomains = check_validity(added_records,
ip_times, ip_times,