“hta”代表“HTML应用程序”,除了使用mshta.exe运行外,它与普通的HTML页面基本相同并且支持其他的脚本语言。mshta.exe是在windows自带的应用程序,通常在应用程序的白名单中。所以,我们可以使用其他的脚本语言(特别是vb sc ript)做很多有趣的事情。
假设您处于一个无法访问命令行或PowerShell的环境中,您想做一些简单的事情,比如ping一台电脑。您可以使用包含以下内容的hta文件:
上面的hta文件不是很完美…你可以看到命令在另一个窗口中打开运行,并且在它完成后立即消失,使得读取其输出变得困难。我们可以通过捕获命令的输出并在HTML应用程序中显示以下内容来更好地实现这一点:
这个hta文件使用“Wsc ript.Shell”运行命令,与使用cmd不同。所以内建的函数,如dir无法运行,而且也不能执行复合命令(例如ping 1.1.1.1 && pause),所以让我们继续尝试。
要运行PowerShell命令。我们可以使用c#的管道类。要在锁定的系统上运行任意的c#命令,我们将使用我在NOTSOSECURE的高级基础设施黑客课程中学到的技术。我们可以使用InstallUtil.exe(内置的windows程序),用于在卸载任意可执行文件。此外,我们将使用另一个内置在window程序csc.exe,来编译任意c#代码。手工一步步完成以上操作是一种痛苦,而且很难记住,所以我们使用.hta来打包所有的步骤。完成后的hta文件将执行以下步骤:
值得一提的是,通过c#管道运行PowerShell绕过了限制模式。所以你可以使用powershell.hta运行某些渗透测试工具,否则会被阻塞;-)
我通常不需要隐藏,但如果你需要,你可以在一个隐藏窗口运行hta,payload下:
虽然不会有可见的窗口,但是mshta.exe的进程将出现在任务管理器中,这在任务管理器看起来应该像一个疼痛的大拇指一样突出…
甚至根本不需要hta文件!mshta.exe能解析ja vasc ript,因此您可以使用类似于下面的命令来运行渗透工具,而且不需要在磁盘上运行文件。
在Windows 10(以及Windows Server 2016)中,Windows在关闭计算机之前会重新启动一些正在运行的应用程序。下次登录系统时,它会自动运行这些应用程序。可以通过在系统关闭之前向run-once注册表键写入一个实体来实现这一点。
mshta.exe是可以利用这个特性的程序之一。你可以滥用这个来让windows为你保驾护航!不幸的是,Windows无法恢复使用Wsc ript.Shell脚本的mshta,这样您就不能轻松地执行隐式持久化(即运行您的mshta)。但是它确实可以与ja vasc ript URI一起工作,所以您可以实现某种隐形的无文件持久性(run-once注册表键只在系统启动和用户登录之间出现)。