調べて、学ぶ

検索したり実験したことを覚えとくブログ

チャチャッとwindowsでWDSとDHCP環境を構築してイメージ作成・適用する

WDSをいろいろ調べて学んでいた

前回に引き続き、windowsPE環境でキャプチャ・リストアする環境をクラサ環境にして大量リストアを夢見る企画。
PXE起動でwindowsPEをロードして、クライアントPCからストレージサーバの共有フォルダへPCイメージを作る・それを使ってリストアする ということを目指します。

こんな感じのこと

pxewindowsPEを起動する

今回やること

上記を実現するには①「PXEサーバ」②「共有フォルダのサーバ」③「windowsPEのISOイメージ」が要る。
③は「windowsPE」でググれば色々出てくるので割愛。
①②はwindows2022サーバの評価版で行う。

検証環境

①サーバ:以下の仮想マシンを作り、OSインストール直後の状態。 - OS: windows2022(ノーマルのほう。server coreじゃなく) - ストレージ:Cドライブ(20GB) - CD/DVD:Dドライブ - NIC:1個 - ネットワーク設定:IP:192.168.100.1 ADには参加せず。

②クライアント:仮想マシンを作ってsysprepした状態

ここからいろいろ設定する手順をすべてコマンド(コマンドプロンプトで実行)で実現する

サーバ設定

1.このサーバのIPアドレスを固定(サーバがあるならやらなくてよい)
※ IP:192.168.100.1、サブネット:255.255.255.0、デフォルトゲートウェイ:192.168.100.254にする場合。「イーサネット」の部分はNICの名称を入れる

powershell New-NetIPAddress -IPAddress 192.168.100.1 -InterfaceAlias 「イーサネット」 -DefaultGateway "192.168.100.254" -AddressFamily IPv4 -PrefixLength 24

2.役割:DHCPサーバを有効にする

dism /online /enable-feature /featurename:dhcpserver

3.dhcpセキュリティグループ作成(DHCP administrator とDHCP usersを作成する)

netsh dhcp add securitygroups

4.DHCPサービスを再起動

powershell Restart-Service dhcpserver

5.dhcp範囲
DHCPの範囲に名前(wds-dhcp)を付けて、DHCPで配布されるアドレス範囲(192.168.100.10-253)とサブネットマスクを設定する

powershell Add-DhcpServerv4Scope -name "wds-dhcp" -StartRange 192.168.100.2 -EndRange 192.168.100.253 -SubnetMask 255.255.255.0 -State Active

6.DHCPの除外範囲(192.168.100.1-10)を設定する:このアドレスはDHCPで払い出されない ‘‘‘ powershell Add-DhcpServerv4ExclusionRange -ScopeID 192.168.100.0 -StartRange 192.168.100.1 -EndRange 192.168.100.10 ‘‘‘

7.dhcpゲートウェイ(単一セグメントの環境なら使わない)

powershell Set-DhcpServerv4OptionValue -OptionID 3 -Value 192.168.100.254 

8.クライアントはDHCPIPアドレス受け取った後、OSイメージを受け取るためのpxeサーバのIPアドレスを設定する

powershell Set-DhcpServerv4OptionValue -OptionID 66 -Value 192.168.100.1

9.pxeサーバに到達してから受け取るOSイメージ名を設定する

powershell Set-DhcpServerv4OptionValue -OptionID 67 -Value boot.wim

10.役割:「Windows展開サービス」(ブートイメージ配布サーバ)をインストールする  windowsでのPXEサーバ機能は「Windows展開サービス」と「DHCP」で実現できる。
今まで気にしたことなかったけど、PXE環境って、IPがない状態のPCがDHCPで「IPをもらって」、「PXEサーバのIPを教えてもらって」、PXEサーバから「起動イメージをロードさせてもらう」ことなんですね。
コマンドでは以下の通り。

dism /online /enable-feature /featurename:Microsoft-Windows-Deployment-Services 
dism /online /enable-feature /featurename:Microsoft-Windows-Deployment-Services-Deployment-Server /all
dism /online /enable-feature /featurename:Microsoft-Windows-Deployment-Services-Transport-Server

11.windows展開サービスの設定で、PXE起動するクライアントに払い出すイメージのパスを設定する(タイムアウトするけどできている)
この時、共有フォルダ(名称:reminst 物理パス:"c:\wdsInstall")が作成される。クライアントPCからは”\(wdsサーバ)\reminst”でアクセスできるようになる。
※このコマンドはタイムアウトすることがあるけど、フォルダ設定はちゃんとされている。

wdsutil /initialize-server /reminst:"c:\wdsInstall" /standalone

12.PXE起動時に払い出すイメージを登録する
このときのdドライブ(CD)はwindowsPEのメディアを想定(550MBあるため少し待つ)

wdsutil.exe /add-image /imagefile:"d:\sources\boot.wim" /imagetype:boot /name:winPE /description:"windowsPE" /filename:"winPE.wim"

13.pxeブートの挙動(全クライアントに応答する)

wdsutil /Set-Server /AnswerClients:all

14.wdsサーバ開始

wdsutil.exe /start-server

クライアントの設定

  • BIOS/UEFInicから起動するように順番を変えておく(これをやっておかないとクライアントに入っているOSが起動する)

いざ実践① キャプチャする

1.クライアントPCでネットワーク起動するように設定して電源on→サーバからIPをもらえる。画面に従いEnterキー押す。

WDSによる起動時IP取得

2.PXEサーバにある起動イメージを受け取って起動開始

PXEからブートイメージを起動している画面

3.まずは共有フォルダをマウント
PXE起動時にクライアントとサーバのIPは表示されているので、サーバの公開ドライブ(reminst。サーバ作業の11番)をNドライブとしてマウントする。
※IDとパスワードを聞かれるので、サーバのユーザ(とりあえずadministrator)とパスワードを入力すればOK

net use n: \\192.168.100.1\reminst

ついでにキャプチャイメージの保管フォルダ(FFUimg)を作成する

md n:\FFUimg

4.クライアントのイメージをサーバに作成・保管する 前回作ったツールを使っても大丈夫でしたが、標準なコマンドを使用する。

dism /capture-ffu /imagefile:"n:\FFUimg\capturedIMG.ffu" /capturedrive:\\.\PHYSICALDRIVE0 /name:"windows10_24H pro"

いざ実践② リストアする

1.キャプチャしたFFUファイルをPCに適用する リストアするPCで実践① キャプチャの手順1から3を行い、以下のコマンドを使用します。

dism /apply-image /imagefile:"n:\FFUimg\capturedIMG.ffu /appplydrive:\\.\physicaldrive0 

※リストア先のストレージがFFUの元のストレージサイズより小さいとエラーになります(テストしていて気付かずハマった) ※リストア後は起動デバイスの順番を戻しておきましょう

ということで、ネットワーク越しに大量デプロイ環境が作れましたとさ。

DISMのコマンドラインを教えるのが面倒なのでGUIを作ったハナシ

windowsのイメージキャプチャはwindowsでできる

はじめから何言ってんだ?と思われそうなタイトルですが、仕事柄たくさんのPCをキッティングすることがあり、イメージキャプチャツールは必須なのです。 有名どころだとacronis trueimageとか(昔なら)norton ghostとか。

でもご存じ? それって、たとえブータブルメディアの利用でも「対象PCの台数分のライセンス」がいるんですよ?

1台のライセンスが仮に5000円としても、100台買ったら50万円。「キッティングのときだけ使い切り」のライセンスは数百円/台だけど、PC壊れてまたキッティングしますって時にまたライセンスが発生するので何台用意すればいいんだか。

というわけでお金のかからないイメージングツールを探してたのですが、なんだかんだでMicrosoft謹製のDISMで落ち着きました。

DISMって

