HN 日本語サマリー

← 一覧へ戻る
セキュリティ

QSYRUPWDの背後にある暗号:IBM iパスワードハッシュの再構築

The Cipher Behind QSYRUPWD: Reconstructing IBM i Password Hashes (blog.silentsignal.eu)

9 pointsby kencausey7 コメント

要約

この記事は、IBM iのQSYRUPWD APIが返す暗号化されたパスワード関連データの構造を分析した結果を報告しています。特に、QPWDLVLシステム値が2以上に設定されている場合、QSYRUPWDの出力形式がJohn the Ripperのような既存のパスワードクラッキングツールで直接利用できないほど変化することが判明しました。著者は、APIの動作を調査するためにカスタムプログラムを作成し、STRTRCツールでコールトレースを収集・解析することで、QSYCIPHERやQSYAESFNCといった暗号関連の関数が使用されていることを特定しました。

全文翻訳

はじめに QSYRUPWD(Retrieve Encrypted User Password)は、権限のある呼び出し元に対して、指定されたユーザープロファイルのパスワード関連データを暗号化された形式で返すIBM i APIです。 IBM iは、AS/400ラインに起源を持つIBMの統合エンタープライズプラットフォームであり、ERP、金融、ロジスティクス、製造などのビジネスクリティカルなワークロードで依然として広く使用されています。 このAPIは、主にパスワード同期、移行、レプリケーション、およびパスワード素材を平文パスワードを公開せずに転送する必要があるその他の管理シナリオをサポートするために存在します。 IBMは、QSYRUPWDを、暗号化されたパスワードデータを処理するためのセキュリティ関連APIセットの一部として文書化しています。 私たちのIBM iペネトレーションテストの1つで、クライアントのサーバーがQPWDLVL = 2で構成されていることに気づきました。 IBM iでは、QPWDLVLシステム値が、オペレーティングシステムが受け入れるパスワードルールと、認証互換性のために維持される検証者フォーマットの両方を決定します。 IBMは、パスワードレベル0と1が古いDESベースのスキームに対応し、レベル2と3がSHA-1ベースのスキームを使用し、レベル4がPBKDF2ベースの検証者モデルを導入すると文書化しています。 IBMはまた、QPWDLVLが2に設定されている場合、オペレーティングシステムは古いものを削除するのではなく、複数のパスワード検証者形式との互換性を維持すると述べています。 この区別は、QSYRUPWDの出力を解釈する際に重要です。 John the Ripperには、レガシーIBM i素材、特にas400_desとas400_ssha1専用のIBM iクラッキングフォーマットが含まれており、これは古いDESベースおよびソルト付きSHA-1ベースの表現のサポートを反映しています。 しかし、私たちのテストでは、QPWDLVL 2〜4で実行されているシステムから取得したQSYRUPWDの出力は、John the RipperのIBM iフォーマットが期待する形式と一致しませんでした。 一方、レガシーなQPWDLVL 0〜1の場合、これらのモジュールによって処理されるQSYRUPWDから派生した素材と互換性があります。 言い換えれば、QPWDLVL 2〜4の場合、QSYRUPWDによって返されるコンテンツは、既存のJohn the Ripper IBM iフォーマットとの直接的な使用を不可能にする方法で変化します。 これは私たちのテストとツールの分析からの経験的な観察であり、IBMがそれらのレベルの正確な返却構造を公に文書化しているという主張ではありません。 その結果、*ALLOBJと*SECADM(QSYRUPWDを呼び出すために必要)を持っていても、APIは実用的なパスワード強度テストに使用できなくなりました。 このエンゲージメントの後、QSYRUPWD APIを詳細に分析することにしました。 ツール APIの動作を直接調べるために、QSYRUPWDをUPWD0100フォーマットで呼び出し、返されたバッファを取得し、さらに分析のためにエミットする小さなCLプログラムを作成しました。 目標は完全な抽出ツールを構築することではなく、異なるQPWDLVL設定の下でAPIがどのような種類のパスワード関連データを返すかを検証することでした。 これにより、システム間で実際の出力フォーマットを比較し、返されたデータがJohn the Ripperのような既存のクラッキングツールが期待する入力と一致するかどうかを判断することが可能になりました。 PGM PARM(&USER) DCL VAR(&USER) TYPE(*CHAR) LEN(10) DCL VAR(&RCV) TYPE(*CHAR) LEN(4000) DCL VAR(&LEN) TYPE(*INT) LEN(4) VALUE(4000) DCL VAR(&FMT) TYPE(*CHAR) LEN(8) VALUE('UPWD0100') DCL VAR(&ERR) TYPE(*CHAR) LEN(8) VALUE(X'0000000000000000') DCL VAR(&N) TYPE(*INT) LEN(4) DCL VAR(&N4) TYPE(*CHAR) LEN(4) DCL VAR(&NCH) TYPE(*CHAR) LEN(11) CALL PGM(QSZS/QSYRUPWD) PARM(&RCV &LEN &FMT &USER &ERR) MONMSG CPF0000 EXEC(DO) SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('QSYRUPWD failed') MSGTYPE(*ESCAPE) RETURN ENDDO CHGVAR VAR(&N4) VALUE(%SST(&RCV 1 4)) CHGVAR VAR(&N) VALUE(%BIN(&N4)) CHGVAR VAR(&NCH) VALUE(%CHAR(&N)) SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('QSYRUPWD ok, bytes:' *BCAT &NCH) MSGTYPE(*INFO) SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('Data: ' *BCAT &RCV) MSGTYPE(*INFO) ENDPGM トレース PWDDUMPプログラムをコンパイルした後、呼び出しトレースを生成できるかどうか疑問に思いました。 幸いなことに、IBM iにはQSYRUPWD内で行われた呼び出しに関する証拠を収集するために使用できるSTRTRCというツールがあります。 そのため、*ALLOBJと*SECADMの権限を持つユーザーでログインし(PWDDUMPを実行するために必要)、次のコマンドを実行しました。 STRTRC SSNID(MYTRACE) JOB(*ALL/QSECOFR/QPADEV0005) JOBTRCTYPE(*ALL) CALL USERB1/PWDDUMP USERB1 ENDTRC SSNID(MYTRACE) PRTTRC(*YES) PRTTRC DTALIB(QGPL) DTAMBR(MYTRACE) これらのコマンドは必要なコールトレース情報を含むスプールファイルを作成しますが、構造は最初は少し混乱します。以下はそのスプールファイルのスニペットです。 | | SYNCHRONOU CALL | CPU | READS | WR TIME THREAD FLAG FUNCTION PROGRAM LIBRARY ENTRY EXIT LVL | TIME | DB NDB| ---------------------------------------------------------------------------------------------------------------------------------- 12:53:35.829041 00000065 CALL QCMD QSYS x000519 x000519 1 .000000 0 0 0 12:53:35.829041 00000065 CALL QUICMENU QSYS x0000C1 x0000C1 2 .000000 0 0 0 12:53:35.829041 00000065 CALL QUIMNDRV QSYS x00061E x00061E 3 .000000 0 0 0 12:53:35.829041 00000065 CALL QUIMGFLW QSYS x0004D9 x0004D9 4 .000000 0 0 0 12:53:35.829041 00000065 CALL QUICMD QSYS x00056F x00056F 5 .000000 0 0 0 12:53:35.829041 00000065 XCTL QSCSNTRC QSYS x000A70 x000A70 6 .000000 0 0 0 12:53:35.829041 00000065 CALL QCMDEXC QSYS x00012F x00012F 7 .000000 0 0 0 12:53:35.829041 00000065 XCTL QYPESTRP QSYS 000000 000000 8 .000000 0 0 0 生のスパールファイルの内容を読みやすい形式に変換するスクレイパーを作成しました。例: PWDDUMP / PWDDUMP QCLRSLV QCLCLCPR -> QMHSNDPM -> return PWDDUMP QSYRUPWD / QSYRUPWD QLEIT / Q LE sinit_processor -> itl_callInit__FPV12ITL_COM_AREA -> QPWFSMONOC -> return QSYRUPWD QZLSRTPW / _CXX_PEP__Fv -> main QZLSSRV1 / QzlsGetNTPassword__FPcP15QzlsNTPasswords QSYSERV / QSYSRVRTV / qsy_rtv_user_ent__FPCcN21CcCiP20_qsy_serv_rtn_data_TPi QSYSERV / QSYSRVUTL / caller_is_authorized__FPCcPcPPvCs QSYMIUTLS / QSYGETSYP / qsy_getSYP__FPCcT1C11_OBJ_TYPE_TPPvPs qsy_getSYP_long__FPCcT1C11_OBJ_TYPE_TPPvPs QSYAUTUTLS / QSYCHKAUT / qsy_chkaut__FPvsT2cPs qsy_chkaut__FPvsT2cT4Ps QSYMIUTLS / QSYTESTAU / qsy_testau__FPvsT2Ps return QSYSERV / QSYSRVRTV / qsy_rtv_user_ent__FPCcN21CcCiP20_qsy_serv_rtn_data_TPi QSYSERV / QSYSRVRTV / rtv_user_entries__FPCcN21CcCiP20_qsy_serv_rtn_data_TPi QSYSERV / QSYSRVUTL / get_security_index__FPCcPPv QSYMIUTLS / QSYGETSYP / qsy_getSYP__FPCcT1C11_OBJ_TYPE_TPPvPs qsy_getSYP_long__FPCcT1C11_OBJ_TYPE_TPPvPs QSYMIUTLS / QSYMATSOBJ / qsy_matsobj__FPvP16_MSOB_Template_TPs return QSYSERV / QSYSRVRTV / rtv_user_entries__FPCcN21CcCiP20_qsy_serv_rtn_data_TPi QSYSERV / QSYSRVRTV / qsy_rtv_user_ent__FPCcN21CcCiP20_qsy_serv_rtn_data_TPi QSYSERV / QSYSRVRHS / returnIndividualEntry__FPCcT1P20_qsy_serv_user_ent_T QSYSERV / QSYSRVRHS / process2__FP20_qsy_serv_user_ent_T QSYSERV / QSYSRVRHS / unhide_edata__FPcsP20_qsy_serv_user_ent_T QSYSERV / QSYSRVRHS / get_offset__FP20_qsy_serv_user_ent_TPi QSYMIUTLS / QSYCIPHER / qsy_cipher__FPvP17_CIPHER_Control_TT1Ps QSYCODEUTL / QSYAESFNC / qsy_aes_decrypt__FPcsT1T2PsT1 QSYMIUTLS / QSYCIPHER / qsy_cipher__FPvP17_CIPHER_Control_TT1Ps return QSYSERV / QSYSRVRHS / process2__FP20_qsy_serv_user_ent_T QSYSERV / QSYSRVRHS / returnIndividualEntry__FPCcT1P20_qsy_serv_user_ent_T QSYSERV / QSYSRVRTV / qsy_rtv_user_ent__FPCcN21CcCiP20_qsy_serv_rtn_data_TPi QZLSSRV1 / QzlsGetNTPassword__FPcP15QzlsNTPasswords QZLS RTPW QSYRUPWD PWDDUMP 出力を見直すと、ジェネリック暗号操作、AES関連機能、復号ルーチンなど、暗号処理を強く示唆する以下のシンボルにすぐに注目しました。 QSYMIUTLS / QSYCIPHER / qsy_cipher__FPvP17_CIPHER_Control_TT1Ps QSYCODEUTL / QSYAESFNC / qsy_aes_decrypt__FPcsT1T2PsT1 逆アセンブル System Service Tools (SST) を使用して、QSYMIUTLS、QSYCODEUTL、QZLSRTPW、およびQSYRUPWD *SRVPGMオブジェクトのアセンブリコードをスプールファイルにダンプしました。 System Service Tools (SST) は、低レベルの診断、デバッグ、および