getBanner
- 实现一个对设定端口组的扫描,获取对应端口号的
Banner
。由于不同服务器在其自己的端口上可能存在各自的漏洞,使用TCP
与不同端口号建立连接时,会返回标志端口应用的Banner
,收集到Banner
之后匹配自己的漏洞库,找出匹配的主机+端口。
开源代码
0x00 getBanner
main
def main():
if len(sys.argv) == 2:
filename = sys.argv[1]
if not os.path.isfile(filename):
print('[-] '+filename+' does\'nt exist.')
exit(0)
if not os.access(filename, os.R_OK):
print('[-] '+filename+' access denied.')
exit(0)
print('[+] Read vulnerabilities from '+filename)
else:
print('[-] Usage: ' + str(sys.argv[0]) +' <vuln file>')
exit(0)
portlist = [21,22,25,80,110,443]
ip = "127.0.0.1"
for port in portlist:
banner = retBanner(ip, port)
if banner:
print('[+] ' + str(port) + ': ' + str(banner,encoding='utf-8'))
- 使用
sys.argv
存放命令行参数。
os.path.isfile(filename)
判断字符串filename
是否指向文件,否则为空或者目录。
os.access(filename, os.R_OK)
判断当前用户对该文件是否拥有读权限(os.R_OK
为可读标志)。
retBanner
def retBanner(ip, port):
try:
socket.setdefaulttimeout(1)
s = socket.socket()
s.connect((ip, port))
banner = s.recv(1024)
return banner
except:
return
socket.setdefaulttimeout(1)
设置套接字的计时器,防止一直阻塞,这里避免recv()
函数一直等待数据传输。
recv()
返回字节类型,故在main()
函数中需要将Banner
转化为字符串。
guessCrypt
Unix Crypt
- 该
crypt
模块是Unix
crypt
库的接口,用于加密Unix
密码。它被记录为在Windows
上不可用,它不是通用加密库,故该部分在Ubuntu
实现。
开源代码
0x01 Unix Crypt
main
def main():
realPass = open('passwords.txt', 'r')
for line in realPass.readlines():
user = line.split(':')[0]
passwd = line.split(':')[1]
print('[+] Cracking Password For: ' + user)
word = testPass(passwd[:-1])
if word:
print('[+] ['+ user +'] Password Found:' + word)
else:
print('[-] ['+ user +'] Password Not Found.')
readline()
每只读取文件的一行,通常也是读取到的一行内容放到一个字符串变量中,返回str
类型。readlines()
每次按行读取整个文件内容,将读取到的内容放到一个列表中,返回list
类型。
testPass
def testPass(cryptPass):
salt = cryptPass[0:2]
passDict = open('dictionary.txt', 'r')
for word in passDict.readlines():
cryptWord = crypt.crypt(word[:-1], salt)
if cryptWord == cryptPass:
return word
return
crypt.crypt(word, salt)
就是加密的语句,通过该语句
- 所谓加Salt,就是加点“佐料”。当用户首次提供密码时(通常是注册时),由系统自动往这个密码里加一些“Salt值”,这个值是由系统随机生成的,并且只有系统知道。然后再散列。而当用户登录时,系统为用户提供的代码撒上同样的“Salt值”,然后散列,再比较散列值,已确定密码是否正确。
- 这样,即便两个用户使用了同一个密码,由于系统为它们生成的salt值不同,他们的散列值也是不同的。即便黑客可以通过自己的密码和自己生成的散列值来找具有特定密码的用户,但这个几率太小了(密码和salt值都得和黑客使用的一样才行)。
SHA-512
- 使用
hashlib
库实现对SHA-512
加密的破解。
开源代码
0x01 SHA-512
testPass
def testPass(cryptPass):
passDict = open('dictionary.txt', 'r')
for word in passDict.readlines():
cryptWord = hashlib.sha512(str.encode(word[:-1])).hexdigest()
if cryptWord == cryptPass:
return word
return
hashlib.sha512(str.encode(word[:-1])).hexdigest()
可以分为3
层理解
hashlib
调用库
sha512()
选择加密函数,512
表示位数。
hexdigest()
得到十六进制摘要。
zipCrack
开源代码
0x02 zipCrack
main
def main():
parser = optparse.OptionParser("usage%prog -f <zipfile> -d <dirctionary>")
parser.add_option('-f', dest='zname', type='string', help='specify zip file')
parser.add_option('-d', dest='dname', type='string', help='specify dictionary file')
(options, args) = parser.parse_args()
if options.zname == None or options.dname == None:
print(parser.usage)
exit(0)
else:
zname = options.zname
dname = options.dname
zfile = zipfile.ZipFile(zname)
passFile = open(dname, 'r')
for line in passFile.readlines():
password = line[:-1]
thrd = Thread(target=extractFile, args=(zfile, password))
thrd.start()
optparse.OptionParser("usage%prog -f <zipfile> -d <dirctionary>")
返回一个对象,其中配置的内容为该对象的usage
。
- 下面直接使用
parser.usage
指向字符串内容。
parser.add_option('-f', dest='zname', type='string', help='specify zip file')
可以指定某个参数之后跟随的内容作复制给dest
生成的变量名。
parser.parse_args()
返回命令行参数,返回一个二元组,第一元是当前选项的对象。
zipfile.ZipFile(zname)
返回.zip
文件对象,之后的操作都针对该对象。
Thread(target=extractFile, args=(zfile, password))
指定执行的函数以及函数所需的参数。
def extractFile(zfile, password):
try:
zfile.extractall(pwd=password)
print('[+] Found password : '+password)
exit(0)
except:
print('[-] Password Not Matched : '+password)
zfile.extractall(pwd=password)
如果密码不对即会报错,在外层使用try-except
区分密码是否匹配。
参考
Python无法导入Crypt
readline()和readlines()区别
加密中salt的含义