Есть IRP. По нему получаем процесс.
С процессом жестко связано имя пользователя.
Есть ли способ получить это имя? Если нет, то, может быть есть какие-либо обходные пути?
Заранее спасибо...
Здравствуйте, Crag, Вы писали:
C>Есть IRP. По нему получаем процесс. C>С процессом жестко связано имя пользователя. C>Есть ли способ получить это имя? Если нет, то, может быть есть какие-либо обходные пути? C>Заранее спасибо...
добавлю про ZwQueryInformationToken скажу что несмотря на ее объявление в IFS Kit XP SP1 как
This routine is available on Microsoft® Windows® XP and later.
она вполне рабочая и на NT4, т.к. TOKEN_INFORMATION_CLASS объявлен в NT4 NTIFS.H
... << RSDN@Home 1.1.0 stable >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
V>This routine is available on Microsoft® Windows® XP and later.
V>она вполне рабочая и на NT4, т.к. TOKEN_INFORMATION_CLASS объявлен в NT4 NTIFS.H
... << RSDN@Home 1.1.0 stable >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Сделал всё как написано в этой конфе, получил следующие результаты :
1) SID получается очень странного вида -> S-1-142894079-28-13107200-4284711944-842925246-500 (EXPLORER.EXE)
в то время как SID пользователя залогиненного на компе имеет вид -> S-1-5-21-1801674531-1957994488-842925246-500
2) получаемый таким образом SID разный, в зависимости от запущенного процесса, более того он разный даже для одного и того процесса но запущенного дважды ... S-1-1218668031-28-13107200-4284851016-842925246-500 (TOTALCMD.EXE)
S-1-142894079-28-13107200-4284711944-842925246-500 (TOTALCMD.EXE)
3) как видно из п.1. некоторые части SID-ов всё же совпадают, следовательно можно предположить что это не SID пользователя, а например SID процесса, который запущен данным пользователем и следовательно унаследовал от него часть SID-а.
4) когда пытаюсь получить пользователя по SID-у из драйвера с помощью LookUpAccountSID() -> пользователь не находится.
P.S. прошу строго не судить, это только лишь мои догадки
в каком именно месте были получены эти данные? это был обработчик IRP-а (если да, то какого именно), или это перехватчик какой-либо ф-ии ядра (например ZwCreateFile)?
какая ОС (nt4/2k/xp/2k3, может быть terminal edition и эти данные получены из терминальной сессии)?
Здравствуйте, Canavaro, Вы писали:
C>Сделал всё как написано в этой конфе, получил следующие результаты : C>1) SID получается очень странного вида -> S-1-142894079-28-13107200-4284711944-842925246-500 (EXPLORER.EXE)
что тут странного? well-known user Administrator но из домена
интересно разве что почему он не начинается с S-1-5-xxxx,
что у вас выступает в качестве NT Authority?
C>в то время как SID пользователя залогиненного на компе имеет вид -> S-1-5-21-1801674531-1957994488-842925246-500
well-known user Administrator но локальный
но что значит EXPLORER.EXE? процесс не имеет SID, процесс имеет user token с owner который имеет SID
Вы имеете ввиду что этот процесс запущен из сессии пользователя с SID указанным выше
C>2) получаемый таким образом SID разный, в зависимости от запущенного процесса, более того он разный даже для одного и того процесса но запущенного дважды ... S-1-1218668031-28-13107200-4284851016-842925246-500 (TOTALCMD.EXE) C>S-1-142894079-28-13107200-4284711944-842925246-500 (TOTALCMD.EXE)
вопрос, каким-то образом Вы логинитесь (интерактивно, терминал, гостевой\null сеанс)?
ибо вид SID не самый обычный (предположу что это гостевой аккаунт для какой-то сетевой сессии, соотв 2 разных).
опишите рабочее окружение (ОС, какие domain controllers, пользуете ли Вы terminal sessions в своих экспериментах) и конкретные действия
C>3) как видно из п.1. некоторые части SID-ов всё же совпадают, следовательно можно предположить что это не SID пользователя, а например SID процесса, который запущен данным пользователем и следовательно унаследовал от него часть SID-а.
еще раз, у процесса SID нет. есть токен. у токена есть owner который как раз уже имеет SID. Токен наследуется при порождении нового процесса по умолчанию если нет каких-то ограничений или своих приседаний по этому поводу.
Именно поэтому winlogon после обычной авторизации пользователя создает для него сесиию (интерактивную), конструирует токен для этого пользователя и запускает с ним процесс оболочки (обычно explorer.exe) и соотв затем все программы запускаемые из этого explorer унаследуют копию токена родителя.
Если же как-то по иному порождаются процессы, например через CreateProcessAsUserW то им соотв можно сконструировать другой токен, с другим SID (для другого user соотв!). Но если у Вас каждый раз разные SID — это неспроста, это же вся система NT security просто попирается — winlogon запустил нам оболочку в сессии чтоб мы не вышли за пределы, а процессы новые вдруг под левым пользователем порождаются?
про похожесть: разные сессии имеют LogonID типа S-1-5-5-X-Y, где X и Y просто старшая и младшая части адреса в памяти, соотв часто есть совпадения хотя бы по старшей части. Если разобраться почему у Вас не S-1-5 начало (что вполне допустимо просто реже встречается), то в остальном Вы получили похожие на правду LogonID что и дает такое странное поведение.
надо разбираться — возможно просто неправильно получен SID в ядре, может быть это LogonID у Вас?
попробуйте с помощью разных программ в user mode получить то же самое для своих процессов — чей SID с ними ассоциирован через токен?
C>4) когда пытаюсь получить пользователя по SID-у из драйвера с помощью LookUpAccountSID() -> пользователь не находится.
код ошибки где?
C>P.S. прошу строго не судить, это только лишь мои догадки
очень интересно получить информацию чтобы попытаться воспроизвести у себя
... << RSDN@Home 1.1.3 beta 1 >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Здравствуйте, _cb_, Вы писали:
__>Здравствуйте, Canavaro, Вы писали:
__>хотелось бы уточнить некоторые детали:
__>в каком именно месте были получены эти данные? это был обработчик IRP-а (если да, то какого именно)
всё это я делаю в фильтре FS, по стандартной технологии атачусь к файловым системам и ко мне сыпятся IRP-ы предназначенные для них
__>какая ОС (nt4/2k/xp/2k3, может быть terminal edition и эти данные получены из терминальной сессии)?
ОС — Win2k Server c Terminal Services, данные получались как локально так и из терминальной сессии.
Здравствуйте, Valerio, Вы писали:
C>>Сделал всё как написано в этой конфе, получил следующие результаты : C>>1) SID получается очень странного вида -> S-1-142894079-28-13107200-4284711944-842925246-500 (EXPLORER.EXE) V>что тут странного? well-known user Administrator но из домена
V>интересно разве что почему он не начинается с S-1-5-xxxx,
вот в этом то всё и дело .... V>что у вас выступает в качестве NT Authority?
C>>в то время как SID пользователя залогиненного на компе имеет вид -> S-1-5-21-1801674531-1957994488-842925246-500 V>well-known user Administrator но локальный
V>но что значит EXPLORER.EXE? процесс не имеет SID, процесс имеет user token с owner который имеет SID V>Вы имеете ввиду что этот процесс запущен из сессии пользователя с SID указанным выше
совершенно верно ! насчёт SID процесса было просто предположение
C>>2) получаемый таким образом SID разный, в зависимости от запущенного процесса, более того он разный даже для одного и того процесса но запущенного дважды ... S-1-1218668031-28-13107200-4284851016-842925246-500 (TOTALCMD.EXE) C>>S-1-142894079-28-13107200-4284711944-842925246-500 (TOTALCMD.EXE) V>вопрос, каким-то образом Вы логинитесь (интерактивно, терминал, гостевой\null сеанс)?
логинился как локально так и через терминальную сессию, результаты практически не отличаются
V>ибо вид SID не самый обычный (предположу что это гостевой аккаунт для какой-то сетевой сессии, соотв 2 разных).
V>опишите рабочее окружение (ОС, какие domain controllers, пользуете ли Вы terminal sessions в своих экспериментах) и конкретные действия
ОС — Win2k Server c Terminal Services, не контроллер домена, SID пытаюсь получить в фильтре FS
C>>3) как видно из п.1. некоторые части SID-ов всё же совпадают, следовательно можно предположить что это не SID пользователя, а например SID процесса, который запущен данным пользователем и следовательно унаследовал от него часть SID-а. V>еще раз, у процесса SID нет. есть токен. у токена есть owner который как раз уже имеет SID. Токен наследуется при порождении нового процесса по умолчанию если нет каких-то ограничений или своих приседаний по этому поводу.
V>Именно поэтому winlogon после обычной авторизации пользователя создает для него сесиию (интерактивную), конструирует токен для этого пользователя и запускает с ним процесс оболочки (обычно explorer.exe) и соотв затем все программы запускаемые из этого explorer унаследуют копию токена родителя.
V>Если же как-то по иному порождаются процессы, например через CreateProcessAsUserW то им соотв можно сконструировать другой токен, с другим SID (для другого user соотв!). Но если у Вас каждый раз разные SID — это неспроста, это же вся система NT security просто попирается — winlogon запустил нам оболочку в сессии чтоб мы не вышли за пределы, а процессы новые вдруг под левым пользователем порождаются?
V>про похожесть: разные сессии имеют LogonID типа S-1-5-5-X-Y, где X и Y просто старшая и младшая части адреса в памяти, соотв часто есть совпадения хотя бы по старшей части. Если разобраться почему у Вас не S-1-5 начало (что вполне допустимо просто реже встречается), то в остальном Вы получили похожие на правду LogonID что и дает такое странное поведение.
V>надо разбираться — возможно просто неправильно получен SID в ядре, может быть это LogonID у Вас? V>попробуйте с помощью разных программ в user mode получить то же самое для своих процессов — чей SID с ними ассоциирован через токен?
попробую конечно, но думаю всё будет работать нормально ...
C>>4) когда пытаюсь получить пользователя по SID-у из драйвера с помощью LookUpAccountSID() -> пользователь не находится. V>код ошибки где?
0x00000057 The parametr is incorrect.
C>>P.S. прошу строго не судить, это только лишь мои догадки V>очень интересно получить информацию чтобы попытаться воспроизвести у себя
Здравствуйте, Canavaro, Вы писали:
C>всё это я делаю в фильтре FS, по стандартной технологии атачусь к файловым системам и ко мне сыпятся IRP-ы предназначенные для них
все-таки — в обработчике какого irp Вы получили эти данные? IRP_MJ_CREATE? или это собирательная информация из разных irp-ов?
Здравствуйте, _cb_, Вы писали:
__>Здравствуйте, Canavaro, Вы писали:
C>>всё это я делаю в фильтре FS, по стандартной технологии атачусь к файловым системам и ко мне сыпятся IRP-ы предназначенные для них
__>все-таки — в обработчике какого irp Вы получили эти данные? IRP_MJ_CREATE? или это собирательная информация из разных irp-ов?
Здравствуйте, Canavaro, Вы писали:
C>Здравствуйте, _cb_, Вы писали:
__>>Здравствуйте, Canavaro, Вы писали:
C>>>всё это я делаю в фильтре FS, по стандартной технологии атачусь к файловым системам и ко мне сыпятся IRP-ы предназначенные для них
__>>все-таки — в обработчике какого irp Вы получили эти данные? IRP_MJ_CREATE? или это собирательная информация из разных irp-ов?
C>ну наприммер IRP_MJ_READ
Здравствуйте, Canavaro, Вы писали:
C>ещё попробовал на XP Professional, тоже самое
на сколько я помню все проверки безопасности рекомендуется делать на irp_mj_create, а потом если Вам нужно знать какой пользователь посылает read, write и прочие запросы необходимо реализовать свой кеш открытых объектов. т.е на irp_mj_create получаете всю необходимую инфу и сохраняете ее в map-е где в качестве ключа используется file_object & fs_context, и при получении запросов ищете эту инфу в этом мапе...
возможно что описанное Вами поведение это нормальная жизнь оси...
Здравствуйте, Valerio, Вы писали:
V>надо разбираться — возможно просто неправильно получен SID в ядре, может быть это LogonID у Вас? V>попробуйте с помощью разных программ в user mode получить то же самое для своих процессов — чей SID с ними ассоциирован через токен?
попробовал и получил совершено нормальный well-known Administartor SID S-1-5-21-1801674531-1957994488-842925246-500
Здравствуйте, Canavaro, Вы писали:
C>Здравствуйте, _cb_,
C>а вы сами то пробовали так делать как написали ? C>если да, то какие у вас получались SID-ы ?
пробовал... с cидами проблем не было если удавалось поймать irp_mj_create. т.е. я получал сид залогиненного пользователя.
Здравствуйте, _cb_, Вы писали:
__>пробовал... с cидами проблем не было если удавалось поймать irp_mj_create. т.е. я получал сид залогиненного пользователя.
я тоже попробовал ловить на IRP_MJ_CREATE -> никакой разницы