最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Python3制作TCP端口掃描器

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

在滲透測試的初步階段通常我們都需要對攻擊目標(biāo)進行信息搜集,而端口掃描就是信息搜集中至關(guān)重要的一個步驟。通過端口掃描我們可以了解到目標(biāo)主機都開放了哪些服務(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全連接端口掃描器,下面進入編程環(huán)節(jié)。

編碼實戰(zhà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)容可以看出,只是進行了簡單的TCP連接,如果連接成功則判斷為端口打開,否則視為關(guān)閉。 我們來看一下運行結(jié)果:

這樣的掃描看起來效率太低了,實際也確實很慢,因為我們設(shè)置了默認的超時時間為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()

運行看一下效果,如下圖:

這下看起來是不是方便多了?至此效率上的問題解決了,現(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()

看一下運行效果,如下圖:

至此我們的端口掃描器就基本完成了,雖然功能比較簡單,旨在表達端口掃描器的基本實現(xiàn)思路! 至于更詳細的功能可以基于這個基本結(jié)構(gòu)來逐步完善!

小結(jié)

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

相關(guān)文章

  • Python中的response.text與content區(qū)別詳解

    Python中的response.text與content區(qū)別詳解

    這篇文章主要介紹了Python中的response.text與content區(qū)別詳解,?從網(wǎng)絡(luò)請求下來的數(shù)據(jù),他們都是字節(jié)類型的,如果服務(wù)器不指定的話,默認編碼是"ISO-8859-1",我們使用text直接拿到的是字符串類型,沒有進行解碼操作,則會出現(xiàn)亂碼問題,需要的朋友可以參考下
    2023-12-12
  • Python基于模塊Paramiko實現(xiàn)SSHv2協(xié)議

    Python基于模塊Paramiko實現(xiàn)SSHv2協(xié)議

    這篇文章主要介紹了Python基于模塊Paramiko實現(xiàn)SSHv2協(xié)議,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • python進度條tqdm使用方式

    python進度條tqdm使用方式

    這篇文章主要介紹了python進度條tqdm使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • pycharm debug功能實現(xiàn)跳到循環(huán)末尾的方法

    pycharm debug功能實現(xiàn)跳到循環(huán)末尾的方法

    今天小編就為大家分享一篇pycharm debug功能實現(xiàn)跳到循環(huán)末尾的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • Python?在PDF中繪制線條、矩形、橢圓形的方法

    Python?在PDF中繪制線條、矩形、橢圓形的方法

    這篇文章主要介紹了Python在PDF中繪制線條、矩形、橢圓形,本文將通過以下幾個示例介紹如何使用Python在PDF中繪制不同的圖形,需要的朋友可以參考下
    2024-11-11
  • 詳解pycharm連接不上mysql數(shù)據(jù)庫的解決辦法

    詳解pycharm連接不上mysql數(shù)據(jù)庫的解決辦法

    這篇文章主要介紹了詳解pycharm連接不上mysql數(shù)據(jù)庫的解決辦法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Python 中星號(*)的用法小結(jié)

    Python 中星號(*)的用法小結(jié)

    星號??*?? 往往被稱為乘法運算符,是所有程序中最為常用的運算符號之一,在Python 中,星號還有很多隱藏的強大功能, 本文將用最容易理解的例子來解釋星號*的 五個使用場景,從初級用法到高階用法,感興趣的朋友可以參考下
    2023-08-08
  • 深入詳解Python中生成器的原理與應(yīng)用

    深入詳解Python中生成器的原理與應(yīng)用

    生成器 是Python中一種非常實用的特性,它能幫助我們編寫高效的代碼,本文將詳細為大家介紹生成器的原理、用法以及實際應(yīng)用場景,有需要的小伙伴可以了解下
    2023-12-12
  • Python類的基本寫法與注釋風(fēng)格介紹

    Python類的基本寫法與注釋風(fēng)格介紹

    這篇文章主要介紹了Python類的基本寫法與注釋風(fēng)格,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 用Python實現(xiàn)一個簡單的能夠上傳下載的HTTP服務(wù)器

    用Python實現(xiàn)一個簡單的能夠上傳下載的HTTP服務(wù)器

    這篇文章主要介紹了用Python實現(xiàn)一個簡單的能夠上傳下載的HTTP服務(wù)器,是Python網(wǎng)絡(luò)編程學(xué)習(xí)當(dāng)中的基礎(chǔ),本文示例基于Windows操作系統(tǒng)實現(xiàn),需要的朋友可以參考下
    2015-05-05

最新評論

钦州市| 蓬安县| 车险| 武清区| 江川县| 太和县| 永胜县| 车致| 寻乌县| 措勤县| 汝州市| 安图县| 海门市| 三原县| 白河县| 乐昌市| 随州市| 光泽县| 肥东县| 南通市| 卓资县| 抚顺市| 阿坝县| 湘乡市| 成安县| 安岳县| 兰考县| 夏河县| 浑源县| 堆龙德庆县| 肇源县| 象州县| 嘉善县| 贵阳市| 屏东县| 遂平县| 秦皇岛市| 佳木斯市| 灵丘县| 巴马| 静安区|