7.5 ניתוח תוכנות זדוניות הרצאה
אחד השימושים החשובים ביותר של הנדסה הפוכה הוא ניתוח תוכנות זדוניות - malware analysis. כשתוכנה זדונית מתגלה, חוקרי אבטחה צריכים להבין מה היא עושה, איך היא עובדת, ואיך להגן מפניה. בהרצאה הזו נלמד את הבסיס של ניתוח malware - גם בשיטות סטטיות (בלי להריץ) וגם בשיטות דינמיות (תוך כדי הרצה).
חשוב להדגיש: אנחנו לומדים את הנושא הזה לצורכי הגנה. ההבנה של איך תוכנות זדוניות עובדות היא הכרחית כדי לזהות אותן, לנטרל אותן, ולבנות הגנות טובות יותר.
בטיחות קודם כל - safety first¶
לעולם אל תנתחו תוכנה זדונית על המחשב האמיתי שלכם!
תמיד עבדו בסביבה מבודדת:
- השתמשו במכונה וירטואלית (VirtualBox, VMware, או QEMU)
- נתקו את הרשת - אל תחברו את ה-VM לאינטרנט (או השתמשו ברשת מבודדת)
- צרו snapshot לפני שמתחילים - ככה אפשר לחזור למצב נקי אחרי הניתוח
- לעולם אל תריצו תוכנה חשודה על המכונה האמיתית שלכם
הקמת סביבת ניתוח¶
- התקינו VirtualBox או VMware
- צרו VM עם לינוקס (Ubuntu למשל)
- התקינו את הכלים שצריך (נפרט בהמשך)
- צרו snapshot של המצב הנקי
- הגדירו את הרשת ל-Host-Only או Internal Network (ללא גישה לאינטרנט)
כלים שכדאי להתקין מראש ב-VM:
ניתוח סטטי - static analysis¶
ניתוח סטטי הוא בדיקת הקובץ בלי להריץ אותו. זה הצעד הראשון והבטוח ביותר.
שלב 1 - זיהוי סוג הקובץ: file¶
הפלט יגיד לנו:
- האם זה ELF, PE (Windows), script, או משהו אחר?
- האם זה 32 או 64 ביט?
- האם הוא stripped?
- האם הוא statically linked או dynamically linked?
למשל:
שלב 2 - חילוץ מחרוזות: strings¶
הפקודה strings מחלצת את כל רצפי התווים הקריאים מתוך הקובץ. חפשו דברים מעניינים:
- כתובות URL או IP - http://, https://, כתובות IP כמו 192.168.x.x או 10.x.x.x
- שמות קבצים ונתיבים - /etc/passwd, /tmp/, .bashrc
- מפתחות רגיסטרי (ב-Windows)
- הודעות שגיאה - יכולות לחשוף ספריות ופונקציונליות
- שמות פונקציות - connect, socket, exec, crypt
- מחרוזות מקודדות - מחרוזות שנראות כמו Base64 או hex
אפשר גם לסנן:
strings suspicious_binary | grep -i "http"
strings suspicious_binary | grep -i "password"
strings suspicious_binary | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}"
שלב 3 - בדיקת מבנה הקובץ: readelf / objdump¶
readelf -h suspicious_binary # כותרת ה-ELF
readelf -S suspicious_binary # סקשנים
readelf -l suspicious_binary # סגמנטים
readelf -d suspicious_binary # דינמי - ספריות שהתוכנה תלויה בהן
readelf -s suspicious_binary # סימבולים (אם יש)
חפשו דברים חשודים:
- ספריות חריגות - ספריות שקשורות לרשת, הצפנה, או מניפולציה של תהליכים
- סקשנים עם שמות מוזרים - סקשנים שלא מופיעים בד"כ ב-ELF רגיל
- הרשאות חריגות - סקשן שהוא גם writable וגם executable (חשוד!)
בדקו את הייבואים (imports):
שלב 4 - ניתוח עמוק עם Ghidra¶
פתחו את הקובץ בגידרה, כמו שלמדנו בנושא הקודם. חפשו:
- קריאות לפונקציות רשת: socket, connect, send, recv, getaddrinfo
- פעולות קבצים: open, read, write, unlink (מחיקה)
- מניפולציה של תהליכים: fork, exec, ptrace, kill
- פונקציות הצפנה: EVP_, AES_, RSA_, או מימושים עצמיים של XOR/RC4
- טכניקות אנטי-ניתוח: ptrace(PTRACE_TRACEME), בדיקות זמן, בדיקות VM
ניתוח דינמי - dynamic analysis¶
ניתוח דינמי הוא הרצת התוכנה ומעקב אחרי ההתנהגות שלה. חשוב: רק בסביבה מבודדת!
שלב 1 - מעקב אחרי קריאות מערכת: strace¶
כמו שלמדנו, strace מראה את כל ה-syscall-ים שהתוכנה מבצעת. חפשו:
- פתיחת קבצים: open("/etc/passwd", ...) - למה התוכנה קוראת קבצי סיסמאות?
- חיבורי רשת: socket(AF_INET, ...), connect(...) - לאן התוכנה מתחברת?
- יצירת תהליכים: fork(), execve(...) - מה התוכנה מריצה?
- כתיבה לקבצים: write(...) - מה ולאן התוכנה כותבת?
- מחיקת קבצים: unlink(...) - התוכנה מוחקת את עקבותיה?
אפשר גם לשמור לקובץ לניתוח מאוחר יותר:
או לסנן syscall-ים ספציפיים:
strace -e trace=network ./suspicious_binary # רק syscall-ים של רשת
strace -e trace=file ./suspicious_binary # רק syscall-ים של קבצים
שלב 2 - מעקב אחרי קריאות ספרייה: ltrace¶
כמו שלמדנו, ltrace מראה קריאות לפונקציות libc. שימו לב ל:
- strcmp, strstr - השוואת מחרוזות (אולי בודק סיסמה?)
- system - מריץ פקודת shell (מסוכן!)
- dlopen, dlsym - טוען ספריות בזמן ריצה (מנסה להסתיר פונקציונליות)
שלב 3 - דיבוג עם GDB¶
השתמשו ב-GDB כמו שלמדנו כדי:
- לעצור בפונקציות מעניינות ולבדוק פרמטרים
- לעקוב אחרי הלוגיקה צעד אחר צעד
- לבדוק ערכי משתנים ומצב הזיכרון
שלב 4 - ניטור רשת: tcpdump / Wireshark¶
אחרי שהתוכנה רצה, בדקו את capture.pcap ב-Wireshark. חפשו:
- חיבורי TCP/UDP לכתובות לא מוכרות
- תעבורת DNS חשודה (למשל שאילתות DNS ארוכות מאוד - יכול להיות DNS tunneling)
- תעבורת HTTP לשרתי C2
שלב 5 - ניטור מערכת הקבצים: inotifywait¶
הפקודה inotifywait מדווחת על כל שינוי בקבצים בתיקיות שציינתם.
שלב 6 - ניטור תהליכים¶
או עם pstree לתצוגה היררכית:
התנהגויות נפוצות של תוכנות זדוניות¶
התמדה - persistence¶
תוכנות זדוניות רוצות לשרוד הפעלה מחדש. חפשו:
- שינוי קבצי אתחול: .bashrc, .profile, /etc/rc.local
- יצירת שירות systemd: קבצים ב-/etc/systemd/system/
- הוספה ל-crontab: משימות מתוזמנות
- שינוי של init scripts
תקשורת - command and control (C2)¶
תוכנות זדוניות מתקשרות עם שרת שליטה:
- חיבור TCP/UDP ישיר: מתחברות לכתובת IP או דומיין
- מנהור DNS - DNS tunneling: מקודדות נתונים בתוך שאילתות DNS
- תקשורת HTTP/HTTPS: מסתתרות בתוך תעבורת ווב רגילה
- תקשורת מוצפנת: משתמשות בהצפנה כדי להסתיר את התוכן
גניבת מידע - data exfiltration¶
- קריאת קבצים רגישים:
/etc/shadow, מפתחות SSH, קבצי תצורה - לכידת הקלדות - keylogging: מקליטות מה המשתמש מקליד
- צילומי מסך
- שליחת הנתונים לשרת חיצוני
הסלמת הרשאות - privilege escalation¶
- ניצול חולשות בקרנל לקבלת הרשאות root
- ניצול תוכנות SUID שלא מוגנות כראוי
- שינוי הרשאות קבצים
התחמקות - evasion¶
- זיהוי VM: בודקת אם רצה בתוך מכונה וירטואלית ומשנה התנהגות
- זיהוי דיבאגר: בודקת אם מישהו מנתח אותה (נדבר על זה בהרחבה בנושא 7.7)
- השהיה: ממתינה לפני שמתחילה לפעול (כדי לחמוק מsandbox-ים שרצים זמן קצר)
- אריזה והצפנה - packing: הקוד האמיתי מוסתר ונפרש רק בזמן ריצה
מזהי פשרה - Indicators of Compromise (IOC)¶
כשמנתחים תוכנה זדונית, מתעדים מזהי פשרה - סימנים שעוזרים לזהות את התוכנה הזדונית במערכות אחרות:
- גיבובים - hashes: MD5, SHA256 של הקובץ הזדוני
- כתובות IP ודומיינים: שרתי C2 שהתוכנה מתקשרת איתם
- נתיבי קבצים: קבצים שהתוכנה יוצרת או משנה
- שמות תהליכים: תהליכים שהתוכנה מריצה
- מפתחות רגיסטרי (ב-Windows)
- דפוסי רשת: תבניות תעבורה ייחודיות
חוקי YARA - זיהוי לפי דפוסים¶
YARA הוא כלי שמאפשר ליצור חוקים לזיהוי קבצים לפי דפוסים. במקום לחפש קובץ לפי hash (שמשתנה עם כל שינוי קטן), YARA מחפש דפוסים בתוך קבצים.
דוגמה בסיסית לחוק YARA:
rule SuspiciousBinary {
strings:
$url = "http://evil-server.com"
$cmd = "/bin/sh"
$func = "ptrace"
condition:
2 of them
}
החוק הזה מחפש קבצים שמכילים לפחות 2 מתוך 3 המחרוזות. YARA שימושי מאוד לזיהוי משפחות של תוכנות זדוניות ולסריקה אוטומטית.
דוח הניתוח - analysis report¶
כשמסיימים לנתח תוכנה זדונית, כותבים דוח שכולל:
- מידע בסיסי: שם הקובץ, גודל, hash-ים, סוג הקובץ
- ניתוח סטטי: מה מצאנו ב-strings, readelf, Ghidra
- ניתוח דינמי: מה התוכנה עשתה כשהרצנו אותה
- התנהגות: תיאור מפורט של מה התוכנה עושה (persistence, C2, exfiltration וכו')
- מזהי פשרה (IOC): רשימה של hash-ים, כתובות IP, דומיינים, נתיבי קבצים
- המלצות: איך להגן מפני התוכנה הזו
תהליך עבודה מסכם¶
הנה סדר עבודה מומלץ לניתוח:
- הכנה: הקימו VM מבודד, צרו snapshot
- זיהוי:
fileו-strings- מה זה בכלל? - מבנה:
readelf/objdump- מה המבנה? אילו ספריות? - ניתוח סטטי עמוק: פתחו בגידרה, נתחו את הפונקציות המרכזיות
- ניתוח דינמי: הריצו עם
strace,ltrace, נטרו רשת וקבצים - דיבוג: השתמשו ב-GDB לנקודות שצריכות הסבר נוסף
- תיעוד: כתבו דוח עם IOC-ים והמלצות
- שחזור: חזרו ל-snapshot הנקי
זכרו - כל הכלים שלמדנו בנושאים הקודמים (objdump, GDB, Ghidra) מתחברים יחד כאן. ניתוח סטטי עם גידרה נותן לנו את התמונה הגדולה, ניתוח דינמי עם strace ו-GDB נותן לנו את הפרטים.