無恥的驅動加載法
from
:
http
:
//www.debugman.com/read.php?tid=614
方法一:?替換win32k
.
sys
在
2k3
的系統下ZwSetSystemInformation禁止了用戶模式下加載驅動,只允許SMSS
.
exe加載win32k
.
sys。于是我們可以利用一下這個特點:
1.?
注入SMSS
.
EXE
2.?
打開SeLoadDriverPrivilege權限
3.?
把原始的win32k
.
sys改名
4.?
復制我們的驅動到\systemroot\system32下
5.?
在SMSS
.
EXE中加載\\SystemRoot\\System32\\win32k
.
sys
6.?
把\\SystemRoot\\System32\\win32k
.
sys改名
7.?
把原始的win32k
.
sys文件改名改回去
方法二:?利用第三方驅動程序的漏洞
這類驅動應該挺多的,我們可以選擇一些裝機量大的驅動來進行此項工作,如某某著名的殺毒軟件即存在本地權限提升漏洞。。。獲得了ring0權限再用ZwSetSystemInformation加載就萬事大吉了
方法三:?感染隨系統啟動的驅動程序
此法類似于病毒感染,但需要等到下次系統重啟才能拿到控制權,需要一些PE知識,這個我就不多說了。
這里順便再說說通過ZwSetSystemInformation其實也是可以建立Device的,由于ZwSetSystemInformation加載驅動時傳給DriverEntry的DriverObject指針是錯誤的,因此我們不能用它來創建Device
,?
但我們可以自己分配一個DriverObject來創建,如下:
????NTSTATUS
????DriverEntry
(
????????
IN?PDRIVER_OBJECT?DriverObject
,
????????
IN?PUNICODE_STRING?RegistryPath
????????
)
????{
????????
NTSTATUS????????ntStatus?
=?
STATUS_SUCCESS
;
????????
UNICODE_STRING??ntUnicodeString
;
????????
UNICODE_STRING??ntWin32NameString
;
????????
PDEVICE_OBJECT??deviceObject?
=?
NULL
;
????????
ULONG??????????i
;
???????
????????
DriverObject?
=?
ExAllocatePoolWithTag
(
NonPagedPool
,?
sizeof
(
DRIVER_OBJECT
),?
'clAS'
);??
//?分配DriverObject
????????
RtlZeroMemory
(
DriverObject
,?
sizeof
(
DRIVER_OBJECT
));
????????
RtlInitUnicodeString
(?&
ntUnicodeString
,?
NT_DEVICE_NAME?
);
????????
ntStatus?
=?
IoCreateDevice
(
????????????
DriverObject
,
????????????
0
,
????????????&
ntUnicodeString
,
????????????
0x8800
,????????????????????????????????????????????????
//設備類型必須為自定義的
????????????
FILE_DEVICE_SECURE_OPEN
,
????????????
TRUE
,
????????????&
deviceObject?
);
????????
if?
(?!
NT_SUCCESS
(?
ntStatus?
)?)
????????{
????????????
DbgPrint
(
"Couldn't?create?the?device?object\n"
);
????????????
return?
ntStatus
;
????????}
????????
//?注意,需要我們自己來清除INITIALIZING標志,否則設置不能打開
????????
ClearFlag
(?
deviceObject
->
Flags
,?
DO_DEVICE_INITIALIZING?
);?????????????????????????
????????
DriverObject
->
MajorFunction
[
IRP_MJ_CREATE
]?=?
CreateClose
;
????????
DriverObject
->
MajorFunction
[
IRP_MJ_CLOSE
]?=?
CreateClose
;
???????
????????
//?注意,必須要給IRP_MJ_CLEANUP分派一個DispathRoutine,?否則在設備關閉的時候就會掛
????????
DriverObject
->
MajorFunction
[
IRP_MJ_CLEANUP
]?=?
CreateClose
;
????????
DriverObject
->
MajorFunction
[
IRP_MJ_DEVICE_CONTROL
]?=?
DeviceControl
;
????????
//?注意,必須是Global符號連接,?否則程序退出后連接會消失
????????
RtlInitUnicodeString
(?&
ntWin32NameString
,?
L
"\\DosDevices\\Global\\RkrTest"?
);
????????
ntStatus?
=?
IoCreateSymbolicLink
(
????????????????????????????&
ntWin32NameString
,?&
ntUnicodeString?
);
????????
if?
(?!
NT_SUCCESS
(?
ntStatus?
)?)
????????{
????????????
DbgPrint
((
"Couldn't?create?symbolic?link\n"
));
????????????
IoDeleteDevice
(?
deviceObject?
);
????????}
????????
return?
ntStatus
;
????}
如果你高興的話在分配空間的時候分配多一點,把OBJECT_HEADER也算上,這樣可以避免某些軟件掃描DriverObject的對象頭時掛掉
.
相應的用CreateFile時打開時應像這樣指定“\\\\
.
\\Global\\SymbolLink”
還有哪些無恥的辦法大家可以討論一下