Realtek NIC利用時のESXi 6.5インストール方法メモ

先日、Windows7VMware Workstation Proを入れていた自宅のデスクトップ機のWindowsを潰して、ESXi 6.5を導入しました。この際にNICRealtekであったため少々手こずったため、そのメモです。

なお同様に困っている人は多くいますので、そんなに目新しい記事ではありません……作業の際は、以下の雑木林さんの記事を参考にさせて頂きました。

ちなみにESXiというのはVMware vSphere Hypervisorに含まれるコンポーネントのひとつでしかない(らしい)ので、本来は「VMware vSphere Hypervisor(ESXi)」と書くのが正しいようです。が、いちいち書くと長いので、以下単に「ESXi」と書きます。

環境

ダメな例

ESXiはNICのドライブ対応が非常に悪く、RealtekNICではデフォルトでは認識されず以下のように"No Network Adapters"と言われてインストールが止まってしまいます。

IntelNICであればほぼ確実に対応しているのでIntelNICを刺してしまうという案がありますが、ここではRealtekNICを認識させるべく頑張ります。

全体の流れ

基本的に、VMware PowerCLIを使ってRealtekのドライバ入りISOファイルを作る。という流れになります。

  1. BIOS設定でIntel VT-xを有効にする
  2. vmwareアカウントを作成し、ライセンスキーをメモっておく。
  3. PowerShellをアップデートし、PowerShellの設定を変更する
  4. VMware PowerCLI 6.5をダウンロードし、インストールする。
    1. インストール後、PATHの設定をおこなう
  5. ESXi-Customizer-PSでISOファイルを作成する
  6. 作成したISOファイルをCD-Rに焼いて、ブートする

まずはじめに、BIOSIntel Virtualization Technologyを「Enabled」に設定しておきましょう。

vmwareアカウントの作成とライセンスキーの入手

ESXiの利用は周知のとおり無償ですが、ダウンロードにはVMwareアカウントを登録する必要があります。またESXiは無償とはいえライセンスキーを登録する必要があるため、こちらのキーの入手が必要です。

2017年11月現在ではESXi6.5は以下のリンクでしたが、コロコロとリンク先は変わるようなので、「vSphere Hypervisor download」などで検索してたどり着くとよいでしょう。


このように、ダウンロードページに合わせてライセンスコードも表示されます。これをメモしておきます。

PowerShellのアップデートと設定変更

バージョンにもよりますが、Windows7ではPowerShell 2.0がデフォルトとなっています。これをPowerShell 4.0以上へとアップデートします。

PowerShellのバージョンは、$PSVersionTable と入力して表示される「PSVersion」で確認できます。これはWindows10なので、PowerShellは5.1です。

PowerShellをアップデートする場合、Windows Management Framework 4.0をインストールします。

PowerShellの設定変更

PowerShellはデフォルトでは安全側に倒されており、任意の.ps1ファイルが実行できないRestrictedモードになっています。

PS C:\Users\ozuma> Get-ExecutionPolicy
Restricted

これを一時的にUnrestrictedモードへ変更します。この作業には管理者権限が必要なため、PowerShellは右クリックして「管理者として実行」した上で作業します。

> Set-ExecutionPolicy Unrestricted

この設定は危険を伴うため、作業が終わったら最後にRestrictedに戻しておくようにしてください。

> Set-ExecutionPolicy Restricted

VMware PowerCLI 6.5のインストール

VMwareの各種PowerShellツール、PowerCLIをダウンロードします。こちらのダウンロードもvmwareアカウントが必要です。

上記のリンクも変わる可能性があるため、PowerCLIで検索してたどり着くと良いでしょう。

インストール自体は簡単で、ダウンロードしたインストーラを実行するだけです。

PATHの設定

PowerCLIのインストール後に指示されますが、PATHを通す設定が必要です。私の場合は以下となりました。

> $p = [Environment]::GetEnvironmentVariable("PSModulePath")
> $p += ";C:\Program Files (x86)\VMware\Infrastructure\vSphere PowerCLI\Modules\"
> [Environment]::SetEnvironmentVariable("PSModulePath",$p)

参考:https://blogs.vmware.com/PowerCLI/2015/03/powercli-6-0-introducing-powercli-modules.html

