Linux痕迹清除笔记

关于命令执行记录的清理、隐藏。SSH登录的清理、隐藏学习。

参考资料

https://3gstudent.github.io/渗透基础-SSH日志的绕过

简介

本文主要介绍以下内容:

  • Linux 命令记录的清理
  • Linux 命令记录的绕过
  • SSH登录日志的清理
  • SSH登录日志的绕过

命令日志清除&绕过

注意:本文内容仅在Bash中测试,Zsh、Fish等其他Shell不在本文探讨范围。

当一个正常的交互式login shell登录后,执行命令时,执行的HISTSIZE条命令会被记录到缓冲区里,当用户成功注销时,系统会将HISTSIZE条命令写入到HISTFILE变量中的文件里面,而HISTFILE变量默认的位置就是用户家目录下的.bash_history文件。

  1. 只有成功注销时才会缓冲区里的命令写入到HISTFILE文件里面。
  2. 只会写入HISTSIZE条命令到HISTFILE文件里。

我们可以通过set命令来快速查看相关的环境变量和当前登录会话有没有开启history功能。

比较重要的环境变量:

  • HISTFILE:保存历史命令的文件
  • HISTSIZE:当前会话保存历史命令的数量
  • HISTFILESIZE:保存历史命令的文件保存历史命令的数量
  • HISTIGNORE :保存历史时忽略某些命令
  • HISTCONTROL :保存历史时忽略某些命令组合
  • SHELLOPTS:记录打开的shell功能选项列表

隐藏命令执行痕迹的命令

HISTFILE变量

在当前会话中临时取消HISTFILE变量,这样就算正常退出会话历史命令也没有地方保存。

1
unset HISTFILE

也可以将HISTFILE变量的值给到空设备。当正常退出会话时,命令记录也会保存到/dev/null。

1
export HISTFILE=/dev/null

history功能

使用set命令,快速匹配到SHELLOPTS值,该值是记录了当前会话已经打开的功能选项列表。

image-0

存在history功能即说明会将执行的命令保存到缓冲区中,用户正常退出会话时写入HISTFILE变量中。

关闭history功能后,将不会记录历史命令执行记录。

1
2
set +o history #关闭history功能
shopt -u -o history #同set +o history

notty绕过命令记录

notty登录的会话,默认关闭history功能,将不会记录历史命令。

1
2
3
ssh -T [email protected]

cat | bash

image-1

HISTSIZE

根据历史命令记录的正常工作流程,退出时会将HISTSIZE条命令写进入HISTFILE文件中,所以只要将HISTSIZE的大小设置为0就只会写入0条命令进去HISTFILE文件中。

1
export HISTSIZE = 0

该命令有个副作用:不能通过方向键上下翻页去寻找自己执行过的命令。

HISTCONTROL

命令前带空格隐藏命令记录,但是这个功能取决于HISTCONTROL变量的设置。

1
export HISTCONTROL=ignoreboth

在Debian10中,Bash的默认HISTCONTROL变量为ignoreboth,而在Centos6中Bash的默认HISTCONTROLignoredups

ignoredups是忽略连续两条以上的重复命令。

ignoredspace是忽略命令开头带有空格的命令。

ignoredboth等价于ignoredupsignorespace的组合,即忽略开头带空格的命令,又忽略连续两条以上重复的命令。

只有HISTCONTROL=ignorespace或者是ignoreboth时,才会忽略命令前带空格的命令。

SSH日志清除

当我们在渗透过程中,爆破了某台Linux服务器的某个用户的账号,获得了这个账号的密码。这时肯定想登录进去进行后续的渗透工作,但是登录录之后的痕迹、爆破的痕迹要怎么清除呢?

注意:对Linux相关系统日志的操作需要root权限。

可见是有许多爆破失败的尝试的。

image-2

登录成功的日志也会有的。

image-3

要知道的几个日志文件

  • /var/log/btmp:记录SSH登录错误尝试。 相关命令:lastb
  • /var/log/wtmp:记录当前和历史登录系统的用户信息。相关命令:last
  • /var/run/utmp:当前正在登录系统的用户信息。 相关命令:w
  • /var/log/lastlog:记录用户上次登录信息。
  • /var/log/auth.log:认证相关的日志 [Debian]
  • /var/log/secure:认证相关的日志 [Centos]

替换wtmp日志中的IP

可以替换日志中的IP信息,把假线索给到溯源人员。延缓他们的溯源工作。

使用last命令,查看当前和历史登录信息。

image-4

可以发现我们目前系统的登录用户sb2ywa,登录IP是:192.168.179.1

执行以下命令进行替换

1
utmpdump /var/log/wtmp |sed "s/192.168.179.1/114.114.114.114/g" |utmpdump -r >/tmp/wtmp && mv /tmp/wtmp /var/log/wtmp

image-5

wtmp文件的日志信息已被清除

修改文件时间戳

最好在执行清除IP工作之前,查看下文件的时间戳信息,然后使用touch命令对其访问时间戳进行修改。

1
stat /var/log/wtmp

image-6

1
touch -a -d "2021-1-1 12:13:14" /var/log/wtmp

image-7

btmp日志清除

使用lastb命令可以看到有部分登录失败尝试

image-8

wtmp文件相同的替换方法。

1
utmpdump /var/log/btmp |sed "s/192.168.179.1/8.8.8.8/g" |utmpdump -r >/tmp/btmp && mv /tmp/btmp /var/log/btmp

注意:wtmpbtmp不要直接使用sed进行ip替换,会导致日志格式乱掉或是日志内容被覆盖。

lastlog 日志清除

这个清除得使用logtamper:https://github.com/AV1080p/logtamper/blob/master/logtamper.py

1
python logtamper.py -m 3 -u sb2ywa -i 114.114.114.114 -t tty1 -d 2021:12:24:12:01:24

image-9

sed也可以

1
sed -i 's/192.168.179.1/8.8.8.8/g' /var/log/lastlog

auth.log/secure 日志清除

一般来说,运维人员为了便捷的提取SSH认证相关IP,都会使用类似下面的命令在auth.log/secure文件中提取相关登录IP。

1
2
3
4
5
6
#成功记录
cat auth.log |grep 'Accepted'
cat secure | grep 'Accepted'
#失败记录
cat auth.log | grep 'Failed'
cat secure | grep 'Failed'

因为auth.logsecure是文本格式的,所以可以直接使用sed对文件进行操作。

1
2
3
4
5
6
#替换IP
sed -i 's/8.8.8.8/123.123.123.123/g' /var/log/auth.log #Debian
sed -i 's/8.8.8.8/123.123.123.123/g' /var/log/secure #Centos

#删除相关时间
sed -i '/Dec 27 *:*:*/d' auth.log #Dec 27的记录都将被删除。

SSH登录绕过

使用SSH登录系统后,管理员一般可以用w命令来查看当前系统的登录用户。

notty登录绕过

  • 该方法无法绕过/var/log/auth.log记录。

使用SSH命令ssh -T [email protected] 登录系统,可绕过管理员用户w查看。

image-10

不过管理员可以在进程中发现。

image-11

可以使用三好学生写的python notty登录脚本https://github.com/3gstudent/Homework-of-Python/blob/master/sshRunCmd.py 也是能做到notty登录。

像是hydra等密码爆破的工具也是使用的notty进行口令验证。

防御和检测

防止环境变量的修改

通过修改/etc/skel/.bashrc和每个用户的~/.bashrc可以简单防止下攻击者直接清除历史命令。

1
2
3
4
5
6
7
#添加以下内容到末尾
readonly HISTFILE
readonly HISTFILESIZE
readonly HISTSIZE
readonly HISTCMD
readonly HISTCONTROL
readonly HISTIGNORE

注意:该方法有局限性,攻击者可以修改~/.bashrc删掉readonly的配置,再去修改环境变量。

notty的检测

  1. 查看TCP连接 netstat -vatn
  2. 进程中查看有无ssh notty进程,ssh进程数量是否和w显示当前登录用户数量一致。ps -aux|grep notty

小结

本文主要介绍了在渗透测试中清除Linux痕迹的基础知识(命令执行痕迹清理和绕过、SSH日志删除和日志绕过),结合利用方法给出检测建议。