事情是这样的,最近打了很多攻防类的演练项目,基本都是各种比赛各种卷,而目标一般会给出大批企业名称、域名或 ip
域名跟 ip 倒好说,现有的工具能支撑我从找子域到扫端口再到漏扫一条龙服务
但之前好几次都在开头收集企业域名给卡住了,然后比别家慢一拍,很多报告交上去都是无效,在别人后面吃灰
目前参加的比赛开始或中后期都会给出一大批只有企业名称的公共目标,数量几百或几千,而且有部分比赛的规则里目标是不包括子公司的
其实 github 和吐司上都有几个师傅的项目能满足需求,而且写的非常全
但我不知道为啥就是跟爱企查过不去了,用工具那 cookie 配置就没成功过,不知道是不是跟网络环境有关
而且直接爱企查批量表示一千个企业里面只有 16 个企业有网站 .......
然后在某个夜晚找了个还算查的全的站,花了点时间撸了个脚本,基本能满足只查个备案的需求吧
这里就直接上源码了
from urllib import request
import re
import time
import random
import csv
from urllib.parse import quote
ua_list = [
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
'User-Agent:Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11',
'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)',
'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
]
class BeianSpider(object):
def get_url(self,word):
url = 'https://www.icplist.com/icp/info/{}'
name=quote(word, 'utf-8')
url = url.format(name)
return url
def get_html(self,name,url):
headers = {'User-Agent':random.choice(ua_list)}
req = request.Request(url=url,headers=headers)
res = request.urlopen(req)
html = res.read().decode()
self.parse_html(name,html)
def parse_html(self,name,html):
re_bds = '<div class="layui-table-cell"><a href="/icp/info/(.*?)".*?<div class="layui-table-cell"><a href="/icp/info/(.*?)".*?<div class="layui-table-cell"> <a href="/icp/info/(.*?)"'
pattern = re.compile(re_bds,re.S)
r_list = pattern.findall(html)
if(r_list):
print(r_list)
self.save_html(r_list)
with open('success.txt','a+',newline='',encoding="utf-8") as f:
f.write(name)
f.write('\n')
else:
with open('faild.txt','a+',newline='',encoding="utf-8") as f:
f.write(name)
f.write('\n')
print("[-]",name," 无备案信息 ")
return
def save_html(self,r_list):
with open('beian.csv','a',newline='',encoding="utf-8") as f:
writer = csv.writer(f)
lenth = len(r_list)
for i in range(lenth):
name = r_list[i][0]
number = r_list[i][1]
domain = r_list[i][2]
L = [name,number,domain]
writer.writerow(L)
print("[+]",r_list[0][0]," 查询写入完成 ")
def run(self):
with open('qiye.txt','r',newline='',encoding="utf-8") as f:
data = f.read().splitlines()
lenth = len(data)
for i in range(lenth):
url = self.get_url(data[i])
self.get_html(data[/i][/i][/i][/i][/i][i][i][i][i][i][i],url)
time.sleep(random.uniform(1,2))
print("[+]","All Finished")
if __name__ == '__main__':
try:
spider = BeianSpider()
spider.run()
except Exception as e:
print(" 错误 :",e)
在 qiye.txt 里写上所有企业名称,一行一个,直接 python3 运行 beian.py 就好,然后脚本跑起来会输出到 beian.csv 里,同时输出 success 和 faild 的企业名,这样没找到备案的企业还能找其他站捞一波,以网上随便找的全省医院为例,结果见下图


可能代码有点垃圾,但它确实能跑,而且自用完全能满足所需了,师傅们轻喷
另外,是真的卷啊,已经加班打了一个多月,到 hvv 又加班
不过有一说一,攻防还是比普通项目要成长的快很多,只要有 c 带队,咱还能扛!!!!
感谢有师傅反映说接口太老了,跟我之前测的估计差不多,因为有集成工具能关联资产进行之后步骤的信息收集,所以按需求当时只需要一个对应企业的域名就行,然后之后再继续进行反查,这一步骤对我来说是适用的,所以当时打的项目基本上没漏太多,师傅们请测试后根据需求再用哈,或者能提供其他较好的接口,也谢谢师傅们了!!