10 Nisan 2014 Perşembe

FTP Sunucu Servisi Dosya/Dizin Tespit Çalışması

Gerek sistem yöneticileri için gerekse sızma testi uzmanları için ağ içerisindeki FTP sunucu servislerinin tespit edilerek içeriklerinin araştırılması gerekebilmektedir. Windows ağlarındaki paylaşımları tespit ederek belirtilen yapılandırma dosyasına göre veri taraması gerçekleştiren projeye https://github.com/galkan/depdep adresinden erişim sağlanabilir. Bunun için öncelikle gerekli ağ içerisindeki FTP sunucu servisleri için keşif çalışması gerçekleştirilmelidir. Bu amaçla en çok kullanılan yazılımlardan olan nmap ile ön tanımlı 21/tcp portu için tarama gerçekleştirerek mecut FTP sunucu servisleri için keşif adımı gerçekleştirilmelidir. Bu işlem 192.168.1.0 ağı için aşağıda gösterildiği şekilde gerçekleştirilebilir.

# nmap -n -PN -sS -p 21 --open 192.168.1.0/24

Bu amaçla aşağıda gösterilen betik kullanılabilir. FTP servisi için gerekli modül olarak ftputil kullanılmıştır. Daha fazla ayrıntı için https://pypi.python.org/pypi/ftputil/2.2.3 adresine göz atılabilir.

#!/usr/bin/python

try:
       import sys
       import ftplib
except ImportError,e:
        import sys
        sys.stdout.write("%s\n" %e)
        sys.exit(1)


class FTP:
  result = []

  def __init__(self):
    """
     Create instance for ftp ...
    """

    self.ftp = ftplib.FTP()


  def is_directory(self, ftp, directory):
    """
     Determine whether given parameter is directory or not ...  
    """

    try:
      ftp.cwd(directory)
    except:
            return False

    ftp.cwd("..")
    return True



  def traverse(self, ftp):
    """
     Traverse ftp and add results to the result list ...   
    """

    dirs = ftp.nlst()
        for item in (path for path in dirs if path not in ('.', '..')):
      if self.is_directory(ftp, item):
              try:
                   ftp.cwd(item)
                   self.traverse(ftp)
                   ftp.cwd('..')
              except Exception, e:
          pass

      else:
        ret = "%s/%s"% (ftp.pwd(), item)
        FTP.result.append(ret)



  def run(self, ip_addr, port, timeout, username = None , passwd = None):
    """
     Run ftp for given ip address and credentials ...
    """ 

    try:
      self.ftp.connect(ip_addr, port , timeout)
    except:
      return False
  
 
    try:
      if username and passwd is not None:
        self.ftp.login(username, passwd)
      else:
        self.ftp.login()
    except:
      return  False   

    self.ftp.set_pasv(True)
    self.ftp.cwd("/")
  
        self.traverse(self.ftp)

    return FTP.result


if __name__ == "__main__":
 ip = "192.168.37.37"
 port = 21
 timeout = 3
 username = "user"
 password = "password"

 ftp = FTP()
 for val in ftp.run(ip, port, timeout, username, password):
  print val




Betik ftp_traversing.py isimli dosyaya kaydediliğ aşağıdaki şekilde çalıştırıldığıdan elde edilecek çıktı aşağıdakinne benze şekilde olmaktadır.

# ./ftp_traversing.py
/dizin1/dizin2/dosya1
/dizin1/dizin3/dosya2
/dizin4/dizin5/dosya3
/dizin4/dizin6/dosya4
/dizin4/dizin7/dosya5
/dizin8/dizin9/dosya6




0 yorum :

Yorum Gönder