
skewrun v1.2.0
レッドチーム向けのActive Directory時間発見プロトコル。Kerberos、SMB、NTLM、CLDAPを介したステルス抽出。
Skewrun

skewrunは、レッドチーム向けのActive Directory時間探索ツールキットです。ネットワークプロトコル(CLDAP、SMB、NTP、Kerberos、NTLM)を介してドメインコントローラの時刻を動的に解決し、libfaketime(LD_PRELOAD)を介してコマンドを実行し、実行されたバイナリを騙して正確なDC時刻を使用させます。
これにより、Kerberos KRB_AP_ERR_SKEW(Clock Skew Too Great)エラーが解決され、時計がターゲットWindowsドメインと大きく同期が取れていないLinux攻撃マシンからImpacketやNetExecなどのツールを実行できるようになります。システム時間を変更するためのroot権限は不要です。
アーキテクチャ: ライブラリファースト
v0.9.0以降、Skewrunはライブラリファーストのアーキテクチャで構築されています。
ad-time: ADプロトコルからステルス的に時刻を抽出する純粋なRustライブラリクレート。他のRustインプラントやツールにネイティブに組み込むことができます。skewrun:ad-timeライブラリを統括し、libfaketimeでターゲットプロセスをラップするCLIバイナリ。
インストール
# Pre-built static binary (no Rust toolchain required)
wget https://github.com/JVBotelho/skewrun/releases/latest/download/skewrun-x86_64-linux-musl
chmod +x skewrun-x86_64-linux-musl
sudo mv skewrun-x86_64-linux-musl /usr/local/bin/skewrun
# From crates.io
cargo install skewrun
# From source
git clone https://github.com/JVBotelho/skewrun && cd skewrun && cargo build --release
注: システムにlibfaketimeがインストールされている必要があります(例: apt-get install libfaketime)。
使用法
# Default behavior (tries CLDAP -> SMB -> NTP)
skewrun 10.10.10.100 -- impacket-getTGT -dc-ip 10.10.10.100 domain.local/user:pass
# Force specific methods
skewrun 10.10.10.100 -m cldap,ntlm,kerberos -- netexec smb 10.10.10.100
# Just print the offset (useful for shell scripting)
skewrun 10.10.10.100 --print-offset
# Offline mode: supply a known offset manually
skewrun --offset "+3.450s" -- impacket-getTGT ...
# Tune inter-method jitter (default: sigma=0.4, base=8000ms; sigma=0 disables jitter)
skewrun 10.10.10.100 --jitter-sigma 0.2 --jitter-base-ms 5000 -- impacket-getTGT ...
ライブラリとしての使用
use ad_time::protocols::cldap::CldapSource;
use ad_time::time_src::TimeSource;
use std::time::Duration;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let src = CldapSource;
let addr = "10.10.10.100:389".parse()?;
let offset_us = src.fetch(addr, Duration::from_secs(3))?;
println!("DC offset: {} µs", offset_us);
Ok(())
}
各プロトコルモジュール(kerberos、ntlm、cldap、smb、ntp)は独立しており、カスタムレッドチームツールで使用するために抽出可能です。
動作の仕組み
SkewrunはDCにクエリを実行し、正確なマイクロ秒オフセット(DC_Time - Local_Time)を計算します。その後、FAKETIME環境変数を設定し、LD_PRELOADを使用してターゲットコマンドにlibfaketimeを注入します。
FAKETIMEの制限(静的バイナリ)
LD_PRELOADは、libcの動的リンク呼び出し(clock_gettimeなど)をインターセプトすることに依存しています。静的にコンパイルされたバイナリ(多くのGoやRustツールなど)でskewrunを使用しようとすると、libfaketimeは時間関数のフックに静かに失敗します。Skewrunは、静的バイナリを実行しようとしていることを検出した場合、警告を表示します。
フォレンジックノイズと回避
目標は、標準的なWindowsワイヤトラフィックに溶け込み、DC上のフォレンジックフットプリントを最小限に抑えることです。
使用される方法に関係なく、すべてのアウトバウンドソケットはTCPハンドシェイク前にTTL=128を設定し、Nagle(TCP_NODELAY=0)を有効にします。これにより、受動的な観測者(p0f、Zeek conn.log)がフラグを立てるであろうLinuxのデフォルト(TTL=64、Nagleオフ)ではなく、Windowsクライアントのネットワークスタックフィンガープリントに一致します。メソッド間の遅延は、CSPRNGでバックアップされた対数正規ジッター(フラットなランダム範囲ではない)を使用し、繰り返しの失敗に対して指数バックオフを行います。これにより、固定ジッターバンドが接続ログに残す均一タイミングシグネチャを回避します。上記の--jitter-sigmaと--jitter-base-msを参照してください。
| 方法 | プロトコル | ポート | OPSECに関する注意事項(EDR/NDRでの可視性) |
|---|---|---|---|
| cldap (デフォルト) | CLDAP | UDP/389 | 非常にステルス性が高い。広く許可されています。標準のLDAP rootDSE診断クエリ(objectClass=*ベース検索)を送信し、ldapsearch、PowerShell ADコマンドレット、監視ツールのベースラインに一致します。属性リストを一般的な管理属性で希釈し、リクエストごとに属性の順序をランダム化して、静的なNDRシグネチャを破ります。 |
| smb (デフォルト) | SMB2 | TCP/445 | ステルス性が高い。SMB2 NEGOTIATEレスポンスから時刻を抽出します。PREAUTH_INTEGRITY_CAPABILITIES(SHA-512)を使用してSMB 3.1.1をネゴシエートし、Windows 10/11クライアントの動作に一致します。 |
| ntp (デフォルト) | SNTP | UDP/123 | 標準的。ネイティブRFC 4330。どのクライアントからも非常に期待されるトラフィックです。 |
| ntlm | SMB2 | TCP/445 | ステルス性が高い。SMB2 SESSION_SETUPを悪用して、MsvAvTimestampを含むNTLM Type 2 Challengeを取得します。Type 3の前にTCPを切断するため、イベントID 4625(ログオン失敗)は生成されません。Windows 10/11のフラグをエミュレートします。 |
| kerberos | Kerberos | TCP/88 | 騒がしい。存在しないユーザーに対してAS-REQを送信します。適切な2コンポーネントのsnameをエンコードし、cnameをローテーション(admnistratorなどのタイポ)し、tillをWindowsのハードコードされた定数20370913024805Zに設定し(ローカルクロック演算ではない — ADR-0002参照)、nonceをランダム化します。常にイベント4768/0x6(不明なプリンシパルの事前認証失敗)を生成し、これは監査ポリシーに関係なくSIEMにエクスポートされます。cnameが設定されたトリップワイヤーと一致する場合、ハニーアカウントアラートをトリガーする可能性があります。 |
テスト
cargo test # unit + property tests
cargo +nightly fuzz run fuzz_parse_krb_error # Linux/macOS only
すべてのネットワーク向けパーサー(parse_krb_error、parse_cldap_search_response、parse_ntlm_type2、parse_negotiate_response、parse_ntp_timestamp)は、proptestを使用してパニック安全性のプロパティテストが行われ、CIでファズテストされています。BER整数エンコーディングは、i32範囲全体にわたってDERの最小性と符号の正確性が検証され、RFC 4120に従って負のetype値をカバーしています。ファズターゲットとコーパスはfuzz/にあります。
ライセンス
デュアルライセンス: MIT または Apache 2.0 を選択できます。