【发布时间】:2017-12-08 01:16:18
【问题描述】:
我是 Python 新手,对我在下面编写的脚本感到困惑 工作不正常,我现在处于看不到木材的阶段 树。
我尝试从“暴力 Python”一书中创建端口扫描器。我相信 这本书使用 Python 2.6,但我使用 Python 3.7 创建它。
使用本网站上其他帖子中的提示和技巧,我有端口扫描仪 在我的实验室设置中扫描一些计算机,但是,扫描总是 显示端口被“关闭”。我使用 nmap 扫描计算机以确保我有 在我的端口扫描脚本中使用的一些开放端口。
我的脚本在下面。
import optparse
from socket import *
from threading import *
screenLock = Semaphore(value=1)
def connScan(tgtHost, tgtPort):
try:
connSkt = socket(AF_INET, SOCK_STREAM)
connSkt.connect((tgtHost, tgtPort))
connSkt.send('ViolentPython\r\n')
results = connSkt.recv(100)
screenLock.acquire()
print('[+]%d/tcp open'% tgtPort)
print('[+]' + str(results))
except:
screenLock.acquire()
print('[-]%d/tcp closed'% tgtPort)
finally:
screenLock.release()
connSkt.close()
def portScan(tgtHost, tgtPorts):
try:
tgtIP = gethostbyname(tgtHost)
except:
print("[-] Cannot resolve '%s': Unknown host"%tgtHost)
return
try:
tgtName = gethostbyaddr(tgtIP)
print('\n[+] scan results for: ' + tgtName[0])
except:
print('\n[+] Scan results for: ' + tgtIP)
setdefaulttimeout(1)
for tgtPort in tgtPorts:
t = Thread(target=connScan, args=(tgtHost, int(tgtPort)))
t.start()
def main():
parser = optparse.OptionParser('usage %prog '+ '-H <target host> -p <target port>')
parser.add_option('-H', dest='tgtHost', type='string', help='specify target host')
parser.add_option('-p', dest='tgtPort', type='string', help='specify target port[s] seperated by comma')
(options, args) = parser.parse_args()
tgtHost = options.tgtHost
tgtPorts = [p.strip() for p in options.tgtPort.split(',')]
if (tgtHost == None) | (tgtPorts[0] is None):
print(parser.usage)
exit(0)
portScan(tgtHost, tgtPorts)
if __name__ == '__main__':
main()
我从 Powershell 运行脚本:
python 01_portscan_revA.py -H 192.168.0.207 -p 22,80,135,443,445
产生以下输出:
[+] Scan results for: 192.168.0.207
[-]22/tcp closed
[-]135/tcp closed
[-]445/tcp closed
[-]139/tcp closed
[-]80/tcp closed
[-]443/tcp closed
我确定它不是一百万英里之外,我会非常感激任何帮助 任何人都可以尝试解决这个问题。
非常感谢
感谢大家回复我。我又看了一遍我的剧本 做了一些更改,我不确定这些是否正确。
我将 def connScan 更改如下以捕获错误。
def connScan(tgtHost, tgtPort):
try:
connSkt = socket(AF_INET, SOCK_STREAM)
connSkt.connect((tgtHost, tgtPort))
connSkt.send (b'ViolentPython\r\n')
results = connSkt.recv(100)
screenLock.acquire()
print('[+]%d/tcp open'% tgtPort)
print('[+]' + str(results))
except Exception as e:
screenLock.acquire()
print('Error: {0}'.format(str(e)))
print('[-]%d/tcp closed'% tgtPort)
finally:
screenLock.release()
connSkt.close()
最初我收到一个“期望字节类型对象”错误,所以我在其中添加了一个“b” 'Violentpython' 的前面要转换为字节。
现在输出如下所示:
[+] scan results for: Cheryls
[+]139/tcp open
[+]b'\x83\x00\x00\x01\x8f'
Error: [WinError 10054] An existing connection was forcibly closed by the
remote host
[-]445/tcp closed
Error: timed out
[-]80/tcp closed
Error: timed out
[-]443/tcp closed
Error: timed out
[-]135/tcp closed
Error: timed out
[-]1030/tcp closed
我收到 Vovanrock2002 建议的超时错误。
【问题讨论】:
-
您是否尝试在
except块中打印错误? -
另外,端口打开并不意味着它会接受您发送给它的任何数据。许多服务器会在您发送意外数据(例如
ViolentPython\r\n在您的情况下)的那一刻启动并强制关闭连接,这将导致异常,您会错误地将其检测为关闭的端口。 -
永远不要在代码中使用
except语句。这将隐藏基本错误,如语法错误、拼写错误的变量或尝试访问不存在的属性。始终捕获特定的异常列表。
标签: python python-3.x