はじめに
セキュリティツールの長い出力には、メモ、重複した観測、診断情報が含まれることがあります。有用な結果とは、由来を理解できる、関連する調査結果を絞り込んだものです。
この実習では、スキャンツールを実行する前に、提供されたテキストファイルで練習します。内容を読み、開いているサービスの記録を絞り込んで重複を除き、件数を数え、エラーと有用な出力を分けます。
用意された出力ファイルを読む
このステップでは、調査結果を抽出する前に、用意されたテキストファイルをいくつかの方法で調べます。これはサンプルデータであり、自分で実行するスキャンの出力ではありません。
準備済みの Kali シェルを開きます。
kali
絶対パスで共有作業ディレクトリを選びます。
cd /home/labex/project
observations.txt には、NOTE、OPEN、CLOSED で始まる短い行があります。ここで OPEN は、サンプルの観測でサービスが開いていると記されていることを意味し、脆弱性を証明するものではありません。小さなファイル全体を表示します。
cat observations.txt
開いているサービスの重複行に加え、メモや閉じているサービスの行が表示されます。先に元の内容を読むと、意図した情報を保持するフィルターを選べます。
長いファイルには、ファイルを変更せずに 1 ページずつ表示する less を使います。
less observations.txt
必要に応じて矢印キーで移動し、q で終了してシェルに戻ります。サンプルは 1 画面に収まる大きさですが、同じページャーは大きなツール出力にも使えます。
head はファイルの先頭、tail は末尾を読みます。-n は表示する行数を指定します。先頭 3 行を調べます。
head -n 3 observations.txt
想定される出力:
NOTE supplied training observations
OPEN training-web:8080 http
CLOSED training-db:5432 postgresql
次に末尾 2 行を調べます。
tail -n 2 observations.txt
最後の行は NOTE end of sample です。最初の実習で紹介した > 演算子で、3 行のプレビューを保存します。
head -n 3 observations.txt > preview.txt
cat preview.txt
プレビューには上記と同じ 3 行があるはずです。元の内容を変更せず、有用な表示を保存できました。
絞り込み、並べ替え、重複した調査結果の削除
このステップでは、開いているサービスの記録を残し、重複を除くパイプラインを作ります。
Kali 内で続け、共有ワークスペースに戻ります。
cd /home/labex/project
grep は一致する行を表示します。次のパターンはシングルクォートで囲み、シェルがそのまま渡すようにしています。アンカー ^ は行頭を意味し、OPEN の後の空白は記録の種類とデータを区切ります。
grep '^OPEN ' observations.txt
重複行を含め、開いているサービスの観測がすべて出力されます。メモと CLOSED の行は含まれません。
パイプ記号 | は、あるコマンドの標準出力を次のコマンドの標準入力につなぎます。sort は同じ行が隣り合うように並べ替えます。
grep '^OPEN ' observations.txt | sort
重複行がまとまりました。uniq は隣接する同一行を除くため、重複行が離れている可能性がある場合は、並べ替えの後に置きます。
grep '^OPEN ' observations.txt | sort | uniq
想定される出力:
OPEN training-dns:5353 dns
OPEN training-ssh:2222 ssh
OPEN training-web:8080 http
各コマンドには、記録の選択、並べ替え、重複の集約という一つずつの役割があります。結果のストリームを別の出力ファイルに保存します。
grep '^OPEN ' observations.txt | sort | uniq > open-services.txt
cat open-services.txt
同じ 3 件の重複のない記録が表示されるはずです。リダイレクトはパイプラインの最終出力に適用され、元の観測ファイルは編集されません。
結果を数え、エラー出力を分ける
このステップでは、選択した調査結果を数え、通常の出力とエラーメッセージを区別します。
共有ワークスペースから始めます。
cd /home/labex/project
wc はテキストを数えます。-l オプションは改行で終わる行を数えます。保存したファイルでは 1 行が 1 件の調査結果なので、その数は開いているサービスの異なる記録の件数です。
wc -l open-services.txt
出力には 3 とファイル名が表示され、間隔は異なる場合があります。パイプラインならファイル名の引数なしでテキストを渡せるので、件数だけを保存するのに便利です。
cat open-services.txt | wc -l > finding-count.txt
cat finding-count.txt
値は 3 で、先頭に空白が付く場合があります。
通常、プログラムは有用なデータを標準出力へ、診断情報を標準エラー出力へ送ります。シェルの > は標準出力を、2> は標準エラー出力をリダイレクトします。違いを観察するため、意図的に存在しないファイルを読み、その診断情報を保存します。missing-observations.txt が存在しないため、次のコマンドは失敗する想定です。意図的な実演なので、その後も続けてください。
cat missing-observations.txt 2> read-error.txt
エラーメッセージは read-error.txt に送られるため、画面には何も表示されないはずです。分けて保存した診断情報を調べます。
cat read-error.txt
メッセージには missing-observations.txt の名前があり、存在しないので読めないと示されます。実際の調査結果は引き続き別になっています。
cat open-services.txt
有効な 3 件の記録は変わりません。診断情報を分けておくと、エラーメッセージをツールの調査結果と間違えるのを防げます。
まとめ
cat、less、head、tail でテキストを読み、grep で行を選択し、sort と uniq のパイプラインを組み、wc で記録を数え、出力とエラーのリダイレクトを使いました。これらのスキルは、冗長なツール出力を小さく確認しやすい結果にまとめるのに役立ちます。



