Paul Troncone, Carl Albing : 実践 bash によるサイバーセキュリティ対策

作成日: 2020-04-03
最終更新日:

概要

bash と Linux の標準コマンドを活用したセキュリティ対策手法の解説書。 原書のタイトルは「Cybersecurity Ops with bash」。 副題は「セキュリティ技術者のためのシェルスクリプト活用術」。 本書のwebページは下記の通り:
https://www.oreilly.co.jp/books/9784873119052/

感想

私のような初心者でも理解できるところがあって役に立った。本文は、「第Ⅰ部 基本的な技術」 (1章~4章)、 「第Ⅱ部 bash による防御のためのセキュリティ活動」(5章~12章)、 「第Ⅲ部 bash によるペネトレーションテスト」(13章~16章)、 「第Ⅳ部 bash によるセキュリティ関連操作」(17章~23章)の計4部からなる。

コマンドライン

1章は「コマンドラインの基礎」である。 いろいろと知らないコマンドが早速出てきた。type, compgen などがそうだ。訳注でも記されているが、 ls コマンドはたいていエイリアスになっているので、次のようになる。

$ type -t ls
alias

では、ls はどのようなエイリアスになっているのだろうか。本書には載っていなかったので調べた。 すると、alias コマンドを使うことがわかった。 Windows Git Bash ではこうなっていた。

$ alias ls
alias ls='ls -F --color=auto --show-control-chars'

では、WSL2 (Windows Subsystem for Linux 2) の Ubuntu 20.04 ではどうだろうか。

$ alias ls
alias ls='ls --color=auto'

そういえば、昔、alias rm='rm -i' としていたことを思い出した。 これは、ファイルを削除するときには、必ず確認するようにしていたのだった。 そして、だんだん確認に答えるのが面倒になり、rm ではなく \rm とエイリアスを無視するようになった。 そして最後に、rm コマンドにエイリアスをつけるのをやめた。

bash の基礎

