美文网首页nas
内网穿透工具总结

内网穿透工具总结

作者: CSeroad | 来源:发表于2020-11-28 14:51 被阅读0次

    前言

    之前写了一篇搭建http隧道的文章,用来总结在不出网的情况下如何内网渗透。所以这里就再总结一下在出网的情况下用来内网穿透的好用工具。

    frp

    frp 简介

    frp 使用go语言开发,是一款高性能的反向代理应用,可以轻松地进行内网穿透,对外网提供服务。frp支持 TCP、UDP、KCP、HTTP、HTTPS等协议类型。

    frp 下载

    https://github.com/fatedier/frp/releases?after=v0.31.0 下载amd文件,测试使用0.28.2版本

    frp 配置文件

    下载好后,先看一下frp的相关文件
    服务段frps.ini

    [common]
    # 通用设置
    bind_addr = 0.0.0.0
    bind_port = 7000
    # frp 监听地址
    bind_udp_port = 7001
    # 配置udp端口
    kcp_bind_port = 7000
    # 用于kcp协议的udp端口,如果未设置,则在frps中禁用kcp
    proxy_bind_addr = 127.0.0.1
    # 代理服务器绑定地址
    vhost_http_port = 80
    vhost_https_port = 443
    # 配置http与https端口
    dashboard_addr = 0.0.0.0
    dashboard_port = 7500
    dashboard_user = admin
    dashboard_pwd = admin
    # 配置dashboard以查看仪表盘与登陆信息
    enable_prometheus = true
    # 普罗米修斯运维服务
    log_file = ./frps.log
    # 日志路径
    log_level = info
    log_max_days = 3
    # 日志信息和日志记录最大时间
    disable_log_color = false
    # 禁用日志颜色,默认值为false
    detailed_errors_to_client = true
    # 是否将错误信息发送到frpc。默认情况下true。
    authentication_method = token
    # 授权验证方式
    authenticate_heartbeats = false
    # 是否在发送到frp的心跳中包含身份验证令牌,默认false
    authenticate_new_work_conns = false
    # 是否在发送到frp的新工作连接中包含身份验证令牌。默认false
    token = 12345678
    # 秘钥
    oidc_client_id =
    # 用于在OIDC身份验证中获取令牌的客户端ID
    oidc_client_secret = 
    # 用于在OIDC身份验证中获取令牌的客户端密码
    oidc_audience = 
    # 指定OIDC身份验证中令牌的访问群体
    oidc_token_endpoint_url = 
    # 如果AuthenticationMethod =="oidc",它将用于获取OIDC令牌
    allow_ports = 2000-3000,3001,3003,4000-50000
    # 允许的端口
    max_pool_count = 5
    # 仅允许frpc绑定您列出的端口
    max_ports_per_client = 0
    # pool_count的最大值
    tls_only = false
    # tlsonly指定是否仅接受TLS加密连接,默认false
    subdomain_host = frps.com
    # 当测试子域时,路由使用的主机
    tcp_mux = true
    # 使用tcp流多路复用,默认为true
    [plugin.user-manager]
    addr = 127.0.0.1:9000
    path = /handler
    ops = Login
    # 插件管理
    [plugin.port-manager]
    addr = 127.0.0.1:9001
    path = /handler
    ops = NewProxy
    # 插件管理
    

    客户端frpc.ini

    [common]
    # 通用设置
    server_addr = 0.0.0.0
    server_port = 7000
    # 服务端配置
    http_proxy = http://user:passwd@192.168.1.128:8080
    # 通过http代理或socks5代理连接frps
    log_file = ./frps.log
    # 日志路径
    log_level = info
    log_max_days = 3
    # 日志信息和日志记录最大时间
    disable_log_color = false
    # 禁用日志颜色,默认值为false
    token = 12345678
    # 用于身份验证
    admin_addr = 127.0.0.1
    admin_port = 7400
    admin_user = admin
    admin_pwd = admin
    # 通过api设置frpc控制台
    pool_count = 5
    # 连接将提前建立,默认值为零
    tcp_mux = true
    # 使用tcp流多路复用,默认为"true"
    user = your_name
    # 更改代理名称
    login_fail_exit = true
    # 第一次登录失败时是否退出程序,默认true
    protocol = TCP
    # 用于连接服务器的通信协议,支持tcp,kcp,websocket。默认tcp协议。
    tls_enable = true
    # 如果tls_enable为true,则frpc将通过tls连接frps
    dns_server = 8.8.8.8
    # 指定一个dns服务器,因此frpc将使用此服务器代替默认服务器
    meta_var1 = 123
    meta_var2 = 234
    # 客户端的其他元信息
    
    
    [ssh]
    # 支持 tcp | udp | http | https | stcp | xtcp,默认为tcp
    type = tcp
    local_ip = 127.0.0.1
    local_port = 22
    # 限制此代理的带宽
    use_encryption = false
    # 对frps和frpc之间的消息进行加密,默认为false
    use_compression = false
    # 是否压缩,默认fasle
    remote_port = 6001
    # 设置远程监听端口
    
    group = test_group
    # 设置组
    group_key = 123456
    # 设置组密码
    health_check_type = TCP
    # frpc连接本地服务的端口以检测其健康状态
    health_check_timeout_s = 3
    # 设置检查连接超时时间
    health_check_max_failed = 3
    # 设置连续3次失败,则代理将从frps中删除
    health_check_interval_s = 10
    # 设置每10秒进行一次健康检查
    meta_var1 = 123
    meta_var2 = 234
    # 每个代理的其他元信息
    

    以下就是一些实例:
    [ssh_random]
    [range:tcp_port]
    [DNS]
    [range:udp_port]
    [web01]
    [web02]

    frp使用

    搭建socks5隧道

    frps.ini

    [common]
    bind_addr = 0.0.0.0
    # 绑定的ip,为本机
    bind_port = 7000
    # 绑定的端口
    dashboard_addr = 0.0.0.0
    # 管理地址
    dashboard_port = 4000
    # 管理端口
    dashboard_user = root
    # 管理的用户名
    dashboard_pwd  = 1qaz2wsx
    # 管理用户的密码
    token = 1qaz2wsx
    # 客户端服务端连接的密码
    heartbeat_timeout = 90
    # 心跳超时时间
    max_pool_count = 5
    # 最大同时连接数
    

    服务端运行命令

    ./frps -c  frps.ini
    
    image.png

    frpc.ini

    [common]
    server_addr = 106.53.97.7
    server_port = 7000
    # 服务器绑定的端口
    token = 1qaz2wsx
    # 连接的密码
    tls_enable = true
    # 启用tls
    pool_count = 5        
    protocol = tcp
    # 协议类型
    health_check_type = tcp
    health_check_interval_s = 100
    # 设置健康检查时间
    
    [test] 
    remote_port = 2333
    # 代理的端口
    plugin = socks5
    # 使用的协议
    use_encryption = true
    # 是否加密
    use_compression = true
    # 是否压缩
    

    先对流量加密,再用TLS加密,保障传输安全。
    客户端运行

    ./frpc -c  frpc.ini
    
    image.png

    对应上面test设置的socks5代理。

    image.png

    使用SocksCap64设置firefox浏览内网网页。

    image.png

    这里的socks5代理没有设置用户名、密码。
    如果设置,需要增加两个配置项。

    plugin_user = cseroad
    plugin_passwd = cseroad123
    

    再推荐几个配置项

    tls_enable = true      # 从0.25.0版本开始 frp 支持通过 TLS 协议加密传输
    use_encryption = true  # 通信内容加密传输
    use_compression = true # 是否压缩
    

    wireshark抓取未配置这几项之前的通信流量。

    image.png

    可以显而易见看到来源地址,目的地址,通信的端口,以及正在访问的网页。

    添加上面几项后,再次抓取数据包,可以看到通信内容已经加密。

    image.png

    防护手法:可以在流量设备上禁止gryphon协议,因为frp每次连接都会有gryphon协议的包去认证frp服务器。

    搭建tcp隧道

    frps.ini

    [common]
    bind_addr = 0.0.0.0
    # 绑定的ip,为本机
    bind_port = 7000
    # 绑定的端口
    dashboard_addr = 0.0.0.0
    # 管理地址
    dashboard_port = 4000
    # 管理端口
    dashboard_user = root
    # 管理的用户名
    dashboard_pwd  = 1qaz2wsx
    # 管理用户的密码
    token = 1qaz2wsx
    # 客户端服务端连接的密码
    heartbeat_timeout = 90
    # 心跳超时时间
    max_pool_count = 5
    # 最大同时连接数
    

    frpc.ini

    [common]
    server_addr = 109.xxx.xxx.9
    server_port = 7000
    token = 1qaz2wsx
    tls_enable = true
    
    [test]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 3389
    remote_port = 33389
    use_encryption = true
    use_compression = true
    

    访问公网的33389即可访问客户端的3389端口,完美实现端口转发。

    image.png

    补充:
    linux后台运行

    nohup ./frps -c frps.ini >/dev/null 2>&1 &
    

    停止方式

    ps -aux|grep frp| grep -v grep  # 找到进程
    kill -9 进程号   # 杀死进程
    

    frp 的缺点是需要落地配置文件。
    当然,uknowsec 大佬改造出了配置文件不落地的方案。https://github.com/uknowsec/frpModify

    nps

    nps简介

    nps也是go语言编写,是一款强大的内网穿透工具。同样支持tcp、udp流量转发、内网http代理、内网socks5代理、p2p等,并带有强大的web管理端。比frp更强大。

    nps下载

    https://github.com/ehang-io/nps/releases/tag/v0.25.1 下载amd文件

    nps配置

    下载后查看一下文件目录。
    server端

    image.png

    在nps目录下有一个nps可执行文件、conf配置目录和web网页目录,我们使用的时候只需要修改conf/nps.conf即可。
    以下表格来源 官方文档

    名称 含义
    web_port web管理端口
    web_password web界面管理密码
    web_username web界面管理账号
    web_base_url web管理主路径,用于将web管理置于代理子路径后面
    bridge_port 服务端客户端通信端口
    https_proxy_port 域名代理https代理监听端口
    http_proxy_port 域名代理http代理监听端口
    auth_key web api密钥
    bridge_type 客户端与服务端连接方式kcp或tcp
    public_vkey 客户端以配置文件模式启动时的密钥,设置为空表示关闭客户端配置文件连接模式
    ip_limit 是否限制ip访问,true或false或忽略
    flow_store_interval 服务端流量数据持久化间隔,单位分钟,忽略表示不持久化
    log_level 日志输出级别
    auth_crypt_key 获取服务端authKey时的aes加密密钥,16位
    p2p_ip 服务端Ip,使用p2p模式必填
    p2p_port p2p模式开启的udp端口
    pprof_ip debug pprof 服务端ip
    pprof_port debug pprof 端口
    disconnect_timeout 客户端连接超时,单位 5s,默认值 60

    client端

    image.png

    首先客户端有多个使用方式。

    1. 可以直接无配置文件使用
    ./npc -server=ip:port -vkey=web界面中显示的密钥
    
    1. 也可以注册到系统服务进行使用
      如linux下
    sudo ./npc install 其他参数(例如-server=xx -vkey=xx或者-config=xxx) 注册
    sudo npc start  启动
    sudo npc stop   停止
    sudo npc uninstall  卸载
    
    1. 也可以配置文件进行是使用,这就类似frp了。
    ./npc -config=npc配置文件路径
    

    查看npc.conf配置文件

    名称 含义
    server_addr 服务端ip/域名:port
    conn_type 与服务端通信模式(tcp或kcp)
    vkey 服务端配置文件中的密钥(非web)
    username socks5或http(s)密码保护用户名(可忽略)
    password socks5或http(s)密码保护密码(可忽略)
    compress 是否压缩传输(true或false或忽略)
    crypt 是否加密传输(true或false或忽略)
    rate_limit 速度限制,可忽略
    flow_limit 流量限制,可忽略

    再往下示具体模式进行配置。
    具体参考官方文档

    nps使用

    server端启用nps
    编辑nps.conf配置文件

    appname = nps
    #Boot mode(dev|pro)
    runmode = dev
    
    ##bridge
    #底层通信协议,默认tcp,可选用kcp协议
    bridge_type=tcp
    #底层通信端口,默认8024,如已被占用请指定其他端口
    bridge_port=8024
    bridge_ip=0.0.0.0
    
    #当客户端以配置文件模式启动时会用到的验证密钥,可自行设置
    public_vkey=cseroad
    
    #web 控制台
    web_host=10.xx.xx.7
    web_username=cseroad
    web_password=cseroad.com
    web_port=18080
    web_ip=0.0.0.0
    

    启动nps

    ./nps start
    
    image.png

    访问18080端口,输入控制台用户密码,即可登录

    image.png

    搭建socks5隧道

    新增一条客户端。

    image.png

    设置"不以配置文件运行",且压缩加密。

    image.png

    客户端运行web控制台给出的命令。

    image.png

    可以在无配置文件的情况下,上线成功。运行成功后status状态变为"online"

    这时候就可以增加socks5代理。

    image.png

    这时候就可以使用SocksCap64 设置端口,以及basic权限认证的用户名密码。访问内网。

    image.png

    当然也可以选择加载npc.conf配置文件来运行npc,注意也要设置相对应的basic权限认证。

    搭建tcp隧道

    同样创建tcp隧道。

    image.png

    用mac的microsoft remote desktop 远程连接公网的33389即可。完美实现端口转发。

    image.png

    metasploit

    metasploit作为红队神器,本身也有内网穿透的功能。
    在获取session之后,可进行端口转发以及创建socks5隧道。

    转发端口

    portfwd用来转发单个端口

    portfwd add -l 33389 –p 3389 -r 10.211.55.19
    # 添加转发
    portfwd delete -l 33389 –p 3389 -r 10.211.55.19
    # 删除转发
    portfwd list
    # 列出当前转发的列表
    portfwd flush
    # 移除所有转发端口
    

    创建socks5隧道

    在有session基础上,先添加路由

    run get_local_subnets
    # 获取路由
    run autoroute -s 10.211.55.0/24
    # 添加路由
    run autoroute -p
    # 显示路由
    
    image.png

    再创建socks5隧道

    use auxiliary/server/socks5
    set srvhost 127.0.0.1
    set srvport 1080
    run
    

    没有设置用户名和密码。

    image.png

    metasploit同时具有socks4和socks5两个模块。socks4只支持TCP协议,socks5支持TCP和UDP。
    再使用proxychains命令进行代理访问

    image.png

    cobalt strike

    cobalt strike也一样具有内网穿透的能力。同样首先需要一个beacon

    image.png

    端口转发

    beacon自带了一个端口转发的命令rportfwd

    rportfwd 本机端口 目标ip 目标端口  
    

    创建socks4隧道

    选择SOCKS Server

    image.png image.png

    可用来创建socks4隧道。
    对应的代理也需要设置为socks4协议

    image.png

    可成功访问。

    image.png

    在创建成功后,可以使用"Proxy Pivots"代理metasploit走内网。

    image.png

    复制该命令到metasploit配置里。该设置为全局设置,一次设置,metasploit各个模块全部可用。
    比如使用smb_login模块

    setg Proxies socks4:172.16.252.11:1080    设置本地的msf走cs的socks4代理
    setg ReverseAllowProxy true               建立双向通道
    use auxiliary/scanner/smb/smb_version     探测smb版本
    
    image.png

    其余内网穿透工具,如ew、ngork因为实际应用、免杀性就不多记录了。

    总结

    1. 实战时注意将通信流量进行加密、压缩
    2. 注意将socks5代理设置为认证状态
    3. 在使用tcp协议上进行加密、压缩还不行的情况下,不妨试一下kcp协议

    参考资料

    https://blog.arey.fun/archives/8/
    https://whoamianony.top/2020/07/07/shen-tou-ce-shi/nei-wang-chuan-tou-gong-ju-frp-de-shi-yong/#toc-heading-5

    相关文章

      网友评论

        本文标题:内网穿透工具总结

        本文链接:https://www.haomeiwen.com/subject/hhhviktx.html