首页
社区
课程
招聘
[推荐]工控plc固件逆向
发表于: 2018-7-8 22:42 9334

[推荐]工控plc固件逆向

2018-7-8 22:42
9334
工控plc固件逆向
请找出其WEB配置的密码

题目来自2018工控安全竞赛的一个题目,可以跟帖讨论

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2018-7-8 22:47 被netwind编辑 ,原因:
上传的附件:
收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 2513
活跃值: (575)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
USER
2018-7-9 10:44
0
雪    币: 10902
活跃值: (3288)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
3
风随雨行 USER
这个是错误的
2018-7-9 10:55
0
雪    币: 4
活跃值: (170)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼主多推荐ICS CTF相关的题目呀
2018-7-9 13:16
0
雪    币: 4997
活跃值: (3115)
能力值: ( LV15,RANK:550 )
在线值:
发帖
回帖
粉丝
5

是要找固件后门的密码?

 

https://paper.seebug.org/613/

最后于 2018-7-9 13:49 被diycode编辑 ,原因:
2018-7-9 13:49
0
雪    币: 10902
活跃值: (3288)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
6
diycode 是要找固件后门的密码?
是找WEB配置的密码  就是WEB登录界面的密码
2018-7-9 13:53
0
雪    币: 273
活跃值: (465)
能力值: ( LV15,RANK:848 )
在线值:
发帖
回帖
粉丝
7
"sysdiag", "factorycast@schneider" 这个吗?
2018-7-9 13:58
0
雪    币: 10902
活跃值: (3288)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
8
NearJMP "sysdiag", "factorycast@schneider" 这个吗?
答案我也不知道,你可以说说你是怎么找的
2018-7-9 14:29
0
雪    币: 273
活跃值: (465)
能力值: ( LV15,RANK:848 )
在线值:
发帖
回帖
粉丝
9
netwind 答案我也不知道,你可以说说你是怎么找的
哈哈,我应该是搞错了,我这是在jar包里翻出来的,看了下前面那个paper,感觉那个应该是正确玩法
2018-7-9 15:49
0
雪    币: 10902
活跃值: (3288)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
10
NearJMP 哈哈,我应该是搞错了,我这是在jar包里翻出来的,看了下前面那个paper,感觉那个应该是正确玩法
这个是找WEB配置密码 不是固件后门密码
2018-7-10 12:31
0
雪    币: 238
活跃值: (108)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
  public void writeFile()
    throws IOException
  {
    PrintWriter localPrintWriter = new PrintWriter(new FileWriter(System.getProperty("user.dir") + "\\userlist.dat"));
    writeUserData(localPrintWriter);
    localPrintWriter.close();
    
    localPrintWriter = new PrintWriter(new FileWriter(System.getProperty("user.dir") + "\\password.rde"));
    writePWData(localPrintWriter);
    localPrintWriter.close();
    
    localPrintWriter = new PrintWriter(new FileWriter(System.getProperty("user.dir") + "\\config.pwd"));
    writeConfigData(localPrintWriter);
    localPrintWriter.close();
  }

  public static String RotInput(String paramString)
  {
    StringBuffer localStringBuffer = new StringBuffer(paramString);
    for (int i = 0; i < localStringBuffer.length(); i++) {
      localStringBuffer.setCharAt(i, rot13(localStringBuffer.charAt(i)));
    }
    return localStringBuffer.toString();
  }

  private static char rot13(char paramChar)
  {
    if ((paramChar >= 'A') && (paramChar <= 'Z'))
    {
      paramChar = (char)(paramChar + '\r');
      if (paramChar > 'Z') {
        paramChar = (char)(paramChar - '\032');
      }
    }
    if ((paramChar >= 'a') && (paramChar <= 'z'))
    {
      paramChar = (char)(paramChar + '\r');
      if (paramChar > 'z') {
        paramChar = (char)(paramChar - '\032');
      }
    }
    return paramChar;
  }

  private void writePWData(PrintWriter paramPrintWriter)
    throws IOException
  {
    paramPrintWriter.print(this.Password);
  }
 
  private void writeConfigData(PrintWriter paramPrintWriter)
    throws IOException
  {
    paramPrintWriter.print(RotInput(this.configPassword));
  }

几个数据生成中 password.rde没过rot13, config.pwd过了 rot13

前面那篇paper里有点小问题,VxWorks内核wind的版本号2.5和VxWorks操作系统的版本号不是一个信息。
另外就是VxWorks内置的用户名、密码口令只是提供了一个配置机制和默认实现,具体的校验算法还是可以自行调整的~这样得到的密码应该是固件的telnet或ftp口令,应该不是web层面的口令。
最后于 2018-7-21 22:29 被HuangZhiHua编辑 ,原因:
2018-7-21 21:43
0
雪    币: 10902
活跃值: (3288)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
12
分析下看看WEB的登录口令在哪里
2018-7-22 10:40
0
雪    币: 238
活跃值: (108)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
netwind 分析下看看WEB的登录口令在哪里
那首先还是要确定web server的实例,VxWorks上自带的webserver,按说没有类似tomcat这么高的能力~主要是作为简单网络设备管理界面的,一个4.5M左右的镜像,不像足以支撑个jvm的样子~
...居然用了RTI NDDS...不便宜啊!

    // subhttppwd
    if ( !strcmp(0x23EF48, *(_DWORD *)(compiler_reserved + 4)) )
    {
      v13 = update_password_file2(v1);
      generate_temp_html_reply_file(v13);
    }
    // subrdepwd
    if ( !strcmp(0x23EF54, *(_DWORD *)(compiler_reserved + 4)) )
    {
      v14 = update_password_RDE(v1);
      generate_temp_html_reply_file(v14);
    }

