john
Table of Contents
Errata
OpenBSD 7.6 Errata を見ると、005: SECURITY FIX: November 15, 2024 が発表 されている。河豚板は即座に対応済。オイラーは、この手当をする必要が有る だろうか?
In libexpat fix crash within function XML_ResumeParser.
CVE-2024-50602
って事だから、使ってるアプリがこれを内蔵してれば、ビンゴだな。
一番ヤバそうなのを確認するか。一番使ってるしね。
eq$ ldd /usr/local/lib/firefox/firefox | cut -b40- Open Ref GrpRef Name 2 0 0 /usr/local/lib/firefox/firefox 0 1 0 /usr/lib/libc++.so.10.0 0 2 0 /usr/lib/libc++abi.so.7.0 0 1 0 /usr/lib/libpthread.so.27.1 0 1 0 /usr/lib/libm.so.10.1 0 1 0 /usr/lib/libc.so.100.3 0 1 0 /usr/libexec/ld.so
えっ、これだけなの? 調べ方を間違ったかな。
NHKへの提言
某週刊誌を見ていたら、NHKの朝ドラが超低空飛行らしい。歴代不名誉記録を 更新中。若者を取り込もうとして、年寄からソッポをむかれたって分析してた。 その補強材料として、NHKのOBも登場。
年末の締め、紅白もいつの間にか、若者向けになってしまって、視聴率が下降中って 嘆いていた。万人の要求を満たすのは無理としても、前半は若者向け、後半は、 昭和の懐かしいのとか、やり様は有るだろうにってね。
年寄は黙っていても、口座からの自動引き落とし、でも若者はそうでもない。 だから、若者獲得に躍起になってるとも分析してた。まさに、その通りだわな。
オイラーの友人も年金暮しに皆突入しちゃってるけど、パソコンをネットに繋いで ゆーちゅーぶ三昧してるって。NHKはほとんど見ないけど、視聴税は惰性で払ってる と言ってた。鷹揚だねぇ。
NHKとトラブルを起こさないで、NHK税から逃れる方法が有るらしい。チューナー無し のTVにしちゃう事。これならNHKを受信する設備とは言えないから、奴らは手も足も だせない。果してそんなTV有るのか? はい、ドンキとアイリスオーヤマの2社が 販売してます。勿論チューナーが無いんで民放も映りません。ネットに接続して TVerでも見ると宜しい。
再放送と番宣のNHKのくせに、皆様のNHK公共放送なんて、ちゃんちゃらおかしい。 大谷・映像って偏向放送もヤメレ!! 数百億もそんなのに費やすなら、普通の番組を 充実しろよ。
cd ripping
前回cdを聞いた。毎度、お皿(CD)をセットして演奏じゃ、何処かのDJみたいで、 かったるいな。cdから楽曲を取り出してきて、HDDへ保存しちゃえ。そうすれば、 カーオーデォみたいに、指先だけで操作できるぞ。カーオーディの時、CDからの 取り込みは、あっと言う間に終了した記憶が有るんだけど、パソコンでも同じ かな?
ベートーベンの合唱付きだけを、CDからリッピングしてみる。
eq$ cdio info Starting track = 1, ending track = 4, TOC size = 42 bytes track start duration block length type ------------------------------------------------- 1 0:02.00 15:31.72 0 69897 audio 2 15:33.72 13:31.60 69897 60885 audio 3 29:05.57 14:56.05 130782 67205 audio 4 44:01.62 24:29.63 197987 110238 audio 170 68:31.50 - 308225 - - eq$ time cdio cdrip 4 track 4 'a' 00110238/00110238 100% 2m19.85s real 0m01.05s user 0m05.21s system
演奏時間24分30秒の章を2分20秒で、吸い出ししてくれた。して、その容量は?
eq$ ls -lh track04.wav -rw------- 1 sakae sakae 247M Nov 15 06:54 track04.wav
マスター音源は、250M近い容量。雑に、1分で10Mと覚えておけばいいんだな。 これだと、フェルミ推定より確かな見積が出来るな。 ついでに、吸い出し時間は、演奏時間の1/10で済むと覚えておけば良い。
問題は、この大容量なファイルですよ。何とか圧縮してしまいたいぞ。そこで 登場するのが、圧縮ソフト。gzipみたいな圧縮ソフトは、展開すると全く同じ ものに戻るけど、戻らないって特性を容認すれば、ずっと圧縮率を高める事が 可能になる。更に、人間の耳特性を考慮するとかすれば、圧縮に拍車を かける事ができる。圧縮されたファイルは、普通 、mp3 ってサフィックスを つける。この圧縮ソフトのデファクト・スタンダートは、lameだ。
eq$ lame -b 128 track04.wav b9-4.mp3 LAME 3.100 64bits (http://lame.sf.net) Using polyphase lowpass filter, transition band: 16538 Hz - 17071 Hz Encoding track04.wav to b9-4.mp3 Encoding as 44.1 kHz j-stereo MPEG-1 Layer III (11x) 128 kbps qval=3 Frame | CPU time/estim | REAL time/estim | play/CPU | ETA 56269/56269 (100%)| 0:43/ 0:43| 0:44/ 0:44| 33.475x| 0:00 ------------------------------------------------------------------------------- kbps LR MS % long switch short % 128.0 14.4 85.6 99.9 0.0 0.0 Writing LAME Tag...done ReplayGain: +0.5dB
老人性の難聴と言うか、耳の周波数特性が劣化してるんで、音質を犠牲にして高圧縮 にしてみた。高品質を望むなら、-b 192にするとか、他のオプションを付与すればいい。
eq$ ls -lh b9-4.mp3 -rw-r--r-- 1 sakae sakae 22.4M Nov 15 07:15 b9-4.mp3
原音の1/10のサイズになったな。これで、バンバン変換してけばいいか。ちょっと気が 早いけど、ニューイヤーコンサート用に、何かリッピングしとくかな。ドボルザークの 新世界より なんてのが定番かな。
john
年末近くになると、流行語大賞とかの1年のまとめが記事になる事が多い。 それに類するものとして、身近なパスワードも記事になってた。
2024年版「最もよく使われるパスワード」が公開される、日本企業からは「ニャンまげ」が謎のランクイン
これって、パスワード破りに使えるよね。どんなツールが有名なの? password break で検索してみたら、 パスワードクラック なんてのが出てきた。そこから、john なんてツールが公開 されてる事を知った。幸いOpenBSDでも提供されてるので試してみたい。
security/john と それを皆がよってたかって拡張した、john-jumbo の2種が有る けど、簡単な方を選びました。
install
前回やった、自前でパッケージを構築する方法に則り、make configureまで実行。 後は、config.logを見ながら移植、、、なんだけど、今回はそれが通用しなかった。 configureってGNU提供のインストール手段なのね。しょうがないので、付属の 案内書類を参照。doc/INSTALL文書によると、
cd src make Note the make target for your system and type: make clean SYSTEM where SYSTEM is the appropriate make target. Alternatively, if your system is not listed, use: make clean generic If everything goes well, this will create the executables for John and its related utilities under "../run/". You can change directory to there and start John, like this: cd ../run ./john --test
どんなシステムに対応してるのか、確認。
eq$ make | grep openbsd openbsd-x86-64 OpenBSD, x86-64 with SSE2 (best) openbsd-x86-sse2 OpenBSD, x86 with SSE2 (best if 32-bit) openbsd-x86-mmx OpenBSD, x86 with MMX openbsd-x86-any OpenBSD, x86 openbsd-alpha OpenBSD, Alpha openbsd-sparc64 OpenBSD, SPARC 64-bit (best) openbsd-sparc OpenBSD, SPARC 32-bit openbsd-ppc32 OpenBSD, PowerPC 32-bit openbsd-ppc64 OpenBSD, PowerPC 64-bit openbsd-pa-risc OpenBSD, PA-RISC openbsd-vax OpenBSD, VAX
積んでいる演算器を選べる様になってるって事は、スピード命って事なんか。GPUを 搭載したマシンとか、パラレル演算とか出来れば最高。それじゃ、仮想通貨の マイニングに血道を上げている、どこかの業者さんじゃん。まあ、やってる事は マイニングと変わらないからなあ。
なんか、歴史が有るなあ。もうopenbsd-vaxなんて、完全に終っているぞ。何となく 、いやな予感がする。まあいい、 コンパイルした後でテストしとけだな。
eq$ cd run/ eq$ ./john --test Created directory: /home/sakae/.john fopen: /usr/local/share/john/john.ini: No such file or directory
john.iniって、意味深なファイルだなあ。そのあたり、どうなってる?
eq$ cd ../src/ eq$ grep john.ini -r . ./john.c:static void john_init(char *name, int argc, char **argv) ./john.c: john_init(name, argc, argv); ./params.h:#define CFG_ALT_NAME "$JOHN/john.ini" ./params.h:#define CFG_PRIVATE_ALT_NAME JOHN_PRIVATE_HOME "/john.ini" ./params.h.orig.port:#define CFG_ALT_NAME "$JOHN/john.ini" ./params.h.orig.port:#define CFG_PRIVATE_ALT_NAME JOHN_PRIVATE_HOME "/john.ini" ./params.h.beforesubst:#define CFG_ALT_NAME "$JOHN/john.ini" ./params.h.beforesubst:#define CFG_PRIVATE_ALT_NAME JOHN_PRIVATE_HOME "/john.ini" Binary file ./john.o matches eq$ grep usr/local -r . ./params.h:#define JOHN_SYSTEMWIDE_EXEC "/usr/local/bin/john" ./params.h:#define JOHN_SYSTEMWIDE_HOME "/usr/local/share/john" Binary file ./path.o matches
ふむ、設定ファイル類っぽいな。そして、それの存在場所は、もし必要なら、自分で 調整してねか。GNUみたいにconfigure一発って、流れ作業って、いかに人間を堕落 させる奴か良くわかるよ。昔は パラメータを全部自分で調整してたものなあ。
河豚板の素晴しい機能に便乗しちゃいます。そう、どんな悪い事をしても、再起動すれば 全てご破産になるっての。pkgからインストールしてしまえ。
eq$ ls /usr/local/share/john/ ascii.chr digits.chr lm_ascii.chr password.lst
何か、解析に使用するデータだな。自前のデータも$HOME/.johnに追加できます構造 になってる。
eq$ john --test Benchmarking: descrypt, traditional crypt(3) [DES 128/128 SSE2-16]... DONE Many salts: 4430K c/s real, 4403K c/s virtual Only one salt: 4186K c/s real, 4220K c/s virtual Benchmarking: bsdicrypt, BSDI crypt(3) ("_J9..", 725 iterations) [DES 128/128 SSE2-16]... DONE Many salts: 146011 c/s real, 146304 c/s virtual Only one salt: 142741 c/s real, 141892 c/s virtual Benchmarking: md5crypt [MD5 32/64 X2]... DONE Raw: 7164 c/s real, 7150 c/s virtual Benchmarking: bcrypt ("$2a$05", 32 iterations) [Blowfish 32/64 X2]... DONE Raw: 724 c/s real, 724 c/s virtual Benchmarking: LM [DES 128/128 SSE2-16]... DONE Raw: 52219K c/s real, 52533K c/s virtual Benchmarking: AFS, Kerberos AFS [DES 48/64 4K]... DONE Short: 423243 c/s real, 419890 c/s virtual Long: 1328K c/s real, 1325K c/s virtual Benchmarking: tripcode [DES 128/128 SSE2-16]... DONE Raw: 3821K c/s real, 3821K c/s virtual Benchmarking: dummy [N/A]... DONE Raw: 83429K c/s real, 84783K c/s virtual
実戦投入
大丈夫そう。次は実戦投入。どうやるんだ? doc/EXAMPLE
1. First, you need to get a copy of your password file. If your system uses shadow passwords, you may use John's "unshadow" utility to obtain the traditional Unix password file, as root: umask 077 unshadow /etc/passwd /etc/shadow > mypasswd 2. Now, let's assume you've got a password file, "mypasswd", and want to crack it. The simplest way is to let John use its default order of cracking modes: john mypasswd 3. If you've got some passwords cracked, they are stored in $JOHN/john.pot. The john.pot file is not meant to be human-friendly. You should be using John itself to display the contents of its "pot file" in a convenient format: john --show mypasswd
現存するパスワードとそのシャドウ・ファイルから、解析し易いようにファイルを作成。 それを解析。結果を表示って流れか。
解り易いように、joy/123456 って、アカウントとパスワードをadduserで登録してやってみる。
eq# cat /etc/passwd | tail -1 joy:*:1001:1001:joy:/home/joy:/bin/ksh eq# cat /etc/master.passwd | tail -1 joy:$2b$09$j4Z6fdVwOWOMwJQavEfPf.NP0WGPqXms7aPthkFEKJOIC0mko5pOy:1001:1001::0:0:joy:/home/joy:/bin/ksh
OpenBSDでは、shadowの変りがmaster.passwdです。分離されてるのは、大事なpasswd-hash を非公開にする為です。
eq# unshadow /etc/passwd /etc/master.passwd >mypasswd eq# tail -1 mypasswd joy:$2b$09$j4Z6fdVwOWOMwJQavEfPf.NP0WGPqXms7aPthkFEKJOIC0mko5pOy:1001:1001:joy:/home/joy:/bin/ksh
オリジナルとほぼ同一だなあ。
eq# john mypasswd Created directory: /root/.john No password hashes loaded (see FAQ)
実行するとFAQを見ろとな。
Q: Why doesn't John load my password file? It says "No password hashes loaded", "No password hashes loaded (see FAQ)", or "No password hashes left to crack (see FAQ)". A: Your password file taken from a Unix-like system might be shadowed. You need to get both /etc/passwd and the shadow file (typically /etc/shadow or /etc/master.passwd), and combine them into one file using "unshadow" (which is supplied with John). Please refer to EXAMPLES.
指示された通りにしてるんだけどなあ。
John the Ripper なんて解説が有った。例を試してみる。
eq$ cat >pass.txt user:AZl.zWwxIh15Q eq$ john pass.txt Loaded 1 password hash (descrypt, traditional crypt(3) [DES 128/128 SSE2-16]) Press 'q' or Ctrl-C to abort, almost any other key for status example (user) 1g 0:00:00:00 100% 2/3 33.33g/s 1788Kp/s 1788Kc/s 1788KC/s evocate..exceptin Use the "--show" option to display all of the cracked passwords reliably Session completed eq$ john --show pass.txt user:example 1 password hash cracked, 0 left
問題無く動いたぞ。
crypt
ひょっとして、OpenBSDのpasswd-hashには、対応していない? 悪い予感は的中する っていうマーフィーの法則が適用されちゃってる? そうだ、qemuで動くFreeBSDで passwd-hashを作成してみよう。
eq$ cat mypasswd joy:$6$HTxGbkN8ThKF4Dud$22t.Ea.U7iySmfRq79VyZLTN32f6cJxtMXANWF1I5gDa9JEHLjg7cXMHnis868CbO5Th/csu7KULcMXi2Ux3x.:1002:1002:joy:/home/joy:/bin/sh eq$ john mypasswd No password hashes loaded (see FAQ)
FreeBSDのデフォルトshellは/bin/shです、なんて事はどうでも良くて、やはり失敗 してる。OpenBSDのハッシュと見比べると、微妙に構造が違うみたいだ。
from FreeBSD crypt(3)
Modular crypt: If the salt begins with the string $digit$ then the Modular Crypt Format is used. The digit represents which algorithm is used in encryption. Following the token is the actual salt to use in the encryption. The maximum length of the salt used depends upon the module. The salt must be terminated with the end of the string character (NUL) or a dollar sign. Any characters after the dollar sign are ignored. Currently supported algorithms are: 1. MD5 2. Blowfish 3. NT-Hash 4. (unused) 5. SHA-256 6. SHA-512 Other crypt formats may be easily added. An example salt would be: $4$thesalt$rest
この説明だと、OpenBSDのハッシュは、blowfish ずばり 河豚って事だ。河豚は 膨れるからネェ。英語圏の連中も、姿形から連想して名前を付けているな。
こちらは、OpenSDのcrypt(3)
Blowfish crypt The Blowfish version of crypt has 128 bits of salt in order to make building dictionaries of common passwords space consuming. The initial state of the Blowfish cipher is expanded using the salt and the password repeating the process a variable number of rounds, which is encoded in the password string. The maximum password length is 72. The final Blowfish password entry is created by encrypting the string “OrpheanBeholderScryDoubt” with the Blowfish state 64 times. The version number, the logarithm of the number of rounds and the concatenation of salt and hashed password are separated by the ‘$’ character. An encoded ‘8’ would specify 256 rounds. A valid Blowfish password looks like this: “$2b$12$FPWWO2RJ3CK4FINTw0Hi8OiPKJcX653gzSS.jqltHFMxyDmmQ0Hqq”. The whole Blowfish password string is passed as setting for interpretation.
さすが、河豚の解説がしっかり出てた。
それはいいんだけど、この後どうしよう?
make for debug
gdb出来る様にコンパイルしたいぞ。その前に、makeが、どんな挙動になるか確認。
eq$ make -n openbsd-x86-64 ln -sf x86-64.h arch.h make ../run/john ../run/unshadow ../run/unafs ../run/unique JOHN_OBJS="DES_fmt.o BF_std.o ... x86-64.o"
実際にコンパイル。
: cc -c -Wall -Wdeclaration-after-statement -O2 -fomit-frame-pointer -funroll-loops unique.c cc -c x86-64.S cc DES_fmt.o ... unshadow.o unafs.o unique.o x86-64.o -s -o ../run/john
普通にCPPFLAGS= -g しても、gdbが動くバイナリーが作成できなかった。そこで、
eq$ diff -u /mnt/my/src/john-1.8.0/src/Makefile Makefile --- /mnt/my/src/john-1.8.0/src/Makefile Fri Nov 15 16:25:29 2024 +++ Makefile Tue Nov 19 16:06:03 2024 @@ -8,7 +8,7 @@ # There's ABSOLUTELY NO WARRANTY, express or implied. # -CC = gcc +CC = cc -g AS = $(CC) LD = $(CC) CPP = $(CC) @@ -32,7 +32,7 @@ # CFLAGS for use on the main john.c file only CFLAGS_MAIN = $(CFLAGS) ASFLAGS = -c $(OMPFLAGS) -LDFLAGS = -s $(OMPFLAGS) +LDFLAGS = $(OMPFLAGS) OPT_NORMAL = -funroll-loops # Remove the "-Os" if you're using an ancient version of gcc OPT_INLINE = -Os -funroll-loops -finline-functions
長年の勘で、こういう無茶をやってみた。多分LDFLAGSに付いていた -s オプションは、 stripだろうと言う予想(man cc,ldしたけど説明無し)。
また、こんな変更も実施。OpenBSDはパッケージから入れた奴の設定ファイルは、/etc の下に配置される。今回は、FreeBSD式に、設定ファイルを分離してみた。
eq$ cd john-1.8.0/src/ eq$ grep /mnt/opt params.h #define JOHN_SYSTEMWIDE_EXEC "/mnt/opt/bin/john" #define JOHN_SYSTEMWIDE_HOME "/mnt/opt/share/john" #define CFG_FULL_NAME "/mnt/opt/etc/john.conf"
そして、必要なファイル類を配置してあげる。
eq$ gdb -q john (gdb) r --test Starting program: /mnt/opt/bin/john --test Error while reading shared library symbols: Dwarf Error: wrong version in compilation unit header (is 4, should be 2) [in module /ram/usr/libexec/ld.so] Benchmarking: descrypt, traditional crypt(3) [DES 128/128 SSE2-16]... DONE Many salts: 4440K c/s real, 4449K c/s virtual Only one salt: 4212K c/s real, 4187K c/s virtual Benchmarking: bsdicrypt, BSDI crypt(3) ("_J9..", 725 iterations) [DES 128/128 SSE2-16]... ^C Program received signal SIGINT, Interrupt. DES_bs_crypt_start () at x86-64.S:1010 1010 S2(B(44), B(59), B(33), B(49)) Current language: auto; currently asm (gdb) bt #0 DES_bs_crypt_start () at x86-64.S:1010 #1 0x0000000d5948a985 in crypt_all (pcount=Unhandled dwarf expression opcode 0xa3 ) at BSDI_fmt.c:326 #2 0x0000000d59498e79 in benchmark_format (format=0xd594bc950, salts=256, results=0x75b513ff0950) at bench.c:191 #3 0x0000000d594991ad in benchmark_all () at bench.c:278 #4 0x0000000d594a4a76 in main (argc=Unhandled dwarf expression opcode 0xa3 ) at john.c:560
やっとgdbと仲良くできる環境になったわい。
気を良くしたオイラーは、i386なマシンでもコンパイルしてみた。だって、あちらは、 emacs + gdb な環境が使えるからね。でも、あえなく ld の工程で撃沈。-picでは、 再配置ドータラコータラと言われてしまったんだ。潔く撤退。
長くなりそうなので、to be continue …