-
Notifications
You must be signed in to change notification settings - Fork 32
/
Copy pathCwebscan.py
133 lines (121 loc) · 4.76 KB
/
Cwebscan.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!/usr/bin/env python
#coding:utf-8
#Author:se55i0n
#c段web应用信息扫描工具
import IPy
import sys
import gevent
import argparse
import time
import socket
import requests
import dns.resolver
from gevent import monkey
from bs4 import BeautifulSoup
from multiprocessing.dummy import Pool as ThreadPool
from multiprocessing.dummy import Lock
from requests.packages.urllib3.exceptions import InsecureRequestWarning
reload(sys)
sys.setdefaultencoding('utf-8')
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
monkey.patch_all()
class Scanner(object):
def __init__(self, target, threads, custom_ports):
self.W = '\033[0m'
self.G = '\033[1;32m'
self.O = '\033[1;33m'
self.R = '\033[1;31m'
self.custom_ports = custom_ports
self.server = target
self.result = []
self.ips = []
self.time = time.time()
self.threads = threads
self.lock = Lock()
self.target = self.handle_target()
self.get_ip_addr()
def handle_target(self):
#处理给定扫描目标
try:
if int(self.server.split('.')[-1]) >= 0:
return '.'.join(self.server.split('.')[:3])+'.0/24'
except:
if not self.check_cdn():
return '.'.join(i for i in socket.gethostbyname(self.server).split('.')[:3])+'.0/24'
else:
print u'{}[-] 目标使用了CDN, 停止扫描...{}'.format(self.R, self.W)
sys.exit(1)
def check_cdn(self):
#cdn检测
myResolver = dns.resolver.Resolver()
myResolver.lifetime = myResolver.timeout = 2.0
dnsserver = [['114.114.114.114'],['8.8.8.8'],['223.6.6.6']]
try:
for i in dnsserver:
myResolver.nameservers = i
record = myResolver.query(self.server)
self.result.append(record[0].address)
except:
pass
finally:
return True if len(set(list(self.result))) > 1 else False
def get_ip_addr(self):
#获取目标c段ip地址
for ip in IPy.IP(self.target):
self.ips.append(ip)
def get_info(self, ip, port):
try:
url = 'http://{}:{}'.format(str(ip), str(port))
header = {'User-Agent': 'Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3)'}
res = requests.get(url, timeout=1, headers=header, verify=False, allow_redirects=True)
serv = res.headers['Server'].split()[0] if 'Server' in str(res.headers) else ''
title = BeautifulSoup(res.content,'lxml').title.text.strip('\n').strip()
result = '{}[+] {}{}{}{}{}'.format(self.G, url.ljust(28), str(res.status_code).ljust(6), serv.ljust(24), title, self.W)
self.lock.acquire()
print result
self.lock.release()
except Exception as e:
pass
def start(self, ip):
#自定义扫描端口使用协程进行处理
if self.custom_ports:
gevents = []
for port in self.custom_ports.split(','):
gevents.append(gevent.spawn(self.get_info, ip, port))
gevent.joinall(gevents)
else:
self.get_info(ip, 80)
def run(self):
try:
pool = ThreadPool(processes=self.threads)
pool.map_async(self.start, self.ips).get(0xffff)
pool.close()
pool.join()
print '-'*90
print u'{}[-] 扫描完成耗时: {} 秒.{}'.format(self.O, time.time()-self.time, self.W)
except Exception as e:
pass
except KeyboardInterrupt:
print u'\n[-] 用户终止扫描...'
sys.exit(1)
def banner():
banner = '''
______ __
/ ____/ _____ / /_ ______________ _____ ____ ___ _____
/ / | | /| / / _ \/ __ \/ ___/ ___/ __ `/ __ \/ __ \/ _ \/ ___/
/ /___ | |/ |/ / __/ /_/ (__ ) /__/ /_/ / / / / / / / __/ /
\____/ |__/|__/\___/_.___/____/\___/\__,_/_/ /_/_/ /_/\___/_/
'''
print '\033[1;34m'+ banner +'\033[0m'
print '-'*90
def main():
banner()
parser = argparse.ArgumentParser(description='Example: python {} [ip|domain] [-p8080,9090] '.format(sys.argv[0]))
parser.add_argument('target', help=u'192.168.1.1/www.baidu.com(默认扫描80端口)')
parser.add_argument('-t', type=int, default=50, dest='threads', help=u'线程数(默认50)')
parser.add_argument('-p', default=False, dest='custom_ports', help=u'自定义扫描端口(如-p8080,9090)')
args = parser.parse_args()
myscan = Scanner(args.target, args.threads, args.custom_ports)
myscan.run()
if __name__ == '__main__':
main()