蜜罐学习之ssh [ cowrie ]



0x01 蜜罐是什么

1
2
蜜罐其实就是一台无人使用但却被严密监控的网络主机,里面包含着各类虚假的高价值资源和一些已知漏洞,以此吸引入侵者来入侵该主机
并且在被入侵的过程中,实时记录和审计入侵者的所有入侵攻击流量,行为和数据,以此了解入侵者的攻击方式,手段和目的,便于后期快速完成对其的溯源,取证工作

0x02 蜜罐的一些主要构成模块
按实现大概逻辑划分:

1
2
3
控制,将入侵者牢牢控制在指定的网络范围中,使其不能再以此机器作为跳板来攻击其它的机器
捕获,把入侵者在入侵过程中所产生的各种流量捕获住
分析,将捕获到的各种数据存到数据库或者其它指定地方,便于后续还原其详细的入侵攻击过程

按具体实现过程划分:

1
2
3
监控各种主机项,如,进程,文件,注册表,网络...
同时提交给入侵检测,以识别其更详细的入侵手段,并对整个入侵过程做详细记录
入侵数据汇总分析,其实就是把上述两步所得到的各种数据进行集中分析,最后,勾勒出完整的入侵轨迹画像

说人话:

1
2
3
蜜罐环境隔离:使用虚拟环境将物理环境和蜜罐隔绝开,防止某些敏感操作在其真实的系统环境中进行造成破坏
敏感操作记录:把蜜罐中所有的入侵操作都写进数据库
邮件报警系统:蜜罐被入侵后自动发送报警邮件通知相关安全应急人员

0x03 对蜜罐与攻击者之间进行的交互分类的理解
低交互蜜罐:

1
2
3
最大的特点是,蜜罐为攻击者展示的所有攻击弱点和攻击对象都不是真正的产品系统
而是对各种系统及其提供的服务的模拟,由于它的服务都是模拟的行为,所以蜜罐可以获得的信息非常有限
只能对攻击者进行简单的应答,不过,它也是最安全的蜜罐类型

中交互蜜罐:

1
2
是对真正的操作系统的各种行为的模拟,它提供了更多的交互信息,同时也可以从攻击者的行为中获得更多的信息
在这个模拟行为的系统中,蜜罐此时看起来和一个真正的操作系统没有区别,它们甚至是比真正系统还要诱人的攻击目标

高交互蜜罐:

1
2
3
具有一个真实的操作系统,它的优点体现在对攻击者提供完全真实的系统
当攻击者获得ROOT权限后,受系统,数据真实性的迷惑,他的更多活动和行为将被记录下来
缺点是被入侵的可能性很高,如果整个高交互蜜罐被入侵,那么它就会成为攻击者下一步攻击的跳板,不太安全

0x04 蜜罐的主要作用

1
跟踪入侵轨迹,捕获定向攻击,捕获未知nday[是的,Nday除了能自己挖之外,也能这样不劳而获]...你能想到的所有猥琐应用

0x05 开始实战部署ssh蜜罐,cowrie,也是一款非常老的中等交互的开源蜜罐,想必大家也早都比较熟悉了,这里就不多做介绍了

1
本次测试的系统环境为 Ubuntu 14.04 LTS x86_64 Server

创建普通用户作为cowrie的服务运行账户

1
2
# useradd cowrie
# passwd cowrie

安装所有的依赖库

1
2
3
# apt-get install python-dev gmpc-dev build-essential libmpfr-dev \
libmpc-dev libffi-dev libssl-dev python-twisted python-crypto \
python-pyasn1 python-gmpy2 python-mysqldb python-zope.interface git

下载cowrie

1
2
3
# cd /opt/
# git clone https://github.com/micheloosterhof/cowrie.git
# cd cowrie/

创建好虚拟环境

1
2
3
# apt-get install python-virtualenv
# virtualenv cowrie-env
# source cowrie-env/bin/activate

安装虚拟环境中所需的各种py依赖库,其实,在安装cryptography这个py库中间还遇到了一点小麻烦,不过大家按我说的做应该就没什么问题了

1
2
3
4
5
# pip install -U pip
# pip install -U virtualenv
# pip install twisted cryptography pyopenssl gmpy2
# pip install -r requirements.txt
# pip install -U -r requirements.txt

创建cowrie的配置文件,并修改cowrie目录的属主属组,意思就是让cowrie对cowrie目录有所有的操作权限

1
2
3
# cp cowrie.cfg.dist cowrie.cfg
# chown -R cowrie:cowrie /opt/cowrie/
# ls -l /opt/cowrie/

切换到cowrie用户,并尝试启动cowrie

1
2
3
# su - cowrie
$ . cowrie-env/bin/activate
$ ./bin/cowrie start

看到下面的返回,就说明你的cowrie已经基本安装成功了,因为接下来还要要继续配置cowrie,所以看完没什么问题暂时先把cowrie停掉

1
2
Activating virtualenv "cowrie-env"
Starting cowrie: [twistd --umask 0077 --pidfile var/run/cowrie.pid -l log/cowrie.log cowrie ]...

1
$ ./bin/cowrie stop

编辑cowrie的主配置文件,配置蜜罐,建议大家还是好好去读读配置文件,支持的功能基本都在里面,这样也更有利于自己更全面的理解把握cowrie

