İçeriğe geç

AWS WAF Temel Kurulum

Halbuki o (Kur’an), ancak âlemler için (gerçeği) hatırla(t)madır.
Kalem 52

Giriş

Projelerde birçok alanda WAF ihtiyacı doğal bir ihtiyaçtır. Örnek vermek gerekirse bir mobil uygulama geliştirdiğinizde login ekranınızı bruteforce saldırılarına karşı kapatmak istiyorsanız WAF ile önlem almayı düşünebilirsiniz. Elbette farklı çözüm yöntemleri de vardır. Saldırganın ip adresini bir tabloya kaydederek belirli zaman aralıklarında sizin limitinizden fazla login isteğinde bulunursa bunu tespit edip ilgili ip adresine bloklama koyabilirsiniz ancak bu arkaplanda çok fazla geliştirme isteyecektir. IP adreslerini tuttuğunuz bir tablo, o tabloya hem yazma hem de güncelleme yapacak olan kodlar, belirli zaman aralıklarında tablonun temizlenmesi ve eşik değerini geçen ip adresleri için job’ların çalıştırılması vb. Bütün bu süreçler küçük firmalarda belki esnek bir şekilde işletilebilir ve aslında kendi bruteforce önlemini kendiniz alabilirsiniz ancak büyük firmalarada, task’ın açılması, assing edilmesi, geliştirmenin yapılması, test edilmesi, bir sorun varsa sorunun çözülmesi ve tekrar test edilmesi gibi süreçler verimlilik düşmanıdır. Bu tarz durumlarda parayı veren düdüğü çalar şeklinde direkt olarak WAF teknolojilerinden yararlanılabilir. AWS tarafında ise bunu yapmak oldukça kolaydır. Bu yazı içerisinde temel WAF kullanımından bahsetmek istiyorum ancak ben de bu konuda yeni olduğumdan dolayı çok basit bir anlatım gerçekleştireceğim. Paragrafın başındaki örneği baz alarak Bruteforce saldırılarına önlem aldığımız bir sistem geliştireceğiz.

Hazırlık

Bu senaryoyu işletmek için bir lambda ayağa kaldırdım ve aşağıdaki kodları yazdım.

import json
import urllib.parse

def lambda_handler(event, context):
    try:

        # 'username' ve 'password' alanlarını çöz ve değerlerini al
        username = event.get('username', [None])

        # Kullanıcı adı ve parolayı kontrol et
        if username == "admin":
            return {
                'statusCode': 200,
                'body': json.dumps('Login successful')
            }
        else:
            return {
                'statusCode': 300,
                'body': json.dumps('Invalid credentials')
            }

    except Exception as e:
        return {
            'statusCode': 500,
            'body': json.dumps(f"An error occurred: {str(e)}")
        }

Kodlardan da anlaşıldığı üzere eğer kullanıcı adı parametresi admin olarak gelirse 200 döndürmekteyiz. Diğer bütün girişler için 300 değeri döndürmekteyiz. Daha sonrasında bir api-gateway ayağa kaldırıp bu lambdayı ap-gateway’e bağladım. Lambdam Canada’da api-gateway ise Stockholm’da yer almaktadır. WAF ile ap-gateway’in aynı region’da yer alması gerekmektedir.

Kurulum

WAF ekranına geldiğimde yeni bir WEB ACL üretmek istediğimi belirttim ve Stockholm’da yer alan api gateway’i burada seçtim. Burada bahsetmem gerken bir husus var nedenin bilmediğim bir durumdan dolayı yalnızca rest-api olarak ayağa kaldırdığını api-gateway’ler gözükmetedir. http-api’ler gözükmemektedir. Daha sonrasında aşağıdaki gibi bir rule oluşturdum.

{
  "Name": "bruteforce",
  "Priority": 0,
  "Statement": {
    "RateBasedStatement": {
      "Limit": 100,
      "EvaluationWindowSec": 300,
      "AggregateKeyType": "IP",
      "ScopeDownStatement": {
        "ByteMatchStatement": {
          "SearchString": "test/login",
          "FieldToMatch": {
            "UriPath": {}
          },
          "TextTransformations": [
            {
              "Priority": 0,
              "Type": "NONE"
            }
          ],
          "PositionalConstraint": "CONTAINS"
        }
      }
    }
  },
  "Action": {
    "Block": {
      "CustomResponse": {
        "ResponseCode": 404
      }
    }
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "bruteforce"
  }
}

Yukarıdaki konfigürasyonu görsel hale getirdiğimizde daha net bir şekilde anlaşılacaktır ama 300 saniye içerisinde api gateway’im içeriisnde test/login kısmına bir ip’den eğer 100 istek gelirse bunu bir bruteforce olarak adlandır ve artık 404 şeklinde dönüş yap diyorum.

Test

Daha sonrasında yukarıdaki gibi burp ile bir brute force başlattım. Sonuçlar aşağıdaki gibi…

AWS tarafı limiti tutturma konusunda tam stabil çalışmasada belirli bir süre sonunda isteklerin artık 404 geldiğini görebiliyoruz. Aynı zamanda burada istersek kendimiz WAF tarafından bir cevap ile de dönebiliriz. Ve vermiş olduğumuz kuraldan dolayı sadece bu api’ye bloklama işlemi gerçekleştirdik. Eğer istersek defaul halinde bütün api’lere karşı bir bloklamada yapabilirdik.

Şimdi cevap üreterek bir bloglama işlemi yapalım. Bu noktada kuralımız artık aşağıdaki gibi olacaktır.

{
  "Name": "bruteforce",
  "Priority": 0,
  "Statement": {
    "RateBasedStatement": {
      "Limit": 100,
      "EvaluationWindowSec": 300,
      "AggregateKeyType": "IP",
      "ScopeDownStatement": {
        "ByteMatchStatement": {
          "SearchString": "test/login",
          "FieldToMatch": {
            "UriPath": {}
          },
          "TextTransformations": [
            {
              "Priority": 0,
              "Type": "NONE"
            }
          ],
          "PositionalConstraint": "CONTAINS"
        }
      }
    }
  },
  "Action": {
    "Block": {
      "CustomResponse": {
        "ResponseCode": 404,
        "CustomResponseBodyKey": "test"
      }
    }
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "bruteforce"
  }
}

"CustomResponseBodyKey": "test" kısmını içeride sarikamyon ifadesine denk gelecek şekilde ayarladım ve bu işlem sonucunda aşağıdaki gibi bir http response dönmeye başldı.

HTTP/2 404 Not Found
Date: Wed, 10 Jan 2024 15:30:48 GMT
Content-Type: text/plain
Content-Length: 10
X-Amzn-Requestid: fb851cb2-df6c-459b-b125-e903a48afffb
X-Amzn-Errortype: ForbiddenException
X-Amz-Apigw-Id: RVG2ZHOagi0Ektw=

sarikamyon

Burada dönen cevap türünü plantext, json vb. istediğiniz şekilde ayarlayabilirsiniz.

Şimdilik bu kadar. İlerleye süreçte WAF tarafında engellenen ip adresline süre atanamadığında dolayı CloudWatch, Lambda ve WAF işbirliği ile engellenen ip adreslerine nasıl custom süre atayabileceğimizi göstereceğim.

Kategori:AWSAWS Pentesting

İlk Yorumu Siz Yapın

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir