|
|
本帖最后由 redyear2026 于 2026-4-4 13:27 编辑
先明确一下,本帖所谓的批处脚本提权,即指通过脚本运行而获取管理员身份。
据说 pe 无所谓提权,另当别论。
高版 win 系统采用 powershell start 方法提权批处脚本,代码比较简洁,示例代码(存为 test-1.bat)如下
- echo off & fltmc>nul 2>nul || (powershell -c "start '%~f0' -arg '%*' -verb 'runas' " &exit/b)
- ::以下是在提权后被执行的批处脚本代码示例(仅屏显命令行参数)
- echo,%1,%2
- pause&exit/b
复制代码 但此法不能保全用双引号包裹的单个命令行参数,在命令行运行 test-1.bat 123 "xx yy" 其屏显结果是第二个用双引号包裹的参数被部分丢失。
改用以下示例代码(存为 test-2.bat)能够解决此问题,而且还允许用双引号包裹的单个命令行参数内含 &^<|> 等特殊字符。
test-2.bat
- echo off & fltmc>nul 2>nul || (
- set argv=%*
- setlocal enabledelayedexpansion
- set argv=/c \" \"%~f0\" !argv:"=\"!\"
- powershell -c "start 'cmd.exe' -arg '!argv!' -verb runas" &exit/b )
- ::以下是在提权后被执行的批处脚本代码示例(仅屏显命令行参数)
- echo,%1,%2,%3
- pause&exit/b
复制代码 在命令行运行 test-2.bat 123 "xx yy" "aa&^<|>bb" 可屏显其命令行参数的完整结果。
没有预装 powershell 的低版系统,可采用 jscript 调用 shellExcute 提权批处脚本,通常是借助 mshta 引擎,因其可在批处脚本中直接跑 vbs/jscript 代码,但高版系统如 win11 24H2+ 已彻底移除了在注册表和批处脚本中采用此法的权限,当然可以改用创建临时文件 *.vbs/*.js 的方法实现,但比较繁复,而采用 bat+jscript 混编文件是一个相对简捷的方法(可通行系统 xp-11 高版本),示例代码(存为 test-3.bat)如下
test-3.bat
- 2>1/* ::
- echo off & fltmc>nul 2>&1 || (
- set argv=%*
- cscript /nologo /e:jscript "%~f0"
- exit/b )
- ::以下是在提权后被执行的批处脚本代码示例(仅屏显命令行参数)
- echo,%1,%2,%3
- pause&exit/b
- */
- v=WSH.createObject('wscript.shell').environment('process')('argv');
- argv='/c ""'+WSH.scriptfullname+'\" '+v+'\"';
- WSH.createObject('shell.application').shellExecute('cmd.exe', argv, '', 'runas', 1), WSH.quit();
复制代码 在命令行运行 test-3.bat 123 "xx yy" "aa&^<|>bb" 可屏显其命令行参数的完整结果。
在 bat+jscript 混编文件中,首行和仅包含 */ 的文本行是两个代码区的分界线,上半区是 bat 代码,下半区是 jscript 代码。
混编文件存为 *.bat 运行,则先跑 bat 代码;存为 *.js 运行,则先跑 jscript 代码(用此特性可实现批处脚本的隐藏运行)。
如要 提权+隐藏 批处脚本,可修改末尾行中的 'runas',1 为 'runas',0 以及禁用 bat 代码区中会引发屏显和暂停的代码,示例(代码存为 test-4.bat)如下
test-4.bat
- 2>1/* ::
- echo off & fltmc>nul 2>&1 || (
- set argv=%*
- cscript /nologo /e:jscript "%~f0"
- exit/b )
- ::以下是提权后被执行的批处脚本代码示例(仅复写全部命令行参数到 test.txt)
- >"%~dp0test.txt" echo,%*
- exit/b
- */
- v=WSH.createObject('wscript.shell').environment('process')('argv');
- argv='/c ""'+WSH.scriptfullname+'\" '+v+'\"';
- WSH.createObject('shell.application').shellExecute('cmd.exe', argv, '', 'runas', 0), WSH.quit();
复制代码 在命令行运行 test-4.bat 123 "xx yy" "aa&^<|>bb" 可在写出的 test.txt 中查看命令行参数的完整结果。
如果仅是要隐藏运行批处脚本,示例代码(存为 test-5.js)如下
test-5.js
- 2>1/* ::
- echo off
- ::全部命令行参数被复制到剪贴板
- echo,%*|clip
- ::全部命令行参数被复写到 test.txt
- >"%~dp0test.txt" echo,%*
- del /q "%~dp0#$.bat" 2>nul
- exit/b
- */
- v=WSH.arguments, WSH.createObject('scripting.filesystemobject').copyFile(WSH.scriptfullname, '#$.bat');
- for (argv='',i=0,l=v.length; i<l; i++) argv+='"'+v(i)+'" ';
- WSH.createObject('shell.application').shellExecute('#$.bat', argv, '', '', 0), WSH.quit();
复制代码 在命令行运行 wscript test-5.js 123 "xx yy" "aa&^<|>bb" 其后用粘贴剪贴板或在写出的 test.txt 中查看命令行参数的完整结果。
为确保隐藏效果,须禁用 bat 代码区中会引发屏显和暂停的代码。
最后说一句,判断当前是否为提权状态(获得管理员身份)的方法,常用的有 fltmc,net session, reg add 等方法,其中采用 fltmc 不依赖网络且反应速度和系统兼容性更好。
【声明】编写本帖时在每个代码框插入代码后出现怪状,头部的 @echo off 均被网址符包裹了,几次编辑处理均无效,只能将每个代码框中头部的 @ 字符删除了,烦请复制代码者后续予以订正补齐
|
|