知ってる人はすっ飛ばしてかまわない部分。

  • windowsの標準についている機能としては/scanhealthくらいしか使わない(それだって余り役に立たない)
  • windowsPE作成時に付与されるDISMの機能として「/capture-image」「capture-ffu」がある。
  • 違いはここ参照。
  • すでに職場の先達が試していて、処理速度は遅い(特にイメージング。リストアは速い)。なので、圧縮オプションは使わない
  • コマンドのパラメータがやたら長い。

主題

DISMコマンドでバックアップ・リストアをすることを人に伝える&やらせるのが面倒->なのでGUIで入力補助してやろう。

やること

  • dism のコマンド入力負担をなるべく減らす
  • 2つのキャプチャ方法のうち、.ffu形式を利用する。(wim形式はパーティションが分かれているPCだとパーティションの数だけ実行しなければならないため面倒)
  • 基本はマウス操作でボタンクリック→キャプチャ/リストアできるけど、使用者の学習のためにコマンドラインも表示する(トラブったらコマンドラインで実行してもらう)
  • 慣れているという理由でGUIhtaで作る。
  • 前提としてscript,hta,wmic,powershellをサポートするwindowsPEメディアが必須(詳細はググってください)

ちなみにこれを作る途中で知ったけどpowershellでDISMのGUI版を作ったツワモノがいた。これを日本語訳した方が早かったかもしれない

ffu形式のキャプチャについて

本来のコマンドは以下の通り

dism /capture-ffu /capturedrive=\\.\physicaldrive0 /ImageFile=(保存先ドライブ):\(ファイル名).ffu /name:"(このファイルの識別名)" /description:"(説明文。なくてもOK)"

ffu形式のリストアについて

本来のコマンドは以下の通り

dism /apply-image /imagefile:(リストアする.ffuのフルパス) /appplydrive:\\.\physicaldrive0 

...長い。コマンドはdism(たった4文字)なのに、パラメータの長さよ。

GUIにするにあたって

パラメータを一つずつ画面パーツに落とし込む。

  • ラジオボタンで /capture-ffu、 /appyimage、/drvload(winPE環境へのドライバインストール。ついでに作成) を選択
  • 物理ディスク一覧を列挙・選択する画面の描画(physicaldriveXを選択するため)
  • 保存先ファイルダイアログの画面→htmlでは無理っぽいと判断してpowershell使用
  • テキストボックスでnameとdescriptionを入力
  • 上記の内容からコマンド文字列を合成して実行
  • リストア時は.ffuファイルを選択するためのファイル選択ダイアログを使用
  • 画面だけになってコマンド(実態)が忘れ去られないように合成したコマンドラインも表示しておく(デバッグ用。これをコピペしてコマンドプロンプトで実行したらなにかわかるかも)

というわけでこんなものを作ってwindowsPEから起動するように仕込んだ。

dismをGUI化した画面

いちおう動作確認したので、windowsでもwindowsPEでもダイジョブっぽい。 さて職場の評判はどうなることやら。

hardening2023 generativesに参加してきました

もくじ

  • ぼやき
    • hardening=ハー「ド」ニング
    • もう5回目ですよ
  • 振り返り
    • 参加表明・募集通過
    • チームビルド
    • 本戦(Hardening Day)
      • の前夜
      • そして本戦(起きたこと)
        • やらかし(失敗)
        • 上手くいった(成功)
      • MP(MarketPlace)
    • Analysis Day
    • Softening Day
      • 各チームの発表
      • 運営より
      • 結果
  • そして旅は続く

ぼやき。

 毎年繰り返しますが...  

hardening=ハー「ド」ニング

何度でもいうぞ。ハー「デ」ニングと言ったら運営の人から羽交締めにされてボコられるので気をつけよう。

  • ググれば出てくる「堅牢化競技」
  • 勝負は売上金額=PC詳しくなくても参加できる。来たれ営業の神。
  • 売り上げるためにはサーバの稼働が必須。来たれ修羅場(イン/アクシデント)をくぐりし者
  • 準備期間は5週間
  • 見知らぬ人とチームを組んでサーバを守れ!
  • winもlinuxもあるよ!

もう5回目ですよ

2018の札幌開催から今回のルスツ開催。年もとったことだしそろそろ...と思いつつも止められない。まだ旅路は続きそうだけど、

  • 毎度何かしらのトラップに引っかかり暗澹とした気分になる
  • オンライン開催が続いているのと生来の出不精で東京に行けない=フルで満喫できてない
  • 毎年スタートラインは「前回の記憶を持っていない人々」とのパーティ編成。ガチで「何回目のループだ!?」という気分になる。

たとえ優勝してもこのループを抜ける世界線に辿り着けない気がする... これだけ出ていると、メンバーに楽しんでもらいたい・またきて欲しいという気持ちが強くなり、一人で騒ぎすぎていないかちょっと気になります。

振り返り

参加表明・募集通過

7月初めにアーリーバード(先行予約)のエントリーが発表され、運良くこちらに選ばれました。(※) 8/20に全参加者が決定し、今年はチーム10(自分含めメンバー9人)でチャレンジです。 ※ツイッタ(今はX)で「HardeningProject(@WASForum)」をフォローすると気づきやすい。

今年のメンバー

  • 自分(情シス)&同業者一名、大学生、セキュリティコンサル、プロマネ、レッドチーム、製造業が1人ずつ、大学じゃないけど諸事情で勉強中が二人。
  • ハードニング経験者は四名。

役割分担

  • 初ミーティング時に自己紹介シートを埋めてもらうと、今回は技術志望が少ない。
    スタートはど定番の「振られたらなんでもやります」。 ...そうじゃない。もっとガツガツ行こうぜ。
  • 技術志望が少ない=ん?俺も入っていいのかな?な雰囲気だったので今年は技術側へ。
  • ついでに”リーダー経験があります”と言ったら「ではよろしく」という流れで2年ぶりのリーダー(※)
  • どうせ社長呼ばれるんだろ ということで社長とリーダーは分離(もうアレは勘弁)。ただ、社長不在時の判断はCEO・CISOで行う。

※リーダー:主に運営とのやりとり・連絡役ですが、名前の通り「リードする人」なので、時々「そうしましょ」「やめましょ」と決めなきゃならないのですが、リードするのが苦手なので「ご意見募集」で皆さんからヒントもらって「じゃ、こうするね」という形で通してます...

ミーティング

  • 毎週月木の20時から約1時間(過ぎたら「今日はこれまで」とする。ホワイトだ...)
  • 議事録はesaMarkDown大好きなので、個人的わがままという形で採用
  • 後半から月曜:全員で打ち合わせ、木曜:テック・ビジネスで分かれて打ち合わせという形に。お互い気づいたことを月曜に検討。
    →お仕事が長引いている人にとっては20時開催は大変だったかも。(21時でも良かったかも)
  • リーダーなのでファシりたいところですが、上手な人(セキュリティコンサルさん)がいたので基本お任せ。自分はなるべく議事録に専念(喋りながら書くの苦手)。
  • 勉強中Aさん、製造業さん、プロマネさんが組織図・BCP対策を策定。クオリティ高い。  

    自社を取り囲む相関図

  • 自分はずっと顔出しするようにしてました。(モバイルの人&回線細い人、ごめんなさい)
     →とにかく顔と名前を覚えてもらいたい&覚えたいので。名前を呼ぶと印象よくなったり(ネームコーリング効果というらしい<まんまやん)、自分ごとと捉えてもらえる(はず)ので、名前呼んでから話すことを心がけてました。

  • 【ロゴ・PVについて】こういうのって大概「絵力がないので」と尻込みするのですが、幸いにもこの分野に強いメンバーがいてあっという間にできました。勉強中Bさん、めっちゃ器用。

    あっという間に作られたロゴ

その他

士気をあげよう! というわけでもないのですが、「お揃いのTシャツ」「チームロゴステッカー」を作ることに。 いいねぇ、こういう雰囲気、おぢさん好きだわ。
競技全体のコミュニケーションツールはdiscordを使っており、他のチームの動向も(公開範囲なら)参照可能なので、「他のチームでステッカー作ってたら交換しましょう」と営業しておく。

