2


1

特定のアドレス範囲にいるクライアントの数を調べる方法は?

私はこれをグーグルで試しましたが、何も見つかりませんでした…​ 私はポートスキャナーを構築していますが、ネットワーク範囲、たとえば192.168.2。*をスキャンし、その範囲にあるオンラインのコンピューターの数を調べることができるようにしたいと思います。 Nmapのようにたくさん。 私はPythonでプログラミングしています。 これはPythonで可能ですか?

4 Answer


2


`python-nmap`を使用します。 基本的な使い方

import nmap
nm = nmap.PortScanner()
nm.scan(hosts='192.168.2.0/24', arguments='-n -sP -PE -PA21,23,80,3389')
hosts_list = [(x, nm[x]['status']['state']) for x in nm.all_hosts()]
for host, status in hosts_list:
    print('{0}:{1}'.format(host, status))

詳細については、http://pypi.python.org/pypi/python-nmapを参照してください


1


開始できる*下書き*の例を次に示します。

import socket

addr_range = "192.168.1.%d"

ip_address_up = []

# Use UDP.
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

s.settimeout(2.0)

for i in range(1, 254):
    try:
        ip = addr_range % i
        socket.gethostbyaddr(ip)
        ip_address_up.append(ip)
    except socket.herror as ex:
        pass

print ip_address_up

またはUDPに感謝するのではなくICMP(http://svn.pylucid.net/pylucid/CodeSnippets/ping.py[ping])を使用したこのようなもの:

import socket
import ping

ip_address_up = []

addr_range = "192.168.1.%d"

for i in range(1, 254):
   try:
       ip = addr_range % i
       delay = ping.do_one(ip, timeout=2)
       ip_address_up.append(ip)
   except (socket.herror, socket.timeout) as ex:
       pass

print ip_address_up


0


raw socketsを使用して、nmapのようなものを実装できます。 おそらく、通常のプログラミングインターフェイスと比較して、「奇妙な」ことを行う特別に細工されたパケットを使用して、最も有益なプローブを作成する必要があることがわかるでしょう。 IP / UDP / TCP RFCsで読む価値があります。

rawソケットを使用すると、通常は不可能/困難であるが、ホストを「だまして」豊富な情報を明らかにするオプション/構成を設定して、選択したプローブパケットをバイト単位で生成できます。


0


ローカルネット上のIPv4の場合、たとえばhttp://www.secdev.org/projects/scapy/[Scapy]、https://stackoverflowを使用して、http://en.wikipedia.org/wiki/Address_Resolution_Protocol [ARP]に頼ることができます。 .com / questions / 85577 / search-for-host-with-mac-address-using-python [関連する質問を参照]。