
BOF for Kerberos abuse(Rubeusの重要な機能の一部を実装)
Kerberos 悪用のための Beacon Object Files。これは Rubeus プロジェクトの重要な機能の一部を C 言語で実装したものです。このプロジェクトは C2 フレームワーク Cobalt Strike、Havoc、AdaptixC2、Outflank C2 との統合を特徴としています。

asktgt アクションは、指定されたユーザーと暗号化キー(/rc4 または /aes256)に対して生の AS-REQ(TGT 要求)トラフィックを構築します。ハッシュの代わりに /password フラグを使用することもできます。その場合 /enctype:X はデフォルトで RC4 になります。/domain が指定されない場合はコンピュータの現在のドメインが抽出され、/dc が指定されない場合はシステムの現在のドメインコントローラが抽出されます。認証が成功すると、結果の AS-REP が解析され、KRB-CRED(ユーザーの TGT を含む .kirbi)が base64 ブロブとして出力されます。/ptt フラグは「pass-the-ticket」を行い、結果の Kerberos 資格情報を現在のログオンセッションに適用します。また、別の OPSEC 上の注意: 現在のログオンセッションには一度に 1 つの TGT しか適用できないため、/ptt オプションを使用すると新しいチケットが適用されるときに以前の TGT は消去されます。
AS-REQ をより本物の要求に近づけるために、/opsec フラグを使用できます。これにより、最初に事前認証なしの AS-REQ が送信されます。これが成功すると、結果の AS-REP が復号化され TGT が返されます。そうでない場合は、事前認証付きの AS-REQ が送信されます。
PAC なしの TGT を要求するには /nopac スイッチを使用します。/nopreauth フラグを使用すると、事前認証なしで AS-REQ を送信できます。
krb_asktgt /user:USER /password:PASSWORD [/domain:DOMAIN] [/dc:DC] [/enctype:{rc4|aes256}] [/ptt] [/nopac] [/opsec]
krb_asktgt /user:USER /aes256:HASH [/domain:DOMAIN] [/dc:DC] [/ptt] [/nopac] [/opsec]
krb_asktgt /user:USER /rc4:HASH [/domain:DOMAIN] [/dc:DC] [/ptt] [/nopac]
krb_asktgt /user:USER /nopreauth [/domain:DOMAIN] [/dc:DC] [/ptt]

asktgs アクションは、指定された TGT /ticket:X を使用して生の TGS-REQ/TGS-REP サービスチケット要求を構築/解析します。この値は .kirbi ファイルの base64 エンコード でなければなりません。/dc が指定されない場合は、コンピュータの現在のドメインコントローラが抽出され、要求トラフィックの宛先として使用されます。/ptt フラグは「pass-the-ticket」を行い、結果のサービスチケットを現在のログオンセッションに適用します。1 つ以上の /service:X SPN をカンマ区切りで 指定する必要があります。
構築された TGS-REQ でサポートされる暗号化タイプは RC4_HMAC と AES256_CTS_HMAC_SHA1 です。この場合、KDC は返されるサービスチケットの構築に相互にサポートされる最も高い暗号化を使用します。RC4 または AES256 キーを強制する場合は /enctype:[rc4 or aes256] を使用します。
TGS-REQ をより本物の要求に近づけるために /opsec フラグを使用できます。これにより、制約のない委任用に構成されたアカウントに対してサービスチケットが要求されるときに、追加の TGS-REQ が自動的に送信されます。
/u2u フラグは User-to-User チケットを要求するために実装されました。/tgs:X 引数(ターゲットアカウントの TGT を提供するために使用)と一緒に、/service:X 引数には提供された TGT の対象アカウントのユーザー名を指定できます(/tgs:X 引数を使用)。/targetuser:X 引数は、ターゲットユーザー のユーザー名を含む PA-FOR-USER PA データセクションを挿入して、任意のアカウントの PAC を要求します。
/keyList フラグは Kerberos キーリスト要求 のために実装されました。これらの要求は、読み取り専用ドメインコントローラからの偽造された部分的な TGT を /ticket:BASE64 パラメータで使用する必要があります。さらに、/spn:x フィールドはドメイン内の KRBTGT SPN に設定する必要があります。例: KRBTBT/domain.local。
krb_asktgs /ticket:BASE64 /service:SPN1,SPN2,... [/domain:DOMAIN] [/dc:DC] [/tgs:BASE64] [/targetdomain:DOMAIN] [/targetuser:USER] [/enctype:{rc4|aes256}] [/ptt] [/keylist] [/u2u] [/opsec]

