インシデントの元の原因
(推奨チュートリアル: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 サイトの他の関連記事を参照してください。