sshのハニーポット

ちょっとした思いつきで遊んでみた。
その途中経過。


ふと思い立ってVirtual Machineでハニーポットを作ってみた。
あんまり要素が複雑だと軽いミスでホントに踏み台になりそうなので標的(?)を絞り、sshでログインしてきた人が何するか観察するのみのものを構築。

コンセプトは以下の通り

  • adminとかtestとか典型的なユーザ名で罠を張る
  • パスワード=ユーザ名で待つ
  • ログインしたユーザの挙動は全て記録
  • ホントに踏み台にされると困るからrootのパスワードはちゃんと設定
  • 同じ理由でsshログイン以外の通信を遮断

とりあえず現状の経過を記録

実験環境

マシン構成

VM: Virtual PC 2007
OS: CentOS Linux 5
RAM: 256MB

OSは面倒なのでRedHat系列のCentOS.
ほぼ最小構成でインストール。(重くなるからXもいれていない)

ネットワーク設定

routerのnatでport22をインターネットに解放.
また、iptableで外向きの通信をすべて遮断。
設定内容は以下の通り.
要約すると内向きport22(ssh)以外のパケットは全てDropします.

CAIN INPUT (drop)
ACCEPT tcp -- anywhere anywhere state NEW,RELATED,ESTABLISHED tcp dpt:ssh

Chain FORWARD (policy DROP)

Chain OUTPUT (policy DROP)
ACCEPT tcp -- anywhere anywhere state NEW,RELATED,ESTABLISHED tcp spt:ssh

ロギング方法

ログインした輩の挙動はscriptで記録.
psすれば見えるしkillすれば回避できるけどとりあえずはこれで試す.
あんまり回避されるようならそのときまた別の案を考える.

とりあえず/etc/profileに以下の記述をしてscriptを自動起動

COFFEE=/foo/bar/
MILK=`whoami`
CREAM=`date +%Y%m%d%H%M%S`
LATTE=$COFFEE/$MILK/FORMED-$CREAM
if [ ! -e $COFFEE/$MILK ]; then
mkdir $COFFEE/$MILK
fi

if [ -e $LATTE ]; then
mv -f $LATTE $LATTE.bak
fi

P_PROC=`ps aux|grep $PPID|grep sshd|awk '{print $11}'`
if [ "$P_PROC" = sshd: ];
then
enjoy -q $LATTE
exit
fi

enjoyはscriptのシンボリックリンク.
ディレクトリ名が俺の趣味なのはあからさますぎるよりはイイかなという配慮.
まあこれでログインと同時にscriptが始まり、scriptの終了と同時にshellも抜ける.

結果(途中経過)

1週間ぐらい放置したところ、本日3人ほどのアクセスがありました。
うちスキャンが2回、そして一人がログインして何かしようとしていきました。
スキャンしてきたIPは韓国のものとインドのもの。
ログインしてきたIPはモルディヴのものでした。

以下、そのモルディブさんの動作ログ

Script started on Tue 27 Nov 2007 03:06:35 PM JST
[test@rina7th ~]$ uptime
15:06:50 up 6 days, 17:58, 2 users, load average: 0.15, 0.04, 0.01
[test@rina7th ~]$ who
root tty1 2007-11-25 16:10
test pts/0 2007-11-27 15:06 (202.1.195.226)
[test@rina7th ~]$ help
GNU bash, version 3.1.17(1)-release (i686-redhat-linux-gnu)
These shell commands are defined internally. Type `help' to see this list.
Type `help name' to find out more about the function `name'.
Use `info bash' to find out more about the shell in general.
Use `man -k' or `info' to find out more about commands not in this list.

A star (*) next to a name means that the command is disabled.

JOB_SPEC [&] *1
. filename [arguments] :
[ arg... ] expression
alias [-p] [name[=value] ... ] bg [job_spec ...]
bind [-lpvsPVS] [-m keymap] [-f fi break [n]
builtin [shell-builtin [arg ...]] caller [EXPR]
case WORD in [PATTERN [| PATTERN]. cd [-L|-P] [dir]
command [-pVv] command [arg ...] compgen [-abcdefgjksuv] [-o option
complete [-abcdefgjksuv] [-pr] [-o continue [n]
declare [-afFirtx] [-p] [name[=val dirs [-clpv] [+N] [-N]
disown [-h] [-ar] [jobspec ...] echo [-neE] [arg ...]
enable [-pnds] [-a] [-f filename] eval [arg ...]
exec [-cl] [-a name] file [redirec exit [n]
export [-nf] [name[=value] ...] or false
fc [-e ename] [-nlr] [first] [last fg [job_spec]
for NAME [in WORDS ... ;] do COMMA for *2; do COM
function NAME { COMMANDS ; } or NA getopts optstring name [arg]
hash [-lr] [-p pathname] [-dt] [na help [-s] [pattern ...]
history [-c] [-d offset] [n] or hi if COMMANDS; then COMMANDS; [ elif
jobs [-lnprs] [jobspec ...] or job kill [-s sigspec | -n signum | -si
let arg [arg ...] local name[=value] ...
logout popd [+N | -N] [-n]
printf [-v var] format [arguments] pushd [dir | +N | -N] [-n]
pwd [-LP] read [-ers] [-u fd] [-t timeout] [
readonly [-af] [name[=value] ...] return [n]
select NAME [in WORDS ... ;] do CO set [--abefhkmnptuvxBCHP] [-o opti
shift [n] shopt [-pqsu] [-o long-option] opt
source filename [arguments] suspend [-f]
test [expr] time [-p] PIPELINE
times trap [-lp] [arg signal_spec ...]
true type [-afptP] name [name ...]
typeset [-afFirtx] [-p] name[=valu ulimit [-SHacdfilmnpqstuvx] [limit
umask [-p] [-S] [mode] unalias [-a] name [name ...]
unset [-f] [-v] [name ...] until COMMANDS; do COMMANDS; done
variables - Some variable names an wait [n]
while COMMANDS; do COMMANDS; done { COMMANDS ; }
[test@rina7th ~]$ uptime
15:52:05 up 6 days, 18:43, 2 users, load average: 0.05, 0.02, 0.00
[test@rina7th ~]$ wget http://www.psybnc.at/download/beta/psyBNC-2.3.2-7.tar.gz

Resolving www.psybnc.at... failed: Temporary failure in name resolution.
[test@rina7th ~]$ wget http://www.psybnc.at/download/beta/psyBNC-2.3.2-7.tar.gz

Resolving www.psybnc.at... failed: Temporary failure in name resolution.
[test@rina7th ~]$ wget http://www.psybnc.info/source/psyBNC-2.3.2-7-auto.tar.gz

Resolving www.psybnc.info... failed: Temporary failure in name resolution.
[test@rina7th ~]$ wget http://www.psychoid.lam3rz.de/psyBNC2.3.1.tar.gz

Resolving www.psychoid.lam3rz.de... failed: Temporary failure in name resolution.
[test@rina7th ~]$ wget http://www.psybnc.at/download/beta/psyBNC-2.3.2-7.tar.gz

最後が若干切れている理由は調査中.
とりあえずツールwgetでダウンロードしようとして全部失敗している。
bash_historyを見ると、この後あきらめてログアウトした模様。
(コレがフェイクでこれ以降のログが改ざんされていたので無ければ・・・だけど)

ssh出来る→scpやsftpならつかえる って点には気づかなかったようで。
またrootを取ろうとしたりもしていないので、彼のスキルレベルは決して高くない様子。
「簡単につかえそうにないマシンをいじるよりは他を当たろう」的スタンスなのかなーと勝手に想像。

当面の課題点

ロギング方法が弱い

 scriptをkillされたら記録できないし、scriptが出力ファイルはユーザが編集可能。
 つまり簡単にログを改ざんできてしまう

通信遮断に穴がある

 srcportを22にすれば一応外部にパケットを送れる。
 インタラクティブな通信は出来なくてもDoSの踏み台にはぎりぎり使えてしまう。

「使えないマシン」だとすぐばれてしまう

 ツールをダウンロードした後の挙動とかも気になるけど現状では見られない。
 かといって通信許可したら踏み台ワッショイだし難しいところ

実はexploitとか通じちゃう穴があるかも

 あんまり細かいところは調べていない。
 まあroot取られたらそいつの方が俺よりスキルあったと言うことであきらめよう。
 もしおまわりさんがきたら・・・\(^o^)/

以上
今後またおもしろい結果が取れたら続くかも。

*1: expression

*2: exp1; exp2; exp3