最近发现一个很有用的shell脚本混淆工 Bashfuscator。出于工作需要,平时会写一些shell脚本,但是明文的内容很容易被别人给“借鉴”。
执行下面的命令,实现对shell脚本的一键混淆编译加密操作。
bashfuscator -s 1 -t 1 --layers 1 --no-file-write -f test.sh -o output.sh && shc shc -v -U -r -f output.sh && gzexe output.sh.x
什么是 Bashfuscator?
Bashfuscator 是一个用 Python 3 编写的模块化和可扩展的 Bash 混淆框架。它提供了许多不同的方法来使 Bash 单行或脚本更难理解。它通过生成复杂的、随机的 Bash 代码来实现这一点,该代码在运行时评估原始输入并执行它。 Bashfuscator 使生成高度混淆的 Bash 命令和脚本变得容易,无论是从命令行还是作为 Python 库。
项目地址
- https://github.com/Bashfuscator/Bashfuscator
- https://bashfuscator.readthedocs.io/
如何安装?
git clone https://github.com/Bashfuscator/Bashfuscator
cd Bashfuscator
python3 setup.py install --user
工具使用
程序选项
程序选项:
-l, --list 列出所有可用的混淆器、压缩器和编码器
-c 命令,--command 命令 混淆命令
-f FILE, --file FILE 要混淆的脚本的名称
--stdin 混淆标准输入
-o 输出文件,--outfile 输出文件 将有效负载写入的文件
-q, --quiet 仅打印有效载荷
--clip 将有效负载复制到剪贴板
--test 运行后测试有效载荷,不兼容-q
混淆选项
混淆选项:
-s {1,2,3}, --payload-size {1,2,3} 所需的有效负载大小。默认值:2
-t {1,2,3},--执行时间 {1,2,3} 有效载荷的所需速度。默认值:2
--layers LAYERS 要应用的混淆层数,默认值:2。当使用 --choose-mutators 时默认为 1
--include-binaries 二进制文件 [二进制文件 ...] 在生成的二进制文件中使用有效载荷
--exclude-binaries 二进制文件 [二进制文件 ...] 不想在生成的二进制文件中使用有效载荷
--no-file-write 不要使用需要写入文件的混淆器
--write-dir WRITE_DIR 如果 Mutators 需要写入目录或创建文件
混淆单行命令或单个文件
使用
-c
参数对单行命令进行混淆。
$ bashfuscator -c "cat /etc/passwd"
[+] Mutators used: Token/ForCode -> Command/Reverse
[+] Payload:
${@/l+Jau/+<b=k } p''"r"i""n$'t\u0066' %s "$( ${*%%Frf\[4?T2 } ${*##0\!j.G } "r"'e'v <<< ' "} ~@{$" ") } j@C`\7=-k#*{$ "} ,@{$" ; } ; } ,,*{$ "}] } ,*{$
.......
"${@}" "${@%%Ij\[N }" ${@~~ } )" ${!*} | $@ $'b\u0061'''sh ${*//J7\{=.QH }
[+] Payload size: 1232 characters
使用 -f 参数对单个shell脚本进行混淆,-o 生成混淆后的shell脚本。
[root@zgao tmp]# bashfuscator -f test.sh -o outptu.sh
[+] Mutators used: String/Hex Hash
[+] Payload written to outptu.sh
[+] Payload:
${*//=q} ${*%Me}pr"${@##*^}"i${*,}n\tf %s "$( "${@~~}" pri"n"t"f" "\x$(""p${*#\`w}r${!
.....
#a)+2#1001)) )))" )" |"${@~~}"bas""$'\x68' "${@^}"
[+] Payload size: 2802 characters
个人推荐的使用参数
低混淆程度
混淆脚本中不额外写文件。
bashfuscator -s 1 -t 1 --layers 1 --no-file-write -f script.sh -o output.sh
正常混淆
不加额外参数。
bashfuscator -f test.sh -o output.sh
混淆脚本执行报错?
随机生成的部分混淆脚本可能执行会报错,可以先测试一下。
shc打包二进制文件
shc把shell脚本封装为一个可执行的二进制文件。如果上面使用Bashfuscator还不放心,可以用shc再编译一次。
shc这个工具不是自带的,需要先安装。
shc常用选项
shc 版本 4.0.3,通用 Shell 脚本编译器
shc GNU GPL 第 3 版 Md Jahidul Hamid <jahidulhamid@yahoo.com>
shc 用法:shc [-e date] [-m addr] [-i iopt] [-x cmnd] [-l lopt] [-o outfile] [-rvDSUHCABh] -f 脚本
[root@zgao tmp]# shc -h
shc 版本 4.0.3,通用 Shell 脚本编译器
shc GNU GPL 第 3 版 Md Jahidul Hamid <jahidulhamid@yahoo.com>
shc 用法:shc [-e date] [-m addr] [-i iopt] [-x cmnd] [-l lopt] [-o outfile] [-rvDSUHCABh] -f 脚本
-f %s 要编译的脚本文件名
-i %s shell 解释器的内联选项,即:-e
-x %s eXec 命令,作为 printf 格式,即:exec('%s',@ARGV);
-l %s 最后一个 shell 选项,即:--
-o %s 输出文件名
-r 放松安全性。制作可再发行的二进制文件
-v 详细编译
-S 为 root 可调用程序打开 setuid [OFF]
-D 打开调试执行调用 [OFF]
-U 使二进制无法追踪 [否]
-H 强化:额外的安全保护 [否]
使用下面的参数将shell脚本编译为exe
[root@zgao tmp]# shc -v -U -r -f outptu.sh
shc shll=bash
shc [-i]=-c
shc [-x]=exec '%s' "$@"
shc [-l]=
shc opts=
shc: cc outptu.sh.x.c -o outptu.sh.x
shc: strip outptu.sh.x
shc: chmod ug=rwx,o=rx outptu.sh.x
gzexe压缩shc生成exe
gzexe命令 ,这个命令是系统自带的。
原本是用来压缩可执行文件,压缩后的文件仍然为可执行文件,在执行时进行自动解压缩。当您去执行被压缩过的执行文件时,该文件会自动解压然后继续执行,和使用一般的执行文件相同。
gzexe script.sh会把原来没有加密的文件备份为 script.sh~ ,同时 script.sh 即被变成加密文件。 gzexe -d script.sh会解密还原脚本,所以只能够满足一般的加密用途。
这里用gzexe对exe文件压缩,进一步隐藏shell源码。
文章来源:
https://zgao.top/bashfuscator-%E6%B7%B7%E6%B7%86shell%E8%84%9A%E6%9C%AC%E5%B9%B6%E7%BC%96%E8%AF%91%E4%B8%BAexe/