源于《python绝技:运用python成为顶级黑客》
代码:
import socket
import os
import sys
def retBanner(ip, port):
try:
socket.setdefaulttimeout(2)
s = socket.socket()
s.connect((ip,port))
banner = s.recv(1024)
return banner
except:
return
def checkVulns(banner, filename):
f = open(filename,'r')
for line in f.readlines():
if line.strip('\n') in banner:
print("[+] Server is vulnerable: " + banner.trip('\n'))
def main():
if len(sys.argv) ==2:
filename = sys.argv[1]
if not os.path.isfile(filename):
print("[-] "+filename+' does not exist')
exit(0)
if not os.access(filename, os.R_OK):
print("[-] "+filename+' access denied.')
exit(0)
else:
print("[-] Usage: "+ str(sys.argv[0])+' <vuln filename>')
exit(0)
#定义要扫描的端口
portList = [21,22,25,80,110,135,139,443,445,5357]
#循环要扫描的ip
for x in range(1,255):
ip = str('192.168.1.'+str(x))
#循环扫描的端口
for port in portList:
banner = str(retBanner(ip, port))
if banner:
print("[+] "+ ip +":"+ str(port)+": "+banner)
checkVulns(banner, filename)
if __name__ == '__main__':
main()
用法:python3 文件名 漏洞文件名
例如:python3 scan.py vuln.txt
函数介绍:
retBanner: 接收ip和端口号,进行socket通信,然后返回的数据(1024),然后返回接收到的数据。
checkVulns : 接收banner指纹信息和漏洞文件名,读取含有漏洞的服务版本文件,进行遍历,与banner指纹信息进行比对,如果符合,返回漏洞可利用。不符合,遍历完后就自动退出了。
main:通过python的sys模块接收文件名,判断文件是否存在和文件的权限。定义了一个要扫描的端口列表。定义要扫描的ip列表,循环扫描。