SlideShare a Scribd company logo
-
-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

PDF
סיכום הקורס באבטחת מידע
PPT
PHP Scalability
PPTX
Introduction to malware analysis & reverse engineering
PPTX
Introduction To Malware Analysis & Reverse Engineering
PPTX
Introduction to malware analysis & reverse engineering
PDF
Nodejs
PDF
מושגים שונים בהבנת מערכות מחשב
PDF
מושגים שונים בהבנת מערכות מחשב
סיכום הקורס באבטחת מידע
PHP Scalability
Introduction to malware analysis & reverse engineering
Introduction To Malware Analysis & Reverse Engineering
Introduction to malware analysis & reverse engineering
Nodejs
מושגים שונים בהבנת מערכות מחשב
מושגים שונים בהבנת מערכות מחשב

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

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

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