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

This commit is contained in:
Jing Ling
2020-04-23 17:54:05 +08:00
parent 84a7530268
commit e4a23fc28c
+21 -22
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,37 +327,38 @@ 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:
line = line.strip()
try:
items = json.loads(line)
except Exception as e:
logger.log('ERROR', e.args)
logger.log('ERROR', f'解析行{line}出错跳过解析该行')
continue
qname = items.get('name')[:-1] # 去出最右边的`.`点号 qname = items.get('name')[:-1] # 去出最右边的`.`点号
record['resolver'] = items.get('resolver')
status = items.get('status') status = items.get('status')
record['reason'] = status
records[qname] = record
if status != 'NOERROR': if status != 'NOERROR':
record['reason'] = status logger.log('TRACE', f'处理{line}时发现{qname}查询结果状态{status}')
record['resolve'] = 0
record['alive'] = 0
records[qname] = record
continue continue
data = items.get('data') data = items.get('data')
if 'answers' not in data: if 'answers' not in data:
record['reason'] = 'NOANSWER' logger.log('TRACE', f'处理{line}时发现{qname}返回的结果无应答')
record['resolve'] = 0
record['alive'] = 0
records[qname] = record
continue continue
answers = data.get('answers') answers = data.get('answers')
flag = False flag = False
record = dict()
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:
logger.log('TRACE', f'处理{line}时发现{qname}返回的应答{answer}无问题')
if answer.get('type') == 'A': if answer.get('type') == 'A':
flag = True flag = True
ttl.append(answer.get('ttl')) ttl.append(answer.get('ttl'))
@@ -365,19 +366,18 @@ def deal_result(result_list):
ip = answer.get('data') ip = answer.get('data')
ips.append(ip) ips.append(ip)
public.append(utils.ip_is_public(ip)) public.append(utils.ip_is_public(ip))
record['reason'] = status
record['ttl'] = ttl record['ttl'] = ttl
record['cname'] = cname record['cname'] = cname
record['content'] = ips record['content'] = ips
record['public'] = public record['public'] = public
record['resolver'] = resolver
records[qname] = record records[qname] = record
# 取值 如果是首次出现的IP集合 出现次数先赋值0 # 取值 如果是首次出现的IP集合 出现次数先赋值0
value = times.setdefault(ip, 0) value = times.setdefault(ip, 0)
times[ip] = value + 1 times[ip] = value + 1
if not flag: if not flag:
record['reason'] = 'NOA' logger.log('TRACE', f'处理{line}时发现{qname}返回的应答中没有A记录')
record['resolve'] = 0
record['alive'] = 0
records[qname] = record
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,