今日日のスパマー

VPSを使っていてふと思った。VPSはいうなれば、「ネットワーク越しに操作可能なパソコンを、まるまる1台借りている」ような物じゃないかと思う。つまり、その気になれば攻撃用のホストとしても利用可能なのではないだろうか?(その攻撃に使うサーバーマシンの負荷がどれくらいかかるかというのは抜きにして)ちょっとでも、Unix操作に慣れると誰でも考えそうなことである。cronで定期的にスパムメールなりスパムコメントを送信するプログラムは結構昔からあったし。(cronが使えない場合は、サイトを閲覧したタイミングで実行するようにすればいいし。例えばカウンタに連動させるとか)

一方、スパマーにとってもVPSはおいしいものである。わざわざバックドアをしかけたPCを用意するまでもなく、もともと自在に操れるPCがあるわけだから。自分のパソコンとVPS上のPCは、つながってないため匿名性も高い。定期的にVPSを変えれば足が付く可能性も減るだろう。ログを残さない匿名プロクシとして使うことも可能である。なんせ、「何でもできる」し。

よく良く考えてみると、最近の奇妙なアクセスやスパム更新は、なんとかhostingとかって名前が多いような。以下は、最近MabinogiのMMLを荒らしたホストである。

1290082707122.193.111.5122.193.111.5Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
129075056669.39.86.22369.39.86.223.static.a2webhosting.comMozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
1291443817173.208.107.177173-208-107-177.rdns.squidproxies.comMozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12
129147820585.9.105.24385.9.105.243Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
1291456057173.208.107.64173-208-107-64.rdns.squidproxies.comMozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12
129121528972.43.50.131route1.mlti.orgMozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)rckqloaz
129117256781.208.106.18181-208-106-181.ip.fastwebnet.itMozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
1290944763218.36.213.64218.36.213.64Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
1290644894194.70.47.25no-dns-yet.demon.co.ukMozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)qktkvhbu
1290539771193.52.26.211login.hpclr.univ-montp2.frMozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
1290126325183.101.159.145183.101.159.145Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
129004454967.215.238.210hosted.by.pacificrack.comMozilla/5.0 (Windows; U; Windows NT 5.0; ru; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6
129008917367.215.238.210hosted.by.pacificrack.comMozilla/5.0 (Windows; U; Windows NT 5.0; ru; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6
129008945888.198.61.23288-198-61-232.eurohost.mdMozilla/5.0 (Windows; U; Windows NT 5.0; ru; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6
129009031367.215.238.210hosted.by.pacificrack.comMozilla/5.0 (Windows; U; Windows NT 5.0; ru; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6
129009223967.215.237.98client832.surehost.ruMozilla/5.0 (Windows; U; Windows NT 5.0; ru; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6
129009536867.215.237.98client832.surehost.ruMozilla/5.0 (Windows; U; Windows NT 5.0; ru; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6

69.39.86.223.static.a2webhosting.comは、アメリカの日本語学校のようである。公開プロクシリストに入っていることから、学生がサーバーをクラックしてバックドアを仕掛けたのだろうか?hosted.by.pacificrack.comは、サイトのcPanelにつながる。完全にスパム用ホストとしてサーバー会社から借りたが、うっかりApacheを起動したままになっているのだろう。興味深いのは、UAがいずれも、MSIE6.0かFireFoxの2.0という、レガシーブラウザになっているところである。レガシーブラウザを弾くだけでどうにかなりそうだが・・・。

FireFoxはともかくMSIE6.0にするメリットは無いはずである。北欧では締め出しが始まっているし、大手ポータルサイトでもサポート対象外にしているし。謎である。まぁ、管理する側からすれば弾きやすいわけだが。

Stop Forum spam

これらのホスト名でGoogleで検索すると面白いサイトがヒットする。StopForumSpam.comだ。最近頭を悩ますホスト名でだいたいこのサイトに掲載されていることが多い。マジオススメ。

ちなみに、この記事を書いている最近24時間のスパムの送信元として多い国は、

  1. ロシア
  2. ウクライナ
  3. アメリカ
  4. ノルウェー
  5. 中国
  6. ドイツ
  7. イギリス(?)
  8. ポーランド
  9. ラトビア
  10. フランス
  11. インド

という順番だった。ウクライナとノルウェーの人口比のスパム率が高いのが気になる。中国は案外少ないようだ。(もっとも、日本ではこのサービスを使用している人が少ないからかもしれないが。)APIも公開されているので、そのうちPukiWiki Adv.にも組み込むとしよう。

Iptables自動更新スクリプト

StopForumSpam.comでは、ipリストを配布しているので、ファイアウォール構築(iptables) - Fedoraで自宅サーバー構築を参考にスクリプトを組んでみた。

#!/bin/bash

# ファイアウォール停止(すべてのルールをクリア)
service iptables stop
echo iptablesを初期化しています…。
iptables -F

#---------------------------------------#
# 設定開始								#
#---------------------------------------#

# インタフェース名定義
LAN=eth0

#---------------------------------------#
# 設定終了								#
#---------------------------------------#

# 内部ネットワークのネットマスク取得
echo 内部ネットワークの情報を取得中…。
LOCALNET_MASK=`ifconfig $LAN|sed -e 's/^.*マスク:\([^ ]*\)$/\1/p' -e d`

# 内部ネットワークアドレス取得
echo Get local network address.
LOCALNET_ADDR=`netstat -rn|grep $LAN|grep $LOCALNET_MASK|cut -f1 -d' '`
LOCALNET=$LOCALNET_ADDR/$LOCALNET_MASK

echo 内部ネットワークマスク :$LOCALNET_MASK
echo 内部ネットワークアドレス:$LOCALNET_ADDR

# デフォルトルール(以降のルールにマッチしなかった場合に適用するルール)設定
echo デフォルトのルールを設定しています…
iptables -P INPUT   DROP   # 受信はすべて破棄
iptables -P OUTPUT  ACCEPT # 送信はすべて許可
iptables -P FORWARD DROP   # 通過はすべて破棄

# 自ホストからのアクセスをすべて許可
iptables -A INPUT -i lo -j ACCEPT

# 内部からのアクセスをすべて許可
iptables -A INPUT -s $LOCALNET -j ACCEPT

# 内部から行ったアクセスに対する外部からの返答アクセスを許可
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SYN Cookiesを有効にする
# ※TCP SYN Flood攻撃対策
sysctl -w net.ipv4.tcp_syncookies=1 > /dev/null
sed -i '/net.ipv4.tcp_syncookies/d' /etc/sysctl.conf
echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf

# ブロードキャストアドレス宛pingには応答しない
# ※Smurf攻撃対策
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1 > /dev/null
sed -i '/net.ipv4.icmp_echo_ignore_broadcasts/d' /etc/sysctl.conf
echo "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.conf

# ICMP Redirectパケットは拒否
sed -i '/net.ipv4.conf.*.accept_redirects/d' /etc/sysctl.conf
for dev in `ls /proc/sys/net/ipv4/conf/`
do
	sysctl -w net.ipv4.conf.$dev.accept_redirects=0 > /dev/null
	echo "net.ipv4.conf.$dev.accept_redirects=0" >> /etc/sysctl.conf
done

# Source Routedパケットは拒否
sed -i '/net.ipv4.conf.*.accept_source_route/d' /etc/sysctl.conf
for dev in `ls /proc/sys/net/ipv4/conf/`
do
	sysctl -w net.ipv4.conf.$dev.accept_source_route=0 > /dev/null
	echo "net.ipv4.conf.$dev.accept_source_route=0" >> /etc/sysctl.conf
done

# フラグメント化されたパケットはログを記録して破棄
iptables -A INPUT -f -j LOG --log-prefix '[IPTABLES FRAGMENT] : '
iptables -A INPUT -f -j DROP

# 外部とのNetBIOS関連のアクセスはログを記録せずに破棄
# ※不要ログ記録防止
iptables -A INPUT ! -s $LOCALNET -p tcp -m multiport --dports 135,137,138,139,445 -j DROP
iptables -A INPUT ! -s $LOCALNET -p udp -m multiport --dports 135,137,138,139,445 -j DROP
iptables -A OUTPUT ! -d $LOCALNET -p tcp -m multiport --sports 135,137,138,139,445 -j DROP
iptables -A OUTPUT ! -d $LOCALNET -p udp -m multiport --sports 135,137,138,139,445 -j DROP

# 1秒間に4回を超えるpingはログを記録して破棄
# ※Ping of Death攻撃対策
iptables -N LOG_PINGDEATH
iptables -A LOG_PINGDEATH -m limit --limit 1/s --limit-burst 4 -j ACCEPT
iptables -A LOG_PINGDEATH -j LOG --log-prefix '[IPTABLES PINGDEATH] : '
iptables -A LOG_PINGDEATH -j DROP
iptables -A INPUT -p icmp --icmp-type echo-request -j LOG_PINGDEATH

# 全ホスト(ブロードキャストアドレス、マルチキャストアドレス)宛パケットはログを記録せずに破棄
# ※不要ログ記録防止
iptables -A INPUT -d 255.255.255.255 -j DROP
iptables -A INPUT -d 224.0.0.1 -j DROP

# 113番ポート(IDENT)へのアクセスには拒否応答
# ※メールサーバ等のレスポンス低下防止
iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset

echo デフォルトのルールを設定完了。

echo Stop Forum Spamのブラックリストを取得中…
# http://www.stopforumspam.com/downloads/listed_ip_1.zipから最新版IPアドレスリストを取得する
wget http://www.stopforumspam.com/downloads/listed_ip_1.zip
unzip listed_ip_1.zip
iptables -N FORUMSPAMHOST
rm ./listed_ip_1.zip


# 最新版IPアドレスリストが取得できなかった場合
if [ ! -f ./listed_ip_1.txt ]; then
	if [ -f /tmp/listed_ip_1.txt ]; then
		echo ブロックリストの取得ができませんでした。過去のバックアップから読み込みます。
		return
	else
		echo ブロックリストの取得ができませんでした。
		exit 1
	fi
else
	echo 古いブロックリストを削除しています。
	rm /tmp/listed_ip_1.txt
	echo ブロックリストを更新しています。
	mv ./listed_ip_1.txt /tmp/listed_ip_1.txt
fi

echo iptablesにブロックリストを反映しています。しばらくお待ちください…。
# update firewall
if [ -s /tmp/listed_ip_1.txt ]; then
	for ip in `cat /tmp/listed_ip_1.txt`
	do
#		echo $ip
		iptables -A INPUT   -s $ip  -j FORUMSPAMHOST
		iptables -A OUTPUT  -d $ip  -j FORUMSPAMHOST
		iptables -A FORWARD -s $ip  -j FORUMSPAMHOST
		iptables -A FORWARD -d $ip  -j FORUMSPAMHOST
	done
fi

iptables -A FORUMSPAMHOST  -j LOG  --log-level info --log-prefix "SPAMHOST -- DENY "
iptables -A FORUMSPAMHOST  -j DROP
echo ブロックリストの更新が完了しました。

#----------------------------------------------------------#
# 各種サービスを公開する場合の設定(ここから)			   #
#----------------------------------------------------------#

echo 各種サービス用のポートを開いています…

# 外部からのTCP22番ポート(SSH)へのアクセスを許可
# ※SSHサーバーを公開する場合のみ
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 外部からのTCP/UDP53番ポート(DNS)へのアクセスを許可
# ※外部向けDNSサーバーを運用する場合のみ
#iptables -A INPUT -p tcp --dport 53 -j ACCEPT
#iptables -A INPUT -p udp --dport 53 -j ACCEPT

# 外部からのTCP80番ポート(HTTP)へのアクセスを許可
# ※Webサーバーを公開する場合のみ
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# 外部からのTCP443番ポート(HTTPS)へのアクセスを許可
# ※Webサーバーを公開する場合のみ
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 外部からのTCP21番ポート(FTP)へのアクセスを許可
# ※FTPサーバーを公開する場合のみ
#iptables -A INPUT -p tcp --dport 21 -j ACCEPT

# 外部からのPASV用ポート(FTP-DATA)へのアクセスを許可
# ※FTPサーバーを公開する場合のみ
# ※PASV用ポート60000:60030は当サイトの設定例
#iptables -A INPUT -p tcp --dport 60000:60030 -j ACCEPT

# 外部からのTCP25番ポート(SMTP)へのアクセスを許可
# ※SMTPサーバーを公開する場合のみ
#iptables -A INPUT -p tcp --dport 25 -j ACCEPT

# 外部からのTCP465番ポート(SMTPS)へのアクセスを許可
# ※SMTPSサーバーを公開する場合のみ
#iptables -A INPUT -p tcp --dport 465 -j ACCEPT

# 外部からのTCP110番ポート(POP3)へのアクセスを許可
# ※POP3サーバーを公開する場合のみ
#iptables -A INPUT -p tcp --dport 110 -j ACCEPT

# 外部からのTCP995番ポート(POP3S)へのアクセスを許可
# ※POP3Sサーバーを公開する場合のみ
#iptables -A INPUT -p tcp --dport 995 -j ACCEPT

# 外部からのTCP143番ポート(IMAP)へのアクセスを許可
# ※IMAPサーバーを公開する場合のみ
#iptables -A INPUT -p tcp --dport 143 -j ACCEPT

# 外部からのTCP993番ポート(IMAPS)へのアクセスを許可
# ※IMAPSサーバーを公開する場合のみ
#iptables -A INPUT -p tcp --dport 993 -j ACCEPT

# 外部からのUDP1194番ポート(OpenVPN)へのアクセスを許可
# ※OpenVPNサーバーを公開する場合のみ
#iptables -A INPUT -p udp --dport 1194 -j ACCEPT

# VPNインタフェース用ファイアウォール設定
# ※OpenVPNサーバーを公開する場合のみ
#[ -f /etc/openvpn/openvpn-startup ] && /etc/openvpn/openvpn-startup

# 外部からのTCP5900/5901番ポート(VNC)へのアクセスを許可
#iptables -A INPUT -p tcp --dport 5900 -j ACCEPT
#iptables -A INPUT -p tcp --dport 5901 -j ACCEPT

# 外部からのTCP/UDP10000番ポート(Webmin)へのアクセスを許可
iptables -A INPUT -p tcp --dport 10000 -j ACCEPT
iptables -A INPUT -p udp --dport 10000 -j ACCEPT

# 外部からのTCP/UDP20000番ポート(Usermin)へのアクセスを許可
#iptables -A INPUT -p tcp --dport 20000 -j ACCEPT
#iptables -A INPUT -p udp --dport 20000 -j ACCEPT

echo 各種サービス用の設定が完了しました。

#----------------------------------------------------------#
# 各種サービスを公開する場合の設定(ここまで)			   #
#----------------------------------------------------------#

# 拒否IPアドレスからのアクセスはログを記録せずに破棄
# ※拒否IPアドレスは./deny_ip.txtに1行ごとに記述しておくこと
iptables -N DENIED_IP
if [ -s ./deny_ip.txt ]; then
	echo 拒否IPリストが見つかりました。iptablesに反映させています…。
	for ip in `cat ./deny_ip.txt`
	do
		iptables -A INPUT   -s $ip  -j DENIED_IP
		iptables -A OUTPUT  -d $ip  -j DENIED_IP
		iptables -A FORWARD -s $ip  -j DENIED_IP
		iptables -A FORWARD -d $ip  -j DENIED_IP
	done
	echo 拒否IPリストの反映が完了しました。
fi

# 上記のルールにマッチしなかったアクセスはログを記録して破棄
iptables -A INPUT -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES INPUT] : '
iptables -A INPUT -j DROP
iptables -A FORWARD -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES FORWARD] : '
iptables -A FORWARD -j DROP

# サーバー再起動時にも上記設定が有効となるようにルールを保存
service iptables save

# iptables 1.4.3.1バグ対処
iptables -V|grep 1.4.3.1 > /dev/null 2>&1
if [ $? -eq 0 ]; then
	sed -i s/"-s \!"/"\! -s"/g /etc/sysconfig/iptables
	sed -i s/"-d \!"/"\! -d"/g /etc/sysconfig/iptables
fi

# ファイアウォール起動
service iptables start

iptables-save > /etc/iptables.up.rules

ちなみに、引用元の、ファイアウォール構築(iptables) - Fedoraで自宅サーバー構築では、LOCALNET_MASKの取得部分が

LOCALNET_MASK=`ifconfig $LAN|sed -e 's/^.*Mask:\([^ ]*\)$/\1/p' -e d`

になっていたが、日本語環境で使っている場合、コマンドの実行結果の「Mask」の部分が「マスク」になるため、

LOCALNET_MASK=`ifconfig $LAN|sed -e 's/^.*マスク:\([^ ]*\)$/\1/p' -e d`

にしなければならなかった。結構はまった。環境によっては変える必要があるかも。

あと、注意したいのは、StopForumSpamへの同一ドメインからの1日のダウンロード回数が制限されていること。このスクリプトで使用している1時間ごとに更新されるリスト(listed_ip_1.zip)は、1日に24回しかダウンロード出来ない。スクリプトがエラーになるのを防ぐために、/etc/ディレクトリにバックアップを置くようにしてある。

おまけ

banned_ip.txt。とりあえず、amazonのVPSと、殿堂入り国内スパムホストのOCN丸の内、NTT-PC東京は弾いておこう。P2P用のキックリストの流用だが、amazonをのぞくこれらの国内のホストは過去にもスパムメールを送信していたことで有名である。逝ってよし!

67.202.0.0/18
72.44.32.0/19
75.101.128.0/17
79.125.0.0/18
114.150.59.38/32
118.8.11.232/32
124.154.252.140/32
124.154.253.197/32
174.129.0.0/16
216.182.224.0/20
221.191.121.165/32

218.124.47.12
219.208.92.39

ちなみに、最後の2行は、30分にわたり5秒に1回という非常識なアクセスをしてきやがったYahoo BBのホスト。ark-westのようなリファラースパムも行っているようだ。

どうでもいいけど、ルーターに同じリストを入れたところ、75.101.137.232:80から、明らかにポートスキャンされているようなログが出てきたんだが・・・。