《Python绝技》编程实战一

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

  • 实现一个暴力枚举.zip文件密码的脚本。

开源代码

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))指定执行的函数以及函数所需的参数。
    • 使用thrd.start()执行。

extractFile

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的含义

posted @ 2021-07-07 23:58  CH3UHX9  阅读(102)  评论(0编辑  收藏  举报