renew アクションは、指定された /ticket:X を使用して生の TGS-REQ/TGS-REP TGT 更新交換を構築/解析します。この値は .kirbi ファイルの base64 エンコードである必要があります。/dc が指定されない場合は、コンピュータの現在のドメインコントローラが抽出され、更新トラフィックの宛先として使用されます。/ptt フラグは「pass-the-ticket」を行い、結果の Kerberos 資格情報を現在のログオンセッションに適用します。
krb_renew /ticket:BASE64 [/dc:DC] [/ptt]
ユーザー(またはコンピュータ)アカウントが制約付き委任用に構成されている場合(つまり、msds-allowedtodelegateto フィールドに SPN 値がある場合)、このアクションを使用してターゲット SPN/サーバーへのアクセスを悪用できます。
TL;DR の説明: 制約付き委任が有効なアカウントは、S4U2self として知られるプロセスで、任意のユーザーとして自分自身へのチケットを要求できます。アカウントがこれを許可されるためには、useraccountcontrol プロパティで TrustedToAuthForDelegation が有効になっている必要があります。これはデフォルトでは特権ユーザーのみが変更できます。このチケットにはデフォルトで FORWARDABLE フラグが設定されています。サービスはこの特別に要求されたチケットを使用して、アカウントの msds-allowedtodelegateto フィールドで指定された任意のサービスプリンシパル名 (SPN) へのサービスチケットを要求できます。つまり、簡単に言うと、TrustedToAuthForDelegation が設定され、msds-allowedtodelegateto に値があるアカウントを制御している場合、アカウントの msds-allowedtodelegateto フィールドに設定された SPN に対してドメイン内の任意のユーザーになりすますことができます。
S4U2self チケットは、/tgs:Y パラメータ(base64 ブロブ)として使用して S4U2proxy プロセスを実行できます。アカウントの有効な msds-allowedtodelegateto 値を指定する必要があります(/service:X)。
/altservice パラメータを使用すると、結果の KRB-CRED ファイル内の任意のサービス名に置き換えることができます。1 つ以上の代替サービス名をカンマ区切りで指定できます(/altservice:cifs,HOST,...)。
TGS-REQ をより本物の要求に近づけるために /opsec フラグを使用できます。
特定の状況では、S4U2Self チケットを使用して保護されたユーザーを偽装し、要求システム上で権限を昇格させることが可能です(こちら で議論されています)。この目的のために、/self フラグと /altservice:X 引数を使用して、使用可能なサービスチケットを生成できます。
S4U2Self 紹介を偽造するには、信頼キーのみが必要です。/self フラグと /targetdomain:X 引数を /targetdc 引数なしで使用すると、/ticket:X で提供されたチケットが S4U2Self 紹介として扱われ、最終的な S4U2Self サービスチケットのみが要求されます。/altservice:X を使用して、結果のチケット内の sname を書き換えることもできます。
krb_s4u /ticket:BASE64 /service:SPN {/impersonateuser:USER | /tgs:BASE64} [/domain:DOMAIN] [/dc:DC] [/altservice:SERVICE] [/ptt] [/nopac] [/opsec] [/self]
krb_cross_s4u /ticket:BASE64 /service:SPN /targetdomain:DOMAIN /targetdc:DC {/impersonateuser:USER | /tgs:BASE64} [/domain:DOMAIN] [/dc:DC] [/altservice:SERVICE] [/nopac] [/self]

ptt アクションは、LsaCallAuthenticationPackage() API を介して KERB_SUBMIT_TKT_REQUEST メッセージを使用して /ticket:X(TGT またはサービスチケット)を現在のログオンセッションに送信するか、または(昇格している場合)/luid:ea4.. で指定されたログオンセッションに送信します。他の /ticket:X パラメータと同様に、値は .kirbi ファイルの base64 エンコードにすることができます。
krb_ptt /ticket:BASE64 [/luid:LOGONID]
purge アクションは、現在のログオンセッションからすべての Kerberos チケットを消去するか、または(昇格している場合)/luid:0xA.. で指定されたログオンセッションから消去します。
krb_purge [/luid:LOGONID]
describe アクションは /ticket:X 値(TGT またはサービスチケット)を受け取り、それを解析してチケットの値を説明します。他の /ticket:X パラメータと同様に、値は .kirbi ファイルの base64 エンコードにすることができます。
krb_describe /ticket:BASE64

