برچسب: Openfind Mail2000

飛鴿傳書 - 紅隊演練中的數位擄鴿

بیوگرافی کبوتر پرواز-کبوترهای اسیر دیجیتال در تمرین تیم قرمز | DEVCORE دیو کول

سیستم نامه پستی ، به عنوان اصلی ترین روش تبادل اطلاعات در اکثر شرکت ها ، یک موقعیت مهم استراتژیک را اشغال می کند. کنترل سرور پست الکترونیکی نه تنها می تواند از محتوای نامه استراق سمع کند ، بلکه حتی بسیاری از پرونده های مهم نیز در سیستم نامه یافت می شوند که به هکر امکان نفوذ بیشتر می دهد. در این مقاله آسیب پذیری حافظه کشف شده توسط تیم تحقیقاتی بر روی نرم افزار Openfind Mail2000 و روش های حمله استفاده شده برای بهره برداری از این آسیب پذیری ارائه خواهد شد.
این آسیب پذیری در سال 2018 کشف شد. در آن زمان ، Openfind به شما اطلاع داده شد و سریعاً برطرف شد. در همان زمان ، به کاربران مربوط نیز برای به روز رسانی کمک کرده است.

Openfind Mail2000

Mail2000 یک سیستم نامه الکترونیکی ساده و با کاربرد آسان است که توسط سازنده تایوانی Openfind ساخته شده است و به طور گسترده در موسسات دولتی و مؤسسات آموزشی تایوان از جمله دفتر آموزش شهری تایپه ، آکادمی علوم چین و علوم تایوان استفاده می شود. دانشگاه ها از Mail2000 به عنوان سرور اصلی ایمیل خود استفاده می کنند. رابط ورودی مشترک به شرح زیر است:

آسیب پذیری این بار از این رابط وب است ، با استفاده از تکنیک باینری برای به خطر انداختن کل سرور!

معماری سرور

Mail2000 یک رابط وب را برای کار با سرپرستان و کاربران فراهم می کند ، که به آن Webmail نیز گفته می شود ، و در اینجا Openfind از فناوری CGI (رابط مشترک دروازه) برای پیاده سازی استفاده می کند. اکثر سرورهای وب CGI را همانطور که در شکل نشان داده شده است پیاده سازی می کنند:

ابتدا httpd درخواست مشتری را می پذیرد و پرونده CGI مربوطه را مطابق با مسیر CGI مربوطه اجرا می کند. بیشتر توسعه دهندگان با توجه به نیازهای خود ، توابع مشترک مشترک را به عنوان کتابخانه برای تماس های CGI خواهند نوشت.
با نگاهی به پایین ، می توان فهمید كه اگرچه به آن سرور وب گفته می شود ، اما هنوز هم بسیاری از مؤلفه ها روی باینری ساخته شده اند! به عنوان مثال ، httpd بیشتر برای کارایی توسط C / C ++ نوشته شده است ، و موارد دیگر مانند کتابخانه ، ماژول توسعه یافته و CGI هر صفحه نیز یکسان است. بنابراین ، آسیب پذیری های مربوط به باینری این بار هدف حمله ما هستند!

آسیب پذیری

این آسیب پذیری در کتابخانه libm2kc پیاده سازی شده توسط Openfind واقع شده است .این كتابخانه شامل كاركردهای عمومی CGI مختلف مانند تجزیه و تحلیل پارامتر و پردازش پرونده و غیره است و این آسیب پذیری رخ می دهد. در بخش آنالیز پارامتر. از آنجا که پردازش پارامتر یک عملکرد بسیار سطح پایین و اساسی است ، دامنه تأثیرگذاری بسیار بزرگ است ، حتی سایر محصولات Openfind نیز تحت تأثیر قرار می گیرند!
شرایط تحریک کننده این آسیب پذیری به شرح زیر است:

  • مهاجم برای ارسال درخواست های HTTP POST از Multartart استفاده می کند
  • POST بیش از 200 مورد داده را ارسال می کند

multipart یک پروتکل HTTP است که برای رسیدگی به چندین فایل ارسال می شود. نمونه ای از قالب به شرح زیر است:

 نوع محتوا: چند قسمت / فرم-داده ؛ مرز = AaB03x

--AaB03x
محتوا-دفع: فرم-داده؛ name = "پرونده"؛ filename = "file1.txt"
نوع محتوا: متن / ساده

... محتویات file1.txt ...
--AaB03x--

