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

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

白龍 Lv3

甚麼是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

主動模式的意思就是對於伺服器端在傳輸資料時,是由他主動把資料的封包請求發送給你,而不是你對伺服器去請求檔案,流程是這樣的

  1. === 三次交握 ===

  2. 用戶端請求從伺服器端下載某個檔案
    傳送Header內容

  • Command Port Using : 你好伺服器我是Port AAAA
  • Data getting : 我想要從伺服器下載 FFFF 資料
  • Data Port Using : 我的Data Port是 BBBB
  1. 伺服器接收到訊息
    好的我接收到了 (沒有其他資訊)

  2. 伺服器開始傳送Data
    傳送Header

    • Client Data Port transfer : 你好用戶Port BBBB
    • Data to Transfer : 我要開始傳送 FFFF
  3. === 四次交握結束 ===

現在我們再去分析一下這個過程中發生了甚麼事情,我們看到地2步,可以看到是直接由伺服器去發送資料,唯一跟Client確認的動作就只有確認要的資料、Port等,傳送完畢後就直接結束了

那我們接著來看看被動模式

被動模式 Passive Mode

與主動模式不同是在發送Command Data時不會包含Data port,這個過程被延長到要開始接收Data時才會再次發送一個封包,流程是這樣的

  1. === 三次交握 ===

  2. 用戶端請求從伺服器端下載某個檔案
    傳送Header內容

  • Command Port Using : 你好伺服器我是Port AAAA
  • Data getting : 我想要從伺服器下載 FFFF 資料
  • FTP Mode : 我的傳輸模式是 PASV
  1. 伺服器接收到訊息並回復
    回復Header內容

    • Data Port : 好的你的檔案已經幫你準備好在 Data port BBBB
    • Data getting : 檔案內容是 FFFF
  2. 用戶端請求從伺服器端下載檔案
    傳送Header內容

  • Server Data Port Using : 你好伺服器Data Port BBBB
  • Data Port Using : 我的Data Port 是 CCCC
  • Data getting : 請傳輸給我檔案 FFFF
  1. 伺服器開始傳送Data
    傳送Header

    • Transfer Data : 好的開始傳輸檔案 FFFF
  2. === 四次交握結束 ===

所以可以看到在伺服器發送檔案前,伺服器會先告訴用戶他把用戶要的資料放在哪一個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的表頭…如下圖

圖

看起來很少,但其實這兩個欄位可以運用的東西卻很多,但不用擔心因都很好理解,那就看一下下面的介紹吧

  • Access Control Commands

意義 存取控制指令 (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
  • Reply Codes

這個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的傳輸流程

  1. === 三次交握 ===

  2. 用戶端請求從伺服器端加載網頁文字
    傳送Header內容

  • Data getting : 我想要從伺服器載入 index.html
  1. 伺服器開始傳送檔案
    傳送Header內容
  • Data to Send : 我要開始傳送 index.html
  1. === 四次交握結束 ===

關於 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)
  • 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
請求類別:
| GET / HTTP/1.1
Header:
| Host: www.google.com
| Connection: keep-alive
| Upgrade-Insecure-Requests: 1
| User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36
| Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
| DNT: 1
| Accept-Encoding: gzip, deflate
| Accept-Language: zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7
空白行:
| 換行
內容主體:
| 其他附加資訊

當網站回覆你妳發送的請求的標準格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
回覆類別:
| HTTP/1.1 302 Found
Header:
| Cache-Control: private
| Content-Type: text/html; charset=UTF-8
| Referrer-Policy: no-referrer
| Location: http://www.google.com.tw/?gfe_rd=cr&dcr=0&ei=WfCLWtaoK7P48Afhj6nIBw
| Content-Length: 272
| Date: Tuesday, February 20, 2018 18:21:22 GMT
空白行:
| 換行
內容主體:
| <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
| <TITLE>302 Moved</TITLE></HEAD><BODY>
| <H1>302 Moved</H1>
| The document has moved
| <A HREF="http://www.google.com.tw/?gfe_rd=cr&amp;dcr=0&amp;ei=WfCLWtaoK7P48Afhj6nIBw">here</A>.
| </BODY></HTML>`

如何發送和抓取封包