Python ile PTY Reverse/Bind Connection

Merhaba

Hedef sisteme web shell yüklemek, web uygulamalarına gelen saldırıların en bilinenleri arasındadır. Çok populer olan r57, c99 ve son dönemde meterpreter  PHP web shell’leri hedef sisteme yüklendikten sonra, saldırının bir sonraki aşamasını “local privilege escalation” saldırıları alır. Yere yetki yükseltmeyi hedefleyen bu saldırılar için hedef sunucu ile saldırganın bilgisayarı arasında reverse yada bind olmak üzere iki farklı tipte bağlantı gerçekleştirilmelidir.

Reverse Shell

Ele geçirilen sunucu; netcat, yada python, perl vb programlama dilleri ile yazılmış scriptler ile saldırganın bilgisayarının dinlemede olduğu bir portuna bağlantı talebi gerçekleştirmesine dayanmaktadır.

Bind Shell

Ele geçirilen sunucu; netcat, yada python, perl vb programlama dilleri ile yazılmış scriptler ile saldırganın seçtiği bir port dinleme alınır. Bu işlem gerçekleştirildikten sonra saldırgan hedef sunucunun dinlemede olan portuna bağlantı talebi göndermesine dayanır.

Tahmin edebileceğiniz gibi Bind Shell saldırıları NAT arkasındaki sunucular ile problem teşkil etmektedir. Bu nedenle genellikle Post Exploitation denen saldırıların haricinde Reverse Shell tercih edilir.

Mevcut Yöntemler : PHP ile Reverse Shell Bağlantısı

Metasploit ile reverse bağlantı gerçekleştiren PHP script’i oluşturulmaktadır.

Oluşturulan baglan.php hedef sunucuya yüklenip internter tarayıcısından çağırıldığında, 192.168.1.11 adresinin  1337 tcp portuna bağlantı talebinde bulunacaktır.

Saldırgan nc -lvp 1337 komutunu çalıştırarak dinleme modunda bağlantıyı beklemektedir. Bağlantı gerçekleştiğinde bir adet non-interactive shell açılacaktır. Kullanıcı inputu  bekleyen komutlar haricinde istenilen komutlar çalıştırılabilmektedir.

non-interactive shell

Yukarıda ki çıktı, kurban bilgisayardan gelen bağlantı sonucunda açılan non-interactive shell’de çalıştırılan komutları göstermektedir. Pentester için; aşağıdaki ufak bash betiği, alınan shell bağlantısının durumunu göstermektedir.

NON-Interactive Shell Problemleri

Şimdiye kadar anlatılan pek çok hacker’ın ve pentest uzmanının bildiği teknikler ve yöntemleri içermektedir. Bu tür saldırıları tecrübe etmiş insanların ortak problemi ise interactive olmayan shell’lerin kısıtlarıdır. Şöyle ki; su – root komutu ile root kullanıcısına geçiş yapılmak istenildiğinde, linux bir Password prompt’u vererek root kullanıcısının şifresini isteyecektir. Bu tür promptların interactive olmayan shell’er üzerinden algılanması mümkün değildir.

Çare: Python PTY Shell!

Non-interactive shell’in dezavantajları şimdiye kadar expect adında ki linux komutu ile aşılmaktaydı. Ama bu yönteminde 2 adet handikapı bulunmaktadır;

  1. Her linuxte hali hazırda gelmemektedir.
  2. Çalıştırılacak her komut için bash betikleri yazılarak çalıştırılmak zorundadır.

Bu problemleri aşan, hem reverse hemde bind shell ile hizmet verebilen Python uygulaması bulunmaktadır. Bu uygulamaya https://github.com/mmetince/python-pty-shells adresinden erişebilirsiniz.

Python-PTY-Shell hem TCP hemde UDP üzerinden Reverse ve Bind Shell hizmeti verme yeteneklerine sahiptir. Klasik yöntemlerde şimdiye kadar netcat kullanılsa da, interactive PTY olan shell özelliğini sunabilmek için kendine özgü ayrı bir listener’ı bulunmaktadır.

