• Skip to content
  • Skip to primary sidebar

خرید VPNvip خرید VPN خرید کریو خرید kerio فیلتر شکن خرید فیلترشکن vip vpn

خرید VPN خرید کریو خرید وی پی ان خرید vipVPN خرید kerio فیلترشکن Vip vpn

Header Left

vip vpn
vipvpn

CVE-2019-17059: Preauth-RCE در Cyberoam سوفوس توضیح داد

اکتبر 16, 2019 by کانکشن هوشمند

ما با محققان امنیت داخلی و خارجی تلاش زیادی کردیم تا از نقاط ضعف جدی از راه دور بهره برداری در SSL VPN و فایروال هایی مانند Cyberoam ، Fortigate و Cisco VPNs پرده برداریم. این مقاله یک مورد فنی در مورد آسیب پذیری حساس وصله دار Cyberoam SSL VPN است که با نام CyberoamOS نیز شناخته می شود.

این سوء استفاده Cyberoam ، لقب CVE-2019-17059 یک آسیب پذیری اساسی است که به مهاجمان اجازه می دهد بدون ارائه نام کاربری به وسیله Cyberoam شما دسترسی پیدا کنند. یا رمز عبور از این گذشته ، دسترسی اعطا شده بالاترین سطح (ریشه) است ، که در اصل به مهاجمان حقوق نامحدودی در دستگاه Cyberoam شما می دهد.

در اکثر محیط های شبکه ، از دستگاه های Cyberoam به عنوان فایروال و دروازه SSL VPN استفاده می شود. این به یک مهاجم بالقوه می تواند جایگاه محکمی در یک شبکه دهد. حمله به میزبان های داخل شبکه را آسان تر می کند ، و از آنجا که دستگاه های سایبرامام معمولاً در اکثر محیط ها مورد اعتماد هستند ، این امر باعث می شود یک حمله کننده لبه اضافی باشد.

طبق گفته های Shodan (موتور جستجوی دستگاههای متصل به اینترنت) ، در آنجا بیش از 96،000 دستگاه سایبروام با اینترنت روبرو از سراسر جهان است. بیشتر این دستگاه ها در شرکت ها ، دانشگاه ها و برخی در بانک های مشهور جهان نصب شده اند. این منجر به حمله هایی می شود که تأثیرات زیادی بر این محیط ها می گذارد.

کار با تیم امنیتی سوفوس بسیار خوشحال شده است زیرا آنها فقط با گذشت چند روز از گزارش اولیه ما به آنها ، به سرعت با تأیید و اجرای تکه های عمل کردند. Kudos به آنها! (هدفمند!)

و از آنجا که بسیاری از این موجودات برای مهاجمین هدف های جذابی هستند ، این اشکالات را از همه مهم تر می کند.

CyberoamOS Remote غیرمجاز دستور فرمان ریشه اجرای

CyberoamOS اصلاح شده مبتنی بر لینوکس است. سیستم عامل دستگاه های سایبرام. این سیستم عامل دارای یک رابط پیکربندی مبتنی بر وب و یک درگاه SSLVPN است.

