事情是这样的,最近打了很多攻防类的演练项目,基本都是各种比赛各种卷,而目标一般会给出大批企业名称、域名或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): 
    # 初始化
    # 定义初始页面url
    def get_url(self,word):
        url = 'https://www.icplist.com/icp/info/{}'
        
        name=quote(word, 'utf-8')
        #params = parse.urlencode(name)
        url = url.format(name)
        #print(url)
        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()
        #print(html)
        # 直接调用解析函数
        self.parse_html(name,html)
    
    # 解析函数
    def parse_html(self,name,html):
        # 正则表达式
        #re_bds_1 = '<div class="layui-table-cell"><a href="/icp/info/(.*?)"'
        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

    # 保存数据函数,使用python内置csv模块
    def save_html(self,r_list):
        #生成文件对象  
        with open('beian.csv','a',newline='',encoding="utf-8") as f:
            #生成csv操作对象
            writer = csv.writer(f)
            #整理数据
            lenth = len(r_list)
            #print(lenth)
            for i in range(lenth):
                #企业名
                name = r_list[i][0]
                #print(name)
                #备案号
                number = r_list[i][1]
                #域名
                domain = r_list[i][2]
                L = [name,number,domain]
                # 写入csv文件
                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):
                #print(data[i])
                url = self.get_url(data[i])
                self.get_html(data[/i][/i][/i][/i][/i][i][i][i][i][i][i],url)
                #生成1-3之间的浮点数
                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带队,咱还能扛!!!!

感谢有师傅反映说接口太老了,跟我之前测的估计差不多,因为有集成工具能关联资产进行之后步骤的信息收集,所以按需求当时只需要一个对应企业的域名就行,然后之后再继续进行反查,这一步骤对我来说是适用的,所以当时打的项目基本上没漏太多,师傅们请测试后根据需求再用哈,或者能提供其他较好的接口,也谢谢师傅们了!!