ホームページ  >  記事  >  運用・保守  >  ポートスキャンにはどのような方法がありますか?

ポートスキャンにはどのような方法がありますか?

王林
王林転載
2020-08-10 17:19:5513475ブラウズ

ポートスキャンにはどのような方法がありますか?

インシデントの元の原因

(推奨チュートリアル: Web サーバー セキュリティ)

著者は、スクリプトを使用して侵入テスト中に収集する必要がある情報を自動的に収集する小さなツールを作成しています。このモジュールにはポート バナー情報の収集という難しい部分があり、最初は Python nmap マルチスレッド スキャンを使用して 20 個の IP をスキャンしようとしましたが、待ちきれなくなりました。 。 。著者の目標は、200 個の IP をスキャンすることです。次に、ポートスキャン技術を分析します。

1. Nmap 検出ポート

nmap が複数のホストをスキャンする場合、パラメーター --min-hostgroup を設定できます。このパラメーターを設定すると、複数のホストを並行してスキャンし、これらのホストをグループに分割できます。 、一度に 1 つのグループをスキャンします。

例:

--min-hostgroup 50 nmap はグループとして 50 個のホストを使用し、50 個のホストがスキャンされるまで結果は表示されません。

#coding=utf-8
import nmap 
from queue import Queue
from threading import Thread
def portscan(ip):
    portlist = []
    nm = nmap.PortScannerYield()
    for r in nm.scan(ip,ports='1-10000',arguments='-sS --min-hostgroup'):
        m = r[1]['scan'][ip]['tcp']
        for p in m:
            temp = str(p) + "----" +m[p]['state']
            portlist.append(temp)
    print(portlist)
class Consumer(Thread):
    def __init__(self, q):
        Thread.__init__(self)
        self.q = q
    def run(self):
        while  not self.q.empty():
            ip = self.q.get()
            try:
                portscan(ip)
            except Exception as e:
                print(e)
                continue
def producer(ip_list):
    num = 10
    threads = []
    q = Queue()
    for i in ip_list:
        print(i)
        q.put(i)
    threads = [Consumer(q) for i in range(0,int(num))]
    for t in threads:
        t.start()
    for t in threads:
        t.join()
ip_list =['120.78.207.76', '120.78.207.231', '120.78.207.18', '120.78.207.233', '120.78.207.165', '120.78.207.48', 
'120.78.207.112', '120.78.207.27', '120.78.207.51', '120.78.207.8']
producer(ip_list)

ポートスキャンにはどのような方法がありますか?

図に示すように、10 個の IP を実行するには 318 秒かかります。

2. Masscan 検出ポート

(1) Python Masscan を呼び出します

デフォルトでは、mascan は syn データ パケットを送信しますターゲット ホストが ack syn を返した場合、それはポートを意味します開いています。具体的なプロセスは次のとおりです。

#A:192.168.70.142

B:192.168.0.143 ポート 3306

#(1)A->B syn

# を開きます。 ##( 2)B->A 同期

(3)A->B RST

未開封のポートの検出ポートスキャンにはどのような方法がありますか? # A->B syn

B->A rst

##例:

def portscan(ip):
    mas = masscan.PortScanner()
    mas.scan(ip,ports='1-65535')
    print(mas.scan_result)

システム コマンド検出を使用するポートスキャンにはどのような方法がありますか?

使用方法

扫描扫描443端口的B类子网
Masscan 10.11.0.0/16 -p443
扫描80或443端口的B类子网
Masscan 10.11.0.0/16 -p80,443
扫描100个常见端口的B类子网,每秒100,000个数据包
Masscan 10.11.0.0/16  --top-ports 100 -rate 100000

结果输出
-oX filename:输出到filename的XML。
-oG filename:输出到filename在的grepable格式。
-oJ filename:输出到filename在JSON格式。


3. ソケット検出ポート

ソケット検出ポートは、次のように不完全な 3 ウェイ ハンドシェイク パケットを送信します。 ##A:192.168.70.142
B:192.168.0.143 ポート 3306 を開く

A は、B から返された同期パケットを受信した後、データを破棄します。

未開封のポートの検出

A は syn を送信しますが、B はポート 33 を開いていないため、RST パケットが返されます。

ポートスキャンにはどのような方法がありますか?

def portscan(ip,port):
    try:
        s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        s.settimeout(0.2)
        status = s.connect_ex((ip,port))
        if status == 0:
            temp_str = str(ip) + "---" + str(port) + "---open"
            port_list.append(temp_str)
        else:
            pass
    except Exception as e:
        pass
    finally:
        s.close()

10 個の IP を検出するのに 26.3 秒かかり、ほぼ 2.6 秒でした。 ポートスキャンにはどのような方法がありますか?

4. Telnet 検出ポート

ポートスキャンにはどのような方法がありますか?Telnet 検出ポートは完全な 3 ウェイ ハンドシェイク接続を使用します。コマンド telnet ip port を使用します。パケット送信プロセスは次のとおりです。

A:192.168.70.142

B:192.168.0.143 ポート 3306

telnet 192.168.0.143 3306

プロセスは次のとおりです。

TCP を使用します。接続を確立するための 3 ウェイ ハンドシェイク: SYN -> SYN ACK ACK

ポートスキャンにはどのような方法がありますか?

探测不存在端口,发送SYN数据包,然后RST包丢弃。

ポートスキャンにはどのような方法がありますか?

如果有返回值,则说明端口开放,否则则端口关闭。

def portscan(ip,port):
     try:
         t = telnetlib.Telnet(ip,port=port,timeout=0.2)
         if t:
             temp_str = str(ip) + '---' + str(port)
             port_list.append(temp_str)
 except Exception as e:
     print(e)
     pass

ポートスキャンにはどのような方法がありますか?

探测10个ip花费了27.8s差不多一个2.7s。

5、nc探测端口

nc探测端口采用完整的三次握手连接,使用命令 nc -v -w 1 -z ip port,发包过程和telent 探测一样。

探测开放端口的数据包

ポートスキャンにはどのような方法がありますか?

探测未开放端口的数据包

ポートスキャンにはどのような方法がありますか?

端口开放,返回值为0,可以依此作为判断依据。

def portscan(ip,port):
     command = 'nc -v -w 1 -z {0} {1}'.format(ip,port)
     m = os.system(command)
     if m == 0:
         temp_str = str(ip) + "---" + str(port)
         port_list.append(temp_str)
     else:
         pass

ポートスキャンにはどのような方法がありますか?

备注:比如你想探测某个指定的端口开放情况,推荐使用nc。

总结

nmap 作为扫描端口的神器,扫描出的结果比其他几种方式要详细。如果追求效率的话,建议采用socket。相比于nmap,socket会存在漏报情况,笔者在测试某主机时,nmap扫出了8888端口,但是socket没有。

以上がポートスキャンにはどのような方法がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsecpulse.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。