読者です 読者をやめる 読者になる 読者になる

sonickun.log

備忘録

/0アドレス空間を6分でスキャンできるという「masscan」を使ってみた

 ※はじめに言っておきますが実際にmasscanで/0スキャンをしたわけではありません.

 /0アドレス空間をわずか6分でスキャンできると言われる「masscan」というスキャンツールを使ってみました.なんと1秒間に1千万パケットを送信できるそうです.オソロシヤ
 
 robertdavidgraham/masscan · GitHub
 
 このまえZMAPという高速スキャナを使いましたが,それよりもはるかに速いです.
 


まずはインストールから

$ sudo apt-get install git gcc make libpcap-dev
$ git clone https://github.com/robertdavidgraham/masscan
$ cd masscan
$ make

 
 masscanの使い方は基本的にnmapと似ています.また,-Pnオプションや-nオプションなど,nmapのオプションもそのまま使えます.(masscan --nmapで使用可能なオプションを表示)
 
 試しに「google.com」の80番ポートを拝見してみました.

$ ./masscan -p80 173.194.117.174/28                   

Starting masscan 1.0.3 (http://bit.ly/14GZzcT) at 2014-08-29 08:34:03 GMT
 -- forced options: -sS -Pn -n --randomize-hosts -v --send-eth
Initiating SYN Stealth Scan
Scanning 16 hosts [1 port/host]
Discovered open port 80/tcp on 173.194.117.168                                 
Discovered open port 80/tcp on 173.194.117.172                                 
Discovered open port 80/tcp on 173.194.117.174                                 
Discovered open port 80/tcp on 173.194.117.164                                 
Discovered open port 80/tcp on 173.194.117.166                                 
Discovered open port 80/tcp on 173.194.117.160                                 
Discovered open port 80/tcp on 173.194.117.162                                 
Discovered open port 80/tcp on 173.194.117.165                                 
Discovered open port 80/tcp on 173.194.117.163                                 
Discovered open port 80/tcp on 173.194.117.161                                 
Discovered open port 80/tcp on 173.194.117.169                                 
Discovered open port 80/tcp on 173.194.117.167                                 
Discovered open port 80/tcp on 173.194.117.171                                 
Discovered open port 80/tcp on 173.194.117.170                                 
Discovered open port 80/tcp on 173.194.117.175                                 
Discovered open port 80/tcp on 173.194.117.173 

 
送信パケットをキャプチャしたらこんな感じ(IP以上のヘッダーのみ)

Internet Protocol Version 4, Src: 192.168.11.9 (192.168.11.9), Dst: 173.194.117.172 (173.194.117.172)
    Version: 4
    Header Length: 20 bytes
    Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT(Not ECN-Capable Transport))
        0000 00.. = Differentiated Services Codepoint: Default (0x00)
        .... ..00 = Explicit Congestion Notification: Not-ECT (Not ECN-Capable Transport) (0x00)
    Total Length: 40
    Identification: 0x4429 (17449)
    Flags: 0x00
        0... .... = Reserved bit: Not set
        .0.. .... = Don't fragment: Not set
        ..0. .... = More fragments: Not set
    Fragment offset: 0
    Time to live: 255
    Protocol: TCP (6)
    Header checksum: 0x8886 [validation disabled]
        [Good: False]
        [Bad: False]
    Source: 192.168.11.9 (192.168.11.9)
    Destination: 173.194.117.172 (173.194.117.172)
    [Source GeoIP: Unknown]
    [Destination GeoIP: Unknown]
Transmission Control Protocol, Src Port: 41243 (41243), Dst Port: http (80), Seq: 0, Len: 0
    Source Port: 41243 (41243)
    Destination Port: http (80)
    [Stream index: 0]
    [TCP Segment Len: 0]
    Sequence number: 0    (relative sequence number)
    Acknowledgment number: 0
    Header Length: 20 bytes
    .... 0000 0000 0010 = Flags: 0x002 (SYN)
        000. .... .... = Reserved: Not set
        ...0 .... .... = Nonce: Not set
        .... 0... .... = Congestion Window Reduced (CWR): Not set
        .... .0.. .... = ECN-Echo: Not set
        .... ..0. .... = Urgent: Not set
        .... ...0 .... = Acknowledgment: Not set
        .... .... 0... = Push: Not set
        .... .... .0.. = Reset: Not set
        .... .... ..1. = Syn: Set
            [Expert Info (Chat/Sequence): Connection establish request (SYN): server port http]
                [Connection establish request (SYN): server port http]
                [Severity level: Chat]
                [Group: Sequence]
        .... .... ...0 = Fin: Not set
    Window size value: 1024
    [Calculated window size: 1024]
    Checksum: 0xee60 [validation disabled]
        [Good Checksum: False]
        [Bad Checksum: False]
    Urgent pointer: 0

 一般的な(?)SYNパケットのように見えます.
 アプリケーション層のヘッダーは特に付加されていないようです.

 また,ACKが返ってきた直後にRSTパケットを送信することでステルススキャンを行っている様子が確認できました.

/0スキャンについて

 Entire Scanはいろいろと危険です(いろんな人に怒られちゃうかも).やるときには細心の注意をはらいましょう.
 また,全IPv4空間を数分でスキャンするにはギガビットイーサネット環境が必要となるでしょう.うかつに実行すると自分自身の回線がパンクするかもしれません.

 サブネットを/0にしてスキャンするのは通常のコマンドでは不可能です.("range too big"と表示される)
 それを可能にする悪魔のコマンドがこちら.

$ masscan 0.0.0.0/0 -p0-65535 --excludefile exclude.txt


 嬉しい事に,masscanでは--offlineオプションで,実際にネットワークにパケットを送らずにスキャンのパフォーマンステストができます.
 試しに1コア1GBメモリのVM上で/4スキャンのテストをしてみました.

$ time ./masscan -p80 0.0.0.0/4 --rate 100000000 --offline

Starting masscan 1.0.3 (http://bit.ly/14GZzcT) at 2014-08-29 09:18:12 GMT
 -- forced options: -sS -Pn -n --randomize-hosts -v --send-eth
Initiating SYN Stealth Scan
Scanning 268435456 hosts [1 port/host]
                                                                             
real    2m57.074s
user    2m17.820s
sys    0m0.256s

 このクソスペで3分とは恐ろしい...(笑)
 
 
 
 個人的にはnmapやzmapのようにUDPスキャンの実装も欲しかったなーと思います.
 
 
 最後にスキャナ関連で,最近ほよたかさんの「hping」の話が面白かったので紹介させていただきます.こちらのツールもなかなかに変態です.