如何透過 wireshark 捕獲 C# 上傳的圖片

一線碼農發表於2023-11-16

一:背景

1. 講故事

這些天計劃好好研究下tcp/ip,以及socket套接字,畢竟工控中設計到各種互動協議,如果只是模模糊糊的瞭解,對分析此類dump還是非常不利的,而研究協議最好的入手點就是用抓包工具 wireshark,廢話不多說,這篇透過 wireshark 提取一個小圖片作為入手。

二:wireshark 圖片抓包

1. 捕獲圖片

為了方便演示,我們就用最簡單的 http 上傳圖片的方式,客戶端程式碼如下:


<form method="post" action="/Home/Upload" enctype="multipart/form-data">
    <input type="file" name="file" />
    <button type="submit">Upload</button>
</form>

接下來是server端程式碼,用 chatgpt 吐出來的程式碼做了一點簡單修改。


    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        private readonly IWebHostEnvironment _env;

        public HomeController(IWebHostEnvironment env)
        {
            _env = env;
        }

        [HttpPost]
        public async Task<IActionResult> Upload(IFormFile file)
        {
            if (file == null || file.Length == 0)
            {
                return BadRequest("Please select a file to upload.");
            }

            // 生成唯一的檔名
            var fileName = Guid.NewGuid().ToString() + Path.GetExtension(file.FileName);

            // 拼接檔案儲存路徑
            var filePath = Path.Combine(_env.WebRootPath, "uploads", fileName);

            // 儲存檔案到磁碟
            using (var stream = new FileStream(filePath, FileMode.Create))
            {
                await file.CopyToAsync(stream);
            }

            return Ok("File uploaded successfully.");
        }
    }

接下來將 asp.net core 部署在虛擬機器上,修改埠為80,appsettings.json 修改如下:


{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "Kestrel": {
    "Endpoints": {
      "Http": {
        "Url": "http://0.0.0.0:80"
      }
    }
  }
}

執行之後,一切正常,截圖如下:

2. wireshark 捕獲

這裡我們將 wireshark 部署在 server (192.168.25.133)端,不過在開啟之前有兩點要注意:

  • 尋找到你需要採集流量包的網路卡,比如我這裡的 Ethernet0
  • 設定一個捕獲過濾器,這樣就不會把你的 wireshark 採集介面給卡死。

參考截圖如下:

啟動捕獲後,在首頁開始上傳一個 1M左右的圖片,在 wireshark 中可以看到這 1M 的圖片被切割成了 791 個 tcp segment 傳送。

接下來在 上圖中的 Http 請求上點選右鍵,選擇 Follow -> TCP Stream ,會自動開啟本次 http 傳輸的全部內容,接下來記得做下面三個選擇:

  • 選擇正確的資料包流向
  • 資料格式為原始的Raw格式
  • Save as 儲存到本地

詳情截圖如下:

根據 http 上傳圖片的格式,把內容中換行符之前和之後的二進位制都去掉,而這個換行符的二進位制表示為 0D0A,接下來開啟 winhex,刪掉 0D0A 之前和之後的所有多餘字元。截圖如下:

  1. 之前

  1. 之後

如果大家有點懵,可以觀察一個正確的 PNG 在 WinHex 上的表現,選中多餘的二進位制之後做一個 delete 操作,然後重新命名為 test.png,截圖如下:

哈哈,一張圖片映入眼簾,打完收工!

三:總結

wireshark 還是非常強大有意思的,相比呈現工具更多的還是需要對協議的理解,希望能對dump分析提供一些原料動力!

圖片名稱

相關文章