0x01 背景
需要一个域名监控工具,本着工具越简单越好的理念,写了一个只能满足我需要的插件,好吧,其实是组装轮子的时候需要这个功能,然后有这功能的工具又都太乱了,我觉得有点冗余 -.-!
0x02 代码
- OneForAll(精灵师傅的子域名工具): https://github.com/shmilylty/OneForAll
- One_Monitor(新增域名监控插件): https://github.com/sv3nbeast/One_Monitor
# -*- coding:utf-8 -*-
import re
import sys
import os
import time
import datetime
path="C:/Users/Administrator/Desktop/tools/OneForAll/oneforall" #OneForAll绝对路径,需手动配置
old=path+"/域名监控/old_domain/" #存放上次扫描结果的文件夹,需手动创建并填写此配置
new=path+"/域名监控/new_domain/" #存放最新扫描结果的文件夹,需手动创建并填写此配置
update=path+"/域名监控/update/" #存放新增域名结果的文件夹,需手动创建并填写此配置
old_import=path+"/域名监控/old_import/" #存放目标域名数据库导出的上次结果,需手动创建并填写此配置
result_name=path+"/results/" #存放oneforall结果的文件夹路径,默认配置即可
# print f_list
def result_txt(result_name): #生成监控域名扫描结果的txt文件名字
f_list = os.listdir(result_name)
with open("result_name.txt","w") as r:
for i in f_list:
# os.path.splitext():分离文件名与扩展名
if os.path.splitext(i)[1] == '.txt':
r.write(i+"\n")
return True
def update_domain(): #简化新旧扫描结果并进行对比,发现新增域名
f=open('result_name.txt','r')
lines=f.readlines()
f.close()
for line in lines:
line1=line.strip('\n')
target=line1[0:(line1.rfind('_', 1))] #获得本次扫描目标域名
table_name=target.replace('.',"_")+"_now" #获得目标域名数据库存储表名
print("[+] 开始导出<"+target+">数据库记录,用做后面的对比")
print(os.system("python dbexport.py --table %s --format txt --dpath %s" %(table_name,old_import)))
old_path=old+line1 #存放上次域名结果文件
new_path=new+line1 #存放本次域名结果文件
old_result_subdomain=old_import+table_name+"_subdomain.txt" #存放域名扫描结果文件
new_result_subdomain=result_name+line1
now_time = datetime.datetime.now().strftime('%Y-%m-%d') #获得当前日期,为新增域名做准备
update_subdomain=update+"update_"+now_time+"_"+line1 #为新增域名文件起个名字,防止重复
f=open(old_result_subdomain, encoding="utf-8")
f.close
lines=f.read()
pattern = re.compile(r'\|(http.*?://.*?)[ |]')
result = pattern.findall(lines)
print("[+] 获得<"+target+">上次扫描子域名结果中 ")
with open(old_path,'w') as fopen:
for subdomain_old in result:
fopen.write(subdomain_old+"\n")
print("[+] 开始扫描子域名,时间较长,请耐心等待...")
os.system("python oneforall.py --target %s --format txt run" %target)
#print("[+]当前监控域名:"+target+"[+]"+os.system("python oneforall.py --target %s --format txt run" %target))
f=open(new_result_subdomain, encoding="utf-8")
f.close
lines=f.read()
pattern = re.compile(r'\|(http.*?://.*?)[ |]')
result = pattern.findall(lines)
print("[+] 扫描完成,获得<"+target+">最新扫描子域名结果中 ")
with open(new_path,'w') as fopen:
for subdomain_new in result:
fopen.write(subdomain_new+"\n")
print("[*] 开始检测<"+target+">域名是否新增...")
str1 = []
file_1 = open(old_path,"r",encoding="utf-8")
print("[+] 已打开old_domain存储的上次扫描结果:"+line1+"文件,开始获取域名并存入数组old")
for line in file_1.readlines():
str1.append(line.replace("\n",""))
str2 = []
file_2 = open(new_path, "r", encoding="utf-8")
print("[+] 已打开new_domain存储的本次扫描结果:"+line1+"文件,开始获取域名并存入数组new")
for line in file_2.readlines():
str2.append(line.replace("\n", ""))
str_dump = []
print("[+] 正在对比数组获得新增域名中")
for line in str2:
if line not in str1:
str_dump.append(line) #将两个文件重复的内容取出来
if len(str_dump) < 1:
print("[+] 检测完成,不存在新增域名,请等待下一周期检测!")
else:
print("[+] 检测完成,存在新增域名:"+"\n")
for str in str_dump: #去重后的结果写入文件
print(" "+str)
with open(update_subdomain,"a+",encoding="utf-8") as f:
f.write(str + "\n")
num=len(str_dump)
number=num*900
min=num*30
print("\n"+"[+] "+"本次新增%s"%num +"个域名,将等待%s"%min+"分钟后执行下次任务")
if __name__ == '__main__':
result_txt(result_name)
update_domain()
0x03 运行前提
- 1.配置好代码里的绝对路径,创建好文件夹,保证名称无误,One_Monitor.py放在和onforall.py同一路径下运行
- 2.首先对想监控的域名用oneforall扫一遍,结果为txt格式
- 3.我设置了一个域名30分钟的延迟,因为是实时漏扫,给留的时间,不需要可以删掉
- 4.应该没啥了,代码灰常简单,有问题一看就知道的,有问题可以交流。还希望有人也能分享我一个代码简单但实用的脚本(附一个测试图,是计划任务启动的,所以是白板)