signed int __fastcall update_password_file2(int a1)
{
  signed int v1; // r30@1
  signed int v2; // r29@1
  signed int v3; // r31@1
  int v4; // r3@12
  int v5; // r31@12
  __int16 saved_lr; // [sp+8h] [-20h]@1
  int compiler_reserved; // [sp+Ch] [-1Ch]@3

  v1 = 0x2414FC;
  v2 = 0x2414FC;
  v3 = 0x2414FC;
  dict_initState(&saved_lr, a1);
  while ( dict_nextState((int)&saved_lr) )
  {
    // user
    if ( strcmp(0x2416B0, *(_DWORD *)(compiler_reserved + 4)) )
    {
      // passwd
      if ( strcmp(0x2416A8, *(_DWORD *)(compiler_reserved + 4)) )
      {
        // cnfpasswd
        if ( !strcmp(0x2416B8, *(_DWORD *)(compiler_reserved + 4)) )
          v3 = *(_DWORD *)(compiler_reserved + 8);
      }
      else
      {
        v1 = *(_DWORD *)(compiler_reserved + 8);
      }
    }
    else
    {
      v2 = *(_DWORD *)(compiler_reserved + 8);
    }
  }
  if ( strcmp(v3, v1) )
    return 33;
  if ( (unsigned int)strlen(v2) > 0x3C )
    return 33;
  if ( (unsigned int)strlen(v1) > 0x3C )
    return 33;
  // /FLASH0/userlist.dat
  v4 = fopen(0x241690, 0x23F2E4);
  v5 = v4;
  if ( !v4 )
    return 33;
  fprintf(v4);
  fclose(v5);
  return 31;
}

外部webroot下面的各种jar文件可能是其他版本的部署数据,对于这个题目可能是冗余信息 。固件里有内置web server,应该有一个字典信息存储相应内容,没有暴露在外部文件系统上,可能在内嵌文件系统里。

int __fastcall bootp_builtin_cgi(int a1)
{
  int v1; // r30@1
  int v2; // r31@1

  v1 = a1;
  v2 = dict_alloc();
  if ( v1 )
    parseData(v1, v2);
  select_fun(v2);
  return dict_free(v2);
}
由此函数输入参数生成的字典。

int __fastcall cgi_test_compatibility_handler(int a1)
{
  int v1; // r31@1
  int v2; // r3@1
  int result; // r3@1

  v1 = a1;
  v2 = strchr(*(_DWORD *)(a1 + 56), 63);
  bootp_builtin_cgi(v2 + 1);
  result = http_send_file(v1, 2367884, 1);
  if ( result )
    result = http_send_error(v1, 600, 2367904, 0);
  return result;
}

int __fastcall https_product_specific_handlers(int a1)
{
  int v1; // r28@1

  v1 = a1;
  url_set_handler(*(_DWORD *)(a1 + 28), 2367380, formatFlash_compatibility_handler, 0, -20478);
  url_set_handler(*(_DWORD *)(v1 + 28), 2367412, chkdsk_handler, 0, -20478);
  url_set_handler(*(_DWORD *)(v1 + 28), 2367436, reboot_compatibility_handler, 0, -20478);
  url_set_handler(*(_DWORD *)(v1 + 28), 0x241FE4, cgi_test_compatibility_handler, 0, -20478);// /secure/embedded/builtin
  url_set_handler(*(_DWORD *)(v1 + 28), 2367488, language_handler, 0, -28670);
  url_set_handler(*(_DWORD *)(v1 + 28), 2367500, GDa_IF, 0, -28670);
  url_set_handler(*(_DWORD *)(v1 + 28), 2367524, DHCPa_IF, 0, -28670);
  url_set_handler(*(_DWORD *)(v1 + 28), 2367552, webdiag_compatibility_handler, 0, -28670);
  url_set_handler(*(_DWORD *)(v1 + 28), 2367584, webdiag_compatibility_handler, 0, -28670);
  url_set_handler(*(_DWORD *)(v1 + 28), 2367616, webdiag_compatibility_handler, 0, -28670);
  return url_set_handler(*(_DWORD *)(v1 + 28), 2367648, webdiag_compatibility_handler, 0, -28670);
}

/secure/embedded/ http_passwd_config.htm这个页面会触发对 /secure/embedded/builtin的调用,也就会被 cgi_test_compatibility_handler 这个内置cgi处理。
最后于 2018-7-22 23:49 被HuangZhiHua编辑 ,原因:
2018-7-22 21:46
0
雪    币: 10902
活跃值: (3288)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
14
你用的什么插件反编译的PPC指令? 研究研究看看WEB密码是啥
2018-7-23 10:46
0
雪    币: 1222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
账号密码都是大写user
2018-8-7 14:17
0
游客
登录 | 注册 方可回帖
返回
//