ユニフォーム!

その他2

自主訓練ということで、自分でec-cubeを立てて使用感を確認してる人がいました。自分はvyos(ルータ兼FW)を仮想で入れて使ってたのですが、バージョンが新しいせいかどうもネットの情報と動きが違ってハマってました。とりあえずコマンドをメモしていたのがあとで効いてくる。

本戦(Hardening Day)

の前夜

オンラインでしか顔を見てない人々とやっと顔合わせ。画面で顔出ししてもらってたから、すれ違うだけで「あ!」「お!」と指さし合うw ルスツは小休止スペースが充実しているので、一角を借りて本戦の役割・やることの順番を書き出す。
このときそっとサーバのIP・URLリストを書き出していたレッドチームさん、まだ会場に移動中なのに当日のタスクリストを作っていた勉強中Bさん、ものすごく助かりました。ありがとう。 助けられたついでに商品画像と説明もお願いして深夜2時すぎまで作ってくれてありがとう&ごめんなさい。 この辺のものはできる人がやるスタイルで良かったかも。

そして本戦(起きたこと)

色々とやらかしたりやられたりしましたが、ネタバラシにならない程度に。

やらかし(失敗)

  • remotedesktopツールで入力欄を間違えて繋がらない。
    macリモートデスクトップを使ってるのですが、いつもなら間違わない入力場所をなぜか間違いしばらく考え込む。

    入力場所を間違えてあたふた

  • 電圧降下?でPCの充電が止まる
    バッテリーが赤ランプになって気づいた。何度ACを抜き差ししても認識せず。メンバーのアダプタを借りて対応。(部屋に帰ったらちゃんと動いた。なんだったんだ?)

  • PCのバッテリ残量がわずかになって焦り、コンセントを抜き差しするうちにハブの電源を抜く。
    痛恨の極み。自分一人ならまだしもメンバーに迷惑をかけたのは本当に申し訳なかった。

  • メンバーのノートPCの画面の後ろにあったお茶が倒れる(故障なし。水気は離れたところに置きましょう。)
  • 詳細は伏せるけど不正侵入を受けたので切断&パスワード変更
    これを意図したわけではないけど、導入したツールで攻撃のログを掴むことができました。after the carnival...

  • 怪しげな侵入者
     暗号化被害の前後関係が不覚ですが、ユーザのパスワードを変えた後に何気なくタスクマネージャを見たら自分(administrator)以外のユーザ名が。技術班のメンバーに聞いても誰も使ってないという。さよなら。

    貴様、何者だ!

上手くいった(成功)

  • vyos使えました。
    本番当日まで不安だったけど、練習用に作ったvyosのバージョンが高くて微妙にコマンドのパラメータが違うのに手こずってました。きっと本番環境は安定版だろうと踏んで、それ用のコマンドラインをメモ帳に溜め込んでおいたら見事に的中だったので、コピペでサクサク作業できました。("show version"したときにちょっとガッツポーズしてた)
    FWのブロック対象はレッドチームさんがサーバのログから洗い出したIPをdiscordに載せてもらい、私がひたすらに登録。

  • 侵入経路の発見
    今年はとあるwindowsサーバのフォルダが暗号化被害を受けました。バックアップをとってなかったのは痛恨の極みですが、幸いなことに大和セキュリティのEnableWindowsLogSettingsで監査機能をonにしていたため、どこからやられた(暗号化命令を出した場所)が発見できました。
    ログをもとにセキュリティコンサルさんが「防止のためにこれやってください」と指示をくれたので第2波を防ぐことができました。
    このログを自端末にコピーすること競技終了数分前に気づいたのですが、惜しいことに間に合わず。

    powershellによる暗号化発生時刻(詳細に実行端末やアカウントまで載ってました)

  • 暗号化...天才だ!天才がいる!
    先に書いた暗号化被害ですが、暗号化されたフォルダ群を見回っていると、いかにもな「.ps1」ファイルが見つかる。
    テキストエディタで開くとまさしく犯行に使われたファイルだったので「暗号化のソースファイルがある」と声を上げたらレッドチームさんが見に来て、ざっと見た後ぼそっと「...戻せるかもしれない」と言ってくれたのでサーバの操作ごと渡しました。
    結果、1時間ほどでファイルは復旧して脅迫から免れるという快挙を成し遂げました。人智の及ばない所業🤩

  • 作業報告書の提出がギリギリ
    作業報告書は競技終了時間前に提出するのがマストですが、今年は例年以上にテンパっていてビジネス班にお任せ(プロマネさんありがとう)でした。伝えることは伝え、あとは内容確認してして送るだけというタイミングで担当メンバーPCでファイルが開けない事態に。
    急遽こちらで巻き取り、終了2分前の滑り込みで送信しました。(このバッファが取れたのは社長である勉強中Bさんの時間管理のおかげ。)

  • 後から聞いた話。当チームは最後の時間で割引セールを行い、持っていた在庫のほとんどを捌いたそうです(割引率5割を即断した製造業さんの潔さと言ったら...ありがとうございます。)

  • こんなヒリヒリした中でも空気感の違う二人
    レッドチームさんが学生さんの大学のOBらしく、学生さんをアドバイスしてた(なんて余裕だ)
    たしかに指導するにはうってつけな環境だけど、レッドチームさんのハイスペぶりに舌を巻く。

MP(MarketPlace)

例年はオークション状態で金額がインフレーションしていたMPですが、ドラフト指名制になりました。(公正になったと思います) ...が。

  • WAF取れなかった!
    全参加者羨望のWAF,EDRは獲得できず。2年前の素手で戦った記憶が蘇る。

  • NECさんめちゃ助かる
    最後に獲れたNEC「サーバ監視&通知サービス」が、想像以上に働いてくれました。「チャットでお知らせくれる程度かな」と思っていたら、人間が走ってきて息を切らせながら「不審なファイルがあります!」とか「webshell置かれてます!」と教えてくれる。やりとりはセキュリティコンサルさんがやってくれて、「言われたファイルをリネームしましょう」「ポート塞いでください」と的確に指示してくれました。

  • JPCERT/CCさんを使いまくる
    数あるMPのなかで唯一の”タダ”で提供されるサービスJPCERT/CCを購入(同業者さんが購入してくれた。みんなうっかりしてました。ありがとう)し、ことあるごとに「変なメールきたんだけど開けてよい?」「このURL踏んで大丈夫?」と聞いたり、逆に「こんな被害があったから他チームに共有してください」と情報提供したり。JPCERT/CCさんも「他のチームでこんな被害ありましたから気をつけて」「リークサイトで晒されてるよ」などの連絡をいただき、気づかなかった攻撃への対処ができました。連絡役は主に勉強中Aさんが担当し、学生さんが「これも連絡したほうがいいんじゃ?」と気づいてくれる。みんなよく気づくな。

という、いろいろなイベントをこなしHardening Day終了。

Analysis Day

いわゆる「ふりかえり」の日。振り返るためのテンプレートは運営で用意してくれているので、各々が自分で書けそうなところを埋めて終了。この資料を綺麗にまとめてSoftening Dayに発表します。いままでずっとお任せな役だったけど今年は自分がやろうか? でも東京か...と考えていたら、社長を務めた勉強会Bさんが「発表は私がしたい」と言ってくれたのでお任せすることに。 HardeningDay終了後の雑談や、このAnalysisDayのときもこんなコメントが出てました。

  • 「テックがしっかり堅牢してくれるからビジネスに集中できた」
  • 「ビジネスが売り上げを作ってくれたから集中して堅牢できた」

これがお互いから出てくればチームとして大団円だと思います。
ぱっと見はサーバを堅牢化してスコアを競う技術大会ですが、世の中は「売り物があって、サーバを使って売り捌いている」のであって、サーバが動けばそれで良いわけではないことに今更ながら気づきました。
ビジネス側にもビジネスのスキルや戦略があり、ハマれば売り上げがどんどん上がっていく。5回目でやっとHardeningの真意というか意義に辿り着けた気がします。<遅い

