多种应急场景下的正反向代理远程登录实现

多种应急场景下的正反向代理远程登录实现

日常应急响应中,大部分case需要上机排查。但是客户环境多种多样,以往依赖于vnc对云上机器进行应急响应方式,效率非常低下(相信使用过vnc的同学应该深有体会)。因此我们对不同应急场景下的远程登录方式做了总结和归纳,希望能提升工作中应急响应效率。

应急响应上机排查现状

常见应急场景分类

  1. 目标机器有公网ip
  2. 目标机器在内网可出网
  3. 目标机器在内网且不可出网,边界服务器可出网有公网ip
  4. 目标机器在内网且不可出网,边界服务器可出网但无公网ip
  5. 目标机器所在内网与外网完全隔离

应急准备工作

日常应急中考虑到客户可能会设置白名单登录,通常应急需要会让客户给我们的出口ip加白。为保证组内同学都可以上机排查,我们统一使用跳板机登录。这样客户也只用加白我们的跳板机即可。

  • windows 跳板机 一台
  • linux 跳板机 一台

场景一:目标机器有公网ip

这种方式是最简单的,机器有公网ip可以直接远程连接,无论windows还是linux都可以直接登录,暂不做讨论。

场景二:目标机器在内网可出网

这种场景也是比较常见的,就是目标机器无法外网直接访问但是自身可以访问外网。这里分为linux和windows下两种实现方式。

linux下使用ssh远程端口转发

远程转发是指把登录主机所在网络中某个端口通过本地主机端口转发到远程主机上。

远程端口转发

有目标机器可以出网,所以在目标机器上使用 ssh client 来反向连接我们应急跳板机的 ssh server 实现远程端口转发。可以简单理解为反弹shell,反向代理。

先介绍ssh常用的几个参数:

    -C  压缩数据传输
    -f  后台登录用户名密码
    -N  不执行shell[与 -g 合用]
    -g  允许打开的端口让远程主机访问        
    -L  本地端口转发
    -R  远程端口转发
    -p  ssh 端口

远程转发通过参数 -R 指定。注意:sshd_config里要打开AllowTcpForwarding选项,否则-R远程端口转发会失败。
格式:-R [登录主机:]登录主机端口:本地网络主机:本地网络主机端口。

ssh -fNCR :2222:127.0.0.1:22 用户名@远程主机ip

由于我们只需要转发端口而不需要执行shell,所以建议加上 -fNC 参数。

不加参数的效果

我们来到远程转发端口的主机查看效果。先查看端口监听状况。

使用远程端口转发操作完成后,需要关闭端口转发只能通过kill 进程的方式结束。

优势:
由于转发的端口在远程主机上127.0.0.1上,只能本地访问。未将端口暴露在公网上,安全性可以得到保证。同时目标主机被连接后会显示连接ip为127.0.0.1。

补充:
默认sshd的配置文件是没有开启tcp转发的,因此默认会绑定到127.0.0.1而不是0.0.0.0。如果要绑定到0.0.0.0使端口可被公网访问需打开sshd_config里的GatewayPorts选项。

windows下使用openssh远程端口转发

由于大部分的Windows Server 都默认没有安装openssh,其实这个并非是最优的解决方案。但是在一些特殊场景下依然有可行性。该方案和上面linux的远程端口转发完全一致,但需要事先安装openssh。

对windows 应急跳板机的要求

1、验证 SSH 服务器是否已安装。

Get-WindowsCapability -name openssh.server* -online

2、安装 OpenSSH 服务器。

Get-WindowsCapability -name openssh.server* -online | Add-WindowsCapability -Online
在线安装openssh
openssh安装完成

3、将 SSH 服务配置为自动启动。

Set-Service -Name sshd -StartupType 'Automatic'

4、启动 SSH 服务。

Start-Service sshd

5、创建防火墙规则以允许在 SSH 端口上输入数据包。

New-NetFirewallRule -DisplayName "ALLOW SSH TCP 22" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 22

6、查看sshd端口是否监听成功。

7、测试ssh连接。

此外在需要远程转发的windows机器上也需要安装openssh客户端。除了使用上面命令行在线安装的方式也可以下载安装包。

微软的PowerShell团队已经支持openssh,所以安装文件我们可以在github的powershell团队项目根据系统对应下载后解压。
下载地址: https://github.com/PowerShell/Win32-OpenSSH/releases

解压后放入C:\Program Files\目录下。

powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1

同理在windows上使用ssh远程端口转发和linux的操作都是一样的,只是把转发的22端口改为3389即可,就不再赘述了。

windows下使用远程桌面程序

这种方式最简单方便,在日常应急中会遇到很多客户使用远程桌面程序来操作云服务器。有时为应对客户的需求,比如客户要求只能用向日葵,teamviewer。
不过这种方式需要先征得客户同意后才能使用。

