├── .gitignore ├── .idea ├── .gitignore ├── ChecksubDomains.iml ├── inspectionProfiles │ └── profiles_settings.xml ├── misc.xml ├── modules.xml └── vcs.xml ├── CheckSubDomains.py ├── README.md ├── Sublist3r ├── MANIFEST.in ├── example.md ├── output │ └── result.txt ├── setup.py ├── subbrute │ ├── __init__.py │ ├── names.txt │ ├── resolvers.txt │ └── subbrute.py └── sublist3r.py ├── images └── ChecksubDomains.png ├── input └── domains.txt ├── output └── result.txt ├── requirements.txt ├── subDomainsBrute ├── .gitignore ├── dict │ ├── dns_servers.txt │ ├── next_sub.txt │ ├── next_sub_full.txt │ ├── sample_qq.com.txt │ ├── subnames.txt │ ├── subnames_all_5_letters.txt │ └── subnames_full.txt ├── lib │ ├── __init__.py │ ├── cmdline.py │ ├── common.py │ └── consle_width.py └── subDomainsBrute.py └── tmp └── tmp.txt /.gitignore: -------------------------------------------------------------------------------- 1 | /input/ 2 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Default ignored files 3 | /workspace.xml -------------------------------------------------------------------------------- /.idea/ChecksubDomains.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 11 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /CheckSubDomains.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | import subprocess 3 | import os 4 | import sys 5 | import re 6 | import argparse 7 | from argparse import RawTextHelpFormatter 8 | import time 9 | 10 | parser = argparse.ArgumentParser(formatter_class=RawTextHelpFormatter) 11 | parser.description="CheckSubDomains 是一个整合了 subDomainsBrute 和 Sublist3r 两者结果的子域名收集工具,并添加了批量收集域名的功能" \ 12 | "\n\n使用说明:\n" \ 13 | "\n1. 将需要检测的域名写入./input/domains.txt" \ 14 | "\n2. 执行 python2.7 CheckSubDomains.py run 开始检测 (更多的爆破字典请执行 python2.7 CheckSubDomains.py --full run)" \ 15 | "\n3. 结果存放在./output/targetdomain.txt" 16 | parser.add_argument("run",help="start running CheckSubDomain.py") 17 | parser.add_argument("--full", action="store_true", dest="full", help="use full_dic to brute subdomains") 18 | # parser.description="sfsfsf" 19 | args = parser.parse_args() 20 | f_domains = open("./input/domains.txt",'r') 21 | countall=len(open("./input/domains.txt",'r').readlines()) 22 | countnow = 1 23 | print '\033[1;31;8m[+] 检测 Python 2.7 环境\033[0m' 24 | pwd = os.path.abspath(".") #获取当前路径 25 | try: 26 | os.chdir(pwd+"/subDomainsBrute") #切换到 subDomainsBrute 目录并调用执行 subDomainsBrute.py 27 | except: 28 | print '调用 subDomainsBrute.py 失败...' 29 | sys.exit(0) 30 | print '\033[1;31;8m[+] 调用 subDomainsBrute.py 检测...\033[0m' 31 | subprocess.call("pwd", shell=True) 32 | 33 | for domain in f_domains.readlines(): 34 | print "--full: ",args.full 35 | if args.full: 36 | mycommand = "python2.7 " + pwd + "/subDomainsBrute/subDomainsBrute.py -i -t 300 --full -o " + pwd + "/output/" + domain.replace( 37 | "\n", "") + ".txt" + " " + domain 38 | else: 39 | mycommand = "python2.7 "+pwd+"/subDomainsBrute/subDomainsBrute.py -i -t 300 -o "+pwd+"/output/"+domain.replace("\n","")+".txt"+" "+domain 40 | print '\033[1;31;8m[+] subDomainsBrute 正在检测域名:\033[0m',domain.replace("\n",""),'[',countnow,'/',countall,']' 41 | # print '[+] 执行命令: ', mycommand 42 | countnow+=1 43 | p=subprocess.Popen(mycommand, shell=True) 44 | p.wait() 45 | 46 | #### 下面开始调用 Sublist3r #### 47 | 48 | print '\033[1;31;8m[+] subDomainsBrute 检测完成,结果存放在./output/目录下\033[0m' 49 | 50 | countnow = 1 51 | try: 52 | os.chdir(pwd+"/Sublist3r") #切换到 subDomainsBrute 目录并调用执行 subDomainsBrute.py 53 | except: 54 | print '调用 Sublist3r.py 失败...' 55 | sys.exit(0) 56 | print '\033[1;31;8m[+] 调用 Sublist3r.py 检测...(Sublist3r 检测速度较慢请耐心等待,打开 VPN/SSR/V2RAY 全局代理可提高检测速度并使结果更全面)\033[0m' 57 | subprocess.call("pwd", shell=True) 58 | 59 | for domain in open("../input/domains.txt",'r').readlines(): 60 | mycommand = "python2.7 "+pwd+"/Sublist3r/sublist3r.py -v -e baidu,dnsdumpster,yahoo,bing,ask,netcraft,virustotal,passivedns,threatcrowd,ssl,google -t 100 -o "+pwd+"/Sublist3r/output/"+domain.replace("\n","")+".txt2"+" -d "+domain 61 | print '\033[1;31;8m[+] Sublist3r 正在检测域名:\033[0m',domain.replace("\n",""),'[',countnow,'/',countall,']' 62 | # print '[+] 执行命令: ', mycommand 63 | countnow+=1 64 | p=subprocess.Popen(mycommand, shell=True) 65 | p.wait() 66 | 67 | # 去重、整合、格式化 68 | print "Sublist3r 检测完成,正在合并结果..." 69 | print '\033[1;31;8m[+] Sublist3r 检测完成,正在合并结果...\033[0m' 70 | addnum = 0 71 | for domain in open("../input/domains.txt",'r').readlines(): 72 | ### 判断./output 中是否存在文件,不存在则新建 73 | if not os.path.exists("../output/" + domain.replace("\n","") + ".txt"): 74 | file = open("../output/" + domain.replace("\n","") + ".txt", 'wr') 75 | file.close() 76 | if not os.path.exists("./output/" + domain.replace("\n","") + ".txt2"): 77 | file = open("./output/" + domain.replace("\n","") + ".txt2", 'wr') 78 | file.close() 79 | 80 | f_Sublist3r_out = open("./output/" + domain.replace("\n","") + ".txt2", 'r') 81 | for s1sublist3r_out in f_Sublist3r_out.readlines(): 82 | signal = 1 83 | for s1out in open("../output/" + domain.replace("\n","") + ".txt", 'r').readlines(): # 84 | if s1sublist3r_out.replace("\n","") in s1out: 85 | signal = 0 86 | break 87 | 88 | if signal == 1: 89 | print "新增 ",s1sublist3r_out.replace("\n","") 90 | open("../output/" + domain.replace("\n","") + ".txt", 'a+').write(s1sublist3r_out) 91 | addnum +=1 92 | # if signal == 0: 93 | # print s1sublist3r_out.replace("\n", ""), "存在" 94 | 95 | ### 去除报告中的ip 和空格等 96 | f_report = open("../output/" + domain.replace("\n","") + ".txt", 'rw') 97 | open("../tmp/tmp1.txt", 'w').truncate() 98 | for line in f_report.readlines(): 99 | # print line 100 | newline = re.sub("((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}", "", 101 | line).replace(" ", "").replace(",", "") 102 | # f_domains.write(newline) 103 | 104 | open("../tmp/tmp1.txt", 'a+').write(newline) 105 | f_report.close() 106 | 107 | open("../output/" + domain.replace("\n","") + ".txt", 'w').truncate() 108 | for line2 in open("../tmp/tmp1.txt", 'r').readlines(): 109 | open("../output/" + domain.replace("\n","") + ".txt", 'a+').write(line2) 110 | 111 | print 'Sublist3r 新添加数量:',addnum 112 | f_domains.close() -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 相关项目 2 | 3 | CheckPorts:https://github.com/Jewel591/CheckPorts 4 | 5 | CheckServices:https://github.com/Jewel591/CheckServices 6 | 7 | # 介绍 8 | 在 subDomainsBrute 和 Sublist3r 上二次开发,添加了批量检测的功能,并整合 subDomainsBrute 和 Sublist3r 结果。 9 | 10 | **运行之前请打开 SSR/VPN/V2Ray 全局代理,可以显著提高检测速度和结果的准确性** 11 | 12 | **源项目:** 13 | - subDomainsBrute(https://github.com/lijiejie/subDomainsBrute) 14 | - Sublist3r(xxx) 15 | 16 | ![](images/ChecksubDomains.png) 17 | 18 | 19 | # 安装与环境 20 | - 安装 python 2.7 21 | 22 | - 安装 python 模块:`pip install -r requirements.txt` 23 | 24 | 25 | # 使用方法 26 | 1. 需要检测的域名写入到 ./input/domains.txt 27 | 2. 启动扫描:`python2.7 CheckSubDomains.py run` 28 | 3. 输出:检测结果存放在 ./output/文件夹中,结果按照 domainname.txt 存放 29 | 4. 调用 Sublist3r 时,Sublist3r 的扫描结果会暂时存放在 ./Sublist3r/output 目录,检测完成后会合并到 ./output 并去重 30 | 31 | 32 | # CheckTools 介绍(流程) 33 | 34 | ![checkSOP.png](https://i.loli.net/2019/10/14/RYdcAXeLZMaJrFu.png) 35 | -------------------------------------------------------------------------------- /Sublist3r/MANIFEST.in: -------------------------------------------------------------------------------- 1 | include LICENSE README.md 2 | include subbrute/*.txt 3 | -------------------------------------------------------------------------------- /Sublist3r/example.md: -------------------------------------------------------------------------------- 1 | 命令 0:# 2 | python sublist3r.py -d etcsd.com -p 80,443 -v -o output/etcsd.com.txt 3 | 4 | 命令 1: 5 | python sublist3r.py -d example.com -p 80,443 -v 6 | # -v 展示详情 7 | 8 | 命令 2: 9 | python sublist3r.py -e google,yahoo,virustotal -d example.com 10 | # -e 指定搜索引擎 11 | -------------------------------------------------------------------------------- /Sublist3r/output/result.txt: -------------------------------------------------------------------------------- 1 | temp output 2 | -------------------------------------------------------------------------------- /Sublist3r/setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | 3 | setup( 4 | name='Sublist3r', 5 | version='1.0', 6 | python_requires='>=2.7', 7 | install_requires=['dnspython', 'requests', 'argparse; python_version==\'2.7\''], 8 | packages=find_packages()+['.'], 9 | include_package_data=True, 10 | url='https://github.com/aboul3la/Sublist3r', 11 | license='GPL-2.0', 12 | description='Subdomains enumeration tool for penetration testers', 13 | classifiers=[ 14 | 'Development Status :: 5 - Production/Stable', 15 | 'Environment :: Console', 16 | 'Intended Audience :: Information Technology', 17 | 'Intended Audience :: System Administrators', 18 | 'Intended Audience :: Telecommunications Industry', 19 | 'License :: OSI Approved :: GNU General Public License v2', 20 | 'Operating System :: POSIX :: Linux', 21 | 'Programming Language :: Python', 22 | 'Programming Language :: Python :: 2', 23 | 'Programming Language :: Python :: 3', 24 | 'Programming Language :: Python :: 2.7', 25 | 'Programming Language :: Python :: 3.4', 26 | 'Programming Language :: Python :: 3.5', 27 | 'Programming Language :: Python :: 3.6', 28 | 'Topic :: Security', 29 | ], 30 | keywords='subdomain dns detection', 31 | entry_points={ 32 | 'console_scripts': [ 33 | 'sublist3r = sublist3r:interactive', 34 | ], 35 | }, 36 | ) 37 | -------------------------------------------------------------------------------- /Sublist3r/subbrute/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jewel591/SubDomainFinder/dfd0eee82d901896ecae95913f8d0cfe2dd48e1f/Sublist3r/subbrute/__init__.py -------------------------------------------------------------------------------- /Sublist3r/subbrute/resolvers.txt: -------------------------------------------------------------------------------- 1 | 141.1.27.249 2 | 194.190.225.2 3 | 194.225.16.5 4 | 91.185.6.10 5 | 194.2.0.50 6 | 66.187.16.5 7 | 83.222.161.130 8 | 69.60.160.196 9 | 194.150.118.3 10 | 84.8.2.11 11 | 195.175.39.40 12 | 193.239.159.37 13 | 205.152.6.20 14 | 82.151.90.1 15 | 144.76.202.253 16 | 103.3.46.254 17 | 5.144.17.119 18 | 195.129.12.122 19 | 211.35.96.6 20 | 202.138.120.4 21 | 209.130.139.2 22 | 64.81.127.2 23 | 202.199.160.206 24 | 195.66.68.2 25 | 103.3.76.7 26 | 202.219.177.121 27 | 216.143.135.12 28 | 141.211.144.17 29 | 101.203.168.123 30 | 217.73.17.110 31 | 205.242.187.234 32 | 62.192.160.39 33 | 187.115.52.101 34 | 122.155.167.38 35 | 203.229.169.69 36 | 69.25.1.1 37 | 121.52.87.38 38 | 209.51.161.58 39 | 80.72.146.2 40 | 195.245.76.6 41 | 149.156.64.210 42 | 195.74.128.6 43 | 81.15.197.10 44 | 213.0.77.5 45 | 212.89.130.180 46 | 91.194.112.10 47 | 203.146.237.222 48 | 1.2.4.8 49 | 200.118.2.88 50 | 213.131.178.10 51 | 203.63.8.27 52 | 62.168.59.67 53 | 200.175.3.232 54 | 205.151.222.250 55 | 213.115.244.69 56 | 81.200.80.11 57 | 195.206.7.98 58 | 213.201.230.20 59 | 63.146.122.11 60 | 188.94.19.10 61 | 114.114.114.119 62 | 203.189.89.29 63 | 190.9.57.2 64 | 193.52.218.19 65 | 62.183.50.230 66 | 129.7.1.6 67 | 202.248.37.74 68 | 141.211.125.15 69 | 91.195.202.131 70 | 146.94.1.3 71 | 35.8.2.41 72 | 206.13.29.12 73 | 63.218.44.186 74 | 83.242.139.11 75 | 217.117.111.1 76 | 66.250.7.154 77 | 213.157.176.3 78 | 38.98.10.132 79 | 84.21.31.230 80 | 213.144.3.210 81 | 89.140.140.8 82 | 195.67.27.18 83 | 200.62.64.1 84 | 212.57.190.166 85 | 82.115.163.2 86 | 207.91.130.4 87 | 213.235.248.245 88 | 67.90.152.122 89 | 79.140.66.38 90 | 208.67.220.220 91 | 195.189.131.1 92 | 212.30.96.211 93 | 202.14.67.4 94 | 205.134.162.209 95 | 213.169.55.10 96 | 217.169.242.2 97 | 212.24.98.97 98 | 209.55.0.110 99 | 15.227.128.50 100 | 159.90.200.8 101 | 216.244.192.3 102 | 212.16.72.254 103 | 195.54.152.2 104 | 147.29.10.6 105 | 69.67.254.2 106 | 110.170.117.15 107 | 217.76.240.2 108 | 202.43.178.244 109 | 101.255.64.74 110 | 85.185.6.35 111 | 72.37.141.91 112 | 129.219.13.81 113 | 204.95.160.2 114 | 103.9.124.89 115 | 210.248.255.82 116 | 205.151.222.251 117 | 212.214.82.198 118 | 82.212.67.100 119 | 108.61.213.134 120 | 213.55.96.166 121 | 121.194.2.2 122 | 93.188.152.3 123 | 198.6.1.3 124 | 64.215.98.148 125 | 193.252.247.52 126 | 164.124.101.82 127 | 82.182.37.49 128 | 212.37.208.3 129 | 213.184.242.6 130 | 212.236.250.4 131 | 193.89.221.2 132 | 194.39.185.10 133 | 70.36.0.5 134 | 91.189.0.5 135 | 217.71.105.254 136 | 203.238.227.100 137 | 203.109.129.68 138 | 115.68.45.3 139 | 193.109.4.5 140 | 134.60.1.111 141 | 78.143.192.10 142 | 212.97.32.2 143 | 212.57.190.166 144 | 200.175.3.30 145 | 193.27.80.34 146 | 165.194.1.1 147 | 194.25.0.60 148 | 203.189.89.36 149 | 216.66.22.2 150 | 213.143.96.1 151 | 213.184.0.42 152 | 62.24.228.202 153 | 91.214.72.34 154 | 194.169.244.33 155 | 192.116.16.26 156 | 95.85.9.86 157 | 91.188.0.5 158 | 211.60.155.5 159 | 209.145.176.20 160 | 210.131.113.123 161 | 217.113.48.1 162 | 131.191.7.12 163 | 64.105.163.106 164 | 203.189.89.82 165 | 69.7.192.2 166 | 110.76.151.254 167 | 212.9.160.1 168 | 216.184.96.5 169 | 61.63.0.66 170 | 103.20.188.35 171 | 195.234.101.234 172 | 62.231.76.49 173 | 208.72.120.204 174 | 209.213.64.2 175 | 213.211.50.2 176 | 83.137.41.9 177 | 195.113.144.194 178 | 66.163.0.173 179 | 109.69.8.34 180 | 202.180.160.1 181 | 216.81.128.132 182 | 103.9.124.145 183 | 92.43.224.1 184 | 63.105.204.164 185 | 212.96.1.70 186 | 213.157.196.130 187 | 81.173.113.30 188 | 216.185.64.6 189 | 212.26.6.11 190 | 64.79.224.3 191 | 62.243.190.9 192 | 194.1.154.37 193 | 193.186.162.3 194 | 212.66.0.1 195 | 195.175.39.39 196 | 198.6.1.5 197 | 62.77.85.100 198 | 178.212.102.76 199 | 217.151.0.50 200 | 212.53.35.20 201 | 101.255.64.62 202 | 203.189.88.148 203 | 213.157.0.193 204 | 217.30.50.100 205 | 178.151.86.169 206 | 193.33.114.2 207 | 193.228.86.5 208 | 195.170.55.1 209 | 148.160.20.195 210 | 194.132.119.151 211 | 64.181.43.34 212 | 203.133.1.8 213 | 83.233.78.163 214 | 62.76.76.62 215 | 64.105.202.138 216 | 217.197.84.69 217 | 212.34.194.211 218 | 202.91.8.219 219 | 122.0.0.13 220 | 216.17.128.2 221 | 195.166.192.1 222 | 200.95.144.4 223 | 202.116.128.1 224 | 193.255.146.53 225 | 202.65.159.4 226 | 216.47.160.13 227 | 117.102.224.26 228 | 64.85.177.11 229 | 168.88.66.6 230 | 195.234.101.234 231 | 83.177.163.51 232 | 84.45.85.23 233 | 101.255.64.114 234 | 198.60.22.2 235 | 66.165.173.235 236 | 50.9.119.3 237 | 195.177.240.3 238 | 194.169.205.1 239 | 151.236.6.156 240 | 194.28.223.2 241 | 195.158.239.4 242 | 178.161.146.10 243 | 64.94.1.33 244 | 216.81.96.68 245 | 63.251.161.33 246 | 199.44.194.2 247 | 159.90.200.7 248 | 217.18.206.22 249 | 101.255.64.227 250 | 217.77.223.114 251 | 122.155.167.8 252 | 194.246.126.68 253 | 93.91.146.150 254 | 205.211.206.141 255 | 82.99.212.18 256 | 80.66.0.30 257 | 212.37.208.4 258 | 203.189.89.209 259 | 209.252.33.101 260 | 212.85.128.2 261 | 196.29.40.3 262 | 61.31.233.1 263 | 213.157.0.194 264 | 203.115.225.25 265 | 195.140.236.250 266 | 62.243.190.7 267 | 193.232.69.22 268 | 87.204.12.134 269 | 209.183.48.21 270 | 85.185.144.136 271 | 206.126.32.101 272 | 217.149.17.1 273 | 111.223.252.193 274 | 200.85.0.105 275 | 194.145.147.195 276 | 194.226.48.12 277 | 216.186.27.15 278 | 216.21.128.22 279 | 77.241.112.23 280 | 89.146.204.5 281 | 207.190.94.129 282 | 211.78.130.10 283 | 210.23.64.1 284 | 95.86.129.42 285 | 200.85.44.70 286 | 83.170.69.2 287 | 193.231.173.2 288 | 193.142.218.3 289 | 157.157.90.193 290 | 213.88.195.147 291 | 83.97.97.3 292 | 194.150.168.168 293 | 212.42.165.37 294 | 217.168.40.198 295 | 66.216.18.222 296 | 194.141.45.4 297 | 198.82.247.34 298 | 216.254.141.2 299 | 213.241.193.250 300 | 202.130.97.65 301 | 193.33.236.1 302 | 42.62.176.38 303 | 195.186.4.110 304 | 69.88.0.17 305 | 69.26.129.2 306 | 212.76.68.200 307 | 210.23.129.34 308 | 198.6.1.195 309 | 202.203.192.33 310 | 66.118.80.5 311 | 213.233.161.69 312 | 206.13.31.12 313 | 84.241.98.36 314 | 218.232.110.36 315 | 67.17.215.132 316 | 193.169.32.1 317 | 78.38.253.138 318 | 177.19.48.144 319 | 188.114.194.2 320 | 209.0.205.50 321 | 139.130.4.4 322 | 80.254.79.157 323 | 202.46.1.2 324 | 195.216.64.144 325 | 201.163.145.101 326 | 212.36.24.3 327 | 210.29.96.33 328 | 89.107.210.172 329 | 194.113.160.68 330 | 195.189.130.1 331 | 213.178.66.111 332 | 62.148.228.2 333 | 216.47.160.12 334 | 195.5.125.3 335 | 186.107.119.118 336 | 209.145.150.10 337 | 209.195.95.95 338 | 187.115.53.162 339 | 62.243.190.8 340 | 77.59.224.11 341 | 91.189.0.2 342 | 93.191.32.131 343 | 62.3.32.17 344 | 209.244.0.4 345 | 212.31.253.69 346 | 62.122.184.81 347 | 213.144.108.117 348 | 80.84.72.20 349 | 208.112.89.187 350 | 217.24.112.2 351 | 206.51.143.55 352 | 213.128.194.2 353 | 212.118.241.1 354 | 81.189.212.129 355 | 81.222.80.2 356 | 165.21.83.88 357 | 87.105.250.3 358 | 212.87.29.6 359 | 68.179.203.94 360 | 213.144.3.210 361 | 180.211.129.42 362 | 200.49.160.35 363 | 38.119.98.220 364 | 104.45.88.179 365 | 219.96.224.90 366 | 193.252.247.52 367 | 82.145.163.1 368 | 93.157.14.65 369 | 212.181.124.8 370 | 154.15.245.2 371 | 200.35.174.126 372 | 193.43.17.4 373 | 204.174.120.45 374 | 212.19.128.4 375 | 203.130.2.3 376 | 117.102.224.118 377 | 213.152.142.12 378 | 217.174.252.116 379 | 202.43.176.14 380 | 89.235.9.9 381 | 194.20.0.24 382 | 213.171.220.209 383 | 203.130.2.4 384 | 91.207.164.4 385 | 84.200.69.80 386 | 195.128.252.4 387 | 119.160.208.252 388 | 212.31.32.131 389 | 204.119.0.2 390 | 114.114.114.114 391 | 62.58.3.11 392 | 209.191.129.65 393 | 202.141.224.34 394 | 80.74.253.18 395 | 212.18.15.3 396 | 67.214.64.6 397 | 193.43.108.3 398 | 208.79.56.204 399 | 208.70.22.22 400 | 218.49.29.140 401 | 195.189.72.2 402 | 88.147.158.1 403 | 66.9.182.1 404 | 212.98.160.65 405 | 213.88.151.150 406 | 195.68.193.10 407 | 203.112.2.5 408 | 58.97.113.158 409 | 203.119.36.106 410 | 63.171.232.38 411 | 194.52.202.98 412 | 212.94.162.33 413 | 195.137.189.203 414 | 199.5.47.164 415 | 114.114.115.115 416 | 83.166.8.18 417 | 202.14.67.14 418 | 82.144.181.1 419 | 195.149.104.186 420 | 85.174.190.2 421 | 212.58.111.1 422 | 195.228.254.165 423 | 205.152.37.23 424 | 194.117.245.2 425 | 91.98.110.15 426 | 213.0.77.8 427 | 212.122.224.10 428 | 194.152.241.2 429 | 85.158.50.50 430 | 64.91.92.22 431 | 202.43.178.245 432 | 85.233.82.86 433 | 210.44.112.66 434 | 200.49.160.31 435 | 217.8.180.98 436 | 208.67.222.222 437 | 217.159.0.17 438 | 69.60.160.203 439 | 207.241.160.34 440 | 94.142.161.73 441 | 151.164.1.8 442 | 216.17.128.1 443 | 217.15.17.2 444 | 212.91.184.2 445 | 63.251.161.1 446 | 220.227.60.12 447 | 202.120.111.3 448 | 195.14.50.21 449 | 209.87.64.70 450 | 195.178.60.2 451 | 41.211.233.10 452 | 217.69.160.18 453 | 217.64.163.1 454 | 208.69.84.9 455 | 81.17.66.14 456 | 209.90.160.220 457 | 200.175.3.68 458 | 213.244.72.31 459 | 95.128.246.2 460 | 66.92.64.2 461 | 217.22.209.254 462 | 193.26.6.130 463 | 200.66.96.1 464 | 83.242.140.10 465 | 153.19.1.254 466 | 8.3.48.20 467 | 152.99.78.136 468 | 79.141.81.250 469 | 206.165.6.11 470 | 148.243.65.16 471 | 213.159.193.54 472 | 195.153.19.10 473 | 8.8.4.4 474 | 188.227.48.254 475 | 80.79.179.2 476 | 203.189.89.15 477 | 203.90.78.65 478 | 217.107.10.254 479 | 218.49.29.141 480 | 195.96.208.1 481 | 207.248.224.71 482 | 89.191.149.2 483 | 213.151.109.1 484 | 216.52.126.1 485 | 212.66.129.98 486 | 77.88.8.2 487 | 8.8.8.8 488 | 203.189.89.134 489 | 61.199.193.162 490 | 93.186.161.211 491 | 83.143.8.220 492 | 194.54.66.242 493 | 82.202.131.1 494 | 194.158.206.206 495 | 62.16.86.100 496 | 195.137.162.149 497 | 193.89.221.124 498 | 219.163.55.74 499 | 62.37.228.20 500 | 193.151.93.3 501 | 193.22.119.195 502 | 151.236.29.92 503 | 217.30.49.100 504 | 217.28.113.13 505 | 78.159.224.224 506 | 122.155.12.215 507 | 212.66.1.1 508 | 212.116.76.76 509 | 64.13.115.12 510 | 62.140.239.1 511 | 82.96.193.12 512 | 212.9.64.12 513 | 213.183.57.55 514 | 193.243.128.91 515 | 212.51.17.1 516 | 62.141.38.230 517 | 206.248.95.194 518 | 194.226.211.11 519 | 74.82.46.6 520 | 213.184.16.1 521 | 216.66.80.98 522 | 158.43.192.1 523 | 195.244.25.3 524 | 213.136.40.32 525 | 217.28.98.62 526 | 212.230.255.1 527 | 213.135.67.1 528 | 212.118.0.2 529 | 141.211.125.17 530 | 195.214.240.136 531 | 202.83.20.101 532 | 193.111.34.18 533 | 217.149.155.180 534 | 142.77.2.85 535 | 130.180.228.2 536 | 89.233.250.137 537 | 106.51.255.133 538 | 91.194.211.134 539 | 195.42.215.17 540 | 64.105.199.76 541 | 202.91.8.234 542 | 193.45.139.20 543 | 213.128.216.115 544 | 217.66.226.8 545 | 211.67.112.1 546 | 129.219.17.5 547 | 217.72.1.2 548 | 213.251.133.164 549 | 202.30.143.11 550 | 213.183.65.31 551 | 208.3.14.1 552 | 207.17.190.5 553 | 94.25.63.2 554 | 217.79.225.8 555 | 83.234.220.253 556 | 198.6.1.1 557 | 87.204.12.130 558 | 200.88.127.23 559 | 81.209.202.46 560 | 210.2.4.8 561 | 195.35.110.4 562 | 213.141.72.250 563 | 24.154.1.5 564 | 194.145.147.194 565 | 95.215.150.15 566 | 205.134.162.209 567 | 83.170.64.2 568 | 81.28.128.34 569 | 202.86.8.100 570 | 207.44.226.173 571 | 89.248.162.3 572 | 82.216.111.122 573 | 187.115.52.91 574 | 200.194.67.214 575 | 203.109.129.67 576 | 194.50.10.2 577 | 88.82.105.19 578 | 213.140.34.65 579 | 200.123.192.244 580 | 141.50.161.12 581 | 217.31.160.30 582 | 192.190.173.40 583 | 82.96.81.10 584 | 37.235.1.174 585 | 187.115.52.78 586 | 207.17.190.7 587 | 209.172.128.2 588 | 219.252.48.67 589 | 62.149.132.2 590 | 91.203.188.1 591 | 82.209.190.82 592 | 194.8.53.1 593 | 198.6.1.4 594 | 200.175.3.69 595 | 212.40.5.51 596 | 195.26.96.2 597 | 203.115.81.38 598 | 8.3.48.30 599 | 194.158.206.205 600 | 212.87.132.53 601 | 194.169.244.34 602 | 63.251.129.33 603 | 69.16.169.11 604 | 31.47.189.170 605 | 190.11.32.42 606 | 202.130.97.65 607 | 203.189.88.211 608 | 193.226.61.1 609 | 204.117.214.10 610 | 83.69.77.2 611 | 81.199.3.7 612 | 35.8.2.45 613 | 84.55.62.75 614 | 213.158.72.1 615 | 94.247.200.3 616 | 210.94.0.7 617 | 89.160.27.232 618 | 120.50.44.141 619 | 201.217.16.89 620 | 196.41.225.11 621 | 62.196.2.70 622 | 203.253.64.1 623 | 148.233.151.8 624 | 194.141.44.130 625 | 62.8.96.38 626 | 202.51.96.5 627 | 46.246.94.136 628 | 91.194.178.5 629 | 212.112.39.25 630 | 203.210.142.132 631 | 213.73.14.227 632 | 209.130.136.2 633 | 149.250.222.22 634 | 212.69.161.100 635 | 91.202.12.10 636 | 213.129.120.3 637 | 88.80.64.200 638 | 220.233.0.1 639 | 216.184.96.6 640 | 212.15.128.1 641 | 211.41.128.71 642 | 194.14.0.6 643 | 212.94.34.34 644 | 216.229.0.25 645 | 216.143.135.11 646 | 216.143.135.12 647 | 203.189.89.1 648 | 195.161.115.3 649 | 195.166.192.8 650 | 8.15.12.5 651 | 202.62.124.238 652 | 212.40.5.50 653 | 216.254.95.2 654 | 62.58.3.11 655 | 217.219.236.8 656 | 80.190.248.146 657 | 89.186.66.6 658 | 194.54.128.232 659 | 194.145.240.6 660 | 62.149.33.134 661 | 69.28.148.102 662 | 79.141.83.250 663 | 203.41.44.20 664 | 208.38.1.15 665 | 82.76.253.115 666 | 91.196.8.2 667 | 205.152.144.23 668 | 200.9.115.2 669 | 62.33.47.253 670 | 188.114.193.254 671 | 202.248.0.34 672 | 91.207.40.2 673 | 210.131.113.123 674 | 202.73.36.135 675 | 142.47.133.81 676 | 204.116.57.2 677 | 185.46.7.100 678 | 217.115.16.2 679 | 66.92.159.2 680 | 217.31.204.130 681 | 185.16.40.143 682 | 220.128.173.228 683 | 212.51.17.1 684 | 81.23.144.250 685 | 193.28.97.130 686 | 89.107.16.2 687 | 88.82.84.129 688 | 91.98.132.60 689 | 194.169.239.10 690 | 42.62.178.65 691 | 199.166.6.2 692 | 62.3.32.16 693 | 193.33.200.22 694 | 90.189.109.2 695 | 213.33.82.1 696 | 199.103.16.5 697 | 141.85.128.1 698 | 209.216.160.2 699 | 110.76.151.1 700 | 193.230.161.4 701 | 213.253.137.17 702 | 222.124.249.115 703 | 81.24.128.146 704 | 194.18.231.5 705 | 5.144.19.8 706 | 62.20.17.205 707 | 194.98.65.165 708 | 194.102.106.1 709 | 4.2.2.6 710 | 101.255.64.134 711 | 158.43.128.1 712 | 212.58.3.2 713 | 89.233.43.71 714 | 193.16.209.2 715 | 77.88.8.8 716 | 62.73.100.4 717 | 81.189.214.162 718 | 158.43.128.72 719 | 115.68.100.103 720 | 69.146.17.3 721 | 200.85.39.206 722 | 64.91.92.21 723 | 200.40.230.36 724 | 90.183.74.1 725 | 84.1.240.34 726 | 83.243.39.61 727 | 202.248.20.133 728 | 81.27.135.50 729 | 195.84.194.3 730 | 195.182.110.132 731 | 203.189.88.213 732 | 80.190.200.10 733 | 207.178.128.21 734 | 212.94.162.33 735 | 195.170.97.254 736 | 77.247.176.114 737 | 82.145.160.140 738 | 152.99.1.10 739 | 212.192.128.3 740 | 142.77.2.36 741 | 42.62.176.30 742 | 195.225.36.16 743 | 84.241.100.31 744 | 217.78.80.74 745 | 166.70.25.18 746 | 216.21.129.22 747 | 205.171.2.65 748 | 195.46.48.22 749 | 147.235.250.2 750 | 130.85.1.3 751 | 91.203.177.4 752 | 178.151.86.169 753 | 201.217.19.225 754 | 204.119.0.2 755 | 88.255.242.6 756 | 91.135.110.132 757 | 190.22.34.170 758 | 213.244.5.67 759 | 117.102.224.154 760 | 91.149.108.10 761 | 194.246.127.11 762 | 194.67.74.2 763 | 64.119.60.9 764 | 216.184.96.4 765 | 216.52.169.1 766 | 83.136.56.52 767 | 194.239.164.25 768 | 216.116.96.3 769 | 84.32.80.20 770 | 216.66.38.58 771 | 206.253.194.65 772 | 61.31.1.1 773 | 217.21.96.1 774 | 91.198.154.133 775 | 212.5.218.3 776 | 78.31.96.2 777 | 194.225.128.22 778 | 76.73.18.50 779 | 129.250.35.251 780 | 161.53.128.16 781 | 203.189.88.54 782 | 89.208.10.10 783 | 87.104.254.39 784 | 66.250.192.11 785 | 218.223.32.1 786 | 213.178.66.2 787 | 82.199.102.38 788 | 193.22.110.251 789 | 212.19.149.226 790 | 213.144.108.117 791 | 199.249.18.1 792 | 69.67.97.18 793 | 8.2.208.2 794 | 212.96.130.140 795 | 217.199.217.200 796 | 195.67.127.137 797 | 212.203.33.12 798 | 64.91.3.46 799 | 213.178.0.33 800 | 121.52.87.56 801 | 216.116.96.2 802 | 212.59.199.6 803 | 216.185.192.1 804 | 110.76.151.241 805 | 203.156.104.21 806 | 61.56.211.185 807 | 194.72.9.61 808 | 209.0.205.11 809 | 93.158.117.138 810 | 84.200.70.40 811 | 101.255.64.154 812 | 212.85.112.32 813 | 211.78.130.11 814 | 81.23.144.250 815 | 84.237.112.3 816 | 83.137.193.83 817 | 193.111.200.191 818 | 207.230.202.28 819 | 80.94.48.254 820 | 66.242.160.5 821 | 79.137.227.122 822 | 217.116.53.13 823 | 200.58.161.25 824 | 66.203.72.10 825 | 212.51.16.1 826 | 93.88.151.138 827 | 200.12.63.10 828 | 203.242.200.15 829 | 203.189.88.152 830 | 64.132.61.131 831 | 81.92.96.22 832 | 139.134.5.51 833 | 89.223.7.242 834 | 95.158.129.2 835 | 62.133.163.171 836 | 202.44.55.193 837 | 91.144.248.227 838 | 81.17.72.70 839 | 193.110.157.2 840 | 203.189.88.54 841 | 193.230.161.3 842 | 64.72.224.34 843 | 85.115.224.18 844 | 193.77.33.18 845 | 203.189.88.214 846 | 212.214.82.194 847 | 216.66.80.30 848 | 194.120.55.3 849 | 81.199.48.244 850 | 212.66.1.1 851 | 83.97.97.2 852 | 202.180.64.2 853 | 67.214.159.198 854 | 213.157.0.194 855 | 77.241.24.5 856 | 195.190.17.6 857 | 217.77.176.10 858 | 72.11.150.74 859 | 66.252.170.3 860 | 94.155.91.8 861 | 200.175.3.59 862 | 194.12.224.34 863 | 213.147.64.1 864 | 84.241.98.37 865 | 207.178.128.20 866 | 202.180.64.9 867 | 187.73.241.67 868 | 195.67.15.102 869 | 78.133.155.218 870 | 194.183.88.41 871 | 212.9.160.1 872 | 208.48.253.106 873 | 193.242.114.129 874 | 85.219.142.1 875 | 101.255.64.42 876 | 82.96.86.20 877 | 200.62.64.65 878 | 220.68.64.1 879 | 216.52.254.33 880 | 66.81.0.252 881 | 193.151.32.40 882 | 63.251.62.1 883 | 203.133.1.7 884 | 202.148.202.4 885 | 193.95.93.243 886 | 212.82.226.212 887 | 212.58.3.7 888 | 62.20.57.226 889 | 216.58.97.20 890 | 170.56.58.53 891 | 193.201.185.3 892 | 62.177.42.174 893 | 212.69.161.100 894 | 64.212.106.85 895 | 83.243.39.59 896 | 62.233.128.17 897 | 204.52.135.2 898 | 217.78.80.70 899 | 213.164.38.66 900 | 62.129.252.215 901 | 50.116.23.211 902 | 80.94.32.240 903 | 200.85.35.158 904 | 200.175.3.58 905 | 129.250.35.250 906 | 91.220.187.3 907 | 202.136.162.11 908 | 115.85.69.162 909 | 212.11.191.72 910 | 213.172.33.34 911 | 213.30.253.65 912 | 202.148.202.3 913 | 213.27.209.8 914 | 198.6.1.2 915 | 160.44.1.4 916 | 216.237.221.42 917 | 194.88.202.11 918 | 212.19.96.2 919 | 212.233.128.1 920 | 141.211.144.15 921 | 93.99.200.1 922 | 62.20.76.35 923 | 201.217.17.74 924 | 101.255.64.90 925 | 80.64.32.2 926 | 114.130.11.66 927 | 122.255.96.132 928 | 203.119.8.106 929 | 69.7.192.1 930 | 216.52.129.1 931 | 194.6.216.5 932 | 203.250.129.214 933 | 103.9.124.154 934 | 193.231.80.7 935 | 85.249.45.253 936 | 208.122.23.23 937 | 210.80.58.66 938 | 196.207.15.42 939 | 217.69.169.25 940 | 200.113.185.227 941 | 63.238.52.1 942 | 64.119.80.100 943 | 204.9.123.122 944 | 206.124.64.1 945 | 193.232.65.2 946 | 193.111.238.5 947 | 209.161.175.30 948 | 166.102.165.32 949 | 212.94.32.32 950 | 129.7.1.1 951 | 160.220.137.2 952 | 95.173.193.3 953 | 139.0.27.186 954 | 66.119.93.10 955 | 103.22.248.62 956 | 206.248.79.244 957 | 121.52.87.128 958 | 91.143.20.6 959 | 82.99.211.195 960 | 66.92.224.2 961 | 193.254.232.1 962 | 216.131.95.20 963 | 115.85.69.162 964 | 83.143.154.234 965 | 206.124.1.254 966 | 101.255.64.241 967 | 207.164.234.193 968 | 222.124.8.50 969 | 147.29.37.19 970 | 199.2.252.10 971 | 194.152.248.42 972 | 83.69.77.6 973 | 174.34.129.34 974 | 207.130.95.40 975 | 193.175.51.10 976 | 87.197.40.58 977 | 193.6.10.1 978 | 209.63.0.18 979 | 212.50.131.153 980 | 80.94.52.254 981 | 62.95.15.107 982 | 80.78.162.2 983 | 67.17.215.133 984 | 213.139.190.3 985 | 213.129.120.6 986 | 217.168.144.127 987 | 66.51.206.100 988 | 193.200.68.230 989 | 217.196.1.5 990 | 212.71.98.250 991 | 64.13.48.12 992 | 170.51.255.100 993 | 194.242.50.66 994 | 216.235.1.3 995 | 173.44.32.2 996 | 128.199.248.105 997 | 195.167.98.3 998 | 119.252.20.75 999 | 212.111.28.5 1000 | 217.21.48.1 1001 | 62.91.2.20 1002 | 206.74.254.2 1003 | 81.199.3.7 1004 | 165.87.13.129 1005 | 194.8.53.1 1006 | 64.140.243.112 1007 | 147.235.251.3 1008 | 212.82.225.7 1009 | 187.115.52.83 1010 | 101.255.64.150 1011 | 216.254.141.13 1012 | 213.27.209.53 1013 | 79.141.82.250 1014 | 194.213.193.5 1015 | 148.233.151.6 1016 | 200.85.60.210 1017 | 193.231.236.25 1018 | 62.177.42.174 1019 | 190.11.32.199 1020 | 207.179.3.25 1021 | 202.130.97.66 1022 | 199.101.98.178 1023 | 91.185.2.10 1024 | 217.18.90.105 1025 | 195.182.224.11 1026 | 69.28.97.4 1027 | 209.97.224.3 1028 | 94.124.19.16 1029 | 194.169.235.2 1030 | 87.229.99.1 1031 | 88.80.64.201 1032 | 62.181.119.131 1033 | 147.29.10.55 1034 | 194.73.96.50 1035 | 84.32.80.20 1036 | 216.146.35.230 1037 | 190.146.118.41 1038 | 110.76.151.17 1039 | 58.96.3.34 1040 | 193.16.255.2 1041 | 61.19.252.238 1042 | 208.92.9.21 1043 | 85.88.19.11 1044 | 83.241.175.98 1045 | 203.146.237.237 1046 | 64.91.89.2 1047 | 194.141.12.1 1048 | 194.54.181.90 1049 | 193.41.252.146 1050 | 201.131.4.9 1051 | 62.33.183.254 1052 | 119.160.208.251 1053 | 217.18.80.105 1054 | 202.86.216.1 1055 | 62.109.182.2 1056 | 64.105.189.26 1057 | 72.52.104.74 1058 | 81.92.97.12 1059 | 87.255.68.242 1060 | 134.48.1.32 1061 | 216.218.226.238 1062 | 85.214.132.203 1063 | 62.97.84.4 1064 | 210.220.163.82 1065 | 103.239.165.34 1066 | 213.218.117.85 1067 | 203.248.252.2 1068 | 65.183.98.90 1069 | 168.95.1.1 1070 | 209.213.223.18 1071 | 200.88.127.22 1072 | 217.32.105.66 1073 | 62.20.15.234 1074 | 149.211.153.51 1075 | 193.111.144.145 1076 | 203.89.226.26 1077 | 203.80.96.10 1078 | 193.78.240.12 1079 | 109.69.8.51 1080 | 78.142.133.43 1081 | 212.94.162.1 1082 | 77.240.144.164 1083 | 213.234.128.211 1084 | 91.209.108.17 1085 | 64.207.64.5 1086 | 213.137.73.254 1087 | 205.172.19.79 1088 | 83.219.241.2 1089 | 88.82.105.18 1090 | 209.55.1.220 1091 | 193.58.251.251 1092 | 206.253.33.130 1093 | 141.56.31.3 1094 | 161.53.129.139 1095 | 158.39.46.248 1096 | 122.210.229.161 1097 | 203.253.31.1 1098 | 195.60.70.5 1099 | 202.38.128.58 1100 | 62.134.11.4 1101 | 207.178.128.21 1102 | 195.166.13.4 1103 | 192.43.161.22 1104 | 200.69.193.2 1105 | 203.153.214.14 1106 | 81.24.128.146 1107 | 208.78.24.238 1108 | 211.172.241.54 1109 | 185.46.7.110 1110 | 198.188.2.69 1111 | 66.93.87.2 1112 | 194.33.15.3 1113 | 193.34.129.253 1114 | 91.212.56.5 1115 | 81.90.168.3 1116 | 216.198.139.68 1117 | 193.231.249.1 1118 | 195.70.237.42 1119 | 65.74.130.6 1120 | 91.210.24.22 1121 | 65.163.107.11 1122 | 202.181.224.2 1123 | 195.70.248.1 1124 | 208.122.23.22 1125 | 210.227.119.194 1126 | 79.99.224.24 1127 | 168.243.165.225 1128 | 202.83.30.5 1129 | 212.24.98.98 1130 | 194.176.190.2 1131 | 77.59.224.10 1132 | 80.190.200.55 1133 | 91.135.230.231 1134 | 212.209.194.170 1135 | 65.220.16.14 1136 | 66.207.160.111 1137 | 66.28.0.45 1138 | 216.185.192.2 1139 | 216.54.201.11 1140 | 68.179.203.94 1141 | 216.52.94.1 1142 | 193.33.220.3 1143 | 194.145.198.226 1144 | 212.14.253.242 1145 | 62.108.161.200 1146 | 66.81.1.252 1147 | 217.65.192.1 1148 | 122.155.167.70 1149 | 195.170.96.2 1150 | 198.6.1.146 1151 | 168.213.3.10 1152 | 64.85.177.10 1153 | 66.165.177.69 1154 | 85.94.224.1 1155 | 193.111.144.161 1156 | 64.61.99.2 1157 | 85.235.199.199 1158 | 193.33.174.3 1159 | 149.156.64.210 1160 | 115.68.62.222 1161 | 119.160.208.252 1162 | 216.58.97.21 1163 | 194.158.230.53 1164 | 202.138.120.6 1165 | 218.192.240.2 1166 | 152.99.200.6 1167 | 202.152.162.66 1168 | 173.241.133.178 1169 | 194.132.32.32 1170 | 193.231.238.1 1171 | 195.182.192.10 1172 | 212.66.160.2 1173 | 89.255.99.131 1174 | 212.85.128.2 1175 | 65.74.130.5 1176 | 63.251.62.33 1177 | 200.56.224.11 1178 | 103.3.76.82 1179 | 212.108.200.77 1180 | 194.250.223.1 1181 | 194.172.160.4 1182 | 195.140.236.253 1183 | 209.142.182.250 1184 | 106.186.17.181 1185 | 58.150.55.34 1186 | 103.9.124.154 1187 | 206.123.64.245 1188 | 87.104.254.135 1189 | 64.13.131.34 1190 | 148.243.65.17 1191 | 103.226.55.129 1192 | 81.180.201.99 1193 | 50.21.174.18 1194 | 216.175.203.51 1195 | 66.163.0.161 1196 | 66.146.0.1 1197 | 216.162.32.20 1198 | 89.208.120.10 1199 | 202.43.176.13 1200 | 77.241.25.3 1201 | 212.40.0.10 1202 | 206.53.177.3 1203 | 75.94.255.12 1204 | 93.90.82.50 1205 | 64.187.29.134 1206 | 217.144.144.211 1207 | 195.46.48.21 1208 | 4.2.2.1 1209 | 62.165.33.250 1210 | 212.87.130.92 1211 | 205.151.69.200 1212 | 198.6.1.142 1213 | 66.63.192.2 1214 | 82.198.129.146 1215 | 209.142.152.253 1216 | 103.9.124.90 1217 | 213.211.50.1 1218 | 212.31.32.130 1219 | 64.105.179.138 1220 | 190.248.153.98 1221 | 94.247.200.3 1222 | 206.13.30.12 1223 | 92.42.200.66 1224 | 212.73.65.40 1225 | 64.135.2.250 1226 | 69.28.97.4 1227 | 195.110.17.40 1228 | 158.43.240.3 1229 | 82.96.40.83 1230 | 164.2.255.241 1231 | 206.124.0.254 1232 | 216.52.94.33 1233 | 200.221.11.101 1234 | 216.52.161.33 1235 | 198.100.146.51 1236 | 203.189.88.133 1237 | 193.7.169.9 1238 | 212.118.241.33 1239 | 200.175.0.91 1240 | 164.33.1.4 1241 | 89.160.63.190 1242 | 212.41.4.1 1243 | 198.6.1.122 1244 | 65.39.139.53 1245 | 64.254.99.13 1246 | 64.132.94.250 1247 | 195.182.192.2 1248 | 81.7.200.80 1249 | 202.45.84.59 1250 | 212.118.241.33 1251 | 91.206.72.2 1252 | 206.252.187.110 1253 | 164.124.101.51 1254 | 38.112.17.138 1255 | 195.24.228.3 1256 | 195.221.20.10 1257 | 87.204.28.12 1258 | 217.198.161.1 1259 | 146.185.134.104 1260 | 193.142.115.131 1261 | 203.99.253.1 1262 | 81.18.242.100 1263 | 66.165.164.250 1264 | 103.3.213.210 1265 | 80.67.169.12 1266 | 193.17.213.10 1267 | 159.230.4.130 1268 | 203.189.88.156 1269 | 199.80.64.202 1270 | 212.230.255.129 1271 | 194.102.93.2 1272 | 93.88.148.138 1273 | 201.217.18.178 1274 | 77.109.138.45 1275 | 41.221.5.11 1276 | 203.189.88.212 1277 | 216.66.80.26 1278 | 12.127.16.67 1279 | 202.44.204.63 1280 | 203.189.88.11 1281 | 218.44.242.98 1282 | 85.94.224.2 1283 | 193.231.112.1 1284 | 195.110.16.40 1285 | 77.87.152.9 1286 | 94.155.90.7 1287 | 193.89.248.1 1288 | 207.91.5.32 1289 | 149.6.140.30 1290 | 208.66.232.66 1291 | 91.206.213.2 1292 | 213.157.176.2 1293 | 62.105.17.252 1294 | 213.23.108.129 1295 | 205.162.201.2 1296 | 193.28.100.200 1297 | 203.193.139.150 1298 | 212.102.225.2 1299 | 220.233.0.3 1300 | 217.117.0.38 1301 | 194.6.240.1 1302 | 173.241.133.189 1303 | 193.205.136.1 1304 | 4.2.2.4 1305 | 212.245.158.66 1306 | 193.16.48.66 1307 | 193.201.185.2 1308 | 212.1.118.3 1309 | 82.198.129.138 1310 | 193.239.60.19 1311 | 212.53.34.1 1312 | 209.87.79.232 1313 | 213.88.195.146 1314 | 216.52.41.1 1315 | 78.159.232.232 1316 | 89.255.96.3 1317 | 195.251.119.23 1318 | 82.199.32.36 1319 | 165.166.142.42 1320 | 38.112.17.142 1321 | 62.91.2.20 1322 | 142.46.1.130 1323 | 81.12.49.100 1324 | 4.79.132.219 1325 | 91.197.164.11 1326 | 79.132.192.2 1327 | 203.189.88.11 1328 | 203.115.130.74 1329 | 202.62.224.2 1330 | 217.18.206.12 1331 | 206.124.64.253 1332 | 195.198.214.72 1333 | 69.28.239.8 1334 | 84.32.112.202 1335 | 83.166.8.18 1336 | 195.153.19.5 1337 | 203.189.89.241 1338 | 85.172.0.250 1339 | 77.239.96.2 1340 | 59.12.239.70 1341 | 203.189.89.131 1342 | 212.84.181.99 1343 | 82.96.65.2 1344 | 216.52.190.33 1345 | 202.174.131.19 1346 | 213.157.196.132 1347 | 37.221.170.105 1348 | 190.249.175.122 1349 | 64.79.224.27 1350 | 83.240.154.200 1351 | 216.147.131.34 1352 | 200.85.61.90 1353 | 216.106.184.6 1354 | 204.97.212.10 1355 | 194.146.136.1 1356 | 194.145.198.6 1357 | 81.180.206.137 1358 | 218.102.23.228 1359 | 194.158.230.54 1360 | 85.132.32.41 1361 | 212.28.34.90 1362 | 101.255.64.82 1363 | 67.214.64.27 1364 | 211.172.208.2 1365 | 81.92.226.181 1366 | 210.34.0.18 1367 | 163.152.1.1 1368 | 91.200.113.1 1369 | 195.177.223.3 1370 | 217.170.1.1 1371 | 77.88.8.88 1372 | 62.77.85.98 1373 | 67.100.88.27 1374 | 103.20.188.83 1375 | 198.6.1.6 1376 | 213.172.33.35 1377 | 206.80.254.4 1378 | 193.226.128.129 1379 | 62.108.161.161 1380 | 217.196.1.6 1381 | 66.112.235.200 1382 | 194.105.32.2 1383 | 122.155.13.155 1384 | 83.228.65.52 1385 | 66.118.80.4 1386 | 209.142.136.85 1387 | 74.222.30.2 1388 | 193.34.129.253 1389 | 168.243.165.226 1390 | 164.115.2.132 1391 | 80.80.111.254 1392 | 195.198.127.20 1393 | 188.34.0.4 1394 | 62.119.70.3 1395 | 194.242.50.65 1396 | 195.88.84.100 1397 | 217.65.100.7 1398 | 193.252.247.53 1399 | 82.96.193.10 1400 | 195.234.230.67 1401 | 218.232.110.37 1402 | 213.73.91.35 1403 | 119.18.159.222 1404 | 200.57.7.61 1405 | 64.105.199.74 1406 | 216.81.128.132 1407 | 195.206.96.47 1408 | 213.33.82.2 1409 | 93.188.152.3 1410 | 89.249.224.1 1411 | 195.66.89.4 1412 | 216.138.119.6 1413 | 89.19.193.1 1414 | 200.221.11.100 1415 | 91.188.0.35 1416 | 202.86.216.2 1417 | 199.249.19.2 1418 | 194.25.15.11 1419 | 204.101.45.5 1420 | 217.72.168.34 1421 | 78.47.34.12 1422 | 83.142.192.2 1423 | 193.204.192.2 1424 | 195.128.252.7 1425 | 195.12.4.247 1426 | 61.208.115.242 1427 | 194.187.164.20 1428 | 101.255.64.138 1429 | 91.98.128.112 1430 | 122.155.12.91 1431 | 212.49.128.65 1432 | 42.62.176.150 1433 | 213.88.195.148 1434 | 194.164.181.2 1435 | 193.95.93.77 1436 | 190.186.50.31 1437 | 142.46.128.130 1438 | 69.28.136.102 1439 | 194.113.160.68 1440 | 195.112.96.34 1441 | 203.153.214.26 1442 | 194.45.12.2 1443 | 101.255.64.58 1444 | 194.88.203.6 1445 | 212.5.220.252 1446 | 62.56.230.100 1447 | 194.237.202.250 1448 | 210.34.48.34 1449 | 195.20.193.11 1450 | 213.157.196.131 1451 | 203.198.7.66 1452 | 202.138.120.87 1453 | 62.22.102.5 1454 | 221.139.13.130 1455 | 69.25.1.33 1456 | 195.186.1.110 1457 | 212.233.128.2 1458 | 93.91.224.2 1459 | 80.149.86.20 1460 | 37.235.1.177 1461 | 194.2.0.20 1462 | 195.66.68.2 1463 | 209.68.1.11 1464 | 91.203.188.1 1465 | 216.54.2.11 1466 | 207.91.250.34 1467 | 203.189.89.65 1468 | 203.153.214.14 1469 | 80.88.171.16 1470 | 208.90.237.9 1471 | 216.81.96.67 1472 | 89.107.129.15 1473 | 194.1.148.1 1474 | 209.197.128.2 1475 | 77.246.144.5 1476 | 211.78.130.11 1477 | 192.43.161.22 1478 | 83.243.39.59 1479 | 62.40.32.34 1480 | 195.16.73.1 1481 | 166.70.25.18 1482 | 213.157.0.193 1483 | 62.77.94.72 1484 | 77.41.229.2 1485 | 203.112.2.4 1486 | 62.94.0.41 1487 | 81.21.112.130 1488 | 88.131.89.37 1489 | 62.36.225.150 1490 | 207.248.224.72 1491 | 200.95.144.3 1492 | 62.149.128.2 1493 | 216.218.221.6 1494 | 64.94.33.33 1495 | 101.203.168.123 1496 | 212.58.3.8 1497 | 81.200.5.165 1498 | 212.15.86.12 1499 | 115.68.45.3 1500 | 103.3.46.105 1501 | 216.147.131.33 1502 | 203.124.230.100 1503 | 61.8.0.113 1504 | 195.129.12.114 1505 | 205.236.148.130 1506 | 209.51.161.14 1507 | 12.127.17.72 1508 | 203.189.89.210 1509 | 164.115.2.132 1510 | 209.142.152.254 1511 | 194.102.44.130 1512 | 94.199.201.199 1513 | 217.115.16.3 1514 | 77.109.139.29 1515 | 202.43.160.50 1516 | 90.183.74.2 1517 | 164.124.101.47 1518 | 88.255.96.196 1519 | 203.112.194.243 1520 | 86.59.41.180 1521 | 82.141.136.2 1522 | 194.67.74.3 1523 | 115.68.62.210 1524 | 203.189.89.117 1525 | 91.192.56.2 1526 | 193.102.59.190 1527 | 216.136.95.2 1528 | 89.207.72.138 1529 | 208.196.63.2 1530 | 111.223.252.161 1531 | 193.16.208.114 1532 | 203.2.193.67 1533 | 207.230.192.254 1534 | 160.7.240.20 1535 | 195.22.192.252 1536 | 83.137.41.8 1537 | 194.187.148.1 1538 | 72.11.150.10 1539 | 60.32.112.42 1540 | 216.52.41.33 1541 | 212.54.160.7 1542 | 193.41.10.1 1543 | 202.125.132.154 1544 | 65.107.59.67 1545 | 194.73.96.62 1546 | 203.196.0.6 1547 | 69.28.104.5 1548 | 207.15.68.36 1549 | 66.80.130.18 1550 | 122.155.3.119 1551 | 209.244.0.53 1552 | 212.230.255.129 1553 | 212.41.3.147 1554 | 165.194.1.1 1555 | 216.37.1.19 1556 | 122.155.12.41 1557 | 213.253.136.17 1558 | 80.66.1.42 1559 | 195.186.1.111 1560 | 69.54.70.15 1561 | 198.32.2.10 1562 | 212.38.95.254 1563 | 187.110.170.74 1564 | 217.77.176.11 1565 | 201.131.4.5 1566 | 193.43.108.62 1567 | 211.61.13.227 1568 | 194.116.170.66 1569 | 5.144.12.202 1570 | 194.30.163.5 1571 | 213.178.66.112 1572 | 195.137.246.17 1573 | 78.143.192.20 1574 | 207.164.234.129 1575 | 95.215.149.5 1576 | 94.236.199.8 1577 | 82.209.213.60 1578 | 61.60.224.5 1579 | 94.23.222.19 1580 | 206.253.33.131 1581 | 211.61.13.126 1582 | 202.133.99.11 1583 | 213.253.193.2 1584 | 194.149.156.140 1585 | 193.78.240.12 1586 | 58.68.121.230 1587 | 210.180.98.69 1588 | 216.52.65.1 1589 | 216.27.175.2 1590 | 193.230.230.1 1591 | 211.41.128.70 1592 | 211.78.130.10 1593 | 62.37.225.56 1594 | 62.165.32.250 1595 | 211.161.46.84 1596 | 83.143.12.246 1597 | 220.110.92.202 1598 | 4.2.2.2 1599 | 209.216.160.131 1600 | 193.138.78.117 1601 | 209.143.22.182 1602 | 203.89.226.24 1603 | 217.29.16.250 1604 | 66.182.208.5 1605 | 201.217.51.45 1606 | 217.173.198.3 1607 | 147.29.37.20 1608 | 69.24.112.10 1609 | 88.82.84.129 1610 | 195.243.214.4 1611 | 195.54.152.3 1612 | 193.171.4.60 1613 | 81.20.240.34 1614 | 69.24.112.11 1615 | 93.88.16.66 1616 | 221.186.85.74 1617 | 80.254.77.39 1618 | 193.228.86.5 1619 | 194.25.0.52 1620 | 91.98.234.4 1621 | 89.187.240.60 1622 | 129.219.17.200 1623 | 194.77.8.1 1624 | 62.122.208.68 1625 | 74.84.4.139 1626 | 160.220.137.2 1627 | 203.189.88.151 1628 | 193.231.236.30 1629 | 63.238.52.2 1630 | 87.250.77.204 1631 | 91.98.30.222 1632 | 69.67.97.18 1633 | 168.215.165.186 1634 | 205.152.132.23 1635 | 119.252.20.75 1636 | 208.59.89.20 1637 | 208.54.220.20 1638 | 66.7.160.122 1639 | 61.63.0.66 1640 | 64.94.1.1 1641 | 85.114.105.3 1642 | 146.66.19.238 1643 | 217.77.223.114 1644 | 200.53.250.1 1645 | 66.232.139.10 1646 | 193.86.86.2 1647 | 121.52.206.130 1648 | 216.52.254.1 1649 | 115.68.100.102 1650 | 70.36.0.6 1651 | 212.65.160.43 1652 | 193.42.81.68 1653 | 212.112.39.22 1654 | 87.230.13.136 1655 | 194.126.181.47 1656 | 64.212.106.84 1657 | 193.47.72.17 1658 | 24.248.137.39 1659 | 83.149.244.194 1660 | 91.214.72.33 1661 | 111.223.252.225 1662 | 89.107.210.171 1663 | 141.1.1.1 1664 | 62.33.203.33 1665 | 194.218.25.250 1666 | 80.73.1.1 1667 | 23.226.230.72 1668 | 195.178.123.130 1669 | 165.194.128.1 1670 | 213.128.194.2 1671 | 95.158.128.2 1672 | 212.203.32.11 1673 | 208.71.147.74 1674 | 69.28.239.9 1675 | 210.80.58.3 1676 | 203.77.161.12 1677 | 202.28.162.1 1678 | 62.128.1.42 1679 | 46.163.72.207 1680 | 67.214.159.199 1681 | 202.62.31.18 1682 | 207.248.57.10 1683 | 24.154.1.4 1684 | 65.210.29.34 1685 | 192.76.144.66 1686 | 217.64.167.1 1687 | 14.139.223.100 1688 | 41.221.6.38 1689 | 66.218.245.13 1690 | 192.172.250.8 1691 | 194.44.211.194 1692 | 195.251.123.232 1693 | 213.0.76.5 1694 | 117.102.224.230 1695 | 212.4.96.22 1696 | 89.187.240.59 1697 | 64.135.1.20 1698 | 189.90.16.20 1699 | 201.161.6.46 1700 | 42.62.176.74 1701 | 203.242.200.5 1702 | 64.81.159.2 1703 | 208.67.220.222 1704 | 195.186.4.111 1705 | 80.94.32.240 1706 | 213.8.145.133 1707 | 194.187.100.2 1708 | 212.9.161.2 1709 | 194.126.130.6 1710 | 209.161.175.29 1711 | 66.203.66.203 1712 | 158.43.240.4 1713 | 91.239.100.100 1714 | 202.0.107.125 1715 | 211.78.130.3 1716 | 216.52.97.33 1717 | 212.67.131.4 1718 | 211.175.82.66 1719 | 203.124.230.21 1720 | 80.64.32.2 1721 | 193.230.183.201 1722 | 217.151.0.195 1723 | 208.67.222.220 1724 | 124.107.135.126 1725 | 103.20.188.82 1726 | 61.19.130.42 1727 | 64.119.60.5 1728 | 149.250.222.21 1729 | 195.69.65.98 1730 | 210.104.1.3 1731 | 213.235.248.228 1732 | 194.153.232.17 1733 | 164.124.101.2 1734 | 194.149.146.2 1735 | 83.143.12.249 1736 | 66.119.93.4 1737 | 62.37.225.57 1738 | 217.20.96.100 1739 | 91.211.16.6 1740 | 122.0.0.12 1741 | 64.91.3.60 1742 | 81.25.152.2 1743 | 205.236.148.131 1744 | 142.103.1.1 1745 | 193.178.124.1 1746 | 168.215.210.50 1747 | 80.74.160.11 1748 | 211.237.65.31 1749 | 173.241.133.190 1750 | 219.250.36.130 1751 | 203.189.88.10 1752 | 211.237.65.21 1753 | 216.131.94.5 1754 | 216.52.1.1 1755 | 103.20.184.62 1756 | 83.142.9.30 1757 | 195.145.22.37 1758 | 207.15.68.164 1759 | 200.57.2.108 1760 | 216.52.1.33 1761 | 217.27.240.20 1762 | 216.194.28.33 1763 | 213.241.193.250 1764 | 77.72.17.17 1765 | 220.233.0.4 1766 | 205.172.19.193 1767 | 85.119.72.2 1768 | 217.107.11.35 1769 | 195.114.173.153 1770 | 121.152.231.196 1771 | 194.149.133.11 1772 | 62.29.160.228 1773 | 206.80.254.68 1774 | 216.181.31.11 1775 | 208.86.117.40 1776 | 211.63.64.11 1777 | 202.180.64.9 1778 | 195.66.156.26 1779 | 189.38.95.96 1780 | 62.231.100.14 1781 | 208.48.253.106 1782 | 81.180.201.98 1783 | 219.252.2.100 1784 | 217.14.128.50 1785 | 212.216.172.222 1786 | 195.149.138.3 1787 | 193.58.204.59 1788 | 213.235.248.228 1789 | 213.16.104.61 1790 | 195.27.1.1 1791 | 50.116.28.138 1792 | 211.115.194.2 1793 | 217.144.6.6 1794 | 194.54.148.129 1795 | 212.85.32.3 1796 | 164.124.107.9 1797 | 61.70.87.96 1798 | 203.176.144.20 1799 | 168.213.3.11 1800 | 206.104.144.62 1801 | 85.88.19.10 1802 | 212.59.199.2 1803 | 111.223.252.27 1804 | 194.105.156.2 1805 | 81.90.168.3 1806 | 193.46.84.2 1807 | 207.15.68.36 1808 | 195.146.81.130 1809 | 82.216.111.121 1810 | 151.11.85.5 1811 | 217.20.82.4 1812 | 216.22.81.60 1813 | 62.94.0.42 1814 | 208.116.30.21 1815 | 94.247.200.2 1816 | 203.239.131.1 1817 | 211.115.194.3 1818 | 83.228.65.52 1819 | 193.95.93.77 1820 | 216.106.1.2 1821 | 72.52.104.74 1822 | 212.110.122.132 1823 | 64.105.97.90 1824 | 62.133.163.171 1825 | 204.9.122.102 1826 | 66.165.183.87 1827 | 194.20.8.1 1828 | 193.15.251.65 1829 | 62.128.1.53 1830 | 193.148.29.100 1831 | 212.85.32.2 1832 | 203.124.250.70 1833 | 72.46.0.2 1834 | 209.142.136.220 1835 | 193.148.29.103 1836 | 203.115.71.66 1837 | 217.156.106.1 1838 | 114.114.115.119 1839 | 213.159.0.55 1840 | 212.62.98.10 1841 | 193.7.168.1 1842 | 209.206.136.8 1843 | 217.148.122.40 1844 | 66.9.5.15 1845 | 42.62.176.125 1846 | 193.111.212.5 1847 | 196.29.40.4 1848 | 67.214.64.7 1849 | 63.171.232.39 1850 | 63.105.204.164 1851 | 212.73.209.34 1852 | 88.216.8.69 1853 | 80.78.208.2 1854 | 85.249.40.8 1855 | 203.113.11.37 1856 | 62.233.181.26 1857 | 187.115.53.163 1858 | 193.41.59.151 1859 | 202.62.120.4 1860 | 203.189.88.154 1861 | 139.175.55.244 1862 | 193.34.170.162 1863 | 210.204.251.22 1864 | 85.124.252.33 1865 | 213.158.72.44 1866 | 218.248.240.23 1867 | 89.186.66.7 1868 | 77.72.192.3 1869 | 77.73.104.3 1870 | 193.226.145.2 1871 | 64.56.129.2 1872 | 194.95.141.1 1873 | 77.72.178.77 1874 | 80.92.178.98 1875 | 63.246.63.142 1876 | 64.135.1.22 1877 | 213.211.50.2 1878 | 49.0.124.46 1879 | 213.27.209.55 1880 | 82.115.23.3 1881 | 216.52.65.33 1882 | 87.241.63.4 1883 | 178.254.21.113 1884 | 69.51.76.26 1885 | 195.138.160.3 1886 | 46.246.46.246 1887 | 81.27.133.50 1888 | 61.72.225.1 1889 | 65.203.109.2 1890 | 203.153.41.28 1891 | 194.183.88.40 1892 | 85.132.32.42 1893 | 192.121.170.170 1894 | 209.251.33.2 1895 | 74.207.242.213 1896 | 194.126.159.20 1897 | 193.189.114.254 1898 | 194.250.223.2 1899 | 103.20.188.82 1900 | 89.185.75.244 1901 | 213.133.224.2 1902 | 213.159.0.70 1903 | 190.41.153.24 1904 | 212.214.229.170 1905 | 66.218.44.5 1906 | 195.7.64.3 1907 | 195.18.161.132 1908 | 207.249.163.155 1909 | 203.176.144.12 1910 | 216.244.192.32 1911 | 213.146.65.11 1912 | 83.151.112.193 1913 | 66.92.64.2 1914 | 93.157.233.3 1915 | 77.88.8.1 1916 | 195.67.15.73 1917 | 121.52.87.65 1918 | 194.20.8.4 1919 | 217.20.240.5 1920 | 82.212.67.101 1921 | 203.189.89.210 1922 | 217.24.113.214 1923 | 193.254.22.13 1924 | 62.129.252.252 1925 | 76.10.192.201 1926 | 193.101.111.10 1927 | 62.192.128.60 1928 | 193.43.181.62 1929 | 194.242.50.65 1930 | 64.105.172.26 1931 | 193.109.53.2 1932 | 37.19.5.135 1933 | 94.153.224.74 1934 | 91.199.139.1 1935 | 101.255.64.86 1936 | 165.87.201.244 1937 | 217.159.1.126 1938 | 62.116.30.200 1939 | 195.129.12.83 1940 | 221.151.200.206 1941 | 119.252.167.229 1942 | 168.126.63.1 1943 | 200.85.61.90 1944 | 117.102.224.190 1945 | 195.67.160.3 1946 | 212.73.154.2 1947 | 131.155.140.130 1948 | 216.218.221.6 1949 | 208.38.1.15 1950 | 66.28.0.45 1951 | 212.9.64.11 1952 | 63.251.129.33 1953 | 35.8.98.43 1954 | 221.156.218.31 1955 | 94.155.91.4 1956 | 203.113.25.71 1957 | 211.61.13.227 1958 | 195.13.38.3 1959 | 80.78.66.66 1960 | 193.22.119.22 1961 | 194.42.108.135 1962 | 193.67.79.39 1963 | 62.72.87.4 1964 | 80.93.177.182 1965 | 206.13.28.12 1966 | 8.5.244.5 1967 | 209.183.52.21 1968 | 35.8.2.42 1969 | 81.18.97.50 1970 | 178.212.102.76 1971 | 213.239.204.35 1972 | 212.98.160.50 1973 | 194.126.130.7 1974 | 200.123.192.251 1975 | 87.103.133.167 1976 | 196.2.45.101 1977 | 212.24.97.97 1978 | 173.241.133.172 1979 | 212.211.132.4 1980 | 85.119.74.2 1981 | 101.255.64.210 1982 | 64.91.92.21 1983 | 85.119.136.158 1984 | 212.96.128.140 1985 | 207.230.202.29 1986 | 193.2.64.45 1987 | 187.115.52.142 1988 | 137.82.1.1 1989 | 101.255.64.34 1990 | 194.1.185.122 1991 | 194.179.109.10 1992 | 217.28.96.190 1993 | 217.17.34.68 1994 | 87.106.220.85 1995 | 12.173.168.201 1996 | 217.198.160.130 1997 | 194.179.1.100 1998 | 89.140.186.3 1999 | 195.99.66.220 2000 | 165.21.100.88 2001 | 149.211.153.50 2002 | 81.189.121.68 2003 | 209.142.152.253 2004 | 195.2.195.1 2005 | 203.229.169.1 2006 | 66.28.0.61 2007 | 69.16.170.11 2008 | 81.95.128.218 2009 | 209.143.0.10 2010 | 193.27.192.98 2011 | 194.75.147.212 2012 | 217.148.0.17 2013 | 81.196.170.20 2014 | 168.188.1.1 2015 | -------------------------------------------------------------------------------- /Sublist3r/subbrute/subbrute.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # 3 | #SubBrute v1.2 4 | #A (very) fast subdomain enumeration tool. 5 | # 6 | #Maintained by rook 7 | #Contributors: 8 | #JordanMilne, KxCode, rc0r, memoryprint, ppaulojr 9 | # 10 | import re 11 | import optparse 12 | import os 13 | import signal 14 | import sys 15 | import uuid 16 | import random 17 | import ctypes 18 | import dns.resolver 19 | import dns.rdatatype 20 | import json 21 | 22 | #Python 2.x and 3.x compatiablity 23 | #We need the Queue library for exception handling 24 | try: 25 | import queue as Queue 26 | except: 27 | import Queue 28 | 29 | #The 'multiprocessing' library does not rely upon a Global Interpreter Lock (GIL) 30 | import multiprocessing 31 | 32 | #Microsoft compatiablity 33 | if sys.platform.startswith('win'): 34 | #Drop-in replacement, subbrute + multiprocessing throws exceptions on windows. 35 | import threading 36 | multiprocessing.Process = threading.Thread 37 | 38 | class verify_nameservers(multiprocessing.Process): 39 | 40 | def __init__(self, target, record_type, resolver_q, resolver_list, wildcards): 41 | multiprocessing.Process.__init__(self, target = self.run) 42 | self.daemon = True 43 | signal_init() 44 | 45 | self.time_to_die = False 46 | self.resolver_q = resolver_q 47 | self.wildcards = wildcards 48 | #Do we need wildcards for other types of records? 49 | #This needs testing! 50 | self.record_type = "A" 51 | if record_type == "AAAA": 52 | self.record_type = record_type 53 | self.resolver_list = resolver_list 54 | resolver = dns.resolver.Resolver() 55 | #The domain provided by the user. 56 | self.target = target 57 | #1 website in the world, modify the following line when this status changes. 58 | #www.google.cn, I'm looking at you ;) 59 | self.most_popular_website = "www.google.com" 60 | #We shouldn't need the backup_resolver, but we we can use them if need be. 61 | #We must have a resolver, and localhost can work in some environments. 62 | self.backup_resolver = resolver.nameservers + ['127.0.0.1', '8.8.8.8', '8.8.4.4'] 63 | #Ideally a nameserver should respond in less than 1 sec. 64 | resolver.timeout = 1 65 | resolver.lifetime = 1 66 | try: 67 | #Lets test the letancy of our connection. 68 | #Google's DNS server should be an ideal time test. 69 | resolver.nameservers = ['8.8.8.8'] 70 | resolver.query(self.most_popular_website, self.record_type) 71 | except: 72 | #Our connection is slower than a junebug in molasses 73 | resolver = dns.resolver.Resolver() 74 | self.resolver = resolver 75 | 76 | def end(self): 77 | self.time_to_die = True 78 | 79 | #This process cannot block forever, it needs to check if its time to die. 80 | def add_nameserver(self, nameserver): 81 | keep_trying = True 82 | while not self.time_to_die and keep_trying: 83 | try: 84 | self.resolver_q.put(nameserver, timeout = 1) 85 | trace("Added nameserver:", nameserver) 86 | keep_trying = False 87 | except Exception as e: 88 | if type(e) == Queue.Full or str(type(e)) == "": 89 | keep_trying = True 90 | 91 | def verify(self, nameserver_list): 92 | added_resolver = False 93 | for server in nameserver_list: 94 | if self.time_to_die: 95 | #We are done here. 96 | break 97 | server = server.strip() 98 | if server: 99 | self.resolver.nameservers = [server] 100 | try: 101 | #test_result = self.resolver.query(self.most_popular_website, "A") 102 | #should throw an exception before this line. 103 | if True:#test_result: 104 | #Only add the nameserver to the queue if we can detect wildcards. 105 | if(self.find_wildcards(self.target)):# and self.find_wildcards(".com") 106 | #wildcards have been added to the set, it is now safe to be added to the queue. 107 | #blocking queue, this process will halt on put() when the queue is full: 108 | self.add_nameserver(server) 109 | added_resolver = True 110 | else: 111 | trace("Rejected nameserver - wildcard:", server) 112 | except Exception as e: 113 | #Rejected server :( 114 | trace("Rejected nameserver - unreliable:", server, type(e)) 115 | return added_resolver 116 | 117 | def run(self): 118 | #Every user will get a different set of resovlers, this helps redistribute traffic. 119 | random.shuffle(self.resolver_list) 120 | if not self.verify(self.resolver_list): 121 | #This should never happen, inform the user. 122 | sys.stderr.write('Warning: No nameservers found, trying fallback list.\n') 123 | #Try and fix it for the user: 124 | self.verify(self.backup_resolver) 125 | #End of the resolvers list. 126 | try: 127 | self.resolver_q.put(False, timeout = 1) 128 | except: 129 | pass 130 | 131 | #Only add the nameserver to the queue if we can detect wildcards. 132 | #Returns False on error. 133 | def find_wildcards(self, host): 134 | #We want sovle the following three problems: 135 | #1)The target might have a wildcard DNS record. 136 | #2)The target maybe using geolocaiton-aware DNS. 137 | #3)The DNS server we are testing may respond to non-exsistant 'A' records with advertizements. 138 | #I have seen a CloudFlare Enterprise customer with the first two conditions. 139 | try: 140 | #This is case #3, these spam nameservers seem to be more trouble then they are worth. 141 | wildtest = self.resolver.query(uuid.uuid4().hex + ".com", "A") 142 | if len(wildtest): 143 | trace("Spam DNS detected:", host) 144 | return False 145 | except: 146 | pass 147 | test_counter = 8 148 | looking_for_wildcards = True 149 | while looking_for_wildcards and test_counter >= 0 : 150 | looking_for_wildcards = False 151 | #Don't get lost, this nameserver could be playing tricks. 152 | test_counter -= 1 153 | try: 154 | testdomain = "%s.%s" % (uuid.uuid4().hex, host) 155 | wildtest = self.resolver.query(testdomain, self.record_type) 156 | #This 'A' record may contain a list of wildcards. 157 | if wildtest: 158 | for w in wildtest: 159 | w = str(w) 160 | if w not in self.wildcards: 161 | #wildcards were detected. 162 | self.wildcards[w] = None 163 | #We found atleast one wildcard, look for more. 164 | looking_for_wildcards = True 165 | except Exception as e: 166 | if type(e) == dns.resolver.NXDOMAIN or type(e) == dns.name.EmptyLabel: 167 | #not found 168 | return True 169 | else: 170 | #This resolver maybe flakey, we don't want it for our tests. 171 | trace("wildcard exception:", self.resolver.nameservers, type(e)) 172 | return False 173 | #If we hit the end of our depth counter and, 174 | #there are still wildcards, then reject this nameserver because it smells bad. 175 | return (test_counter >= 0) 176 | 177 | class lookup(multiprocessing.Process): 178 | 179 | def __init__(self, in_q, out_q, resolver_q, domain, wildcards, spider_blacklist): 180 | multiprocessing.Process.__init__(self, target = self.run) 181 | signal_init() 182 | self.required_nameservers = 16 183 | self.in_q = in_q 184 | self.out_q = out_q 185 | self.resolver_q = resolver_q 186 | self.domain = domain 187 | self.wildcards = wildcards 188 | self.spider_blacklist = spider_blacklist 189 | self.resolver = dns.resolver.Resolver() 190 | #Force pydns to use our nameservers 191 | self.resolver.nameservers = [] 192 | 193 | def get_ns(self): 194 | ret = [] 195 | try: 196 | ret = [self.resolver_q.get_nowait()] 197 | if ret == False: 198 | #Queue is empty, inform the rest. 199 | self.resolver_q.put(False) 200 | ret = [] 201 | except: 202 | pass 203 | return ret 204 | 205 | def get_ns_blocking(self): 206 | ret = [] 207 | ret = [self.resolver_q.get()] 208 | if ret == False: 209 | trace("get_ns_blocking - Resolver list is empty.") 210 | #Queue is empty, inform the rest. 211 | self.resolver_q.put(False) 212 | ret = [] 213 | return ret 214 | 215 | def check(self, host, record_type = "A", retries = 0): 216 | trace("Checking:", host) 217 | cname_record = [] 218 | retries = 0 219 | if len(self.resolver.nameservers) <= self.required_nameservers: 220 | #This process needs more nameservers, lets see if we have one avaible 221 | self.resolver.nameservers += self.get_ns() 222 | #Ok we should be good to go. 223 | while True: 224 | try: 225 | #Query the nameserver, this is not simple... 226 | if not record_type or record_type == "A": 227 | resp = self.resolver.query(host) 228 | #Crawl the response 229 | hosts = extract_hosts(str(resp.response), self.domain) 230 | for h in hosts: 231 | if h not in self.spider_blacklist: 232 | self.spider_blacklist[h]=None 233 | trace("Found host with spider:", h) 234 | self.in_q.put((h, record_type, 0)) 235 | return resp 236 | if record_type == "CNAME": 237 | #A max 20 lookups 238 | for x in range(20): 239 | try: 240 | resp = self.resolver.query(host, record_type) 241 | except dns.resolver.NoAnswer: 242 | resp = False 243 | pass 244 | if resp and resp[0]: 245 | host = str(resp[0]).rstrip(".") 246 | cname_record.append(host) 247 | else: 248 | return cname_record 249 | else: 250 | #All other records: 251 | return self.resolver.query(host, record_type) 252 | 253 | except Exception as e: 254 | if type(e) == dns.resolver.NoNameservers: 255 | #We should never be here. 256 | #We must block, another process should try this host. 257 | #do we need a limit? 258 | self.in_q.put((host, record_type, 0)) 259 | self.resolver.nameservers += self.get_ns_blocking() 260 | return False 261 | elif type(e) == dns.resolver.NXDOMAIN: 262 | #"Non-existent domain name." 263 | return False 264 | elif type(e) == dns.resolver.NoAnswer: 265 | #"The response did not contain an answer." 266 | if retries >= 1: 267 | trace("NoAnswer retry") 268 | return False 269 | retries += 1 270 | elif type(e) == dns.resolver.Timeout: 271 | trace("lookup failure:", host, retries) 272 | #Check if it is time to give up. 273 | if retries >= 3: 274 | if retries > 3: 275 | #Sometimes 'internal use' subdomains will timeout for every request. 276 | #As far as I'm concerned, the authorative name server has told us this domain exists, 277 | #we just can't know the address value using this method. 278 | return ['Mutiple Query Timeout - External address resolution was restricted'] 279 | else: 280 | #Maybe another process can take a crack at it. 281 | self.in_q.put((host, record_type, retries + 1)) 282 | return False 283 | retries += 1 284 | #retry... 285 | elif type(e) == IndexError: 286 | #Some old versions of dnspython throw this error, 287 | #doesn't seem to affect the results, and it was fixed in later versions. 288 | pass 289 | elif type(e) == TypeError: 290 | # We'll get here if the number procs > number of resolvers. 291 | # This is an internal error do we need a limit? 292 | self.in_q.put((host, record_type, 0)) 293 | return False 294 | elif type(e) == dns.rdatatype.UnknownRdatatype: 295 | error("DNS record type not supported:", record_type) 296 | else: 297 | trace("Problem processing host:", host) 298 | #dnspython threw some strange exception... 299 | raise e 300 | 301 | def run(self): 302 | #This process needs one resolver before it can start looking. 303 | self.resolver.nameservers += self.get_ns_blocking() 304 | while True: 305 | found_addresses = [] 306 | work = self.in_q.get() 307 | #Check if we have hit the end marker 308 | while not work: 309 | #Look for a re-queued lookup 310 | try: 311 | work = self.in_q.get(blocking = False) 312 | #if we took the end marker of the queue we need to put it back 313 | if work: 314 | self.in_q.put(False) 315 | except:#Queue.Empty 316 | trace('End of work queue') 317 | #There isn't an item behind the end marker 318 | work = False 319 | break 320 | #Is this the end all work that needs to be done? 321 | if not work: 322 | #Perpetuate the end marker for all threads to see 323 | self.in_q.put(False) 324 | #Notify the parent that we have died of natural causes 325 | self.out_q.put(False) 326 | break 327 | else: 328 | if len(work) == 3: 329 | #keep track of how many times this lookup has timedout. 330 | (hostname, record_type, timeout_retries) = work 331 | response = self.check(hostname, record_type, timeout_retries) 332 | else: 333 | (hostname, record_type) = work 334 | response = self.check(hostname, record_type) 335 | sys.stdout.flush() 336 | trace(response) 337 | #self.wildcards is populated by the verify_nameservers() thread. 338 | #This variable doesn't need a muetex, because it has a queue. 339 | #A queue ensure nameserver cannot be used before it's wildcard entries are found. 340 | reject = False 341 | if response: 342 | for a in response: 343 | a = str(a) 344 | if a in self.wildcards: 345 | trace("resovled wildcard:", hostname) 346 | reject= True 347 | #reject this domain. 348 | break; 349 | else: 350 | found_addresses.append(a) 351 | if not reject: 352 | #This request is filled, send the results back 353 | result = (hostname, record_type, found_addresses) 354 | self.out_q.put(result) 355 | 356 | #Extract relevant hosts 357 | #The dot at the end of a domain signifies the root, 358 | #and all TLDs are subs of the root. 359 | host_match = re.compile(r"((?<=[\s])[a-zA-Z0-9_-]+\.(?:[a-zA-Z0-9_-]+\.?)+(?=[\s]))") 360 | def extract_hosts(data, hostname): 361 | #made a global to avoid re-compilation 362 | global host_match 363 | ret = [] 364 | hosts = re.findall(host_match, data) 365 | for fh in hosts: 366 | host = fh.rstrip(".") 367 | #Is this host in scope? 368 | if host.endswith(hostname): 369 | ret.append(host) 370 | return ret 371 | 372 | #Return a list of unique sub domains, sorted by frequency. 373 | #Only match domains that have 3 or more sections subdomain.domain.tld 374 | domain_match = re.compile("([a-zA-Z0-9_-]*\.[a-zA-Z0-9_-]*\.[a-zA-Z0-9_-]*)+") 375 | def extract_subdomains(file_name): 376 | #Avoid re-compilation 377 | global domain_match 378 | subs = {} 379 | sub_file = open(file_name).read() 380 | f_all = re.findall(domain_match, sub_file) 381 | del sub_file 382 | for i in f_all: 383 | if i.find(".") >= 0: 384 | p = i.split(".")[0:-1] 385 | #gobble everything that might be a TLD 386 | while p and len(p[-1]) <= 3: 387 | p = p[0:-1] 388 | #remove the domain name 389 | p = p[0:-1] 390 | #do we have a subdomain.domain left? 391 | if len(p) >= 1: 392 | trace(str(p), " : ", i) 393 | for q in p: 394 | if q : 395 | #domain names can only be lower case. 396 | q = q.lower() 397 | if q in subs: 398 | subs[q] += 1 399 | else: 400 | subs[q] = 1 401 | #Free some memory before the sort... 402 | del f_all 403 | #Sort by freq in desc order 404 | subs_sorted = sorted(subs.keys(), key = lambda x: subs[x], reverse = True) 405 | return subs_sorted 406 | 407 | def print_target(target, record_type = None, subdomains = "names.txt", resolve_list = "resolvers.txt", process_count = 16, output = False, json_output = False, found_subdomains=[],verbose=False): 408 | subdomains_list = [] 409 | results_temp = [] 410 | run(target, record_type, subdomains, resolve_list, process_count) 411 | for result in run(target, record_type, subdomains, resolve_list, process_count): 412 | (hostname, record_type, response) = result 413 | if not record_type: 414 | result = hostname 415 | else: 416 | result = "%s,%s" % (hostname, ",".join(response).strip(",")) 417 | if result not in found_subdomains: 418 | if verbose: 419 | print(result) 420 | subdomains_list.append(result) 421 | 422 | return set(subdomains_list) 423 | 424 | def run(target, record_type = None, subdomains = "names.txt", resolve_list = "resolvers.txt", process_count = 16): 425 | subdomains = check_open(subdomains) 426 | resolve_list = check_open(resolve_list) 427 | if (len(resolve_list) / 16) < process_count: 428 | sys.stderr.write('Warning: Fewer than 16 resovlers per thread, consider adding more nameservers to resolvers.txt.\n') 429 | if os.name == 'nt': 430 | wildcards = {} 431 | spider_blacklist = {} 432 | else: 433 | wildcards = multiprocessing.Manager().dict() 434 | spider_blacklist = multiprocessing.Manager().dict() 435 | in_q = multiprocessing.Queue() 436 | out_q = multiprocessing.Queue() 437 | #have a buffer of at most two new nameservers that lookup processes can draw from. 438 | resolve_q = multiprocessing.Queue(maxsize = 2) 439 | 440 | #Make a source of fast nameservers avaiable for other processes. 441 | verify_nameservers_proc = verify_nameservers(target, record_type, resolve_q, resolve_list, wildcards) 442 | verify_nameservers_proc.start() 443 | #The empty string 444 | in_q.put((target, record_type)) 445 | spider_blacklist[target]=None 446 | #A list of subdomains is the input 447 | for s in subdomains: 448 | s = str(s).strip() 449 | if s: 450 | if s.find(","): 451 | #SubBrute should be forgiving, a comma will never be in a url 452 | #but the user might try an use a CSV file as input. 453 | s=s.split(",")[0] 454 | if not s.endswith(target): 455 | hostname = "%s.%s" % (s, target) 456 | else: 457 | #A user might feed an output list as a subdomain list. 458 | hostname = s 459 | if hostname not in spider_blacklist: 460 | spider_blacklist[hostname]=None 461 | work = (hostname, record_type) 462 | in_q.put(work) 463 | #Terminate the queue 464 | in_q.put(False) 465 | for i in range(process_count): 466 | worker = lookup(in_q, out_q, resolve_q, target, wildcards, spider_blacklist) 467 | worker.start() 468 | threads_remaining = process_count 469 | while True: 470 | try: 471 | #The output is valid hostnames 472 | result = out_q.get(True, 10) 473 | #we will get an empty exception before this runs. 474 | if not result: 475 | threads_remaining -= 1 476 | else: 477 | #run() is a generator, and yields results from the work queue 478 | yield result 479 | except Exception as e: 480 | #The cx_freeze version uses queue.Empty instead of Queue.Empty :( 481 | if type(e) == Queue.Empty or str(type(e)) == "": 482 | pass 483 | else: 484 | raise(e) 485 | #make sure everyone is complete 486 | if threads_remaining <= 0: 487 | break 488 | trace("killing nameserver process") 489 | #We no longer require name servers. 490 | try: 491 | killproc(pid = verify_nameservers_proc.pid) 492 | except: 493 | #Windows threading.tread 494 | verify_nameservers_proc.end() 495 | trace("End") 496 | 497 | #exit handler for signals. So ctrl+c will work. 498 | #The 'multiprocessing' library each process is it's own process which side-steps the GIL 499 | #If the user wants to exit prematurely, each process must be killed. 500 | def killproc(signum = 0, frame = 0, pid = False): 501 | if not pid: 502 | pid = os.getpid() 503 | if sys.platform.startswith('win'): 504 | try: 505 | kernel32 = ctypes.windll.kernel32 506 | handle = kernel32.OpenProcess(1, 0, pid) 507 | kernel32.TerminateProcess(handle, 0) 508 | except: 509 | #Oah windows. 510 | pass 511 | else: 512 | os.kill(pid, 9) 513 | 514 | #Toggle debug output 515 | verbose = False 516 | def trace(*args, **kwargs): 517 | if verbose: 518 | for a in args: 519 | sys.stderr.write(str(a)) 520 | sys.stderr.write(" ") 521 | sys.stderr.write("\n") 522 | 523 | def error(*args, **kwargs): 524 | for a in args: 525 | sys.stderr.write(str(a)) 526 | sys.stderr.write(" ") 527 | sys.stderr.write("\n") 528 | sys.exit(1) 529 | 530 | def check_open(input_file): 531 | ret = [] 532 | #If we can't find a resolver from an input file, then we need to improvise. 533 | try: 534 | ret = open(input_file).readlines() 535 | except: 536 | error("File not found:", input_file) 537 | if not len(ret): 538 | error("File is empty:", input_file) 539 | return ret 540 | 541 | #Every 'multiprocessing' process needs a signal handler. 542 | #All processes need to die, we don't want to leave zombies. 543 | def signal_init(): 544 | #Escliate signal to prevent zombies. 545 | signal.signal(signal.SIGINT, killproc) 546 | try: 547 | signal.signal(signal.SIGTSTP, killproc) 548 | signal.signal(signal.SIGQUIT, killproc) 549 | except: 550 | #Windows 551 | pass 552 | 553 | if __name__ == "__main__": 554 | if getattr(sys, 'frozen', False): 555 | # cx_freeze windows: 556 | base_path = os.path.dirname(sys.executable) 557 | multiprocessing.freeze_support() 558 | else: 559 | #everything else: 560 | base_path = os.path.dirname(os.path.realpath(__file__)) 561 | parser = optparse.OptionParser("usage: %prog [options] target") 562 | parser.add_option("-s", "--subs", dest = "subs", default = os.path.join(base_path, "names.txt"), 563 | type = "string", help = "(optional) list of subdomains, default = 'names.txt'") 564 | parser.add_option("-r", "--resolvers", dest = "resolvers", default = os.path.join(base_path, "resolvers.txt"), 565 | type = "string", help = "(optional) A list of DNS resolvers, if this list is empty it will OS's internal resolver default = 'resolvers.txt'") 566 | parser.add_option("-t", "--targets_file", dest = "targets", default = "", 567 | type = "string", help = "(optional) A file containing a newline delimited list of domains to brute force.") 568 | parser.add_option("-o", "--output", dest = "output", default = False, help = "(optional) Output to file (Greppable Format)") 569 | parser.add_option("-j", "--json", dest="json", default = False, help="(optional) Output to file (JSON Format)") 570 | parser.add_option("-a", "-A", action = 'store_true', dest = "ipv4", default = False, 571 | help = "(optional) Print all IPv4 addresses for sub domains (default = off).") 572 | parser.add_option("--type", dest = "type", default = False, 573 | type = "string", help = "(optional) Print all reponses for an arbitrary DNS record type (CNAME, AAAA, TXT, SOA, MX...)") 574 | parser.add_option("-c", "--process_count", dest = "process_count", 575 | default = 16, type = "int", 576 | help = "(optional) Number of lookup theads to run. default = 16") 577 | parser.add_option("-f", "--filter_subs", dest = "filter", default = "", 578 | type = "string", help = "(optional) A file containing unorganized domain names which will be filtered into a list of subdomains sorted by frequency. This was used to build names.txt.") 579 | parser.add_option("-v", "--verbose", action = 'store_true', dest = "verbose", default = False, 580 | help = "(optional) Print debug information.") 581 | (options, args) = parser.parse_args() 582 | 583 | 584 | verbose = options.verbose 585 | 586 | if len(args) < 1 and options.filter == "" and options.targets == "": 587 | parser.error("You must provie a target. Use -h for help.") 588 | 589 | if options.filter != "": 590 | #cleanup this file and print it out 591 | for d in extract_subdomains(options.filter): 592 | print(d) 593 | sys.exit() 594 | 595 | if options.targets != "": 596 | targets = check_open(options.targets) #the domains 597 | else: 598 | targets = args #multiple arguments on the cli: ./subbrute.py google.com gmail.com yahoo.com if (len(resolver_list) / 16) < options.process_count: 599 | 600 | output = False 601 | if options.output: 602 | try: 603 | output = open(options.output, "w") 604 | except: 605 | error("Failed writing to file:", options.output) 606 | 607 | json_output = False 608 | if options.json: 609 | try: 610 | json_output = open(options.json, "w") 611 | except: 612 | error("Failed writing to file:", options.json) 613 | 614 | record_type = False 615 | if options.ipv4: 616 | record_type="A" 617 | if options.type: 618 | record_type = str(options.type).upper() 619 | 620 | threads = [] 621 | for target in targets: 622 | target = target.strip() 623 | if target: 624 | 625 | #target => domain 626 | #record_type => 627 | #options.subs => file the contain the subdomains list 628 | #options.process_count => process count default = 16 629 | #options.resolvers => the resolvers file 630 | #options.output 631 | #options.json 632 | print(target, record_type, options.subs, options.resolvers, options.process_count, output, json_output) 633 | print_target(target, record_type, options.subs, options.resolvers, options.process_count, output, json_output) 634 | 635 | 636 | -------------------------------------------------------------------------------- /Sublist3r/sublist3r.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding: utf-8 3 | # Sublist3r v1.0 4 | # By Ahmed Aboul-Ela - twitter.com/aboul3la 5 | 6 | # modules in standard library 7 | import re 8 | import sys 9 | import os 10 | import argparse 11 | import time 12 | import hashlib 13 | import random 14 | import multiprocessing 15 | import threading 16 | import socket 17 | import json 18 | from collections import Counter 19 | 20 | # external modules 21 | from subbrute import subbrute 22 | import dns.resolver 23 | import requests 24 | 25 | # Python 2.x and 3.x compatiablity 26 | if sys.version > '3': 27 | import urllib.parse as urlparse 28 | import urllib.parse as urllib 29 | else: 30 | import urlparse 31 | import urllib 32 | 33 | # In case you cannot install some of the required development packages 34 | # there's also an option to disable the SSL warning: 35 | try: 36 | import requests.packages.urllib3 37 | requests.packages.urllib3.disable_warnings() 38 | except: 39 | pass 40 | 41 | # Check if we are running this on windows platform 42 | is_windows = sys.platform.startswith('win') 43 | 44 | # Console Colors 45 | if is_windows: 46 | # Windows deserves coloring too :D 47 | G = '\033[92m' # green 48 | Y = '\033[93m' # yellow 49 | B = '\033[94m' # blue 50 | R = '\033[91m' # red 51 | W = '\033[0m' # white 52 | try: 53 | import win_unicode_console , colorama 54 | win_unicode_console.enable() 55 | colorama.init() 56 | #Now the unicode will work ^_^ 57 | except: 58 | print("[!] Error: Coloring libraries not installed, no coloring will be used [Check the readme]") 59 | G = Y = B = R = W = G = Y = B = R = W = '' 60 | 61 | 62 | else: 63 | G = '\033[92m' # green 64 | Y = '\033[93m' # yellow 65 | B = '\033[94m' # blue 66 | R = '\033[91m' # red 67 | W = '\033[0m' # white 68 | 69 | 70 | def banner(): 71 | print ' ' 72 | # print("""%s 73 | # ____ _ _ _ _ _____ 74 | # / ___| _ _| |__ | (_)___| |_|___ / _ __ 75 | # \___ \| | | | '_ \| | / __| __| |_ \| '__| 76 | # ___) | |_| | |_) | | \__ \ |_ ___) | | 77 | # |____/ \__,_|_.__/|_|_|___/\__|____/|_|%s%s 78 | # 79 | # # Coded By Ahmed Aboul-Ela - @aboul3la 80 | # """ % (R, W, Y)) 81 | 82 | 83 | def parser_error(errmsg): 84 | banner() 85 | print("Usage: python " + sys.argv[0] + " [Options] use -h for help") 86 | print(R + "Error: " + errmsg + W) 87 | sys.exit() 88 | 89 | 90 | def parse_args(): 91 | # parse the arguments 92 | parser = argparse.ArgumentParser(epilog='\tExample: \r\npython ' + sys.argv[0] + " -d google.com") 93 | parser.error = parser_error 94 | parser._optionals.title = "OPTIONS" 95 | parser.add_argument('-d', '--domain', help="Domain name to enumerate it's subdomains", required=True) 96 | parser.add_argument('-b', '--bruteforce', help='Enable the subbrute bruteforce module', nargs='?', default=False) 97 | parser.add_argument('-p', '--ports', help='Scan the found subdomains against specified tcp ports') 98 | parser.add_argument('-v', '--verbose', help='Enable Verbosity and display results in realtime', nargs='?', default=False) 99 | parser.add_argument('-t', '--threads', help='Number of threads to use for subbrute bruteforce', type=int, default=30) 100 | parser.add_argument('-e', '--engines', help='Specify a comma-separated list of search engines') 101 | parser.add_argument('-o', '--output', help='Save the results to text file') 102 | return parser.parse_args() 103 | 104 | 105 | def write_file(filename, subdomains): 106 | # saving subdomains results to output file 107 | print("%s[-] Saving results to file: %s%s%s%s" % (Y, W, R, filename, W)) 108 | with open(str(filename), 'wt') as f: 109 | for subdomain in subdomains: 110 | f.write(subdomain + os.linesep) 111 | 112 | 113 | def subdomain_sorting_key(hostname): 114 | """Sorting key for subdomains 115 | 116 | This sorting key orders subdomains from the top-level domain at the right 117 | reading left, then moving '^' and 'www' to the top of their group. For 118 | example, the following list is sorted correctly: 119 | 120 | [ 121 | 'example.com', 122 | 'www.example.com', 123 | 'a.example.com', 124 | 'www.a.example.com', 125 | 'b.a.example.com', 126 | 'b.example.com', 127 | 'example.net', 128 | 'www.example.net', 129 | 'a.example.net', 130 | ] 131 | 132 | """ 133 | parts = hostname.split('.')[::-1] 134 | if parts[-1] == 'www': 135 | return parts[:-1], 1 136 | return parts, 0 137 | 138 | 139 | class enumratorBase(object): 140 | def __init__(self, base_url, engine_name, domain, subdomains=None, silent=False, verbose=True): 141 | subdomains = subdomains or [] 142 | self.domain = urlparse.urlparse(domain).netloc 143 | self.session = requests.Session() 144 | self.subdomains = [] 145 | self.timeout = 25 146 | self.base_url = base_url 147 | self.engine_name = engine_name 148 | self.silent = silent 149 | self.verbose = verbose 150 | self.headers = { 151 | 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36', 152 | 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 153 | 'Accept-Language': 'en-US,en;q=0.8', 154 | 'Accept-Encoding': 'gzip', 155 | } 156 | self.print_banner() 157 | 158 | def print_(self, text): 159 | if not self.silent: 160 | print(text) 161 | return 162 | 163 | def print_banner(self): 164 | """ subclass can override this if they want a fancy banner :)""" 165 | self.print_(G + "[-] Searching now in %s.." % (self.engine_name) + W) 166 | return 167 | 168 | def send_req(self, query, page_no=1): 169 | 170 | url = self.base_url.format(query=query, page_no=page_no) 171 | try: 172 | resp = self.session.get(url, headers=self.headers, timeout=self.timeout) 173 | except Exception: 174 | resp = None 175 | return self.get_response(resp) 176 | 177 | def get_response(self, response): 178 | if response is None: 179 | return 0 180 | return response.text if hasattr(response, "text") else response.content 181 | 182 | def check_max_subdomains(self, count): 183 | if self.MAX_DOMAINS == 0: 184 | return False 185 | return count >= self.MAX_DOMAINS 186 | 187 | def check_max_pages(self, num): 188 | if self.MAX_PAGES == 0: 189 | return False 190 | return num >= self.MAX_PAGES 191 | 192 | # override 193 | def extract_domains(self, resp): 194 | """ chlid class should override this function """ 195 | return 196 | 197 | # override 198 | def check_response_errors(self, resp): 199 | """ chlid class should override this function 200 | The function should return True if there are no errors and False otherwise 201 | """ 202 | return True 203 | 204 | def should_sleep(self): 205 | """Some enumrators require sleeping to avoid bot detections like Google enumerator""" 206 | return 207 | 208 | def generate_query(self): 209 | """ chlid class should override this function """ 210 | return 211 | 212 | def get_page(self, num): 213 | """ chlid class that user different pagnation counter should override this function """ 214 | return num + 10 215 | 216 | def enumerate(self, altquery=False): 217 | flag = True 218 | page_no = 0 219 | prev_links = [] 220 | retries = 0 221 | 222 | while flag: 223 | query = self.generate_query() 224 | count = query.count(self.domain) # finding the number of subdomains found so far 225 | 226 | # if they we reached the maximum number of subdomains in search query 227 | # then we should go over the pages 228 | if self.check_max_subdomains(count): 229 | page_no = self.get_page(page_no) 230 | 231 | if self.check_max_pages(page_no): # maximum pages for Google to avoid getting blocked 232 | return self.subdomains 233 | resp = self.send_req(query, page_no) 234 | 235 | # check if there is any error occured 236 | if not self.check_response_errors(resp): 237 | return self.subdomains 238 | links = self.extract_domains(resp) 239 | 240 | # if the previous page hyperlinks was the similar to the current one, then maybe we have reached the last page 241 | if links == prev_links: 242 | retries += 1 243 | page_no = self.get_page(page_no) 244 | 245 | # make another retry maybe it isn't the last page 246 | if retries >= 3: 247 | return self.subdomains 248 | 249 | prev_links = links 250 | self.should_sleep() 251 | 252 | return self.subdomains 253 | 254 | 255 | class enumratorBaseThreaded(multiprocessing.Process, enumratorBase): 256 | def __init__(self, base_url, engine_name, domain, subdomains=None, q=None, lock=threading.Lock(), silent=False, verbose=True): 257 | subdomains = subdomains or [] 258 | enumratorBase.__init__(self, base_url, engine_name, domain, subdomains, silent=silent, verbose=verbose) 259 | multiprocessing.Process.__init__(self) 260 | self.lock = lock 261 | self.q = q 262 | return 263 | 264 | def run(self): 265 | domain_list = self.enumerate() 266 | for domain in domain_list: 267 | self.q.append(domain) 268 | 269 | 270 | class GoogleEnum(enumratorBaseThreaded): 271 | def __init__(self, domain, subdomains=None, q=None, silent=False, verbose=True): 272 | subdomains = subdomains or [] 273 | base_url = "https://google.com/search?q={query}&btnG=Search&hl=en-US&biw=&bih=&gbv=1&start={page_no}&filter=0" 274 | self.engine_name = "Google" 275 | self.MAX_DOMAINS = 11 276 | self.MAX_PAGES = 200 277 | super(GoogleEnum, self).__init__(base_url, self.engine_name, domain, subdomains, q=q, silent=silent, verbose=verbose) 278 | self.q = q 279 | return 280 | 281 | def extract_domains(self, resp): 282 | links_list = list() 283 | link_regx = re.compile('(.*?)<\/cite>') 284 | try: 285 | links_list = link_regx.findall(resp) 286 | for link in links_list: 287 | link = re.sub('', '', link) 288 | if not link.startswith('http'): 289 | link = "http://" + link 290 | subdomain = urlparse.urlparse(link).netloc 291 | if subdomain and subdomain not in self.subdomains and subdomain != self.domain: 292 | if self.verbose: 293 | self.print_("%s%s: %s%s" % (R, self.engine_name, W, subdomain)) 294 | self.subdomains.append(subdomain.strip()) 295 | except Exception: 296 | pass 297 | return links_list 298 | 299 | def check_response_errors(self, resp): 300 | if (type(resp) is str or type(resp) is unicode) and 'Our systems have detected unusual traffic' in resp: 301 | self.print_(R + "[!] Error: Google probably now is blocking our requests" + W) 302 | self.print_(R + "[~] Finished now the Google Enumeration ..." + W) 303 | return False 304 | return True 305 | 306 | def should_sleep(self): 307 | time.sleep(5) 308 | return 309 | 310 | def generate_query(self): 311 | if self.subdomains: 312 | fmt = 'site:{domain} -www.{domain} -{found}' 313 | found = ' -'.join(self.subdomains[:self.MAX_DOMAINS - 2]) 314 | query = fmt.format(domain=self.domain, found=found) 315 | else: 316 | query = "site:{domain} -www.{domain}".format(domain=self.domain) 317 | return query 318 | 319 | 320 | class YahooEnum(enumratorBaseThreaded): 321 | def __init__(self, domain, subdomains=None, q=None, silent=False, verbose=True): 322 | subdomains = subdomains or [] 323 | base_url = "https://search.yahoo.com/search?p={query}&b={page_no}" 324 | self.engine_name = "Yahoo" 325 | self.MAX_DOMAINS = 10 326 | self.MAX_PAGES = 0 327 | super(YahooEnum, self).__init__(base_url, self.engine_name, domain, subdomains, q=q, silent=silent, verbose=verbose) 328 | self.q = q 329 | return 330 | 331 | def extract_domains(self, resp): 332 | link_regx2 = re.compile('(.*?)') 333 | link_regx = re.compile('(.*?)') 334 | links_list = [] 335 | try: 336 | links = link_regx.findall(resp) 337 | links2 = link_regx2.findall(resp) 338 | links_list = links + links2 339 | for link in links_list: 340 | link = re.sub("<(\/)?b>", "", link) 341 | if not link.startswith('http'): 342 | link = "http://" + link 343 | subdomain = urlparse.urlparse(link).netloc 344 | if not subdomain.endswith(self.domain): 345 | continue 346 | if subdomain and subdomain not in self.subdomains and subdomain != self.domain: 347 | if self.verbose: 348 | self.print_("%s%s: %s%s" % (R, self.engine_name, W, subdomain)) 349 | self.subdomains.append(subdomain.strip()) 350 | except Exception: 351 | pass 352 | 353 | return links_list 354 | 355 | def should_sleep(self): 356 | return 357 | 358 | def get_page(self, num): 359 | return num + 10 360 | 361 | def generate_query(self): 362 | if self.subdomains: 363 | fmt = 'site:{domain} -domain:www.{domain} -domain:{found}' 364 | found = ' -domain:'.join(self.subdomains[:77]) 365 | query = fmt.format(domain=self.domain, found=found) 366 | else: 367 | query = "site:{domain}".format(domain=self.domain) 368 | return query 369 | 370 | 371 | class AskEnum(enumratorBaseThreaded): 372 | def __init__(self, domain, subdomains=None, q=None, silent=False, verbose=True): 373 | subdomains = subdomains or [] 374 | base_url = 'http://www.ask.com/web?q={query}&page={page_no}&qid=8D6EE6BF52E0C04527E51F64F22C4534&o=0&l=dir&qsrc=998&qo=pagination' 375 | self.engine_name = "Ask" 376 | self.MAX_DOMAINS = 11 377 | self.MAX_PAGES = 0 378 | enumratorBaseThreaded.__init__(self, base_url, self.engine_name, domain, subdomains, q=q, silent=silent, verbose=verbose) 379 | self.q = q 380 | return 381 | 382 | def extract_domains(self, resp): 383 | links_list = list() 384 | link_regx = re.compile('