Softening Day

Hardeningの総括をする日。競技が終わってから数日、東京に行くべきか悩んでました。
「たった1日、移動を考えると日帰りなんて無理でしょ?」「オンラインでも見れる」「頑張りはしたけど良くても2、3位でしょ」と言い聞かせる自分と、「これほどやり切ったんだから見届けるべき」「このメンバーで会えるのはこの日が最後」「こんな期待薄な状態で1位とったら最高だろ」という自分。
実際に競技終了1時間前の売り上げ状態は、ちょっとトップに追いつくのは厳しいなと思ってました。
それでも。それでもこのメンバーと最後まで見届けておきたいという気持ちが強く、家族に「どうしても行きたいイベントがあるから東京に行かせて」と伝え、飛行機・宿もろもろを手配しました。

各チームの発表

もうね... これみれば十分です。
午前中に各チームの取り組み・振り返り(売り上げ予測を緻密に立てたり、技術に8割近く力を割いていたり、MPの相手で忙殺されたり)があり、当チームで締める。

復号にどよめくdiscord

ここでも気づきを得ましたが、チームリーダーの役割って表向きは上述の通りですが、本当の意味でのリーダー(leader:導く人)は競技の間も動き回って「いまどう?」「次あれやって」「今の状況がこうだからこっちにしよう」と、文字通りチームを導く人なんですよね。そういう意味で自分はリーダーとして力不足で、社長役の勉強中Bさんが完全無欠のリーダーでした。社長、ありがとうございました。

運営より

午後からは運営側のこの日に至るまでの「俺たちのHardening」。三日でスコアボードを改修したり、20ページしかできてない資料を1日で106ページにしたり、競技中にプロバイダを切り替えて繋ぎ直したりとか、文字通り「奇術」にしか思えないことをつらつらと明かしていく運営陣。こんな話聞いてたら俺たちのレベルなんて...と苦笑する。

結果

結果発表は各チームの売り上げ・技術点・顧客点・対応点・経済点・協調点・経営点が評価されるのですが、チーム1から順に読み上げられる中で「やはりトップではなかったか。でもこの場にいられることが嬉しい」という清々しさでリラックスしてスコアを眺めてました。
...が、最後に読み上げられた当チームのスコアは最高点を刻み、「え?え?」となりながら見守ってる間に「優勝チームと思われる方はステージへ」と呼ばれました。長々書いてますが「優勝」です。
力が抜けた状態でショックを受けたので感情が追いつかなくなり、ちょっと泣きそうになりました。(あのままインタビュー受けてたら本当に泣いてたかもしれない)

優勝に伴いいろいろと副賞をいただいたのですが、気になる方はsofteningday(上記リンク)のライブを見て下さい。 スポンサー賞を授与いただいたKDL様、副賞を授与いただいたダイアモンドスポンサーのGMOサイバーセキュリティByIERAE様、sky様、NEC様、そして実行委員会の皆様、”これから”に繋がる、やる気になれる豪華なプレゼントをいただき誠にありがとうございました。

そして旅路は続く

最高な仲間と最高の時間を過ごすことができました。”ぼやき”にも書きましたが、いい年なんでそろそろ後進にいろいろ渡したり、布教に勤しもうかとも考えてました。が、この高揚感はホントに病みつきになる。まだ譲れない。

来年も転生して、チームとしては”ニューゲーム”だけど、個人としては”強いままニューゲーム”。
まだまだ勉強することだらけだし、チームに伝えることも山ほどある。 オープンには語れない役割もいただけそうな感じだし、まだまだおぢさんも頑張らねば!

レガシーサーバ移行でoracleドライバと戦う

何をしたか

レガシーサーバ(win2003)環境をwin2019に移行する中で、あるアプリでoracleドライバが必要なことが判明。それもoracle10g。 今回はwindows2019サーバにoracle instant client(10.2)をインストールしたときの記録です。

環境

  • windows2003sp2(移行元)
  • windows2019(移行先)
  • 移行元にある、とあるアプリ(実行したらoracle10ドライバが見つからないというログを吐く)

ログが10gに言及しているならoracleドライバがいるのだろう。ということで、oracle instant clientをダウンロードする

やったこと

  • oracle instant client(32bit)のダウンロードサイト(※1)に行き、basicとodbcのzipをダウンロード

  • ダウンロードした2つのzipを解凍して同じフォルダに配置(いわゆるガッチャンコ)

  • 移行元のサーバからoracleドライバのフォルダ(productフォルダ内にある「network」フォルダ)をコピーし、新サーバのinstantclientフォルダ内に貼りつけ(この中にあるtnsname.oraが接続定義なのです)

  • システム環境変数「PATH」の先頭にoracle instantclientのフォルダパスを記載

  • コマンドプロンプトで上記のフォルダに移動し(※2)odbc_install.exeを実行
    →ここまでやるとodbc作成時の選択肢に「Oracle in instantclient10_2」が現れる

  • ODBCデータソースからOracle in instantclient10_2を選び(※3)、接続情報を入力する。
    →終了!

ハマり・しくじり

  • ※1 win2019は64bitですが、対象のアプリが32bitなのです。
     それに気づかず64bitのinstantclientのインストール後に「odbc(32bit)に選択肢が出てこないぞ?」となってました

  • ※2 ハマったので結論だけ書きますが、カレントディレクトリが配置フォルダになっていないと「Couldn't find Oracle Instant Client in present directory」と返されて終わります。

  • ※3 odbc画面で「Oracle in instantclient10_2」を選択して次へ行こうとすると下記のメッセージが出て終了してハマる

システム エラー コード 126:指定されたモジュールが見つかりません。
(パス\SQORAS32.DLL)のために、Oracle in instantclient10_2 ODBCドライバーの
セットアッププログラムを読み込むことができません。

ランタイムだな..とあたりをつけて探し回るといかにもそれな記事を見つけるが、必要なファイルのうちMFC71.DLLだけ見つからない。

ファイル名からvc++ランタイムなのは自明なので、vector内で「vc++」で検索するとVC++ .NET ランタイムインストーラー 1.0が見つかる。ダウンロード・解凍したフォルダから「mfc71.dll、msvcp71.dll、msvcr71.dll」をコピーしてwin2019のc:\windows\sysWOW64」に貼りつけたらやっと動いた。


かれこれサーバ移行は物理→仮想(hyper-v)→osアップグレードとやってるけど、ここまで古いOSだといろいろめんどくさい。

  • smb2.0をサポートしてないので、ファイルを直送できない
    →かといってwin2019にsmb1.0機能(たとえsmbクライアントでも)持たせるのは、前回の記事を考えるとやりたくない
  • タスクスケジューラのエクスポート形式がwin2019と合わない(移行元から接続して対応)
  • IIS(FTP)も使われていて、管理画面の違いを脳内変換しないといけない
  • たいがいのアプリは動くけど、今回みたいにDLLをsysWOW64に置かないといけない時がある(動かしてみないとわからない)

面倒ではあるけれど、20年前の環境で動かしたプログラムが今でも動くのはさすがwindows。「互換性の鬼」と言われるだけある。

WannaCryについて調べてみた

今更だけど。
仕事に関わるガイドラインを読み込んでいる時にsmbの脅威(wannacry)を思い出し、いろいろわからんことだらけなので調べてみた。
人に説明するには自分で理解しなければ。

そもそもWannaCryって

最初の認識では「smb1.0の脆弱性を突いて感染・増殖・感染先を暗号化」みたいなイメージだけど、この時点で疑問が出てくる。

  • smb1.0を使わなければいいの? どう防ぐのが正解?
  • 感染したとしてどこまで広がる?(感染セグメント内?違うセグメントまで行く?ユーザ名・パスワードとか無視されるの?)
  • そもそもどういうメカニズムなんだ?

思いつく単語でググってみる

「wannacry 仕組み」

