様々な技術のノウハウを発信しています。2022.08.03PostsShareSharenoteで書くこの記事は2年以上前に書かれたものです。情報が古い可能性があります。A社のサーバ運用担当者が、ある日Hinemosへログインしようとしたところ、ログインパスワードが変更されていてログインできないことに気づきました。関係者へ問い合わせたところ、どうやら昨日システム管理者がパスワードを変更したらしい、とのことでした。新しいパスワードをシステム管理者へ確認しようとしましたが、折しも当人は本日から海外出張で、少なくとも一週間は連絡が全くとれない、とのことでした...不運な運用担当者は、変更後のパスワードを誰にも伝達せずに出張したシステム管理者へありったけの悪態をつきながら、作業端末の前で途方に暮れています。この状況を打開する術は全くないのでしょうか...落ち着いて状況を確認したところ、幸いマネージャサーバへsshログインすることができ、Hinemosの管理DBへ直接アクセスできることが分かりました。そこで、彼はパスワードをDBのユーザ情報テーブルから直接確認しようと、ダメ元で以下のコマンドを実行してみました。rows)しかし、現実はそう甘くはありません。予想どおりパスワードはハッシュ化されており、期待する情報は得られませんでした。彼には、どうしても今日中にHinemosでやってしまわないといけない作業があります。何か方法はないものかと思案を巡らせていたところ、彼の同僚から次の提案がありました。「DB上のパスワードを直接変更できないの?」なるほど!どうせログインできないのなら、やってみる価値はありそうです。彼は、Hinemosで使用されているパスワードのハッシュアルゴリズムを知るために、Hinemosのソースコードを確認しました。Javaは多少読める程度でしたが、必死でソースコードを探し回ったところ、クライアントのソースコードから以下のコードを見つけました。password);どうやらHinemosでは、クライアント上で生パスワードをMD5アルゴリズムでハッシュ化し、それをBase64でエンコードした文字列をマネージャへ送信しているようです。DBに格納されたパスワードハッシュの文字列の長さが全て24文字であることから、エンコード前のハッシュはそれよりも短い値、つまり16バイトのバイナリではないかと仮説を立てました(Base64でエンコードすると、文字数が約1.3~1.4倍になるため)。マネージャサーバには彼の得意なPerlと、MD5ハッシュ値を計算するためのDigest::MD5がインストールされていましたので、これを利用して以下のコマンドを叩いてみました。パスワードは、ここでは仮にaaaとしました。aaaR7zlx09Yn0hn29V+nKn4CA得られた文字列は22文字ですが、DBに格納されているパスワードハッシュはどれも4バイト単位でパディングされていますので、それに合わせて、末尾に穴埋め用の=を2つ追加します。R7zlx09Yn0hn29V+nKn4CA==1R7zlx09Yn0hn29V+nKn4CA==あとは、これを使用してDBを更新するだけです。1恐る恐るHinemosクライアントでログインしてみると、...なんと、無事ログインすることができました。ログイン後すぐに、運用規定に沿ったパスワードへクライアント上で変更し、彼はその後の作業を無事終える事ができました。パスワード変更を関係者へ伝達し忘れたシステム管理者には、帰国後に上司からキツいお灸がすえられました。(この物語はフィクションです。カスタマイズ等のお役立ち情報を発信しています。