در libm2kc ، از آرایه ای برای ذخیره پارامترها استفاده می شود:

 g_stCGIEnv .  param_cnt   =   0 ؛ ] [p =  next_param  ()) 
 {
   g_stCGIEnv .  param  [ param_cnt [196590101]] p ؛ 
   g_stCGIEnv .  param_cnt  ++ ؛ 
} 

این آرایه پارامتر در متغیر جهانی g_stCGIEnv است که در آن ذخیره می شود. این بررسی نکرد که اندازه آرایه اعلام شده از چه مواردی فراتر رفته است ، که منجر به نوشتن خارج از محدوده شده است.

لازم به ذکر است که ساختار ذخیره شده در ردیف پاراما یک شاخص است که به موقعیت رشته اشاره می کند ، نه خود رشته

 ساختار   param 
] {
     char   *  key ؛ 
     char   *  مقدار ؛ 
     int   پرچم ؛ 

بنابراين هنگام تحريك خارج از محدوده ، نوشتن مقدار وارد شده در حافظه نیز نشانگر رشته است و محتوای رشته اشاره شده پارامتری است که باعث ایجاد سرریز شده است.

استثمار آسیب پذیری

برای بهره برداری از آسیب پذیری نوشته شده در آن سوی مرز ، ابتدا باید بفهمیم که با استفاده از این سرریز می توان چه کاری انجام داد. ساختار متغیر جهانی سرریز به شرح زیر است:

 00000000 CGIEnv struc؛ (sizeof = 0x6990، mappedto_95)
00000000 buf dd ؟؛ افست
00000004 طول dd؟
00000008 field_8 dd 6144 dup (؟)؛ افست
00006008 param_arr param 200 dup (؟)
00006968 file_vec dd ؟؛ افست
0000696C vec_len dd؟
00006970 vec_cur_len dd؟
00006974 arg_cnt dd؟
00006978 زمینه_6978 dd؟
errcode 0000697C dd؟
روش 00006980 دی دی؟
00006984 is_multipart dd؟
00006988 read_func dd؟
0000698C زمینه_698C dd؟
00006990 CGIEnv به پایان می رسد

آرایه سرریز param_arr است ، بنابراین متغیرهای پس از آن بازنویسی می شوند. از جمله post_files ، vec_len ، vec_cur_len ، arg_cnt … و غیره. برای من یکی از جذاب ترین متغیر file_vec است که یک وکتور است که برای مدیریت پرونده های بارگذاری POST استفاده می شود ، بیشتر ساختار به این شکل است:

از ضبط اندازه برای ضبط کل طول آرایه ، پایان استفاده کنید تا جایی که در حال حاضر استفاده می شود را ضبط کنید ، تا در صورت عدم کفایت ظرفیت بتوان آنرا گسترش داد. اگر از آسیب پذیری برای ساختن نشانگر سرریز وکتور استفاده کنیم ، می توان از آن به طور مؤثر استفاده کرد! با پوشاندن این نشانگر ، می توانیم به اثر جعل پرونده پرونده POST و کلیه متغیرهای مرتبط دست یابیم و این ساختار پرونده POST شامل متغیرهای مختلف مرتبط با پرونده ، مانند مسیر و نام پرونده ، و ساختار FILE که برای مدیریت پرونده ها در لینوکس استفاده شده است ، و ساختار FILE کلید این حمله است. !

FILE Exploit Structure

این حمله از تکنیک بهره برداری از ساختار FILE استفاده می کند ، که یک روش حمله نسبتاً جدید است که در سالهای اخیر کشف شده است. این توسط Angelboy در HITCON CMT [1] منتشر شده است:

ساختار FILE در لینوکس استفاده می شود. ساختار مورد استفاده برای پردازش پرونده مانند STDIN ، STDOUT ، STDERR یا ساختار پس از تماس fopen پرونده . دلیل اصلی اینکه این ساختار می تواند به نقض آسیب پذیری تبدیل شود ، این است که آن را دربردارنده نشانگر vtable :

 struktur   _IO_FILE_plus 
 {
   FILE  ]  ؛ 
   const   struktur   _IO_jump_t   *  vtable ؛ 

struktur _IO_jump_t * vtable ؛

struktur

vtable vtable ضبط کننده انواع مختلف عملکرد پردازش توابع مرتبط:

 ساختار   _IO_jump_t 
 {
     JUMP_FIELD  ( size_t ،   __ آدمک [1965900189]] 
    ]  size_t  ،   __ dummy2 
     JUMP_FIELD  ( _IO_finish_t ،   __ پایان ] * / 
     JUMP_FIELD  ( _IO_read_t ،   __ بخوانید ) ؛ 
     JUMP_FIELD  ( _IO_write_t] T  _IO_write_t] )؛ 
     JUMP_FIELD  ( _IO_s eek_t  ،   __ به دنبال 
     JUMP_FIELD  ( _IO_close_t ،   __ بست ) [[659017] 19659028]}؛ 