トレンドマイクロの解説を見つける。そういえば関連ワードで”EternalBlue”があったな。

  • EternalBlueはWindows SMB1.0サーバ(共有フォルダの持ち主)が特定のリクエスト(ファイル送る側が発するメッセージ)を処理する際のセキュリティ上の欠陥
  • ファイル送る側がEternalBlueを突く攻撃をすると、バッファオーバーフロー(メッセージ長すぎて処理できん)を起こす
  • バッファオーバーフローを起こしたメモリ(のためのバッファ確保も使い切り)次のメモリ領域を操作できるようにしてしまう

へぇー と思いながら次へ。

「WannaCry 詳細」

カスペルスキーのサイトがトップに出てくる。

  • WannaCryが実行されるシナリオ
  • ”EternalBlue”(攻撃ツール)を仕掛けて、ターゲットに”DoublePulsar”(バックドア)をインストールする
  • "DoublePulsar"にコマンドを送り、WannaCryを実行する

なるほど。WanaCryは「EternalBlueを使ってDoublePulsarを送りこみ、DoublePulsarでWannaCryを実行する」てことか。

「EternalBlue 詳細」

三井物産セキュアディレクション(以下:mbsd)「WannaCry 2.0(+亜種)におけるワーム活動の詳細と残存するDoublePulsarについて」を見つける。めちゃめちゃわかりやすい。

  • EternalBlueとDoublePulsarは攻撃ツール「Fuzzbunch」の機能の一つ
  • Fuzzbunchはmetasploitみたいなもの(使い方知ってればコマンド叩いて攻撃できる)
  • FuzzbunchでEternalBlueを実行すると、その流れで(DoublePulsarが無ければ)DoublePulsarをインストールする
  • DoublePulsarはSMB/RDPで通信を受け付け、任意のコ-ド実行・DLLインジェクション(外部からDLLを持ってきて登録する?)をする機能がある
  • WannaCryが流行った時期では、DLLインジェクションで”lsass.exe”に不正なDLLを読ませ、ターゲット内でWannaCryを作成・実行してた
    →DoublePulsarが動いてしまえば、EternalBlue以外からでもコマンドを受け取れる状態になる
  • DLLインジェクションでは、注入したDLLがメモリ内に読み込み・実行されるため、タスクマネージャやプロセスエクスプローラでは見つからない
  • 以降、感染したターゲットが次のターゲットに向かってEternalBlueを仕掛けてDoublePulsarを仕込み、WannaCryを生成・実行...
  • 攻撃対象として選択できるのはwin7/win2008R2。ただし、(windowsOSではなくsmb1.0の欠陥なので)smb1.0が動いていればwin10でも効く。
  • Fuzzbunchを使うにはpython2.6が必要(2.7では動かない)
  • 「DoublePulsarはメモリ上にのみ存在するため、感染PCを再起動することで消滅します」
    →なぜ? このブログ内ではDoublePulsarについての挙動は書かれているけど、インストールされたらどう見えるかが不明なので、もう少しググる

「doublepulsar インストール」

アイマガジンの最新マルウェアを解剖する|WannaCryの仕組みと攻撃のメカニズムの記事が見つかる。全体図としてはこちらの方がわかりやすい。
上記と同じmbsdの方が解説している「WannaCryで感染が広がる仕組み」について以下のコメントを発見。

まずWannaCryにすでに感染している端末Aがあるとします。この端末A上のマルウェアは、LAN/WANやネットワーク上でMS17-010の脆弱性をもつ端末Bを発見すると、EternalBlueと呼ばれるエクスプロイトコード(脆弱性を利用したマシンコード)を使って攻撃を仕掛けます。この攻撃は、端末BのSMB v1サービスに対してエクスプロイトコードを投げつけ、SMB v1サービスのカーネル空間でバッファオーバーフローを発生させてデータを書き換えるというものです。

そこへ端末AからDoublePulsarと呼ばれるバックドア・プログラムが送り付けられ、バックドアが設置されます。この送り付けに際しては、端末BにDoublePulsarが存在していないことをEternalBlueが事前に確認してから送り付けられています。このDoublePulsarはメモリ上でのみ作動するファイルレスなので、端末上からは確認できません。また、端末を再起動すると消失してしまうタイプのプログラムです。

ここで知りたいことが凝縮された形で書かれていた。上記の「なぜ?」はこれで納得。さらに、

SMB v1サービスがDoublePulsarに感染すると、ディスパッチテーブル(関数テーブル)にある正規関数の1つが書き換えられてしまいます

というコメントがあったので、smb1.0で感染することが確定。
正確には、「EternalBlueでsmb1.0ホストにDoublePulsarをインストールする攻撃を受けると」ということか。ちょっと気になるので、smb2で感染するかも確認。

「MS17-010」

ちょっと気になるので、smb2で感染するかも確認するためにググってみた。(最初から読めよ)
マイクロソフト セキュリティ情報 MS17-010 - 緊急に書かれている通り、回避策としてsmb1.0を無効にする方法を案内している。裏を返せばsmb2.0は大丈夫 という解釈だろうか。

「wannacry 動作」

最後に残った疑問。感染したらどこまで広がるか。
アイマガジンのブログ内に「LAN/WANに広がる」とあるので、192.168...や172...のアドレス範囲内に総当たりを仕掛けるのかと思うけど調べてみる。
NTTコミュニケーションズWannaCryとはどんなもの?感染症状や感染の確認方法に、「WannacCryに感染すると」の項がある。

拡大していくときには、IPアドレスを自動生成し、インターネット通信で次に侵入するPCを見つけ出します。 自動生成したのが社内のIPアドレスであれば社内PCに、社外のIPアドレスであれば外部のPCに飛び火していくのです。 また、IPアドレスの自動生成によって入り込むPCを探し出すため、通常のマルウェアで有効なセグメント分けでは対応できません

...なんてタチの悪い動き。”外部に露出している”&”smb1.0が有効な”windowsサーバが1台でもあれば、かなりまずい。

結論

最初の疑問は解決できた

  • smb1.0を使わなければいいの? どう防ぐのが正解?
    →smb1.0を無効にするだけでOK。ただし、一回でも感染していれば別のsmb1.0サーバにも感染・そこから再感染の、エンドレスゲームになる。
  • 感染したとしてどこまで広がる?(感染セグメント内?違うセグメントまで行く?ユーザ名・パスワードとか無視されるの?)
    →IPを自動生成して、内外構わずどこまでも行く
  • そもそもどういうメカニズムなんだ?
    →上述の通り。どこかのWannaCry感染端末が感染先を求めてEternalBlueを仕掛けてDoublePulsarをインストールし、WannaCryを生成し、暗号化・脅迫文表示。これを延々と繰り返す。

これで人に聞かれても説明できるぞ。(ないと思うけど)

※補足:マクニカさんのセキュリティ研究センターブログ「マルウェア解析奮闘記 WannaCryの解析」も後から見つかり、これもわかりやすいです。

空知で夜通し100km歩いた話

タイトルがそのままなのですが。

北海道の空知という地域にある空知単板という会社がチャリティーウォーキング(売上を寄付する)をやっており、その距離100km。走れないけど歩くなら…と興味をそそられるが、参加の仕方がわからない。

過去のTwitterfacebookを検索しても参加方法が載っておらず、数年前に参加した人の話で聞けたのは「身内・関係者のみでやっている」とのこと。

なんでだよ、おれも入れてくれよとヤキモキしながら諦めていたのですが、ある日新聞を見るとそのウォーキングのことが載っていて、「参加はこちらまで(tel番号)」と書かれている! おおっ、待つこと数年、やっと参加できるぞ!

100kw.jp

先にいくつか前提を。

自分のスペック

  • フルマラソンは完走ではなく、歩いてゴールする。だいたい4時間半
  • 開催地域(空知)から約100km離れた札幌在住
  • 週に2,3回8km程度のランニングをしている
  • 中肉中背

