
資安筆記 - 從理論到實作II:FTP與HTTP封包抓取與分析

甚麼是FTP
FTP簡介
FTP的全名是 File Transfer Protocol,簡單來說就是專門用來傳輸檔案的傳輸協定,並且是網路上很古老、開放、簡單的資料傳輸協定
運作原理及架構
FTP使用用的是主從模式架構,甚麼是主從模式架構呢,就是表示這個傳輸協定必須要同時有Server還有Client才能運作的傳輸協議
在FTP傳述資料時總共會使用到兩個Port,分別為
Data Port 資料傳輸端口
Data port就是字面上的意思,是用來傳輸主體檔案的
在FTP Server端預設使用的接口是20,當然也可以根據軟體自行去設定Command Port 指令接口
Command Port的作用就是建立連線時會用到的Port,就像是在連線遠端的FTP有可能會需要輸入主機IP、使用者名稱、密碼等資訊,在傳輸登入資料的過程中就會使用這個接口傳輸
在FTP Server中使用的接口是Port 21
Client Port?
剛剛都沒有提到在Client端使用的接口,在用戶端使用的接口都是Port 1024以上隨機的Port
FTP傳輸流程
FTP使用的傳輸協定必須需是TCP連線,所以在開始傳輸前都需要進行三次交握的動作,三次交握我就不再說了前面有講解很細,流程都大同小異
那三次交握完後就要開始傳輸實體檔案了,那這個傳輸的模式又被分為兩種傳輸模式,分別為主動模式和被動模式
主動模式 Active Mode
主動模式的意思就是對於伺服器端在傳輸資料時,是由他主動把資料的封包請求發送給你,而不是你對伺服器去請求檔案,流程是這樣的
=== 三次交握 ===
用戶端請求從伺服器端下載某個檔案
傳送Header內容
- Command Port Using : 你好伺服器我是Port
AAAA
- Data getting : 我想要從伺服器下載
FFFF
資料 - Data Port Using : 我的Data Port是
BBBB
伺服器接收到訊息
好的我接收到了 (沒有其他資訊)伺服器開始傳送Data
傳送Header- Client Data Port transfer : 你好用戶Port
BBBB
- Data to Transfer : 我要開始傳送
FFFF
- Client Data Port transfer : 你好用戶Port
=== 四次交握結束 ===
現在我們再去分析一下這個過程中發生了甚麼事情,我們看到地2步,可以看到是直接由伺服器去發送資料,唯一跟Client確認的動作就只有確認要的資料、Port等,傳送完畢後就直接結束了
那我們接著來看看被動模式
被動模式 Passive Mode
與主動模式不同是在發送Command Data時不會包含Data port,這個過程被延長到要開始接收Data時才會再次發送一個封包,流程是這樣的
=== 三次交握 ===
用戶端請求從伺服器端下載某個檔案
傳送Header內容
- Command Port Using : 你好伺服器我是Port
AAAA
- Data getting : 我想要從伺服器下載
FFFF
資料 - FTP Mode : 我的傳輸模式是
PASV
伺服器接收到訊息並回復
回復Header內容- Data Port : 好的你的檔案已經幫你準備好在 Data port
BBBB
- Data getting : 檔案內容是
FFFF
- Data Port : 好的你的檔案已經幫你準備好在 Data port
用戶端請求從伺服器端下載檔案
傳送Header內容
- Server Data Port Using : 你好伺服器Data Port
BBBB
- Data Port Using : 我的Data Port 是
CCCC
- Data getting : 請傳輸給我檔案
FFFF
伺服器開始傳送Data
傳送Header- Transfer Data : 好的開始傳輸檔案
FFFF
- Transfer Data : 好的開始傳輸檔案
=== 四次交握結束 ===
所以可以看到在伺服器發送檔案前,伺服器會先告訴用戶他把用戶要的資料放在哪一個Port中,接著用戶會告訴伺服器自己使用的Data Port,最後伺服器才會開始傳輸檔案
防火牆與FTP
那為什麼會有這兩種不同的模式出現呢,其中一個原因就是防火牆
先來說說防火牆的功能,防火牆主要的功能就是用來隔絕未知的封包,不讓外部的網路可以連線進來
那在回到FTP的主動模式有提到說是「伺服器主動傳送資料給你」,這個動作就會被防火牆擋住,講細節一點就是因為傳送登入資訊的Port和Data的不一樣,今天在你下載一個檔案前建立的連線是使用Command Port,但是傳送資料的卻是Data port,但是防火牆並不知道有Data port的存在,所以當Data port資料本題要傳送時就會被擋
接著我們看到被動模式,可以看到在Data本身傳送前用戶端還會與伺服器建立一個Data Port的連線,這樣電腦的擋火牆就可以判斷說Data Port是一個安全的Port,可以讓資料傳送進來
表頭
講完FTP的運作流程後,就要來看看FTP的表頭到底在傳送甚麼東西,我們都知道FTP是使用TCP協議傳送資料的,那TCP的表頭之前有講過了所這邊就不說了,這邊要看的是FTP的表頭…如下圖
看起來很少,但其實這兩個欄位可以運用的東西卻很多,但不用擔心因都很好理解,那就看一下下面的介紹吧
意義 | 存取控制指令 (protocol) | 輔助工具或套件 (ftp.exe) |
---|---|---|
帳號 | USER | user |
密碼 | PASS | user 輸入完後輸入 |
切換目錄 | CWD | cd |
列出目錄 | LIST | dir |
下載檔案 | RETR | get |
上傳檔案 | STOR | put |
刪除檔案 | DELE | delete |
建立目錄 | MKD | mkdir |
移除目錄 | RMD | rmdir |
連線狀態 | STAT | status |
離開 | QUIT | bye |
這個code包含的就更多了,從100到700都有,但是好在都是用100的倍數去初分大概的意思
回覆碼 | 說明 | 範例代碼 |
---|---|---|
1XX | 執行狀態 | 150… |
2XX | 成功 | 220, 226, 230, 231, 250… |
3XX | 已接受,但須提供更多資訊 | 331, 332… |
4XX | 客戶端要求不接受 | 425, 426… |
5XX | 未登入、要求有誤、語法錯誤 | 501, 530… |
# 這些代碼跟其他網路請求用的代碼一樣,例如 https API 的 header 也會顯示
抓取FTP封包
綜合以上的觀念我們現在可以來抓取FTP傳輸時的封包了,跟上一篇文章一樣先打開我們的WireShark還有終端機
那因為我們在使用FTP伺服器時需要一個伺服器,這個伺服器可以是你的另外一個電腦或是桌機,至於如何架設的部分我就不細說自己去查教學:D
教學代整理
這個我到學校在寫,進度獎超快
- how to open ftp
- how to write filter
- how to use ftp command - open
- see wireshark data
- how ot use ftp command - close
- see ack thing
甚麼是HTTP
HTTP 簡介
我們之前有稍微帶過HTTP所以大家應該都不陌生。我們常常在網頁中看到他在Domain的前方,但是你可能發現是HTTP”S”,兩者的差別就是有加密和沒有加密,也可以看成是前面提到的加密封包
HTTP的全名叫做 Hyper Text Transfer Protocol,他在早期的網路中是被用來傳輸存取資料庫使用,因為當初被設計他的目的就是一種簡約的要求和回覆技術,根本沒有想到到了現在還可以傳送圖片影片等,這項技術的發明組織是「歐州核子研究組織」,有興趣的可以自己去查查看
HTTP同樣也是使用主從模式架構,這個是甚麼意思可以往前看,那跟FTP不同的是他同時可以使用TCP和UDP,並且他的Server Port是使用80,除這兩個之外使用HTTP還有以下特性
- 傳輸內容均以明碼 ( plaintext, cleartext ) 在網路上傳輸 (不是https)
- 沒有存取驗證機制
- 大多情況需依賴瀏覽器翻譯並呈現於螢幕
- 非永久連線:請求或回覆完畢立即結束連線 ( Connection: keep-alive 例外 )
- 無狀態 ( Stateless ):伺服器無法辨別不同客戶端
- 完整性:使用 TCP 協議 ( Port 80 ),確保收送資料的完整
- 彈性化:可搭配 CGI、ASP、PHP、JAVA… 等,達到動態網頁內容
- 安全性:可搭配 SSL / TLS… 等協定,加強網路安全 ( 加密內容 )
這邊要說明一下甚麼是永久連線,可以想像一般瀏覽一個網頁,瀏覽器的責任就是負責把網頁內容加載完成就結束,意思就是說我的http只負責把網頁要顯示的文字、框架、顏色等傳過來,剩下的圖片你們自己處理,那剩下的這些圖片是一個檔案連結,就變成說我又要發送一個請求到伺服器要求這個圖片
那假設今天這個網頁有100張圖片呢,就變成用戶端要建立100次連線,每次連線都要進行三次交握和四次交握結束,為了解決這個封包浪費請求就出現了keep-alive,這個意思就是說讓瀏覽器加載完頁面後不會立即斷開連線,會等待一些時間讓圖片加載完畢才會斷開連線,這樣就省去了重複建立三次交握和四次交握結束的那些過程
HTTP的傳輸流程
=== 三次交握 ===
用戶端請求從伺服器端加載網頁文字
傳送Header內容
- Data getting : 我想要從伺服器載入
index.html
- 伺服器開始傳送檔案
傳送Header內容
- Data to Send : 我要開始傳送
index.html
- === 四次交握結束 ===
關於 HTTP
HTTP 的歷史與版本
……
HTTP/0.9 (1991)
只有 GET、只能傳遞 HTML…HTTP/1.0 (1996)
百花齊放,沒有共識 (各自為政) 的統一定義…HTTP/1.1 (1997 - 1999)
統一定義與操作方式,保留許多擴充空間…HTTP/2.0 (2012 - 2015)
源自 Google 發表的 SPDY,高度相容 HTTP/1.1,提升速度、減少延遲…HTTP/3.0 (2013 - 2018)
源自 Google 發表的 QUIC,相近 HTTP/2.0,但使用 UDP 傳輸…
HTTP的不同狀態
有使用API的人一定都看過這個是甚麼,但是像我就只知道部分的意思,知道到要如何用API但是不知道它的運作原理,所以在這邊就大概認識每個狀態的意思
Method | Description |
---|---|
GET* | 取得指定資源 |
HEAD | 取得指定資源 (但 Server 只回傳狀態、表頭) |
POST* | 送出 (修改) 或建立 (新增) 資料 |
PUT* | 上傳內容於指定資源 |
DELETE | 刪除資源 |
TRACE | 回傳請求資源狀態 (測試、診斷用) |
OPTIONS | 詢問 Server 支援那些操作方式 |
CONNECT | 透過 Proxy 傳輸連線 |
PATCH | 更新屬性 |
HTTP的不同代碼
再載入完一個網頁後都會有一個狀態,有可能是成功、有可能失敗,除了兩者以外還有其他的狀態
狀態碼範圍 | 描述 | 範例 |
---|---|---|
1XX | 訊息回應 / Informational responses | 100… |
2XX | 成功 / Success | 200… |
3XX | 重新導向 / Redirection | 302, 304… |
4XX | 客戶端錯誤 / Client errors | 400, 401, 403, 404… |
5XX | 伺服器端錯誤 / Server errors | 500, 502, 503, 504… |
HTTP的表頭
主流的HTTP一樣是使用TCP傳輸,但是重點一樣是在HTTP本生的Header上,以下是http的表頭
Request/Responce Line
- Request
這個就是表示HTTP發送的狀態,最常用的就是GET,有可能是get圖片、get文字影片等 - Responce
這個就是表示HTTP回覆的狀態,有可能成功(200),有可能失敗(400, 500)
- Request
Header
這個就很多了,是瀏覽器需要處理最複雜的部份- Host:表示主機網站,因為一個伺服器可能Host多個網站,所以表示我要的是哪一個網站
- Date:日期時間
- Connection:需不需要保持連線
- Accept:表示用戶端可接受的檔案格式,可能是Html/Xhtml/text,就是你的需求
- Accept-Encoding:資料傳送時需不需要壓縮,可以把檔案變小減少傳輸時間,但是這個功能決定於伺服器是否有支持
- Accept-Language:用戶端希望傳送的語言
- User-Agent:用戶端瀏覽器,但是有可能亂給
- Content-Lenght:只傳送過來的資料多大(一個封包)
- Content-Type:這個封包的檔案類型、文字
# 當然不止這個,想要看更多可以點這裡
Empty Line
只是用來區隔Body和Header用Body
這個就是內容本體了,內容就沒有格式了
HTTP的範例標準格式
當你按下一個網站時,從你電腦發出的HTTP連線請求是這樣子的
1 | 請求類別: |
當網站回覆你妳發送的請求的標準格式
1 | 回覆類別: |