欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Python3制作TCP端口掃描器

 更新時間:2017年04月17日 10:56:50   作者:高海峰  
本文給大家分享的是使用Python3 實現(xiàn)TCP全連接端口掃描器的制作過程,包括思路和代碼,非常簡單易懂,推薦給大家

在滲透測試的初步階段通常我們都需要對攻擊目標(biāo)進(jìn)行信息搜集,而端口掃描就是信息搜集中至關(guān)重要的一個步驟。通過端口掃描我們可以了解到目標(biāo)主機(jī)都開放了哪些服務(wù),甚至能根據(jù)服務(wù)猜測可能存在某些漏洞。 TCP端口掃描一般分為以下幾種類型:

TCP connect掃描:也稱為全連接掃描,這種方式直接連接到目標(biāo)端口,完成了TCP三次握手的過程,這種方式掃描結(jié)果比較準(zhǔn)確,但速度比較慢而且可輕易被目標(biāo)系統(tǒng)檢測到。

TCP SYN掃描:也稱為半開放掃描,這種方式將發(fā)送一個SYN包,啟動一個TCP會話,并等待目標(biāo)響應(yīng)數(shù)據(jù)包。如果收到的是一個RST包,則表明端口是關(guān)閉的,而如果收到的是一個SYN/ACK包,則表示相應(yīng)的端口是打開的。

Tcp FIN掃描:這種方式發(fā)送一個表示拆除一個活動的TCP連接的FIN包,讓對方關(guān)閉連接。如果收到了一個RST包,則表明相應(yīng)的端口是關(guān)閉的。

TCP XMAS掃描:這種方式通過發(fā)送PSH、FIN、URG、和TCP標(biāo)志位被設(shè)為1的數(shù)據(jù)包。如果收到了一個RST包,則表明相應(yīng)的端口是關(guān)閉的。

下面我們將使用Python3 實現(xiàn)TCP全連接端口掃描器,下面進(jìn)入編程環(huán)節(jié)。

編碼實戰(zhàn)

全連接掃描方式的核心就是針對不同端口進(jìn)行TCP連接,根據(jù)是否連接成功來判斷端口是否打開,現(xiàn)在我們來實現(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è)置了默認(rèn)的超時時間為1秒,這要是掃描10000個端口,豈不是要等到花都謝了? 最簡單的辦法就是用多線程來提高效率,雖然python的多線程有點太弱了,不過至少可以利用我們等待的時間去干點別的。另外之前掃描的端口比較多, 顯示的信息我們看起來不方便,這次我們只顯示我們關(guān)心的打開的端口,并將打開端口的數(shù)量在掃描結(jié)束的時候顯示出來。

#!/usr/bin/python3
# -*- coding: utf-8 -*-
from socket import *
import threading

lock = threading.Lock()
openNum = 0
threads = []

def portScanner(host,port):
  global openNum
  try:
    s = socket(AF_INET,SOCK_STREAM)
    s.connect((host,port))
    lock.acquire()
    openNum+=1
    print('[+] %d open' % port)
    lock.release()
    s.close()
  except:
    pass

def 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 argparse

lock = threading.Lock()
openNum = 0
threads = []

def portScanner(host,port):
  global openNum
  try:
    s = socket(AF_INET,SOCK_STREAM)
    s.connect((host,port))
    lock.acquire()
    openNum+=1
    print('[+] %d open' % port)
    lock.release()
    s.close()
  except:
    pass

def 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á)端口掃描器的基本實現(xiàn)思路! 至于更詳細(xì)的功能可以基于這個基本結(jié)構(gòu)來逐步完善!

小結(jié)

本節(jié)主要講解了Python3實現(xiàn)一個簡單的端口掃描器的過程,本次實驗采用了Tcp全連接的方式,不斷嘗試連接主機(jī)的端口來判斷端口的開放情況,雖然存在一些缺點, 不過這種方式最適合初學(xué)者學(xué)習(xí),至于更復(fù)雜的方式以后學(xué)習(xí)起來也不會很難。想舉一反三的朋友可以根據(jù)協(xié)議和端口的對照關(guān)系來完成掃描時同時輸出協(xié)議, 這樣看起來會更好一些,至于更詳細(xì)的功能就留給大家做練習(xí)了!

