Day81--代码审计-PHP项目_MVC注入_CNVD拿1day_SQL监控_动态调试等
利用正则表达式(搜取敏感函数)
数据库监控-QQ业务源码系统(无过滤)
构造XFF,可以通过抓包伪造数据包
正则表达式-Bluecms源码系统(无过滤)
CNVD拿1day(存在漏洞但是没有公开,没有exp)
MVC 设计模式
梦想CMS后台Bo***.cl***.php文件存在SQL注入漏洞
LmxCMS V1.4琴台Ta***.cl***.php存在SQL注入漏洞
所以$data = p(2,1,1)中函数p表示post提交方式,有转义,有过滤
详解php魔术方法addslashes
关键!!!
Day82--代码审计-PHP项目-MVC文件安全_上传_包含_下载_删除_读取等
php unlink函数
梦想CMS存在任意文件删除漏洞
删除成功后,再次访问install目录,提示重新安装
梦想CMS存在任意文件读取
php常见文件读取函数
php内置打印函数var_dump
文件安全-文件下载-功能点定位-earmusic
采用功能追踪的方式而不是关键字搜索的方式
通过数据包中字段的修改实现文件下载的操作
经过数据库分析得,下载的文件由in_audio决定
从上传音乐得功能方面分析,寻找in_audio的决定值
所以,音频地址决定了in_audio
在实现任意文件下载的时候发现存在过滤,过滤为Safety filter。经分析得,过滤了点('.'),正斜杠('/'),'?iframe=','.php',所以要采用绝对路径的方式绕过
成功读取到数据库相关配置信息
ZZZCMS文件删除漏洞
mvc模型源码跟常规源码的分析区别:mvc中函数在类中声明,常规源码中函数则需要谁调用了
常规源码中函数
mvc模型中函数,直接在域名路径中a=editfile
Day83--代码审计-RCE安全_调试_追踪_代码执行_命令执行
百家CMS微商城存在命令执行漏洞(CNVD-2021-12800)
Day84--代码审计-PHP项目_变量覆盖_反序列化_未授权访问_身份验证
BossCMS实现任意文件删除(未授权访问)
其中变量file由id决定,id是get传参
其中delete函数得具体实现
漏洞所在
漏洞的更新修复
然而未授权访问即在未登录到后台得情况下,构造并执行删除等数据包,成功执行
熊海CMS(SEACMS)逻辑验证漏洞
抓包修改数据包
成功登录到后台
php反序列化引起读取
php反序列化常见函数
构造payload
Day85--代码审计-PHP项目_TP框架_SQL_XSS_架构_路由_调试_写法
thinkphp框架
思路分析
CNVD拿1day-HSYCMS
调试设置
config.php
database.php
设置延时
Day86--代码审计-PHP项目_TP框架_安全写法_1day利用_0day分析
thinkphp3.2
流程
YxtCMF
Day87--代码审计-NET项目_DLL反编译_MSSQL监控_VS搜索_注入_上传
反编译
反编译的目的:寻找封装代码
Day88--代码审计-NET项目_DLL反编译_未授权访问_脆弱验证_注入_上传
脆弱验证(固定判断身份)
思路
直接登录到后台
验证未引用
找到了验证文件,如果其他文件没有调用/引用该文件,就不受限制,可以直接访问,否则会进行跳转到login登录界面
思路:尽可能使变量DonforYhm符合admin中数据,返回值就不等于0,那么就会进行跳转
Day89--代码审计-JAVA项目_JDBC_Mybatis_Hibernate_注入_预编译_写法
jdbc进行sql注入
Mybatis进行sql注入
Hibernate
Day90--代码审计-JAVA项目_filter过滤器_CNVD分析_XSS跨站_框架安全
Demo-filter过滤器引用
访问jsp后缀文件时会调用过滤规则函数(一般过滤器名字跟路由在web.xml文件中)
Jeesns-XSS跨站绕过
配置文件中引用过滤器
过滤器中new一个XssWrapper类
XssWrapper类中的存在过滤规则
悟空CRM-Fastjson组件漏洞
利用dnslog
Day91--代码审计-JAVA项目_访问控制_Shrio框架_filter过滤器_CNVD分析
逻辑越权-WS租车系统-传统验证机制
普通用户界面(客户)
admin用户界面
漏洞利用:普通用户直接访问admin用户的功能域名地址,普通用户界面可以展示admin内容信息
漏洞产生:admin跟普通用户都有相应的操作功能,只是在前端界面的区别
CNVD-Tumo-未授权访问-Shiro框架引用
在配置文件中发现引用到Shiro框架
CNVD-华夏ERP-未授权访问-filter过滤器
过滤器
漏洞利用(利用 ../ 的方式直接绕过过滤器)
Day92--代码审计-Java项目_框架_RCE_表达式注入_SPEL_Log4j_Fastjson
java表达式注入
表达式注入 ~ Misaki's Blog (misakikata.github.io)
SpringCloudFunctionSpel 框架存在漏洞(表达式注入)
漏洞利用
RCE
java项目RCE主要是实现命令执行和代码执行
log4j
搭配dnslog
Day93--代码审计-Java项目_SSTI_SSRF_XXE_XML_CNVD模块_CTF组件
OFCMS后台模板定制处存在命令执行漏洞
网鼎杯-2020青龙组filejava
Day94--代码审计-Java项目_反序列化_shiro_fastjson_原生态_框架_利用链
java反序列化
相关工具
不安全写法
安全写法
利用脚本生成calc的反序列化代码(因为windows不支持 '| base64' 操作,所以在linux执行)
生成的base64数据需要进行去换行的操作,可利用py脚本实现
漏洞利用在登录的前提下,利用登录之后的cookie,抓包用payload替换cookie
执行成功后自动弹出计算器
Day95--代码审计-SATA_IAST项目_PHP_JAVA_NET_Python_JS_Go_等测评(工具使用)
Day97--权限提升-WEB权限_权限划分_源码后台_中间件_第三方_数据库等
权限提升(web权限,系统权限,域控权限)
phpmyadmin权限提升(数据库权限->网站权限 / 网站权限->数据库权限)
Day98--权限提升_WIN全平台_MSF自动化_CS插件_EXP筛选_溢出漏洞
windows提权相关命令
工具:Vulmap-master、WindowsVulnScan-master、wesng-master
WindowsVulnScan-master:
利用脚本生成出来对方主机的windows版本补丁(相当于systeminfo命令),然后在本机执行python cve-check.py进行比对
wesng-master:
首先将对方主机执行systeminfo的内容保存到本地1.txt,然后利用py脚本进行比对
msf使用
-p payload
-f 文件类型exe可执行文件
-o 带外的文件名
将生成的msf.exe上传到本地的后门,在后门运行msf.exe
Day99--权限提升-数据库提权_口令获取_MYSQL_MSSQL_Oracle_MSF
注:MYSQL高版本配置文件中-secure-file-priv会对sql操作目录限制,dll及启动项不起作用
MYSQL提权--UDF提权
首先判断mysql版本
select version() 查看mysql数据库版本
select @@basedir 查看mysql安装目录
由于mysql的root用户不支持外连,所以用哥斯拉(webshell)连接服务器,执行以下语句开启外连
GRANT ALL PRIVILEGES ON *.* TO'账号'@'%' IDETIFIED BY '密码' WITH GRANT OPTION;
MSF执行成功会在mysql服务器创建一个dll可执行文件
创建sys_eval,实现可执行命令
MYSQL提权--启动项提权
mysql启动项目录
shell:Common Startup
搭配MSF,生成windows启动脚本
MYSQL提权--反弹shell
Mysql提权之反弹shell_magnet:?xt=urn:btih:04e8ed9c7ea74fc9dfddc49ebc07d1-CSDN博客
MSSQL提权
MSSQL数据库组件中xp_cmdshell、 sp_oacreate可进行命令执行
MSSQL的端口:1433
xp_cmdshell
EXEC master.dbo.xp_cmdshell '命令'
组件启动关闭命令
sp_oacreate
组件启动关闭命令
MYSQL提权--沙盒提权
SQL Server提权方法汇总(MSSQL)_Margin的技术博客_51CTO博客
Day100--权限提升-数据库_Redis_Postgre_第三方软件_TV_向日葵_服务类
Postgre数据库
PostgreSQL 提权漏洞(CVE-2018-1058)
条件:需要管理员操作数据库从而触发反弹shell
PostgreSQL 高权限命令执行漏洞(CVE-2019-9193)
条件:管理员的账号密码登录
Day101--权限提升_Win本地用户_进程注入_令牌窃取_AT_SC_PS服务命令
at命令提权
sc命令提权(同at命令)
PsExec提权
进程迁移(条件:用户权限为adminstrator及以上,低权限用户无法进行迁移)
令牌窃取
土豆提权(原理:令牌窃取)
首先在webshell上上传一个后门potato.exe
Day102--权限提升_WIN本地用户BypassUAC_DLL劫持_引号路径_服务权限
BypassUAC(msf模块/UACME项目)
msf
UACME项目
DLL劫持
利用msfvenom生成一个dll文件,替换原有的dll,当用户执行原有的应用程序,就会上线一个后门,成功拿到权限
不带引号服务路径配合msf提权
服务的启动时系统system权限,利用工具搜索服务中不带引号且路径还有空格的,在webshell中替换服务为后门msf.exe,修改msf名称与原服务名字保持一致,当服务启动时,后门上线且权限是system
不安全服务权限
工具
1 、
2 、AccessChk
Day103--权限提升_Linux系统_辅助项目_脏牛_Dirty_内核漏洞_SUID_GUID
提权命令参考网站 :
linux:
GTFOBinshttps://gtfobins.github.io/windows:
LOLBAS (lolbas-project.github.io)https://lolbas-project.github.io/SUID提权
漏洞成因:find命令是linux查找命令,由于管理员需要查找文件,为了使查找的文件结果更多,赋予find命令suid权限(也就是root权限),而且find可以与exec参数进行组合进行其他命令,那么exec后面的命令就会以root执行。
自动化工具探针:LinEnum.sh、taritor
手工探针
脏牛漏洞(CVE-2016-5195)
工具:
DirtyPipe漏洞
Day104--权限提升-Linux系统_环境变量_定时任务_权限配置不当_MDUT自动化
环境变量
定时任务
cat /etc/crontab 查看定时任务命令
m:分钟 h:小时 dom:天 mon:月 dow:星期几
Day105--权限提升-linux系统_Docker挂载_Rsync未授权_Sudo-CVE_Polkit-CVE
rsync提权
rsync端口873
rsync是linux自带的服务,通过修改计时任务的文件,尝试覆盖(反弹shell)
rsync -av nc rsync://xxx:xxx/src/ect/cron.hourly/
docker挂载
docker run -v /root:/mnt -it alpine 镜像不重要,只要是参数
sudo漏洞CVE
判断漏洞是否存在:
方一、sudo --version查看版本
方二、执行命令 sudoedit -s /
存在漏洞情况
Day107--免杀对抗-C_C++_溯源_ShellCode上线_混淆变异算法_回调编译执行
混淆加密算法
xor工具
Hex
Rc4
#include <iostream>
#include <bitset>
#include<fstream>
using namespace std;
void swap(unsigned char &a,unsigned char &b){
unsigned char temp = a;
a = b;
b = temp;
return;
}
//返回明文的字节长度
int getSecret(unsigned char key[],unsigned char data[],unsigned char k[]){
unsigned char S[256];
unsigned char T[256];
int keylen;
int datalen;
int i,j = 0;
//检测密钥长度
for (i = 0;; i++){
if (key[i] == '\0'){
keylen = i;
break;
}
}
//检测明文长度
for (i = 0;; i++){
if (data[i] == '\0'){
datalen = i;
break;
}
}
//KSA key scheduling算法初始化S
for (i = 0; i < 256; i++){
S[i] = i;
}
i = 0;
if (keylen >= 256){
for (i = 0; i < 256; i++){
T[i] = key[i];
}
}
else{
while (1){
for (j = 0; j < keylen; j++){
T[i++] = key[j];
if (i >= 256)break;
}
if (i >= 256)break;
}
}
i = 0;
j = 0;
for (i = 0; i < 256; i++){
j = (j + S[i] + T[i]) % 256;
swap(S[i], S[j]);
}
//PRGA伪随机生成算法,生成密钥流
int t;
int m = 0;
int times = datalen;
while (times-->0){//相当于执行明文长度次,这样生成的秘钥流也是明文长度个字节
i = (i + 1) % 256;
j = (j + S[i]) % 256;
swap(S[i], S[j]);
t = (S[i] + S[j]) % 256;
k[m++] = S[t];//生成密钥流并存储
}
cout << "The secret key is: ";
for (i = 0; i < datalen;i++){
cout << (bitset<8>)k[i] << " ";
}
cout << endl;
return datalen;
}
void encrypt(unsigned char data[],unsigned char k[],int datalen){
//异或加密
for (int i = 0; i < datalen;i++){
data[i] = data[i] ^ k[i];
}
ofstream ofile("rc4_encrypted.txt",ios::app);
ofile << "The secret message is: ";
cout << "The secret message is: ";
//指定8位2进制输出
for (int i = 0; i < datalen; i++){
ofile << (bitset<8>)data[i] << " ";
cout << (bitset<8>)data[i] << " ";
}
ofile << endl;
ofile.close();
cout << endl;
}
void decrypt(unsigned char data[], unsigned char k[],int datalen){
//异或解密
for (int i = 0; i < datalen; i++){
data[i] = data[i] ^ k[i];
}
ofstream ofile("rc4_decrypted.txt", ios::app);
ofile << "The decrypted message is: ";
cout << "The decrypted message is: ";
//指定8位2进制输出
for (int i = 0; i < datalen; i++){
ofile << data[i];
cout << data[i];
}
ofile << endl;
ofile.close();
cout << endl;
}
int main(){
unsigned char key[] = {"hello world"};
unsigned char data[] = {"北京时间十八点实施轰炸!北京时间十八点实施轰炸!北京时间十八点实施轰炸!"};
unsigned char k[1024] ;
int datalen=getSecret(key, data, k);
encrypt(data, k,datalen);
decrypt(data, k,datalen);
}
Day108--免杀对抗_python混淆算法_反序列化_打包生成器_py2exe_Nuitka
打包器
pyinstaller
py2exe
Nuitka
Day109--免杀对抗_PowerShell_混淆_分离加载器_特征修改_EXE生成_填充替换
文件模式(.ps)
利用CS生成powershell的后门
分离-将后门文件放到web上去,加载该文件(666)
混淆(lj)
对于windowsDef,需要转换CS的编码格式以及脚本中的变量名和函数名,才能上线
执行模式(.txt)
Day110--免杀对抗-Go_C#_反VT沙盒_逆向调试_参数加载_资源分离_混淆加密
C#免杀
msf生成C#后门
文件混淆(利用工具对文件进行保护,加壳,反编译)
go
Day111--免杀对抗-Java_ASM_汇编_CS调用_内连C_MSF源码特征修改_Jar打包
Java
Day112--免杀对抗_加载器分离_无文件落地_图片隐写_SOCK管道_参数协议化
将shellcode从文本中分离
CS生成payload,利用py2exe,修改setup.py内容,使用分离的思想,生成exe程序(exe和payload都要上传)WINdef,360,火绒都可以绕过
将shellcode从加载器中分离(参数分离)
再用py2exe转换为exe,然后执行
执行语法:xxx.exe + shellcode
图片隐写(不同于图片码)
Python3 图片隐写术的实现 (qq.com)https://mp.weixin.qq.com/s/c8U2M_iJ8pWaI50sH8u9Hw payload
#!/usr/bin/env python3
#coding=utf-8
"""Encode png image via command-line.
Usage:
imageEncoding (-e|encode) <originImage> [<text>] [<encodedImage>]
imageEncoding (-d|decode) <encodedImage>
Options:
-h,--help 显示帮助菜单
-e 加密
-d 解密
Example:
imageEncoding -e coffee.png hello textOrFileToEncode encodedImage.png
imageEncoding -d encodedImage.png
"""
from PIL import Image
from docopt import docopt
import crash_on_ipy
"""
取得一个 PIL 图像并且更改所有值为偶数(使最低有效位为 0)
"""
def RGBAmakeImageEven(image):
pixels = list(image.getdata()) # 得到一个这样的列表: [(r,g,b,t),(r,g,b,t)...]
evenPixels = [(r>>1<<1,g>>1<<1,b>>1<<1,t>>1<<1) for [r,g,b,t] in pixels] # 更改所有值为偶数(魔法般的移位)
evenImage = Image.new(image.mode, image.size) # 创建一个相同大小的图片副本
evenImage.putdata(evenPixels) # 把上面的像素放入到图片副本
return evenImage
def RGBmakeImageEven(image):
pixels = list(image.getdata()) # 得到一个这样的列表: [(r,g,b,t),(r,g,b,t)...]
evenPixels = [(r>>1<<1,g>>1<<1,b>>1<<1) for [r,g,b] in pixels] # 更改所有值为偶数(魔法般的移位)
evenImage = Image.new(image.mode, image.size) # 创建一个相同大小的图片副本
evenImage.putdata(evenPixels) # 把上面的像素放入到图片副本
return evenImage
"""
内置函数 bin() 的替代,返回固定长度的二进制字符串
"""
def constLenBin(int):
binary = "0"*(8-(len(bin(int))-2))+bin(int).replace('0b','') # 去掉 bin() 返回的二进制字符串中的 '0b',并在左边补足 '0' 直到字符串长度为 8
return binary
"""
将字符串编码到图片中
"""
def RGBAencodeDataInImage(image, data):
evenImage = RGBAmakeImageEven(image) # 获得最低有效位为 0 的图片副本
binary = ''.join(map(constLenBin,bytearray(data, 'utf-8'))) # 将需要被隐藏的字符串转换成二进制字符串
if len(binary) > len(image.getdata()) * 4: # 如果不可能编码全部数据, 抛出异常
raise Exception("Error: Can't encode more than " + len(evenImage.getdata()) * 4 + " bits in this image. ")
encodedPixels = [(r+int(binary[index*4+0]),g+int(binary[index*4+1]),b+int(binary[index*4+2]),t+int(binary[index*4+3])) if index*4 < len(binary) else (r,g,b,t) for index,(r,g,b,t) in enumerate(list(evenImage.getdata()))] # 将 binary 中的二进制字符串信息编码进像素里
encodedImage = Image.new(evenImage.mode, evenImage.size) # 创建新图片以存放编码后的像素
encodedImage.putdata(encodedPixels) # 添加编码后的数据
return encodedImage
def RGBencodeDataInImage(image, data):
evenImage = RGBmakeImageEven(image) # 获得最低有效位为 0 的图片副本
binary = ''.join(map(constLenBin,bytearray(data, 'utf-8'))) # 将需要被隐藏的字符串转换成二进制字符串
if len(binary)%3 != 0: # 将转换的比特流数据末位补零,使其长度为3的倍数,防止其在下面重新编码的过程中发生越界
rema = len(binary)%3
binary = binary+('0'*(3-rema))
# print(len(binary))
if len(binary) > len(image.getdata()) * 3: # 如果不可能编码全部数据, 抛出异常
raise Exception("Error: Can't encode more than " + len(evenImage.getdata()) * 3 + " bits in this image. ")
# evenImageList = list(evenImage.getdata())
# for index in range(len(evenImageList)):
# if index*3 < len(binary):
# tup = evenImageList[index]
# r = tup[0]
# g = tup[1]
# b = tup[2]
# r += int(binary[index*3+0])
# evenImageList[index] = (r,g,b)
# else:
# break
# if index*3+1 < len(binary):
# tup = evenImageList[index]
# r = tup[0]
# g = tup[1]
# b = tup[2]
# g += int(binary[index*3+1])
# evenImageList[index] = (r,g,b)
# else:
# break
# if index*3+2 < len(binary):
# tup = evenImageList[index]
# r = tup[0]
# g = tup[1]
# b = tup[2]
# b += int(binary[index*3+2])
# evenImageList[index] = (r,g,b)
# else:
# break
# index += 1
# encodedPixels = evenImageList
encodedPixels = [(r+int(binary[index*3+0]),g+int(binary[index*3+1]),b+int(binary[index*3+2])) if index*3 < len(binary) else (r,g,b) for index, (r,g,b) in enumerate(list(evenImage.getdata()))] # 将 binary 中的二进制字符串信息编码进像素里
encodedImage = Image.new(evenImage.mode, evenImage.size) # 创建新图片以存放编码后的像素
encodedImage.putdata(encodedPixels) # 添加编码后的数据
return encodedImage
"""
从二进制字符串转为 UTF-8 字符串
"""
def binaryToString(binary):
index = 0
string = []
rec = lambda x, i: x[2:8] + (rec(x[8:], i-1) if i > 1 else '') if x else ''
# rec = lambda x, i: x and (x[2:8] + (i > 1 and rec(x[8:], i-1) or '')) or ''
fun = lambda x, i: x[i+1:8] + rec(x[8:], i-1)
while index + 1 < len(binary):
chartype = binary[index:].index('0') # 存放字符所占字节数,一个字节的字符会存为 0
length = chartype*8 if chartype else 8
string.append(chr(int(fun(binary[index:index+length],chartype),2)))
index += length
return ''.join(string)
"""
解码隐藏数据
"""
def RGBAdecodeImage(image):
pixels = list(image.getdata()) # 获得像素列表
binary = ''.join([str(int(r>>1<<1!=r))+str(int(g>>1<<1!=g))+str(int(b>>1<<1!=b))+str(int(t>>1<<1!=t)) for (r,g,b,t) in pixels]) # 提取图片中所有最低有效位中的数据
# 找到数据截止处的索引
locationDoubleNull = binary.find('0000000000000000')
endIndex = locationDoubleNull+(8-(locationDoubleNull % 8)) if locationDoubleNull%8 != 0 else locationDoubleNull
data = binaryToString(binary[0:endIndex])
return data
def RGBdecodeImage(image):
pixels = list(image.getdata()) # 获得像素列表
binary = ''.join([str(int(r>>1<<1!=r))+str(int(g>>1<<1!=g))+str(int(b>>1<<1!=b)) for (r,g,b) in pixels]) # 提取图片中所有最低有效位中的数据
# 找到数据截止处的索引
locationDoubleNull = binary.find('0000000000000000')
endIndex = locationDoubleNull+(8-(locationDoubleNull % 8)) if locationDoubleNull%8 != 0 else locationDoubleNull
data = binaryToString(binary[0:endIndex])
return data
def isTextFile(path):
if path.endswith(".txt"):
return True
elif path.endswith(".m"):
return True
elif path.endswith(".h"):
return True
elif path.endswith(".c"):
return True
elif path.endswith(".py"):
return True
else:
return False
if __name__ == '__main__':
"""command-line interface"""
arguments = docopt(__doc__)
# print(arguments)
if arguments['-e'] or arguments['encode']:
if arguments['<text>'] is None:
arguments['<text>'] = "待加密的文本"
if arguments['<encodedImage>'] is None:
arguments['<encodedImage>'] = "encodedImage.png"
if isTextFile(arguments['<text>']):
with open(arguments['<text>'], 'rt') as f:
arguments['<text>'] = f.read()
print("载体图片:")
print(arguments['<originImage>']+"\n")
print("待加密密文:")
print(arguments['<text>']+"\n")
print("加密后图片:")
print(arguments['<encodedImage>']+"\n")
print("加密中……\n")
im = Image.open(arguments['<originImage>'])
if im.mode == 'RGBA':
RGBAencodeDataInImage(im, arguments['<text>']).save(arguments['<encodedImage>'])
# elif im.mode == 'RGB':
# RGBencodeDataInImage(im, arguments['<text>']).save(arguments['<encodedImage>'])
else:
print("暂不支持此图片格式……")
print("加密完成,密文为:\n"+arguments['<text>']+"\n")
elif arguments['-d'] or arguments['decode']:
print("解密中……\n")
im = Image.open(arguments['<encodedImage>'])
if im.mode == 'RGBA':
print("解秘完成,密文为:\n"+RGBAdecodeImage(im)+"\n")
# elif im.mode == 'RGB':
# print("解秘完成,密文为:\n"+RGBdecodeImage(im)+"\n")
else:
print("非法的图片格式……")