blob: e1300bd5e1bbd58ac2bf19d45569bae6683ed02e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
#!/bin/bash
# Decrypt data using AES256 in CBC mode, optionally utilising IV and keys from
# Wireshark's ssl.debug_file file
#IV=
#KEY=
C=aes-256-cbc
if [ $# -ge 2 -a $# -le 3 ]; then
debug_file="$1"
mode=$2
start_frame=$3
eval $(awk -vstart_frame=$start_frame '
function try_name(name) {
if (frame >= start_frame && !found[name]) {
key_name = name;
found[name] = 1;
}
}
/^\| / {
if (key_name) {
for (i=2; i<18; i++)
key = key $i;
}
}
! /^\| / {
if (key_name) {
print key_name "=" key ";";
key = "";
key_name = "";
}
}
/^dissect_ssl enter frame #/ { sub("#", ""); frame = $4; }
/^Client Write key/ { try_name("CKEY"); }
/^Server Write key/ { try_name("SKEY"); }
/^Client Write IV/ { try_name("CIV"); }
/^Server Write IV/ { try_name("SIV"); }
' "$debug_file")
[ -z "$IV" ] || echo "Warning: IV from debug won't be used" >&2
[ -z "$KEY" ] || echo "Warning: KEY from debug won't be used" >&2
case $mode in
[Cc]*) KEY=${KEY:-$CKEY}; IV=${IV:-$CIV} ;;
[Ss]*) KEY=${KEY:-$SKEY}; IV=${IV:-$SIV} ;;
*)
echo "Invalid mode, accepting only client or server" >&2
exit 1
;;
esac
if [ -z "$KEY" -o -z "$IV" ]; then
echo "Debug file is invalid, does not contain IV and KEY" >&2
exit 1
fi
elif [ $# -lt 2 ]; then
if [ -z "$IV" -o -z "$KEY" ]; then
echo "Usage: echo hh hh.. | $0 debug-file mode [start frame]" >&2
echo "Usage: IV=... KEY=... $0 hh hh hh hh.." >&2
exit 1
fi
fi
if [ $# -gt 3 ]; then
echo "$*"
else
awk '
/^\| / { for (i=2; i<18; i++) print $i; }
! /^\| / { print; }
'
fi |
xxd -ps -r |
openssl $C -nosalt -iv "${IV// /}" -K "${KEY// /}" -d |
if [ -t 1 ]; then
xxd
else
cat
fi
|