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 …


This year's Index

Home