SlideShare a Scribd company logo
1 of 11
Download to read offline
-
-7h3r3 15 n0 5p00n-
Linux kernel so injector
‫מקמל‬ ‫אדיר‬ ‫מאת‬
‫הקדמה‬
‫ומחקר‬ ‫בפיתוח‬ ‫בעיקר‬ ‫עסקתי‬ ‫האחרונות‬ ‫השנים‬ ‫בשלושת‬
low-level
.‫מודרניות‬ ‫הפעלה‬ ‫במערכות‬
‫יותר‬ ‫טוב‬ ‫להבין‬ ‫מנת‬ ‫על‬ ‫בלינוקס‬ ‫שלי‬ ‫הקרנלי‬ ‫הפיתוח‬ ‫יכולת‬ ‫את‬ ‫ולשפר‬ ‫ללמוד‬ ‫רציתי‬ ‫האחרונה‬ ‫בתקופה‬
.‫בקרנל‬ ‫השונים‬ ‫המנגנונים‬ ‫את‬ ‫להבין‬ ‫בשביל‬ ‫גם‬ ‫וכמובן‬ ‫החומרה‬ ‫עם‬ ‫התקשורת‬ ‫את‬
‫של‬ ‫הקרנל‬ ,‫כלומר‬ ‫פתוח‬ ‫קוד‬ ‫עם‬ ‫שבאה‬ ‫הפעלה‬ ‫מערכת‬ ‫זאת‬ ‫שלינוקס‬ ‫מכיוון‬ ‫בלינוקס‬ ‫דווקא‬ ‫בחרתי‬
‫וגם‬ ‫לינוקס‬
‫(ברמה‬ ‫מתועד‬ ‫גם‬ ‫ולרוב‬ ‫מפורסם‬ ‫שלהן‬ ‫מקור‬ ‫כשהקוד‬ ‫מגיעות‬ ‫השונות‬ ‫ההפצות‬ ‫של‬ ‫התוכנות‬
.)‫אחרת‬ ‫או‬ ‫כזו‬
.‫ולפתח‬ ‫לדבג‬ ,‫לקמפל‬ ‫נוח‬ ‫לי‬ ‫שהיה‬ ‫משלי‬ ‫סביבה‬ ‫להרים‬ ‫צריך‬ ‫הייתי‬ ‫בקרנל‬ ‫הפיתוח‬ ‫על‬ ‫להקל‬ ‫מנת‬ ‫על‬
‫בפרויקט‬ ‫השתמשתי‬
buildroot
‫וליצור‬ ‫שלי‬ ‫לצרכים‬ ‫מינימאלי‬ ‫קרנל‬ ‫לקמפל‬ ‫מנת‬ ‫על‬
rootfs
.‫מתאים‬
‫ב‬ ‫השתמשתי‬
-
VSCODE
‫לינק‬ ‫(יש‬ ‫הקרנל‬ ‫של‬ ‫מקור‬ ‫לקבצי‬ ‫אוטומטית‬ ‫השלמה‬ ‫וקנפגתי‬ ‫הפיתוח‬ ‫כסביבת‬
‫ל‬ ‫בסוף‬
-
repo
.)‫הסביבה‬ ‫של‬
‫אציג‬ ‫זה‬ ‫במאמר‬
PoC
‫מ‬ ‫משותפות‬ ‫ספריות‬ ‫להזרקת‬ ‫שעשיתי‬
-
kernel mode
‫ל‬
-
user mode
‫דרייבר‬ ‫ידי‬ ‫על‬
.‫שכתבתי‬
‫ה‬
-
PoC
‫גרסה‬ ‫קרנל‬ ‫על‬ ‫ונבדק‬ ‫פותח‬
:
4.91.19
‫ל‬ ‫בנוסף‬ .
‫ב‬ ‫תלות‬ ‫קיימת‬ ,‫כך‬
-
glibc
.‫בהמשך‬ ‫יורחב‬ ‫שעליה‬
‫כ‬ ‫מוגדר‬ ‫שהקוד‬ ‫להבהיר‬ ‫לי‬ ‫חשוב‬ ,‫שנמשיך‬ ‫לפני‬
-
PoC
‫אנחנו‬ .‫האפשריים‬ ‫הקצה‬ ‫מקרי‬ ‫בכל‬ ‫מטפל‬ ‫ואינו‬
‫ב‬ ‫חלקים‬ ‫מעט‬ ‫לא‬ ‫נראה‬
-
PoC
.‫באגים‬ ‫לפחות‬ ‫שתוביל‬ ‫בצורה‬ ‫ולהיכתב‬ ‫יותר‬ ‫טוב‬ ‫להיעשות‬ ‫יכולים‬ ‫שהיו‬
Linux kernel so injector
www.DigitalWhisper.co.il
‫גליון‬
124
,
‫דצמבר‬
2020
2
‫ומושגים‬ ‫הגדרות‬
‫על‬ ‫בקצרה‬ ‫נסביר‬ ‫זה‬ ‫בחלק‬
,‫קרנל‬
signals
‫ו‬
-
glibc
‫לדלג‬ ‫ממליץ‬ ‫אני‬ ‫האלו‬ ‫הנושאים‬ ‫את‬ ‫מכירים‬ ‫הנכם‬ ‫(אם‬
.)‫הבא‬ ‫לחלק‬
Kernel
‫הם‬ ‫העיקריים‬ ,‫קרנלים‬ ‫של‬ ‫סוגים‬ ‫כמה‬ ‫ישנם‬
:
microkernel
‫ו‬
-
monolithic kernel
‫הוא‬ ‫לינוקס‬ ‫של‬ ‫הקרנל‬ .
monolithic kernel
‫על‬ ‫רק‬ ‫נדון‬ ‫אנחנו‬ ‫והילך‬ ‫(מעתה‬
monolithic kernel
‫הוא‬ ‫הקרנל‬ .)
‫במערכת‬ ‫החלק‬
‫ב‬ ‫טיפול‬ ,‫זיכרון‬ ‫ניהול‬ ,‫תהליכים‬ ‫ניהול‬ ‫על‬ ‫שאחראי‬ ‫ההפעלה‬
-
syscalls
‫החומרה‬ ‫עם‬ ‫תקשורת‬ ‫וכמובן‬
‫של‬ ‫דינאמית‬ ‫בטעינה‬ ‫תומך‬ ‫הקרנל‬ ,‫הקרנלי‬ ‫הכתובות‬ ‫במרחב‬ ‫שרץ‬ ‫הקוד‬ ‫את‬ ‫לצמצם‬ ‫מנת‬ ‫על‬ .‫במחשב‬
‫בדריי‬ ‫אלא‬ ‫שלישי‬ ‫צד‬ ‫בדרייברים‬ ‫מדובר‬ ‫לא‬ .‫במחשב‬ ‫הקיימת‬ ‫לחומרה‬ ‫בהתאם‬ ‫דרייברים‬
‫של‬ ‫עצמם‬ ‫ברים‬
.)‫לתוכו‬ ‫מקומפלים‬ ‫שהדרייברים‬ ‫אחד‬ ‫כבינארי‬ ‫גם‬ ‫הקרנל‬ ‫את‬ ‫לקמפל‬ ‫(ניתן‬ ‫ההפעלה‬ ‫מערכת‬
‫כלומר‬ ,‫שלישי‬ ‫צד‬ ‫דרייברים‬ ‫להוסיף‬ ‫כלל‬ ‫בדרך‬ ‫ניתן‬ ,‫בהן‬ ‫להופיע‬ ‫יכול‬ ‫לינוקס‬ ‫של‬ ‫שהקרנל‬ ‫התצורות‬ ‫בשתי‬
‫חתימה‬ ‫נצטרך‬ ‫(לפעמים‬ ‫מפתח‬ ‫כל‬ ‫ידי‬ ‫על‬ ‫להיכתב‬ ‫שיכול‬ ‫בקרנל‬ ‫שירוץ‬ ‫אחר‬ ‫קוד‬ ‫קטע‬
‫מנת‬ ‫על‬ ‫דיגיטלית‬
.)‫זה‬ ‫במקרה‬ ‫נתעסק‬ ‫לא‬ ‫זה‬ ‫במאמר‬ ‫אך‬ ,‫דרייבר‬ ‫לטעון‬
Signals
‫הנשלחות‬ ‫הודעות‬ ‫הם‬ ‫סיגנלים‬ .‫מהן‬ ‫חלק‬ ‫הוא‬ ‫סיגנלים‬ ,‫תהליכים‬ ‫בין‬ ‫לתקשר‬ ‫דרכים‬ ‫כמה‬ ‫ישנן‬ ‫בלינוקס‬
‫דוגמה‬ .‫שהתרחש‬ ‫אירוע‬ ‫על‬ ‫לו‬ ‫להודיע‬ ‫כדי‬ ‫לתהליך‬ ‫נשלח‬ ‫סיגנל‬ ,‫ספציפי‬ ‫לתהליך‬ ‫מתהליך‬ ‫או‬ ‫מהקרנל‬
‫סיג‬ ‫למספר‬
‫נפוצים‬ ‫נלים‬
:
SIGSTOP, SIGKILL, SIGCONT
‫ו‬
-
SIGSEGV
.
‫לרשום‬ ‫יכול‬ ‫תהליך‬
callback
‫בעזרת‬ ‫לסיגנל‬
sigaction syscall
‫לרשום‬ ‫ניתן‬ .
callback
‫חוץ‬ ‫סיגנל‬ ‫לכל‬
‫מיוחדים‬ ‫משניים‬
:
SIGKILL
‫ו‬
-
SIGSTOP
‫ו‬ ‫לעצור‬ ‫ניתן‬ ,‫כלומר‬ .
-
‫מ‬ ‫(חוץ‬ ‫ההפעלה‬ ‫במערכת‬ ‫תהליך‬ ‫כל‬ "‫"להרוג‬
-
init
‫בכוונה‬ ‫או‬ ‫בטעות‬ ‫נשלח‬ ‫אם‬ ‫גם‬ "‫"להרוג‬ ‫ניתן‬ ‫לא‬ ‫שאותו‬
,SIGKILL
.)‫אליו‬ ‫הסיגנל‬ ‫את‬ ‫יעביר‬ ‫לא‬ ‫הקרנל‬
‫ב‬ ‫למצוא‬ ‫ניתן‬ ‫מידע‬ ‫עוד‬
-
man 7 signals
.
Glibc
‫כל‬
C compiler
‫הספרית‬ ‫את‬ ‫מממש‬
C
‫הקומפיילר‬ ,‫לדוגמה‬ .‫הסטנדרטית‬
MSVC
‫מממש‬ ,‫מיקרוסופט‬ ‫של‬
‫את‬
VCRUNTIME
‫ב‬ ‫מדובר‬ ‫שלנו‬ ‫במקרה‬ .
-
GCC
‫של‬
GNU
‫את‬ ‫שמממש‬
glibc
.
glibc
‫הספרית‬ ‫היא‬
C
‫ידי‬ ‫על‬ ‫שפותחה‬ ‫הסטנדרטית‬
GNU
‫ניהול‬ ,‫מחרוזות‬ ‫עם‬ ‫התעסקות‬ ,‫ופלט‬ ‫קלט‬ ‫עיבוד‬ ‫מספקת‬ ‫הספרייה‬ .
.‫מערכת‬ ‫לקריאות‬ ‫עטיפה‬ ‫חשוב‬ ‫והכי‬ ‫זיכרון‬
Linux kernel so injector
www.DigitalWhisper.co.il
‫גליון‬
124
,
‫דצמבר‬
2020
3
‫הספרייה‬ ‫הזרקת‬ ‫שלבי‬
‫נצטרך‬ ‫המשותפת‬ ‫הספרייה‬ ‫את‬ ‫להזריק‬ ‫מנת‬ ‫על‬
‫תהליך‬ ‫של‬ ‫מזהה‬
‫לספרייה‬ ‫הנתיב‬ ‫ואת‬
.
‫הספרייה‬ ‫הזרקת‬
‫הבאים‬ ‫לשלבים‬ ‫מתחלקת‬ ‫המשותפת‬
:
1
.
‫שליחת‬
SIGSTOP
.‫יעד‬ ‫לתהליך‬
2
.
‫ל‬ ‫פנוי‬ ‫מקום‬ ‫מציאת‬
-
shellcode
‫והרצה‬ ‫קריאה‬ ‫של‬ ‫הרשאות‬ ‫לה‬ ‫שיש‬ ‫כתובת‬ ‫(כל‬ ‫שלנו‬
R^X
.)
3
.
‫הספרייה‬ ‫מציאת‬
glibc
.‫יעד‬ ‫לתהליך‬ ‫טעונה‬ ‫אשר‬
4
.
‫פרסור‬
glibc elf
‫של‬ ‫הכתובת‬ ‫את‬ ‫למצוא‬ ‫מנת‬ ‫על‬ ‫ריצה‬ ‫בזמן‬
libc_dlopen_mode
.
5
.
‫אוגר‬ ‫השגת‬
rip
.‫היעד‬ ‫תהליך‬ ‫של‬
6
.
‫ה‬ ‫בניית‬
-
shellcode
‫של‬ ‫הנכונות‬ ‫הכתובות‬ ‫עם‬ ‫שלנו‬
:
a
.
.‫לטעון‬ ‫שנרצה‬ ‫המשותפת‬ ‫לספרייה‬ ‫הנתיב‬ ‫נכתב‬ ‫שאליה‬ ‫הכתובת‬
b
.
‫אוגר‬
rip
‫את‬ ‫שטען‬ ‫אחרי‬ ‫התהליך‬ ‫של‬ ‫הריצה‬ ‫את‬ ‫לשחזר‬ ‫שנוכל‬ ‫מנת‬ ‫על‬ ‫התהליך‬ ‫של‬
.‫שלנו‬ ‫הספרייה‬
c
.
‫של‬ ‫הכתובת‬
libc_dlopen_mode
.‫הספרייה‬ ‫את‬ ‫לטעון‬ ‫מנת‬ ‫על‬ ‫לקפוץ‬ ‫נרצה‬ ‫שאליה‬
7
.
.‫היעד‬ ‫תהליך‬ ‫של‬ ‫הכתובות‬ ‫למרחב‬ ‫המשותפת‬ ‫לספרייה‬ ‫הנתיב‬ ‫כתיבת‬
8
.
‫ה‬ ‫כתיבת‬
-
shellcode
.‫התהליך‬ ‫של‬ ‫הכתובות‬ ‫למרחב‬
9
.
‫אוגר‬ ‫שינוי‬
rip
‫ה‬ ‫של‬ ‫לכתובת‬ ‫שיצביע‬ ‫התהליך‬ ‫של‬
-
shellcode
.‫שלנו‬
11
.
‫שליחת‬
SIGCONT
.‫יעד‬ ‫לתהליך‬
‫שלבים‬
1-3
‫הפונקציה‬ ‫בעזרת‬ ‫הסיגנל‬ ‫את‬ ‫היעד‬ ‫לתהליך‬ ‫נשלח‬ ‫הראשון‬ ‫בשלב‬
send_sig
.
‫את‬ ‫נקרא‬ ,‫מכן‬ ‫לאחר‬
/proc/pid/maps
‫והרצה‬ ‫קריאה‬ ‫הרשאות‬ ‫עם‬ ‫שהוא‬ ‫בתהליך‬ ‫זיכרון‬ ‫למצוא‬ ‫מנת‬ ‫על‬
‫(מהקרנל‬
‫באותה‬ ‫נשתמש‬ ,‫כן‬ ‫כמו‬ .)‫כתיבה‬ ‫הרשאות‬ ‫בלי‬ ‫הדפים‬ ‫כאשר‬ ‫גם‬ ‫תהליכים‬ ‫של‬ ‫לדפים‬ ‫לכתוב‬ ‫ניתן‬
‫של‬ ‫הכתובת‬ ‫את‬ ‫למצוא‬ ‫כדי‬ ‫שיטה‬
glibc
.
‫ל‬ ‫עטיפה‬ ‫לדרייברים‬ ‫מייצא‬ ‫הקרנל‬ ,‫מקבצים‬ ‫ולכתוב‬ ‫לקרוא‬ ‫מנת‬ ‫על‬
-
VFS
,‫לכך‬ ‫בנוסף‬ .‫נשתמש‬ ‫שבה‬
‫ומצאתי‬ ‫תהליכים‬ ‫של‬ ‫מזיכרון‬ ‫ולכתוב‬ ‫לקרוא‬ ‫נוחה‬ ‫דרך‬ ‫חיפשתי‬
‫בפונקציה‬ ‫להשתמש‬ ‫יהיה‬ ‫נוח‬ ‫שהכי‬
Linux kernel so injector
www.DigitalWhisper.co.il
‫גליון‬
124
,
‫דצמבר‬
2020
4
mem_rw
‫מ‬
-
proc fs
‫שאני‬ ‫קוד‬ ‫או‬ ‫שונים‬ ‫בפורומים‬ ‫כתבו‬ ‫שאחרים‬ ‫קוד‬ ‫ולעומת‬ ‫תכליתה‬ ‫שזאת‬ ‫מפני‬
‫ב‬ ‫לבאגים‬ ‫הסיכוי‬ ‫אכתוב‬
-
mem_rw
‫ולשנות‬ ‫להעתיק‬ ‫נאלץ‬ ‫מיוצאת‬ ‫לא‬ ‫הזאת‬ ‫שהפונקציה‬ ‫בגלל‬ .‫יותר‬ ‫נמוך‬
‫עם‬ ‫שתעבוד‬ ‫מנת‬ ‫על‬ ‫אותה‬
buffers
‫הכתובות‬ ‫במרחב‬ ‫שנמצאים‬
.‫הקרנלי‬
‫שלב‬
4
( ‫למצוא‬ ‫נרצה‬ ‫כתובתה‬ ‫שאת‬ ‫הפונקציה‬ ‫של‬ ‫השם‬ ‫את‬ ‫לנו‬ ‫יש‬ ‫זה‬ ‫בשלב‬
libc_dlopen_mode
‫גם‬ ‫כן‬ ‫וכמו‬ )
‫של‬ ‫ההתחלה‬ ‫כתובת‬ ‫את‬
glibc
‫פרמטרים‬ ‫שני‬ ‫בעזרת‬ .
‫ה‬ ‫מבנה‬ ‫את‬ ‫לפרסר‬ ‫נוכל‬ ‫אלו‬
-
elf
‫של‬
glibc
‫טעון‬ ‫כשהוא‬
‫של‬ ‫הדינאמית‬ ‫הכתובת‬ ‫את‬ ‫ולמצוא‬ ‫בזיכרון‬
libc_dlopen_mode
.
‫של‬ ‫כללי‬ ‫תיאור‬ ‫לראות‬ ‫ניתן‬ ‫משמאל‬ ‫בתמונה‬
ELF
format
‫ה‬ ‫מתחיל‬ ‫הראשונה‬ ‫בכתובת‬ ‫התמונה‬ ‫לפי‬ ,
-
ELF
header
‫נמצא‬ ‫ממנו‬ ‫מסוים‬ ‫שבמיקום‬
Program header
table
‫ל‬ ‫להגיע‬ ‫ניתן‬ ‫ומשם‬
-
sections
.‫השונים‬
[
‫מקור‬
]
‫כך‬
ELF header
‫נראה‬
:
‫ה‬ ‫לכל‬ ‫נתייחס‬ ‫לא‬
-
,struct
‫שהוא‬ ‫אותנו‬ ‫שמעניין‬ ‫לשדה‬ ‫רק‬ ‫אלא‬
e_phoff
-
‫של‬ ‫המיקום‬
Program header
table
‫ה‬ ‫מתחילת‬
-
ELF header
.
Linux kernel so injector
www.DigitalWhisper.co.il
‫גליון‬
124
,
‫דצמבר‬
2020
5
Program header table
‫ה‬ ‫או‬ ‫שהמערכת‬ ‫מידע‬ ‫מכיל‬ ‫בו‬ ‫מבנה‬ ‫שכל‬ ‫מבנים‬ ‫של‬ ‫מערך‬ ‫הוא‬
-
loader
‫זקוקים‬
‫הוא‬ ‫אותנו‬ ‫שמעניין‬ ‫המבנה‬ .‫לריצה‬ ‫הספרייה‬ ‫או‬ ‫התהליך‬ ‫את‬ ‫להכין‬ ‫כדי‬ ‫לו‬
PT_DYNAMIC
‫(לפי‬
p_type
‫מחושב‬ ‫אשר‬ ‫דינאמי‬ ‫קישור‬ ‫של‬ ‫מידע‬ ‫מכילים‬ ‫אשר‬ ‫מבנים‬ ‫של‬ ‫מערך‬ ‫שמכיל‬ )‫זה‬ ‫מבנה‬ ‫איזה‬ ‫לדעת‬ ‫נוכל‬
‫ה‬ ‫טעינת‬ ‫בזמן‬
-
ELF
.
‫ה‬ ‫את‬ ‫למצוא‬ ‫מנת‬ ‫על‬
-
dynamic section
:
‫לפי‬
man 5 elf
:
Linux kernel so injector
www.DigitalWhisper.co.il
‫גליון‬
124
,
‫דצמבר‬
2020
6
‫ב‬ ‫הנמצאות‬ ‫הטבלאות‬ ‫מתוך‬
-
,dynamic section
‫הן‬ ‫אותנו‬ ‫שמעניינות‬ ‫הטבלאות‬ ‫שתי‬
:
DT_STRTAB
‫ו‬
-
.DT_SYMTAB
DT_SYMTAB
‫ו‬ ‫הסימבולים‬ ‫של‬ ‫הטבלה‬ ‫את‬ ‫מייצגת‬
-
DT_STRTAB
‫כל‬ ‫של‬ ‫השם‬ ‫של‬ ‫הטבלה‬ ‫את‬ ‫מייצגת‬
:‫בהתאמה‬ ‫סימבול‬
‫את‬ ‫צריכים‬ ‫אנחנו‬ ‫למה‬
libc_dlopen_mode
?
‫בספרייה‬ ‫להשתמש‬ ‫ניתן‬ ,‫ריצה‬ ‫בזמן‬ ‫משותפת‬ ‫ספרייה‬ ‫לטעון‬ ‫מנת‬ ‫על‬
dl
‫משתמש‬ ‫תהליך‬ ‫כל‬ ‫לא‬ ‫אך‬
,‫למזלנו‬ .‫בה‬ ‫להשתמש‬ ‫נוכל‬ ‫לא‬ ‫ולכן‬ ‫זו‬ ‫בספרייה‬
glibc
‫ההפצות‬ ‫ורוב‬ ‫שיש‬ ‫הנפוצות‬ ‫מהספריות‬ ‫היא‬
‫בספ‬ ‫להשתמש‬ ‫חייב‬ ‫תהליך‬ ‫כל‬ ‫לא‬ ,‫בה‬ ‫משתמשות‬ ‫הלינוקסיות‬
.‫זו‬ ‫רייה‬
libc_dlopen_mode
‫של‬ ‫המימוש‬ ‫היא‬
libc
‫ל‬
-
dlopen
‫דינאמית‬ ‫ספרייה‬ ‫לטעון‬ ‫מנת‬ ‫על‬ ‫משמשת‬ ‫אשר‬
.‫ריצה‬ ‫בזמן‬ ‫לתהליך‬
Linux kernel so injector
www.DigitalWhisper.co.il
‫גליון‬
124
,
‫דצמבר‬
2020
7
‫שלבים‬
5-9
‫הקוד‬
‫במהלך‬ ‫היה‬ ‫מזריקים‬ ‫שאליו‬ ‫התהליך‬ ‫אם‬ ‫בודקים‬ ,‫פשוט‬ ‫יחסית‬ ‫הבאה‬ ‫בתמונה‬ ‫המתואר‬
.syscall
‫ה‬ ‫את‬ ‫לבנות‬ ‫מנת‬ ‫על‬ ‫ממשיכים‬ ,‫מכן‬ ‫לאחר‬
-
shellcode
‫של‬ ‫הנתיב‬ ‫את‬ ‫כותבים‬ ,)‫לתוכו‬ ‫נצלול‬ ‫מעט‬ ‫(עוד‬
‫את‬ ‫כותבים‬ ,‫אלו‬ ‫שלבים‬ ‫לאחר‬ .‫לפני‬ ‫שמצאנו‬ ‫בכתובת‬ ‫התהליך‬ ‫של‬ ‫הכתובות‬ ‫למרחב‬ ‫המשותפת‬ ‫הספרייה‬
‫ה‬
-
shellcode
.‫התהליך‬ ‫של‬ ‫הכתובות‬ ‫למרחב‬ ‫עצמו‬
‫ל‬ ‫שצלול‬ ‫לפני‬
-
shellcode
‫ע‬ ‫נעצר‬ ‫כאשר‬ ‫להיות‬ ‫יכול‬ ‫תהליך‬ ‫שבהם‬ ‫השונים‬ ‫המצבים‬ ‫את‬ ‫להבין‬ ‫צריך‬
‫ידי‬ ‫ל‬
SIGSTOP
‫ידי‬ ‫על‬ ‫לרוץ‬ ‫וחוזר‬
SIGCONT
.
‫מ‬ ‫החזרה‬ ‫בזמן‬ ‫הקרנל‬ ‫ידי‬ ‫על‬ ‫נשלחים‬ ‫סיגנלים‬
-
kernel mode
‫ל‬
-
user mode
(
syscalls, context switch etc
.)
‫כאשר‬ ‫יעשה‬ ‫הקרנל‬ ‫מה‬ ‫השאלה‬ ‫נשאלת‬
SIGSTOP
‫דוגמה‬ .‫חסומה‬ ‫הייתה‬ ‫מערכת‬ ‫שקריאת‬ ‫בזמן‬ ‫נשלח‬
‫ביצע‬ ‫שלנו‬ ‫שתהליך‬ ‫בזמן‬ ,‫לכך‬
open
‫לקובץ‬
‫בו‬
-
‫אחר‬ ‫מתהליך‬ ‫או‬ ‫מהקרנל‬ ‫נשלח‬ ‫זמנית‬
SIGSTOP
‫לתהליך‬
‫ה‬ ‫ביצוע‬ ‫בזמן‬ ‫יעצור‬ ‫שלנו‬ ‫התהליך‬ ,‫כלומר‬ .‫שלנו‬
-
syscall
‫נשלח‬ ‫כאשר‬ ‫יקרה‬ ‫מה‬ ‫אך‬ .
SIGCONT
‫הרי‬
‫של‬ ‫ביצוע‬ ‫באמצע‬ ‫היה‬ ‫התהליך‬
.syscall
Linux kernel so injector
www.DigitalWhisper.co.il
‫גליון‬
124
,
‫דצמבר‬
2020
8
‫ה‬ ‫לסוג‬ ‫בהתאם‬ ‫והן‬ ‫לבחור‬ ‫יכול‬ ‫הקרנל‬ ‫שבהן‬ ‫אופציות‬ ‫שתי‬ ‫ישנן‬
-
syscall
‫בביצוע‬ ‫שהיה‬
:
1
.
‫אחרי‬
‫שה‬
-
signal handler
‫ה‬ ‫ששוב‬ ‫כך‬ ‫האוגרים‬ ‫את‬ ‫ישנה‬ ‫הקרנל‬ ‫יסתיים‬
-
syscall
.‫יתבצע‬
2
.
‫שגיאה‬ ‫ערך‬ ‫עם‬ ‫הקריאה‬ ‫את‬ ‫יכשיל‬ ‫הקרנל‬
EINTR
.
,‫ארכיטקטורה‬ ‫תלוי‬ ‫הוא‬ ‫סיגנלים‬ ‫של‬ ‫בביצוע‬ ‫שמטפל‬ ‫(הקוד‬ ‫בזה‬ ‫שמטפל‬ ‫בקרנל‬ ‫הקוד‬ ‫את‬ ‫נראה‬ ‫בואו‬
‫מ‬ ‫דוגמה‬ ‫להראות‬ ‫בחרתי‬
-
x86
:)
‫י‬ ‫הקרנל‬ ,‫הספרייה‬ ‫הזרקת‬ ‫בזמן‬
‫לפונקציה‬ ‫פעמיים‬ ‫גיע‬
handle_signal
‫כשנשלח‬ ‫אחת‬ ‫פעם‬ ,
SIGSTOP
‫כשנשלח‬ ‫אחת‬ ‫ופעם‬
SIGCONT
.
‫ב‬ ‫כשמדובר‬ ‫הראשונה‬ ‫הפעם‬ ‫עבור‬
-
SIGSTOP
‫במהלך‬ ‫היה‬ ‫הוא‬ ‫אם‬ ‫יבדוק‬ ‫הקרנל‬
syscall
‫בהתאם‬ ,‫כן‬ ‫אם‬ .
‫ה‬ ‫לסוג‬
-
syscall
‫ה‬ ‫של‬ ‫מחדש‬ ‫אתחול‬ ‫לבצע‬ ‫אם‬ ‫יבחר‬ ‫הקרנל‬
-
syscall
‫חיסור‬ ‫ידי‬ ‫על‬
rip
‫ב‬
-
2
‫של‬ ‫(הגודל‬
syscall opcode
‫להחזיר‬ ‫או‬ )
EINTR
‫שה‬ ‫לתהליך‬ ‫להחזיר‬ ‫כלומר‬
-
syscall
‫יגיע‬ ‫הקרנל‬ ‫השנייה‬ ‫בפעם‬ .‫בוטל‬
‫כשנשלח‬ ‫זו‬ ‫לפונקציה‬
SIGCONT
‫שנעצר‬ ‫לאחר‬ ‫שוב‬ ‫התהליך‬ ‫את‬ ‫להריץ‬ ‫מנת‬ ‫על‬
,
‫התהליך‬ ‫הזאת‬ ‫בפעם‬
‫באמצע‬ ‫היה‬ ‫לא‬ ‫בהכרח‬
syscall
‫ל‬ ‫יכנס‬ ‫לא‬ ‫הקרנל‬ ‫לכן‬
-
if
.‫הזה‬
Linux kernel so injector
www.DigitalWhisper.co.il
‫גליון‬
124
,
‫דצמבר‬
2020
9
‫אחרי‬ ,‫לכן‬
‫עצרנו‬ ‫שבו‬ ‫במצב‬ ‫להתחשב‬ ‫נצטרך‬ ‫אנחנו‬ ,‫התהליך‬ ‫את‬ ‫ועוצרים‬ ‫ההזרקה‬ ‫את‬ ‫מבצעים‬ ‫שאנחנו‬
‫ה‬ ‫ביצוע‬ ‫בזמן‬ ‫התהליך‬ ‫את‬
-
syscall
‫מעט‬ ‫לא‬ ‫ישנם‬ .
syscalls
‫ביצוע‬ ‫שלאחר‬
SIGSTOP
‫ואז‬
SIGCONT
‫לא‬
‫יחזיר‬ ‫והקרנל‬ ‫מחדש‬ ‫יאותחלו‬
,EINTR
‫המלאה‬ ‫הרשימה‬ ‫את‬ ‫לראות‬ ‫בשביל‬
man 7 signal
.
‫את‬ ‫לבנות‬ ‫מנת‬ ‫על‬
‫ה‬
-
shellcode
:‫פרמטרים‬ ‫שלושה‬ ‫נצטרך‬ ‫שלנו‬
1
.
‫של‬ ‫שמצאנו‬ ‫הפונקציה‬ ‫של‬ ‫הכתובת‬ ‫את‬
libc_dlopen_mode
.
2
.
.‫לטעון‬ ‫נרצה‬ ‫שאותה‬ ‫הדינאמית‬ ‫הספרייה‬ ‫של‬ ‫הנתיב‬ ‫את‬ ‫כתבנו‬ ‫שאליה‬ ‫הכתובת‬ ‫את‬
3
.
‫מנת‬ ‫ועל‬ ‫אותו‬ ‫כשעצרנו‬ ‫מסוימת‬ ‫בכתובת‬ ‫היה‬ ‫התהליך‬ ‫כלומר‬ ,‫לחזור‬ ‫נרצה‬ ‫שאליה‬ ‫הכתובת‬ ‫את‬
,‫למעלה‬ ‫שהזכרנו‬ ‫כפי‬ .‫זו‬ ‫לכתובת‬ ‫לחזור‬ ‫נצטרך‬ ‫לקרוס‬ ‫לו‬ ‫לגרום‬ ‫מבלי‬ ‫התהליך‬ ‫של‬ ‫הריצה‬ ‫את‬ ‫לשחזר‬
‫ביצוע‬ ‫בעת‬ ‫היה‬ ‫התהליך‬ ‫אם‬ ‫לבדוק‬ ‫נצטרך‬
syscall
‫שאליה‬ ‫יעד‬ ‫הכתובת‬ ‫את‬ ‫נחסיר‬ ‫כן‬ ‫ואם‬
‫ב‬ ‫לקפוץ‬ ‫נרצה‬
‫ה‬ ‫גודל‬
-
opcode
‫של‬
syscall
‫על‬
‫היינו‬ ‫אידיאלי‬ ‫(בעולם‬ ‫שוב‬ ‫שיתבצע‬ ‫מנת‬
‫שזה‬ ‫בודקים‬
syscall
‫ב‬ ‫שתומך‬
-
restart
‫בדיוק‬
‫את‬ ‫לשחזר‬ ‫מנת‬ ‫על‬ ‫מבצע‬ ‫שהקרנל‬ ‫כמו‬
.)‫הריצה‬
‫שאוגר‬ ‫מפני‬ ‫מושלם‬ ‫לא‬ ‫האוגרים‬ ‫של‬ ‫השחזור‬
r15
.‫משתחזר‬ ‫לא‬
‫להיות‬ ‫חייבת‬ ‫שהמחסנית‬ ‫לשכוח‬ ‫לא‬
aligned
‫ל‬
-
91
‫ל‬ ‫כשקוראים‬
-
mode_dlopen_libc
.
‫ה‬ ‫על‬ ‫מצטער‬
-
AT&T syntax
...
Linux kernel so injector
www.DigitalWhisper.co.il
‫גליון‬
124
,
‫דצמבר‬
2020
11
‫ה‬ ‫את‬ ‫שבנינו‬ ‫אחרי‬
-
shellcode
‫ה‬ ‫את‬ ‫נכתוב‬ ‫הנכונות‬ ‫הכתובות‬ ‫עם‬
-
shellcode
‫של‬ ‫הכתובות‬ ‫למרחב‬
( ‫המתאימות‬ ‫ההרשאות‬ ‫את‬ ‫לה‬ ‫שיש‬ ‫לפני‬ ‫שמצאנו‬ ‫בכתובת‬ ‫התהליך‬
R^X
.)
‫אוגר‬ ‫את‬ ‫לשנות‬ ‫נרצה‬ ,‫מכן‬ ‫לאחר‬
rip
‫ה‬ ‫של‬ ‫לכתובת‬ ‫שיצביע‬
-
shellcode
‫שבו‬ ‫במצב‬ ,‫לזכור‬ ‫חשוב‬ .‫שלנו‬
‫את‬ ‫נשנה‬
rip
‫ל‬ ‫להצביע‬
-
shellcode
‫ביצוע‬ ‫בזמן‬ ‫לעצר‬ ‫היה‬ ‫עלול‬ ‫שהתהליך‬ ‫בעובדה‬ ‫נתחשב‬ ‫לא‬ ‫אך‬ ‫שלנו‬
syscall
,
‫נשלח‬ ‫שכאשר‬ ‫מצב‬ ‫להיווצר‬ ‫יכול‬
SIGCONT
‫שאליה‬ ‫הכתובת‬ ‫את‬ ‫לשנות‬ ‫עלול‬ ‫הקרנל‬ ,‫לתהליך‬
‫באוגר‬ ‫ששמנו‬ ‫לכתובת‬ ‫התהליך‬ ‫יחזור‬
rip-2
‫למעלה‬ ‫שהוזכר‬ ‫(כמו‬
‫של‬ ‫הגודל‬ ‫פחות‬
syscall opcode
‫לכן‬ .)
‫מביצוע‬ ‫חזר‬ ‫התהליך‬ ‫אם‬ ‫בדיקה‬ ‫נעשית‬
syscall
‫את‬ ‫נעלה‬ ‫אז‬
rip
‫ב‬
-
2
‫ב‬ ‫יוריד‬ ‫הקרנל‬ ‫מכן‬ ‫ולאחר‬
-
2
‫ונגיע‬
‫ה‬ ‫של‬ ‫לכתובת‬ ‫בדיוק‬
-
shellcode
.
‫שלב‬
11
‫היעד‬ ‫לתהליך‬ ‫נשלח‬ ‫זה‬ ‫בשלב‬
SIGCONT
‫התהליך‬ ‫בהצלחה‬ ‫עברו‬ ‫השלבים‬ ‫כל‬ ‫(אם‬ ‫לרוץ‬ ‫שיחזור‬ ‫מנת‬ ‫על‬
‫מה‬ ‫לרוץ‬ ‫יחזור‬
-
shellcode
.‫לו‬ ‫להזריק‬ ‫שרצינו‬ ‫הדינאמית‬ ‫הספרייה‬ ‫את‬ ‫ולטעון‬ )
‫ידועות‬ ‫מגבלות‬
1
.
‫ב‬ ‫בקוד‬ ‫תמיכה‬ ‫אין‬ ‫כרגע‬
-
syscalls
‫להם‬ ‫להחזיר‬ ‫שחייב‬ ‫מהסוג‬
EINTR
‫ידי‬ ‫על‬ ‫נעצרים‬ ‫כאשר‬ ‫בחזרה‬
SIGSTOP
‫ב‬ ‫או‬ .
-
syscalls
‫בעזרת‬ ‫להיקרא‬ ‫צריכים‬ ‫שהיו‬
restart_syscall
‫על‬ ‫שנעצרו‬ ‫אחרי‬
SIGSTOP
‫אחרי‬ ‫לרוץ‬ ‫וחזרו‬
SIGCONT
.
2
.
‫לארכיטקטורת‬ ‫רק‬ ‫מימוש‬ ‫קיים‬ ‫כרגע‬
x86_64
.
3
.
‫כ‬ ‫מוגדר‬ ‫הקוד‬
-
PoC
‫באגים‬ ‫ולכן‬ ‫בדיקות‬ ‫מספיק‬ ‫עבר‬ ‫ולא‬ ‫בשגיאות‬ ‫נכון‬ ‫מספיק‬ ‫טיפול‬ ‫עם‬ ‫נכתב‬ ‫ולא‬
.‫מסוימים‬ ‫קצה‬ ‫במקרי‬ ‫לקרות‬ ‫יכולים‬
4
.
‫ה‬
-
shellcode
‫ה‬ ‫והרצת‬ ‫לתהליך‬ ‫הכתיבה‬ ‫לאחר‬ ,‫כלומר‬ .‫מתנקים‬ ‫אינם‬ ‫הדינאמית‬ ‫לספרייה‬ ‫והנתיב‬
-
shellcode
‫לא‬ .‫בשימוש‬ ‫לא‬ ‫הוא‬ ‫אם‬ ‫גם‬ ‫לפני‬ ‫שם‬ ‫שהיה‬ ‫המידע‬ ‫את‬ ‫לשחזר‬ ‫הוא‬ ‫לעשות‬ ‫הנכון‬ ‫הדבר‬
‫ב‬ ‫זה‬ ‫את‬ ‫לממש‬ ‫זמן‬ ‫מספיק‬ ‫לי‬ ‫היה‬
-
kernel thread
‫יש‬ ‫אבל‬ ‫נפרד‬
commit
‫שעושה‬
‫ה‬ ‫באותו‬ ‫זה‬ ‫את‬
-
thread
‫בחרתי‬ .
‫ה‬ ‫את‬ ‫להוריד‬
-
commit
‫ב‬ ‫הזה‬
-
branch
"‫"יתקע‬ ‫הוא‬ ‫אחד‬ ‫מעבד‬ ‫שתחת‬ ‫בגלל‬ ‫הראשי‬
.‫המחשב‬ ‫את‬ ‫כלומר‬ ‫הקרנל‬ ‫את‬
5
.
‫אוגר‬
r15
.‫משתחזר‬ ‫לא‬
.‫פתירות‬ ‫הינן‬ ‫מעל‬ ‫שצוינו‬ ‫המגבלות‬ ‫שכל‬ ‫לציין‬ ‫חשוב‬
Linux kernel so injector
www.DigitalWhisper.co.il
‫גליון‬
124
,
‫דצמבר‬
2020
11
‫סיכום‬
‫בעזרת‬ ‫פרסרנו‬ ,‫שבחרנו‬ ‫מסוים‬ ‫תהליך‬ ‫עצרנו‬ ?‫עשינו‬ ‫מה‬ ‫אז‬
/proc/pid/maps
‫זיכרון‬ ‫יש‬ ‫בתהליך‬ ‫היכן‬
R^X
‫הספרייה‬ ‫של‬ ‫הכתובת‬ ‫מה‬ ‫וגם‬
glibc
.‫התהליך‬ ‫אל‬ ‫שנטענה‬
‫את‬ ‫פרסרנו‬ ,‫מכן‬ ‫לאחר‬
glibc
‫של‬ ‫הפורמט‬ ‫את‬ ‫כלומר‬ ‫בזיכרון‬
elf
‫הפונקציה‬ ‫את‬ ‫למצוא‬ ‫מנת‬ ‫על‬ ,
/
‫סימבול‬
libc_dlopen_mode
.
‫ה‬ ‫את‬ ‫לבנות‬ ‫התחלנו‬
-
shellcode
‫ידי‬ ‫על‬ ‫המשותפת‬ ‫הספרייה‬ ‫את‬ ‫יטען‬ ‫שבהמשך‬ ‫שלנו‬
‫ל‬ ‫שיקרא‬ ‫כך‬
-
libc_dlopen_mode
‫שה‬ ‫מה‬ ‫כל‬ .
-
shellcode
‫זה‬ ‫צריך‬ ‫שלנו‬
:
‫לספרייה‬ ‫הנתיב‬ ‫את‬ ‫נכתוב‬ ‫שאליה‬ ‫הכתובת‬
‫כלומר‬ ‫הספרייה‬ ‫את‬ ‫לטעון‬ ‫מנת‬ ‫על‬ ‫נקפוץ‬ ‫אליה‬ ‫הכתובת‬ ,‫לטעון‬ ‫שנרצה‬ ‫הדינאמית‬
libc_dlopen_mode
.‫התהליך‬ ‫של‬ ‫הריצה‬ ‫את‬ ‫לשחזר‬ ‫מנת‬ ‫על‬ ‫נחזור‬ ‫שאליה‬ ‫והכתובת‬
‫א‬ ‫כתבנו‬ ,‫מכן‬ ‫לאחר‬
‫ה‬ ‫ואת‬ ‫הדינאמית‬ ‫לספרייה‬ ‫הנתיב‬ ‫את‬ ‫שמייצגת‬ ‫המחרוזת‬ ‫ת‬
-
shellcode
‫למרחב‬ ‫עצמו‬
.‫התהליך‬ ‫של‬ ‫הכתובות‬
‫אוגר‬ ‫את‬ ‫שינינו‬
rip
‫ה‬ ‫את‬ ‫כתבנו‬ ‫שאליה‬ ‫לכתובת‬ ‫שיצביע‬ ‫התהליך‬ ‫של‬
-
shellcode
‫לתהליך‬ ‫שלחנו‬ ‫ולבסוף‬
SIGCONT
‫מה‬ ‫לרוץ‬ ‫שיחזור‬ ‫מנת‬ ‫על‬
-
shellcode
.‫שלנו‬

‫ה‬
-
repo
‫הפרויקט‬ ‫של‬
:
injector
-
so
-
kernel
-
com/Rhydon1337/linux
.
https://github

‫ה‬
-
repo
‫הסביבה‬ ‫של‬
:
development
-
kernel
-
com/Rhydon1337/linux
.
https://github
‫המחבר‬ ‫על‬

( ‫מקמל‬ ‫אדיר‬
Rhydon1337
)
,
22
‫ומפתח‬ ‫מידע‬ ‫אבטחת‬ ‫חוקר‬ ,
.
o
‫אימייל‬
:
com
.
adirmak1@gmail
o
:GitHub
com/Rhydon1337
.
https://github

More Related Content

Similar to Dw124 3-kernel so-injector

C# .net lecture 1 in Hebrew
C# .net lecture 1 in HebrewC# .net lecture 1 in Hebrew
C# .net lecture 1 in HebrewDoron Raifman
 
דרופל מדריך התקנה
דרופל   מדריך התקנהדרופל   מדריך התקנה
דרופל מדריך התקנהkaplanlior
 
שיעור 1 - מדעי המחשב כיתה ח עורך פייתון וקלט פלט רותם מלכי 28.5.pptx
שיעור 1 - מדעי המחשב כיתה ח עורך פייתון וקלט פלט רותם מלכי 28.5.pptxשיעור 1 - מדעי המחשב כיתה ח עורך פייתון וקלט פלט רותם מלכי 28.5.pptx
שיעור 1 - מדעי המחשב כיתה ח עורך פייתון וקלט פלט רותם מלכי 28.5.pptxssuser12810c
 
קורס אנדרואיד
קורס אנדרואידקורס אנדרואיד
קורס אנדרואידNathan Krasney
 
Miss1 tomer fonia_ppt
Miss1 tomer fonia_pptMiss1 tomer fonia_ppt
Miss1 tomer fonia_pptTMFTMFTMF1
 
אבטחת מערכות על Novell
אבטחת מערכות על Novellאבטחת מערכות על Novell
אבטחת מערכות על Novellguest0573a5
 
מושגים בסיסיים
 מושגים בסיסיים מושגים בסיסיים
מושגים בסיסייםBattGirl De
 
Stack overflow - by avi halif
Stack overflow - by avi halifStack overflow - by avi halif
Stack overflow - by avi halifAviHalif
 
הכרת המחשב האישי מצויין
הכרת המחשב האישי   מצוייןהכרת המחשב האישי   מצויין
הכרת המחשב האישי מצוייןhaimkarel
 
ושימושים חשובים בתוכנה Plugin
ושימושים חשובים בתוכנה Pluginושימושים חשובים בתוכנה Plugin
ושימושים חשובים בתוכנה PluginNitzan Matan
 
Developing mobile apps using Xamarin (Hebrew)
Developing mobile apps using Xamarin (Hebrew)Developing mobile apps using Xamarin (Hebrew)
Developing mobile apps using Xamarin (Hebrew)Tsahi Asher
 
6 sql explorer - powershell dba
6   sql explorer - powershell dba6   sql explorer - powershell dba
6 sql explorer - powershell dbasqlserver.co.il
 
C# .net home work1 mycode overview
C# .net home work1 mycode overviewC# .net home work1 mycode overview
C# .net home work1 mycode overviewDoron Raifman
 

Similar to Dw124 3-kernel so-injector (19)

C# .net lecture 1 in Hebrew
C# .net lecture 1 in HebrewC# .net lecture 1 in Hebrew
C# .net lecture 1 in Hebrew
 
דרופל מדריך התקנה
דרופל   מדריך התקנהדרופל   מדריך התקנה
דרופל מדריך התקנה
 
שיעור 1 - מדעי המחשב כיתה ח עורך פייתון וקלט פלט רותם מלכי 28.5.pptx
שיעור 1 - מדעי המחשב כיתה ח עורך פייתון וקלט פלט רותם מלכי 28.5.pptxשיעור 1 - מדעי המחשב כיתה ח עורך פייתון וקלט פלט רותם מלכי 28.5.pptx
שיעור 1 - מדעי המחשב כיתה ח עורך פייתון וקלט פלט רותם מלכי 28.5.pptx
 
קורס אנדרואיד
קורס אנדרואידקורס אנדרואיד
קורס אנדרואיד
 
Miss1 tomer fonia_ppt
Miss1 tomer fonia_pptMiss1 tomer fonia_ppt
Miss1 tomer fonia_ppt
 
אבטחת מערכות על Novell
אבטחת מערכות על Novellאבטחת מערכות על Novell
אבטחת מערכות על Novell
 
מושגים בסיסיים
 מושגים בסיסיים מושגים בסיסיים
מושגים בסיסיים
 
Jpeg encoder
Jpeg encoderJpeg encoder
Jpeg encoder
 
Stack overflow - by avi halif
Stack overflow - by avi halifStack overflow - by avi halif
Stack overflow - by avi halif
 
Container
ContainerContainer
Container
 
הכרת המחשב האישי מצויין
הכרת המחשב האישי   מצוייןהכרת המחשב האישי   מצויין
הכרת המחשב האישי מצויין
 
DLL מדריך לעבודה עם
DLL מדריך לעבודה עםDLL מדריך לעבודה עם
DLL מדריך לעבודה עם
 
Selenium WebDriver
Selenium WebDriverSelenium WebDriver
Selenium WebDriver
 
ושימושים חשובים בתוכנה Plugin
ושימושים חשובים בתוכנה Pluginושימושים חשובים בתוכנה Plugin
ושימושים חשובים בתוכנה Plugin
 
Developing mobile apps using Xamarin (Hebrew)
Developing mobile apps using Xamarin (Hebrew)Developing mobile apps using Xamarin (Hebrew)
Developing mobile apps using Xamarin (Hebrew)
 
6 sql explorer - powershell dba
6   sql explorer - powershell dba6   sql explorer - powershell dba
6 sql explorer - powershell dba
 
C# .net home work1 mycode overview
C# .net home work1 mycode overviewC# .net home work1 mycode overview
C# .net home work1 mycode overview
 
react-he.pdf
react-he.pdfreact-he.pdf
react-he.pdf
 
SAPUI5 on SAP Web IDE
SAPUI5 on SAP Web IDESAPUI5 on SAP Web IDE
SAPUI5 on SAP Web IDE
 

Dw124 3-kernel so-injector

  • 1. - -7h3r3 15 n0 5p00n- Linux kernel so injector ‫מקמל‬ ‫אדיר‬ ‫מאת‬ ‫הקדמה‬ ‫ומחקר‬ ‫בפיתוח‬ ‫בעיקר‬ ‫עסקתי‬ ‫האחרונות‬ ‫השנים‬ ‫בשלושת‬ low-level .‫מודרניות‬ ‫הפעלה‬ ‫במערכות‬ ‫יותר‬ ‫טוב‬ ‫להבין‬ ‫מנת‬ ‫על‬ ‫בלינוקס‬ ‫שלי‬ ‫הקרנלי‬ ‫הפיתוח‬ ‫יכולת‬ ‫את‬ ‫ולשפר‬ ‫ללמוד‬ ‫רציתי‬ ‫האחרונה‬ ‫בתקופה‬ .‫בקרנל‬ ‫השונים‬ ‫המנגנונים‬ ‫את‬ ‫להבין‬ ‫בשביל‬ ‫גם‬ ‫וכמובן‬ ‫החומרה‬ ‫עם‬ ‫התקשורת‬ ‫את‬ ‫של‬ ‫הקרנל‬ ,‫כלומר‬ ‫פתוח‬ ‫קוד‬ ‫עם‬ ‫שבאה‬ ‫הפעלה‬ ‫מערכת‬ ‫זאת‬ ‫שלינוקס‬ ‫מכיוון‬ ‫בלינוקס‬ ‫דווקא‬ ‫בחרתי‬ ‫וגם‬ ‫לינוקס‬ ‫(ברמה‬ ‫מתועד‬ ‫גם‬ ‫ולרוב‬ ‫מפורסם‬ ‫שלהן‬ ‫מקור‬ ‫כשהקוד‬ ‫מגיעות‬ ‫השונות‬ ‫ההפצות‬ ‫של‬ ‫התוכנות‬ .)‫אחרת‬ ‫או‬ ‫כזו‬ .‫ולפתח‬ ‫לדבג‬ ,‫לקמפל‬ ‫נוח‬ ‫לי‬ ‫שהיה‬ ‫משלי‬ ‫סביבה‬ ‫להרים‬ ‫צריך‬ ‫הייתי‬ ‫בקרנל‬ ‫הפיתוח‬ ‫על‬ ‫להקל‬ ‫מנת‬ ‫על‬ ‫בפרויקט‬ ‫השתמשתי‬ buildroot ‫וליצור‬ ‫שלי‬ ‫לצרכים‬ ‫מינימאלי‬ ‫קרנל‬ ‫לקמפל‬ ‫מנת‬ ‫על‬ rootfs .‫מתאים‬ ‫ב‬ ‫השתמשתי‬ - VSCODE ‫לינק‬ ‫(יש‬ ‫הקרנל‬ ‫של‬ ‫מקור‬ ‫לקבצי‬ ‫אוטומטית‬ ‫השלמה‬ ‫וקנפגתי‬ ‫הפיתוח‬ ‫כסביבת‬ ‫ל‬ ‫בסוף‬ - repo .)‫הסביבה‬ ‫של‬ ‫אציג‬ ‫זה‬ ‫במאמר‬ PoC ‫מ‬ ‫משותפות‬ ‫ספריות‬ ‫להזרקת‬ ‫שעשיתי‬ - kernel mode ‫ל‬ - user mode ‫דרייבר‬ ‫ידי‬ ‫על‬ .‫שכתבתי‬ ‫ה‬ - PoC ‫גרסה‬ ‫קרנל‬ ‫על‬ ‫ונבדק‬ ‫פותח‬ : 4.91.19 ‫ל‬ ‫בנוסף‬ . ‫ב‬ ‫תלות‬ ‫קיימת‬ ,‫כך‬ - glibc .‫בהמשך‬ ‫יורחב‬ ‫שעליה‬ ‫כ‬ ‫מוגדר‬ ‫שהקוד‬ ‫להבהיר‬ ‫לי‬ ‫חשוב‬ ,‫שנמשיך‬ ‫לפני‬ - PoC ‫אנחנו‬ .‫האפשריים‬ ‫הקצה‬ ‫מקרי‬ ‫בכל‬ ‫מטפל‬ ‫ואינו‬ ‫ב‬ ‫חלקים‬ ‫מעט‬ ‫לא‬ ‫נראה‬ - PoC .‫באגים‬ ‫לפחות‬ ‫שתוביל‬ ‫בצורה‬ ‫ולהיכתב‬ ‫יותר‬ ‫טוב‬ ‫להיעשות‬ ‫יכולים‬ ‫שהיו‬
  • 2. Linux kernel so injector www.DigitalWhisper.co.il ‫גליון‬ 124 , ‫דצמבר‬ 2020 2 ‫ומושגים‬ ‫הגדרות‬ ‫על‬ ‫בקצרה‬ ‫נסביר‬ ‫זה‬ ‫בחלק‬ ,‫קרנל‬ signals ‫ו‬ - glibc ‫לדלג‬ ‫ממליץ‬ ‫אני‬ ‫האלו‬ ‫הנושאים‬ ‫את‬ ‫מכירים‬ ‫הנכם‬ ‫(אם‬ .)‫הבא‬ ‫לחלק‬ Kernel ‫הם‬ ‫העיקריים‬ ,‫קרנלים‬ ‫של‬ ‫סוגים‬ ‫כמה‬ ‫ישנם‬ : microkernel ‫ו‬ - monolithic kernel ‫הוא‬ ‫לינוקס‬ ‫של‬ ‫הקרנל‬ . monolithic kernel ‫על‬ ‫רק‬ ‫נדון‬ ‫אנחנו‬ ‫והילך‬ ‫(מעתה‬ monolithic kernel ‫הוא‬ ‫הקרנל‬ .) ‫במערכת‬ ‫החלק‬ ‫ב‬ ‫טיפול‬ ,‫זיכרון‬ ‫ניהול‬ ,‫תהליכים‬ ‫ניהול‬ ‫על‬ ‫שאחראי‬ ‫ההפעלה‬ - syscalls ‫החומרה‬ ‫עם‬ ‫תקשורת‬ ‫וכמובן‬ ‫של‬ ‫דינאמית‬ ‫בטעינה‬ ‫תומך‬ ‫הקרנל‬ ,‫הקרנלי‬ ‫הכתובות‬ ‫במרחב‬ ‫שרץ‬ ‫הקוד‬ ‫את‬ ‫לצמצם‬ ‫מנת‬ ‫על‬ .‫במחשב‬ ‫בדריי‬ ‫אלא‬ ‫שלישי‬ ‫צד‬ ‫בדרייברים‬ ‫מדובר‬ ‫לא‬ .‫במחשב‬ ‫הקיימת‬ ‫לחומרה‬ ‫בהתאם‬ ‫דרייברים‬ ‫של‬ ‫עצמם‬ ‫ברים‬ .)‫לתוכו‬ ‫מקומפלים‬ ‫שהדרייברים‬ ‫אחד‬ ‫כבינארי‬ ‫גם‬ ‫הקרנל‬ ‫את‬ ‫לקמפל‬ ‫(ניתן‬ ‫ההפעלה‬ ‫מערכת‬ ‫כלומר‬ ,‫שלישי‬ ‫צד‬ ‫דרייברים‬ ‫להוסיף‬ ‫כלל‬ ‫בדרך‬ ‫ניתן‬ ,‫בהן‬ ‫להופיע‬ ‫יכול‬ ‫לינוקס‬ ‫של‬ ‫שהקרנל‬ ‫התצורות‬ ‫בשתי‬ ‫חתימה‬ ‫נצטרך‬ ‫(לפעמים‬ ‫מפתח‬ ‫כל‬ ‫ידי‬ ‫על‬ ‫להיכתב‬ ‫שיכול‬ ‫בקרנל‬ ‫שירוץ‬ ‫אחר‬ ‫קוד‬ ‫קטע‬ ‫מנת‬ ‫על‬ ‫דיגיטלית‬ .)‫זה‬ ‫במקרה‬ ‫נתעסק‬ ‫לא‬ ‫זה‬ ‫במאמר‬ ‫אך‬ ,‫דרייבר‬ ‫לטעון‬ Signals ‫הנשלחות‬ ‫הודעות‬ ‫הם‬ ‫סיגנלים‬ .‫מהן‬ ‫חלק‬ ‫הוא‬ ‫סיגנלים‬ ,‫תהליכים‬ ‫בין‬ ‫לתקשר‬ ‫דרכים‬ ‫כמה‬ ‫ישנן‬ ‫בלינוקס‬ ‫דוגמה‬ .‫שהתרחש‬ ‫אירוע‬ ‫על‬ ‫לו‬ ‫להודיע‬ ‫כדי‬ ‫לתהליך‬ ‫נשלח‬ ‫סיגנל‬ ,‫ספציפי‬ ‫לתהליך‬ ‫מתהליך‬ ‫או‬ ‫מהקרנל‬ ‫סיג‬ ‫למספר‬ ‫נפוצים‬ ‫נלים‬ : SIGSTOP, SIGKILL, SIGCONT ‫ו‬ - SIGSEGV . ‫לרשום‬ ‫יכול‬ ‫תהליך‬ callback ‫בעזרת‬ ‫לסיגנל‬ sigaction syscall ‫לרשום‬ ‫ניתן‬ . callback ‫חוץ‬ ‫סיגנל‬ ‫לכל‬ ‫מיוחדים‬ ‫משניים‬ : SIGKILL ‫ו‬ - SIGSTOP ‫ו‬ ‫לעצור‬ ‫ניתן‬ ,‫כלומר‬ . - ‫מ‬ ‫(חוץ‬ ‫ההפעלה‬ ‫במערכת‬ ‫תהליך‬ ‫כל‬ "‫"להרוג‬ - init ‫בכוונה‬ ‫או‬ ‫בטעות‬ ‫נשלח‬ ‫אם‬ ‫גם‬ "‫"להרוג‬ ‫ניתן‬ ‫לא‬ ‫שאותו‬ ,SIGKILL .)‫אליו‬ ‫הסיגנל‬ ‫את‬ ‫יעביר‬ ‫לא‬ ‫הקרנל‬ ‫ב‬ ‫למצוא‬ ‫ניתן‬ ‫מידע‬ ‫עוד‬ - man 7 signals . Glibc ‫כל‬ C compiler ‫הספרית‬ ‫את‬ ‫מממש‬ C ‫הקומפיילר‬ ,‫לדוגמה‬ .‫הסטנדרטית‬ MSVC ‫מממש‬ ,‫מיקרוסופט‬ ‫של‬ ‫את‬ VCRUNTIME ‫ב‬ ‫מדובר‬ ‫שלנו‬ ‫במקרה‬ . - GCC ‫של‬ GNU ‫את‬ ‫שמממש‬ glibc . glibc ‫הספרית‬ ‫היא‬ C ‫ידי‬ ‫על‬ ‫שפותחה‬ ‫הסטנדרטית‬ GNU ‫ניהול‬ ,‫מחרוזות‬ ‫עם‬ ‫התעסקות‬ ,‫ופלט‬ ‫קלט‬ ‫עיבוד‬ ‫מספקת‬ ‫הספרייה‬ . .‫מערכת‬ ‫לקריאות‬ ‫עטיפה‬ ‫חשוב‬ ‫והכי‬ ‫זיכרון‬
  • 3. Linux kernel so injector www.DigitalWhisper.co.il ‫גליון‬ 124 , ‫דצמבר‬ 2020 3 ‫הספרייה‬ ‫הזרקת‬ ‫שלבי‬ ‫נצטרך‬ ‫המשותפת‬ ‫הספרייה‬ ‫את‬ ‫להזריק‬ ‫מנת‬ ‫על‬ ‫תהליך‬ ‫של‬ ‫מזהה‬ ‫לספרייה‬ ‫הנתיב‬ ‫ואת‬ . ‫הספרייה‬ ‫הזרקת‬ ‫הבאים‬ ‫לשלבים‬ ‫מתחלקת‬ ‫המשותפת‬ : 1 . ‫שליחת‬ SIGSTOP .‫יעד‬ ‫לתהליך‬ 2 . ‫ל‬ ‫פנוי‬ ‫מקום‬ ‫מציאת‬ - shellcode ‫והרצה‬ ‫קריאה‬ ‫של‬ ‫הרשאות‬ ‫לה‬ ‫שיש‬ ‫כתובת‬ ‫(כל‬ ‫שלנו‬ R^X .) 3 . ‫הספרייה‬ ‫מציאת‬ glibc .‫יעד‬ ‫לתהליך‬ ‫טעונה‬ ‫אשר‬ 4 . ‫פרסור‬ glibc elf ‫של‬ ‫הכתובת‬ ‫את‬ ‫למצוא‬ ‫מנת‬ ‫על‬ ‫ריצה‬ ‫בזמן‬ libc_dlopen_mode . 5 . ‫אוגר‬ ‫השגת‬ rip .‫היעד‬ ‫תהליך‬ ‫של‬ 6 . ‫ה‬ ‫בניית‬ - shellcode ‫של‬ ‫הנכונות‬ ‫הכתובות‬ ‫עם‬ ‫שלנו‬ : a . .‫לטעון‬ ‫שנרצה‬ ‫המשותפת‬ ‫לספרייה‬ ‫הנתיב‬ ‫נכתב‬ ‫שאליה‬ ‫הכתובת‬ b . ‫אוגר‬ rip ‫את‬ ‫שטען‬ ‫אחרי‬ ‫התהליך‬ ‫של‬ ‫הריצה‬ ‫את‬ ‫לשחזר‬ ‫שנוכל‬ ‫מנת‬ ‫על‬ ‫התהליך‬ ‫של‬ .‫שלנו‬ ‫הספרייה‬ c . ‫של‬ ‫הכתובת‬ libc_dlopen_mode .‫הספרייה‬ ‫את‬ ‫לטעון‬ ‫מנת‬ ‫על‬ ‫לקפוץ‬ ‫נרצה‬ ‫שאליה‬ 7 . .‫היעד‬ ‫תהליך‬ ‫של‬ ‫הכתובות‬ ‫למרחב‬ ‫המשותפת‬ ‫לספרייה‬ ‫הנתיב‬ ‫כתיבת‬ 8 . ‫ה‬ ‫כתיבת‬ - shellcode .‫התהליך‬ ‫של‬ ‫הכתובות‬ ‫למרחב‬ 9 . ‫אוגר‬ ‫שינוי‬ rip ‫ה‬ ‫של‬ ‫לכתובת‬ ‫שיצביע‬ ‫התהליך‬ ‫של‬ - shellcode .‫שלנו‬ 11 . ‫שליחת‬ SIGCONT .‫יעד‬ ‫לתהליך‬ ‫שלבים‬ 1-3 ‫הפונקציה‬ ‫בעזרת‬ ‫הסיגנל‬ ‫את‬ ‫היעד‬ ‫לתהליך‬ ‫נשלח‬ ‫הראשון‬ ‫בשלב‬ send_sig . ‫את‬ ‫נקרא‬ ,‫מכן‬ ‫לאחר‬ /proc/pid/maps ‫והרצה‬ ‫קריאה‬ ‫הרשאות‬ ‫עם‬ ‫שהוא‬ ‫בתהליך‬ ‫זיכרון‬ ‫למצוא‬ ‫מנת‬ ‫על‬ ‫(מהקרנל‬ ‫באותה‬ ‫נשתמש‬ ,‫כן‬ ‫כמו‬ .)‫כתיבה‬ ‫הרשאות‬ ‫בלי‬ ‫הדפים‬ ‫כאשר‬ ‫גם‬ ‫תהליכים‬ ‫של‬ ‫לדפים‬ ‫לכתוב‬ ‫ניתן‬ ‫של‬ ‫הכתובת‬ ‫את‬ ‫למצוא‬ ‫כדי‬ ‫שיטה‬ glibc . ‫ל‬ ‫עטיפה‬ ‫לדרייברים‬ ‫מייצא‬ ‫הקרנל‬ ,‫מקבצים‬ ‫ולכתוב‬ ‫לקרוא‬ ‫מנת‬ ‫על‬ - VFS ,‫לכך‬ ‫בנוסף‬ .‫נשתמש‬ ‫שבה‬ ‫ומצאתי‬ ‫תהליכים‬ ‫של‬ ‫מזיכרון‬ ‫ולכתוב‬ ‫לקרוא‬ ‫נוחה‬ ‫דרך‬ ‫חיפשתי‬ ‫בפונקציה‬ ‫להשתמש‬ ‫יהיה‬ ‫נוח‬ ‫שהכי‬
  • 4. Linux kernel so injector www.DigitalWhisper.co.il ‫גליון‬ 124 , ‫דצמבר‬ 2020 4 mem_rw ‫מ‬ - proc fs ‫שאני‬ ‫קוד‬ ‫או‬ ‫שונים‬ ‫בפורומים‬ ‫כתבו‬ ‫שאחרים‬ ‫קוד‬ ‫ולעומת‬ ‫תכליתה‬ ‫שזאת‬ ‫מפני‬ ‫ב‬ ‫לבאגים‬ ‫הסיכוי‬ ‫אכתוב‬ - mem_rw ‫ולשנות‬ ‫להעתיק‬ ‫נאלץ‬ ‫מיוצאת‬ ‫לא‬ ‫הזאת‬ ‫שהפונקציה‬ ‫בגלל‬ .‫יותר‬ ‫נמוך‬ ‫עם‬ ‫שתעבוד‬ ‫מנת‬ ‫על‬ ‫אותה‬ buffers ‫הכתובות‬ ‫במרחב‬ ‫שנמצאים‬ .‫הקרנלי‬ ‫שלב‬ 4 ( ‫למצוא‬ ‫נרצה‬ ‫כתובתה‬ ‫שאת‬ ‫הפונקציה‬ ‫של‬ ‫השם‬ ‫את‬ ‫לנו‬ ‫יש‬ ‫זה‬ ‫בשלב‬ libc_dlopen_mode ‫גם‬ ‫כן‬ ‫וכמו‬ ) ‫של‬ ‫ההתחלה‬ ‫כתובת‬ ‫את‬ glibc ‫פרמטרים‬ ‫שני‬ ‫בעזרת‬ . ‫ה‬ ‫מבנה‬ ‫את‬ ‫לפרסר‬ ‫נוכל‬ ‫אלו‬ - elf ‫של‬ glibc ‫טעון‬ ‫כשהוא‬ ‫של‬ ‫הדינאמית‬ ‫הכתובת‬ ‫את‬ ‫ולמצוא‬ ‫בזיכרון‬ libc_dlopen_mode . ‫של‬ ‫כללי‬ ‫תיאור‬ ‫לראות‬ ‫ניתן‬ ‫משמאל‬ ‫בתמונה‬ ELF format ‫ה‬ ‫מתחיל‬ ‫הראשונה‬ ‫בכתובת‬ ‫התמונה‬ ‫לפי‬ , - ELF header ‫נמצא‬ ‫ממנו‬ ‫מסוים‬ ‫שבמיקום‬ Program header table ‫ל‬ ‫להגיע‬ ‫ניתן‬ ‫ומשם‬ - sections .‫השונים‬ [ ‫מקור‬ ] ‫כך‬ ELF header ‫נראה‬ : ‫ה‬ ‫לכל‬ ‫נתייחס‬ ‫לא‬ - ,struct ‫שהוא‬ ‫אותנו‬ ‫שמעניין‬ ‫לשדה‬ ‫רק‬ ‫אלא‬ e_phoff - ‫של‬ ‫המיקום‬ Program header table ‫ה‬ ‫מתחילת‬ - ELF header .
  • 5. Linux kernel so injector www.DigitalWhisper.co.il ‫גליון‬ 124 , ‫דצמבר‬ 2020 5 Program header table ‫ה‬ ‫או‬ ‫שהמערכת‬ ‫מידע‬ ‫מכיל‬ ‫בו‬ ‫מבנה‬ ‫שכל‬ ‫מבנים‬ ‫של‬ ‫מערך‬ ‫הוא‬ - loader ‫זקוקים‬ ‫הוא‬ ‫אותנו‬ ‫שמעניין‬ ‫המבנה‬ .‫לריצה‬ ‫הספרייה‬ ‫או‬ ‫התהליך‬ ‫את‬ ‫להכין‬ ‫כדי‬ ‫לו‬ PT_DYNAMIC ‫(לפי‬ p_type ‫מחושב‬ ‫אשר‬ ‫דינאמי‬ ‫קישור‬ ‫של‬ ‫מידע‬ ‫מכילים‬ ‫אשר‬ ‫מבנים‬ ‫של‬ ‫מערך‬ ‫שמכיל‬ )‫זה‬ ‫מבנה‬ ‫איזה‬ ‫לדעת‬ ‫נוכל‬ ‫ה‬ ‫טעינת‬ ‫בזמן‬ - ELF . ‫ה‬ ‫את‬ ‫למצוא‬ ‫מנת‬ ‫על‬ - dynamic section : ‫לפי‬ man 5 elf :
  • 6. Linux kernel so injector www.DigitalWhisper.co.il ‫גליון‬ 124 , ‫דצמבר‬ 2020 6 ‫ב‬ ‫הנמצאות‬ ‫הטבלאות‬ ‫מתוך‬ - ,dynamic section ‫הן‬ ‫אותנו‬ ‫שמעניינות‬ ‫הטבלאות‬ ‫שתי‬ : DT_STRTAB ‫ו‬ - .DT_SYMTAB DT_SYMTAB ‫ו‬ ‫הסימבולים‬ ‫של‬ ‫הטבלה‬ ‫את‬ ‫מייצגת‬ - DT_STRTAB ‫כל‬ ‫של‬ ‫השם‬ ‫של‬ ‫הטבלה‬ ‫את‬ ‫מייצגת‬ :‫בהתאמה‬ ‫סימבול‬ ‫את‬ ‫צריכים‬ ‫אנחנו‬ ‫למה‬ libc_dlopen_mode ? ‫בספרייה‬ ‫להשתמש‬ ‫ניתן‬ ,‫ריצה‬ ‫בזמן‬ ‫משותפת‬ ‫ספרייה‬ ‫לטעון‬ ‫מנת‬ ‫על‬ dl ‫משתמש‬ ‫תהליך‬ ‫כל‬ ‫לא‬ ‫אך‬ ,‫למזלנו‬ .‫בה‬ ‫להשתמש‬ ‫נוכל‬ ‫לא‬ ‫ולכן‬ ‫זו‬ ‫בספרייה‬ glibc ‫ההפצות‬ ‫ורוב‬ ‫שיש‬ ‫הנפוצות‬ ‫מהספריות‬ ‫היא‬ ‫בספ‬ ‫להשתמש‬ ‫חייב‬ ‫תהליך‬ ‫כל‬ ‫לא‬ ,‫בה‬ ‫משתמשות‬ ‫הלינוקסיות‬ .‫זו‬ ‫רייה‬ libc_dlopen_mode ‫של‬ ‫המימוש‬ ‫היא‬ libc ‫ל‬ - dlopen ‫דינאמית‬ ‫ספרייה‬ ‫לטעון‬ ‫מנת‬ ‫על‬ ‫משמשת‬ ‫אשר‬ .‫ריצה‬ ‫בזמן‬ ‫לתהליך‬
  • 7. Linux kernel so injector www.DigitalWhisper.co.il ‫גליון‬ 124 , ‫דצמבר‬ 2020 7 ‫שלבים‬ 5-9 ‫הקוד‬ ‫במהלך‬ ‫היה‬ ‫מזריקים‬ ‫שאליו‬ ‫התהליך‬ ‫אם‬ ‫בודקים‬ ,‫פשוט‬ ‫יחסית‬ ‫הבאה‬ ‫בתמונה‬ ‫המתואר‬ .syscall ‫ה‬ ‫את‬ ‫לבנות‬ ‫מנת‬ ‫על‬ ‫ממשיכים‬ ,‫מכן‬ ‫לאחר‬ - shellcode ‫של‬ ‫הנתיב‬ ‫את‬ ‫כותבים‬ ,)‫לתוכו‬ ‫נצלול‬ ‫מעט‬ ‫(עוד‬ ‫את‬ ‫כותבים‬ ,‫אלו‬ ‫שלבים‬ ‫לאחר‬ .‫לפני‬ ‫שמצאנו‬ ‫בכתובת‬ ‫התהליך‬ ‫של‬ ‫הכתובות‬ ‫למרחב‬ ‫המשותפת‬ ‫הספרייה‬ ‫ה‬ - shellcode .‫התהליך‬ ‫של‬ ‫הכתובות‬ ‫למרחב‬ ‫עצמו‬ ‫ל‬ ‫שצלול‬ ‫לפני‬ - shellcode ‫ע‬ ‫נעצר‬ ‫כאשר‬ ‫להיות‬ ‫יכול‬ ‫תהליך‬ ‫שבהם‬ ‫השונים‬ ‫המצבים‬ ‫את‬ ‫להבין‬ ‫צריך‬ ‫ידי‬ ‫ל‬ SIGSTOP ‫ידי‬ ‫על‬ ‫לרוץ‬ ‫וחוזר‬ SIGCONT . ‫מ‬ ‫החזרה‬ ‫בזמן‬ ‫הקרנל‬ ‫ידי‬ ‫על‬ ‫נשלחים‬ ‫סיגנלים‬ - kernel mode ‫ל‬ - user mode ( syscalls, context switch etc .) ‫כאשר‬ ‫יעשה‬ ‫הקרנל‬ ‫מה‬ ‫השאלה‬ ‫נשאלת‬ SIGSTOP ‫דוגמה‬ .‫חסומה‬ ‫הייתה‬ ‫מערכת‬ ‫שקריאת‬ ‫בזמן‬ ‫נשלח‬ ‫ביצע‬ ‫שלנו‬ ‫שתהליך‬ ‫בזמן‬ ,‫לכך‬ open ‫לקובץ‬ ‫בו‬ - ‫אחר‬ ‫מתהליך‬ ‫או‬ ‫מהקרנל‬ ‫נשלח‬ ‫זמנית‬ SIGSTOP ‫לתהליך‬ ‫ה‬ ‫ביצוע‬ ‫בזמן‬ ‫יעצור‬ ‫שלנו‬ ‫התהליך‬ ,‫כלומר‬ .‫שלנו‬ - syscall ‫נשלח‬ ‫כאשר‬ ‫יקרה‬ ‫מה‬ ‫אך‬ . SIGCONT ‫הרי‬ ‫של‬ ‫ביצוע‬ ‫באמצע‬ ‫היה‬ ‫התהליך‬ .syscall
  • 8. Linux kernel so injector www.DigitalWhisper.co.il ‫גליון‬ 124 , ‫דצמבר‬ 2020 8 ‫ה‬ ‫לסוג‬ ‫בהתאם‬ ‫והן‬ ‫לבחור‬ ‫יכול‬ ‫הקרנל‬ ‫שבהן‬ ‫אופציות‬ ‫שתי‬ ‫ישנן‬ - syscall ‫בביצוע‬ ‫שהיה‬ : 1 . ‫אחרי‬ ‫שה‬ - signal handler ‫ה‬ ‫ששוב‬ ‫כך‬ ‫האוגרים‬ ‫את‬ ‫ישנה‬ ‫הקרנל‬ ‫יסתיים‬ - syscall .‫יתבצע‬ 2 . ‫שגיאה‬ ‫ערך‬ ‫עם‬ ‫הקריאה‬ ‫את‬ ‫יכשיל‬ ‫הקרנל‬ EINTR . ,‫ארכיטקטורה‬ ‫תלוי‬ ‫הוא‬ ‫סיגנלים‬ ‫של‬ ‫בביצוע‬ ‫שמטפל‬ ‫(הקוד‬ ‫בזה‬ ‫שמטפל‬ ‫בקרנל‬ ‫הקוד‬ ‫את‬ ‫נראה‬ ‫בואו‬ ‫מ‬ ‫דוגמה‬ ‫להראות‬ ‫בחרתי‬ - x86 :) ‫י‬ ‫הקרנל‬ ,‫הספרייה‬ ‫הזרקת‬ ‫בזמן‬ ‫לפונקציה‬ ‫פעמיים‬ ‫גיע‬ handle_signal ‫כשנשלח‬ ‫אחת‬ ‫פעם‬ , SIGSTOP ‫כשנשלח‬ ‫אחת‬ ‫ופעם‬ SIGCONT . ‫ב‬ ‫כשמדובר‬ ‫הראשונה‬ ‫הפעם‬ ‫עבור‬ - SIGSTOP ‫במהלך‬ ‫היה‬ ‫הוא‬ ‫אם‬ ‫יבדוק‬ ‫הקרנל‬ syscall ‫בהתאם‬ ,‫כן‬ ‫אם‬ . ‫ה‬ ‫לסוג‬ - syscall ‫ה‬ ‫של‬ ‫מחדש‬ ‫אתחול‬ ‫לבצע‬ ‫אם‬ ‫יבחר‬ ‫הקרנל‬ - syscall ‫חיסור‬ ‫ידי‬ ‫על‬ rip ‫ב‬ - 2 ‫של‬ ‫(הגודל‬ syscall opcode ‫להחזיר‬ ‫או‬ ) EINTR ‫שה‬ ‫לתהליך‬ ‫להחזיר‬ ‫כלומר‬ - syscall ‫יגיע‬ ‫הקרנל‬ ‫השנייה‬ ‫בפעם‬ .‫בוטל‬ ‫כשנשלח‬ ‫זו‬ ‫לפונקציה‬ SIGCONT ‫שנעצר‬ ‫לאחר‬ ‫שוב‬ ‫התהליך‬ ‫את‬ ‫להריץ‬ ‫מנת‬ ‫על‬ , ‫התהליך‬ ‫הזאת‬ ‫בפעם‬ ‫באמצע‬ ‫היה‬ ‫לא‬ ‫בהכרח‬ syscall ‫ל‬ ‫יכנס‬ ‫לא‬ ‫הקרנל‬ ‫לכן‬ - if .‫הזה‬
  • 9. Linux kernel so injector www.DigitalWhisper.co.il ‫גליון‬ 124 , ‫דצמבר‬ 2020 9 ‫אחרי‬ ,‫לכן‬ ‫עצרנו‬ ‫שבו‬ ‫במצב‬ ‫להתחשב‬ ‫נצטרך‬ ‫אנחנו‬ ,‫התהליך‬ ‫את‬ ‫ועוצרים‬ ‫ההזרקה‬ ‫את‬ ‫מבצעים‬ ‫שאנחנו‬ ‫ה‬ ‫ביצוע‬ ‫בזמן‬ ‫התהליך‬ ‫את‬ - syscall ‫מעט‬ ‫לא‬ ‫ישנם‬ . syscalls ‫ביצוע‬ ‫שלאחר‬ SIGSTOP ‫ואז‬ SIGCONT ‫לא‬ ‫יחזיר‬ ‫והקרנל‬ ‫מחדש‬ ‫יאותחלו‬ ,EINTR ‫המלאה‬ ‫הרשימה‬ ‫את‬ ‫לראות‬ ‫בשביל‬ man 7 signal . ‫את‬ ‫לבנות‬ ‫מנת‬ ‫על‬ ‫ה‬ - shellcode :‫פרמטרים‬ ‫שלושה‬ ‫נצטרך‬ ‫שלנו‬ 1 . ‫של‬ ‫שמצאנו‬ ‫הפונקציה‬ ‫של‬ ‫הכתובת‬ ‫את‬ libc_dlopen_mode . 2 . .‫לטעון‬ ‫נרצה‬ ‫שאותה‬ ‫הדינאמית‬ ‫הספרייה‬ ‫של‬ ‫הנתיב‬ ‫את‬ ‫כתבנו‬ ‫שאליה‬ ‫הכתובת‬ ‫את‬ 3 . ‫מנת‬ ‫ועל‬ ‫אותו‬ ‫כשעצרנו‬ ‫מסוימת‬ ‫בכתובת‬ ‫היה‬ ‫התהליך‬ ‫כלומר‬ ,‫לחזור‬ ‫נרצה‬ ‫שאליה‬ ‫הכתובת‬ ‫את‬ ,‫למעלה‬ ‫שהזכרנו‬ ‫כפי‬ .‫זו‬ ‫לכתובת‬ ‫לחזור‬ ‫נצטרך‬ ‫לקרוס‬ ‫לו‬ ‫לגרום‬ ‫מבלי‬ ‫התהליך‬ ‫של‬ ‫הריצה‬ ‫את‬ ‫לשחזר‬ ‫ביצוע‬ ‫בעת‬ ‫היה‬ ‫התהליך‬ ‫אם‬ ‫לבדוק‬ ‫נצטרך‬ syscall ‫שאליה‬ ‫יעד‬ ‫הכתובת‬ ‫את‬ ‫נחסיר‬ ‫כן‬ ‫ואם‬ ‫ב‬ ‫לקפוץ‬ ‫נרצה‬ ‫ה‬ ‫גודל‬ - opcode ‫של‬ syscall ‫על‬ ‫היינו‬ ‫אידיאלי‬ ‫(בעולם‬ ‫שוב‬ ‫שיתבצע‬ ‫מנת‬ ‫שזה‬ ‫בודקים‬ syscall ‫ב‬ ‫שתומך‬ - restart ‫בדיוק‬ ‫את‬ ‫לשחזר‬ ‫מנת‬ ‫על‬ ‫מבצע‬ ‫שהקרנל‬ ‫כמו‬ .)‫הריצה‬ ‫שאוגר‬ ‫מפני‬ ‫מושלם‬ ‫לא‬ ‫האוגרים‬ ‫של‬ ‫השחזור‬ r15 .‫משתחזר‬ ‫לא‬ ‫להיות‬ ‫חייבת‬ ‫שהמחסנית‬ ‫לשכוח‬ ‫לא‬ aligned ‫ל‬ - 91 ‫ל‬ ‫כשקוראים‬ - mode_dlopen_libc . ‫ה‬ ‫על‬ ‫מצטער‬ - AT&T syntax ...
  • 10. Linux kernel so injector www.DigitalWhisper.co.il ‫גליון‬ 124 , ‫דצמבר‬ 2020 11 ‫ה‬ ‫את‬ ‫שבנינו‬ ‫אחרי‬ - shellcode ‫ה‬ ‫את‬ ‫נכתוב‬ ‫הנכונות‬ ‫הכתובות‬ ‫עם‬ - shellcode ‫של‬ ‫הכתובות‬ ‫למרחב‬ ( ‫המתאימות‬ ‫ההרשאות‬ ‫את‬ ‫לה‬ ‫שיש‬ ‫לפני‬ ‫שמצאנו‬ ‫בכתובת‬ ‫התהליך‬ R^X .) ‫אוגר‬ ‫את‬ ‫לשנות‬ ‫נרצה‬ ,‫מכן‬ ‫לאחר‬ rip ‫ה‬ ‫של‬ ‫לכתובת‬ ‫שיצביע‬ - shellcode ‫שבו‬ ‫במצב‬ ,‫לזכור‬ ‫חשוב‬ .‫שלנו‬ ‫את‬ ‫נשנה‬ rip ‫ל‬ ‫להצביע‬ - shellcode ‫ביצוע‬ ‫בזמן‬ ‫לעצר‬ ‫היה‬ ‫עלול‬ ‫שהתהליך‬ ‫בעובדה‬ ‫נתחשב‬ ‫לא‬ ‫אך‬ ‫שלנו‬ syscall , ‫נשלח‬ ‫שכאשר‬ ‫מצב‬ ‫להיווצר‬ ‫יכול‬ SIGCONT ‫שאליה‬ ‫הכתובת‬ ‫את‬ ‫לשנות‬ ‫עלול‬ ‫הקרנל‬ ,‫לתהליך‬ ‫באוגר‬ ‫ששמנו‬ ‫לכתובת‬ ‫התהליך‬ ‫יחזור‬ rip-2 ‫למעלה‬ ‫שהוזכר‬ ‫(כמו‬ ‫של‬ ‫הגודל‬ ‫פחות‬ syscall opcode ‫לכן‬ .) ‫מביצוע‬ ‫חזר‬ ‫התהליך‬ ‫אם‬ ‫בדיקה‬ ‫נעשית‬ syscall ‫את‬ ‫נעלה‬ ‫אז‬ rip ‫ב‬ - 2 ‫ב‬ ‫יוריד‬ ‫הקרנל‬ ‫מכן‬ ‫ולאחר‬ - 2 ‫ונגיע‬ ‫ה‬ ‫של‬ ‫לכתובת‬ ‫בדיוק‬ - shellcode . ‫שלב‬ 11 ‫היעד‬ ‫לתהליך‬ ‫נשלח‬ ‫זה‬ ‫בשלב‬ SIGCONT ‫התהליך‬ ‫בהצלחה‬ ‫עברו‬ ‫השלבים‬ ‫כל‬ ‫(אם‬ ‫לרוץ‬ ‫שיחזור‬ ‫מנת‬ ‫על‬ ‫מה‬ ‫לרוץ‬ ‫יחזור‬ - shellcode .‫לו‬ ‫להזריק‬ ‫שרצינו‬ ‫הדינאמית‬ ‫הספרייה‬ ‫את‬ ‫ולטעון‬ ) ‫ידועות‬ ‫מגבלות‬ 1 . ‫ב‬ ‫בקוד‬ ‫תמיכה‬ ‫אין‬ ‫כרגע‬ - syscalls ‫להם‬ ‫להחזיר‬ ‫שחייב‬ ‫מהסוג‬ EINTR ‫ידי‬ ‫על‬ ‫נעצרים‬ ‫כאשר‬ ‫בחזרה‬ SIGSTOP ‫ב‬ ‫או‬ . - syscalls ‫בעזרת‬ ‫להיקרא‬ ‫צריכים‬ ‫שהיו‬ restart_syscall ‫על‬ ‫שנעצרו‬ ‫אחרי‬ SIGSTOP ‫אחרי‬ ‫לרוץ‬ ‫וחזרו‬ SIGCONT . 2 . ‫לארכיטקטורת‬ ‫רק‬ ‫מימוש‬ ‫קיים‬ ‫כרגע‬ x86_64 . 3 . ‫כ‬ ‫מוגדר‬ ‫הקוד‬ - PoC ‫באגים‬ ‫ולכן‬ ‫בדיקות‬ ‫מספיק‬ ‫עבר‬ ‫ולא‬ ‫בשגיאות‬ ‫נכון‬ ‫מספיק‬ ‫טיפול‬ ‫עם‬ ‫נכתב‬ ‫ולא‬ .‫מסוימים‬ ‫קצה‬ ‫במקרי‬ ‫לקרות‬ ‫יכולים‬ 4 . ‫ה‬ - shellcode ‫ה‬ ‫והרצת‬ ‫לתהליך‬ ‫הכתיבה‬ ‫לאחר‬ ,‫כלומר‬ .‫מתנקים‬ ‫אינם‬ ‫הדינאמית‬ ‫לספרייה‬ ‫והנתיב‬ - shellcode ‫לא‬ .‫בשימוש‬ ‫לא‬ ‫הוא‬ ‫אם‬ ‫גם‬ ‫לפני‬ ‫שם‬ ‫שהיה‬ ‫המידע‬ ‫את‬ ‫לשחזר‬ ‫הוא‬ ‫לעשות‬ ‫הנכון‬ ‫הדבר‬ ‫ב‬ ‫זה‬ ‫את‬ ‫לממש‬ ‫זמן‬ ‫מספיק‬ ‫לי‬ ‫היה‬ - kernel thread ‫יש‬ ‫אבל‬ ‫נפרד‬ commit ‫שעושה‬ ‫ה‬ ‫באותו‬ ‫זה‬ ‫את‬ - thread ‫בחרתי‬ . ‫ה‬ ‫את‬ ‫להוריד‬ - commit ‫ב‬ ‫הזה‬ - branch "‫"יתקע‬ ‫הוא‬ ‫אחד‬ ‫מעבד‬ ‫שתחת‬ ‫בגלל‬ ‫הראשי‬ .‫המחשב‬ ‫את‬ ‫כלומר‬ ‫הקרנל‬ ‫את‬ 5 . ‫אוגר‬ r15 .‫משתחזר‬ ‫לא‬ .‫פתירות‬ ‫הינן‬ ‫מעל‬ ‫שצוינו‬ ‫המגבלות‬ ‫שכל‬ ‫לציין‬ ‫חשוב‬
  • 11. Linux kernel so injector www.DigitalWhisper.co.il ‫גליון‬ 124 , ‫דצמבר‬ 2020 11 ‫סיכום‬ ‫בעזרת‬ ‫פרסרנו‬ ,‫שבחרנו‬ ‫מסוים‬ ‫תהליך‬ ‫עצרנו‬ ?‫עשינו‬ ‫מה‬ ‫אז‬ /proc/pid/maps ‫זיכרון‬ ‫יש‬ ‫בתהליך‬ ‫היכן‬ R^X ‫הספרייה‬ ‫של‬ ‫הכתובת‬ ‫מה‬ ‫וגם‬ glibc .‫התהליך‬ ‫אל‬ ‫שנטענה‬ ‫את‬ ‫פרסרנו‬ ,‫מכן‬ ‫לאחר‬ glibc ‫של‬ ‫הפורמט‬ ‫את‬ ‫כלומר‬ ‫בזיכרון‬ elf ‫הפונקציה‬ ‫את‬ ‫למצוא‬ ‫מנת‬ ‫על‬ , / ‫סימבול‬ libc_dlopen_mode . ‫ה‬ ‫את‬ ‫לבנות‬ ‫התחלנו‬ - shellcode ‫ידי‬ ‫על‬ ‫המשותפת‬ ‫הספרייה‬ ‫את‬ ‫יטען‬ ‫שבהמשך‬ ‫שלנו‬ ‫ל‬ ‫שיקרא‬ ‫כך‬ - libc_dlopen_mode ‫שה‬ ‫מה‬ ‫כל‬ . - shellcode ‫זה‬ ‫צריך‬ ‫שלנו‬ : ‫לספרייה‬ ‫הנתיב‬ ‫את‬ ‫נכתוב‬ ‫שאליה‬ ‫הכתובת‬ ‫כלומר‬ ‫הספרייה‬ ‫את‬ ‫לטעון‬ ‫מנת‬ ‫על‬ ‫נקפוץ‬ ‫אליה‬ ‫הכתובת‬ ,‫לטעון‬ ‫שנרצה‬ ‫הדינאמית‬ libc_dlopen_mode .‫התהליך‬ ‫של‬ ‫הריצה‬ ‫את‬ ‫לשחזר‬ ‫מנת‬ ‫על‬ ‫נחזור‬ ‫שאליה‬ ‫והכתובת‬ ‫א‬ ‫כתבנו‬ ,‫מכן‬ ‫לאחר‬ ‫ה‬ ‫ואת‬ ‫הדינאמית‬ ‫לספרייה‬ ‫הנתיב‬ ‫את‬ ‫שמייצגת‬ ‫המחרוזת‬ ‫ת‬ - shellcode ‫למרחב‬ ‫עצמו‬ .‫התהליך‬ ‫של‬ ‫הכתובות‬ ‫אוגר‬ ‫את‬ ‫שינינו‬ rip ‫ה‬ ‫את‬ ‫כתבנו‬ ‫שאליה‬ ‫לכתובת‬ ‫שיצביע‬ ‫התהליך‬ ‫של‬ - shellcode ‫לתהליך‬ ‫שלחנו‬ ‫ולבסוף‬ SIGCONT ‫מה‬ ‫לרוץ‬ ‫שיחזור‬ ‫מנת‬ ‫על‬ - shellcode .‫שלנו‬  ‫ה‬ - repo ‫הפרויקט‬ ‫של‬ : injector - so - kernel - com/Rhydon1337/linux . https://github  ‫ה‬ - repo ‫הסביבה‬ ‫של‬ : development - kernel - com/Rhydon1337/linux . https://github ‫המחבר‬ ‫על‬  ( ‫מקמל‬ ‫אדיר‬ Rhydon1337 ) , 22 ‫ומפתח‬ ‫מידע‬ ‫אבטחת‬ ‫חוקר‬ , . o ‫אימייל‬ : com . adirmak1@gmail o :GitHub com/Rhydon1337 . https://github