はじめに
業務で久々にPowerShellに触れることになったので、何か簡単なものを作ってみようと考えて、簡易的なポートスキャン用ツール(ポートスキャナ)を作ってみました。
※あくまでも学習用なので、「nmapを使わないのか?」というツッコミは無しで...
ベースとなるコマンドは、こちらの記事に掲載されているものですが、これに少し味付けをしてWell-knownポートを一通り調査できるスクリプトにしてみました。
コード
- 以下のコードでは1~1023番までのWell-knownポートを順番に調べていますが、
Test-NetConnection
は1つのポート番号あたり2秒程度かかるので、1023番ポートの処理が終わるまでにかなりの時間がかかります。- 調べたいポートが決まっているのであれば、そのポート番号だけを抜き出して配列にしておく方が良いかもしれません。
- 実行結果は、通信可能なポートが
True
で、通信不可能なポートがFalse
と表示されます。 -
Test-NetConnection
を実行する度に警告が表示されるため、こちらのページを参考にして警告表示を一時的に停止させました。 - 一度定数を指定すると、スクリプトを繰り返し実行した時に「定数の上書きによるエラー」が発生してしまうため、こちらのページの方法で「定数が設定されていない事を確認した上で定数を設定する」という処理にしました。
portscan.ps1
# 「警告: TCP connect to (192.168.10.240 : 23) failed」などの警告を非表示にする。
$WarningPreference = "silentlycontinue"
# 調査対象のIPアドレスを定数にセット
if ([System.String]::IsNullOrEmpty($IP_ADDR) -eq $TRUE) {
Set-Variable -name IP_ADDR -value "192.168.10.240" -option Constant
}
# well-knownポートのスキャン
# ※Test-NetConnectionコマンドでは0番ポートはエラーとなるため、1番ポートからスキャンしている。
for ($i=1; $i -lt 1023; $i++){
# -InformationLevel Quietオプションを指定して、通信結果をTrue/Falseで取得する。
$result = Test-NetConnection -ComputerName $IP_ADDR -Port $i -InformationLevel Quiet
Write-Host "$($i)番ポート:$($result)"
}
# 警告設定を元に戻す。
$WarningPreference = "continue"
実行結果
1番ポート:False
2番ポート:False
3番ポート:False
...
21番ポート:False
22番ポート:True
23番ポート:False
...
79番ポート:False
80番ポート:True
81番ポート:False
...