81 lines
4.9 KiB
Markdown
81 lines
4.9 KiB
Markdown
---
|
||
layout : post
|
||
title : "SHell脚本加密"
|
||
subtitle : "Open source? That depends..."
|
||
date : 2022-04-11 20:57:40
|
||
author : "Manford Fan"
|
||
catalog : false
|
||
header-img : "img/post-bg-universe.jpg"
|
||
tags :
|
||
- Shell
|
||
- Encryption
|
||
---
|
||
|
||
有人说Shell时最简单的编程语言之一,我认为这里有个预设,那就是对Linux操作系统有一定的认识。如果说Linux是一块上好的木材,我愿称Shell为雕刻这块木材必备的利刃,它几乎和是操作系统融为一体的。虽然Shell是一种解释型语言,执行速度相对于C,C++等这些编译型语言慢很多,更不用提汇编;也没有精巧的数据结构,无法完成复杂算法的实现,而且程序稍微一长,就让人很容易迷惑。尽管Shell有很多缺点,但是每一种语言都有其适用的领域,[ABS](https://tldp.org/LDP/abs/html/index.html)中详细的阐述了什么时候不适合用Shell,以及什么时候适合。Shell的语法简单,调试容易(需要掌握技巧),能很快的实现较为简单(稍微复杂的也可以)的任务。
|
||
|
||
由于Shell是一种解释型语言,这个特性就注定它的源码是公开的,可是有时候我们编写的脚本中包含一些密码,给别人用的同时不想透露给别人其中的私密信息。这个时候就需要对Shell脚本进行加密。[SHC](http://www.datsi.fi.upm.es/~frosal/sources/)工具能很好地完成这一加密工作,它是由西班牙的Francisco Javier Rosales García先生编写的,能满足绝大多数使用场景,但是正如在工具简介中不止一次的说,"Use with care","CHECK YOUR RESULTS CAREFULLY BEFORE USING",而且也给出了到目前为止发现的一个bug。所以最好只是用于私人环境,生产环境还是要谨慎使用。
|
||
|
||
## 1. 编译安装SHC
|
||
|
||
`shc`工具的原理是,讲Shell脚本解释称C语言源码,然后通过编译C语言源码得到二进制文件。加密完成后生成了两个文件,一个是.x文件,是一个二进制可执行文件,名称可以任意修改,另一个是.x.c文件,是C语言的源码文件,可以删除。编译过程如下,`make`之后目录下会有一个`shc`可执行文件,执行`./shc -h`即可看到帮助信息。
|
||
|
||
```bash
|
||
wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9b.tgz
|
||
tar -xzf shc-3.8.9b.tgz
|
||
cd shc-3.8.9b
|
||
make
|
||
```
|
||
|
||
----
|
||
|
||
通过编译实验发现源码安装的可执行文件加密Shell脚本后不能得到正确的输出,最后偶然发现可以通过软件包管理工具直接安装——`apt/yum install shc`,🙃🙃,行吧。
|
||
|
||
## 2. SHC用法介绍
|
||
|
||
#### 语法规范
|
||
|
||
```bash
|
||
shc [ -e date ] [ -m addr ] [ -i iopt ] [ -x cmnd ] [ -l lopt ] [ -o outfile ] [ -ABCDhUv ] -f script
|
||
```
|
||
|
||
#### 命令选项
|
||
|
||
|选项|功能|
|
||
|:-|:-|
|
||
|-e <ins>date</ins>|指定过期时间,格式是**dd/mm/yyyy**|
|
||
|-m <ins>message</ins>|当过期时展示的消息提示,默认是"Please contact your provider"|
|
||
|-f <ins>script file</ins>|要加密的脚本文件|
|
||
|-i <ins>inline option</ins>|shell编译器指定的内联选项|
|
||
|-x <ins>command</ins>|eXec command, as a printf format i.e: exec(\\'%s\\',@ARGV);|
|
||
|-l <ins>last option</ins>|Last shell option i.e: --|
|
||
|-o <ins>outfile</ins>|指定输出文件名|
|
||
|-r|使用宽松的安全策略,生成一个可重新分发的二进制文件,不能跨平台,但可以运行在本版相差不大的Linux上|
|
||
|-v|显示详细的编译过程|
|
||
|-D|Switch on debug exec calls|
|
||
|-U|Make binary to be untraceable (using strace, ptrace, truss, etc.)|
|
||
|-B|Compile for BusyBox|
|
||
|
||
## 3. 示例展示
|
||
|
||
```bash
|
||
[ 0 root@aliyun ~]# cat > test.sh << EOF
|
||
> #!/bin/bash
|
||
> passcode='123457asdf'
|
||
> echo -n \$passcode | md5sum | awk '{print \$1}'
|
||
> EOF
|
||
[ 0 root@aliyun ~]# bash test.sh
|
||
7c2dd6ea4593cea88b2a4dae1a581e1b
|
||
[ 0 root@aliyun ~]# shc -r -U -f test.sh -o gen_md5
|
||
[ 0 root@aliyun ~]# ls
|
||
gen_md5 test.sh test.sh.x.c
|
||
[ 0 root@aliyun ~]# ./gen_md5
|
||
7c2dd6ea4593cea88b2a4dae1a581e1b
|
||
```
|
||
|
||
## 4. 安全性
|
||
|
||
安全相关方面,主要担心两个问题:一个就是指定过期时间之后,用户手动调整系统时间,导致加密程序误以为当前时间未过期,从而能继续使用;另一个是加密程序是否足够安全,如非对称加密一般,理论上可破解,但实际上无法做到?
|
||
|
||
针对第一个问题,可以在编写的脚本中调用第三方工具,重新设定系统时间为正确的时间,或者直接获取网络当前时间;针对第二个问题,GitHub上确实有对应的[unshc](https://github.com/yanncam/UnSHc)破解程序,但是作者也坦言,高版本的shc程序改变了程序架构,并使用了内核相关的安全机制,使得当前的破解程序无法正常的工作;另外,即使再完美的加密程序,只要技术能力足够都是能够被破解的,所以,最重要的还是写好自己的shell程序,任何防控措施都是只防好人不防坏人。
|
||
|