この記事について
TryHackMeの「Windows Command Line」というルームで学んだ内容を、Task単位でまとめたノートです。Cyber Security 101の「Command Line」モジュールに属するルームで、Windowsの標準コマンドプロンプト(cmd.exe)を使って、システム情報の確認・ネットワークのトラブルシューティング・ファイルやディスクの管理・プロセス管理という4つの基本操作を一通り扱っています。
課題の設問や答えはここには含めていません。あくまで各Taskで学んだコマンドの使い方や考え方を、自分の理解として整理したものです。
Task 1: なぜコマンドラインを学ぶのか
普段GUI(グラフィカルユーザーインターフェース)に慣れていると、CLI(コマンドラインインターフェース)は最初とっつきにくく感じます。でも、セキュリティの学習を進めていくと、攻撃対象のサーバーにGUIが用意されていない、SSHやリモートデスクトップの先が真っ黒な画面だけ、というケースにたくさん出会います。CLI操作は避けて通れないスキルだと、このTaskで改めて認識しました。
環境構築の手順も印象に残りました。AttackBox(TryHackMeが用意するブラウザ上の攻撃用マシン)を起動し、そこからSSHでターゲットのWindowsマシンに接続するのですが、初めて接続する相手だと「この接続を信頼するか」と確認を求められます。これはSSHの仕組み上ごく普通の安全確認で、パスワード入力時に画面に何も表示されないのも標準的な挙動です。この「AttackBoxからSSHでターゲットに入る」という流れは、この後の別のルームでも繰り返し登場する基本操作でした。
Task 2: 基本的なシステム情報を調べる
このTaskでは、マシンの基本情報を調べる代表的なコマンドを学びました。
-
set: 環境変数(environment variable、システムやプログラムが参照する設定値)を一覧表示するコマンドです。今回は特にPathという環境変数に注目しました。Path変数には、コマンド名だけを打ったときにどのフォルダを探しにいくかという一覧が;区切りで入っていて、これのおかげでdirやcdのようなコマンドをフルパスなしで実行できます。setは一覧表示だけでなく、set 変数名=値と書けば新しい環境変数を設定したり、既存の値を上書きしたりもできます。ただしこの方法で設定した変数はそのウィンドウを閉じると消える一時的なもので、恒久的に残したい場合はsetxという別のコマンドを使う必要がある、という点も併せて知りました。 -
ver: OSのバージョン情報だけをサクッと表示するコマンドです。 -
systeminfo: ホスト名・OS名・バージョン・製造元など、システムの詳細情報をまとめて表示してくれます。ペネトレーションテストの現場でも、まず対象のOS情報を把握するためによく使われるコマンドだと知りました。
もう1つ、|(パイプ)とmoreの組み合わせも学びました。パイプはあるコマンドの出力を別のコマンドの入力として渡す仕組みで、driverquery | moreのように使うと、長い出力をスペースキーでページ送りしながら見られます。
学んだこと
コマンドの意味を覚えるだけでなく、それらを組み合わせる発想が実務では重要だと感じました。たとえばdir /s(サブディレクトリを再帰的に表示するオプション)とfindstr(文字列検索コマンド、Linuxのgrepに近い)を組み合わせれば、dir /s /b C:\ | findstr flagのように、ディスク全体から特定のキーワードを含むファイルを探し出せます。単発のコマンドの暗記より、こうした組み合わせの引き出しを増やしていきたいと思いました。
関連キーワード
| キーワード(英語) | 説明 |
|---|---|
| environment variable(環境変数) | システムやプログラムが参照する設定値 |
| Path(環境変数) | コマンド実行時に探索されるフォルダの一覧が入った環境変数 |
pipe(|) |
あるコマンドの出力を別のコマンドの入力に渡す仕組み |
| findstr | 文字列を検索するコマンド。Linuxのgrepに近い |
Task 3: ネットワークのトラブルシューティング
ネットワーク関連のコマンドをまとめて学ぶTaskでした。CTFやペネトレーションテストでも頻出の基本セットです。
-
ipconfig/ipconfig /all: 自分のマシンのネットワーク設定を確認するコマンドです。Linuxでいうifconfigやip addrに近い立ち位置で、/allを付けるとMACアドレスやDHCPの状態など、より詳しい情報が見られます。 -
ping: 相手のマシンにICMPパケットを送って応答があるかを確認する、疎通確認の基本コマンドです。 -
tracert: 自分のマシンから相手のマシンまで、どんな経路(ルーター)を通っているかを1つずつ表示してくれます。通信がどこで止まっているかを切り分けるのに役立ちます。 -
nslookup: ドメイン名からIPアドレスを調べる、DNSの問い合わせコマンドです。 -
netstat: 現在の通信状況や待ち受けポートを確認するコマンドです。-a(全接続表示)・-n(数値表示、名前解決をスキップして高速化)・-o(PID表示)・-b(プログラム名表示)というオプションを組み合わせて使います。
学んだこと
netstatのオプションは-a -b -o -nと個別に書いてもよいのですが、Windowsではnetstat -abonのように連結して1つにまとめて書けます。この組み合わせは「全部の接続を、名前解決せず数値のまま、PIDとプログラム名つきで」一気に確認できる定番の書き方で、不審な通信をしているプロセスを調査するときの基本セットとして覚えておきたいと思いました。
また、Windowsのコマンドにはハイフン(-)を使うものとスラッシュ(/)を使うものが混在していて、最初は戸惑いました。調べてみると、dirやtasklistのようなDOS由来のコマンドはスラッシュ、netstatやpingのようなネットワーク系コマンドはハイフンを使う傾向があります。これはWindowsのTCP/IPスタック自体が歴史的にBSD(Unix系OSの一種)のネットワークコードをベースにしているためで、ネットワーク系コマンドがUnixの慣習を引き継いでいる、という背景を知って納得しました。厳密なルールがあるわけではないので、迷ったらコマンド名 /?や-hでヘルプを確認するのが確実です。
関連キーワード
| キーワード(英語) | 説明 |
|---|---|
| ipconfig | Windowsでネットワーク設定を確認するコマンド |
| ICMP(Internet Control Message Protocol) | pingなどで使われる、通信状態を確認するためのプロトコル |
| tracert(traceroute) | 対象までの経路上のルーターを追跡するコマンド |
| netstat -abon | 全接続を数値表示・PID・プログラム名つきで確認する定番の組み合わせ |
Task 4: ファイルとディスクの管理
ディレクトリの移動やファイル操作の基本コマンドを学ぶTaskでした。Linuxのコマンドラインに触れたことがあると、対応関係がイメージしやすいと思います。
| Windows | Linux(参考) | やること |
|---|---|---|
cd(引数なし) |
pwd |
今いる場所を確認 |
dir |
ls |
ディレクトリの中身一覧 |
mkdir / rmdir
|
mkdir / rmdir
|
ディレクトリの作成・削除 |
type |
cat |
ファイルの中身を表示 |
copy / move
|
cp / mv
|
ファイルのコピー・移動 |
del / erase
|
rm |
ファイルの削除 |
ワイルドカード文字*を使うと、複数のファイルをまとめて指定できます。copy *.md C:\Markdownのように書けば、拡張子が.mdのファイルを一括でコピーできます。
学んだこと
dir /s(サブディレクトリを再帰的に検索するオプション)は、それ単体でもファイル名を指定して検索に使えますが、名前の一部しか分からない場合はfindstrと組み合わせるのが実践的だと分かりました。dir /s /b C:\ | findstr /i キーワードのように書くと、/b(bare format、パスだけのシンプルな出力)でパイプに渡しやすい形にしたうえで、findstr /i(大文字小文字を区別しない)で目的のキーワードを含むファイルパスだけに絞り込めます。CTFで「サーバーのどこかに隠れているファイルを探す」といった場面で、まさに使える技だと感じました。
関連キーワード
| キーワード(英語) | 説明 |
|---|---|
wildcard(*) |
任意の文字列に一致させるための記号 |
| dir /s /b | サブディレクトリを再帰的に、パスのみのシンプルな形式で表示するオプション |
| findstr /i | 大文字小文字を区別せず文字列を検索するオプション |
Task 5: タスクとプロセスの管理
タスクマネージャーでやっていた「動いているプログラムを見る」「固まったプログラムを強制終了する」という操作を、コマンドラインで行う方法を学ぶTaskでした。
-
tasklist: 実行中のプロセス一覧をプロセス名とPID(Process ID)付きで表示します。/FI "imagename eq 対象.exe"のようにフィルタを指定して絞り込むこともできます。 -
taskkill /PID 対象のPID: PIDを指定してプロセスを強制終了します。
学んだこと
実務的な流れとして「見つける→正体を突き止める→対処する」という型が印象に残りました。たとえばnetstat -abonで見慣れないポートを見つけたら、そのPIDをtasklist /FI "PID eq 対象PID"で照会してプログラムの正体を特定し、危険と判断すればtaskkill /PID 対象PID /F(/Fは強制終了オプション)で止める、という流れです。また、taskkillには/PIDでPIDを1つずつ狙い撃ちする方法のほかに、/IM プロセス名 /Fのように名前を指定して同名のプロセスをまとめて終了させる方法もあり、状況に応じて使い分けられると知りました。この一連の流れは、インシデントレスポンス(Incident Response、セキュリティ事故発生時の初動対応)の基本的な考え方にも通じるものだと感じました。
関連キーワード
| キーワード(英語) | 説明 |
|---|---|
| tasklist | 実行中のプロセス一覧を表示するコマンド |
| PID(Process ID) | 実行中の各プロセスに割り振られる識別番号 |
| taskkill /PID / /IM | PIDまたはプロセス名を指定してプロセスを終了するコマンド |
Task 6: まとめ
このルームでは、システム情報の確認・ネットワークのトラブルシューティング・ファイル管理・プロセス管理という4つのテーマで、Windowsコマンドプロンプトの基本操作を一通り学びました。chkdsk(ディスクエラーのチェック)やsfc /scannow(システムファイルの破損チェック・修復)のように、このルームでは扱わなかったコマンドも名前だけ紹介されており、コマンドラインで扱える範囲の広さを実感しました。
学んだこと
コマンド名 /?や-hでヘルプページを表示できる、という基本を押さえておけば、知らないコマンドに出会っても自力で調べられます。全部のオプションを暗記するのではなく、「困ったらヘルプを見る」という習慣のほうが実務的には大切だと思いました。このルームを終えて、次はWindows PowerShellのルームに進む流れになっているので、続けて学んでいきたいと思います。
関連キーワード
| キーワード(英語) | 説明 |
|---|---|
/?(helpスイッチ) |
コマンドの使い方を表示する共通オプション |
| chkdsk | ディスクのエラーをチェックするコマンド |
| sfc /scannow | システムファイルの破損をスキャン・修復するコマンド |