(.*?)

') 385 | try: 386 | links_list = link_regx.findall(resp) 387 | for link in links_list: 388 | if not link.startswith('http'): 389 | link = "http://" + link 390 | subdomain = urlparse.urlparse(link).netloc 391 | if subdomain not in self.subdomains and subdomain != self.domain: 392 | if self.verbose: 393 | self.print_("%s%s: %s%s" % (R, self.engine_name, W, subdomain)) 394 | self.subdomains.append(subdomain.strip()) 395 | except Exception: 396 | pass 397 | 398 | return links_list 399 | 400 | def get_page(self, num): 401 | return num + 1 402 | 403 | def generate_query(self): 404 | if self.subdomains: 405 | fmt = 'site:{domain} -www.{domain} -{found}' 406 | found = ' -'.join(self.subdomains[:self.MAX_DOMAINS]) 407 | query = fmt.format(domain=self.domain, found=found) 408 | else: 409 | query = "site:{domain} -www.{domain}".format(domain=self.domain) 410 | 411 | return query 412 | 413 | 414 | class BingEnum(enumratorBaseThreaded): 415 | def __init__(self, domain, subdomains=None, q=None, silent=False, verbose=True): 416 | subdomains = subdomains or [] 417 | base_url = 'https://www.bing.com/search?q={query}&go=Submit&first={page_no}' 418 | self.engine_name = "Bing" 419 | self.MAX_DOMAINS = 30 420 | self.MAX_PAGES = 0 421 | enumratorBaseThreaded.__init__(self, base_url, self.engine_name, domain, subdomains, q=q, silent=silent) 422 | self.q = q 423 | self.verbose = verbose 424 | return 425 | 426 | def extract_domains(self, resp): 427 | links_list = list() 428 | link_regx = re.compile('
  • ||<|>', '', link) 437 | if not link.startswith('http'): 438 | link = "http://" + link 439 | subdomain = urlparse.urlparse(link).netloc 440 | if subdomain not in self.subdomains and subdomain != self.domain: 441 | if self.verbose: 442 | self.print_("%s%s: %s%s" % (R, self.engine_name, W, subdomain)) 443 | self.subdomains.append(subdomain.strip()) 444 | except Exception: 445 | pass 446 | 447 | return links_list 448 | 449 | def generate_query(self): 450 | if self.subdomains: 451 | fmt = 'domain:{domain} -www.{domain} -{found}' 452 | found = ' -'.join(self.subdomains[:self.MAX_DOMAINS]) 453 | query = fmt.format(domain=self.domain, found=found) 454 | else: 455 | query = "domain:{domain} -www.{domain}".format(domain=self.domain) 456 | return query 457 | 458 | 459 | class BaiduEnum(enumratorBaseThreaded): 460 | def __init__(self, domain, subdomains=None, q=None, silent=False, verbose=True): 461 | subdomains = subdomains or [] 462 | base_url = 'https://www.baidu.com/s?pn={page_no}&wd={query}&oq={query}' 463 | self.engine_name = "Baidu" 464 | self.MAX_DOMAINS = 2 465 | self.MAX_PAGES = 760 466 | enumratorBaseThreaded.__init__(self, base_url, self.engine_name, domain, subdomains, q=q, silent=silent, verbose=verbose) 467 | self.querydomain = self.domain 468 | self.q = q 469 | return 470 | 471 | def extract_domains(self, resp): 472 | links = list() 473 | found_newdomain = False 474 | subdomain_list = [] 475 | link_regx = re.compile('(.*?)') 476 | try: 477 | links = link_regx.findall(resp) 478 | for link in links: 479 | link = re.sub('<.*?>|>|<| ', '', link) 480 | if not link.startswith('http'): 481 | link = "http://" + link 482 | subdomain = urlparse.urlparse(link).netloc 483 | if subdomain.endswith(self.domain): 484 | subdomain_list.append(subdomain) 485 | if subdomain not in self.subdomains and subdomain != self.domain: 486 | found_newdomain = True 487 | if self.verbose: 488 | self.print_("%s%s: %s%s" % (R, self.engine_name, W, subdomain)) 489 | self.subdomains.append(subdomain.strip()) 490 | except Exception: 491 | pass 492 | if not found_newdomain and subdomain_list: 493 | self.querydomain = self.findsubs(subdomain_list) 494 | return links 495 | 496 | def findsubs(self, subdomains): 497 | count = Counter(subdomains) 498 | subdomain1 = max(count, key=count.get) 499 | count.pop(subdomain1, "None") 500 | subdomain2 = max(count, key=count.get) if count else '' 501 | return (subdomain1, subdomain2) 502 | 503 | def check_response_errors(self, resp): 504 | return True 505 | 506 | def should_sleep(self): 507 | time.sleep(random.randint(2, 5)) 508 | return 509 | 510 | def generate_query(self): 511 | if self.subdomains and self.querydomain != self.domain: 512 | found = ' -site:'.join(self.querydomain) 513 | query = "site:{domain} -site:www.{domain} -site:{found} ".format(domain=self.domain, found=found) 514 | else: 515 | query = "site:{domain} -site:www.{domain}".format(domain=self.domain) 516 | return query 517 | 518 | 519 | class NetcraftEnum(enumratorBaseThreaded): 520 | def __init__(self, domain, subdomains=None, q=None, silent=False, verbose=True): 521 | subdomains = subdomains or [] 522 | self.base_url = 'https://searchdns.netcraft.com/?restriction=site+ends+with&host={domain}' 523 | self.engine_name = "Netcraft" 524 | self.lock = threading.Lock() 525 | super(NetcraftEnum, self).__init__(self.base_url, self.engine_name, domain, subdomains, q=q, silent=silent, verbose=verbose) 526 | self.q = q 527 | return 528 | 529 | def req(self, url, cookies=None): 530 | cookies = cookies or {} 531 | try: 532 | resp = self.session.get(url, headers=self.headers, timeout=self.timeout, cookies=cookies) 533 | except Exception as e: 534 | self.print_(e) 535 | resp = None 536 | return resp 537 | 538 | def get_next(self, resp): 539 | link_regx = re.compile('Next page') 540 | link = link_regx.findall(resp) 541 | link = re.sub('host=.*?%s' % self.domain, 'host=%s' % self.domain, link[0]) 542 | url = 'http://searchdns.netcraft.com' + link 543 | return url 544 | 545 | def create_cookies(self, cookie): 546 | cookies = dict() 547 | cookies_list = cookie[0:cookie.find(';')].split("=") 548 | cookies[cookies_list[0]] = cookies_list[1] 549 | # hashlib.sha1 requires utf-8 encoded str 550 | cookies['netcraft_js_verification_response'] = hashlib.sha1(urllib.unquote(cookies_list[1]).encode('utf-8')).hexdigest() 551 | return cookies 552 | 553 | def get_cookies(self, headers): 554 | if 'set-cookie' in headers: 555 | cookies = self.create_cookies(headers['set-cookie']) 556 | else: 557 | cookies = {} 558 | return cookies 559 | 560 | def enumerate(self): 561 | start_url = self.base_url.format(domain='example.com') 562 | resp = self.req(start_url) 563 | cookies = self.get_cookies(resp.headers) 564 | url = self.base_url.format(domain=self.domain) 565 | while True: 566 | resp = self.get_response(self.req(url, cookies)) 567 | self.extract_domains(resp) 568 | if 'Next page' not in resp: 569 | return self.subdomains 570 | break 571 | url = self.get_next(resp) 572 | 573 | def extract_domains(self, resp): 574 | links_list = list() 575 | link_regx = re.compile('') 576 | try: 577 | links_list = link_regx.findall(resp) 578 | for link in links_list: 579 | subdomain = urlparse.urlparse(link).netloc 580 | if not subdomain.endswith(self.domain): 581 | continue 582 | if subdomain and subdomain not in self.subdomains and subdomain != self.domain: 583 | if self.verbose: 584 | self.print_("%s%s: %s%s" % (R, self.engine_name, W, subdomain)) 585 | self.subdomains.append(subdomain.strip()) 586 | except Exception: 587 | pass 588 | return links_list 589 | 590 | 591 | class DNSdumpster(enumratorBaseThreaded): 592 | def __init__(self, domain, subdomains=None, q=None, silent=False, verbose=True): 593 | subdomains = subdomains or [] 594 | base_url = 'https://dnsdumpster.com/' 595 | self.live_subdomains = [] 596 | self.engine_name = "DNSdumpster" 597 | self.threads = 70 598 | self.lock = threading.BoundedSemaphore(value=self.threads) 599 | self.q = q 600 | super(DNSdumpster, self).__init__(base_url, self.engine_name, domain, subdomains, q=q, silent=silent, verbose=verbose) 601 | return 602 | 603 | def check_host(self, host): 604 | is_valid = False 605 | Resolver = dns.resolver.Resolver() 606 | Resolver.nameservers = ['8.8.8.8', '8.8.4.4'] 607 | self.lock.acquire() 608 | try: 609 | ip = Resolver.query(host, 'A')[0].to_text() 610 | if ip: 611 | if self.verbose: 612 | self.print_("%s%s: %s%s" % (R, self.engine_name, W, host)) 613 | is_valid = True 614 | self.live_subdomains.append(host) 615 | except: 616 | pass 617 | self.lock.release() 618 | return is_valid 619 | 620 | def req(self, req_method, url, params=None): 621 | params = params or {} 622 | headers = dict(self.headers) 623 | headers['Referer'] = 'https://dnsdumpster.com' 624 | try: 625 | if req_method == 'GET': 626 | resp = self.session.get(url, headers=headers, timeout=self.timeout) 627 | else: 628 | resp = self.session.post(url, data=params, headers=headers, timeout=self.timeout) 629 | except Exception as e: 630 | self.print_(e) 631 | resp = None 632 | return self.get_response(resp) 633 | 634 | def get_csrftoken(self, resp): 635 | try: 636 | csrf_regex = re.compile("", re.S) 637 | token = csrf_regex.findall(resp)[0] 638 | return token.strip() 639 | except: 640 | return 641 | 642 | def enumerate(self): 643 | resp = self.req('GET', self.base_url) 644 | token = self.get_csrftoken(resp) 645 | params = {'csrfmiddlewaretoken': token, 'targetip': self.domain} 646 | post_resp = self.req('POST', self.base_url, params) 647 | self.extract_domains(post_resp) 648 | for subdomain in self.subdomains: 649 | t = threading.Thread(target=self.check_host, args=(subdomain,)) 650 | t.start() 651 | t.join() 652 | return self.live_subdomains 653 | 654 | def extract_domains(self, resp): 655 | tbl_regex = re.compile('<\/a>Host Records.*?(.*?)', re.S) 656 | link_regex = re.compile('(.*?)
    ', re.S) 657 | links = [] 658 | try: 659 | results_tbl = tbl_regex.findall(resp)[0] 660 | except IndexError: 661 | results_tbl = '' 662 | links_list = link_regex.findall(results_tbl) 663 | links = list(set(links_list)) 664 | for link in links: 665 | subdomain = link.strip() 666 | if not subdomain.endswith(self.domain): 667 | continue 668 | if subdomain and subdomain not in self.subdomains and subdomain != self.domain: 669 | self.subdomains.append(subdomain.strip()) 670 | return links 671 | 672 | 673 | class Virustotal(enumratorBaseThreaded): 674 | def __init__(self, domain, subdomains=None, q=None, silent=False, verbose=True): 675 | subdomains = subdomains or [] 676 | base_url = 'https://www.virustotal.com/en/domain/{domain}/information/' 677 | self.engine_name = "Virustotal" 678 | self.lock = threading.Lock() 679 | self.q = q 680 | super(Virustotal, self).__init__(base_url, self.engine_name, domain, subdomains, q=q, silent=silent, verbose=verbose) 681 | return 682 | 683 | # the main send_req need to be rewritten 684 | def send_req(self, url): 685 | try: 686 | resp = self.session.get(url, headers=self.headers, timeout=self.timeout) 687 | except Exception as e: 688 | self.print_(e) 689 | resp = None 690 | 691 | return self.get_response(resp) 692 | 693 | # once the send_req is rewritten we don't need to call this function, the stock one should be ok 694 | def enumerate(self): 695 | url = self.base_url.format(domain=self.domain) 696 | resp = self.send_req(url) 697 | self.extract_domains(resp) 698 | return self.subdomains 699 | 700 | def extract_domains(self, resp): 701 | link_regx = re.compile('
    .*?(.*?)', re.S) 702 | try: 703 | links = link_regx.findall(resp) 704 | for link in links: 705 | subdomain = link.strip() 706 | if not subdomain.endswith(self.domain): 707 | continue 708 | if subdomain not in self.subdomains and subdomain != self.domain: 709 | if self.verbose: 710 | self.print_("%s%s: %s%s" % (R, self.engine_name, W, subdomain)) 711 | self.subdomains.append(subdomain.strip()) 712 | except Exception: 713 | pass 714 | 715 | 716 | class ThreatCrowd(enumratorBaseThreaded): 717 | def __init__(self, domain, subdomains=None, q=None, silent=False, verbose=True): 718 | subdomains = subdomains or [] 719 | base_url = 'https://www.threatcrowd.org/searchApi/v2/domain/report/?domain={domain}' 720 | self.engine_name = "ThreatCrowd" 721 | self.lock = threading.Lock() 722 | self.q = q 723 | super(ThreatCrowd, self).__init__(base_url, self.engine_name, domain, subdomains, q=q, silent=silent, verbose=verbose) 724 | return 725 | 726 | def req(self, url): 727 | try: 728 | resp = self.session.get(url, headers=self.headers, timeout=self.timeout) 729 | except Exception: 730 | resp = None 731 | 732 | return self.get_response(resp) 733 | 734 | def enumerate(self): 735 | url = self.base_url.format(domain=self.domain) 736 | resp = self.req(url) 737 | self.extract_domains(resp) 738 | return self.subdomains 739 | 740 | def extract_domains(self, resp): 741 | try: 742 | links = json.loads(resp)['subdomains'] 743 | for link in links: 744 | subdomain = link.strip() 745 | if not subdomain.endswith(self.domain): 746 | continue 747 | if subdomain not in self.subdomains and subdomain != self.domain: 748 | if self.verbose: 749 | self.print_("%s%s: %s%s" % (R, self.engine_name, W, subdomain)) 750 | self.subdomains.append(subdomain.strip()) 751 | except Exception as e: 752 | pass 753 | 754 | 755 | class CrtSearch(enumratorBaseThreaded): 756 | def __init__(self, domain, subdomains=None, q=None, silent=False, verbose=True): 757 | subdomains = subdomains or [] 758 | base_url = 'https://crt.sh/?q=%25.{domain}' 759 | self.engine_name = "SSL Certificates" 760 | self.lock = threading.Lock() 761 | self.q = q 762 | super(CrtSearch, self).__init__(base_url, self.engine_name, domain, subdomains, q=q, silent=silent, verbose=verbose) 763 | return 764 | 765 | def req(self, url): 766 | try: 767 | resp = self.session.get(url, headers=self.headers, timeout=self.timeout) 768 | except Exception: 769 | resp = None 770 | 771 | return self.get_response(resp) 772 | 773 | def enumerate(self): 774 | url = self.base_url.format(domain=self.domain) 775 | resp = self.req(url) 776 | if resp: 777 | self.extract_domains(resp) 778 | return self.subdomains 779 | 780 | def extract_domains(self, resp): 781 | link_regx = re.compile('(.*?)') 782 | try: 783 | links = link_regx.findall(resp) 784 | for link in links: 785 | subdomain = link.strip() 786 | if not subdomain.endswith(self.domain) or '*' in subdomain: 787 | continue 788 | 789 | if '@' in subdomain: 790 | subdomain = subdomain[subdomain.find('@')+1:] 791 | 792 | if subdomain not in self.subdomains and subdomain != self.domain: 793 | if self.verbose: 794 | self.print_("%s%s: %s%s" % (R, self.engine_name, W, subdomain)) 795 | self.subdomains.append(subdomain.strip()) 796 | except Exception as e: 797 | pass 798 | 799 | 800 | class PassiveDNS(enumratorBaseThreaded): 801 | def __init__(self, domain, subdomains=None, q=None, silent=False, verbose=True): 802 | subdomains = subdomains or [] 803 | base_url = 'https://api.sublist3r.com/search.php?domain={domain}' 804 | self.engine_name = "PassiveDNS" 805 | self.lock = threading.Lock() 806 | self.q = q 807 | super(PassiveDNS, self).__init__(base_url, self.engine_name, domain, subdomains, q=q, silent=silent, verbose=verbose) 808 | return 809 | 810 | def req(self, url): 811 | try: 812 | resp = self.session.get(url, headers=self.headers, timeout=self.timeout) 813 | except Exception as e: 814 | resp = None 815 | 816 | return self.get_response(resp) 817 | 818 | def enumerate(self): 819 | url = self.base_url.format(domain=self.domain) 820 | resp = self.req(url) 821 | if not resp: 822 | return self.subdomains 823 | 824 | self.extract_domains(resp) 825 | return self.subdomains 826 | 827 | def extract_domains(self, resp): 828 | try: 829 | subdomains = json.loads(resp) 830 | for subdomain in subdomains: 831 | if subdomain not in self.subdomains and subdomain != self.domain: 832 | if self.verbose: 833 | self.print_("%s%s: %s%s" % (R, self.engine_name, W, subdomain)) 834 | self.subdomains.append(subdomain.strip()) 835 | except Exception as e: 836 | pass 837 | 838 | 839 | class portscan(): 840 | def __init__(self, subdomains, ports): 841 | self.subdomains = subdomains 842 | self.ports = ports 843 | self.threads = 20 844 | self.lock = threading.BoundedSemaphore(value=self.threads) 845 | 846 | def port_scan(self, host, ports): 847 | openports = [] 848 | self.lock.acquire() 849 | for port in ports: 850 | try: 851 | s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 852 | s.settimeout(2) 853 | result = s.connect_ex((host, int(port))) 854 | if result == 0: 855 | openports.append(port) 856 | s.close() 857 | except Exception: 858 | pass 859 | self.lock.release() 860 | if len(openports) > 0: 861 | print("%s%s%s - %sFound open ports:%s %s%s%s" % (G, host, W, R, W, Y, ', '.join(openports), W)) 862 | 863 | def run(self): 864 | for subdomain in self.subdomains: 865 | t = threading.Thread(target=self.port_scan, args=(subdomain, self.ports)) 866 | t.start() 867 | 868 | 869 | def main(domain, threads, savefile, ports, silent, verbose, enable_bruteforce, engines): 870 | bruteforce_list = set() 871 | search_list = set() 872 | 873 | if is_windows: 874 | subdomains_queue = list() 875 | else: 876 | subdomains_queue = multiprocessing.Manager().list() 877 | 878 | # Check Bruteforce Status 879 | if enable_bruteforce or enable_bruteforce is None: 880 | enable_bruteforce = True 881 | 882 | # Validate domain 883 | domain_check = re.compile("^(http|https)?[a-zA-Z0-9]+([\-\.]{1}[a-zA-Z0-9]+)*\.[a-zA-Z]{2,}$") 884 | if not domain_check.match(domain): 885 | if not silent: 886 | print(R + "Error: Please enter a valid domain" + W) 887 | return [] 888 | 889 | if not domain.startswith('http://') or not domain.startswith('https://'): 890 | domain = 'http://' + domain 891 | 892 | parsed_domain = urlparse.urlparse(domain) 893 | 894 | if not silent: 895 | print(B + "[-] Enumerating subdomains now for %s" % parsed_domain.netloc + W) 896 | 897 | if verbose and not silent: 898 | print(Y + "[-] verbosity is enabled, will show the subdomains results in realtime" + W) 899 | 900 | supported_engines = {'baidu': BaiduEnum, 901 | 'yahoo': YahooEnum, 902 | 'google': GoogleEnum, 903 | 'bing': BingEnum, 904 | 'ask': AskEnum, 905 | 'netcraft': NetcraftEnum, 906 | 'dnsdumpster': DNSdumpster, 907 | 'virustotal': Virustotal, 908 | 'threatcrowd': ThreatCrowd, 909 | 'ssl': CrtSearch, 910 | 'passivedns': PassiveDNS 911 | } 912 | 913 | chosenEnums = [] 914 | 915 | if engines is None: 916 | chosenEnums = [ 917 | BaiduEnum, YahooEnum, GoogleEnum, BingEnum, AskEnum, 918 | NetcraftEnum, DNSdumpster, Virustotal, ThreatCrowd, 919 | CrtSearch, PassiveDNS 920 | ] 921 | else: 922 | engines = engines.split(',') 923 | for engine in engines: 924 | if engine.lower() in supported_engines: 925 | chosenEnums.append(supported_engines[engine.lower()]) 926 | 927 | # Start the engines enumeration 928 | enums = [enum(domain, [], q=subdomains_queue, silent=silent, verbose=verbose) for enum in chosenEnums] 929 | for enum in enums: 930 | enum.start() 931 | for enum in enums: 932 | enum.join() 933 | 934 | subdomains = set(subdomains_queue) 935 | for subdomain in subdomains: 936 | search_list.add(subdomain) 937 | 938 | if enable_bruteforce: 939 | if not silent: 940 | print(G + "[-] Starting bruteforce module now using subbrute.." + W) 941 | record_type = False 942 | path_to_file = os.path.dirname(os.path.realpath(__file__)) 943 | subs = os.path.join(path_to_file, 'subbrute', 'names.txt') 944 | resolvers = os.path.join(path_to_file, 'subbrute', 'resolvers.txt') 945 | process_count = threads 946 | output = False 947 | json_output = False 948 | bruteforce_list = subbrute.print_target(parsed_domain.netloc, record_type, subs, resolvers, process_count, output, json_output, search_list, verbose) 949 | 950 | subdomains = search_list.union(bruteforce_list) 951 | 952 | if subdomains: 953 | subdomains = sorted(subdomains, key=subdomain_sorting_key) 954 | 955 | if savefile: 956 | write_file(savefile, subdomains) 957 | 958 | if not silent: 959 | print(Y + "[-] Total Unique Subdomains Found: %s" % len(subdomains) + W) 960 | 961 | if ports: 962 | if not silent: 963 | print(G + "[-] Start port scan now for the following ports: %s%s" % (Y, ports) + W) 964 | ports = ports.split(',') 965 | pscan = portscan(subdomains, ports) 966 | pscan.run() 967 | 968 | elif not silent: 969 | for subdomain in subdomains: 970 | print(G + subdomain + W) 971 | return subdomains 972 | 973 | 974 | def interactive(): 975 | args = parse_args() 976 | domain = args.domain 977 | threads = args.threads 978 | savefile = args.output 979 | ports = args.ports 980 | enable_bruteforce = args.bruteforce 981 | verbose = args.verbose 982 | engines = args.engines 983 | if verbose or verbose is None: 984 | verbose = True 985 | banner() 986 | res = main(domain, threads, savefile, ports, silent=False, verbose=verbose, enable_bruteforce=enable_bruteforce, engines=engines) 987 | 988 | if __name__ == "__main__": 989 | interactive() 990 | -------------------------------------------------------------------------------- /images/ChecksubDomains.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jewel591/SubDomainFinder/dfd0eee82d901896ecae95913f8d0cfe2dd48e1f/images/ChecksubDomains.png -------------------------------------------------------------------------------- /input/domains.txt: -------------------------------------------------------------------------------- 1 | huazhu.com 2 | htinns.com 3 | hantinghotels.com 4 | cjia.com 5 | hworld.com.cn -------------------------------------------------------------------------------- /output/result.txt: -------------------------------------------------------------------------------- 1 | output there! 2 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | dnspython 2 | gevent 3 | argparse 4 | requests 5 | -------------------------------------------------------------------------------- /subDomainsBrute/.gitignore: -------------------------------------------------------------------------------- 1 | *.py[cod] 2 | .idea/* 3 | tmp/ -------------------------------------------------------------------------------- /subDomainsBrute/dict/dns_servers.txt: -------------------------------------------------------------------------------- 1 | 119.29.29.29 2 | 182.254.116.116 3 | # 223.5.5.5 4 | # 223.6.6.6 5 | 114.114.115.115 6 | 114.114.114.114 7 | -------------------------------------------------------------------------------- /subDomainsBrute/dict/next_sub.txt: -------------------------------------------------------------------------------- 1 | test 2 | test2 3 | t 4 | dev 5 | 1 6 | 2 7 | 3 8 | s1 9 | s2 10 | s3 11 | admin 12 | adm 13 | a 14 | ht 15 | adminht 16 | webht 17 | web 18 | gm 19 | sys 20 | system 21 | manage 22 | manager 23 | mgr 24 | b 25 | c 26 | passport 27 | bata 28 | wei 29 | weixin 30 | wechat 31 | wx 32 | wiki 33 | upload 34 | ftp 35 | pic 36 | jira 37 | zabbix 38 | nagios 39 | bug 40 | bugzilla 41 | sql 42 | mysql 43 | db 44 | stmp 45 | pop 46 | imap 47 | mail 48 | zimbra 49 | exchange 50 | forum 51 | bbs 52 | list 53 | count 54 | counter 55 | img 56 | img01 57 | img02 58 | img03 59 | img04 60 | api 61 | cache 62 | js 63 | css 64 | app 65 | apps 66 | wap 67 | m 68 | sms 69 | zip 70 | monitor 71 | proxy 72 | update 73 | upgrade 74 | stat 75 | stats 76 | data 77 | portal 78 | blog 79 | autodiscover 80 | en 81 | search 82 | so 83 | oa 84 | database 85 | home 86 | sso 87 | help 88 | vip 89 | s 90 | w 91 | down 92 | download 93 | downloads 94 | dl 95 | svn 96 | git 97 | log 98 | staff 99 | vpn 100 | sslvpn 101 | ssh 102 | scanner 103 | sandbox 104 | ldap 105 | lab 106 | go 107 | demo 108 | console 109 | cms 110 | auth 111 | crm 112 | erp 113 | res 114 | static 115 | old 116 | new 117 | beta 118 | image 119 | service 120 | login 121 | 3g 122 | docs 123 | it 124 | e 125 | live 126 | library 127 | files 128 | i 129 | d 130 | cp 131 | connect 132 | gateway 133 | lib 134 | preview 135 | backup 136 | share 137 | status 138 | assets 139 | user 140 | vote 141 | bugs 142 | cas 143 | feedback 144 | id 145 | edm 146 | survey 147 | union 148 | ceshi 149 | dev1 150 | updates 151 | phpmyadmin 152 | pma 153 | edit 154 | master 155 | xml 156 | control 157 | profile 158 | zhidao 159 | tool 160 | toolbox 161 | boss 162 | activity 163 | www 164 | -------------------------------------------------------------------------------- /subDomainsBrute/dict/next_sub_full.txt: -------------------------------------------------------------------------------- 1 | test 2 | test2 3 | t 4 | dev 5 | 1 6 | 2 7 | 3 8 | s1 9 | s2 10 | s3 11 | admin 12 | adm 13 | a 14 | ht 15 | adminht 16 | webht 17 | web 18 | gm 19 | sys 20 | system 21 | manage 22 | manager 23 | mgr 24 | b 25 | c 26 | passport 27 | bata 28 | wei 29 | weixin 30 | wechat 31 | wx 32 | wiki 33 | upload 34 | ftp 35 | pic 36 | jira 37 | zabbix 38 | nagios 39 | bug 40 | bugzilla 41 | sql 42 | mysql 43 | db 44 | stmp 45 | pop 46 | imap 47 | mail 48 | zimbra 49 | exchange 50 | forum 51 | bbs 52 | list 53 | count 54 | counter 55 | img 56 | img01 57 | img02 58 | img03 59 | img04 60 | api 61 | cache 62 | js 63 | css 64 | app 65 | apps 66 | wap 67 | m 68 | sms 69 | zip 70 | monitor 71 | proxy 72 | update 73 | upgrade 74 | stat 75 | stats 76 | data 77 | portal 78 | blog 79 | autodiscover 80 | en 81 | search 82 | so 83 | oa 84 | database 85 | home 86 | sso 87 | help 88 | vip 89 | s 90 | w 91 | down 92 | download 93 | downloads 94 | dl 95 | svn 96 | git 97 | log 98 | staff 99 | vpn 100 | sslvpn 101 | ssh 102 | scanner 103 | sandbox 104 | ldap 105 | lab 106 | go 107 | demo 108 | console 109 | cms 110 | auth 111 | crm 112 | erp 113 | res 114 | static 115 | old 116 | new 117 | beta 118 | image 119 | service 120 | login 121 | 3g 122 | docs 123 | it 124 | e 125 | live 126 | library 127 | files 128 | i 129 | d 130 | cp 131 | connect 132 | gateway 133 | lib 134 | preview 135 | backup 136 | share 137 | status 138 | assets 139 | user 140 | vote 141 | bugs 142 | cas 143 | feedback 144 | id 145 | edm 146 | survey 147 | union 148 | ceshi 149 | dev1 150 | updates 151 | phpmyadmin 152 | pma 153 | edit 154 | master 155 | xml 156 | control 157 | profile 158 | zhidao 159 | tool 160 | toolbox 161 | boss 162 | activity 163 | www 164 | smtp 165 | webmail 166 | mx 167 | pop3 168 | ns1 169 | ns2 170 | webdisk 171 | www2 172 | news 173 | cpanel 174 | whm 175 | shop 176 | sip 177 | ns 178 | mobile 179 | www1 180 | email 181 | support 182 | mail2 183 | media 184 | lyncdiscover 185 | secure 186 | video 187 | my 188 | staging 189 | images 190 | dns 191 | info 192 | ns3 193 | mail1 194 | intranet 195 | cdn 196 | lists 197 | dns1 198 | www3 199 | dns2 200 | mobilemail 201 | store 202 | remote 203 | cn 204 | owa 205 | cs 206 | stage 207 | online 208 | jobs 209 | calendar 210 | community 211 | forums 212 | services 213 | dialin 214 | chat 215 | meet 216 | blogs 217 | hr 218 | office 219 | ww 220 | ftp2 221 | legacy 222 | b2b 223 | ns4 224 | v 225 | pda 226 | events 227 | av 228 | edu 229 | ads 230 | health 231 | es 232 | english 233 | ad 234 | extranet 235 | helpdesk 236 | training 237 | photo 238 | finance 239 | tv 240 | fr 241 | sc 242 | job 243 | cloud 244 | im 245 | careers 246 | game 247 | archive 248 | get 249 | gis 250 | access 251 | member 252 | mx1 253 | newsletter 254 | de 255 | qa 256 | direct 257 | alumni 258 | mx2 259 | hk 260 | sp 261 | gw 262 | relay 263 | jp 264 | content 265 | file 266 | citrix 267 | vpn2 268 | soft 269 | ssl 270 | server 271 | club 272 | ws 273 | host 274 | book 275 | www4 276 | sh 277 | tools 278 | mail3 279 | ms 280 | mailhost 281 | ca 282 | ntp 283 | ask 284 | sites 285 | sz 286 | spam 287 | wwww 288 | tw 289 | videos 290 | send 291 | music 292 | project 293 | uk 294 | start 295 | mall 296 | ns5 297 | outlook 298 | reports 299 | us 300 | partner 301 | mssql 302 | bj 303 | sharepoint 304 | link 305 | metrics 306 | partners 307 | smtp2 308 | webproxy 309 | mdm 310 | marketing 311 | ts 312 | security 313 | map 314 | ir 315 | fs 316 | origin 317 | travel 318 | feeds 319 | meeting 320 | u 321 | photos 322 | hq 323 | tj 324 | research 325 | pt 326 | members 327 | ru 328 | bm 329 | business 330 | eq 331 | cc 332 | w3 333 | student 334 | auto 335 | dx 336 | p 337 | rs 338 | dns3 339 | vc 340 | gmail 341 | uc 342 | press 343 | web1 344 | localhost 345 | ent 346 | tuan 347 | dj 348 | web2 349 | ss 350 | cnc 351 | vpn1 352 | pay 353 | time 354 | sx 355 | hd 356 | games 357 | lt 358 | projects 359 | g 360 | sales 361 | stream 362 | gb 363 | forms 364 | www5 365 | wt 366 | abc 367 | weather 368 | zb 369 | smtp1 370 | maps 371 | x 372 | register 373 | design 374 | radio 375 | software 376 | china 377 | math 378 | open 379 | view 380 | fax 381 | event 382 | pm 383 | test1 384 | alpha 385 | irc 386 | sg 387 | cq 388 | ftp1 389 | idc 390 | labs 391 | da 392 | directory 393 | developer 394 | reg 395 | catalog 396 | rss 397 | wh 398 | sd 399 | tg 400 | bb 401 | digital 402 | hb 403 | house 404 | site 405 | conference 406 | rt 407 | temp 408 | fw 409 | tz 410 | tech 411 | education 412 | biz 413 | f 414 | gallery 415 | gh 416 | car 417 | dc 418 | agent 419 | mis 420 | eng 421 | flash 422 | cx 423 | pub 424 | ticket 425 | doc 426 | card 427 | account 428 | code 429 | promo 430 | net 431 | kb 432 | jk 433 | social 434 | sports 435 | ems 436 | tp 437 | public 438 | mm 439 | pms 440 | mrtg 441 | as 442 | jw 443 | corp 444 | tr 445 | investor 446 | dm 447 | sts 448 | th 449 | bi 450 | 123 451 | st 452 | br 453 | wp 454 | art 455 | shopping 456 | global 457 | money 458 | prod 459 | students 460 | cj 461 | iphone 462 | vps 463 | ag 464 | food 465 | sb 466 | ly 467 | local 468 | sj 469 | server1 470 | testing 471 | brand 472 | sy 473 | buy 474 | life 475 | groups 476 | nl 477 | tour 478 | lms 479 | pro 480 | bc 481 | rtx 482 | hao 483 | exam 484 | fb 485 | in 486 | ams 487 | msoid 488 | idp 489 | vod 490 | cm 491 | dk 492 | hs 493 | usa 494 | ww2 495 | jwc 496 | lp 497 | rsc 498 | jd 499 | cf 500 | rms 501 | ec 502 | jabber 503 | streaming 504 | webdev 505 | dms 506 | investors 507 | bookstore 508 | kr 509 | cd 510 | corporate 511 | mail4 512 | fz 513 | order 514 | transfer 515 | hotel 516 | work 517 | bt 518 | au 519 | pages 520 | sm 521 | client 522 | r 523 | y 524 | audio 525 | cz 526 | ci 527 | se 528 | potala 529 | ch 530 | webservices 531 | dy 532 | cvs 533 | ra 534 | apple 535 | barracuda 536 | ip 537 | ja 538 | mkt 539 | archives 540 | www0 541 | intra 542 | gate 543 | youth 544 | internal 545 | mailgw 546 | customer 547 | linux 548 | registration 549 | movie 550 | mailgate 551 | q 552 | xx 553 | mx3 554 | mars 555 | phone 556 | desktop 557 | ds 558 | zz 559 | love 560 | show 561 | nc 562 | redmine 563 | ce 564 | pl 565 | wireless 566 | inside 567 | fx 568 | mp 569 | hz 570 | listserv 571 | analytics 572 | ks 573 | redirect 574 | accounts 575 | report 576 | hermes 577 | ae 578 | mobi 579 | ps 580 | edge 581 | resources 582 | img1 583 | law 584 | pr 585 | international 586 | ml 587 | trac 588 | rd 589 | market 590 | mailer 591 | cert 592 | hg 593 | cl 594 | img2 595 | development 596 | gs 597 | google 598 | space 599 | www6 600 | gd 601 | post 602 | voip 603 | ac 604 | push 605 | m2 606 | sq 607 | fc 608 | ar 609 | asp 610 | dr 611 | seo 612 | mobil 613 | sync 614 | kf 615 | be 616 | about 617 | mail01 618 | sns 619 | board 620 | pc 621 | links 622 | jj 623 | history 624 | mailman 625 | campus 626 | mms 627 | storage 628 | ns0 629 | cdn2 630 | cacti 631 | hy 632 | enterprise 633 | noc 634 | ic 635 | cgi 636 | track 637 | world 638 | act 639 | wl 640 | product 641 | ls 642 | sf 643 | affiliates 644 | android 645 | payment 646 | n 647 | gz 648 | web3 649 | learning 650 | signup 651 | z 652 | tao 653 | top 654 | wifi 655 | yy 656 | password 657 | cw 658 | wm 659 | ess 660 | ex 661 | resource 662 | print 663 | gc 664 | w2 665 | canada 666 | cr 667 | mc 668 | 0 669 | me 670 | keys 671 | sentry 672 | smtp3 673 | journal 674 | mt 675 | team 676 | orion 677 | edi 678 | test3 679 | tc 680 | main 681 | zs 682 | faq 683 | click 684 | hub 685 | tu 686 | golf 687 | phoenix 688 | bd 689 | build 690 | free 691 | ee 692 | int 693 | cdn1 694 | v2 695 | sa 696 | pos 697 | fi 698 | router 699 | rc 700 | mirror 701 | tracker 702 | ct 703 | special 704 | cal 705 | ns6 706 | atlas 707 | ids 708 | affiliate 709 | nj 710 | tt 711 | nz 712 | db1 713 | bg 714 | mercury 715 | family 716 | courses 717 | ipv6 718 | jupiter 719 | no 720 | venus 721 | nb 722 | beijing 723 | summer 724 | ma 725 | yp 726 | ocs 727 | star 728 | traveler 729 | multimedia 730 | fm 731 | study 732 | lb 733 | up 734 | shanghai 735 | bk 736 | www7 737 | join 738 | tfs 739 | feed 740 | h 741 | ns01 742 | php 743 | stock 744 | km 745 | books 746 | eu 747 | md 748 | 2013 749 | whois 750 | sw 751 | mailserver 752 | mb 753 | tms 754 | monitoring 755 | ys 756 | ga 757 | radius 758 | group 759 | mtest 760 | j 761 | www8 762 | wb 763 | m1 764 | billing 765 | aaa 766 | pf 767 | products 768 | faculty 769 | em 770 | opac 771 | cis 772 | xmpp 773 | nanjing 774 | taobao 775 | zp 776 | teacher 777 | co 778 | contact 779 | nt 780 | ky 781 | qq 782 | mp3 783 | gps 784 | hn 785 | users 786 | gl 787 | domain 788 | newsroom 789 | dh 790 | csc 791 | repo 792 | zw 793 | ismart 794 | pp 795 | gg 796 | wms 797 | ims 798 | www9 799 | 2014 800 | solutions 801 | at 802 | bak 803 | sl 804 | cwc 805 | firewall 806 | wordpress 807 | school 808 | nms 809 | developers 810 | pki 811 | pe 812 | v2-ag 813 | devel 814 | hp 815 | titan 816 | pluto 817 | kids 818 | sport 819 | mail5 820 | server2 821 | nas 822 | xh 823 | ap 824 | red 825 | mas 826 | translate 827 | dealer 828 | ipad 829 | demo2 830 | 2012 831 | dns4 832 | hh 833 | green 834 | dz 835 | hybrid 836 | discover 837 | adserver 838 | japan 839 | mi 840 | xf 841 | zeus 842 | am 843 | people 844 | aa 845 | win 846 | sk 847 | db2 848 | jenkins 849 | xb 850 | oss 851 | sdc 852 | wc 853 | its 854 | dw 855 | yun 856 | acs 857 | asia 858 | daj 859 | webadmin 860 | crl 861 | ebook 862 | mag 863 | csg 864 | blue 865 | bank 866 | one 867 | o 868 | horizon 869 | orders 870 | apis 871 | k 872 | l 873 | 4 874 | 5 875 | 6 876 | 7 877 | 8 878 | 9 879 | ab 880 | af 881 | ah 882 | ai 883 | aj 884 | ak 885 | al 886 | an 887 | ao 888 | aq 889 | aw 890 | ax 891 | ay 892 | az 893 | ba 894 | bf 895 | bh 896 | bl 897 | bn 898 | bo 899 | bp 900 | bq 901 | bs 902 | bu 903 | bv 904 | bw 905 | bx 906 | by 907 | bz 908 | cb 909 | cg 910 | ck 911 | cu 912 | cv 913 | cy 914 | dd 915 | df 916 | dg 917 | di 918 | dn 919 | do 920 | dp 921 | dq 922 | dt 923 | du 924 | dv 925 | ea 926 | eb 927 | ed 928 | ef 929 | eg 930 | eh 931 | ei 932 | ej 933 | ek 934 | el 935 | eo 936 | ep 937 | er 938 | et 939 | ev 940 | ew 941 | ey 942 | ez 943 | fa 944 | fd 945 | fe 946 | ff 947 | fg 948 | fh 949 | fj 950 | fk 951 | fl 952 | fn 953 | fo 954 | fp 955 | fq 956 | ft 957 | fu 958 | fv 959 | fy 960 | ge 961 | gf 962 | gi 963 | gj 964 | gk 965 | gn 966 | gp 967 | gq 968 | gr 969 | gt 970 | gu 971 | gv 972 | gx 973 | gy 974 | ha 975 | hc 976 | he 977 | hf 978 | hi 979 | hj 980 | hl 981 | hm 982 | ho 983 | hu 984 | hv 985 | hw 986 | hx 987 | ia 988 | ib 989 | ie 990 | if 991 | ig 992 | ih 993 | ii 994 | ij 995 | ik 996 | il 997 | io 998 | iq 999 | is 1000 | iu 1001 | iv 1002 | iw 1003 | ix 1004 | iy 1005 | iz 1006 | jb 1007 | jc 1008 | je 1009 | jf 1010 | jg 1011 | jh 1012 | ji 1013 | jl 1014 | jm 1015 | jn 1016 | jo 1017 | jq 1018 | jr 1019 | jt 1020 | ju 1021 | jv 1022 | jx 1023 | jy 1024 | jz 1025 | ka 1026 | kc 1027 | kd 1028 | ke 1029 | kg 1030 | kh 1031 | ki 1032 | kj 1033 | kk 1034 | kl 1035 | kn 1036 | ko 1037 | kp 1038 | kq 1039 | kt 1040 | ku 1041 | kv 1042 | kw 1043 | kx 1044 | kz 1045 | la 1046 | lc 1047 | ld 1048 | le 1049 | lf 1050 | lg 1051 | lh 1052 | li 1053 | lj 1054 | lk 1055 | ll 1056 | lm 1057 | ln 1058 | lo 1059 | lq 1060 | lr 1061 | lu 1062 | lv 1063 | lw 1064 | lx 1065 | lz 1066 | mf 1067 | mg 1068 | mh 1069 | mj 1070 | mk 1071 | mn 1072 | mo 1073 | mq 1074 | mr 1075 | mu 1076 | mv 1077 | mw 1078 | mz 1079 | na 1080 | nd 1081 | ne 1082 | nf 1083 | ng 1084 | nh 1085 | ni 1086 | nk 1087 | nm 1088 | nn 1089 | np 1090 | nq 1091 | nr 1092 | nu 1093 | nv 1094 | nw 1095 | nx 1096 | ny 1097 | ob 1098 | oc 1099 | od 1100 | oe 1101 | of 1102 | og 1103 | oh 1104 | oi 1105 | oj 1106 | ok 1107 | ol 1108 | om 1109 | on 1110 | oo 1111 | op 1112 | oq 1113 | or 1114 | os 1115 | ot 1116 | ou 1117 | ov 1118 | ow 1119 | ox 1120 | oy 1121 | oz 1122 | pa 1123 | pb 1124 | pd 1125 | pg 1126 | ph 1127 | pi 1128 | pj 1129 | pk 1130 | pn 1131 | po 1132 | pq 1133 | pu 1134 | pv 1135 | pw 1136 | px 1137 | py 1138 | pz 1139 | qb 1140 | qc 1141 | qd 1142 | qe 1143 | qf 1144 | qg 1145 | qh 1146 | qi 1147 | qj 1148 | qk 1149 | ql 1150 | qm 1151 | qn 1152 | qo 1153 | qp 1154 | qr 1155 | qs 1156 | qt 1157 | qu 1158 | qv 1159 | qw 1160 | qx 1161 | qy 1162 | qz 1163 | rb 1164 | re 1165 | rf 1166 | rg 1167 | rh 1168 | ri 1169 | rj 1170 | rk 1171 | rl 1172 | rm 1173 | rn 1174 | ro 1175 | rp 1176 | rq 1177 | rr 1178 | rv 1179 | rw 1180 | rx 1181 | ry 1182 | rz 1183 | si 1184 | sn 1185 | sr 1186 | su 1187 | sv 1188 | ta 1189 | tb 1190 | td 1191 | te 1192 | tf 1193 | ti 1194 | tk 1195 | tl 1196 | tm 1197 | tn 1198 | to 1199 | tq 1200 | tx 1201 | ty 1202 | ua 1203 | ub 1204 | ud 1205 | ue 1206 | uf 1207 | ug 1208 | uh 1209 | ui 1210 | uj 1211 | ul 1212 | um 1213 | un 1214 | uo 1215 | uq 1216 | ur 1217 | ut 1218 | uu 1219 | uv 1220 | uw 1221 | ux 1222 | uy 1223 | uz 1224 | va 1225 | vb 1226 | vd 1227 | ve 1228 | vf 1229 | vg 1230 | vh 1231 | vi 1232 | vj 1233 | vk 1234 | vl 1235 | vm 1236 | vn 1237 | vo 1238 | vp 1239 | vq 1240 | vr 1241 | vs 1242 | vt 1243 | vu 1244 | vv 1245 | vw 1246 | vx 1247 | vy 1248 | vz 1249 | wa 1250 | wd 1251 | we 1252 | wf 1253 | wg 1254 | wi 1255 | wj 1256 | wk 1257 | wn 1258 | wo 1259 | wq 1260 | wr 1261 | wu 1262 | wv 1263 | wy 1264 | wz 1265 | xa 1266 | xc 1267 | xd 1268 | xe 1269 | xg 1270 | xi 1271 | xj 1272 | xk 1273 | xl 1274 | xm 1275 | xn 1276 | xo 1277 | xp 1278 | xq 1279 | xr 1280 | xs 1281 | xt 1282 | xu 1283 | xv 1284 | xw 1285 | xy 1286 | xz 1287 | ya 1288 | yb 1289 | yc 1290 | yd 1291 | ye 1292 | yf 1293 | yg 1294 | yh 1295 | yi 1296 | yj 1297 | yk 1298 | yl 1299 | ym 1300 | yn 1301 | yo 1302 | yq 1303 | yr 1304 | yt 1305 | yu 1306 | yv 1307 | yw 1308 | yx 1309 | yz 1310 | za 1311 | zc 1312 | zd 1313 | ze 1314 | zf 1315 | zg 1316 | zh 1317 | zi 1318 | zj 1319 | zk 1320 | zl 1321 | zm 1322 | zn 1323 | zo 1324 | zq 1325 | zr 1326 | zt 1327 | zu 1328 | zv 1329 | zx 1330 | zy -------------------------------------------------------------------------------- /subDomainsBrute/dict/subnames_all_5_letters.txt: -------------------------------------------------------------------------------- 1 | {alphnum} 2 | {alphnum}{alphnum} 3 | {alphnum}{alphnum}{alphnum} 4 | {alphnum}{alphnum}{alphnum}{alphnum} 5 | {alphnum}{alphnum}{alphnum}{alphnum}{alphnum} -------------------------------------------------------------------------------- /subDomainsBrute/lib/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Jewel591/SubDomainFinder/dfd0eee82d901896ecae95913f8d0cfe2dd48e1f/subDomainsBrute/lib/__init__.py -------------------------------------------------------------------------------- /subDomainsBrute/lib/cmdline.py: -------------------------------------------------------------------------------- 1 | import optparse 2 | import sys 3 | 4 | 5 | def parse_args(): 6 | parser = optparse.OptionParser('usage: %prog [options] target.com', 7 | version="%prog 1.2") 8 | parser.add_option('-f', dest='file', default='subnames.txt', 9 | help='File contains new line delimited subs, default is subnames.txt.') 10 | parser.add_option('--full', dest='full_scan', default=False, action='store_true', 11 | help='Full scan, NAMES FILE subnames_full.txt will be used to brute') 12 | parser.add_option('-i', '--ignore-intranet', dest='i', default=False, action='store_true', 13 | help='Ignore domains pointed to private IPs') 14 | parser.add_option('-t', '--threads', dest='threads', default=200, type=int, 15 | help='Num of scan threads, 200 by default') 16 | parser.add_option('-p', '--process', dest='process', default=6, type=int, 17 | help='Num of scan Process, 6 by default') 18 | parser.add_option('-o', '--output', dest='output', default=None, 19 | type='string', help='Output file name. default is {target}.txt') 20 | 21 | (options, args) = parser.parse_args() 22 | if len(args) < 1: 23 | parser.print_help() 24 | sys.exit(0) 25 | return options, args 26 | -------------------------------------------------------------------------------- /subDomainsBrute/lib/common.py: -------------------------------------------------------------------------------- 1 | # common functions 2 | 3 | import sys 4 | import os 5 | from gevent.pool import Pool 6 | import dns.resolver 7 | from lib.consle_width import getTerminalSize 8 | 9 | console_width = getTerminalSize()[0] - 2 10 | 11 | 12 | def is_intranet(ip): 13 | ret = ip.split('.') 14 | if len(ret) != 4: 15 | return True 16 | if ret[0] == '10': 17 | return True 18 | if ret[0] == '172' and 16 <= int(ret[1]) <= 31: 19 | return True 20 | if ret[0] == '192' and ret[1] == '168': 21 | return True 22 | return False 23 | 24 | 25 | def print_msg(msg=None, left_align=True, line_feed=False): 26 | if left_align: 27 | sys.stdout.write('\r' + msg + ' ' * (console_width - len(msg))) 28 | else: # right align 29 | sys.stdout.write('\r' + ' ' * (console_width - len(msg)) + msg) 30 | if line_feed: 31 | sys.stdout.write('\n') 32 | sys.stdout.flush() 33 | 34 | 35 | def test_server(server, dns_servers): 36 | resolver = dns.resolver.Resolver(configure=False) 37 | resolver.lifetime = resolver.timeout = 5.0 38 | try: 39 | resolver.nameservers = [server] 40 | answers = resolver.query('public-dns-a.baidu.com') # an existed domain 41 | if answers[0].address != '180.76.76.76': 42 | raise Exception('Incorrect DNS response') 43 | try: 44 | resolver.query('test.bad.dns.lijiejie.com') # non-existed domain 45 | with open('bad_dns_servers.txt', 'a') as f: 46 | f.write(server + '\n') 47 | print_msg('[+] Bad DNS Server found %s' % server) 48 | except Exception as e: 49 | dns_servers.append(server) 50 | print_msg('[+] Server %s < OK > Found %s' % (server.ljust(16), len(dns_servers))) 51 | except Exception as e: 52 | print_msg('[+] Server %s Found %s' % (server.ljust(16), len(dns_servers))) 53 | 54 | 55 | def load_dns_servers(): 56 | print_msg('[+] Validate DNS servers', line_feed=True) 57 | dns_servers = [] 58 | pool = Pool(5) 59 | for server in open('dict/dns_servers.txt').readlines(): 60 | server = server.strip() 61 | if server and not server.startswith('#'): 62 | pool.apply_async(test_server, (server, dns_servers)) 63 | pool.join() 64 | 65 | server_count = len(dns_servers) 66 | print_msg('\n[+] %s DNS Servers found' % server_count, line_feed=True) 67 | if server_count == 0: 68 | print_msg('[ERROR] No valid DNS Server !', line_feed=True) 69 | sys.exit(-1) 70 | return dns_servers 71 | 72 | 73 | def load_next_sub(options): 74 | next_subs = [] 75 | _file = 'dict/next_sub_full.txt' if options.full_scan else 'dict/next_sub.txt' 76 | with open(_file) as f: 77 | for line in f: 78 | sub = line.strip() 79 | if sub and sub not in next_subs: 80 | tmp_set = {sub} 81 | while tmp_set: 82 | item = tmp_set.pop() 83 | if item.find('{alphnum}') >= 0: 84 | for _letter in 'abcdefghijklmnopqrstuvwxyz0123456789': 85 | tmp_set.add(item.replace('{alphnum}', _letter, 1)) 86 | elif item.find('{alpha}') >= 0: 87 | for _letter in 'abcdefghijklmnopqrstuvwxyz': 88 | tmp_set.add(item.replace('{alpha}', _letter, 1)) 89 | elif item.find('{num}') >= 0: 90 | for _letter in '0123456789': 91 | tmp_set.add(item.replace('{num}', _letter, 1)) 92 | elif item not in next_subs: 93 | next_subs.append(item) 94 | return next_subs 95 | 96 | 97 | def get_out_file_name(target, options): 98 | if options.output: 99 | outfile = options.output 100 | else: 101 | _name = os.path.basename(options.file).replace('subnames', '') 102 | if _name != '.txt': 103 | _name = '_' + _name 104 | outfile = target + _name 105 | return outfile 106 | 107 | 108 | def user_abort(sig, frame): 109 | exit(-1) 110 | -------------------------------------------------------------------------------- /subDomainsBrute/lib/consle_width.py: -------------------------------------------------------------------------------- 1 | """ getTerminalSize() 2 | - get width and height of console 3 | - works on linux,os x,windows,cygwin(windows) 4 | """ 5 | 6 | __all__ = ['getTerminalSize'] 7 | 8 | 9 | def getTerminalSize(): 10 | import platform 11 | current_os = platform.system() 12 | tuple_xy = None 13 | if current_os == 'Windows': 14 | tuple_xy = _getTerminalSize_windows() 15 | if tuple_xy is None: 16 | tuple_xy = _getTerminalSize_tput() 17 | # needed for window's python in cygwin's xterm! 18 | if current_os == 'Linux' or current_os == 'Darwin' or current_os.startswith('CYGWIN'): 19 | tuple_xy = _getTerminalSize_linux() 20 | if tuple_xy is None: 21 | tuple_xy = (80, 25) # default value 22 | return tuple_xy 23 | 24 | 25 | def _getTerminalSize_windows(): 26 | res = None 27 | try: 28 | from ctypes import windll, create_string_buffer 29 | 30 | # stdin handle is -10 31 | # stdout handle is -11 32 | # stderr handle is -12 33 | 34 | h = windll.kernel32.GetStdHandle(-12) 35 | csbi = create_string_buffer(22) 36 | res = windll.kernel32.GetConsoleScreenBufferInfo(h, csbi) 37 | except: 38 | return None 39 | if res: 40 | import struct 41 | (bufx, bufy, curx, cury, wattr, 42 | left, top, right, bottom, maxx, maxy) = struct.unpack("hhhhHhhhhhh", csbi.raw) 43 | sizex = right - left + 1 44 | sizey = bottom - top + 1 45 | return sizex, sizey 46 | else: 47 | return None 48 | 49 | 50 | def _getTerminalSize_tput(): 51 | # get terminal width 52 | # src: http://stackoverflow.com/questions/263890/how-do-i-find-the-width-height-of-a-terminal-window 53 | try: 54 | import subprocess 55 | proc = subprocess.Popen(["tput", "cols"], stdin=subprocess.PIPE, stdout=subprocess.PIPE) 56 | output = proc.communicate(input=None) 57 | cols = int(output[0]) 58 | proc = subprocess.Popen(["tput", "lines"], stdin=subprocess.PIPE, stdout=subprocess.PIPE) 59 | output = proc.communicate(input=None) 60 | rows = int(output[0]) 61 | return (cols, rows) 62 | except: 63 | return None 64 | 65 | 66 | def _getTerminalSize_linux(): 67 | def ioctl_GWINSZ(fd): 68 | try: 69 | import fcntl, termios, struct, os 70 | cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) 71 | except: 72 | return None 73 | return cr 74 | 75 | cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) 76 | if not cr: 77 | try: 78 | fd = os.open(os.ctermid(), os.O_RDONLY) 79 | cr = ioctl_GWINSZ(fd) 80 | os.close(fd) 81 | except: 82 | pass 83 | if not cr: 84 | try: 85 | env = os.environ 86 | cr = (env['LINES'], env['COLUMNS']) 87 | except: 88 | return None 89 | return int(cr[1]), int(cr[0]) 90 | 91 | 92 | if __name__ == "__main__": 93 | sizex, sizey = getTerminalSize() 94 | print 'width =', sizex, 'height =', sizey 95 | -------------------------------------------------------------------------------- /subDomainsBrute/subDomainsBrute.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- encoding: utf-8 -*- 3 | """ 4 | subDomainsBrute 1.2 5 | A simple and fast sub domains brute tool for pentesters 6 | my[at]lijiejie.com (http://www.lijiejie.com) 7 | """ 8 | 9 | import multiprocessing 10 | import warnings 11 | warnings.simplefilter("ignore", category=UserWarning) 12 | import gevent 13 | from gevent import monkey 14 | monkey.patch_all() 15 | from gevent.queue import PriorityQueue 16 | from gevent.lock import RLock 17 | import re 18 | import dns.resolver 19 | import time 20 | import signal 21 | import os 22 | import glob 23 | from lib.cmdline import parse_args 24 | from lib.common import is_intranet, load_dns_servers, load_next_sub, print_msg, get_out_file_name, \ 25 | user_abort 26 | 27 | 28 | class SubNameBrute(object): 29 | def __init__(self, *params): 30 | self.domain, self.options, self.process_num, self.dns_servers, self.next_subs, \ 31 | self.scan_count, self.found_count, self.queue_size_array, tmp_dir = params 32 | self.dns_count = len(self.dns_servers) 33 | self.scan_count_local = 0 34 | self.found_count_local = 0 35 | self.resolvers = [dns.resolver.Resolver(configure=False) for _ in range(self.options.threads)] 36 | for r in self.resolvers: 37 | r.lifetime = r.timeout = 10.0 38 | self.queue = PriorityQueue() 39 | self.priority = 0 40 | self.ip_dict = {} 41 | self.found_subs = set() 42 | self.timeout_subs = {} 43 | self.count_time = time.time() 44 | self.outfile = open('%s/%s_part_%s.txt' % (tmp_dir, self.domain, self.process_num), 'w') 45 | self.normal_names_set = set() 46 | self.load_sub_names() 47 | self.lock = RLock() 48 | 49 | def load_sub_names(self): 50 | normal_lines = [] 51 | wildcard_lines = [] 52 | wildcard_set = set() 53 | regex_list = [] 54 | lines = set() 55 | with open(self.options.file) as inFile: 56 | for line in inFile.xreadlines(): 57 | sub = line.strip() 58 | if not sub or sub in lines: 59 | continue 60 | lines.add(sub) 61 | 62 | brace_count = sub.count('{') 63 | if brace_count > 0: 64 | wildcard_lines.append((brace_count, sub)) 65 | sub = sub.replace('{alphnum}', '[a-z0-9]') 66 | sub = sub.replace('{alpha}', '[a-z]') 67 | sub = sub.replace('{num}', '[0-9]') 68 | if sub not in wildcard_set: 69 | wildcard_set.add(sub) 70 | regex_list.append('^' + sub + '$') 71 | else: 72 | normal_lines.append(sub) 73 | self.normal_names_set.add(sub) 74 | 75 | if regex_list: 76 | pattern = '|'.join(regex_list) 77 | _regex = re.compile(pattern) 78 | for line in normal_lines: 79 | if _regex.search(line): 80 | normal_lines.remove(line) 81 | 82 | for _ in normal_lines[self.process_num::self.options.process]: 83 | self.queue.put((0, _)) # priority set to 0 84 | for _ in wildcard_lines[self.process_num::self.options.process]: 85 | self.queue.put(_) 86 | 87 | def scan(self, j): 88 | self.resolvers[j].nameservers = [self.dns_servers[j % self.dns_count]] + self.dns_servers 89 | 90 | while True: 91 | try: 92 | self.lock.acquire() 93 | if time.time() - self.count_time > 1.0: 94 | self.scan_count.value += self.scan_count_local 95 | self.scan_count_local = 0 96 | self.queue_size_array[self.process_num] = self.queue.qsize() 97 | if self.found_count_local: 98 | self.found_count.value += self.found_count_local 99 | self.found_count_local = 0 100 | self.count_time = time.time() 101 | self.lock.release() 102 | brace_count, sub = self.queue.get(timeout=3.0) 103 | if brace_count > 0: 104 | brace_count -= 1 105 | if sub.find('{next_sub}') >= 0: 106 | for _ in self.next_subs: 107 | self.queue.put((0, sub.replace('{next_sub}', _))) 108 | if sub.find('{alphnum}') >= 0: 109 | for _ in 'abcdefghijklmnopqrstuvwxyz0123456789': 110 | self.queue.put((brace_count, sub.replace('{alphnum}', _, 1))) 111 | elif sub.find('{alpha}') >= 0: 112 | for _ in 'abcdefghijklmnopqrstuvwxyz': 113 | self.queue.put((brace_count, sub.replace('{alpha}', _, 1))) 114 | elif sub.find('{num}') >= 0: 115 | for _ in '0123456789': 116 | self.queue.put((brace_count, sub.replace('{num}', _, 1))) 117 | continue 118 | except gevent.queue.Empty as e: 119 | break 120 | 121 | try: 122 | 123 | if sub in self.found_subs: 124 | continue 125 | 126 | self.scan_count_local += 1 127 | cur_domain = sub + '.' + self.domain 128 | answers = self.resolvers[j].query(cur_domain) 129 | 130 | if answers: 131 | self.found_subs.add(sub) 132 | ips = ', '.join(sorted([answer.address for answer in answers])) 133 | if ips in ['1.1.1.1', '127.0.0.1', '0.0.0.0', '0.0.0.1']: 134 | continue 135 | if self.options.i and is_intranet(answers[0].address): 136 | continue 137 | 138 | try: 139 | self.scan_count_local += 1 140 | answers = self.resolvers[j].query(cur_domain, 'cname') 141 | cname = answers[0].target.to_unicode().rstrip('.') 142 | if cname.endswith(self.domain) and cname not in self.found_subs: 143 | cname_sub = cname[:len(cname) - len(self.domain) - 1] # new sub 144 | if cname_sub not in self.normal_names_set: 145 | self.found_subs.add(cname) 146 | self.queue.put((0, cname_sub)) 147 | except Exception as e: 148 | pass 149 | 150 | first_level_sub = sub.split('.')[-1] 151 | if (first_level_sub, ips) not in self.ip_dict: 152 | self.ip_dict[(first_level_sub, ips)] = 1 153 | else: 154 | self.ip_dict[(first_level_sub, ips)] += 1 155 | if self.ip_dict[(first_level_sub, ips)] > 30: 156 | continue 157 | 158 | self.found_count_local += 1 159 | 160 | self.outfile.write(cur_domain.ljust(30) + '\t' + ips + '\n') 161 | self.outfile.flush() 162 | try: 163 | self.scan_count_local += 1 164 | self.resolvers[j].query('lijiejie-test-not-existed.' + cur_domain) 165 | except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer) as e: 166 | if self.queue.qsize() < 10000: 167 | for _ in self.next_subs: 168 | self.queue.put((0, _ + '.' + sub)) 169 | else: 170 | self.queue.put((1, '{next_sub}.' + sub)) 171 | except Exception as e: 172 | pass 173 | 174 | except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer) as e: 175 | pass 176 | except dns.resolver.NoNameservers as e: 177 | self.queue.put((0, sub)) # Retry 178 | except dns.exception.Timeout as e: 179 | self.timeout_subs[sub] = self.timeout_subs.get(sub, 0) + 1 180 | if self.timeout_subs[sub] <= 2: 181 | self.queue.put((0, sub)) # Retry 182 | except Exception as e: 183 | import traceback 184 | traceback.print_exc() 185 | with open('errors.log', 'a') as errFile: 186 | errFile.write('[%s] %s\n' % (type(e), str(e))) 187 | 188 | def run(self): 189 | threads = [gevent.spawn(self.scan, i) for i in range(self.options.threads)] 190 | gevent.joinall(threads) 191 | 192 | 193 | def run_process(*params): 194 | signal.signal(signal.SIGINT, user_abort) 195 | s = SubNameBrute(*params) 196 | s.run() 197 | 198 | 199 | def wildcard_test(domain, level=1): 200 | try: 201 | r = dns.resolver.Resolver(configure=False) 202 | r.nameservers = dns_servers 203 | answers = r.query('lijiejie-not-existed-test.%s' % domain) 204 | ips = ', '.join(sorted([answer.address for answer in answers])) 205 | if level == 1: 206 | print 'any-sub.%s\t%s' % (domain.ljust(30), ips) 207 | wildcard_test('any-sub.%s' % domain, 2) 208 | elif level == 2: 209 | exit(0) 210 | except Exception as e: 211 | return domain 212 | 213 | 214 | # check file existence 215 | def get_sub_file_path(): 216 | if options.full_scan and options.file == 'subnames.txt': 217 | path = 'dict/subnames_full.txt' 218 | else: 219 | if os.path.exists(options.file): 220 | path = options.file 221 | elif os.path.exists('dict/%s' % options.file): 222 | path = 'dict/%s' % options.file 223 | else: 224 | print_msg('[ERROR] Names file not found: %s' % options.file) 225 | exit(-1) 226 | return path 227 | 228 | 229 | if __name__ == '__main__': 230 | options, args = parse_args() 231 | # print ''' SubDomainsBrute v1.2 232 | # https://github.com/lijiejie/subDomainsBrute 233 | # ''' 234 | # make tmp dirs 235 | tmp_dir = 'tmp/%s_%s' % (args[0], int(time.time())) 236 | if not os.path.exists(tmp_dir): 237 | os.makedirs(tmp_dir) 238 | 239 | multiprocessing.freeze_support() 240 | dns_servers = load_dns_servers() 241 | next_subs = load_next_sub(options) 242 | scan_count = multiprocessing.Value('i', 0) 243 | found_count = multiprocessing.Value('i', 0) 244 | queue_size_array = multiprocessing.Array('i', options.process) 245 | 246 | try: 247 | print '[+] Run wildcard test' 248 | domain = wildcard_test(args[0]) 249 | options.file = get_sub_file_path() 250 | print '[+] Start %s scan process' % options.process 251 | print '[+] Please wait while scanning ... \n' 252 | start_time = time.time() 253 | all_process = [] 254 | for process_num in range(options.process): 255 | p = multiprocessing.Process(target=run_process, 256 | args=(domain, options, process_num, dns_servers, next_subs, 257 | scan_count, found_count, queue_size_array, tmp_dir) 258 | ) 259 | all_process.append(p) 260 | p.start() 261 | 262 | char_set = ['\\', '|', '/', '-'] 263 | count = 0 264 | while all_process: 265 | for p in all_process: 266 | if not p.is_alive(): 267 | all_process.remove(p) 268 | groups_count = 0 269 | for c in queue_size_array: 270 | groups_count += c 271 | msg = '[%s] %s found, %s scanned in %.1f seconds, %s groups left' % ( 272 | char_set[count % 4], found_count.value, scan_count.value, time.time() - start_time, groups_count) 273 | print_msg(msg) 274 | count += 1 275 | time.sleep(0.3) 276 | except KeyboardInterrupt as e: 277 | print '[ERROR] User aborted the scan!' 278 | for p in all_process: 279 | p.terminate() 280 | except Exception as e: 281 | print '[ERROR] %s' % str(e) 282 | 283 | out_file_name = get_out_file_name(domain, options) 284 | all_domains = set() 285 | domain_count = 0 286 | with open(out_file_name, 'w') as f: 287 | for _file in glob.glob(tmp_dir + '/*.txt'): 288 | with open(_file, 'r') as tmp_f: 289 | for domain in tmp_f: 290 | if domain not in all_domains: 291 | domain_count += 1 292 | all_domains.add(domain) # cname query can result in duplicated domains 293 | f.write(domain) 294 | 295 | msg = 'All Done. %s found, %s scanned in %.1f seconds.' % ( 296 | domain_count, scan_count.value, time.time() - start_time) 297 | print_msg(msg, line_feed=True) 298 | print 'Output file is %s' % out_file_name 299 | -------------------------------------------------------------------------------- /tmp/tmp.txt: -------------------------------------------------------------------------------- 1 | 2 | --------------------------------------------------------------------------------