
سكريبت لأتمتة التقاط وتحليل ذاكرة لينكس
برنامج نصي لتفريغ ذاكرة لينكس وإنشاء ملامح Volatility™. هال بوميرانتز ([email protected])، 2020-02-01
"إذا رأيت أبعد من ذلك، فبفضل الوقوف على أكتاف العمالقة." ~ إسحاق نيوتن
هناك الكثير من الأشخاص الذين يستحقون الشكر لجعل هذه الأداة البسيطة ممكنة:
-- الأشخاص الطيبون في مايكروسوفت لجعل AVML متاحًا
-- جو سيلف (Joe Sylve) لعمله على LiME
-- فريق تطوير Volatility™ بأكمله لجهودهم المستمرة. أود بشكل خاص أن أشكر أندرو كيس (Andrew Case) الذي أجاب على عدد من الأسئلة المزعجة مني أثناء تطوير أداتي.
-- ديفيد أندرسون (David Anderson) لدعمه المستمر لـ libdwarf و dwarfdump
-- مات سويش (Matt Suiche) من MoonSols. عندما كنت أجمع أداتي، كان هدفي التصميمي هو "اجعلها سهلة الاستخدام مثل DumpIt" (إذا كنت بحاجة لالتقاط ذاكرة ويندوز، لا أعرف أداة أسهل للاستخدام). لذا شكرًا للإلهام، مات!
-- الأشخاص الذين قدموا أفكارًا ورمزًا لتحسين الأداة:
Julien -- دليل إخراج/بناء بديل وملصقات معرف القضية،
إحباط إذا لم يكن يعمل كجذر
Jonathon Poling -- أفكار مشابهة لأفكار Julien
Jeff Bryner -- إنشاء ملفات volatilityrc لكل التقاط
المجتمع أفضل بفضل كل هذه الجهود. لقد اخترت جعل أداتي متاحة تحت رخصة "Creative Commons Attribution" (CC BY)، لكي تكون متاحة على أوسع نطاق ممكن.
لتحليل ذاكرة لينكس، تحتاج أولاً إلى القدرة على التقاط ذاكرة لينكس. يعمل AVML بشكل رائع، ولكن إذا كان نظامك لا يحتوي على /proc/kcore أو /dev/crash، فستحتاج إلى "Linux Memory Extractor" (LiME) لجو سيلف. لكنك بحاجة إلى وحدة LiME مترجمة لنواة النظام الذي ترغب في التقاط ذاكرة الوصول العشوائي منه.
Volatility™ رائع في تحليل صور ذاكرة لينكس. لكنه يحتاج إلى ملف تعريفي (profile) يطابق النظام الذي التقطت منه الذاكرة. بناء ملف تعريفي يعني كتابة برنامج C على النظام المناسب واستخدام dwarfdump للحصول على عناوين هياكل بيانات النواة المهمة. تحتاج أيضًا إلى نسخة من ملف System.map من دليل /boot.
الآن إذا كان لديك نسخة طبق الأصل من نظامك المستهدف، يمكنك بناء ملف تعريف Volatility™ على النسخة المطابقة، وإذا لزم الأمر بناء LiME لالتقاط وتحليل الذاكرة من الهدف. ولكن هناك حالات عديدة لا تتوفر فيها نسخة طبق الأصل من النظام المستهدف. لذا قد تضطر إلى بناء ملف تعريف Volatility™ و LiME على جهازك المستهدف.
وهذا ليس لضعاف القلوب. هناك عدد من الخطوات، وبعض أوامر لينكس منخفضة المستوى إلى حد ما. كان هدفي إنشاء حزمة يمكن تثبيتها (بواسطة خبير) على محرك إبهام وتوزيعها على الوكلاء في الميدان. يجب أن يكون مستخدم محرك الإبهام قادرًا على توصيل محرك الإبهام، وتشغيل أمر واحد، والحصول بنجاح على صورة ذاكرة من الجهاز المستهدف وملف تعريف Volatility™ عامل. النتيجة هي البرنامج النصي lmg (Linux Memory Grabber).
إذا كنت متشددًا في النقاء الجنائي، فربما ليست هذه الأداة لك. دعونا نناقش بعض الطرق التي تتفاعل بها أداتي مع النظام المستهدف:
الوسائط القابلة للإزالة -- صُممت الأداة لتُشغَّل من جهاز USB محمول مثل محرك الإبهام. ستقوم بتوصيل جهاز قابل للكتابة بنظامك المستهدف، حيث يمكن أن يكون هدفًا للمستخدمين الخبيثين أو البرامج الضارة على النظام. عملية توصيل الجهاز بالنظام ستغير حالة الجهاز (على سبيل المثال، إنشاء إدخالات سجل، إدخالات mtab، إلخ). إذا لم يتم تثبيت الجهاز تلقائيًا بواسطة نظام التشغيل، يجب على المستخدم تثبيت الجهاز يدويًا عبر شل جذر.
الترجمة -- يتضمن إنشاء ملف تعريف Volatility™ ترجمة كود على الجهاز المستهدف. وكذلك بناء LiME عندما لا يعمل AVML. لذا سيتم تنفيذ gcc، وقراءة ملفات الرؤوس، وربط المكتبات، إلخ. يحاول lmg تقليل التأثير على نظام الملفات للجهاز المستهدف عن طريق تعيين TMPDIR إلى دليل على جهاز USB الذي يعمل منه lmg. وهذا يعني أن الملفات الوسيطة التي أنشأها المترجم ستكتب إلى محرك الإبهام بدلاً من نظام الملفات المحلي للجهاز المستهدف.
التبعيات -- من أجل ترجمة كود النواة على لينكس، يحتاج الجهاز المستهدف إلى بيئة تطوير عاملة مع gcc و make إلخ وجميع ملفات التضمين والمكتبات المشتركة المناسبة. وبشكل خاص، يجب أن تكون ملفات رؤوس النواة موجودة على الجهاز المحلي. قد لا تكون هذه التبعيات موجودة على الهدف. في هذه الحالة، يواجه المستخدم خيار تثبيت التبعيات المناسبة (إذا أمكن) أو عدم القدرة على بناء ملف تعريف Volatility™ للنظام.
البرامج الضارة -- يستخدم lmg /bin/bash و gcc و zip ومجموعة من البرامج الأخرى من الجهاز المستهدف. إذا كان النظام قد تعرض للاختراق، فقد لا تكون التطبيقات التي يستخدمها lmg جديرة بالثقة. الحل الأكثر اكتمالاً سيكون إنشاء بيئة تنفيذ آمنة لـ lmg على جهاز USB المحمول، ولكن كان ذلك خارج نطاق هذا الإثبات الأولي للمفهوم.
الذاكرة -- جميع الأوامر التي يتم تشغيلها ستتسبب في تغيير ذاكرة النظام المستهدف. فعل التقاط ذاكرة الوصول العشوائي سيخلق دائمًا أثرًا (artifacts)، ولكن في هذه الحالة هناك ترجمة واسعة النطاق، والوصول إلى نظام الملفات، إلخ بالإضافة إلى تشغيل أداة تفريغ الذاكرة.
مع كل ما قيل، lmg هي أداة مريحة جدًا للسماح للوكلاء ذوي المهارات الأقل بالتقاط بيانات تحليل الذاكرة المفيدة من الأنظمة المستهدفة.
لاحظ أنه إذا فشل AVML، سيبحث lmg عن وحدة LiME موجودة بالفعل على جهاز USB تطابق إصدار النواة ومعمارية المعالج للجهاز المستهدف. إذا وجدت، لن يزعج lmg نفسه بإعادة الترجمة. وبالمثل، يمكنك اختيار عدم جعل lmg ينشئ ملف تعريف Volatility™ للهدف لتقليل التأثير على النظام المستهدف.
يستخدم lmg أسماء مسارات نسبية عند استدعاء برامج مثل gcc و zip. لذا إذا كنت ترغب في تشغيل هذه البرامج من وسائط بديلة، قم ببساطة بتحديث $PATH حسب الحاجة قبل تشغيل lmg.
أولاً، قم بإعداد محرك إبهام وفقًا للتعليمات في وثيقة INSTALL المرفقة مع lmg.
عندما ترغب في التقاط ذاكرة الوصول العشوائي، قم بتوصيل محرك الإبهام بنظامك المستهدف. في معظم أنظمة لينكس، سيتم تثبيت أجهزة USB الجديدة تلقائيًا تحت /media. لنفترض أن جهازك ينتهي به المطاف تحت /media/LMG.
الآن، كجذر، قم بتشغيل "/media/LMG/lmg". هذا هو الوضع التفاعلي وسيُطلب من المستخدم تأكيدًا قبل أن يقوم lmg ببناء وحدة LiME للنظام و/أو إنشاء ملف تعريف Volatility™. إذا كنت لا تريد المطالبة، استخدم "/media/LMG/lmg -y".
كل شيء آخر مؤتمت. بعد تشغيل البرنامج النصي، سيكون لديك دليل جديد على محرك الإبهام باسم
".../capture/-YYYY-MM-DD_hh.mm.ss"
يدعم lmg خيار -c لتحديد اسم دليل معرف القضية لاستخدامه بدلاً من الدليل الافتراضي "-YYYY-MM-DD_hh.mm.ss".
أيًا كان اسم الدليل المستخدم، سيحتوي الدليل على:
-YYYY-MM-DD_hh.mm.ss-memory.lime -- التقاط الذاكرة -YYYY-MM-DD_hh.mm.ss-profile.zip -- ملف تعريف Volatility™ -YYYY-MM-DD_hh.mm.ss-bash -- نسخة من /bin/bash للهدف volatilityrc -- نموذج ملف تكوين Volatility
يحدد ملف volatilityrc المواقع المناسبة للذاكرة الملتقطة والإضافة. انظر مثال الاستخدام أدناه لكيفية استخدام هذا الملف.
نسخة /bin/bash مفيدة لتحديد عنوان هيكل بيانات تاريخ الشل (shell history) في ذاكرة عمليات bash في التقاط الذاكرة. راجع https://github.com/volatilityfoundation/volatility/wiki/Linux-Command-Reference#linux_bash للحصول على تفاصيل إضافية حول كيفية استخدام هذا الملف القابل للتنفيذ (أو ارجع إلى مثال الاستخدام أدناه).
لاحظ أنه قد تكون هناك أوقات لا ترغب فيها في كتابة البيانات إلى الوسائط التي تشغل منها lmg - على سبيل المثال إذا كانت أدوات lmg على وسائط للقراءة فقط مثل DVD-ROM. يدعم lmg خيار -d لتحديد دليل إخراج مختلف. بشكل افتراضي، ستتم جميع الترجمة في الدليل الهدف، ولكن يمكن للمستخدم تحديد دليل ترجمة بديل باستخدام -B.
إليك مثال على استخدام أداة lmg، والذي يتضمن استخدام Volatility™ مباشرة من محرك الإبهام لتحليل الصورة الملتقطة. على جهاز الاختبار الخاص بي، كان محرك الإبهام عند /dev/sdb ولم يتم تثبيته تلقائيًا بواسطة نظام التشغيل. لذا فعلت كل شيء يدويًا.
[root@localhost ~]$ sudo -s [sudo] password for lab: [root@localhost lab]# mkdir -p /mnt/usb [root@localhost lab]# mount /dev/sdb1 /mnt/usb
[root@localhost lab]# /mnt/usb/lmg -y AVML is /mnt/usb/avml/avml-x86_64 Dumping memory in "lime" format to /mnt/usb/capture/localhost.localdomain-2020-02-01_08.16.55 This could take a while...Done! Grabbing a copy of /bin/bash...Done! Writing volatilityrc to /mnt/usb/capture/localhost.localdomain-2020-02-01_08.16.55...Done! make -C //lib/modules/4.18.0-147.3.1.el8_1.x86_64/build M="/mnt/usb/volatility-master/tools/linux" clean make[1]: Entering directory '/usr/src/kernels/4.18.0-147.3.1.el8_1.x86_64' make[1]: Leaving directory '/usr/src/kernels/4.18.0-147.3.1.el8_1.x86_64' rm -f module.dwarf make -C //lib/modules/4.18.0-147.3.1.el8_1.x86_64/build CONFIG_DEBUG_INFO=y M="/mnt/usb/volatility-master/tools/linux" modules make[1]: Entering directory '/usr/src/kernels/4.18.0-147.3.1.el8_1.x86_64' CC [M] /mnt/usb/volatility-master/tools/linux/module.o Building modules, stage 2. MODPOST 1 modules WARNING: modpost: missing MODULE_LICENSE() in /mnt/usb/volatility-master/tools/linux/module.o see include/linux/module.h for more information CC /mnt/usb/volatility-master/tools/linux/module.mod.o LD [M] /mnt/usb/volatility-master/tools/linux/module.ko make[1]: Leaving directory '/usr/src/kernels/4.18.0-147.3.1.el8_1.x86_64' dwarfdump -di module.ko > module.dwarf make -C //lib/modules/4.18.0-147.3.1.el8_1.x86_64/build M="/mnt/usb/volatility-master/tools/linux" clean make[1]: Entering directory '/usr/src/kernels/4.18.0-147.3.1.el8_1.x86_64' CLEAN /mnt/usb/volatility-master/tools/linux/.tmp_versions CLEAN /mnt/usb/volatility-master/tools/linux/Module.symvers make[1]: Leaving directory '/usr/src/kernels/4.18.0-147.3.1.el8_1.x86_64' adding: module.dwarf (deflated 90%) adding: boot/System.map-4.18.0-147.3.1.el8_1.x86_64 (deflated 79%)
[root@localhost lab]# cd /mnt/usb/capture/localhost.localdomain-2020-02-01_08.16.55 [root@localhost localhost.localdomain-2020-02-01_08.16.55]# ls localhost.localdomain-2020-02-01_08.16.55-bash localhost.localdomain-2020-02-01_08.16.55-memory.lime localhost.localdomain-2020-02-01_08.16.55-profile.zip volatilityrc [root@localhost localhost.localdomain-2020-02-01_08.16.55]# ../../volatility-master/vol.py --conf-file=volatilityrc linux_banner Volatility Foundation Volatility Framework 2.6.1 Linux version 4.18.0-147.3.1.el8_1.x86_64 ([email protected]) (gcc version 8.3.1 20190507 (Red Hat 8.3.1-4) (GCC)) #1 SMP Fri Jan 3 23:55:26 UTC 2020
[root@localhost localhost.localdomain-2020-02-01_08.16.55]# gdb localhost.localdomain-2020-02-01_08.16.55-bash GNU gdb (GDB) Red Hat Enterprise Linux 8.2-6.el8_0 Copyright (C) 2018 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: http://www.gnu.org/software/gdb/bugs/. Find the GDB manual and other documentation resources online at: http://www.gnu.org/software/gdb/documentation/.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from localhost.localdomain-2020-02-01_08.16.55-bash...Missing separate debuginfo for /mnt/usb/capture/localhost.localdomain-2020-02-01_08.16.55/localhost.localdomain-2020-02-01_08.16.55-bash
Try: dnf --enablerepo='debug' install /usr/lib/debug/.build-id/b6/858d77c486b7b596f22956149bbc9f8058d98d.debug
Reading symbols from .gnu_debugdata for /mnt/usb/capture/localhost.localdomain-2020-02-01_08.16.55/localhost.localdomain-2020-02-01_08.16.55-bash...(no debugging symbols found)...done.
(no debugging symbols found)...done.
(gdb) disass history_list
Dump of assembler code for function history_list:
0x00000000000ccea0 <+0>: endbr64
0x00000000000ccea4 <+4>: mov 0x24b09d(%rip),%rax # 0x317f48
0x00000000000cceab <+11>: retq
End of assembler dump.
(gdb) quit
[root@localhost localhost.localdomain-2020-02-01_08.16.55]# ../../volatility-master/vol.py --conf-file=volatilityrc linux_bash -H 0x317f48
Volatility Foundation Volatility Framework 2.6.1
Pid Name Command Time Command
13822 bash 2020-01-30 20:25:39 UTC+0000 uname -a 13822 bash 2020-01-30 20:25:39 UTC+0000 ls 13822 bash 2020-01-30 20:25:39 UTC+0000 sudo -s 13822 bash 2020-01-30 20:25:39 UTC+0000 fg [... more output not shown ...]