Narzędzia Net Admina: Nie masz serwera FTP – napisz go sobie sam

ftpservericonKolejne ćwiczenie polega na opracowaniu i uruchomieniu serwera FTP. Rzecz to praktyczna, bo przy pomocy usługi FTP można na przykład szybko i sprawnie zapisać kopie zapasowe konfiguracji urządzeń sieciowych w jakimś repozytorium w systemie plików serwera. Własny serwer FTP przydaje się wtedy, gdy nie ma pod ręką gotowego rozwiązania. W takiej sytuacji, jak zwykle z nieodzowną pomocą przychodzi Python. Przy jego pomocy, pisząc zaledwie i dosłownie kilka wierszy kodu źródłowego, możemy mieć w pełni funkcjonalne rozwiązanie działające dosłownie na każdym urządzeniu, łącznie z tabletem czy smartfonem.

Tego typu rozwiązania okazują się przydatne także wtedy, gdy w trakcie przeprowadzania testów penetracyjnych, trzeba w fazie poeksploatacyjnej wstrzyknąć do zaatakowanego hosta kod serwera, by móc stamtąd wyprowadzić większy wolumen danych.

Skrypt, który napisałem jest bardzo prosty do uruchomienia z poziomu linii poleceń powłoki systemu operacyjnego:

~janusz $ ftpd.py --help

  ___ _____ ___
 | __|_   _| _ \  ___ ___ _ ___ _____ _ _
 | _|  | | |  _/ (_-<\/-_) '_\ V / -_) '_|
 |_|   |_| |_|   /__/\___|_|  \_/\___|_|
  ________________ by Janusz Nawrat (2015)                                      

  Press Control-C and wait patiently to stop
  server gracefuly.

usage: ftpd.py [-h] [--version]

Simple FTP Server

optional arguments:
  -h, --help  show this help message and exit
  --version   show program's version number and exit

Dopisałem do niego kod umożliwiający uwierzytelnianie użytkowników w oparciu o loginy i hasła z Windows. Nic oczywiście nie stoi na przeszkodzie, by dopisać również kod pozwalający na jego integrację z innymi bazami poświadczeń tożsamości, w tym LDAP, AD, Unix etc.

Po uruchomieniu, na w oknie konsoli otrzymujemy sporo informacji o statusie operacji serwera, podczas realizacji połączeń od klientów.

Wygląda to tak:

~janusz $ ftpd.py
...
starting FTP server on 0.0.0.0:21, pid=4772 <<<
[I 15-10-11 01:08:24] poller: 
[I 15-10-11 01:08:24] masquerade (NAT) address: None
[I 15-10-11 01:08:24] passive ports: None
[I 15-10-11 01:08:34] 127.0.0.1:49934-[] FTP session opened (connect)
[I 15-10-11 01:08:39] 127.0.0.1:49934-[] USER 'anonymous' failed login.
[I 15-10-11 01:08:39] 127.0.0.1:49934-[] FTP session closed (disconnect).
[I 15-10-11 01:08:40] 127.0.0.1:49936-[] FTP session opened (connect)
[I 15-10-11 01:08:40] 127.0.0.1:49936-[User] USER 'User' logged in.
[I 15-10-11 01:08:40] 127.0.0.1:49936-[User] CWD C:\Users\User 250
[I 15-10-11 01:08:40] 127.0.0.1:49936-[User] FTP session closed (disconnect).
[I 15-10-11 01:08:52] 127.0.0.1:49940-[] FTP session opened (connect)
[I 15-10-11 01:08:57] 127.0.0.1:49940-[] USER 'anonymous' failed login.
[I 15-10-11 01:08:57] 127.0.0.1:49940-[] FTP session closed (disconnect).
[I 15-10-11 01:08:58] 127.0.0.1:49942-[] FTP session opened (connect)
[I 15-10-11 01:08:58] 127.0.0.1:49942-[User] USER 'User' logged in.
[I 15-10-11 01:08:58] 127.0.0.1:49942-[User] CWD C:\Users\User\Downloads 250
[I 15-10-11 01:08:59] 127.0.0.1:49942-[User] FTP session closed (disconnect).
[!] Received signal: 2. The server will be stopped
[*] Server stopped
[I 15-10-11 01:13:39] >>> shutting down FTP server (1 active fds) <<<

Oto kod źródłowy serwera:

#!/usr/bin/env python
from pyftpdlib import servers
from pyftpdlib.handlers import FTPHandler, ThrottledDTPHandler
from pyftpdlib.authorizers import WindowsAuthorizer
import argparse, sys, signal

def signal_handler(signum, stack):
    print "[!] Received signal: %d. The server will be stopped" % signum
    print "[*] Server stopped"
    sys.exit(1)

banner = '''                                    
  ___ _____ ___                           
 | __|_   _| _ \  ___ ___ _ ___ _____ _ _ 
 | _|  | | |  _/ (_-<\/-_) '_\ V / -_) '_|
 |_|   |_| |_|   /__/\___|_|  \_/\___|_|  
  ________________ by Janusz Nawrat (2015)                                         

  Press Control-C and wait patiently to stop
  server gracefuly.
'''
print banner
parser = argparse.ArgumentParser(description="Simple FTP Server")

parser.add_argument('--version', action='version', version='%(prog)s 1.0')

options = parser.parse_args()

signal.signal(signal.SIGINT, signal_handler)

try:
    authorizer = WindowsAuthorizer()
    handler = FTPHandler
    handler.authorizer = authorizer
    addr_and_port = ("0.0.0.0", 21)
    server = servers.FTPServer(addr_and_port, handler)
    server.serve_forever()
except:
    print "[!] An error occurred and program will shut down"
    sys.exit(1)

Zachęcam , jak zawsze, do eksperymentowania z kodem i jego dalszego rozwoju. Proponuję ćwiczenie polegające na integracji skryptu z LDAP-em i implementacji tunelowania ruchu z wykorzystaniem protokołu TLS.

Informacje Janusz Nawrat
Just ordinary man who likes thinking...

One Response to Narzędzia Net Admina: Nie masz serwera FTP – napisz go sobie sam

  1. Stan pisze:

    Serdecznie pozdrawiam Panie Januszu. Wspaniala wiedza i milo spotkac kogos kto lubi myslec. To dzis malo popularne. S

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

TOMASZ WEŁNA

artysta grafik | wykładowca

PRACOWNIA OKO

Szkoła Rysunku Malarstwa i Grafiki DR TOMASZA WEŁNY | KRAKÓW | Plac Matejki 10 | tel 691 81 75 74

Piękno neurobiologii

Blog Jerzego Vetulaniego

Teoria muzyki, zasady muzyki, podstawy muzyki

Teoria muzyki, zasady muzyki, podstawy muzyki - czyli to co każdy amator muzyki wiedzieć powinien :)

Personal Development & Inspirations

Przemyślenia i refleksje, którymi warto się podzielić (blog by Janusz Nawrat)

Business IT Cooperation Platform

Biznes i IT - dwa światy, które muszą współdziałać

%d bloggers like this: