0%

linux脚本内容审计

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

完整的工程实现