./scanners/bannerscan.py

0.
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.
#!/usr/bin/python
#A banner scanner that uses nmap to search for open ports
#then attempts to recieve banner, then checks the banner 
#against a list of vulnerbale servers. I supplied a list
#but feel free to use your own or add to it. Line 58 
#has the location of the vuln_list, so change this if its not 
#in the same dir as this file.
 
#Changelog: added webserver scan, added more vuln servers to list, better syntax
#Changelog: added update function
 
#http://www.darkc0de.com
#d3hydr8[at]gmail[dot]com
 
import commands, sys, StringIO, re, string, socket, time, httplib, urllib2
 
def scan():
 
	nmap = StringIO.StringIO(commands.getstatusoutput('nmap -T 3 --open --host-timeout 25s -iR 1')[1]).read()
	ip = re.findall("\d*\.\d*\.\d*\.\d*", nmap)
	if ip: 
		ipaddr = ip[0]
		print "[+] Searching:",ipaddr
 
	ports = re.findall("\d+/tcp\s+(?=open)", nmap)
	for port in ports:
		port = port.split("/",1)[0]
		print "[+] Port:",port,"open, checking banner.\n"
		if port != "80" and port != "443":
			banscan(ipaddr, port)
		else:
			servtest(ipaddr, port)
 
def servtest(ip, port):
 
	server = ""
	try:
		h = httplib.HTTP(ip+":"+port)
		h.putrequest("HEAD", "/")
		h.putheader("Host", ip)
		h.endheaders()
		status, reason, headers = h.getreply()
		server = headers.get("Server")
		print server
	except: pass
 
	if server != None and server != "":
		for item in lines:
			if re.search(item[:-1].lower(), server.lower()): 
				print "\n[!] Match:",ipaddr,":",port,item
				print "[+]Response:",response,"\n"
 
 
def banscan(ipaddr, port):
 
	try:
		s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		s.settimeout(15)
		s.connect((ipaddr, int(port)))
		time.sleep(4)
		s.send("\r\n")
		response = s.recvfrom(1024)[0]
		s.close()
		for item in lines:
			  if re.search(item[:-1].lower(), response.lower()): 
					print "\n[!] Match:",ipaddr,":",port,item
					print "[+]Response:",response,"\n"
	except socket.error, msg:
   		print "[-] An error occurred:", msg
		pass
 
def update():
	try:
		lines = open(sys.argv[2], "r").readlines()
	except(IOError): 
 		print "[-] Error: Check your [",sys.argv[2],"] path and permissions"
		print "[-] Update Failed\n"
		sys.exit(1)
	try:
		paths = urllib2.urlopen("http://www.darkc0de.com/scanners/vuln_list.txt").readlines()
	except:
		print "[-] Error: Couldn't connect to remote database"
		print "[-] Update Failed\n"
		sys.exit(1)
	if len(paths) > len(lines):
		dif = int(len(paths)-len(lines))
		print "[+] Found:",dif,"updates"
		print "\n[+] Writing Updates"
		file = open(sys.argv[2], "a")
		for path in paths[-dif:]:
			if path[-1:] == "\n":
				path = path[:-1]
			print "[+] New:",path
			file.writelines(path+"\n")
		file.close()
		print "\n[+] Update Complete\n"
	else:
		print "[-] No Updates Available\n"
	sys.exit(1)
 
#................................................
print "\n   d3hydr8[at]gmail[dot]com BannerScan v1.2"
print "----------------------------------------------"
 
if len(sys.argv) >= 4 or len(sys.argv) == 1 or len(sys.argv) == 2:
	print "\nUsage: ./banscan.py <how many ips to scan> <path to vuln. server list>"
	print "\t[options]"
	print "\t   -u/-update <path to vuln. server list>: Updates vuln list with the latest"
	print "\n\t[+] Ex. ./banscan.py -update vuln_list.txt"
	print "\t[+] Ex: ./banscan.py 10000 /home/d3hydr8/vuln_list.txt\n"
	sys.exit(1)
 
if sys.argv[1].lower() == "-u" or sys.argv[1].lower() == "-update":
	print "\n[+] Updating Database File"
	update()
 
print "\n[+] Scanning:",sys.argv[1]
 
try:
	lines = open(sys.argv[2], "r").readlines()
	print "[+] Loaded:",len(lines),"vulnerable servers\n"
except(IOError): 
 	print "Error: Check your vuln_list path\n"
	sys.exit(1)
for x in xrange(int(sys.argv[1])):
	scan()
print "\n[-] Done\n"
 

Back