イベントの詳細

  • AM8時から任意スタート(競技ではないので一斉スタートが不要)
  • JR滝川駅から送迎バスが出てる
  • 赤平→芦別→歌志内→砂川→滝川→赤平 を歩く
  • イムリミットは翌日12時まで。
  • 所々にチェックポイントがある
  • スタートからゴールまで、寝ようがコンビニで買い物しようが常識の範囲でほぼ自由。
  • リタイアの救済(お迎え)はないので、リタイアしたいならチェックポイントまで来い

ということで、記憶が新鮮なうちに記録しておきます。

準備

情報収集

  • 運営に確認
    • (2週間前になっても連絡こないので)どうやって案内くるの?→1週間前にエントリーサイトからメール出します
    • 熊よけ鈴いる? →あれば良い
    • ライトいる? →あれば良い
    • そっちでFMラジオ聞ける? →聞けます
    • 送迎バスは目印ある? →係員がいるのでわかる
    • 大会Tシャツは当日買える →買えます
    • 食事は各自? →ボランティアが地域飯を出すという話もあるが、基本は各自で用意orコンビニで調達。
  • 自分で確認
    • 自宅最寄り駅から開催地までの行き方

    →途中で乗り換える場合の切符の買い方や改札の通り方を知らなかったので駅員さんに確認。

    • 移動時間

    → どうやら特急なら1時間程度で着くみたいなので、前乗りしなくて良さそう

    • youtubeで過去参加者の動画見る

    →リュックの大きさやライト有無、ポール使ってる人の割合、疲れの経過(どう変貌していくか)w

道具

  • 20Lのリュックに以下を突っ込む
    • ウィンドブレーカー(雨・寒さ対策)
    • 食料
      • カロリーメイト1箱(二個入り) 箱はゴミになるので捨てた
      • 羊羹
      • チューブ式ゼリー
    • 帽子(首を熱くしないよう、日本兵スタイルの帽子)
    • アームウォーマー(防寒)
    • タオル(終わってから汗拭く)
    • 替えの靴下(水膨れ予防&終わってから着替える)
    • 替えのシャツ(終わってから着替える)
    • 財布(電子マネー使えない時用)
    • ヘッドライト(夜通し歩くし、街灯がない区間がある)
    • ウォークマン(ラジオ。寂しくなった時用)
    • 鈴(熊よけ。百均で買った)
    • エアーサロンパス(念のため)
    • スマホ(チェックポイントで電話をかける&何かあった時に運営への連絡用)
    • モバイルバッテリー(スマホ用)
    • ランニング用のウェストポーチ(スマホと飲み物をすぐ出せるように)

重いと苦しくなるので軽量を心がけたけど、ウォークマンはあまり使わなかった。ラジオがほとんどノイズで聞こえなかったんで...

当日

ここからメインの話です...
朝4時半に起きて最寄りの駅からJRに乗り、6:28の特急に乗り換え、7時半前に滝川着。
駅の周りは市というより町の印象で、外に出たらすぐ送迎バスが見つかった。JRの時点で同じような格好の人が目につくので、ついていけば間違わない。

スタート

ゼッケンをもらうため、会場にある貼り紙の電話番号に電話をかける。
自動音声で「ゼッケン〇〇、(名前) エントリーを受け付けました」が流れて、カウンターで番号を申告して受け取る。IVR(nteractive Voice Response)っていうのか。こういう分野は知らないな... チェックポイントでも同じことをしたので、ここ(ゼッケン)でやり方を体験させるのはいい方法だと思った。 ゼッケンを受け取った後は自分の好きなタイミングで行っていい とのことで周りを見ていたら、スタートゲートの上に貼り紙があり、そこに書かれた番号に電話をかけるとスタートの受付になるらしい。 これ、便利だな...

スタートしてからはてくてく歩く。第1CP(チェックポイント)までは23km。周りには「ちょっと自分とお話ししてくるわ」と言ってたけど、24時間もお話しするほどおしゃべりではないので景色を見ながら散歩気分で歩く。朝ごはんが消化されたようでお腹が空き始め、カロリーメイトを一個使用。ゼリーを水分代わりにチビチビ吸い込む。

10kmほど歩くと看板があり、折り返し。こんな感じで、要所でQRを読んで電話をかける。

最初のチェックポイント

ここからの道のりはほぼ何もなく、念の為に鈴を装着。周りにも熊よけ鈴をつけている人がおり、チリーンと綺麗な音が聞こえる。これを効くと百均鈴のしょぼさが際立つ。

最初の看板では気づかなかったけど、コースの中では「休憩所」「チェックポイント」という言葉が混じってるので、この後から第1CP(チェックポイント)、第2CP...とする。

第1CP

炭鉱遺産。この場所のことを初めて知ったけど、特撮に出てきそうな建物がある。

この時はまだ元気。とはいえどもハーフマラソン並みの距離(23km)なのでそれなりに疲れている。

運営が言っていた「ボランティアの出店」があり、おにぎり&豚汁を頬張る。これ、豚汁と見せかけて豚肉ではなくホルモンが入っている「がんがん鍋」だそうな。豚エキスが染みてうめ〜ッ!

第1cp
余談ですが、保険会社の人がティッシュを配っていて、飴の代わりにカロリーメイトをくれたw

簡易トイレで用を足し、ボランティアさんからもらったコーラで体内の水分を入れ替えて出発! 次のCPは9km先。CPで休み続ける人・すぐに出ていく人で、ここから参加者がばらけてくる。

ここから第2CPまでの道のりは山道。トンネルの中で赤平市の境を越え、歌志内市に入る。 トンネルを超えた先には、今年北海道でやたら話題になるアイツの警告看板が出ていた。

そういえば。この区間のコンビニが一つ(セイコーマート)しかなかった。ここで止まらなかったら結構危なかったかも。
店先でガリガリくんを食べて涼をとり、帽子を被って出発
(この地域のコンビニって店内にゴミ箱があるのね。嬉しい)

第2CP

道の駅・歌志内チロルの湯(32km歩いた)

一山超えてちょっと辛くなってきたところ。持ってきたエアーサロンパスはひと吹きで無くなったので、ストレッチに専念。 疲れた体にはコーラが一番だと刃牙から教わってるので、コーラ(のようなもの)を飲み干して出発。

次の道のりは11km 足の疲労が溜まってきており、途中で見つけたドラッグストアでアンメルツを買って応急処置。

たぶんスプレーより直に効くはずの"塗るタイプ"のアンメルツヨコヨコ
何気なく見た靴の裏側が、思った以上に擦れていて傷んでいることに気づく。これは...あまり知りたくないことを知ってしまった。

第3CP

JR砂川駅の併設施設・ゆう(43km歩いた)

自分のスペックの通り、フルマラソン以上の距離はこれが初めて。立つ・座るが辛くなってきている。
エイドはバナナ(すごく嬉しい)、ドリンク(麦茶をセレクト)、お菓子で有名な砂川の名店「北菓楼」のお菓子を数点いただき、トイレでアンメルツ追加。この辺りから腰から背筋にかけて筋肉痛が出ており、塗り塗りしてた。

次の道のりは11km 日が傾き始め、夕日が綺麗。麦茶をちびちび飲みながら無心で歩く。
脳みそも「長いなぁ」「あ、前の人の距離が縮まってきた」しか考えていない。

橋上の夕暮れ

途中でセイコーマートに寄ってコーラを飲み干し(ゴミ箱があるのは本当にありがたい)出発しようとしたところ、寒い。
冗談かと思われるほどブルブルし、なんなら歯もガチガチいい始めた。とにかく温めなければとウィンドブレーカーを着込み、(走れないから)無心で腕を振りながら歩くと、1,2分ほどで回復した。汗で冷え込んでいると思われる。

第4CP

くじら館(54km歩いた)

お腹が空いていてエイドを期待していたのだけどチェックのみ。手前のコンビニ寄っておけばよかった! リュックから羊羹を取り出しエネルギー補給。寒さに備えてアームウォーマー。
ストレッチが痛くてたまらない。
普通、自分で自分の体を揉む時は「くぅ、凝ってるなぁ」だけど、このときは自分でやってるのに痛くてやめたくなる。

