/** * Bouncer 0.6 (Beta 2) * Copyright (c) 2000, 2001 Chris Mason * All Rights Reserved * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. * * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #define APPNAME "Bouncer" #define VERSION "0.6 (Beta 2)" #define MAX_CONNECTIONS 32 #define LISTEN_BACKLOG 1024 #define BUFFER_SIZE 4096 #define MAX_RULES 16 #define MAX_IP_LENGTH 16 #define DEFAULT_POLICY_ALLOW 1 #define DEFAULT_POLICY_DENY 2 #define SSL_CONNECT_STRING_NOAUTH "CONNECT %s HTTP/1.0\r\nUser-Agent: Mozilla/4.0\r\nProxy-Connection: Keep-Alive\r\nPragma: No-Cache\r\n\r\n" #define SSL_CONNECT_STRING_AUTH "CONNECT %s HTTP/1.0\r\nUser-Agent: Mozilla/4.0\r\nProxy-Connection: Keep-Alive\r\nPragma: No-Cache\r\nProxy-Authorization: Basic %s\r\n\r\n" #define SSL_TERMINATE_STRING "\r\n\r\n" #define REJECTED_IP_MASK_FAILED "%s [%d] Connection Rejected... Connection Prohibited\n" #define REJECTED_LIMIT_REACHED "%s [%d] Connection Rejected... Connection Limit Reached\n" #define BAC_CONNECTION_REJECTED "%s BAC Connection Rejected... Busy Service\n" #define REJECTED_SOCKS5_FAIL "%s [%d] Connection Rejected... Socks 5 Authentication Failed\n" #define ADMIN_WAITING_BIND "%s Waiting For HTTP Connections On %s:%d\n" #define ADMIN_WAITING_NOBIND "%s Waiting For HTTP Connections On 0.0.0.0:%d\n" #define WAITING_BIND "%s Waiting For TCP Connections On %s:%d\n" #define WAITING_NOBIND "%s Waiting For TCP Connections On 0.0.0.0:%d\n" #define ACCEPTED_CONNECTION "%s Accepted Connection %d From %s\n" #define HTTP_ACCEPTED_CONNECTION "%s Accepted HTTP Connection %d From %s\n" #define SSL_FAILED_NO_TERMINATOR "%s [%d] SSL Tunnelling Failed, Could Not Retrieve Terminator\n" #define SSL_SUCCESSFUL "%s [%d] SSL Tunnelling Successful, Returned %d (%s)\n" #define SSL_OVERFLOW "%s [%d] SSL Overflow Of %d Bytes Detected\n" #define SSL_FAILED "%s [%d] SSL Tunnelling Failed, Returned %d (%s)\n" #define SHUTDOWN_REQUEST "%s Caught Shutdown Request... Terminating Gracefully\n" #define CAUGHT_SIGNAL "%s Caught Signal %d... Terminating Gracefully\n" #define CLOSING_LISTENING_SOCKET "%s Closing Listening Socket\n" #define CLOSING_HTTP_LISTENING_SOCKET "%s Closing HTTP Listening Socket\n" #define CONNECTION_CLOSED "%s Connection %d Closed\n" #define HTTP_CONNECTION_CLOSED "%s HTTP Connection %d Closed\n" #define SOCKS5_UNKNOWN_DATA "%s [%d] Unknown Data Received From Socks 5 Client\n" #define SOCKS5_NEGOTIATING "%s [%d] Negotiating Socks 5 Protocol\n" #define CONNECTION_ATTEMPT "%s Connection %d Attempting To Connect To %s:%d\n" #define CONNECTION_CONNECTED "%s Connection %d Connected To %s:%d\n" #define SSL_TUNNELLING "%s [%d] SSL Tunnelling To %s\n" #define ERROR_CONNECTION "%s [%d] %s:%d - Error %d (%s) - %s\n" #define ERROR_NO_CONNECTION "%s %s:%d - Error %d (%s) - %s\n" #define WINDOWS_DAEMON "%s Bouncer Daemonized - Console Inactive\n" #define LIST_ADMIN_SOCKS "
%d
%s
%s
 
%s " #define LIST_SOCKS "
%d
%s
%s
%s
%s%s KB" #define LIST_ADMIN "
%d
%s
%s
%s " #define LIST "
%d
%s
%s
%s%s KB" #define TIMESTAMP_FORMAT "[%H:%M.%S]" #define HTTP_TERMINATOR "\r\n\r\n" #define HTTP_AUTH_HEADERS 1 #define HTTP_INDEX 2 #define HTTP_SHUTDOWN 3 #define HTTP_LIST 4 #define BASE64_WS 0xE0 #define BASE64_NOT_BASE64(a) (((a) | 0x13) == 0xF3) #define conv_ascii2bin(a) (data_ascii2bin[(a) & 0x7F]) #define WM_APP_BASE 0x8000 #define WM_STD_OUT_CHAR (WM_APP_BASE + 400) #define WM_STD_ERR_CHAR (WM_APP_BASE + 401) #define TRUE 1 #define FALSE 0 #define SUCCESS 0 #undef ERROR #define ERROR -1 #define BOUNCER_PIDFILE "bnc.pid" enum AccessStatus { csAllowed, csRejected }; enum ClientStatus { csBlank, csUnknown, csConnecting, csSocks, csAuthenticating, csAuthenticated, csAdmin }; #ifndef _WIN32 #define INVALID_SOCKET -1 typedef int SOCKET; #endif typedef struct { struct sockaddr_in SockAddrIn; struct sockaddr_in SockAddrOut; SOCKET s[2]; int status; long total_bytes; char socks5_response[64]; int socks5_bytes; char socks5_dest_host[256]; char socks5_dest_port[6]; char tunnel[256]; time_t start_time; } Client; typedef struct { SOCKET ls; int aport; struct sockaddr_in addr; char username[128]; char password[128]; char bind[64]; } Admin; typedef struct { SOCKET port; char d[255]; char t[255]; char bind[64]; char dest_host[255]; char dest_port[255]; char destination[255]; char tunnel[255]; char pidfile[255]; char logfile[255]; char t_user[128]; char t_password[128]; char s_user[128]; char s_password[128]; char a_user[128]; char a_password[128]; char cloak_name[128]; int socks5; int hWnd; int daemon; int adp; int debug; int tcpnodelay; } Options; #ifndef _WIN32 void sig_handler(int, siginfo_t *, void *); void write_pid(void); int daemonize(void); #else static void send_msg(HWND, UINT, WPARAM); #endif static void oline(FILE *, char *, ...); void oerror(char *, char *, int, int); char *timestamp(void); void close_client_sockets(int); char *format_float(float); int send_socks5_response(char *, int, int, int); void initsocks(int, char *, int); char *base64e(char *); void socketclose(SOCKET, int); void show_version(void); void show_usage(void); int matches(char *, char *); int allowed(int, int, int, int); int connect_to(int, char *, int, int, int); void ssl_tunnel(int, char *, char *, int); void socks_connect(int, char *, int); int set_non_blocking(SOCKET, int); int set_blocking(SOCKET, int); void bouncer_shutdown(int); int examine_http_request(char *); int base64d(char *, char *); void send_auth_headers(SOCKET, int); void send_index(SOCKET, int); void send_shutdown(SOCKET, int); int http_authorized(char *); void send_list(SOCKET, int, int); char *format_time(time_t); void initialise_options(void);