Multiple tlsrec positions

This commit is contained in:
ruti 2024-03-04 15:30:23 +03:00
parent 2e1f4e646a
commit ff472f6448
6 changed files with 75 additions and 53 deletions

View file

@ -205,15 +205,27 @@ int desync(int sfd, char *buffer, size_t bfsize,
}
}
else if (type == IS_HTTPS && params.tlsrec) {
int o = params.tlsrec_pos;
if (params.tlsrec_sni) {
o += (host - buffer - 5);
struct part *part = params.tlsrec;
int i = 0;
long lp = 0;
while (part) {
long pos = part->pos + i * 5;
if (params.tlsrec_sni) {
pos += (host - buffer - 5);
}
else if (pos < 0) {
pos += n;
}
LOG(LOG_S, "tlsrec: pos=%ld, n=%ld\n", pos, n);
if (!part_tls(buffer + lp,
bfsize - lp, n - lp, pos - lp)) {
break;
}
n += 5;
lp = pos + 5;
i++;
part = part->next;
}
else if (o < 0) {
o += n;
}
LOG(LOG_S, "tlsrec: pos=%d, n=%ld\n", o, n);
n = part_tls(buffer, bfsize, n, o);
}
if (params.custom_ttl) {

84
main.c
View file

@ -47,7 +47,6 @@ struct params params = {
.custom_ttl = 0,
.mod_http = 0,
.tlsrec = 0,
.tlsrec_pos = 0,
.tlsrec_sni = 0,
.de_known = 0,
@ -84,9 +83,9 @@ const char help_text[] = {
" -j, --fake-http <file> Set custom fake packet\n"
" -n, --tls-sni <str> Change SNI in fake CH\n"
#endif
" -e, --oob-data <file> Set custom oob bytes\n"
" -e, --oob-data <file> Set custom OOB data\n"
" -M, --mod-http <h,d,r> Modify http: hcsmix,dcsmix,rmspace\n"
" -r, --tlsrec <offset> Make 2 TLS records\n"
" -r, --tlsrec <offset> Make TLS record at offset\n"
" -L, --tlsrec-at-sni Add SNI offset to tlsrec position\n"
};
@ -196,6 +195,44 @@ int get_default_ttl()
}
struct part *add_part(struct part **root, long val)
{
struct part *part = malloc(sizeof(struct part));
if (!part) {
uniperror("malloc");
return 0;
}
part->pos = val;
struct part *p = *root, *v = 0;
if (!p) {
*root = part;
return part;
}
while (p) {
if (val < p->pos) {
if (v) {
part->next = p;
v->next = part;
}
else {
part->next = *root;
*root = part;
}
break;
}
if (!p->next) {
p->next = part;
part->next = 0;
break;
}
v = p;
p = p->next;
}
return part;
}
int main(int argc, char **argv)
{
#ifdef _WIN32
@ -316,9 +353,8 @@ int main(int argc, char **argv)
invalid = 1;
break;
}
struct part *part = malloc(sizeof(struct part));
struct part *part = add_part(&params.parts, val);
if (!part) {
uniperror("malloc");
return -1;
}
switch (rez) {
@ -330,34 +366,6 @@ int main(int argc, char **argv)
break;
case 'f': part->m = DESYNC_FAKE;
}
part->pos = val;
if (!params.parts) {
params.parts = part;
}
else {
struct part *p = params.parts, *v = 0;
while (p) {
if (val < p->pos) {
if (v) {
part->next = p;
v->next = part;
}
else {
part->next = params.parts;
params.parts = part;
}
break;
}
if (!p->next) {
p->next = part;
part->next = 0;
break;
}
v = p;
p = p->next;
}
}
break;
case 't':
@ -424,11 +432,13 @@ int main(int argc, char **argv)
case 'r':
val = strtol(optarg, &end, 0);
if (val > 0xffff || *end)
if (val > 0xffff || *end) {
invalid = 1;
else {
params.tlsrec_pos = val;
params.tlsrec = 1;
break;
}
part = add_part(&params.tlsrec, val);
if (!part) {
return -1;
}
break;

View file

@ -228,11 +228,11 @@ int mod_http(char *buffer, size_t bsize, int m)
}
ssize_t part_tls(char *buffer, size_t bsize, ssize_t n, int pos)
int part_tls(char *buffer, size_t bsize, ssize_t n, int pos)
{
if ((n < 3) || (bsize - n < 5) ||
(pos < 0) || (pos + 5 > n)) {
return n;
return 0;
}
uint16_t r_sz = ANTOHS(buffer, 3);
if (r_sz < pos) {
@ -243,5 +243,5 @@ ssize_t part_tls(char *buffer, size_t bsize, ssize_t n, int pos)
*(uint16_t *)(buffer + 3) = htons(pos);
*(uint16_t *)(buffer + 5 + pos + 3) = htons(r_sz - pos);
return n + 5;
return 5;
}

View file

@ -21,4 +21,4 @@ int parse_http(char *buffer, size_t bsize, char **hs, uint16_t *port);
int mod_http(char *buffer, size_t bsize, int m);
ssize_t part_tls(char *buffer, size_t bsize, ssize_t n, int pos);
int part_tls(char *buffer, size_t bsize, ssize_t n, int pos);

View file

@ -29,8 +29,7 @@ struct params {
int def_ttl;
char custom_ttl;
int mod_http;
char tlsrec;
int tlsrec_pos;
struct part *tlsrec;
char tlsrec_sni;
char ipv6;

View file

@ -37,7 +37,7 @@ $ ./ciadpi --split 3 --disorder 10
-s, --split <offset>
Разбить запрос по указанному смещению
Можно указать несколько раз, например: -s 3 -s 10
Можно указывать несколько раз, чтобы разбить запрос по нескольким позициям
При указании отрицательного значения к нему прибавляется размер пакета
-d, --disorder <offset>
@ -45,7 +45,7 @@ $ ./ciadpi --split 3 --disorder 10
! Поведение в Windows отлично: сначала отправляется лишь часть, но затем целый запрос
-f, --fake <offset>
Подобен --disorder, только перед первым запросом отправляется часть поддельного
Подобен --disorder, только перед отправкой первого куска отправляется часть поддельного
Количество байт отправляемого из фейка равно рамеру разбиваемой части
-o, --oob <offset>
@ -82,6 +82,7 @@ $ ./ciadpi --split 3 --disorder 10
-r, --tlsrec <offset>
Разделить ClientHello на отдельные записи по указанному смещению
Также возможен отсчет от конца при указании отрицательного значения
Можно указывать несколько раз
-L, --tlsrec-at-sni
Отсчитывать позицию tlsrec относительно SNI