通过域名和备案号,查询备案信息中的所有域名——ICPscan

作者:Sec-Labs | 发布时间:

项目介绍

基于Python编写的域名查询备案信息,同时查询所有备案子域名信息的小工具

项目地址

https://github.com/914525753/ICPscan

使用方法

安装依赖

pip install -r requirements.txt

用例

可以支持扫描域名/ICP备案编号

python ICPscan.py www.example.com

核心代码

ICPscan.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#author:Sh4d0w_小白

from requests import get,Session
from sys import argv
from queue import Queue
from threading import Thread
from time import sleep
from re import *
from bs4 import BeautifulSoup
from lxml import etree
import os
# from fake_useragent import UserAgent
# from requests.adapters import HTTPAdapter
import platform
from tqdm import tqdm
import urllib3

q = Queue()
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
icp = "https://icplishi.com/"
flag = 0
# ua = UserAgent()
result = []
number = ""
tasknumber = 0

header = {
	"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4621.0 Safari/537.36"
}

# session = Session()
# session.mount('http://', HTTPAdapter(max_retries=2))
# session.mount('https://', HTTPAdapter(max_retries=2))

def Usage():
	print("[Usage]python ICPscan.py (domian/ICP)")

def Output():
	global result,pbar
	while(q.empty() == False):
		url = "http://" + q.get()
		try:
			r = get(url = url, headers = header, allow_redirects = True, timeout = 1, verify = False)
			r.raise_for_status()
			# print(url)
			result.append(url.strip())
		except:
			pass
		finally:
			q.task_done()
			pbar.update(1)
		


def GetDomain(html):
	global tasknumber
	soup = BeautifulSoup(html,'lxml')
	text = str(soup.find_all("td"))
	text = etree.HTML(text = text)
	text = text.xpath('string(.)')
	text = compile(r'.*\w+\.\w+').findall(text)
	for i in text:
		q.put(i)
		tasknumber += 1

def Check(url):
	global flag,number
	if(search(r"(http|https)\:\/\/", url)):
		url = (sub(r"(http|https)\:\/\/", "", url)) #去除协议头
		flag = 1 #域名
		return(url)
	elif(search(r".ICP.\d{6}.-\d{1,}",url)):
		url = sub("-\d{1,}", "", url) #提取主备案号
		number = url
		flag = 2 #备案号
		return(url)
	elif(search(r".*\w+\.\w+",url)):
		flag = 1 #域名
		return(url)
	elif(search(r".ICP.\d{6}.",url)):
		number = url
		flag = 2 #备案号
		return(url)
	else:
		print("请检查输入是否正确")
		os._exit(0)


def GetICP(html):
	global number
	soup = BeautifulSoup(html,'lxml')
	text = str(soup.select("body > div > div.container > div > div.module.mod-panel > div.bd > div:nth-child(2) > div.c-bd"))
	text = etree.HTML(text = text)
	text = text.xpath('string(.)')
	text = search(r".ICP.\d{6}.", text) #获取备案号
	if (text != None):
		number = text.group()
		return text.group()
	else:
		print("请检查输入是否正确")
		os._exit(0)

def Scan(url):
	global icp
	url = Check(url)
	url = icp + url
	try:
		r = get(url = url,headers = header, allow_redirects = True, timeout = 2, verify = False)
		r.raise_for_status()
	except:
		print("连接超时,请稍后重试")
		os._exit(0)
	finally:
		if(flag == 1):
			icp2 = GetICP(r.text)
			url = icp + icp2
			try:
				r = get(url = url,headers = header, allow_redirects = True, timeout = 2, verify = False)
				r.raise_for_status()
			except:
				print("连接超时,请稍后重试")
				os._exit(0)
			sleep(0.1)
			GetDomain(r.text)
		elif(flag == 2):
			GetDomain(r.text)


if __name__=="__main__":
	global pbar
	try:
		scan = argv[1]
		print("开始进行扫描:")
		Scan(scan)
		pbar = tqdm(total = tasknumber)
		for i in range(20):
			t = Thread(target = Output)
			sleep(0.1)
			t.start()
			t.join(1)
		pbar.close()
		cmd = "cls" if platform.system() == "Windows" else "clear"
		os.system(cmd)
		print("扫描结束!输出结果")
		with open("result.txt","w+",encoding='utf8') as f:
			f.write(number + "\n")
			for i in result:
				print(i)
				f.write(i + "\n")
		print("已保存到result.txt文件中,按回车键退出程序!")
		input()
		os._exit(0)
	except:
		Usage()

 

标签:工具分享, 资产测绘