原ppt:https://zeronights.ru/wp-content/uploads/2021/09/09_agarkov.pdf
主要考虑记录三样内容:命令行本身,shell中的输入stdin,shell中的stdout。
0x0 bash_history
敲命令的时候把命令记录到bash_history文件,退出的时候保存到文件,可以用history命令看见之前敲过什么。
如何避免被记录:
- 用kill -9 $$ 退出,而不是exit或者ctrl+D
- 每条命令前加个空格
- 将命令记录直接输出到null,而不是history文件,ln -sf /dev/null ~/.*_history
- 使用mc/screen等别的shell
0x1 bash debug traps
每次输入的东西都会被trap functions处理,如果想记录:
#!/bin/sh
debug_poc() {
echo "$USER($UID:$GROUPS) ran $BASH_COMMAND" >> /tmp/commands.log
}
trap debug_poc DEBUG
这个只记录命令,别的输入输出不记录,而且只在bash上有这个。
如何避免:
- 不加任何参数直接运行一下trap命令,清除所有traps
- 新建一个shell,比如screen/mc/zsh/csh
0x2 script
script是一个能记录命令/输入/输出的工具,还可以用scriptreplay工具还原整个会话。
比如:
$ script -B session.data -T session.time
[ … run your shell session here … ]
$ exit
$ scriptreplay -B session.data -T session.time
好处很明显,除了命令,stdin以及stdout也都可以记录,和各种curses也可以配合,自带“回放”工具
如何避免:
- 通过pkill -9 script退出
- lsof -p $(pidof script)找到script的输出文件,然后删掉
0x3 screen
screen命令用起来很方便,比如,登录一个ssh之后,通过screen -R [session_name] 来新建一个会话,然后ctrl+A/D来脱离会话,之后还可以再attach上,扎样就省得多开几个ssh会话了。
可以用来记录shell命令,输出也是完整记录:
$ screen -L -Logfile session.log
( do your stuff here )
$ exit
$ cat session.log
如何发现以及避免:
- stty -echo 禁止回显,不过命令的输出还是可以正常的看到
- rsync/scp/sftp to upload malicious .screenrc with eval/exec
0x4 sudo
0x5 linux audit
追踪syscall等,发送给auditd。比如:
# auditctl -a always,exit -F arch=b64 -S execve -F euid=0
# cat /var/log/audit/audit.log | grep -P ‘(SYSCALL|EXECVE)’
规则写的不高效的话,cpu占用很大。
应对方法是,获取root权限,然后关掉~
0x6 SELinux
selinux也是一种审计机制,内核级的一个组件。允许的会被记录,不允许的会被拒绝。
如果配置正确,root用户的命令行为也会被记录。
内核级监控,只能动内核。
0x7 LD_PRELOAD & LKML/eBPF
LD_PRELOAD
LD_PRELOAD的方法:经典的动态链接库注入,替换掉一些函数,记录这些函数的参数,从而记录shell中运行的程序的关键函数的参数、输入、输出等。
好处:不需要root就可以得到一些东西,对于普通用户来说不容易察觉,如果有root权限,可以加到/etc/ld.so.preload里面来全局生效。
短板:得写点儿代码,对于suid文件不管用,对于静态连接的文件不管用。
如何避免这种监控:
- unset LD_PRELOAD变量
- 直接通过/lib/ld-linux.so.2运行二进制文件
- 使用静态链接的二进制文件
LKML/eBPF
eBPF: https://github.com/iovisor/bpftrace
足够底层的监控记录,记录内核/syscall等。
关于bash的例子比如:https://github.com/iovisor/bpftrace/blob/master/tools/bashreadline.bt