如何隱藏Shell腳本內(nèi)容
本文轉(zhuǎn)載自微信公眾號「Linux開發(fā)那些事兒」,作者LinuxThings。轉(zhuǎn)載本文請聯(lián)系Linux開發(fā)那些事兒公眾號。
從事 Linux 開發(fā)的同學(xué),經(jīng)常需要編寫 shell 腳本,有時腳本中會涉及到一些敏感內(nèi)容,比如一些 IP 地址,用戶名以及密碼等,或者腳本中有一些關(guān)鍵的代碼, 所有這些內(nèi)容你都不想別人閱讀或者修改,更進(jìn)一步,你希望對腳本設(shè)置過期時間,超過指定時間時間之后,腳本就無法使用
在不改變腳本內(nèi)容、功能以及執(zhí)行方式的情況下,有沒有辦法實現(xiàn)上面的需求呢?
答案是:有的, 在Linux下,我們可以使用 shc 這個工具來實現(xiàn)隱藏shell腳本內(nèi)容以及設(shè)置過期時間的目的
簡介
shc 是一個通用shell腳本編譯器,它將 shell 腳本編譯 可執(zhí)行的二進(jìn)制文件,它的功能以及執(zhí)行方式和原始腳本沒有區(qū)別
和 gcc 編譯器不同的是,shc 并沒有把腳本源代碼轉(zhuǎn)化成機(jī)器碼,它只是生成了一份 C 語言代碼,這份 C 語言代碼中包含了加密的原始shell腳本,并為它添加了過期功能,然后,通過gcc編譯器將C代碼編譯成可執(zhí)行的二進(jìn)制文件
安裝
目前,大多數(shù)的 Linux 發(fā)行版的倉庫中都已經(jīng)包含了 shc, 只需要使用默認(rèn)的包管理器就可以安裝,具體的安裝命令如下:
- yum install shc
輸入 shc -v 命令,下面的輸出表示安裝成功
- [root@ecs-centos-7 shc_test]# shc -v
- shc parse(-f): No source file specified
- shc Usage: shc [-e date] [-m addr] [-i iopt] [-x cmnd] [-l lopt] [-o outfile] [-rvDSUHCABh] -f script
常用選項
下面是 shc 常用的一些選項以及選項的描述
選項 | 描述 |
---|---|
-f | 待編譯的shell腳本文件 |
-o | 指定編譯生成的二進(jìn)制文件 |
-e | 設(shè)置過期時間,格式 日/月/年 |
-m | 過期之后,執(zhí)行腳本時的提示信息 |
-v | 輸出編譯shell腳本的過程 |
-r | 編譯生成可再發(fā)行的二進(jìn)制 |
編譯腳本
sehll 腳本編譯成可執(zhí)行的二進(jìn)制文件之后,只需要把二進(jìn)制文件提供給執(zhí)行者即可,這樣執(zhí)行者就無法知道原始腳本代碼了,從而實現(xiàn)別人無法閱讀和修改代碼的目的
新建 func.sh 腳本,往其中添加如下內(nèi)容:
- #!/bin/bash
- #是否是有效的密碼
- valid_passwd()
- {
- if [ "$1" == "123" ]; then
- echo 1
- else
- echo 0
- fi
- }
- #獲取最大數(shù)量
- max_num()
- {
- echo 100
- }
- #登錄到遠(yuǎn)程機(jī)器
- login()
- {
- sshpass -p '123456' ssh test@192.168.70.20
- }
- #版本號
- ver()
- {
- echo "1.0"
- }
- if [ $# -ne 0 ]; then
- name="$1"
- shift 1
- ${name} "$@"
- fi
執(zhí)行下面的命令,編譯 func.sh 腳本
- shc -rf func.sh -o func.bin
編譯完之后,當(dāng)前目錄下會出現(xiàn)三個文件
- [root@ecs-centos-7 shc_test]# ll
- -rwxrwxr-x 1 root root 11640 7月 1 00:24 func.bin
- -rw-r--r-- 1 root root 373 7月 1 00:19 func.sh
- -rw-r--r-- 1 root root 19811 7月 1 00:24 func.sh.x.c
func.sh 是原始的腳本文件,func.sh.x.c 是生成的 c語言代碼, func.bin 是生成可執(zhí)行的二進(jìn)制文件,它的使用方法和原始腳本是一樣的
注意: 編譯出來的二進(jìn)制文件func.bin,如果想讓它在其他機(jī)器也能運(yùn)行的話,一定要指定 -r 選項
使用 file 命令分別查看 func.bin 、func.sh.x.c,結(jié)果如下:
腳本對外提供 valid_passwd、 max_num、 login、 ver 這四個接口,腳本中已經(jīng)注明了每個接口的作用,使用方法是 ./func.bin 接口名 接口參數(shù)列表,下面的兩個實例說明了如何使用腳本
實例1
分別執(zhí)行 ./func.bin ver 和 ./func.sh ver 命令,結(jié)果如下
從上圖可以看出,無論是用腳本還是二進(jìn)制,最終的結(jié)果都是一樣的
實例2
執(zhí)行 ./func.bin login 命令,結(jié)果如下
當(dāng)傳入 login 參數(shù)時,就會執(zhí)行func.sh腳本中的 login 函數(shù),該函數(shù)的作用是使用 SSH 登錄到遠(yuǎn)程機(jī)器, 函數(shù)體中的 sshpass 是一個自動填充SSH登錄密碼的工具
從結(jié)果可以知道,執(zhí)行 ./func.bin login 命令之后,就登錄到 ip 為 192.168.70.20 機(jī)器的 /home/test 目錄,后面再輸入 exit 從遠(yuǎn)程機(jī)器退回到當(dāng)前機(jī)器的目錄
我們把 func.sh 腳本編譯成 func.bin 二進(jìn)制文件的目的就是要隱藏腳本文件中一些敏感信息,比如:腳本中的SSH用戶 test , IP地址 192.168.70.20 以及密碼 123456
設(shè)置過期時間
shc 除了將把腳本編譯成二進(jìn)制,還能為二進(jìn)制設(shè)置過期時間,下面還是以 func.sh 腳本為例來說明
執(zhí)行 shc -e 25/6/2021 -m "The script is expired, Please contact test@qq.com" -rf func.sh -o func.bin 命令把腳本的過期時間設(shè)置為 2021年6月25日,執(zhí)行過期后的腳本提示語設(shè)置為 "The script is expired, Please contact test@qq.com"
然后,執(zhí)行 ./func.bin ver 命令進(jìn)行測試,結(jié)果如下
從上圖可以看出,腳本設(shè)置過期時間之后,再次執(zhí)行腳本會提示已經(jīng)過期了
如何引用二進(jìn)制腳本
func.sh 編譯成了二進(jìn)制后,其他腳本引用它的方式也要調(diào)整下,原來以 source ./func.sh 的使用方式都需要修改,因為 fun.sh 已經(jīng)由原來的 ASICII 文件變成了 二進(jìn)制文件了,下面給出一個shell腳本引用二進(jìn)制腳本 func.bin 的實例
新建 test_func.sh 腳本,腳本內(nèi)容如下:
- #!/bin/bash
- #調(diào)用 valid_passwd 函數(shù)
- ret=$(./func.bin valid_passwd 123)
- if [ $ret -eq 1 ]; then
- echo "passwd ok"
- fi
- #調(diào)用 valid_passwd 函數(shù)
- ret=$(./func.bin valid_passwd 124)
- if [ $ret -eq 1 ]; then
- echo "passwd ok"
- else
- echo "passwd fail"
- fi
- #調(diào)用 max_num 函數(shù)
- ret=$(./func.bin max_num)
- echo "max_num:"$ret
- #調(diào)用 ver 函數(shù)
- ret=$(./func.bin ver)
- echo "version:"$ret
執(zhí)行 ./test_func.sh 命令,結(jié)果如下
從上圖可以看出,test_func.sh 腳本分別調(diào)用了二進(jìn)制文件 fun.bin 中的 valid_passwd、max_num、 ver 函數(shù),根據(jù) func.sh 腳本內(nèi)容,可以確定結(jié)果輸出都是正確的
從這個實例可以得出,普通腳本也可以正常使用二進(jìn)制的腳本
安全性
shc 使用的加密類型是叫做 RC4流密碼的一個變體,目前它已經(jīng)被證實存在弱點,存在被破解的可能, 尤其在 shc 中,密鑰被攜帶到加密腳本本身中,所以,是存在 通過反匯編破解出密鑰,進(jìn)而通過密鑰還原原始腳本的可能性
因此,我們不應(yīng)該依賴 shc 加密的安全性,而是更多的把它當(dāng)作是shell腳本內(nèi)容的隱藏或者混淆工具
小結(jié)
本文主要介紹了隱藏shell腳本內(nèi)容的工具 shc, 雖然它加密的安全性不高,但是我們平常可以把它作為一個shell腳本代碼隱藏和混淆工具來使用,也能達(dá)到我們的目的, 更多關(guān)于 shc 的相關(guān)知識請參考網(wǎng)上其他資料