このシリーズ・”Linux for Hackers”は、ハッカーを志すもののLinuxを触った事が無い人の為に作成された。
私は、あらゆるハッカーはプログラミング能力があるべきだと考えている。
その理由については、この記事でも説明しているのだが、他人の作成したソフトウェアを使用するより、ターゲットに合わせて自分でソフトウェアを組める能力があるべきだからだ。
Windows PowerShellの登場により、Windows管理者はスクリプトを組んでタスクを自動化し、より効率的にタスクを遂行する能力が、ますます求められるようになってきた。
ハッキングをする際には、複数のコマンドを駆使しつつ、時には複数のツールを呼び出してスクリプトを組み、タスクを自動化する事がある。
更に優秀なハッカーになるためには、高度なシェルスクリプトを書く能力が必要なだけでなく、以下の様なプログラミング言語能力も必要となる。
- Ruby(MetasploitというハッキングツールはRubyで書かれた)
- Python(多くのハッキングツールはPythonで書かれた)
- またはPerl(Perlは最高のテキスト操作スクリプト言語だ)
この記事を読んでいる見習いのハッカーは、まずは基本的なシェルスクリプトの学習から始めて、高度な使用方法の学習をし、最後に上記のプログラミング言語を使ってハッキングツールを開発するといいいだろう。
そのようにスキルを積み重ねて行けば、かなり高度なハッキングを行う事が出来るからだ。
ハッカーの理想形は、独自のエクスプロイト手法を開発するのに、十分なプログラミングスキルを身に付ける事だ。
実はnmapに関する記事では、特定のポートの可用性をチェックするために、nmapを使用して一連のIPアドレスをスキャンするスクリプトの作成方法を簡単に紹介した。
この記事の後半では、そのスクリプトに新しい機能を追加していく。
ステップ1:シェルの種類
シェルは、ユーザーとオペレーティングシステムの間に立つインターフェイスだ。
シェルを使えば、コマンド、ユーティリティ、プログラムの実行、ファイルの操作などが可能になる。
Linuxにはさまざまなシェルが用意されている。
例えば、Kornシェル、Zシェル、Cシェル、およびBourne againシェル(またはBASH)だ。
BASHシェルはほぼすべてのLinuxおよびUNIXディストリビューション(Mac OS X、およびKaliを含む)で使用できるため、この記事ではBASHシェルを使用して説明していく。
ステップ2:BASHの基本
シェルスクリプトを作成するには、テキストエディタを起動する。
vi、vim、emacs、gedit、kateなど、Linuxには多くのテキストエディタが開発されているのだが、このチュートリアル記事ではLeafpadを使用する。
別のエディタを使用しても、スクリプトやその機能に違いはないので、使い慣れたテキストエディタが既にあればそれを使えばいいだろう。
ステップ3:BASHコマンドで構築
BASHシェルスクリプトを使用すれば、システム、ユーティリティ、またはアプリケーションコマンドを実行できるのに加えて、BASHシェルには独自のコマンドがいくつか含まれている。
以下がBASH独自のコメンドの例である。
:, ., break, cd, continue, eval, exec, exit, export, getopts, hash, pwd, readonly, return, set, shift, test, [, times, trap, umask and unset,alias, bind,builtin, command, declare, echo, enable, help, let, local, logout, printf, read, shopt, type, typeset, ulimit and unalias.
などがある。
上記のコマンドについては後のチュートリアルで説明するが、今は上記のシェルがBASHシェル独自のコマンドである事だけ覚えておいてもらいたい。
ステップ4:コメント
他のプログラミング言語と同様に、シェルスクリプトではコメントを追加することもできる。
コメントは、コードを見た人が、その部分でどのような処理を実行しているのかを読み取り易くするメモの事だ。
コメントは、インタプリタによって読み取られる事が無いため、たとえコマンドと同じ文字列が書いてあったとしても実行されない。
BASHシェルは行の先頭に"#"(半角のシャープ)を付ければコメントを付けることができる。
初めて作成したスクリプトである事を後々振り返った時に分かりたいなら、テキストエディタで以下のように書くといい
#This is my first script!(初めてのスクリプト!)
インタプリタがプログラムを読み込む際、"#"の直後に記載されている内容を無視し、次の行に移動する。
ステップ5:"Hello, Hackers-Arise!"
それでは実際にやってみよう。
はじめに「Hello, Hackers-Arise!」というメッセージを返す簡単なスクリプトを作成してみよう
まず、メモ帳を開き一行目に”#!”と入力する。
”#!”は、オペレーティングシステムに、「#の後に続くものはスクリプトに使用するインタープリタです」という指示を伝えている。
その後には、オペレーティングシステムにBASHシェルインタープリタを使用させたいということを示す”/bin/bash”という文字列を記載する。
PerlやPythonといったプログラミング言語のインタプリタも使用できるのだが、ここではBASHインタプリタを使用して学習していこう。
#!/bin/bash
次に、Linuxにコマンド”echo”を入力する。
このコマンドは、システムに単純にモニター(stdout)に、コマンドの後に記述した内容を表示するコマンドである。
この場合、"Hello, Hackers-Arise!"と記述しているので、そのまま"Hello, Hackers-Arise!"と返してくる。
この時、画面に表示する(=echoする)テキスト、又はメッセージは、二重引用符(””)で囲んでいることに注意しよう。
echo "Hello, Hackers-Arise!"
さて、このファイルをHelloHackersAriseとして保存し、テキストエディタを終了しよう。
ステップ6:実行権限を設定する
ファイルを作成したら、そのファイルが自分の権限で実行可能な状態なのかチェックしなければならない。
カレントディレクトリに”ls -l”と入力して、たった今作成したファイルのアクセス権限を見てみよう。
ご覧のとおり、新しいファイルには”rw-r-r--(644)”のパーミッションがある。
このファイルの所有者には、読み取り権(r)と書き込み権(w)のみがあり、実行(x)許可は無いという事だ。
グループとその他全てのユーザーには、読み取り権限しか無い。
したがってたった今作成したHelloHackersAriseを実行するには、実行権限を変更する必要がある。
これはchmodコマンドで行う。
所有者、グループ、およびすべての実行権限を与えるためには、以下のようにコマンドを入力する。
kali> chmod 755 HelloHackersArise
これでファイルの”ls -l”を実行すると、所有者、グループ、その他のユーザー全てに実行権限権限が付与された事が確認できる。
kali> ls -l
ステップ7:HelloHackersAriseを実行する
スクリプトを実行するには、以下のように入力する。
kali> ./HelloHackersArise
ファイル名の前に記述された”./”という文字列は、カレントディレクトリでこのスクリプトを実行するようにシステムに指示する為のものだ。
もし仮にHelloHackersAriseという同じ名前のファイルが別のディレクトリにあったとしても、そのファイルは無視されて、カレントディレクトリにあるHelloHackersAriseを実行する。
enterキーを押すと、先程作成した簡単なスクリプトが実行される。
Hello Hackers Arise!
おめでとう!これであなたも、はじめてスクリプトを作成しました。
ステップ8:変数の使用
前のステップで簡単なスクリプトを作成しました。
このスクリプトは単に、メッセージを返すだけの簡単なものです。
ちょっとだけ応用的なスクリプトを作成したい場合は、変数を追加すると良いでしょう。
変数は単にメモリ内に”何かしらのデータ”を保持できる記憶領域です。
「何かしらのデータ」とは、文字や単語(文字列)、数字を指します。
変数は、変更される可能性のある値を使用する際に役立ちます。(金額等)
以前に書いたnmapのスクリプトに戻って、特定のポートが開いている脆弱なマシンをスキャンしてみよう。
悪名高きハッカー・Max Butler氏は、同様のnmapスクリプトを使ってAloha POSシステムを開発し数百万のクレジットカード番号を不正入手しました。
以下に示すとおりこのスクリプトは、IPアドレス”192.168.181.0/24”の範囲内にあるオープン状態のポート5505(ポート”Aloha”は技術サポートのために開いたままだった)をスキャンし、レポートを作成するコマンドが記述されている。
このスクリプトでは、IPアドレスの範囲はスクリプトに直接入力されており、指定する範囲を変更するためにはファイルを開いて編集しなければならない。
仮に、スキャン対象となるIPアドレスの範囲やポート番号を、プロンプト表示させて入力を促すようにするのはどうだろうか。
ユーザーは、そうした数値を入力し、スクリプトに渡されれば、毎回ファイルを編集するよりユーザービリティが向上する事は想像に難くない。
実際にやってみよう。
ステップ9:スクリプトにプロンプトと変数を追加する
まず、ファイルに直接入力されているサブネットをIPアドレスの範囲に置き換える。
"FirstIP"と、"LastIP"という名前の変数を2つ用意しよう。
この時、変数の名前は何でも良い。しかし変数名は後で見返した時に、どのような値が格納されているのかわかりやすく設定するのがベストプラクティスだ。
次に、ポート番号を格納する変数を"port"という名前で定義する。
これらの変数は、ユーザーがスクリプト実行時に入力する情報を保持する。
次に、ユーザーに値の入力を促す必要がある。
そのためには、以前のステップで学んだ”echo”コマンドを使用すればいい。
そうすればHelloHackersAriseスクリプトを記述する際に、ユーザーに対して「Enter the starting IP address : (開始IPアドレスを入力してください)」という言葉を表示できる。
echo "Enter the starting IP address :"
ユーザーは、このプロンプトに対してスキャン対象となるIPアドレスの範囲の開始値を入力すればいい。
その後、ユーザーによる入力値を取得して変数へ格納するコマンドが必要となる。
それを行うには、”read”コマンドを使用し、コマンドの後に変数”FirstIP”を記述する。
”read”コマンドは、ユーザーがキーボードで入力した値(stdin)を受け取り、その値を変数に格納するコマンドである。
read FirstIP
上記のコマンドは、ユーザが入力したIPアドレスを変数”FirstIP”に渡す。
一旦変数を格納してしまえば、スクリプト内では”FirstIP”には同じ値が入力されたままになる。
なので、スクリプトの最初に各変数を定義して、その後に”read”コマンドを使用して情報を取得する事も可能である。
それでは次に、nmapのチュートリアルで作成したスクリプトに直接入力されているIPアドレスを変数に置き換えよう。
変数に格納されている値を呼び出す時は、”$port”のように、変数名の前に”$”を付ける。
以下のコマンドを文章にすると、「開始IPアドレス値から終了IPアドレス値の範囲で、ユーザーの指定する任意のポートをnmapで探す」という意味になる。
nmap -sT $FirstIP-$LastIP -p $port -oG Aloha
これでFirstIPからLastIPの範囲で、ユーザーが入力した任意のポート番号をスキャンするスクリプトが完成した。
それではScannerscriptという名前を付けてファイルを保存しておこう。
ステップ10:ユーザー入力変数で実行
以上のステップで、スクリプトファイルを編集せずに、スキャン対象となるIPアドレスの範囲とポート番号をスクリプトの実行時に入力する簡単なスキャナスクリプトを実行できるようになった。
kali> ./Scannerscript
以上の画像の様に、スクリプトは、最初のIPアドレス値と最後のIPアドレス値、そしてポート番号の入力を要求する。
スクリプトはユーザーの入力が終わり次第、nmapスキャンを行い、指定したポートが開いているすべてのIPアドレスのレポートを生成する。
終わりに
このスクリプトを保存しておいて、今後のハッカー用チュートリアルで更なる機能を追加してより強力なスキャンを行なっていこう。