とりあえずブログ

SEとして働く会社員の雑多なブログ

rTorrentの脆弱性を狙った攻撃をキャッチ

最近DASAN Network Solutionsのホームルーター脆弱性WebLogic脆弱性を狙った攻撃ばかりで、つまんないなーと思いながらハニーポットのログを見ていたら、見慣れないログを見かけたので、ご紹介します。

そのログはこんな感じのログです。

POST /RPC2 HTTP/1.1
Content-Length: 107
Content-Type: text/xml
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0

<?xml version='1.0'?>
<methodCall>
<methodName>download_list</methodName>
<params>
</params>
</methodCall>

これは、rTorrentというBitTorrentクライアントのソフトウェアを狙った攻撃になります。

そもそもBitTorrentとは

BitTorrent(ビットトレント)は、ブラム・コーエンによって開発された、Peer to Peerを用いたファイル転送用プロトコル及びその通信を行うソフトウェアである。

BitTorrent - Wikipedia

ということで、P2Pを利用したファイル転送ソフトで、僕は初めて知りました。 どんな用途で使用されているのかは今度調べたいと思います。

rTorrentの中でもHTTPを使用して、XMLによるRPCプロトコルを許可している場合に上記コードにより攻撃を受けてしまうそうです。

XML-RPC通信を許可しているrTorrentの場合、攻撃者は上記のリクエストを投げると、下記のようなダウンロードリストのハッシュを200で受け取ります。

