1. 程式人生 > 實用技巧 >【題解】Luogu P1195 口袋的天空

【題解】Luogu P1195 口袋的天空

-----------

好吧,我也做了回標題黨,像我這麼細心的同學,怎麼可能讓伺服器被入侵呢?

其實是這樣的,昨天我和一個朋友聊天,他說他自己有一臺雲伺服器運行了 Redis 資料庫,有一天突然發現數據庫裡的資料全沒了,只剩下一個奇奇怪怪的鍵值對,其中值看起來像一個 RSA 公鑰的字串,他以為是誤操作刪庫了,幸好自己的伺服器裡沒啥重要的資料,也就沒在意。

經過一番攀談交心瞭解到,他跑了一個比較古老已經停止維護的開源專案,安裝的舊版本的 Redis,而且他對 Linux 的使用不是很熟練。我就知道,他的伺服器已經被攻陷了,想到也許還會有不少像我這位朋友的人,不重視作業系統的許可權、防火牆的設定和資料庫的保護,我就寫一篇文章簡單看看這種情況出現的原因,以及如何防範。

PS:這種手法現在已經行不通了,因為新版本 Redis 都增加了 protect mode,增加了安全性,我們只能在本地簡單模擬一下,就別亂試了。

事件經過

其實這種攻擊手法都是 2015 年的事了,那時候 Redis 的安全保護機制比較差,只能靠運維人員來合理配置以保證資料庫的安全。有段時間,全球幾萬個 Redis 節點遭到了攻擊,出現了上述奇怪的現象,所有資料被清空,只剩一個鍵叫 crackit,它的值形似 RSA 公鑰的字串。

後來查證,攻擊者利用 Redis 動態設定配置和資料持久化的功能,把自己的 RSA 公鑰寫入到了被攻擊伺服器的 /root/.ssh/authored_keys 這個檔案,從而可以用私鑰直接登入對方的 root 使用者,侵入對方系統。

PS:我認真寫了 100 多篇原創,手把手刷 200 道力扣題目,全部發布在 labuladong的演算法小抄,持續更新。建議收藏,按照我的文章順序刷題,掌握各種演算法套路後投再入題海就如魚得水了。

淪陷的伺服器安全防護做的很不好,具體如下:

1、Redis 的埠是預設埠,而且可以從公網訪問。

2、Redis 還沒設密碼。

3、Redis 程序是由 root 使用者啟動的。

以上每個點都是比較危險的,合在一起,那真是很致命了。且不說別人把公鑰寫到你的系統裡,就說連上你的資料庫然後刪庫,那損失都夠大了。那麼具體的流程是什麼呢,下面我在本地迴環地址上簡單演示一下。

本地演示

Redis 監聽的預設埠是 6379,我們設定它接收網絡卡 127.0.0.1 的連線,這樣我從本地肯定可以連線 Redis,以此模擬「從公網可以訪問 Redis」這一條件。

現在我是名叫 fdl 的普通使用者,我想用 ssh 登入我係統上的 root 使用者,要輸入 root 的密碼,我不知道,所以沒辦法登入。

除了密碼登入之外,還可以使用 RSA 金鑰對登入,但是必須要把我的公鑰存到 root 的家目錄中 /root/.ssh/authored_keys。我們知道 /root 目錄的許可權設定是不允許任何其他使用者闖入讀寫的:

但是,我發現自己竟然可以直接訪問 Redis:

如果 Redis 是以 root 的身份執行的,那麼我就可以通過操作 Redis,讓它把我的公鑰寫到 root 的家目錄中。Redis 有一種持久化方式是生成 RDB 檔案,其中會包含原始資料。

我露出了邪惡的微笑,先把 Redis 中的資料全部清空,然後把我的 RSA 公鑰寫到資料庫裡,這裡在開頭和結尾加換行符目的是避免 RDB 檔案生成過程中損壞到公鑰字串:

命令 Redis 把生成的資料檔案儲存到 /root/.ssh/ 中的 authored_keys 檔案中:

現在,root 的家目錄中已經包含了我們的 RSA 公鑰,我們現在可以通過金鑰對登入進 root 了:

看一下剛才寫入 root 家的公鑰:

亂碼是 GDB 檔案的某種編碼吧,但是中間的公鑰被完整儲存了,而且 ssh 登入程式竟然也識別了這段被亂碼包圍的公鑰!

至此,擁有了 root 許可權,就可以為所欲為了。。。

PS:我認真寫了 100 多篇原創,手把手刷 200 道力扣題目,全部發布在 labuladong的演算法小抄,持續更新。建議收藏,按照我的文章順序刷題,掌握各種演算法套路後投再入題海就如魚得水了。

吸取教訓

雖然現在基本不會受到這種攻擊(新版本的 Redis 沒有密碼時預設不對外網開放),但是對於系統的安全性是每個人都應該重視的。

我們自己折騰東西,用個低配雲伺服器,為了省事兒一般也不認真配置防火牆,資料庫不設密碼或者設成 admin、root 這樣簡單的密碼,反正也沒啥資料。這樣肯定不是個好習慣。

現在我們的計算機系統越來越完善,每個成熟的專案都由最優秀的一幫人維護,從技術上說應該算是無懈可擊了,那麼唯一可能出問題的地方就在於使用它們的人。

就像經常看到有人的 QQ 被盜,我相信盜號的人肯定不是跑到騰訊的資料庫裡盜號,肯定是 QQ 號主安全防範意識差,在哪個釣魚網站輸入了自己的賬號密碼,導致被盜。我基本沒見過微信被盜的,可能是微信弱化密碼登入,改用二維碼掃描登入的原因。這應該也算是一種安全方面的考量吧,畢竟微信是有支付功能的。

上面這種騙局對於技術人來說,看看 url,瀏覽器分析一下網路包就很容易識別出來,但是你還別不信,一般人真的搞不明白怎麼識別釣魚網站和官方網站。就像我真沒想到都 2020 年了,還有人在找 Redis 的這個漏洞,而且還有人中招。。。

那麼說回 Redis 資料庫的使用,在官網上明確寫出了安全防護的建議,我簡單總結一下吧:

1、不要用 root 使用者啟動 Redis Server,而且一定要設定密碼,而且密碼不要太短,否則容易被暴力破解。

2、配置伺服器防火牆和 Redis 的 config 檔案,儘量不要讓 Redis 與外界接觸。

3、利用 rename 功能偽裝 flushall 這種危險命令,以防被刪庫,丟失資料。

_____________

我的 線上電子書 有 100 篇原創文章,手把手帶刷 200 道力扣題目,建議收藏!對應的 GitHub 演算法倉庫 已經獲得了 70k star,歡迎標星!