
دور Ansible لإعداد redirectors لـ C2 الخاصة بالفريق الأحمر
دور Ansible يتيح نشر redirector بسرعة على خادم موجود باستخدام قواعد وكيل mod_rewrite،
يدعم Debian وUbuntu، وتم اختباره على Digital Ocean وAzure
انظر threat.tevora.com/automating-redirector-deployment-with-ansible للحصول على مدونة تستعرض الـ redirectors وAnsible وتتعمق في هذا الدور
للبدء، استنسخ هذا المستودع، ثبّت Ansible، وضع هذا المستودع في مجلد roles. انظر نموذج الـ Playbook أدناه للحصول على مثال حول كيفية بناء إعداد مثيل redirector الخاص بك
نموذج Playbook للمثيل provision_redirector_example.yml
- hosts: EnigmaticEmu
gather_facts: False
user: root
pre_tasks:
- name: Install python for Ansible
raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal)
changed_when: False
- setup: # aka gather_facts
tasks:
- include_role:
name: redirectors
vars:
le_email: '[email protected]'
hop_dir: hops/empire_hop
vhosts: [
{
servername: 'fakeamazon.com',
http_port: 80,
https_port: 443,
c2filters: [
{
rewritefilter: '^/orders/track/?$',
host: '123.124.125.126'
}
],
configs: [
'RewriteRule !\.php$ https://www.amazon.com/%{REQUEST_URI} [L,R=302]'
]
},
{
servername: 'fakegoogle.com',
http_port: 80,
https_port: 443,
config_files: [
"redirectors.txt",
"apache_tweaks.conf"
],
}
]
تفصيل المثال:
- hosts: EnigmaticEmu
يحدد هذا المضيفين الذين سينفّذ عليهم الـ Playbook.
لكي يُنفَّذ هذا الـ Playbook بشكل صحيح، يجب استخدام ملف جرد (inventory) يتضمن اسم المضيف أو عنوان IP الخاص بـ engigmatic emu.
gather_facts: False
مهمة gather facts الخاصة بـ Ansible تتعطّل على الإصدارات الأحدث من Ubuntu التي لا تحتوي على Python 2 مثبّتًا.
نعطّل gather facts حتى نتمكن من تثبيت Python 2 أولًا. هذا مجرد إجراء توافق تمهيدي (compatibility bootstrap).
user: root
يحدد هذا المستخدم الذي ستسجّل الدخول به إلى الخادم البعيد؛ ينفّذ Ansible جميع إعداداته عبر SSH.
غيّره إلى أي مستخدم تريد استخدامه.
*إذا كنت بحاجة إلى صلاحيات sudo، قد تحتاج إلى إضافة become: true واستدعاء ansible-playbook مع --ask-become-pass
pre_tasks:
tasks: الآن وصلنا إلى الجزء الممتاز، مهام الـ Playbook!- include_role:
كما تتوقع، يحدد هذا دورًا لتضمينه، والسطر التالي name: redirectors يحدد تضمين دور redirectors الخاص بنا
vars:
هنا نقوم بالجزء الأساسي من إعدادنا.
يحتوي إعدادنا على ثلاثة متغيرات: le_email وhop_dir وvhosts
يُستخدم le_email لتحديد عنوان البريد الإلكتروني الذي نستخدمه لـ lets_encrypt، تأكد من استخدام بريد تملكه
تذكّر hop_dir الذي استخدمناه في مهمة النسخ في دورنا؟ هنا يتم تعريفه! يجب أن يكون مجلد hop موجودًا في ./files/ نسبةً إلى موقع ملف الـ Playbook نفسه
قمنا بتنسيق هذا الإعداد غالبًا بصيغة JSON (YAML هي مجموعة شاملة من JSON) لكن يمكنك تنسيقه بالطريقة التي تريدها طالما أنه متوافق مع بعضه.
لاحظ في الإعداد وجود عدة vhosts، ويمكن لكل واحد استخدام طريقة أو أكثر لتحديد كيفية حقنه في قوالب الإعداد.
ننشئ ملف إعداد واحدًا لكل vhost لأن Letsencrypt، وتحديدًا مكوّن certbot-apache، لا يدعم أكثر من vhost واحد في ملف الإعداد. ولهذا سنقوم بتجهيز عدة ملفات إعداد على الخادم.
تشغيل الـ Playbook
لتشغيل الدور، أنشئ ملف الـ Playbook الخاص بك على شكل المثال الذي تناولناه، ثم نفّذ الأمر ansible-playbook -i <your_hosts_file> <your_playbook>. تأكد من أن هذا الدور موجود في مجلد roles في نفس مسار ملف الـ Playbook، وأن ملفات الـ hop و/أو الإعداد موضوعة في المكان الصحيح. يجب أن يبدو هيكل الدليل كما يلي:
├── my_playbook.yml
├── files
│ └── empire_hop
│ └── news
│ └── login.php
└── roles
├── redirectors
│ ├── files
│ ├── handlers
│ │ └── main.yaml
│ ├── meta
│ ├── tasks
│ │ ├── apache.yml
│ │ ├── letsencrypt.yml
│ │ └── main.yml
│ ├── templates
│ │ ├── apache_sslvhost.conf.j2
│ │ └── apache_vhost.conf.j2
│ └── vars
hosts: [...]
متغير vhosts لدينا هو قائمة من قواميس إعدادات vhost. يتيح لنا هذا إعداد عدة vhosts بنطاقات مختلفة وملفات تعريف C2 لكل خادم.
تذكّر أن هذا المتغير عبارة عن قائمة، فسيكون ذلك مهمًا في طريقة قولبة ملفات الإعداد والطرق الأخرى التي نستخدم بها هذه المتغيرات في دور redirectors.
servername: 'fakeamazon.com'
هذا هو اسم مضيف خادمنا، ويجب أن يكون لديك سجل DNS لهذا الاسم يشير إلى عنوان IP الخاص بالخادم.
http_port وhttps_port واضحان بذاتهما إلى حد كبير. اختر المنافذ التي سيستمع عليها http وhttps.
لاحظ قبل أن نكمل أن لدينا طرقًا متعددة لتعريف قواعد mod rewrite في الإعداد. يعود هذا غالبًا إلى التجريب، وخطة لدمج هذا الـ Playbook مع واجهة برمجية Python API
c2filters: [...]
قائمة من قواميس c2filter
أي طلب يتطابق URI الخاص به مع rewritefilter سيتم تمرير اتصاله عبر الوكيل إلى host
configs[...]
قائمة من سلاسل الإعداد
كل سلسلة ستُضاف إلى الملف.
config_files[...] اسم ملف أو مسار
قائمة بأسماء الملفات أو المسارات. سيُضاف محتوى كل ملف إلى Apache
مفيد للاستفادة من مخرجات أدوات أتمتة mod_rewrite مثل أداة @Inspired-Secs الرائعة: https://blog.inspired-sec.com/archive/2017/04/17/Mod-Rewrite-Automatic-Setup.html