クリスマスなのでポートスキャナを実装しましょう.

タイトル通りです.

クリスマスなのでポートスキャナを実装しようかと思ったら昔の俺が既に実装していました.投機的実装.

なぜクリスマスにポートスキャナを?

ポートスキャンの方法はいくつかあり,その中にXmas scanと呼ばれるものがあるので.

nmapはクリスマスに実行すると

Nmap wishes you a merry Christmas! Specify -sX for Xmas Scan (https://nmap.org/book/man-port-scanning-techniques.html).

って言われる.

ポートスキャンの方法

リポジトリにおいてあったメモをコピペする

How to port scan.

Client is scanner. Server is target.

SYN scan

ポートが空いている場合は

  1. Client: send SYN packet
  2. Server: send SYN|ACK packet
  3. Client: send ACK packet (実際のポートスキャンではここまで行う必要はない)

3way handshakeによりコネクションを確立する(できる)

空いていない場合

  1. Client: send SYN packet
  2. Server: send RST|ACK packet

サーバにより、RSTパケットが送り返されて終了する。

これでポートの状態がわかる。

FIN scan

  1. Client: send FIN packet
  2. Server: send RST packet

コネクション張ってないのにFINパケットだけ送る。

意味わからんけど、これに大してRFC793に厳密に準拠した実装を行っているTCPサーバは

ポートが閉じている場合、RSTパケットを返信する。

NULL scan

TCPのコントロールフラグを何も立てずに送信する。FINスキャンと同じ挙動。

X-mas scan

  1. Client: send FIN|URG|PSH packet
  2. Server: send RST packet

FIN|URG|PSHのフラグ立ったパケットを送信する。FINスキャンと同じ挙動。

実装

かなり昔に書いただけあって汚く,色々と修正したいが後回しにする.

thundersteel

なんでこの名前にしたかは思い出せないが,多分RIOTのthundersteelだと思う.

単一ファイルで200行ないくらい.もっと綺麗に書けばもっと小さくなるとおもうので皆さんやってみてください.

おわりに

この記事は23卒のエンジニア職志望向けAdvent Calendar Advent Calendar 2021の25日目の記事です