个人使用效果比较好的有 todesk。精简版体积非常小,点对点直连远程效果还不错。

场景三:目标机器在内网且不可出网,边界服务器可出网有公网ip

linux下使用ssh本地端口转发

由于条件限制,目标主机在内网且不可出网。这类情况通常为内网生产服务器,比如数据库服务器等。面对这类情况往往需要内网中一台边界服务器(可出网)作为跳板连接。利用边界服务器作为正向代理。

将本地主机某个端口流量转发到远程主机的指定端口。

本地端口转发

其命令行语法是:
-L [bind_address]:localport:remote_host:remote_port。
-L 即 local 的首字母,类似的远程转发的 -R 是 remote 的首字母,动态转发的 -D 是 dynamic 的首字母。

假设host1是目标的边界服务器(有公网ip),host2是目标服务器(在内网且不出网)。由于边界服务器可出网且有公网ip,所以可直接在边界服务器上做本地转发的操作。

在host1(边界服务器)上执行命令如下:

[root@host1 ~]# ssh -fNCL :2222:host2:22 user@host1 -p22

因为默认是绑定的0.0.0.0,所以外网主机也可以通过访问该主机的2222端口实现对内网不出网主机的访问。

window下使用netsh实现端口转发

当边界服务器系统是windows的情况下可使用netsh命令进行端口转发实现正向代理。

对于Windows Server 2008以下版本的系统,需要安装IPV6才行,如果是Windows Server 2008或者以上的系统则默认已经支持。使用Portproxy模式下的Netsh命令即能实现Windows系统中的端口转发,转发命令如下。

netsh interface portproxy add v4tov4 listenaddress=localaddress listenport=localport connectaddress=destaddress connectport=destport

每个参数的意义:

  • 1.listenaddress — 等待连接的本地ip地址(内网ip)
  • 2.listenport — 本地监听的TCP端口(待转发)
  • 3.connectaddress — 被转发端口的本地或者远程主机的ip地址
  • 4.connectport — 被转发的端口

下面的命令是用来展示系统中的所有转发规则:

netsh interface  portproxy show  all

删除刚才创建的那个转发的命令:

netsh interface  portproxy delete v4tov4 listenaddress=localaddress listenport=localport

注意:连接时请确保防火墙(Windows防火墙或者其他的第三方防护软件)允许外部连接到一个全新的端口,如果不允许,那么只能自行添加一个新的Windows防火墙规则。

当前主机防火墙处于开启状态

刚才我们配置的监听2222端口是成功了,可是由于windows自身的防火墙未放行2222端口导致外部访问是失败的。

防火墙放行转发端口

但是为了安全起见,可以设置该端口白名单访问。

补充windows防火墙的相关命令参数: net firewall

  • set opmode mode=enable //开启防火墙
  • set opmode mode=disable //关闭防火墙
  • show opmode // 显示防火墙端口配置
  • show portopening // 显示防火墙端口配置
  • show service // 显示防火墙服务配置
  • show state // 显示当前防火墙状态  

示例命令如下:

  • netsh firewall show allowedprogram //查看防火墙放行的程序 
  • netsh firewall set portopening TCP 445 ENABLE //打开445端口 

场景四:目标机器在内网且不可出网,边界服务器可出网但无公网ip

与上一种场景很类似,不同在于边界服务器没有公网ip。此时在边界服务器上使用使用本地转发实现正向代理的方式也行不通了。

linux下在边界服务器上使用ssh远程端口转发

和场景二非常类似,只不过执行远程端口转发的主机不再是不可出网的目标服务器,而是边界服务器。由于边界服务器可访问外网,在完成远程端口转发后得到边界服务器shell后再ssh连接内网的目标服务器。

windows下在边界服务器上使用openssh远程端口转发

在边界服务器也没有公网ip的情况下,netsh端口转发的方式已经失效了。此时还得依赖于openssh。虽然相对麻烦,但对于极端场景下还是可用的。
具体的操作过程参照场景二。

场景五:目标机器所在内网与外网完全隔离

这类场景通常为客户线下自建IDC机房或者部分混合云。但这种方式通常会使用堡垒机进行集中管理。

结合之前一个混合云场景应急的case分析(混合云vnc也无法使用)。

目标机器所处内网没有任何主机出网。客户使用办公PC(windows)通过堡垒机登录内网主机,办公PC需要设置代理才可访问外网。与客户协商后,使用远程桌面控制软件程序(Teamviewer,客户要求可设置代理)进行排查。

案例背景

面对极端场景,端口转发的方案都失效了。只能通过远程桌面控制程序操作。暂时没有想到更优的解决方案,如果大家有更好的想法,可以留言评论。

Print Friendly, PDF & Email
赞赏

微信赞赏支付宝赞赏

Zgao

愿有一日,安全圈的师傅们都能用上Zgao写的工具。