/*
* 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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <time.h>
/* 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 */
syntax highlighted by Code2HTML, v. 0.9.1