ESXi-Customizer-PSのインストール

続いて、実際にRealtekドライバを取り込んでESXiのインストールディスクISOファイルを作成する、ESXi-Customizer-PSをインストールします。

こちらの「Download latest version」よりダウンロードします。こちらは物自体はps1スクリプトひとつだけですので、インストールは不要です。適当な作業ディレクトリに置けばよいです。

ISOファイルの作成

先ほどのESXi-Customizer-PSで、Realtekドライバ入りのISOファイルを作成します。まずVMware PowerCLIを起動し、先ほどESXi-Customizer-PSのps1ファイルを置いた場所へと移動します。

続いて以下のコマンドを実行します。

PowerCLI C:\Users\ozuma\local\vmware> .\ESXi-Customizer-PS-v2.5.1.ps1 -v65 -vft -load net55-r8168
  • -v65:ESXi 6.5のISOを作成
  • -vft:詳細よく分からない。ESXi-Customizer-PS利用で依存関係をうまくやってくれる設定らしい(?)
  • -load:組み込むドライバを指定
  • net55-r8168:Realtek 811Fはこのドライバに入っているため、これを指定します

これを実行すると、少々時間がかかりますがISOファイルが作成されます。あとはこのISOファイルをCD-Rに焼いてブートし、通常通りESXiのインストールをおこなうだけです。

補足

昔のVMwareを使っていた方は、「VMware vSphere Clientはどこ?」と思うでしょうが、ESXi 6.5では完全にWebインタフェースに以降されました。このためvSphere Clientは不要です。

ChromeなどWebブラウザだけでコンソール作業も全ておこなえるのは、なかなかすごいですね。

macOS High Sierraのrootログイン脆弱性

2017/11/30更新:セキュリティアップデートがリリースされました。

このアップデートを当てると、rootユーザを有効にした状態でも強制的に無効にされます。また、改めてrootユーザを有効にしようとすると、新しいパスワードを求められます。

このため本記事に記載した、「パスワードが空のrootユーザ」がいる状態の問題も、自動的に解決されます。

                                                                                                • -

本日話題になった、いとも簡単にmacOS High Sierraでrootが取れるという件について、色々落とし穴が多いのでまとめてみました。

対象

High Sierra 10.13.1(2017/11/29現在の最新)

予備知識

通常、High Sierraではrootユーザは無効となっています。これは次のように、「ディレクトリユーティリティ」を使うと「ルートユーザを有効にする」という選択ができることからも分かります。

ただしこの場合でも、sudo suコマンドを使うことで、現ログインユーザのパスワードを知っている者はrootでシェルを取ることができます。

このためmacで言う「ルートユーザが無効」とは、「rootでログインは、”普通は"できない」くらいに捉えておくとよいでしょう。psコマンドでも、rootユーザ権限で動いているプロセスは大量にあることが確認できます。

脆弱性の作用について

再現手順については、各所に報告されていることからここでは解説しません。実際に脆弱性を利用すると、次のように「ディレクトリユーティリティ」で「ルートユーザを無効にする」という選択肢が出ていることから、ルートユーザが有効となったことが分かります。

この際注意しないといけないのは、同時にルートユーザのパスワードが空っぽ(空文字列)になるということです。このため、いったんログアウトして「その他のユーザ」から、ユーザ名を「root」、パスワードを空にするとGUIでログインできます。

rootでログインした様子がこちらです。

当然のことながらrootユーザですから、この状態でシステム権限を完全に掌握したことになります。

なおこの際、コンソール(loginコマンド)やsshでは空文字列でログインできませんでした。


この部分は何か別の制御がされているようです。(sshは、デフォルトではPermitRootLoginはprohibit-passwordですしね)

事後対応

攻撃を受けた場合のみならず、遊び半分でこの脆弱性を試した際も十分注意しないといけないのは、本脆弱性が発動した後は「rootユーザが有効化されており、そのパスワードが空文字列である」ということです。そこで対策として、rootユーザにパスワードを設定しなくてはいけません。なお後述しますが、rootユーザの無効化は不要です。

rootユーザのパスワードの変更は、一般ユーザが、ターミナルよりsudoでpasswdコマンドを実行することで可能です。

