排除CDN的小技巧 附实现代码
作者:Sec-Labs | 发布时间:
工具介绍
工具来源:ybdt师傅的分享
实现比较简单,附件是自动化工具的一部分,摘选出来,可能代码不是很完整,期待师傅们更好的思路~
基本思路
ping子域名,处理ping后返回的数据,返回的域名不变,则暂定为未使用CDN,返回的域名变了,则往往使用CDN或云WAF,由于每个ping比较慢,最慢也得1秒,所以需要采用队列+多线程
核心代码
cdn-exclude.py
# 基于ping判断是否为cdn节点或云waf节点
def work(q, cdn_list, non_cdn_list, non_parse_list, non_cdn_ip_list):
while True:
if q.empty():
return
else:
domain = q.get()
# print(domain)
p = subprocess.Popen(["ping.exe", "-n", "1", "-w", "1000", domain], shell=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
ping_str = p.stdout.read()
# print(ping_str)
ping_list = ping_str.decode("GBK").split("\r\n")
# print(ping_list)
# 奇怪的是,在pycharm下返回中文,在ConEmu下返回英文,故需要兼容
if ping_list[0].startswith("Ping request could not find host") or ping_list[0].startswith("Ping 请求找不到主机"):
# print("Ping 请求找不到主机 " + domain)
non_parse_list.append(domain + "__" + "Ping 请求找不到主机")
continue
else:
ping_return_domain = ping_list[1].split(" ")[1]
ping_return_ip = ping_list[1].split(" ")[2].strip("[").strip("]")
# print(ping_return_domain)
if ping_return_domain == domain:
non_cdn_list.append(domain + "__" + ping_return_ip)
non_cdn_ip_list.append(ping_return_ip)
else:
cdn_list.append(domain + "__" + ping_return_domain)
def main():
# 创建队列并填充消息
domain_list = []
with open("domain.txt", "r", encoding="UTF-8") as fr:
for line in fr.readlines():
domain_list.append(line.strip("\n"))
q = queue.Queue()
for domain in domain_list:
q.put(domain)
# 多线程执行队列中的消息
cdn_list = []
non_cdn_list = []
non_cdn_ip_list = []
non_parse_list = []
thread_num = 10
threads = []
for i in range(thread_num):
t = threading.Thread(target=work, args=(q, cdn_list, non_cdn_list, non_parse_list, non_cdn_ip_list))
threads.append(t)
t.start()
for t in threads:
t.join()
main()
标签:工具分享, 资产测绘