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

Regarding "TypeError: a bytes-like object is required, not 'str'"

提问人:mana 提问时间:2/12/2019 最后编辑:mana 更新时间:11/18/2023 访问量:3569

问:

第一篇文章在这里。几个月前我开始接触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。

python-3.x 安全性

评论


答:

3赞 Slam 2/12/2019 #1

我相信,不知何故,您将对象作为参数传递给您的函数。bytesbanner

问题是 - 要么你应该有字符串并从中剥离字符串,要么剥离字节(但你以后会遇到连接问题)。banner.strip('\n')banner.strip(b'\n')

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

评论

0赞 mana 2/12/2019
感谢您的输入。我会接受你说的话,并尝试解决这个问题并弄清楚。
0赞 mana 2/12/2019
我编辑了原始帖子,以显示正在发生的事情的全部内容。仍然收到与上面所示相同的错误。我不确定我做错了什么。我尝试添加“b”来剥离字节,但似乎不起作用。“你应该有绳子并剥离绳子”是什么意思?感谢您的任何帮助,不胜感激。banner.strip(b'\n')
0赞 Rossywan França 11/17/2023 #2

您正在使用,但您没有迭代,因此:in

if line.strip("\n") == banner:

评论

0赞 Rossywan França 11/17/2023
* 迭代,对不起,我正在提高我的英语水平
0赞 Chris 11/18/2023
如果你需要修复某些东西,你可以(也应该)编辑你的答案。