相關(guān)文章

  • 關(guān)于安裝halcon包pycharm提示不全的問題

    關(guān)于安裝halcon包pycharm提示不全的問題

    很多小伙伴給小編反映在pycham上面安裝halcon對應(yīng)的安裝包之后,導(dǎo)入出現(xiàn)問題,發(fā)現(xiàn)輸入ha.read 沒有自動提示 ,只有幾個變量和方法,怎么解決這個問題呢,下面小編給大家?guī)砹税惭bhalcon包pycharm提示不全的問題,一起看看吧
    2021-06-06
  • 在python的類中動態(tài)添加屬性與生成對象

    在python的類中動態(tài)添加屬性與生成對象

    這篇文章給大家介紹了如何在python的類中動態(tài)添加屬性和生成對象,文中通過幾個方面來進(jìn)行介紹,對這感興趣的朋友們可以學(xué)習(xí)學(xué)習(xí)。
    2016-09-09
  • python中@符號實例詳解

    python中@符號實例詳解

    @是一個裝飾器,針對函數(shù),起調(diào)用傳參的作用,下面這篇文章主要給大家介紹了關(guān)于python中@符號的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • Python?ArcPy實現(xiàn)批量計算多時相遙感影像的各項元平均值

    Python?ArcPy實現(xiàn)批量計算多時相遙感影像的各項元平均值

    這篇文章主要為大家詳細(xì)介紹了如何基于Python中ArcPy模塊,實現(xiàn)對大量長時間序列柵格遙感影像文件的每一個像元進(jìn)行多時序平均值的求取,感興趣的可以了解一下
    2023-04-04
  • python修改和新增字典中鍵值對的2種方法

    python修改和新增字典中鍵值對的2種方法

    這篇文章主要給大家介紹了關(guān)于python修改和新增字典中鍵值對的2種方法,在Python中字典是一系列鍵值對,每個鍵都與一個值相關(guān)聯(lián),與鍵相關(guān)聯(lián)的值可以是數(shù)、字符串、列表乃至字典,需要的朋友可以參考下
    2023-07-07
  • Python實現(xiàn)的數(shù)據(jù)結(jié)構(gòu)與算法之隊列詳解

    Python實現(xiàn)的數(shù)據(jù)結(jié)構(gòu)與算法之隊列詳解

    這篇文章主要介紹了Python實現(xiàn)的數(shù)據(jù)結(jié)構(gòu)與算法之隊列,詳細(xì)分析了隊列的定義、功能與Python實現(xiàn)隊列的相關(guān)技巧,以及具體的用法,需要的朋友可以參考下
    2015-04-04
  • Django實現(xiàn)簡單登錄的示例代碼

    Django實現(xiàn)簡單登錄的示例代碼

    本文主要介紹了Django實現(xiàn)簡單登錄的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Python序列操作之進(jìn)階篇

    Python序列操作之進(jìn)階篇

    序列sequence是python中最基本的數(shù)據(jù)結(jié)構(gòu),本文是Python序列操作的進(jìn)階篇,本文先對序列做一個簡單的概括,之后將詳細(xì)講解下關(guān)于序列的操作方法。文中通過示例代碼介紹的很詳細(xì),有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • Python數(shù)據(jù)分析之?Pandas?Dataframe應(yīng)用自定義

    Python數(shù)據(jù)分析之?Pandas?Dataframe應(yīng)用自定義

    這篇文章主要介紹了Python數(shù)據(jù)分析之?Pandas?Dataframe應(yīng)用自定義,文章基于python的相關(guān)資料展開?Pandas?Dataframe應(yīng)用自定義的詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-05-05
  • python使用 HTMLTestRunner.py生成測試報告

    python使用 HTMLTestRunner.py生成測試報告

    這篇文章主要介紹了python使用 HTMLTestRunner.py生成測試報告 ,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10

最新評論