linux下历史命令通常有两大用处,一个是快速复用,另外是审计,快速复用在之前的文章linux命令行技巧中提过,有兴趣的可以去看看,今天主要说审计部分,分两部分:记录历史命令和隐藏命令行历史,分别针对运维防护及入侵渗透,下面分别介绍
记录所有用户历史命令
原本的linux默认记录1000条历史记录,且只记录命令,完全没办法做审计,当遇到服务器入侵等情况,做审计工作时,如果你没有开启audit,或其他第三方审计工具,在通过history做审计的时候,即便命令不被清除,你也只能看到历史命令,看不到其他任何信息,审计很不方便
这边直接上代码
代码语言:javascript
复制
PS1="`whoami`@`hostname`:"'[$PWD]'
history
USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
if [ "$USER_IP" = "" ]
then
USER_IP=`hostname`
fi
if [ ! -d /tmp/dbasky ]
then
mkdir /tmp/dbasky
chmod 777 /tmp/dbasky
fi
if [ ! -d /tmp/dbasky/${LOGNAME} ]
then
mkdir /tmp/dbasky/${LOGNAME}
chmod 300 /tmp/dbasky/${LOGNAME}
fi
export HISTSIZE=4096
DT=`date "+%Y-%m-%d_%H:%M:%S"`
export HISTFILE="/tmp/dbasky/
chmod 600 /tmp/dbasky/${LOGNAME}/*dbasky* 2>/dev/null
将以上命令复制到/etc/profile下面,source /etc/profile 使生效,重新登陆就可以看到历史命令记录
简单解释一下,以上部分脚本是在/tmp目录下创建一个dbasky目录,用来存放所有的用户的历史命令,HISTSIZE设置为4096条,可以根据自己情况自定义,在该目录下,不同的用户名分别在不同的文件夹下,历史命令文件以用户IP+日期的形式记录
这样在后期做审计的时候,可以很快速的找到某用户某时间的历史命令
如果需要记录哪条命令是哪个时刻执行的,需要自定义HISTTIMEFORMAT,添加时间在命令之前
或者觉得上面的方法比较复杂,那你就直接用HISTTIMEFORMAT定义历史记录格式,然后通过修改HISTSIZE,增加历史命令记录数量
你还可以在这里增加用户,以及客户端IP等
隐藏你的命令行历史
相对于命令行记录,隐藏命令行历史,除了在渗透测试中使用,还有一些使用场景,比如特权命令不想被别人看到,或者比较重要的命令不希望在浏览历史命令时被误执行
这里说的不是完全意义上的禁用历史命令记录,如果你要那么做,那你直接在环境变量/etc/profile中将HISTSIZE设置为0即可
下面的几个方法是临时隐藏命令行历史
在命令前插入空格
在命令行前插入空格是最简单的方式,但是这个方式的前提是环境变量HISTCONTROL的支持,在HISTCONTROL中有四种模式
代码语言:javascript
复制
export HISTCONTROL=erasedups # 清除整个命令历史中的重复条目
export HISTCONTROL=ignoredups # 忽略记录命令历史中连续重复的命令
export HISTCONTROL=ignorespace # 忽略记录空格开始的命令
export HISTCONTROL=ignoreboth # 等价于ignoredups和ignorespace
在命令行前插入空格,而不记录历史命令,需要HISTCONTROL为ignorespace或ignoreboth的情况,默认HISTCONTROL为ignoredups(CentOS6、7),所以需要先执行export设置HISTCONTROL为上面说的两种模式,之后在当前环境变量下执行命令不被记录
HISTSIZE设置当前会话历史命令记录
在前面提到,通过HISTSIZE=0,可以关闭历史命令记录,那么我们可以通过export HISTSIZE=0的方式,关闭当前会话的历史命令记录,而不影响全局
通过set命令来配置关闭history
linux下set命令可以用于设置shell环境变量和shell执行方式
set通过+或-号来设置选项关闭或开启,o选项用于指定选项名
所以通过set +o history的方式,可以关闭history,当然,也可以在set前面加空格,那么该命令也不会被记录
然后再通过set -o history的方式,开启history,这种方式的好处在于,你不必全部清除所有历史命令,这样在渗透过程中可以灵活屏蔽不想被记录的命令,而不会被审计人员发现
history命令管理
最后这种方式就是直接通过history命令来清除部分或全部历史命令
通过history -c命令可以清除所有历史命令,在操作完成之后,可以通过这种方式清除所有历史记录,这种方式可以完成隐藏,但是会露马脚
另外就是通过history -d 命令行id的方式,删除想要删除的命令,不过最好在history命令前加空格,这样做比较隐秘,这种方式首先需要通过history命令结合grep等查找命令,查寻要删除命令的id,通过删除这个id来删除历史命令
或者通过上下键翻找历史命令,通过Ctrl+U来清除当前行的记录
不过这种方式会留个小马脚
发表评论