ویرگول
ورودثبت نام
Jankid
Jankid
Jankid
Jankid
خواندن ۴ دقیقه·۴ ماه پیش

کالبدشکافی یک بدافزار چندمرحله‌ای؛ از SHTML تا شل‌کد


یه روز معمولی یه ایمیل رسید دستم همون‌جور که همه‌مون هر روز می‌بینیم: موضوع ساده، متن اسپم شده، و یک پیوست که اولش به چشم نمی‌اومد. اما اسم فایلِ پیوست یه چیزِ عجیب داشت: shtml ، زنگ خطر کوچیکی توی مغزم خورد؛ توی تجربهٔ من، چیزای عجیب همیشه یه چیزی برای گفتن دارن. وقتی سورس فایل رو باز کردم، توی همون خط های اول که یک تگ <video>بود؛ یه رشتهٔ بی‌نهایت طولانی از حروف و اعداد دیدم؛ نه URL، نه مسیر؛ فقط یه رشته طولانی ؛همون لحظه فهمیدم این فقط یه صفحهٔ وب ساده نیست؛ این یه چیزی توش پنهان‌شده بود، یک لایهٔ اول از چیزی که قرار بود دیده نشه تا آنتی ویروس ها بهش گیر ندن.

کنجکاوی به عقلم غلبه کرد، ولی عقل حکم کرد که با احتیاط جلو برم — اینجا قرار نیست چیزی اجرا بشه! در ادامهٔ این مقاله، قدم‌به‌قدم شرح می‌دهم که چطور از یک تگ به‌ظاهر معمولی رسیدم به لایه‌های پنهان‌سازی، و چرا هر نشانه‌ای که پیدا شد، خبر از طراحی دقیق و هدفمندِ یک حمله می‌داد — اما ابتدا باید بدانیم کجا و چگونه این ردپاها ظاهر شدند.


تحلیلم با فایل به نام sample.shtml آغاز شد. اولین قدم، بررسی محتوای آن برای یافتن ناهنجاری بود.با بررسی کد HTML، متوجه یک تگ <video> شدیم که در بخس بعد src آن، به جای آدرس یک فایل ویدیویی، یک رشته بسیار طولانی از کاراکترها با استفاده از data URI scheme جاسازی شده بود. این رشته، پی‌لود مرحله اول ما بود.

برای استخراج دقیق اومدم و تگ داخل فایل shtml رو کپی کردم و در فایل out1.txt سیو کردم و این نتیجه شد:

cat out1.txt
cat out1.txt
file sample.shtml
file sample.shtml

حالا که رشته‌ی کدگذاری شده را در فایل out1.txt داشتیم، باید نوع انکودینگ آن را شناسایی می‌کردیم. با دستور grep -o '.' out1.txt | sort | uniq -c تمام کاراکترهای موجود در فایل را شمرده و به ما نشان می‌دهد.

خروجی این دستور لیستی از تمام کاراکترهای استفاده شده بود. نکته کلیدی این بود که هیچ‌کدام از کاراکترهای + یا = که در Base64 استاندارد وجود دارند، در این لیست نبودند. این مشاهدات ما را به سمت Base62 هدایت کرد.

لیست کاراکترهایی که در فایل out1.txt استفاده شده است
لیست کاراکترهایی که در فایل out1.txt استفاده شده است

برای رمزگشایی، یک اسکریپت ساده پایتون به نام base62_decode.py نوشتیم تا بتونه یه خروجی به ما بده به اسم out.bin بعدش دستور file out.bin زدم و data تشخیص داد و با ابزار ent out.bin رو زدم متوجه شدم آنتروپی 3.16 داشت(بار های اول که زدم روی 7 تشخیص داد) که خب صددرصد این رمزنگاری شده بود.


ما حالا یک فایل باینری رمزنگاری شده داشتیم. فرضیه اصلی، رمزنگاری XOR بود.برای بار اول یک اسکریپت بروت‌فورس نوشتم تا تمام ۲۵۶ کلید تک‌بایتی را تست کند. این اسکریپت به دنبال هدرهای فایل شناخته‌شده (مثل MZ برای EXE) در خروجی‌های رمزگشایی شده می‌گشت. نتیجه این بود که هیچ کلید تک‌بایتی موفقی پیدا نشد.

فرضیه بعدی، XOR با کلید تکرارشونده بود. برای شکستن آن، ابتدا باید طول کلید را پیدا می‌کردیم. از یک اسکریپت پایتون که Index of Coincidence را محاسبه می‌کرد، استفاده کردیم.

و خب خروجی نشون داد که طول کلید به احتمال زیاد 11 بایت هست.

در نهایت برای آخرین گام ، پس از کشف طول کلید، با اسکریپت نهایی (solve_final_payload.py)، خود کلید ۱۱ بایتی را بازیابی و فایل out.bin را رمزگشایی کردیم. خروجی با موفقیت کلید را پیدا کرد و در نهایت در فایلی به اسم DECRYPTED_PAYLOAD.bin ذخیره کرد.


بعدش دوباره دستور file رو زدم و فایل نهایی همچنان توسط سیستم به عنوان data شناخته می‌شد. این من رو به سمت فرضیه شل‌کد خام هدایت کرد.با استفاده از دیس‌اسمبلر ndisasm، فایل را به زبان اسمبلی ۳۲ بیتی ترجمه کردیم.

خروجی شامل دنباله‌ای از دستورات معتبر اسمبلی x86 بود که وجود الگوهای کلاسیک شل‌کدنویسی مانند fnstenv (برای یافتن آدرس در حافظه) و lodsd/stosb (برای عملیات روی حافظه) در آن، فرضیه ما را تأیید کرد.(نتیجه کامل رو توی کامنت های همین پست گذاشتم)


برای فهمیدن هدف نهایی شل‌کد، یک آزمایشگاه مجازی امن شامل یک ویندوز ۱۰ و یک ماشین ابزار کالی لینوکس در یک شبکه ایزوله ساختیم. ابتدا شل‌کد را با دستور "xxd -i DECRYPTED_PAYLOAD.bin > shellcode.h" به فرمت C تبدیل کردم. سپس با استفاده از کد loader.c و کامپایلر

i686-w64-mingw32-gcc loader.c -o loader.exe

فایل اجرایی را در کالی ساختم و به ویندوز ارسال کردم.در کالی، INetSim (برای شبیه‌سازی اینترنت) و Wireshark (برای شنود ترافیک) را اجرا کردم. در ویندوز، Process Monitor (Procmon) رو اماده کردیم و سپس loader.exe را اجرا نمودیم.

خروجی Wireshark
خروجی Wireshark

که خب خروجی به خصوص Wireshark نشون میده شل‌کد هیچ اتصالی به اینترنت برقرار نکرد، بلکه شروع به ارسال بسته‌های SSDP برای شناسایی دستگاه‌های دیگر در شبکه محلی نمود. و همچنین شل‌کد یک فایل جدید در سیستم ایجاد کرد و برای ماندگاری (Persistence)، کلیدهایی را در رجیستری ویندوز ثبت کرد. در نهایت از اینکه تا انتهای این مسیر تحلیلی پیچیده با من همراه بودید، صمیمانه سپاسگزارم. این کالبدشکافی، سفری پر از چالش و یادگیری بود و امیدوارم جزئیات آن برای شما نیز مفید واقع شده باشد.


امنیت سایبریبررسی کدکالی لینوکسهکبدافزار
۱
۱
Jankid
Jankid
شاید از این پست‌ها خوشتان بیاید