تجزیه و تحلیل بدافزار PDF
در عصر ارتباطات و تکنولوژی امروزی، فایلهای PDF جزو جدا نشدنی بستر انتقال اطلاعات بین افراد میباشند. در نگاه اول این فایلها تنها حاوی اطلاعاتی در قالب نوشته و مستند هستند که میتوانند شامل متن، کلمات و یا عکسهای معمولی باشند. اما در نگاهی دقیقتر بر روی این فایلها میتوانیم به پتانسیل آلوده سازی و خطرناک بودن آنها و سوء استفادههای مختلف از طریق این فایلها پی ببریم. در این مطلب قصد داریم تا یک فایل PDF آلوده را مورد بررسی قرار دهیم و به همراه هم به نتایج یک Malware Analysis که یکی از موضوعات مهم در فرآیندهای مربوط به ارزیابی امنیتی و تست نفوذپذیری میباشد، برسیم.
معمولا فایلهای PDF بین افراد بسیار رایج و پر استفاده هستند ولی در عین حال با داشتن قابلیت Code Inject در کنار کد اصلی PDF که ASCII هستش، معمولا ریسک آلوده بودن این نوع فایل وجود دارد.
در ساختار کلی PDF مسیردهی همیشه با Objectها انجام میشود که یکی از این موارد که قابلیت اجرای فایل را دارا میباشد OpenAction هستش. معمولا شماره Objectها از 01 شروع شده و تا 43 ادامه پیدا میکند. طبیعتا این عدد میتواند بالاتر از 44 باشد که در این حالت، اشاره به سورس External میکند. در این حالت (از عدد 44 به بعد) معمولا اشاره به مواردی است که در فایل Embed شده نیستند و برای فراخوانی به Redirect نیاز دارند.
در حین آنالیز بدافزار باید به این نکته توجه کرد که معمولا در بد افزارها Object مورد نظر در ابتدای فایل قرار نمیگیرد تا به سیستم اجازه اجرای PDF را به صورت کامل بدهد، دلیل این عملکرد در ادامهی مقاله توضیح داده خواهد شد.
برای درک بهتر این موضوع میتوانیم از مثال زیر استفاده کنیم:
موارد مشابهی مانند /Launch/Explorer و /Launch/Notepad و … نیز وجود دارند.
بنابراین فایلهای PDF بر اساس Objectها کار میکنند و شیوه Syntax داخل PDF با / میباشد. به عنوان مثال /Msgbox و /icon. همانطور که در بالا به آن اشاره شد یکی از موارد حائز اهمیت OpenAction میباشد که توانایی اجرای فایلها را دارد.
تا اینجا فاز آشنایی با ساختار و عملکرد فایلهای PDF را به صورت اجمالی توضیح دادیم، حال میخواهیم به سراغ تحلیل و فارنزیک فایل آلوده PDF برویم.
برای جستجوی راحتتر و بررسی هرچه بهتر فایل PDF اسکریپتی به نام pdf-parser.py با زبان پایتون آماده شده است که در اینجا از این اسکریپت استفاده خواهیم کرد.
در نظر داشته باشیم نام فایل آلوده ما در این سناریو AshnaSecure-Infected.pdf میباشد.
برای جستجو در داخل فایل PDF از دستور زیر استفاده میکنیم
pdf-parser.py AshnaSecure-Infected.pdf --search javascript

برای جستجو Stream هم از دستور زیر استفاده میکنیم :
pdf-parser.py AshnaSecure.pdf --searchstream java
حال در نظر میگیریم که به یک آبجکت مشکوک شده و میخواهیم به سراغ محتوای آن برویم، برای جستجو کردن و به سراغ Object رفتن از دستور و سوئیچ زیر استفاده میکنیم
pdf-parser.py AshnaSecure-Infected.pdf --object 10

ابزار جایگزینی با نام peepdf برای اسکریپت pdf-parser وجود دارد که دارای محیطی interactiveتر میباشد. این ابزار نیز با زبان پایتون نوشته شده است.
دستور کلی این اسکریپت به شرح ذیل میباشد :
peepdf.py -fli AshnaSecure.pdf

به عنوان مثال برای استخراج یک شماره Object خاص که ممکن است به آن مشکوک شده باشیم، میتوانیم از دستور زیر استفاده کنیم :
object 13 > AshnaSecure.txt
حالا برای دیدن استریم باید از ساختار دستوری به شکل زیر استفاده کنیم :
pdf-parser.py AshanSecure-Infected.pdf --object 13 --filter --raw -d AshnaSecure-Stream.txt

وقتی میخواهیم Content یک Object رو استخراج کنیم از دستور بالا استفاده میکنیم.
هم اکنون خروجی که به دست آوردهایم که Object Contect مورد نظر میباشد طبیعتا برای جلوگیری از مشخص بودن و قابل خواندن محتویات obfuscate شده (درهم ریخته شده) میباشد.

برای خواندن این مقادیر و به اصطلاح Deobfuscate کردن آنها باید از اسکریپت spiderMonkey استفاده کنیم:
js -f /usr/share/remnux/objects.js -f AshnaSecure-Stream.txt

همانطور که در عکس بالا مشخص است به ارور Function برخورد کردیم. معمولا این فانکشن ;eval هست تا بتواند Decode مقدار مورد نظر را انجام دهد. برای برطرف سازی این پیغام میتوانیم داخل سورس قسمت فانکشن را پاک کنیم و فقط یک eval; قرار دهیم تا بتواند بدون ارور به درستی کار کند.

باید به این نکته توجه داشت که تنها فرمت استانداردی که برای مفسرهای مختلف مثل Office وجود داره در واقع Unicode میباشد که مورد استفاده واقع میشود، تا قابل خواندن باشد. حال باید Unicode را تبدیل به String کنیم
js -f /usr/share/remnux/objects -f AshnaSecure-Stream.txt > AshnaSecure-Stream-Output.txt
![]()
در نهایت برای یکسان سازی Encoding محتوا باید از اسکریپت base64dump استفاده کنیم.
base64dump.py -e pu AshnaSecure-Stream-Output.txt -s 1 -d > AshnaSecure.bin

این دستور مواردی که Unicode هستند را به صورت String داخل فایل نهایی ما که در اینجا AshnaSecure.bin است، منتقل میکند.
در لایه اول دیدن مقادیر این فایل Bin برای ما امکان پذیر نمیباشد

به همین دلیل باید به سراغ نرم افزار scDbg برویم تا بر اساس Ruleهای Yara و Ruleهای دست نویس خودش که درون برنامه به صورت دیتابیس وجود دارد فایل را مورد بررسی و آنالیز قرار دهد، تا بتواند متوجه وجود شل کد درون فایل بشود. در نهایت اگر شل کد وجود داشته باشد اقدام به Decode میکند و به صورت فرمتی قابل رویت به ما نمایش میدهد.

همانطور که در عکس بالا مشاهده میشود اقداماتی نظیر به دست آوردن مسیر Temp، دانلود فایل اجرایی آلوده، اجرای آن و حذف پروسس را انجام میدهد.
در نهایت باید یادآور شویم که در این مقاله سعی شده است مطلب تحلیل بدافزارها در فایلهای پر کاربرد PDF، تا حد امکان بسیار کاربردی و ساده عنوان شود. طبیعتا امکان وجود سناریوهای مختلف و به مراتب سختتر و پیچیده تر در شرایط مختلف وجود دارد که نیازمند اجرای راهکارهای مختلف و متفاوت است.