sudoですので、はじめに現ユーザのパスワード、続いてrootユーザの新規パスワードを2回入力します。ここでは、十分に長く複雑なパスワードを付与しましょう。

これにより、既知の攻撃手法を用いても、既にrootにはパスワードが付加されているため、rootユーザのパスワードを知らないと攻撃ができません。

また、当然のことながらログイン画面からのrootによるGUIログインも不可となります。

なお注意しないといけないのは、最後に「やれやれ」とrootユーザの無効化をしてはいけないということです。(実は今日やってしまい、会社の先輩からそれはダメだと教えてもらいました)。
rootユーザを「ディレクトリユーティリティ」から再び無効化してしまうと、たとえrootにパスワードを設定していても本脆弱性は発動し、再び「パスワードが空文字列のrootユーザ」の状態へと戻ってしまいます。

そのため、rootユーザは現時点では有効化しておく方が安全です。

対策

現状、Appleからパッチがリリースされていないため、予備的対策としてできることを挙げます。

  • rootユーザを有効化し、長いパスワードを付加しておく
  • 離席など目を離す際は、必ずスクリーンロックをかける

なお本脆弱性は物理的に端末を触れることができる状態で、ログイン後の画面を操作できるときしか実行できませんから、スクリーンロックをかけるだけでも十分な対策となります(たぶん)。ただし、「共有」設定で「画面共有」をOnにしていると操作ができてしまいますから、こちらはOffにしておきましょう。

「はじめて読むPentium マシン語入門編」をVisual Studio 2017で学習する

最近はじめてCTF(Capture The Flag)にチャレンジしたので、アセンブラやバイナリに興味が湧いてきてしまいました。ということで、初心者向けとして非常に良書だと思っている、「はじめて読むPentium マシン語入門編」を再読していました。

はじめて読むPentium マシン語入門編

はじめて読むPentium マシン語入門編

ところがこの本は2004年出版で、かなり昔の本ということもあって、学習環境がVisual C++ 2003を前提として書かれています。

ではこの学習環境を今は作れないのかというと……2017年現在は、無償で利用できるVisual Studio 2017 Community Editionがあります。これでほぼ同書内と同じ学習環境が構築できるので、その方法を紹介しておこうと思います。(というか、忘れないように自分用のメモという意味合いが強かったり。)

前置きが長くなりましたが、この記事は、「マシン語アセンブラにちょっと触れてみたい/学習を始めてみたいけど、何をどうしたらいいかさっぱり分からない……」という人向けです。

Visual Studio 2017のインストール

2017年現在、無償で利用できるVisual Stduioで、マシン語の学習に利用できるモノとしては、「Visual Studio Community 2017」があります。

なお企業でCommunity Editionを使う際にはいくつかライセンスの問題がありますが、個人が学習用に使うならば何も問題ありません。具体的なダウンロード手順等は省略します。MSのサイトに行けば普通に見つかりますね。

ただし、インストールの際に、インストールするオプションに注意が必要なので以下で説明します。

マシン語学習のための初期インストール

Community Editionでは、マシン語学習用の環境であるWin32コンソールアプリケーションを作るモジュール(CLIサポート)がデフォルトではインストールされません。このため、インストール時にオプションを選択する必要があります。

具体的には、Visual Studioインストーラを起動すると、下図のインストールするコンポーネントの選択画面に移ります。

ここでまず、「C++によるデスクトップ開発」のチェックが外れているので、クリックして選択します。

さらに上図で、右側の「C++/CLIサポート」にもチェックを入れておきます。これをチェックしておかないと、Win32コンソールアプリケーションが作成できません。

