--md5sig, --ip-opt for IPv4 only

This commit is contained in:
ruti 2024-03-26 17:15:34 +03:00
parent b0d624136e
commit e031e7d235
5 changed files with 59 additions and 11 deletions

View File

@ -1,3 +1,5 @@
#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
@ -12,6 +14,8 @@
#ifdef __linux__
#include <sys/mman.h>
#include <sys/sendfile.h>
#include <fcntl.h>
#include <desync.h>
#ifdef MFD_CLOEXEC
@ -116,8 +120,10 @@ void wait_send(int sfd)
#ifdef __linux__
ssize_t send_fake(int sfd, char *buffer,
int cnt, long pos, int fa, struct desync_params *opt)
int cnt, long pos, struct sockaddr *dst, struct desync_params *opt)
{
int fa = get_family(dst);
struct packet pkt = cnt != IS_HTTP ? fake_tls : fake_http;
size_t psz = pkt.size;
@ -145,12 +151,25 @@ ssize_t send_fake(int sfd, char *buffer,
if (setttl(sfd, opt->ttl ? opt->ttl : 8, fa) < 0) {
break;
}
if (opt->ip_options
if (opt->md5sig) {
struct tcp_md5sig md5 = {
.tcpm_keylen = 5
};
memcpy(&md5.tcpm_addr, dst, sizeof(struct sockaddr_in6));
if (setsockopt(sfd, IPPROTO_TCP,
TCP_MD5SIG, (char *)&md5, sizeof(md5)) < 0) {
perror("setsockopt TCP_MD5SIG");
break;
}
}
if (opt->ip_options && fa == AF_INET
&& setsockopt(sfd, IPPROTO_IP, IP_OPTIONS,
opt->ip_options, opt->ip_options_len) < 0) {
perror("setsockopt IP_OPTIONS");
break;
}
len = sendfile(sfd, ffd, 0, pos);
if (len < 0) {
uniperror("sendfile");
@ -162,12 +181,24 @@ ssize_t send_fake(int sfd, char *buffer,
if (setttl(sfd, params.def_ttl, fa) < 0) {
break;
}
if (opt->ip_options
if (opt->ip_options && fa == AF_INET
&& setsockopt(sfd, IPPROTO_IP,
IP_OPTIONS, opt->ip_options, 0) < 0) {
perror("setsockopt IP_OPTIONS");
break;
}
if (opt->md5sig) {
struct tcp_md5sig md5 = {
.tcpm_keylen = 0
};
memcpy(&md5.tcpm_addr, dst, sizeof(struct sockaddr_in6));
if (setsockopt(sfd, IPPROTO_TCP,
TCP_MD5SIG, (char *)&md5, sizeof(md5)) < 0) {
perror("setsockopt TCP_MD5SIG");
break;
}
}
break;
}
if (p) munmap(p, pos);
@ -178,8 +209,10 @@ ssize_t send_fake(int sfd, char *buffer,
#ifdef _WIN32
ssize_t send_fake(int sfd, char *buffer,
int cnt, long pos, int fa, struct desync_params *opt)
int cnt, long pos, struct sockaddr *dst, struct desync_params *opt)
{
int fa = get_family(dst);
struct packet pkt = cnt != IS_HTTP ? fake_tls : fake_http;
size_t psz = pkt.size;
@ -234,7 +267,7 @@ ssize_t send_fake(int sfd, char *buffer,
if (setttl(sfd, opt->ttl ? opt->ttl : 8, fa) < 0) {
break;
}
if (opt->ip_options
if (opt->ip_options && fa == AF_INET
&& setsockopt(sfd, IPPROTO_IP, IP_OPTIONS,
opt->ip_options, opt->ip_options_len) < 0) {
uniperror("setsockopt IP_OPTIONS");
@ -261,7 +294,7 @@ ssize_t send_fake(int sfd, char *buffer,
if (setttl(sfd, params.def_ttl, fa) < 0) {
break;
}
if (opt->ip_options
if (opt->ip_options && fa == AF_INET
&& setsockopt(sfd, IPPROTO_IP, IP_OPTIONS,
opt->ip_options, 0) < 0) {
uniperror("setsockopt IP_OPTIONS");
@ -440,7 +473,7 @@ ssize_t desync(int sfd, char *buffer, size_t bfsize,
#ifdef FAKE_SUPPORT
case DESYNC_FAKE:
s = send_fake(sfd,
buffer + lp, type, pos - lp, fa, &dp);
buffer + lp, type, pos - lp, dst, &dp);
break;
#endif
case DESYNC_DISORDER:

16
main.c
View File

@ -82,12 +82,15 @@ const char help_text[] = {
" -s, --split <n[+s]> Split packet at n\n"
" +s - add SNI offset\n"
" +h - add HTTP Host offset\n"
" -s, --disorder <n[+s]> Split and send reverse order\n"
" -d, --disorder <n[+s]> Split and send reverse order\n"
" -o, --oob <n[+s]> Split and send as OOB data\n"
#ifdef FAKE_SUPPORT
" -f, --fake <n[+s]> Split and send fake packet\n"
" -t, --ttl <num> TTL of fake packets, default 8\n"
" -k, --ip-opt [f|:str] IP options of fake packets\n"
#ifdef __linux__
" -S, --md5sig Add MD5 Signature option for fake packets\n"
#endif
" -l, --fake-tls <f|:str>\n"
" -j, --fake-http <f|:str> Set custom fake packet\n"
" -n, --tls-sni <str> Change SNI in fake ClientHello\n"
@ -127,6 +130,9 @@ const struct option options[] = {
{"fake", 1, 0, 'f'},
{"ttl", 1, 0, 't'},
{"ip-opt", 2, 0, 'k'},
#ifdef __linux__
{"md5sig", 0, 0, 'S'},
#endif
{"fake-tls", 1, 0, 'l'},
{"fake-http", 1, 0, 'j'},
{"tls-sni", 1, 0, 'n'},
@ -136,7 +142,7 @@ const struct option options[] = {
{"tlsrec", 1, 0, 'r'},
{"def-ttl", 1, 0, 'g'},
{"delay", 1, 0, 'w'}, //
{"not-wait-send", 1, 0, 'W'}, //
{"not-wait-send", 0, 0, 'W'}, //
{0}
};
@ -502,6 +508,10 @@ int main(int argc, char **argv)
}
break;
case 'S':
dp->md5sig = 1;
break;
case 'n':
if (change_tls_sni(optarg, fake_tls.data, fake_tls.size)) {
fprintf(stderr, "error chsni\n");
@ -579,7 +589,7 @@ int main(int argc, char **argv)
}
break;
case 'V': //
case 'w': //
params.sfdelay = strtol(optarg, &end, 0);
if (params.sfdelay < 0 || optarg == end
|| params.sfdelay >= 1000 || *end)

View File

@ -43,6 +43,7 @@ struct desync_params {
int ttl;
char *ip_options;
ssize_t ip_options_len;
char md5sig;
int parts_n;
struct part *parts;
int mod_http;

View File

@ -366,7 +366,7 @@ int create_conn(struct poolhd *pool,
}
val->pair = pair;
pair->pair = val;
pair->in6 = dst->in6;
pair->in6 = addr.in6;
pair->flag = FLAG_CONN;
return 0;
}

View File

@ -89,6 +89,10 @@ $ ./ciadpi --disorder 3 -A --tlsrec 1+s
Существенно снизит вероятность, что пакет дойдет до сервера
Стоит учесть, что до DPI он также может не дойти
-S, --md5sig
Установить опцию TCP MD5 Signature для фейкового пакета
Поддерживается в Linux, однако может быть выключен в некоторых сборках
-l, --fake-tls <file|:str>
-j, --fake-http <file|:str>
Указать свои поддельные пакеты, вместо дефолтных