关于命令执行记录的清理、隐藏。SSH登录的清理、隐藏学习。
参考资料
https://3gstudent.github.io/渗透基础-SSH日志的绕过
简介
本文主要介绍以下内容:
- Linux 命令记录的清理
- Linux 命令记录的绕过
- SSH登录日志的清理
- SSH登录日志的绕过
命令日志清除&绕过
注意:本文内容仅在Bash中测试,Zsh、Fish等其他Shell不在本文探讨范围。
当一个正常的交互式login shell
登录后,执行命令时,执行的HISTSIZE
条命令会被记录到缓冲区里,当用户成功注销时,系统会将HISTSIZE
条命令写入到HISTFILE
变量中的文件里面,而HISTFILE
变量默认的位置就是用户家目录下的.bash_history
文件。
- 只有成功注销时才会缓冲区里的命令写入到
HISTFILE
文件里面。 - 只会写入
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
值,该值是记录了当前会话已经打开的功能选项列表。
存在history
功能即说明会将执行的命令保存到缓冲区中,用户正常退出会话时写入HISTFILE
变量中。
关闭history功能后,将不会记录历史命令执行记录。
1 | set +o history #关闭history功能 |
notty绕过命令记录
notty登录的会话,默认关闭history
功能,将不会记录历史命令。
1 | ssh -T user@IP |
HISTSIZE
根据历史命令记录的正常工作流程,退出时会将HISTSIZE
条命令写进入HISTFILE
文件中,所以只要将HISTSIZE
的大小设置为0就只会写入0条命令进去HISTFILE
文件中。
1 | export HISTSIZE = 0 |
该命令有个副作用:不能通过方向键上下翻页去寻找自己执行过的命令。
HISTCONTROL
命令前带空格隐藏命令记录,但是这个功能取决于HISTCONTROL
变量的设置。
1 | export HISTCONTROL=ignoreboth |
在Debian10中,Bash的默认HISTCONTROL
变量为ignoreboth
,而在Centos6中Bash的默认HISTCONTROL
是ignoredups
。
ignoredups
是忽略连续两条以上的重复命令。
ignoredspace
是忽略命令开头带有空格的命令。
ignoredboth
等价于ignoredups
和ignorespace
的组合,即忽略开头带空格的命令,又忽略连续两条以上重复的命令。
只有HISTCONTROL=ignorespace
或者是ignoreboth
时,才会忽略命令前带空格的命令。
SSH日志清除
当我们在渗透过程中,爆破了某台Linux服务器的某个用户的账号,获得了这个账号的密码。这时肯定想登录进去进行后续的渗透工作,但是登录录之后的痕迹、爆破的痕迹要怎么清除呢?
注意:对Linux相关系统日志的操作需要root权限。
可见是有许多爆破失败的尝试的。
登录成功的日志也会有的。
要知道的几个日志文件
/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命令,查看当前和历史登录信息。
可以发现我们目前系统的登录用户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 |
wtmp文件的日志信息已被清除
修改文件时间戳
最好在执行清除IP工作之前,查看下文件的时间戳信息,然后使用touch
命令对其访问时间戳进行修改。
1 | stat /var/log/wtmp |
1 | touch -a -d "2021-1-1 12:13:14" /var/log/wtmp |
btmp日志清除
使用lastb
命令可以看到有部分登录失败尝试
和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 |
注意:wtmp
和btmp
不要直接使用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 |
用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 | #成功记录 |
因为auth.log
、secure
是文本格式的,所以可以直接使用sed对文件进行操作。
1 | #替换IP |
SSH登录绕过
使用SSH登录系统后,管理员一般可以用w
命令来查看当前系统的登录用户。
notty登录绕过
- 该方法无法绕过
/var/log/auth.log
记录。
使用SSH命令ssh -T [email protected]
登录系统,可绕过管理员用户w查看。
不过管理员可以在进程中发现。
可以使用三好学生写的python notty
登录脚本https://github.com/3gstudent/Homework-of-Python/blob/master/sshRunCmd.py 也是能做到notty
登录。
像是hydra
等密码爆破的工具也是使用的notty
进行口令验证。
防御和检测
防止环境变量的修改
通过修改/etc/skel/.bashrc
和每个用户的~/.bashrc
可以简单防止下攻击者直接清除历史命令。
1 | #添加以下内容到末尾 |
注意:该方法有局限性,攻击者可以修改~/.bashrc
删掉readonly的配置,再去修改环境变量。
notty的检测
- 查看TCP连接
netstat -vatn
- 进程中查看有无
ssh notty
进程,ssh进程数量是否和w
显示当前登录用户数量一致。ps -aux|grep notty
小结
本文主要介绍了在渗透测试中清除Linux痕迹的基础知识(命令执行痕迹清理和绕过、SSH日志删除和日志绕过),结合利用方法给出检测建议。