これで「インストール」を押せば、必要なモジュールが入った状態でインストールできます。なおインストールには6GBちょっと必要と、なんとまぁ富豪的マシン語の学習環境です(笑。

インストール完了後に、「ファイル」→「新規作成」→「プロジェクト」で、Visual C++で「Win32 コンソール アプリケーション」が選べるようになっていることを確認してください。

「はじめて読むPentium」の学習環境は、これでひとまずインストール完了です。

「はじめて読むPentium」のサンプルコードの書き方と実行

ここでは、93ページからのリスト5-1「プロジェクト名findzero」の例を、現在のVisual Studio 2017で追うやり方を紹介します。なお、「はじめて読むPentium マシン語入門編」を持っていることを前提としているので、持っていない人はまず買ってください。

ソースコードの書き方

リスト5-1は、以下のようなコードです。これを実際にVisual C++で書いてみましょう。なお、Visual C++Intel記法を用いるため、mov等の引数は「mov dst src」です。

データ:
  char Title[] = "Hello World!";

プログラム:
  mov   ecx, 100h
  mov   edi, offset Title
Loop1:
  cmp   [edi], 0
  je    end
  inc   edi
  loop  Loop1
end:

(引用:「はじめて読むPentium マシン語入門編」リスト5-1)

まずデータ部は、グローバル変数となるためmain関数の外で定義します。実際のプログラム(アセンブリ言語)は、Visual C++インラインアセンブラの機能を利用して記述します。具体的には、main関数の中に、以下のように __asm{} というブロックを作ります。

   __asm {
      (ここにアセンブリ言語を書く)
   }

インラインアセンブラでリスト5-1を記述してみたのが以下の図です。本の指示通りにブレークポイントも設定してあります。

なおブレークポイントやステップイン実行は、Visual C++ 2003の頃から操作に変わりは無いので、本の通りに設定できます。

デバッグウィンドウ

メニューの「デバッグ」→「デバッグの開始」後、「デバッグ」→「ウィンドウ」→「レジスタ」(Ctrl+Alt+G)でレジスタの内容が確認できます。なおレジスタの子ウィンドウは自由に移動できるので、タイトルバーをクリックして掴んで、しっくりくる場所に移動してください。

上の図は、「はじめて読むPentium」 の通りに、「自動変数」のウィンドウに入れた例です。

メモリの内容も確認してみましょう。下図のとおり、今、変数Title(Hello, World!)のアドレスは0x00a79000です。

ここで、「デバッグ」→「ウィンドウ」→「メモリ」→「メモリ1」を選択し、0x00a79000を確認してみると、下の図のとおり該当のアドレスには確かに「Hello World!」が格納されています。

ここで、「!」のASCIIコードは0x21であることを思い出してください。アドレス0x00a79000から12バイトめの「21」の後ろは0x00となっており、文字列が終端されていることが分かります。(この例では、他のアドレスも0x00が多いのでちょっと分かりにくいけど)。

混合モードと逆アセンブル

「はじめて読むPentium」 の本の中では、「混合モード」でマシン語を確認しようと書かれています。しかしこれは古い呼び名で、現在のVisual Studio 2017では「逆アセンブル」で確認することができます。

ここでは、以下のようなシンプルなC言語のソースを書きます。

#include "stdafx.h"

int main()
{
    char ch = 'A';

    printf("ch=%c\n", ch);

    return 0;
}

ブレークポイントを設定してデバッグを開始したら、「デバッグ」→「ウィンドウ」→「逆アセンブル」(Ctrl+Alt+D)としてみてください。すると下図のように、C言語のソースがアセンブラ言語に展開された混合モードで表示されます。

さらにこの状態で、逆アセンブルウィンドウで右クリックして「コードバイトの表示(Y)」を選択すると、次のように各行のニーモニックに対応するマシン語が表示されます。

まとめ

「はじめて読むPentium マシン語入門編」を、現在のVisual Studio 2017(Visual C++ 2017)で学習する環境について解説しました。ひとまず操作がこれだけ分かっていれば、同書を読み進めることができる(はず)です。

なお「はじめて読む」シリーズは、実は「はじめて読む486―32ビットコンピュータをやさしく語る」が、もっとも内容が濃く優れた良書、という評判が多いです。

はじめて読む486―32ビットコンピュータをやさしく語る

はじめて読む486―32ビットコンピュータをやさしく語る

しかし、マシン語に全くの初心者ならば、これよりもまずは「はじめて読むPentium マシン語入門編」がいいかなというのが私の意見です。同書はタイトル通りまさに「マシン語入門」であって、「Pentium入門」ではありません。そのため中級者以上からは「内容が簡単すぎる」とあまり評判がよろしく無いようですが、逆に初心者向けとしては非常にシンプルで分かりやすい本です。
また本記事で解説したとおり、2017年現在でも、無償でVisual Studio 2017で手を動かして色々試すことができますから、マシン語への入り口へはぴったりだと私は思います。

nmapのクリスマススキャン(-xS)をもっとキラキラさせよう

あまりに長いあいだこのブログを放置していましたが、大丈夫です。生きています。

ただ、ちょっとメンタル的に色々ありすぎて放置していました。。。さすがに1年以上も更新がないとツラいので、ちょうどクリスマスということで、ポートスキャナツールNmapの、クリスマススキャンについて軽く書いてみることにしました。

Nmapとクリスマス

今日は12月25、クリスマスです。セキュリティ診断の業界では有名ですが、12月25日にnmapで-vオプションを付けてポートスキャンをすると、nmapが、

"Nmap wishes you a merry Christmas!"

というメッセージを出してクリスマスを祝ってくれます。

診断業界の皆は、クリスマスに脆弱性診断をするとき、このメッセージを見るとみんなほんわかとした気分になったものです……(んなわけねーだろ! という誰かの声が聞こえる)

この際Nmapは、ついでに、"Specify -sX for Xmas Scan"と、クリスマススキャンのやり方も教えてくれます。クリスマススキャンとは、通常のSYNスキャンと違い、TCP FlagsのURG/PSH/FINビットを立ててスキャンするものです。一応nmapのマニュアルには、こういう特殊なスキャンをすることで一部のファイアウォールを通過できる場合がある……ということが書いてありますが、まぁこじつけで、実践でこのスキャンを使うことはまず無い。それよりも、ビットがいっぱい立っていてピカピカしているからクリスマスツリーのようだ……ということでクリスマススキャンと呼ばれる説が有名です。

クリスマススキャンをもっとピカピカさせる

さて、こうなると、「たったの3bitじゃもの足りん、TCP Flagsの全bitを立ててもっとピカピカさせよう」と思うのが人情というものです。nmapでは--scanflagsオプションを付けるとこれを実現できます。

やり方は2つあって、一つはTCP Flagsは6bitなので、「--scanflags 63」と指定すれば全ビット起立したパケットが飛びます。もう一つは文字列指定で、「--scanflags URGACKPSHRSTSYNFIN」と、URGからFINまで全部並べると、これも全TCP Flagsのビットが立ったパケットが飛びます。

# nmap -v --scanflags 63 -p 22 10.5.17.208
または
# nmap -v --scanflags URGACKPSHRSTSYNFIN -p 22 10.5.17.208

これで、6bit立ちました。キラキラしてますね。

TCP Flagsは9bit

と、ここまで書いておや? と思った方もいるでしょう。そう、実はTCP Flagsは後年さらに拡張されており、現在は6bitではありません(私が大学で学んだときは、まだ6bitだったんだけどな〜)。

元々予備に用意されていた予約ビットを使う形で、まずRFC 3168で、ECN-Echo(ECE)とCongestion Window Reduced(CWR)の2bitが追加されました。さらにRFC 3540で、ECN-nonce(NS)の1bitが追加されました。というわけでこれでもっとピカピカキラキラしたスキャンができるぞ! というわけですが、ちょっと試した限り、--scanflagsは255までしか指定できないので9bitめをキラキラさせることができませんでした。本当はできるのかもしれませんけど、私の知識不足&時間切れです。

# nmap -v --scanflags 255 -p 22 192.168.2.9
または
# nmap -v --scanflags CWRECEURGACKPSHRSTSYNFIN -p 22 192.168.2.9

これで、8bitキラキラさせることができました! これならようやくクリスマスツリーと言えるでしょう(たぶん)。なお、このスキャンの実用性は、まぁ、自己満足だけなのでゼロですね……。

補足すると、scanflagsオプションは奥が深く、「この組み合わせでOS検出ができるぞ!」とか、「クリスマススキャンで特定のACLが回避できるぞ!」とか色々と議論・研究がされているのですが、ちょっとそこまで詳しく調べてない&よく知らないのでここではつっこまないことにします。

ということで中途半端ですが、おしまい。

参考リンク

  • Nmapの真実
    • abendさんによるNmap面白ネタ、クリスマススキャンの話も出ています。おもしろ。