python进行TCP端口扫描的实现
首先我们供给一台主机要进行的步骤就是对其主机端口的扫描,查看其中开放的端口。
我们首先创建一个TCP的全连接的扫描器。我们使用socket来创建连接器。
扫描端口开放
#测试当前主机和端口是否开放,直接使用socket连接 defconnScan(host,port): try: connSkt=socket.socket(socket.AF_INET,socket.SOCK_STREAM) connSkt.connect((host,port)) print("tcpopenport:"+str(port)) except: print('tcpclosed:'+str(port))
defportScan(tgtHost,tgtPorts): try: tgtIP=socket.gethostbyname(tgtHost) except: print("[-]Cannotresolve'%s':Unknownhost"%tgtHost) return try: tgtName=socket.gethostbyaddr(tgtIP)print('\n[+]ScanResultsfor:'+tgtName[0]) except: print('\n[+]ScanResultsfor:'+tgtIP) socket.setdefaulttimeout(1) fortgtPortintgtPorts: print('Scanningport'+str(tgtPort))connScan(tgtHost,int(tgtPort))
portScan('www.baidu.com',[80,443,3389,1433,23,445])
对百度的端口进行扫描
[+]ScanResultsfor:61.135.169.125 Scanningport80 tcpopenport:80 Scanningport443 tcpopenport:443 Scanningport3389 tcpclosed:3389 Scanningport1433 tcpclosed:1433 Scanningport23 tcpclosed:23 Scanningport445 tcpclosed:445
捕获应用标识
为了从捕获我们的目标主机的应用标识,我们必须首先插入额外的验证代码到connScan函数中。一旦发现开放的端口,我们发送一个字符串数据到这个端口然后等待响应。收集这些响应并推断可能会得到运行在目标主机端口上的应用程序的一些信息。
#测试当前主机和端口是否开放,直接使用socket连接 defconnScan(host,port): try: connSkt=socket.socket(socket.AF_INET,socket.SOCK_STREAM) connSkt.connect((host,port)) connSkt.send('Python\r\n') results=connSkt.recv(100) print("tcpopenport:"+str(port)) print('[+]'+str(results)) except: print('tcpclosed:'+str(port)) defportScan(tgtHost,tgtPorts): try: tgtIP=socket.gethostbyname(tgtHost) except: print("[-]Cannotresolve'%s':Unknownhost"%tgtHost) return try: tgtName=socket.gethostbyaddr(tgtIP) print('\n[+]ScanResultsfor:'+tgtName[0]) except: print('\n[+]ScanResultsfor:'+tgtIP) socket.setdefaulttimeout(1) fortgtPortintgtPorts: print('Scanningport'+str(tgtPort)) connScan(tgtHost,int(tgtPort))
portScan('www.qq.com',[22,80,443,3389,1433,23,445])
多线程扫描
因为每一个socket都有时间延迟,每一个socket扫描都将会耗时几秒钟,虽然看起来无足轻重,但是如果我们扫描多个端口和主机延迟时间将迅速增大。理想情况下,我们希望这些socket按顺序扫描。引入Python线程。线程提供了一种同时执行的方式。在我们的扫描中利用线程,只需将portScan()函数的迭代改一下。请注意,我们可以把每一个connScan()函数都当做是一个线程。在迭代的过程中产生的每一个线程将在同时执行。
fortgtPortintgtPorts: print('Scanningport'+str(tgtPort)) t=threading.Thread(target=connScan,args=(tgtHost, int(tgtPort))) t.start()
使用nmap
importnmap defnmapScan(tgtHost,tgtPort): nmScan=nmap.PortScanner() results=nmScan.scan(tgtHost,tgtPort) state=results['scan'][tgtHost]['tcp'][int(tgtPort)]['state'] print("[*]"+tgtHost+"tcp/"+tgtPort+""+state) nmapScan('10.108.x.x','8080')
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。