بنابراین اگر می توانیم این [ vtable را دستکاری و جعل کنیم ، می توانیم جریان برنامه را در حالی که برنامه در حال انجام پردازش پرونده است ، ربودیم! ما می توانیم از این روش برای تعیین مراحل حمله زیر استفاده کنیم:

  1. اتصال برقرار کنید ، با CGI
  2. تماس بگیرید با استفاده از تعداد زیادی پارامتر ، نشانگر بردار
  3. FILE * را در پرونده POST جعلی بازنویسی کنید و به ساختار FILE جعلی
  4. بازنویسی کنید. ] عملیات مربوط به FILE را در فرآیند CGI فراخوانی کنید
        

    • Fread ، Fwrite ، Fclose ، …
    •     

      

  5. جریان برنامه ربودن

اکنون می دانیم که نقطه پایان است که یک عملیات FILE را فراخوانی می کند ، سپس می توانیم به عقب برگردیم که عملکرد CGI است که معمولاً FILE استفاده می شود ، وجود دارد. کدام CGI را می توان به عنوان یک نقطه ورود برای هک کردن زنجیره حمله ما استفاده کرد! ما ابتدا توابع مربوط به پرونده POST را مورد مطالعه قرار دادیم و هدف را انتخاب کردیم MCGI_VarClear () .
MCGI_VarClear () در بسیاری از CGI هایی که از FILE استفاده می کنند فراخوانی می شود ، برای پاک کردن g_stCGIEnv قبل از اتمام برنامه ، از جمله حافظه پویا تنظیم شده رایگان ( ) خاموش ، و همه FILE را ببندید ، یعنی با fclose () تماس بگیرید ، این بدان معنی است که می توان با vtable آن را ربود! ما می توانیم از این آسیب پذیری خارج از محدوده برای نوشتن file_vec استفاده کنیم ، و محتوای مورد اشاره به آن پارامترهای درخواست HTTP است ، که می توانند به صورت پرونده های POST جعل شوند! مانند ساختار زیر:

هدف نهایی ما این است که FILE را به یک ساختار جعلی ، با یک جعل جعلی برای ربودن جریان برنامه نشان دهیم! در این زمان مشکلی پیش آمد. ما باید نشانگر FILE * را به مکانی با محتوای کنترل پذیر نشان دهیم ، اما در واقع نمی دانیم به کجا اشاره کنیم و این مشکل توسط مکانیسم دفاعی در Linux-ASLR ایجاد می شود. .

Randomization Layout Space Space (ASLR)

ASLR باعث می شود که هر برنامه هنگام اجرای و بارگذاری در حافظه ، به طور تصادفی در یک مکان حافظه مختلف بارگذاری شود ، می توانیم سعی کنیم از cat / proc / self استفاده کنیم. / نقشه ها مشاهده کنید که آیا مکان حافظه هر بار که اجرا می شود یکسان است:

ASLR به طور پیش فرض در اکثر محیط ها فعال شده است ، بنابراین هنگام نوشتن یک مورد بهره برداری ، اغلب با شاخص هایی که می تواند جعل شود مواجه می شوید ، اما نمی دانید خجالت از کجا اشاره کرد.
و این سازوکار در چارچوب CGI موانع بیشتری ایجاد می کند ، روند حمله کلی سرور ممکن است به این صورت باشد:

شما می توانید از آدرس نشت در یک اتصال استفاده کنید و از آن برای حملات بیشتر استفاده کنید ، اما در CGI در معماری این مورد است:

در این حالت ، نشانی که از طریق نشت به دست می آید در حملات بعدی قابل استفاده نیست! از آنجا که اجرای CGI به پایان رسیده است ، درخواست بعدی یک CGI کاملاً جدید است!
به منظور مقابله با این مشکل ، ما در نهایت دو مورد بهره برداری نوشتیم ، روش حمله با توجه به باینری CGI متفاوت است.

