漏洞挖掘-子域名

前言

在挖掘SRC漏洞以及HW收集资产的时候,子域名作为必备的一项信息收集工作。同时也是寻找到敏感资产、脆弱资产、获取突破口的一种方式。

子域名收集

目前市面上的关于收集子域名的文章、工具非常多。比如安恒的这篇,收集子域名就有20种方法。这里从收集子域名的不同原理上推荐几款常用的工具,本着安装方便、使用简单、受众多的原则。

DNS 域传送

在主备服务器之间同步数据库时,需要使用"DNS域传送"。
若DNS服务器配置不当,可能导致匿名用户获取某个域的所有记录。
测试是否存在域传送漏洞,大概nslookup、dig、nmap 三种方法。
详情参考 dns 域传送漏洞利用总结

暴力破解

基于字典,暴力枚举子域名。
推荐 subDomainsBrutewydomainESD

证书透明度

因为SSL证书支持证书透明度,而SSL里包含子域名。
推荐在线网站https://crt.sh/ 从SSL证书收集子域名。
这里改写了大佬的代码,直接提取相关的子域名。

# !/usr/bin/env python3
# -*- coding: utf-8 -*-
# code by CSeroad

import sys
import urllib.request
import urllib.parse
import re
import ssl
ssl._create_default_https_context = ssl._create_unverified_context

def crt_domain(domains):
    with urllib.request.urlopen('https://crt.sh/?q=' + domains) as f:
        code = f.read().decode('utf-8')
        for cert, domain in re.findall('<tr>(?:\s|\S)*?href="\?id=([0-9]+?)"(?:\s|\S)*?<td>([*_a-zA-Z0-9.-]+?\.' + re.escape(domains) + ')</td>(?:\s|\S)*?</tr>', code, re.IGNORECASE):
            domain = domain.split('@')[-1]
            print(domain)
            with open('crt_result.txt','a+') as f:
                f.write(str(domain)+'\n')

if __name__ == '__main__':
    if len(sys.argv) == 2:
        domains=sys.argv[1]
        crt_domain(domains)
    else:
        print('User: python3 crt_domain.py domain')

DNS数据聚合

virustotal 执行DNS解析来构建数据库,来检索子域名。
这里也有写好的从virustotal直接提取子域名的 脚本

js文件提取

JSFinder 从网站的js中提取url地址,发现子域名。
JSINFO-SCAN 一款递归爬取域名,以及递归从JS中获取信息的工具。

综合

还有一些综合性比较强的工具
Sublist3r 整合了subbrute,还使用了一些搜索引擎枚举子域名。
teemo 有众多模块,包括从各个接口、解析记录、crossdomain.xml、枚举等等收集子域名。
OneForAll 也是有多个模块,爆破模块、DNS解析模块等等。

子域名去重

然后将收集的子域名进行去重。

#!/usr/bin/env python3 
#-*- coding:utf-8 -*-

import sys

# 去除文本中的重复行
def filedelrepeat(filename):
    try:
        file=open(filename,'r')
        links=file.readlines()
        file.close()
        lines=set()
        for link in links:
            lines.add(link)
        print('文件名: ' + filename)
        print('原有行:' + str(len(links)))
        file=open(filename,'w')
        for line in lines:
            file.write(line)
        file.close()
        print('去重后: ' + str(len(lines)))
    except Exception as e:
        print(e)


if __name__ == '__main__':
    if len(sys.argv) == 2:
        filename=sys.argv[1]
        filedelrepeat(filename)
    else:
        print('User: python3 repeat.py repeat.txt')

子域名利用

当获取子域名后,怎么进一步漏洞挖掘呢?

  1. 访问域名直接获取title;
  2. 在域名后面添加端口访问获取title;
  3. 访问域名为nginx、apache、IIS、weblogic默认页面,或403、404等页面,尝试利用google、必应、github、fofa、shodan等获取资产;
  4. 某些资产必须更换浏览器才可以正常访问,如IE、微信内置浏览器等;
  5. 直接对域名进行暴力递归扫描目录,如dirsearch、dirmap等工具;
  6. 对目录进行fuzz扫描,或者利用burp的intruder 模块来爆破目录,该目录通过组合字母进行爆破,扫描域名的子目录;

扫描title

修改原来写的扫描C段获取title信息的代码。
注:只使用http或https进行访问

# !/usr/bin/env python3
# -*- coding: utf-8 -*-
# code by CSeroad

