FTP
Az FTP, azaz File Transfer Protocol, egy alkalmazás rétegbeli protokol, melyet fájlok átvitelére találtak ki. Egy korai változata már 1971-ben megjelent [RFC114] néven. A mostani szabványt az [RFC959] írja le, mely 1985-ben készült. Azóta számos kiegészítése született, de maga az FTP szabvány azóta nem változott.
Tartalomjegyzék |
1 Működése
Az FTP protokoll kliens-szerver architektúrájú. A szerver általában a 21-es TCP porton fogadja a klienseket. Az itt felépülő kapcsolat lesz a "parancskapcsolat". Ezen a kapcsolaton csak a parancsok és szerver válaszai mennek, a konkrét adatok, a fájlok tartalma egy külön adatkapcsolaton fog továbbítódni. Az adatkapcsolat felépítéséről később még lesz szó.
2 Parancsok
A teljesség igénye nélkül néhány gyakrabban előforduló parancs és jelentésük:
- USER
- A (parancs)kapcsolat feléptése után a kliens ezzel mondja meg, hogy melyik felhasználó csatlakozott
- PASS
- A felhasználónév megadása után ezzel lehet megadni a jelszót
- LIST
- Könyvtárlistázás
- DELE
- (Delete) Fájl törlése
- RETR
- (Retrieve) A kliens szemszögéből egy fájl letöltése
- STOR
- (Store) A kliens szemszögéből egy fájl feltöltése
- APPE
- (Append) Egy feltöltés folytatása (fájlhoz hozzáfűzés)
- REST
- (Restart) Egy letöltés folytatása
- RNFR
- (Rename from) Az itt megadott fájlt átnevezi/áthelyezi az RNTO parancsban megadottra
- RNTO
- (Rename to) A RNFR parancsban megadott fájlt átnevezi/áthelyezi az itt megadottra
- MKD
- (Make directory) Könyvtár létrehozása
- CWD
- (Change working directory) Könyvtárváltás
- PWD
- (Print working directoy) Aktuális könyvtár lekérdezése
- ABOR
- Az adatcsatornán éppen folyó fájlátvitel (aszinkron) megszakítása
3 Szerver válaszok
A HTTP-ben, POP3-ban használt válaszokhoz hasonlóan a szerver itt is egy 3 jegyből álló kódot küld válaszként, aminek az első számjegye meghatázorra a művelet sikerességét.
- 1xx
- Előzetes pozitív válasz (elkezdte végrehajtani, eddig OK, de még nincs kész)
- 2xx
- Siker
- 3xx
- Közbenső pozitív válasz (a felhasználónak további parancsot kell kiadnia, hogy a műveletet el tudja kezdeni a szerver, pl. RNFR és RNTO, vagy USER és PASS)
- 4xx
- Ideiglenes hiba, a felhasználó újrapróbálkozhat a kéréssel
- 5xx
- Permanens hiba, nem érdemes újrapróbálkozni ugyanezzel a kéréssel
4 Aktív vs. passzív mód
A szerver szempontjából a kliens lehet aktív vagy passzív. Az aktív kliens tud kapcsolatot fogadni, a passzív nem.
Az aktív kliens egy PORT parancsot küld, melyben megad egy IP címet és egy portszámot. A szerver a 20-as TCP portjáról ide fog csatlakozni, és ezen az adatkapcsolaton fogja elküldeni vagy fogadni az adatokat.
A passzív kliens egy PASV parancsot küld, amire a szerver válaszol egy IP és portszám párossal, ahova a kliensnek kapcsolódnia kell. Ha ez megtörtént, akkor indulhat az adatátvitel.
5 FXP
A protokoll nem szabja meg, hogy a PORT parancsban milyen IP címet kell megadni, olyat írok oda, ami nekem jól esik. Ezt kihasználva egymásnak lehet ereszteni két FTP szervert úgy, hogy az "A" gépnek PASV parancsot küldök, a "B" gépnek pedig egy PORT parancsban elküldöm az "A" által visszaadott IP-t és portszámot. Az ötlet az, hogy a felhasználónak kis sávszélessége van, a szervereknek meg nagy, így két szerver között átvihetek gyorsan egy fájlt anélkül, hogy az a felhasználón keresztülmenne (kikerültük a szűk keresztmetszetet).
6 Defektek, hibák, hátrányok
- A protokollt eredetileg interaktívra tervezték, azaz, hogy a felhasználó majd kézzel pötyögi be a parancsokat és olvassa a válaszokat. Ezért a szabvány nem specifikálja a könyvtár listázás formátumát. Olvasni mindenki tud, de egy programból feldolgozni elég nehézkes: van-e fájlméret mező, van-e dátum mező, milyen sorrendben jönnek...
- Aktív módban a szervernek kapcsolódnia kell a kliensekhez. Erre nehéz jó tűzfalszabályt létrehozni.
- Aktív módban, akár kliens, akár szerveroldalon vagyunk, NAT használata esetén címfordítást kell végeznie az átjárónak, átírni az üzenetben az IP címet (és portszámot), hiszen a helyi hálózaton pl. 192.168.1.3 a címünk, de ebből a túloldal nem fog tudni hozzánk kapcsolódni. Ráadásul ha titkosított kapcsolaton megy az FTP, akkor ezt nem is tudjuk megtenni.
- A PORT paranccsal lehet port scannelni. Ha sikerült kapcsolódnia, akkor az adott port nyitva van, ha nem, akkor nincs. Védekezés: csak azt az IP címet fogadja el PORT parancsban, amin éppen folyik a parancskapcsolat. Ezzel megöltük az FXP lehetőségét.
- A PORT paranccsal lehet levelet küldeni. Feltöltünk a szerverre egy fájlt, ami egy levél küldéséhez szükséges SMTP parancsokat tartalmazza. A PORT parancsban egy SMTP szerver IP címét adjuk meg, portszámnak pedig a 25-öst. Az SMTP szerver fogadja a kapcsolatot, az FTP szerver pedig elküldi neki a fájlt, azaz elküldi az SMTP parancsokat. Védekezni FTP oldalról az előző pontban leírtaknak megfelelően.
- A PASV parancs kiadása utána a szerver vár egy kapcsolatra. Ha az eredeti kliens helyett egy támadó csatlakozik oda hamarabb, akkor a támadó tölthet fel fájlt / fogadhatja a letölteni kívánt fájlt. Természetesen az eredeti felhasználó nevével és jogosultságaival. Ehhez vagy le kell hallgatnunk a parancskapcsolatot vagy kitartóan próbálkozni a szerver összes portján, előbb-utóbb majd csak összejön. Védekezés az előző pontban leírtakhoz hasonlóan: csak onnan fogadunk el kapcsolatot, ahova a parancskapcsolat is szól. Ez megintcsak ellehetetleníti az FXP-t.