因为最后面DLL劫持的修复方法水了篇文章

DLL劫持

对于DLL劫持简单来说既是:

DLL劫持是一种通过利用某些 Windows 应用程序搜索和加载动态链接库 (DLL) 的方式将恶意代码注入应用程序的方法。

现在DLL加载最常见的搜索顺序如下:

  1. The directory from which the application loaded.
  2. The system directory. Use the GetSystemDirectory function to get the path of this directory.
  3. The 16-bit system directory. There is no function that obtains the path of this directory, but it is searched.
  4. The Windows directory. Use the GetWindowsDirectory function to get the path of this directory.
  5. The current directory.
  6. The directories that are listed in the PATH environment variable. Note that this does not include the per-application path specified by the App Paths registry key. The App Paths key is not used when computing the DLL search path.

-- microsoft docs

具体加载顺序可以参考这里

Read more »

因为工作需要,需要将此漏洞适配到其他版本的系统。

CVE-2021-40449简介

Microsoft Windows 内核模块win32k中存在UAF漏洞,成功利用此漏洞可实现本地权限提升。影响自Windows 7以来的所有版本, 包含:

- Microsoft:Windows:

- Microsoft:Windows 10
- Microsoft:Windows 7
- Microsoft:Windows 8.1

- Microsoft:Windows Server:

- Microsoft:Windows Server 2008
- Microsoft:Windows Server 2012
- Microsoft:Windows Server 2016
- Microsoft:Windows Server 2019

成因

上月月初,Kaspersky已经将细节公布出来了,该漏洞为已在野使用的漏洞,且内容较为详细。该CVE为一典型的UAF。

Read more »

漏洞详情

Windows Print Spooler 特权提升漏洞

补丁

KB5003637:windows10.0-kb5003637-x64_fd175a387e2f07586d85899a75d0bf10120a3c2c.msu

解压补丁

win10(应该是win8后某个时间点后)和win7之流的补丁不一样, 它变小了

  • 方法1 MSDelta
  • 方法2 C:\windows\WinSxS\

获取文件

所需文件

Read more »

方法

1
api = "http://mail.qq.com/cgi-bin/register?check_tmpl=add_alias&sid={}&action=framecheck&alias={}&verifycode="

三位id结果统计

三位id可用列表

Read more »

工作需要部署OfficeWebApps(OWA),于是部署了下.

安装

环境: WindowsServer2008R2
需要的文件:

软件 文件名
.Net Framework4.5(.1) NDP451-KB2858728-x86-x64-AllOS-ENU.exe
PowerShell V3(Windows Management Framework 3.0) Windows6.1-KB2506143-x64.msu
office web apps server 2013 cn_office_web_apps_server_2013_with_sp1_x64_dvd_3832995.iso

安装需要在非dc的ad域中

1
2
3
4
5
6
7
8
9
10
11
Import-Module ServerManager
Add-WindowsFeature Web-Server,Web-WebServer,Web-Common-Http,Web-Static-Content,`
Web-App-Dev,Web-Asp-Net,Web-Net-Ext,Web-ISAPI-Ext,Web-ISAPI-Filter,`
Web-Includes,Web-Security,Web-Windows-Auth,Web-Filtering,`
Web-Stat-Compression,Web-Dyn-Compression,Web-Mgmt-Console,Ink-Handwriting,`
IH-Ink-Support,NET-Framework,NET-Framework-Core,NET-HTTP-Activation,`
NET-Non-HTTP-Activ,NET-Win-CFAC

Import-Module -Name OfficeWebApps
New-OfficeWebAppsFarm -InternalURL "http://127.0.0.1" `
-ExternalURL "http://<IP_Address_There>" -AllowHTTP -EditingEnabled

安装后在该服务器访问127.0.0.1按照提示即可预览测试.
安装后发现好像没有方便的方式去修改80端口

Read more »

tl;dr

参考require的函数内部流程,通过require.extensions['ext']可以自定义require的流程

简单来说,就是因为有个程序有bug,懒得反馈官方,我朋友让我大概在半年前看了个nodejs写的东西.

该程序是用docker一键搭建的,使用docker exec -it <id> bash进入容器查看相关信息.大部分源码可见,但是一些关键功能的源码却不可见.

Read more »

tl;dr

