pythonネットワーキングプログラムを作成していて、Linuxの電話やデスクトップなど、ネットワーク上で使用可能なすべてのホストを検出する必要があります。NMAP、Arp-Scan、arpなど、何がうまくいくかそうしないと?
NMAPでホストを発見するためにこれを試しました:
nmap -n -sn 192.168.1.0/24 | awk '/is up/ {print up}; {gsub (/\(|\)/,""); up = $NF}'
Arp-Scanの場合:
Sudo arp-scan -I wlp1s0 -l
そして、これはARPの場合:
arp -a
これらの各コマンドを次々に実行すると、次の結果が得られます。
seth@pixel:~$ Sudo arp-scan -I wlp1s0 -l
Interface: wlp1s0, datalink type: EN10MB (Ethernet)
Starting arp-scan 1.9 with 256 hosts (http://www.nta-monitor.com/tools/arp-scan/)
192.168.1.1 20:e5:2a:04:85:d2 NETGEAR INC.,
192.168.1.3 bc:c8:10:28:6e:38 Cisco SPVTG
192.168.1.4 e4:e0:a6:3f:45:88 (Unknown)
192.168.1.9 d4:f4:6f:25:0f:c3 (Unknown)
192.168.1.16 c0:ee:fb:ef:a0:90 (Unknown)
5 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.9: 256 hosts scanned in 2.271 seconds (112.73 hosts/sec). 5 responded
seth@pixel:~$ nmap -n -sn 192.168.1.0/24 | awk '/is up/ {print up}; {gsub (/\(|\)/,""); up = $NF}'
192.168.1.1
192.168.1.3
192.168.1.13
192.168.1.16
seth@pixel:~$ arp -a
? (192.168.1.73) at <incomplete> on wlp1s0
? (192.168.1.14) at <incomplete> on wlp1s0
? (192.168.1.207) at <incomplete> on wlp1s0
? (192.168.1.140) at <incomplete> on wlp1s0
? (192.168.1.77) at <incomplete> on wlp1s0
? (192.168.1.18) at <incomplete> on wlp1s0
? (192.168.1.211) at <incomplete> on wlp1s0
? (192.168.1.144) at <incomplete> on wlp1s0
? (192.168.1.81) at <incomplete> on wlp1s0
? (192.168.1.22) at <incomplete> on wlp1s0
? (192.168.1.215) at <incomplete> on wlp1s0
? (192.168.1.148) at <incomplete> on wlp1s0
? (192.168.1.5) at e4:e0:a6:3e:af:ad [ether] on wlp1s0
? (192.168.1.9) at d4:f4:6f:25:0f:c3 [ether] on wlp1s0
? (192.168.1.4) at e4:e0:a6:3f:45:88 [ether] on wlp1s0
? (192.168.1.16) at c0:ee:fb:ef:a0:90 [ether] on wlp1s0
? (192.168.1.3) at bc:c8:10:28:6e:38 [ether] on wlp1s0
? (192.168.1.3) at bc:c8:10:28:6e:38 [ether] on wlp1s0
ご覧のように、 arp -a
は、最短時間で最も多くのホストを返しますが、正確で信頼できますか?何を使うべきですか?特定のサブネット内のすべてのホストにpingを送信する単純なスクリプトを作成する必要がありますか?
特権のないUnix Shellユーザーの場合、デフォルトのプローブは、connectシステムコールを使用したポート80と443へのSYNパケットです。ローカルネットワークをスキャンする場合、このホスト検出で十分なことがよくありますが、セキュリティ監査には、より包括的な検出プローブのセットをお勧めします。
したがって、ホストがこれらのプローブに応答しない場合(厳格なファイアウォールやICMP応答がない場合など)、権限のないユーザーとしてnmap -sn
を実行しても正確な結果が返されないことがあります。 rootと同じスキャンを実行すると、代わりにARPが使用され、arp-scan
ツールと同じではないにしても同様の結果が生成されます。
arp -a
は、ネットワーク上のすべてのホストをスキャンしたり、必ずしも表示したりするわけではないことに注意してください。このコマンドは、ARPリクエストを送信した、または無償のARPを受信したホストからのエントリを含むARPテーブルを単にダンプします。
さらに、ファイアウォールが原因でこれらのホストが応答しない場合、すべてのホストにpingを実行するという考えは機能しない可能性があります(ファイアウォールは、このプラクティスのメリットに関係なく、一般にICMPをブロックするように設定されています)。
つまり、ARPスキャン(nmap、arp-scan、または独自のスクリプトを使用)は、ローカルネットワーク上のホストを特定するための最も信頼できる方法です。これは、極端な場合を除いてブロックされないためです。
Scapyで独自のスキャナーを構築しますか?次に、既知のバナーとそれぞれのサービスをスキャンすることにより、このスキャナーを電話とLinuxデスクトップに向けることができます。これは、ネットワークについてさらに理解を深めたい場合に最適なオプションです。