次の道のりは6km
アームウォーマーのお陰でブルブルは軽微で、ここからヘッドライト装着。 さっきまで11kmやってるので半分なら楽できると思ってたけど、自分の壊れ具合に気づいてなくて、遠く感じる。「(CP)まだか」「(CP)どこだ」が頭を占める。コンビニがいくつか見えるけれど、「道路の向こう側かよ」「きっともうすぐCPだ」「エイドが何かあるはず」「お金を使うなら地域の特産に落とすのだ(さっきドラッグストア行ったよな?)」と、妙な駄々をこねる。

第5CP

西出興業(60km歩いた) なんのお店かわからないけど、マットが並べられていたのでバタンと倒れ込む。とにかく足の裏と腰回りが痛いのでぐいぐい揉む。 エイドはお菓子(ブラックサンダーもらった)&コーヒー

休みながらツイッタとFBを見てると、応援の言葉が染みる。隣にいるグループがマッサージガンで和気藹々してるのを見てると、なぜかウルッとした。ややメンタルが危ないかもしれない。落ち着け。ゆっくり休もう。

次の道のりも6km
始める前から「”歩く”と”走る”は使う筋肉が違う」というのを聞いていたので、「だったら今も走れるんじゃね?」と構えてみたら、行ける。
およそ1km弱、先行していた人たちをギュンギュン抜き去った。(本当に使う筋肉が違うかも)

走りをやめて歩きに切り替えたあたりから、進行方向から帰ってくる参加者とすれ違う。え...これ、次のCPは折り返しなの?
暗闇を照らしながら出会う人々に「お疲れ様です!」と挨拶しながら進むと、次のCP・道の駅まで1kmの標識が見えてきた。

第6CP

道の駅 滝川(66km歩いた)

前のCPで飲んだコーヒーが効いているのか、妙に元気になっている。 やばい時ほどカロリーと覚醒物質は必須だと気づいた。 ここでもコーヒーと饅頭をいただき、ごはんの代わりにもう一つのカロリーメイトを頬張る。

次の道のりは12km 先ほど抜かして行った人々とすれ違い、「お疲れ様です」「もう少しでCPですよ」と声をかける。
10歳くらいの少年とすれ違った。おぃおぃ少年がこの距離歩くのかよ。

この辺りから当初の目的「自分とお話し」を始める。
思うだけでは外の刺激で簡単に吹き飛ぶので、声に出しながら「いまこんな困り事がある」「解決策は思いつく限り⚪︎点」「可能性は」「そのために必要なことは」「他にないのか」と唱える。人がいないところでやったけど、見られていたらかなりの危険人物と思われること間違いない。

途中で寄ったセイコーマートでバナナヨーグルトを飲み干し、一休みしてから歩き出すと再びあの”寒気”がくる。
今度はウィンドブレーカーを着ているのでこれ以上暖めるものが...タオルだ💡
背中とシャツの間にタオルを挟み込み、再び体を動かすと震えが止まった。 寒さを克服しライトを照らしながら歩いているとたまにモヤっとしたものが見える。どうやら自分の呼吸が白くなっているようで、フゥっと吹くと冬の朝のようなモヤができた。そりゃ体も震えるわけだ。

そろそろ10kmくらい行ったか? と思う頃に、反対側からライトの光が...また折り返しかよ!
折り返しに会う=CP通過後も同じ場所を歩く=道に変化がない のは、かなり応える。早くCP出てこい!
振り返ると空が薄明るくなっていた。

第7CP

光生舎(78km歩いた)

エイドなし(けっこう悲しい)。保険屋さんにもらったカロリーメイトを食べて、念入りに脚を揉む。

次の道のりは12km

CPに来る前に出会った人が「次が最後のコンビニ」と言ってたのを思い出し、セブンイレブンでゼリーを二個お買い上げ。ここから先はゼリーだけ。 空はさらに明るくなり、ここでヘッドライトをしまう。

たしかこの時に(もう寒くならないから)タオルも外してリュックにしまった記憶。
朝にはなってるはずだけど、雲が厚いようで日差しは辛くない。足の色々な部分に疲労が溜まり、黙々と前に進む

第8CP

いたがき(90km歩いた)

飲み物を配っていたのでお茶をセレクト。お菓子があった気がするけどゼリーがあるから大丈夫。 休み時間もそこそこに、早く終わらせたい気持ちで出発する。

ツイッタ書いててふと思ったけど、「ケリをつける」=”けり”(古文の語尾につくやつ)をつける なのか? と思いググったらやはりそうらしい。
なんかかっこいい表現だね。(むしろいままで気づかず「蹴り」だと思ってた) 

最後の道のりは10km

もうここからはできる限り休まず行く。12km行けるなら10kmくらいなんとかなるだろ という根拠の無い思い込みで歩を進める。 残りのゼリーをチビチビすすり、昨日の朝見た風景を横に見ながら「あ〜、ここからスタートしたな」とか「この先に閉校した小学校あったな」と思い起こし、ということはゴールは近いよな…と気付き力を振り絞る。コンビニも視界に入った(最後じゃなかったっけ?)けど、もう行かないと決めてたから無視。

ゴール

泣くかな と思ったらそんなこともなく、「あっ、着いた」という感じ。ゴール前で運営の人たちとハイタッチし、ゲート前でパシャ。

疲れたなぁ〜、スマホでも見て送迎バスを待つか と思っていたら関係者ぽい人に「向こうに暖房入ってる仮眠室あるよ」と言われ、向かった先は倉庫。古い世代はご存知の”ジェットヒーター”を部屋の片隅に置き、真ん中に大量のマットを敷いてごろ寝する先達のゴールした人たちの様子はさながら遺体安置所...自分も仲間入りしたけど。

替えの靴下とシャツに着替えて、持って行った荷物は全て使い切った。
送迎バスを降りたらもうJRが来る時間で、動かない体を引きづりながら階段を上り下りし、ぎりぎりで乗車。
無事に家に着いて歯ブラシ(第7CPあたりから気になって仕方がなかった)、シャワーを浴びて昼寝。

長い長い道のりを踏破した。そういえば24時間以上起きていたことも初めてかもしれない。この年でもまだまだ未経験のことばかりだ。
今回の体験は大きなことやったなぁ と思う反面...「もう絶対やらん」とも思った。

追記

5本指ソックス最強。(facebookより)

100km耐えた足

NISM ctfのwriteup

NISM ctfとは

twitterで流れてきた知った。

nism-ctf.siebold-cyber.net

ジョパディ形式。CTFdの画面構成に似てる。(よく見たら右下にCTFdと書いている) それじゃ行ってみよーぅ。

welcom

練習問題。答え方を教えてくれる。

Misc: カラーコード

