FTP_TLS adding TLS support to FTP

#Code4Sec Week #Day7 #NEIS0736 #NECS0736

FTP - Clear-text protocols

FTP (File Transfer Protocol) คือ Protocol ที่ออกแบบมาเพื่อใช้ในการรับส่งไฟล์ระหว่าง Client และ Server โดยจะมี port ที่ใช้งานอยู่ 2 port คือ port 20 ใช้ในการรับ-ส่งข้อมูล (data channel) ส่วนอีก port คือ port 21 ใช้ในการควบคุมหรือส่งคำสั่ง FTP (control channel) เช่น ตรวจสอบการเข้าถึงโปรแกรมจากผู้ใช้งาน เป็นต้น และในปัจจุบัน ผู้ให้บริการ service ต่างๆ โดยส่วนใหญ่มักจะให้บริการแลกเปลี่ยนไฟล์ผ่าน FTP Server เพราะการติดตั้งระบบและการบริหารจัดการไฟล์ทำได้ง่าย

แต่ FTP เป็นโพรโตคอลที่รับ-ส่งข้อมูลโดยไม่มีการเข้ารหัสลับ จึงทำให้ข้อมูลที่รับ-ส่ง เช่น Username หรือ Password สามารถถูกดักจับ (Sniff) จากผู้ไม่ประสงค์ดีได้

ซึ่งโปรโตคอลเหล่านี้ไม่ปลอดภัยเนื่องจากทำให้แอปพลิเคชั่นเกิดความเสี่ยงต่างๆ เช่น

วิธีการแก้ไขนั้นควรเปลี่ยนมาใช้ Protocol สำหรับแลกเปลี่ยนข้อมูลที่มีการเข้ารหัสข้อมูลที่รับ-ส่งเสมอ ซึ่งมีโพรโทคอลที่ถูกออกแบบมาเพื่อแก้ปัญหาดังกล่าว คือ FTPS

ftplib — FTP protocol client

FTP Module กำหนด FTP Class และรายละเอียดที่เกี่ยวข้อง เราสามารถใช้งาน module นี้เพื่อเขียนโปรแกรม Python ที่ทำงาน FTP แบบอัตโนมัติต่างๆ เช่น การทำ FTP mirroring นอกจากนี้ยังใช้งานร่วมกับ urllib.request เพื่อจัดการ URL ที่ใช้ FTP ได้อีกด้วย สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ FTP (File Transfer Protocol) ดูข้อมูลได้ที่ RFC 959

FTP Class

class ftplib.FTP(host=’’, user=’’, passwd=’’, acct=’’, timeout=None, source_address=None, *, encoding=’utf-8’)

ตัวอย่าง FTP Objects

FTP.login(user=’anonymous’, passwd=’’, acct=’’)

Log in ด้วย username และ password ที่ระยุ

FTP.sendcmd(cmd)

ส่งคำสั่งไปยัง FTP Server และตอบกลับ response รูปแบบ string

FTP.transfercmd(cmd, rest=None)

ทำการ transfer ข้อมูลผ่่าน data connection

Add TLS support to FTP

class ftplib.FTP_TLS(host=’’, user=’’, passwd=’’, acct=’’, keyfile=None, certfile=None, context=None, timeout=None, source_address=None, *, encoding=’utf-8’)

FTP subclass เป็นการเพิ่มการสนับสนุน TLS ให้กับ FTP ตามที่อธิบายไว้ใน RFC 4217 เชื่อมต่อกับ port 21 เพื่อรักษาความปลอดภัย FTP control connection ก่อนที่จะทำการพิสูจน์ตัวตน สำหรับการรักษาความปลอดภัยของ data connection ต้องถูกระบุเรียกใช้ prot_p () method และ context คือ ssl.SSLContext object ที่อนุญาตให้รวม SSL configuration options, certificates และ private keys ไว้ในโครงสร้างเดียวกัน

FTP_TLS Objects

FTP_TLS class เป็นการ inherits มาจาก FTP โดยมีการเพิ่ม object ไว้ดังนี้:

FTP_TLS.ssl_version

SSL version ที่ต้องการใช้งาน (defaults to ssl.PROTOCOL_SSLv23).

FTP_TLS.auth()

ตั้งค่า secure control connection โดยสามารถใช้งาน TLS หรือ SSL ขึ้นอยู่กับการระบุในแอตทริบิวต์ ssl_version

FTP_TLS.ccc()

เปลี่ยนค่า control channel ให้กลับเป็นแบบ plaintext ใช้ประโยชน์จากไฟร์วอลล์ที่รู้วิธีจัดการ NAT ด้วย non-secure FTP โดยไม่ต้องเปิดพอร์ตถาวร

FTP_TLS.prot_p()

ตั้งค่า secure data connection.

FTP_TLS.prot_c()

ตั้งค่า data connection แบบ clear text

ตัวอย่างการใช้งาน FTP_TLS

from ftplib import FTP_TLS

ftps = FTP_TLS(host='ftp.pureftpd.org')
print(ftps.login())
ftps.prot_p()  # Set up secure data connection
print(ftps.retrlines('LIST'))

Result :

/home/missis/PycharmProjects/code4sec_python/venv/bin/python /home/missis/PycharmProjects/code4sec_python/main.py
230 Anonymous user logged in
drwxr-xr-x   18 1000       1008             1024 Jul 21  2016 .
drwxr-xr-x   18 1000       1008             1024 Jul 21  2016 ..
lrwxr-xr-x    1 1000       20                 20 Jun 20  2011 6jack -> pure-ftpd/misc/6jack
...
drwx--x--x    4 1000       1008              512 Jan 11 01:30 tmp
lrwxr-xr-x    1 0          1008               15 Feb  1  2006 ucarp -> pure-ftpd/ucarp
226-Options: -a -l 
226 40 matches total

Reference:

Author:

Ekawut Chairat