初心者の為のhack the box100本ノック～その3：Lame(easy)～

#初めに
皆さんこんにちは！
100本ノックシリーズはセキュリティ初心者でも分かる様、なるべく詳しく解説することを目指したシリーズです！
用語解説などは折り畳みで解説しているので、見てみてください。

寒くなってくると気分が落ち込みますが、今回も頑張っていきましょー

(宣伝)
<font color="red">$\rm\large{↓セキュリティカテゴリのAdven Calendar作りました！↓}$</font>
[🎉セキュリティ Advent Calendar 2020🎉](https://qiita.com/advent-calendar/2020/security)
自分の学びのアウトプットとして、この機会に1個記事を書いてみませんか？


#目次
・初めに
・挑戦するマシン
・1．情報収集
・2．Exploit
・3．user.txtの取得
・4．root権限&root.txtの取得
・最後に
・おまけ
・参考にさせていただいたサイト

#挑戦するマシン
今回挑戦するマシンはLame(easy)です。
![htb_lame.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/b3c3d357-1f57-c48e-fc70-3ffa50c5c850.png)
作者さんは前回の[Blue](https://qiita.com/reacon4234/items/5ef9f7fdd462f8a25ca9)と同じch4pさん。
簡単ながらも様々な解き方があり、とても勉強になりました。
それではやっていきましょう。
#1．情報収集
##スキャン
まずはnmapでスキャンします。

```
kali@kali:~$ nmap -sC -sV 10.10.10.3
```
![Lame_scan_default.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/c55fa389-cdc1-923a-968d-3d1aec3844ac.png)

どうやらpingスキャンがブロックされている様です。
nmapの指示に従って、-Pn(-P0)オプションでpingスキャンをスキップします。

<details><summary><font color="Red">pingスキャンについて</font></summary><div>
nmapは一連のスキャンの初めにpingスキャンによって、ターゲットがアクティブかどうかの確認を行います。
デフォルトでは```TCP ACKパケット```と```ICMPエコー要求クエリ```をターゲットマシンに送信します。<br>
<img width="600" alt="pingスキャン.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/effadfa1-d24c-acfc-5178-ccb1ab071a58.png">

しかし、ターゲット側のファイアウォールでpingがブロックされている場合があります。
その場合には、```-P*```オプションでpingの種類を選ぶ、もしくは```-Pn```オプションでpingを送信せず、ホスト発見の段階をスキップすることが出来ます。<br>
pingスキャンをスキップした場合、本来行うはずだったアクティブなマシンの特定が行われず、次の段階では、指定した全てのマシンをアクティブだと見なしてポートスキャンが行われます。
<font color="MediumSlateBlue">（例えば、クラスBのサイズのアドレス空間(/16)を、コマンドラインでターゲットに指定した場合、65,536個のIPアドレスすべてに対してポートスキャンされるということです。）</font>
今回のようにターゲットマシンが一つのみと分かっている場合は、特に制約なく普段通りのスキャンが行えます。
（参考：Nmap.org『[ホストの発見](https://nmap.org/man/ja/man-host-discovery.html)』）
－－－－－－－－－－－－－－－－－－－－－－－－－－－－
</div></details>

```
kali@kali:~$ nmap -sC -sV -Pn 10.10.10.3
```
![Lame_scan_pn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/7b3e61da-a053-3e47-bd7c-44998b846128.png)
21(FTP),22(ssh),139・445(smb)ポートが開いている様です。

##ポートの調査
まずは、出来る範囲でログインやファイルの探索を試みます。
21番ポートからftpサービスにログインしてみます。
![Lame_FTP_login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/67f03dce-298d-e7e3-4244-a0fdaf924394.png)
```anonymous login```が許可されているので、ログインしてフォルダを探索しますが特にめぼしい物はなし。
一旦後回しにします。
次は、22番ポート。ブルートフォース攻撃などを試みますが、これもダメ。![Lame_ssh_bruteforce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/6151de55-7128-a177-e061-805ee5bc8987.png)

smbサーバーにも```rpcclient```を用いて簡単に調査してみます。
![Lame_smb_login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/91ae7e76-ffb7-7f6d-cf6d-11a413017567.png)
が、ログインは難しそうです。

#2．Exploit
ある程度試したので次はnmapで判明したサービスの脆弱性をググってみます。
前回同様、[ExploitDatabase](https://www.exploit-db.com/)でサービス名で検索してexploitを探します。
(```searchsploit```コマンドを使えばコマンドラインからも検索できます)

##vsFTPdの調査
するとFTPサービスに用いられている```vsFTPd2.3.4```の[exploit](https://www.exploit-db.com/exploits/16320)が見つかりました。
<font color="Thistle">このexploitのコードめちゃくちゃシンプルなので、そのうち勉強がてら解説記事書きたいな…</font>

<details><summary><font color="Red">vsFTPdとは</font></summary>
```vsFTPd```とはFTPサーバのソフトウェアの1種です。
名前の由来は「VerySecure FTP Daemon」
(Daemonとは常にバックグラウンドで動き続けるプログラムに付けられる名前です。)
その名前の通り、セキュリティ面を意識されたFTPサーバです。
(参考：LPI-Japan『[Linux豆知識](https://linuc.org/study/knowledge/487/)』)
－－－－－－－－－－－－－－－－－－－－－－－－－－－－
</details>

msfconsoleから実行してみます。
![Lame_vsFTPd_exploit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/35a0e206-a432-82f3-4b2d-ad8e03597b1c.png)

ダメでした(T_T)
backdoorが無いverを使っているようです。


##カンニング
ここで詰まってしまったので、他の方のwalkthroughを見てみると、ほとんどの方が```samba3.0.20```の脆弱性を利用して突破してるようです。
sambaのverが違う(最初のスキャンでは```Samba 3.0.28a```)けど、意図しない攻略方法だったから消したのかな…
(と思ったら後日スキャンしなおしたら、sambaのverが3.0.20になっていました…
これはnmapの精度の問題なのかな…でも最初は[exploit](https://www.exploit-db.com/exploits/16320)も使えなかったのに今は使えたし…うーんよくわからないです。)

##再スキャン
なんとか別の方法を探していると、nmapのフルスキャンを行うともう一つopenなポートが見つかるそうです。
というかデフォルトだとフルスキャンじゃなかったんですね…知らなかった…
>デフォルトでは、Nmapは、1024番(を含む)までの全ポートと、1025番以降のポートはスキャン対象のプロトコルに応じてnmap-servicesファイルに記載されたポートをスキャンする。
(Nmap.org『[ポートの指定とスキャンの順序](https://nmap.org/man/ja/man-port-specification.html)』)

```
kali@kali:~$ nmap -sC -sV -Pn -p- -T4 10.10.10.3
```
<details><summary><font color="red">nmapのオプション</font></summary><div>
```-sC```：デフォルトのスクリプトでスキャン
```-sV```：サービスのバージョンを検出
```-Pn```：pingスキャンをスキップ
```-p-```：対象の全ポートに対してスキャン
```-T4```：スキャンの速度を指定できる。デフォルトは3
</div></details>
![Lame_scan_full.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/ce6c7e2f-b67e-21cb-4c93-9fd2ba6e40ee.png)

いつもの10倍ぐらいの時間待つと、3632番ポートが開いていることが分かりました。
```distccd```というサービスが動いている様です。

##distccdの調査
どうやら、ソースコードのコンパイルを分散処理(複数のコンピュータで並行して処理すること)するためのソフトウェアらしいです。
exploitを探すと見つかりました。
[DistCC Daemon - Command Execution (Metasploit)](https://www.exploit-db.com/exploits/9915)
msfconsoleから実行します。
![Lame_distcc_exploit_error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/4570de13-ab2f-2437-b1fb-c3cebe3f4e2e.png)
謎のexploitation error。
ちょっと調べてみると、手動でpayloadを設定することで治ることがあるらしいです。
```show payloads```で利用できるpayloadの一覧を表示して、その中から```set payload xxx/xxx/xxx```で設定します。
適当に幾つか試して実行します。(選び方わからん…)
![Lame_distcc_exploit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/5b2421af-6f2b-7cdc-9abd-7c085b0c8031.png)
成功しました！

#3．user.txtの取得
(ここから先は```python -c 'import pty; pty.spawn("/bin/bash")'```を実行して見栄えを良くしてます。)
```whoami```で現在の権限を確認

```
daemon@lame:/tmp$ whoami
whoami
daemon
```
daemonでログインに成功したので、ひとまず```find```コマンドでuser.txtを探します。

```
daemon@lame:/tmp$　cd /
daemon@lame:/$ find -name user.txt 2>/dev/null
find -name user.txt 2>/dev/null
./home/makis/user.txt
```
<details><summary><font color="red">findコマンドのオプション</font></summary>
```-name user.txt```："user.txt"に合致するファイルを検索
```2>/dev/null```：エラー(2)を無視(/dev/nullにリダイレクト)
</details>

#4．root権限の取得
次はroot権限の奪取。
bankの時同様、SUIDの設定されているファイルを探してみます。(詳細は[bankの記事](https://qiita.com/reacon4234/items/889f048117b85af0ff65)参照)

```
find / -perm -u=s -type f 2>/dev/null
```
<details><summary><font color="red">findコマンドのオプション2</font></summary>
```/```："/"ディレクトリ下を検索(全てのディレクトリを検索)
```-perm -u=s```：SUIDが設定されているファイルを検索
```type f```：ファイルタイプとして通常のファイル(f)を指定
</details>
![Lame_SUIDbin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/2950f1c8-3326-060a-eb07-8ea3cf65492c.png)

パッと見、どのファイルが役に立つか分かりませんが、
世の中には「[GTFOBins](https://gtfobins.github.io/)」という権限昇格に役に立つバイナリのリストを纏めたサイトがあるようです。
片っ端から検索して、出来そうな権限昇格法を実行してみます。

nmapの項目がありました。
![Lame_GTFObins_nmap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/8632ce08-e1e7-e83b-0551-63c5d7a4b824.png)

nmapをinteractiveモード(対話モード)で起動し、shellを呼び出すことで権限昇格が出来るようです。
やってみます。
![Lame_getroot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686089/648434fe-db71-c71f-a0cf-3dbca44783e3.png)

root権限を奪取することが出来ました！
あとは先ほど同様にroot.txtを探して、終了です。

```
sh-3.2# find / -name root.txt 2>/dev/null
find / -name root.txt 2>/dev/null
/root/root.txt
```
Pwned！


#最後に
そろそろhtbにある程度慣れてきたのもあって、やり方が分かってきたような気がします。
フルスキャン大事ですね。
あと、今回見たexploitが結構シンプルだったので、今度exploitの書き方の記事を勉強して書きたいと思います。

今回も読んでいただきありがとうございました！
次回は、日本語のwalkthroughが無さげなGranny(easy)でもやろうかなと思います。
<br><br>

#おまけ
daemonユーザーでログインした後の、権限昇格法として他の方が使われていたものを簡単に紹介しておきます。

##1．udevの脆弱性の利用([CVE-2009-1185](https://nvd.nist.gov/vuln/detail/CVE-2009-1185))
<details><summary><font color="red">udevとは</font></summary><div>
>udev（userspace device management）とは，カーネルがパソコンへの接続を検出したデバイスに対して，動的に「デバイス・ファイル」を作成して割り当てるための仕組みです。

>　Linuxは，システムに存在するあらゆるリソースをファイルとして扱うという特徴を持っています。デバイス・ファイルとは，周辺機器などのデバイスをファイルとして扱えるようにしたもので，/devディレクトリの下に格納されています。

>例えばマウスなら，/dev/input/miceといった名前のデバイス・ファイルが用意されています。デバイス・ファイルもファイルの一種なので，基本的に通常のファイルと同じように扱えます。ファイルの中身を表示するcatコマンドを使えば，マウスから入力された情報が画面に表示されるという具合です。逆に，デバイス・ファイルに対して書き込みをすることで，周辺機器を操作することも可能です。



(参考：日経XTech『[Linuxキーワード udev](https://xtech.nikkei.com/it/article/Keyword/20090703/333190/)』)
－－－－－－－－－－－－－－－－－－－－－－－－－－－－</div></details>
1.4.1以前のudevはnetlinkメッセージがkernelから送られているか、チェックが行われない脆弱性を持っています。これを利用して、local userがnetlinkメッセージをuser spaceから送ることで、rootとして特定のファイルを実行できます。

[EDB-8572](https://www.exploit-db.com/exploits/8572)では、udevのPID(プロセスID)を基に、```/tmp/run```以下のファイルをrootとして実行することが出来ます。

<実際のwalkthrough>
Rana Khalil『[Hack The Box — Lame Writeup w/o Metasploit](https://medium.com/@ranakhalil101/hack-the-box-lame-writeup-w-o-metasploit-c410a340af3)』
Artis3nal Mistakes『[Writeup: HackTheBox Lame - with Metasploit](https://blog.artis3nal.com/2020-02-09-htb-lame-msf/)』

##2．UnrealIRCdの脆弱性の利用『[CVE-2010-2075](https://nvd.nist.gov/vuln/detail/CVE-2010-2075)』
Lame上ではUnrealIRC3.2.8.1が動いており、このverのUnrealIRCにはbackdoorが仕込まれています。
backdoorの中身としてはシンプルで、サーバーに"AB"から始まるコマンドを送信するとsystem()に直接渡されるというものです。
送信されたコマンドはシェルコマンドとして実行されます。
これを利用して、リバースシェルを確立します。
<実際のwalkthrough>
0xdf hacks stuff『[HTB: More Lame](https://0xdf.gitlab.io/2020/04/08/htb-lame-more.html#beyond-root---distcc-exploit)』

##3．SSHキー生成の脆弱性の利用『[CVE-2008-0166](https://nvd.nist.gov/vuln/detail/CVE-2008-0166)』
>Debian GNU/Linux およびその派生オペレーティングシステムに含まれる OpenSSL パッケージには予測可能な乱数が生成される脆弱性が存在します。
(JVN iPedia『[JVNDB-2008-001376](https://jvndb.jvn.jp/ja/contents/2008/JVNDB-2008-001376.html)』)

2006年9月から2008年5月の間にDebianベースのシステムで生成されたsshキーが予測可能な場合があります。
[g0tmi1kのGitHubリポジトリ](https://github.com/g0tmi1k/debian-ssh)を利用して、sshキーを特定し、rootとしてボックスに接続します。

<実際のwalkthrough>
0xdf hacks stuff『[HTB: More Lame](https://0xdf.gitlab.io/2020/04/08/htb-lame-more.html#beyond-root---distcc-exploit)』

#参考にさせていただいたサイト
###walkthrough
Qiita@v_avenger『[【HackTheBox】Lame - Walkthrough -](https://qiita.com/v_avenger/items/9c593178188613d7f602)』
0xdf hacks stuff『[HTB: More Lame](https://0xdf.gitlab.io/2020/04/08/htb-lame-more.html#beyond-root---distcc-exploit)』