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の信用性がこの程度だということを知ってほしいと思い記述しました。