ホームページ  >  記事  >  バックエンド開発  >  Python3を使用してTCPポートスキャナを作成するグラフィックコードの詳細説明

Python3を使用してTCPポートスキャナを作成するグラフィックコードの詳細説明

黄舟
黄舟オリジナル
2017-04-18 10:01:392222ブラウズ

この記事では、Python3 を使用して TCP フル接続ポート スキャナーを実装するための制作プロセスを、アイデアとコードを含めて説明します。非常にシンプルで理解しやすいので、準備段階では誰にでもお勧めします。侵入テストでは、通常、攻撃を分析する必要があります。ターゲットは情報を収集します。ポート スキャンは情報収集の重要なステップです。ポート スキャンを通じて、ターゲット ホスト上でどのようなサービスが開いているかを知ることができ、サービスに基づいて特定の脆弱性がある可能性を推測することもできます。 TCP ポート スキャンは一般に次のタイプに分類されます:

TCP 接続スキャン: フル接続スキャンとも呼ばれるこの方法は、ターゲット ポートに直接接続し、TCP スリーウェイ ハンドシェイク プロセスを完了します。この方法のスキャン結果はより正確です。ただし、速度は遅くなり、ターゲット システムによって簡単に検出される可能性があります。

TCP SYN スキャン: セミオープン スキャンとも呼ばれるこのメソッドは、SYN パケットを送信し、TCP セッションを開始し、ターゲットの応答パケットを待ちます。 RST パケットを受信した場合はポートが閉じられていることを示し、SYN/ACK パケットを受信した場合は対応するポートが開いていることを示します。

Tcp FIN スキャン: このメソッドは、アクティブな TCP 接続の切断を示す FIN パケットを送信し、相手が接続を閉じることができるようにします。 RST パケットを受信した場合、対応するポートが閉じられていることを示します。

TCP XMAS スキャン: このメソッドは、PSH、FIN、URG、および TCP フラグ ビットが 1 に設定されたパケットを送信します。 RST パケットを受信した場合、対応するポートが閉じられていることを示します。

ここで、Python3 を使用して TCP 完全接続ポート スキャナーを実装し、

プログラミング

リンクに入ります。

コーディングの練習

full connection scan メソッドの核心は、さまざまなポートに対して TCP 接続を実行し、接続が成功したかどうかに基づいてポートが開いているかどうかを判断することです。最も単純なポート スキャナー :

#!/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 です。関数全连接扫描方式的核心就是针对不同端口进行TCP连接,根据是否连接成功来判断端口是否打开,现在我们来实现一个最简单的端口扫描器:

#!/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()

这段代码的核心就是portScanner函数,从其中的内容可以看出,只是进行了简单的TCP连接,如果连接成功则判断为端口打开,否则视为关闭。 我们来看一下运行结果:

这样的扫描看起来效率太低了,实际也确实很慢,因为我们设置了默认的超时时间为1秒,这要是扫描10000个端口,岂不是要等到花都谢了? 最简单的办法就是用多线程来提高效率,虽然python的多线程有点太弱了,不过至少可以利用我们等待的时间去干点别的。另外之前扫描的端口比较多, 显示的信息我们看起来不方便,这次我们只显示我们关心的打开的端口,并将打开端口的数量在扫描结束的时候显示出来。

#!/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()

运行看一下效果,如下图:

这下看起来是不是方便多了?至此效率上的问题解决了,现在我们还需要为扫描器增加一个 参数解析的功能,这样才能看起来像个样子,总不能每次都改代码来修改扫描目标和端口吧!

参数解析我们将用python3自带的标准模块argparse、この内容から、単純な TCP 接続のみが行われていることがわかります。接続が成功した場合はポートが開いていると判断され、そうでない場合はポートが閉じられていると見なされます。 実行結果を見てみましょう:

このように、スキャンは非効率すぎるように見えますが、デフォルトのタイムアウトを 1 秒に設定しているため、実際には非常に遅いです。10,000 個のポートをスキャンすると、花が消えるまで待つ必要があるのではないでしょうか。 最も簡単な方法は、効率を向上させるために multithreading を使用することです。Python のマルチスレッド処理は少し弱すぎますが、少なくとも待機時間を別のことに使えます。また、以前はスキャンされたポートが多かったので、表示される情報が不便に思えましたが、今回は注目する 開いているポート のみを表示し、開いているポートの数を最後に表示します。スキャン。

rrreee

以下に示すように、実行して効果を確認してください:

もっと便利になりませんか?この時点で、効率の問題は解決されましたが、スキャン ターゲットとポートを変更するために毎回コードを変更することはできないように、スキャナにパラメータ解析関数を追加する必要があります。

パラメータの解析には、python3 に付属の標準モジュール argparse を使用します。これにより、文字列

を自分で解析する手間が省けます。 コードを見てみましょう:

rrreee 以下に示すように、実行中の効果を見てください:

🎜🎜🎜 この時点で、ポート スキャナーは基本的に完成していますが、関数は比較的単純ですが、ポートスキャナーの基本的な実装アイデア! 細かい機能については、この基本構造をベースに少しずつ改良していきます! 🎜🎜🎜概要🎜🎜🎜 このセクションでは、主に Python3 で単純なポート スキャナーを実装するプロセスについて説明します。この実験では、ホストのポートへの接続を常に試みて、ポートのオープン状態を確認します。などのデメリットもありますが、この方法は初心者が学ぶのに最も適しており、将来的にはより複雑な方法を学ぶことも難しくありません。 1 つの例から推測したい場合は、プロトコルとポートの比較関係に従って、スキャンを完了し、同時にプロトコルを出力することができます。より詳細な機能については、これに任せます。みんな🎜運動🎜をしましょう! 🎜

以上がPython3を使用してTCPポートスキャナを作成するグラフィックコードの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。