# -*- coding: UTF-8 -*-
#Author:tangshoupu
#这是一个用于IP和域名碰撞匹配访问的小工具(多线程)升级版
import itertools
import signal
import threading
from multiprocessing.dummy import Pool
from time import sleep
from requests.packages import chardet
import requests
import re
from lib.processbar import ProcessBar
def host_check(host_ip):
host,ip = host_ip
schemes = ["http://","https://"]
for scheme in schemes:
url = scheme+ip
headers = {'Host':host.strip(),'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'}
headers2 = {'Host': ip.strip(),
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'}
try:
r = requests.session()
requests.packages.urllib3.disable_warnings()
res = r.get(url,verify=False,headers=headers,timeout=30)
res2 = r.get(url, verify=False, headers=headers2, timeout=30)
charset = chardet.detect(res.content)["encoding"]
res.encoding = charset
title = ""
title2 = ""
try:
title = re.search('
(.*)', res.text).group(1) #获取标题
title2 = re.search('(.*)', res2.text).group(1) # 获取标题
except Exception as ex:
title = u"获取标题失败"
info = u'%s\t%s -- %s 数据包大小:%d 标题:%s' % (ip,host,scheme+host,len(res.text),title)
#print(len(res.text),len(res2.text),title2,title)
if len(res.text) != len(res2.text) and title!=title2:
if lock.acquire():
try:
success_list.append(info)
pbar.echo(info)
pbar.update_suc()
open('ok-ism.txt','a', encoding='utf-8').write(str(info)+'\n')
finally:
lock.release()
else:
print('存在假碰撞,忽略,保存在ignored-req.txt中',info)
open('ignored-req.txt','a',encoding='utf-8').write(str(info)+'\n')
except Exception as ex:
if lock.acquire():
try:
# print ex.message
# logging.exception(ex)
error = u"%s\t%s -- %s 访问失败!~" % (ip,host, scheme+host)
pbar.echo(error)
finally:
lock.release()
finally:
pbar.update()
if __name__ == '__main__':
lock = threading.Lock()
success_list = []
ip_list = open("ip.txt").read().splitlines()
host_list = open("host.txt").read().splitlines()
host_ip_list = list(itertools.product(host_list,ip_list))
print(u"====================================开 始 匹 配====================================")
pbar = ProcessBar(len(host_ip_list))
original_sigint_handler = signal.signal(signal.SIGINT, signal.SIG_IGN)
signal.signal(signal.SIGINT, original_sigint_handler)
pool = Pool(20)
try:
pool.map_async(host_check, host_ip_list)
while not pbar.cur_cnt==pbar.total:
sleep(10)
except KeyboardInterrupt:
pbar.echo(u"结束子线程中...")
pool.terminate()
pool.close()
else:
pool.close()
pool.join()
pbar.close()
print(u"====================================匹 配 成 功 的 列 表====================================")
for i in success_list:
print(i)