NISMのロゴマークに使われている青色は、
RGB形式で表すと、rgb(0,153,204)です。この色のカラーコードを答えてください。
flagは、NISM{#xxxxxx}の形式で答えてください。

手元にあったフリーウェア(colorPPP)でも拾えるけど、調べることがこのブログの趣旨なので、「カラーコード rgb 変換」でググる

tech-unlimited.com

ここで0,153,204を入れればフラグゲット

Misc: 奇妙な文字列

こんな意味不明な文字列が友達から送られてきたんだけど、君は解読できるかい?
TklTTXtiQHNlNjRfYzRuX2IzX2VhNWkxeV9kZWMwZGVkfQ==

「ctfで文字列が来たらまずbase64を疑え」と死んだじいちゃんが言ってた。 御用達のdencodeで文字列をコピペしてフラグゲット。

NW: Electrical talk

あなたは、社内ネットワークに接続されている無数のコンピュータの中から、
唯一通信できるコンピュータ1台を発見するネットワーク宝探しゲームに参加しています。
様々なIPアドレスへ通信確認をしているpcapと、そのIPとのホスト名対応表を用いて、
通信可能なコンピュータのホスト名を答えよ。

回答の際は、次の形式で答えること。
ただし、ホスト名には、ホスト名対応表の任意のホスト名が入る。 NISM{[ホスト名]}
  • pcapファイルと、IPに対応したホスト名の一覧csvが添付されている
  • pcapファイルをwiresharkに食わせたら、いろいろなIPアドレスpingを打っているデータが出てくる
  • 斜め読みする感じではicmp以外のデータはなさそう。かつ、ほとんどが未達(destination unreachable)

pingと聞いたら”echo"と"reply"がセットで出るわな…ということは、うまくいったやつ(reply)を探すのね...とゆっくり見ていくと発見。 目でも見つかるけど、wiresharkの文字列検索で一発だった。ゲット。

wiresharkの文字列検索

NW: Insecure communications

ネットワークの勉強の一環で、親友の同意のもと、親友のネットワークを
数分キャプチャさせていただいた。
どうやら、親友はある会員向けのHTTPサイトにアクセスし、
会員限定記事を見ているようだ。
僕も見たい。そこには魔法のflagが隠されているみたいだ、、、
与えられたpcapより、会員向けサイトのクレデンシャルを見つけ出し、
実際にアクセスして自分の目でflagを確認してみよう。

pcapファイルが添付されている。wiresharkに食わせてファイルに戻したけど、フラグらしきものは見つからず。なにをしたらいいのかわからず。Hintを見ると「URLがわからない。見つけ出さないと、、」とのこと。そゆことか。
wiresharkのprotocolをhttpのみにしてinfo欄を並び替えると、”post”コマンドのデータが発見。post先ではなく、postしていたURLを開くと入力画面にリダイレクトされるので、 post先に送られていたパケットのunameとpwrdの値を使ってログインするとフラグゲット。

NW: Where am I?

ネットワークを学習する上で避けては通れないサブネットマスクの計算。
力試しでやってみましょう。

192.168.1.0/28のネットワークにおいて、192.168.1.93のネットワークアドレスを答えなさい。
なお、解答の際はNISM{[IPアドレス]}の形式で答えること。

例:回答が192.168.250.34なら、回答はNISM{192.168.250.34}となる。

計算は苦手です...マスクを計算することはできなくもないけど、自信がないのでズルをするw 「ネットワークアドレス 計算」でググり、CMANサブネットマスクを「28」にしてIPアドレスを入れればフラグゲット。

Web: 超、易問!

NISMのテーマカラーは何色でしょうか?
https://easy-quiz.siebold-cyber.net 

いや、知らんがな... - 示されたURLにいくと、色の選択肢を答える画面が表示されるが、選択肢のどれを選んでも「違うよ」と言われる。(でしょうね) - 選択肢をクリックするとURLが(グレーを選ぶと)「https://easy-quiz.siebold-cyber.net/?color=grey」と変わる。

このctfのログインページのことを思い出し、「もしかして青?」と思って「https://nism-ctf.siebold-cyber.net/?color=blue」でフラグゲット。

Web: frog, frog, frog

蛙好きの友人が、蛙と名の付く文学作品を集めたサイトを作ったらしい。せっかくだから見てみようか。
https://frog-works-collection.siebold-cyber.net 

案内されたURL
下のセレクトボックスで文学の内容が表示されるが、明らかに数が少ない(1970移行がない) ので、そこを怪しむ。
F12キーでwebページのソースを表示し、セレクトボックスの値を変えて「select」ボタンを押すと、作者:NISMのポエムが表示された。ぱっと見フラグらしきものはないので、ページのソースを見てみると、わかりやすく”hidden”が。
フラグのヒント?
とりあえず NISM{君には何が見えている?} と入れたもののハズレ。
ここにはない...前回のtaskctfであったようなrobots.txtか?と思い、URLに指定しても404が返る。それならcss?
https://frog-works-collection.siebold-cyber.net/stylesheet.css でフラグゲット。

Web: お米食べろ

近年はお米の消費量が落ち込んでいる、と言われますが、やっぱり毎日一番食べているのはお米ですよね!
2010年から2020年までの全国の水陸稲作付面積の統計データを集めました。

都道府県名か年を入力したらデータ抽出するwebページ。

  • ページのソースに不審点はなし。
  • 「京」と入れたら「東京」「京都」のデータが出てくる。
  • 「’; 」を入れると「Fatal error: Uncaught mysqli_sql_exception: You have an error in your SQL syntax; 」

ということは... 「mysql テーブル 一覧」でググって、ここを参考にして入力欄でMYSQLのテーブルを一覧する文をインジェクションしてみる。

' union all select table_name,1,1 from information_schema.tables; -- (最後は半角スペース)

テーブル一覧
出てきましたねぇ~。riceはおそらくこの画面で抽出しているテーブルのはず。

スキーマもテーブルも「flags」なら、列も同じじゃね? と考えて、SQL文を組み立てる。

' union all select flag,1,1 from flags.flags; -- (最後は半角スペース)

flagsテーブル内
なんかやたら似た文字列がたくさん出てくる中にフラグ発見。ゲット。

Forensics: Lost USB memory

あっ、大切なUSBメモリを紛失してしまった。まぁでも重要なデータは削除してたから大丈夫でしょ。
  • zipファイルが添付されている。
  • 解凍するとproblem.bin というファイル。
  • binならバイナリエディタか?と開いてみてもフラグらしきものはなし。ただ、エディタ内の文字列に「Disk error Press any key to restar」が。

これ、ディスクか。ならばと思いbinから.isoに変換したものの、マウントできず。むむ...
改めてNISMサイトを見ていると「技術者向けイベントのハンズオン資料を公開いたしました。」を発見。

...ものすごくわかりやすい。 ここのフォレンジックの資料を見ながら「青空白猫」を使ったら、あらまぁ...binに埋まっているファイルが見える。いやぁ、勉強になります。フラグゲット。

青空白猫でbinファイルを検索

Forensics: Hidden files

長崎で撮った写真を集めてみました。画像に埋め込まれているflagを見つけることはできるかな?
  • jpgが4枚添付
  • 青空白猫でjpgが2枚あるのがわかる

サムネイルじゃないjpgを取り出すとフラグの断片が見つかるので、すべて取り出してフラグゲット。
これ、画像を結合したらもっとスマートに取り出せそうだけどそこまでのやり方は分からず。

Forensics: A file is opening

とあるプログラムが重要なファイルを開いているみたい...
  • Win10_MEMORY.DMPというファイル
  • forensicsを始めるときに見つけたハンズオン資料がむちゃくちゃわかりやすく(2回目)、つまりこれを使えと。
  • volatility3をインストール。問題文から、ファイルを開く=コマンドラインでファイルを指定していると判断...お前か!

あからさまに怪しいnotepad.exe

来い! dencode!(これも2回目)

dencode2回目

フラグゲット。

Forensics: Find Reg Value

このPCにOSをインストールしたのはいつだろう?

※この問題のフラグはNISM{ }のカッコの中に年・月・日・時・分・秒をアンダーバー区切りにして入れたものです.

例)
答えとなる日時が1970/01/01 10:20:30である場合,フラグは
NISM{1970_01_01_10_20_30}
となります
  • Win10_MEMORY.DMPというファイル
  • ハンズオン資料を見たからわかっている。ありがとう。
  • 読みながら手を動かす。これぞまさしく「ハンズオン」。俺は今猛烈に感動している。

  • volatility でwindows.registry.hivelist.HiveListを指定し、「¥SystemRoot¥System32¥Config¥ SOFTWARE」のオフセット値を取得

  • volatility でwindows.registry.printkey.PrintKey --offset (オフセット値) --key "Microsoft\Windows NT\CurrentVersion\"で得られるinstalltimeの値を取得
  • w32tm /ntte (上記の値)

フラグゲット! 終わった~。

初心者向けで資料に助けられまくりだけど、初めて全部解けた!うれしい! これからも励みます。