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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
|
---
author: anton
title: kako se znebiti NLB avtentikatorja
categories: alternative
tags: alternative demonopolizacija
lastmodified-na: 2021-03-06 21:48:00
excerpt: Ker NLB za prijavo v spletno banko Klik ne podpira več certifikatov, temveč zgolj zaprtokodno mobilno aplikacijo za izbrane telefone, ki zahteva uporabo Googlovih storitev, sem v tej objavi pripravil algoritem za generiranje OTP žetonov kar v brskalniku in predstavil alternativo, katere obstoj je mogoč zaradi slabe implementacije OTP algoritma.
endofbody: <script src=//cdn.sijanec.eu/etc/npm/node_modules/@otplib/preset-browser/buffer.js></script><script src=//cdn.sijanec.eu/etc/npm/node_modules/@otplib/preset-browser/index.js></script>
---
<p>
Med prijavo v banko NLB Klik sem opazil, da od petega maja letos prijava z digitalnimi potrdili ne bo več mogoča. Peti maj 2021 je torej dan, ko bodo uporabniki NLB Klika prisiljeni v uporabo mobilnih telefonov Android ali iOS, s čimer se bo dodatno utrdil monopol Googla in Appla. V tej objavi predstavim način generiranja NLB Klik gesel na svoboden način.
</p>
<p>
Sam sicer uporabljam NLB Klikin avtentikator, saj bi me digitalno potrdilo stalo 15-30 evrov, vendar sem vseeno proti uporabi le-tega. Po nekaj pokukih v NLB Klikin aplikacijo sem ugotovil, da za izdelavo gesel uporablja skrit algoritem podjetja Entrust, ki ga je verjetno NLB od omenjenega podjetja naročila. Ta algoritem uradno nima odprtokodne implementacije, NLB Klikina pa ne boste spravili na Android telefon, če le-ta nima Googlovih storitev.
</p>
<p>
V tej objavi rešitev zgolj predstavim, saj algoritma nisem ugotovil sam, <a href=//github.com/ss23/entrust-identityguard-tools>na spletu</a> pa sem našel skupek orodij, ki implementirajo ta algoritem. Ker je GitHub znan po izbrisih programov, je varnostna kopija dostopna <a href=//git.sijanec.eu/anonymous/entrust-identityguard-tools>tukaj</a>.
</p>
<p>
Za implementacijo boste enkrat še vedno potrebovali NLB Klikin aplikacijo in vse Googlove storitve.
</p>
<h2>
prvi korak: pridobitev aktivacijske kode in serijske številke
</h2>
<p>
Odprite spletno mesto <a href=https://aam.nlb.si/>aam.nlb.si</a> in se prijavite s svojim uporabniškim imenom in geslom ter po pozivu vnesite preko SMS poslano aktivacijsko kodo. Če uporabniškega imena in gesla še nimate, povprašajte na bančnem okencu. Nato izberite opcijo <b>Aktivacija generatorja enkratnih gesel OTP</b>. Če ste generator že ustvarili, lahko uporabite opcijo <b>Obnovitev generatorja OTP v mobilni aplikaciji</b> za izdelavo novega generatorja. Sistem vam poda par številk. Zapišite si ju nekam in nato aktivirajte aplikacijo NLB Klikin.
</p>
<h2>
drugi korak: izpeljava OATH ključa iz znanih podatkov
</h2>
<p>
Entrustov algoritem, kot je opisano v <a href=//medium.com/@ss23/the-poor-design-decisions-of-entrust-identityguard-soft-tokens-2d355a9fe786>objavi programerja neuradnih odprtokodnih orodij za Entrust</a>, ni zelo varen. S samo dvema bajtoma naključne entropije lahko, če vemo serijsko številko, aktivacijsko kodo in vsaj en pravilen OTP žeton, uspešno dobimo OATH ključ, s katerim lahko nato generiramo neskončno mnogo žetonov in s tem izničimo celotno prednost 2FA. Za uporabo potrebujemo 65536 poskusov krat število tridesetsekundnih intervalov v prihodnost in preteklost, ki jih želimo še šteti kot veljavne.
</p>
<div class="noscript nosecurecontext">
<p>
To lahko s programom `crack-otp.py`, priloženim v Git repozitoriju, avtomatiziramo. Seveda moramo imeti naložen <a href=//python.org>Python</a> in programsko knjižnico <code>oath</code>, dostopno v okviru pypi/pip repozitorijev.
</p>
<code>
python3 -c "import time; int(time.time());" # trenutni izpisan časovni žig uporabimo pri naslednjem ukazu
# sedaj hitro generiramo žeton v NLB Klikin in ga pretipkamo v spodnji ukaz
./crack-otp.py [serijska številka] [aktivacijska koda] [ključ] [časovni žig]
</code>
</div>
<div class="yesscript yessecurecontext">
<p>
Generiranje ključa lahko avtomatiziramo. Uporabite lahko kar orodje na tej spletni strani, ki išče za vaš žeton v preteklih, trenutnih in prihodnjih 30 sekundah. Vpišite podatke iz prvega koraka in trenutni OTP žeton, izpisan v NLB Klikin aplikaciji, in pritisnite <i>izračunaj</i>.
</p>
<script>
function buf2hex(buffer) {
return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
}
async function r () {
e = new TextEncoder();
var s = e.encode(document.getElementById("s").value.replaceAll("-", "").replaceAll(" ", ""));
var a = document.getElementById("a").value.replaceAll("-", "").replaceAll(" ", "");
a = new Uint8Array(new BigInt64Array([BigInt(a.substring(0, a.length-1))]).buffer);
var t = new Int32Array([1]).buffer;
t = new Uint8Array(t);
if (t[0]) /* little endian */
a = new Uint8Array(Array.from(a).reverse());
while (a.length > 7) {
a = Array.from(a);
a.shift();
a = new Uint8Array(a);
}
console.log(a);
var ž = Number(document.getElementById("k").value);
var u = Math.floor(Date.now()/1000);
window.otplib.hotp.options = {digits: 8, algorithm: "sha256", encoding: "hex"};
var F = 0;
var č = Math.floor(u/30);
console.log("števec: "+String(č));
for (var i = 0; i <= 65535; i++) {
document.getElementById("r").innerText = Math.floor((i/65535)*100)+"%";
var r = Array.from(new Uint8Array(new Int16Array([i]).buffer));
if (t[0])
r = r.reverse();
r = new Uint8Array(Array.from(a).concat(...r));
var K = await window.crypto.subtle.importKey("raw", r, {name: "PBKDF2"}, false, ["deriveBits", "deriveKey"]);
var B = await window.crypto.subtle.deriveBits(
{
"iterations": 8,
"hash": "SHA-256",
salt: s,
"name": "PBKDF2"
},
K,
16*8
);
var x = buf2hex(B);
for (var j = -1; j <= 1; j++) {
T = window.otplib.hotp.generate(x, Math.floor(č)+j);
if (T == ž) {
document.getElementById("r").innerHTML = "<br>najden ključ: <code>"+x+"</code><br><a href="+window.location.href.split("#")[0]+"#g="+x+">povezava do generatorja (desni klik, kopiraj, dodajte jo na namizje)</a>";
F++;
break;
}
}
if (F)
break;
}
if (!F)
document.getElementById("r").innerText = "ključ ni bil najden";
}
</script>
<input id=s placeholder="serijska številka" />
<input id=a placeholder="aktivacijska števika" />
<input id=k placeholder="trenutni žeton" />
<input id=i onclick=r(); type=button value="izračunaj" />
<span id=r >[rešitev bo prikazana tukaj]</span>
</div>
<p>
Po slabi minuti nam program izpljune nekajznačno šestnajstiško zaporedje, ki ga lahko vpišemo v katerokoli odprtokodno programje za generiranje OTP gesel. Lahko uporabimo recimo <code>oathtool</code>, dostopen v Linux distribucijah:
</p>
<code>
sudo apt install oathtool
oathtool -v --totp=sha256 --digits=8 [nekajznačno šestnajstiško zaporedje]
</code>
<p>
in dobimo pravilen OTP žeton za prijavo v NLB Klik. Sedaj si moramo zgolj nekam zapisati to šestnajstiško zaporedje, aktivacijsko in serijsko številko lahko pozabimo, prav tako si lahko izbrišemo NLB Klikin.
</p>
<div class=yesscript>
<h2 id=generator-otp-žetonov>
generator OTP žetonov
</h2>
<p>
Za generiranje žetonov lahko med drugimi uporabljate tudi vgrajen TOTP generator na tej spletni strani. Povezavo, ki vam jo generira zgornji generator ključev, si shranite na namizje IN JE NE DELITE Z NIKOMER. Ob odprtju povezave vam bo generator vsakih 30 sekund avtomatično generiral žeton za NLB Klik pod tem odstavkom.
</p>
<p id=g>
Če bi bili sedaj na posebni povezavi, s katero generirate žetone, bi se tukaj izpisal trenutno veljaven žeton. Če ste na tej povezavi, očitno nekaj ne deluje.
</p>
<script>
var h;
window.onhashchange = function () {
h = window.location.hash.split("=").pop();
document.getElementById("generator-otp-žetonov").scrollIntoView();
};
document.addEventListener("DOMContentLoaded", function () {
window.otplib.hotp.options = {digits: 8, algorithm: "sha256", encoding: "hex"};
h = window.location.hash.split("=").pop();
if (h != "")
document.getElementById("generator-otp-žetonov").scrollIntoView();
});
setInterval(function() {
if (h != "") {
console.log(h);
document.getElementById("g").innerText = window.otplib.hotp.generate(h, Math.floor(Math.floor(Date.now()/1000)/30));
}
}, 1000);
</script>
</div>
<h2>
omejitev odgovornosti in politika zasebnosti glede te objave
</h2>
<p>
Ker je govora o kočljivi temi (bančnih računih) se mi zdi prav, da povem, da je generator tukaj zgolj kot dokaz koncepta in ni primeren za vsakdanjo uporabo. Nanj se ne zanašajte in ne uporabljajte ga kot primarno sredstvo za dostop do banke, da enkrat ne boste ostali brez dostopa! Vse, kar se generira in obdeluje v okviru teh dveh orodij na strani (generiranje in krekanje žetonov), se dogaja v brskalniku, žetoni se ne pošiljajo nikamor. Vedite, da nisem odgovoren za posledice pridobitve žetonov s strani tretjih oseb in za morebitne izgube denarja zaradi uporabe teh programov.
</p>
<h2>
zaključek
</h2>
<p>
Še vedno nismo povsem eliminirali NLB Klikin aplikacije, saj le-ta poskrbi za avtomatsko aktivacijo tega ključa. Verjetno se lahko temu koraku izognemo, če nam uspe prodreti še v zakulisje procesa aktivacije. Naročite se na RSS, če želite dobivati obvestila o objavah.
</p>
<p>
LP in se beremo naslednjič!
</p>
|