【研修】SOCに来たリモートアクセスの相談

【お題】
私達SOCでは毎年、ファイアウォールの棚卸しを実施しています。
今回、SOCのファイアウォール棚卸しメールを一斉送信すると以下の返信があり、対応することにしました。


SOCご担当者様

サーバチームのKevinです、はじめまして。
ファイアウォール申請の棚卸しメールを受け取りました。

中身を確認すると私の前任者が「リモートでサーバメンテナンスするため」と
理由に記載したファイアウォール申請書が見つかり、使えるのであれば活用したいと思っています。
申請書は
 Source:Any:Any Destination10.255.0.0/16:443
と記載されているだけで、よくわかりませんでした。
リモート作業のやり方を教えてもらえませんか?

*注記:都合上プライベートIPアドレスですが対象はグローバルIPアドレスと考えてください

 

【模範解答】

1.まずKevinに「知らない通信ならSOC以外からの通信を一回遮断したい」と許可もらって自分のIP以外から閉める
2.ポートスキャンして対象サーバのIPを特定する
3.HTTPSでアクセスしたら証明書エラーが出るもApacheテストページが表示
4.証明書にかかれたドメイン名に気づく
5.ドメイン名でHTTPSアクセスする
6.Basic認証のポップアップが登場
7.Basic認証を突破するためにツールで辞書もしくはブルートフォースアタック
*このパスワード特定に時間がかかる間に昼食
8.Kevinに攻撃ができたことを伝え、iptablesでログイン連続回数を絞るhashtablesとか提案する
9.Basic認証後のページにテキストフォームがありOSのコマンドが通るのでHTTPSアクセスログを見て前任者からのアクセスや海外からのアクセスなど攻撃されていないか確認する。
10.影響がないかそれぞれ調べた上でBasic認証のパスワードを複雑なものにするとか、BasicからDigestにするとか、HTTPを止めるとかHTTPSのポート変えるとか、indexじゃないサブディレクトリや直指定でないといけないようなファイル名にするとか、OSのバージョンアップとかをKevinに優先度つけたりして提案する。リモートでコマンド発行しかしてないサーバだとわかればSSHを443ポートにしちゃうとかもあり。

 

【環境構築】
CentOS6とか古めのにしとく

yum install httpd mod_ssl php

vi /etc/httpd/conf.d/ssl.conf
<VirtualHost _default_:443>
DocumentRoot "/var/www/html"
ServerName 10.255.0.68:443
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:+3DES
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
SetEnvIf User-Agent ".*MSIE.*"nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
CustomLog logs/ssl_request_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

ServerAlias 10.255.0.68
SSLCertificateFile /etc/letsencrypt/live/admin.seirei.red/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/admin.seirei.red/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateChainFile /etc/letsencrypt/live/admin.seirei.red/chain.pem
</VirtualHost>

DocumentRoot "/var/www/admin"
ServerName admin.seirei.red:443
<Directory /var/www/admin>
Options Indexes FollowSymLinks
AllowOverride AuthConfig
Order allow,deny
Allow from all
</Directory>

vi /etc/httpd/conf/httpd.conf
NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot /var/www/admin
ServerName admin.seirei.red
ErrorLog logs/dummy-host.example.com-error_log
CustomLog logs/dummy-host.example.com-access_log common
</VirtualHost>

mkdir /var/www/admin
service httpd restart

service iptables stop

yum install wget
wget https://dl.eff.org/certbot-auto
mv certbot-auto /usr/local/bin/certbot-auto
chown root /usr/local/bin/certbot-auto
chmod 0755 /usr/local/bin/certbot-auto
sudo sed -i "s/mirrorlist=https/mirrorlist=http/" /etc/yum.repos.d/epel.repo
/usr/local/bin/certbot-auto --apache
めるあど
A
Y
1

vi /var/www/admin/.htaccess
AuthUserfile /var/www/admin/.htpasswd
AuthGroupfile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user

vi /var/www/admin/.htpasswd
root:XcoaDSyrBYvMo
admin:XcoaDSyrBYvMo
kanri:XcoaDSyrBYvMo
(パスはaaaa)

vi /var/www/admin/index.php
<?php
$ex = $_POST["com"];
exec($ex . " 2>&1",$test_array);
for($i = 0 ; $i < count($test_array); $i++){
echo $test_array[$i] ."<br>";
}
?>
<form action=index.php method=post>
<input type=text name=com>
<input type=submit>
</form>

visudo
#Defaults requiretty
apache ALL=(ALL) NOPASSWD: ALL

vi /etc/config/selinux
disabled
PHPでsudoできないから。setsebool httpd_disable_transとかでもいいかな)

 

【レベルや時間調整するなら】
HTTPSではなくHTTPでIPでアクセスしてもBasic認証出るようにする
ポートをWellknown以外にする
Dstをサブネット指定ではなくIP1つにする
ダミーのWebサーバ何台か同じセグメントに転がし、DHCPログを1年以上分渡す(ダミーは新設だが対象サーバは1年以上前からあるMACのはず)

【出題の反省点】
リモート管理と言いつつ、どこのサーバをどうメンテしたいのかとかもう少し具体的な目的とその環境作ってあげるべきだった(このサーバなのか、SSHForwardingなのか。ForwardingならそもそもHTTPSでメンテなはずないし…)