Post-Auth RCE- / cgi-bin / msg_read

نقطه ورود اولین بهره برداری صفحه ای است که باید وارد سیستم شوید. این برنامه دارای برنامه های بزرگتر و عملکردهای بیشتری است. در این بهره برداری ، ما از روش پشته اسپری برای غلبه بر ASLR استفاده کردیم ، یعنی پر کردن تعداد زیادی اشیاء مکرر در پشته ، به طوری که احتمال بالایی از حدس بزنید نسبت به آن داشته باشیم. محل سکونت

محتوای اسپری تعداد زیادی از سازه های FILE جعلی ، از جمله vtables جعلی است. از این باینری ، یک ابزار بسیار عملی پیدا کردیم که یک قطعه برنامه کوچک است: [

نقش این اسباب بازی این است که ما می توانیم موقعیت پشته را تغییر دهیم ، و در این زمان ، محتوای اشاره گر eax قابل کنترل است ، بنابراین می توان محتوای کل پشته را جعل کرد ، به این معنی که می توانیم از ROP (برنامه نویسی برگشت گرا) برای استفاده از آن استفاده کنیم! بنابراین ما اسبابک منتقل شده توسط پشته و زنجیره حمله متعاقب آن را در vtable جعلی تنظیم کردیم تا حمله ROP را انجام دهیم!

ما می توانیم ROP انجام دهیم ، بنابراین می توانیم پوسته را بگیریم ، درست است؟ به نظر شما این مورد است؟ خیر ، در واقع یک مشکل بزرگ وجود دارد ، همچنین به دلیل مکانیسم دفاعی فوق الذکر ASLR – ما موقعیت سیستم را نداریم! این گجت تهیه شده توسط خود باینری برای باز کردن یک پوسته کافی نیست ، بنابراین امیدواریم که بتوانیم به طور مستقیم از سیستم در libc استفاده کنیم تا به هدف برسیم ، اما همانطور که قبلاً نیز اشاره شد ، مکان حافظه هر بار که بارگیری می شود تصادفی است ، ما من محل دقیق سیستم را نمی دانم!
پس از مشاهده دقیق این برنامه ، چیز بسیار ویژه ای پیدا کردیم این برنامه از لحاظ تئوری دارای NX باز است که یک مکانیزم محافظت غیر اجرایی برای بخش های قابل نوشتار است

اما در واقع اجرا شد. در آن زمان مجوز اجرای پشته باز خواهد شد!

صرف نظر از دلیل ، این تنظیمات برای هکرها بسیار مناسب است .ما می توانیم از این بخش اجرایی استفاده کنیم تا بتواند کد صدف را اجرا کند و ما می توانیم با موفقیت پوسته را بدست آوریم و به RCE برسیم!

با این حال ، این حمله نیاز به ورود دارد ، که برای تیم تحقیق DEVCORE که دنبال کمال است ، کافی نیست! بنابراین ، ما دیگر مسیرهای حمله را بررسی کرده ایم!

Pre-Auth RCE- / cgi-bin / cgi_api

پس از جستجو در تمام نقاط ورودي CGI ، يكي را پيدا كرديم كه نيازي به ورود ندارد و با MCGI_VarClear () CGI- / cgi-bin / cgi_api . همانطور که از نام آن پیداست ، این یک واسط برای فراخوانی API است ، بنابراین خود برنامه بسیار کوچک است و پس از فراخوانی در کتابخانه تقریباً تمام شده است ، بنابراین دیگر یک ابزار محوری برای پشته در دسترس نیست.
در این زمان ، از آنجا که می دانیم پشته قابل اجرا است ، می توانیم از مرحله ROP صرفنظر کنیم و shellcode را مستقیماً روی پشته قرار دهیم .در اینجا ، ما از یک ویژگی CGI استفاده می کنیم – متغیرهای مربوط به HTTP قرار خواهد گرفت. در بین متغیرهای محیطی ، مانند متغیرهای رایج زیر:

  • HTTP_HOST
  • REQUEST_METHOD
  • QUERY_STRING

و متغیر محیط در واقع در انتهای پشته قرار دارد ، یعنی موقعیت بخش اجرایی ، بنابراین ما فقط نیاز به جعل vtable داریم و مستقیماً با کد صدایی تماس می گیریم!

البته در حال حاضر نیز مشکلی وجود دارد: ما هنوز مکان حافظه پشته را نداریم. در این زمان ممکن است برخی از افراد به یک راز بپردازند ، فکر می کنند که این حمله به یکباره صورت می گیرد ، مانند یک تیرانداز ، در یک ضربه خواهد کشت ، اما در واقع ممکن است اینگونه باشد که با یک مسلسل دشمن را خاموش کند:

با نگاه از منظر ، این باینری 32 بیت است ، بنابراین 1.5 بایت در این موقعیت تصادفی است و در مجموع 16 3 ترکیب احتمالی وجود دارد ، بنابراین در حقیقت ، فقط به 4096 درخواست نیاز دارد تا یک بار ضربه بزنید! این در واقع چند دقیقه برای سرعت رایانه و شبکه فعلی چند دقیقه است ، بنابراین انجام عملی مستقیماً ترک خوردن نیروی بی رحمانه نیز امکان پذیر است! بنابراین فرایند بهره برداری نهایی ما این است:

  1. ارسال درخواست پست به cgi_api
        

    • کد صدف را در QUERY_STRING قرار دهید
    •     

      

  2. محرک خارج از محدوده نوشتن ، بازنویسی file_vec
        

    • FILE جعلی و جدول را در پارامترهای فراتر از مرز آماده کنید
    •     

      

  3. cgi_api با تماس بگیرید MCGI_VarClear
  4. قبل از پرش به محل صدف را در vtable ، پوسته معکوس

را با موفقیت نوشتیم ، و این بهره برداری تحت تأثیر نسخه های مختلف باینری قرار نمی گیرد! مورد واقعی همچنین امکان سنجی این بهره برداری را اثبات کرد .در یک تمرین ، ما از 1day Mail2000 به عنوان دستیابی به موفقیت استفاده کردیم تا داده های VPN هدف را با موفقیت به بیرون درز کنیم و بیشتر به داخل اینترانت نفوذ کنیم!

رفع آسیب پذیری

این آسیب پذیری در نسخه Mail2000 V7 Patch 050 نسخه منتشر شده در 2018/05/08 برطرف شده است. شماره وصله های OF-ISAC-18-002 و OF-ISAC-18-003 هستند.

Postscript

سرانجام ، من می خواهم در مورد اینکه چه نوع تولید کننده ذهنیت باید برای مقابله با این نقاط ضعف استفاده کند ، صحبت کنم. به عنوان ارائه دهنده محصول ، Openfind چندین نکته کلیدی دارد که ارزش آن را در این زمینه در مورد آسیب پذیری می آموزد:

  • ذهن باز
        
      
  • اشکالات را به طور جدی برطرف کنید
        

    • در مواجهه با این نگرش مثبت ، به سرعت با
    • مقابله کنید. پس از اتمام تعمیر ، با گزارشگر برای تأیید
    • همکاری کنید
          

      

  • ارزش ایمنی مشتری
        

    • به روزرسانی های اصلی را منتشر کنید و به طور فعال به مشتریان اطلاع دهید و با به روزرسانی ها به آنها کمک کنید.
          

      

در حقیقت ، حفره هایی در محصول وجود دارد كه عادی و دشوار برای جلوگیری از آن است ، و تیم تحقیقاتی ما به عنوان یك تسهیلگر نقش دارد ، امیدواریم كه با تهیه گزارش های مشكلات ، بهبود آگاهی از امنیت و افزایش سطح امنیتی تایوان به شركتها كمك كند! امید است که تولیدکنندگان نیز با نگرش مثبت و نه گول زدن و دوری از این مسئله ، با نگرش مثبت روبرو شوند و این تنها باعث می شود کاربران در معرض خطرات امنیتی بیشتری قرار بگیرند!

و کاربرانی که از دستگاه های مختلفی استفاده می کنند نیز باید بر دارایی های خود تسلط داشته باشند فایروال ها ، سرورها و سایر محصولات خریداری و نصب نمی شوند .بعد از راه اندازی مشکلی وجود نخواهد داشت. موجودی خوبی را انجام دهید و به روز رسانی های امنیتی تولید کنندگان را پیگیری کنید. برای اطمینان از این که محصول توسط 1day مورد حمله قرار نمی گیرد! آزمایش نفوذ منظم و مته های تیم قرمز می توانند به شرکتها کمک کنند تا نقاط کمبود یا نقص نقاط کور را مشخص کنند و سپس به منظور کاهش خطرات امنیتی شرکت بهبود یابد.

من پناهنده هستم.
              

.