Kullanımı

Hedef sisteme komut çalıştırma yeteneği olan aşağıdakine benzer ufak bir PHP scripti’ upload edildiği varsayılmaktadır.

Hedef sistemden backconnect talebini başlatacak python scripti aşağıdaki GET talebi ile indirilmelidir.wget komutunun -O parametresi indirilen dosyanın yerel dizinde kayıt edileceği path’i göstermektedir. Hedef sunucuya indirilecek tcp_pty_backconnect.py dosyası /tmp dizini altında baglanti.py isminde kayıt edilmektedir. Bunun nedeni uygulamanın çalıştığı dizinde herhangi bir iz bırakmamak ve herhangi bir yazma izni hatasına düşmemektir.

Önemli not: Hedef sunucuya wget ile indirilen tcP_pty_backconnect.py dosyasının içerisinde bağlantının gerçekleştirileceği ip ve port adresi bulunmaktadır. Bu bilgilerin kendi sisteminize göre düzenlenmiş halinin hedef sunucuya yüklenmesi gerekmektedir. Aksi takdirde bağlantının beklendiği sunucuya talep erişmeyecektir..

Saldırgan olarak bağlantının kabul edeceği sunucuda ise aşağıdaki komut çalıştırılmalıdır. Aşağıdaki komut ile 31337 numaralı port dinlemeye alınır ve bağlantı talebi beklenir.

Hedef sunuya aşağıdaki GET talebi gönderilerek baglanti.py dosyası çalıştırılır.  Bu talep ile baglanti.py dosyasında tanımlanan ve saldırgan tarafında dinlemede beklenilen bilgisayarda interactive PTY shell talebi gönderilmiş olur.

Bu işlem sonucunda saldırganın talep beklediği terminalde bağlantı gerçekleşmiştir. Bu bağlantı üzeriden hedef sunucuda vi, nano gibi araçları kullanabilir, şifresi bilinen başka kullanıcılara geçiş yapılabilir. Yani non-interactive shell’in tüm kısıtları ortadan kalkmış bulunmatakdır.

python PTY

Gerçek Hayat Senaryosu

python-pty-shell ile gerçek hayatta tecrübe ettiğim bir senaryo. -gizlilik gereği bazı kısımlar senaryodan çıkartılmış ve/veya özet geçilmiştir.-

FTP şifresi olarak 123456 kullanan bir web uygulamasının web üzerinden erişilebilinen bir dizinine, komut çalıştırma yeteneği bulunan PHP script’i saldırgan tarafında yüklenmiştir. Hedef sisteme metasploit ile oluşturulmuş PHP reverse_tcp script’i yüklenerek saldırgan ile hedef sunucu arasında non-interactive shell baglantısı başlamıştır. FTP servisinin güvenlik ayarları nedeniyle kendi dosyalarının bulunduğu dizin haricinde hiçbir dizini görüntüleyememiş olan saldırgan, shell üzerinden başka bir dizinde bulunan YEDEK.zip dosyasını keşfetmiştir. Bu dosyayı kendi bilgisayarına indiren saldırgan, zip dosyasının içerisinde root kullanıcısının şifresini tespit etmiştir. Port taramalarında dış dünyaya sadece 22 ve 80 port’u açık olduğu için şifresi bilinse dahi SSH üzerinde hedef sisteme root kullanıcısı ile bağlanmak mümkün değildir. Bunun üzerine saldırgan hedef sisteme tcp_pty_backconnect.py yükleyerek hedef sunucu ile kendisi arasında interactive PTY shell bağlantısı başlatır. Hedef sunucuda tcp_pty_backconnect.py dosyasını çalıştırma işlemini PHP script üzerinden yaptığı için, bağlantı  apache user’ı yetkilerine sahiptir. su – root komutu ile root kullanıcısına geçiş yapar. Şifre kısmına ise BACKUP dosyasından elde ettiği şifreyi yazar. Viola!