1
# vi cowrie.cfg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[honeypot] 蜜罐的全局配置
hostname = svr04 蜜罐机器的机器名
log_path = log 蜜罐自身log的存放位置
download_path = dl 入侵上传文件的默认存放目录
data_path = data 这下面存放了密码字典userdb.txt,其实就是入侵者常用的弱口令,弱口令其实不需要太多,一两个就够了
只要匹配到其中任何一条即ssh登陆成功,当然,这个登陆是指ssh蜜罐登陆成功,另外还有伪装的文件系统fs.pickle
contents_path = honeyfs 这下面存放有ssh登陆成功后的欢迎信息,即motd中的内容,还有其他的一些重要系统配置文件,如,passwd等,可以自行伪造的更逼真一些
filesystem_file = data/fs.pickle
txtcmds_path = txtcmds 入侵者可以执行的命令
ttylog = true
interactive_timeout = 180
backend = shell
auth_class = UserDB
[ssh]
enabled = true 激活ssh蜜罐
rsa_public_key = etc/ssh_host_rsa_key.pub
rsa_private_key = etc/ssh_host_rsa_key
dsa_public_key = etc/ssh_host_dsa_key.pub
dsa_private_key = etc/ssh_host_dsa_key
version = SSH-2.0-OpenSSH_6.0p1 Debian-4+deb7u2
listen_port = 60001 设置蜜罐ssh的端口
listen_endpoints = tcp:60001:interface=0.0.0.0 记得这个端口同时也需要改
sftp_enabled = true
forwarding = true
forward_redirect = false
[telnet]
enabled = false 同时它还是支持telnet蜜罐
listen_endpoints = tcp:2223:interface=0.0.0.0
[output_jsonlog]
logfile = log/cowrie.json
[output_mysql] 数据库连接配置信息,如果你希望把蜜罐的各种入侵数据存到数据库需要开启此项,默认是注释状态
host = localhost
database = cowrie
username = cowrie
password = admin
port = 3306

cowrie 基本配置完成后,接下来可以来做nat转发了,语句的意思很简单,就是把目的端口22的数据都重定向到60001端口上,很明显,60001端口正是我们蜜罐ssh的端口,很显然,当入侵者连到我们的ssh,就顺利的进到我们提前布置好的蜜罐中了

1
2
# iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 60001
# iptables-save

修改ssh服务配置,把原来的22端口’隐藏掉’,改成个高端口,推荐6万以后的,因为nmap貌似默认只扫1000个高危端口,这样就可以一定程度上避开入侵者扫描到我们真实的ssh端口

1
2
3
4
# vi /etc/ssh/sshd_config
#Port 22
Port 60002
# /etc/init.d/ssh restart

上传配置完成后,我们再次切换到cowrie用户,看看其能否正常启动,一般正常启动就说明前面的配置基本没什么问题了,之后就先停掉,我们开始配置数据库

1
2
3
4
5
# su - cowrie
$ cd /opt/cowrie/
$ . cowrie-env/bin/activate
$ ./bin/cowrie start
$ ./bin/cowrie stop

安装mysql数据库

1
2
3
# apt-get install libmysqlclient-dev python-dev
# apt-get install mysql-server python-mysqldb 中间会要求你设置root密码,记得设个复杂点的密码
# pip install mysql-python

建库,建表,建用户,授权,准备用来存放蜜罐数据

1
2
3
4
5
# mysql -u root -p
mysql> CREATE DATABASE cowrie;
mysql> GRANT ALL ON cowrie.* TO cowrie@localhost IDENTIFIED BY 'admin';
mysql> flush privileges;
mysql> exit

默认的表结构文件在/opt/cowrie/doc/sql/目录下,我们切换到该目录下,然后source一下即可

1
2
3
4
5
# cd /opt/cowrie/doc/sql/
# mysql -u root -p
mysql> use cowrie;
mysql> source ./mysql.sql;
mysql> show tables;

务必要记得去把cowrie配置中的数据库连接信息修改下,其实,除了支持直接存到mysql,它也支持存到elasticsearch,mongodb,sqlite中

1
2
3
4
5
6
7
8
# vi cowrie.cfg
[output_mysql]
host = localhost
database = cowrie
username = cowrie
password = admin
port = 3306

至此,cowrie的所有配置基本已完成,再次切换到cowrie用户,尝试启动cowrie

1
2
3
4
5
6
# su - cowrie
$ cd /opt/cowrie/
$ . cowrie-env/bin/activate
$ ./bin/cowrie start
(cowrie-env)$ exit
# tree -L 2 ./

然后到另一台机器上用ssh连到我们已经配置好蜜罐的这台机器上,默认端口22,很显然,我们发现此时已经进入了一个虚拟的蜜罐环境下,随便执行一些命令

再来看下实际爆破ssh的效果

最后回到数据库中,看看被记录到的数据,基本是一目了然的,大家如果有兴趣此时也可以去日志文件中看看都有啥,再或者也可以自己写脚本在前端展示出来

1
2
3
4
5
# mysql -u root -p
mysql> use cowrie;
mysql> select * from sessions;
mysql> select * from auth;
mysql> select * from input;



量大的问题:
    这样的蜜罐很容易被各种搜索引擎抓到,如shodan,另外,现在是数据量特别小,没感觉啥压力,如果并发特别大,数据流入比较猛,各种传统关系型数据库可能就撑不住了,不过,好在cowrie已经事先为我们考虑到了,直接默认就支持nosql,elasticsearch,splunk输出,只是还缺少个自动报警,不过这都不叫问题,后期自己写就好了


0x06 后话
    这次只是简单的介绍一些关于cowrie蜜罐的基本应用,其实,就像我前面所说,cowrie除了支持基本的ssh蜜罐,它同样也支持telnet,http,https蜜罐,全部都在cowrie的主配置文件中可以自定义,后续日子里陆续还会更详细介绍如,Dionaea,Beeswarm…这类蜜罐的具体实战应用,关于如何配合各种虚拟化容器进行部署,目前自己也正在学习中,后续都会更新上来…