無線LANのAPをGoogle Mapにマッピングする
大学構内で電波が弱いところが多々あってどのあたりが弱いのかなんとなく把握したかったので, KismetとAndroidを使ってAPをGoogle Mapにマッピングしてみた.
別にAndroidじゃなくてもGPSレシーバーがあれば可能.
うまくいけばこんな風にマッピングでき, BSSIDはもちろん, 暗号化方式やチャンネル, 接続しているクライアントのMACアドレスと(大雑把な)製品情報もわかる.
Androidでの設定
以下の2つだけ.
- USBデバッグモードを有効にしておく.
- BlueNMEAをインストールしておく
BlueNMEAを使うことでAndroid端末をGPSレシーバーとしてUSB接続などで利用できる.
BlueNMEAは4352/tcpでListenするため, 後述するadbコマンドでポートフォワーディングしてあげる.
PCでの設定
Kali Linuxだとkismetやgiskismetが既に入っているので楽かも.
ここではArch Linuxを使った.
まず, adbコマンドを使用するためにAndroid SDKなどをインストールする.
このあたりは
Android - ArchWiki
が詳しい.
$ yaourt -S android-sdk $ yaourt -S android-sdk-platform-tools $ yaourt -S android-sdk-build-tools $ yaourt -S android-tools $ yaourt -S android-udev
USBデバッグモードを有効にしたままAndroid端末を接続する.
$ adb devices List of devices attached HT07VHL00676 device
のように表示されたら問題はないはず.
続いて, kismetを導入する.
yaourt -S kismet
/etc/kismet.confを編集する. ncsourceのアダプタ名は環境に合わせて変更.
# mkdir /var/log/kismet ... logprefix=/var/log/kismet ncsource=wlp3s0:split=true,retry=true ...
kismetで収集した情報をkmlなどにエクスポートするためにgiskismetをインストールする必要があるが, レポジトリが見つからなかった.
Kali Linuxのレポジトリにはあったのでこれを使用.
$ git clone git://git.kali.org/packages/giskismet.git $ cd giskismet $ yaourt -S perl-xml-libxml perl-dbi perl-dbd-sqlite $ perl Makefile.PL $ make $ sudo make install
最後にgpsdをインストール.
$ yaourt -S gpsd
スキャンする
Android端末を接続し, adbコマンドでポートフォワーディングの設定をする.
$ adb forward tcp:4352 tcp:4352
続いて, 転送ポートである4352/tcpでgpsd起動する.
$ gpsd -N -n -D5 tcp://localhost:4352
Android端末でBlueNMEAを起動し, PCでKismetを起動する.
# kismet --use-gpsd-gps localhost:4352
歩く
PCとAndroid端末を持って調査したい場所を歩き回る.
Android端末の方はスリープにしてもBlueNMEAは動いているが, PCの方がモニターを閉じるとスリープになるとUSBの接続が切れるかもしれない.
systemdな環境であれば/etc/systemd/logind.confを以下のように編集して反映させる.
HandleLidSwitch=ignore sudo systemctl restart systemd-logind
これでかばんの中にPCとAndroid端末を入れて持ち歩ける.
ログファイルは/var/log/kismet/以下にKismet-
Google Mapで可視化する
giskismetでログファイルからデータをDBに保存する.
./giskismet -x /var/log/kismet/Kismet-<date>.netxml
wireless.db1に保存されている. さらにDBからデータをkmlに変換する.
./giskismet -q "SELECT * FROM WIRELESS" -o output.kml
あとは生成されたkmlファイルをGoogle Mapのインポート機能で読み込ませればいい.
地図に情報をインポート - マイマップ ヘルプ
思った以上にWEPが多い...
パケット解析時のメモ
自分がパケットを解析するときのメモ.
全体の把握
Statistics - Endpoints
- パケット内に含まれるホストを把握する
- パケットを多く/少なく投げているのはどのホストか
Packets
タブで降順/昇順でフィルタTCP
タブでポートとパケット数なども確認
Statistics - Show address resolution
- IPアドレスとドメインのひも付けを確認
- 怪しいドメインはないか?
- db-ip.comなどでホストがどこの国か, また, whois情報などから情報を収集
- virustotalやurlqueryなどのオンラインスキャナーを使用する
VirusTotal - Free Online Virus, Malware and URL Scanner
urlquery.net - Free URL scanner
Statistics - Protocol Hierarchy
- パケット内に含まれるプロトコルとその含有率を確認
Statistics - Conversations
- セッションごとにどのポートからどのポートに, どれだけ通信をしているかを確認
Statistics - IO Graph
- いつごろ通信量が増えたか
- グラフをクリックするとそのあたりのパケットまで移動する
- 気になるホストなどでフィルタをかけ, 色付けするとわかりやすい
Filterの活用
- 気になるホスト, ポートなどでフィルタ
tcp contains "cmd"
やtcp contains "MZ"
などでフィルタ
ファイルの抽出
File - Export Objects
Wiresharkの設定メモ
Wiresharkをインストールしたあとなどのメモ
一般ユーザーでもキャプチャできるようにする
wiresharkグループにユーザーを追加し, dumpcapの権限を変更した後, ケイパビリティで権限を与える.
$ sudo usermod -a -G wireshark <USER> $ sudo chgrp wireshark /usr/bin/dumpcap $ sudo chmod 4750 /usr/bin/dumpcap $ sudo setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap $ sudo getcap /usr/bin/dumpcap /usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip
再起動すると設定が反映され, 一般ユーザーでもキャプチャできるようになる.
USBのパケットをキャプチャする
$ sudo modprobe usbmon
表示時刻の変更
どの時間に何が起こったかをわかりやすくするために View - Time Display Format - Date and Time of Day
に変更.
カラムの変更
Preference - User Interface - Columns
から追加.
Properties
から Field type
で Custom
を選択することでフィルタが使える.
http.hostとssl.handshake.extensions_server_name
を追加し, どのドメインと通信しているのをわかりやすくする.
よく使うフィルタを保存する
[Shift]+[Ctrl]+[P]から設定画面を開き, Filter Expressions
からフィルタを追加する.
追加すると, キャプチャ画面のフィルターペインからワンクリックでそのフィルタを適用できる.
また, 保存したいフィルタがわからない場合はPacketDetailsペインでフィルタしたい項目をクリックするとフィルタが左下に表示されるので参考になる.
それと合わせて DisplayFilters - The Wireshark Wiki を見ておくといい.
このあたりは, 解析したいパケットに合わせて適用するが, 以下は自分がよく使うフィルタをメモとして残しておく.
特定のバイト列が含まれるパケットのみを表示
例えば 0x464c4147(FLAG)
が含まれるパケットを検索したいとき
frame contains 46:4c:41:47
特定の文字列が含まれるパケットのみを表示
マルウェアなどexeやcmdといった文字列を含む通信を行うのでそういったときに...
例えば"exe"という文字列を含むパケットを検索したいとき
tcp contains "exe"
特定のHTTPリクエストのパケットを表示
http.request.method == GET
http.request.method == POST
ケイパビリティ
ケイパビリティとは
スーパーユーザー権限の細かい制御を提供することで, root ユーザーの使用を減らすことができる.
つまりrootか非rootかではなく, もっと細かい単位で権限を与えることが可能.
そのため, setuid属性を付与しなくてもケイパビリティで置き換えることが可能であり, 推奨されている.
実際にpingではCAP_NET_RAWが利用されており, 一般ユーザーでもpingを使うことができるようになっている.
$ getcap /bin/ping /bin/ping = cap_net_raw+ep
ケイパビリティの定義は/usr/include/linux/capability.h内でCAP_から始まるもので定義されている. いくつか抜粋すると以下のようなケイパビリティがある.
- CAP_CHOWN - ファイルのUIDとGIDを変更可能
- CAP_DAC_OVERRIDE - ファイルにアクセス(読み書き実行)可能
- CAP_DAC_READ_SEARCH - ファイルの読み出しと実行可能
- CAP_NET_BIND_SERVICE - 1024番未満のポートを使用可能
- CAP_NET_RAW - RAWソケットおよびPACKETソケットを使用可能
- CAP_SYS_CHROOT - chrootが可能
プロセスの持つケイパビリティを確認する
getpcapsコマンドの引数にプロセスIDを渡して実行する.
以下はhttpd(apache)のプロセスIDを引数として渡した例.
$ getpcaps 27252 Capabilities for `27252': = cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read+ep
最後の+epはケイパビリティセットを表している.
プロセスはケイパビリティセットを持ち, 以下の3種類がある.
- effective - カーネルがスレッドの権限 (permission) をチェックするときに 使用するケーパビリティセット
- permitted - そのプロセスが持つことを許されているケイパビリティ
- inheritable - 実行時に継承されるケーパビリティセット
fork(2)で作成される子プロセスは, 親のケーパビリティセットのコピーを継承する.
また, capsetコマンドでプロセスは自分自身のケーパビリティセット を操作することができる.
例の場合, +epとあるのでeffectiveとpermittedがセットされている.
実行ファイルの持つケイパビリティを確認する
実行ファイルにケーパビリティセットを対応付けることができる.
- effective - これが設定されていなければ実行したときにプロセスのpermittedが設定されない
- permitted - 実行したときに許可されるケイパビリティセット
- inheritable - 実行時に継承されるケイパビリティセット
実行ファイルのケイパビリティセットを確認するにはgetcapコマンドを使用する.
$ getcap /bin/ping /bin/ping = cap_net_raw+ep
ケイパビリティをセットする
ここではpingコマンドにケイパビリティの付与, 削除を行ってみる.
$ cp /bin/ping /tmp/ping $ cd /tmp $ getcap ./ping
コピーしたpingにはケイパビリティは付与されていない. そのため, 一般ユーザーでは実行してもネットワークソケットを使えずにOperation not permittedと表示される.
$ ./ping 8.8.8.8 ping: icmp open socket: Operation not permitted
setcapコマンドを使って, ケイパビリティをセットする. ソケットを使用するため, CAP_NET_RAWにeffectiveとpermittedを設定する.
$ sudo setcap cap_net_raw=ep ./ping $ getcap ./ping ./ping = cap_net_raw+ep $ ./ping 8.8.8.8 -c 1 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=48 time=54.9 ms --- 8.8.8.8 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms
ケイパビリティの削除にはsetcapコマンドに-rオプションを渡す.
$ sudo setcap -r ./ping $ ./ping 8.8.8.8 ping: icmp open socket: Operation not permitted
これを使えば一般ユーザーでは参照できないディレクトリをlsコマンドで参照できるようになる.
man capabilities で調べるとCAP_DAC_READ_SEARCHの項目に
Bypass file read permission checks and directory read and execute permission checks;
とあるのでCAP_DAC_READ_SEARCHを付与すれば, ファイルの読み出し権限のチェックをバイパスできる.
実際にlsコマンドとcatコマンドに付与し, /root/hidden.txtを読み取ってみる.
$ cp /usr/bin/ls /tmp/ $ cp /usr/bin/cat /tmp/ $ cd /tmp $ ./ls /root ./ls: ディレクトリ /root を開くことが出来ません: 許可がありません $ sudo setcap cap_dac_read_search=ep ./ls $ ./ls /root hidden.txt $ ./cat /root/hidden.txt ./cat: /root/hidden.txt: 許可がありません $ sudo setcap cap_dac_read_search=ep ./cat $ ./cat /root/hidden.txt This file is root's file