เรื่องเล่าจากการทดสอบช่องโหว่ CVE-2019-2725 ใน Oracle WebLogic

จากเมื่อวันที่ 21 เมษายน 2019 ทีม KnownSec 404 จาก ZoomEye ประกาศการค้นพบช่องโหว่ระดับวิกฤติใน Oracle WebLogic Server ได้รับ CVE-2019-2725 ช่องโหว่ดังกล่าวกระทบ Oracle WebLogic Server รุ่น 10.x และรุ่น 12.1.3.0 เป็นช่องโหว่ที่สามารถรันคำสั่งจากระยะไกลได้ (remote code-execution) โดยที่ผู้โจมตีไม่จำเป็นต้องทำการเข้าสู่ระบบดังกล่าว ด้วยความร้ายแรงของช่องโหว่นี้ทำให้ Oracle ได้ออกแพตช์เฉพาะกิจมาเพื่อแก้ไขช่องโหว่ดังกล่าวในวันที่ 26 เมษายน 2019

โดยหลังจากที่ออกแพตช์ไม่นาน (2 พฤษภาคม 2019) นักวิจัยจากบริษัทรักษาความปลอดภัยทางไซเบอร์หลายบริษัทพบการโจมตี Oracle WebLogic Server รวมถึงมีการเผยแพร่ POC สำหรับค้นหาและโจมตีช่องโหว่ CVE-2019-2725 จำนวนมาก รวมถึงมีข่าวการโจมตีผ่านช่องโหว่ CVE-2019-2725 ด้วยมัลแวร์หลายครั้ง

หลังจากที่ได้ทำการศึกษาและทดสอบช่องโหว่ สำหรับในบล็อกนี้ทีมตอบสนองการโจมตีและภัยคุกคาม (Intelligent Response) จากบริษัท ไอ-ซีเคียว จำกัด จะมาเล่าการทดสอบช่องโหว่ดังกล่าวให้ฟังกันโดยแบ่งเนื้อหาออกเป็นหัวข้อดังต่อไปนี้

คำเตือน: การทดสอบนี้เป็นไปเพื่อการศึกษาเท่านั้น 

รายละเอียดเกี่ยวกับช่องโหว่ CVE-2019-2725

ช่องโหว่ CVE-2019-2725 ถูกพูดถึงครั้งแรกใน CHINA NATIONAL VULNERABILITY DATABASE ใช้ชื่อว่า CNTA-2019-0014 เมื่อวันที่ 17 เมษายน 2019 ส่งผลกระทบกับ Oracle WebLogic Server  10.X และ Oracle WebLogic Server  12.1.3

KnownSec 404 Team ซึ่งเป็นหนึ่งในผู้แจ้งช่องโหว่ดังกล่าวไปยัง Oracle ได้เขียนสรุปรายละเอียดเกี่ยวกับช่องโหว่ว่าเกิดจากส่วนประกอบ wls9_async และ wls-wsat ซึ่งทำให้เกิดช่องโหว่ Deserialization Remote Command Execution ผู้โจมตีสามารถรันคำสั่งจากระยะไกลไปยังระบบที่มีช่องโหว่ได้ โดยที่ผู้โจมตีไม่จำเป็นต้องทำการเข้าสู่ระบบดังกล่าวและคำสั่งดังกล่าวจะรันด้วยสิทธิ์เดียวกันกับสิทธิ์ของ Oracle WebLogic Server

ตัวอย่างการรันคำสั่ง ipconfig CVE-2019-2725 จากระยะไกลโดยใช้ช่องโหว่ ที่มา https://twitter.com/pyn3rd/status/1132170288291037184

ด้วยความร้ายแรงของช่องโหว่นี้ทำให้ Oracle ได้ออกแพตช์เฉพาะกิจมาเพื่อแก้ไขช่องโหว่ดังกล่าวในวันที่ 26 เมษายน 2019 โดยอัปเดตเป็น Oracle WebLogic Server รุ่น 12.2.1

หลังจากที่มีการประกาศการแก้ไขช่องโหว่ได้ไม่นานได้มีผู้เผยแพร่ POC ออกมาเป็นจำนวนมาก รวมถึงมีการเขียน Exploits สำหรับ Metasploit ออกมาอีกด้วย รวมถึงมีข่าวการโจมตีผ่านช่องโหว่ CVE-2019-2725 ด้วยมัลแวร์หลายครั้ง เช่น โจมตีด้วย Sodinokibi ransomware

