在最近的一次实战中,遇到了一个比较特殊的环境,故有了此篇文章分享给大家,如遇到相同的情况可以尝试使用这种方法。如大家有其他途径或者更好的方法也可以联系我们进行交流。
本次web打点的思路还是以常规方式获取的途径,本以为这次会是log4j的战场,结果直到结束也没用上(其实是菜)。
在信息收集的过程中获取到了目标vpn账号,登录后发现vpn账号可跨越网段的很多,对内网信息进行收集后发现可通网段内基本都是网络设备及安全设备,摆烂了一段时间连个弱口令都没找到。
通过收集的可通网段,发现vpn客户端不能直接访问业务网段,故业务网段下的关键信息没有收集到。没办法,只能通过网页端vpn对业务网段一点点进行收集,看看是否能获取到webshell。
看了几个业务系统后,发现业务系统8161端口上存在ActiveMQ消息中间件,试了下默认口令(admin/admin)可以登录。Activemq在有默认账号的情况下常见获取权限的方式有两个,查看了下ActiveMQ版本是5.7.0,尝试使用put任意文件上传漏洞,获取webshell。
获取了webshell后,发现权限为root但系统不出网,因业务网段是通过vpn才能访问到,在连接webshell时也需要加请求头才能正常进行连接。就先使用了不出网情况下冰蝎自带的代理,但用过的人都说卡,还是要搭建一个稳定隧道。
在搭建隧道代理时也出现了同样的问题,因不出网无法使用frp等直接搭建隧道,所以想到用regeorg进行隧道的搭建,但reg需要访问到tunnel脚本文件,目前系统需要通过vpn才能进行访问,所以我们需要对reg的请求验证方式进行更改。
流程分析reGeorg执行流程图
调试环境python2.7pycharm
askGeorg方法从main方法开始,查看askGeorg方法
当askGeorg返回true,建立tcp服务端接受要被转发的流量同时建立与tunnel.jsp的会话session跟进session类
跟进初始化方法,session初始化为线程类,获取tunnel服务端信息并建立连接池
跟进run方法,执行handleSocks方法
跟进handleSocks方法,判断socks4还是socks5,执行parseSocks5方法
跟进parseSocks5方法,sock.recv接收一个字节通过atyp判断请求类型,确定target和targetPort
setupRemoteSession判断socks5 cmd字段是否为connect,执行setupRemoteSession,设置远程会话获取cookie,获取成功则发送数据
跟进setupRemoteSession方法,header头设置X-CMD字段为CONNECT,将要访问的目标地址和端口发送到tunnel.jsp,若返回值200且返回包header中x-status为OK则返回此
cookie值。
回到parseSocks5中,若返回值为true,执行sock.sendall发送数据完成后返回true,回到handleSocks5。
handleSocks方法
回到run方法,标志会话构建流程结束开始数据交互
reader
跟进reader方法,通过reader方法不断读取返回data,将值返回本地tcp服务端
wirter
跟进writer方法,读取本地tcp服务端接收数据转发至代理server
closeRemoteSession关闭远程会话
fuzz限制访问的header字段Authorization: Basic xxxxCookie:svpnginfo=xxxxx
修改reGeorg突破限制分析完整个reGeorg搭建隧道的整个流程后,发现存在有5处访问tunnel.jsp请求,所以只要将fuzz出的限制字段添加到相关请求header头中即可。
askGeorg方法
2.setupRemoteSession
3.reader
4.writer
5.closeRemoteSession
调试,成功搭建隧道
https://www.cnblogs.com/BOHB-yunying/p/13491392.html
本文作者:TideSec
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/173645.html