1

好的,所以基本上我决定尝试构建一个基本的端口扫描器。这是我的代码:

(上面还有更多,但觉得这里粘贴太多了)

##Print port menu
print "-"*60
print "Specify ports"
print "-"*60
print """
1)Use default list
2)Specify your own port list\n"""
print"-"*60
menu2=raw_input("Please choose an option\n")
##Define default port list
default_list="21, 22,23, 24, 25, 80, 110, 135, 139, 443, 445, 553, 3306, 3389, 8080"

##Set port list to default if option "1" is chosen
if menu2 == "1":
    port_list='default_list'

##Request user port list if option "2" is chosen
if menu2 == "2":
    port_list=raw_input("Please enter the ports you would like scanned.\neg. 22, 23\n")

print "Ok, here we go"

for i in str(port_list):
    connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    results = connection.connect_ex(ip + i)

哪个对我来说看起来不错,但是当我运行它时,我收到一个错误“AF_INET 地址必须是元组,而不是 str”我不确定哪一部分是问题?是我的默认端口字符串抛出错误吗?还是我的IP地址格式有问题?我尝试了一些我的设备 IP 地址,但总是得到同样的错误。

4

2 回答 2

3

文档中:

AF_INET 地址族使用一对 (host, port),其中 host 是一个字符串,表示 Internet 域表示法中的主机名,如“daring.cwi.nl”或 IPv4 地址,如“100.50.200.5”,端口为一个整数。

因此,假设您的ip变量是“100.50.200.5”之类的 IP 地址,并且i是带有端口号的整数,您的连接代码应该如下所示

result = connection.connect_ex((ip, i))

但是,看起来您的循环在 port_list 变量上进行了交互,该变量是一个字符串。要使其工作,您需要将此字符串(例如“22, 23”)转换为整数列表([22, 23])。

例如,您可以像这样重写您的代码:

##Print port menu
print "-"*60
print "Specify ports"
print "-"*60
print """
1)Use default list
2)Specify your own port list\n"""
print"-"*60
menu2=raw_input("Please choose an option\n")
##Define default port list
default_list="21, 22,23, 24, 25, 80, 110, 135, 139, 443, 445, 553, 3306, 3389, 8080"

##Set port list to default if option "1" is chosen
if menu2 == "1":
    port_list = default_list

##Request user port list if option "2" is chosen
if menu2 == "2":
    port_list = raw_input("Please enter the ports you would like scanned.\neg. 22, 23\n")

print "Ok, here we go"

port_list = [int(port.strip()) for port in port_list.split(',')]

for port in port_list:
    connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    results = connection.connect_ex((ip, port))
于 2013-06-15T23:32:33.513 回答
2

我想而不是

# abbreviated 
default_list = "21, 22, 23, 24, 25, 80, 110, 135, 139"
...
if menu2 == "1":
    port_list='default_list'

你的意思是:

default_list = (21, 22, 23, 24, 25, 80, 110, 135, 139)
...
if menu2 == "1":
    port_list = default_list

最后而不是循环遍历字符串的字符:

for i in str(port_list):
    # do something

我猜你想遍历端口号列表:

for port in port_list:
    # do something
于 2013-06-15T23:26:31.293 回答