Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Simple HTTP Proxy Daemon by Havenard <[email protected]>
- *
- * Compile: gcc proxy.c -o proxy
- * Use: ./proxy
- * Or: ./proxy port
- * Exemple: ./proxy 1337
- *
- */
- #include <stdio.h>
- #include <time.h>
- #include <signal.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <netdb.h>
- #define INVALID_SOCKET -1
- typedef int SOCKET;
- typedef struct complete_socket { /* < 0x0001.txt */
- SOCKET handle;
- struct sockaddr_in addr;
- char *buffer;
- } complete_socket; /* > 0x0001.txt */
- const char http_foot[] = "\x0d\x0a\x0d\x0a";
- const char http_vers[] = " HTTP/1.";
- const char http_200[] = "HTTP/1.0 200 OK\x0d\x0a\x0d\x0a";
- long int strpos(const char *m, const char *s);
- int resolve(char *host);
- int main(int argc, char **argv) {
- complete_socket s_receiver, s_client, s_remote; /* < 0x0002.txt */
- struct timeval tv;
- fd_set fdsets;
- int i, size;
- int port, s_port; /* > 0x0002.txt */
- if (!((argc > 1) && ((port = atoi(argv[1])) > 0)))
- port = 6589; /* Se nao foi especificada porta ou a porta e' invalida, usa-se a porta padrao 6589 */
- bzero((char *)&s_receiver, sizeof(complete_socket));
- bzero((char *)&s_client, sizeof(complete_socket));
- bzero((char *)&s_remote, sizeof(complete_socket));
- s_client.buffer = (char *)malloc(8193); /* < 0x0003.txt */
- s_remote.buffer = (char *)malloc(8193);
- if ((s_client.buffer < 0) || (s_remote.buffer < 0)) {
- printf("[-] Unable to alloc memory.\n");
- exit(-1);
- } /* > 0x0003.txt */
- if ((s_receiver.handle = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { /* < 0x0004.txt */
- printf("[-] Unable to create a socket.\n");
- exit(-1);
- } /* > 0x0004.txt */
- bzero(s_client.buffer, 8193); /* Zerar a memoria dos buffers e' importante porque o programa precisara' */
- bzero(s_remote.buffer, 8193); /* saber quanta informacao ja' foi armazenada neles. */
- s_receiver.addr.sin_family = AF_INET; /* < 0x0005.txt */
- s_receiver.addr.sin_addr.s_addr = htonl(INADDR_ANY);
- s_receiver.addr.sin_port = htons(port);
- if (bind(s_receiver.handle, (struct sockaddr *)&s_receiver.addr, sizeof(struct sockaddr_in)) < 0) {
- printf("[-] Unable to bind socket to port %d, it may being used by another program.\n", port);
- exit(-1);
- }
- if (listen(s_receiver.handle, 10) < 0) {
- printf("[-] Unable to listen to port %d.\n", port);
- exit(-1);
- } /* > 0x0005.txt */
- printf("[+] Service activated successfully on port %d.\n", port);
- setsid(); /* < 0x0006.txt */
- signal(SIGCHLD, SIG_IGN);
- if (fork()) exit(0); /* > 0x0006.txt */
- while (1) { /* < 0x0007.txt */
- size = sizeof(struct sockaddr_in);
- if ((s_client.handle = accept(s_receiver.handle, (struct sockaddr *)&s_client.addr, &size)) != INVALID_SOCKET)
- if (!fork()) {
- close(s_receiver.handle); /* > 0x0007.txt */
- while (1) { /* < 0x0008.txt */
- tv.tv_sec = 1;
- tv.tv_usec = 0;
- FD_ZERO(&fdsets);
- FD_SET(s_client.handle, &fdsets);
- if (s_remote.handle > 0)
- FD_SET(s_remote.handle, &fdsets);
- if (select((s_client.handle > s_remote.handle ? s_client.handle : s_remote.handle) +1, &fdsets, NULL, NULL, &tv) < 0) {
- close(s_client.handle);
- if (s_remote.handle > 0)
- close(s_remote.handle);
- exit(0);
- } /* > 0x0008.txt */
- if (FD_ISSET(s_client.handle, &fdsets)) {
- if (s_remote.handle == 0) {
- size = strlen(s_client.buffer);
- size = recv(s_client.handle, &s_client.buffer[size], 8192-size, 0);
- if (size < 1) {
- close(s_client.handle);
- exit(0);
- }
- if (strpos(http_foot, s_client.buffer) >= 0) {
- if (!strncasecmp("CONNECT ", s_client.buffer, 8)) {
- memcpy(s_remote.buffer, &s_client.buffer[8], 8192-8);
- if ((i = strpos(http_vers, s_remote.buffer)) < 0) {
- close(s_client.handle);
- exit(0);
- }
- s_remote.buffer[i] = '\x00';
- for (i = 0; i < 512; i++)
- if ((s_remote.buffer[i] == '\x0d') || (s_remote.buffer[i] == '\x0a')) {
- s_remote.buffer[i] = '\x00';
- break;
- }
- for (i = strlen(s_remote.buffer); i >= 0; i--)
- if (s_remote.buffer[i] == '\\')
- s_remote.buffer[i] = '/';
- if (strpos("/", s_remote.buffer) >= 0) {
- close(s_client.handle);
- exit(0);
- }
- s_port = 80;
- if ((i = strpos(":", s_remote.buffer)) >= 0) {
- s_remote.buffer[i] = '\x00';
- i++;
- if ((s_port = atoi(&s_remote.buffer[i])) <= 0) {
- close(s_client.handle);
- exit(0);
- }
- }
- s_remote.addr.sin_family = AF_INET;
- s_remote.addr.sin_port = htons(s_port);
- s_remote.addr.sin_addr.s_addr = resolve(s_remote.buffer);
- if (s_remote.addr.sin_addr.s_addr <= 0) {
- close(s_client.handle);
- exit(0);
- }
- if ((s_remote.handle = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
- close(s_client.handle);
- exit(0);
- }
- if (connect(s_remote.handle, (struct sockaddr *)&s_remote.addr, sizeof(struct sockaddr_in)) < 0) {
- close(s_client.handle);
- close(s_remote.handle);
- exit(0);
- }
- send(s_client.handle, http_200, strlen(http_200), 0);
- bzero(s_client.buffer, 8192);
- bzero(s_remote.buffer, 8192);
- }
- else if (!strncasecmp("GET ", s_client.buffer, 4) || !strncasecmp("POST ", s_client.buffer, 5)) {
- if (!strncasecmp("GET ", s_client.buffer, 4))
- memcpy(s_remote.buffer, &s_client.buffer[4], 8192-4);
- else
- memcpy(s_remote.buffer, &s_client.buffer[5], 8192-5);
- if ((i = strpos(http_vers, s_remote.buffer)) < 0) {
- close(s_client.handle);
- exit(0);
- }
- s_remote.buffer[i] = '\x00';
- for (i = 0; i < 512; i++)
- if ((s_remote.buffer[i] == '\x0d') || (s_remote.buffer[i] == '\x0a')) {
- s_remote.buffer[i] = '\x00';
- break;
- }
- for (i = strlen(s_remote.buffer); i >= 0; i--)
- if (s_remote.buffer[i] == '\\')
- s_remote.buffer[i] = '/';
- if (s_remote.buffer[0] == '/') {
- close(s_client.handle);
- exit(0);
- }
- if (strncasecmp("http://", s_remote.buffer, 7)) {
- close(s_client.handle);
- exit(0);
- }
- for (i = strlen(s_remote.buffer); i >= 0; i--)
- if (s_remote.buffer[i] == '/')
- s_remote.buffer[i] = '\x00';
- s_port = 80;
- if ((i = strpos(":", &s_remote.buffer[7])) >= 0) {
- i += 7;
- s_remote.buffer[i] = '\x00';
- i++;
- if ((s_port = atoi(&s_remote.buffer[i])) <= 0) {
- close(s_client.handle);
- exit(0);
- }
- }
- s_remote.addr.sin_family = AF_INET;
- s_remote.addr.sin_port = htons(s_port);
- s_remote.addr.sin_addr.s_addr = resolve(&s_remote.buffer[7]);
- if (s_remote.addr.sin_addr.s_addr <= 0) {
- close(s_client.handle);
- exit(0);
- }
- size = (toupper(s_client.buffer[0]) == 'G' ? 11 : 12);
- i = strpos("/", &s_client.buffer[size]);
- if (i < 0) {
- close(s_client.handle);
- exit(0);
- }
- if ((s_remote.handle = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
- close(s_client.handle);
- exit(0);
- }
- if (connect(s_remote.handle, (struct sockaddr *)&s_remote.addr, sizeof(struct sockaddr_in)) < 0) {
- close(s_client.handle);
- close(s_remote.handle);
- exit(0);
- }
- memcpy(s_remote.buffer, s_client.buffer, (size == 11 ? 4 : 5));
- memcpy(&s_remote.buffer[(size == 11 ? 4 : 5)], &s_client.buffer[i+size], 8192-(i+size));
- send(s_remote.handle, s_remote.buffer, strlen(s_remote.buffer), 0);
- }
- else {
- close(s_client.handle);
- exit(0);
- }
- }
- else if (s_client.buffer[8191] != '\x00') {
- close(s_client.handle);
- exit(0);
- }
- }
- else {
- size = recv(s_client.handle, s_client.buffer, 8192, 0);
- if (size > 0)
- send(s_remote.handle, s_client.buffer, size, 0);
- else {
- close(s_client.handle);
- close(s_remote.handle);
- exit(0);
- }
- }
- }
- if ((s_remote.handle > 0) && FD_ISSET(s_remote.handle, &fdsets)) {
- size = recv(s_remote.handle, s_remote.buffer, 8192, 0);
- if (size > 0)
- send(s_client.handle, s_remote.buffer, size, 0);
- else {
- close(s_client.handle);
- close(s_remote.handle);
- exit(0);
- }
- }
- }
- exit(0);
- }
- close(s_client.handle);
- }
- }
- int resolve(char *host) {
- int result;
- struct hostent *dnslook;
- if ((result = inet_addr(host)) == INADDR_NONE) {
- if ((dnslook = gethostbyname(host)) == NULL)
- return 0;
- return ((struct in_addr *)(dnslook->h_addr))->s_addr;
- }
- return result;
- }
- long int strpos(const char *m, const char *s) {
- long int i, len, end;
- len = strlen(m);
- end = strlen(s) - len +1;
- if (end >= len)
- for (i = 0; i < end; i++)
- if (!strncmp(m, &s[i], len))
- return i;
- return -1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement