这几天国内安全行业里,Redis因配置不当,导致黑客入侵成为热点,小弟学习了一下,和大家分享分享入侵过程。
-----背景---------
一、Redis Crackit入侵事件
2015年11月10日,有网络安全厂商指出国内互联网产生了大量针对Redis数据库服务器的扫描流量,其中有不少Redis服务器的数据库被清空,且/root/.ssh/authorized_keys文件被创建或改写,入侵者可以获取受影响服务器的完全控制权限。
因为受影响的Redis服务器的数据库被清空,但留存有一条键名为crackit的记录,因此这次事件被命名为Redis Crackit入侵事件。
二、SSH公钥登录
OpenSSH支持使用公钥登录远程服务器,其原理十分简单,即首先在Linux下使用ssh-keygen来生成公私钥对,其中公钥存放在远程服务器的$HOME/.ssh/authorized_keys文件中,在登录远程服务器时提供对应的私钥即可。
在Windows下,使用PuTTY的puttygen.exe组件也可以十分方便的生成公私钥对,其中生成的私钥文件可以提供给PuTTY用于登录远程服务器。
三、Redis Windows版本
Redis官方提供的源代码只能在Linux环境下编译,微软开源团队维护了一个可以在Windows下编译的版本,当前的最新版本仅支持64位的Windows操作系统,如果需要32位版本需要自行编译。
不过,微软开源团队对早期版本的Redis提供了32位版本的支持,已经编译好的32位Redis数据库文件可以从https://github.com/MSOpenTech/redis/archive/Win2.6.8.zip下载。
四、Redis缺陷分析
Redis服务器的默认配置存在许多安全隐患,包括:
1. 默认绑定到服务器的所有IP地址上,也就是所有能够访问到这台服务器的IP地址都可以连接该Redis数据库(最新版本已经解决了这一问题,默认绑定到127.0.0.1上);
2. 默认不需要密码即可登录,同时默认的登录密码为foobared,懒惰的运维人员会使用这个默认密码;
3. 默认可以使用config命令,该命令可以修改数据库硬盘备份文件所在的路径和名字;
4. 粗心的运维人员会使用root权限来启动redis-server进程;
五、参考资料
如果你想了解更多关于Redis数据库的基础知识,可以学习合天网安实验室提供的《Redis数据库安全实践》系列实验。同时,本实验参考了以下来源于互联网的资料,在此表示感谢。
1. Redis CrackIT入侵事件分析,北京白帽汇科技有限公司,http://static.nosec.org/download/redis_crackit_v1.1.pdf
2. SSH原理与运用,阮一峰的网络日志,http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html
3. 使用 RSA 密钥对进行 SSH 登录验证,TUNA Wiki,https://wiki.tuna.tsinghua.edu.cn/SshKeyHowto
--------------环境和工具--------------
服务器:CentOS 6.5,IP地址:10.1.1.101
测试机:Windows XP,IP地址随机
辅助工具:PuTTY、PuTTYGen、redis-cli
这里如何环境决定自己难搭建,推荐个地方大家去试试(
http://www.hetianlab.com/expc.do?w=exp_ass&ec=ECID172.19.104.182015111310254200001)。
----------------入侵过程介绍--------------------------
第一步 生成RSA公私钥对
首先需要生成RSA公私钥对,其中公钥将通过利用Redis数据库的安全脆弱点来上传到目标服务器,私钥将用于登录目标服务器。
进入Windows XP实验机器后,打开puttygen.exe程序(位于C:\Program Files\PuTTY\puttygen.exe),依次选择PuTTY密钥生成器对话框下的“密钥”、“生成密钥对”菜单项,其他参数使用默认设置即可。如下图所示:
点击“生成密钥对”菜单项之后,将会启动密钥生成过程。在生成过程中,需要将鼠标在进度条下方的空白区域不断移动,以便产生随机数据。如下图所示:
待密钥对生成完毕之后,公钥将会显示在界面上方的文本框中。如下图所示:
注意,每次生成的公私钥对都是不一样的,因此实验时以实际生成的密钥对为准。这里的公钥为ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAr50qqSE5UlsGGzJ5v7SFuYrYKTTsg9N/COZLqK5dz69AWXwMBQo+z04seEq+tX806BoKtFA3vJcz5nY10G08v4bnpEWp9y6g4NFxxkrGm55eIdLbFLH87nd2KuxqpHXT4PtR84Lqo4Wq7R9+jTsgsmE/U0ELN8Wyea3iCF94oVM= rsa-key-20151112。随后点击“保存私钥”按钮将对应的私钥保存到文件,在保存过程中将弹出PuTTYgen警告消息框“确定不给该密钥设置密码保护么?”,点击“是(Y)”按钮将私钥保存到桌面的key.ppk文件。
第二步:基于Redis数据库添加SSH公钥
现在我们需要将实验步骤一中生成好的公钥添加到目标服务器的$HOME/.ssh/authorized_keys文件中。
首先,将实验步骤一中生成的公钥保存到C:\Program Files\redis\key.txt中,注意需要在文件的头部和尾部多留几个空行,以便公钥始终可以保持在单独的一行而不会和其他数据混在一行中。对应的操作步骤如下:
1.在C:\Program Files\redis\目录下新建key.txt文件,使用鼠标选中key.txt后单击右键菜单并选择“Edit with Notepad++”,粘贴公钥到文件中,如下图所示:
2.在Notepad++中依次选择菜单项“编辑”、“档案格式转换”、“转换为 UNIX 格式”,将档案的格式转换为UNIX格式,以保证文件中的换行符是\n而不是\r\n。
3.保存key.txt文件并退出Notepad++。
现在打开CMD命令提示符,并依次执行以下命令:
1).cd "C:\Program Files\redis",用于切换工作目录;
2).type key.txt | redis-cli.exe -h 10.1.1.101 -x set crackit,表示在主机10.1.1.101上的redis数据库中插入一条记录,对应的键名为crackit(键名可以是其他字符串,不一定需要写成crackit),键值为key.txt中的内容;
3).redis-cli.exe -h 10.1.1.101,用于连接到主机10.1.1.101上的redis数据库并创建一个交互环境;
4).redis 10.1.1.101:6379> config set dir /root/.ssh/,用于将Redis数据库硬盘备份文件的存放目录修改为/root/.ssh/;
5).redis 10.1.1.101:6379> config set dbfilename authorized_keys,用于将Redis数据硬盘库备份文件的名字修改为authorized_keys;
6).redis 10.1.1.101:6379> save,将Redis数据库在内存中的数据保存到硬盘备份文件中,即转储到/root/.ssh/authorized_keys文件中;
以上操作如下图所示:
至此,我们已经基于Redis完成了将公钥保存到服务器的/root/.ssh/authorized_keys文件中的操作。以上操作在真实场景中可能存在一个问题:服务器上的Redis数据库中可能已经存在大量数据,因此插入crackit键时,在公钥数据之前可能已经存在有大量其他数据,在执行完save操作时,在authorized_keys文件中可能在公钥字符串之前也存在大量数据,因此可能对后续SSH登录服务器时造成干扰。
为了克服这一难题,不少入侵者采取了极端暴力的做法:在向Redis数据库插入公钥字符串之前执行flushall命令,该命令会清空Redis数据库中的数据,以保证接下来插入的公钥字符串位于硬盘备份文件的头部。可以看出,使用flushall会清空目标服务器中Redis数据库的数据,如果没有备份数据的话这可能造成灾难性的损失!
第三步:使用私钥登录远程服务器
在实验步骤一中我们生成了公私钥对,其中私钥保存在Windows XP实验机器桌面上的key.ppk文件中,公钥已经通过Redis上传到远程服务器的/root/.ssh/authorized_keys文件中。
现在,已经可以使用PuTTY来登录远程服务器了。首先,打开C:\Program Files\PuTTY目录下的PuTTY.exe文件,在主界面中填写好服务器的配置信息,即IP地址填写为10.1.1.101,端口号填写为22,如下图所示:
在PuTTY中填写好服务器的IP地址和端口号之后,单击PuTTY主界面左侧树形控件中Connection节点下的Data节点,将Auto-login username的值设置为root,即以用户名root登录,如下图所示
最后,点击左侧树形控件中Connection节点下的SSH节点,以及SSH节点下的Auth节点,在对应的界面中点击Browse按钮选择桌面上的key.ppk文件,如下图所示:
现在,单击Open按钮登录远程服务器,发现可以成功登录!测试一下whoami命令,提示是root账户,如下图所示:
至此,已经成功基于Redis的特性获取到远程服务器的完全控制权限!在这里提供几点Redis加固建议(全部通过修改Redis配置文件redis.conf完成):
1.修改bind参数,将服务器绑定到127.0.0.1上;
2.修改port参数,监听端口改成其他端口号;
3.修改requirepass参数,设置一个复杂的密码;
4.通过rename-command修改config命令的名字,如修改为空字符串""表示禁用config命令;
5.不要以root用户启动redis-server进程。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!