
skewrun v1.2.0
लाल टीमों के लिए सक्रिय निर्देशिका समय खोज प्रोटोकॉल। 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) त्रुटि को हल करता है, जिससे आप एक Linux अटैक मशीन से Impacket या NetExec जैसे टूल चला सकते हैं जिसकी घड़ी लक्ष्य Windows डोमेन से भारी रूप से डीसिंक्रोनाइज़ होती है, बिना सिस्टम समय बदलने के लिए रूट विशेषाधिकारों की आवश्यकता के।
आर्किटेक्चर: लाइब्रेरी-प्रथम
v0.9.0 से शुरू होकर, Skewrun एक लाइब्रेरी-प्रथम आर्किटेक्चर के रूप में बनाया गया है:
ad-time: एक शुद्ध Rust लाइब्रेरी क्रेट जो AD प्रोटोकॉल से चुपके से समय निकालती है। इसे अन्य Rust इम्प्लांट या टूल में मूल रूप से एम्बेड किया जा सकता है।skewrun: एक CLI बाइनरी जोad-timeलाइब्रेरी को ऑर्केस्ट्रेट करती है औरlibfaketimeके साथ लक्ष्य प्रक्रियाओं को रैप करती है।
स्थापना
# 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_Time - Local_Time) की गणना करने के लिए DC को क्वेरी करता है। फिर यह FAKETIME पर्यावरण चर सेट करता है और LD_PRELOAD का उपयोग करके लक्ष्य कमांड में libfaketime इंजेक्ट करता है।
FAKETIME सीमाएं (Static Binaries)
LD_PRELOAD गतिशील रूप से लिंक की गई libc कॉल (जैसे clock_gettime) को इंटरसेप्ट करने पर निर्भर करता है। यदि आप स्टैटिकली कंपाइल की गई बाइनरी (जैसे कई Go या Rust टूल) पर skewrun का उपयोग करने का प्रयास करते हैं, तो libfaketime चुपचाप समय कार्यों को हुक करने में विफल हो जाएगा। Skewrun आपको चेतावनी देगा यदि यह पता चलता है कि आप एक स्थिर बाइनरी चलाने का प्रयास कर रहे हैं।
फोरेंसिक शोर और चोरी
लक्ष्य मानक Windows वायर ट्रैफ़िक में घुलमिल जाना और DC पर फोरेंसिक फुटप्रिंट को कम करना है।
इस्तेमाल की गई विधि से स्वतंत्र: प्रत्येक आउटबाउंड सॉकेट TCP हैंडशेक से पहले TTL=128 सेट करता है और Nagle को सक्षम करता है
(TCP_NODELAY=0), जो Linux डिफ़ॉल्ट (TTL=64, Nagle बंद) के बजाय Windows क्लाइंट के नेटवर्क-स्टैक
फिंगरप्रिंट से मेल खाता है, जिसे एक निष्क्रिय पर्यवेक्षक (p0f,
Zeek conn.log) अन्यथा फ़्लैग करेगा। विधियों के बीच विलंब CSPRNG-समर्थित लॉग-सामान्य
जिटर (फ्लैट रैंडम रेंज नहीं) का उपयोग करते हैं, जिसमें बार-बार विफलताओं पर एक्सपोनेंशियल बैकऑफ़ होता है, जो कनेक्शन लॉग में एक निश्चित जिटर बैंड द्वारा छोड़े गए समान-समय हस्ताक्षर से बचता है — ऊपर --jitter-sigma
और --jitter-base-ms देखें।
| विधि | प्रोटोकॉल | पोर्ट | OPSEC नोट्स (EDR/NDR दृश्यता) |
|---|---|---|---|
| cldap (डिफ़ॉल्ट) | CLDAP | UDP/389 | अत्यंत चुपके से. सार्वभौमिक रूप से अनुमति प्राप्त। एक मानक LDAP rootDSE डायग्नोस्टिक क्वेरी (objectClass=* बेस सर्च) भेजता है, जो ldapsearch, PowerShell AD cmdlets, और मॉनिटरिंग टूल के बेसलाइन से मेल खाता है। स्थिर NDR हस्ताक्षरों को तोड़ने के लिए सामान्य प्रशासन attrs के साथ विशेषता सूची को पतला करता है और प्रति अनुरोध विशेषता क्रम को यादृच्छिक करता है। |
| smb (डिफ़ॉल्ट) | SMB2 | TCP/445 | चुपके से. SMB2 NEGOTIATE प्रतिक्रिया से समय निकालता है। Windows 10/11 क्लाइंट व्यवहार से मेल खाने के लिए PREAUTH_INTEGRITY_CAPABILITIES (SHA-512) के साथ SMB 3.1.1 पर बातचीत करता है। |
| ntp (डिफ़ॉल्ट) | SNTP | UDP/123 | मानक. मूल RFC 4330। किसी भी क्लाइंट से अत्यधिक अपेक्षित ट्रैफ़िक। |
| ntlm | SMB2 | TCP/445 | चुपके से. MsvAvTimestamp वाली NTLM टाइप 2 चुनौती प्राप्त करने के लिए SMB2 SESSION_SETUP का शोषण करता है। टाइप 3 से पहले TCP डिस्कनेक्ट करता है, जिसका अर्थ है कोई Event ID 4625 (लॉगऑन विफलता) उत्पन्न नहीं होती। Windows 10/11 फ़्लैग का अनुकरण करता है। |
| kerberos | Kerberos | TCP/88 | शोरगुल. एक गैर-मौजूद उपयोगकर्ता के लिए AS-REQ भेजता है। उचित दो-घटक sname एन्कोड करता है, cname को घुमाता है (टाइपो जैसे admnistrator), till को Windows हार्डकोडेड स्थिरांक 20370913024805Z पर सेट करता है (स्थानीय घड़ी अंकगणित नहीं — ADR-0002 देखें), nonce को यादृच्छिक करता है। हमेशा Event 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 के तहत दोहरी-लाइसेंस प्राप्त।