
Linux IPv4 चेकसम-ऑफलोड बग PwnEscape को तैयार TAP पर पुनः उत्पन्न करने वाला Go प्रोब, जो तैयार किए गए virtio हेडर इंजेक्ट करता है और आउट-ऑफ-बाउंड फ्रैगमेंट हेडर कॉपी का सत्यापन करता है।
Linux IPv4 चेकसम-ऑफलोड बग के लिए Go प्रोब, जिसे PwnEscape के नाम से जाना जाता है। यह उस TAP से जुड़ता है जिसे आपने पहले से तैयार किया है और जाँचता है कि होस्ट फ्रैगमेंटर skb_checksum_help द्वारा फिर से लिखे गए IPv4 हेडर पर भरोसा करता है या नहीं।
प्रोब पैकेट इंजेक्शन और कैप्चर को संभालता है। scripts/setup.sh pwnesc नेटवर्क नेमस्पेस के अंदर लैब इंटरफ़ेस, sysctl सेटिंग्स और nftables नियम तैयार करता है। scripts/teardown.sh लैब को हटा देता है।
ऐसे कर्नेल पर जो ihl पढ़ने से पहले आंशिक चेकसम पूरा करता है (यहाँ 6.18.54 पर पुनरुत्पादित; 6.18.57 में ठीक किया गया):
csum_start=22 वाला virtio चेकसम हेडर स्वीकार किया जाता है। फिर दो VID-0 टैग हटाए जाते हैं (14+4+4), इसलिए चेकसम लेखन IPv4 version/IHL बाइट पर पड़ता है।0x45 से 0x4f में बदल जाता है। फ्रैगमेंटर 60-बाइट हेडर का उपयोग करता है।-head 8 के साथ, लीनियर हेड 28 बाइट्स है, इसलिए 60-बाइट हेडर कॉपी skb_headlen से 32 बाइट्स आगे आउटपुट फ्रैगमेंट्स के IPv4 विकल्पों में पढ़ती है।यह PWN.AI के PwnEscape लेख में वर्णित डिस्क्लोज़र प्रिमिटिव का अभ्यास करता है। CONFIG_INIT_ON_ALLOC_DEFAULT_ON के साथ, कॉपी किए गए बाइट्स में ताज़ा slab tailroom शून्य के रूप में दिखाई दे सकता है।
ihl पढ़ने से पहले आंशिक चेकसम पूरा होता होip, nft, sysctlnf_conntrack और nf_defrag_ipv4/dev/net/tunहोस्ट पर रिपॉज़िटरी डायरेक्टरी से:
go build -o poc .
sudo ./scripts/setup.sh
sudo ip netns exec pwnesc ./poc
प्रोब pwntap को IFF_TAP|IFF_NO_PI|IFF_VNET_HDR के साथ खोलता है और pwnv1 पर आउटपुट कैप्चर करता है। pwntap को प्रोब के लिए आरक्षित रखें। nftables ct नियम conntrack defragmentation सक्रिय करता है, और pwnv0 MTU 200 का उपयोग करता है ताकि पुनःसंयोजित डेटाग्राम आउटपुट पर फिर से फ्रैगमेंट हो जाए।
सफल हेडर जाँच verify: first byte 0x4f ihl=15 प्रिंट करती है। इसके बाद प्रोब आउटपुट फ्रैगमेंट्स, उनके IPv4 विकल्प, और लीनियर हेड से आगे कॉपी किए गए बाइट्स की रिपोर्ट करता है।
-head (डिफ़ॉल्ट 8): बाइट्स में offset-0 फ्रैगमेंट पेलोड; 8 से 40 तक 8 का गुणज। लीनियर हेड से आगे अपेक्षित कॉपी 40 - head बाइट्स है।-rest (डिफ़ॉल्ट 400): बाइट्स में completing-fragment पेलोड; कम से कम 16।-spray (डिफ़ॉल्ट 0): offset-0 फ्रैगमेंट से ठीक पहले आवंटित समान आकार के फ्रेम्स की संख्या।-spray-fill (डिफ़ॉल्ट 0xee): उन फ्रेम्स को भरने के लिए उपयोग किया गया बाइट।-page: page_frag हेड का उपयोग करें, जिसके tail में skb मेटाडेटा हो सकता है। डिफ़ॉल्ट slab हेड है।-skip-verify: सीधे फ्रैगमेंटेड-डेटाग्राम जाँच पर जाएँ।PWN_TAP TAP इंटरफ़ेस चुनता है (डिफ़ॉल्ट pwntap)। PWN_CAP कैप्चर इंटरफ़ेस चुनता है (डिफ़ॉल्ट pwnv1)। सेटअप स्क्रिप्ट इन डिफ़ॉल्ट नामों का उपयोग करती है।
प्रोब समाप्त होने के बाद, pwnesc में किसी भी शेल से बाहर निकलें और होस्ट से चलाएँ:
sudo ./scripts/teardown.sh
यह pwnesc को उसके इंटरफ़ेस, ip pwn nftables टेबल, और नेमस्पेस-स्थानीय sysctl सेटिंग्स के साथ हटा देता है।