2章の表題は「bash の基礎」である。 私は複合コマンド [[ の使い方がよくわからず困った。使い方はこうだ。

	if [[ -e $FILENAME ]] 
		  then
		      echo $FILENAME exists
		fi
	

正規表現

3章の表題は「正規表現の基礎」である。利用するコマンドは、grep と egrep である。 当然、正規表現は grep 以外の他のコマンドやアプリケーションでも使える。

文字クラスや量指定子は使ったことがない。今後使いたい。

防御と攻撃

4章の表題は「防御と攻撃の基礎」である。利用するコマンドはなく、概念の説明である。 せっかくなので、攻撃のライフサイクルを英語と対の形でしめしておこう。

攻撃のライフサイクル
#日本語英語
1偵察Reconnaissance
2初期攻撃Initial Exploitation
3橋頭堡の確立Establish Foothold
4権限昇格Escalate Privileges
5内部偵察Internal Reconnaissance
6横移動Lateral Movement
7存在の維持Maintain Presence
8ミッション完了Complete Mission

データ収集

5章はデータ収集に関してまとめられている。利用するコマンドは、cut, file, head, reg, wevtutil である。 reg と wevtutil は Windows システム固有のコマンドである。

find コマンドについても多くが述べられている。隠しファイルを一覧表示するには、Linux では、
$ find /home -name '.*'
である。

Windows ではファイル属性なので、Windows コマンドプロンプトでは次のようになる。
C:> dir c:\ /S /A:H
これを bash でできるようにするためには、次のコマンドが使える。
$ find /c -exec attrib '{}' \; | egrep '^.{4}H.*'

私がある部門に配属されたとき、その部門のみんながこうやって
$ find dirname -exec commandname '{}' \; | grep searchword
とごく普通に打っていて、腰が抜けたことを思い出した。

ほかにも sha1sum などが紹介されている。

データ処理

6章は「データ処理」という表題がついている。コマンドとして登場するのは、awk、join、sed、tr がある。 join は使ったことがないが、使えそうだ。

他にも、jq という軽量言語が紹介されている。私の WSL2 の Ubuntu 20.04 にインストールしてみた。

データ解析

7章は「データ解析」という表題がついている。コマンドとして新たに解説があるのは、sort、head、uniq である。 実際には awk が大活躍する。

リアルタイムのログ監視

8章は「リアルタイムのログ監視」という題名である。紹介されているコマンドは tail と egrep である。 egrep に --line-buffered というオプションが付与されている。この意味を本書で知り、感心した。

$ tail -f access.log | egrep --line-buffered 'HTTP/.*" 404' | cut -d' ' -f4-7

として監視していると、このオプションを付けないと egrep が出力をバッファにをためてしまい、 表示されなくなることがあるというのだ。この --line-bufferd というのは、1行だけのバッファ、という意味なのだろう。 このオプションを指定しなければ、1行におさまらない、広大なバッファを用意している、 と解釈したい。

ネットワーク監視

9章は「ツール:ネットワーク監視」という表題がついている。 ここで解説されているのは crontab と schtasks である。crontab は Linux でタスクのスケジューリングのために用いられる。 schtasks は Windows でタスクのスケジューリングのために用いられる。

本書では、ネットワーク監視をするためのシェルスクリプト autoscan.sh が紹介されている。 Linux では crontab で指定すればよいが、Windows では面倒である。 本書では、Git Bash の実行を schtasks に登録することによってスケジューリングすることで解決している。 Git Bash の引数に autoscan.sh を指定すれば、Linux と同じことができるというわけだ。 設定の注意および schtasks のパラメータは本書を参照のこと。

ファイルシステム監視

10章は「ツール:ファイルシステム監視」である。紹介されているコマンドは sdiff である。 diff は知っていたが、sdiff は初めてである。s は何だろうか。 man sdiff で調べてみると、 GNU sdiff - side-by-side merge of file differences と出てきた。 side-by-side というのがミソなのだろう。実際、よく似た二つのファイルを sdiff で調べたところ、 左と右にファイルが表示できるので、見やすい。

マルウェア解析

11章は「マルウェア解析」である。紹介されているコマンドは vi のほか curl と xxd である。 vicurl は知っていたが、 本書の使い方は初めてだった。また、xxd は初めて知った。私が知っていたバイナリファイルの表示は od だけだった。

表示の整形とレポート

12章は「表示の整形とレポート」である。紹介されているコマンドは tput である。 むかし curses ライブラリに興味があって調べたことがあったのだが、 tput も curses ライブラリと根は一緒で、 どちらも terminfo データベースにある端末フォーマット用の設定を参照して動作する。 また実際、tput は curses の代替ライブラリである ncurses を用いて作られている。tput はおもしろそうだ。

偵察

13章は「偵察」という題がついていて、ターゲットを偵察する方法について述べられている。

本書の p.196 では curl の -I オプションを用いることで、サーバからのヘッダ情報を取得する例を示している。 この例では、サイトのサーバの OS や http サーバの種類(Apache)やバージョンがわかっている。

同じサイトを今試してみたところ、Apache ということまではわかったが、 OS や Apache のバージョンは表示されなかった。きっとセキュリティを強化しているのだろう。 気になって他のサイトを見てみると、Apache がほとんどで nginx もあった。ただ、 OS や バージョンまでは表示されなかった。 別のサイトを見てみたら、Server: Apache/2.4.25 (Debian) と表示された。 あえて偽の情報を出しているのかもしれないが、甘いかもしれない。

難読化

14章の表題は「スクリプトの難読化」である。 本文は、bash スクリプトは人が簡単に読むことができる。という一文から始まっている。 これは、可読、という意味ではそうだが、理解容易性、という意味ではない。 というのも、制御構造が C 言語に似た記法ではないからだ。それはともかく、 ペネトレーションテストの実行の観点から難読化について述べられていて、おもしろそうだ。

ファジング

15章の表題は「ツール:コマンドライン版ファザー」である。なんとなくゴッドファーザーを思い出したが、 もちろん違う。ファザーとはファジングを行うツールであり、ファジングとは本書によれば、 「実行ファイル、プロトコル、システムなどに内在された潜在的な脆弱性を特定するために用いられる手法」 と定義されている。ファジングと聞くと「あいまいな」という意味のファジー fuzzy を思い出してしまうが、 ここでは予測不可能なデータを fuzz ということばで表していると理解した。fuzz の原義は、 毛羽である。これから「予測不可能なもの」を連想するのもわかる。

さて、p.226 にある実装を見て、違和感を覚えた。というのも、ファジングする対象となる、 わざと脆弱性のある実行ファイル fuzzme.exe を作っているのだが、.exe という拡張子をみると、 これは Windows の話だろうか、と思う。ところが、この実行ファイルの脆弱性が露呈する例をみると、 Segmentation fault (core dumped) という文字がシェルから出ている。ということは、 これは Unix や Linux で実行した結果だろう。ということは、拡張子 .exe はいったい何だろう。

そんなに考えすぎることはないかもしれない。実行ファイルであることを強調して、Unix でも .exe をつけただけだろう。 ということで私も実行させてみた。

(中略)
*** stack smashing detected ***: terminated
中止

core ファイルはできていない。最近の Linux の初期設定では、コアダンプしないのが普通だろう。 Effective Debugging に従い、 コアダンプするような設定にしてみた。 しかし、コアダンプする設定までしてみたが、ファイルがゼロバイトである。あきらめた。

拠点確立

16章は、攻撃のライフサイクルのうち「拠点確立」について記述されている。ここは本腰を入れて読む必要があるが、 私には力量がないため、まだ理解できていない。

ファイルのパーミッション

17章はファイルのパーミッションである。

私がある部門に配属されたときのことを思い出した。その部門では Unix を使っていて、 ほとんどの利用者がファイルの属性を 644 にしていたのだった。これが Unix の文化だと思った。 その後、配置換えで別部門から来た人が当部門にやってきた。その人は別部門でも Unix で仕事をしていたのだったが、 当部門では自身のファイルのパーミッションを 600 にしていたので驚いた。つまり、当人(とスーパーユーザー)以外、 誰にも見させなかったのだ。

ログの書き込み

18章はログの書き込みについて、Windows と Linux の双方について記載がある。 Windows では eventcreate コマンドを、Linxu であれば logger を使う。

これは利用する側としてであったが、私が会社に通っていたころ、退勤時間がわからなくなることがあった。 そんなとき、Windows のシステムイベントのログを見ればいいことを知った。毎日のシャットダウンの時刻を確認し、 これを退社時間とすればいい。

ping

19章はツール:システム監視と題して、ping を取り上げている。

ping といえば、ネットワークの疎通を確認するのに使うのに真っ先に使うコマンドである。 UNIX と Windows とで挙動が異なるのもおもしろい。 本書では、ping の不達が即機器のダウンを意味するものではない、という断りがある。 それもそうだが、私がいた組織では、また私が見聞きした範囲では ping の応答を意図して遮断するような機器はなかった。

インベントリ調査

20章はツール:インベントリ調査と題して、インストールされているソフトウェアを知る方法を述べている。 Linux では apt, dpkg, yum が、Windows では wmic が説明されている。

侵入の痕跡

21章はツール:構成管理と題して、ファイルやIDの存在/非存在を確認するツールを bash で作った例を示している。

このツール validdateconfig.sh は、バグがある。誤植のところで述べる。

監査

22章はツール:監査と題して、ユーザアカウントの監査を行っている。 面白いのは、Have I Been Pwned (https://haveibeenpwned.com)という Web サイトを活用していることだ。

Have I been pwnd ? とはどういう意味だろう。どうも「私はやられたのか?」という意味らしい。

LEET

23章はまとめである。この最後の行に次のコマンドがある。

$ echo 'Paul and Carl' | sha1sum | cut -c2,4,11,16

これを実行しても害はないだろうということで実行したら次の結果が得られた

1337

1337 にどんな意味があるのか調べたら、これは LEET と読むらしい。たしかに、1337 の字面は LEET に似ている。 leet というのは Wikipedia では「主に英語圏においてインターネット上で使われるアルファベットの表記法」 なのだそうだ。このような表記法は遊び心だったり、敵対者の検索をかいくぐるための書法だったりする。 この場合は、ハッカーになれよ、という激励のことばなのだろう。

私はこの leet を見て、マジックナンバーを思い出した。ここでいうマジックナンバーとは、 本書の P.74 の表 5-4 で紹介されているマジックナンバーとは意味合いが違い、デバッグ値としてのマジックナンバーである。 英語版の Wikipedia の https://en.wikipedia.org/wiki/Magic_number_%28programming%29#Debug_values に詳しい説明がある。 私の理解では、システムがメモリの確保あるいは解放に失敗した場合やシステムの挙動がプログラマの意図とは異なる場合に、 システム側がコントロールできる領域に特定の値(マジックナンバー)を付与しておくことで、 プログラマがシステムの挙動をつかみやすくできるというものである。 このマジックナンバーが人を食った名前になっているのがいい。メモリは16進法でダンプされるので、 0-9とA-Fまでしか使えないが、そのなかで意味のある言葉にしようという工夫と苦労が見て取れる。 たとえば、DEAD BEEF は傑作だと思う。ほかにも意味のあることばを開拓しようとして、 0 を O に見立てたり、1 を I になぞらえたりしている。このような文字遊びが leet につながっているのではないか、 と思った。

bash のネットワークリダイレクション機能

付録A は bash のみを用いてネットワークへのデータ送信を実現する方法が述べられている。 機能は限られるが、netcat が使えない場合は、有用である。

Shellshock

付録B は Shellshock という表題である。私は Shellshock について知らなかった。私が使える環境で脆弱な bash は見つからなかったが、気を付けたい。

bash スクリプトのトレースオプション

付録C は bash スクリプトのトレースオプションである -x を紹介した記事だ。 私はこれを使って、下記のスクリプトのバグを調べることができた。

誤植

p.268 「19.3 まとめ」の本文の上から6行目が「稼働ており、」となっているが、 正しくは「稼働しており、」だろう。

スクリプトのバグ

https://www.oreilly.com/catalog/errata.csp?isbn=0636920179603
には言及がなく、また github のコードでも直っていなかったバグがある。

p.280 の設定ファイルが3行あるが、file で始まる行および !file で始まる行は、正しい設定とはみなされない。 正しい設定は次のとおりである。

user jsmith
file c:\\Windows\\System32\\calc.exe
!file c:\\Windows\\System32\\bad.exe

または

user jsmith
file c:/Windows/System32/calc.exe
!file c:/Windows/System32/bad.exe

このようにしなければならない理由は、ファイル名を二重引用符でくくると、 この二重引用符まで含めてファイル名と認識されるためである。したがって二重引用符ははずす。 また、フォルダ(ディレクトリ)の階層を表す \ はエスケープ文字でもあるため、 本文の表示のとおりだと \ 文字が無視されてしまう。そのため、\\ と二重にするか、 LINUX のように / 文字を使うようにする。なお、上記の正しい例ではドライブレターの C や、 フォルダ名の Windows と System32 をともに大文字から始めているが、これに関しては、 本文のように小文字でも正常に動作する。ただ、Windows のドライブレターや Windows 固有のフォルダー名は、 エクスプローラーなどで表示される通り、大文字から始めておけば、無用な混乱を避けることができると思う。

スクリプト validdateconfig.sh で p.283 の⑨の次の行は fi となっているが、これでは正常に動作しない。

    if [[ ${cmd:0:1} == '!' ]]    ⑧
    then
        donot=1    
    basecmd=${cmd#\!}             ⑨
    fi

上記では誤動作するので、次のようにする必要がある:

    if [[ ${cmd:0:1} == '!' ]]    ⑧
    then
        donot=1
        basecmd=${cmd#\!}             ⑨
    else
        basecmd="$cmd"    
    fi

この else をはさむことによって、! のない設定ファイルの行が正しく読み込まれる。

書誌情報

書 名実践 bash によるサイバーセキュリティ対策
著 者Paul Troncone, Carl Albing
訳 者髙橋 基信
発行日2020 年 4 月 17 日
発行元オライリー・ジャパン
定 価3300 円(税別)
サイズA4 判
ISBN978-4-87311-905-9
その他越谷市立図書館で借りて読む

まりんきょ学問所コンピュータの部屋コンピュータの本セキュリティ > Paul Troncone, Carl Albing:実践 bash によるサイバーセキュリティ対策


MARUYAMA Satosi