رابط وب به دو قسمت اصلی تقسیم می شود:

  • یک جلوه مقدماتی که در جاوا نوشته شده است
  • یک پس زمینه که از ترکیبی از C و Perl استفاده می کند [19659012] ما به طور عمده برای صرفه جویی در وقت و محدود کردن میزان اطلاعات فاش شده ، درون قسمت داخلی کد جلویی یا پشتی فرو نمی رود. اما ما به طور خلاصه در مورد چگونگی بروز این اشکال بحث خواهیم کرد.

    هر دو پیکربندی و رابط SSLVPN دارای یک سرویس خدمات هستند که عملیات اصلی را بر عهده دارد. این عملیات با استفاده از پارامتری به نام "mode" تعریف می شوند.

    بیشتر این موارد تأیید شده اند. اما چند گزینه وجود دارد که می توانیم بدون احراز هویت به آنها دسترسی پیدا کنیم.

    اشکالات موجود در ماژول آنتی ویروس / آنتی اسپم ایمیل دروغ است. حالت درخواست برای این نقطه پایانی (ماژول ، op) 458 است.

    نکته قابل توجه این است که کد ها به نام آنها در پایگاه داده Cyberoam (پایگاه داده داخلی Postgres) ترسیم می شوند. با جستجوی 458 می توان فهمید که نام این کد چیست.

    در اینجا یک سطر از اسکریپت SQL اولیه سازی بانک اطلاعاتی وجود دارد که اسم opcode 458 را نشان می دهد:

     را وارد tblcrevent (opcode ، توضیحات ، حالت ، requesttype) کنید. )
    مقادیر ('RELEASEQUARANTINEMAILFROMMAIL' ، 'RELEASE QUARANTINE MAIL FROM MAIL'، '458'، 2)؛ 

    توابع کد پستی در فهرست / _ conf / csc / cscconf / ذخیره می شوند. ما کل کد عملکرد آسیب پذیر را آشکار نخواهیم کرد ، اما چند قطعه را ارائه می دهیم که نشان می دهد کجا و چگونه اشکال رخ می دهد.

    کدی از مقدمه جاوا که حاوی opcode 458 است:

     if ((jsonObject .getString ("hdnSender") برابر است ("") ||
    validateEmail (jsonObject.getString ("hdnSender"))) و&
    validateEmail (jsonObject.getString ("hdnRecipient")) و&
    isSafeFilePath (jsonObject.getString ("hdnFilePath")) && b)
        httpServletResponse.setContentType ("text / html")؛
        CyberoamLogger.debug ("آنتی ویروس / AntiSpam" ، "مقدار ثابت CSC" +
    CSCConstants.isCCC) ؛ 

    همانطور که در بالا می بینید ، چند پارامتر برای اعتبار بررسی می شود. اگر این مقادیر معتبر باشند ، موارد زیر اتفاق می افتد:

     EventBean نهایی eventByMode = EventBean.getEventByMode (363)؛
    ... اصلاح شد
    final int sendWizardEvent = cscClient.sendWizardEvent (eventByMode، hashMap، sqlReader)؛ 

    همانطور که در بالا می بینیم ، یک کد رویداد جدید (363) داریم که به باطن ارسال می شود. اشکالی که ما کشف کردیم در کدی وجود دارد که این مورد را در بخش باکتری قرار می دهد.

    Opcode با نام sendmail شناخته می شود و برای جلوگیری از سوء استفاده از این اشکال ، ما بیشتر کد را از کد زیر حذف می کنیم.

    کنترل کننده opcode برای send_mail.

     ... حذف شد ...
    
     $ param = $ درخواست -> {انتشار} ؛ 
            param = DLOPEN (base64_decode ، پارامتر)
            برنامه LOG "رمزگشایی مقادیر: $ param  n"
            ٪ درخواستData = تقسیم (/ [&=] / ، $ param)؛
                $ mailServerHost = $ درخواست Data {hdnDestDomain؛
                $ mailFrom = $ درخواستData {hdnSender}؛
                $ mailTo = $ درخواستData {hdnRecipient؛
                $ پرونده = $ QUARANTINE_PATH. "/". $ درخواستData {hdnFilePath}؛
    
        $ mailfile = $ درخواست Data {hdnFilePath}؛
        $ validate_email = "false"؛
        my $ email_regex = '^ ([.]؟ [_-!#{}$%^&*+=|?'\/a-zA-Z0-9]) * @ ([a-zA-Z0-9] ([-]؟ [a-zA-Z0-9] +) * .) + ([a-zA-Z0-9] {0،6}) $'؛
        if ($ درخواستData {hdnRecipient = ~ / $ email_regex /&& ((تعریف شده با درخواست $Data {hdnSender} && $ درخواستData {hdnSender} eq ')) || $ درخواستData {hdnSender} = ~ / $ email_regex /) & index () درخواستData {hdnFilePath}، '.. /') == -1)
            $ validate_email = "true"؛
        }
    .... redacted .... 

    همانطور که در بالا می بینیم ، کد شبه Perl به ما نشان می دهد که باطن ورودی از قسمت جلویی ($ requestData) و چگونگی تلاش برای تأیید برخی پارامترهای ارسال شده را نشان می دهد.

    پس از تأیید ، اگر پارامترهای ما معتبر باشند ، کد زیر اجرا شد:

    ٪ mailreq = ("mailaction" => "$ MAIL_FORWARD" ، "موضوع" => "$ strSubject" ، "toEmail" = > "$ mailTo" ، "attachmentfile" => "$ file"، "smtpserverhost" => "$ mailServerHost" ، "fromaddress" => "$ mailFrom")؛
        
    
      out = OP CodeE mail_sender json٪ mailreq 

    کد فوق پارامترهای درخواست ما را به متغیر mailreq تنظیم می کند و تابع mail_sender (OPCODE) را فراخوانی می کند. خواهیم دید که چگونه این opcode اجرا می شود و دقیقاً RCE در کجا اتفاق می افتد:

     
            #mailaction 0 = mail_with_var ، 1 = mail_forward ، 2 = post_attachment
            $ mailaction = $ درخواست -> action ارسال نامه}؛
            $ موضوع = $ درخواست -> {موضوع}؛
            $ mailbody = ''؛
            $ attachmentfile = $ درخواست -> {attachmentfile}؛
            $ toEmail = $ درخواست -> {toEmail؛
        
        # بدن_میل
        اگر ("درخواست $ $ تعریف شده -> body پست الکترونیکی request &&" "ne $ درخواست -> body نامه شخص}") {
             $ mailbody = $ درخواست -> body نامه شخص؛ 
        }
        میزبان سرور #SMTP
        اگر ("درخواست تعریف شده $ -> {smtpserverhost} &&" "ne $ درخواست -> {smtpserverhost}") {
             $ smtpserverhost = $ درخواست -> {smtpserverhost}؛ 
        } ELSE
            نتیجه = QUERY "ارزش خدمات را از tblclientservice جایی که سرویس دهنده =" MailServer "انتخاب کنید"
            اگر ("تعریف شده $ نتیجه -> {خروجی} -> val خدمات ارزش گذاری} [0] &&" "ne $ result -> {output} -> val servicevalue} [0]") {
                 $ smtpserverhost = $ نتیجه -> {خروجی} -> val servicevalue} [0] ؛ 
            } ELSE
                 $ smtpserverhost = "127.0.0.1"؛ 
            }
        }
    
        درگاه سرور #SMTP
        IF ("درخواست تعریف شده $ -> {smtpserverport} &&" "ne $ درخواست -> {smtpserverport}") {
             $ smtpserverport = $ درخواست -> {smtpserverport؛ 
        } ELSE
            نتیجه = QUERY "ارزش خدمات را از tblclientservice انتخاب کنید که در آنجا servicekey =" MailServerPort ""
            اگر ("تعریف شده $ نتیجه -> {خروجی} -> val خدمات ارزش گذاری} [0] &&" "ne $ result -> {output} -> val servicevalue} [0]") {
                 $ smtpserverport = $ نتیجه -> {خروجی} -> val ارزش خدمات} [0] ؛ 
            } ELSE
                 $ smtpserverport = "25"؛ 
            }
        }
    
        #SMTP پرچم auth
         $ smtpauthflag = "0"؛ 
        IF ("درخواست تعریف شده $ -> {smtpauthflag request &&" "ne $ درخواست -> {smtpauthflag}") {
             $ smtpauthflag = $ درخواست -> {smtpauthflag}؛ 
        } ELSE
            نتیجه = QUERY "ارزش خدمات را از tblclientservice انتخاب کنید که در آن servicekey =" SMTPAuthenticationFlag ""
            اگر ("تعریف شده $ نتیجه -> {خروجی} -> val خدمات ارزش گذاری} [0] &&" "ne $ result -> {output} -> val servicevalue} [0]") {
                 $ smtpauthflag = $ نتیجه -> {خروجی} -> val ارزش خدمات} [0] ؛ 
            }
        }
    
        اگر ("$ smtpauthflag == 1") {
            اگر ("درخواست $ $ تعریف شده -> ername نام نامه ایمیل} &&" "ne $ درخواست -> ername نام کاربری ایمیل us") {
                
                    $ mailusername = $ درخواست -> ername nameus}؛
                    $ mailpassword = $ درخواست -> pass mailpassword}؛
                
            } ELSE
                نتیجه = QUERY "ارزش خدمات را از tblclientservice انتخاب کنید که در آن servicekey =" MailServerUsername ""
                 $ nameusus = $ result -> {output} -> val servicevalue} [0]؛ 
                نتیجه = QUERY "ارزش خدمات را از tblclientservice انتخاب کنید که در آن servicekey =" MailServerPassword ""
                 $ postpassword = $ result -> {output} -> val servicevalue} [0]؛ 
            }
        } ELSE
            
                $ mailusername = ""؛
                $ mailpassword = ""؛
            
        }
        اگر ("درخواست تعریف شده $ -> ad از آدرس} &&" "ne $ درخواست -> {از آدرس}") {
             $ fromaddress = $ درخواست -> {fromaddress؛ 
        } ELSE
            نتیجه = QUERY "ارزش خدمات را از tblclientservice جایی که سرویس دهنده =" FromAddress "انتخاب کنید"
             $ fromaddress = $ نتیجه -> {خروجی} -> val ارزش خدمات} [0] ؛ 
        }
    
        #حالت امنیتی
        IF ("درخواست تعریف شده $ -> {smtpsecurance} &&" "ne $ درخواست -> {smtpsecurance}") {
             $ smtpsecurance = $ درخواست -> {smtpsecurance؛ 
        } ELSE
            نتیجه = QUERY "ارزش خدمات را از tblclientservice انتخاب کنید که در آن سرویس =" smtpsecurance ""
             $ smtpsecurance = $ نتیجه -> {خروجی} -> val ارزش خدمات} [0] ؛ 
        }
    
         $ smtpsecurancemode = 0؛ 
        اگر ("$ smtpsecurance eq" STARTTLS ") {
             $ smtpsecuritymode = 1؛ 
        } ELSE IF ("$ smtpsecurity eq 'SSL / TLS") {
             $ smtpsecuritymode = 2؛ 
        }
    
        گواهی #SMTP
        
            $ smtpcertificate = ''؛
            $ certpassword = ''؛
        
        اگر ("$ smtpsecuritymode! = 0") {
            IF ("درخواست تعریف شده $ -> {smtpcertificate} &&" "ne $ درخواست -> {smtpcertificate}") {
                نتیجه = QUERY "شناسنامه ، رمز عبور را از tblvpncertificate انتخاب کنید که در آن گواهی = درخواست $ -> {smtpcertificate}"
            } ELSE
                نتیجه = QUERY "شناسنامه ، گذرواژه را از tblvpncertificate انتخاب کنید که در آن گواهینامه = (گزینه خدمات را انتخاب کنید: int را از tblclientservice که در آن سرویس =" smtpcertificate ")"
            }
            
                $ smtpcertificate = $ نتیجه -> {خروجی} -> {گواهی نامه} [0]؛
                $ certpassword = $ نتیجه -> {خروجی} -> {رمز عبور} [0]؛
            
        }
    
        # آدرس از نام
        IF ("درخواست تعریف شده $ -> {ازادادرس با نام} &&" "ne $ درخواست -> {fromaddresswithname}") {
             $ fromaddresswithname = $ درخواست -> {fromaddresswithname}؛ 
        } ELSE
             $ fromaddresswithname = $ OEMNAME. "<" . $fromaddress . ">"؛ 
        } 

    کد فوق همان کارهایی را انجام می دهد که اوپکود دیگر هنگام شروع کار انجام داد. این متغیرها را اولیه می کند (بعضی از ما یا از دستگاه در صورت مشخص نبودن).

    پس از تعیین متغیرها ، بلوک کد زیر اجرا می شود.

     out = EXECSH "/ bin / cschelper mail_send '$ fromaddress" "$ fromaddresswithname '' $ toEmail '' $ toEmail '' $ subject '' $ mailbody '' $ smtpserverhost '' $ smtpserverport '' $ mailusername '' $ mailpassword '' $ mailaction '' $ smtpsecurancemode '' $ smtpserverhost " "1" "$ attachmentfile" "

    و در آنجاست ، اجرای فرمان. اکنون تماس در اینجا EXECSH است که [ARGUMENTS] / bin / sh -c را صدا می کند . با اجرای اعدام با استفاده از مقادیری که کنترل می کنیم ، می توانیم به راحتی به اجرای فرمان از راه دور دست یابیم ، همه بدون احراز هویت.

    ما یک گزارش کامل و اثبات مفهوم را با طرح های مناسب در چند ماه منتشر خواهیم کرد.

    بروزرسانی: این تحقیق برای اولین بار در TechCrunch پوشش داده شد ، بیشتر بخوانید اینجا.

Filed Under: Uncategorized Tagged With: CVE201917059, Cyberoam, PreauthRCE, توضیح, داد, در, سوفوس

Primary Sidebar

نوشته‌های تازه

  • نحوه تماشای آن در سال 2022 (به روز رسانی فوریه 2022)
  • انیمیشن Shenmue Drops اولین نگاه به اولین سریال
  • چگونه Hulu را در ترکیه تماشا کنیم؟
  • چگونه Inventing Anna را به صورت آنلاین از هر کجا تماشا کنیم