之前的解决方法是使用字节去读取目标字符串,然后使用函数或正则手动解析unicode编码.现在找到了更好更简单的方法:使用unicode_escape相互转换处理即可

举个例子:

1
http-title: \xE7\x99\xBE\xE5\xBA\xA6

此处的\xE7\x99\xBE\xE5\xBA\xA6既是字符串的UTF-8编码,那么

1
2
In [1]: b"\xE7\x99\xBE\xE5\xBA\xA6".decode("utf-8")
Out[1]: '百度'

然而对于格式不是byte的字符串来说,python3的默认的编码是utf-8,导致encode出的是utf-8编码,此时只需要手动指定latin1方式解码为byte即可

1
2
3
4
5
6
7
8
In [2]: u"\xE7\x99\xBE\xE5\xBA\xA6".encode()
Out[2]: b'\xc3\xa7\xc2\x99\xc2\xbe\xc3\xa5\xc2\xba\xc2\xa6'

In [3]: u"\xE7\x99\xBE\xE5\xBA\xA6".encode("latin1")
Out[3]: b'\xe7\x99\xbe\xe5\xba\xa6'

In [4]: u"\xE7\x99\xBE\xE5\xBA\xA6".encode("latin1").decode("utf-8")
Out[4]: '百度'

Read more »

1 HelloWorld

就个人来说,所学的c,第一个成功运行的程序既是HelloWorld了:

1
2
3
4
5
6
#include <stdio.h>
int main()
{
printf("Hello, World!");
return 0;
}

当时觉得很简单、很理所当然。然而,如此简单的程序之下,调用的printf,却是一个非常难理解的”变参函数”。

普通的参数遵守调用规则,从右到左参数依次压栈。而变参函数呢?堆栈又由谁恢复呢?

2 变参函数导致的问题

printf来说,该函数的函数原型是

1
int printf(const char *format,...);

简单来说,该变参函数,使用format所指向的字符串来解析后面不定长(以...表示)的参数。

那么,若format中所声明的参数,多于实际传入的变量又该如何呢?这就导致了所谓的fmt漏洞:printf函数会输出堆栈上传入参数之后的数据。

对于%s来说,会输出传入值所指向的字符串;对于%p来说,会输出传入的值。当然,也可以使用%c/%x/%d等方式输出堆栈上的数据。

3 任意位置

3.1 使用$说明参数编号

此处参数编号从format之后开始,从1数起。

1
2
3
4
5
6
int main()
{
printf("%3$s, %2$s!\n","x","World","Hello");
return 0;
}
//Hello, World!!

看wiki上说不是c99标准,但是感觉遇到的都实现了这玩意吧。

3.2 使用传入的参数作为地址

因为传入的参数也是在堆栈上,所以很随意就可以用$来指出来,再搭配$s一波美滋滋。

4 写数据

甚至你还可以用printf来写内存, 参数%i会统计当前已输出的字符个数,并赋值到传入值所指向的位置。

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main()
{
int x=0;
printf("Hello%n, World!\n",&x);
printf("%d",x);
return 0;
}
//Hello, World!
//5#

5 其他

突然、就水了一波。
最近在看CS的那些玩意,cna真乃神器。现在就差个beacon的源码搞一搞了,虽然看片子、看代码好像没有像那些exe能直接插的地方,但是说不定那些正版大佬的Arsenal就会附赠一份beacon源码呢。所以还是只能用那屎一样的ruby写的msf了么……

简单来说,就是被丢了道vm的题,说没writeup。搜了搜确实没有,于是摸了摸,发现适合入门。

查看调用栈

程序读取输入时,查看调用

1
2
3
4
5
6
7
8
(gdb) bt
#0 0x00000000004402b0 in ?? ()
#1 0x0000000000400ae1 in ?? ()
#2 0x00000000004010ba in ?? ()
#3 0x0000000000400659 in ?? ()
#4 0x0000000000401e26 in ?? ()
#5 0x000000000040201a in ?? ()
#6 0x0000000000400969 in ?? ()

分析流程

拖入ida

Read more »

idea测试不乱码,mvn clean package打包后运行乱码。是因为java的默认编码不是UTF8。
直接运行java -Dfile.encoding=utf-8 -jar springboot_demo.jar;或者设置变量JAVA_TOOL_OPTIONS-Dfile.encoding=utf-8后直接运行即可。