记某工控CTF比赛一道ICMP隧道题

某塔的线上比赛平台,最后一道一堆蜜罐,听说没flag,反正没找到。然后看一下其中一道ICMP隧道的题目。
数据包如图:
数据包
当时的考量:
响应包有的,请求包也有,并且都一样,所以请求包的数据是最全的,可以不看响应包。
考虑到填充不符合正常的ICMP请求应答的填充方式,也尝试了对数据进行解密,但都无果。
两个通信IP没有什么有用信息。
考虑过包长度转ASCII字符的这个问题,但是看到整个包的长度超过了127,觉得不太可能就放弃了。后来实在找不出来,看了下ICMP包头长度,然后明白了可能只是数据长度。

以下是解题脚本:

#!/usr/bin/python
# coding=utf8
# @Author:B1u3Buf4

import pyshark
import base64


L_flag= []
packets = pyshark.FileCapture('xxx.pcap')
for packet in packets:
    for pkt in packet:
        if pkt.layer_name == "icmp": 
            if int(pkt.type) != 0:
                L_flag.append(int(pkt.data_len))
print(base64.b64decode(''.join([chr(c) for c in L_flag])))

有老哥吐槽说这题太脑洞了,谁能构造这样的流量也是够煞费苦心了。没有直接的文本特征,识别起来比较麻烦的,确实有一定的隐蔽性,但是作隧道可能通信效率太低了。然后无聊就写了一个构造这样发包的。

#!/usr/bin/python
# coding=utf8
# @Author:B1u3Buf4

import string
import time
import random
from scapy.all import *


def ICMP_tunnel_sender(dip, words):
    i = 0
    dic = string.ascii_lowercase
    for char in words:
        length = ord(char)
        data = ''.join([dic[i % 26] for i in range(length)])
        p = IP(dst=dip)/ICMP(type=8, code=0, id=1, seq=i)/data
        send(p)
        i += 1
        time.sleep(random.randint(1, 10)/10)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章