klist は、昇格していない場合、現在のユーザーのログオンセッションと Kerberos チケットの詳細情報を一覧表示します。昇格されたコンテキスト(SYSTEM)から実行された場合、すべてのログオンセッションと関連する Kerberos チケットの情報が表示されます。特定の LogonID のログオンおよびチケット情報は /luid:3ea.. で表示できます(昇格している場合)。
krb_klist [/luid:LOGINID] [/user:USER] [/service:SERVICE] [/client:CLIENT]

dump アクションは、昇格されたコンテキスト(SYSTEM)内で現在の TGT とサービスチケットを抽出します。昇格していない場合、現在のユーザーのサービスチケットが抽出されます。
krb_dump [/luid:LOGINID] [/user:USER] [/service:SERVICE] [/client:CLIENT]

triage アクションは、昇格していない場合、現在のユーザーの Kerberos チケットのテーブルを出力します。昇格されたコンテキスト(SYSTEM)から実行された場合、システム上のすべての Kerberos チケットを説明するテーブルが表示されます。
krb_triage [/luid:LOGINID] [/user:USER] [/service:SERVICE] [/client:CLIENT]

klist、triage、dump では、チケットを /luid、/service、/client でフィルタリングできます。
SYSTEM コンテキストが必要です。

tgtdeleg は Kerberos GSS-API を悪用して、ホスト上での昇格を必要とせずに現在のユーザーの使用可能な TGT を取得します。AcquireCredentialsHandle() を使用して現在のユーザーの Kerberos セキュリティ資格情報へのハンドルを取得し、ISC_REQ_DELEGATE フラグとターゲット SPN が CIFS/DC.domain.com の InitializeSecurityContext() を使用して、DC に送信する偽の委任コンテキストを準備します。これにより、GSS-API 出力内に AP-REQ が生成され、認証子チェックサムに KRB_CRED が含まれます。サービスチケットのセッションキーはローカルの Kerberos キャッシュから抽出され、認証子内の KRB_CRED を復号化するために使用され、使用可能な TGT .kirbi が得られます。
自動的なターゲット/ドメイン抽出が失敗する場合は、制約のない委任で構成されたサービスの既知の SPN を /target:SPN で指定できます。
krb_tgtdeleg [/target:SPN]

kerberoasting は適切なサービスチケットを要求するために使用されます。/ticket:X 引数はドメインユーザーの TGT チケットを指定します。/spn:X 引数はターゲット SPN を指定します。/domain および /dc 引数はオプションで、他のアクションと同様にシステムのデフォルトを取得します。
/nopreauth:USER 引数は、/spn:Y に渡されたサービスを使用して AS-REQ を送信し、サービスチケットを要求しようとします。
krb_kerberoasting /spn:SPN [/nopreauth:USER] [/dc:DC] [/domain:DOMAIN]
krb_kerberoasting /spn:SPN /ticket:BASE64 [/dc:DC]

ドメインユーザーが Kerberos の事前認証を有効にしていない場合、そのユーザーに対して AS-REP を正常に要求でき、構造の一部をオフラインで解読できます(いわゆる kerberoasting)。/user:X 引数はターゲットユーザーを指定します。/domain および /dc 引数はオプションで、他のアクションと同様にシステムのデフォルトを取得します。
krb_asreproasting /user:USER [/dc:DC] [/domain:DOMAIN]

hash アクションは /password:X とオプションの /user:USER および/または /domain:DOMAIN を受け取ります。パスワードの rc4_hmac (NTLM) 表現を生成します。ユーザー名とドメイン名が指定された場合、aes128_cts_hmac_sha1 および aes256_cts_hmac_sha1 ハッシュ形式も生成されます。ユーザー名とドメイン名は AES 実装のソルトとして使用されます。
krb_hash /password:PASSWORD [/user:USER] [/domain:DOMAIN]

changepw アクションはユーザーの TGT .kirbi ブロブを受け取り、指定された /new:PASSWORD 値で MS kpasswd パスワード変更を実行します。/dc が指定されない場合、コンピュータの現在のドメインコントローラが抽出され、パスワードリセットトラフィックの宛先として使用されます。
/targetuser および /targetdomain 引数は、TGT を持つユーザーが十分な権限を持っている場合、他のユーザーのパスワードを変更するために使用できます。
ユーザーの TGT または kadmin/changepw のサービスチケットのいずれかを使用してパスワードを変更できることに注意してください
krb_changepw /ticket:BASE64 /new:PASSWORD [/dc:DC] [/targetuser:USER] [/targetdomain:DOMAIN]

asktgt /cert:... の実装describe の出力を拡張