无耻的驱动加载法
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”
还有哪些无耻的办法大家可以讨论一下