f:id:tkm03:20180521230027p:plain (画像印象:rTorrent Client Exploited In The Wild To Deploy Monero Crypto-Miner

その後、別のPOSTリクエストでマイン二ング用のツールを配置するようなリクエストを投げてくるそうです。

f:id:tkm03:20180521230206p:plain (画像印象:rTorrent Client Exploited In The Wild To Deploy Monero Crypto-Miner

こんな簡単にマイニング用のツールを配置できちゃうなんて怖い。。。

ある攻撃者はこの攻撃で3,900ドル(約43万円)も稼いでいるとのことで、すげぇ。。。

参考サイト f5.com

Linuxのタスクスケジューラーの切り替えを覗いてみた(SystemTap)

Linuxカーネスソースを読む環境は準備できたのですが、どこから手をつけたら良いか分からないので、カーネルの動きを確認できるSystemTapという機能を使用して、遊んでみようと思いました。

まずはLinuxカーネルのタスクスケジューラ機能がどのようにタスクを切り替えているのかsched_switch.stpというスクリプトを使用して覗いてみようと思います。

sched_switch.stpスクリプトはこちらのサイトからダウンロードします。

SystemTap

PCにダウンロードして、サーバにアップロードするのはめんどうなので、wgetコマンドで適当なディレクトリに配置します。

# wget http://sourceware.org/systemtap/examples/profiling/sched_switch.stp

そして下記コマンドを実行します。

# stap ./sched_switch.stp

すると下記のログが出力されます。

f:id:tkm03:20180519200723p:plain

各カラムの説明をすると、

1列目:プロセス名 2列目:CPU識別子 3列目:実行時間 4列目:プロセスID 5列目:優先度

といった情報を確認することができます。

僕のサーバはCPUを1コアしか積んでいないので、CPU識別子が全て0となっていますが、複数コアがある場合はこちらの数が増えます。

ログを見ると、物凄い短い時間でプロセスを切り替えていることが分かります。

もしタスクの切り替えが上手くいっておらず、性能がでないという状況になった場合は、上記のsched_switch.stpスクリプトを使用してどのプロセスがボトルネックになっているか分かるかと思います。

他にもSystemTapのサイトではおもしろそうなスクリプトがたくさんあるので、遊び倒したいと思います。

f:id:tkm03:20180520170944p:plain

Linuxカーネル・ソースを読むための準備した

前回の続きです。

saito.hatenadiary.com

今回はカーネル・ソースを実際に読めるようなところまでの手順をご紹介したいと思います。

SRPMファイルのダウンロード

普通状態であれば、OSにはソースコードは付いてこないので、SRPMファイルというファイルをダウンロードして、インストールする必要があります。

まずは適切なバージョンのSRPMファイルをwget等でダウンロードします。

[root@localhost tmp]# wget http://archives.fedoraproject.org/pub/archive/fedora/linux/releases/20/Fedora/source/SRPMS/k/kernel-3.11.10-301.fc20.src.rpm
--2018-05-16 12:55:14--  http://archives.fedoraproject.org/pub/archive/fedora/linux/releases/20/Fedora/source/SRPMS/k/kernel-3.11.10-301.fc20.src.rpm
Resolving archives.fedoraproject.org (archives.fedoraproject.org)... 209.132.181.25, 209.132.181.23, 209.132.181.24
Connecting to archives.fedoraproject.org (archives.fedoraproject.org)|209.132.181.25|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 75668415 (72M) [application/x-rpm]
Saving to: ‘kernel-3.11.10-301.fc20.src.rpm’

100%[======================================>] 75,668,415  1.39MB/s   in 60s    

2018-05-16 12:56:16 (1.19 MB/s) - ‘kernel-3.11.10-301.fc20.src.rpm’ saved [75668415/75668415]

SRPMインストール

続いてrpmコマンドを使用して、インストールします。

[root@localhost tmp]# rpm -ivh kernel-3.11.10-301.fc20.src.rpm 
warning: kernel-3.11.10-301.fc20.src.rpm: Header V3 RSA/SHA256 Signature, key ID 246110c1: NOKEY
Updating / installing...
   1:kernel-3.11.10-301.fc20          ################################# [100%]

カーネル・ソースの展開

インストールが終わったら、~/rpmbuild/SPECS/にkernel.specが作成されます。

そのままではカーネルソースコードは、まだ展開されていない状態になります。

ので、rpmbuildコマンドを使用して展開する必要があります。

[root@localhost tmp]# cd ~/rpmbuild/SPECS/
[root@localhost SPECS]# ls
kernel.spec
[root@localhost SPECS]# rpmbuild -bp kernel.spec 
-bash: rpmbuild: command not found

んっ!?

コマンドが見つからない!?

どうやらrpmbuildコマンドが導入されていないようでしたので、インストールします。

[root@localhost SPECS]# 
[root@localhost SPECS]# yum install rpm-build
Dependency Updated:
  elfutils-libelf.x86_64 0:0.161-6.fc20  rpm-build-libs.x86_64 0:4.11.3-3.fc20 
  rpm-libs.x86_64 0:4.11.3-3.fc20        rpm-python.x86_64 0:4.11.3-3.fc20     

Complete!

これで実行できるので、コマンドを実行します。

[root@localhost SPECS]# rpmbuild -bp kernel.spec 
warning: line 517: Invalid version (double separator '-'): elfutils-0.153-1: BuildRequires: rpm-build >= 4.9.0-1, elfutils >= elfutils-0.153-1
error: Failed build dependencies:
    m4 is needed by kernel-3.11.10-301.fc20.x86_64
    gcc >= 3.4.2 is needed by kernel-3.11.10-301.fc20.x86_64
    hmaccalc is needed by kernel-3.11.10-301.fc20.x86_64
    bc is needed by kernel-3.11.10-301.fc20.x86_64
    xmlto is needed by kernel-3.11.10-301.fc20.x86_64
    asciidoc is needed by kernel-3.11.10-301.fc20.x86_64
    elfutils-devel is needed by kernel-3.11.10-301.fc20.x86_64
    zlib-devel is needed by kernel-3.11.10-301.fc20.x86_64
    binutils-devel is needed by kernel-3.11.10-301.fc20.x86_64
    newt-devel is needed by kernel-3.11.10-301.fc20.x86_64
    python-devel is needed by kernel-3.11.10-301.fc20.x86_64
    perl(ExtUtils::Embed) is needed by kernel-3.11.10-301.fc20.x86_64
    bison is needed by kernel-3.11.10-301.fc20.x86_64
    audit-libs-devel is needed by kernel-3.11.10-301.fc20.x86_64
    pciutils-devel is needed by kernel-3.11.10-301.fc20.x86_64
    pesign >= 0.10-4 is needed by kernel-3.11.10-301.fc20.x86_64

んっ!?

どうやら必要なパッケージがあるようなので、それぞれ表示されているパッケージをyumコマンドでインストールしていきます。

インストール完了後の確認

rpmbuild コマンドでのインストールが完了すると、~/rpmbuild/BUILD/kernel-3.11.fc20/linux-3.11.10-301.fc20.x86_64/配下にソースコードが作成されていることがわかります。

[root@localhost SPECS]# cd ~/rpmbuild/BUILD/kernel-3.11.fc20/linux-3.11.10-301.fc20.x86_64/
[root@localhost linux-3.11.10-301.fc20.x86_64]# ls
arch                      config-powerpc64        fs           REPORTING-BUGS
block                     config-powerpc64p7      include      samples
config-arm64              config-powerpc-generic  init         scripts
config-arm-generic        configs                 ipc          security
config-armv7              config-s390x            Kbuild       sound
config-armv7-generic      config-x86-32-generic   Kconfig      temp-arm64
config-armv7-lpae         config-x86_64-generic   kernel       temp-armv7
config-debug              config-x86-generic      lib          temp-armv7-lpae
config-generic            COPYING                 MAINTAINERS  temp-x86-32
config-i686-PAE           CREDITS                 Makefile     temp-x86-64
config-local              crypto                  merge.pl     tools
config-nodebug            Documentation           mm           usr
config-powerpc32-generic  drivers                 net          virt
config-powerpc32-smp      firmware                README

Makefileの冒頭部分を確認するとちゃんと想定したバージョンのカーネルソースコードであることがわかります。

[root@localhost linux-3.11.10-301.fc20.x86_64]# head Makefile 
VERSION = 3
PATCHLEVEL = 11
SUBLEVEL = 10
EXTRAVERSION =
NAME = Linux for Workgroups

# *DOCUMENTATION*
# To see a list of typical targets execute "make help"
# More info can be located in ./README
# Comments in this file are targeted only to the developer, do not

このままでもソースコードの閲覧はできるのですが、このままだと閲覧しにくいので、タグ・ジャンプ機能を使用できるようにするため、下記コマンドを実行して、タグファイルを作成します。

find `pwd` -type f -name "*.[ch]" -o -name "*.[sS]" | sed -e 's/^/"/' -e 's/$/"/' | xargs /usr/bin/ctags -a

こうすることで、関数の呼び出し元を閲覧しやすくなります。

例えば、

vim -t printk

とすると、一気に/kernel/printk/printk.cまでジャンプすることができます。

これでカーネルソースコードを読む準備ができたので、せっせと読んでいきたいのですが、量が多すぎて、どこから手をつけようかと迷っています。笑

Vagrantでカーネル・ソースを読むための環境を整える

Linuxカーネル・ソースを読みたくて、その環境をどこかで構築したいと思っていたのですが、AWSだと料金がかかるので、Vagrantを使ってサクッと環境構築してみました。

Vagrantは以前から利用しているのですが、しばらく使用しないでいるとコマンドを忘れてしまうので、備忘になります。

1. Boxを取得

まずは下記コマンドでBoxという仮想マシンのテンプレートファイルを取得します。

vagrant box add <box_name> <box_url>

今回はFedoraを使用したかったので、下記コマンドをたたきました。

vagrant box add fedora64 http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_fedora-20_chef-provisionerless.box

Boxはこちらのサイトを参考に選びました。 A list of base boxes for Vagrant - Vagrantbox.es

2. 仮想マシン用のディレクトリ作成

次に仮想マシン用のディレクトリを作成します。

mkdir <directory_name>
cd <directory_name>

3. 仮想マシン初期化

下記コマンドを使用して仮想マシンを初期化します。

vagrant init <box_name> 

今回はBox名にfedora64という名前をつけたので、下記コマンドを実行します。

vagrant init fedora64

4. 仮想マシンを起動&接続

初期化ができたら、起動してみます。

起動は下記コマンドでサクッとできます。

vagrant up

5. 仮想マシンへの接続

起動が完了したら、仮想マシンへの接続は下記コマンドを実行します。

vagrant ssh

これで一応仮想マシンが立ち上がり、ログインまでできました。

今後はこの環境を使用してカーネル・ソースを読んでいきたいと思います。

その他のコマンド

仮想マシンの状態確認

vagrant status

仮想マシンの停止

vagrant halt 

仮想マシンの再起動

vagrant reload

仮想マシンの削除

vagrant destroy

【読書メモ】『はじめてのパターン認識』で挫折したところ

機会学習の勉強会やブログなどで、よく紹介されている『はじめてのパターン認識』を読んでみたのですが、僕には3000年くらい早かったらしく挫折したので、どんなところでつまずいたのか備忘のため、残しておきたいと思います。

はじめてのパターン認識

はじめてのパターン認識

数学の記号が難しい

僕は文系ということもあって、数学2B程度の知識しか持っていないのですが、この本では行列がたくさん出てきて、行列をあまり扱ったことがない僕にとっては、かなり難易度が高かったです。

また、見慣れない記号がたくさん出てきて、数式の意味が分からないところが多かったです。

自分の数学力のなさに凹みました。。。

このあたりは機会学習を学ぶにあたり必須の知識だと思いますので、少しずつなれていきたいと思います。

用語が難解

『はじめてのパターン認識』は筑波大学名誉教授の平井有三さんが著者ということもあって、数学をきちんと学んだ大学生向けの内容となっているのかなと感じました。

数学2Bまでしか学んでいない僕にとっては、聞きなれない用語がたくさんあって、つまずくことが多かったです。

備忘のため僕が現時点で理解できなかった用語をまとめました。 (知っている人からするとそんなことも知らないのかよと怒られるかもしれません。。。)

第2章までは、なんとなく理解できたので、第3章以降で理解できなかった用語を挙げていきます。

第3章

第4章

  • 正規直行基
  • 回転行列
  • 無相関化
  • 白色化

第5章

  • ボロノイ領域
  • ボロノイ境界
  • ベイズ誤り率
  • 漸近仮定

第6章

  • 正規方程式
  • フィッシャーの基準
  • 一般化固有値問題
  • 判別分析法
  • ロジスティック回帰

第7章

  • 誤差逆伝播
  • 固定増分誤り訂正法
  • パーセプロトロンの収束定理

第8章

  • サポートベクトルマシン
  • スラック変数
  • ソフトマージン識別器

第9章

第10章

第11章

細かいところは分からなかったけど、概ね理解はできた。

上記の分からない用語を今後理解していけるよう勉強していきたいと思います!

とりあえず、初心者によさげな『人口知能プログラミングのための数学がわかる本』を読みたいと思います。

人工知能プログラミングのための数学がわかる本

人工知能プログラミングのための数学がわかる本

OSSのウイルス対策ソフト『ClamAV』をUbuntuにインストールしてみた

ハニーポットを運用していて、万が一僕のハニーポットがウイルスに感染したらどうしようと気になってはいました。

なので、ウイルス対策ソフトをインストールしたいと思っていたのですが、どうしても市販のものだと初期費用がかかるし、更新費用とかも気になるので、OSSで何か良いウイルス対策ソフトがないかなと探していたら、良いソフトがありました。

その名も『ClamAV』というソフトです。

f:id:tkm03:20180512160131p:plain (画像引用:ClamavNet

なんとなくロゴが怖いですが、オープンソースウイルス対策ソフトということなので、早速Ubuntuにインストールしてみました。

まず下記コマンドでパッケージリストを更新します。

sudo apt-get update

更新が終わったら、書きコマンドでClamAVをインストールします。

sudo apt-get install clamav

インストールが終わったらfreshclamコマンドを実行します。 このコマンドで最新のウイルス定義ファイルを取得するようです。

$ sudo freshclam
ClamAV update process started at Sat May 12 15:47:22 2018
WARNING: Your ClamAV installation is OUTDATED!
WARNING: Local version: 0.99.4 Recommended version: 0.100.0
DON'T PANIC! Read http://www.clamav.net/documents/upgrading-clamav
Downloading main.cvd [100%]
main.cvd updated (version: 58, sigs: 4566249, f-level: 60, builder: sigmgr)
Downloading daily.cvd [100%]
daily.cvd updated (version: 24562, sigs: 1943637, f-level: 63, builder: neo)
Downloading bytecode.cvd [100%]
bytecode.cvd updated (version: 319, sigs: 75, f-level: 63, builder: neo)
Database updated (6509961 signatures) from db.local.clamav.net (IP: 124.35.85.83)

スキャンするときはclamscanコマンドを使用します。 下記実行結果は、test.txtという空ファイルをスキャンした際の実行結果です。

$ sudo clamscan test.txt 
test.txt: Empty file

----------- SCAN SUMMARY -----------
Known viruses: 6503807
Engine version: 0.99.4
Scanned directories: 0
Scanned files: 0
Infected files: 0
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 14.558 sec (0 m 14 s)

今度はウイルスをちゃんと検知できるかテストします。 先ほどのtest.txtファイルをviなどで開いて、下記の文字列を書き込みます。

こちらでテスト用ウイルスファイルのできあがりです。

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

先ほどと同じコマンドでスキャンした実行結果がこちらです。

$ sudo clamscan test.txt 
test.txt: Eicar-Test-Signature FOUND

----------- SCAN SUMMARY -----------
Known viruses: 6503807
Engine version: 0.99.4
Scanned directories: 0
Scanned files: 1
Infected files: 1
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 14.292 sec (0 m 14 s)

$ echo $?
1

ちゃんと"Infected files: 1"となっていて、ウイルス検知できたことが確認できました。

その他にもマニュアルを見ると定期スキャンやオンアクセススキャンなど設定できるようなので、しばらくClamAVをいじいじしてみようと思います。

【投資】双日の決算発表を考察してみた

先日、双日の決算発表がありましたので、総評を述べたいと思います。

当初の計画と実績の比較

僕が双日株を購入したのは、2018年1月でその時点での株価は356円でした。

その時点での四季報による営業利益の推移予想はこんな感じでした。

年月 営業収益 営業利益 税前利益 利益
13.3 1,747,740 25,493 28,052 13,448
14.3 1,803,104 23,694 44,033 27,250
15.3 1,809,701 33,550 52,584 33,075
16.3 1,658,072 29,242 44,269 36,526
17.3 1,555,349 51,618 57,955 40,760
18.3予 1,690,000 65,000 79,000 57,000
19.3予 1,750,000 68,000 85,000 62,000

今回の決算では、

営業利益:598億円

税前利益:803億円

利益:568億円

となっております。

営業利益は四季報による予想から50億円程度低い値となっておりますが、税前利益はおおむね予想通り、利益は予想より40億円程度高い値となっています。

営業利益が予想より低いのにもかかわらず、税前利益が予想より若干上回っているのは、持分法による投資損益の増加によるものです。

中期経営計画2017の振り返り

今期は双日の「中期経営計画2017」の最終年度となっており、IRページではその振り返り資料が閲覧することができます。

www.sojitz.com

こちらの内容からは「当期純利益600億円以上」という目標のみ未達となっているものの、ほぼ達成しており、全体として計画以上の成績であったということが説明されています。

とはいえ個人的には未達は未達なので、具体的に何が原因で当期純利益600億円以上が未達となってしまったのか見ておこうと思います。

セグメント別収益の推移はこんな感じです。

-- 2015/3実績 2018/3実績 差分
自動車 26 65 39
航空産業・情報 33 31 -2
環境・産業インフラ 42 60 18
エネルギー 35 -61 -96
石炭・金属 -27 219 246
食料・アグリビジネス 64 87 23
リテール・生活産業 29 57 28
産業基盤・都市開発 27 21 -6
合計 253 519 266

これを見ると、

  • エネルギーが大きくマイナスとなっており、今後どう成長させていくのか
  • 石炭・金属が成長の大部分を支えており、今後この成長をキープまたは、増加させることができるのか

という点がポイントになります。

エネルギーセグメントについて

今期は「石油ガス権益関連での一過性損失などにより減益」と説明されていますが、2019年度は「前期石油ガス権益での一過性損失の反動による影響や、 国内・海外発電事業の収益の積上げを見込む」ということで、45億円の収益を見込んでいるとのこです。

特に今後は国内・海外発電事業については、再生可能エネルギーということで太陽光発電風力発電について、力を入れていくと思いますので、そのあたりの動向に注目していきたいと思います。

石炭・金属セグメントについて

今期は「石炭などの資源価格の上昇と鉄鋼市況の回復により増益」と説明されており、219億円の収益を計上しています。

2019年度は「石炭など資源価格に一定のストレスをかける前提」ということで、205億円の見通しとなっております。

確かにこれまで石炭の資源価格は上昇傾向にありましたが、この価格上昇は長く続かない見込みのため、「一定のストレス」を前提とした収益の見込みとなっていますが、それでも石炭の資源価格は双日の収益に対して、影響力が大きいので、ウォッチしていきたいと思います。

sustainablejapan.jp

総評

当期純利益の目標が未達となったものの全体として悪くない決算内容でした。

また、新しい中期経営計画「中期経営計画2020 〜Commitment to Growth〜」でも2020年に向けて、当期純利益750億円以上という目標を掲げていますので、今後も成長を見守っていきたいと思います。

関連記事 saito.hatenadiary.com