
خادم Tivoli FastBack (الإصدار 6.1.4) عرضة لخطأ تجاوز سعة المخزن المؤقت (stack-based buffer overflow) مما يسمح للجهات التهديدية بالحصول على تنفيذ تعليمات برمجية تعسفية (ACE) عبر اتصال TCP عن بُعد. يستغل إثبات المفهوم (PoC) المقدم في هذا المستودع هذه الثغرة لإنشاء شيل عكسي (reverse-shell).
تطبيق Tivoli FastBack Server (6.1.4) معرض لثغرة تجاوز سعة المخزن المؤقت القائمة على المكدس مما يسمح للمهاجمين بالحصول على تنفيذ تعليمات برمجية عشوائي (ACE) عبر اتصال TCP عن بُعد. يستغل الإثبات المقدم في هذا المستودع هذه الثغرة لتنفيذ CMD.exe على الهدف والتعامل مع الاتصال الوارد لإنشاء قشرة عكسية.

[!NOTE] يستند هذا الإثبات إلى إثبات منشور سابقًا، وقد تم توسيعه بإضافة تجاوز لـ ASLR بالإضافة إلى بنية محسنة تتبع نماذج هندسة البرمجيات الشائعة. نظرًا لأن هيكل الملفات المتعددة الموصى به قد لا يكون مرغوبًا في جميع الحالات، يتم توفير نسخة ملف واحد من الاستغلال في
assets/single.py.
يتواصل الإثبات مع التطبيق المعرض للخطر عبر منفذ TCP 11460. يجب أن تتبع البيانات المنقولة إلى هذا المنفذ البنية المحددة أدناه:
0x00000123 0x00000000 0x00000000 0x00000000
0x00000ABC 0x00000AAA 0x00000111 0x00000BBB
0x00000222 0x00000CCC 0x00000333 0x00000000
0x00000000 0x00000000 0x00000000 0x00000000
<buffer 1> ...
<buffer 2> ...
<buffer 3> ...
باستخدام بنية الحزمة المذكورة أعلاه، يقوم الإثبات باستدعاء الدالة _FXCLI_SetConfFileChunk المُعرفة برمز العملية 0x534. من هنا، يؤدي التنفيذ إلى استدعاء sscanf الذي تُقرأ وسائطه من المخزن المؤقت (1) دون تطهير مناسب. من خلال تقديم كتلة بحجم 0x118 بايت بالضبط، يتم الكتابة فوق مؤشر eip بأي قيمة موجودة في الـ 4 بايتات الأخيرة.
لتجاوز ASLR، يقوم الإثبات باستدعاء الدالة FXCLI_DebugDispatch عن طريق إرسال حزمة الشبكة المذكورة أعلاه مع رمز العملية 0x2000. تقرأ هذه الدالة المخزن المؤقت الأول لوظيفة محددة، بعض منها مدرج أدناه:
DumpMemoryPoolsReadRepositorySectorsSymbolOperationيستخدم الإثبات وظيفة SymbolOperation، التي تدخل رمزًا عشوائيًا وتعيد عنوان قاعدته. بهذا، يتم حل عنوان N98E_CRYPTO_get_new_lockid الذي يُطرح منه إزاحته (0x14E0). ينتج عن هذا في النهاية العنوان الأساسي لـ libeay32IBM019.dll، والذي سيتم استخدامه بشكل مكثف في مرحلة التجاوز التالية.
قبل إنشاء سلسلة ROP، يتم فحص القاعدة بحثًا عن أحرف ضارة محتملة. إذا كانت موجودة، يتم إعادة تشغيل التطبيق المعرض للخطر عن طريق تجاوز سعة المخزن المؤقت والكتابة فوق eip بالقيمة غير المعقولة 0x90909090. بعد ذلك، يتم استقصاء التطبيق حتى عودته إلى الإنترنت لإعادة تشغيل الدورة.
يتم بناء سلسلة ROP حيث يتم استخدام القاعدة التي تم الحصول عليها من مرحلة التجاوز السابقة. تستدعي سلسلة ROP هذه الدالة WriteProcessMemory، وتنسخ محتويات "invite" إلى كهف الكود في مقطع .text في libeay32IBM019.dll.
عند إنشاء سلسلة ROP، يتم فحص جميع محتوياتها (المحلولة) مرة أخرى بحثًا عن أحرف ضارة محتملة. إذا كانت موجودة، يتم إعادة تشغيل التطبيق بنفس الطريقة كما في مرحلة التجاوز السابقة، وتبدأ الدورة من جديد.
[!NOTE] لمنع حلقة لا نهائية أثناء مرحلة التجاوز، تم تكوين الإثبات لإعادة محاولة التجاوز لمدة أقصاها 10 دقائق. بعد ذلك، سينتهي الاستغلال بعد الوصول إلى المهلة الزمنية.
بعد تجاوز إجراءات التخفيف للاستغلال، يتم تحقيق تنفيذ تعليمات برمجية عشوائي عام (ACE). يتم استغلال هذا ACE لتنفيذ شيل كود محدد يقوم بإنشاء عملية لـ CMD.exe باستخدام CreateProcessA. يتم تعيين وسائط هذا الاستدعاء لإعادة توجيه جميع الأنابيب (STDIN، STDOUT، STDERR) إلى اتصال مأخذ توصيل متصل بـ localhost.
بالتزامن، يبدأ الإثبات مستمعًا على localhost يلتقط الطلب الوارد من المضيف البعيد ويبدأ واجهة CLI أساسية جدًا للتفاعل مع عملية CMD.exe المنشأة.
graph
a("Start")
b("Buffer overflow: crash")
c("Buffer overflow: hijack")
subgraph sa["ASLR Bypass"]
a1["Resolve API with 'SymbolOperation'"]
a2["Subtract offset (0x14E0)"]
a3{"Base contains bad-chars?"}
a1 -->| N98E_CRYPTO_get_new_lockid | a2
a2 -->| libeay32IBM019.dll | a3
end
subgraph sb["DEP Bypass"]
b1["Construct ROP"]
b2{"ROP contains bad-chars?"}
b3["Locate shellcode"]
b4["Locate code-cave"]
b5["Invoke WriteProcessMemory"]
b6["Return to shellcode"]
b1 --> b2
b2 -->| no | b3
b3 --> b4
b4 --> b5
b5 --> b6
end
subgraph sc["Reverse Shell"]
c1["(Remote) connect to localhost"]
c2["(Local) listen on available port"]
c3["(Local) accept connection"]
c4["(Local) loop over CMDs"]
c1 --> c2
c2 --> c3
c3 --> c4
end
a3 -->| no | sb
b2 -->| yes | b
a3 -->| yes | b
a --> sa
b --> a
b6 --> c --> sc
| الحقل | الوصف | الهدف |
|---|
123 | الحجم | الحزمة |
ABC | رمز العملية | الدالة |
AAA, 111 | الإزاحة، الحجم | المخزن المؤقت (1) |
BBB, 222 | الإزاحة، الحجم | المخزن المؤقت (2) |
CCC, 333 | الإزاحة، الحجم | المخزن المؤقت (3) |