信息收集之我见
标签(空格分隔): web安全
来源网络,回馈网络
对一个网站挖掘的深浅来说就得看你收集的如何,这说明信息收集在漏洞挖掘中是非常的重要的。
子域名收集
子域名收集是最简单的收集手法之一,有很多在线的工具可以直接套用,这里分享几个我经常用的。
开心的时候用用这个扫描器
为什么这么说,因为这是我写的(你生气用的话我怕我屏幕里突然冒出一个拖孩)
1 | import requests |
2 | import threading |
3 | from bs4 import BeautifulSoup |
4 | import re |
5 | import time |
6 | |
7 | url = input( 'url(如baidu.com): ' ) |
8 | |
9 | head={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0'} |
10 | |
11 | ip = 'http://site.ip138.com/{}'.format( url ) |
12 | # domain_url = url.split('.') |
13 | # domain_url = domain_url[1]+'.'+domain_url[2] |
14 | domain_url = url |
15 | domain = 'http://site.ip138.com/{}/domain.htm'.format( domain_url ) |
16 | |
17 | t = time.strftime("%Y-%m-%d"+'_', time.localtime()) |
18 | html_file = open( url+'_'+t+'.html','w' ) |
19 | |
20 | html_file.write( ''' |
21 |
|
22 | <head> |
23 |
|
24 | <title>%s的扫描结果</title> |
25 | <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css"> |
26 | <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script> |
27 | <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script> |
28 | <style> |
29 |
|
30 | pre{ |
31 |
|
32 | margin: 0 0 0px; |
33 |
|
34 | } |
35 |
|
36 | </style> |
37 | </head> |
38 |
|
39 | <ul id="myTab" class="nav nav-tabs navbar-fixed-top navbar navbar-default"> |
40 | <li class="active"> |
41 | <a href="#ip" data-toggle="tab"> |
42 | IP历史解析 |
43 | </a> |
44 | </li> |
45 | <li><a href="#cms" data-toggle="tab">CMS识别</a></li> |
46 | <li><a href="#domain" data-toggle="tab">子域名信息</a></li> |
47 | </ul> |
48 | <br> |
49 | <br> |
50 | <br> |
51 | <br> |
52 | <div id="myTabContent" class="tab-content"> |
53 | '''%url ) |
54 | |
55 | class IP( threading.Thread ): |
56 | def __init__(self, ip): |
57 | threading.Thread.__init__(self) |
58 | self.ip = ip |
59 | def run(self): |
60 | r = requests.get( self.ip,headers = head ) |
61 | html = r.text |
62 | bs = BeautifulSoup(html, "html.parser") |
63 | html_file.write('<div class="tab-pane fade in active" id="ip">') |
64 | for i in bs.find_all('p'): |
65 | ipc = i.get_text() |
66 | ip_html = '<pre>{}</pre>'.format( ipc ) |
67 | html_file.write( ip_html ) |
68 | html_file.write('</div>') |
69 | |
70 | class CMS( threading.Thread ): |
71 | def __init__(self, cms): |
72 | threading.Thread.__init__(self) |
73 | self.cms = cms |
74 | def run(self): |
75 | cms = requests.post('http://whatweb.bugscaner.com/what/', data={'url': self.cms}, headers = head) |
76 | text = cms.text |
77 | Web_Frameworks = re.search('"Web Frameworks": "(.*?)"]', text) |
78 | Programming_Languages = re.search('"Programming Languages":(.*?)"]', text) |
79 | JavaScript_Frameworks = re.search('"JavaScript Frameworks": (.*?)"]', text) |
80 | CMS = re.search('"CMS": (.*?)"]', text) |
81 | Web_Server = re.search('"Web Servers": (.*?)"]', text) |
82 | if CMS: |
83 | CMS = CMS.group(1)+'"]' |
84 | if Programming_Languages: |
85 | Programming_Languages = Programming_Languages.group(1)+'"]' |
86 | if JavaScript_Frameworks: |
87 | JavaScript_Frameworks = JavaScript_Frameworks.group(1)+'"]' |
88 | if Web_Frameworks: |
89 | Web_Frameworks = Web_Frameworks.group(1)+'"]' |
90 | if Web_Server: |
91 | Web_Server = Web_Server.group(1)+'"]' |
92 | html = ''' |
93 | <div class="tab-pane fade" id="cms"> |
94 | <div class="table-responsive"> |
95 | <table class="table table-condensed"> |
96 | <tr> |
97 | <th>web框架</th> |
98 | <th>脚本版本</th> |
99 | <th>JavaScript框架</th> |
100 | <th>CMS框架</th> |
101 | <th>web服务器</th> |
102 | </tr> |
103 | <tr> |
104 | <td>{0}</td> |
105 | <td>{1}</td> |
106 | <td>{2}</td> |
107 | <td>{3}</td> |
108 | <td>{4}</td> |
109 | </tr> |
110 | </table> |
111 | </div> |
112 | </div> |
113 | '''.format(Web_Frameworks,Programming_Languages,JavaScript_Frameworks,CMS,Web_Server) |
114 | html_file.write( html ) |
115 | |
116 | class DOMAIN( threading.Thread ): |
117 | def __init__(self, domain): |
118 | threading.Thread.__init__(self) |
119 | self.domain = domain |
120 | def run(self): |
121 | r = requests.get( self.domain,headers = head ) |
122 | html = r.text |
123 | bs = BeautifulSoup(html, "html.parser") |
124 | html_file.write('<div class="tab-pane fade in active" id="domain"') |
125 | num = 0 |
126 | for i in bs.find_all('p'): |
127 | num += 1 |
128 | html_file.write( '<br>' ) |
129 | domainc = i.get_text() |
130 | domain_html = '<pre>[{}]: {}</pre>'.format( num,domainc ) |
131 | html_file.write( domain_html ) |
132 | print( domain_html ) |
133 | html_file.write('</div>') |
134 | |
135 | ip_cls = IP(ip) |
136 | ip_html = ip_cls.run() |
137 | |
138 | cms_cls = CMS(url) |
139 | cms_html = cms_cls.run() |
140 | |
141 | domain_cls = DOMAIN( domain ) |
142 | domain_html = domain_cls.run() |
github开源的子域名扫描器
https://github.com/lijiejie/subDomainsBrute
https://github.com/chuhades/dnsbrute
在线网站收集
1、
https://d.chinacycc.com/(非常推荐)
然后不到30秒就出结果了
2、
http://z.zcjun.com/
https://phpinfo.me/domain/
端口信息收集
扫描端口并且标记可以爆破的服务
1 | nmap 目标 --script=ftp-brute,imap-brute,smtp-brute,pop3-brute,mongodb-brute,redis-brute,ms-sql-brute,rlogin-brute,rsync-brute,mysql-brute,pgsql-brute,oracle-sid-brute,oracle-brute,rtsp-url-brute,snmp-brute,svn-brute,telnet-brute,vnc-brute,xmpp-brute |
判断常见的漏洞并扫描端口
1 | nmap 目标 --script=auth,vuln |
精确判断漏洞并扫描端口
1 | nmap 目标 --script=dns-zone-transfer,ftp-anon,ftp-proftpd-backdoor,ftp-vsftpd-backdoor,ftp-vuln-cve2010-4221,http-backup-finder,http-cisco-anyconnect,http-iis-short-name-brute,http-put,http-php-version,http-shellshock,http-robots.txt,http-svn-enum,http-webdav-scan,iis-buffer-overflow,iax2-version,memcached-info,mongodb-info,msrpc-enum,ms-sql-info,mysql-info,nrpe-enum,pptp-version,redis-info,rpcinfo,samba-vuln-cve-2012-1182,smb-vuln-ms08-067,smb-vuln-ms17-010,snmp-info,sshv1,xmpp-info,tftp-enum,teamspeak2-version |
我喜欢这样做
1、扫描子域名
提取出域名/ip
然后把域名放到975.txt
2、批量扫描端口和漏洞检测
1 | nmap -iL 975.txt --script=auth,vuln,ftp-brute,imap-brute,smtp-brute,pop3-brute,mongodb-brute,redis-brute,ms-sql-brute,rlogin-brute,rsync-brute,mysql-brute,pgsql-brute,oracle-sid-brute,oracle-brute,rtsp-url-brute,snmp-brute,svn-brute,telnet-brute,vnc-brute,xmpp-brute > scan.txt |
然后根据对应开放的端口进行针对性漏洞挖掘
c段信息收集
c段的话我一般都是使用iis put
这款工具来扫描,可以自定义扫描1-255
的端口并且还有返回服务器banner
信息
自定义的端口
1 | 135,139,80,8080,15672,873,8983,7001,4848,6379,2381,8161,11211,5335,5336,7809,2181,9200,50070,50075,5984,2375,7809,16992,16993 |
这里只是演示下他跑起来的美
目录信息收集
目录收集工具有很多,但是最看重的还是目录字典,之前我拿了很多工具的字典去重集合起来超级超级大,只不过是在之前电脑那里还原的时候忘记了备份、、、(说这句话主要是想让你们也可以这样子做,方便自己,然后发我一份,方便你我)
这里推荐一个工具7kbstorm
https://github.com/7kbstorm/7kbscan-WebPathBrute
像
403
、404
这种页面千万不要关闭,放目录里面扫就ok
谷歌语法收集铭感文件
最常见的就是用搜索引擎~
1 | site:ooxx.com filetype:xls |
首先试试百度
$!@!~~WDwadawicnm
试试必应
这里主要是收集网站敏感文件(比如目标的某个系统手册演示的截图中截图到了用户名,然后我们可以根据用户名来爆破密码;甚至可以看看有没有写系统默认密码,或者一些后台的目录路径,如果有目录就可以尝试对其访问,说不定有未授权~)
还能尝试对后台进行查找
1 | site:xxx.xxx admin |
2 | site:xxx.xxx login |
3 | site:xxx.xxx system |
4 | site:xxx.xxx 管理 |
5 | site:xxx.xxx 登录 |
6 | site:xxx.xxx 内部 |
7 | site:xxx.xxx 系统 |
还可以查找邮箱,然后进行钓鱼
1 | site:xxx.xxx 邮件 |
2 | site:xxx.xxx email |
还可以查找qq
群等,然后假装员工验证进去看群文件泄露了什么东东(这里有个技巧,去找客服聊天处,然后对整个过程抓包也就是看历史请求,如果运气好可能在请求的返回包中返回客服的姓名,如果只单纯的泄露了姓如张xx,那么你加群的时候就说你是小张工作号,说这个工作号的原因是可能小张已经在群里了)
1 | 注意事项:如果你是挖腾讯的话就不要看这条啦 |
2 | site:xxx.xxx qq |
3 | site:xxx.xxx 群 |
4 | site:xxx.xxx 企鹅 |
5 | site:xxx.xxx 腾讯 |
还可以对寻找一些公开的、危害大、普遍的漏洞的指纹,如下面的搜索jboss
系统
1 | site:ooxx.com inurl:jmx-console |
小技巧
比如下面一个站存在越权(但是越权的对象很难猜测)
1 | http://xxx.xxx.xxx/userinfo/?uid=2018-WOIDJWOIDJ-5201314 |
那么我们可以尝试用搜索引擎来找
1 | site:xxx.xxx inurl=uid=20 |
利用云网盘搜索工具搜集敏感文件
公司员工可能把一些内部资料放在了公网网盘,然后被在线云网盘搜索的网站抓取了,我们就可以利用这个来对目标系统进行深入交流
我这边主要用凌风云搜索
个人喜欢直接输入厂商名字然后搜索(比较全),然后边看电视(最好看鬼片,鬼出来的阶段想着找找找)边搜索
利用gayhub来收集信息
1、打开gayhub
这里就是找gayhub
全部开源项目内容中存在联想这个关键字的项目,这样子可以搜集到的方面更广,如果单纯只是对标题搜索,那么他们改成了lenovo
你就搜不到了
然后说再多,也没这个好用
https://sec.xiaomi.com/article/37
针对网站性收集
1、把网站弄报错,看是什么cms
,或者看返回包回显是什么中间件这些
2、看是linux
还是window
如目标url
是www.onlyfree.xxx/login
,那么改成www.onlyfree.xxx/Login
看看能不能访问,如果可以访问就可能是window
,否则可能是linux
3、可以去云溪等在线识别指纹的网站看指纹信息
http://whatweb.bugscaner.com/look/
http://www.yunsee.cn/finger.html
4、对waf
进行识别
这里有一款开源的识别工具,挺好用的
https://github.com/EnableSecurity/wafw00f
5、对网站whois
查询看注册人、手机号、邮箱等(可以收集起来放到密码生成工具)
6、看html
源代码,在一起项目测试的时候,我在找html
源代码的时候发现一个注释的js
文件,我将其打开后,里面的备注居然是配置信息。。。后台地址、管理员账号和密码等(可是我没get
到shell
,所以你要知道这回事而不要记住这件事)
7、网站真实ip
识别,下面是我用的一个工具,但是我忘记哪里下载的了,我原封不漏的粘贴出来
1 | ############################################################# |
2 | ### |
3 | ### ▄▄▄▄ ▄▄▄ ▄▄▄▄ ▀ ▄ |
4 | ### ▀ ▀█ ▄ ▄ ▄▄▄▄ █ ▄▀ ▀▄ ▄▄▄ ▄▄█▄▄ |
5 | ### ▄▄▄▀ █▄█ █▀ ▀█ █ █ ▄ █ █ █ |
6 | ### ▀█ ▄█▄ █ █ █ █ █ █ █ |
7 | ### ▀▄▄▄█▀ ▄▀ ▀▄ ██▄█▀ ▄▄█▄▄ █▄▄█ ▄▄█▄▄ ▀▄▄ |
8 | ### █ |
9 | ### ▀ |
10 | ### |
11 | ### name: xcdn.py |
12 | ### function: try to get the actual ip behind cdn |
13 | ### date: 2016-11-05 |
14 | ### author: quanyechavshuo |
15 | ### blog: http://3xp10it.cc |
16 | ############################################################# |
17 | # usage:python3 xcdn.py www.baidu.com |
18 | import time |
19 | import os |
20 | os.system("pip3 install exp10it -U --no-cache-dir") |
21 | from exp10it import figlet2file |
22 | figlet2file("3xp10it",0,True) |
23 | time.sleep(1) |
24 | |
25 | from exp10it import CLIOutput |
26 | from exp10it import get_root_domain |
27 | from exp10it import get_string_from_command |
28 | from exp10it import get_http_or_https |
29 | from exp10it import post_request |
30 | from exp10it import get_request |
31 | from exp10it import checkvpn |
32 | import sys |
33 | import re |
34 | |
35 | class Xcdn(object): |
36 | |
37 | def __init__(self,domain): |
38 | #必须保证连上了vpn,要在可以ping通google的条件下使用本工具,否则有些domain由于被GFW拦截无法正常访问会导致 |
39 | #本工具判断错误,checkvpn在可以ping通google的条件下返回1 |
40 | while 1: |
41 | if checkvpn()==1: |
42 | break |
43 | else: |
44 | time.sleep(1) |
45 | print("vpn is off,connect vpn first") |
46 | if domain[:4]=="http": |
47 | print("domain format error,make sure domain has no http,like www.baidu.com but not \ |
48 | http://www.baidu.com") |
49 | sys.exit(0) |
50 | #首先保证hosts文件中没有与domain相关的项,有则删除相关 |
51 | domainPattern=domain.replace(".","\.") |
52 | #下面的sed的正则中不能有\n,sed匹配\n比较特殊 |
53 | #http://stackoverflow.com/questions/1251999/how-can-i-replace-a-newline-n-using-sed |
54 | command="sed -ri 's/.*\s+%s//' /etc/hosts" % domainPattern |
55 | os.system(command) |
56 | |
57 | self.domain=domain |
58 | self.http_or_https=get_http_or_https(self.domain) |
59 | print('domain的http或https是:%s' % self.http_or_https) |
60 | result=get_request(self.http_or_https+"://"+self.domain,'seleniumPhantomJS') |
61 | self.domain_title=result['title'] |
62 | #下面调用相当于main函数的get_actual_ip_from_domain函数 |
63 | actual_ip = self.get_actual_ip_from_domain() |
64 | if actual_ip != 0: |
65 | print("恭喜,%s的真实ip是%s" % (self.domain, actual_ip)) |
66 | #下面用来存放关键返回值 |
67 | self.return_value=actual_ip |
68 | |
69 | |
70 | def domain_has_cdn(self): |
71 | # 检测domain是否有cdn |
72 | # 有cdn时,返回一个字典,如果cdn是cloudflare,返回{'has_cdn':1,'is_cloud_flare':1} |
73 | # 否则返回{'has_cdn':1,'is_cloud_flare':0}或{'has_cdn':0,'is_cloud_flare':0} |
74 | import re |
75 | CLIOutput().good_print("现在检测domain:%s是否有cdn" % self.domain) |
76 | has_cdn = 0 |
77 | # ns记录和mx记录一样,都要查顶级域名,eg.dig +short www.baidu.com ns VS dig +short baidu.com ns |
78 | result = get_string_from_command("dig ns %s +short" % get_root_domain(self.domain)) |
79 | pattern = re.compile( |
80 | r"(cloudflare)|(cdn)|(cloud)|(fast)|(incapsula)|(photon)|(cachefly)|(wppronto)|(softlayer)|(incapsula)|(jsdelivr)|(akamai)", re.I) |
81 | cloudflare_pattern = re.compile(r"cloudflare", re.I) |
82 | if re.search(pattern, result): |
83 | if re.search(cloudflare_pattern, result): |
84 | print("has_cdn=1 from ns,and cdn is cloudflare") |
85 | return {'has_cdn': 1, 'is_cloud_flare': 1} |
86 | else: |
87 | print("has_cdn=1 from ns") |
88 | return {'has_cdn': 1, 'is_cloud_flare': 0} |
89 | else: |
90 | # 下面通过a记录个数来判断,如果a记录个数>1个,认为有cdn |
91 | result = get_string_from_command("dig a %s +short" % self.domain) |
92 | find_a_record_pattern = re.findall(r"((\d{1,3}\.){3}\d{1,3})", result) |
93 | if find_a_record_pattern: |
94 | ip_count = 0 |
95 | for each in find_a_record_pattern: |
96 | ip_count += 1 |
97 | if ip_count > 1: |
98 | has_cdn = 1 |
99 | return {'has_cdn': 1, 'is_cloud_flare': 0} |
100 | return {'has_cdn': 0, 'is_cloud_flare': 0} |
101 | |
102 | |
103 | def get_domain_actual_ip_from_phpinfo(self): |
104 | # 从phpinfo页面尝试获得真实ip |
105 | CLIOutput().good_print("现在尝试从domain:%s可能存在的phpinfo页面获取真实ip" % self.domain) |
106 | phpinfo_page_list = ["info.php", "phpinfo.php", "test.php", "l.php"] |
107 | for each in phpinfo_page_list: |
108 | url = self.http_or_https + "://" + self.domain + "/" + each |
109 | CLIOutput().good_print("现在访问%s" % url) |
110 | visit = get_request(url,'seleniumPhantomJS') |
111 | code = visit['code'] |
112 | content = visit['content'] |
113 | pattern = re.compile(r"remote_addr", re.I) |
114 | if code == 200 and re.search(pattern, content): |
115 | print(each) |
116 | actual_ip = re.search(r"REMOTE_ADDR[^\.\d]+([\d\.]{7,15})[^\.\d]+", content).group(1) |
117 | return actual_ip |
118 | # return 0代表没有通过phpinfo页面得到真实ip |
119 | return 0 |
120 | |
121 | |
122 | def flush_dns(self): |
123 | # 这个函数用来刷新本地dns cache |
124 | # 要刷新dns cache才能让修改hosts文件有效 |
125 | CLIOutput().good_print("现在刷新系统的dns cache") |
126 | command = "service network-manager restart && /etc/init.d/networking force-reload" |
127 | os.system(command) |
128 | import time |
129 | time.sleep(3) |
130 | |
131 | |
132 | def modify_hosts_file_with_ip_and_domain(self,ip): |
133 | # 这个函数用来修改hosts文件 |
134 | CLIOutput().good_print("现在修改hosts文件") |
135 | exists_domain_line = False |
136 | with open("/etc/hosts", "r+") as f: |
137 | file_content = f.read() |
138 | if re.search(r"%s" % self.domain.replace(".", "\."), file_content): |
139 | exists_domain_line = True |
140 | if exists_domain_line == True: |
141 | os.system("sed -ri 's/.*%s.*/%s %s/' %s" % (self.domain.replace(".", "\."), ip, self.domain, "/etc/hosts")) |
142 | else: |
143 | os.system("echo %s %s >> /etc/hosts" % (ip, self.domain)) |
144 | |
145 | |
146 | def check_if_ip_is_actual_ip_of_domain(self,ip): |
147 | # 通过修改hosts文件检测ip是否是domain对应的真实ip |
148 | # 如果是则返回True,否则返回False |
149 | #CLIOutput().good_print("现在通过修改hosts文件并刷新dns的方法检测ip:%s是否是domain:%s的真实ip" % (ip,self.domain)) |
150 | #python通过requests库或mechanicalsoup库或selenium_phantomjs来请求时不会被dns缓存影响,只会被hosts文件影响dns解析,人工用浏览器访问域名则会受dns缓存影响 |
151 | CLIOutput().good_print("现在通过修改hosts文件的方法检测ip:%s是否是domain:%s的真实ip" % (ip,self.domain)) |
152 | os.system("cp /etc/hosts /etc/hosts.bak") |
153 | self.modify_hosts_file_with_ip_and_domain(ip) |
154 | #python通过requests库或mechanicalsoup库或selenium_phantomjs来请求时不会被dns缓存影响,只会被hosts文件影响dns解析,人工用浏览器访问域名则会受dns缓存影响 |
155 | #self.flush_dns() |
156 | hosts_changed_domain_title= get_request(self.http_or_https + "://%s" % self.domain,'selenium_phantom_js')['title'] |
157 | os.system("rm /etc/hosts && mv /etc/hosts.bak /etc/hosts") |
158 | #这里要用title判断,html判断不可以,title相同则认为相同 |
159 | if self.domain_title == hosts_changed_domain_title: |
160 | CLIOutput().good_print("检测到真实ip!!!!!!",'red') |
161 | return True |
162 | else: |
163 | CLIOutput().good_print("当前ip不是域名的真实ip",'yellow') |
164 | return False |
165 | |
166 | |
167 | def get_c_80_or_443_list(self,ip): |
168 | # 得到ip的整个c段的开放80端口或443端口的ip列表 |
169 | if "not found" in get_string_from_command("masscan"): |
170 | #这里不用nmap扫描,nmap扫描结果不准 |
171 | os.system("apt-get install masscan") |
172 | if self.http_or_https=="http": |
173 | scanPort=80 |
174 | CLIOutput().good_print("现在进行%s的c段开了80端口机器的扫描" % ip) |
175 | if self.http_or_https=="https": |
176 | scanPort=443 |
177 | CLIOutput().good_print("现在进行%s的c段开了443端口机器的扫描" % ip) |
178 | masscan_command = "masscan -p%d %s/24 > /tmp/masscan.out" % (scanPort,ip) |
179 | os.system(masscan_command) |
180 | with open("/tmp/masscan.out", "r+") as f: |
181 | strings = f.read() |
182 | #os.system("rm /tmp/masscan.out") |
183 | import re |
184 | allIP=re.findall(r"((\d{1,3}\.){3}\d{1,3})",strings) |
185 | ipList=[] |
186 | for each in allIP: |
187 | ipList.append(each[0]) |
188 | print(ipList) |
189 | return ipList |
190 | |
191 | |
192 | def check_if_ip_c_machines_has_actual_ip_of_domain(self,ip): |
193 | # 检测ip的c段有没有domain的真实ip,如果有则返回真实ip,如果没有则返回0 |
194 | CLIOutput().good_print("现在检测ip为%s的c段中有没有%s的真实ip" % (ip,self.domain)) |
195 | target_list=self.get_c_80_or_443_list(ip) |
196 | for each_ip in target_list: |
197 | if True == self.check_if_ip_is_actual_ip_of_domain(each_ip): |
198 | return each_ip |
199 | return 0 |
200 | |
201 | |
202 | def get_ip_from_mx_record(self): |
203 | # 从mx记录中得到ip列表,尝试从mx记录中的c段中找真实ip |
204 | print("尝试从mx记录中找和%s顶级域名相同的mx主机" % self.domain) |
205 | import socket |
206 | # domain.eg:www.baidu.com |
207 | from exp10it import get_root_domain |
208 | root_domain = get_root_domain(self.domain) |
209 | from exp10it import get_string_from_command |
210 | result = get_string_from_command("dig %s +short mx" % root_domain) |
211 | sub_domains_list = re.findall(r"\d{1,} (.*\.%s)\." % root_domain.replace(".", "\."), result) |
212 | ip_list = [] |
213 | for each in sub_domains_list: |
214 | print(each) |
215 | ip = socket.gethostbyname_ex(each)[2] |
216 | if ip[0] not in ip_list: |
217 | ip_list.append(ip[0]) |
218 | return ip_list |
219 | |
220 | |
221 | def check_if_mx_c_machines_has_actual_ip_of_domain(self): |
222 | # 检测domain的mx记录所在ip[或ip列表]的c段中有没有domain的真实ip |
223 | # 有则返回真实ip,没有则返回0 |
224 | CLIOutput().good_print("尝试从mx记录的c段中查找是否存在%s的真实ip" % self.domain) |
225 | ip_list = self.get_ip_from_mx_record() |
226 | if ip_list != []: |
227 | for each_ip in ip_list: |
228 | result = self.check_if_ip_c_machines_has_actual_ip_of_domain(each_ip) |
229 | if result != 0: |
230 | return result |
231 | else: |
232 | continue |
233 | return 0 |
234 | |
235 | |
236 | def get_ip_value_from_online_cloudflare_interface(self): |
237 | # 从在线的cloudflare查询真实ip接口处查询真实ip |
238 | # 如果查询到真实ip则返回ip值,如果没有查询到则返回0 |
239 | CLIOutput().good_print("现在从在线cloudflare类型cdn查询真实ip接口尝试获取真实ip") |
240 | url = "http://www.crimeflare.com/cgi-bin/cfsearch.cgi" |
241 | post_data = 'cfS=%s' % self.domain |
242 | content = post_request(url, post_data) |
243 | findIp = re.search(r"((\d{1,3}\.){3}\d{1,3})", content) |
244 | if findIp: |
245 | return findIp.group(1) |
246 | return 0 |
247 | |
248 | |
249 | def get_actual_ip_from_domain(self): |
250 | # 尝试获得domain背后的真实ip,前提是domain有cdn |
251 | # 如果找到了则返回ip,如果没有找到返回0 |
252 | CLIOutput().good_print("进入获取真实ip函数,认为每个domain都是有cdn的情况来处理") |
253 | import socket |
254 | has_cdn_value = self.domain_has_cdn() |
255 | if has_cdn_value['has_cdn'] == 1: |
256 | CLIOutput().good_print("检测到domain:%s的A记录不止一个,认为它有cdn" % self.domain) |
257 | pass |
258 | else: |
259 | CLIOutput().good_print("Attention...!!! Domain doesn't have cdn,I will return the only one ip") |
260 | true_ip = socket.gethostbyname_ex(self.domain)[2][0] |
261 | return true_ip |
262 | # 下面尝试通过cloudflare在线查询真实ip接口获取真实ip |
263 | if has_cdn_value['is_cloud_flare'] == 1: |
264 | ip_value = self.get_ip_value_from_online_cloudflare_interface() |
265 | if ip_value != 0: |
266 | return ip_value |
267 | else: |
268 | pass |
269 | # 下面尝试通过可能存在的phpinfo页面获得真实ip |
270 | ip_from_phpinfo = self.get_domain_actual_ip_from_phpinfo() |
271 | if ip_from_phpinfo == 0: |
272 | pass |
273 | else: |
274 | return ip_from_phpinfo |
275 | # 下面通过mx记录来尝试获得真实ip |
276 | result = self.check_if_mx_c_machines_has_actual_ip_of_domain() |
277 | if result == 0: |
278 | pass |
279 | else: |
280 | return result |
281 | print("很遗憾,在下认为%s有cdn,但是目前在下的能力没能获取它的真实ip,当前函数将返回0" % self.domain) |
282 | return 0 |
283 | |
284 | |
285 | if __name__ == '__main__': |
286 | import sys |
287 | domain=sys.argv[1] |
288 | Xcdn(domain) |
8、服务器ssh配置信息
丢工具:https://github.com/mozilla/ssh_scan
9、敏感文件爆破
svn
源代码泄露使用svn
版本控制系统时,错误操作将.svn
文件存放,那么久可以看他SVN
服务器账号密码等信息
1 | http://xxx.xxx.xxx/.svn/entries |
10、根据目标系统情况
根据目标系统情况是因为看他对应的系统是什么对应有什么漏洞,下面这个是tomcat
的session
泄露
1 | /examples/servlets/servlet/SessionExample/examples/ |
2 | /examples/servlets/servlet/SessionExample |
3 | /examples/ |
敏感目录泄露
WEB-INF/web.xml
泄露
WEB-INF
是Java
的WEB
应用的安全目录。如果想在页面中直接访问其中的文件,必须通过web.xml
文件对要访问的文件进行相应映射才能访问
1 | /WEB-INF/config/jdbc.properties |
2 | /WEB-INF/web.xml |
3 | /WEB-INF/classes/ |
4 | /WEB-INF/lib/ |
5 | /WEB-INF/src/ |
6 | /WEB-INF/database.properties |
bzr
泄露
通过它我们可以看项目历史
1 | http://xxx.xxx.xxx/.bzr/ |
- 网站源代码泄露
不多介绍,可能管理员觉得网站不安全,需要我们审计一下
1 | www.zip |
2 | www.tar.gz |
3 | www.rar |
4 | web.zip |
5 | web.rar |
6 | ... |
这些有很多,,不一一详细,后面我会将这些全部集合在一个字典里,然后我们可以放入目录遍历的工具里批量扫~
利用shodan、fofa等收集信息
查找标题是携程并且语言是国语的站点
1 | https://www.shodan.io/search?query=http.title:"携程" country:"CN" |
我们可以将其收藏为文件夹,方便下次打开,然后记录时间,看看有没有新上线的(这里已经有监控的功能,各位师傅可以去看看米斯特大佬写的shodan
监控文章,很有趣很实用)
shodan
、fofa
不多介绍了,有对应的手册,见的肯定比我好
思路扩展
思路扩展就是在a
功能点中找出b
功能点,以此类推
比如一些后台登录是
1 | http://xxx.xxx.xxx/admin-login |
我们是不是可以尝试吧login
改成register
来注册
再比如获取用户手机号的接口(这里不存在越权)
1 | http://xxx.xxx.xxx/user/GetPhone/?id=1 |
然后我们把GetPhone
改成GetPasswd
或者GetPwd
或者GetPassword
然后id
就可能可以越权,或者这里可以json
劫持或者origin
劫持等,我们可以诱导用户点开来劫持账号密码
或者还是看源代码,然后搜索hidden
(滑稽),我们可能可能会找到敏感操作的按钮,然后管理员也知道敏感,将其”隐藏”了,我们可以根据这个来搜索然后访问他,嘿嘿嘿(之前对一个小站点进行挖掘的时候我hidden
找居然找到了不可描述的目录下面放着不可描述的电影,当时我的心情是非常拒绝的,经过几小时的思考我迅速的将那个目录关闭了,毕竟我是祖国的花朵)
这里有很多是adrian
师傅与我分享的,然后暂时只写那么多吧(其实还有几个,怕触犯到权什么的就是他给你学了但不给我写的那种,很麻烦所以就以后有机会再写吧),如果遇到了更多我会补充
来源于网络,回馈于网络