找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 330|回复: 12

[分享] 提权批处脚本时如何处理命令行参数以及隐藏运行批处脚本的一个简捷方法

[复制链接]
发表于 昨天 15:06 | 显示全部楼层 |阅读模式
本帖最后由 redyear2026 于 2026-4-4 13:27 编辑

    先明确一下,本帖所谓的批处脚本提权,即指通过脚本运行而获取管理员身份。
    据说 pe 无所谓提权,另当别论。
    高版 win 系统采用 powershell start 方法提权批处脚本,代码比较简洁,示例代码(存为 test-1.bat)如下
  1. echo off & fltmc>nul 2>nul || (powershell -c "start '%~f0' -arg '%*' -verb 'runas' " &exit/b)
  2. ::以下是在提权后被执行的批处脚本代码示例(仅屏显命令行参数)
  3. echo,%1,%2
  4. pause&exit/b
复制代码
   但此法不能保全用双引号包裹的单个命令行参数,在命令行运行 test-1.bat 123 "xx yy" 其屏显结果是第二个用双引号包裹的参数被部分丢失。
    改用以下示例代码(存为 test-2.bat)能够解决此问题,而且还允许用双引号包裹的单个命令行参数内含 &^<|> 等特殊字符。

    test-2.bat
  1. echo off & fltmc>nul 2>nul || (
  2.   set argv=%*
  3.   setlocal enabledelayedexpansion
  4.   set argv=/c \" \"%~f0\" !argv:"=\"!\"
  5.   powershell -c "start 'cmd.exe' -arg '!argv!' -verb runas" &exit/b )
  6. ::以下是在提权后被执行的批处脚本代码示例(仅屏显命令行参数)
  7. echo,%1,%2,%3
  8. 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
  1. 2>1/* ::
  2. echo off & fltmc>nul 2>&1 || (
  3.     set argv=%*
  4.     cscript /nologo /e:jscript "%~f0"
  5.     exit/b )
  6. ::以下是在提权后被执行的批处脚本代码示例(仅屏显命令行参数)
  7.     echo,%1,%2,%3
  8. pause&exit/b
  9. */
  10. v=WSH.createObject('wscript.shell').environment('process')('argv');
  11. argv='/c ""'+WSH.scriptfullname+'\" '+v+'\"';
  12. 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
  1. 2>1/* ::
  2. echo off & fltmc>nul 2>&1 || (
  3.    set argv=%*
  4.    cscript /nologo /e:jscript "%~f0"
  5.    exit/b )
  6. ::以下是提权后被执行的批处脚本代码示例(仅复写全部命令行参数到 test.txt)
  7. >"%~dp0test.txt" echo,%*
  8. exit/b
  9. */
  10. v=WSH.createObject('wscript.shell').environment('process')('argv');
  11. argv='/c ""'+WSH.scriptfullname+'\" '+v+'\"';
  12. 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
  1. 2>1/* ::
  2. echo off
  3. ::全部命令行参数被复制到剪贴板
  4. echo,%*|clip
  5. ::全部命令行参数被复写到 test.txt
  6. >"%~dp0test.txt" echo,%*
  7. del /q "%~dp0#$.bat" 2>nul
  8. exit/b
  9. */
  10. v=WSH.arguments, WSH.createObject('scripting.filesystemobject').copyFile(WSH.scriptfullname, '#$.bat');
  11. for (argv='',i=0,l=v.length; i<l; i++) argv+='"'+v(i)+'" ';
  12. 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 均被网址符包裹了,几次编辑处理均无效,只能将每个代码框中头部的 @ 字符删除了,烦请复制代码者后续予以订正补齐




发表于 昨天 15:30 | 显示全部楼层
感谢分享!!!
回复

使用道具 举报

发表于 昨天 15:30 | 显示全部楼层
建议考虑一下受限用户(USERS)组误打开批处理进入死循环的判断?

我是这样操作的:
  1. [url=home.php?mod=space&uid=336905]@echo[/url] off
  2. rem 是否为管理员组或用户是SYSTEM
  3. set "current_user="
  4. for /f "tokens=2 delims=\" %%a in ('whoami') do ( if not defined current_user set "current_user=%%a" )
  5. if "%current_user%"=="system" goto next1
  6. net user %current_user%|find /i "*administrators"&&goto next1||goto end
  7. :next1
  8. @ (fltmc >nul 2>nul) || (powershell start '%~f0' ' %*' -verb runas 2>nul & exit /b)
  9. set "ROOT=%~dp0"
  10. cd /d "%~dp0"||pushd "%~dp0"
复制代码

点评

请问受限用户在批处脚本中直接运行 fltmc 会是什么返回值?  详情 回复 发表于 昨天 18:00
回复

使用道具 举报

发表于 昨天 16:01 | 显示全部楼层
学习一下
回复

使用道具 举报

发表于 昨天 16:14 | 显示全部楼层
感谢分享
回复

使用道具 举报

发表于 昨天 16:27 | 显示全部楼层
为确保隐藏效果,须禁用 bat 代码区中会引发屏显和暂停的代码。
回复

使用道具 举报

发表于 昨天 16:37 | 显示全部楼层
回复

使用道具 举报

发表于 昨天 16:59 | 显示全部楼层
感谢分享!
回复

使用道具 举报

发表于 昨天 17:51 | 显示全部楼层
谢谢分享
回复

使用道具 举报

 楼主| 发表于 昨天 18:00 | 显示全部楼层
zts 发表于 2026-4-3 15:30
建议考虑一下受限用户(USERS)组误打开批处理进入死循环的判断?

我是这样操作的:

请问受限用户在批处脚本中直接运行 fltmc 会是什么返回值?
回复

使用道具 举报

发表于 昨天 18:59 来自手机 | 显示全部楼层
楼主研究得不错
回复

使用道具 举报

发表于 昨天 21:01 | 显示全部楼层
谢谢分享的技术
回复

使用道具 举报

发表于 6 小时前 | 显示全部楼层
谢谢分享
早期用计划任务 schtasks 来获取SYSTEM权限,现在新系统不知道还好使不
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-4-4 21:55

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表