知っている人がこのアドベントカレンダーに投稿していたので、過去にやっていた研究の話をアウトプットしようと思い私も投稿します。
ただし、筆者はコンピュータ初心者であり、今回の内容もCSS2016に出したものなのでかなり古いです。あと、直前に書き始めたので内容がスカスカです。それでもよろしければお付き合いください。
1. 高対話型がやりたい
既にナンセンスな分類かもしれませんが、Honeypotは低対話型と高対話型に分けることができます。低対話型で代表的なのは、Kippoもとい後継のCowrieでしょう。実際に使ったことのある人ならわかりますが、SSH低対話型は侵入した攻撃者を観察しようとしてもコマンドの自由度や再現度が極端に低いため、思うように活動してくれないことがあります。また、Kippo、Cowrieはハニーポットであることが判別可能なシグネチャが複数知られています。
ハニーポットであることをバレずに、攻撃者の活動を隅々まで観察するには、実際のファイルシステムを触らせる必要があります。しかしこんな事やってたら、本当に踏み台にされ犯罪加担してしまう可能性がありますし、(物理・VM)マシンコストも馬鹿になりません。
2. Linuxコンテナを使う
Docker を使用することで、ホストコンピュータから安全に隔離し、ネットワーク・計算リソースを制限した上で攻撃者の活動を観察することができるのではないかと考えました。コンテナはVMに比べてリソース消費が格段に少なく、軽量です。
1攻撃者に1環境を与えることができるし、瞬時にクリーンな環境を提供できます。起動元のLinuxイメージは非破壊で、更新はレイヤーファイルシステムを採用しているため容量もそこまで食いません。ログやファイルの収集は、自作してもいいですが、Dockerに元々ある機能でも結構できます。
で、試作したものをCSS2016で発表しました。多くの問題を抱えているため実用的ではありませんが、Cowrieに比べてより活動的でいろいろ観察できて楽しかったです。
3. アーキテクチャ
3.1 要件
- 侵入しやすい環境
- 任意のID/PWでログイン可能
- CPU・メモリ・ネットワークに制限を設ける
- DoS対策
- コンテナに生存条件を設ける
- 制限時間
- 送受信トラフィック量
3.2 ライフサイクル
- SSHサーバをコンテナ内で起動し、22番にポートフォワードします
- ログイン要求が来た場合、要求のID/PWで即座にユーザを作成
- ログインを実行し、pty要求がある場合はshellを返却
- 生存条件がしきい値に達するまでコンテナを稼働
- コンテナが停止したらログやファイルの収集
4. 動かしてみた
Cowrieでは見られなかった面白い活動をちょっとだけ書いてみました。
- 変な命令サーバの構築スクリプト
- exec呼び出しだったので、スクリプト実行が最後まで観察できた。
- マイニングマルウェア
- サーバの性能をチェックして色々最適化して動かしてた。
- CPUを絞っててHash/sが出なかったのかすぐ切断
- DoSしようとしてたスクリプト
- うまくトラフィック制限が効いたのですぐコンテナ死んだ
- VPNサーバ構築
- これはスクリプト実行が失敗してた
- スクリプト完走後やばそうなドメインリストっぽいファイルを落としていた
5. 問題点
色々Cowrieと違う活動が見れたんで面白かったんですが、色々問題点があるため実用的ではありません。
- コンテナであること
- ホストのカーネルにコンテナ脱出の脆弱性あったらすなわち死
- ホスト ▶ VM ▶ コンテナの構成が一番良さそう(本末転倒感)
- その後登場したgvisorってどうなんですかね?
- Twistedで構築したこと
- ハニポばれる
- OpenSSHでうまくやれる方法ないだろうか
- 制限時間やトラフィック制限の最適化
- ベストな値って・・・?
- [追記]:Syscallの監視ができていない
- 他の人が別研究でやっていた成果物が使えそうだなとか妄想してたら数年経ってました
6. まとめ
内容スカスカすぎて公開するのが恥ずかしいですが、まとめとしては
- 2015~2016年にLinuxコンテナでSSHハニポ開発してました
- 高対話型の自由度と、低対話型の手軽さを手に入れた
- 攻撃者ログイン時に、そのID/PW通りにユーザ作れば誰でもWelcome状態を作れる
- Cowrieと違った攻撃者の活動が観察できて非常に面白い
- カーネルやコンテナに脆弱性があった場合ってやばくね?
- DirtyCowとか
- TwistedだとCowrieと同じなので、下のプロトコルレベルでは何も成長していない
詳細は2016年CSSから論文を引っ張り出してください。コードは2,3年前のウンコードで恥ずかしいので考え中です。
以上