关于“ TypeError:需要一个类似字节的对象,而不是'str'”

时间:2019-02-11 23:28:34

标签: python python-3.x security

第一个帖子在这里。我几个月前就接触过python。我一直在研究Syngress的《 Violent Python》一书。

制作了一个txt文件,其中列出了多个版本的vsFTPd,另存为vuln_banners.txt。这只是txt文件中几行的列表。

我在做什么错?如果这是一个愚蠢的问题,或者非常简陋/愚蠢,我深表歉意。以任何形式感谢帮助。

运行代码后,我得到了此追溯错误:

Traceback (most recent call last):
  File "ban_grab2.py", line 33, in <module>
    main()
  File "ban_grab2.py", line 29, in main
    checkVulns(banner)
  File "ban_grab2.py", line 18, in checkVulns
    if line.strip('\n') in banner:
TypeError: a bytes-like object is required, not 'str'

下面是有问题的代码部分:

def checkVulns(banner):
    f = open('vuln_banners.txt', 'r')
    for line in f.readlines():
        if line.strip('\n') in banner:
            print('[+] Service is vulnerable: ' + banner.strip('\n'))

如果可以帮助更好地了解当前情况,请使用以下完整脚本:

import socket


def retBanner(ip, port):
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((ip, port))
        socket.setdefaulttimeout(2)
        banner = s.recv(1024)
        return banner
    except:
        return


def checkVulns(banner):
    f = open('vuln_banners.txt', 'r')
    for line in f.readlines():
        if line.strip('\n') in banner:
            print('[+] Service is vulnerable: ', + banner.strip('\n')


def main():
    portList = [21, 22, 25, 80, 110, 443]
    for r in range(1, 255):
        ip = '192.168.0.' + str(r)
        for port in portList:
            banner = retBanner(ip, port)
            if banner:
                checkVulns(banner)
                print('[+] ' + ip + ': ' + str(banner))


main()

这个脚本没什么好奇怪的,只是在我的虚拟网络中将其用于POC。

1 个答案:

答案 0 :(得分:1)

我相信,您会以某种方式将bytes对象作为banner参数传递给函数。

问题是banner.strip('\n') –您应该删除字符串并删除字符串,或者使用banner.strip(b'\n')删除字节(但稍后会遇到串联问题)。

混合字符串和原始字节通常是个坏主意,除非您知道自己在做什么。我建议您跟踪调用函数的位置和方式