Skip to content

Commit 5672966

Browse files
authored
Add ja4l_delta and ja4ls_delta derived fields to JA4 wireshark plugin (#245)
* Add JA4L delta * Add JA4D to the documentation * Use FT_DOUBLE for delta fields
1 parent f0b35aa commit 5672966

15 files changed

+213
-2
lines changed

wireshark/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ JA4+ fields are found under `ja4.*` in Wireshark. These fields represent differe
168168
| **JA4SSH** (SSH Traffic) | `ja4.ja4ssh` |
169169
| **JA4T** (TCP Client) | `ja4.ja4t` |
170170
| **JA4TS** (TCP Server) | `ja4.ja4ts` |
171+
| **JA4D** (DHCP) | `ja4.ja4d` |
171172

172173
### Adding JA4+ Columns in Wireshark
173174

@@ -202,6 +203,7 @@ Alternatively, you can manually modify Wireshark's **preferences file** using a
202203
"JA4LS", "%Cus:ja4.ja4ls:0:R",
203204
"JA4X", "%Cus:ja4.ja4x:0:R",
204205
"JA4SSH", "%Cus:ja4.ja4ssh:0:R"
206+
"JA4D", "%Cus:ja4.ja4d:0:R"
205207
```
206208

207209
3. Save the file and restart Wireshark.

wireshark/source/packet-ja4.c

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,9 @@ static int hf_ja4h = -1;
6565
static int hf_ja4h_raw = -1;
6666
static int hf_ja4h_raw_original = -1;
6767
static int hf_ja4l = -1;
68+
static int hf_ja4l_delta = -1;
6869
static int hf_ja4ls = -1;
70+
static int hf_ja4ls_delta = -1;
6971
static int hf_ja4ssh = -1;
7072
static int hf_ja4t = -1;
7173
static int hf_ja4ts = -1;
@@ -282,7 +284,7 @@ proto_tree *locate_tree(proto_tree *tree, const char *s) {
282284

283285
void update_tree_item(
284286
tvbuff_t *tvb, proto_tree *tree, proto_tree **ja4_tree, int field,
285-
const char *str, const char *insert_at
287+
const void *data, const char *insert_at
286288
) {
287289

288290
// We get to the right part of the tree using locate_tree and insert the
@@ -300,7 +302,12 @@ void update_tree_item(
300302
*ja4_tree = proto_item_add_subtree(ja4_ti, ett_ja4);
301303
}
302304

303-
proto_tree_add_string(*ja4_tree, field, NULL, 0, 0, str);
305+
enum ftenum type = proto_registrar_get_ftype(field);
306+
if (type == FT_STRING) {
307+
proto_tree_add_string(*ja4_tree, field, NULL, 0, 0, (const char *)data);
308+
} else if (type == FT_DOUBLE) {
309+
proto_tree_add_double(*ja4_tree, field, NULL, 0, 0, *(const double *)data);
310+
}
304311
}
305312

306313
void update_mode(int pkt_len, wmem_map_t *hash_table) {
@@ -1190,6 +1197,13 @@ static int dissect_ja4(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void
11901197
wmem_strbuf_finalize(display), "tcp"
11911198
);
11921199

1200+
double delta = (double)latency2.nsecs / (double)latency.nsecs;
1201+
delta = round(delta * 10.0) / 10.0;
1202+
update_tree_item(
1203+
tvb, tree, &ja4_tree, hf_ja4ls_delta,
1204+
&delta, "tcp"
1205+
);
1206+
11931207
nstime_delta(&latency, &conn->timestamp_C, &conn->timestamp_B);
11941208
nstime_delta(&latency2, &conn->timestamp_F, &conn->timestamp_E);
11951209
wmem_strbuf_append_printf(
@@ -1200,6 +1214,13 @@ static int dissect_ja4(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void
12001214
tvb, tree, &ja4_tree, hf_ja4l,
12011215
wmem_strbuf_finalize(display2), "tcp"
12021216
);
1217+
1218+
double delta2 = (double)latency2.nsecs / (double)latency.nsecs;
1219+
delta2 = round(delta2 * 10.0) / 10.0;
1220+
update_tree_item(
1221+
tvb, tree, &ja4_tree, hf_ja4l_delta,
1222+
&delta2, "tcp"
1223+
);
12031224
}
12041225
}
12051226
}
@@ -1489,7 +1510,11 @@ void proto_register_ja4(void) {
14891510
{&hf_ja4h_raw_original,
14901511
{"JA4H Raw (Original)", "ja4.ja4h_ro", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} },
14911512
{&hf_ja4l, {"JA4L", "ja4.ja4l", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} },
1513+
{&hf_ja4l_delta,
1514+
{"JA4L Delta", "ja4.ja4l_delta", FT_DOUBLE, BASE_NONE, NULL, 0x0, NULL, HFILL} },
14921515
{&hf_ja4ls, {"JA4LS", "ja4.ja4ls", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} },
1516+
{&hf_ja4ls_delta,
1517+
{"JA4LS Delta", "ja4.ja4ls_delta", FT_DOUBLE, BASE_NONE, NULL, 0x0, NULL, HFILL} },
14931518
{&hf_ja4ssh, {"JA4SSH", "ja4.ja4ssh", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} },
14941519
{&hf_ja4t, {"JA4T", "ja4.ja4t", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} },
14951520
{&hf_ja4ts, {"JA4T-S", "ja4.ja4ts", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} },

wireshark/test/generate-output-files.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ FIELDS="-Y ja4 -T json \
1515
-e ja4.ja4h_r \
1616
-e ja4.ja4h_ro \
1717
-e ja4.ja4l \
18+
-e ja4.ja4l_delta \
1819
-e ja4.ja4ls \
20+
-e ja4.ja4ls_delta \
1921
-e ja4.ja4ssh \
2022
-e ja4.ja4t \
2123
-e ja4.ja4ts \

wireshark/test/test_tshark_output.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ def test_tshark_output_matches_expected(pcap_file):
3535
"-e", "ja4.ja4h_r",
3636
"-e", "ja4.ja4h_ro",
3737
"-e", "ja4.ja4l",
38+
"-e", "ja4.ja4l_delta",
3839
"-e", "ja4.ja4ls",
40+
"-e", "ja4.ja4ls_delta",
3941
"-e", "ja4.ja4ssh",
4042
"-e", "ja4.ja4t",
4143
"-e", "ja4.ja4ts",

wireshark/test/testdata/badcurveball.pcap.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,14 @@
7979
"ja4.ja4l": [
8080
"2177_64_114732"
8181
],
82+
"ja4.ja4l_delta": [
83+
"52.7"
84+
],
8285
"ja4.ja4ls": [
8386
"781_238_9107"
87+
],
88+
"ja4.ja4ls_delta": [
89+
"11.7"
8490
]
8591
}
8692
}

wireshark/test/testdata/browsers-x509.pcapng.json

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,14 @@
6767
"ja4.ja4l": [
6868
"56_128_2870"
6969
],
70+
"ja4.ja4l_delta": [
71+
"51.3"
72+
],
7073
"ja4.ja4ls": [
7174
"1907_112_343965"
75+
],
76+
"ja4.ja4ls_delta": [
77+
"180.3"
7278
]
7379
}
7480
}
@@ -153,8 +159,14 @@
153159
"ja4.ja4l": [
154160
"73_128_1768"
155161
],
162+
"ja4.ja4l_delta": [
163+
"24.1"
164+
],
156165
"ja4.ja4ls": [
157166
"7166_41_387249"
167+
],
168+
"ja4.ja4ls_delta": [
169+
"54"
158170
]
159171
}
160172
}
@@ -241,8 +253,14 @@
241253
"ja4.ja4l": [
242254
"78_128_150466"
243255
],
256+
"ja4.ja4l_delta": [
257+
"1929.1"
258+
],
244259
"ja4.ja4ls": [
245260
"2948_229_14055"
261+
],
262+
"ja4.ja4ls_delta": [
263+
"4.8"
246264
]
247265
}
248266
}

wireshark/test/testdata/http2-with-cookies.pcapng.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,14 @@
8181
"ja4.ja4l": [
8282
"47_128_455044"
8383
],
84+
"ja4.ja4l_delta": [
85+
"9579.9"
86+
],
8487
"ja4.ja4ls": [
8588
"44840_117_48774"
89+
],
90+
"ja4.ja4ls_delta": [
91+
"1.1"
8692
]
8793
}
8894
}

wireshark/test/testdata/latest.pcapng.json

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,14 @@
7979
"ja4.ja4l": [
8080
"62_128_930"
8181
],
82+
"ja4.ja4l_delta": [
83+
"15"
84+
],
8285
"ja4.ja4ls": [
8386
"33804_227_35440"
87+
],
88+
"ja4.ja4ls_delta": [
89+
"1"
8490
]
8591
}
8692
}
@@ -165,8 +171,14 @@
165171
"ja4.ja4l": [
166172
"57_128_2696"
167173
],
174+
"ja4.ja4l_delta": [
175+
"47.3"
176+
],
168177
"ja4.ja4ls": [
169178
"7096_245_3800"
179+
],
180+
"ja4.ja4ls_delta": [
181+
"0.5"
170182
]
171183
}
172184
}
@@ -300,8 +312,14 @@
300312
"ja4.ja4l": [
301313
"47_128_34471"
302314
],
315+
"ja4.ja4l_delta": [
316+
"725.7"
317+
],
303318
"ja4.ja4ls": [
304319
"14207_43_18819"
320+
],
321+
"ja4.ja4ls_delta": [
322+
"1.3"
305323
]
306324
}
307325
}
@@ -374,8 +392,14 @@
374392
"ja4.ja4l": [
375393
"40_128_1829"
376394
],
395+
"ja4.ja4l_delta": [
396+
"45.7"
397+
],
377398
"ja4.ja4ls": [
378399
"42103_109_42502"
400+
],
401+
"ja4.ja4ls_delta": [
402+
"1"
379403
]
380404
}
381405
}
@@ -448,8 +472,14 @@
448472
"ja4.ja4l": [
449473
"61_128_1680"
450474
],
475+
"ja4.ja4l_delta": [
476+
"27.3"
477+
],
451478
"ja4.ja4ls": [
452479
"53595_109_42401"
480+
],
481+
"ja4.ja4ls_delta": [
482+
"0.8"
453483
]
454484
}
455485
}

wireshark/test/testdata/ssh-r.pcap.json

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,14 @@
4141
"ja4.ja4l": [
4242
"94_128_5421"
4343
],
44+
"ja4.ja4l_delta": [
45+
"57.4"
46+
],
4447
"ja4.ja4ls": [
4548
"32_64_9660"
49+
],
50+
"ja4.ja4ls_delta": [
51+
"297.2"
4652
]
4753
}
4854
}
@@ -104,8 +110,14 @@
104110
"ja4.ja4l": [
105111
"14_64_115"
106112
],
113+
"ja4.ja4l_delta": [
114+
"8.2"
115+
],
107116
"ja4.ja4ls": [
108117
"4171_116_8099"
118+
],
119+
"ja4.ja4ls_delta": [
120+
"1.9"
109121
]
110122
}
111123
}
@@ -182,8 +194,14 @@
182194
"ja4.ja4l": [
183195
"12_64_230"
184196
],
197+
"ja4.ja4l_delta": [
198+
"19.2"
199+
],
185200
"ja4.ja4ls": [
186201
"3169_116_7225"
202+
],
203+
"ja4.ja4ls_delta": [
204+
"2.3"
187205
]
188206
}
189207
}

wireshark/test/testdata/ssh-scp-1050.pcap.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,14 @@
4141
"ja4.ja4l": [
4242
"179_128_8921"
4343
],
44+
"ja4.ja4l_delta": [
45+
"49.7"
46+
],
4447
"ja4.ja4ls": [
4548
"38_64_-496312"
49+
],
50+
"ja4.ja4ls_delta": [
51+
"-12891.2"
4652
]
4753
}
4854
}

0 commit comments

Comments
 (0)