From 7eab91cae895fa80b4cf90e8814e96923dd0da13 Mon Sep 17 00:00:00 2001 From: Quentin Date: Mon, 24 Feb 2020 17:22:22 +0100 Subject: [PATCH] Fake Tor OS now create connections --- src/algo_thunder.c | 3 ++- src/donar_client.c | 3 ++- src/donar_server.c | 7 ++++--- src/faketor.c | 11 +++++------ src/net_tools.c | 5 ++++- src/timer.c | 6 +++--- src/timer.h | 6 +++++- src/tor_ctl.c | 44 ++++++++++++++++++++++++++++++++++++++------ 8 files changed, 63 insertions(+), 22 deletions(-) diff --git a/src/algo_thunder.c b/src/algo_thunder.c index 3867a96..2ead966 100644 --- a/src/algo_thunder.c +++ b/src/algo_thunder.c @@ -183,7 +183,7 @@ struct block_info { char reason[1024]; }; -void on_block (struct evt_core_ctx* ctx, void* raw) { +enum DONAR_TIMER_DECISION on_block (struct evt_core_ctx* ctx, void* raw) { struct block_info* bi = raw; struct thunder_ctx* thunderc = bi->app_ctx->misc; @@ -195,6 +195,7 @@ void on_block (struct evt_core_ctx* ctx, void* raw) { release: if (bi->is_timeout) free(bi); + return DONAR_TIMER_STOP; } int is_in_order(struct thunder_ctx* thunderc, uint8_t link_id) { diff --git a/src/donar_client.c b/src/donar_client.c index aa77b0d..44cc83b 100644 --- a/src/donar_client.c +++ b/src/donar_client.c @@ -43,7 +43,7 @@ failed: exit(EXIT_FAILURE); } -void reinit_socks5(struct evt_core_ctx* ctx, void* user_data) { +enum DONAR_TIMER_DECISION reinit_socks5(struct evt_core_ctx* ctx, void* user_data) { // @FIXME: Ugly way to get donar_client_ctx. Shame on me :/ struct evt_core_cat* cat = evt_core_get_from_cat (ctx, "socks5-failed"); if (cat == NULL) { @@ -55,6 +55,7 @@ void reinit_socks5(struct evt_core_ctx* ctx, void* user_data) { fprintf(stdout, "[%s][donar-client] We have waited enough, retriggering socks5 for port %ld\n", current_human_datetime (), pos+7500); init_socks5_client (app_ctx, pos); + return DONAR_TIMER_STOP; } int on_socks5_failed(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) { diff --git a/src/donar_server.c b/src/donar_server.c index 44c1987..def1490 100644 --- a/src/donar_server.c +++ b/src/donar_server.c @@ -119,6 +119,10 @@ void donar_server(struct donar_server_ctx* ctx, struct donar_params* dp) { for (uint16_t i = 0; i < dp->links ; i++) { ctx->ports[i] = 7500 + i; } + + init_tcp_servers(ctx, dp->links); + printf("--- TCP servers are listening\n"); + create_onion_services (&(ctx->tos), &(ctx->tctl), ctx->ports, dp->links, dp->tof); ugly_global_tctl = &(ctx->tctl); /*struct donar_server_os_republish_params dsorp = { .dctx = ctx, dp = dp}; @@ -126,9 +130,6 @@ void donar_server(struct donar_server_ctx* ctx, struct donar_params* dp) { set_timeout(&(ctx->evts), 1000, &dsorp, republish_tor_os); */ printf("--- Onion services created\n"); - init_tcp_servers(ctx, dp->links); - printf("--- TCP servers are listening\n"); - g_ptr_array_foreach (dp->remote_ports, (void(*)(void*, void*))init_udp_remote, &(ctx->evts)); printf("--- Remote ports are binded locally\n"); diff --git a/src/faketor.c b/src/faketor.c index 98180b4..54cc84a 100644 --- a/src/faketor.c +++ b/src/faketor.c @@ -3,6 +3,7 @@ #include "evt_core.h" #include "socks5.h" #include "tor_ctl.h" +#include "timer.h" int faketor_socks5_listen(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) { int conn_sock1; @@ -48,20 +49,17 @@ co_error: } int faketor_socks5_server_success(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) { - printf("success!\n"); - struct socks5_ctx *s5ctx = fdinfo->other; - + printf("success socks5!\n"); return EVT_CORE_FD_EXHAUSTED; } int faketor_socks5_server_failed(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) { - printf("failure!\n"); + printf("failure socks5!\n"); return EVT_CORE_FD_EXHAUSTED; } int faketor_torctl_server_success(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) { - printf("success!\n"); - evt_core_mv_fd2(ctx, fdinfo, ""); + printf("success torctl!\n"); return EVT_CORE_FD_EXHAUSTED; } @@ -203,6 +201,7 @@ int main(void) { fdinfo.url = "control:listen:9051"; evt_core_add_fd(&evts, &fdinfo); + init_timer (&evts); socks5_server_init(&evts); tor_ctl_server_init (&evts); diff --git a/src/net_tools.c b/src/net_tools.c index 95b969d..d4020d1 100644 --- a/src/net_tools.c +++ b/src/net_tools.c @@ -35,7 +35,8 @@ int create_ip_client(char* host, char* service, int type) { if (cursor == NULL) { fprintf(stderr, "No connect worked for %s:%s\n", host, service); - exit(EXIT_FAILURE); + return -1; + //exit(EXIT_FAILURE); } freeaddrinfo(result); @@ -45,6 +46,7 @@ int create_ip_client(char* host, char* service, int type) { int create_tcp_client(char* host, char* service) { int sock = create_ip_client (host, service, SOCK_STREAM); + if (sock < 0) return sock; int activate = 1; int err; err = setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &activate, sizeof(activate)); @@ -102,6 +104,7 @@ int create_ip_server(char* host, char* service, int type) { int create_tcp_server(char* host, char* service) { int sock = create_ip_server (host, service, SOCK_STREAM); + if (sock < 0) return sock; int activate = 1; int err; err = setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &activate, sizeof(activate)); diff --git a/src/timer.c b/src/timer.c index de613f2..ad63851 100644 --- a/src/timer.c +++ b/src/timer.c @@ -21,10 +21,10 @@ int set_timeout_handle(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) } struct timer_ctx* tctx = fdinfo->other; - tctx->cb(ctx, tctx->user_ctx); + enum DONAR_TIMER_DECISION dtd = tctx->cb(ctx, tctx->user_ctx); - evt_core_rm_fd(ctx, fdinfo->fd); - return 1; + if (dtd == DONAR_TIMER_STOP) evt_core_rm_fd(ctx, fdinfo->fd); + return EVT_CORE_FD_EXHAUSTED; } void init_timer(struct evt_core_ctx* evts) { diff --git a/src/timer.h b/src/timer.h index 20163c8..b4e537b 100644 --- a/src/timer.h +++ b/src/timer.h @@ -2,7 +2,11 @@ #include #include "evt_core.h" -typedef void (*timer_cb)(struct evt_core_ctx* ctx, void* user_data); +enum DONAR_TIMER_DECISION { + DONAR_TIMER_STOP, + DONAR_TIMER_CONTINUE, +}; +typedef enum DONAR_TIMER_DECISION (*timer_cb)(struct evt_core_ctx* ctx, void* user_data); void init_timer(struct evt_core_ctx* evts); int set_timeout(struct evt_core_ctx* evts, uint64_t milli_sec, void* ctx, timer_cb cb); void stop_timer(struct evt_core_ctx* evts); diff --git a/src/tor_ctl.c b/src/tor_ctl.c index 6efb020..9bb571c 100644 --- a/src/tor_ctl.c +++ b/src/tor_ctl.c @@ -1,4 +1,30 @@ #include "tor_ctl.h" +#include "timer.h" + +struct os_connect { + char host[256]; + char port[6]; + char url[512]; +}; + +enum DONAR_TIMER_DECISION on_os_connect_timeout(struct evt_core_ctx* ctx, void* user_data) { + struct os_connect *oc = user_data; + struct evt_core_fdinfo newfdinfo; + struct evt_core_cat newcat; + newfdinfo.cat = &newcat; + newfdinfo.url = oc->url; + + int fd = create_tcp_client(oc->host, oc->port); + if (fd <= 0) return DONAR_TIMER_CONTINUE; + + newfdinfo.fd = fd; + newfdinfo.cat->name = "torctl-server-success"; + struct evt_core_fdinfo *reg = evt_core_add_fd (ctx, &newfdinfo); + + printf("[%s][torctl] onion service %s up (cat: %s, fd: %d)\n", current_human_datetime (), reg->url, reg->cat->name, reg->fd); + free(oc); + return DONAR_TIMER_STOP; +} int tor_ctl_connect(struct tor_ctl* ctx, char* addr, char* service) { int sock = create_tcp_client (addr, service); @@ -156,9 +182,9 @@ int on_torctl_server_auth_write(struct evt_core_ctx* ctx, struct evt_core_fdinfo int on_torctl_server_add_onion_read(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) { char buffer[1024] = {0}; - char host[1024] = {0}; char *strtok_ptr, *str_target, *token; - int i, port1, port2; + int i, port1; + char *service_id = "iu7aeep42k5ky3fwcfag5el2raelfcwuilsstqhcz3c6bmxilr2nuayd.onion"; //@FIXME hardcoded url ssize_t nread = recv(fdinfo->fd, buffer, sizeof(buffer), MSG_PEEK); if (nread == -1 && errno == EAGAIN) return EVT_CORE_FD_EXHAUSTED; @@ -183,11 +209,16 @@ int on_torctl_server_add_onion_read(struct evt_core_ctx* ctx, struct evt_core_fd if (i < 2) continue; if (token == NULL) break; - int captured = sscanf(token, "Port=%d,%[^:]:%d", &port1, host, &port2); - if (captured != 3) continue; + struct os_connect *oc = malloc(sizeof(struct os_connect)); + int captured = sscanf(token, "Port=%d,%[^:]:%s", &port1, oc->host, oc->port); + if (captured != 3) { + free(oc); + continue; + } - //create_tcp_client(); - printf("Captured internet: %d, target: %s %d\n", port1, host, port2); + sprintf(oc->url, "torctl:%s:%d", service_id, port1); + printf("[%s][torctl] will create onion service %s:%d <-> %s:%s in background (%s)\n", current_human_datetime (), service_id, port1, oc->host, oc->port, oc->url); + set_timeout(ctx, 100, oc, on_os_connect_timeout); } evt_core_mv_fd2 (ctx, fdinfo, "torctl-server-add-onion-write"); @@ -195,6 +226,7 @@ int on_torctl_server_add_onion_read(struct evt_core_ctx* ctx, struct evt_core_fd } int on_torctl_server_add_onion_write(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) { + //@FIXME hardcoded response char *answer = "250-ServiceID=iu7aeep42k5ky3fwcfag5el2raelfcwuilsstqhcz3c6bmxilr2nuayd\r\n250-PrivateKey=ED25519-V3:ULk3Q/TFqngKCDDzeM93YC80IDOjz13PKTx718UjE0Svf+u/QZmN9EHzUCqCa1ZkNAXSQJIzcOVeJ8OL8Zg5Xg==\r\n250 OK\r\n"; ssize_t nwrite;