ตัวอย่าง POC จาก https://vulmon.com/vulnerabilitydetails?qid=CVE-2019-2725

ไม่ใช่ทุก POC และ Exploits ที่เผยแพร่จะใช้ได้เสมอไป

อ้างอิงจากที่ทีม KnownSec 404 ได้เล่ารายละเอียดเพิ่มเติมเกี่ยวกับการค้นพบช่องโหว่ดังกล่าวใน WebLogic RCE (CVE-2019-2725) Debug Diary ว่า CVE-2019-2725 ที่เกิดจากความสำเร็จในการ bypass ตัว blacklist ที่ Oracle ใช้ป้องกัน CVE 2017-10271

รูปอธิบายความเชื่อมโยงระหว่าง CVE 2017-10271 และ CVE-2019-2725 จาก WebLogic RCE (CVE-2019-2725) Debug Diary

ทำให้สามารถสรุปได้ว่า WebLogic 10.X จะมีทั้งช่องโหว่ CVE 2017-10271 และ CVE-2019-2725 แต่ WebLogic 12.1.3 จะมีช่องโหว่แค่ช่องโหว่ CVE-2019-2725 เท่านั้น

ซึ่งบาง POC และบาง Exploits ที่ถูกเผยแพร่ออกมาจะใช้ได้กับ CVE 2017-10271 ซึ่งใช้กับ WebLogic 12.1.3 ไม่ได้

ดังนั้นเมื่ออยากจะทำการทดสอบ CVE-2019-2725 จึงควรใช้ WebLogic 12.1.3 เพื่อให้มั่นใจว่า POC ที่นำมาทดสอบสามารถใช้ได้จริง

โดยการโจมตี CVE-2019-2725 จะเกิดจากการส่ง http request ที่ทำเป็นพิเศษไปยังส่วนที่มีช่องโหว่คือ wls9_async และ wls-wsat ซึ่ง https://sissden.eu/blog/oracle-weblogic-0day ได้ศึกษาจาก Weblogic honeypot เพื่อตรวจสอบการแสกนหา Weblogic ที่มีช่องโหว่พบว่า มีการแสกนด้วยสามรูปแบบหลักๆ คือ

  • POST /wls-wsat/CoordinatorPortType
  • GET /_async/AsyncResponseService
  • POST /_async/AsyncResponseService

ซึ่งอาจเป็นได้ทั้งการแสกนหา CVE-2017-10271 และ CVE-2019-2725

