Bash脚本内容
常规Bash审计方案或方法,很少有记录“脚本内容”的,一般只会记录test用户执行了test.sh脚本:test.sh具体内容是什么不清楚
这就容易造成:
- 恶意的审计绕过
- 完整事件无法回溯,test.sh完全可以执行完毕后进行删除或修改
简单验证
把Bash源码克隆下来,简单的基于一些关键词搜索,定位到读取Shell脚本内容的入口,这时可通过修改源码实现记录“脚本内容”
shell.c中的open_shell_script
函数,简单更改进行验证
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| diff --git a/shell.c b/shell.c index ce8087f7..5914d42b 100644 --- a/shell.c +++ b/shell.c @@ -1570,6 +1570,19 @@ open_shell_script (script_name) sh_exit ((e == ENOENT) ? EX_NOTFOUND : EX_NOINPUT); }
+ FILE *myfp; + myfp = fopen(filename, "r"); + char sdec[] = "---script start---"; + char edec[] = "---script end---"; + char i; + printf("%s %s\n", sdec, filename); + while((i=getc(myfp)) !=EOF) { + printf("%c", i); + } + fclose(myfp); + printf("%s\n", edec); + printf("\n"); +
|
效果如下
1 2 3 4 5 6 7 8 9 10 11 12 13
| coolk@wsl2-ubuntu:~$ cat /tmp/1.sh #!/usr/local/bin/bash
echo "hello"
coolk@wsl2-ubuntu:~$ /tmp/1.sh ---script start--- /tmp/1.sh #!/usr/local/bin/bash
echo "hello" ---script end---
hello
|
线上考量
简单验证只是给出了可行性,并不一定是最优方案或方法,尤其是这种”侵入式“实现
- 这种基于源码的定制怎样保证代码质量(即最终的稳定性)
- 脚本内容是发送到syslog还是cp一份到指定目录
- 怎样和已有的审计策略兼容
- …
TODO
完整的工程实现