Webサーバの奇妙なログ

Webサーバに時々以下のような奇妙なアクセスがあるのですが、最近になって正体がわかりました。

85.59.152.XXX - - [22/Aug/2014:19:46:10 +0900] "\x9a\xf0\x178!\x97\xa5\x8cb\x14\x11\x84\x19\x0e\xcc\xdd:H\x07G" 501 232 "-" "-" "-"

上記のようなログはhttpのポートにhttpsでアクセスしようとして、SSL通信を素のhttpで流そうとするときに発生するそうです。

rawdata03.png


tcpstream.png

試しにpythonでソケットを作ってSSLで通信してみました。

import socket, ssl
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sslsock = ssl.wrap_socket(mysock, ssl_version=ssl.PROTOCOL_TLSv1, ciphers=
"ADH-AES256-SHA")
sslsock.connect((host, 80))


その時のログ↓
xx.xx.xx.xx - - [27/Nov/2015:23:51:33 +0900] "\x16\x03\x01" 501 215 "-" "-" "-" 303
以上

PUT メソッドの挙動

HTTP通信におけるPUTメソッドの動きを調べてみました。
ApacheではデフォルトでPUTメソッドは禁止されているので、まずはPUTメソッドを許可する必要があります。
httpd.confを以下のように編集します。

<Directory "/var/www/dav">
AllowOverride all
Order allow,deny
Allow from all
DAV On
</Directory>

PUTメソッドを許可するディレクトリを指定して"DAV on"と記述することでPUTメソッドを使用できるようになります。
※事前に以下のようなwebdavのモジュールを有効にする必要があります。
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so

また対象のディレクトリに対してPUTメソッドを使用してファイルをアップロードするには、最低でもユーザに対して書き込み権限と実行権限を与える必要があります。chmodコマンドで必要な権限を与えます。

telnetで80番ポートに対してPUTのリクエストを送ります。
※必ず"Content-Length"を指定して2行分、改行してから(つまりEnterキーを2回押してから)メッセージ・ボディを入力すること

[example@user]# telnet localhost 80
Trying ::1...
Connected to localhost.
Escape character is '^]'.
PUT /dav/put.txt HTTP/1.0
Host: www.example.com
Content-Length: 5

Hello

HTTP/1.1 201 Created
Date: Sat, 31 May 2014 12:55:50 GMT
Server: Apache
Location: http://www.example.com/dav/put.txt
Content-Length: 266
Connection: close
Content-Type: text/html; charset=ISO-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>201 Created</title>
</head><body>
<h1>Created</h1>
<p>Resource /dav/put.txt has been created.</p>
<hr />

ファイルがアップロードされました。
[example@user]# ls
put.txt
[example@user]# cat put.txt
Hello


以上

外部からの.htaccessファイルへのアクセスを404で拒否するには

Apacheでは外部から.htaccessファイルへのアクセスがあるとデフォルトで403(Forbidden)を返すようになっています。

これでも一応、.htaccessファイルを保護できていますが、403コードだと、ファイルへはアクセスできないものの、ファイルがそこに存在するということを攻撃者に推測されてしまいます。

なので、403ではなく404を返して、ファイルが存在しないかのように見せかけたい。

httpd.confに以下のように記述すれば404で応答するようになります。


<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^/\.htaccess /your/path/to/404.html
</IfModule>


以上。

2014/10/30 追記
上記の方法だと確かに指定したエラーページを返しますが、レスポンスのステータス自体は200でした。。。
あんまし意味ないじゃん!
ので、以下のように変更しました。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^/\.htaccess - [R=404,L]
</IfModule>


これならレスポンスのステータスも404になります。
以上。

.htaccessのRewriteRuleの書式のメモ

RewriteEngine On
##index.html へのアクセスをtest.htmlへ書き換え
##書式: 照合URL 変換後の絶対URL
RewriteRule index.html http://example.com/test.html
##あるいは下記のように書き換えてもOK
#RewriteRule index.html /test.html

参考URL
http://www.nurs.or.jp/~sug/homep/rewrite/rewrite15.htm

telnetで自分のwebサーバと通信する方法

telnet コマンドでlocalhostの80番ポートにつなげる。(localhostでなくドメイン名を指定するとルータの管理画面などが表示されてしまう。)


[user@example ~]$ telnet localhost 80
Trying ::1...
Connected to localhost.
Escape character is '^]'.
GET /index.html HTTP/1.0
Host: localhost <= リクエストを入力したらEnterキーを2回押す

HTTP/1.1 200 OK
Date: Wed, 25 Dec 2013 10:01:49 GMT



ちなみにHTTPプロトコルのバージョンをHTTP/1.1にしたらエラーになった。

[user@example ~]$ telnet localhost 80
Trying ::1...
Connected to localhost.
Escape character is '^]'.
GET /index.html HTTP/1.1

HTTP/1.1 400 Bad Request
Date: Wed, 25 Dec 2013 10:08:10 GMT

↑削除しました。原因はHostヘッダを指定しなかったことです。HTTP/1.1でリクエストを送るときはHostヘッダの指定は必須になります。

以上。

| NEXT>>

プロフィール

トニヒコ

Author:トニヒコ
趣味は旅行と読書とマンガ。
将来の夢はコスモポリタン!

リンク・フリーです。

My hobby is traveling and reading(include manga).
My dream is to become cosmopolitan!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
スポンサード リンク
マクロミルへ登録
FC2カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR