19-02-2014, 02:32
|
|
|
|
חבר מתאריך: 14.12.09
הודעות: 9,751
|
|
השאלה קצת כללית מדי. אני מניח שהשאלה היא לא איך להזריק DLL, אלא ספציפית איך לעבוד בין סשנים.
בוא נגיד שכבר יש לך קוד שמזריק DLL לפרוסס קיים בשיטה החביבה עליך. לצורך העניין נגיד שמדובר ב-WriteProcessMemory
ו-CreateRemoteThread.
עכשיו השאלה היא איך להריץ פרוסס בקונטקסט של המשתמש השני. בשביל זה אתה צריך לעשות CreateProcessAsUser ולהעביר
token שבו TokenSessionId מכיל את ה-Terminal Server sessionID של המשתמש השני. יש שתי דרכים לעשות את זה.
דרך אחת, אם יש לך TCB privilege זה לקרוא ל-SetTokenInformation ופשוט להגיד שאתה רוצה לשנות את ה-TokenSessionId.
מאחר ואמרת אדמין ולא משהו בעל הרשאות מטורפות, כנראה שאין לך TCB. בשביל זה אתה צריך לעשות OpenProcessToken
לפרוסס שכבר יושב ב-session שאתה רוצה.
אז מה שאתה צריך לעשות זה:
- למצוא פרוסס בסשן השני עם token שמתאים לך. כנראה שהפרוסס שאליו אתה רוצה להזריק מתאים.
- לעשות OpenProcess ואז OpenProcessToken עליו.
- לקרוא ל-CreateProcessAsUser עם ה-token שהשגת בשלב 2.
עכשיו יש לך פרוסס שרץ בסשן האחר ויכול משם להזריק את ה-DLL איך שבא לך.
הערות לסיום:
בבדיקה מהירה שעשיתי אצלי, כדי להצליח ב-OpenProcess על הסשן האחר הייתי צריך לעשות אצלי enable ל-Debug Privilege.
כרגע (ב-3:27 בלילה/בוקר) אני לא סוגר למה לא הצלחתי בלי. את זה אתה עושה לעצמך בהתחלה בעזרת AdjustTokenPrivileges.
יש דוגמה ב-MSDN.
יכול להיות שאתה לא צריך פרוסס נפרד. בעיקרון אתה יכול להשיג את ה-token שאתה צריך, ואז לעבור בפרוסס הנוכחי, זמנית, לעבוד
תחת הקונטקסט של ה-token הזה באמצעות ImpersonateLoggedOnUser. אבל מעולם לא ניסיתי לבצע impersonation לסשן אחר.
אני הייתי מציע שתבדוק קודם שהגישה שהצעתי למעלה עובדת, ואם כן, תבדוק האם אפשר לחסוך את הפרוסס המזריק.
_____________________________________
(קרדיט למרשי)
אמר לה ינאי מלכא לדביתיה אל תתיראי מן הפרושין ולא ממי שאינן פרושין אלא מן הצבועין שדומין לפרושין שמעשיהן כמעשה זמרי ומבקשין שכר כפנחס
אמר פסטן: שניהם גרועים, אבל עדיף להיות טיפש מאשר שקרן.
|