python進(jìn)行TCP端口掃描的實(shí)現(xiàn)
首先我們供給一臺(tái)主機(jī)要進(jìn)行的步驟就是對(duì)其主機(jī)端口的掃描,查看其中開(kāi)放的端口。
我們首先創(chuàng)建一個(gè)TCP的全連接的掃描器。我們使用socket來(lái)創(chuàng)建連接器。
掃描端口開(kāi)放
#測(cè)試當(dāng)前主機(jī)和端口是否開(kāi)放,直接使用socket連接 def connScan(host,port): try: connSkt = socket.socket(socket.AF_INET, socket.SOCK_STREAM) connSkt.connect((host,port)) print("tcp open port:" + str(port)) except: print('tcp closed:'+str(port))
def portScan(tgtHost, tgtPorts): try: tgtIP = socket.gethostbyname(tgtHost) except: print("[-] Cannot resolve '%s': Unknown host" % tgtHost) return try: tgtName = socket.gethostbyaddr(tgtIP) print('\n[+] Scan Results for: ' + tgtName[0]) except: print('\n[+] Scan Results for: ' + tgtIP) socket.setdefaulttimeout(1) for tgtPort in tgtPorts: print('Scanning port ' + str(tgtPort)) connScan(tgtHost, int(tgtPort))
portScan('www.baidu.com', [80,443,3389,1433,23,445])
對(duì)百度的端口進(jìn)行掃描
[+] Scan Results for: 61.135.169.125 Scanning port 80 tcp open port:80 Scanning port 443 tcp open port:443 Scanning port 3389 tcp closed:3389 Scanning port 1433 tcp closed:1433 Scanning port 23 tcp closed:23 Scanning port 445 tcp closed:445
捕獲應(yīng)用標(biāo)識(shí)
為了從捕獲我們的目標(biāo)主機(jī)的應(yīng)用標(biāo)識(shí),我們必須首先插入額外的驗(yàn)證代碼到 connScan函數(shù)中。一旦發(fā)現(xiàn)開(kāi)放的端口,我們發(fā)送一個(gè)字符串?dāng)?shù)據(jù)到這個(gè)端 口然后等待響應(yīng)。收集這些響應(yīng)并推斷可能會(huì)得到運(yùn)行在目標(biāo)主機(jī)端口上的應(yīng) 用程序的一些信息。
#測(cè)試當(dāng)前主機(jī)和端口是否開(kāi)放,直接使用socket連接 def connScan(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("tcp open port:" + str(port)) print('[+] ' + str(results)) except: print('tcp closed:'+str(port)) def portScan(tgtHost, tgtPorts): try: tgtIP = socket.gethostbyname(tgtHost) except: print("[-] Cannot resolve '%s': Unknown host" % tgtHost) return try: tgtName = socket.gethostbyaddr(tgtIP) print('\n[+] Scan Results for: ' + tgtName[0]) except: print('\n[+] Scan Results for: ' + tgtIP) socket.setdefaulttimeout(1) for tgtPort in tgtPorts: print('Scanning port ' + str(tgtPort)) connScan(tgtHost, int(tgtPort))
portScan('www.qq.com', [22,80,443,3389,1433,23,445])
多線程掃描
因?yàn)槊恳粋€(gè)socket都有時(shí)間延遲,每一個(gè)socket掃描都將會(huì)耗時(shí)幾秒鐘,雖 然看起來(lái)無(wú)足輕重,但是如果我們掃描多個(gè)端口和主機(jī)延遲時(shí)間將迅速增大。 理想情況下,我們希望這些socket按順序掃描。引入Python線程。線程提供 了一種同時(shí)執(zhí)行的方式。在我們的掃描中利用線程,只需將 portScan()函數(shù)的迭代改一下。請(qǐng)注意,我們可以把每一個(gè)connScan()函數(shù)都 當(dāng)做是一個(gè)線程。在迭代的過(guò)程中產(chǎn)生的每一個(gè)線程將在同時(shí)執(zhí)行。
for tgtPort in tgtPorts: print('Scanning port ' + str(tgtPort)) t = threading.Thread(target=connScan, args=(tgtHost, int(tgtPort))) t.start()
使用nmap
import nmap def nmapScan(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')
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python使用Pandas庫(kù)常見(jiàn)操作詳解
這篇文章主要介紹了Python使用Pandas庫(kù)常見(jiàn)操作,結(jié)合實(shí)例形式詳細(xì)分析了Python Pandas模塊的功能、原理、數(shù)據(jù)對(duì)象創(chuàng)建、查看、選擇等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2020-01-01解決Tensorflow sess.run導(dǎo)致的內(nèi)存溢出問(wèn)題
今天小編就為大家分享一篇解決Tensorflow sess.run導(dǎo)致的內(nèi)存溢出問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02

ubuntu 18.04搭建python環(huán)境(pycharm+anaconda)

詳解Windows下PyCharm安裝Numpy包及無(wú)法安裝問(wèn)題解決方案

Python傳統(tǒng)圖像處理之皮膚區(qū)域檢測(cè)詳解

使用實(shí)現(xiàn)python連接hive數(shù)倉(cāng)的示例代碼

Python實(shí)現(xiàn)全自動(dòng)安裝第三方庫(kù)的方法