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


__EOF__

本文作者ch3uhx9
本文链接https://www.cnblogs.com/cheuhxg/p/14984254.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   CH3UHX9  阅读(111)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示