Lhaplusのパスワード探索は非効率?
Lhaplusには、zipパスワードを総当りで解析する機能がある。
画面を下図に載せるが、見ててふと思うことがある。
探索範囲 [すべて] の箇所で、パターンが0..255と書いてあり、明らかに英数記号の範囲を超過してる。
ここまで本当に必要?
ということ。明らかに 0x00 ~ 0xff まで見てる気がする…
ということで、パスワード設定はどこまでできるのか、気になったので色々やってみた。
もともと上記の疑問については無意味ではないということは知っていた。
たとえば、Windowsではキーボードからでも制御文字を入れることができる。
Windowsで[Ctrl + backspace] を入力してみると、パスワードに "\x7f" に相当する[DEL]文字を入れることができる。以下はLhaplusの圧縮時に入力してみたもの。
OSのログインパスワードにも設定でき、これだけでパスワード強度が上がり有用である。
# そりゃ種別が増えるわけなので
Linuxではどうだろう。
Windowsで制御文字を使った暗号化ファイルは、Linuxではキーボードだと復号化できなかった。
手動では仕方ないのでスクリプトを組んでみた。
[root@kali] # python Python 2.7.3 (default, Mar 14 2014, 11:57:14) [GCC 4.7.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import os >>> os.system("unzip -P \x7f test.zip") Archive: test.zip inflating: test.txt 0 >>>
スクリプト経由では復号することができた。
ということは、圧縮ファイルならどんな制御文字を入れ込んでもzip化もできるんじゃないか?
zipの暗号化パスワードに制御文字をいれる
>>> os.system("zip -P \x01\x02\x03\x04 test.zip test.txt") adding: test.txt (deflated 59%) 0 >>>
できてしまった。
厳密には、null byte "\x00" はダメだったが、それ以外ならパスワードに設定できるようだった。
これで、どうやってもキーボードからは突破できないzipファイルが作成できた。
ではこれをLhaplusのパスワード解析にかけてみると…
ちゃんと予想どおり解析できた。
(探索桁が3なのは、表示文字がインクリメントされる前に処理が終了されたから。数えてみると4文字分解析されてる)
ということで、英数記号以外も設定可能なzipに関しては、Lhaplusのパスワード探索はぜんぜん非効率なんかではなかった。
むしろこういうやつらにも対応「は」できるすごいヤツだったのだ。(な、なんだってー!!)
といっても制御文字は解析済みの画面上に表示できないから具体的な文字列までは結局完全にはわからないわけだけど。
(あらかじめ文字の形とのマッピング表を作っておけば、ある程度はわかりそう)
では、あくまで総当り前提として、こういうファイルに出くわしたときの解析には有用なツールが何がいいだろうか?
…というのはそのうち試すことにして、今回は、OSのパスワードにも同様に制御文字を設定できるのかを試してみた。
Linux のパスワード設定・ログイン
試験的に、新しくユーザ "account00" を作成し、アカウントパスワードに [DEL] を入れられるか試す。
[root@kali] # useradd account00 [root@kali] # python Python 2.7.3 (default, Mar 14 2014, 11:57:14) [GCC 4.7.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import os >>> os.system("echo account00:\x7f | /usr/sbin/chpasswd") 0 >>>
できちゃったw
違うユーザからログインしようとしても、
$ su - account00
パスワード:
su: 認証失敗
$
どう頑張ってもできない。
なんというせきゅあ()なパスワード。
自身のマシンにも自アカウントでログインできないこのザマである。
ちなみにWindowsからsshでパスワード欄に Ctrl+backspace を入力すると、ちゃんとログインできた。
ただし sshd などが上がりっぱなしな状況を作れないと死にますが。
もちろん、こんな感じでキーボードからは完全にログインできなくすることも可能。
>>> import os >>> os.system("echo account00:\x01\x02\x03\x04 | /usr/sbin/chpasswd") 0 >>>
では、スクリプトでOSにもログインできるかな。
今回は[こちら]のものを参考にさせていただき、Paramikoを使ったログインをしてみた。
import ssh print "SSH START" ipadr = "192.168.11.7" usernm = "account00" passwd = "\x01\x02\x03\x04" s = ssh.Connection(ipadr, username=usernm, password=passwd) command = "uname -a;id" cmd_result = s.execute(command) s.close() for rlt in cmd_result: print rlt
これを実行すると、
[root@kali2] # python sshcon.py SSH START Linux kali 3.12-kali1-686-pae #1 SMP Debian 3.12.6-2kali1 (2014-01-06) i686 GNU/Linux uid=1001(account00) gid=1002(account00) groups=1002(account00)
問題なく入れた。
Windows のパスワード設定・ログイン
Windowsも、スクリプト経由で ssh さえ立てれれば同様のことができるのではないか?ということでこちらも。まずはユーザ "account01" を作成した後、SSHサーバを立てる。
SSHサーバ構築はCygwinを使って、[ここ]を参考にさせていただいた。
では、パスワードを変える。
Set objUser = GetObject("WinNT://localhost/account01") objUser.SetPassword(chr(&H01)&chr(&H02)&chr(&H03)&chr(&H04))
VBSでパスワード変更のスクリプトを書いて、管理者として実行。
ちゃんと変更できて、OSログインもできなくなった。
今度はLinuxと同様に、スクリプトで account01 に対してSSHで接続。
cygwin を使い、 Paramiko を入れて他ユーザからログインする。
import ssh print "SSH START" ipadr = "192.168.11.2" usernm = "account01" passwd = "\x01\x02\x03\x04" s = ssh.Connection(ipadr, username=usernm, password=passwd) command = 'whoami; echo "logged in!!"' cmd_result = s.execute(command) s.close() for rlt in cmd_result: print rlt
実行すると、
[rintaro@rintaro_PC] $ python sshcon.py
SSH START
account01
logged in!!
Windowsでもキッチリできた。
以上で、パスワードを強固にするには制御文字も有効であることがわかった。
SSHが常時上がり続ける保証でもない限り、強制パスワードリセットが必要になりそうだけど。
root とか Administrator のアカウントでもしやった人がいたら、どういう心境なのかぜひ聞いてみたい。
ということで、まとめ。
- 圧縮やログイン用のパスワードは、文字が長いほど、そして複雑であるほど強度は上がるが、その文字種には「ヌルバイト以外の任意の制御文字も利用可能である」(ただし認証にも一苦労なので、どこまでやるかという話ではある)
- そして、Lhaplusのzipパスワード解析はそれを破るためには無駄ではない
- またOSのパスワードにも制御文字を設定できる。ただしシェル経由でログインできる環境でないとログインできなくなるので要注意
いつか、会社で重要資料とか送るときに一度はやってみたいよね。
「解凍パスワードは、SOH STX ETX EOT ENQ の5文字でお願いします。」
なんて。