一. 问题描述
某组织通过特殊手段获取到了城市供水企业的某些流量数据。作为安全研究人员需要分析出其中特殊流量数据,已知流量包为s7comm协议通信数据,流量中存在一条异常写入的数据。请尝试找出异常流量的ascii数据流。
二. 分析过程
1.首先把数据包中的data数据右击->应用为列, 这样就可以在列中查看.
2.将分析结果导出为csv,在此之前可以右击表头->不选中不必要的列,即只保留data和No. 两列,缩小数据量便于分析. 导出结果为data.csv
3.分析思路:
1.首先怀疑在一切正常的情况下报告错误,查询资料后, Return code和 Function有一些项是报告错误的,但是分析数据报文后,return code只有reserved和success两种,function 只有 write var, 故排除这种可能.
2.既然是数据错误,结合上课所讲,继续怀疑可能是缓冲区溢出攻击,怀疑数据长度和data实际长度不符,然后发现报文中所有transport size 都是4,length 都是10,所有的data长度都是8bit * 10 位.故也排除这种可能.
3.结合老师的提示,data是有规律的,再结合自己查找的资料,怀疑data 数据是很多个寄存器合并传输的, 因为现在没有一个寄存器位宽这么长,结合实际也不需要还这么长. 因此将data 数据以8bit 拆分开分析.尝试将每个字段都存储为列表观察规律,最后,除了第一个全是0xffff,其他字段目测都没有任何规律. 于是便尝试查找第一项不是0xffff的,编程实现,详情见代码NumberConver.py,结果恰巧发现一个.
三.程序源码
import csv
def main():
datalist = []
inslist = [[], [], [], [], []]
filename = "./data.csv"
with open(filename) as f:
render = csv.reader(f)
headrow = next(render)
print(headrow)
i = 0
for row in render:
no = row[0]
data = row[1]
ins0 = int(data[0:4], 16)
inslist[0].append(int(data[0:4], 16))
inslist[1].append(int(data[4:8], 16))
inslist[2].append(int(data[8:12], 16))
inslist[3].append(int(data[12:16], 16))
inslist[4].append(int(data[16:20], 16))
data10 = int(data, 16)
if ins0 != 65535:
print(ins0)
print(no)
# print(data10)
datalist.append(data10)
# i += 1
# if i == 1000:
# break;
# for i in inslist:
# print(i)
if __name__ == '__main__':
main()