from optparse import OptionParser
import requests
import time
from bs4 import BeautifulSoup
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def scan(host):
    try:
        for url in host:
            url = url.strip('\n')
            print(url)
            https_url = "https://"+url
            get_title(https_url)
            http_url = "http://"+url
            get_title(http_url)
    except Exception as e:
        print(e)

def save_result(filename,url_title):
    with open(filename,'a+') as f:
        f.write(str(url_title)+'\n')

def get_title(url):
    try:
        headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"}
        r = requests.get(url,headers=headers,timeout=3,verify=False)
        if r.status_code == 500:
            pass
        else:
            response = r.text
            soup = BeautifulSoup(response,'lxml')
            span = soup.title.string
            print("\033[1;37;40m"+url+"\ttitle:"+span+"\033[0m")
            url_title = "%-27s %-30s\n" % (url,span)
            save_result(result,url_title)
    except Exception as e:
        pass


if __name__ == '__main__':
    parser = OptionParser("get_domain_title.py -d domain.txt  -o result.txt")
    parser.add_option("-d", "--domain",action="store",type="string",dest="domain",help="domain.txt")
    parser.add_option("-o","--result",action="store",type="string",dest="result",default="result.txt",help="result")
    (options, args) = parser.parse_args()
    if options.domain:
        t1 = time.time()
        domain = options.domain
        result = options.result
        with open("domain.txt","r") as f:
            domain_url = f.readlines()
            scan(domain_url)
        print('end time:',time.time()-t1)
    else:
        parser.error('incorrect number of arguments')

也可以添加端口列表获取title,使用多线程方式,再次修改该脚本。
注:增加了端口列表

# !/usr/bin/env python3
# -*- coding: utf-8 -*-
# code by CSeroad

from optparse import OptionParser
import requests
import time
import threading
from bs4 import BeautifulSoup
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)


def scan(host,port):
    try:    
        for url in host:
            url = url.strip('\n')
            if int(port) == 443:
                https_url = "https://"+url
                get_title(https_url)
            elif int(port) == 4433:
                https_url = "https://"+url+":"+str(port)
                get_title(https_url)
            elif int(port) == 8443:
                https_url = "https://"+url+":"+str(port)
                get_title(https_url)
            else:
                http_url = "http://"+url+":"+str(port)
                get_title(http_url)
    except Exception as e:
        print(e)

def save_result(filename,url_title):
    with open(filename,'a+') as f:
        f.write(str(url_title)+'\n')

def get_title(url):
    try:
        headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"}
        r = requests.get(url,headers=headers,timeout=3,verify=False)
        if r.status_code == 500:
            pass
        else:
            response = r.text
            soup = BeautifulSoup(response,'lxml')
            span = soup.title.string
            print("\033[1;37;40m"+url+"\ttitle:"+span+"\033[0m")
            url_title = "%-27s %-30s\n" % (url,span)
            save_result(result,url_title)
    except Exception as e:
        pass


def thread(host):
    thread_list = []
    port_list = [80,81,82,443,4433,7001,8000,8001,8008,8009,8080,8081,8088,8089,8443,8800,8888,8889,9090,9999]
    for port in port_list:
        t = threading.Thread(target = scan,args = (host,port))
        thread_list.append(t)
    for t in thread_list:
        t.start()
    for t in thread_list:
        t.join()


if __name__ == '__main__':
    parser = OptionParser("get_domain_title.py -d domain.txt  -o result.txt")
    parser.add_option("-d", "--domain",action="store",type="string",dest="domain",help="domain.txt")
    parser.add_option("-o","--result",action="store",type="string",dest="result",default="result.txt",help="result")
    (options, args) = parser.parse_args()
    if options.domain:
        t1 = time.time()
        domain = options.domain
        result = options.result
        with open("domain.txt","r") as f:
            domain_url = f.readlines()
            thread(domain_url)
        print('end time:',time.time()-t1)
    else:
        parser.error('incorrect number of arguments')

效果图如下

效果图

搜索引擎

google
biying

扫描目录

通过目录扫描工具,获取敏感资产。
一般看谁家的字典比较强了。大多数使用dirsearchdirmapwebdirscan 自己构造字典 等扫描工具。

还可以对目录进行fuzz,推荐wfuzz这款神器。

image.png

也可以使用26个英文字母随机组合,形成字典,来爆破子目录。

image.png
image.png

这里选择的是1到4位的英文字母。

image.png

可以爆破到很多子目录。

总结

1.收集到几款工具大都是python编写的,安装运行都比较方便;
2.不同的姿势多收集子域名,多寻找隐藏的资产,有些接口fuzz甚至废弃的资产存在漏洞;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268