首先我先编译一个ssh后门,这个ssh后门会在/tmp/xxxxxx记录所有的登录密码

启动他

QUOTE:

1 root@laptop:/usr/local/openssh2/sbin# ps aux | grep sshd
2
3 root 13619 0.0 0.3 7432 1752 ? Ss 23:44 0:00 ./sshd -p 1234
4
5 root 13707 0.0 0.2 4292 1328 pts/3 R+ 23:58 0:00 grep sshd

下面我们用strace跟踪一下pid位13619的ssh进程,其中-ff参数很重要,可以跟踪fork的子进程。

QUOTE:

root@laptop:/usr/local/openssh2/sbin# strace -o aa -ff -p 13619

然后我们登录ssh,成功登录之后,我们看看当前目录,生成了strace的输出

QUOTE:

1 root@laptop:/usr/local/openssh2/sbin# ls
2
3 aa aa.13636 aa.13638 aa.13640 aa.13642 aa.13644 aa.13646 aa.13648 aa.13650 aa.13652 aa.13654 aa.13656 sshd
4
5 aa.13635 aa.13637 aa.13639 aa.13641 aa.13643 aa.13645 aa.13647 aa.13649 aa.13651 aa.13653 aa.13655 aa.13657

我们grep一下open系统调用,然后过滤掉错误信息和/dev/null信息,以及denied信息,并且找WR的,就是读写模式打开的,因为要把记录的密码写入文件,肯定要是以写方式打开的文件,大致的看看,很容易找到异常文件/tmp/xxxxxx

QUOTE:

01 root@laptop:/usr/local/openssh2/sbin# grep open aa* | grep -v -e No -e null -e denied| grep WR
02 aa.13635:open("/tmp/xxxxxx", O_WRONLY|O_APPEND|O_CREAT|O_LARGEFILE, 0666) = 3
03 aa.13635:open("/dev/ptmx", O_RDWR) = 3
04 aa.13635:open("/dev/pts/5", O_RDWR|O_NOCTTY) = 6
05 aa.13635:open("/var/run/utmp", O_RDWR) = 7
06 aa.13635:open("/var/log/wtmp", O_WRONLY) = 7
07 aa.13635:open("/var/log/lastlog", O_RDWR|O_CREAT|O_LARGEFILE, 02000) = 7
08 aa.13635:open("/var/run/utmp", O_RDWR) = 6
09 aa.13635:open("/var/log/wtmp", O_WRONLY) = 6
10 aa.13638:open("/dev/pts/5", O_RDWR|O_LARGEFILE) = 7
11 aa.13638:open("/dev/tty", O_WRONLY|O_LARGEFILE) = 8
12 aa.13638:open("/dev/tty", O_RDWR|O_NONBLOCK|O_LARGEFILE) = 3
13 aa.13640:open("/dev/tty", O_RDWR|O_NONBLOCK|O_LARGEFILE) = 3
14 aa.13657:open("/dev/tty", O_RDWR) = 3

通过上面的方法,我们可以大致的诊断一下我们的sshd是否被放了后门,但是因为sshd后门多种多样,上面我说到的sshd后门是比较优秀的一种,他可以设置是否记录密码,如果设置不记录密码,那么我们用strace估计是发现不到他的,但是还是有一些ssh后门还要用特殊的配置文件,读取特殊的密码文件,这种我们用strace就十分容易发现他们了。