محققای Pentests ، یه آسیب پذیری Command Injection با شناسه CVE-2023-28130 در Check Point Gaia Portal کشف و گزارش کردن، که به یه مهاجم احرازهویت شده و دارای پرمیشن نوشتن در تنظیمات DNS، امکان اجرای کد از راه دور از طریق تزریق دستور در یه اسکریپت CGI رو میده. آسیب پذیری دارای امتیاز 8.4 و شدت بالا گزارش شده.
Gaia که از اساطیر یونانی گرفته شده ، یه سیستم عامل برای برنامه های امنیتی Check Point هستش. بطور خلاصه ، Gaia ، یه سیستم امنیتی یکپارچه هستش که سیستم عاملهای اصلی چک پوینت ، IPSO و سیستم عامل های دستگاههای امنیتی رو با هم ترکیب میکنه.
این سیستم از یه اینترفیس وب برای پیکربندی استفاده میکنه که بهش Gaia Portal میگن. این پورتال تقریبا همه تنظیمات سیستم رو از طریق اینترفیس وب فراهم میکنه و آسیب پذیری که بررسی میکنیم در اون کشف شده.
بررسی آسیب پذیری :
آسیب پذیری در پارامتر hostname و در اسکریپت cgi-bin/hosts_dns.tcl رخ میده. اگه یه کاربری، یه Session معتبر داشته باشه و پرمیشن نوشتن در تظیمات DNS رو داشته باشه، میتونه دستوراتش رو اجرا کنه، که این دستورات با امتیاز Admin اجرا میشن.
آسیب پذیری در فرآیند یه تست نفوذ وب کشف شده. محققا گفتن که در طول فرایند تست نفوذ با هر ورودی بعنوان یه آسیب پذیری بالقوه رفتار میکنیم. ورودیها ها اگه بصورت درستی استفاده نشن، منجر به انواع آسیب پذیری های تزریق مانند SQli و XSS و Template Injection و Command Injection و … میشه. در این مورد ما با آسیب پذیری Command Injection روبرو شدیم.
محققا با اضافه کردن مقدار |
در انتهای پارامتر hostname به این آسیب پذیری رسیدن. این آسیب پذیری هم ، بدون بررسی کد و بصورت grey box کشف شده.command here
اگه کد اسکریپت رو بررسی کنیم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
cat /web/cgi-bin2/hosts_dns.tcl #!/usr/bin/ipstcl2 source debug.tcl variable dFile "/tmp/hosts_dns.post.debug" namespace eval ::hosts { if {[catch {libdb init -local} myDb]} { #failed to initialize!!! lappend err_list "Unable to connect to database ${myDb}" exit } ipso -nohtml set method [get_Method] MIME text printDebug # URL argument to indicate which data is needed set option [getVal option] global Q_Names if {$method == "POST"} { source validate.tcl source subs.tcl source showResult.tcl set result 0 set error_flag 0 set err_list [list] set set_list [list] set result [Validate $Q_Data err_list] if {$result == 0} { foreach var $Q_Names { if {$var == "domainname"} { lappend set_list domainname [getVal $var] } elseif {$var == "suffix"} { lappend set_list resolv:domain:1 [getVal $var] } [...] } elseif {$var == "hostname"} { lappend set_list machine:hostname [getVal $var] } [...] if {$var == "save"} { lappend set_list :save "" } } } dmsg "set_list: $set_list" if {[llength $set_list] > 0} { set cmd [concat [list libdb set $myDb -list ] $set_list] set result [catch $cmd err_list] } dmsg "Result: $result" dmsg "err_list: $err_list" set buf [::showResult::generateJson $result [getVal save] $err_list] HTML $buf dmsg $buf } else { # GET source json.tcl |
اگه درخواست از نوع POST باشه، همه متغیرها با یه if elseif بررسی میشن. در مجموع سه پارامتر ، hostname ، domainname و save ارسال میشه. با پارامتر hostname ، همونطور که در کد بالا هم قابل مشاهده هستش، مقدار machine: hostname <hostname_value>
به لیست set_list اضافه میشه، با پارامتر domainname ، مقدار domainname <domainname_value>
و با پارامتر save که روی true تنظیم میشه، مقدار :save
رو به لیست set_list اضافه میکه.
مقدار نهایی این لیست set_list بصورت زیر میشه :
1 |
machine:hostname <hostname_value> domainname <domainname_value> :save |
در ادامه کد بالا ، میرسیم به خطی که دستور زیر اجرا میشه :
1 |
set cmd [concat [list libdb set $myDb -list ] $set_list] |
تو این خط، cmd مقدار زیر میگیره :
1 |
libdb set db_0 -list machine:hostname <hostname_value> domainname <domainname_value> :save. |
در ادامه دستور catch با پارامتر CMD اجرا میشه، این دستور یه برنامه/پروسس رو اجرا میکنه و exit code رو برمیگردونه.
با توجه به اینکه ورودی ، بدون پاکسازی ، اجرا میشه، مهاجم میتونه با استفاده از یه پایپ، | ، و ` ، دستور دلخواه رو در کنار پروسس valid_token_checker اجرا کنه.
این آسیب پذیری امکان دسترسی به سرور میده، که در ویدیو زیر قابل مشاهده هستش: