DVWA Brute Force (High Level) II | |||||||||||
Merhaba, önceki yazımda bahsettiğim dvwa uygulamasında high level güvenlik seviyesini atlatma ve brute force saldırısı yapma yönteminin son sürüm burpsuite yazılımlarında hatalı çalıştığını fark etmem sonucunda modern burpsuite yazılımlarında nasıl aynı işlemin tekrarlanabileceğini göstermek için bu yazıyı kaleme almaktayım. Bu yazıda dvwa web uygulaması high güvenlik seviyesindeyken brute force yaparak nasıl uygulama kullanıcısı parolasının çalınabileceği gösterilecektir.
Konuya giriş yapmadan önce bu yazının dahil olduğu dvwa eğitim serisindeki tüm makalelere şu adresten bu yazının ilintili olduğu dvwa eğitim serisindeki diğer makalelere ise şu adreslerden
erişebilirsiniz. DVWA Brute Force (High Level) Sayfasındaki Login Formuna ([CSRF Token] Korunaklı Login Formuna) Brute Force AdımlarıGereksinimler
1. Burpsuite'i başlat. Kali Linux Terminal: BurpSuiteCommunity ![]() 2. Burpsuite -> Settings -> Burp's Browser seçeneğindeki "Allow Burp's Browser to run without sandbox" seçeneğini tick'le. Not: Eğer burpsuite'i root yetkisinde başlatmadıysan bu 2nci adıma gerek yoktur ve 3ncü adıma atlayabilirsin. ![]() ![]() 3. Burpsuite -> Proxy -> Intercept -> Intercept Off yap ve burp'ün web tarayıcısını başlat. ![]() ![]() 4. DVWA web uygulamasını ziyaret et ve güvenlik seviyesini high'a çekip brute force ders sayfasına geç. ![]() ![]() 5. Burpsuite -> Proxy -> Intercept -> Intercept is On yap. ![]() 6. DVWA Brute Force ders sayfasında login isteğinde bulun ve gönderilen http paketi yakala. ![]() ![]() 7. İsteğe sağ tıkla ve Intruder'a gönder. ![]() 8. Intruder'a gelinir ve saldırı türü olarak "Pitchfork attack" seçilir. ![]() 9. Aynı ekranda parola tutan password ve - high güvenlik seviyesi gereği dinamik csrf token tutan - user_token parametre değerleri dolar işareti ile işaretlenirler. ![]() ![]() ![]() Böylece iki parametre brute force saldırısı için seçili durumdadır. 10. password parametresine payload (bir wordlist) koy. ![]() ![]() ![]() ![]() 11. Ardından user_token parametresi için payload türü olarak "Recursive Grep" diyelim. ![]() user_token parametresine özel bir ayar yapılacaktır ve uygulamaya gönderilen her brute force saldırı isteğine karşılık gelen yanıt paketindeki değişken değerde olan user_token değeri bir sonraki brute force gönderilecek pakete otomatikmen konulacaktır. 12. Daha sonra Settings'e gelelim ve Redirections'ı Always yapalım. ![]() 13. Daha sonra yine Settings sayfasındaki fakat bu sefer Grep - Extract bölümüne gelelim ve tick atıp Add diyelim. ![]() 14. Fetch Response diyelim ve yakaladığımız isteğe dönen bir yanıt paketini görüntüleyelim. Bu yanıt paketi içerisinde değişken gelen user_token parametresini arayalım. ![]() ![]() 15. Ardından user_token değerini (value özelliğindeki değeri tırnakları almadan) fareyle seçelim ve gelen yanıt paketlerindeki user_token değerini içeren bölgeyi böylelikle işaretlemiş olalım. ![]() 16. Daha sonra yine Settings ekranında bu sefer Grep - Match bölümüne gelelim. Bu bölümü clear ile temizleyelim ve login ekranına yanlış parola girince gelen hatalı giriş uyarı mesajındaki bir kelimeyi bu bölüme girelim: Örn; incorrect ![]() ![]() 17. Son olarak Resource Pool sekmesine gelelim ve thread sayısını resimde gösterildiği gibi 1 yapalım. Not: Bunu yapmamızın nedeni thread sayısını birden daha fazla yaptığımızda paralelde gönderilen brute force saldırı paketleri birden fazla yanıt dönderecektir ve bu yanıtlar içerisinde sadece son paketin user_token değeri geçerli olacaktır. Fakat olay paralelde ilerlediğinden sonuncu dışındaki paketlerin user_token'larını burp ilgili pakete eklemeye çalışacağından doğru parolayı denese bile geçersiz user_token kullandığından sonuca ulaşamayacaktır. ![]() 18. Ardından saldırı başlatılır. ![]() Saldırı sonuçlandığında incorrect gelmeyen cevap doğru parola denemesi olacaktır ve parolayı böylelikle tespit etmiş olacağız. ![]() Görüldüğü gibi "saat" parolası denemesinde incorrect kelimesi yanıt paketinde gelmemiş. O halde doğru parolayı ele geçirmiş durumdayız. DVWA Brute Force (High Level) DeğerlendirmeDVWA brute force sayfasında high seviye güvenlik önlemine bir göz atalım.Brute Force (High Level): <?php if( isset( $_GET[ 'Login' ] ) ) { // Check Anti-CSRF token checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); // Sanitise username input $user = $_GET[ 'username' ]; $user = stripslashes( $user ); $user = mysql_real_escape_string( $user ); // Sanitise password input $pass = $_GET[ 'password' ]; $pass = stripslashes( $pass ); $pass = mysql_real_escape_string( $pass ); $pass = md5( $pass ); // Check database $query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';"; $result = mysql_query( $query ) or die( '' . mysql_error() . '' ); if( $result && mysql_num_rows( $result ) == 1 ) { // Get users details $avatar = mysql_result( $result, 0, "avatar" ); // Login successful echo " Medium güvenlik seviyesinde csrf token ile login formu koruma önlemi bulunmamaktaydı. 5nci satır ile uygulama csrf token kontrolünü devreye aldığından artık saldırganların işi biraz daha zor durumdadır. Ancak halen saldırı yapmak imkansız değildir. Evet saldırı Medium'a göre daha yavaş gerçekleşecektir ama mümkündür. Bu makalede bunu burpsuite ile ispatlamış olduk. Medium güvenlik seviyesinde sleep( 2 ); ile brute force saldırılarını geciktirme önlemi uygulanıyordu. Bu genel kabul gören bir yöntemdir, fakat sabit bir gecikme süresi uygulamak göründüğü kadar güvenli değildir. Örneğin her geçersiz login denemesinde hatalı giriş yaptınız yanıtı için 5 saniye sabit gecikme süresi uygulanırsa bunu deneyimleyen bir saldırgan bir tool yazıp anlık yanıt gelmeyen her isteği yanlış deneme deyip drop'layabilir ve bir sonraki denemeye seri bir şekilde geçiş yapabilir. Yani uzun süreli yanıt geliyor gibiyse bekleme, bir sonraki denemeye geç prosedürünü bir tool ile uygulayabilir. Böylece geliştiricinin sağladığı güvenlik önlemi tamamen boşa gitmiş olur ve saldırgan, tool'u ile yine hızlı bir şekilde parola kırma saldırısı gerçekleştirebilir. 32nci satırda rastgele sürelerde gecikme önlemi uygulanmaktadır. Bu önlem sabit gecikme süresi önlemine göre daha kaliteli bir çözümdür. Böylece saldırganların tool yazıp referans alabilecekleri bir sabit gecikme süresi olmayacaktır. Ama bu önlemler saldırganın hızını yavaşlatırken tamamen durdurmamaktadır. Garanti önlem için impossible güvenlik seviyesine bir göz atalım. Brute Force (Impossible Level): <?php if( isset( $_POST[ 'Login' ] ) ) { // Check Anti-CSRF token checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); // Sanitise username input $user = $_POST[ 'username' ]; $user = stripslashes( $user ); $user = mysql_real_escape_string( $user ); // Sanitise password input $pass = $_POST[ 'password' ]; $pass = stripslashes( $pass ); $pass = mysql_real_escape_string( $pass ); $pass = md5( $pass ); // Default values $total_failed_login = 3; $lockout_time = 15; $account_locked = false; // Check the database (Check user information) $data = $db->prepare( 'SELECT failed_login, last_login FROM users WHERE user = (:user) LIMIT 1;' ); $data->bindParam( ':user', $user, PDO::PARAM_STR ); $data->execute(); $row = $data->fetch(); // Check to see if the user has been locked out. if( ( $data->rowCount() == 1 ) && ( $row[ 'failed_login' ] >= $total_failed_login ) ) { // User locked out. Note, using this method would allow for user enumeration! //echo "<pre><br />This account has been locked due to too many incorrect logins.</pre>"; // Calculate when the user would be allowed to login again $last_login = $row[ 'last_login' ]; $last_login = strtotime( $last_login ); $timeout = strtotime( "{$last_login} +{$lockout_time} minutes" ); $timenow = strtotime( "now" ); // Check to see if enough time has passed, if it hasn't locked the account if( $timenow > $timeout ) $account_locked = true; } // Check the database (if username matches the password) $data = $db->prepare( 'SELECT * FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' ); $data->bindParam( ':user', $user, PDO::PARAM_STR); $data->bindParam( ':password', $pass, PDO::PARAM_STR ); $data->execute(); $row = $data->fetch(); // If its a valid login... if( ( $data->rowCount() == 1 ) && ( $account_locked == false ) ) { // Get users details $avatar = $row[ 'avatar' ]; $failed_login = $row[ 'failed_login' ]; $last_login = $row[ 'last_login' ]; // Login successful echo "<p>Welcome to the password protected area <em>{$user}</em></p>"; echo "<img src=\"{$avatar}\" />"; // Had the account been locked out since last login? if( $failed_login >= $total_failed_login ) { echo "<p><em>Warning</em>: Someone might of been brute forcing your account.</p>"; echo "<p>Number of login attempts: <em>{$failed_login}</em>.<br />Last login attempt was at: <em>${last_login}</em>.</p>"; } // Reset bad login count $data = $db->prepare( 'UPDATE users SET failed_login = "0" WHERE user = (:user) LIMIT 1;' ); $data->bindParam( ':user', $user, PDO::PARAM_STR ); $data->execute(); } else { // Login failed sleep( rand( 2, 4 ) ); // Give the user some feedback echo "<pre><br />Username and/or password incorrect.<br /><br/>Alternative, the account has been locked because of too many failed logins.<br />If this is the case, <em>please try again in {$lockout_time} minutes</em>.</pre>"; // Update bad login count $data = $db->prepare( 'UPDATE users SET failed_login = (failed_login + 1) WHERE user = (:user) LIMIT 1;' ); $data->bindParam( ':user', $user, PDO::PARAM_STR ); $data->execute(); } // Set the last login time $data = $db->prepare( 'UPDATE users SET last_login = now() WHERE user = (:user) LIMIT 1;' ); $data->bindParam( ':user', $user, PDO::PARAM_STR ); $data->execute(); } // Generate Anti-CSRF token generateSessionToken(); ?> En sağlam güvenlik önleminde kullanıcı 5nci ve 76ncı satırlardaki önlem sayesinde yavaşlatılıyor, ve kodun genel planında uygulanan birkaç sql sorgusu mekanizması ile kullanıcı hesabı yanlış deneme sayısı limitine dayandığında belirli süreliğine askıya alınıyor. Yani brute force'a karşın bir geliştiricinin alması gereken çözüm budur. Veya alternatif olarak captcha önlemi entegre edilebilir. Yararlanılan Kaynaklar
|
|||||||||||
![]() |
|||||||||||
|
|||||||||||
Yorumlar |
|||||||||||
Henüz yorum girilmemiştir. | |||||||||||
Yorum Ekle | |||||||||||