Python3实现TCP端口扫描器
?本文來自 高海峰對 玄魂工作室 的投稿
作者:高海峰 QQ:543589796
在滲透測試的初步階段通常我們都需要對攻擊目標(biāo)進(jìn)行信息搜集,而端口掃描就是信息搜集中至關(guān)重要的一個步驟。通過端口掃描我們可以了解到目標(biāo)主機(jī)都開放了哪些服務(wù),甚至能根據(jù)服務(wù)猜測可能存在某些漏洞。 TCP端口掃描一般分為以下幾種類型:
下面我們將使用Python3 實(shí)現(xiàn)TCP全連接端口掃描器,下面進(jìn)入編程環(huán)節(jié)。
編碼實(shí)戰(zhàn)?
全連接掃描方式的核心就是針對不同端口進(jìn)行TCP連接,根據(jù)是否連接成功來判斷端口是否打開,現(xiàn)在我們來實(shí)現(xiàn)一個最簡單的端口掃描器:
#!/usr/bin/python3 # -*- coding: utf-8 -*- from socket import *def portScanner(host,port):try:s = socket(AF_INET,SOCK_STREAM)s.connect((host,port))print('[+] %d open' % port)s.close()except:print('[-] %d close' % port)def main():setdefaulttimeout(1)for p in range(1,1024):portScanner('192.168.0.100',p)if __name__ == '__main__':main()?
這段代碼的核心就是portScanner函數(shù),從其中的內(nèi)容可以看出,只是進(jìn)行了簡單的TCP連接,如果連接成功則判斷為端口打開,否則視為關(guān)閉。 我們來看一下運(yùn)行結(jié)果:
這樣的掃描看起來效率太低了,實(shí)際也確實(shí)很慢,因?yàn)槲覀冊O(shè)置了默認(rèn)的超時時間為1秒,這要是掃描10000個端口,豈不是要等到花都謝了? 最簡單的辦法就是用多線程來提高效率,雖然python的多線程有點(diǎn)太弱了,不過至少可以利用我們等待的時間去干點(diǎn)別的。另外之前掃描的端口比較多, 顯示的信息我們看起來不方便,這次我們只顯示我們關(guān)心的打開的端口,并將打開端口的數(shù)量在掃描結(jié)束的時候顯示出來。
#!/usr/bin/python3 # -*- coding: utf-8 -*- from socket import * import threadinglock = threading.Lock() openNum = 0 threads = []def portScanner(host,port):global openNumtry:s = socket(AF_INET,SOCK_STREAM)s.connect((host,port))lock.acquire()openNum+=1print('[+] %d open' % port)lock.release()s.close()except:passdef main():setdefaulttimeout(1)for p in range(1,1024):t = threading.Thread(target=portScanner,args=('192.168.0.100',p))threads.append(t)t.start() for t in threads:t.join()print('[*] The scan is complete!')print('[*] A total of %d open port ' % (openNum))if __name__ == '__main__':main()?
運(yùn)行看一下效果,如下圖:
這下看起來是不是方便多了?至此效率上的問題解決了,現(xiàn)在我們還需要為掃描器增加一個 參數(shù)解析的功能,這樣才能看起來像個樣子,總不能每次都改代碼來修改掃描目標(biāo)和端口吧!
參數(shù)解析我們將用python3自帶的標(biāo)準(zhǔn)模塊argparse,這樣我們就省去了自己解析字符串的麻煩! 下面來看代碼:
#!/usr/bin/python3 # -*- coding: utf-8 -*- from socket import * import threading import argparselock = threading.Lock() openNum = 0 threads = []def portScanner(host,port):global openNumtry:s = socket(AF_INET,SOCK_STREAM)s.connect((host,port))lock.acquire()openNum+=1print('[+] %d open' % port)lock.release()s.close()except:passdef main():p = argparse.ArgumentParser(description='Port scanner!.')p.add_argument('-H', dest='hosts', type=str)args = p.parse_args()hostList = args.hosts.split(',')setdefaulttimeout(1)for host in hostList:print('Scanning the host:%s......' % (host))for p in range(1,1024):t = threading.Thread(target=portScanner,args=(host,p))threads.append(t)t.start() for t in threads:t.join()print('[*] The host:%s scan is complete!' % (host))print('[*] A total of %d open port ' % (openNum))if __name__ == '__main__':main()?
看一下運(yùn)行效果,如下圖:
至此我們的端口掃描器就基本完成了,雖然功能比較簡單,旨在表達(dá)端口掃描器的基本實(shí)現(xiàn)思路! 至于更詳細(xì)的功能可以基于這個基本結(jié)構(gòu)來逐步完善!
小結(jié)
本節(jié)主要講解了Python3實(shí)現(xiàn)一個簡單的端口掃描器的過程,本次實(shí)驗(yàn)采用了Tcp全連接的方式,不斷嘗試連接主機(jī)的端口來判斷端口的開放情況,雖然存在一些缺點(diǎn), 不過這種方式最適合初學(xué)者學(xué)習(xí),至于更復(fù)雜的方式以后學(xué)習(xí)起來也不會很難。想舉一反三的朋友可以根據(jù)協(xié)議和端口的對照關(guān)系來完成掃描時同時輸出協(xié)議, 這樣看起來會更好一些,至于更詳細(xì)的功能就留給大家做練習(xí)了!
查看完整系列教程,請關(guān)注我的微信訂閱號(xuanhun521,下方二維碼),回復(fù)“python”。問題討論請加qq群:Hacking?(1群):303242737?? Hacking?(2群):147098303。
?
玄魂工作室-精彩不斷
?
轉(zhuǎn)載于:https://www.cnblogs.com/xuanhun/p/5950433.html
總結(jié)
以上是生活随笔為你收集整理的Python3实现TCP端口扫描器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 8.2.1.10 Nested-Loop
- 下一篇: 【leetcode❤python】Mov