misc
签到卡
Solved by gdd
进去之后是这样的一个打字机的界面,提示采用 python3 语言作为内容解释器,于是想着可以执行 python 里面的命令来获取 flag
输入 print(open(‘/flag’).read())
得到 flag:flag{c399eb83-5d65-4139-b4d5-9a072f28538f}
被加密的生产流量
Solved by **gdd
附件下载下来是一个.pcag 的流量包,放进 wireshark 里分析
发现这是工业里的一种传输方式 modbus 的流量,于是着重分析 modbus 的 tcp 流
首先使用 python 的 pyshark 库分析功能码,用到以下代码
import pyshark
def get_code():
captures = pyshark.FileCapture("modbus.pcap")
func_codes = {}
for c in captures:
for pkt in c:
if pkt.layer_name == "modbus":
func_code = int(pkt.func_code)
if func_code in func_codes:
func_codes[func_code] += 1
else:
func_codes[func_code] = 1
print(func_codes)
if __name__ == '__main__':
get_code()
运行结果如下,发现它有 3 和 6 两个功能码,其中 3 用于读保持寄存器,6 用于预置单寄存器,两个都分析一遍
用以下的脚本把两个功能码里的内容读出来
import pyshark
def find_flag():
cap = pyshark.FileCapture("modbus.pcap")
idx = 1
for c in cap:
for pkt in c:
if pkt.layer_name == "modbus":
func_code = int(pkt.func_code)
if func_code == 3: #查找的功能码
payload = str(c["TCP"].payload).replace(":", "")
print("content[*] is " + payload)
print("{0} *".format(idx))
idx += 1
def hex_to_ascii(payload):
data = payload
flags = []
for d in data:
_ord = ord(d)
if (_ord > 0) and (_ord < 128):
flags.append(chr(_ord))
return ''.join(flags)
if __name__ == '__main__':
find_flag()
在功能码 3 中得到了一长串数据:
发现这些数据里短的数据一直到 98 位的后四位字符都不同,于是就想到用 hex 解码,每行提取下来之后解得:MMYWMX3GNEYWOXZRGAYDA===
base32 解码得到:c1f_fi1g_1000
所以 flag 即为:flag{c1f_fi1g_1000}
pyshell
Solved by **gdd
nc 进去之后发现是一个 python 的命令行
试了一圈发现 import os ls 等都被过滤了,于是使用拼接字符串绕过,利用了短下划线会输出上一次输出的结果的特性拼接,然后 exec( _ ) 运行,如下图,运行 import os
同理我们也可以这样构造,从而执行 os.system(“ls”)
最后直接执行 os.system(“cat flag”)
得到 flag:flag{2858c7ad-10c5-42d3-9a09-8af51edc209a}