Yazıda kullanılan IMF:1 sanal makinesi Vulnhub sitesinden indirilebilir.
https://www.vulnhub.com/entry/imf-1,162/
IMF:1 sanal makinesinde bir takım CTF adımları ile oturum açma ekranı keşfedilebilmektedir.
http://10.10.2.181/imfadministrator/
İletişim sayfasında da bir takım kullanıcı isimleri keşfedilir.
rmicheals@imf.local
akeith@imf.local
estone@imf.local
Kullanıcı adı olarak “rmichaels” harici bir değer verildiğinde “Invalid username.” hatası dönmektedir. Kullanıcı adı olarak “rmichaels” verilip yanlış parola girildiğinde ise “Invalid password” hatası alınmaktadır. Ancak kaba kuvvet saldırılarına rağmen oturum açılamayabilmektedir.
Talep ve dönen cevap sonucu Burp Suite gibi bir vekil uygulama ile görülebilir.
Sayfanın kaynak kodu incelendiğinde “user” ve “pass” değişkenleri ile kimlik bilgilerinin alındığı görülmektedir.
1 2 3 4 5 6 |
<form method="POST" action=""> <label>Username:</label><input type="text" name="user" value=""><br /> <label>Password:</label><input type="password" name="pass" value=""><br /> <input type="submit" value="Login"> <!-- I couldn't get the SQL working, so I hard-coded the password. It's still mad secure through. - Roger --> </form> |
Oturum açma sayfasında PHP kimlik doğrulamasını atlatma zafiyetine sebep olabilecek “strcmp” fonksiyonu kullanılmaktadır. Bu fonksiyon 2 katarı (string) küçük/büyük harf duyarlı olarak karşılaştırmak için kullanılır. PHP “strcmp” fonksiyonunun detayları için manuel sayfası incelenebilir.
https://secure.php.net/manual/en/function.strcmp.php
IMF:1 sanal makinesinin içerisindeki ilgili PHP kodu (index.php) aşağıdaki gibidir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<php ... if (strcmp($password, $_POST["pass"]) == 0) { $_SESSION['admin_logged_on'] = 'that is affirmative sir'; echo "flag3{Y29udGludWVUT2Ntcw==}<br />Welcome, ".$_POST["user"] . "<br /><a href='cms.php?pagename=home'>IMF CMS</a>"; $loggedin=true; } else { echo "Invalid password"; } } else { echo "Invalid username."; } ... ?> |
Bu fonksiyon parametre olarak aldığı “pass” girdi alanına karşılık gelen değer ile kullanıcının gömülü (gerçek / mevcut) parolasını karşılaştırmaktadır. Eğer karşılaştırma sonucu SIFIR (“0“) ise oturumun açılabilecektir. Ancak, karşılaştırma sırasında bir hata alınması durumunda, fonksiyonunun geri dönüş değeri “NULL” olarak dönmektedir. Bu gibi bir hata durumunda geri dönüş değeri “==” ile eşitlik şeklinde karşılaştırılırsa, bir uyarı mesajı verilir ve bunun yanında bir zafiyete sebebiyet olunabilir. Alınacak uyarı mesajı aşağıdaki gibi olabilir.
PHP Warning: strcmp() expects parameter 2 to be string, array given in …
Kullanılan sanal makinede kullanılan “strcmp($password, $_POST[“pass”]) == 0” şeklindeki karşılaştırma da hata alınması durumunda, “NULL == 0 = TRUE” şeklinde yorumlanarak DOĞRU sonuç verecektir. Eğer karşılaştırma işlemi “==” yerine “===” ile yapılsa idi; “NULL === 0 = FALSE” şeklinde yorumlanarak YANLIŞ sonuç verecektir. Detaylar için PHP manuelindeki yorum incelenebilir.
https://secure.php.net/manual/en/function.strcmp.php#113364
Zafiyetin istismarı için hataya sebebiyet verecek şekilde Katar (String) ve Dizi (Array) karşılaştırması yapılabilir. “pass” şeklindeki katar değişkeni yerine “pass[]” şeklindeki dizi değişkeni kullanılacaktır. Böylece oturum açılabilmiştir.
Kaynak:
https://reedphish.wordpress.com/2016/11/20/imf-walkthrough/
https://g0blin.co.uk/imf-vulnhub-writeup/