CURLを使ったUAの偽装

Webサーバ上には、接続したブラウザ情報が含まれるUA(ユーザエージェント)等が残ります。今回はWindowsからCURLコマンドを使用してUAの偽装を行います。

環境

 クライアント環境 OS Windows11 Home
       アプリ CURL 8.4(Windows標準アプリ)
 サーバ環境 OS Ubuntu 22.04
       Webサーバ Apache 2.4.52
   ※VMWareによる仮想サーバ環境

実験の準備

 ①サーバの準備と確認
  サーバ側では、Webサーバが起動していることが前提です。
  HTMLの公開領域に、次のテストファイルを配置します。

ファイル名 hello.html
<html>
<body>
 <h2>hello</h2>
</body>
</html>

  配置後、hello.htmlファイルのパーミッションを644に設定しました。
  ターミナルから次のコマンドを実行し、サーバのIPアドレス確認と、アクセスログが表示される ようにしておきます。

$ > hostname -I
    192.168.19.129  ← サーバのIPアドレスです
$ > tail -f /var/log/apache2/access.log

  ②クライアントからの接続確認
   適当なブラウザから
    http://192.168.19.129/test.html
  に接続し、画面上に
    hello
  と表示されていれば接続できています。
  ③サーバのターミナル上に

192.168.19.1 - - [18/Feb/2024:11:35:40 +0900] "GET /hello.html HTTP/1.1" 304 248 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36"

  等と表示されていれば準備完了です。
   上のログでは、
    11:35 に、クライアント(192.168.19.1)からHTML(hello.html)にアクセスがありました
    アクセスは正常(200)です
    クライアントは、windows11 64bitで、ブラウザはクロームを使用しています

  等という情報が読み取れます。
   この
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0
  という情報が、UA(ユーザエージェント)と呼ばれており、一般に偽装可能な情報だといわれていることから、実際に偽装できるか確認します。

実験

  ①他のブラウザで接続した際のUAの挙動
   Edgeを使用してアクセスした場合のUA

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0

   UbuntuのFirerFoxを使用した場合のUA

Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/117.0

  ②WindowsのCURLを使って接続した場合のUA
   Windowsには、ブラウザを介しないでHTMLを取得するコマンドCURLがあります。
   コマンドプロンプトから、次のコマンドでHTMLを取得します。

c:\ > curl http://192.168.19.129/hello.html
<html>
<body>
<h2>hello</h2>
</body>
</html>

    文字列でHTMLを取得するので、サーバ上に配置したHTMLファイルと同じ内容のテキストを取得することができます。
    このコマンドを使用してHTMLを取得した場合のUAは、

curl/8.4.0

   と表示されており、Curlコマンドを使用したことがアクセスログに残っています。

  ③CURLを用いたUAの偽装
   次のコマンドを入力し、CURLからUA情報も同時に送信します。

c:\ > curl -A "Mozilla/5.0 (Mac)" http://192.168.19.129/hello.html

   サーバのアクセスログには次のように表示されています。

192.168.19.1 - - [18/Feb/2024:11:39:50 +0900] "GET /hello.html HTTP/1.1" 200 271 "-" "Mozilla/5.0 (Mac)"

  UAには、使っていないはずの”Mac”という文字が入っています。
  この方法を使用すると、UAを偽装して、HTMLを取得することができます。
  取得したHTMLは、コマンドプロンプト上の情報からHTMLに再構築すれば、クライアント上でHTMLとして表示することができます。

  ④どんなUAでも入力できるのか
   Curlコマンドを使用して、どのようなUAでも作れるのか実験しました

c:\ > curl -A "Mozilla/5.0 (kabocha)" http://192.168.19.129/hello.html
      UA : Mozilla/5.0 (kabocha)
c:\ > curl -A "Mozilla/5.0 (tansunohazama)" http://192.168.19.129/hello.html
      UA : Mozilla/5.0 (tansunohazama)"
c:\ > curl -A "Mozilla/5.0 (tansunohazama)" http://192.168.19.129/hello.html
      UA : abc
c:\ > curl -A "Mozilla/5.0 (Windows 2000000; Win2000; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0" http://192.168.19.129/hello.html
      UA : Mozilla/5.0 (Windows 2000000; Win2000; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"

   こちらの環境で実験した限りでは、何を入れてもUAとしてアクセスログに残っていました。
    Windows 200万
   こんなOSのUAがログに残っていたら驚かれますね・・・

最後に

 今回の実験で、UAは簡単に偽装することができることが確認できました。
 UAを偽装したとしても他の痕跡から行為者を特定することができますので、悪用はしないでください。
 サーバの管理者として、UAの信用性がこの程度だということを知ってほしいと思い記述しました。