/* * ftelnetd - fake telnet daemon * * build_server.c * This builds just the server and calls drop_privs() * and after that fake_get_login(). * * Wed Feb 7 15:42:20 CET 2007 * * by Levent Kayan * levent[at]corehack[org] * www.corehack.org * */ #include "ftelnetd.h" #include "sighandle.h" #include "ferror.h" #include "wrapper.h" #include #include #include #include #include #include /* max connect queues to listen socket */ #define LISTENQ 1024 int connfd = 0; /* drops server process to chosen group and user id */ void drop_privs(gid_t grp_id, uid_t usr_id) { if (setgid(grp_id) < 0) { ERR_GEN; } if (setuid(usr_id) < 0) { ERR_GEN; } } int build_server(uint16_t port, gid_t grp_id, uid_t usr_id) { int listenfd = 0; pid_t child; socklen_t clilen; struct sockaddr_in caddr; struct sockaddr_in saddr; listenfd = xsocket(AF_INET, SOCK_STREAM, 0); memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = htonl(INADDR_ANY); saddr.sin_port = htons(port); xbind(listenfd, (SA *) &saddr, sizeof(saddr)); xlisten(listenfd, LISTENQ); signal(SIGCHLD, sig_chld); /* daemonise ftelnetd */ drop_privs(grp_id, usr_id); while (1) { clilen = sizeof(caddr); whitehat: if ( (connfd = accept(listenfd, (SA *) &caddr, &clilen)) < 0 ) { if (errno == EINTR) { goto whitehat; ERR_GEN; } } if ( (child = fork()) == 0) { close(listenfd); /* now, go and fake! */ fake_login(caddr, connfd); close(connfd); exit(EXIT_SUCCESS); } close(connfd); } return 1; } /* EOF */