滲透基礎——Windows下計劃任務的使用
來自專欄安全脈搏2 人贊了文章
0x00 前言
在滲透測試中,尤其是域滲透,常常會用到Windows系統的計劃任務,一是用於遠程啟動程序,二是用於程序的自啟動
那麼,計劃任務具體有哪些使用技巧呢?是否對許可權有要求?一定需要管理員許可權才能運行嗎?
0x01 簡介
本文將要介紹以下內容:
- 命令行實現
- c++實現
- 不同許可權下創建計劃任務的區別
- COM組件ITaskService能否提權運行
- 命令行開啟和關閉計劃任務
- 日誌位置
0x02 簡介
官方說明文檔:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa446802(v=vs.85).aspx
需要開啟服務Task Scheduler
可在以下情況觸發:
- When a specific system event occurs.
- At a specific time.
- At a specific time on a daily schedule.
- At a specific time on a weekly schedule.
- At a specific time on a monthly schedule.
- At a specific time on a monthly day-of-week schedule.
- When the computer enters an idle state.
- When the task is registered.
- When the system is booted.
- When a user logs on.
- When a Terminal Server session changes state.
計劃任務創建後,會在C:WindowsSystem32Tasks保存XML格式的配置文件
0x03 計劃任務的配置方式
1、界面操作
執行taskschd.msc,如下圖
選中Task Scheduler Library ,右鍵 -> Create Task...
彈出界面,逐個配置即可,如下圖
2、命令行配置
(1) at 命令
(管理員許可權)
eg:
at 23:53 notepad.exe
默認以system許可權啟動,適用於Win7
從Win8開始不再支持at命令,所以不過多介紹
(2) schtasks命令
支持Win7-Win10
1.每天固定時間,以普通許可權啟動notepad.exe
命令如下:
schtasks /Create /TN TestService1 /SC DAILY /ST 01:02 /TR notepad.exe
C:WindowsSystem32Tasks產生新文件TestService1,內容如下:
值得注意的是<RunLevel>LeastPrivilege</RunLevel>,代表許可權為普通用戶
2.每天固定時間,以system許可權啟動notepad.exe
命令如下(管理員許可權):
schtasks /Create /TN TestService2 /SC DAILY /ST 01:02 /TR notepad.exe /RL HIGHEST
C:WindowsSystem32Tasks產生新文件TestService2,內容如下:
值得注意的是<RunLevel>HighestAvailable</RunLevel>,代表許可權為最高,一般為System許可權
3.每天固定時間,以system許可權啟動notepad.exe,通過導入xml文件的方式
以文件TestService2作為模板,修改啟動時間,保存為1.xml,內容如下:
通過xml文件導入配置,建立計劃任務,以system許可權啟動,命令如下(管理員許可權):
schtasks /create /xml c: est1.xml /tn TestService3
註:
如果是一個新的系統,修改<Author>、<Date>、<StartBoundary>、<UserId>和<Command>即可
4.每天固定時間,以普通許可權啟動notepad.exe,通過導入xml文件的方式
修改1.xml:
<RunLevel>HighestAvailable</RunLevel>改為<RunLevel>LeastPrivilege</RunLevel>即可
導入配置的命令如下:
schtasks /create /xml c: est1.xml /tn TestService4
補充:schtasks的其他命令用法
查看服務狀態:
schtasks /Query /TN TestService1
刪除服務:
schtasks /Delete /TN TestService1 /F
註:
服務執行成功後不會自動刪除
0x04 編寫程序實現
官方文檔:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa383614(v=vs.85).aspx
c++定時啟動程序的實現實例:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa383624(v=vs.85).aspx
程序實現了在特定時間啟動notepad.exe
通過分析源碼,發現是調用了COM組件ITaskService
於是產生了一個新問題,能否通過COM組件ITaskService越權執行?
答案是不能,原因如下:
首先,在c代碼中能夠找到CLSID_TaskScheduler對應的GUID,位於taskschd.h文件中
如下圖
GUID為"0f87369f-a4e5-4cfc-bd3e-73e6154572dd"
查看註冊表信息,路徑為HKEY_LOCAL_MACHINESOFTWAREClassesCLSID{0f87369f-a4e5-4cfc-bd3e-73e6154572dd}
信息如下圖
未發現註冊表項Elevation,也就是說這個COM組件ITaskService不支持使用COM Elevation Moniker提升許可權
那麼,能否通過添加註冊表項Elevation實現COM組件提升許可權呢?
答案也是不可以,測試如下:
修改註冊表HKEY_LOCAL_MACHINESOFTWAREClassesCLSID{0f87369f-a4e5-4cfc-bd3e-73e6154572dd},需要TrustedInstaller許可權
關於如何獲得TrustedInstaller許可權可參考文章《滲透技巧——Token竊取與利用》
接下來添加註冊表項Elevation,值為1
測試1:
添加LocalizedString,值為C:Windowssystem32 askschd.dll
如下圖
修改官方的實例代碼,添加使用COM Elevation Moniker提升許可權的代碼,關鍵代碼如下:
HWND hwnd = GetConsoleWindow(); BIND_OPTS3 bo; WCHAR wszCLSID[50]; WCHAR wszMonikerName[300]; StringFromGUID2( CLSID_TaskScheduler,wszCLSID,sizeof(wszCLSID)/sizeof(wszCLSID[0])); hr = StringCchPrintf(wszMonikerName,sizeof(wszMonikerName)/sizeof(wszMonikerName[0]),L"Elevation:Administrator!new:%s", wszCLSID); memset(&bo, 0, sizeof(bo)); bo.cbStruct = sizeof(bo); bo.hwnd = hwnd; bo.dwClassContext = CLSCTX_LOCAL_SERVER; hr = CoGetObject(wszMonikerName, &bo, IID_PPV_ARGS(&pService));
程序報錯,而且沒有彈出需要提升許可權的UAC對話框,對其跟蹤調試,如下圖
提示(ERROR_INVALID_DATA) : 數據無效
通過IDA靜態分析taskschd.dll,查看Function
沒有發現提升許可權的函數(關鍵詞Elevated、Admin)
測試2:
接下來嘗試將LocalizedString修改為其他可用的路徑
LocalizedString設置為@%SystemRoot%system32shell32.dll,-50176(COM組件IFileOperation的值)
執行過程彈出需要提升許可權的UAC對話框,接下來報錯,如下圖
示REGDB_E_CLASSNOTREG Class not registered
表示這個組件不支持ITaskService::Connect
和預期的一樣,shell32.dll不包含函數ITaskService::Connect
綜上,不能簡單的通過修改註冊表就能使一個普通的COM組件支持許可權提升
接下來介紹一下C++代碼在實現上的細節
1、添加計劃任務,定時以普通許可權執行程序
直接參考示例代碼即可,地址如下:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa383624(v=vs.85).aspx
修改源代碼的啟動時間,去掉結束時間
2、添加計劃任務,定時以system許可權執行程序
需要管理員許可權
上面的代碼直接以管理員許可權運行是不可以的,這是因為並沒有指定以最高許可權啟動
如下圖
需要修改源代碼,添加指定以HIGHEST許可權啟動
關鍵代碼如下:
當然,以普通許可權啟動會提示許可權不夠,如下圖
0x05 TaskScheduler日誌
日誌類別: Microsoft-Windows-TaskScheduler
保存位置: C:WindowsSystem32winevtLogs
TaskScheduler日誌功能默認關閉
開啟方法:
註冊表位置:HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionWINEVTChannelsMicrosoft-Windows-TaskScheduler/Operational
鍵Enabled設為1(默認為0)
cmd命令如下:
REG ADD "HKLMSOFTWAREMicrosoftWindowsCurrentVersionWINEVTChannelsMicrosoft-Windows-TaskScheduler/Operational" /v Enabled /t REG_DWORD /d 1 /f
統計日誌列表,查詢所有日誌信息,包含時間,數目:
wevtutil gli Microsoft-Windows-TaskScheduler/Operational
查看日誌內容:
wevtutil qe Microsoft-Windows-TaskScheduler/Operational
刪除該類日誌所有內容:
wevtutil cl Microsoft-Windows-TaskScheduler/Operational
刪除單條日誌:
該部分放在之後的文章進行詳細介紹
0x06 小結
本文介紹了計劃任務的常用內容,包括多種創建計劃任務的方法,不同許可權創建計劃任務的區別,經測試得出了一個結論,COM組件ITaskService無法提權運行
歡迎來安全脈搏查看更多的乾貨文章和我們一起交流互動哦!
脈搏地址:安全脈搏 | 分享技術,悅享品質
微博地址:Sina Visitor System
推薦閱讀:
※(總結我的學習之路-新手科普篇)
※mysql注入學習2(資料庫信息收集)
※安全開發:說一說Python的作用域與名稱空間
※由SQL注入(或資料庫許可權)滲透WordPress站點的一些手法
※域滲透初探(二):域環境搭建