SEのスキルで可能なLinux PCハック方法をからセキュリティについて考える ～色々あるバイナリ改竄、感染注意とハッシュ確認事前確認

# **はじめに**
この記事は「こんなことでもあなたのPCのセキュリティが脅かされるかも」という観点からセキュリティ意識を高めようというのが目的です。
早期発見手段も簡単にですが提示してますので、皆さん普段からご注意ください。

**ハックをするぞ！**と大それたキーワードだと、そんなこと出来るわけないじゃんと思っていました。
でも、以前に[LD_PRELOAD](https://qiita.com/developer-kikikaikai/items/f6f87b2d1d7c3e14fb52)の記事を書いた際に、どうすれば`LD_PRELOAD`を仕込むことが出来るのかで友達と盛り上がり色々と考えてると、結構**よくやる手番の中にも悪質なウイルスを潜り込ませるような手段があるのではないか**と思ってきました。

イメージとしては、
「人が必ず座る椅子にこっそりブーブークッションを置いて驚かす」、「仕事の為にマネージャーに教えられて向かった現場がヤクザの事務所だった」みたいなどっきりに引っ掛けるくらいのレベルの手段。

セキュリティ対策の一環として、一SEが思いつくような例を紹介したいと思います。
どれも**Linuxを使う人が能動的に、でもあまり考えずに実施する手順**となっています。

# **例の紹介**

## **OSSを公開し、configureに設定を仕込む**

便利なOSSがあると、ライセンスに問題がなければつい使っちゃうって人はいると思います。
特にLinux利用者はソースからコンパイル・インストールは常套手段。
OSSのよくある手順はこんな感じ。

1. ./configure
2. make
3. make install

これ、インストールされたものは確認すると思いますが、**ビルド中の実行処理内容を気にする人は少ない**のではないでしょうか？

例えばこんなシェルのコードを書いてみました。libssl_dummy.soは`SSL_read`, `SSL_write`から平文を抜き取るラッパーです。
**これをconfigureの中に仕込めば、SSL_read/SSL_writeのハックが出来ます。**

```shell:shell.sh
homedir=`pwd`
#.tmp.txt はOpenSSLのSSL_read. SSL_writeをラップしたライブラリのbase64エンコード化したファイル
cat .tmp.txt | base64 -d > .libssl_dummy.so
echo "export LD_PRELOAD=${homedir}/.libssl_dummy.so" >> ~/.bashrc
```

`.tmp.txt`も.build_config.confとかそれっぽい名前に変えて、なんならshell.sh自体もconfigure時に生成した風を装えば、**configureを実行した結果SSLの中身が傍受されるようになった**と気づかないのでは？

読み込ませるライブラリも隠しファイルにしてこっそり置けばすぐにはばれないんじゃないかと

## **古いyum/aptのミラーサイトを作り、そのRPMに仕込む**

「みなさん、古いLinuxのミラーサイトが見つからなくて困ってないですか？ 私が公式サポート切れのOSに対するミラーサイト作りましたよ！」
こんな優しい方がいたら、ついそのミラーサイトを利用する方、いるんじゃないでしょうか？

**yum/aptのサーバーは、必要なパッケージをその環境内にインストールするため**のものです。
ということは、**そのパッケージのバイナリ内に、こっそりウイルスソフトを仕込まれていたら？**中々気付かないですよね。
起動も大抵serviceコマンドで管理者権限で行います。起動スクリプトの内容、/etc/init.d/を覗いて細かく確認する方も少ないのではないかと思います。

こうなってしまうと気付くのも難しく、もう悲惨ですね。LD_PRELOADを使わなくても好きなバイナリを好き放題動かせます。

例えば**HTTPサーバーのパッケージなら、HTTPサーバーを改ざんすれば"特定URL経由で任意コード実行"みたいなことも出来ます**。
HTTPサーバーでよくあるcgiの仕組みが指定フォルダのバイナリ実行なので、特定パスなら認証なし、指定フォルダを/以下にしたcgi実行が出来るようバイナリ改ざんをしてしまえば、もうどんなコマンドでも叩きたい放題です。…恐ろしい

### **技術的に可能なの？**

調べてみたところ、可能です。

まずミラーサイトは普通に作ることが出来ます。

[Ubuntu, apt系はこちら](http://fishrimper.blogspot.jp/2014/11/ubuntu_82.html)
[CentOS, yum系はこちら](https://orebibou.com/2015/03/centos-7%E3%81%A7yum%E3%82%B5%E3%83%BC%E3%83%90yum%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%83%9F%E3%83%A9%E3%83%BC%E3%82%B5%E3%83%BC%E3%83%90%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B/)

aptの参考サイトでインストールしている`nginx`はHTTPサーバーなので、`apt-mirror`があってHTTPサーバーが動いていればOKなようですね。

また、RPM自体の作成も可能です。[例えばこんな記事](https://mag.osdn.jp/14/01/10/090000)

なので、
1. ミラーサイトのRPMを展開
2. バイナリ差し替え、もしくはウイルスを仕込む
3. 再度RPMを作成

とやれば、詳しい方なら改ざんしたRPMを忍ばせることも出来るはずです。
この辺りは普通にLinuxの仕組みに関する勉強にもなるので、実際に試してみます。

## **その他**

ここで上げているものはどちらも、**「誰かの情報を活用するため、手順をそのまま実行⇒感染」**という形だと思います。
結構こういったあまり考えずにやっていることってあると思いますが、よく考えると相当リスクのあることをしていますね。

# **ハック結果 どんなことが出来るか**

LD_PRELOADの際に紹介したのはSSLのライブラリを改ざんし、パスワードを抜き取るという手法でした。
これはプロファイル設定に記載されるので確認が出来ましたが、今回は自作のRPMやスクリプトをユーザーが実行する形です。
いってしまえば何でも出来ます。さあ何が出来ますかね。

大分類として**破壊系**、**傍受系**で考えてみました。

## **破壊系**

### **管理者ユーザー乗っ取り**

**パスワード情報は/etc/passwd、/etc/shadowで管理**されています。
ということは**これを自分の利用している管理者名、パスワードで上書き**してやれば、もうユーザーはこのPCにログインできなくなります。
逆にウイルスを仕込んだ側はログイン可能なので、ついでにsshdを起動してグローバルIPをメールで通知してあげれば、乗っ取り成功！
ユーザー側としては、もう必要なデータだけ何とか抜き出してフォーマットするしかない。

### **HDDデータ破壊**

一時期はやりました。**「データを暗号化した！直してほしければ金を払え」**ってやつ。
暗号化についてはopensslのコマンドで簡単に出来るんですよね。

```
openssl enc 暗号形式 -in ファイル名 -out ファイル名
```

これに+seed値、パスワードの指定をすればより複雑になります。
さらにこの暗号化を複数回繰り返したなんてことになれば、もう復元は無理でしょうね。

もっとシンプルにrm -rf /で全消しも出来ちゃいますけど。

## **傍受系**

### **SSL傍受**

これは強力だと思います。詳細は[LD_PRELOAD](https://qiita.com/developer-kikikaikai/items/f6f87b2d1d7c3e14fb52)にも書いたので割愛しますが、今回は**libssl.soを直接書き換えてしまう**ことが出来ます。
プロファイル設定にも記載がないので**よりばれずに傍受が続けられます**。

### **キー入力傍受**

こちら、すぐに作れと言われても自信がないですが、技術的には可能だと思います。

例えば**キー入力と対応するデバイス(多分/dev/stdin)を監視するプログラム**を作り、サービスとして常駐させる。
入力内容が丸見えなので、suコマンド等で**rootになった際のログイン名/パスワードがわかる**という感じです。
後はsshやtelnetをあけといてログインさえ出来れば、こっそりrootログインで中身を傍受できます。

もしくは、**busybox自体をいじりsuコマンドを改ざんする**なんてことも出来るかもしれませんね。
こちらもバイナリが変わったことに気付かなければ傍受が出来ます。

## **バイナリ改ざんに気付くことはできないか？**

感染前に防ぐのは大事ですが、これだけなんでもできそうだと、感染にいち早く気付く手段も用意した方がよさそうですね。

私が思いつくのは手段はハッシュ値確認。例えばこのようなxxxsumコマンドでそのプログラムのハッシュ値が出ます。

```
$md5sum lighttpd
dfd067e042a2cfa36ae9b003d271df64  lighttpd
```

1. /etc/init.d/下や/bin、/lib下等のファイルハッシュ値を出力する
2. 前日の結果と比較
3. 差分があるファイルはメールで展開

みたいなスクリプトを組んでおけば、早期にこっそり改ざんされたバイナリに気付くことが出来るかもしれません。
後は公式のRPM等はハッシュ値を公開しているので、インストールの前にハッシュの確認してみるのはいかがでしょうか？


## **最後に**

こういったセキュリティ系の話は、考えれば考えるほどなんでもありそうで怖くなります。
**Linux自体が自由にOSSを使ったりパッケージをインストールする前提のOS**です。
一開発者だとしても、こういった**便利ツールを利用する上でのリスクは考える必要があるのかも**しれませんね。

20180808 後日チェックスクリプトを作成します

##**参考:**


Ubuntu でリポジトリのミラーサーバーを構築
http://fishrimper.blogspot.jp/2014/11/ubuntu_82.html

CentOS 7でyumサーバ(yumリポジトリミラーサーバ)を構築する
https://orebibou.com/2015/03/centos-7%E3%81%A7yum%E3%82%B5%E3%83%BC%E3%83%90yum%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%83%9F%E3%83%A9%E3%83%BC%E3%82%B5%E3%83%BC%E3%83%90%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B/

yum installで学ぶ！ yum の仕組み
http://tech-blog.rakus.co.jp/entry/2017/12/14/105052

独自のRPMパッケージやyumリポジトリを作ってみよう
https://mag.osdn.jp/14/01/10/090000

通信用語の基礎知識: stdinの説明
http://www.wdic.org/w/TECH//dev/stdin