某塔的线上比赛平台,最后一道一堆蜜罐,听说没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)