发布于2022年11月8日3年前 0x00 前言 在渗透测试中,尤其是域渗透,常常会用到Windows操作系统操作系统系统的计划任务,一是用于远程启动程序,二是用于程序的自启动 那么,计划任务具体有哪些使用技巧呢?是否对权限有要求?一定需要管理员权限才能运行吗? 0x01 简介 本文将要介绍以下内容: 命令行实现 c实现 不同权限下创建计划任务的区别 计算机输出缩微胶片组件ITaskService能否提权运行 命令行开启和关闭计划任务 日志位置 0x02 简介 官方说明文档: https://msdn。微软。com/en-us/library/windows/desktop/aa 446802(v=vs . 85).aspx 需要开启服务任务调度程序 可在以下情况触发: 当特定的系统事件发生时。 在特定的时间。 在每天计划的特定时间。 在每周计划的特定时间。 在每月计划的特定时间。 在每月某天计划的特定时间。 当计算机进入空闲状态时。 任务注册时。 当系统启动时。 当用户登录时。 当终端服务器会话改变状态时。 计划任务创建后,会在C:\Windows\System32\Tasks保存可扩展标记语言格式的配置文件 0x03 计划任务的配置方式 1、界面操作 执行taskschd.msc,如下图 选中任务计划程序库,右键-创建任务. 弹出界面,逐个配置即可,如下图 2、命令行配置 (1) at 命令 (管理员权限) 例如: notepad.exe时间23点53分 默认以系统权限启动,适用于Win7 从Win8开始不再支持在命令,所以不过多介绍 (2) schtasks命令 支持Win7-Win10 1.每天固定时间,以普通权限启动notepad.exe 命令如下: schtasks/Create/TN测试服务1/SC DAILY/ST 01:02/TR notepad.exe C:\Windows\System32\Tasks产生新文件测试服务1,内容如下: ?可扩展标记语言版本='1.0 '编码='UTF-16 '? 2018-05-23t 17:21:00a 2018-05-23t 01:02:00 rue 1 gnorenetruetruefalsept 10 mpt 1 htruefalstruetruefalssept 72h 7记事本。exe win-r7mm 90 er BMD \ aInteractiveTokenLeastPrivilege 值得注意的是最起码的特权,代表权限为普通用户 2.每天固定时间,以system权限启动notepad.exe 命令如下(管理员权限): schtasks/Create/TN测试服务2/SC DAILY/ST 01:02/TR notepad.exe/RL最高 C:\Windows\System32\Tasks产生新文件测试服务2,内容如下: ?可扩展标记语言版本='1.0 '编码='UTF-16 '? 2018-05-23t 17:23:23a 2018-05-23t 01:02:00 rue 1 highestavailablewin-r7mm 90 er BMD \ ainteractivetokenignorenorenewtrue true true utruealfalsept 10 mpt 1 htruefalstruealfalssept 72h 7记事本。可执行程序的扩展名 值得注意的是高可用性,代表权限为最高,一般为系统权限 3.每天固定时间,以system权限启动notepad.exe,通过导入xml文件的方式 以文件测试服务2作为模板,修改启动时间,保存为1.xml,内容如下: ?可扩展标记语言版本='1.0 '编码='UTF-16 '? 2018-05-23t 17:23:23a 2018-05-23t 01:03:00 rue 1 highestavailablewin-r7mm 90 er BMD \ ainteractivetokenignorenorenewtrue true true utruealfalsept 10 mpt 1 htruefalstruealfalssept 72h 7记事本。可执行程序的扩展名 通过可扩展标记语言文件导入配置,建立计划任务,以系统权限启动,命令如下(管理员权限): schtasks/create/XML c:\ test \ 1。XML/TN测试服务3 注: 如果是一个新的系统,修改、和即可 4.每天固定时间,以普通权限启动notepad.exe,通过导入xml文件的方式 修改1.xml: 最高可用性改为最低特权即可 导入配置的命令如下: schtasks/create/XML c:\ test \ 1。XML/TN测试服务4 补充:schtasks的其他命令用法 查看服务状态: schtasks /Query /TN TestService1 删除服务: schtasks/Delete/TN测试服务1/F 注: 服务执行成功后不会自动删除 0x04 编写程序实现 官方文档: https://msdn。微软。com/en-us/library/windows/desktop/aa 383614(v=vs . 85).aspx c定时启动程序的实现实例: https://msdn。微软。com/en-us/library/windows/desktop/aa 383624(v=vs . 85).aspx 程序实现了在特定时间启动notepad.exe 通过分析源码,发现是调用了计算机输出缩微胶片组件ITaskService 于是产生了一个新问题,能否通过COM组件ITaskService越权执行? 答案是不能,原因如下: 首先,在c代码中能够找到CLSID_TaskScheduler对应的GUID,位于taskschd.h文件中 如下图 全局唯一标识符为0f 87369 f-a4e 5-4c fc-bd3e-73e 6154572 DD ' 查看注册表信息,路径为HKEY _ LOCAL _ MACHINE \ SOFTWARE \ Classes \ CLSID \ { 0 f 87369 f-a4e 5-4c fc-bd3e-73e 6154572 DD } 信息如下图 未发现注册表项标高,也就是说这个计算机输出缩微胶片组件ITaskService不支持使用计算机输出缩微胶片提升名字对象提升权限 那么,能否通过添加注册表项海拔实现计算机输出缩微胶片组件提升权限呢? 答案也是不可以,测试如下: 修改注册表HKEY _ LOCAL _ MACHINE \ SOFTWARE \ Classes \ CLSID \ { 0 f 87369 f-a4e 5-4c fc-bd3e-73e 6154572 DD },需要可信安装者权限 关于如何获得可信安装者权限可参考文章《渗透技巧——Token窃取与利用》 接下来添加注册表项标高,值为一 测试1: 添加本地化字符串,值为c:\ Windows \ system32 \ taskschd。动态链接库 如下图 修改官方的实例代码,添加使用计算机输出缩微胶片提升名字对象提升权限的代码,关键代码如下: HWND HWND=GetConsoleWindow(); BIND _ OPTS3 bo WCHAR wszCLSID[50]; WCHAR wszMonikerName[300]; stringfromguid 2(CLSID _ task scheduler,wszCLSID,sizeof(wszCLSID)/sizeof(wszCLSID[0]); HR=stringchprintf(wszMonikerName,sizeof(wszMonikerName)/sizeof(wszMonikerName[0]),L'Elevation:Administrator!新:%s ',wszCLSID); memset(bo,0,sizeof(bo)); 博。CB struct=sizeof(bo); bo.hwnd=hwnd 博。dwclasscontext=cls CTX本地服务器; HR=coge object(wszMonikerName,bo,IID _ PPV _ ARGS(pService)); 程序报错,而且没有弹出需要提升权限的UAC对话框,对其跟踪调试,如下图 提示(错误无效数据) :数据无效 通过国际开发协会静态分析taskschd.dll,查看功能 没有发现提升权限的函数(关键词提升、管理) 测试2: 接下来尝试将本地化字符串修改为其他可用的路径 本地化字符串设置为@ % SystemRoot % \ system32 \ shell 32。dll,-50176(COM组件IFileOperation的值) 执行过程弹出需要提升权限的UAC对话框,接下来报错,如下图 提示REGDB_E_CLASSNOTREG类未注册 表示这个组件不支持ITaskService:Connect 和预期的一样,shell32.dll不包含函数ITaskService:Connect 综上,不能简单的通过修改注册表就能使一个普通的计算机输出缩微胶片组件支持权限提升 接下来介绍一下C代码在实现上的细节 1、添加计划任务,定时以普通权限执行程序 直接参考示例代码即可,地址如下: https://msdn。微软。com/en-us/library/windows/desktop/aa 383624(v=vs . 85).aspx 修改源代码的启动时间,去掉结束时间 2、添加计划任务,定时以system权限执行程序 需要管理员权限 上面的代码直接以管理员权限运行是不可以的,这是因为并没有指定以最高权限启动 如下图 需要修改源代码,添加指定以最高的权限启动 关键代码如下: //- //为任务创建主体-这些凭据 //被传递给RegisterTaskDefinition的凭据覆盖 IPrincipal * pPrincipal=NULL HR=pTask-get _ Principal(pPrincipal); 如果(失败(小时) ) { printf(' \ n无法获取主体指针:%x ',HR); 校样文件夹-Release(); pTask-Release(); coun initialize(); 返回1; } //将主体登录类型设置为交互式登录 HR=pPrincipal-put _ LOGON类型(TASK _ LOGON _ INTERACTIVE _ TOKEN); //pPrincipal-Release(); 如果(失败(小时) ) { printf(' \ n无法放置主体信息:%x ',HR); 校样文件夹-Release(); pTask-Release(); coun initialize(); 返回1; } // HR=pPrincipal-put _ run level(TASK _ run level _ HIGHEST); pPrincipal-Release(); 如果(失败(小时) ) { printf(' \ n无法放置主体信息:%x ',HR); 校样文件夹-Release(); pTask-Release(); coun initialize(); 返回1; } 当然,以普通权限启动会提示权限不够,如下图 0x05 TaskScheduler日志 日志类别:微软视窗系统任务计划程序 保存位置:C:\ Windows \ System32 \ wine vt \ Logs 任务调度程序日志功能默认关闭 开启方法: 注册表位置:HKEY _ LOCAL _ MACHINE \ SOFTWARE \ Microsoft \ Windows \ current version \ wine vt \ Channels \ Microsoft-Windows-任务计划程序/操作 键使能够设为1(默认为0) 煤矿管理局命令如下: 注册添加“HKLM”软件\ Microsoft \ Windows \ current version \ wine vt \ Channels \ Microsoft-Windows-任务计划程序/Operational '/v Enabled/t REG _ DWORD/d 1/f 统计日志列表,查询所有日志信息,包含时间,数目: 微软视窗系统任务调度程序/操作 查看日志内容: 微软视窗任务调度程序/操作 删除该类日志所有内容: 微软视窗系统任务调度程序/操作 删除单条日志: 该部分放在之后的文章进行详细介绍 0x06 小结 本文介绍了计划任务的常用内容,包括多种创建计划任务的方法,不同权限创建计划任务的区别,经测试得出了一个结论,COM组件ITaskService无法提权运行 留下回复
创建帐户或登录后发表意见