
Nmap Development mailing list archives
Re: [nmap-svn] r32017 - nmap-exp/d33tah/ncat-lua-callbacks/ncat
From: Jacek Wielemborek <wielemborekj1 () gmail com>
Date: Fri, 23 Aug 2013 00:40:50 +0200
2013/8/22 <commit-mailer () nmap org>:
Author: d33tah Date: Thu Aug 22 21:16:01 2013 New Revision: 32017 Log: Add a hack that will make connect-mode --proxy work. Modified: nmap-exp/d33tah/ncat-lua-callbacks/ncat/ncat_lua_connect.c nmap-exp/d33tah/ncat-lua-callbacks/ncat/ncat_lua_filters.c nmap-exp/d33tah/ncat-lua-callbacks/ncat/ncat_lua_filters.h nmap-exp/d33tah/ncat-lua-callbacks/ncat/ncat_lua_listen.c nmap-exp/d33tah/ncat-lua-callbacks/ncat/ncat_main.c Modified: nmap-exp/d33tah/ncat-lua-callbacks/ncat/ncat_lua_connect.c ============================================================================== --- nmap-exp/d33tah/ncat-lua-callbacks/ncat/ncat_lua_connect.c (original) +++ nmap-exp/d33tah/ncat-lua-callbacks/ncat/ncat_lua_connect.c Thu Aug 22 21:16:01 2013 @@ -151,7 +151,7 @@ void lua_nsock_save(nsock_pool nsp, nsock_iod nsiod, nsock_ev_handler handler) { - struct ncat_lua_state *nl = get_connection(NULL); + struct ncat_lua_state *nl = get_connection(NULL, NULL); nl->nsp = nsp; nl->nsiod = nsiod; nl->handler = handler; @@ -183,7 +183,7 @@ char* lua_nsock_recv(nsock_event evt, int *nbytes) { - struct ncat_lua_state *nl = get_connection(NULL); + struct ncat_lua_state *nl = get_connection(NULL, NULL); size_t nbytes_size_t; nl->evt = evt; int old_top = lua_gettop(L); @@ -222,7 +222,7 @@ void lua_nsock_write(nsock_pool nsp, nsock_iod nsiod, nsock_ev_handler handler, int timeout_msecs, void *userdata, const char *data, int datalen) { - struct ncat_lua_state *nl = get_connection(NULL); + struct ncat_lua_state *nl = get_connection(NULL, NULL); nl->nsp = nsp; nl->nsiod = nsiod; nl->handler = handler; Modified: nmap-exp/d33tah/ncat-lua-callbacks/ncat/ncat_lua_filters.c ============================================================================== --- nmap-exp/d33tah/ncat-lua-callbacks/ncat/ncat_lua_filters.c (original) +++ nmap-exp/d33tah/ncat-lua-callbacks/ncat/ncat_lua_filters.c Thu Aug 22 21:16:01 2013 @@ -220,8 +220,9 @@ as the key. If it's not there, create it, find its topmost "super", set its "fd" to the given struct ncat_lua_state and save it in connection_supers. Leave the socket on the stack. If *fdn is NULL, we assume that fd=0 and - we're in connect mode. */ -struct ncat_lua_state* get_connection(struct fdinfo *fdn) + we're in connect mode. Also, if *created is not NULL, it is set to 1 if + the socket put on the stack was just created. */ +struct ncat_lua_state* get_connection(struct fdinfo *fdn, int *created) { struct ncat_lua_state *ret; int connections_key; @@ -281,6 +282,9 @@ lua_remove(L, -4); lua_settable(L, -3); lua_pop(L, 1); + + if (created != NULL) + *created = 1; } else { lua_insert(L, -2); /* Get rid of connections[]. */ lua_pop(L, 1); @@ -292,6 +296,9 @@ lua_getfield(L, -1, "lua_state"); ret = (struct ncat_lua_state *) lua_touserdata(L, -1); lua_pop(L, 3); /* Pop the userdata, the table and connection_roots. */ + + if (created != NULL) + *created = 0; } return ret; @@ -355,7 +362,7 @@ /* This is a trick we do to make sure we're not reading from stdin yet. Copy the default event handler that reads from stdin, run connect(), then restore it. */ - struct ncat_lua_state *nl = get_connection(fdn); + struct ncat_lua_state *nl = get_connection(fdn, NULL); old_handler = nl->handler; nl->handler = write_socket_handler_nostdin; Modified: nmap-exp/d33tah/ncat-lua-callbacks/ncat/ncat_lua_filters.h ============================================================================== --- nmap-exp/d33tah/ncat-lua-callbacks/ncat/ncat_lua_filters.h (original) +++ nmap-exp/d33tah/ncat-lua-callbacks/ncat/ncat_lua_filters.h Thu Aug 22 21:16:01 2013 @@ -145,6 +145,6 @@ void lua_run_filter(char *cmdexec); void lua_filters_setup(); -struct ncat_lua_state* get_connection(struct fdinfo *fdn); +struct ncat_lua_state* get_connection(struct fdinfo *fdn, int *created); #endif Modified: nmap-exp/d33tah/ncat-lua-callbacks/ncat/ncat_lua_listen.c ============================================================================== --- nmap-exp/d33tah/ncat-lua-callbacks/ncat/ncat_lua_listen.c (original) +++ nmap-exp/d33tah/ncat-lua-callbacks/ncat/ncat_lua_listen.c Thu Aug 22 21:16:01 2013 @@ -126,6 +126,25 @@ #include "ncat_lua_filters.h" #include "ncat_listen.h" +static void replace_root_functions(int fd) +{ + /* If we reached lua_fdinfo_recv while we're in connect mode, it's most + likely because we connected to the proxy. Replace the recv and send + functions for this FD so they won't try to use the connect-mode + functions. */ + lua_getglobal(L, "connection_roots"); + lua_pushinteger(L, fd); + lua_gettable(L, -2); + ncat_assert(lua_istable(L, -1)); + lua_pushstring(L, "recv"); + lua_pushcfunction(L, lua_fdinfo_recv_raw); + lua_settable(L, -3); + lua_pushstring(L, "send"); + lua_pushcfunction(L, lua_fdinfo_send_raw); + lua_settable(L, -3); + lua_pop(L, 2); +} + int lua_fdinfo_recv_raw(lua_State *L) { char buf[DEFAULT_TCP_BUF_LEN]; @@ -148,8 +167,11 @@ int lua_fdinfo_recv(struct fdinfo *fdn, char *buf, size_t size, int *pending, int *error) { + int created; size_t oldsize = size; - struct ncat_lua_state *nl = get_connection(fdn); + struct ncat_lua_state *nl = get_connection(fdn, &created); + if (created && !o.listen) + replace_root_functions(fdn->fd); *pending = nl->pending = 0; if (nl->recv_buf != NULL) { int chunk_size = nl->recv_buf_size-nl->recv_buf_pos; @@ -225,7 +247,10 @@ int lua_fdinfo_send(struct fdinfo *fdn, const char *buf, size_t size) { - get_connection(fdn); + int created; + get_connection(fdn, &created); + if (created && !o.listen) + replace_root_functions(fdn->fd); lua_getfield(L, -1, "send"); lua_insert(L, -2); lua_pushlstring(L, buf, size); Modified: nmap-exp/d33tah/ncat-lua-callbacks/ncat/ncat_main.c ============================================================================== --- nmap-exp/d33tah/ncat-lua-callbacks/ncat/ncat_main.c (original) +++ nmap-exp/d33tah/ncat-lua-callbacks/ncat/ncat_main.c Thu Aug 22 21:16:01 2013 @@ -908,12 +908,6 @@ * connect to a host, don't try to. */ - if (o.script && (socksconnect.storage.ss_family != AF_UNSPEC || - httpconnect.storage.ss_family != AF_UNSPEC)) - /* Not allowed because in ncat_connect.c we perform send() and we'd - need some hooks for that. */ - bye("Invalid option combination: --proxy with --load-lua-socket-file."); - if (o.allow || o.deny) bye("Invalid option combination: allow/deny with connect."); _______________________________________________ Sent through the svn mailing list http://nmap.org/mailman/listinfo/svn
Note that this will cause the connection to also be added to connections[] and a broadcast to all connections may break the proxy link this way. A solution could be to make get_connection take another parameter, char *table_name, which would be used to store this connection in. This doesn't sound like a good idea to me though. _______________________________________________ Sent through the dev mailing list http://nmap.org/mailman/listinfo/dev Archived at http://seclists.org/nmap-dev/
Current thread:
- Re: [nmap-svn] r32017 - nmap-exp/d33tah/ncat-lua-callbacks/ncat Jacek Wielemborek (Aug 22)