แต่ช่องทางในการโจมตีช่องโหว่ CVE-2019-2725 จะไม่จำกัดอยู่ที่รูปแบบในการแสกนดังกล่าวเท่านั้น เพราะสามารถโจมตีได้โดยส่ง http request ไปยัง /_async/* และ /wls-wsat/*

ทางแก้ไขนอกจากอัปเดตแพตช์

CNTA-2019-0014 และ [KnownSec 404 Team] Oracle WebLogic Deserialization RCE Vulnerability (0day) Alert(update on 26th April) ซึ่งถูกเขียนก่อนที่จะมีการอัปเดตจาก Oracle ระบุช่องทางในการแก้ไขก่อนที่จะมีแพตช์ไว้ว่า

  1. ให้ลบไฟล์ wls9_async_response.war และ wls-wsat.war จากนั้น restart ตัว Weblogic หรือ
  2. ตั้งค่าป้องกันการเข้าถึง URL /_async/* และ /wls-wsat/* ด้วยการตั้งค่า access policy control ใน Oracle WebLogic Server หรือป้องกันจากอุปกรณ์อื่่นๆ

สมมติฐานในการทดสอบช่องโหว่ CVE-2019-2725

จากบทความเรื่อง Update about Weblogic CVE-2019-2725 (Exploits Used in the Wild, Patch Status) ได้มีผู้ทดสอบการโจมตีผ่านช่องโหว่ CVE-2019-2725 ว่ามี Indicator of Attack (IOA) ใน log ของ test server หรือไม่ ซึ่งจากการทดสอบดังกล่าวผู้ทดสอบพบ Indicator of Attack เฉพาะเมื่อการพยายามรันคำสั่งนั้นไม่สำเร็จ เช่น พยายามรันคำสั่ง wget แต่เครื่องดังกล่าวไม่มีการลง wget ไว้

log ที่บันทึกว่ามีการพยายามรันคำสั่ง wget แต่เครื่องดังกล่าวไม่มีการลง wget ไว้ จาก Update about Weblogic CVE-2019-2725 (Exploits Used in the Wild, Patch Status)

ทีมตอบสนองการโจมตีและภัยคุกคาม (Intelligent Response) จึงตั้งสมมติฐานและทำการทดลองเพื่อหาว่า เป็นไปได้หรือที่จะมีการพบ Indicator of Attack อื่นที่จะบ่งบอกได้ว่ามีการโจมตีผ่านช่องโหว่ CVE-2019-2725 บน test server ที่มีการใช้งาน Oracle WebLogic Server  10.X หรือ Oracle WebLogic Server 12.1.3 ดังนั้นถ้าทำการรัน POC เพื่อโจมตีช่องโหว่ CVE-2019-2725 จะพบการเปลี่ยนแปลงของไฟล์ log บน test server เช่น access log

วิธี setup เพื่อทดสอบช่องโหว่ CVE-2019-2725 

เพื่อให้สามารถ setup ตัว test server ได้อย่างรวดเร็ว ทีมตอบสนองการโจมตีและภัยคุกคาม (Intelligent Response) ได้เลือกใช้ Docker ในการเตรียม environment โดยเลือก image จาก Docker Hub ใน Linux ดังนี้

  1. Oracle-Weblogic 10.3.6 alanpeng/oracle-weblogic11g
  2. Oracle-Weblogic 12.1.3 ismaleiva90/weblogic12

วิธีใช้ Oracle-Weblogic 10.3.6 alanpeng/oracle-weblogic11g

docker pull alanpeng/oracle-weblogic11g

Run container จาก image โดยใช้คำสั่ง

docker run -d -p 7001:7001  -e base_domain_default_password=<password> alanpeng/oracle-weblogic11g

จะเข้า container ที่รันจาก image ดังกล่าวได้จาก

http://localhost:7001/console

Username: weblogic
Password: <password>

วิธีใช้Oracle-Weblogic 12.1.3 ismaleiva90/weblogic12

docker pull ismaleiva90/weblogic12

Run container จาก image โดยใช้คำสั่ง

docker run -d -p 49163:7001 -p 49164:7002 -p 49165:5556 ismaleiva90/weblogic12:latest

จะเข้า container ที่รันจาก image ดังกล่าวได้จาก

http://localhost:49163/console
User: weblogic
Pass: welcome1

ปัญหาในการทดสอบช่องโหว่ CVE-2019-2725

  1. มี POC เผยแพร่จำนวนมาก แต่มีเพียงส่วนน้อยที่สามารถใช้ได้จริง หลายๆ POC เป็น POC สำหรับ CVE 2017-10271 ทำให้ไม่สามารถใช้กับ WebLogic 12.1.3 ได้
  2. เพื่อความรวดเร็วในการติดตัง environment สำหรับทดสอบช่องโหว่ ทำให้ผู้ทดสอบเลือกใช้ Docker ในการทดสอบ แต่ Docker image สำหรับ WebLogic 10.X และ WebLogic 12.1.3 มีจำนวนมาก แต่มีเพียงบาง Docker image เท่านั้นที่มีวิธีการรันระบุไว้ ทำให้ใช้เวลานานกว่าจะพบ Docker image ที่สามารถใช้งานได้
  3. ใน default config ของ WebLogic จะมีการกำหนด buffer ไว้ 8kb สำหรับ access log และ log ประเภทอื่นๆ ให้เขียน log ลงไฟล์ก็ต่อเมื่อ buffer เต็มเท่านั้น ทำให้ไม่พบการเปลี่ยนแปลงของ log ใดๆ ในช่วงที่ยังไม่ทราบเงื่อนไขดังกล่าวเพราะ buffer ยังไม่เต็ม
  4. access log ของ WebLogic ไม่บันทึกการเข้าถึง /wls-wsat/* และ /_async/*

การทดสอบช่องโหว่ CVE-2019-2725

คำเตือน: การทดสอบนี้เป็นไปเพื่อการศึกษาเท่านั้น

จากการทดสอบ พบว่า davidmthomsen/CVE-2019-2725 เป็น POC ที่ใช้ได้กับ WebLogic 12.1.3

จึงได้ทำการทดสอบต่อหลังจากตั้งค่า log ให้เขียนลงไฟล์ทันที (ตั้งค่า buffer เป็น 0) ด้วยการรันคำสั่ง whoami , ipconfig และคำสั่งอื่นๆ แล้วใช้ find / -printf '%T+ %p\n' | sort -r | grep "2019-05-16" > todayrecentfile.out หาไฟล์ที่มีการเปลี่ยนแปลงทั้งหมดบน Docker container WebLogic 12.1.3 ประจำวันที่ 2019-05-16

ซึ่งเมื่อตรวจสอบไม่พบบันทึกที่มีประโยชน์ต่อการตรวจจับการรันคำสั่งแต่อย่างใด

จากรายชื่อไฟล์ที่เปลี่ยนแปลงล่าสุดไม่พบไฟล์ log ของ WebLogic เปลี่ยนแปลง

รวมถึงเมื่อพยายามเข้าถึง /wls-wsat/* และ /_async/* จะพบว่าไม่มีการบันทึกการเข้าถึง /wls-wsat/* และ /_async/* บน access log ของ WebLogic (บันทึกเฉพาะที่ลองสะกดผิด)

ไม่มีการบันทึกการเข้าถึง /wls-wsat/* และ /_async/* (บันทึกเฉพาะที่ลองสะกดผิด) บน access log ของ WebLogic

ข้อสังเกต

จาก Docker image ที่เลือกมาทดสอบคือ Oracle-Weblogic 10.3.6 alanpeng/oracle-weblogic11g และ Oracle-Weblogic 12.1.3 ismaleiva90/weblogic12 พบว่าเมื่อทำการโจมตีด้วย POC เดียวกัน จะมีระดับความร้ายแรงไม่เท่ากัน เพราะทั้งสอง Docker image ให้สิทธิ์ของ Oracle WebLogic Server ไม่เท่ากัน

  • Docker image Oracle-Weblogic 10.3.6 alanpeng/oracle-weblogic11g ให้สิทธิ์ของ Oracle WebLogic Server รันด้วย root เมื่อโจมตีด้วยช่องโหว่ CVE-2019-2725 ผู้โจมตีจะได้สิทธิ์ในการรันคำสั่งเท่า root
  • Docker image Oracle-Weblogic 12.1.3 ismaleiva90/weblogic12 ให้สิทธิ์ของ Oracle WebLogic Server รันด้วย user ชื่อ oracle ที่สร้างขึ้นใหม่ เมื่อโจมตีด้วยช่องโหว่ CVE-2019-2725 ผู้โจมตีจะได้สิทธิ์ในการรันคำสั่งเท่า user ชื่อ oracle เท่านั้น

ดังภาพผลลัพธ์จากการวาง webshell ผ่าน POC ช่องโหว่ CVE-2019-2725 แล้วรันคำสั่ง whoami

ผลลัพธ์จากการวาง webshell ผ่านช่องโหว่ CVE-2019-2725 แล้วรันคำสั่ง whoami บน alanpeng/oracle-weblogic11g และ ismaleiva90/weblogic12

ซึ่งถ้ามีการให้สิทธิ์ root กับ Oracle WebLogic Server ผลจากการโจมตีด้วยช่องโหว่ CVE-2019-2725 ย่อมร้ายแรงกว่าการให้สิทธิ์ด้วย user อื่น

สรุปการทดสอบช่องโหว่ CVE-2019-2725

จากการทดสอบการโจมตีผ่านช่องโหว่ CVE-2019-2725 บน test server ที่มีการใช้งาน Oracle WebLogic Server  10.X หรือ Oracle WebLogic Server 12.1.3 ไม่พบ Indicator of Attack ที่จะบ่งบอกได้ว่ามีการโจมตีบน test server ควรตรวจสอบความพยายามในการโจมตีผ่านอุปกรณ์อื่นๆ ที่มีบันทึกการเข้าถึง /wls-wsat/* และ /_async/*

แหล่งอ้างอิง

  1. CNTA-2019-0014
  2. [KnownSec 404 Team] Oracle WebLogic Deserialization RCE Vulnerability (0day) Alert(update on 26th April)
  3. https://vulmon.com/vulnerabilitydetails?qid=CVE-2019-2725
  4. WebLogic RCE (CVE-2019-2725) Debug Diary
  5. https://sissden.eu/blog/oracle-weblogic-0day
  6. Sodinokibi ransomware exploits WebLogic Server vulnerability
  7. https://twitter.com/pyn3rd/status/1132170288291037184
  8. https://www.oracle.com/technetwork/security-advisory/alert-cve-2019-2725-5466295.html
  9. Unpatched Vulnerability Alert - WebLogic Zero Day
  10. Update about Weblogic CVE-2019-2725 (Exploits Used in the Wild, Patch Status)
  11. Weblogic 12.2.1 managed server access.log not updating