"Fossies" - the Fresh Open Source Software Archive

Member "scanssh-2.1/telnet.c" (5 Nov 2004, 6647 Bytes) of package /linux/privat/old/scanssh-2.1.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "telnet.c" see the Fossies "Dox" file reference documentation.

    1 /*
    2  * Copyright 2000-2004 (c) Niels Provos <provos@citi.umich.edu>
    3  * All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that the following conditions
    7  * are met:
    8  * 1. Redistributions of source code must retain the above copyright
    9  *    notice, this list of conditions and the following disclaimer.
   10  * 2. Redistributions in binary form must reproduce the above copyright
   11  *    notice, this list of conditions and the following disclaimer in the
   12  *    documentation and/or other materials provided with the distribution.
   13  * 3. The name of the author may not be used to endorse or promote products
   14  *    derived from this software without specific prior written permission.
   15  *
   16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
   20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   21  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   26  */
   27 
   28 #include <sys/types.h>
   29 
   30 #ifdef HAVE_CONFIG_H
   31 #include "config.h"
   32 #endif
   33 
   34 #include <sys/tree.h>
   35 #include <sys/queue.h>
   36 #include <sys/socket.h>
   37 #include <sys/time.h>
   38 #include <netinet/in.h>
   39 
   40 #include <stdlib.h>
   41 #include <stdio.h>
   42 #include <errno.h>
   43 #include <string.h>
   44 #include <signal.h>
   45 #include <err.h>
   46 
   47 #include <event.h>
   48 #include <dnet.h>
   49 
   50 #include "scanssh.h"
   51 #include "socks.h"
   52 
   53 #ifdef DEBUG
   54 extern int debug;
   55 #define DFPRINTF(x) if (debug) fprintf x
   56 #else
   57 #define DFPRINTF(x)
   58 #endif
   59 
   60 extern rand_t *ss_rand;
   61 
   62 void telnet_init(struct bufferevent *bev, struct argument *arg);
   63 void telnet_finalize(struct bufferevent *bev, struct argument *arg);
   64 void telnet_readcb(struct bufferevent *bev, void *parameter);
   65 void telnet_writecb(struct bufferevent *bev, void *parameter);
   66 void telnet_errorcb(struct bufferevent *bev, short what, void *parameter);
   67 
   68 #define TELNET_WAITING_RESPONSE 0x0001
   69 #define TELNET_WAITING_CONNECT  0x0002
   70 #define TELNET_READING_CONNECT  0x0004
   71 #define TELNET_WRITING_COMMAND  0x0008
   72 
   73 int http_bufferanalyse(struct bufferevent *bev, struct argument *arg);
   74 
   75 struct telnet_state {
   76     char *response;
   77     char *connect_wait;
   78 };
   79 
   80 #define CCPROXY     "CCProxy Telnet>"
   81 #define GATEWAY1    "host_name:port"
   82 #define GATEWAY2    "host[:port]:"
   83 #define WINGATE     "WinGate>"
   84 
   85 int
   86 telnet_makeconnect(struct bufferevent *bev, struct argument *arg)
   87 {
   88     extern struct addr *socks_dst_addr;
   89     struct evbuffer *input = EVBUFFER_INPUT(bev);
   90     struct telnet_state *state = arg->a_state;
   91     ip_addr_t address;
   92 
   93     socks_resolveaddress("www.google.com", &address);
   94 
   95     if (evbuffer_find(input, CCPROXY, strlen(CCPROXY)) != NULL) {
   96         state->response = "telnet-proxy: CCproxy";
   97         state->connect_wait = "OK!";
   98         evbuffer_add_printf(EVBUFFER_OUTPUT(bev),
   99             "open %s:80\r\n", addr_ntoa(socks_dst_addr));
  100         bufferevent_enable(bev, EV_WRITE);
  101         return (1);
  102     } else if (evbuffer_find(input, GATEWAY1, strlen(GATEWAY1)) != NULL) {
  103         state->response = "telnet-proxy: Gateway";
  104         state->connect_wait = "Connected to:";
  105         evbuffer_add_printf(EVBUFFER_OUTPUT(bev),
  106             "%s:80\r\n", addr_ntoa(socks_dst_addr));
  107         bufferevent_enable(bev, EV_WRITE);
  108         return (1);
  109     } else if (evbuffer_find(input, GATEWAY2, strlen(GATEWAY2)) != NULL) {
  110         state->response = "telnet-proxy: Gateway";
  111         /* 
  112          * We do not get a connection confirmation, just the echoed
  113          * string.  So, we wait for the echo and then send our command.
  114          */
  115         state->connect_wait = ":80";
  116         evbuffer_add_printf(EVBUFFER_OUTPUT(bev),
  117             "%s:80\r\n", addr_ntoa(socks_dst_addr));
  118         bufferevent_enable(bev, EV_WRITE);
  119         return (1);
  120     } else if (evbuffer_find(input, WINGATE, strlen(WINGATE)) != NULL) {
  121         state->response = "telnet-proxy: WinGate";
  122         state->connect_wait = "...Connected";
  123         evbuffer_add_printf(EVBUFFER_OUTPUT(bev),
  124             "%s:80\r\n", addr_ntoa(socks_dst_addr));
  125         bufferevent_enable(bev, EV_WRITE);
  126         return (1);
  127     } else if (EVBUFFER_LENGTH(input) > 512) {
  128         return (-1);
  129     }
  130 
  131     return (0);
  132 }
  133 
  134 /* Scanner related functions */
  135 
  136 void 
  137 telnet_init(struct bufferevent *bev, struct argument *arg)
  138 {
  139     if ((arg->a_state = calloc(1, sizeof(struct telnet_state))) == NULL)
  140         err(1, "%s: calloc", __func__);
  141     arg->a_flags = 0;
  142 }
  143 
  144 void 
  145 telnet_finalize(struct bufferevent *bev, struct argument *arg)
  146 {
  147     free(arg->a_state);
  148     arg->a_state = NULL;
  149     arg->a_flags = 0;
  150 }
  151 
  152 void
  153 telnet_errorcb(struct bufferevent *bev, short what, void *parameter)
  154 {
  155     struct argument *arg = parameter;
  156 
  157     DFPRINTF((stderr, "%s: called\n", __func__));
  158 
  159     postres(arg, "<telnet proxy error>");
  160     scanhost_return(bev, arg, 0);
  161 }
  162 
  163 /* TELNET Connect method */
  164 
  165 void
  166 telnet_readcb(struct bufferevent *bev, void *parameter)
  167 {
  168     struct argument *arg = parameter;
  169     struct evbuffer *input = EVBUFFER_INPUT(bev);
  170     struct telnet_state *state = arg->a_state;
  171 
  172     DFPRINTF((stderr, "%s: called\n", __func__));
  173 
  174     if (arg->a_flags == 0) {
  175         int res = telnet_makeconnect(bev, arg);
  176         if (res == -1) {
  177             evbuffer_add(input, "", 1);
  178             printres(arg, arg->a_ports[0].port, 
  179                 EVBUFFER_DATA(input));
  180             scanhost_return(bev, arg, 0);
  181             return;
  182         } else if (res == 1) {
  183             arg->a_flags = TELNET_WAITING_CONNECT;
  184             bufferevent_disable(bev, EV_READ);
  185         }
  186     } else if (arg->a_flags & TELNET_READING_CONNECT) {
  187         if (evbuffer_find(input, state->connect_wait,
  188             strlen(state->connect_wait)) == NULL)
  189             return;
  190         evbuffer_drain(input, EVBUFFER_LENGTH(input));
  191 
  192         arg->a_flags = TELNET_WRITING_COMMAND;
  193         bufferevent_disable(bev, EV_READ);
  194         http_makerequest(bev, arg, socks_getword(), 0);
  195     } else if (arg->a_flags & TELNET_WAITING_RESPONSE) {
  196         int res = http_bufferanalyse(bev, arg);
  197         if (res == -1)
  198             return;
  199         if (res == 1) {
  200             postres(arg, state->response);
  201             scanhost_return(bev, arg, 1);
  202         }
  203     }
  204 
  205     return;
  206 }
  207 
  208 void
  209 telnet_writecb(struct bufferevent *bev, void *parameter)
  210 {
  211     struct argument *arg = parameter;
  212 
  213     DFPRINTF((stderr, "%s: called\n", __func__));
  214 
  215     if (arg->a_flags == 0) {
  216         return;
  217     } else if (arg->a_flags & TELNET_WAITING_CONNECT) {
  218         bufferevent_enable(bev, EV_READ);
  219         arg->a_flags = TELNET_READING_CONNECT;
  220     } else if (arg->a_flags & TELNET_WRITING_COMMAND) {
  221         bufferevent_enable(bev, EV_READ);
  222         arg->a_flags = TELNET_WAITING_RESPONSE;
  223     }
  224 }
  225